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
173 lines
4.3 KiB
Vue
173 lines
4.3 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>{{ type == 2 ? '审核拒绝' : '审核通过' }}</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 && type == 2">拒绝原因:{{ 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 { channelApplyInfoApi } 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.getInfo();
|
||
},
|
||
methods: {
|
||
getInfo() {
|
||
channelApplyInfoApi().then((res) => {
|
||
this.type = res.data.verify_status;
|
||
this.refusal_reason = res.data.reject;
|
||
this.add_time = res.data.add_time;
|
||
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 {
|
||
uni.reLaunch({
|
||
url: '/pages/merchant/apply/index?back=true'
|
||
});
|
||
}
|
||
}
|
||
}
|
||
};
|
||
</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>
|