trustbase-seller-backend 0.3.2 → 0.3.3
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 +43 -43
- package/routes/onboard.js +1 -1
- package/test-onboard-applyment.js +19 -15
package/package.json
CHANGED
package/routes/onboard.html
CHANGED
|
@@ -201,13 +201,9 @@ img.auprev{display:none;width:100%;max-height:140px;object-fit:cover;border-radi
|
|
|
201
201
|
<div class="afield"><label for="a_service_phone">客服电话</label><input id="a_service_phone" placeholder="交易记录向买家展示"></div>
|
|
202
202
|
<div class="afield"><label>结算规则 (按主体自动确定, 不用选)</label>
|
|
203
203
|
<div class="arule" id="a_settlement_rule">719 · 个体户通用(0.6% T+1)</div></div>
|
|
204
|
-
<div class="afield"><label for="a_settlement_id"
|
|
205
|
-
<input id="a_settlement_filter" placeholder="
|
|
206
|
-
<select id="a_settlement_id">
|
|
207
|
-
<option value="">请选择行业类目</option>
|
|
208
|
-
<option value="__MANUAL__">手动输入编码</option>
|
|
209
|
-
</select>
|
|
210
|
-
<input id="a_settlement_manual" class="amanual" placeholder="4 位 MCC 编码, 如: 5311" style="display:none"></div>
|
|
204
|
+
<div class="afield"><label for="a_settlement_id">所属行业 (微信行业名称)</label>
|
|
205
|
+
<input id="a_settlement_filter" placeholder="搜索行业 (如 零售 / 餐饮)" style="margin-bottom:6px">
|
|
206
|
+
<select id="a_settlement_id"><option value="">请选择所属行业</option></select></div>
|
|
211
207
|
</div>
|
|
212
208
|
</div>
|
|
213
209
|
|
|
@@ -874,15 +870,13 @@ function prefillApplyForm(snap){
|
|
|
874
870
|
var e=document.getElementById(PREFILL_MAP[k]);
|
|
875
871
|
if(e&&!e.value) e.value=v;
|
|
876
872
|
}
|
|
877
|
-
//
|
|
878
|
-
//
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
}
|
|
883
|
-
if(mcc && mcc!=='无' && String(mcc).indexOf('***')!==0){
|
|
873
|
+
// 所属行业预填 (第三次字段修正口径): qualification_type=中文行业名称 (封闭集合);
|
|
874
|
+
// 旧快照若是 MCC 数字 (5722 等) 或 "无"/"零售" → 识别为非法, 清空让商户重选 (不报错);
|
|
875
|
+
// 合法行业名称则回填 (不在当前主体选项集时 select 置空, 商户重选)
|
|
876
|
+
var ind=snap.qualification_type;
|
|
877
|
+
if(ind && String(ind).indexOf('***')!==0 && !/^\d+$/.test(String(ind)) && ind!=='无' && ind!=='零售'){
|
|
884
878
|
var se=document.getElementById('a_settlement_id');
|
|
885
|
-
if(se
|
|
879
|
+
if(se) se.value=ind; // renderIndustries 已按主体建好选项集; 不在集合内 value 置空即"未选"
|
|
886
880
|
}
|
|
887
881
|
// 照片复用: media_id 还在微信侧有效 → 槽位走"已上传"双态 (占位图+替换/删除, 无第二个空框)
|
|
888
882
|
var reused=0;
|
|
@@ -1006,44 +1000,50 @@ async function restoreIdentity(){
|
|
|
1006
1000
|
① 编码字段下拉+联动 ② 状态卡片着色 + 签约二维码占位。
|
|
1007
1001
|
(证件缩略图预览已于二重框修复时并入主脚本 mountApplyUpload 槽位双态) ===== */
|
|
1008
1002
|
(function(){
|
|
1009
|
-
// ⓪
|
|
1010
|
-
//
|
|
1011
|
-
//
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
['
|
|
1017
|
-
|
|
1018
|
-
['
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1003
|
+
// ⓪ 所属行业下拉 (2026-10-03 第三次字段修正, 微信文档实锤):
|
|
1004
|
+
// qualification_type【所属行业】=《费率结算规则对照表》"行业"列的**中文行业名称** (封闭集合),
|
|
1005
|
+
// 不是 MCC 数字编码 (填 5722 被微信拒 "所属行业不存在")。行业子项按主体联动 (716/719/727 各自的表)。
|
|
1006
|
+
var INDUSTRIES={
|
|
1007
|
+
SUBJECT_TYPE_ENTERPRISE:['餐饮','食品生鲜','电信运营商/宽带收费','私立/民营医院/诊所','保健器械/医疗器械/非处方药品',
|
|
1008
|
+
'游艺厅/KTV/网吧','机票/机票代理','宠物医院','旅行社','宗教组织','房地产/房产中介','共享服务',
|
|
1009
|
+
'文物经营/文物复制品销售','拍卖典当','教育/培训/考试缴费/学费','零售批发/生活娱乐/网上商城/其他'],
|
|
1010
|
+
SUBJECT_TYPE_INDIVIDUAL:['餐饮','食品生鲜','私立/民营医院/诊所','保健器械/医疗器械/非处方药品',
|
|
1011
|
+
'游艺厅/KTV/网吧','机票/机票代理','宠物医院','教育/培训/考试缴费/学费','零售批发/生活娱乐/其他'],
|
|
1012
|
+
SUBJECT_TYPE_OTHERS:['宗教组织','机票/机票代理','私立/民营医院/诊所','咨询/娱乐票务/其他']
|
|
1013
|
+
};
|
|
1014
|
+
var INDUSTRY_DEFAULT={SUBJECT_TYPE_ENTERPRISE:'零售批发/生活娱乐/网上商城/其他',
|
|
1015
|
+
SUBJECT_TYPE_INDIVIDUAL:'零售批发/生活娱乐/其他',SUBJECT_TYPE_OTHERS:'咨询/娱乐票务/其他'};
|
|
1016
|
+
// 需要许可证的特殊行业 (选项后加 ⚠️需许可证 提示; value 仍是行业名称原文)
|
|
1017
|
+
var INDUSTRY_LICENSE=['餐饮','食品生鲜','私立/民营医院/诊所','保健器械/医疗器械/非处方药品',
|
|
1018
|
+
'游艺厅/KTV/网吧','教育/培训/考试缴费/学费','宠物医院','旅行社','拍卖典当','文物经营/文物复制品销售',
|
|
1019
|
+
'房地产/房产中介','电信运营商/宽带收费','共享服务'];
|
|
1025
1020
|
var subj=document.getElementById('a_subject_type');
|
|
1026
1021
|
var stl=document.getElementById('a_settlement_id');
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
var
|
|
1030
|
-
|
|
1022
|
+
function renderIndustries(){
|
|
1023
|
+
if(!stl) return;
|
|
1024
|
+
var type=(subj&&INDUSTRIES[subj.value])?subj.value:'SUBJECT_TYPE_INDIVIDUAL';
|
|
1025
|
+
var list=INDUSTRIES[type];
|
|
1026
|
+
var cur=stl.value; // 尽量保留已选 (主体没换集合内同名行业时)
|
|
1027
|
+
stl.innerHTML='<option value="">请选择所属行业</option>';
|
|
1028
|
+
list.forEach(function(name){
|
|
1031
1029
|
var o=document.createElement('option');
|
|
1032
|
-
o.value=
|
|
1033
|
-
|
|
1030
|
+
o.value=name; // 提交直接带行业名称原文 (含斜杠)
|
|
1031
|
+
o.textContent=name+(INDUSTRY_LICENSE.indexOf(name)>=0?' ⚠️需许可证':'');
|
|
1032
|
+
stl.appendChild(o);
|
|
1034
1033
|
});
|
|
1035
|
-
stl.value=
|
|
1036
|
-
|
|
1034
|
+
stl.value=(list.indexOf(cur)>=0&&cur)?cur:(INDUSTRY_DEFAULT[type]||list[0]);
|
|
1035
|
+
}
|
|
1036
|
+
if(stl){
|
|
1037
|
+
renderIndustries();
|
|
1038
|
+
// 搜索过滤 (行业多, 按名称子串过滤)
|
|
1037
1039
|
var filt=document.getElementById('a_settlement_filter');
|
|
1038
1040
|
if(filt) filt.addEventListener('input',function(){
|
|
1039
1041
|
var q=filt.value.trim().toLowerCase();
|
|
1040
1042
|
Array.prototype.forEach.call(stl.options,function(o){
|
|
1041
|
-
if(o.value===''
|
|
1043
|
+
if(o.value==='') return;
|
|
1042
1044
|
o.hidden = !!(q && o.textContent.toLowerCase().indexOf(q)<0);
|
|
1043
1045
|
});
|
|
1044
1046
|
});
|
|
1045
|
-
// 手动输入接管 (沿用 id 移交逻辑)
|
|
1046
|
-
linkSelectManual('a_settlement_id','a_settlement_manual','__MANUAL__');
|
|
1047
1047
|
}
|
|
1048
1048
|
// 结算规则只读展示 (settlement_id 按主体推导: 企业 716 / 个体户 719 / 其他组织 727; 商户不用选)
|
|
1049
1049
|
var SETTLE_RULES={SUBJECT_TYPE_INDIVIDUAL:'719 · 个体户通用(0.6% T+1)',
|
|
@@ -1055,7 +1055,7 @@ async function restoreIdentity(){
|
|
|
1055
1055
|
paintSettleRule();
|
|
1056
1056
|
if(subj&&stl){
|
|
1057
1057
|
subj.addEventListener('change',function(){
|
|
1058
|
-
|
|
1058
|
+
renderIndustries(); // 主体切换 → 行业选项集联动刷新 + 重选默认
|
|
1059
1059
|
paintSettleRule();
|
|
1060
1060
|
// F4: 企业主体显示身份证居住地址(必填) + UBO 说明; 个体户隐藏
|
|
1061
1061
|
var ent = subj.value==='SUBJECT_TYPE_ENTERPRISE';
|
package/routes/onboard.js
CHANGED
|
@@ -606,7 +606,7 @@ function createOnboardRouter(deps) {
|
|
|
606
606
|
account_name: "开户名称", account_number: "银行账号", account_bank: "开户银行",
|
|
607
607
|
store_name: "门店名称", store_address_code: "门店省市编码", store_address: "门店详细地址",
|
|
608
608
|
website_url: "网站网址", appid: "公众号/小程序 AppID",
|
|
609
|
-
service_phone: "客服电话", qualification_type: "
|
|
609
|
+
service_phone: "客服电话", qualification_type: "所属行业 (微信行业名称)",
|
|
610
610
|
license_media_id: "营业执照照片", legal_id_front_media_id: "身份证人像面", legal_id_back_media_id: "身份证国徽面",
|
|
611
611
|
store_entrance_media_id: "门店门头照片", store_indoor_media_id: "门店内部照片",
|
|
612
612
|
web_home_media_id: "网站首页截图", web_product_media_id: "商品/服务页截图", mp_media_id: "公众号/小程序页面截图",
|
|
@@ -111,7 +111,7 @@ async function fillForm(base) {
|
|
|
111
111
|
account_type: "BANK_ACCOUNT_TYPE_PERSONAL",
|
|
112
112
|
account_name: "张三", account_number: PLAINTEXT.card, account_bank: "招商银行",
|
|
113
113
|
store_name: "张三餐饮店南山店", store_address_code: "440300", store_address: "南山区xx路1号",
|
|
114
|
-
service_phone: "0755-12345678", qualification_type: "
|
|
114
|
+
service_phone: "0755-12345678", qualification_type: "零售批发/生活娱乐/其他", // 所属行业=中文行业名称 (settlement_id 结算规则由后端按主体推导)
|
|
115
115
|
...media,
|
|
116
116
|
};
|
|
117
117
|
}
|
|
@@ -287,14 +287,17 @@ test("onboard 页面含进件表单 (btn-apply-submit) 且第③步状态机元
|
|
|
287
287
|
assert.ok(!html.includes("slot.insertBefore(img"), "旧增强脚本预览补丁已删 (二重框根因)");
|
|
288
288
|
assert.ok(html.includes("prefill:function(mediaId)"), "预填走双态 (无第二个空框)");
|
|
289
289
|
// 2026-10-03 MCC 修正: 经营类目下拉是真实 MCC 编码 (716/719/727 是 V2 结算规则 ID, 被微信拒)
|
|
290
|
-
|
|
291
|
-
assert.ok(html.includes("
|
|
292
|
-
assert.ok(
|
|
293
|
-
assert.ok(html.includes("
|
|
294
|
-
assert.ok(html.includes("
|
|
295
|
-
|
|
290
|
+
// 2026-10-03 第三次字段修正: qualification_type = 中文行业名称 (封闭集合, 非 MCC)
|
|
291
|
+
assert.ok(html.includes("零售批发/生活娱乐/网上商城/其他"), "企业行业子项");
|
|
292
|
+
assert.ok(html.includes("零售批发/生活娱乐/其他") && html.includes("咨询/娱乐票务/其他"), "个体户/其他组织行业子项");
|
|
293
|
+
assert.ok(html.includes("⚠️需许可证"), "特殊行业许可证标记");
|
|
294
|
+
assert.ok(html.includes("INDUSTRIES"), "主体联动选项集");
|
|
295
|
+
assert.ok(html.includes("a_settlement_filter"), "行业搜索过滤");
|
|
296
|
+
assert.ok(!html.includes("a_settlement_manual"), "行业手输框已删 (封闭集合不允许手输; 省市编码的 __MANUAL__ 保留)");
|
|
297
|
+
assert.ok(!/['"]5311['"]/.test(html) && !/['"]5722['"]/.test(html), "MCC 数字编码已清除");
|
|
298
|
+
// 双字段 (结算规则只读展示 + 所属行业下拉)
|
|
296
299
|
assert.ok(html.includes("a_settlement_rule"), "结算规则只读展示框");
|
|
297
|
-
assert.ok(html.includes("结算规则") && html.includes("
|
|
300
|
+
assert.ok(html.includes("结算规则") && html.includes("所属行业"), "双字段标签");
|
|
298
301
|
assert.ok(!html.includes("a_qualification_type"), "旧资质描述字段已移除");
|
|
299
302
|
assert.ok(html.includes("maybeAutoKyc"), "M2: 进件受理后自动 KYC 提交");
|
|
300
303
|
assert.ok(!html.includes("btn-verify"), "手动实名按钮已删 (自动触发)");
|
|
@@ -357,17 +360,18 @@ test("字段语义最终修正: settlement_id=结算规则按主体推导 + qual
|
|
|
357
360
|
let j = await r.json();
|
|
358
361
|
assert.strictEqual(r.status, 400);
|
|
359
362
|
assert.strictEqual(j.field, "qualification_type");
|
|
360
|
-
assert.ok(j.message.includes("
|
|
363
|
+
assert.ok(j.message.includes("所属行业"), j.message);
|
|
361
364
|
// 个体户 → settlement_id=719 (前端没传, 后端推导) + qualification_type=5331 透传
|
|
362
365
|
const before = spCapture.submits.length;
|
|
366
|
+
// 补回行业名称再提交
|
|
367
|
+
form.qualification_type = "零售批发/生活娱乐/其他";
|
|
363
368
|
r = await fetch(base + "/api/onboard/applyment", {
|
|
364
|
-
method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(
|
|
369
|
+
method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(form),
|
|
365
370
|
});
|
|
366
|
-
function form2ok(f){ const c={...f, qualification_type:"5331"}; return c; }
|
|
367
371
|
j = await r.json();
|
|
368
372
|
assert.strictEqual(r.status, 200, JSON.stringify(j));
|
|
369
373
|
assert.strictEqual(spCapture.submits[before].settlement_id, "719", "个体户 → 结算规则 719 (后端推导)");
|
|
370
|
-
assert.strictEqual(spCapture.submits[before].qualification_type, "
|
|
374
|
+
assert.strictEqual(spCapture.submits[before].qualification_type, "零售批发/生活娱乐/其他", "所属行业=中文行业名称透传");
|
|
371
375
|
} finally { srv.close(); }
|
|
372
376
|
});
|
|
373
377
|
|
|
@@ -376,7 +380,7 @@ test("字段语义: 企业主体 → settlement_id=716 + qualification_type=MCC
|
|
|
376
380
|
try {
|
|
377
381
|
const form = await fillForm(base);
|
|
378
382
|
form.subject_type = "SUBJECT_TYPE_ENTERPRISE";
|
|
379
|
-
form.qualification_type = "
|
|
383
|
+
form.qualification_type = "零售批发/生活娱乐/网上商城/其他";
|
|
380
384
|
form.legal_id_address = "广东省深圳市南山区xx路1号101室"; // 企业必填 (F4)
|
|
381
385
|
const before = spCapture.submits.length;
|
|
382
386
|
const r = await fetch(base + "/api/onboard/applyment", {
|
|
@@ -386,11 +390,11 @@ test("字段语义: 企业主体 → settlement_id=716 + qualification_type=MCC
|
|
|
386
390
|
assert.strictEqual(r.status, 200, JSON.stringify(j));
|
|
387
391
|
const fwd = spCapture.submits[before];
|
|
388
392
|
assert.strictEqual(fwd.settlement_id, "716", "企业 → 结算规则 716");
|
|
389
|
-
assert.strictEqual(fwd.qualification_type, "
|
|
393
|
+
assert.strictEqual(fwd.qualification_type, "零售批发/生活娱乐/网上商城/其他", "所属行业=中文行业名称");
|
|
390
394
|
// SP 侧组装: settlement_info 两字段正确分工
|
|
391
395
|
const wxBody = spApplymentLib.buildApplymentBody({ ...fwd, business_code: "TBTEST" }, (s) => s, { alreadyEncrypted: true });
|
|
392
396
|
assert.strictEqual(wxBody.settlement_info.settlement_id, "716");
|
|
393
|
-
assert.strictEqual(wxBody.settlement_info.qualification_type, "
|
|
397
|
+
assert.strictEqual(wxBody.settlement_info.qualification_type, "零售批发/生活娱乐/网上商城/其他");
|
|
394
398
|
} finally { srv.close(); }
|
|
395
399
|
});
|
|
396
400
|
|