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:
apple
2026-03-23 22:32:19 +08:00
parent 788ee0c0c0
commit 434aa8c69d
13098 changed files with 2008990 additions and 961 deletions

View File

@@ -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 }
});
}

View File

@@ -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 => {

View File

@@ -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 使用 MockPhase 4 集成时改为 false */
const USE_MOCK = true;
/**
* Mock 包装:返回与 request 相同形状的 Promisestatus + 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;

View File

@@ -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 : "操作失败,请重试");
}
},
});
},

View 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')
}
]
};

View File

@@ -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";
/**