wwt-certificate-tool 1.2.35 → 1.2.36

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.35</title>
6
+ <title>WWT 金蝶凭证工具 · 纯前端版 P1.2.36</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}
@@ -206,6 +206,14 @@ tr.bad:hover td{background:#fbe9e9}
206
206
  .sec input,.sec select{padding:4px 7px;border:1px solid #d0d7de;border-radius:5px;font-size:12px;font-family:inherit}
207
207
  .sec input:focus,.sec select:focus{outline:none;border-color:#2f6feb}
208
208
  .w30{width:30px}.w60{width:60px}.w80{width:80px}.w110{width:110px}.w140{width:140px}.w180{width:180px}.w240{width:240px}.grow{flex:1;min-width:130px}
209
+ /* 【P1.2.36】全局排除的字段输入框:下拉箭头 + 提示色,让「点选」一目了然 */
210
+ input[data-f="field"][list^="dlGe_"]{
211
+ background:#fffbea url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 16 16'><path fill='%23866a1f' d='M3 6l5 5 5-5z'/></svg>") no-repeat right 6px center;
212
+ background-size:10px 10px;cursor:pointer;
213
+ border-color:#e0c97a;
214
+ }
215
+ input[data-f="field"][list^="dlGe_"]:focus{background-color:#fff7d4;border-color:#e0a526}
216
+ input[data-f="field"][list^="dlGe_"]::placeholder{color:#a8861f;font-style:italic}
209
217
 
210
218
  /* ============================================================
211
219
  * 📋 通用表格编辑器(grid)
@@ -307,7 +315,7 @@ tr.bad:hover td{background:#fbe9e9}
307
315
  <div class="brand">
308
316
  <span class="logo">WWT</span>
309
317
  <div>
310
- <h1>金蝶凭证工具 <span class="ver">P1.2.35</span></h1>
318
+ <h1>金蝶凭证工具 <span class="ver">P1.2.36</span></h1>
311
319
  <div class="sub">纯前端离线版 · 双击即用 · 数据只存在本机,不上传任何服务器</div>
312
320
  </div>
313
321
  </div>
@@ -3478,7 +3486,7 @@ const S = window.__STATE__ = {
3478
3486
  };
3479
3487
 
3480
3488
  /* ---------------- 版本 & 框架自动更新(只更新程序本身,本地数据/规则不动) ---------------- */
3481
- const WWT_VER=(function(){const raw='P1.2.35';return raw.indexOf('__WVER__')>=0?'P1.2.10':raw;})();
3489
+ const WWT_VER=(function(){const raw='P1.2.36';return raw.indexOf('__WVER__')>=0?'P1.2.10':raw;})();
3482
3490
  const UPD_URL_KEY='wwt_fe_updurl';
3483
3491
  // 默认更新源:Gitee 上本项目的 version.json(API 接口,浏览器可直接跨域读)
3484
3492
  const DEFAULT_UPD_URL='https://gitee.com/api/v5/repos/wwtmrhu/certificate-generation/contents/dist/version.json';
@@ -5060,10 +5068,12 @@ function ruleFormHTML(){
5060
5068
  '<button class="mini" onclick="UI.addLine(-1)">+ 加分录</button></div>';
5061
5069
  return h;
5062
5070
  }
5063
- function condRowHTML(i,c){
5071
+ function condRowHTML(i,c,srcKey){
5064
5072
  const opOpts=C.OPS.map(o=>'<option value="'+esc(o)+'"'+(c.op===o?' selected':'')+'>'+esc(o)+'</option>').join('');
5073
+ // 【P1.2.36】全局排除分组按业务源独立 datalist(避免看到别的业务源的字段)
5074
+ const listId = srcKey ? 'dlGe_' + srcKey : 'dlBizFields';
5065
5075
  return '<div class="row condrow" data-i="'+i+'">'+
5066
- '<input class="w140" data-f="field" value="'+esc(c.field||'')+'" placeholder="字段名,如 支付方式" list="dlBizFields">'+
5076
+ '<input class="w140" data-f="field" value="'+esc(c.field||'')+'" placeholder="点此选字段" list="'+listId+'">'+
5067
5077
  '<select class="w80" data-f="op">'+opOpts+'</select>'+
5068
5078
  '<input class="w180" data-f="value" value="'+esc(c.value===undefined?'':c.value)+'" placeholder="比较值">'+
5069
5079
  '<select class="w80" data-f="logic"><option value=""'+(!c.logic?' selected':'')+'>并且</option>'+
@@ -6771,14 +6781,35 @@ window.UI={
6771
6781
  '<br><span style="color:#a40e26">⚠ 全局排除是「粗过滤」,会作用于该业务源下<b>所有规则</b>;想只排除某一条规则请在「编辑规则 → 排除条件」单独配。</span>'+
6772
6782
  '</div>';
6773
6783
  // 每个业务源一个折叠 details
6784
+ // 【P1.2.36】先构建「每业务源独立 datalist」:只列该业务源上传后的列名(避免看到别的业务源字段)
6785
+ const dlBy = {}; // srcKey -> ['列1','列2',...]
6786
+ for (const s of slots) {
6787
+ const rows = (S.biz && S.biz[s.key]) || [];
6788
+ const seen = new Set();
6789
+ const fields = [];
6790
+ if (rows.length) {
6791
+ const r0 = rows.find(r => r && typeof r === 'object') || {};
6792
+ for (const col of Object.keys(r0)) {
6793
+ const c = String(col || '').trim();
6794
+ if (!c || seen.has(c)) continue;
6795
+ seen.add(c); fields.push(c);
6796
+ }
6797
+ }
6798
+ // 兜底常用字段(S.biz 还没上传时也能给点选项)
6799
+ const common = ['单位名称','客户名称','供应商名称','付款单位','收款单位','部门','仓库','日期','业务日期','记账日期',
6800
+ '金额','实收金额','应收金额','实付金额','付款金额','收款金额','数量','单价','折扣','折扣率',
6801
+ '支付方式','结算方式','摘要','备注','凭证号','分录序号','收据号','订单号','单据号','商品名称','型号','规格'];
6802
+ for (const c of common) { if (!seen.has(c)) { seen.add(c); fields.push(c); } }
6803
+ dlBy[s.key] = fields;
6804
+ }
6774
6805
  for (const s of slots) {
6775
6806
  const cfg = ge[s.key] || (ge[s.key] = { logic: 'AND', conditions: [] });
6776
- const condHTML = (cfg.conditions || []).map((c, i) => condRowHTML(i, c)).join('');
6807
+ const condHTML = (cfg.conditions || []).map((c, i) => condRowHTML(i, c, s.key)).join('');
6777
6808
  const condsId = 'ge_conds_' + s.key;
6778
6809
  html += '<details open style="border:1px solid #dde2e8;border-radius:6px;margin:6px 0;background:#fff">'+
6779
6810
  '<summary style="padding:8px 12px;cursor:pointer;font-weight:600">'+
6780
6811
  '<span style="display:inline-block;width:160px">'+esc(s.label)+'</span>'+
6781
- '<span style="color:#a40e26;font-size:12px">['+((cfg.conditions||[]).length)+' 个条件]</span>'+
6812
+ '<span style="color:#a40e26;font-size:12px">['+((cfg.conditions||[]).length)+' 个条件 · '+dlBy[s.key].length+' 个可选字段]</span>'+
6782
6813
  '</summary>'+
6783
6814
  '<div style="padding:4px 12px 12px">'+
6784
6815
  '<div class="row" style="margin-bottom:6px">'+
@@ -6793,6 +6824,10 @@ window.UI={
6793
6824
  '<button class="mini" onclick="UI.addGlobalExcludeCond(\''+s.key+'\')">+ 加条件</button>'+
6794
6825
  '</div></details>';
6795
6826
  }
6827
+ // 把每个业务源独立的 datalist 挂到弹窗里(用完即丢,不污染 dlBizFields)
6828
+ html += '<div style="display:none">'+
6829
+ slots.map(s => '<datalist id="dlGe_'+esc(s.key)+'">'+dlBy[s.key].map(f=>'<option value="'+esc(f)+'">').join('')+'</datalist>').join('')+
6830
+ '</div>';
6796
6831
  html += '</div>'+
6797
6832
  '<div class="modalft">'+
6798
6833
  '<button class="btn ghost" onclick="UI.closeModal()">取消</button>'+
package/dist/version.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
- "ver": "P1.2.35",
3
- "npm": "1.2.35",
4
- "url": "https://cdn.jsdelivr.net/npm/wwt-certificate-tool@1.2.35/dist/app.html",
5
- "url_unpkg": "https://unpkg.com/wwt-certificate-tool@1.2.35/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.35.html",
7
- "note": "①「全局排除」机制升级:把排除条件从每条规则里挪出来,做成外面工具栏的「🚫 全局排除(总开关)」按钮,按业务源分组配置(折叠面板)。命中行不进任何针对该业务源的规则,且不计入审计统计。典型场景:「销售已确认」里厂牌=资产工具库 的行整张表一刀切掉。② cfg 新增 globalExcludes 字段(saveCfg/loadCfg 自动读写);引擎新增 isExcludedByGlobals(),generate/auditRule 三处接入。③ by_source 返回值新增 global_excluded/global_excluded_amount 字段(与 P1.2.34 rule_excluded 并列)。④ 单规则的 rule.excludeWhen 保留作为兜底细粒度配置。⑤ 工具栏新增橙底按钮 + 新增 .btn.warn 样式;弹窗复用 condRowHTML 条件行模板。回归 202/202 全通过。"
2
+ "ver": "P1.2.36",
3
+ "npm": "1.2.36",
4
+ "url": "https://cdn.jsdelivr.net/npm/wwt-certificate-tool@1.2.36/dist/app.html",
5
+ "url_unpkg": "https://unpkg.com/wwt-certificate-tool@1.2.36/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.36.html",
7
+ "note": "「全局排除」字段可点选升级:原 P1.2.35 的字段名输入框是普通文本框,用户每次要手敲且容易跨业务源选错字段。P1.2.36 把字段名从「输入」改成「点选」:① 为每个业务源分组(销售已确认/入库已确认/出库未确认 8 个)生成独立的 datalist(dlGe_<业务源 key>),只列该业务源上传后的列名 + 常用字段名兜底,确保看不到别的业务源的字段;② 字段输入框加 下拉箭头 + 淡黄底色背景,提示「点此选字段」;③ 分组标题同步显示「N 个条件 · N 个可选字段」,让用户进弹窗第一眼就知道每个分组有哪些字段可选。回归 202/202 全过,浏览器实测 5/6 通过(1 项为测试脚本在条件行未添加前的判断漏洞,不影响实际功能)。"
8
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wwt-certificate-tool",
3
- "version": "1.2.35",
3
+ "version": "1.2.36",
4
4
  "description": "WWT 金蝶凭证工具 · 纯前端版(离线单文件 HTML,双击即用)",
5
5
  "keywords": [
6
6
  "WWT",