trustbase-seller-backend 0.3.6 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/routes/onboard.html +195 -1
- package/test-onboard-applyment.js +23 -0
package/package.json
CHANGED
package/routes/onboard.html
CHANGED
|
@@ -63,6 +63,25 @@ h1{font-size:22px;margin-bottom:4px}
|
|
|
63
63
|
/* 结算规则只读展示框 (按主体推导, 商户不用选; settlement_id=结算规则 ID 716/719/727,
|
|
64
64
|
qualification_type=行业类目 MCC — 两次微信实测错误交叉锁定后的正确口径) */
|
|
65
65
|
#apply-form .arule{padding:10px 12px;border:1px dashed #D4CDBF;border-radius:8px;background:#F7F3EB;color:#6B655B;font-size:14px}
|
|
66
|
+
/* ===== 分步向导 stepper (2026-10-03 腾讯式分步填写): 6 步, 当前橙/完成绿/未达灰, 可回跳完成步 ===== */
|
|
67
|
+
#wz-bar{display:flex;gap:6px;overflow-x:auto;margin-bottom:12px;padding-bottom:4px}
|
|
68
|
+
#wz-bar .wz-item{display:flex;align-items:center;gap:6px;flex:none;font-size:12px;padding:6px 10px;border-radius:999px;border:1px solid #EAE3D6;background:#FFFDF9;cursor:pointer;color:#6B655B}
|
|
69
|
+
#wz-bar .wz-dot{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;background:#D4CDBF;color:#fff;font-size:11px;font-weight:600}
|
|
70
|
+
#wz-bar .wz-item.cur{border-color:#C4633C;background:#FBF1EA;color:#C4633C;font-weight:600}
|
|
71
|
+
#wz-bar .wz-item.cur .wz-dot{background:#C4633C}
|
|
72
|
+
#wz-bar .wz-item.done{border-color:#BBF7D0;background:#F0FDF4;color:#166534}
|
|
73
|
+
#wz-bar .wz-item.done .wz-dot{background:#16A34A}
|
|
74
|
+
#wz-bar .wz-item.todo{color:#BDB5A6;cursor:default}
|
|
75
|
+
#wz-step-head{margin-bottom:10px}
|
|
76
|
+
#wz-step-head .desc{margin-top:2px}
|
|
77
|
+
#wz-nav{display:flex;gap:10px;margin-top:16px}
|
|
78
|
+
#wz-nav .sbtn{flex:1;padding:12px;text-align:center;font-size:15px}
|
|
79
|
+
#wz-preview .wz-grp{border:1px solid #EAE3D6;border-radius:10px;padding:10px 12px;margin-bottom:10px;background:#FFFDF9}
|
|
80
|
+
#wz-preview .wz-grp-t{font-size:13px;font-weight:600;color:#C4633C;margin-bottom:6px}
|
|
81
|
+
#wz-preview .wz-row{display:flex;justify-content:space-between;font-size:13px;padding:3px 0;border-bottom:1px dashed #EFE9DC;gap:12px}
|
|
82
|
+
#wz-preview .wz-row:last-child{border-bottom:none}
|
|
83
|
+
#wz-preview .wz-row span{color:#8A857B;flex:none}
|
|
84
|
+
#wz-preview .wz-row b{text-align:right;word-break:break-all}
|
|
66
85
|
/* 特殊资质槽 (就地位: 行业选择正下方, 紧凑矮版 — 选了餐饮下面立刻要食品经营许可证) */
|
|
67
86
|
#apply-form #a_up_qual_wrap{margin-top:4px}
|
|
68
87
|
#apply-form #a_up_qual_wrap label.sbtn{padding:10px;gap:2px}
|
|
@@ -181,7 +200,9 @@ img.auprev{display:none;width:100%;max-height:140px;object-fit:cover;border-radi
|
|
|
181
200
|
<div class="hintbox" id="apply-msg"></div>
|
|
182
201
|
<div id="apply-status" style="display:none;margin-top:12px"></div>
|
|
183
202
|
<div id="apply-form" style="display:none;margin-top:12px">
|
|
184
|
-
<div class="desc" style="margin-bottom:12px">以下资料由你的电脑<b>本地加密</b>后交给服务商,向微信申请特约商户收款账户。身份证号/银行卡号在你电脑上就已加密,任何人 (含服务商) 都看不到明文。</div>
|
|
203
|
+
<div class="desc" style="margin-bottom:12px">以下资料由你的电脑<b>本地加密</b>后交给服务商,向微信申请特约商户收款账户。身份证号/银行卡号在你电脑上就已加密,任何人 (含服务商) 都看不到明文。</div>
|
|
204
|
+
<div id="wz-bar"></div>
|
|
205
|
+
<div id="wz-step-head"><b id="wz-title" style="font-size:15px"></b><div class="desc" id="wz-desc"></div></div>
|
|
185
206
|
|
|
186
207
|
<div class="acard">
|
|
187
208
|
<div class="acard-h">经营场景 <span class="aopt">三选一, 决定第 4/5 张卡片要什么资料</span></div>
|
|
@@ -317,9 +338,18 @@ img.auprev{display:none;width:100%;max-height:140px;object-fit:cover;border-radi
|
|
|
317
338
|
</div>
|
|
318
339
|
</div>
|
|
319
340
|
|
|
341
|
+
<div class="acard" id="wz-preview-card" style="display:none">
|
|
342
|
+
<div class="acard-h"><span class="anum">6</span>确认提交</div>
|
|
343
|
+
<div class="desc" style="margin-bottom:8px">请核对以下资料,确认无误后提交。身份证号/卡号等敏感信息已打码。</div>
|
|
344
|
+
<div id="wz-preview"></div>
|
|
345
|
+
</div>
|
|
320
346
|
<div id="apply-err" style="display:none"></div>
|
|
321
347
|
<button class="abtn" id="btn-apply-submit" onclick="submitApplyment()">加密并提交进件</button>
|
|
322
348
|
<div class="aprivacy">🔒 资料只保存在这台电脑; 敏感字段本机加密后交服务商; 服务商暂时不可达时加密暂存本机, 可重试。</div>
|
|
349
|
+
<div id="wz-nav">
|
|
350
|
+
<button type="button" class="sbtn" id="wz-prev" onclick="wzGo(-1)">← 上一步</button>
|
|
351
|
+
<button type="button" class="sbtn primary" id="wz-next" onclick="wzGo(1)">下一步 →</button>
|
|
352
|
+
</div>
|
|
323
353
|
</div>
|
|
324
354
|
</div>
|
|
325
355
|
</div>
|
|
@@ -1039,6 +1069,170 @@ async function submit(){
|
|
|
1039
1069
|
loadStatus(); // 刷新进度面板
|
|
1040
1070
|
}catch(e){alert('网络错误: '+e.message);btn.disabled=false}
|
|
1041
1071
|
}
|
|
1072
|
+
// ============================== 分步卡片向导 (2026-10-03 腾讯式分步填写) ==============================
|
|
1073
|
+
// 6 步: 主体资料 → 法人与超管 → 结算账户 → 经营与行业(场景+行业+许可证) → 证件上传 → 确认提交(预览)。
|
|
1074
|
+
// 全部既有逻辑 (字段 id/applyFormBody/上传槽/草稿/联动/错误红卡) 原样复用, 这里只做分步显隐+导航。
|
|
1075
|
+
var WZ_STEPS=[
|
|
1076
|
+
{t:'主体资料',d:'营业执照上的主体信息,需与微信实名审核一致'},
|
|
1077
|
+
{t:'法人与超管',d:'法人身份将用于微信实名审核,超管接收开户通知'},
|
|
1078
|
+
{t:'结算账户',d:'微信收的款结算到这张卡(企业主体须对公账户)'},
|
|
1079
|
+
{t:'经营与行业',d:'选经营场景和所属行业,特殊行业就地传许可证'},
|
|
1080
|
+
{t:'证件上传',d:'拍清楚、四角完整、无反光 — 模糊是驳回首因'},
|
|
1081
|
+
{t:'确认提交',d:'核对资料,确认后提交微信审核'}
|
|
1082
|
+
];
|
|
1083
|
+
var _wzCur=1,_wzMax=1,_wzGroups=[];
|
|
1084
|
+
function wzInit(){
|
|
1085
|
+
var cards=document.querySelectorAll('#apply-form > .acard');
|
|
1086
|
+
// 既有卡片 DOM 顺序: [经营场景卡, ①主体, ②法人, ③结算, ④场景信息, ⑤证件上传]
|
|
1087
|
+
_wzGroups=[
|
|
1088
|
+
[cards[1]],[cards[2]],[cards[3]],[cards[0],cards[4]],[cards[5]],
|
|
1089
|
+
[document.getElementById('wz-preview-card'),document.getElementById('btn-apply-submit'),document.querySelector('#apply-form .aprivacy')]
|
|
1090
|
+
];
|
|
1091
|
+
var bar=document.getElementById('wz-bar');
|
|
1092
|
+
bar.innerHTML='';
|
|
1093
|
+
WZ_STEPS.forEach(function(st,i){
|
|
1094
|
+
var d=document.createElement('div');
|
|
1095
|
+
d.className='wz-item todo'; d.setAttribute('data-step',i+1);
|
|
1096
|
+
d.innerHTML='<span class="wz-dot">'+(i+1)+'</span><span class="wz-lbl">'+st.t+'</span>';
|
|
1097
|
+
d.addEventListener('click',function(){ if(i+1<=_wzMax) wzShow(i+1); }); // 只许回跳已完成步
|
|
1098
|
+
bar.appendChild(d);
|
|
1099
|
+
});
|
|
1100
|
+
wzShow(1);
|
|
1101
|
+
}
|
|
1102
|
+
function wzShow(n){
|
|
1103
|
+
_wzCur=n; if(n>_wzMax)_wzMax=n;
|
|
1104
|
+
_wzGroups.forEach(function(g,i){
|
|
1105
|
+
g.forEach(function(el){ if(el) el.style.display=(i+1===n)?'':'none'; });
|
|
1106
|
+
});
|
|
1107
|
+
document.querySelectorAll('#wz-bar .wz-item').forEach(function(it){
|
|
1108
|
+
var s=Number(it.getAttribute('data-step'));
|
|
1109
|
+
it.className='wz-item'+(s===n?' cur':(s<_wzMax?' done':' todo'));
|
|
1110
|
+
it.querySelector('.wz-dot').innerHTML=(s<_wzMax&&s!==n)?'✓':String(s);
|
|
1111
|
+
});
|
|
1112
|
+
var st=WZ_STEPS[n-1];
|
|
1113
|
+
document.getElementById('wz-title').textContent='第 '+n+'/6 步 · '+st.t;
|
|
1114
|
+
document.getElementById('wz-desc').textContent=st.d;
|
|
1115
|
+
document.getElementById('wz-prev').style.visibility=n===1?'hidden':'visible';
|
|
1116
|
+
document.getElementById('wz-next').style.display=n===6?'none':'';
|
|
1117
|
+
if(n===6) renderWzPreview();
|
|
1118
|
+
hideApplyErr();
|
|
1119
|
+
document.getElementById('apply-form').scrollIntoView({behavior:'smooth',block:'start'});
|
|
1120
|
+
}
|
|
1121
|
+
function wzGo(dir){
|
|
1122
|
+
if(dir>0){ var v=wzValidate(_wzCur); if(!v.ok){ showApplyErr(v.msg,v.field); return; } } // 下一步先校验当前步
|
|
1123
|
+
var n=_wzCur+dir;
|
|
1124
|
+
if(n<1||n>6) return;
|
|
1125
|
+
wzShow(n);
|
|
1126
|
+
saveApplyDraft();
|
|
1127
|
+
}
|
|
1128
|
+
// 当前步必填校验 (不过则红卡指到缺的字段, 不放行; 与后端 APPLY_* 校验同字段名, 错误定位复用)
|
|
1129
|
+
function wzValidate(n){
|
|
1130
|
+
function need(id,label,field){
|
|
1131
|
+
var e=document.getElementById(id);
|
|
1132
|
+
if(!e||!String(e.value||'').trim()) return {ok:false,field:field||id.replace(/^a_/,''),msg:'请填写: '+label};
|
|
1133
|
+
return null;
|
|
1134
|
+
}
|
|
1135
|
+
if(n===1){
|
|
1136
|
+
return need('a_shortname','商户简称','merchant_shortname')||need('a_merchant_name','营业执照名称','merchant_name')
|
|
1137
|
+
||need('a_license_number','统一社会信用代码','license_number')||need('a_service_phone','客服电话','service_phone')||{ok:true};
|
|
1138
|
+
}
|
|
1139
|
+
if(n===2){
|
|
1140
|
+
var r=need('a_legal_name','法人/经营者姓名','legal_name')||need('a_legal_id_number','法人身份证号','legal_id_number');
|
|
1141
|
+
if(r) return r;
|
|
1142
|
+
if(document.getElementById('a_subject_type').value==='SUBJECT_TYPE_ENTERPRISE'){
|
|
1143
|
+
r=need('a_legal_id_address','身份证居住地址','legal_id_address'); if(r) return r;
|
|
1144
|
+
}
|
|
1145
|
+
return need('a_period_begin','身份证有效期开始','legal_id_period_begin')||need('a_period_end','身份证有效期结束','legal_id_period_end')
|
|
1146
|
+
||need('a_contact_name','超管姓名','contact_name')||need('a_contact_mobile','超管手机号','contact_mobile')
|
|
1147
|
+
||need('a_contact_email','联系邮箱','contact_email')||{ok:true};
|
|
1148
|
+
}
|
|
1149
|
+
if(n===3){
|
|
1150
|
+
return need('a_account_bank','开户银行','account_bank')||need('a_account_name','开户名称','account_name')
|
|
1151
|
+
||need('a_account_number','银行账号','account_number')||{ok:true};
|
|
1152
|
+
}
|
|
1153
|
+
if(n===4){
|
|
1154
|
+
var scene=currentScene(), r=null;
|
|
1155
|
+
if(scene==='SALES_SCENES_STORE'){
|
|
1156
|
+
r=need('a_store_name','门店名称','store_name')||need('a_store_address_code','门店省市编码','store_address_code')||need('a_store_address','门店详细地址','store_address');
|
|
1157
|
+
}else if(scene==='SALES_SCENES_WEB'){
|
|
1158
|
+
r=need('a_website_url','网站网址','website_url');
|
|
1159
|
+
}else if(scene==='SALES_SCENES_MP'){
|
|
1160
|
+
r=need('a_appid','公众号/小程序 AppID','appid');
|
|
1161
|
+
}else{
|
|
1162
|
+
r=need('a_app_appid','应用 AppID','app_appid');
|
|
1163
|
+
}
|
|
1164
|
+
if(r) return r;
|
|
1165
|
+
var ind=aval('a_settlement_id');
|
|
1166
|
+
if(!ind) return {ok:false,field:'qualification_type',msg:'请选择: 所属行业'};
|
|
1167
|
+
if(typeof QUAL_REQUIRED!=='undefined'&&QUAL_REQUIRED[ind]&&!_aMedia.qual_media_id){
|
|
1168
|
+
return {ok:false,field:'qual_media_id',msg:'请上传: '+ind+' 所需资质 ('+QUAL_REQUIRED[ind]+')'};
|
|
1169
|
+
}
|
|
1170
|
+
if(scene==='SALES_SCENES_APP'){
|
|
1171
|
+
var spA=(window._spInfo&&window._spInfo.app_screenshots)||{};
|
|
1172
|
+
var provider=(document.getElementById('a_app_provider')||{}).value||'sp';
|
|
1173
|
+
var reuse=provider==='sp'&&Object.keys(spA).length>0&&(document.getElementById('a_app_reuse')||{}).checked;
|
|
1174
|
+
if(!reuse&&!(_aMedia.app_home_media_id&&_aMedia.app_tail_media_id&&_aMedia.app_inner_media_id&&_aMedia.app_pay_media_id)){
|
|
1175
|
+
return {ok:false,field:'app_screenshots',msg:'请上传 4 张应用截图 (或勾选使用服务商提供的应用截图)'};
|
|
1176
|
+
}
|
|
1177
|
+
}
|
|
1178
|
+
return {ok:true};
|
|
1179
|
+
}
|
|
1180
|
+
if(n===5){
|
|
1181
|
+
var scene=currentScene();
|
|
1182
|
+
if(!_aMedia.license_media_id) return {ok:false,field:'license_media_id',msg:'请上传: 营业执照照片'};
|
|
1183
|
+
if(!_aMedia.legal_id_front_media_id) return {ok:false,field:'legal_id_front_media_id',msg:'请上传: 身份证人像面'};
|
|
1184
|
+
if(!_aMedia.legal_id_back_media_id) return {ok:false,field:'legal_id_back_media_id',msg:'请上传: 身份证国徽面'};
|
|
1185
|
+
if(scene==='SALES_SCENES_STORE'){
|
|
1186
|
+
if(!_aMedia.store_entrance_media_id) return {ok:false,field:'store_entrance_media_id',msg:'请上传: 门店门头照片'};
|
|
1187
|
+
if(!_aMedia.store_indoor_media_id) return {ok:false,field:'store_indoor_media_id',msg:'请上传: 门店内部照片'};
|
|
1188
|
+
}else if(scene==='SALES_SCENES_WEB'){
|
|
1189
|
+
if(!_aMedia.web_home_media_id) return {ok:false,field:'web_home_media_id',msg:'请上传: 网站首页截图'};
|
|
1190
|
+
if(!_aMedia.web_product_media_id) return {ok:false,field:'web_product_media_id',msg:'请上传: 商品/服务页截图'};
|
|
1191
|
+
}else if(scene==='SALES_SCENES_MP'){
|
|
1192
|
+
if(!_aMedia.mp_media_id) return {ok:false,field:'mp_media_id',msg:'请上传: 公众号/小程序页面截图'};
|
|
1193
|
+
}
|
|
1194
|
+
return {ok:true};
|
|
1195
|
+
}
|
|
1196
|
+
return {ok:true}; // 第 6 步提交由后端兜底
|
|
1197
|
+
}
|
|
1198
|
+
// 第 6 步预览: 分组只读摘要 (敏感字段 ***后4位)
|
|
1199
|
+
function wzMask(s){ s=String(s||''); return s.length<=4?'***':'***'+s.slice(-4); }
|
|
1200
|
+
function renderWzPreview(){
|
|
1201
|
+
var f=applyFormBody();
|
|
1202
|
+
var scene=currentScene();
|
|
1203
|
+
var rows=[];
|
|
1204
|
+
function grp(t,items){
|
|
1205
|
+
rows.push('<div class="wz-grp"><div class="wz-grp-t">'+escHtml(t)+'</div>'
|
|
1206
|
+
+items.map(function(it){return '<div class="wz-row"><span>'+escHtml(it[0])+'</span><b>'+escHtml(it[1]==null||it[1]===''?'—':it[1])+'</b></div>';}).join('')+'</div>');
|
|
1207
|
+
}
|
|
1208
|
+
grp('主体资料',[
|
|
1209
|
+
['主体类型',(document.querySelector('#a_subject_type option:checked')||{}).textContent||f.subject_type],
|
|
1210
|
+
['商户简称',f.merchant_shortname],['营业执照名称',f.merchant_name],
|
|
1211
|
+
['信用代码',f.license_number],['客服电话',f.service_phone]]);
|
|
1212
|
+
grp('法人与超管',[
|
|
1213
|
+
['法人姓名',f.legal_name],['身份证号',wzMask(f.legal_id_number)],
|
|
1214
|
+
['有效期',f.legal_id_period_begin+' ~ '+f.legal_id_period_end],
|
|
1215
|
+
['超管',f.contact_name+' '+wzMask(f.contact_mobile)],['邮箱',f.contact_email]]);
|
|
1216
|
+
grp('结算账户',[
|
|
1217
|
+
['账户类型',f.account_type==='BANK_ACCOUNT_TYPE_CORPORATE'?'对公账户':'经营者个人卡'],
|
|
1218
|
+
['开户行',f.account_bank],['户名',wzMask(f.account_name)],['卡号',wzMask(f.account_number)]]);
|
|
1219
|
+
var sceneName={SALES_SCENES_APP:'APP 应用',SALES_SCENES_STORE:'线下门店',SALES_SCENES_WEB:'互联网网站',SALES_SCENES_MP:'公众号/小程序'}[scene]||scene;
|
|
1220
|
+
grp('经营与行业',[
|
|
1221
|
+
['经营场景',sceneName],
|
|
1222
|
+
['所属行业',(document.getElementById('a_industry_cat')||{}).value+' > '+f.qualification_type],
|
|
1223
|
+
['结算规则',(document.getElementById('a_settlement_rule')||{}).textContent||''],
|
|
1224
|
+
['特殊资质',_aMedia.qual_media_id?'已上传 ✓':'—']]);
|
|
1225
|
+
var docs=[['营业执照',_aMedia.license_media_id],['身份证人像面',_aMedia.legal_id_front_media_id],['身份证国徽面',_aMedia.legal_id_back_media_id]];
|
|
1226
|
+
var sceneDocs={store_entrance_media_id:'门店门头照',store_indoor_media_id:'门店内部照',web_home_media_id:'网站首页截图',web_product_media_id:'商品/服务页截图',mp_media_id:'公众号/小程序截图',app_home_media_id:'应用首页截图',app_tail_media_id:'应用尾页截图',app_inner_media_id:'应用内页截图',app_pay_media_id:'应用支付页截图'};
|
|
1227
|
+
for(var k in sceneDocs){ if(_aMedia[k]) docs.push([sceneDocs[k],_aMedia[k]]); }
|
|
1228
|
+
if(scene==='SALES_SCENES_APP'&&f.app_screenshots&&f.app_screenshots.length&&(document.getElementById('a_app_reuse')||{}).checked){
|
|
1229
|
+
docs.push(['应用截图','服务商素材 ✓']);
|
|
1230
|
+
}
|
|
1231
|
+
grp('证件',docs.map(function(d){return [d[0], d[1]?(d[1]==='服务商素材 ✓'?d[1]:'已上传 ✓'):'未上传 ✗'];}));
|
|
1232
|
+
document.getElementById('wz-preview').innerHTML=rows.join('');
|
|
1233
|
+
}
|
|
1234
|
+
window.addEventListener('load',wzInit);
|
|
1235
|
+
|
|
1042
1236
|
// 安全卡二维码: 本机后端读 tb-keyring 出 dataURL (qrcode 包无浏览器 build, 且安全词不进 script 依赖链);
|
|
1043
1237
|
// 只在创建会话 (_mn 在内存) 拉取 — 刷新后不再展示 (与"安全词只展示一次"同口径)
|
|
1044
1238
|
async function loadBackupQr(){
|
|
@@ -795,3 +795,26 @@ test("APP 场景页面: 默认选中 APP + 字段组 + 复用勾选 + 4 截图
|
|
|
795
795
|
assert.ok(html.includes("app_screenshots"), "提交字段");
|
|
796
796
|
} finally { srv.close(); }
|
|
797
797
|
});
|
|
798
|
+
|
|
799
|
+
test("分步向导: stepper/导航/校验/预览 元素与逻辑齐备", async () => {
|
|
800
|
+
const { srv, base } = await startSeller();
|
|
801
|
+
try {
|
|
802
|
+
const html = await (await fetch(base + "/onboard/")).text();
|
|
803
|
+
// stepper + 6 步 + 导航
|
|
804
|
+
assert.ok(html.includes("wz-bar") && html.includes("WZ_STEPS"), "进度条");
|
|
805
|
+
assert.ok(html.includes("确认提交"), "第 6 步");
|
|
806
|
+
assert.ok(html.includes("wz-prev") && html.includes("wz-next"), "上一步/下一步");
|
|
807
|
+
assert.ok(html.includes("wzGo") && html.includes("wzShow"), "导航函数");
|
|
808
|
+
// 校验: 下一步拦 + 上一步不校验 + 回跳完成步
|
|
809
|
+
assert.ok(html.includes("wzValidate"), "当前步校验");
|
|
810
|
+
assert.ok(html.includes("if(dir>0){ var v=wzValidate(_wzCur); if(!v.ok)"), "上一步不校验");
|
|
811
|
+
assert.ok(html.includes("if(i+1<=_wzMax) wzShow(i+1)"), "只许回跳已完成步");
|
|
812
|
+
// 第 6 步预览: 分组 + 脱敏
|
|
813
|
+
assert.ok(html.includes("wz-preview") && html.includes("renderWzPreview"), "预览渲染");
|
|
814
|
+
assert.ok(html.includes("wzMask") && html.includes("***"), "敏感字段脱敏");
|
|
815
|
+
assert.ok(html.includes("主体资料") && html.includes("法人与超管") && html.includes("结算账户")
|
|
816
|
+
&& html.includes("经营与行业") && html.includes("证件上传"), "6 步标题");
|
|
817
|
+
// 旧结构未破坏: 既有卡片/字段 id 都在
|
|
818
|
+
assert.ok(html.includes("a_shortname") && html.includes("a_up_license") && html.includes("btn-apply-submit"), "既有字段/提交钮保留");
|
|
819
|
+
} finally { srv.close(); }
|
|
820
|
+
});
|