Files
huangjingfen/pro_v3.5.1_副本/view/uniapp/pages/users/agent/state.vue
apple 434aa8c69d 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
2026-03-23 22:32:19 +08:00

199 lines
4.9 KiB
Vue

<template>
<view>
<view class="px-20 mt-40">
<view class="bg--w111-fff rd-24rpx card-bg">
<view class="h-244 pt-72">
<view class="px-122 flex-between-center">
<text class="iconfont icon-a-ic_CompleteSelect font-red fs-28"></text>
<view class="line bg-red mx-8"></view>
<text class="iconfont icon-a-ic_CompleteSelect font-red fs-28"></text>
<view class="line mx-8" :class="type > 0 ? 'bg-red' : 'bg-gray'"></view>
<text class="iconfont fs-28" :class="type > 0 ? 'icon-a-ic_CompleteSelect font-red' : 'icon-ic_unselect text--w111-ccc'"></text>
</view>
<view class="flex-between-center px-74 fs-28 lh-40rpx mt-24">
<text>提交成功</text>
<text>正在审核</text>
<text>审核结果</text>
</view>
<view class="flex-between-center px-40 mt-8 fs-22 text--w111-999">
<text>{{ add_time }}</text>
<text>{{ add_time }}</text>
<text v-if="status_time">{{ status_time }}</text>
<text v-else class="w-180"></text>
</view>
</view>
<view class="flex-col flex-center content-box" v-if="!loading">
<image :src="imgHost + '/statics/images/supplier/verify_fail_icon.png'" class="status-pic" v-if="type == 2"></image>
<image :src="imgHost + '/statics/images/supplier/verify_ing_icon.png'" class="status-pic" v-else-if="type == 0"></image>
<image :src="imgHost + '/statics/images/supplier/verify_ok_icon.png'" class="status-pic" v-else-if="type == 1"></image>
<text class="fs-36 lh-50rpx pt-32">{{ type | typeFilter }}</text>
<text class="fs-26 lh-36rpx text--w111-999 pt-12">{{ type | descFilter }}</text>
<text class="fs-26 lh-36rpx text--w111-999 pt-12 pl-24 pr-24" v-if="refusal_reason">{{ refusal_reason }}</text>
<view class="primary-btn flex-center fs-28 mt-40" @tap="edit">{{ type == 2 ? '重新填写' : '返回上一页' }}</view>
<view class="border-btn flex-center fs-28 mt-24" v-if="type == 2" @tap="pageBack">返回上一页</view>
</view>
</view>
</view>
</view>
</template>
<script>
import { HTTP_REQUEST_URL } from '@/config/app';
import colors from '@/mixins/color.js';
import { userAgentInfo, userPromoterInfo } from '@/api/user.js';
export default {
mixins: [colors],
data() {
return {
imgHost: HTTP_REQUEST_URL,
id: 0,
type: 2,
url: '',
account: '',
pwd: '',
status_time: '',
add_time: '',
refusal_reason: '',
ftype: '',
loading: true
};
},
filters: {
typeFilter(val) {
let obj = {
0: '正在审核',
1: '审核通过',
2: '审核失败'
};
return obj[val];
},
descFilter(val) {
let obj = {
0: '正在审核当中,请耐心等待',
1: '恭喜您,审核通过',
2: '请按提示修改您所填写的信息'
};
return obj[val];
}
},
onLoad(options) {
this.id = options.id;
this.ftype = options.type || 0;
this.supplierApply();
},
methods: {
copyWb: function () {
let that = this;
uni.setClipboardData({
data: '网址:' + this.url + '\n账号:' + this.account + '\n密码:' + this.pwd
});
},
supplierApply() {
let api;
this.loading = true;
if (this.ftype === 'promoter') {
// 分销员
api = userPromoterInfo();
} else {
// 代理商
api = userAgentInfo();
}
api
.then((res) => {
let data = this.ftype === 'promoter' ? res.data.user : res.data;
this.type = data.status;
this.add_time = data.add_time;
this.status_time = data.status_time;
this.refusal_reason = data.refusal_reason;
this.loading = false;
})
.catch((err) => {
return this.$util.Tips({
title: err
});
});
},
pageBack() {
uni.switchTab({
url: '/pages/user/index'
})
},
edit() {
if (this.type == 0 || this.type == 1) {
uni.switchTab({
url: '/pages/user/index'
})
} else {
if (this.ftype === 'promoter') {
uni.reLaunch({
url: '/pages/users/distributor/apply?id=' + this.id
});
} else {
uni.reLaunch({
url: '/pages/users/agent/apply?id=' + this.id
});
}
}
}
}
};
</script>
<style scoped>
.card-bg {
-webkit-mask: radial-gradient(circle at 16rpx 240rpx, transparent 16rpx, red 0) -16rpx;
}
.font-red {
color: #e93323;
}
.h-244 {
height: 244rpx;
border-bottom: 1px dashed #ccc;
}
.px-74 {
padding: 0 74rpx;
}
.px-122 {
padding: 0 122rpx;
}
.pt-72 {
padding-top: 72rpx;
}
.line {
width: 186rpx;
height: 1rpx;
}
.bg-red {
background-color: #e93323;
}
.bg-gray {
background-color: #dddddd;
}
.status-pic {
width: 172rpx;
height: 154rpx;
}
.content-box {
padding: 48rpx 0 72rpx;
}
.primary-btn {
width: 502rpx;
height: 88rpx;
background: linear-gradient(90deg, #ff7931 0%, #e93323 100%);
color: #fff;
border-radius: 50rpx;
}
.border-btn {
width: 502rpx;
height: 88rpx;
background: #fff;
border: 1px solid #e93323;
color: #e93323;
border-radius: 50rpx;
}
.copy-btn {
width: 64rpx;
height: 32rpx;
background: #f5f5f5;
border-radius: 20rpx;
}
</style>