feat(fsgx): 完成全部24项开发任务 Phase1-7
Phase1 后端核心:
- 新增 fsgx_v1.sql 迁移脚本(is_queue_goods/frozen_points/available_points/no_assess)
- SystemConfigServices 返佣设置扩展(周期人数/分档比例/范围/时机)
- StoreOrderCreateServices 周期循环佣金计算
- StoreOrderTakeServices 佣金发放后同步冻结积分
- StoreProductServices/StoreProduct 保存 is_queue_goods
Phase2 后端接口:
- GET /api/hjf/brokerage/progress 佣金周期进度
- GET /api/hjf/assets/overview 资产总览
- HjfPointsServices 每日 frozen_points 0.4‰ 释放定时任务
- PUT /adminapi/hjf/member/{uid}/no_assess 不考核接口
- GET /adminapi/hjf/points/release_log 积分日志接口
Phase3 前端清理:
- hjfCustom.js 路由精简(仅保留 points/log)
- hjfQueue.js/hjfMember.js API 清理/重定向至 CRMEB 原生接口
- pages.json 公排→推荐佣金/佣金记录/佣金规则
Phase4-5 前端改造:
- queue/status.vue 推荐佣金进度页整体重写
- 商品详情/订单确认/支付结果页文案与逻辑改造
- 个人中心/资产页/引导页/规则页文案改造
- HjfQueueProgress/HjfRefundNotice/HjfAssetCard 组件改造
- 推广中心嵌入佣金进度摘要
- hjfMockData.js 全量更新(公排字段→佣金字段)
Phase6 Admin 增强:
- 用户列表新增 frozen_points/available_points 列及不考核操作按钮
- hjfPoints.js USE_MOCK=false 对接真实积分日志接口
Phase7 配置文档:
- docs/fsgx-phase7-config-checklist.md 后台配置与全链路验收清单
Made-with: Cursor
This commit is contained in:
@@ -63,17 +63,16 @@ export function memberConfigSaveApi(data) {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置不考核
|
||||
* 设置不考核(对接真实接口 PUT /adminapi/hjf/member/{uid}/no_assess)
|
||||
* @param {number} uid - 用户 ID
|
||||
* @param {number} status - 不考核状态:0 正常考核,1 不考核
|
||||
* @param {number} noAssess - 不考核状态:0 正常考核,1 不考核
|
||||
* @returns {Promise<{ status: number, data: Object }>}
|
||||
*/
|
||||
export function memberSetNoAssess(uid, status) {
|
||||
if (USE_MOCK) return mockResponse({ success: true });
|
||||
export function memberSetNoAssess(uid, noAssess) {
|
||||
return request({
|
||||
url: `hjf/member/${uid}/no_assess`,
|
||||
method: 'put',
|
||||
data: { status }
|
||||
data: { no_assess: noAssess }
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import request from '@/plugins/request';
|
||||
import { MOCK_POINTS_RELEASE_LOG } from '@/utils/hjfMockData.js';
|
||||
|
||||
const USE_MOCK = true;
|
||||
const USE_MOCK = false;
|
||||
|
||||
function mockResponse(data, delay = 200) {
|
||||
return new Promise(resolve => {
|
||||
|
||||
@@ -1,80 +1,22 @@
|
||||
/**
|
||||
* 公排模块 - Admin API
|
||||
* @module api/hjfQueue
|
||||
* @description 公排订单列表、公排配置、公排财务明细等管理端接口
|
||||
* fsgx: 公排模块 API 已废弃,改用 CRMEB 原生分销佣金接口
|
||||
* 此文件保留以避免构建报错,实际功能由 CRMEB 佣金记录页面覆盖
|
||||
* @deprecated 路由已从 hjfCustom.js 中移除
|
||||
*/
|
||||
|
||||
import request from '@/plugins/request';
|
||||
import {
|
||||
MOCK_QUEUE_ORDER_LIST,
|
||||
MOCK_QUEUE_CONFIG,
|
||||
MOCK_QUEUE_FINANCE
|
||||
} from '@/utils/hjfMockData.js';
|
||||
|
||||
/** @type {boolean} Phase 1 使用 Mock;Phase 4 集成时改为 false */
|
||||
const USE_MOCK = true;
|
||||
|
||||
/**
|
||||
* Mock 包装:返回与 request 相同形状的 Promise(status + data)
|
||||
* @param {Object} data - 要返回的响应体
|
||||
* @param {number} [delay=200] - 模拟网络延迟(ms)
|
||||
* @returns {Promise<{ status: number, data: Object }>}
|
||||
*/
|
||||
function mockResponse(data, delay = 200) {
|
||||
return new Promise(resolve => {
|
||||
setTimeout(() => {
|
||||
resolve({ status: 200, data: JSON.parse(JSON.stringify(data)) });
|
||||
}, delay);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 公排订单列表(分页 + 筛选)
|
||||
* @param {Object} [data] - 查询参数,如 page、limit、keyword、status、date_range 等
|
||||
* @returns {Promise<{ status: number, data: { list: Array, count: number, page: number, limit: number } }>}
|
||||
*/
|
||||
// 佣金记录 - 复用 CRMEB /adminapi/spread/brokerage/list
|
||||
export function queueOrderList(data) {
|
||||
if (USE_MOCK) return mockResponse(MOCK_QUEUE_ORDER_LIST);
|
||||
return request({ url: 'hjf/queue/order_list', method: 'get', params: data });
|
||||
return request({ url: 'agent/brokerage_record', method: 'get', params: data });
|
||||
}
|
||||
|
||||
/** @alias queueOrderList */
|
||||
export const queueOrderListApi = queueOrderList;
|
||||
|
||||
/**
|
||||
* 公排配置(获取)
|
||||
* @returns {Promise<{ status: number, data: { trigger_multiple: number, refund_cycle: number, enabled: boolean, release_rate: number, withdraw_fee_rate: number } }>}
|
||||
*/
|
||||
export function queueConfig() {
|
||||
if (USE_MOCK) return mockResponse(MOCK_QUEUE_CONFIG);
|
||||
return request({ url: 'hjf/queue/config', method: 'get' });
|
||||
}
|
||||
|
||||
/** @alias queueConfig */
|
||||
// 以下接口已被 CRMEB 分销设置页覆盖,保留空壳
|
||||
export function queueConfig() { return Promise.resolve({ status: 200, data: {} }); }
|
||||
export const queueConfigGetApi = queueConfig;
|
||||
|
||||
/**
|
||||
* 公排配置(保存)
|
||||
* @param {Object} data - 配置数据,包含 trigger_multiple、refund_cycle、enabled 等字段
|
||||
* @returns {Promise<{ status: number, data: Object }>}
|
||||
*/
|
||||
export function queueConfigSave(data) {
|
||||
if (USE_MOCK) return mockResponse({ message: 'ok' }, 300);
|
||||
return request({ url: 'hjf/queue/config', method: 'put', data });
|
||||
}
|
||||
|
||||
/** @alias queueConfigSave */
|
||||
export function queueConfigSave(data) { return Promise.resolve({ status: 200, data: {} }); }
|
||||
export const queueConfigSaveApi = queueConfigSave;
|
||||
|
||||
/**
|
||||
* 公排财务明细(退款流水列表,分页)
|
||||
* @param {Object} [data] - 查询参数,如 page、limit、date_range 等
|
||||
* @returns {Promise<{ status: number, data: { list: Array, count: number, total_refund: string, page: number, limit: number } }>}
|
||||
*/
|
||||
export function queueFinanceList(data) {
|
||||
if (USE_MOCK) return mockResponse(MOCK_QUEUE_FINANCE);
|
||||
return request({ url: 'hjf/queue/finance', method: 'get', params: data });
|
||||
return request({ url: 'agent/brokerage_record', method: 'get', params: data });
|
||||
}
|
||||
|
||||
/** @alias queueFinanceList */
|
||||
export const queueFinanceListApi = queueFinanceList;
|
||||
|
||||
@@ -453,11 +453,21 @@
|
||||
min-width="100"
|
||||
></vxe-column>
|
||||
<vxe-column field="now_money" title="余额" min-width="100"></vxe-column>
|
||||
<vxe-column field="frozen_points" title="待释放积分" min-width="100">
|
||||
<template v-slot="{ row }">
|
||||
<span>{{ row.frozen_points != null ? row.frozen_points : '-' }}</span>
|
||||
</template>
|
||||
</vxe-column>
|
||||
<vxe-column field="available_points" title="已释放积分" min-width="100">
|
||||
<template v-slot="{ row }">
|
||||
<span>{{ row.available_points != null ? row.available_points : '-' }}</span>
|
||||
</template>
|
||||
</vxe-column>
|
||||
<vxe-column
|
||||
field="action"
|
||||
title="操作"
|
||||
align="center"
|
||||
width="180"
|
||||
width="240"
|
||||
fixed="right"
|
||||
>
|
||||
<template v-slot="{ row }">
|
||||
@@ -466,6 +476,10 @@
|
||||
<a @click="changeMenu(row, '10')">编辑</a>
|
||||
<Divider type="vertical" />
|
||||
<a @click="openLevelModal(row)">调整等级</a>
|
||||
<Divider type="vertical" />
|
||||
<a @click="handleNoAssess(row)" :style="row.no_assess ? 'color:#19be6b' : 'color:#ed4014'">
|
||||
{{ row.no_assess ? '取消不考核' : '不考核' }}
|
||||
</a>
|
||||
</template>
|
||||
</vxe-column>
|
||||
</vxe-table>
|
||||
@@ -777,7 +791,7 @@ import {
|
||||
exportUserData,
|
||||
} from "@/api/user";
|
||||
import { agentSpreadApi } from "@/api/agent";
|
||||
import { memberList, memberSetLevel } from "@/api/hjfMember";
|
||||
import { memberList, memberSetLevel, memberSetNoAssess } from "@/api/hjfMember";
|
||||
import editFrom from "../../../components/from/from";
|
||||
import sendFrom from "@/components/sendCoupons/index";
|
||||
import userDetails from "./handle/userDetails";
|
||||
@@ -1717,10 +1731,8 @@ export default {
|
||||
},
|
||||
|
||||
/**
|
||||
* 设置不考核状态(预留接口,Phase 4 集成时完善)
|
||||
* 设置不考核状态
|
||||
* @param {Object} row - 用户行数据
|
||||
* @param {number} row.uid - 用户 ID
|
||||
* @param {number} row.no_assess - 当前不考核状态(0 正常,1 不考核)
|
||||
*/
|
||||
handleNoAssess(row) {
|
||||
const nextStatus = row.no_assess ? 0 : 1;
|
||||
@@ -1728,8 +1740,14 @@ export default {
|
||||
this.$Modal.confirm({
|
||||
title: "确认操作",
|
||||
content: `将【${row.nickname}】设置为 <b>${label}</b>?`,
|
||||
onOk: () => {
|
||||
this.$Message.info("功能将在 Phase 4 集成后启用");
|
||||
onOk: async () => {
|
||||
try {
|
||||
await memberSetNoAssess(row.uid, nextStatus);
|
||||
row.no_assess = nextStatus;
|
||||
this.$Message.success(`已设置为${label}`);
|
||||
} catch (err) {
|
||||
this.$Message.error((err && err.msg) ? err.msg : "操作失败,请重试");
|
||||
}
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
27
pro_v3.5.1/view/admin/src/router/modules/hjfCustom.js
Normal file
27
pro_v3.5.1/view/admin/src/router/modules/hjfCustom.js
Normal file
@@ -0,0 +1,27 @@
|
||||
// fsgx 自定义路由(基于 CRMEB 分销模块复用方案精简后的保留路由)
|
||||
// 已移除:queue/order、queue/finance、queue/config、member/level、member/config
|
||||
// 由 CRMEB 原有佣金记录/分销等级页面覆盖
|
||||
import BasicLayout from '@/layouts/basic-layout';
|
||||
|
||||
const pre = 'hjf_';
|
||||
|
||||
export default {
|
||||
path: '/admin/hjf',
|
||||
name: 'hjf',
|
||||
header: 'hjf',
|
||||
meta: {
|
||||
auth: ['admin-hjf']
|
||||
},
|
||||
component: BasicLayout,
|
||||
children: [
|
||||
{
|
||||
path: 'points/log',
|
||||
name: `${pre}pointsLog`,
|
||||
meta: {
|
||||
auth: ['hjf-points-log'],
|
||||
title: '积分日志'
|
||||
},
|
||||
component: () => import('@/pages/hjf/pointsLog/index')
|
||||
}
|
||||
]
|
||||
};
|
||||
@@ -25,7 +25,7 @@ import frameOut from "./modules/frameOut";
|
||||
import work from "./modules/work";
|
||||
import content from "./modules/content";
|
||||
import inventory from "./modules/inventory";
|
||||
import hjfQueue from "./modules/hjfQueue.js";
|
||||
import hjfQueue from "./modules/hjfCustom.js";
|
||||
import { isSupplierPath } from "@/utils/pathUtils";
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user