From 7a26ed20d0b95f781a60f9fc94ffae613c87fe6f Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期二, 22 九月 2026 10:06:56 +0800
Subject: [PATCH] feat(数据查看): 数据类型改分组单下拉框(支持搜索)+ 接入左侧冻结标识列(含此前未提交的冻结列实现)

---
 docs/投资/工具/市州月报解析.py |   62 ++++++++++++++++++++++++-------
 1 files changed, 48 insertions(+), 14 deletions(-)

diff --git "a/docs/\346\212\225\350\265\204/\345\267\245\345\205\267/\345\270\202\345\267\236\346\234\210\346\212\245\350\247\243\346\236\220.py" "b/docs/\346\212\225\350\265\204/\345\267\245\345\205\267/\345\270\202\345\267\236\346\234\210\346\212\245\350\247\243\346\236\220.py"
index fcc2043..77e32f1 100644
--- "a/docs/\346\212\225\350\265\204/\345\267\245\345\205\267/\345\270\202\345\267\236\346\234\210\346\212\245\350\247\243\346\236\220.py"
+++ "b/docs/\346\212\225\350\265\204/\345\267\245\345\205\267/\345\270\202\345\267\236\346\234\210\346\212\245\350\247\243\346\236\220.py"
@@ -76,21 +76,14 @@
     return str(v)
 
 
-def pick_columns(cell, nrows, ncols):
-    """鎸夎〃澶村叧閿瓧瀹氫綅鍒楋紱鍚屼竴瀛楁鍛戒腑澶氭鏃讹紝鍙栤�滆鍙锋渶灏忋�佸叾娆℃槸鍛戒腑璇嶆渶鐭�濈殑閭d釜銆�"""
-    hits = F.scan_fields(cell, nrows, ncols)
-    cols = {}
-    for f in FIELDS:
-        if f not in hits:
-            continue
-        best = sorted(hits[f], key=lambda h: (h[0], len(h[2])))[0]
-        cols[f] = F.colindex(best[1])
-    return cols, hits
+def pick_columns(cell, nrows, ncols, merges=None):
+    """鎸夎〃澶村畾浣嶅垪锛堝惈涓ょ骇琛ㄥご娑堟锛夆�斺�斿疄鐜拌 鏍煎紡鎺㈡祴.py 鐨� pick_columns锛屼繚璇佷袱澶勫彛寰勪竴鑷淬��"""
+    return F.pick_columns(cell, nrows, ncols, merges, fields=FIELDS)
 
 
-def parse_sheet(cell, nrows, ncols, city=None):
+def parse_sheet(cell, nrows, ncols, city=None, merges=None):
     """瑙f瀽涓�寮犲伐浣滆〃 鈫� (椤圭洰琛屽垪琛�, 娈典俊鎭�, 鏍¢獙淇℃伅)"""
-    cols, hits = pick_columns(cell, nrows, ncols)
+    cols, hits = pick_columns(cell, nrows, ncols, merges)
     namec = cols.get('椤圭洰鍚嶇О')
     if namec is None:
         return [], {}, {}
@@ -181,7 +174,7 @@
     bodies = [a.body] if a.body else ['瀹㈣繍锛堝杩愮珯锛�', '鐗╂祦锛堢墿娴佸洯鍖猴級']
     md = '%d鏈�' % int(a.month.split('-')[1])
 
-    records, report = [], []
+    records, report, checks = [], [], []
     report.append('# 甯傚窞鏈堟姤瑙f瀽鎶ュ憡锛�%s锛�' % a.month)
     report.append('')
     report.append('锛堝彧璇昏В鏋愶紱涓�琛屼竴涓」鐩锛屾槑缁嗚鍚屽悕 `.tsv`锛�')
@@ -207,23 +200,38 @@
                 sel = F.pick_sheet(sheets, ym=ym)
                 if not sel:
                     report.append('| %s | 锛堟湭閫変腑宸ヤ綔琛級 | | | | | |' % f[:44])
+                    checks.append({'鍝佺被': body_key, '甯傚窞': city_file or '', '鏂囦欢': f, '宸ヤ綔琛�': '',
+                                   '鐘舵��': '鏈�変腑宸ヤ綔琛�', '椤圭洰琛屾暟': 0, '涓�鑷存��': '鈥�'})
                     continue
                 nm, nr, nc, cell, _hits = sel
-                rows, seg, extra = parse_sheet(cell, nr, nc, city=city_file)
+                merges = F.sheet_merges(path).get(nm, [])
+                rows, seg, extra = parse_sheet(cell, nr, nc, city=city_file, merges=merges)
                 city = seg.get('甯傚窞') or city_file or city_by_override(f) or ''
                 sums = {k: sum(num(r.get(k)) or 0 for r in rows) for k in NUM_FIELDS}
                 sub = extra.get('灏忚鍚堣琛�') or {}
                 sub_txt, ok = [], '鈥�'
                 if not sub and extra.get('甯傚窞琛屽��'):
                     sub = {'R%s(甯傚窞琛�)' % (seg.get('甯傚窞琛�') or '?'): extra['甯傚窞琛屽��']}
+                tok = tval = None
                 if sub:
                     key, val = pick_total(sub)
+                    tok, tval = key, val
                     sub_txt.append('%s=%s' % (key, '/'.join(pretty(val.get(k)) for k in ('鑷紑濮嬪缓璁剧疮璁�', '鑷勾鍒濈疮璁�', '鏈湀瀹屾垚'))))
                     if len(sub) > 1:
                         sub_txt.append('锛堝彟鏈� %d 琛屽皬璁�/鍚堣锛�' % (len(sub) - 1))
                     same = all(abs((val.get(k) or 0) - sums[k]) < 0.05
                                for k in ('鑷紑濮嬪缓璁剧疮璁�', '鑷勾鍒濈疮璁�', '鏈湀瀹屾垚'))
                     ok = '鉁� 涓�鑷�' if same else '鈿狅笍 涓嶄竴鑷�'
+                ck = {'鍝佺被': body_key, '甯傚窞': city, '鏂囦欢': f, '宸ヤ綔琛�': nm, '鐘舵��': 'OK',
+                      '椤圭洰琛屾暟': len(rows), '鍚堣琛�': '', '涓�鑷存��': ok,
+                      '鍒椾綅': ','.join('%s=%s' % (k, v) for k, v in (extra.get('鍒椾綅') or {}).items())}
+                for k in ('鑷紑濮嬪缓璁剧疮璁�', '鑷勾鍒濈疮璁�', '鏈湀瀹屾垚'):
+                    ck['姹傚拰_' + k] = sums[k]
+                if sub:
+                    ck['鍚堣琛�'] = tok
+                    for k in ('鑷紑濮嬪缓璁剧疮璁�', '鑷勾鍒濈疮璁�', '鏈湀瀹屾垚'):
+                        ck['鍚堣_' + k] = tval.get(k)
+                checks.append(ck)
                 report.append('| %s | %s | %s | %d | %s | %s | %s |' % (
                     f[:44], nm[:14], city, len(rows),
                     '/'.join(pretty(sums[k]) for k in ('鑷紑濮嬪缓璁剧疮璁�', '鑷勾鍒濈疮璁�', '鏈湀瀹屾垚')),
@@ -234,6 +242,9 @@
                     records.append(rec)
             except Exception as e:
                 report.append('| %s | 锛堣В鏋愬け璐ワ細%s: %s锛� | | | | | |' % (f[:44], type(e).__name__, str(e)[:60]))
+                checks.append({'鍝佺被': body_key, '甯傚窞': city_file or '', '鏂囦欢': f, '宸ヤ綔琛�': '',
+                               '鐘舵��': '瑙f瀽澶辫触锛�%s: %s' % (type(e).__name__, str(e)[:80]),
+                               '椤圭洰琛屾暟': 0, '涓�鑷存��': '鈥�'})
         report.append('')
 
     # 甯傚窞姹囨�伙紙璺ㄦ枃浠跺悎骞跺悓甯傚窞锛�
@@ -254,6 +265,28 @@
             *(pretty(s[f]) for f in ('鎬绘姇璧�', '鑷紑濮嬪缓璁剧疮璁�', '鏈勾璁″垝鎶曡祫', '鑷勾鍒濈疮璁�', '鏈湀瀹屾垚'))))
     report.append('')
 
+    report.append('## 鍚勬簮鏂囦欢璇嗗埆鍒扮殑鍒椾綅锛�**鎸夎〃澶村叧閿瓧瀹氫綅锛屼笉鏄浐瀹氬垪鍙�**锛�')
+    report.append('')
+    report.append('| 鍝佺被 | 鏂囦欢 | 宸ヤ綔琛� | 椤圭洰鍚嶇О | 鎬绘姇璧� | 鑷紑濮嬪缓璁剧疮璁� | 鏈勾璁″垝鎶曡祫 | 鑷勾鍒濈疮璁� | 鏈湀瀹屾垚 |')
+    report.append('| --- | --- | --- | --- | --- | --- | --- | --- | --- |')
+    _key5 = ('椤圭洰鍚嶇О', '鎬绘姇璧�', '鑷紑濮嬪缓璁剧疮璁�', '鏈勾璁″垝鎶曡祫', '鑷勾鍒濈疮璁�', '鏈湀瀹屾垚')
+    for ck in checks:
+        _cm = dict(kv.split('=', 1) for kv in (ck.get('鍒椾綅') or '').split(',') if '=' in kv)
+        report.append('| %s | %s | %s | %s |' % (ck.get('鍝佺被', ''), ck.get('鏂囦欢', '')[:34], ck.get('宸ヤ綔琛�', '')[:12],
+                                                 ' | '.join(_cm.get(k, '鈥�') for k in _key5)))
+    report.append('')
+
+    ck_cols = ['鍝佺被', '甯傚窞', '鏂囦欢', '宸ヤ綔琛�', '鐘舵��', '椤圭洰琛屾暟', '涓�鑷存��', '鍚堣琛�', '鍒椾綅',
+               '姹傚拰_鑷紑濮嬪缓璁剧疮璁�', '姹傚拰_鑷勾鍒濈疮璁�', '姹傚拰_鏈湀瀹屾垚',
+               '鍚堣_鑷紑濮嬪缓璁剧疮璁�', '鍚堣_鑷勾鍒濈疮璁�', '鍚堣_鏈湀瀹屾垚']
+    p_ck = os.path.join(out, '瑙f瀽鏍¢獙_%s.tsv' % a.month)
+    with io.open(p_ck, 'w', encoding='utf-8-sig') as fh:
+        fh.write('\t'.join(ck_cols) + '\n')
+        for c in checks:
+            fh.write('\t'.join(pretty(c.get(k, '')) if isinstance(c.get(k), float) else str(c.get(k, ''))
+                                for k in ck_cols) + '\n')
+    print('鏍¢獙璁板綍鏁� = %d' % len(checks))
+
     cols = ['鍝佺被', '甯傚窞', '鏂囦欢', '宸ヤ綔琛�', '琛屽彿', '搴忓彿', '鍒嗙被'] + FIELDS
     tsv = os.path.join(out, '瑙f瀽缁撴灉_%s.tsv' % a.month)
     with io.open(tsv, 'w', encoding='utf-8-sig') as fh:
@@ -265,6 +298,7 @@
     print('椤圭洰琛屽悎璁� = %d' % len(records))
     print('wrote', p_md)
     print('wrote', tsv)
+    print('wrote', p_ck)
 
 
 if __name__ == '__main__':

--
Gitblit v1.9.1