feat: 汇总大表日期格式/小数位复核+VBA列宽宏+DataView滚动加载+RULE_004双向与P005阈值联动
- 母版/导出日期锚点统一 yyyy年m月,修复货运页 CQ 列期次显示成数字;数值 0.00/排名 0、无 3/4 位小数、去底色全簿复验
- 新增 VBA 全工作表列宽自适应工具(docs/工具)
- DataView.vue:修复滚动容器识别(capture 监听 el-table body-wrapper),滚动到底自动加载更多;Chrome 真机 20→140 行验证
- AuditEngineService:RULE_004 改为双向(上月无→新增/上月有→消失均提醒),2026-07 实测新增6/消失3/双向1 家
- RuleManageController:规则名称/说明 ±N% 随阈值字段自动同步并持久化;P005 实测 20→30→20
- init.sql 种子同步(RULE_004 说明、P005 名称/说明/阈值20);新增要求与验收基线清单及本批测试报告、工作日结追加
| | |
| | | ('è½¦è¾æ°è¿æ¿å¯¹æ¯', 'RULE_001', 'ä¼ä¸ä¸æ¥è½¦è¾æ°ä¸è¿æ¿æ°æ®å¯¹æ¯ï¼å·®è·>5å°éæ ¸å®', 'vehicleTotal', 'DIFF', '5', 'RED', 'H2032', 1, 1), |
| | | ('å¨ä½è¿æ¿å¯¹æ¯', 'RULE_002', 'ä¼ä¸ä¸æ¥å¨ä½ä¸è¿æ¿æ°æ®å¯¹æ¯ï¼å·®è·>50éæ ¸å®', 'tonsTotal', 'DIFF', '50', 'RED', 'H2032', 1, 2), |
| | | ('å¨è½¬é轨迹对æ¯', 'RULE_003', '䏿¥å¨è½¬éä¸è½¨è¿¹æµç®å¨è½¬é对æ¯ï¼é«åº30%éæ ¸å®', 'turnoverTotal,trackMileage', 'RATIO', '1.3', 'RED', 'H2032', 1, 3), |
| | | ('è´§è¿ç±»åç¯æ¯', 'RULE_004', 'æ¬ææ°å¢è´§è¿ç±»åéæ ¸å®ï¼ä¸æä¸º0ãæ¬ææéï¼', 'freightContainer,freightCoal,freightOilGas,freightCrudeOil,freightMetalOre,freightIronOre,freightBuilding,freightGrain', 'MOM', '0', 'YELLOW', 'H2032', 1, 4), |
| | | ('è´§è¿ç±»åç¯æ¯', 'RULE_004', '䏿æ ï¼æ¬ææ°å¢ï¼æéï¼ä¸ææï¼æ¬ææ ï¼æéï¼è´§è¿ç±»åç¯æ¯ï¼', 'freightContainer,freightCoal,freightOilGas,freightCrudeOil,freightMetalOre,freightIronOre,freightBuilding,freightGrain', 'MOM', '0', 'YELLOW', 'H2032', 1, 4), |
| | | ('éè£
ç®±å¼å¸¸', 'RULE_005', 'æ éè£
ç®±è½¦ä½æéè£
箱货è¿ééæ ¸å®', 'freightContainer,vehicleContainer', 'NULL_CHECK', '0', 'RED', 'H2032', 1, 5), |
| | | ('æ´è½¦å¨ä½èå´', 'RULE_006', 'æ´è½¦å¨ä½ä¸å¨4-40å¨ä¹é´', 'tonsWhole', 'OUT_RANGE', '4,40', 'YELLOW', 'H2032', 1, 6); |
| | | |
| | |
| | | ('è½½å®¢ä½æ°è¿æ¿å¯¹æ¯(æ
客)', 'RULE_P002', 'æ ¸å®è½½å®¢ä½æ°ä¸è¿æ¿è½½å®¢ä½æ°å¯¹æ¯ï¼å·®è·>50éæ ¸å®', 'seatTotal', 'DIFF', '50', 'RED', 'H2031', 1, 22), |
| | | ('客è¿éç¯æ¯=0æ ¸å®', 'RULE_P003', 'ä¸ç±»/äºç±»/ä¸ç±»/åç±»/å
车客è¿éç¯æ¯ä¸ä¸ªæçäº0éæ ¸å®', 'passengerClass1,passengerClass2,passengerClass3,passengerClass4,passengerCharter', 'MOM_EQ_ZERO', '0', 'YELLOW', 'H2031', 1, 23), |
| | | ('æ
客å¨è½¬éç¯æ¯=0æ ¸å®', 'RULE_P004', 'ä¸ç±»/äºç±»/ä¸ç±»/åç±»/å
车æ
客å¨è½¬éç¯æ¯ä¸ä¸ªæçäº0éæ ¸å®', 'turnoverClass1,turnoverClass2,turnoverClass3,turnoverClass4,turnoverCharter', 'MOM_EQ_ZERO', '0', 'YELLOW', 'H2031', 1, 24), |
| | | ('å¹³åè¿è·ç¯æ¯è¶
±10%æ ¸å®', 'RULE_P005', 'ä¸ç±»/äºç±»/ä¸ç±»/å类平åè¿è·ç¯æ¯ä¸ä¸ªæè¶
è¿Â±10%éæ ¸å®', 'avgDistanceClass1,avgDistanceClass2,avgDistanceClass3,avgDistanceClass4', 'MOM_PCT', '10', 'YELLOW', 'H2031', 1, 25), |
| | | ('å¹³åè¿è·ç¯æ¯è¶
±20%æ ¸å®', 'RULE_P005', 'ä¸ç±»/äºç±»/ä¸ç±»/å类平åè¿è·ç¯æ¯ä¸ä¸ªæè¶
è¿Â±20%éæ ¸å®', 'avgDistanceClass1,avgDistanceClass2,avgDistanceClass3,avgDistanceClass4', 'MOM_PCT', '20', 'YELLOW', 'H2031', 1, 25), |
| | | ('å
车平åè¿è·çäºä¸ææ ¸å®', 'RULE_P006', 'æ
游å
车平åè¿è·çäºä¸ä¸ªæéæ ¸å®', 'avgDistanceCharter', 'MOM_EQ', '0', 'YELLOW', 'H2031', 1, 26), |
| | | ('æ ç线æç线客è¿éæ ¸å®', 'RULE_P007', 'æ 客è¿ç车ï¼ççº¿è½¦è¾æ°ä¸º0ï¼ä½æç线客è¿ééæ ¸å®', 'vehicleSchedule,passengerClass1,passengerClass2,passengerClass3,passengerClass4', 'EXISTENCE', '0', 'RED', 'H2031', 1, 27), |
| | | ('æ å
车æå
车客è¿éæ ¸å®', 'RULE_P008', 'æ 客è¿å
车ï¼å
è½¦è½¦è¾æ°ä¸º0ï¼ä½æå
车客è¿ééæ ¸å®', 'vehicleCharter,passengerCharter', 'EXISTENCE', '0', 'RED', 'H2031', 1, 28); |
| New file |
| | |
| | | # åè½æµè¯æ¥å_æ±æ»å¤§è¡¨æ¥ææ ¼å¼ä¸è§åèå¨åæ°æ®æ¥çæ»å¨å è½½_2026-09-08 |
| | | |
| | | - åè½èå´ï¼æ¬æ¹ 7 é¡¹è¦æ±ï¼æ¥æç»ä¸æ¾ç¤ºãVBA å宽å®ãæ°æ®æ¥çæ»å¨å è½½ãå°æ°ä½/æå夿 ¸ãè¦æ±åºçº¿æ¸
åãRULE_004 ååæéãRULE_P005 éå¼ä¸åç§°/说æèå¨ï¼ |
| | | - æµè¯ç¯å¢ï¼æ¬æº traffic-auditï¼å端 8090ãå端 8080 çç¼è¯è¿è¡ä¸ï¼ï¼MySQL 5.7 @ localhost:3308 traffic_auditï¼Chrome å
嵿µè§å¨çæºï¼Playwright/CUAï¼å®æµ UI |
| | | - éªè¯åºçº¿ï¼`docs/è¦æ±ä¸éªæ¶åºçº¿æ¸
å.md`ï¼å³çåºçº¿ãç¡®è®¤åæ§æ±æ»â¦_2026-09-07ã |
| | | |
| | | ## ç¨ä¾ä¸ç»è®º |
| | | |
| | | | # | ç¨ä¾ï¼è¾å
¥ï¼ | 颿 | å®é
| ç»è®º | |
| | | |---|---|---|---|---| |
| | | | 1 | çææ±æ»å¤§è¡¨ 2026-07/08ï¼æ£æ¥è´§è¿é¡µ CQ åçæ¥æéç¹æ¾ç¤º | ææ¬¡æ¾ç¤º `yyyy"å¹´"m"æ"`ï¼ä¸å¾æ¾ç¤ºææ°å | 两æä»¶å
¨ç°¿æ«æï¼æ¥æååå
æ ¼åæ ¼å¼=0ï¼`è´§è¿`页 CQ3 ç = datetime(2023-10-01) 䏿 ¼å¼ `yyyy"å¹´"m"æ"`ï¼æ General æ°åæ®ç | â
éè¿ | |
| | | | 2 | å
¨ç°¿æ ¼å¼ä½æ£ï¼å¯¼åºç 7/8 æå¤§è¡¨ï¼ | æ°å¼ 0.00 / ç¾åæ¯ 0.00% / æå 0ï¼æ 3/4 ä½å°æ°ãæ åºè² | bad3=0ãGeneral æ°å¼=0ãfills=0ï¼ä¸¤ä»½æä»¶ï¼ | â
éè¿ | |
| | | | 3 | æå䏿°å¼å°¾æ°æ½æ¥ï¼è´§è¿éæå/è´§è¿å¨è½¬éæå/ä¸å£å¾æå/éè·¯è¿è¾å¨è½¬é | æåæ´åæ´æ°ï¼æ°å¼åæ¾ç¤ºä¸¤ä½å°æ°ä¸ä¿çå
¨ç²¾åº¦ | è´§è¿éæå C/F/H/K/M/P åæ ¼å¼ `0`ï¼34 è¡ï¼ï¼è´§è¿å¨è½¬éæå/éè·¯è¿è¾å¨è½¬éæå为 `=RANK()(0)` å
¬å¼åï¼æ°å¼/忝å 0.00/0.00%ï¼å¨è½¬éæ 3/4 ä½å°æ° | â
éè¿ | |
| | | | 4 | VBA å®äº¤ä»ç© | æä¾å¯å¯¼å
¥æ¨¡åï¼å«å
¨è¡¨/å½å表两个å®ä¸ç¨æ³ | `docs/å·¥å
·/VBA_çæç©å
¨è¡¨èªå¨å宽_2026-09-08.txt`ï¼AutoFitAllSheets + AutoFitActiveSheet + 说æï¼ | â
éè¿ | |
| | | | 5 | æ°æ®æ¥ç页æ»å¨å°åºèªå¨å è½½ | æ®é/å
¨å±æ»å¨è³åºé¨è¿½å ä¸ä¸é¡µï¼è¡æ°éå¢ãæ»æ°ä¸åãæ JS æ¥é | Chrome çæºï¼è¡æ° 20â40â60â80â100â120â140ï¼å
± 13056 æ¡ä¸åï¼æ§å¶å° error/warning=0 | â
éè¿ | |
| | | | 6 | RULE_004 ååï¼è´§è¿ç±»åç¯æ¯ï¼å®¡æ ¸ 2026-07 | 䏿æ âæ¬ææã䏿æâæ¬ææ åæé | å½ä¸ 7 å®¶ï¼æ°å¢ 6ãæ¶å¤± 3ï¼1 å®¶ååï¼ï¼æ ·ä¾ `91420700090568838U æ¬ææ¶å¤±: éè£
ç®±ï¼ä¸æ=32210ï¼æ¬ææ ï¼` ä¸åºä¸ 6/7 ææ°æ®éåå»åï¼`91429006793269842X` æ°å¢ç
¤ç+æ¶å¤±æ²¹æ°ååå½ä¸ä¸å»å | â
éè¿ | |
| | | | 7 | RULE_P005 éå¼èå¨ï¼20 â 30 â 20 | åç§°/说æéç ±N% ééå¼èªå¨æ¹åå¹¶æä¹
å | å表 20 æ¶åç§°=å¹³åè¿è·ç¯æ¯è¶
±20%æ ¸å®ï¼æ¹ 30 ååè¡¨ä¸ DB å为 ±30%ï¼æ¹å 20 æ¢å¤ ±20%ï¼DB id=11 threshold=20 æä¹
å确认 | â
éè¿ | |
| | | |
| | | ## å
³é®æ°æ®ä¸æ½æ¥è¯æ® |
| | | - æ ¼å¼ä½æ£ï¼ä¸¤ä»½å¯¼åºï¼æ±æ»è¡ï¼`SUM: bad3=0 genNum=0 dtBadFmt=0`ï¼åæåé¡µæ ¼å¼ TOP è§ä¸è¡¨ï¼ |
| | | - è´§è¿éæåï¼`0`Ã204 / `0.00`Ã108 / `0.00%`Ã210 |
| | | - è´§è¿å¨è½¬éæåï¼`0.00`Ã85 / `0.00%`Ã108ï¼æåå为 RANK å
¬å¼ï¼æ ¼å¼ 0ï¼ |
| | | - éè·¯è¿è¾å¨è½¬éï¼`0.00`Ã216 / `0.00%`Ã107ï¼æ 3/4 ä½å°æ° |
| | | - RULE_004 åºæ ¸å¯¹ SQLï¼6/7 æå 636 å®¶ï¼å®¡æ ¸ç»æï¼`audit_result` join `audit_rule` id=4ï¼2026-07 å
± 7 æ¡ï¼ |
| | | - `æ¬ææ°å¢: éè£
ç®±=9716`ã`æ¬ææ°å¢: éç¿ç³=2114`ã`æ¬ææ¶å¤±: éè£
ç®±ï¼ä¸æ=32210ï¼æ¬ææ ï¼`ã |
| | | - `æ¬ææ°å¢: éå±ç¿ç³=223041`ã`æ¬ææ°å¢: ç³æ²¹å¤©ç¶æ°åå¶å=10757ï¼æ¬ææ¶å¤±: ç
¤çåå¶åï¼ä¸æ=10137ï¼æ¬ææ ï¼`ã |
| | | - `æ¬ææ°å¢: ç
¤çåå¶å=20231ï¼æ¬ææ¶å¤±: ç³æ²¹å¤©ç¶æ°åå¶åï¼ä¸æ=22310ï¼æ¬ææ ï¼` ç |
| | | - RULE_P005 API åºåï¼`GET /api/rules/list?reportType=H2031`ï¼id=11ï¼threshold=20 å称±20% â `POST /api/rules/update {id:11,threshold:"30"}` ååç§°/æè¿°Â±30% â æ¹å 20 åæ¢å¤ Â±20%ï¼`audit_rule` è¡¨æ ¸å¯¹ä¸è´ã |
| | | - æ°æ®æ¥çï¼`GET /api/data/list?type=h2032&page=1&size=20` total=13056ãé¡µé´ 0 éå¤ï¼UI æ»å¨å®æµè§ #5ã |
| | | |
| | | ## æ¶åæ¹å¨ |
| | | - `docs/çææ±æ»å¤§è¡¨/2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨.xlsx`ã`2026å¹´8æéè·¯è¿è¾éæ±æ»è¡¨.xlsx`ï¼çå¼å½ä¸ï¼æ¥æéç¹/0.00/æå 0/å»åºè²ï¼æ¬æ¬¡å¤éªå¯¼åºææ¤æ¯çï¼ |
| | | - `traffic-audit-server/.../auditengine/service/AuditEngineService.java`ï¼RULE_004 æ°å¢/æ¶å¤±ååï¼ |
| | | - `traffic-audit-server/.../rulemanage/controller/RuleManageController.java`ï¼éå¼ Â±N% â åç§°/说æèå¨ï¼ |
| | | - `traffic-audit-web/src/views/DataView.vue`ï¼æ»å¨æè·çå¬ä¿®å¤ + å è½½æ´å¤ï¼è§ä¸ï¼ |
| | | - `docs/init.sql`ï¼RULE_004 说æãRULE_P005 åç§°/说æç§ååæ¥ï¼ |
| | | - `docs/å·¥å
·/VBA_çæç©å
¨è¡¨èªå¨å宽_2026-09-08.txt`ï¼æ°å¢ï¼ |
| | | - `docs/è¦æ±ä¸éªæ¶åºçº¿æ¸
å.md`ï¼æ°å¢ï¼å«æ¬æ¹ç»è®°ï¼ |
| | | |
| | | ## ä¿®å¤è¿ç¨è®°å½ï¼DataViewï¼ |
| | | - åçä»
çå¬ window ä¸ `.table-wrap`ï¼å®æµåç°æ®é/å
¨å±ä¸çæ£æ»å¨å®¹å¨æ¯ el-table å
é¨ `.el-table__body-wrapper`ï¼overflow-y:autoï¼ï¼åç卿®é模å¼ä¸ä¼è§¦åã |
| | | - ä¿®å¤ï¼`onScroll` æ¹ä¸ºåäºä»¶ target çå®é
æ»å¨å®¹å¨åº¦éï¼scrollTop/clientHeight/scrollHeightï¼ï¼scroll çå¬å `capture:true`ï¼scroll ä¸å泡ä½å¯æè·ï¼ï¼mounted/beforeDestroy æå¯¹æ³¨å/ç§»é¤ã |
| | | - ä¿®å¤å Chrome çæºå¤æµï¼è§ #5ï¼éè¿ï¼æ§å¶å°æ å¼å¸¸ã |
| | | |
| | | ## åç°çé®é¢ä¸å¤ç½® |
| | | - æ é»å¡é®é¢ãå¾
åæ²¿ç¨åºçº¿ï¼8 ææ°æ®å¯¼å
¥å M2/M3 å¡«å¼å¤éªï¼æ¥æéç¹å¨ 8 ææ¯ç䏿¾ç¤ºä¸ºåºåå·æçæ¾ç¤ºå£å¾å·²å¨åºçº¿ F3 å
³éã |
| | | |
| | | ## ç»è®º |
| | | æ¬æ¹ 7 é¡¹è¦æ±å
¨é¨å®ç°å¹¶éè¿å®æµï¼å¯äº¤ä»ãç¸å
³äº§ç©ï¼å¯¼åºéªè¯æä»¶å¨ `docs/çææ±æ»å¤§è¡¨/è¾åº/çæ_éè·¯è¿è¾éæ±æ»è¡¨_2026-07_æ ¼å¼éªè¯.xlsx` ä¸ `_2026-08_æ ¼å¼éªè¯.xlsx`ã |
| | |
| | | - `mvn -q -DskipTests compile` exit=0ã |
| | | ### éçä¸ä¸ä¸æ¥ |
| | | - 8 æå½ææ°æ®å¯¼å
¥åæ M2/M3 å¡«å¼å¤éªï¼æ¥æéç¹åï¼å表 General åºåå·ææ¬¡è¡ï¼æ¾ç¤ºæ¹å¼å¾
ä¸å¡ç¡®è®¤ã |
| | | - 临æ¶èæ¬ `_unify_all.py` å `_test_tmp/` 坿¬ä¸å ä¸å
¥åºã |
| | | - 临æ¶èæ¬ `_unify_all.py` å `_test_tmp/` 坿¬ä¸å ä¸å
¥åºã |
| | | --- |
| | | |
| | | ## è¡¥å
ï¼2026-09-08 æé´ï¼åä¸ä¼è¯ç»ï¼ï¼æ¥ææ ¼å¼/å°æ°å¤æ ¸/VBA/æ»å¨å è½½/è§åååä¸éå¼èå¨ |
| | | ### 仿¥æ°å¢ |
| | | 1. **æ¥æéç¹ç»ä¸**ï¼7/8 ææ¯çä¸å¯¼åºå
¨ç°¿æ¥æååå
æ ¼ç»ä¸ `yyyy"å¹´"m"æ"`ï¼ä¿®å¤è´§è¿é¡µ CQ åçææ¬¡æ¾ç¤ºææ°åçé®é¢ï¼å
¨ç°¿æ«ææ¥æåæ ¼å¼=0ï¼ã |
| | | 2. **å°æ°ä½/æå夿 ¸ï¼çº¦å®ï¼æ°å¼ä¿çå
¨ç²¾åº¦æ¾ç¤º 0.00ï¼æåæ´æ° 0ï¼**ï¼å¯¼åº 2026-07/08 å¤éªââæ 3/4 ä½å°æ°ãæ General æ°å¼ãæ åºè²ï¼è´§è¿éæåå `0`ï¼å¨è½¬é/éè·¯è¿è¾å¨è½¬éæå为 RANK å
¬å¼åæ ¼å¼ `0`ã |
| | | 3. **VBA å宽å®äº¤ä»**ï¼`docs/å·¥å
·/VBA_çæç©å
¨è¡¨èªå¨å宽_2026-09-08.txt`ï¼AutoFitAllSheets/AutoFitActiveSheetï¼ã |
| | | 4. **æ°æ®æ¥çæ»å¨å 载修å¤+çæºéªè¯**ï¼å®ä½çæ£æ»å¨å®¹å¨ä¸º el-table å
é¨ body-wrapperï¼onScroll åäºä»¶ target 度é + capture çå¬ï¼Chrome çæºæ»å¨ 20â40ââ¦â140 è¡éå¢ãæ»æ° 13056 ä¸åãæ§å¶å° 0 æ¥éã |
| | | 5. **RULE_004 åå**ï¼ä¸ææ âæ¬ææ°å¢ã䏿æâæ¬ææ åæéï¼2026-07 宿µå½ä¸ 7 å®¶ï¼æ°å¢ 6ãæ¶å¤± 3ã1 å®¶ååï¼ï¼æ¶å¤±æ ·ä¾ä¸åºæ°æ®éåå»åã |
| | | 6. **RULE_P005 éå¼èå¨**ï¼åç§°/说æ ±N% ééå¼åæ®µåæ¥å¹¶æä¹
åï¼å®æµ 20â30â20ï¼DB 夿 ¸ä¸è´ï¼ï¼å
¶å®å« ±N% è§ååçã |
| | | ### æµè¯ç»ææè¦ |
| | | - 详è§ãåè½æµè¯æ¥å_æ±æ»å¤§è¡¨æ¥ææ ¼å¼ä¸è§åèå¨åæ°æ®æ¥çæ»å¨å è½½_2026-09-08.mdãã |
| | | - `mvn` ç¼è¯éè¿ï¼åä¸äº¤æ¥å·²å®æï¼ï¼å端çç¼è¯ 3 次æåï¼15:19/15:24ï¼ã |
| | | ### éçä¸ä¸ä¸æ¥ |
| | | - 8 æå½ææ°æ®å¯¼å
¥å M2/M3 å¡«å¼å¤éªï¼ä¸´æ¶èæ¬ `_verify_*.py/.sql`ã`_do_patch1.py` ä¸å ä¸å
¥åºã |
| New file |
| | |
| | | VBA å®ï¼çææ±æ»å¤§è¡¨ï¼æä»»æå·¥ä½ç°¿ï¼å
¨å·¥ä½è¡¨å宽èªéåº |
| | | æ¥æï¼2026-09-08 |
| | | 说æï¼æå¼è¦å¤çç xlsx â Alt+F11 â èåâæå
¥â模åâ â ç²è´´ä»¥ä¸ä»£ç â å
³éç¼è¾å¨ â Alt+F8 è¿è¡ AutoFitAllSheetsã |
| | | ä¹å¯å°æ¬æä»¶å¦å为 .basï¼å¨ VBA ç¼è¾å¨éâæä»¶â导å
¥æä»¶âã |
| | | |
| | | -------------------------------------------------------------------------------- |
| | | Option Explicit |
| | | |
| | | ' 主å®ï¼å¯¹å
¨é¨å·¥ä½è¡¨åæ´åå宽èªéåºï¼å
¬å¼å
æ´ä½éç®ï¼ä»¥æ¾ç¤ºå¼å®½åº¦ä¸ºåï¼ |
| | | Public Sub AutoFitAllSheets() |
| | | Application.ScreenUpdating = False |
| | | Application.Calculation = xlCalculationAutomatic |
| | | Application.CalculateFullRebuild |
| | | Dim ws As Worksheet |
| | | For Each ws In ThisWorkbook.Worksheets |
| | | ws.Activate |
| | | On Error Resume Next |
| | | ' èªå¨éåºæ´å宽度ï¼éèè¡/åä¸å½±åï¼åå¹¶åå
æ ¼å
çæåä¸ä¼è¢« Excel èªå¨è®¡å
¥ï¼ |
| | | ws.Cells.EntireColumn.AutoFit |
| | | On Error GoTo 0 |
| | | Next ws |
| | | Application.ScreenUpdating = True |
| | | MsgBox "å
¨é¨å·¥ä½è¡¨å宽èªéåºå®æã", vbInformation, "宿" |
| | | End Sub |
| | | |
| | | ' å¤ç¨å®ï¼åªå¯¹âå½åéä¸çå·¥ä½è¡¨âæ§è¡èªéåº |
| | | Public Sub AutoFitActiveSheet() |
| | | Application.ScreenUpdating = False |
| | | Application.CalculateFullRebuild |
| | | ActiveSheet.Cells.EntireColumn.AutoFit |
| | | Application.ScreenUpdating = True |
| | | MsgBox "å½å表å宽èªéåºå®æã", vbInformation, "宿" |
| | | End Sub |
| | | -------------------------------------------------------------------------------- |
| | | |
| | | 注æï¼ |
| | | 1) è¿è¡åå
å
¨éçä¸éæ¯å¦æâ###âæº¢åºåï¼è¥ä¸ªå«åå åå¹¶æ é¢ä»åçªï¼å¯æå¨æä¸ä¸è¯¥åã |
| | | 2) æ¬å®åªæ¹å宽ï¼ä¸æ¹ä»»ä½æ°æ®ãå
¬å¼ãåºè²ä¸è¾¹æ¡ã |
| | | 3) 建议çæåç«å»è¿è¡ä¸æ¬¡ï¼åå¦å为æ£å¼äº¤ä»æä»¶ã |
| New file |
| | |
| | | # è¦æ±ä¸éªæ¶åºçº¿æ¸
åï¼å¹²æ´»åå¿
è¯»ï¼ |
| | | |
| | | > ç¨éï¼æ±æ»ç¨æ·ï¼ä¸å¡ï¼éç»æåºç**æç¡®è¦æ±/å£å¾**ï¼æ¯æ¬¡æ¹ä»£ç /æ¯ç/è§ååå
对ç
§æ¬è¡¨ï¼é¿å
âåä¸åãæ¼å£å¾ãéå¤é®âã |
| | | > åºçº¿ææ¡£ï¼ãç¡®è®¤åæ§æ±æ»ä¸å©ä½çé®_æ±æ»å¤§è¡¨æ°æ®é©±å¨æ¹é _2026-09-07.mdãï¼å¯ä¸å³çåºçº¿ï¼ç¬¬å
è为 09-08 ææ¿ï¼ã |
| | | > ç»´æ¤ï¼ä¼è¯æ¨è¿æ¶åæ¥å¢è¡¥ï¼ç¶æï¼â
å·²å®ç° / ð§è¿è¡ä¸ / â¬å¾
åã |
| | | |
| | | ## ä¸ãæ±æ»å¤§è¡¨çå¼ä¸çæå£å¾ |
| | | | ç¼å· | è¦æ±/å£å¾ | ç¶æ | 夿³¨ | |
| | | |---|---|---|---| |
| | | | F1 | æ°å¼ï¼å«å
¬å¼ç»æï¼ä¸å¾**æ¾ç¤ºä¸¤ä½å°æ°**ï¼0.00ï¼ï¼ä½**ä¿çå
¨ç²¾åº¦å°æ°**ï¼ä¸å¾åèäºå
¥æ¹å¼ | â
2026-09-08 | 7/8ææ¯ç+导åºå·²éªï¼æ 3/4 ä½å°æ°æ®ç | |
| | | | F2 | **æåä¸å¾æ¾ç¤ºæ´æ°**ï¼0 æ ¼å¼ï¼å«å¢éæåï¼ | â
2026-09-08 | 表头âæå/å¢éæåâï¼å
è®¸å¸¦ç©ºæ ¼ï¼æ´åçæ | |
| | | | F3 | æ¥æ/ææ¬¡ç±»åå
æ ¼ç»ä¸æ¾ç¤º **yyyy"å¹´"m"æ"**ï¼å¦è´§è¿é¡µ CQ åçæ¥æéç¹ä¸å¾æ¾ç¤ºææ°åï¼ | â
2026-09-08 | æ¯ç+导åºåéª | |
| | | | F4 | èæ¯è²å
¨é¨ç»ä¸ï¼**æ å¡«å
/å»åºè²**ï¼ï¼çæäº§ç©ä¸å¾ä»è¿åæºå¸¦æ§åºè²å¤æ´» | â
2026-09-08 | è¿åæºå¤ä»½ååå½ä¸ | |
| | | | F5 | åå®½ææ¾ç¤ºå
容**èªéåº**ï¼é¿å
¬å¼ææ¬ä¸å¾æçå宽ï¼çæçæç»è¡¨å¯å¨ Excel éè· VBA å
¨è¡¨èªéåº | â
2026-09-08 | VBA è§ `docs/å·¥å
·/VBA_çæç©å
¨è¡¨èªå¨å宽_2026-09-08.txt` | |
| | | | F6 | çæé¾è·¯ = å¤å¶æ¯çâå¡«å¼/è¿åï¼**æ¯çæä»¶æ¬èº«ä¸å¸¦ä¸å¡æ°æ®ä½ä¼ªè£
**ï¼æ°æ®ä¸å¾ç±å¯¼å
¥+计ç®åå
¥ | ð§ æ¨è¿ä¸ | ä¾ãç¡®è®¤åæ§ãE1 å
åå½7æåå¡«8æ | |
| | | | F7 | æ±æ»å¤§è¡¨å«å½æ + 1-Xæç´¯è®¡ + åæ¯ï¼æå/åæè¡¨é彿ä¸ç´¯è®¡ä¸¤å¥ | â
ï¼å½æ+ç´¯è®¡ç»æï¼ | 彿æåä¿®æ£å·²å
¥ M2 éªè¯ | |
| | | | F8 | 2025 å¹´åæ°æ®ä»¥æ¯çç¼å为åï¼**æ¯çç¼åä¼å
ä½åæ¯åºå**ï¼åºåªåæ ¡éªï¼äººå·¥æ ¸å¯¹é导ä¸è´åæååºå¼ï¼Q1ï¼ | â
å£å¾ç¡®è®¤ | | |
| | | | F9 | å
é¨è®¡ç®é¡µä¸å¯¹å¤ï¼è´§è¿/å
¬è·¯æ
客/åå¸å®¢è¿å°è¡¨å端å
¨é¨éèï¼å
é¨ä¸é´è¡¨ä¿çï¼ | â
ææ¿ | | |
| | | | F10 | æ©åæææéï¼å æä»½ææ©åï¼ä¸é¢å 12 ææ»¡çï¼ï¼æ°å¢åâ彿/åæ¯âæ é¢ä¸ºä¸¤è¡åå¹¶åå
æ ¼ï¼æ©åé¡»ä¿ç | â
M0 v4 | | |
| | | | F11 | åæ¯æ æ°æ®çâå¢é为 0 éæ ¸å®âç±»è§åå·²å
¥å
¬äº¤/åºç§/è´§è¿/æ
å®¢å®¡æ ¸è§åï¼è¡¥å
è§åç±»å
ç¼ï¼ | ð§ | å®¡æ ¸è§åç±»è¿æä»¥å¯¼å
¥ä¸æ¥è¡¨ä¸ºå
| |
| | | |
| | | ## äºãæ°æ®å¯¼å
¥ |
| | | | ç¼å· | è¦æ± | ç¶æ | 夿³¨ | |
| | | |---|---|---|---| |
| | | | I1 | 导å
¥è¿ç¨æ¾ç¤º**è¿åº¦**ï¼å¯¼å
¥å¤±è´¥æç¤ºå°**è¡å·** | â
| | |
| | | | I2 | å
许éå¤å¯¼å
¥ï¼éæ°å¯¼å
¥è¦çï¼ | â
ææ¿ | | |
| | | | I3 | åå¸å®¢è¿å¯¼å
¥ç±»å䏿éå«ï¼**å
¬äº¤/åºç§ææ¥ãç½çº¦è½¦æåãç½çº¦è½¦è®¢åãå
¨çæ»éç**æ¨¡æ¿ | â
å·²å | æ¯çå¨ `docs/åå¸å®¢è¿` | |
| | | | I4 | 导å
¥æ¨¡æ¿å·®å¼ï¼ä¼ä¸ä»£ç /åä½è¯¦ç»åç§°åææ ï¼è¦ä¸ä¸ç§æ¨¡æ¿çå·®å¼å
¼å®¹ | â
å·²å
¼å®¹ | è§ 09-04 æµè¯æ¥å | |
| | | | I5 | æ°æ®æ¥çï¼**æ»å¨å°åºé¨èªå¨å 载并æ¾ç¤ºæ´å¤è¡**ï¼å
¨å±/æ®é模å¼åå¯ç¿»é¡µï¼ | â
2026-09-08 | DataView.vue ä¿®å¤æ»å¨å®¹å¨+capture çå¬ï¼Chrome çæº 20â140 è¡éå¢éªè¯ | |
| | | |
| | | ## ä¸ãæ¥è¡¨çæ |
| | | | ç¼å· | è¦æ± | ç¶æ | 夿³¨ | |
| | | |---|---|---|---| |
| | | | R1 | éææ©å±çæï¼ä¿çæ¯çç¼å䏿¯çç¨åºå¤å¶ï¼ç´¯è®¡å
¬å¼å»ææªå°æä»½ã忝忝èå¨ | â
M0/M1 | | |
| | | | R2 | çæâéè·¯è¿è¾éæ±æ»è¡¨ï¼æ´æ¬ï¼â= å½æè¡¨ + 累计ï¼1-Xæï¼| â
| | |
| | | | R3 | çæç©ä¸æ¯ç/åº 0 å·®å¼ä¸ºéªæ¶æ åï¼å«ä¸å£å¾åæé¡µãæå页累计åï¼ | â
7æåå½ | | |
| | | | R4 | ç¬ç«å°è¡¨ä¿çä½å端éèï¼ç大表è·éåå¯åæ¶ | â
ææ¿ | | |
| | | | R5 | æå/åæ/æ±æ»ç**å½ææ°æ®**è¦ä¸ç´¯è®¡æ°æ®åå«è®¡ç®ï¼ç¦æ¢æç´¯è®¡å¼å½å½æå¼ | ð§ M2/M3 å®å¼¹ | | |
| | | |
| | | ## åãå®¡æ ¸è§å |
| | | | ç¼å· | è¦æ± | ç¶æ | 夿³¨ | |
| | | |---|---|---|---| |
| | | | A1 | RULE_004ï¼è´§è¿ç±»åç¯æ¯ï¼ï¼**䏿æ âæ¬ææ°å¢ï¼æéï¼ä¸ææâæ¬ææ ï¼æé**ï¼ååï¼ | â
2026-09-08 | 弿+DB+init.sql å·²æ¹ï¼2026-07 宿µï¼æ°å¢6/æ¶å¤±3/åå1 å®¶ï¼ä¸æºæ°æ®å»å | |
| | | | A2 | è§ååç§°/说æéçéå¼ï¼Â±N%ï¼**ééå¼å段æ¹å¨èªå¨åæ¥**ï¼å¦ ±10%â±20%ï¼ï¼å
¶å®å«éå¼è§ååç | â
2026-09-08 | 宿µ 20â30â20ï¼åç§°/说æéå¨å¹¶æä¹
åï¼DB id=11 夿 ¸ä¸è´ | |
| | | | A3 | æ´è½¦å¨ä½å¤å®ç¨**å¹³åå¨ä½=æ´è½¦å¨ä½/æ´è½¦æ°**ï¼åºé´ 4-40 | â
| 09-04 ä¿®å¤ | |
| | | | A4 | å®¡æ ¸ç»æéçå¼å¸¸æ°å¼è¦å¯è§£éï¼å¦â轨迹æµç®=1.04E7âéç»åºç®æ³è¯´æ/å£å¾æ æ³¨ï¼ | ⬠| å£å¾è§£é页æ¨è¿ä¸ | |
| | | |
| | | ## äºãå·¥ä½çºªå¾ä¸äº¤ä» |
| | | | ç¼å· | è¦æ± | ç¶æ | |
| | | |---|---|---| |
| | | | W1 | æ¯å®æä¸ä¸ªåè½ï¼ç«å³æµè¯å¹¶åãåè½æµè¯æ¥å_<åè½>_<æ¥æ>.mdãå° `docs/åè½æµè¯æ¥å/` | â
å¸¸ææ§è¡ | |
| | | | W2 | æ¯å¤©ä¸çåã工使¥ç»_<æ¥æ>.mdãå° `docs/工使¥ç»/` | â
å¸¸ææ§è¡ | |
| | | | W3 | 干活åè¯»æ¬æ¸
åä¸ãç¡®è®¤åæ§æ±æ»â¦ãï¼å·²ç¡®è®¤é¡¹ä¸åéå¤åç¨æ·æé® | â
æ§è¡ | |
| | | | W4 | 个人 gitee(origin) ææ¹å¨å
fetch/åå¹¶ï¼å
¬å¸ gitea(main) å
æµè¯+æ¥åâåå¹¶âcommitâpushï¼ç¦å¼ºæ¨ | â
æ§è¡ | |
| | | |
| | | ## å
ãæ¬ä¼è¯ï¼2026-09-08 ä¸å/æé´ï¼å¤çç»è®° |
| | | 1. æ¥æéç¹ç»ä¸ yyyyå¹´mæï¼F3ï¼+ ä¿®å¤è´§è¿é¡µ CQ åæ¥ææ¾ç¤ºææ°åçé®é¢ï¼ |
| | | 2. æä¾å
¨è¡¨å宽èªéåº VBAï¼F5ï¼ï¼ |
| | | 3. DataView æ»å¨å°åºå è½½æ´å¤ï¼I5ï¼ï¼ |
| | | 4. æå/å°æ°ä½æ ¼å¼å¤æ ¸ï¼F1/F2ï¼è´§è¿éæåæå=æ´æ°ãå¨è½¬éæåæ°æ®=0.00ãéè·¯è¿è¾å¨è½¬éæ 3/4 ä½å°æ°ï¼ï¼ |
| | | 5. æ¬æ¸
å建ç«ï¼W3ï¼ï¼ |
| | | 6. RULE_004 ååæéï¼A1ï¼ï¼RULE_P005 éå¼ 20% ä¸åç§°/说æèå¨ï¼A2ï¼ã |
| | | 7. æ¬æ¹å®æµæ¶å£ï¼å
¨ç°¿æ ¼å¼ä½æ£ï¼bad3/General/åºè²=0ï¼ãRULE_004 åå 2026-07 å½ä¸æ ¸å¯¹ãP005 èå¨ 20â30â20ãDataView Chrome çæºæ»å¨å è½½ 20â140 è¡ââ详è§ãåè½æµè¯æ¥å_æ±æ»å¤§è¡¨æ¥ææ ¼å¼ä¸è§åèå¨åæ°æ®æ¥çæ»å¨å è½½_2026-09-08.mdãã |
| | |
| | | return null; |
| | | } |
| | | |
| | | /** è´§è¿ç±»åç¯æ¯ï¼æ¬ææ°å¢ï¼ä¸æä¸º0ãæ¬æ>0ï¼éæ ¸å®ï¼å°çä¸ç®¡ */ |
| | | /** è´§è¿ç±»åç¯æ¯ï¼RULE_004ï¼ï¼ä¸ææ âæ¬ææ°å¢ æ 䏿æâæ¬ææ ï¼åæéæ ¸å® */ |
| | | private AuditResult checkMom(AuditRule rule, H2032EnterpriseMonthly report, |
| | | Map<String, H2032EnterpriseMonthly> lastMonthMap) { |
| | | H2032EnterpriseMonthly lastMonth = lastMonthMap.get(key(report.getEnterpriseCode())); |
| | | if (lastMonth == null) return null; |
| | | List<String> hits = new ArrayList<>(); |
| | | List<String> addHits = new ArrayList<>(); |
| | | List<String> delHits = new ArrayList<>(); |
| | | for (String field : rule.getCheckField().split(",")) { |
| | | double current = getH2032FieldValue(report, field); |
| | | double last = getH2032FieldValue(lastMonth, field); |
| | | if (current > 0 && last == 0) { |
| | | hits.add(h2032FieldLabel(field) + "=" + fmt(current)); |
| | | addHits.add(h2032FieldLabel(field) + "=" + fmt(current)); |
| | | } else if (last > 0 && current == 0) { |
| | | delHits.add(h2032FieldLabel(field) + "ï¼ä¸æ=" + fmt(last) + "ï¼æ¬ææ ï¼"); |
| | | } |
| | | } |
| | | if (!hits.isEmpty()) { |
| | | return buildResult(rule, report, "æ¬ææ°å¢: " + String.join("ã", hits), |
| | | "ä¸æè¯¥ç±»å为0", "æ¬ææ°å¢è´§è¿ç±»åï¼ä¸ææ ï¼"); |
| | | if (!addHits.isEmpty() || !delHits.isEmpty()) { |
| | | StringBuilder msg = new StringBuilder(); |
| | | if (!addHits.isEmpty()) msg.append("æ¬ææ°å¢: ").append(String.join("ã", addHits)); |
| | | if (!delHits.isEmpty()) { |
| | | if (msg.length() > 0) msg.append("ï¼"); |
| | | msg.append("æ¬ææ¶å¤±: ").append(String.join("ã", delHits)); |
| | | } |
| | | return buildResult(rule, report, msg.toString(), |
| | | "䏿æ âæ¬ææ°å¢ æ 䏿æâæ¬ææ ", "è´§è¿ç±»åç¯æ¯æ°å¢/æ¶å¤±éæ ¸å®"); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** æè´§è¿éä½å¯¹åºè½¦è¾ä¸º0 éæ ¸å®ï¼å¦ æéè£
箱货è¿éæ éè£
箱车è¾ï¼ */ |
| | | private AuditResult checkNull(AuditRule rule, H2032EnterpriseMonthly report) { |
| | | String[] fields = rule.getCheckField().split(","); |
| | |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.time.LocalDateTime; |
| | | import java.util.regex.Pattern; |
| | | import java.util.regex.Matcher; |
| | | import java.util.List; |
| | | |
| | | /** è§å管çï¼ææ¥è¡¨ç±»åæ¥ç/å¯å/è°æ´éå¼ */ |
| | |
| | | qw.eq(AuditRule::getReportType, reportType.trim()); |
| | | } |
| | | qw.orderByAsc(AuditRule::getSortOrder); |
| | | return Result.ok(ruleMapper.selectList(qw)); |
| | | List<AuditRule> list = ruleMapper.selectList(qw); |
| | | for (AuditRule r : list) syncThresholdText(r); // åç§°/说æééå¼å¨æå±ç¤ºï¼å¦ ±10% â ±20%ï¼ |
| | | return Result.ok(list); |
| | | } |
| | | |
| | | /** å¯åè§å */ |
| | |
| | | if (body.getId() == null) return Result.error("缺å°è§åID"); |
| | | AuditRule rule = ruleMapper.selectById(body.getId()); |
| | | if (rule == null) return Result.error("è§åä¸åå¨"); |
| | | String oldThreshold = rule.getThreshold(); |
| | | if (body.getThreshold() != null) rule.setThreshold(body.getThreshold()); |
| | | if (body.getAlertLevel() != null) rule.setAlertLevel(body.getAlertLevel()); |
| | | if (body.getDescription() != null) rule.setDescription(body.getDescription()); |
| | | // éå¼å忶忥è§ååç§°ä¸è¯´æï¼åç§°/说æéç ±N% ææ°é弿¹åï¼ï¼å¹¶éä¿åæä¹
å |
| | | if (body.getThreshold() != null && !body.getThreshold().equals(oldThreshold)) { |
| | | syncThresholdText(rule); |
| | | } |
| | | rule.setUpdatedAt(LocalDateTime.now()); |
| | | ruleMapper.updateById(rule); |
| | | return Result.ok("å·²ä¿å"); |
| | | } |
| | | } |
| | | |
| | | /** ±N% åæ ·å¹é
ï¼åç§°/说æä¸ééå¼å¨æååççæ®µï¼ */ |
| | | private static final Pattern PCT_TOKEN = Pattern.compile("±\\s*\\d+(?:\\.\\d+)?\\s*%"); |
| | | |
| | | /** æææ¬ä¸ç ±N% æ¿æ¢ä¸º ±threshold%ï¼å«å·²å¸¦ ± çåç¼ï¼é¿å
å Â±ï¼ */ |
| | | private String decorateThresholdText(String text, String threshold) { |
| | | if (text == null || text.trim().isEmpty() || threshold == null || threshold.trim().isEmpty()) return text; |
| | | String token = "±" + threshold.trim() + "%"; |
| | | return PCT_TOKEN.matcher(text).replaceAll(Matcher.quoteReplacement(token)); |
| | | } |
| | | |
| | | /** åç§°/说æééå¼åæ¥ï¼è¯»å表æ¶ä¹å¨ææ ¡æ£ï¼DB 䏿§ææ¬ä¸é»å¡æ¾ç¤ºï¼ */ |
| | | private void syncThresholdText(AuditRule rule) { |
| | | if (rule == null || rule.getThreshold() == null) return; |
| | | rule.setRuleName(decorateThresholdText(rule.getRuleName(), rule.getThreshold())); |
| | | rule.setDescription(decorateThresholdText(rule.getDescription(), rule.getThreshold())); |
| | | } |
| | | } |
| | |
| | | total: 0, |
| | | records: [], |
| | | columns: [], |
| | | loading: false |
| | | loading: false, |
| | | loadingMore: false |
| | | } |
| | | }, |
| | | methods: { |
| | | loadData() { |
| | | this.loading = true |
| | | this.loadingMore = false |
| | | api.get('/data/list', { |
| | | params: { |
| | | type: this.type, |
| | |
| | | this.loading = false |
| | | }) |
| | | }, |
| | | // æ»å¨å°åºé¨èªå¨è¿½å ä¸ä¸é¡µï¼ä¿çæå¨å页跳页è½åï¼ |
| | | loadMore() { |
| | | if (this.loading || this.loadingMore) return |
| | | if (this.records.length >= this.total || this.total <= 0) return |
| | | const nextPage = this.page + 1 |
| | | this.loadingMore = true |
| | | api.get('/data/list', { |
| | | params: { |
| | | type: this.type, |
| | | period: this.period || undefined, |
| | | keyword: this.keyword || undefined, |
| | | page: nextPage, |
| | | size: this.size |
| | | } |
| | | }).then(res => { |
| | | const d = res.data || {} |
| | | const addRows = d.records || [] |
| | | if (!addRows.length) { |
| | | this.page = nextPage - 1 |
| | | return |
| | | } |
| | | this.records = this.records.concat(addRows) |
| | | this.page = nextPage |
| | | if (d.total != null) this.total = d.total |
| | | if (d.columns && d.columns.length) this.columns = d.columns |
| | | }).catch(e => { |
| | | if (e && e._toast) return |
| | | this.$message.error('å è½½æ´å¤å¤±è´¥') |
| | | }).finally(() => { |
| | | this.loadingMore = false |
| | | }) |
| | | }, |
| | | onScroll(e) { |
| | | // æ®é/å
¨å±ä¸çæ£çæ»å¨å®¹å¨é½æ¯ el-table å
é¨ body-wrapperï¼æè·é¶æ®µå¯æ¶å°ï¼ï¼ |
| | | // 页颿´ä½æ»å¨æ¶ä»¥ window/document 为åã |
| | | const t = e && e.target |
| | | let scrollTop, clientHeight, scrollHeight |
| | | if (t && t.nodeType === 1 && t !== document && typeof t.scrollTop === 'number' && t.scrollHeight > t.clientHeight) { |
| | | scrollTop = t.scrollTop |
| | | clientHeight = t.clientHeight |
| | | scrollHeight = t.scrollHeight |
| | | } else { |
| | | const se = document.scrollingElement || document.documentElement |
| | | scrollTop = se.scrollTop |
| | | clientHeight = window.innerHeight |
| | | scrollHeight = se.scrollHeight |
| | | } |
| | | if (scrollHeight > 0 && scrollTop + clientHeight >= scrollHeight - 80) { |
| | | this.loadMore() |
| | | } |
| | | }, |
| | | toggleFullscreen() { |
| | | const el = this.$refs.tableWrap |
| | | if (!document.fullscreenElement) { |
| | |
| | | if (q.period) this.period = q.period |
| | | if (q.keyword) this.keyword = q.keyword |
| | | this.loadData() |
| | | window.addEventListener('scroll', this.onScroll, { passive: true }) |
| | | if (this.$refs.tableWrap) { |
| | | // capture=trueï¼el-table å
é¨ body-wrapper çæ»å¨å¨æè·é¶æ®µä¹è½æ¶å° |
| | | this.$refs.tableWrap.addEventListener('scroll', this.onScroll, { passive: true, capture: true }) |
| | | } |
| | | }, |
| | | beforeDestroy() { |
| | | window.removeEventListener('scroll', this.onScroll) |
| | | if (this.$refs.tableWrap) { |
| | | this.$refs.tableWrap.removeEventListener('scroll', this.onScroll, { capture: true }) |
| | | } |
| | | } |
| | | } |
| | | </script> |