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
156 lines
6.1 KiB
HTML
156 lines
6.1 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>{$title|default=''} - {$powered|default=''}</title>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
|
<link href="../statics/css/layui.css" rel="stylesheet">
|
|
<script src="../statics/js/layui.js"></script>
|
|
<script src="../statics/js/jquery.js"></script>
|
|
<script src="../statics/js/vue.js"></script>
|
|
<script src="../statics/js/axios.js"></script>
|
|
<style>
|
|
body {
|
|
background-color: #f3f3f4;
|
|
margin-top: 10px;
|
|
}
|
|
.centered {
|
|
text-align: center;
|
|
}
|
|
.centered button {
|
|
width: 200px;
|
|
height: 60px;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="layui-fluid">
|
|
<div class="layui-row layui-col-space15" id="app" v-cloak="">
|
|
<div class="layui-card">
|
|
<div class="centered">
|
|
<div class="layui-progress">
|
|
<div class="layui-progress-bar layui-bg-blue" lay-percent="100%"></div>
|
|
</div>
|
|
</div>
|
|
<div class="layui-card-header">升级系统</div>
|
|
<div class="layui-card-body">
|
|
<div class="layui-row">
|
|
<p style="font-size: 18px;">版本更迭: <span style="color: red">{$version_now} - {$version_new}</span></p>
|
|
<div class="layui-form-item" style="margin-top: 10px">
|
|
<label class="layui-form-label" style="font-size: 18px;padding-left: 0;">表前缀</label>
|
|
<div class="layui-input-block">
|
|
<input type="text" style="width: 10%" v-model="prefix" name="title" lay-verify="title"
|
|
autocomplete="off" placeholder="请输入表前缀" class="layui-input">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="centered">
|
|
<button type="button" class="layui-btn layui-btn-normal layui-btn-radius" v-if="isUpgrade && executeIng">
|
|
正在升级中
|
|
</button>
|
|
<button type="button" class="layui-btn layui-btn-normal layui-btn-radius" v-if="isUpgrade && !executeIng"
|
|
@click="startUpgrade">立即升级
|
|
</button>
|
|
<button type="button" class="layui-btn layui-btn-normal layui-btn-radius" v-else-if="isUpgrade == false">无需升级</button>
|
|
</div>
|
|
</div>
|
|
<div class="layui-card-body">
|
|
<div class="layui-form">
|
|
<table class="layui-table">
|
|
<thead>
|
|
<tr>
|
|
<th>表名</th>
|
|
<th>执行状态</th>
|
|
<th width="40%">错误原因</th>
|
|
<th>执行时间</th>
|
|
<th width="12%">操作</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr v-for="(item,index) in upgradeData">
|
|
<td>{{item.table}}</td>
|
|
<td>{{item.status ? '执行成功':'执行失败'}}</td>
|
|
<td>{{item.error}}</td>
|
|
<td>{{item.add_time}}</td>
|
|
<td>无操作</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div class="layui-form">
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<script type="text/javascript" charset="utf-8">
|
|
var isUpgrade = <?=$isUpgrade ? 'true' : 'false'?>;
|
|
new Vue({
|
|
el: '#app',
|
|
data: {
|
|
sleep: 0,
|
|
prefix: 'eb_',
|
|
upgradeData: [],
|
|
isUpgrade: isUpgrade,
|
|
executeIng: false,
|
|
page: 1,
|
|
},
|
|
methods: {
|
|
startUpgrade: function () {
|
|
var that = this;
|
|
if (!that.prefix) {
|
|
return that.showMsg('请填写表前缀');
|
|
}
|
|
this.requestGet('upgrade', {
|
|
sleep: this.sleep,
|
|
prefix: this.prefix,
|
|
page: this.page
|
|
}).then(function (res) {
|
|
if (res.data.sleep !== -1) {
|
|
if (res.data.page) {
|
|
that.page = res.data.page;
|
|
}
|
|
that.sleep = res.data.sleep;
|
|
that.upgradeData.push(res.data);
|
|
that.executeIng = true;
|
|
setTimeout(function () {
|
|
that.startUpgrade();
|
|
}, 100);
|
|
} else {
|
|
that.isUpgrade = false;
|
|
that.nextAction = true;
|
|
that.executeIng = false;
|
|
return that.showMsg('执行完毕');
|
|
}
|
|
}).catch(function (res) {
|
|
return that.showMsg(res.msg);
|
|
});
|
|
},
|
|
requestGet: function (url, data) {
|
|
var params = Object.keys(data).map(function (key) {
|
|
return key + '=' + data[key];
|
|
}).join('&');
|
|
return new Promise(function (resolve, reject) {
|
|
axios.get(url + (params ? '?' + params : '')).then(function (res) {
|
|
if (res.status == 200) {
|
|
resolve(res.data)
|
|
} else {
|
|
reject(res.data);
|
|
}
|
|
}).catch(function (err) {
|
|
reject({msg: err})
|
|
});
|
|
})
|
|
},
|
|
showMsg: function (msg, success) {
|
|
layui.use(['layer'], function () {
|
|
layui.layer.msg(msg, success);
|
|
});
|
|
},
|
|
}
|
|
})
|
|
</script>
|
|
</body>
|
|
</html>
|