feat: OPC 平台功能增强 v1.4 · 8 项需求变更实施

CHG-006 抢单订单池:OPC 工作台加抢单池(REQ-128/129)
CHG-004 政策落地:OPC 加算力券申领/核销+贷款+租金,运营商加政策跟踪(REQ-124/125/126)
CHG-001 组队模块:新增 team.html 组队协同页(REQ-119/120/121)
CHG-003 活动管理:运营工作台加活动创建/发布/报名管理(REQ-122/123)
CHG-005 OPC 财务分析:OPC 工作台加财务看板(REQ-127)
CHG-008 平台撮合归集:运营工作台加录入入口(REQ-130)
CHG-002 入口跳转:确认已正确(OPC→opc.html)
CHG-007 服务中心定位:明确为运营商服务资源管理

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
2026-09-14 08:47:29 +08:00
co-authored by Devin
parent f307e877c9
commit 13cad398dc
10 changed files with 1009 additions and 2 deletions
+136
View File
@@ -28,6 +28,31 @@
<div class="card"><table id="op-audits"></table></div>
</div>
<!-- 活动管理(REQ-122/123) -->
<div class="section">
<h2>活动管理 <span class="req">REQ-122/123 · 创建/发布/报名 · 关联线索转化</span>
<span style="margin-left:auto"><button class="btn sm" onclick="createActivity()">创建活动</button></span>
</h2>
<div class="card"><table id="op-acts"></table></div>
<p class="muted" style="margin-top:8px">活动 → 线索 → 订单转化链路(REQ-096/097)。每场活动关联后续线索与订单转化。</p>
</div>
<!-- 政策落地跟踪(REQ-126) -->
<div class="section">
<h2>政策落地跟踪 <span class="req">REQ-126 · 算力券/贷款/租金/社保 · 全链路</span></h2>
<div class="card"><table id="op-policy"></table></div>
<p class="muted" style="margin-top:8px">运营商跟踪政策落地进度:申请 → 审批 → 使用 → 绩效。数据脱敏同步政府驾驶舱。</p>
</div>
<!-- 平台撮合订单归集(REQ-130) -->
<div class="section">
<h2>平台撮合订单归集 <span class="req">REQ-130 · 平台介入撮合 · 统一归集</span>
<span style="margin-left:auto"><button class="btn sm" onclick="brokerOrder()">录入撮合订单</button></span>
</h2>
<div class="card"><table id="op-broker"></table></div>
<p class="muted" style="margin-top:8px">平台介入撮合的订单手动录入或批量导入,标注来源为"平台撮合",走统一订单状态机和结算流程。</p>
</div>
<!-- 项目总览 -->
<div class="section">
<h2>进行中项目 <span class="req">REQ-031/036 · 运营商统一拆单与质检</span></h2>
@@ -60,6 +85,9 @@ function renderPage(DB) {
`<div class="card"><h3>${s.label}</h3><div class="num">${s.num}</div><p class="muted">${s.sub}</p></div>`).join('');
renderBizDirections();
renderAudits();
renderActivities();
renderPolicyTracking();
renderBrokerOrders();
document.getElementById('op-proj').innerHTML =
`<tr><th>项目</th><th>客户</th><th>承接</th><th>进度</th><th>状态</th><th>操作</th></tr>` +
O.projects.map(p => `<tr><td>${p.code} ${p.name}</td><td>${p.client}</td><td>${p.opc}</td><td>${BAR(p.pct)}</td><td>${B(p.status)}</td><td><a class="btn sm ghost" href="order.html">进入协同</a></td></tr>`).join('');
@@ -150,6 +178,114 @@ function arbitrate(i) {
],
});
}
/* === 活动管理 === */
function renderActivities() {
const acts = DB.operator.activities || [];
document.getElementById('op-acts').innerHTML =
`<tr><th>活动号</th><th>名称</th><th>日期</th><th>报名</th><th>容量</th><th>转化线索</th><th>状态</th><th>操作</th></tr>` +
acts.map((a, i) => `<tr>
<td>${a.code}</td><td>${a.name}</td><td>${a.date}</td>
<td>${a.signups}</td><td>${a.capacity}</td><td>${a.leads}</td><td>${B(a.status)}</td>
<td><button class="btn sm ghost" onclick="actDetail(${i})">详情</button> <button class="btn sm ghost" onclick="actSignups(${i})">报名</button></td>
</tr>`).join('');
}
function createActivity() {
openModal({
title: '创建活动(REQ-122)',
body: `<div class="field"><label>活动名称</label><input placeholder="如:供需对接会 · 智能体专场"></div>
<div class="field-row">
<div class="field"><label>日期</label><input type="date"></div>
<div class="field"><label>容量</label><input value="80"></div>
</div>
<div class="field"><label>活动介绍</label><textarea placeholder="活动主题、目标受众、议程安排"></textarea></div>
<div class="field"><label>关联业务方向</label><select><option>跨境电商视觉</option><option>AI 漫剧</option><option>企业智能体</option><option>华强北硬件供应链</option><option>综合</option></select></div>`,
actions: [
{ label: '取消', cls: 'ghost' },
{ label: '发布活动', onClick: m => { m.remove(); toast('活动已发布,进入报名阶段(REQ-122)'); } },
],
});
}
function actDetail(i) {
const a = DB.operator.activities[i];
openModal({
title: a.name,
body: `<table>
<tr><th>活动号</th><td>${a.code}</td></tr>
<tr><th>日期</th><td>${a.date}</td></tr>
<tr><th>报名</th><td>${a.signups} / ${a.capacity}</td></tr>
<tr><th>转化线索</th><td>${a.leads} 条(REQ-096)</td></tr>
<tr><th>状态</th><td>${B(a.status)}</td></tr>
</table>`,
});
}
function actSignups(i) {
const a = DB.operator.activities[i];
openModal({
title: '报名管理 · ' + a.name,
body: `<p class="muted">已报名 ${a.signups} 人,容量 ${a.capacity} 人</p>
<table>
<tr><th>OPC/企业</th><th>报名时间</th><th>状态</th></tr>
<tr><td>OPC_00017 张设计</td><td>09-10 14:30</td><td><span class="badge ok">已确认</span></td></tr>
<tr><td>OPC_00045 陈视觉</td><td>09-11 09:15</td><td><span class="badge ok">已确认</span></td></tr>
<tr><td>ENT_00009 某科技公司</td><td>09-12 10:00</td><td><span class="badge info">待确认</span></td></tr>
</table>`,
actions: [{ label: '关闭', cls: 'ghost' }],
});
}
/* === 政策落地跟踪 === */
function renderPolicyTracking() {
const tracks = DB.operator.policyTracking || [];
document.getElementById('op-policy').innerHTML =
`<tr><th>政策</th><th>申请数</th><th>已审批</th><th>已使用</th><th>执行率</th><th>状态</th></tr>` +
tracks.map(t => {
const rate = Math.round(t.used / t.applied * 100);
return `<tr><td><b>${t.policy}</b></td><td>${t.applied}</td><td>${t.approved}</td><td>${t.used}</td><td>${BAR(rate, 'ok')}</td><td>${B(t.status)}</td></tr>`;
}).join('');
}
/* === 平台撮合订单归集 === */
function renderBrokerOrders() {
const orders = DB.operator.brokerOrders || [];
document.getElementById('op-broker').innerHTML =
`<tr><th>订单号</th><th>客户</th><th>OPC</th><th>金额</th><th>来源</th><th>状态</th><th>操作</th></tr>` +
orders.map((o, i) => `<tr>
<td>${o.code}</td><td>${o.client}</td><td>${o.opc}</td><td>${o.amount}</td>
<td><span class="badge pri">${o.source}</span></td><td>${B(o.status)}</td>
<td><button class="btn sm ghost" onclick="brokerDetail(${i})">详情</button></td>
</tr>`).join('');
}
function brokerOrder() {
openModal({
title: '录入撮合订单(REQ-130)',
body: `<div class="field"><label>客户</label><input placeholder="如:ENT_00018 某公司"></div>
<div class="field"><label>OPC</label><input placeholder="如:OPC_00017 张设计"></div>
<div class="field-row">
<div class="field"><label>金额</label><input placeholder="如:¥15,000"></div>
<div class="field"><label>来源</label><select><option>平台撮合</option><option>线下转介</option><option>政府推荐</option></select></div>
</div>
<div class="field"><label>备注</label><textarea placeholder="撮合过程说明"></textarea></div>
<p class="muted">录入后走统一订单状态机(签约→进行中→验收→结算),数据自动归集到政府驾驶舱。</p>`,
actions: [
{ label: '取消', cls: 'ghost' },
{ label: '录入', onClick: m => { m.remove(); toast('撮合订单已录入,进入订单状态机'); } },
],
});
}
function brokerDetail(i) {
const o = DB.operator.brokerOrders[i];
openModal({
title: '撮合订单详情 · ' + o.code,
body: `<table>
<tr><th>客户</th><td>${o.client}</td></tr>
<tr><th>OPC</th><td>${o.opc}</td></tr>
<tr><th>金额</th><td>${o.amount}</td></tr>
<tr><th>来源</th><td>${o.source}</td></tr>
<tr><th>状态</th><td>${B(o.status)}</td></tr>
</table>`,
});
}
</script>
</body>
</html>