wwt-certificate-tool 1.2.58 → 1.2.60

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/dist/app.html CHANGED
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width,initial-scale=1">
6
- <title>WWT 金蝶凭证工具 · 纯前端版 P1.2.58</title>
6
+ <title>WWT 金蝶凭证工具 · 纯前端版 P1.2.60</title>
7
7
  <style>*{box-sizing:border-box;margin:0;padding:0}
8
8
  body{font-family:"Microsoft YaHei","PingFang SC",-apple-system,Segoe UI,sans-serif;font-size:13px;color:#1f2328;background:#f4f6f9;line-height:1.6}
9
9
  h1{font-size:17px;font-weight:600}
@@ -183,6 +183,7 @@ tr.bad:hover td{background:#fbe9e9}
183
183
  .chkbox.generated{background:#dcfce7;border-color:#86efac;color:#166534}
184
184
  .chkbox.generated:hover{background:#bbf7d0}
185
185
  .genbadge{margin-left:4px;background:#22c55e;color:#fff;font-size:10px;font-weight:600;border-radius:4px;padding:1px 5px}
186
+ .vnobadge{margin-left:4px;background:#f43f5e;color:#fff;font-size:10px;font-weight:600;border-radius:4px;padding:1px 5px}
186
187
  .rulecard{background:#fff;border:1px solid #dde2e8;border-radius:7px;padding:11px 13px;margin-bottom:9px}
187
188
  .rulecard.off{opacity:.55}
188
189
  .rulehead{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap}
@@ -320,7 +321,7 @@ input[data-f="field"][list^="dlGe_"]::placeholder{color:#a8861f;font-style:itali
320
321
  <div class="brand">
321
322
  <span class="logo">WWT</span>
322
323
  <div>
323
- <h1>金蝶凭证工具 <span class="ver">P1.2.58</span></h1>
324
+ <h1>金蝶凭证工具 <span class="ver">P1.2.60</span></h1>
324
325
  <div class="sub">纯前端离线版 · 双击即用 · 数据只存在本机,不上传任何服务器</div>
325
326
  </div>
326
327
  </div>
@@ -1627,7 +1628,10 @@ window.WWT_ENGINE = (function () {
1627
1628
  ctx["来源"] = curSrc;
1628
1629
  ctx["单据类型"] = danlei; ctx["单类"] = danlei;
1629
1630
  ctx["对方"] = uniqJoin(items, partyFields, "/", curSrc);
1630
- ctx["单位名称"] = ctx["对方"]; ctx["供应商名称"] = ctx["对方"];
1631
+ // P1.2.59:{单位名称}/{供应商名称} 必须各自取对应字段,不能等价于 {对方},
1632
+ // 否则全部汇总按单位名称分组后,同一单位下多个供应商会被 / 拼接进摘要。
1633
+ ctx["单位名称"] = uniqJoin(items, ["单位名称"], "/", curSrc) || ctx["对方"];
1634
+ ctx["供应商名称"] = uniqJoin(items, ["供应商名称"], "/", curSrc) || ctx["对方"];
1631
1635
  ctx["厂牌"] = uniqJoin(items, ["厂牌"], "/", curSrc);
1632
1636
  ctx["收入板块"] = uniqJoin(items, ["收入板块"], "/", curSrc);
1633
1637
  ctx["原单号"] = truncateBiz(orig, ",");
@@ -1737,6 +1741,7 @@ window.WWT_ENGINE = (function () {
1737
1741
  const usedRows = {}; // src -> Set(index)
1738
1742
  const globalExcludedUsed = {}; // 【P1.2.35】src -> Set(index),全局排除行不进任何规则 rowsIn
1739
1743
  const stats = { rules: 0, rows: 0, vouchers: 0, entries: 0, skipped: [], totalRows: 0 };
1744
+ const ruleVnos = {}; // rule.id -> {min,max} 每张凭证号范围
1740
1745
 
1741
1746
  for (const rule of (opts.rules || [])) {
1742
1747
  if (rule.enabled === false) continue;
@@ -1806,6 +1811,8 @@ window.WWT_ENGINE = (function () {
1806
1811
 
1807
1812
  for (const bucket of buckets) {
1808
1813
  const curVno = vno++;
1814
+ if (!ruleVnos[rule.id]) ruleVnos[rule.id] = { min: curVno, max: curVno };
1815
+ else ruleVnos[rule.id].max = Math.max(ruleVnos[rule.id].max, curVno);
1809
1816
  const curBill = billHead++;
1810
1817
  let eidx = 0;
1811
1818
  stats.vouchers++;
@@ -1825,7 +1832,7 @@ window.WWT_ENGINE = (function () {
1825
1832
  }
1826
1833
 
1827
1834
  for (const sub of subMap.values()) {
1828
- const sumCtx = buildSummaryCtx(sub.items, rule, curSrc);
1835
+ const subCtx = buildSummaryCtx(sub.items, rule, curSrc);
1829
1836
  // 业务日期取组内最早
1830
1837
  const meta = C.SOURCE_META[curSrc] || {};
1831
1838
  let bizDate = "";
@@ -1857,9 +1864,10 @@ window.WWT_ENGINE = (function () {
1857
1864
  const dimKey = Object.keys(dv).sort().map(d => [d, dv[d].name]);
1858
1865
  const gkey = JSON.stringify([subj, dimKey, splitT]);
1859
1866
  if (!groups.has(gkey)) {
1860
- groups.set(gkey, { subj: subj, dv: dv, sgn: 0, vals: {}, first: it });
1867
+ groups.set(gkey, { subj: subj, dv: dv, sgn: 0, vals: {}, first: it, items: [] });
1861
1868
  }
1862
1869
  const g = groups.get(gkey);
1870
+ g.items.push(it);
1863
1871
  g.sgn += sumAmtExpr(it.row, line.amountField);
1864
1872
  lineSplitFs.forEach((f, fi) => {
1865
1873
  const v = splitT[fi];
@@ -1872,6 +1880,8 @@ window.WWT_ENGINE = (function () {
1872
1880
  const amt = Math.abs(signed);
1873
1881
  if (amt <= 0) continue; // 净额 ≤ 0 跳过
1874
1882
  eidx++;
1883
+ // P1.2.59 摘要上下文按最终分录小组构建,避免全组供应商拼接
1884
+ const sumCtx = buildSummaryCtx(g.items, rule, curSrc);
1875
1885
  const splitVals = {};
1876
1886
  for (const f in g.vals) splitVals[f] = truncateBiz(g.vals[f].join(","), ",");
1877
1887
  const metaNo = meta.no || "原单号";
@@ -1914,7 +1924,7 @@ window.WWT_ENGINE = (function () {
1914
1924
  const metaNo = meta.no || "原单号";
1915
1925
  entries.push(makeEntry({
1916
1926
  vno: curVno, eidx: eidx, acctDate: acctDate, bizDate: useBizDate,
1917
- summary: fillSummary(line.summary || rule.name, sumCtx, {}, rule),
1927
+ summary: fillSummary(line.summary || rule.name, subCtx, {}, rule),
1918
1928
  subj: subj, subjName: idx.subjectName(subj),
1919
1929
  debit: side === "借" ? amt : 0, credit: side === "贷" ? amt : 0,
1920
1930
  settleBiz: payRaw, settleCode: settleCode, settleName: settleName,
@@ -1995,7 +2005,7 @@ window.WWT_ENGINE = (function () {
1995
2005
  never_matched_rows: exclRows,
1996
2006
  });
1997
2007
  }
1998
- return { rows: out, missing: missing, stats: stats, index: idx, audit: { by_source: bySource } };
2008
+ return { rows: out, missing: missing, stats: stats, index: idx, audit: { by_source: bySource }, ruleVnos: ruleVnos };
1999
2009
  }
2000
2010
 
2001
2011
  /* ---------------- 借贷平衡校验(按凭证号分组,容差 0.005) ---------------- */
@@ -2187,7 +2197,6 @@ window.WWT_ENGINE = (function () {
2187
2197
  subMap.get(k).items.push(it);
2188
2198
  }
2189
2199
  for (const sub of subMap.values()) {
2190
- const sumCtx = buildSummaryCtx(sub.items, r, curSrc);
2191
2200
  const meta = C.SOURCE_META[curSrc] || {};
2192
2201
  let bizDate = "";
2193
2202
  if (meta.datecol) {
@@ -2214,8 +2223,9 @@ window.WWT_ENGINE = (function () {
2214
2223
  const splitT = lineSplitFs.map(f => clean(it.row[f]));
2215
2224
  const dimKey = Object.keys(dv).sort().map(d => [d, dv[d].name]);
2216
2225
  const gkey = JSON.stringify([subj, dimKey, splitT]);
2217
- if (!groups.has(gkey)) groups.set(gkey, { subj: subj, dv: dv, sgn: 0, vals: {}, first: it });
2226
+ if (!groups.has(gkey)) groups.set(gkey, { subj: subj, dv: dv, sgn: 0, vals: {}, first: it, items: [] });
2218
2227
  const g = groups.get(gkey);
2228
+ g.items.push(it);
2219
2229
  g.sgn += sumAmtExpr(it.row, line.amountField);
2220
2230
  lineSplitFs.forEach((f, fi) => {
2221
2231
  const v = splitT[fi];
@@ -2227,6 +2237,8 @@ window.WWT_ENGINE = (function () {
2227
2237
  const amt = Math.abs(signed);
2228
2238
  if (amt <= 0) continue;
2229
2239
  eidx++;
2240
+ // P1.2.59 摘要上下文按最终分录小组构建,避免全组供应商拼接
2241
+ const sumCtx = buildSummaryCtx(g.items, r, curSrc);
2230
2242
  const splitVals = {};
2231
2243
  for (const f in g.vals) splitVals[f] = truncateBiz(g.vals[f].join(","), ",");
2232
2244
  const metaNo = meta.no || "原单号";
@@ -2576,10 +2588,11 @@ const S = window.__STATE__ = {
2576
2588
  base:{}, biz:{}, draft:[], missing:[], balance:null,
2577
2589
  selRules:new Set(), cvOut:null, checkRows:null,
2578
2590
  genRules:new Set(), // 【P1.2.50】已生成过凭证的规则 id,持久化到 localStorage
2591
+ ruleVnos:{}, // 【P1.2.60】每条规则上次生成的凭证号范围
2579
2592
  };
2580
2593
 
2581
2594
  /* ---------------- 版本 & 框架自动更新(只更新程序本身,本地数据/规则不动) ---------------- */
2582
- const WWT_VER=(function(){const raw='P1.2.58';return raw.indexOf('__WVER__')>=0?'P1.2.10':raw;})();
2595
+ const WWT_VER=(function(){const raw='P1.2.60';return raw.indexOf('__WVER__')>=0?'P1.2.10':raw;})();
2583
2596
  const UPD_URL_KEY='wwt_fe_updurl';
2584
2597
  // 默认更新源:Gitee 上本项目的 version.json(API 接口,浏览器可直接跨域读)
2585
2598
  const DEFAULT_UPD_URL='https://gitee.com/api/v5/repos/wwtmrhu/certificate-generation/contents/dist/version.json';
@@ -2910,7 +2923,7 @@ function uid(){return 'VR'+Date.now().toString(36)+Math.random().toString(36).sl
2910
2923
  const LS='wwt_fe_cfg_v1';
2911
2924
  function saveCfg(){
2912
2925
  localStorage.setItem(LS,JSON.stringify({monthly:S.monthly,maps:S.maps,rules:S.rules,globalExcludes:S.globalExcludes||{},
2913
- generatedRuleIds:Array.from(S.genRules||[])}));
2926
+ generatedRuleIds:Array.from(S.genRules||[]), ruleVnos:S.ruleVnos||{}}));
2914
2927
  toast('配置已保存到本机');
2915
2928
  }
2916
2929
  function loadCfg(){
@@ -2926,6 +2939,8 @@ function loadCfg(){
2926
2939
  S.globalExcludes=(o.globalExcludes&&typeof o.globalExcludes==='object')?o.globalExcludes:{};
2927
2940
  // 【P1.2.50】已生成凭证的规则状态持久化
2928
2941
  S.genRules=new Set(o.generatedRuleIds||[]);
2942
+ // 【P1.2.60】规则生成的凭证号范围持久化
2943
+ S.ruleVnos=(o.ruleVnos&&typeof o.ruleVnos==='object')?o.ruleVnos:{};
2929
2944
  return;
2930
2945
  }catch(e){}
2931
2946
  }
@@ -2934,6 +2949,7 @@ function loadCfg(){
2934
2949
  S.rules=deepCopy(P.rules||[]);
2935
2950
  S.globalExcludes={};
2936
2951
  S.genRules=new Set();
2952
+ S.ruleVnos={};
2937
2953
  }
2938
2954
 
2939
2955
  /* ---------------- Excel 读取(SheetJS,失败自动走兜底) ---------------- */
@@ -3907,9 +3923,15 @@ function renderRuleChecks(){
3907
3923
  const list=filter==='all'?S.rules:S.rules.filter(r=>r.source===filter);
3908
3924
  $('ruleChecks').innerHTML=list.length?list.map(r=>{
3909
3925
  const generated=S.genRules.has(r.id);
3926
+ const vnoInfo=S.ruleVnos[r.id];
3927
+ let vnoBadge='';
3928
+ if(vnoInfo){
3929
+ const vtxt=vnoInfo.min===vnoInfo.max?String(vnoInfo.min):vnoInfo.min+'-'+vnoInfo.max;
3930
+ vnoBadge='<span class="vnobadge" title="本规则生成的凭证号">凭证 '+esc(vtxt)+'</span>';
3931
+ }
3910
3932
  return '<label class="chkbox'+(generated?' generated':'')+'"><input type="checkbox" data-rid="'+esc(r.id)+'" '+
3911
3933
  (S.selRules.has(r.id)?'checked':'')+' onchange="UI.toggleRuleSel(this)">'+
3912
- esc(r.name||r.id)+(generated?'<span class="genbadge">已生成</span>':'')+
3934
+ esc(r.name||r.id)+(generated?'<span class="genbadge">已生成</span>':'')+vnoBadge+
3913
3935
  '<span style="color:#8b949e;font-size:11px">'+esc(r.source)+'</span></label>';
3914
3936
  }).join('')
3915
3937
  :'<div style="color:#8b949e;font-size:12px;padding:8px">当前来源「'+esc(filter)+'」没规则可勾选。切到「全部」或在「③ 规则配置」加规则。</div>';
@@ -4259,6 +4281,41 @@ function redrawRuleForm(){
4259
4281
  /* ============================================================
4260
4282
  * ④ 生成凭证
4261
4283
  * ============================================================ */
4284
+
4285
+ // 【P1.2.60】多规则全选生成时,按以下优先级排序,让同类/同付款方式规则的凭证号相邻
4286
+ const GEN_PRIORITY_SOURCES = ['入库未确认','出库未确认','调拨未确认','在修车','已完工未结算'];
4287
+ const GEN_PRIORITY_PAYMENTS = ['对冲F','对账S','对账F','还件F','入库F','冲转S','冲转F','挂账','冲预收','冲预付','现金S','银行S','现金F','银行F'];
4288
+ function _uClean(s){ return String(s==null?'':s).trim(); }
4289
+ function detectRulePayment(r){
4290
+ const conds=r.conditions||[];
4291
+ for(const c of conds){
4292
+ const f=_uClean(c.field||'');
4293
+ if(/付款方式|支付方式|结算方式/.test(f)){
4294
+ const v=_uClean(c.value||'');
4295
+ for(const p of GEN_PRIORITY_PAYMENTS) if(v.indexOf(p)>=0) return p;
4296
+ }
4297
+ }
4298
+ const name=_uClean(r.name||'');
4299
+ for(const p of GEN_PRIORITY_PAYMENTS) if(name.indexOf(p)>=0) return p;
4300
+ return '';
4301
+ }
4302
+ function rulePriorityKey(r){
4303
+ const src=_uClean(r.source||'');
4304
+ for(let i=0;i<GEN_PRIORITY_SOURCES.length;i++) if(src.indexOf(GEN_PRIORITY_SOURCES[i])>=0) return [0,i];
4305
+ const pay=detectRulePayment(r);
4306
+ const pi=GEN_PRIORITY_PAYMENTS.indexOf(pay);
4307
+ if(pi>=0) return [1,pi];
4308
+ return [2,0];
4309
+ }
4310
+ function sortRulesForGen(rules){
4311
+ return rules.slice().sort((a,b)=>{
4312
+ const ka=rulePriorityKey(a), kb=rulePriorityKey(b);
4313
+ for(let i=0;i<ka.length;i++){ if(ka[i]!==kb[i]) return ka[i]-kb[i]; }
4314
+ return 0;
4315
+ });
4316
+ }
4317
+ window.WWT_RULE_PRIO={detectRulePayment, rulePriorityKey, sortRulesForGen};
4318
+
4262
4319
  function doGenerate(){
4263
4320
  // 【P1.2.51】生成栏里的「凭证起始号」优先级最高:生成前把它写回 S.monthly,并同步到②映射页的输入框
4264
4321
  const vsInp=$('genVStart');
@@ -4276,11 +4333,15 @@ function doGenerate(){
4276
4333
  const date=$('genDate').value || S.monthly.date;
4277
4334
  if(!date){ toast('先填凭证日期(或在月度参数里填记账日期)'); return; }
4278
4335
  const sel=S.selRules.size?S.selRules:null;
4336
+ // 【P1.2.60】多规则生成时按优先级排序;单条生成时保持原顺序
4337
+ let genRules=S.rules.slice();
4338
+ if(sel) genRules=genRules.filter(r=>sel.has(r.id));
4339
+ if(genRules.length>1) genRules=sortRulesForGen(genRules);
4279
4340
  const t0=performance.now();
4280
4341
  let res;
4281
4342
  try{
4282
4343
  res=E.generate({
4283
- rules:S.rules, biz:S.biz, monthly:S.monthly, maps:S.maps, base:S.base,
4344
+ rules:genRules, biz:S.biz, monthly:S.monthly, maps:S.maps, base:S.base,
4284
4345
  selectedIds:sel, modeOverride:$('genMode').value||'',
4285
4346
  groupByOverride:$('genGroupBy').value.trim()||'',
4286
4347
  voucherDate:date, syncBizDate:$('genSyncBiz').checked,
@@ -4291,6 +4352,8 @@ function doGenerate(){
4291
4352
  S.balance=E.balanceCheck(S.draft);
4292
4353
  // 【P1.2.50】标记实际生成了凭证的规则为「已生成」,持久化到 localStorage
4293
4354
  (res.rows||[]).forEach(r=>{ const rid=r['规则编号']; if(rid) S.genRules.add(String(rid)); });
4355
+ // 【P1.2.60】记录每条规则本次生成的凭证号范围,回显到规则卡片上
4356
+ S.ruleVnos=res.ruleVnos||{};
4294
4357
  DB.put('misc','draft',S.draft); DB.put('misc','missing',S.missing);
4295
4358
  saveCfg();
4296
4359
  renderRuleChecks();
@@ -5953,8 +6016,9 @@ window.UI={
5953
6016
  toggleRuleBody:i=>{const b=$('rb'+i);if(b)b.classList.toggle('on');},
5954
6017
  toggleRuleSel:cb=>{cb.checked?S.selRules.add(cb.dataset.rid):S.selRules['delete'](cb.dataset.rid);},
5955
6018
  selAllRules:v=>{S.selRules.clear();if(v)S.rules.forEach(r=>S.selRules.add(r.id));renderRuleChecks();},
6019
+ renderRuleChecks:renderRuleChecks,
5956
6020
  // 【P1.2.50】清空「已生成」绿色标记(规则删除时也会同步清理)
5957
- clearGenerated:()=>{ if(!S.genRules.size){ toast('没有已生成标记可清空'); return; } if(!confirm('确定清空全部「已生成」绿色标记?已生成的凭证草稿不会受影响。'))return; S.genRules.clear(); saveCfg(); renderRuleChecks(); toast('已清空生成标记'); },
6021
+ clearGenerated:()=>{ if(!S.genRules.size){ toast('没有已生成标记可清空'); return; } if(!confirm('确定清空全部「已生成」绿色标记?已生成的凭证草稿不会受影响。'))return; S.genRules.clear(); S.ruleVnos={}; saveCfg(); renderRuleChecks(); toast('已清空生成标记'); },
5958
6022
  // 【P1.2.35】全局排除弹窗:按业务源分组的总开关(在外面,不嵌在每条规则里)
5959
6023
  openGlobalExcludes:()=>{
5960
6024
  const ge = S.globalExcludes || (S.globalExcludes = {});
package/dist/version.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
- "ver": "P1.2.58",
3
- "npm": "1.2.58",
4
- "url": "https://cdn.jsdelivr.net/npm/wwt-certificate-tool@1.2.58/dist/app.html",
5
- "url_unpkg": "https://unpkg.com/wwt-certificate-tool@1.2.58/dist/app.html",
6
- "url_gh": "https://api.github.com/repos/huweipei745839/certificate-generation/contents/dist/WWT%E5%87%AD%E8%AF%81%E5%B7%A5%E5%85%B7_P1.2.58.html",
7
- "note": "① 内置默认基础表/规则/映射:新安装或分享打开即自带当前这套标准配置。② 生成凭证后实际生成了凭证的规则自动变绿并显示「已生成」徽章,状态持久化。③ 新增「清空已生成」按钮。④ 凭证起始号放到「④ 生成凭证」页生成栏。⑤ 对碰检测跳过未结算单据,缺失清单增加「单号」与「付款方式/结算方式」列。⑥ 凭证审核表「核算维度」列移到「科目名称」后。⑦ 分录级拆分字段:每条分录可单独设置拆分字段,实现一张凭证内借方按单号拆、贷方汇总等混合拆分。⑧ 【P1.2.55】顶部工具栏增加「清空业务数据」按钮,只清本月业务数据表,保留基础数据、规则、映射和配置。⑨ 【P1.2.56】生成/审核自动跳过 Excel 底部的「合计/小计/总计」行,避免汇总金额被重复累加(如 人进价 145万 翻倍的翻倍问题);合计行在编辑器内仍可见、只是不参与凭证生成。⑩ 【P1.2.57】修复合计行识别:扫描行内所有字段,避免「合计」写在摘要/备注/行类型等非标识列时仍被误当作数据行累加。⑪ 【P1.2.58】合计行兜底识别:若某行「单位名称/供应商名称/单号等标识列全空 + 有非零金额」(即合计行无合计字样),也判定为合计行跳过,彻底杜绝金额翻倍。"
2
+ "ver": "P1.2.60",
3
+ "npm": "1.2.60",
4
+ "url": "https://cdn.jsdelivr.net/npm/wwt-certificate-tool@1.2.60/dist/app.html",
5
+ "url_unpkg": "https://unpkg.com/wwt-certificate-tool@1.2.60/dist/app.html",
6
+ "url_gh": "https://api.github.com/repos/huweipei745839/certificate-generation/contents/dist/WWT%E5%87%AD%E8%AF%81%E5%B7%A5%E5%85%B7_P1.2.60.html",
7
+ "note": "① 内置默认基础表/规则/映射:新安装或分享打开即自带当前这套标准配置。② 生成凭证后实际生成了凭证的规则自动变绿并显示「已生成」徽章,状态持久化。③ 新增「清空已生成」按钮。④ 凭证起始号放到「④ 生成凭证」页生成栏。⑤ 对碰检测跳过未结算单据,缺失清单增加「单号」与「付款方式/结算方式」列。⑥ 凭证审核表「核算维度」列移到「科目名称」后。⑦ 分录级拆分字段:每条分录可单独设置拆分字段,实现一张凭证内借方按单号拆、贷方汇总等混合拆分。⑧ 【P1.2.55】顶部工具栏增加「清空业务数据」按钮,只清本月业务数据表,保留基础数据、规则、映射和配置。⑨ 【P1.2.56】生成/审核自动跳过 Excel 底部的「合计/小计/总计」行,避免汇总金额被重复累加(如 人进价 145万 翻倍的翻倍问题);合计行在编辑器内仍可见、只是不参与凭证生成。⑩ 【P1.2.57】修复合计行识别:扫描行内所有字段,避免「合计」写在摘要/备注/行类型等非标识列时仍被误当作数据行累加。⑪ 【P1.2.58】合计行兜底识别:若某行「单位名称/供应商名称/单号等标识列全空 + 有非零金额」(即合计行无合计字样),也判定为合计行跳过,彻底杜绝金额翻倍。⑫ 【P1.2.59】修复全部汇总模式下摘要把全组供应商拼接的问题:{供应商名称}/{单位名称} 各自读取对应字段,且摘要上下文按最终分录小组构建,同一凭证内多个供应商不再互相串到摘要里。⑬ 【P1.2.60】多规则全选生成时按优先级排序:先「入库未确认/出库未确认/调拨未确认/在修车/已完工未结算」,再按付款方式/支付方式「对冲F/对账S/对账F/还件F/入库F/冲转S/冲转F/挂账/冲预收/冲预付/现金S/银行S/现金F/银行F」凑近凭证号;规则卡片显示本次生成的凭证号范围,方便核对。"
8
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wwt-certificate-tool",
3
- "version": "1.2.58",
3
+ "version": "1.2.60",
4
4
  "description": "WWT 金蝶凭证工具 · 纯前端版(离线单文件 HTML,双击即用)",
5
5
  "keywords": [
6
6
  "WWT",