trustbase-seller-backend 0.1.9 → 0.1.11

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trustbase-seller-backend",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "TrustBase Seller Backend (merchant edition) — 商品上链/订单/支付/质押 write API for TrustBase 保障链生态. 单卖家自托管形态: 签名 key 即卖家身份, 私钥不出门.",
5
5
  "main": "run-unified.js",
6
6
  "bin": {
@@ -8,7 +8,7 @@
8
8
  *{margin:0;padding:0;box-sizing:border-box}
9
9
  html,body{width:100%;overflow-x:hidden}
10
10
  body{background:#F7F3EB;color:#33302B;font-family:-apple-system,'PingFang SC','Microsoft YaHei',sans-serif;line-height:1.85}
11
- .wrap{max-width:680px;margin:40px auto;padding:0 24px;width:100%}
11
+ .wrap{max-width:1080px;margin:40px auto;padding:0 24px;width:100%}
12
12
  h1{font-size:22px;margin-bottom:4px}
13
13
  .sub{font-size:13px;color:#8A857B;margin-bottom:30px}
14
14
  .box{background:#FCFAF4;border:1px solid #EAE3D6;border-radius:14px;padding:26px;margin-bottom:18px}
@@ -59,6 +59,7 @@ h1{font-size:22px;margin-bottom:4px}
59
59
  #apply-form .aopt{font-size:11px;color:#BDB5A6;font-weight:400;margin-left:4px}
60
60
  #apply-form .afield input,#apply-form .afield select{width:100%;padding:10px 12px;border:1px solid #D4CDBF;border-radius:8px;font-size:15px;background:#fff;transition:border-color .15s,box-shadow .15s}
61
61
  #apply-form .afield input::placeholder{color:#BDB5A6}
62
+ #apply-form .afield input.amanual{margin-top:6px;border-style:dashed}
62
63
  #apply-form .afield input:focus,#apply-form .afield select:focus{outline:none;border-color:#C4633C;box-shadow:0 0 0 3px rgba(196,99,60,.15)}
63
64
  /* 上传卡片 (结构由 mountApplyUpload 生成: 标题label + label.sbtn>input + span#st_*) */
64
65
  #apply-form .auploads{display:grid;grid-template-columns:1fr 1fr;gap:12px 14px}
@@ -118,7 +119,7 @@ img.auprev{display:none;width:100%;max-height:140px;object-fit:cover;border-radi
118
119
  <div class="step" id="st-verification">
119
120
  <span class="mark">⬜</span>
120
121
  <div class="body">③ 微信收款认证
121
- <div class="ops"><button class="sbtn" id="btn-verify" onclick="submitVerification()">提交实名认证</button></div>
122
+ <div class="ops"><button class="sbtn" id="btn-verify" onclick="submitVerification()" title="链上身份认证由服务商在进件审核通过后自动完成, 一般无需手动">提交实名认证 (一般无需手动)</button></div>
122
123
  <div class="desc" id="verify-desc">提交后由服务商审核微信特约商户收款账户; 审核通过后自动发放 100 TCT 引导金 (无需重复提交)</div>
123
124
  <div class="hintbox" id="verify-msg"></div>
124
125
  <div class="ops noprint"><button class="sbtn" id="btn-apply-toggle" onclick="toggleApplyForm()">填写进件资料并上传证件</button></div>
@@ -136,8 +137,13 @@ img.auprev{display:none;width:100%;max-height:140px;object-fit:cover;border-radi
136
137
  <div class="afield"><label for="a_merchant_name">营业执照名称</label><input id="a_merchant_name" placeholder="全称, 与执照一致"></div>
137
138
  <div class="afield"><label for="a_license_number">统一社会信用代码</label><input id="a_license_number" placeholder="18 位, 9 开头"></div>
138
139
  <div class="afield"><label for="a_service_phone">客服电话</label><input id="a_service_phone" placeholder="交易记录向买家展示"></div>
139
- <div class="afield"><label for="a_settlement_id">经营类目编码</label><input id="a_settlement_id" placeholder="如: 719 (服务商提供对照表)"></div>
140
- <div class="afield afield-full"><label for="a_qualification_type">类目资质描述</label><input id="a_qualification_type" placeholder="如: 零售"></div>
140
+ <div class="afield"><label for="a_settlement_id">经营类目</label>
141
+ <select id="a_settlement_id">
142
+ <option value="719">719 · 个体户通用(餐饮/零售/生活服务,0.6% T+1)</option>
143
+ <option value="716">716 · 企业通用(餐饮/零售/网上商城/生活服务,0.6% T+1)</option>
144
+ <option value="727">727 · 其他组织通用(咨询/社区服务/娱乐票务,0.6% T+1)</option>
145
+ </select></div>
146
+ <div class="afield afield-full"><label for="a_qualification_type">类目资质描述 <span class="aopt">通用类目留空</span></label><input id="a_qualification_type" placeholder="通用零售/餐饮留空即可;特殊行业(医疗/教育/食品)需对应资质"></div>
141
147
  </div>
142
148
  </div>
143
149
 
@@ -159,11 +165,27 @@ img.auprev{display:none;width:100%;max-height:140px;object-fit:cover;border-radi
159
165
  <div class="agrid">
160
166
  <div class="afield"><label for="a_account_type">账户类型</label>
161
167
  <select id="a_account_type"><option value="BANK_ACCOUNT_TYPE_PERSONAL">经营者个人银行卡 (个体户)</option><option value="BANK_ACCOUNT_TYPE_CORPORATE">对公银行账户</option></select></div>
162
- <div class="afield"><label for="a_account_bank">开户银行</label><input id="a_account_bank" placeholder="如: 招商银行"></div>
168
+ <div class="afield"><label for="a_account_bank">开户银行</label>
169
+ <select id="a_account_bank">
170
+ <option value="">请选择开户银行</option>
171
+ <option>工商银行</option><option>交通银行</option><option>招商银行</option>
172
+ <option>民生银行</option><option>中信银行</option><option>浦发银行</option>
173
+ <option>兴业银行</option><option>光大银行</option><option>广发银行</option>
174
+ <option>平安银行</option><option>北京银行</option><option>华夏银行</option>
175
+ <option>农业银行</option><option>建设银行</option><option>邮政储蓄银行</option>
176
+ <option>中国银行</option><option>宁波银行</option>
177
+ <option value="__OTHER__">其他银行(手填精确全称)</option>
178
+ </select>
179
+ <input id="a_bank_manual" class="amanual" placeholder="请填开户银行精确全称 (须在微信开户银行对照表内)" style="display:none"></div>
163
180
  <div class="afield"><label for="a_account_name">开户名称</label><input id="a_account_name" placeholder="个人卡=经营者姓名 / 对公=执照名称"></div>
164
181
  <div class="afield"><label for="a_account_number">银行账号</label><input id="a_account_number" placeholder="卡号"></div>
165
182
  <div class="afield"><label for="a_bank_name">开户支行 <span class="aopt">选填</span></label><input id="a_bank_name" placeholder="如: 招商银行深圳分行营业部"></div>
166
- <div class="afield"><label for="a_bank_address_code">开户行省市编码 <span class="aopt">选填</span></label><input id="a_bank_address_code" placeholder="如: 440300"></div>
183
+ <div class="afield"><label for="a_bank_address_code">开户行省市编码 <span class="aopt">选填</span></label>
184
+ <select id="a_bank_address_code" data-citycodes>
185
+ <option value="">请选择省市</option>
186
+ <option value="__MANUAL__">手动输入编码</option>
187
+ </select>
188
+ <input id="a_bankcode_manual" class="amanual" placeholder="6 位国标区划码, 如: 320200" style="display:none"></div>
167
189
  </div>
168
190
  </div>
169
191
 
@@ -171,7 +193,12 @@ img.auprev{display:none;width:100%;max-height:140px;object-fit:cover;border-radi
171
193
  <div class="acard-h"><span class="anum">4</span>门店信息</div>
172
194
  <div class="agrid">
173
195
  <div class="afield"><label for="a_store_name">门店名称</label><input id="a_store_name" placeholder="线下场所名称"></div>
174
- <div class="afield"><label for="a_store_address_code">门店省市编码</label><input id="a_store_address_code" placeholder="如: 440300"></div>
196
+ <div class="afield"><label for="a_store_address_code">门店省市编码</label>
197
+ <select id="a_store_address_code" data-citycodes>
198
+ <option value="">请选择省市</option>
199
+ <option value="__MANUAL__">手动输入编码</option>
200
+ </select>
201
+ <input id="a_storecode_manual" class="amanual" placeholder="6 位国标区划码, 如: 320200" style="display:none"></div>
175
202
  <div class="afield afield-full"><label for="a_store_address">门店详细地址</label><input id="a_store_address" placeholder="xx 路 xx 号"></div>
176
203
  </div>
177
204
  </div>
@@ -510,6 +537,56 @@ async function submit(){
510
537
  只做两件视觉事: ① 证件选中后显示缩略图+文件名 ② 状态卡片按内容着色 + 签约二维码占位。
511
538
  所有字段 id / 上传提交函数 / 状态机 DOM 目标均沿用现有逻辑。 ===== */
512
539
  (function(){
540
+ // ⓪ 编码字段下拉 (2026-10-03 xiaomu: 手填编码易被微信秒拒 → 下拉)
541
+ // 经营类目 ↔ 主体类型联动 (企业默认 716 / 个体户默认 719, 可手改)
542
+ var subj=document.getElementById('a_subject_type');
543
+ var stl=document.getElementById('a_settlement_id');
544
+ if(subj&&stl){
545
+ subj.addEventListener('change',function(){
546
+ stl.value = subj.value==='SUBJECT_TYPE_ENTERPRISE' ? '716' : '719';
547
+ });
548
+ }
549
+ // 省市编码选项 (国标区划码, 两处下拉共用; 微信官方对照表口径)
550
+ var CITY_CODES=[['110000','北京市'],['120000','天津市'],['310000','上海市'],['500000','重庆市'],
551
+ ['130100','石家庄'],['140100','太原'],['150100','呼和浩特'],['210100','沈阳'],['210200','大连'],
552
+ ['220100','长春'],['230100','哈尔滨'],['320100','南京'],['320200','无锡'],['320300','徐州'],
553
+ ['320400','常州'],['320500','苏州'],['320600','南通'],['320700','连云港'],['320800','淮安'],
554
+ ['320900','盐城'],['321000','扬州'],['321100','镇江'],['321200','泰州'],['321300','宿迁'],
555
+ ['330100','杭州'],['330200','宁波'],['340100','合肥'],['350100','福州'],['350200','厦门'],
556
+ ['360100','南昌'],['370100','济南'],['370200','青岛'],['410100','郑州'],['420100','武汉'],
557
+ ['430100','长沙'],['440100','广州'],['440300','深圳'],['440600','佛山'],['441900','东莞'],
558
+ ['450100','南宁'],['460100','海口'],['510100','成都'],['520100','贵阳'],['530100','昆明'],
559
+ ['610100','西安'],['620100','兰州'],['630100','西宁'],['640100','银川'],['650100','乌鲁木齐']];
560
+ document.querySelectorAll('select[data-citycodes]').forEach(function(sel){
561
+ var manualOpt=sel.querySelector('option[value="__MANUAL__"]');
562
+ CITY_CODES.forEach(function(c){
563
+ var o=document.createElement('option');
564
+ o.value=c[0];o.textContent=c[0]+' '+c[1];
565
+ sel.insertBefore(o,manualOpt);
566
+ });
567
+ });
568
+ // "其他/手动输入"接管: 选中触发项时隐藏下拉、显示手填框, 并把字段 id 移交给手填框
569
+ // (aval(id) 提交逻辑零改动 — 读到的永远是当前持有 id 的那个控件的值); 手填框留空失焦则切回下拉
570
+ function linkSelectManual(selectId,manualId,trigger){
571
+ var sel=document.getElementById(selectId);
572
+ var man=document.getElementById(manualId);
573
+ if(!sel||!man) return;
574
+ sel.addEventListener('change',function(){
575
+ if(sel.value!==trigger) return;
576
+ sel.style.display='none'; sel.id=selectId+'_sel';
577
+ man.style.display='block'; man.id=selectId;
578
+ man.focus();
579
+ });
580
+ man.addEventListener('blur',function(){
581
+ if(man.value.trim()) return;
582
+ man.style.display='none'; man.id=manualId; man.value='';
583
+ sel.style.display='block'; sel.id=selectId; sel.value='';
584
+ });
585
+ }
586
+ linkSelectManual('a_account_bank','a_bank_manual','__OTHER__');
587
+ linkSelectManual('a_bank_address_code','a_bankcode_manual','__MANUAL__');
588
+ linkSelectManual('a_store_address_code','a_storecode_manual','__MANUAL__');
589
+
513
590
  // ① 证件缩略图预览 (事件委托, 与现有上传 handler 并存, 只读文件不干预流程)
514
591
  var form=document.getElementById('apply-form');
515
592
  if(form){