docs/database.md
@@ -222,6 +222,8 @@ | region_code | varchar(20) | æå±å°åºï¼è¡æ¿åºå代ç ï¼ | | enterprise_code | varchar(50) | ä¼ä¸ä»£ç | | enterprise_name | varchar(200) | ä¼ä¸åç§° | | unified_credit_code | varchar(50) | ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç ï¼æ°çæ¨¡æ¿æ°å¢åï¼èæ¨¡æ¿æ æ¤åæ¶ä¸º NULLï¼ | | report_unit | varchar(200) | å¡«æ¥åä½ï¼æ°çæ¨¡æ¿æ°å¢åï¼èæ¨¡æ¿æ æ¤åæ¶ä¸º NULLï¼ | | vehicle_total | int | 客è¿è½¦è¾_æ»è®¡ | | seat_total | int | æ ¸å®è½½å®¢ä½_æ»è®¡ | | vehicle_schedule | int | è½¦è¾æ°_客è¿ç车ï¼å«å®çº¿æ æ¸¸ï¼ | docs/init.sql
@@ -399,6 +399,8 @@ region_code VARCHAR(20) COMMENT 'æå±å°åº', enterprise_code VARCHAR(50) COMMENT 'ä¼ä¸ä»£ç ', enterprise_name VARCHAR(200) COMMENT 'ä¼ä¸åç§°', unified_credit_code VARCHAR(50) COMMENT 'ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç ', report_unit VARCHAR(200) COMMENT 'å¡«æ¥åä½', vehicle_total INT COMMENT '客è¿è½¦è¾_æ»è®¡', seat_total INT COMMENT 'æ ¸å®è½½å®¢ä½_æ»è®¡', vehicle_schedule INT COMMENT 'è½¦è¾æ°_客è¿ç车ï¼å«å®çº¿æ 游客è¿å®¢è½¦ï¼', docs/¹«Â·ÂÿÍ/Ä£°å_½»ÆóͳH203-1±í_¹«Â·ÂÿÍÔËÊäÔ¶ÈÉú²úÇé¿ö.xlsxBinary files differ
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_H2031Ä£°åÐÂÔöÁÐÊÊÅä_2026-09-16.md
New file @@ -0,0 +1,53 @@ # åè½æµè¯æ¥åï¼H203-1 æ¨¡æ¿æ°å¢ãç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç / å¡«æ¥åä½ã两åéé - æ¥æï¼2026-09-16 - 模åï¼æ°æ®å¯¼å ¥ / æ°æ®æ¥ç / æ°æ®åºè¡¨ç»æ - ç»è®ºï¼**éè¿**ï¼æ£å 4 æ¡ãè´å 2 æ¡ãå ¼å®¹ 2 æ¡ãå ¥åºæ½æ¥ 814Ã2 é¡¹å ¨é¨å¯¹é½ï¼ ## ä¸ãåè½è¯´æ ç¨æ·ä¿®æ¹äºã模æ¿_交ä¼ç»H203-1表_å ¬è·¯æ 客è¿è¾æåº¦ç产æ åµã模æ¿ï¼å¨ãä¼ä¸åç§°ãä¹å**æå ¥ä¸¤å**ï¼`ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç `ã`å¡«æ¥åä½`ï¼å ¶ä½ 48 åæ´ä½å³ç§»ï¼æ»åæ°ç± 50 â 52ãæ¬æ¬¡æ¹å¨è®©å端è½è¯»åå¹¶å ¥åºè¿ä¸¤åï¼åæ¶ä¿è¯èæ ¼å¼æä»¶å ¼å®¹ã æ¹å¨æ¸ åï¼ | å± | æä»¶ | æ¹å¨ | |----|------|------| | æ°æ®åº | `h2031_enterprise_monthly` | `ADD COLUMN unified_credit_code VARCHAR(50) NULL AFTER enterprise_name`ã`ADD COLUMN report_unit VARCHAR(200) NULL AFTER unified_credit_code` | | å»ºè¡¨èæ¬ | `docs/init.sql` | åæ¥è¡¥ä¸¤å | | æ°æ®åå ¸ | `docs/database.md` | åæ¥è¡¥ä¸¤å说æ | | å®ä½ | `PassengerEnterpriseMonthly.java` | æ°å¢ `unifiedCreditCode`ã`reportUnit` | | å¯¼å ¥è§£æ | `DataImportService.java` | `importPassengerMonthly` å æè¡¨å¤´ååå¼ | | å端åé ç½® | `DataViewController.java` | `H2031_COLUMNS` æ°å¢ä¸¤åï¼æ°æ®æ¥ç页å¯è§ï¼ | ## äºãæµè¯ç¯å¢ - å端ï¼`Started TrafficAuditApplication` / `Tomcat started on port(s): 8090`ï¼éå¯åæ°ç¼è¯ï¼13:30ï¼ - å端ï¼8080 å·²å°±ç»ªï¼æ¬æ¬¡æªæ¹åç«¯ï¼æªéå¯ï¼ - æ°æ®åºï¼`traffic_audit` @ 127.0.0.1:3308 - æ°æ¨¡æ¿ï¼`docs\å ¬è·¯æ 客\模æ¿_交ä¼ç»H203-1表_å ¬è·¯æ 客è¿è¾æåº¦ç产æ åµ.xlsx`ï¼Sheet1ï¼816Ã52ï¼ - èæ ¼å¼ï¼`D:\æ¡é¢\æµè¯æ°æ®\å ¬è·¯æ 客\å «æ\å ¬è·¯æ 客è¿è¾æåº¦ç产æ åµï¼2026ï¼_2026-09-09 09_18_45.xls`ï¼Sheet0ï¼769Ã52ï¼ ## ä¸ãç¨ä¾è¡¨ | # | åºæ¯ | è¾å ¥ | 颿 | å®é | ç»è®º | |---|------|------|------|------|------| | 1 | æ£å-æ°æ¨¡æ¿å¯¼å ¥ | æ°æ¨¡æ¿ â `POST /api/import/passengerMonthly?period=2099-07` | æå䏿¡æ°ä¸æºæä»¶ä¸è´ | `æå 814 æ¡ï¼å¤±è´¥ 0 æ¡` | éè¿ | | 2 | æ£å-æ°åå ¥åº | æ¥ `unified_credit_code` / `report_unit` | 814 è¡å ¨é¨æå¼ | `count=814, c1=814, c2=814` | éè¿ | | 3 | å ¥åºæ½æ¥-é¦è¡ | æºç¬¬ 1 è¡ vs åºç¬¬ 1 è¡ | éåæ®µä¸è´ | åºï¼`enterprise_code=91420105MA4F5Q3R68`ã`unified_credit_code=91420105MA4F5Q3R68`ã`report_unit=æ¦æ±å¸å®å¹²çº¿å ¬è·¯å®¢è¿æéå ¬å¸éå°åå ¬å¸`ã`vehicle_total=26`ã`passenger_total=12835`ï¼ä¸ Excel å®å ¨ä¸è´ | éè¿ | | 4 | å ¥åºæ½æ¥-æ±æ»å | æºæä»¶æ±æ» vs åºæ±æ» | ä¸è´ | 客è¿è½¦è¾ 24584ãæ ¸å®è½½å®¢ä½ 711018ã客è¿é 16371625ãå¨è½¬é 1023386179ï¼åé¡¹å ¨ç | éè¿ | | 5 | å ¼å®¹-èæ ¼å¼å¯¼å ¥ | è `.xls` â `period=2099-09` | æå䏿°åæå¼ï¼èæä»¶ä¹å«è¿ä¸¤åï¼ | `æå 767 æ¡ï¼å¤±è´¥ 0 æ¡`ï¼`c1=767, c2=767` | éè¿ | | 6 | å ¼å®¹-èæ ¼å¼æ°å¼ä¸å | 2099-09 vs æ¢æ 2026-08ï¼åæºåå å®¹ï¼ | å®å ¨ä¸è´ | n=767 / v=22091 / p=16286506 / t=1158473501ï¼åé¡¹å ¨ç | éè¿ | | 7 | å ¼å®¹-èæ ¼å¼é¦è¡æ½æ¥ | Excel COM 读 `.xls` 第 2 è¡ vs åº | ä¸è´ | æºï¼`914201005519761659 / 914201005519761659 / æ¦æ±æ·å®é¡ºè¾¾æ±½è½¦æå¡æéå ¬å¸ / 24 / 54330`ï¼åºå | éè¿ | | 8 | è´å-ééæ°æ®ç±»å | `H203_1_2026-å ¬è·¯æ 客è¿è¾æåº¦ç产æ åµï¼2026ï¼.xlsx` â passengerMonthly | æç¡®æ¥éãä¸ååº | `å¯¼å ¥å¤±è´¥: æéæ°æ®ç±»åãå ¬è·¯æ 客è¿è¾æåº¦ç产æ åµã䏿件å 容ä¸ç¬¦ï¼è¡¨å¤´ç¼ºå°å¿ éåãä¼ä¸åç§°ãã客è¿é_æ»è®¡ã` | éè¿ | | 9 | è´å-åå³ç§»ä¸å½±åæ§å段 | æ°æ¨¡æ¿ï¼æ´ä½å³ç§» 2 åï¼ | ä¼ä¸ä»£ç /ä¼ä¸åç§°/车è¾/客è¿éçæ§åæ®µåå¼ä¸å | è§£ææè¡¨å¤´å `buildHeaderMap` åå¼ï¼814 æ¡ 0 å¤±è´¥ï¼æ±æ»å项䏿ºæä»¶ä¸è´ï¼è§ç¨ä¾ 4ï¼ | éè¿ | ## åãåç°çé®é¢ä¸å¤ç½® 1. **èæ ¼å¼æä»¶å ¶å®ä¹å¸¦è¿ä¸¤å**ï¼`ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç `ã`å¡«æ¥åä½`ï¼ï¼æ¤åä»£ç æªè¯»å â æ¬æä¸å¹¶å¼å§å ¥åºãè¿ä¹æå³ç 2026-01 ~ 2026-08 çåéæ°æ®è¿ä¸¤å为空ï¼**éè¦éå¯¼å¯¹åºæä»¶æè½åå¡«**ï¼å·²åå ¥å¾ åï¼çç¨æ·ç¡®è®¤ï¼ã 2. **è¡¨ç»æåæ´å¿ é¡»åæ¥ä¸å¤**ï¼æ¬æ¬¡é¦æ¬¡åªæ¹äºåºä¸å®ä½ï¼æ¼äº `docs/init.sql` / `docs/database.md`ï¼å·²è¡¥é½ã 3. **æ¿æ¢éç¹ä¸å¯ä¸å¯¼è´æ¹éææ¡£**ï¼`docs/database.md` ä¸ `| enterprise_name | varchar(200) | ä¼ä¸åç§° |` åºç° 4 次ï¼é¦æ¬¡æ¹éæ¿æ¢è¯¯æ¹äº H203-2 ç 3 å¼ è¡¨ï¼å·² `git checkout` åéå¹¶æ¹ä¸ºãå æªå h2031 ç« èåæ¿æ¢ãã ## äºãç»è®º - æ°æ¨¡æ¿ä¸èæ ¼å¼**ååå ¼å®¹**ï¼å¯¼å ¥ 0 å¤±è´¥ï¼æ½æ¥åé项对é½ï¼æ§å段æªååå³ç§»å½±åã - æ°æ®åºãå»ºè¡¨èæ¬ãæ°æ®åå ¸ãå®ä½ãå¯¼å ¥è§£æãå端åé ç½®**å å¤ä¸è´**ã - éçï¼åéæä»½ï¼2026-01 ~ 2026-08ï¼ç两åå¾ åå¡«ï¼çç¨æ·ç¡®è®¤åé导ã docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_µÇ¼ÑéÖ¤ÂëÈÝ´íÓ뱨±íÔ¤ÀÀÕû¸Ä_2026-09-16.md
New file @@ -0,0 +1,51 @@ # åè½æµè¯æ¥åï¼ç»å½éªè¯ç 容é + æ¥è¡¨é¢è§æ´æ¹ï¼ææ éä½ / å¼¹çªæå¨åè§ / 失败æç¤ºï¼ - æ¥æï¼2026-09-16 - 模åï¼ç»å½é¡µãæ¥è¡¨çæ-æ±æ»å¤§è¡¨é¢è§ - ç»è®ºï¼**éè¿**ï¼4 个é®é¢å ¨é¨ä¿®å¤ï¼æµè§å¨å®æµåè¯ï¼ ## ä¸ãåè½è¯´æ ç¨æ·åé¦ 3 个é®é¢ï¼ | # | ç¨æ·æè¿° | æ ¹å | ä¿®å¤ | |---|----------|------|------| | 1 | æ¢ WiFi åç»å½é¡µåºç°éªè¯ç ç½è²æ¹æ¡ãæç¤ºãéªè¯ç å 载失败ï¼è¯·æ£æ¥ç½ç»ã | å端 `app.captcha.required=false` å·²ç¦ç¨éªè¯ç ï¼ä½å端 `Login.vue` ç `captchaRequired` é»è®¤å¼æ¯ `true`ï¼ä¸ `/api/auth/captcha-config` 请æ±å¤±è´¥æ¶ `.catch(() => {})` **éé»å¿½ç¥**ï¼é¡µé¢æ®çä¸ä¸ªå è½½ä¸åºæ¥çéªè¯ç æ¡ | é»è®¤å¼æ¹ `false`ï¼æ¹ä¸º fail-safeï¼ä» å½å端æç¡®è¿å `code===200 && data.required===true` ææ¾ç¤ºéªè¯ç ï¼è¯·æ±å¼å¸¸ä¸å¾æãä¸éè¦éªè¯ç ãå¤ç | | 2 | æ¥è¡¨çæ-æ±æ»å¤§è¡¨é¢è§ï¼ç¹å»åå¼¹ã导åºå¤±è´¥ï¼è¯·ç¡®è®¤å¯¼å ¥æ°æ®ï¼ææ¥çå端æ¥å¿ã | å端 `failWith(err, action)` æ**ææ**å¼å¸¸ï¼å«ç½ç»/代çå±å¤±è´¥ï¼é½æ¸²ææåä¸å¥ç¬¼ç»ææ¡ï¼é»è®¤ action è¿æ¯ã导åºãï¼è¯¯å¯¼è¯»ææ°æ®é®é¢ | éå `failWith` + æ°å¢ `errReason(raw)`ï¼åºåãè¿ä¸ä¸æå¡å¨ãä¸ãå端çå®åå ãï¼é¢è§è°ç¨ä¼ `action='é¢è§'`ï¼Blob é误ååºå `text()` åè§£æ | | 3 | é¢è§å¼¹çªææ éä½ï¼ææ åå¨ãå½æè´§è¿éãä¸ï¼ï¼å¼¹çªä¸å¯æå¨ãæ åè§ | è¡¨å¤´æ¯ 3 åï¼ææ /æ°æ®/忝ï¼ï¼ä¸ 4 åæ°æ®è¡ï¼åç±»/ææ /æ°æ®/忝ï¼ä¸å¹é ï¼Element UI 2.15.14 **没æ** `draggable` 屿§ï¼é£æ¯ Element Plusï¼ | 表头补为 4 å `åç±»/ææ /æ°æ®/忝`ï¼æ°å¢ `v-dialog-drag` æä»¤å®ç°æå¨ï¼åªæ¹ `.el-dialog` ç `transform`ï¼å ³éæ¶å¤ä½ï¼ï¼å `border-radius:10px` | æ¹å¨æä»¶ï¼`traffic-audit-web/src/views/Login.vue`ã`traffic-audit-web/src/views/ReportExport.vue`ãæ°å¢ `traffic-audit-web/src/directives/dialogDrag.js`ã`traffic-audit-web/src/main.js`ï¼æ³¨åæä»¤ï¼ã ## äºãæµè¯ç¯å¢ - å端ï¼`http://localhost:8080`ï¼vue-cli-service serveï¼dev æå»ºï¼ - å端ï¼8090ï¼`Started TrafficAuditApplication`ï¼éå¯åæ°ç¼è¯ï¼ - æµè§å¨ï¼Codex å 嵿µè§å¨ï¼è§å£çº¦ 319Ã790ï¼ï¼åè¯æ¹å¼ `tab.playwright.evaluate()` ç´è¯» DOM + æªå¾ ## ä¸ãç¨ä¾è¡¨ | # | åºæ¯ | è¾å ¥/æä½ | 颿 | å®é | ç»è®º | |---|------|-----------|------|------|------| | 1 | éªè¯ç -åç«¯å·²å ³é | æ°å¼æ ç¾è®¿é® `#/login`ï¼å端ä¸å¯ç¨æ¶åæ ·éªè¯ï¼ | ä¸åºç°éªè¯ç æ¹æ¡ï¼ä¸åºç°ãéªè¯ç å 载失败ã | 页颿 `.captcha-box`ï¼æç¤ºãæµè¯æ¨¡å¼ï¼è¡ä¸ºéªè¯ç 已跳è¿ã | éè¿ | | 2 | éªè¯ç -æ¥å£æ£å¸¸ | `GET /api/auth/captcha-config` | `required=false` | `{"code":200,"message":"success","data":{"required":false}}` | éè¿ | | 3 | é¢è§-è¡¨å¤´åæ° | æå¼é¢è§å¼¹çªè¯» `thead th` | 4 åä¸é¡ºåºä¸º åç±»/ææ /æ°æ®/忝 | `['åç±»','ææ ','æ°æ®','忝']` | éè¿ | | 4 | é¢è§-ææ å¯¹é½ | 读é¦è¡ååå æ ¼ x åæ | å类对é½ãé路货è¿ããææ 对é½ãå½æè´§è¿é(ä¸å¨)ããæ°æ®å¯¹é½ 16888.76ã忝卿°æ®å³ä¾§ | åç±» x=35ãææ x=118ãæ°æ® x=394ã忝 x=587ï¼`16888.76` å¨ x=394ï¼ | éè¿ | | 5 | é¢è§-å¼¹çªåè§ | 读 `.el-dialog` è®¡ç®æ ·å¼ | æåè§ | `borderRadius=10px`ã`overflow=hidden` | éè¿ | | 6 | é¢è§-å¼¹çªæå¨ | `tab.drag([150,60],[270,220])` ææ é¢æ | å¼¹çªè·éç§»å¨ | ç± `(0,40)` â `(120,200)`ï¼`transform=matrix(1,0,0,1,120,160)`ï¼ä½ç§»éçäºææ½å¢é | éè¿ | | 7 | é¢è§-å ³éå¤ä½ | å ³éå¼¹çªå读 transform | å¤ä½ä¸º none | `transform=none`ã`visible=false` | éè¿ | | 8 | é¢è§-ä¸å£å¾ä¹åæ è¡¨æ ¼ | 读弹çªå `table` æ°éä¸å 容 | æä¸ä» æ 1 å¼ ææ è¡¨ | å¼¹çªå 1 å¼ è¡¨ï¼12 è¡ææ ï¼å«ä¸å£å¾ 4 è¡ï¼ï¼è¡¨ä¸ä» 两æ¡åæ¯ç¼ºå¤±æç¤ºä¸ãå ³éãæé® | éè¿ | | 9 | 失败æç¤º-ç½ç»å¼å¸¸ | åç«¯åææ¶ç¹é¢è§ | æç¡®æç¤ºç½ç»/æå¡æªå¯å¨ï¼èéã导åºå¤±è´¥ï¼è¯·ç¡®è®¤å¯¼å ¥æ°æ®ã | `é¢è§å¤±è´¥ï¼æ æ³è¿æ¥æå¡å¨ï¼è¯·æ£æ¥ç½ç»è¿æ¥ï¼æç¡®è®¤å端æå¡æ¯å¦å·²å¯å¨` | éè¿ | | 10 | 导åº-æ£å¸¸è·¯å¾ | ç¹ã导åºã | ä¸è½½æåæç¤º | `æ¥è¡¨å¯¼åºæå` | éè¿ | ## åãåç°çé®é¢ä¸å¤ç½® 1. **ã导åºå¤±è´¥ï¼è¯·ç¡®è®¤å¯¼å ¥æ°æ®ï¼ææ¥çå端æ¥å¿ã䏿¯æ°æ®é®é¢**ï¼ç¨ API éæç´è¿ `/api/report/preview` ä¸ `/api/report/export/summaryWorkbook` å ¨é¨è¿å 200ï¼2026-08 å¯¼åº 950747 åèï¼ãè¯¥ææ¡åªå¨**ç½ç»/代çå±å¤±è´¥**æ¶åºç°ï¼æ¢ WiFi åè¯·æ±æä¸å°å端ï¼ï¼å±äºæç¤ºè¯¯å¯¼ãç°å·²æ¹ä¸ºåºåå ·ä½åå ã 2. **Element UI 2.15.14 䏿¯æ `draggable`**ï¼å¼¹çªæå¨åªè½èªå·±å®ç°ï¼å·²ç¨ `v-dialog-drag` æä»¤ï¼`<style>` å¿ é¡»**é scoped**ï¼el-dialog é»è®¤ append-to-bodyï¼ã 3. **æµè§å¨èªå¨ååè¯çå**ï¼`tab.click(index)` çç´¢å¼å¨é¡µé¢å·æ°åä¼å¤±æï¼æ¾è¯¯ç¹å°ãæèµæ¥è¡¨ãTabï¼Playwright locator ç¹ Element UI è¡¨æ ¼å æé®ä¼è¶ æ¶ï¼`tab.drag` åæ å¿ é¡»å¨è§å£å ã以ä¸åå·²è®°å ¥ãé®é¢ä¸æ³¨æäºé¡¹æ±æ»ãã 4. é¢è§å¼¹çªæ é¢å¨æªæå¼æ¶æ¾ç¤ºä¸ºãé¢è§æ°æ® - ï¼ï¼ãï¼å±æªèµå¼ç¶æï¼ä¸å½±å使ç¨ã ## äºãç»è®º - 4 个é®é¢å ¨é¨ä¿®å¤å¹¶ææµè§å¨å®æµè¯æ®ï¼è¡¨å¤´ 4 åä¸ x åæ å¯¹é½ãåè§ 10pxãæå¨ä½ç§» 120/160ãå ³éå¤ä½ãæ 第äºå¼ 表ã失败æç¤ºå·²ç»åï¼ã - ãä¸å£å¾ä¹åä¸å渲æè¡¨æ ¼ãçä¸é¡¹éªè¯è§ãåè½æµè¯æ¥å_æ±æ»å¤§è¡¨é¢è§å é¤ä¸å£å¾åæç»è¡¨_2026-09-16.mdãã - éçï¼é¢è§å¼¹çªå ãå ± 0 è¡ãä¸ãæåº¦è¦çï¼1~8æåææ°æ®ã两个å£å¾ææ¡ä¸åï¼æè¯¯è§£ï¼çç¨æ·ç¡®è®¤åè°æ´ã docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»õÔËÁ¿ÖÜתÁ¿2023ÄêÊý¾Ý²¹Â¼_2026-09-16.md
New file @@ -0,0 +1,49 @@ # åè½æµè¯æ¥åï¼è´§è¿é/å¨è½¬é 2023 å¹´æ°æ®è¡¥å½å ¥åº - æ¥æï¼2026-09-16 - 模åï¼æ°æ®å¯¼å ¥ / è´§è¿éå¨è½¬é - ç»è®ºï¼**éè¿**ï¼æ£å 1 æ¡ãå ¥åºæ½æ¥ 216 é¡¹å ¨å¯¹é½ãä¸å¹´åæ 1 æ¡ãå¹ç/åå½ 2 æ¡ï¼ ## ä¸ãåè½è¯´æ ç¨æ·åé¦ã2023 å¹´æ 12 æçæ°æ®ãï¼èä¸è½®å ¥åºä½¿ç¨ç 8 ææºæä»¶**缺 2023 å¹´ Sheet**ï¼åªæ `2026å¹´/2025å¹´/2024å¹´/2022å¹´/2021å¹´`ï¼ï¼å æ¤åºé没æ `2023-12`ã ææ¥åå¨ 7 ææºæä»¶ä¸æ¾å° 2023 å¹´æ°æ®ï¼å°å ¶è¡¥å½å ¥åºï¼ | 项 | å 容 | |----|------| | æ°æ®æ¥æº | `D:\05_æ°æ®åç±»\è´§è¿\7æ\å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-7æï¼.xlsx` ç `2023` Sheet | | è¡¥å½æ¹å¼ | å¦å临æ¶å·¥ä½ç°¿ `_2023_import_tmp.xlsx`ï¼ä» ä¿ç `2023` + `2022å¹´` 两个 Sheetï¼æ»¡è¶³å¤å¹´åº¦å·¥ä½ç°¿ãè³å° 2 个 Sheetãè§åï¼ï¼èµ° `POST /api/import/freightTurnover?period=2023-12` | | ç»æ | `è´§è¿éå¨è½¬éå¯¼å ¥æå, å ± 36 æ¡è®°å½`ï¼18 å°å¸ à 2 个æ¥è¡¨æï¼2022-12 éå + 2023-12 æ°å¢ï¼ | **为ä»ä¹å¸¦ä¸ 2022 å¹´ Sheet**ï¼`2023` çä¸å¹´åæåèªãä¸ä¸å¹´åº¦ Sheetãï¼åªæ¾ 2023 ä¼å¯¼è´ 2023 ç `last_*` 为空ï¼åæ¶é¿å æ´æ¬å¯¼å ¥ 7 ææä»¶èå¤åºæ ç¨ç `2026-07` æ¥è¡¨æã ## äºãæµè¯ç¯å¢ - å端ï¼éå¯åæ°ç¼è¯ï¼`Tomcat started on port(s): 8090`ï¼PID 31384 - æ°æ®åºï¼`traffic_audit.freight_turnover_import` - æºæä»¶ï¼7 ææä»¶ `2023` Sheetï¼A1:N48ï¼`è´§è¿é(ä¸å¨)` å + `å¨è½¬é(ä¸å¨å ¬é)` åï¼1â12 æ + 累计åï¼ ## ä¸ãç¨ä¾è¡¨ | # | åºæ¯ | è¾å ¥ | 颿 | å®é | ç»è®º | |---|------|------|------|------|------| | 1 | æ£å-2023 å ¥åº | `_2023_import_tmp.xlsx` â freightTurnover | çæ `2023-12`ï¼18 è¡ | `å ± 36 æ¡è®°å½`ï¼`SELECT report_period,COUNT(*)` åºç° `2023-12 = 18` | éè¿ | | 2 | å ¥åºæ½æ¥-éæ ¼æ¯å¯¹ | 2023 Sheet è´§è¿éå + å¨è½¬éåï¼18 å°å¸ à 12 æ à 2 ææ = 432 é¡¹ï¼ | ä¸åºä¸ `freight_m01..m12` / `turnover_m01..m12` å®å ¨ä¸è´ | **mismatches = 0**ï¼18 个å°åºå ¨é¨å¹é ï¼ | éè¿ | | 3 | ä¸å¹´åæ | æ¥ 2023-12 ç `last_freight_*` / `last_turnover_*` | çäº 2022 å¹´åæå¼ | æ¦æ± `last_freight_m01=3527.89407360113`ã`last_freight_m12=4334.42636773157`ã`last_turnover_m12=608823.495390257`ï¼ä¸ `2022-12` è¡éå¼ç¸å | éè¿ | | 4 | æ¥è¡¨ææ¸ ååå½ | æ¥å ¨é¨æ¥è¡¨æ | æ éå¤ãæ 2099 æ®ç | 2021-12 / 2022-12 / **2023-12** / 2024-12 / 2025-12 / 2026-01â¦2026-08ï¼æ¯æ 18 è¡ | éè¿ | | 5 | å岿æªè¢«æ±¡æ | 2022-12 éååä¸å弿¯è¾ | å®å ¨ä¸è´ | 䏿¹å¨å 2022-12 éå¼ç¸å | éè¿ | ## åãåç°çé®é¢ä¸å¤ç½® | # | é®é¢ | å¤ç½® | |---|------|------| | 1 | 8 ææºæä»¶æ 2023 å¹´ Sheetï¼å¯¼è´åºéé¿æç¼º `2023-12`ãä¸ `2024-12` æ ä¸å¹´åæ | ä» 7 ææºæä»¶è¡¥å½ `2023-12`ï¼`2024-12` çä¸å¹´åææ¬æ¬¡**æªéç®**ï¼éé导 2024 æä¼çæï¼ï¼å¦éå¯å¦è¡è¡¥å¯¼ | | 2 | 7 ææä»¶ä¸ 8 ææä»¶ç 2021/2022/2024 ä¸å¹´æ°æ®æ¯å¦ä¸è´æ æ³ç¡®å® | éæ ¼æ¯å¯¹ï¼`onlyJuly/onlyAug/differ` å ¨é¨ä¸ºç©ºï¼**ä¸å¹´ 0 å¤å·®å¼**ï¼å æ¤è¡¥å¯¼ 2022 ä¸ä¼å¼å ¥åå·® | | 3 | è¥æ´æ¬å¯¼å ¥ 7 ææä»¶ä¼å¤åº `2026-07` æ¥è¡¨æ | æ¹ä¸ºåªä¿ç `2023 + 2022å¹´` 两个 Sheet ç临æ¶å·¥ä½ç°¿ï¼é¿å äº§çæ ç¨ææ¬¡ | | 4 | å Sheet æä»¶ä¸ä¼è¢«è¯å«ä¸ºå¤å¹´åº¦å·¥ä½ç°¿ | 已卿¬æ¥åä¸ãé®é¢ä¸æ³¨æäºé¡¹æ±æ»ãä¸è®°å½è¯¥è§åï¼ä¾åç»è¡¥æ°åè | ## äºãç»è®º - 2023 å¹´è´§è¿é/å¨è½¬é已宿´å ¥åºï¼18 å°å¸ à 12 æï¼ï¼**432 é¡¹éæ ¼æ¯å¯¹é¶å·®å¼**ï¼ä¸å¹´åææ£ç¡®åèª 2022 å¹´ã - æ¥è¡¨ææ¸ åè¿è´¯ï¼2021-12 â 2026-08 å ± 13 æï¼æ¯æ 18 è¡ã - éçï¼`2024-12` çä¸å¹´åæï¼2023 å¹´å¼ï¼æªåå¡«ï¼å¦éè¦å¯é导 2024 å¹´æ°æ®ã docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-16.md
@@ -77,4 +77,74 @@ 1. ä¸ç¨æ·ç¡®è®¤ `2021-12` / `2022-12` çãæ´å¹´æ¥è¡¨æãçä¸å¡å£å¾ï¼ä»¥åæ¯å¦éè¦æå¹´åº¦æ°æ®ææéææ¥è¡¨æã 2. 确认æ¯å¦éè¦è¡¥ 2023 å¹´æ°æ®ã以å `2026-01`~`2026-07` çä¸å¹´åææ¯å¦éè¦è¡¥é½ã 3. è§ç¨æ·æè§å¤çé¢è§å¼¹çªãå ± 0 è¡ãææ¡ã 4. ç½ç»æ¢å¤åè¡¥æ¨å ¬å¸ giteaã 4. ç½ç»æ¢å¤åè¡¥æ¨å ¬å¸ giteaã --- ## åãåæè¿½å ï¼ç¬¬ 3 è½®ç¨æ·åé¦ 6 æ¡ï¼2026-09-16ï¼ ç¨æ·æ¬è½®æåº 6 æ¡åé¦ï¼éæ¡å¤çç»æå¦ä¸ï¼ | # | ç¨æ·åé¦ | å¤çç»æ | |---|----------|----------| | 1 | 21â26 å¹´è´§è¿éå¨è½¬éè¡¨æ°æ®å ¥åº | ä¸è½®å·²å®æï¼`0cfd6e0`ï¼ï¼æ¬è½®è¡¥é½ 2023 å¹´ï¼è§ #2ï¼ | | 2 | ç¨æ·æ ¸å®ã23 å¹´æ 12 æçæ°æ®ã | **å±å®**ã8 ææºæä»¶ç¡®å®æ²¡æ 2023 å¹´ Sheetï¼ä½ 7 ææä»¶ `D:\05_æ°æ®åç±»\è´§è¿\7æ\å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-7æï¼.xlsx` éæä¸ä¸ªå为 `2023` ç Sheetãå·²å¦å `_2023_import_tmp.xlsx`ï¼`2023` + `2022å¹´` 两个 Sheetï¼å¯¼å ¥ï¼çæ `2023-12`ï¼18 è¡ï¼ï¼**432 é¡¹éæ ¼æ¯å¯¹é¶å·®å¼** | | 3 | è¦ä¸ä»½ãææè¦æ³¨æçç¹ãçæ±æ»ææ¡£ | æ°å»º `docs/é®é¢æ±æ»/é®é¢ä¸æ³¨æäºé¡¹æ±æ»_2026-09-16.md`ï¼11 ç« + éæ¥è¡¨ï¼å«å¯å¨/è¿ç¨ãæ¥å¿éªè¯ãæ°æ®åºãå¯¼å ¥è·¯å¾ä¸ææ¬¡çº¦å®ãæ¥è¡¨ãéªè¯ç ãæä»¶ç¼ç ãæµè§å¨åè¯ãgit åä»åºãéçé®é¢ï¼ | | 4 | æ¢ WiFi åç»å½é¡µåºç°éªè¯ç ç½æ¡ + ãéªè¯ç å 载失败ã | 已修å¤ï¼å端é»è®¤å¼ + fail-safeï¼ï¼æ¬è½®æµè§å¨å¤æµéè¿ | | 5 | é¢è§ç¹ä¸ä¸å¼¹ã导åºå¤±è´¥ï¼è¯·ç¡®è®¤å¯¼å ¥æ°æ®ã | å·²ä¿®å¤æç¤ºé»è¾ï¼åºåç½ç»/å端åå ï¼ï¼å¦å¤ä¸¤å°é¡¹ï¼ææ éä½ãå¼¹çªæå¨åè§ï¼æ¬è½®æµè§å¨å®æµéè¿ | | 6 | å ¬è·¯æ 客 H203-1 模æ¿è¢«ä¿®æ¹ | å·²éé å¹¶éªè¯ï¼æ°å¢ `ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç ` / `å¡«æ¥åä½` 两åå ¥åºï¼æ°èæ ¼å¼ååå ¼å®¹ | ### 1. 2023 å¹´è´§è¿æ°æ®è¡¥å½ï¼ç¨æ·ç¬¬ 2 æ¡ï¼ - **ææ¥è¿ç¨**ï¼å 确认 8 ææºæä»¶ 5 个 Sheet å ¨ä¸ºå¯è§ãæ 2023ï¼åå ¨çæç´¢ `*è¿è¾é*`ã`*23å¹´*`ã`*è´§è¿é*` æä»¶åï¼æåæ«æ `D:\05_æ°æ®åç±»` ä¸ `D:\æ¡é¢` 䏿æ `.xlsx` ç **Sheet å**ï¼å½ä¸ 7 ææä»¶ç `2023` Sheetã - **ä¸è´æ§é¢æ£**ï¼7 æä¸ 8 ææä»¶ç `2021å¹´ / 2022å¹´ / 2024å¹´` ä¸å¹´æ°æ®éæ ¼æ¯å¯¹ï¼`onlyJuly / onlyAug / differ` å ¨ä¸ºç©º â ä¸å¹´**é¶å·®å¼**ï¼å¯å®å ¨ç¨ 7 ææä»¶è¡¥ 2022ï¼ä½ä¸º 2023 çä¸å¹´åææ¥æºï¼ã - **å¯¼å ¥**ï¼`POST /api/import/freightTurnover?period=2023-12`ï¼è¿åãå ± 36 æ¡è®°å½ãã - **éªè¯**ï¼`2023-12` 18 è¡ï¼è´§è¿é + å¨è½¬éå ± 432 é¡¹ä¸ Excel éæ ¼æ¯å¯¹ **mismatches=0**ï¼`last_*` ä¸ `2022-12` éå¼ç¸åï¼å ¨é¨æ¥è¡¨æ 2021-12 â 2026-08 å ± 13 æãæ¯æ 18 è¡ã - 详è§ãåè½æµè¯æ¥å_è´§è¿éå¨è½¬é2023å¹´æ°æ®è¡¥å½_2026-09-16.mdãã ### 2. H203-1 æ¨¡æ¿æ°å¢åéé ï¼ç¨æ·ç¬¬ 6 æ¡ï¼ - **æ¨¡æ¿ diff ç»è®º**ï¼Sheet1 ç± 773Ã50 â 816Ã52ï¼å¨ãä¼ä¸åç§°ãåæå ¥ `ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç `ã`å¡«æ¥åä½` 两åï¼å ¶ä½ 48 åæ´ä½å³ç§»ã - **æ¹å¨ 6 å¤**ï¼åº DDLã`docs/init.sql`ã`docs/database.md`ã`PassengerEnterpriseMonthly.java`ã`DataImportService.java`ã`DataViewController.java`ï¼æ°æ®æ¥ç页åï¼ã - **éªè¯**ï¼æ°æ¨¡æ¿å¯¼å ¥ 814 æ¡ 0 失败ï¼åé¡¹æ±æ»ï¼å®¢è¿è½¦è¾ 24584 / æ ¸å®è½½å®¢ä½ 711018 / 客è¿é 16371625 / å¨è½¬é 1023386179ï¼ä¸æºæä»¶å ¨çï¼èæ ¼å¼ `.xls` å¯¼å ¥ 767 æ¡ 0 å¤±è´¥ä¸æ°åæå¼ï¼**èæä»¶å ¶å®ä¹å¸¦è¿ä¸¤å**ï¼ï¼æ°å¼ä¸æ¢æ 2026-08 å®å ¨ä¸è´ï¼è´åç¨ä¾ï¼ééç±»åï¼æ¥éæ¸ æ°ã - **è¿ç¨ä¸ç失误**ï¼`docs/database.md` é `| enterprise_name | varchar(200) | ä¼ä¸åç§° |` åºç° 4 次ï¼é¦æ¬¡æ¹éæ¿æ¢è¯¯æ¹ 3 å¼ è¡¨ï¼å·² `git checkout` åéåæ¹ä¸ºãæªåç« èåæ¿æ¢ãã - 详è§ãåè½æµè¯æ¥å_H2031æ¨¡æ¿æ°å¢åéé _2026-09-16.mdãã ### 3. ç»å½éªè¯ç 容é + æ¥è¡¨é¢è§æ´æ¹ï¼ç¨æ·ç¬¬ 4ã5 æ¡ï¼ - **éªè¯ç **ï¼`Login.vue` é»è®¤ `captchaRequired=false`ï¼æ¹ä¸º fail-safeï¼ä» å端æç¡®è¿å `required===true` ææ¾ç¤ºï¼ï¼æ¢ WiFi/å端ä¸å¯è¾¾æ¶ä¸åæ®çéªè¯ç ç½æ¡ã - **失败æç¤º**ï¼`failWith(err, action)` + `errReason(raw)` éåï¼åºåãè¿ä¸ä¸æå¡å¨ãä¸ãå端çå®åå ãï¼é¢è§è°ç¨å¸¦ `action='é¢è§'`ï¼Blob é误å `text()` åè§£æã - **ææ éä½**ï¼é¢è§è¡¨å¤´ç± 3 å补为 4 åï¼åç±»/ææ /æ°æ®/忝ï¼ï¼å®æµ x åæ 35 / 118 / 394 / 587ï¼`16888.76` è½å¨ãæ°æ®ãåã - **å¼¹çªæå¨ + åè§**ï¼æ°å¢ `dialogDrag.js` æä»¤ï¼Element UI 2.15.14 æ `draggable`ï¼ï¼`border-radius:10px`ï¼å®æµæå¨ `(0,40) â (120,200)`ï¼`transform=matrix(1,0,0,1,120,160)`ï¼å ³éåå¤ä½ `none`ã - ãä¸å£å¾ä¹åä¸å渲æè¡¨æ ¼ãä¸è½®å·²ä¿®ï¼æ¬è½®å¤æ ¸å¼¹çªå **æä¸ä» æä¸å¼ 表**ã - 详è§ãåè½æµè¯æ¥å_ç»å½éªè¯ç 容é䏿¥è¡¨é¢è§æ´æ¹_2026-09-16.mdãã ### 4. 注æäºé¡¹æ±æ»ææ¡£ï¼ç¨æ·ç¬¬ 3 æ¡ï¼ æ°å»º `docs/é®é¢æ±æ»/é®é¢ä¸æ³¨æäºé¡¹æ±æ»_2026-09-16.md`ï¼å ± 11 ç« ï¼ éæ¥è¡¨ï¼10 æ¡ï¼ãå¯å¨ä¸è¿ç¨ç®¡çãæå¡ç¶æéªè¯ãæ°æ®åºãæ°æ®å¯¼å ¥ï¼è·¯å¾ + ææ¬¡çº¦å® + å¤å¹´åº¦å·¥ä½ç°¿è¯å«è§åï¼ãæ¥è¡¨çæãç»å½ä¸éªè¯ç ãæä»¶åå ¥ä¸ææ¬å¤ççåãæµè§å¨èªå¨ååè¯çåãGit åä»åºå·¥ä½æµãå½åå·²ç¥éçé®é¢ã ## åä¸ãæµè¯ç»ææè¦ï¼åæè¿½å é¨åï¼ - **2023 è¡¥å½**ï¼5 æ¡ç¨ä¾ï¼ï¼æ£åå ¥åºã432 é¡¹éæ ¼æ¯å¯¹é¶å·®å¼ãä¸å¹´åæåèª 2022ãæ¥è¡¨ææ¸ åæ éå¤/æ æ®çã2022-12 éååéå¼ä¸å ââ å ¨é¨éè¿ã - **H203-1 æ°å¢å**ï¼9 æ¡ç¨ä¾ï¼ï¼æ°æ¨¡æ¿ 814 æ¡ 0 失败ã两å 814/814 æå¼ãé¦è¡ä¸æ±æ»å项䏿ºæä»¶å ¨çãèæ ¼å¼ 767 æ¡ 0 å¤±è´¥ä¸æ°å¼ä¸ 2026-08 å ¨çãExcel COM æ½æ¥é¦è¡ä¸è´ãè´åééç±»åæ¥éæ¸ æ°ãåå³ç§»ä¸å½±åæ§å段 ââ å ¨é¨éè¿ã - **ç»å½éªè¯ç + é¢è§æ´æ¹**ï¼10 æ¡ç¨ä¾ï¼ï¼æ éªè¯ç ç½æ¡ãæ¥å£ `required=false`ã表头 4 åä¸ x åæ å¯¹é½ãåè§ 10pxãæå¨ä½ç§» 120/160ãå ³éå¤ä½ãå¼¹çªå ä» 1 å¼ è¡¨ã失败æç¤ºå·²ç»åãå¯¼åºæå ââ å ¨é¨éè¿ã - **æµè¯æ°æ®æ¸ ç**ï¼H203-1 å¯¼å ¥éªè¯äº§çç `2099-06 / 2099-07 / 2099-09` ä¸ä¸ªæµè¯æï¼å ± 2395 è¡ï¼åå ¶ `import_batch` è®°å½å·²å é¤ï¼`h2031_enterprise_monthly` æ¢å¤ä¸º 2026-01 ~ 2026-08 å ± 8 æï¼`freight_turnover_import` 为 13 æ à 18 è¡ã ## åäºãéçé®é¢ä¸å¾ åï¼åææ´æ°ï¼ | # | é®é¢ | ç¶æ | |---|------|------| | 1 | 8 ææºæä»¶ç¼º 2023 å¹´ Sheet | **已解å³**ï¼ç¨ 7 ææä»¶è¡¥å½ `2023-12`ï¼ | | 2 | `2026-01` ~ `2026-07` ç `last_*` 为空 | å¾ ç¨æ·ç¡®è®¤æ¯å¦è¡¥ | | 3 | `2026-01` ~ `2026-08` ç H203-1 `unified_credit_code` / `report_unit` ä¸ºç©ºï¼æ¤åä»£ç æªè¯»è¿ä¸¤åï¼ | **å¾ ç¨æ·ç¡®è®¤æ¯å¦é导å岿件åå¡«** | | 4 | `2024-12` çä¸å¹´åææªåå¡«ï¼éé导 2024 å¹´æ°æ®ï¼ | å¾ ç¨æ·ç¡®è®¤ | | 5 | é¢è§å¼¹çªãå ± 0 è¡ãä¸ãæåº¦è¦çï¼1~8æåææ°æ®ãå£å¾ææ¡ä¸å | å¾ ç¨æ·ç¡®è®¤æ¹ææ¡ | | 6 | `2021-12` çãæ´å¹´æ¥è¡¨æãçä¸å¡å£å¾ | å¾ ç¨æ·ç¡®è®¤ | | 7 | å ¬å¸ gitea æ¨éï¼ç½ç»æ ååºï¼ | å¾ è¡¥æ¨ï¼**ç¦å¼ºæ¨** | | 8 | ä»åºæ ¹ç®å½å¤§é `_*.*` ä¸´æ¶æä»¶ | ç»ç¨æ·åæå忏 ç | ## åä¸ãä¸ä¸æ¥è®¡åï¼åææ´æ°ï¼ 1. çç¨æ·ç¡®è®¤ 3 ä»¶äºï¼æ¯å¦é导 2026 å¹´åå² H203-1 æä»¶å填两åãæ¯å¦è¡¥ `last_*` / `2024-12` ä¸å¹´åæãé¢è§å¼¹çªææ¡æ¯å¦è°æ´ã 2. ç½ç»æ¢å¤åè¡¥æ¨å ¬å¸ giteaï¼å fetch åå¹¶ï¼ç¦å¼ºæ¨ï¼ã 3. è§ç¨æ·æè§æ¸ çä»åºæ ¹ç®å½ `_*.*` ä¸´æ¶æä»¶ã docs/ÎÊÌâ»ã×Ü/ÎÊÌâÓë×¢ÒâÊÂÏî»ã×Ü_2026-09-16.md
New file @@ -0,0 +1,181 @@ # 交éè´§è¿ç»è®¡å®¡æ ¸ç³»ç» â é®é¢ä¸æ³¨æäºé¡¹æ±æ» > ç¨éï¼æé¡¹ç®è¿è¡ãæ°æ®å¯¼å ¥ãæ¥è¡¨çæãä»åºåä½ä¸ææã踩è¿çåãéä¸è®°å½ï¼ä¾åç»å¼åä¸è¿ç»´å¿«éæ¥é ã > ç»´æ¤æ¹å¼ï¼æ°åç°é®é¢è¯·ç´æ¥å¨æ¬æä»¶è¿½å ï¼å¹¶æ³¨ææ¥æã > æåæ´æ°ï¼2026-09-16 --- ## ä¸ãéæ¥è¡¨ï¼æå¸¸è§ç 10 æ¡ï¼ | # | äºé¡¹ | æ£ç¡®åæ³ | |---|------|----------| | 1 | å¯å¨åå端 | é¡¹ç®æ ¹ç®å½æ§è¡ `powershell -NoProfile -ExecutionPolicy Bypass -File start-dev.ps1` | | 2 | 端å£å ç¨å¤æ | ç `backend.log` / `traffic-audit-web/frontend.log`ï¼**ä¸è¦**ä¾èµ `Get-NetTCPConnection` | | 3 | å端就绪æ å¿ | æ¥å¿åºç° `Started TrafficAuditApplication` + `Tomcat started on port(s): 8090` | | 4 | å端就绪æ å¿ | æ¥å¿åºç° `Compiled successfully` + `App running at:` | | 5 | è¿æ°æ®åº | `mysql.exe --host=127.0.0.1 --port=3308 --user=root --default-character-set=utf8mb4 -D traffic_audit` | | 6 | åæ§è¿ç¨ | æ PID 精确å `cmd â java(maven) â java(app)` é¾ï¼**ä¸è¦æ node_repl åç¨æ·èªå·±ç cmd çªå£** | | 7 | èæ¬æ¥ã已添å äºå ·æç¸åé®ç项ã | æ¬æºåæ¶åå¨ `Path` ä¸ `PATH`ï¼æ¹ç¨ `cmd.exe /c ... > log 2>&1`ï¼**严ç¦ç¨ `Start-Process`** | | 8 | å䏿æä»¶ | ç¨ UTF-8ï¼`main.js` 带 BOM å¿ é¡»åå BOMï¼æ¹æä»¶åå 确认åæä»¶æ¯ CRLF è¿æ¯ LF | | 9 | æäº¤å | å æµè¯ + åãåè½æµè¯æ¥åã+ æ´æ°ã工使¥ç»ãï¼å fetch/åå¹¶/æ¨é | | 10 | æ¨å ¬å¸ gitea | å `git fetch gitea` ä¸è¿ç«¯ `main` åå¹¶ï¼**ç¦æ¢å¼ºæ¨** | --- ## äºãå¯å¨ä¸è¿ç¨ç®¡ç | é®é¢ | åå | å¤ç½® | |------|------|------| | `Start-Process` æ¥ã已添å äºå ·æç¸åé®ç项ã | ç¯å¢åéåæ¶åå¨ `Path` ä¸ `PATH`ï¼å¼ç¸åï¼ | ç»ä¸ç¨ `cmd.exe /c ... > log 2>&1` æ `ProcessStartInfo` å¯å¨ | | åç«¯å¨æ²ç®±å èµ·ä¸æ¥ï¼`EPERM: lstat`ï¼ | node 访é®ç¨æ·ç®å½è¢«æ²ç®±æ¦æª | `start-dev.ps1` æ´ä½å¨æ²ç®±å¤æ§è¡ | | åµå¥ `powershell.exe -Command` å¼å·è¢«ç ´å | å¤å± shell å è§£æä¸å±å¼å· | ç´æ¥è¿è¡ `.ps1` æä»¶ï¼ä¸ååµå¥ | | é坿¶è¯¯æ Codex å æ ¸ | æååæ `node.exe` ä¼å½ä¸ `node_repl` | æ PID 精确ååç«¯é¾ `cmd â java(maven) â java(app)`ãåç«¯é¾ `cmd â node(npm) â cmd â node(vue-cli-service)` | | å端æ¥å¿æ¾ä¸å° | æ¥å¿å¨åç®å½ | `traffic-audit-web/frontend.log`ï¼å端 `backend.log` å¨ä»åºæ ¹ç®å½ | **é坿 åæµç¨**ï¼ååº `java.exe` è¿ç¨ â å `app` â `maven` â `cmd` â è¿è¡ `start-dev.ps1`ï¼èæ¬èªå¨è·³è¿å·²å¨çå¬ç端å£ï¼ã --- ## ä¸ãæå¡ç¶æéªè¯ - æ²ç®±å `Get-NetTCPConnection` ä¼å æéãæç»è®¿é®ãè**éé»å¤±è´¥**ï¼æ®æ¤å¤å®ç«¯å£æªç嬿¯éçã - 夿æå¡ç¶æä¸å¾ä»¥æ¥å¿ä¸ºåï¼HTTP æ¢æ´»ç¨ï¼ - å端ï¼`GET http://127.0.0.1:8090/api/auth/captcha-config`ï¼è¿å `{"code":200,...}` å³éï¼ - å端ï¼`http://localhost:8080/#/login` - å端æ¥å¿åºç° `Proxy error: Could not proxy request /api/... (ECONNREFUSED)` 说æ**åç«¯å½æ¶æ²¡èµ·æ¥**ï¼ä¸æ¯å端é®é¢ã --- ## åãæ°æ®åº - è¿æ¥ï¼æ¬å°å¼ååºï¼ï¼ `& 'C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe' --host=127.0.0.1 --port=3308 --user=root --password=<è§ AGENTS.md> --default-character-set=utf8mb4 -D traffic_audit` - **å¿ é¡»å `--host=127.0.0.1`**ï¼åæ `-h127.0.0.1` ä¼è¢«è§£ææ host `127`ï¼è¿æ¥å¤±è´¥ã - è¾åºè¿æ»¤ `2>&1 | Select-String -NotMatch 'Warning'` å¯å±è½å¯ç è¦åã - 常ç¨è¡¨ä¸å ³é®åï¼ | 表 | 说æ | å ³é®å | |----|------|--------| | `freight_turnover_import` | è´§è¿é/å¨è½¬é | `report_period`ã`region_name`ã`freight_m01..m12`ã`turnover_m01..m12`ã`last_*` | | `h2031_enterprise_monthly` | å ¬è·¯æ 客 H203-1 ææ¥ | `report_period`ã`enterprise_code`ã`unified_credit_code`ã`report_unit` | | `import_batch` | å¯¼å ¥æ¹æ¬¡ | `import_type`ã`report_period`ã`file_name`ã`success_rows` | | `audit_result` / `audit_run` | å®¡æ ¸ç»æ/è¿è¡ | `report_period` | - ææ¥ãæææ°æ®å¨ä¸å¨ãï¼`SELECT report_period, COUNT(*) FROM <表> GROUP BY report_period ORDER BY report_period;` - ææ¥ãææå¯¼å ¥æ¥èªåªä¸ªæä»¶ãï¼æ¥ `import_batch` ç `file_name`ã - **è¡¨ç»æåæ´è¦åæ¥ä¸å¤**ï¼å®é åº DDLã`docs/init.sql`ã`docs/database.md`ã - æµè¯ç¨æ¥è¡¨æå»ºè®®ç¨ `2099-xx`ï¼æµå®ç¨ `POST /api/import/clear?period=...` æç´æ¥ DELETE æ¸ çï¼é¿å 污æç宿份䏿项ã --- ## äºãæ°æ®å¯¼å ¥ï¼æä»¶è·¯å¾ä¸ææ¬¡çº¦å® ### 5.1 è´§è¿é/å¨è½¬éï¼`/api/import/freightTurnover`ï¼ | æºæä»¶ | è¦çææ¬¡ | 夿³¨ | |--------|----------|------| | `D:\05_æ°æ®åç±»\é«é\å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-8æï¼.xlsx` | 2021-12 / 2022-12 / 2024-12 / 2025-12 / 2026-08 | **æ 2023 å¹´ Sheet** | | `D:\05_æ°æ®åç±»\è´§è¿\7æ\å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-7æï¼.xlsx` | å¤ä¸ä¸ª `2023` Sheet | 2023 å¹´æ°æ®çæ¥æºï¼2021/2022/2024 ä¸ 8 ææä»¶éå¼ä¸è´ | - å¤å¹´åº¦å·¥ä½ç°¿è¯å«è§åï¼`detectYearSheets`ï¼ï¼ 1. **è³å° 2 个 Sheet**ï¼å Sheet æä»¶ä¸è¯å«ä¸ºå¤å¹´åº¦å·¥ä½ç°¿ï¼ä¼èµ°èçæåº¦æ¨¡æ¿è·¯å¾ï¼ï¼ 2. æ¯ä¸ª Sheet åå¹é `^\d{4}\s*å¹´?$`ï¼`2023å¹´`ã`2023` é½å¯ä»¥ï¼ï¼ 3. æ¯ä¸ª Sheet é¦è¡ A1 å«ãè´§è¿éããB1 å«ãæãã 任䏿¡ä»¶ä¸æ»¡è¶³ â æ´ä½åéèçæåº¦æ¨¡æ¿è§£æã - æ¯ä¸ªå¹´åº¦ Sheet çç»æï¼ä¸æ¹æ¯ãè´§è¿é(ä¸å¨)ãåï¼çº¦ 20 è¡ï¼ï¼ä¸æ¹æ¯ãå¨è½¬é(ä¸å¨å ¬é)ãåï¼**åä¸å¸å·åç¬¬äºæ¬¡åºç°å³è§ä¸ºå¨è½¬éå**ã - æ¥è¡¨æè¯ä¹ï¼**`2021-12` è¿ç±»ææ¾çæ¯è¯¥å¹´ 1â12 æçå ¨å¹´æ°æ®**ï¼`m01..m12` å ¨é¨æå¼ï¼ï¼ä¸æ¯ 12 æåæã该年æåææ°æ®çæä»½å³å®æå·ï¼2026 å¹´åªæ 1â8 æ â `2026-08`ï¼ã - ä¸å¹´åæï¼å¤å¹´åº¦æä»¶éèªå¨å**ä¸ä¸å¹´åº¦ Sheet**ï¼è¥ä¸ä¸å¹´åº¦ä¸åå¨ï¼å¦ 2021 æ 2020 Sheetï¼ï¼`last_*` 为空ã - åªè¡¥æä¸å¹´æ¶ï¼å¯å¦åä¸ä¸ªåªå«è¯¥å¹´ + ä¸ä¸å¹´ç临æ¶å·¥ä½ç°¿åå¯¼å ¥ï¼æ³¨æãè³å° 2 个 Sheetãè§åï¼ã ### 5.2 å ¬è·¯æ 客 H203-1ï¼`/api/import/passengerMonthly`ï¼ | æºæä»¶ | 夿³¨ | |--------|------| | `docs\å ¬è·¯æ 客\模æ¿_交ä¼ç»H203-1表_å ¬è·¯æ 客è¿è¾æåº¦ç产æ åµ.xlsx` | ç¨æ·ä¿®æ¹åçæ¨¡æ¿ | | `D:\æ¡é¢\æµè¯æ°æ®\å ¬è·¯æ 客\å «æ\å ¬è·¯æ 客è¿è¾æåº¦ç产æ åµï¼2026ï¼_2026-09-09 09_18_45.xls` | ç³»ç»å¯¼åºçèæ ¼å¼æ ·ä¾ | | `D:\éè¦å¯¼å ¥çæ°æ®\å ¬è·¯æ 客\*.xls` | åå²åæå¯¼åºæä»¶ | - è§£æ**æè¡¨å¤´ååå¼**ï¼`buildHeaderMap`ï¼ï¼å æ¤æ¨¡æ¿å¨ä¸é´æå/æ´ä½å³ç§»**ä¸ä¼**ç ´åå ¶å®å段ã - æ°æ¨¡æ¿å¨ãä¼ä¸åç§°ãåæ°å¢ 2 åï¼`ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç `ã`å¡«æ¥åä½`ï¼èæ ¼å¼æä»¶å ¶å®ä¹å¸¦è¿ä¸¤åï¼æ¤åä»£ç æªè¯»åï¼ã - å¿ éå缺失ä¼ç´æ¥æ¥éï¼ä¾å¦ééç±»åæ¶æç¤ºã表头缺å°å¿ éåãä¼ä¸åç§°ãã客è¿é_æ»è®¡ããã ### 5.3 å ¶å® - å¯¼å ¥å¤±è´¥å¿ é¡»å¨é¡µé¢æ¾ç¤º**è¡å·**ï¼ç¨æ·è¦æ±ï¼ï¼æ°å¢è§£æé»è¾æ¶ä¸è¦åæè¡å·ä¿¡æ¯ã --- ## å ãæ¥è¡¨çæ - ãæ±æ»å¤§è¡¨ãé¢è§å¼¹çªç± `ReportExport.vue` 渲æï¼ - å¼¹çªå **åªä¿çä¸å¼ ææ è¡¨**ï¼åç±» / ææ / æ°æ® / 忝ï¼ï¼ãä¸å£å¾ãä¹åä¸å渲æä»»ä½è¡¨æ ¼ï¼ - å¼¹çªæ¯ææå¨ï¼`v-dialog-drag` æä»¤ï¼ææ 颿 ï¼+ 10px åè§ã - 导åºä¾èµ**æ¯çæ¨¡æ¿æä»¶**ï¼`docs/çææ±æ»å¤§è¡¨/YYYYå¹´Mæéè·¯è¿è¾éæ±æ»è¡¨.xlsx`ãç¼ºå¤±æ¶æ¥ãæ¯çå®ä½å¤±è´¥ï¼æªæ¾å°æ¨¡æ¿æä»¶ãï¼**䏿¯æ°æ®é®é¢**ã - æ¥å£å±é¢èªæ¥ï¼ç»è¿å端ï¼å®ä½æ¯åç«¯è¿æ¯å端é®é¢ï¼ï¼ - é¢è§ï¼`GET /api/report/preview?period=2026-08&mode=month&types=summaryWorkbook` - 导åºï¼`GET /api/report/export/summaryWorkbook?...` - 失败æç¤ºå·²ç»åï¼è½åºåãè¿ä¸ä¸æå¡å¨ãåãå端è¿åçå ·ä½åå ãï¼å¯¼åºæ¥å£æ¯ `responseType:'blob'`ï¼æ¥éæ¶ `data` 乿¯ Blobï¼å¿ é¡»å `text()` åè§£æã --- ## ä¸ãç»å½ä¸éªè¯ç | é®é¢ | åå | å¤ç½® | |------|------|------| | ç»å½é¡µåºç°ç©ºç½æ¹æ¡ + ãéªè¯ç å 载失败ï¼è¯·æ£æ¥ç½ç»ã | å端 `captchaRequired` é»è®¤ `true`ï¼è¯»å `/api/auth/captcha-config` 失败æ¶éé»å¿½ç¥ï¼é¡µé¢æ®çå è½½ä¸åºæ¥çéªè¯ç æ¡ | é»è®¤å¼æ¹ `false`ï¼æ¹ä¸º fail-safeï¼åªæå端æç¡®è¿å `required === true` ææ¾ç¤ºï¼è¯·æ±å¤±è´¥æãä¸éè¦éªè¯ç ãå¤ç | | å¼å ³ä½ç½® | å端 `application.yml` ç `app.captcha.required` | å ³æååºæ¾ç¤ºãæµè¯æ¨¡å¼ï¼è¡ä¸ºéªè¯ç 已跳è¿ã | | æ¢ç½ç»/æ¢ IP åæ¥å£ 403 | è·¨åç½åå | CORS éæ¾è¡å ç½ç½æ®µï¼å·²ä¿®å¤ `0d2a5fc`ï¼ | --- ## å «ãæä»¶åå ¥ä¸ææ¬å¤ççå - æ¬æºæä»¶**æ¢è¡ç¬¦ä¸ç»ä¸**ï¼`Login.vue`ã`main.js` æ¯ CRLFï¼`ReportExport.vue`ã`DataImportService.java`ã`docs/*.md` æ¯ LFãç¨ `[System.IO.File]::WriteAllText` æ¶å¿ é¡»å¹é 忢è¡ç¬¦ï¼å¦ååç» `-replace` / å符串å¹é ä¼å¤±è´¥ã - `main.js` 带 BOMï¼`EF BB BF`ï¼ï¼æ¹åæ¶è¦ç¨ `New-Object System.Text.UTF8Encoding($true)`ã - **`git checkout -- <æä»¶>` 伿 LF 转æ CRLF**ï¼æ¬ä»åº `core.autocrlf=true`ï¼ï¼ä¼è®©åç»åºäº LF çæ¿æ¢å¤±æï¼æä½åå 确认ç宿¢è¡ç¬¦ã - PowerShell å¤è¡ä¸ææ¿æ¢å»ºè®®å `*.py` èæ¬ç¨ `python` æ§è¡ï¼`apply_patch` 卿¬æºä¸å¯ç¨ï¼ã - åç¬¦ä¸²æ¿æ¢**注æéç¹å¯ä¸æ§**ï¼`| enterprise_name | varchar(200) | ä¼ä¸åç§° |` å¨ `docs/database.md` åºç° 4 次ï¼ç´æ¥ replace 伿¹é表ï¼å¿ é¡»å æªåç®æ ç« èåæ¿æ¢ã - 读 `.xls`ï¼æ¬æº python æ `xlrd`ï¼å¯ç¨ Excel COMï¼`New-Object -ComObject Excel.Application` â `Workbooks.Open` â `Cells.Item(r,c).Text`ï¼è®°å¾ `Quit()` + `ReleaseComObject`ï¼ã --- ## ä¹ãæµè§å¨èªå¨ååè¯çå - `tab.playwright.evaluate()` 读 DOM æå¯ä¿¡ï¼AX æ å¯è½è¯»å°ç¼åã - Playwright locator 对 Element UI è¡¨æ ¼å æé®**ä¼è¶ æ¶**ï¼`isVisible()` æä¸º falseï¼ï¼æ¹ç¨ AX ç´¢å¼ `tab.click(index)`ã - `tab.drag([x1,y1],[x2,y2])` ææ½æ¶ï¼åæ å¿ é¡»è½å¨**å½åè§å£**å ï¼æ¬æºå 嵿µè§å¨è§å£å¾å°ï¼çº¦ 319Ã790ï¼ï¼å¦åæ¥ `Coordinate is outside the active tab content viewport`ã - `tab.click` ç AX ç´¢å¼**å¨é¡µé¢å·æ°åä¼å¤±æ**ï¼å¯è½å½ä¸å«çæ§ä»¶ï¼æ¯æ¬¡æä½åéæ° `cua.getTab(...)` åæ°ç´¢å¼ã - æªå¾ï¼`const fs = await import('fs'); fs.writeFileSync(path, Buffer.from(await tab.getScreenshot()))`ï¼`require` ä¸å¯ç¨ï¼ã - æ¹ `.vue` åéè¦ `tab.reload()`ã - 临æ¶èæ¬/æä»¶ï¼`_*.*`ï¼æªç»ç¨æ·åæ**ä¸è¦å **ã --- ## åãGit åä»åºå·¥ä½æµ | ä»åº | remote | 忝 | å°å | |------|--------|------|------| | 个人 | `origin` | `master` | `https://gitee.com/zhizhijie/traffic-audit.git` | | å ¬å¸ | `gitea` | `main` | `http://61.183.254.94:3000/r/trafficAudit.git`ï¼è´¦å· zyjï¼ | æ¯æ¬¡æ¹å¨çåºå®é¡ºåºï¼ 1. æµè¯ + åãåè½æµè¯æ¥åã + æ´æ°ã工使¥ç»ãï¼ 2. `git fetch origin` â å并个人ä»åºæ°æäº¤ï¼é¿å è¦çç¨æ·æ¹å¨ï¼ï¼ 3. `git fetch gitea` â ä¸è¿ç«¯ `main` 对æ¯åå¹¶ â **ç¦æ¢å¼ºæ¨**ï¼ 4. `git commit` â `git push`ã - åæ®åªèµ°æ¬æº git/ä¸´æ¶ askpassï¼**ç¦æ¢åè¿ä»åºä»»ä½æä»¶**ã - å ¬å¸ gitea ç½ç»ä¸éæ¶è®°å½ä¸ºéçé®é¢ï¼**ä¸è¦**ç¨å¼ºæ¨ç»è¿ã --- ## åä¸ãå½åå·²ç¥éçé®é¢ï¼æªè³ 2026-09-16ï¼ | # | é®é¢ | å½±å | ç¶æ | |---|------|------|------| | 1 | 8 ææºæä»¶ç¼º 2023 å¹´ Sheet | å·²ç¨ 7 ææä»¶è¡¥å½ `2023-12` è§£å³ | å·²è§£å³ | | 2 | 2026-01 ~ 2026-07 ç `last_*` 为空 | è¿å ææ¹å¨åå³ä¸ºç©ºï¼éæ¬æ¬¡å¼å ¥ | å¾ ç¨æ·ç¡®è®¤æ¯å¦è¡¥ | | 3 | 2026-01 ~ 2026-07 ç H203-1 `unified_credit_code` / `report_unit` 为空 | æ°åæ¬ææè¯»åï¼å岿æªåå¡« | å¾ ç¨æ·ç¡®è®¤æ¯å¦é导 | | 4 | é¢è§å¼¹çªãå ± 0 è¡ãä¸ãæåº¦è¦çï¼1~8æåææ°æ®ãå£å¾ä¸å | æè¯¯è§£ | å¾ ç¨æ·ç¡®è®¤æ¹ææ¡ | | 5 | å ¬å¸ gitea æ¨é | ç½ç»æ ååºï¼æªæ¨æå | å¾ è¡¥æ¨ | | 6 | ä»åºæ ¹ç®å½å¤§é `_*.*` ä¸´æ¶æä»¶ | ä½ç§¯/å¯è¯»æ§ | ç»ç¨æ·åæå忏 ç | traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataViewController.java
@@ -359,6 +359,8 @@ H2031_COLUMNS.add(col("regionCode", "æå±å°åº", 100)); H2031_COLUMNS.add(col("enterpriseCode", "ä¼ä¸ä»£ç ", 130)); H2031_COLUMNS.add(col("enterpriseName", "ä¼ä¸åç§°", 220)); H2031_COLUMNS.add(col("unifiedCreditCode", "ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç ", 180)); H2031_COLUMNS.add(col("reportUnit", "å¡«æ¥åä½", 160)); H2031_COLUMNS.add(col("vehicleTotal", "客è¿è½¦è¾å计", 110)); H2031_COLUMNS.add(col("seatTotal", "æ ¸å®è½½å®¢ä½å计", 130)); H2031_COLUMNS.add(col("vehicleSchedule", "ççº¿è½¦è¾æ°", 110)); traffic-audit-server/src/main/java/com/trafficaudit/dataimport/entity/PassengerEnterpriseMonthly.java
@@ -22,6 +22,10 @@ private String enterpriseCode; /** ä¼ä¸åç§° */ private String enterpriseName; /** ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç */ private String unifiedCreditCode; /** å¡«æ¥åä½ */ private String reportUnit; /** 客è¿è½¦è¾_æ»è®¡ */ private Integer vehicleTotal; traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
@@ -319,6 +319,9 @@ entity.setRegionCode(gs(row, colMap, "æå±å°åº")); entity.setEnterpriseCode(gs(row, colMap, "ä¼ä¸ä»£ç ")); entity.setEnterpriseName(name.trim()); // æ°ç模æ¿å¨ãä¼ä¸åç§°ãåæ°å¢äºä¸¤åï¼ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç /å¡«æ¥åä½ï¼ï¼æè¡¨å¤´åå¼ï¼èæ¨¡æ¿æ è¯¥åæ¶ä¸º null entity.setUnifiedCreditCode(gs(row, colMap, "ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç ")); entity.setReportUnit(gs(row, colMap, "å¡«æ¥åä½")); entity.setVehicleTotal(gi(row, colMap, "客è¿è½¦è¾_æ»è®¡")); entity.setSeatTotal(gi(row, colMap, "æ ¸å®è½½å®¢ä½_æ»è®¡")); entity.setVehicleSchedule(gi(row, colMap, "è½¦è¾æ°_客è¿ç车ï¼å«å®çº¿æ 游客è¿å®¢è½¦ï¼")); traffic-audit-web/src/directives/dialogDrag.js
New file @@ -0,0 +1,61 @@ /** * v-dialog-dragï¼è®© Element UI 2.x ç el-dialog è½ç¨æ 颿 æå¨ã * Element UI 2.x ç el-dialog 没æ draggable 屿§ï¼é£æ¯ Element Plus çåè½ï¼ï¼ * æä»¥è¿éç¨æä»¤å®ç°ï¼åªæ¹ .el-dialog ç transformï¼ä¸æ¹å¸å±ï¼ * å¼¹çªå ³éï¼wrapper 被置为 display:noneï¼æ¶èªå¨å¤ä½ï¼ä¸æ¬¡æå¼ä»å¨åä½ã * ç¨æ³ï¼<el-dialog v-dialog-drag custom-class="xxx"> */ export default { inserted(el) { const dialog = el.querySelector('.el-dialog') const header = el.querySelector('.el-dialog__header') if (!dialog || !header) return let startX = 0 let startY = 0 let baseX = 0 let baseY = 0 let curX = 0 let curY = 0 let dragging = false const reset = () => { curX = 0 curY = 0 dialog.style.transform = '' } const onMove = (e) => { if (!dragging) return curX = baseX + (e.clientX - startX) curY = baseY + (e.clientY - startY) dialog.style.transform = 'translate(' + curX + 'px, ' + curY + 'px)' if (e.preventDefault) e.preventDefault() } const onUp = () => { if (!dragging) return dragging = false document.removeEventListener('mousemove', onMove) document.removeEventListener('mouseup', onUp) } const onDown = (e) => { if (e.button !== 0) return const t = e.target if (t && t.closest && t.closest('.el-dialog__headerbtn')) return dragging = true startX = e.clientX startY = e.clientY baseX = curX baseY = curY document.addEventListener('mousemove', onMove) document.addEventListener('mouseup', onUp) if (e.preventDefault) e.preventDefault() } header.addEventListener('mousedown', onDown) if (typeof MutationObserver !== 'undefined') { const mo = new MutationObserver(() => { if (el.style.display === 'none') reset() }) mo.observe(el, { attributes: true, attributeFilter: ['style'] }) } } } traffic-audit-web/src/main.js
@@ -3,8 +3,10 @@ import 'element-ui/lib/theme-chalk/index.css' import App from './App.vue' import router from './router' import dialogDrag from './directives/dialogDrag' Vue.use(ElementUI) Vue.directive('dialog-drag', dialogDrag) // 让 el-dialog 坿å¨ï¼Element UI 2.x æ draggable 屿§ï¼ Vue.config.productionTip = false // å ¨å±ç»åºï¼æ¸ é¤ç»å½æå¹¶åç»å½é¡µï¼å页é¢ä¾§è¾¹æ ãéåºç»å½ãèåå ±ç¨ï¼ traffic-audit-web/src/views/Login.vue
@@ -40,16 +40,20 @@ captchaId: '', clickIds: [], loggingIn: false, captchaRequired: true captchaRequired: false } }, created() { // éªè¯ç æ¯å¦å¯ç¨ä¸å¾ä»¥å端 /api/auth/captcha-config 为åï¼ // é»è®¤ä¸æ¾ç¤ºï¼åªæå端æç¡®è¿å required=true ææ¸²æéªè¯ç ç»ä»¶ã // ä¿®å¤ï¼æ¤åé»è®¤ true ä¸è¯·æ±å¤±è´¥æ¶éé»å¿½ç¥ï¼åæ¢ç½ç»å该é 置读ä¸å°ï¼ // ç»å½é¡µå°±ä¼æ®çä¸ä¸ªå è½½ä¸åºæ¥çéªè¯ç ç½æ¡å¹¶æç¤ºâéªè¯ç å 载失败ï¼è¯·æ£æ¥ç½ç»âã axios.get('/api/auth/captcha-config', { timeout: 10000 }) .then(res => { const d = res.data if (d && d.code === 200) this.captchaRequired = d.data.required !== false this.captchaRequired = !!(d && d.code === 200 && d.data && d.data.required === true) }) .catch(() => {}) .catch(() => { this.captchaRequired = false }) }, methods: { onCaptchaVerified(payload) { traffic-audit-web/src/views/ReportExport.vue
@@ -99,7 +99,8 @@ </div> </el-alert> </div> <el-dialog :title="'é¢è§æ°æ® - ' + previewModule + 'ï¼' + previewPeriod + 'ï¼'" :visible.sync="previewVisible" width="760px"> <el-dialog :title="'é¢è§æ°æ® - ' + previewModule + 'ï¼' + previewPeriod + 'ï¼'" :visible.sync="previewVisible" width="760px" top="5vh" custom-class="pv-dialog" v-dialog-drag> <div class="preview-body"> <div v-for="it in previewItems" :key="it.key" class="preview-item"> <div class="preview-head"> @@ -114,7 +115,7 @@ </div> <table class="preview-summary wb-table" v-if="it.key === 'summaryWorkbook' && it.summary && it.summary.length"> <thead> <tr><th style="width:44%">ææ </th><th style="width:30%">æ°æ®</th><th>忝</th></tr> <tr><th style="width:12%">åç±»</th><th style="width:40%">ææ </th><th style="width:28%">æ°æ®</th><th>忝</th></tr> </thead> <tbody> <template v-for="(sec, si) in wbRows(it.summary)"> @@ -388,7 +389,7 @@ this.previewVisible = true this.loading = '' }) .catch(err => this.failWith(err)) .catch(err => this.failWith(err, 'é¢è§')) }, fmtVal(v) { if (v === null || v === undefined || v === '') return 'â' @@ -505,13 +506,45 @@ }) .catch(() => doExport()) }, failWith(err) { // é¢è§/导åºå¤±è´¥ç»ä¸æç¤ºï¼åºåâè¿ä¸ä¸æå¡å¨âä¸âå端è¿åçé误åå âã // å¯¼åºæ¥å£ç¨ responseType: 'blob'ï¼æ¥éæ¶ data 乿¯ Blobï¼å¿ é¡»å è¯»ææ¬åè§£æï¼ // å¦åæ¿ä¸å°å端çå®åå ï¼åªä¼æ¾ç¤ºç¬¼ç»çâè¯·ç¡®è®¤å·²å¯¼å ¥å¯¹åºæ°æ®âã failWith(err, action) { if (err && err._toast) { this.loading = ''; return } let msg = '' const d = err && err.response && err.response.data if (d && typeof d === 'object' && d.message) msg = d.message this.$message.error('导åºå¤±è´¥ï¼' + (msg || 'è¯·ç¡®è®¤å·²å¯¼å ¥å¯¹åºæ°æ®ï¼ææ¥çå端æ¥å¿')) this.loading = '' const act = action || '导åº' const finish = (reason) => { this.$message.error(act + '失败ï¼' + reason) this.loading = '' } if (!err || !err.response) { if (err && err.code === 'ECONNABORTED') { finish('请æ±è¶ æ¶ï¼è¯·ç¨åéè¯'); return } finish('æ æ³è¿æ¥æå¡å¨ï¼è¯·æ£æ¥ç½ç»è¿æ¥ï¼æç¡®è®¤å端æå¡æ¯å¦å·²å¯å¨') return } const d = err.response.data const fallback = 'è¯·ç¡®è®¤å·²å¯¼å ¥å¯¹åºæ°æ®ï¼ææ¥çå端æ¥å¿' if (d && typeof d.text === 'function') { Promise.resolve(d.text()).then(txt => finish(this.errReason(txt) || fallback)).catch(() => finish(fallback)) return } finish(this.errReason(typeof d === 'string' ? d : (d && d.message)) || fallback) }, // å端å¼å¸¸ååºå¯è½æ¯ JSON/HTML/çº¯ææ¬ï¼å°½éæååºå¯è¯»çåå errReason(raw) { if (!raw) return '' let text = String(raw).trim() if (text.charAt(0) === '{' || text.charAt(0) === '[') { try { const j = JSON.parse(text) if (j && j.message) return j.message } catch (e) { /* é JSONï¼æçº¯ææ¬å¤ç */ } } text = text.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim() // å¼å代ç/ç½ç»å±æ¥é转æäººè¯ï¼é¿å ç´æ¥æ ECONNREFUSED ä¹ç±»æç»ç¨æ· if (/ECONNREFUSED|ECONNRESET|Proxy error|socket hang up|Network Error|Failed to fetch/i.test(text)) { return 'æ æ³è¿æ¥æå¡å¨ï¼è¯·æ£æ¥ç½ç»è¿æ¥ï¼æç¡®è®¤å端æå¡æ¯å¦å·²å¯å¨' } return text.length > 200 ? text.slice(0, 200) + 'â¦' : text }, downloadBlob(res, fileName) { const isZip = /\.zip$/.test(fileName) @@ -579,3 +612,11 @@ .wb-yoy.yoy-empty { color:#C0C4CC; } .wb-note { color:#E6A23C; font-size:12px; margin:2px 0 8px; } </style> <style> /* é¢è§æ°æ®å¼¹çªï¼åè§ + å¯éè¿æ 颿 æå¨ï¼v-dialog-drag æä»¤ï¼ã ä¸è½åè¿ scopedï¼el-dialog é»è®¤ append-to-bodyï¼DOM æå¨ body ä¸ï¼scoped éæ©å¨å¹é ä¸å°ã */ .pv-dialog { border-radius: 10px; overflow: hidden; } .pv-dialog .el-dialog__header { cursor: move; user-select: none; -webkit-user-select: none; } .pv-dialog .el-dialog__headerbtn { cursor: pointer; } </style>