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

@@ -0,0 +1,26 @@
{
"scope": "alipay",
"name": "easysdk-base-image",
"version": "0.0.1",
"main": "./main.tea",
"java": {
"package": "com.alipay.easysdk.base.image",
"baseClient": "com.alipay.easysdk.kernel.BaseClient"
},
"csharp": {
"namespace": "Alipay.EasySDK.Base.Image",
"baseClient": "Alipay.EasySDK.Kernel:BaseClient"
},
"typescript": {
"baseClient": "@alipay/easysdk-baseclient"
},
"php": {
"package": "Alipay.EasySDK.Base.Image"
},
"go": {
"namespace": "base/image"
},
"libraries": {
"EasySDKKernel": "alipay:easysdk-kernel:*"
}
}

View File

@@ -0,0 +1,88 @@
import EasySDKKernel;
type @kernel = EasySDKKernel
init(kernel: EasySDKKernel) {
@kernel = kernel;
}
model AlipayOfflineMaterialImageUploadResponse {
httpBody: string(name='http_body', description='响应原始字符串'),
code: string(name='code'),
msg: string(name='msg'),
subCode: string(name='sub_code'),
subMsg: string(name='sub_msg'),
imageId: string(name='image_id'),
imageUrl: string(name='image_url')
}
api upload(imageName: string, imageFilePath: string): AlipayOfflineMaterialImageUploadResponse {
var systemParams: map[string]string = {
method = 'alipay.offline.material.image.upload',
app_id = @kernel.getConfig("appId"),
timestamp = @kernel.getTimestamp(),
format = 'json',
version = '1.0',
alipay_sdk = @kernel.getSdkVersion(),
charset = 'UTF-8',
sign_type = @kernel.getConfig("signType"),
app_cert_sn = @kernel.getMerchantCertSN(),
alipay_root_cert_sn = @kernel.getAlipayRootCertSN()
};
var bizParams: map[string]any = {
};
var textParams: map[string]string = {
image_type = 'jpg',
image_name = imageName
};
var fileParams: map[string]string = {
image_content = imageFilePath
};
var boundary = @kernel.getRandomBoundary();
__request.protocol = @kernel.getConfig("protocol");
__request.method = 'POST';
__request.pathname = '/gateway.do';
__request.headers = {
host = @kernel.getConfig("gatewayHost"),
content-type = @kernel.concatStr('multipart/form-data;charset=utf-8;boundary=', boundary)
};
__request.query = @kernel.sortMap({
sign = @kernel.sign(systemParams, bizParams, textParams, @kernel.getConfig("merchantPrivateKey")),
... systemParams,
});
__request.body = @kernel.toMultipartRequestBody(textParams, fileParams, boundary);
} returns {
var respMap: map[string]any = @kernel.readAsJson(__response, "alipay.offline.material.image.upload");
if (@kernel.isCertMode()) {
if (@kernel.verify(respMap, @kernel.extractAlipayPublicKey(@kernel.getAlipayCertSN(respMap)))) {
return @kernel.toRespModel(respMap);
}
} else {
if (@kernel.verify(respMap, @kernel.getConfig("alipayPublicKey"))) {
return @kernel.toRespModel(respMap);
}
}
throw {
message = '验签失败请检查支付宝公钥设置是否正确'
}
} runtime {
ignoreSSL = @kernel.getConfig("ignoreSSL"),
httpProxy = @kernel.getConfig("httpProxy"),
connectTimeout = 100000,
readTimeout = 100000,
retry = {
maxAttempts = 0
}
}

View File

@@ -0,0 +1,26 @@
{
"scope": "alipay",
"name": "easysdk-base-oauth",
"version": "0.0.1",
"main": "./main.tea",
"java": {
"package": "com.alipay.easysdk.base.oauth",
"baseClient": "com.alipay.easysdk.kernel.BaseClient"
},
"csharp": {
"namespace": "Alipay.EasySDK.Base.OAuth",
"baseClient": "Alipay.EasySDK.Kernel:BaseClient"
},
"typescript": {
"baseClient": "@alipay/easysdk-baseclient"
},
"php": {
"package": "Alipay.EasySDK.Base.OAuth"
},
"go": {
"namespace": "base/oauth"
},
"libraries": {
"EasySDKKernel": "alipay:easysdk-kernel:*"
}
}

View File

@@ -0,0 +1,150 @@
import EasySDKKernel;
type @kernel = EasySDKKernel
init(kernel: EasySDKKernel) {
@kernel = kernel;
}
model AlipaySystemOauthTokenResponse {
httpBody: string(name='http_body', description='响应原始字符串'),
code: string(name='code'),
msg: string(name='msg'),
subCode: string(name='sub_code'),
subMsg: string(name='sub_msg'),
userId: string(name='user_id'),
accessToken: string(name='access_token'),
expiresIn: long(name='expires_in'),
refreshToken: string(name='refresh_token'),
reExpiresIn: long(name='re_expires_in')
}
api getToken(code: string): AlipaySystemOauthTokenResponse {
var systemParams: map[string]string = {
method = 'alipay.system.oauth.token',
app_id = @kernel.getConfig("appId"),
timestamp = @kernel.getTimestamp(),
format = 'json',
version = '1.0',
alipay_sdk = @kernel.getSdkVersion(),
charset = 'UTF-8',
sign_type = @kernel.getConfig("signType"),
app_cert_sn = @kernel.getMerchantCertSN(),
alipay_root_cert_sn = @kernel.getAlipayRootCertSN()
};
var bizParams: map[string]any = {
};
var textParams: map[string]string = {
grant_type = 'authorization_code',
code = code
};
__request.protocol = @kernel.getConfig("protocol");
__request.method = 'POST';
__request.pathname = '/gateway.do';
__request.headers = {
host = @kernel.getConfig("gatewayHost"),
content-type = 'application/x-www-form-urlencoded;charset=utf-8'
};
__request.query = @kernel.sortMap({
sign = @kernel.sign(systemParams, bizParams, textParams, @kernel.getConfig("merchantPrivateKey")),
... systemParams,
... textParams
});
__request.body = @kernel.toUrlEncodedRequestBody(bizParams);
} returns {
var respMap: object = @kernel.readAsJson(__response, "alipay.system.oauth.token");
if (@kernel.isCertMode()) {
if (@kernel.verify(respMap, @kernel.extractAlipayPublicKey(@kernel.getAlipayCertSN(respMap)))) {
return @kernel.toRespModel(respMap);
}
} else {
if (@kernel.verify(respMap, @kernel.getConfig("alipayPublicKey"))) {
return @kernel.toRespModel(respMap);
}
}
throw {
message = '验签失败请检查支付宝公钥设置是否正确'
}
} runtime {
ignoreSSL = @kernel.getConfig("ignoreSSL"),
httpProxy = @kernel.getConfig("httpProxy"),
connectTimeout = 15000,
readTimeout = 15000,
retry = {
maxAttempts = 0
}
}
api refreshToken(refreshToken: string): AlipaySystemOauthTokenResponse {
var systemParams: map[string]string = {
method = 'alipay.system.oauth.token',
app_id = @kernel.getConfig("appId"),
timestamp = @kernel.getTimestamp(),
format = 'json',
version = '1.0',
alipay_sdk = @kernel.getSdkVersion(),
charset = 'UTF-8',
sign_type = @kernel.getConfig("signType"),
app_cert_sn = @kernel.getMerchantCertSN(),
alipay_root_cert_sn = @kernel.getAlipayRootCertSN()
};
var bizParams: map[string]any = {
};
var textParams: map[string]string = {
grant_type = 'refresh_token',
refresh_token = refreshToken
};
__request.protocol = @kernel.getConfig("protocol");
__request.method = 'POST';
__request.pathname = '/gateway.do';
__request.headers = {
host = @kernel.getConfig("gatewayHost"),
content-type = 'application/x-www-form-urlencoded;charset=utf-8'
};
__request.query = @kernel.sortMap({
sign = @kernel.sign(systemParams, bizParams, textParams, @kernel.getConfig("merchantPrivateKey")),
... systemParams,
... textParams
});
__request.body = @kernel.toUrlEncodedRequestBody(bizParams);
} returns {
var respMap: object = @kernel.readAsJson(__response, "alipay.system.oauth.token");
if (@kernel.isCertMode()) {
if (@kernel.verify(respMap, @kernel.extractAlipayPublicKey(@kernel.getAlipayCertSN(respMap)))) {
return @kernel.toRespModel(respMap);
}
} else {
if (@kernel.verify(respMap, @kernel.getConfig("alipayPublicKey"))) {
return @kernel.toRespModel(respMap);
}
}
throw {
message = '验签失败请检查支付宝公钥设置是否正确'
}
} runtime {
ignoreSSL = @kernel.getConfig("ignoreSSL"),
httpProxy = @kernel.getConfig("httpProxy"),
connectTimeout = 15000,
readTimeout = 15000,
retry = {
maxAttempts = 0
}
}

View File

@@ -0,0 +1,26 @@
{
"scope": "alipay",
"name": "easysdk-base-qrcode",
"version": "0.0.1",
"main": "./main.tea",
"java": {
"package": "com.alipay.easysdk.base.qrcode",
"baseClient": "com.alipay.easysdk.kernel.BaseClient"
},
"csharp": {
"namespace": "Alipay.EasySDK.Base.Qrcode",
"baseClient": "Alipay.EasySDK.Kernel:BaseClient"
},
"typescript": {
"baseClient": "@alipay/easysdk-baseclient"
},
"php": {
"package": "Alipay.EasySDK.Base.Qrcode"
},
"go": {
"namespace": "base/qrcode"
},
"libraries": {
"EasySDKKernel": "alipay:easysdk-kernel:*"
}
}

View File

@@ -0,0 +1,83 @@
import EasySDKKernel;
type @kernel = EasySDKKernel
init(kernel: EasySDKKernel) {
@kernel = kernel;
}
model AlipayOpenAppQrcodeCreateResponse {
httpBody: string(name='http_body', description='响应原始字符串'),
code: string(name='code'),
msg: string(name='msg'),
subCode: string(name='sub_code'),
subMsg: string(name='sub_msg'),
qrCodeUrl: string(name='qr_code_url')
}
api create(urlParam: string, queryParam: string, describe: string): AlipayOpenAppQrcodeCreateResponse {
var systemParams: map[string]string = {
method = 'alipay.open.app.qrcode.create',
app_id = @kernel.getConfig("appId"),
timestamp = @kernel.getTimestamp(),
format = 'json',
version = '1.0',
alipay_sdk = @kernel.getSdkVersion(),
charset = 'UTF-8',
sign_type = @kernel.getConfig("signType"),
app_cert_sn = @kernel.getMerchantCertSN(),
alipay_root_cert_sn = @kernel.getAlipayRootCertSN()
};
var bizParams: map[string]any = {
url_param = urlParam,
query_param = queryParam,
describe = describe
};
var textParams: map[string]string = {
};
__request.protocol = @kernel.getConfig("protocol");
__request.method = 'POST';
__request.pathname = '/gateway.do';
__request.headers = {
host = @kernel.getConfig("gatewayHost"),
content-type = 'application/x-www-form-urlencoded;charset=utf-8'
};
__request.query = @kernel.sortMap({
sign = @kernel.sign(systemParams, bizParams, textParams, @kernel.getConfig("merchantPrivateKey")),
... systemParams,
... textParams
});
__request.body = @kernel.toUrlEncodedRequestBody(bizParams);
} returns {
var respMap: object = @kernel.readAsJson(__response, "alipay.open.app.qrcode.create");
if (@kernel.isCertMode()) {
if (@kernel.verify(respMap, @kernel.extractAlipayPublicKey(@kernel.getAlipayCertSN(respMap)))) {
return @kernel.toRespModel(respMap);
}
} else {
if (@kernel.verify(respMap, @kernel.getConfig("alipayPublicKey"))) {
return @kernel.toRespModel(respMap);
}
}
throw {
message = '验签失败请检查支付宝公钥设置是否正确'
}
} runtime {
ignoreSSL = @kernel.getConfig("ignoreSSL"),
httpProxy = @kernel.getConfig("httpProxy"),
connectTimeout = 15000,
readTimeout = 15000,
retry = {
maxAttempts = 0
}
}

View File

@@ -0,0 +1,26 @@
{
"scope": "alipay",
"name": "easysdk-base-video",
"version": "0.0.1",
"main": "./main.tea",
"java": {
"package": "com.alipay.easysdk.base.video",
"baseClient": "com.alipay.easysdk.kernel.BaseClient"
},
"csharp": {
"namespace": "Alipay.EasySDK.Base.Video",
"baseClient": "Alipay.EasySDK.Kernel:BaseClient"
},
"typescript": {
"baseClient": "@alipay/easysdk-baseclient"
},
"php": {
"package": "Alipay.EasySDK.Base.Video"
},
"go": {
"namespace": "base/video"
},
"libraries": {
"EasySDKKernel": "alipay:easysdk-kernel:*"
}
}

View File

@@ -0,0 +1,88 @@
import EasySDKKernel;
type @kernel = EasySDKKernel
init(kernel: EasySDKKernel) {
@kernel = kernel;
}
model AlipayOfflineMaterialImageUploadResponse {
httpBody: string(name='http_body', description='响应原始字符串'),
code: string(name='code'),
msg: string(name='msg'),
subCode: string(name='sub_code'),
subMsg: string(name='sub_msg'),
imageId: string(name='image_id'),
imageUrl: string(name='image_url')
}
api upload(videoName: string, videoFilePath: string): AlipayOfflineMaterialImageUploadResponse {
var systemParams: map[string]string = {
method = 'alipay.offline.material.image.upload',
app_id = @kernel.getConfig("appId"),
timestamp = @kernel.getTimestamp(),
format = 'json',
version = '1.0',
alipay_sdk = @kernel.getSdkVersion(),
charset = 'UTF-8',
sign_type = @kernel.getConfig("signType"),
app_cert_sn = @kernel.getMerchantCertSN(),
alipay_root_cert_sn = @kernel.getAlipayRootCertSN()
};
var bizParams: map[string]any = {
};
var textParams: map[string]string = {
image_type = 'mp4',
image_name = videoName
};
var fileParams: map[string]string = {
image_content = videoFilePath
};
var boundary = @kernel.getRandomBoundary();
__request.protocol = @kernel.getConfig("protocol");
__request.method = 'POST';
__request.pathname = '/gateway.do';
__request.headers = {
host = @kernel.getConfig("gatewayHost"),
content-type = @kernel.concatStr('multipart/form-data;charset=utf-8;boundary=', boundary)
};
__request.query = @kernel.sortMap({
sign = @kernel.sign(systemParams, bizParams, textParams, @kernel.getConfig("merchantPrivateKey")),
... systemParams,
});
__request.body = @kernel.toMultipartRequestBody(textParams, fileParams, boundary);
} returns {
var respMap: map[string]any = @kernel.readAsJson(__response, "alipay.offline.material.image.upload");
if (@kernel.isCertMode()) {
if (@kernel.verify(respMap, @kernel.extractAlipayPublicKey(@kernel.getAlipayCertSN(respMap)))) {
return @kernel.toRespModel(respMap);
}
} else {
if (@kernel.verify(respMap, @kernel.getConfig("alipayPublicKey"))) {
return @kernel.toRespModel(respMap);
}
}
throw {
message = '验签失败请检查支付宝公钥设置是否正确'
}
} runtime {
ignoreSSL = @kernel.getConfig("ignoreSSL"),
httpProxy = @kernel.getConfig("httpProxy"),
connectTimeout = 100000,
readTimeout = 100000,
retry = {
maxAttempts = 0
}
}