Selaa lähdekoodia

调整车辆单位划分逻辑

weijianghai 1 kuukausi sitten
vanhempi
commit
454007c49a
19 muutettua tiedostoa jossa 1314 lisäystä ja 1202 poistoa
  1. 7 5
      src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarBaoXianJob.java
  2. 7 5
      src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarDaWeiXiuJob.java
  3. 7 5
      src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarLuQiaoJob.java
  4. 7 5
      src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarNianJianFeiJob.java
  5. 7 5
      src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarQiTaJob.java
  6. 7 5
      src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarRanYouJob.java
  7. 7 5
      src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarWeiXiuJob.java
  8. 12 5
      src/main/java/com/nokia/finance/tasks/jobs/car/ruixing/CarBaoFeiJob.java
  9. 12 5
      src/main/java/com/nokia/finance/tasks/jobs/car/ruixing/CarBaseDataDayJob.java
  10. 12 5
      src/main/java/com/nokia/finance/tasks/jobs/car/ruixing/CarLiChengDayJob.java
  11. 12 5
      src/main/java/com/nokia/finance/tasks/jobs/car/ruixing/CarLiChengMonthJob.java
  12. 12 5
      src/main/java/com/nokia/finance/tasks/jobs/car/ruixing/CarWuDanYongCheJob.java
  13. 15 8
      src/main/java/com/nokia/finance/tasks/jobs/car/ruixing/CarYongCheJob.java
  14. 12 5
      src/main/java/com/nokia/finance/tasks/jobs/car/ruixing/CarYueJieJob.java
  15. 10 0
      src/main/java/com/nokia/finance/tasks/pojo/bo/car/CarUnitBo.java
  16. 187 148
      src/main/java/com/nokia/finance/tasks/service/car/CarService.java
  17. 371 371
      src/test/java/com/nokia/finance/tasks/car/CarGongCheShiYongTests3.java
  18. 203 203
      src/test/java/com/nokia/finance/tasks/car/CarJiaoTongBuTieTests.java
  19. 407 407
      src/test/java/com/nokia/finance/tasks/car/CarLianXuJiaYouTests.java

+ 7 - 5
src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarBaoXianJob.java

@@ -4,6 +4,7 @@ import com.nokia.finance.tasks.common.exception.MyRuntimeException;
 import com.nokia.finance.tasks.common.utils.psql.PsqlUtil;
 import com.nokia.finance.tasks.config.JobConfig;
 import com.nokia.finance.tasks.enums.DataStageEnum;
+import com.nokia.finance.tasks.pojo.bo.car.CarUnitBo;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.DataLogPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
@@ -196,17 +197,18 @@ public class CarBaoXianJob {
             String chePaiFail = carService.chePaiFail(rawChePaiHao);
             map.put("che_pai_fail", chePaiFail);
             String cheLiangSuoShuDanWei = map.get("dept_id");
-            String firstUnit = carService.getFirstUnit(cheLiangSuoShuDanWei);
+            CarUnitBo carUnitBo = carService.getCarUnitBo(cheLiangSuoShuDanWei);
+            String firstUnit = carService.getFirstUnit(carUnitBo);
             map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(cheLiangSuoShuDanWei, firstUnit);
+            String secondUnit = carService.getSecondUnit(carUnitBo, firstUnit);
             map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(cheLiangSuoShuDanWei, secondUnit);
+            String thirdUnit = carService.getThirdUnit(carUnitBo, secondUnit);
             map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, cheLiangSuoShuDanWei);
+            String areaNo = carService.getAreaNo(secondOrgs, firstUnit);
             map.put("area_no", areaNo);
             String areaName = carService.getOrgName(orgMap, areaNo);
             map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, cheLiangSuoShuDanWei);
+            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, carUnitBo);
             map.put("city_no", cityNo);
             String cityName = carService.getOrgName(orgMap, cityNo);
             map.put("city_name", cityName);

+ 7 - 5
src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarDaWeiXiuJob.java

@@ -4,6 +4,7 @@ import com.nokia.finance.tasks.common.exception.MyRuntimeException;
 import com.nokia.finance.tasks.common.utils.psql.PsqlUtil;
 import com.nokia.finance.tasks.config.JobConfig;
 import com.nokia.finance.tasks.enums.DataStageEnum;
+import com.nokia.finance.tasks.pojo.bo.car.CarUnitBo;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.DataLogPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
@@ -193,17 +194,18 @@ public class CarDaWeiXiuJob {
             String chePaiFail = carService.chePaiFail(rawChePaiHao);
             map.put("che_pai_fail", chePaiFail);
             String cheLiangSuoShuDanWei = map.get("vehicle_unit");
-            String firstUnit = carService.getFirstUnit(cheLiangSuoShuDanWei);
+            CarUnitBo carUnitBo = carService.getCarUnitBo(cheLiangSuoShuDanWei);
+            String firstUnit = carService.getFirstUnit(carUnitBo);
             map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(cheLiangSuoShuDanWei, firstUnit);
+            String secondUnit = carService.getSecondUnit(carUnitBo, firstUnit);
             map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(cheLiangSuoShuDanWei, secondUnit);
+            String thirdUnit = carService.getThirdUnit(carUnitBo, secondUnit);
             map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, cheLiangSuoShuDanWei);
+            String areaNo = carService.getAreaNo(secondOrgs, firstUnit);
             map.put("area_no", areaNo);
             String areaName = carService.getOrgName(orgMap, areaNo);
             map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, cheLiangSuoShuDanWei);
+            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, carUnitBo);
             map.put("city_no", cityNo);
             String cityName = carService.getOrgName(orgMap, cityNo);
             map.put("city_name", cityName);

+ 7 - 5
src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarLuQiaoJob.java

@@ -4,6 +4,7 @@ import com.nokia.finance.tasks.common.exception.MyRuntimeException;
 import com.nokia.finance.tasks.common.utils.psql.PsqlUtil;
 import com.nokia.finance.tasks.config.JobConfig;
 import com.nokia.finance.tasks.enums.DataStageEnum;
+import com.nokia.finance.tasks.pojo.bo.car.CarUnitBo;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.DataLogPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
@@ -192,17 +193,18 @@ public class CarLuQiaoJob {
             String chePaiFail = carService.chePaiFail(rawChePaiHao);
             map.put("che_pai_fail", chePaiFail);
             String cheLiangSuoShuDanWei = map.get("dept_id");
-            String firstUnit = carService.getFirstUnit(cheLiangSuoShuDanWei);
+            CarUnitBo carUnitBo = carService.getCarUnitBo(cheLiangSuoShuDanWei);
+            String firstUnit = carService.getFirstUnit(carUnitBo);
             map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(cheLiangSuoShuDanWei, firstUnit);
+            String secondUnit = carService.getSecondUnit(carUnitBo, firstUnit);
             map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(cheLiangSuoShuDanWei, secondUnit);
+            String thirdUnit = carService.getThirdUnit(carUnitBo, secondUnit);
             map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, cheLiangSuoShuDanWei);
+            String areaNo = carService.getAreaNo(secondOrgs, firstUnit);
             map.put("area_no", areaNo);
             String areaName = carService.getOrgName(orgMap, areaNo);
             map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, cheLiangSuoShuDanWei);
+            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, carUnitBo);
             map.put("city_no", cityNo);
             String cityName = carService.getOrgName(orgMap, cityNo);
             map.put("city_name", cityName);

+ 7 - 5
src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarNianJianFeiJob.java

@@ -4,6 +4,7 @@ import com.nokia.finance.tasks.common.exception.MyRuntimeException;
 import com.nokia.finance.tasks.common.utils.psql.PsqlUtil;
 import com.nokia.finance.tasks.config.JobConfig;
 import com.nokia.finance.tasks.enums.DataStageEnum;
+import com.nokia.finance.tasks.pojo.bo.car.CarUnitBo;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.DataLogPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
@@ -192,17 +193,18 @@ public class CarNianJianFeiJob {
             String chePaiFail = carService.chePaiFail(rawChePaiHao);
             map.put("che_pai_fail", chePaiFail);
             String cheLiangSuoShuDanWei = map.get("dept_id");
-            String firstUnit = carService.getFirstUnit(cheLiangSuoShuDanWei);
+            CarUnitBo carUnitBo = carService.getCarUnitBo(cheLiangSuoShuDanWei);
+            String firstUnit = carService.getFirstUnit(carUnitBo);
             map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(cheLiangSuoShuDanWei, firstUnit);
+            String secondUnit = carService.getSecondUnit(carUnitBo, firstUnit);
             map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(cheLiangSuoShuDanWei, secondUnit);
+            String thirdUnit = carService.getThirdUnit(carUnitBo, secondUnit);
             map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, cheLiangSuoShuDanWei);
+            String areaNo = carService.getAreaNo(secondOrgs, firstUnit);
             map.put("area_no", areaNo);
             String areaName = carService.getOrgName(orgMap, areaNo);
             map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, cheLiangSuoShuDanWei);
+            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, carUnitBo);
             map.put("city_no", cityNo);
             String cityName = carService.getOrgName(orgMap, cityNo);
             map.put("city_name", cityName);

+ 7 - 5
src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarQiTaJob.java

@@ -4,6 +4,7 @@ import com.nokia.finance.tasks.common.exception.MyRuntimeException;
 import com.nokia.finance.tasks.common.utils.psql.PsqlUtil;
 import com.nokia.finance.tasks.config.JobConfig;
 import com.nokia.finance.tasks.enums.DataStageEnum;
+import com.nokia.finance.tasks.pojo.bo.car.CarUnitBo;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.DataLogPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
@@ -192,17 +193,18 @@ public class CarQiTaJob {
             String chePaiFail = carService.chePaiFail(rawChePaiHao);
             map.put("che_pai_fail", chePaiFail);
             String cheLiangSuoShuDanWei = map.get("dept_id");
-            String firstUnit = carService.getFirstUnit(cheLiangSuoShuDanWei);
+            CarUnitBo carUnitBo = carService.getCarUnitBo(cheLiangSuoShuDanWei);
+            String firstUnit = carService.getFirstUnit(carUnitBo);
             map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(cheLiangSuoShuDanWei, firstUnit);
+            String secondUnit = carService.getSecondUnit(carUnitBo, firstUnit);
             map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(cheLiangSuoShuDanWei, secondUnit);
+            String thirdUnit = carService.getThirdUnit(carUnitBo, secondUnit);
             map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, cheLiangSuoShuDanWei);
+            String areaNo = carService.getAreaNo(secondOrgs, firstUnit);
             map.put("area_no", areaNo);
             String areaName = carService.getOrgName(orgMap, areaNo);
             map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, cheLiangSuoShuDanWei);
+            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, carUnitBo);
             map.put("city_no", cityNo);
             String cityName = carService.getOrgName(orgMap, cityNo);
             map.put("city_name", cityName);

+ 7 - 5
src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarRanYouJob.java

@@ -4,6 +4,7 @@ import com.nokia.finance.tasks.common.exception.MyRuntimeException;
 import com.nokia.finance.tasks.common.utils.psql.PsqlUtil;
 import com.nokia.finance.tasks.config.JobConfig;
 import com.nokia.finance.tasks.enums.DataStageEnum;
+import com.nokia.finance.tasks.pojo.bo.car.CarUnitBo;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.DataLogPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
@@ -194,17 +195,18 @@ public class CarRanYouJob {
             String chePaiFail = carService.chePaiFail(rawChePaiHao);
             map.put("che_pai_fail", chePaiFail);
             String cheLiangSuoShuDanWei = map.get("vehicle_unit");
-            String firstUnit = carService.getFirstUnit(cheLiangSuoShuDanWei);
+            CarUnitBo carUnitBo = carService.getCarUnitBo(cheLiangSuoShuDanWei);
+            String firstUnit = carService.getFirstUnit(carUnitBo);
             map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(cheLiangSuoShuDanWei, firstUnit);
+            String secondUnit = carService.getSecondUnit(carUnitBo, firstUnit);
             map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(cheLiangSuoShuDanWei, secondUnit);
+            String thirdUnit = carService.getThirdUnit(carUnitBo, secondUnit);
             map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, cheLiangSuoShuDanWei);
+            String areaNo = carService.getAreaNo(secondOrgs, firstUnit);
             map.put("area_no", areaNo);
             String areaName = carService.getOrgName(orgMap, areaNo);
             map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, cheLiangSuoShuDanWei);
+            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, carUnitBo);
             map.put("city_no", cityNo);
             String cityName = carService.getOrgName(orgMap, cityNo);
             map.put("city_name", cityName);

+ 7 - 5
src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarWeiXiuJob.java

@@ -4,6 +4,7 @@ import com.nokia.finance.tasks.common.exception.MyRuntimeException;
 import com.nokia.finance.tasks.common.utils.psql.PsqlUtil;
 import com.nokia.finance.tasks.config.JobConfig;
 import com.nokia.finance.tasks.enums.DataStageEnum;
+import com.nokia.finance.tasks.pojo.bo.car.CarUnitBo;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.DataLogPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
@@ -193,17 +194,18 @@ public class CarWeiXiuJob {
             String chePaiFail = carService.chePaiFail(rawChePaiHao);
             map.put("che_pai_fail", chePaiFail);
             String cheLiangSuoShuDanWei = map.get("organization");
-            String firstUnit = carService.getFirstUnit(cheLiangSuoShuDanWei);
+            CarUnitBo carUnitBo = carService.getCarUnitBo(cheLiangSuoShuDanWei);
+            String firstUnit = carService.getFirstUnit(carUnitBo);
             map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(cheLiangSuoShuDanWei, firstUnit);
+            String secondUnit = carService.getSecondUnit(carUnitBo, firstUnit);
             map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(cheLiangSuoShuDanWei, secondUnit);
+            String thirdUnit = carService.getThirdUnit(carUnitBo, secondUnit);
             map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, cheLiangSuoShuDanWei);
+            String areaNo = carService.getAreaNo(secondOrgs, firstUnit);
             map.put("area_no", areaNo);
             String areaName = carService.getOrgName(orgMap, areaNo);
             map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, cheLiangSuoShuDanWei);
+            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, carUnitBo);
             map.put("city_no", cityNo);
             String cityName = carService.getOrgName(orgMap, cityNo);
             map.put("city_name", cityName);

+ 12 - 5
src/main/java/com/nokia/finance/tasks/jobs/car/ruixing/CarBaoFeiJob.java

@@ -4,6 +4,7 @@ import com.nokia.finance.tasks.common.exception.MyRuntimeException;
 import com.nokia.finance.tasks.common.utils.psql.PsqlUtil;
 import com.nokia.finance.tasks.config.JobConfig;
 import com.nokia.finance.tasks.enums.DataStageEnum;
+import com.nokia.finance.tasks.pojo.bo.car.CarUnitBo;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.DataLogPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
@@ -177,6 +178,7 @@ public class CarBaoFeiJob {
             }
             // 遍历行
             for (int i = 1; i <= lastRowNum; i++) {
+                log.debug("row: {}", i);
                 Row row = sheet.getRow(i);
                 if (row == null || row.getCell(0) == null) {
                     continue;
@@ -184,6 +186,7 @@ public class CarBaoFeiJob {
                 Map<String, String> rowMap = new LinkedHashMap<>();
                 // 遍历列
                 for (int j = 0; j < columnCount; j++) {
+                    log.debug("column: {}", j);
                     String cellValue = "";
                     rowMap.put(headers.get(j), cellValue);
                     Cell cell = row.getCell(j);
@@ -249,17 +252,21 @@ public class CarBaoFeiJob {
             String chePaiFail = carService.chePaiFail(rawChePaiHao);
             map.put("che_pai_fail", chePaiFail);
             String cheLiangSuoShuDanWei = map.get("che_liang_suo_shu_dan_wei");
-            String firstUnit = carService.getFirstUnit(cheLiangSuoShuDanWei);
+            CarUnitBo carUnitBo = carService.getCarUnitBo(cheLiangSuoShuDanWei);
+            String firstUnit = carService.getFirstUnit(carUnitBo);
+            if (!StringUtils.hasText(firstUnit)) {
+                throw new MyRuntimeException("车辆单位错误:" + rawChePaiHao + " " + cheLiangSuoShuDanWei);
+            }
             map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(cheLiangSuoShuDanWei, firstUnit);
+            String secondUnit = carService.getSecondUnit(carUnitBo, firstUnit);
             map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(cheLiangSuoShuDanWei, secondUnit);
+            String thirdUnit = carService.getThirdUnit(carUnitBo, secondUnit);
             map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, cheLiangSuoShuDanWei);
+            String areaNo = carService.getAreaNo(secondOrgs, firstUnit);
             map.put("area_no", areaNo);
             String areaName = carService.getOrgName(orgMap, areaNo);
             map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, cheLiangSuoShuDanWei);
+            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, carUnitBo);
             map.put("city_no", cityNo);
             String cityName = carService.getOrgName(orgMap, cityNo);
             map.put("city_name", cityName);

+ 12 - 5
src/main/java/com/nokia/finance/tasks/jobs/car/ruixing/CarBaseDataDayJob.java

@@ -4,6 +4,7 @@ import com.nokia.finance.tasks.common.exception.MyRuntimeException;
 import com.nokia.finance.tasks.common.utils.psql.PsqlUtil;
 import com.nokia.finance.tasks.config.JobConfig;
 import com.nokia.finance.tasks.enums.DataStageEnum;
+import com.nokia.finance.tasks.pojo.bo.car.CarUnitBo;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.DataLogPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
@@ -185,6 +186,7 @@ public class CarBaseDataDayJob {
             }
             // 遍历行
             for (int i = 1; i <= lastRowNum; i++) {
+                log.debug("row: {}", i);
                 Row row = sheet.getRow(i);
                 if (row == null || row.getCell(0) == null) {
                     continue;
@@ -192,6 +194,7 @@ public class CarBaseDataDayJob {
                 Map<String, String> rowMap = new LinkedHashMap<>();
                 // 遍历列
                 for (int j = 0; j < columnCount; j++) {
+                    log.debug("column: {}", j);
                     String cellValue = "";
                     rowMap.put(headers.get(j), cellValue);
                     Cell cell = row.getCell(j);
@@ -271,17 +274,21 @@ public class CarBaseDataDayJob {
             String chePaiFail = carService.chePaiFail(rawChePaiHao);
             map.put("che_pai_fail", chePaiFail);
             String cheLiangSuoShuDanWei = map.get("che_liang_suo_shu_dan_wei");
-            String firstUnit = carService.getFirstUnit(cheLiangSuoShuDanWei);
+            CarUnitBo carUnitBo = carService.getCarUnitBo(cheLiangSuoShuDanWei);
+            String firstUnit = carService.getFirstUnit(carUnitBo);
+            if (!StringUtils.hasText(firstUnit)) {
+                throw new MyRuntimeException("车辆单位错误:" + rawChePaiHao + " " + cheLiangSuoShuDanWei);
+            }
             map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(cheLiangSuoShuDanWei, firstUnit);
+            String secondUnit = carService.getSecondUnit(carUnitBo, firstUnit);
             map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(cheLiangSuoShuDanWei, secondUnit);
+            String thirdUnit = carService.getThirdUnit(carUnitBo, secondUnit);
             map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, cheLiangSuoShuDanWei);
+            String areaNo = carService.getAreaNo(secondOrgs, firstUnit);
             map.put("area_no", areaNo);
             String areaName = carService.getOrgName(orgMap, areaNo);
             map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, cheLiangSuoShuDanWei);
+            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, carUnitBo);
             map.put("city_no", cityNo);
             String cityName = carService.getOrgName(orgMap, cityNo);
             map.put("city_name", cityName);

+ 12 - 5
src/main/java/com/nokia/finance/tasks/jobs/car/ruixing/CarLiChengDayJob.java

@@ -4,6 +4,7 @@ import com.nokia.finance.tasks.common.exception.MyRuntimeException;
 import com.nokia.finance.tasks.common.utils.psql.PsqlUtil;
 import com.nokia.finance.tasks.config.JobConfig;
 import com.nokia.finance.tasks.enums.DataStageEnum;
+import com.nokia.finance.tasks.pojo.bo.car.CarUnitBo;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.DataLogPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
@@ -178,6 +179,7 @@ public class CarLiChengDayJob {
             }
             // 遍历行
             for (int i = 1; i <= lastRowNum; i++) {
+                log.debug("row: {}", i);
                 Row row = sheet.getRow(i);
                 if (row == null || row.getCell(0) == null) {
                     continue;
@@ -185,6 +187,7 @@ public class CarLiChengDayJob {
                 Map<String, String> rowMap = new LinkedHashMap<>();
                 // 遍历列
                 for (int j = 0; j < headersSize; j++) {
+                    log.debug("column: {}", j);
                     String cellValue = "";
                     rowMap.put(headers.get(j), cellValue);
                     Cell cell = row.getCell(j);
@@ -261,17 +264,21 @@ public class CarLiChengDayJob {
             String chePaiFail = carService.chePaiFail(rawChePaiHao);
             map.put("che_pai_fail", chePaiFail);
             String cheLiangSuoShuDanWei = map.get("che_liang_suo_shu_dan_wei");
-            String firstUnit = carService.getFirstUnit(cheLiangSuoShuDanWei);
+            CarUnitBo carUnitBo = carService.getCarUnitBo(cheLiangSuoShuDanWei);
+            String firstUnit = carService.getFirstUnit(carUnitBo);
+            if (!StringUtils.hasText(firstUnit)) {
+                throw new MyRuntimeException("车辆单位错误:" + rawChePaiHao + " " + cheLiangSuoShuDanWei);
+            }
             map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(cheLiangSuoShuDanWei, firstUnit);
+            String secondUnit = carService.getSecondUnit(carUnitBo, firstUnit);
             map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(cheLiangSuoShuDanWei, secondUnit);
+            String thirdUnit = carService.getThirdUnit(carUnitBo, secondUnit);
             map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, cheLiangSuoShuDanWei);
+            String areaNo = carService.getAreaNo(secondOrgs, firstUnit);
             map.put("area_no", areaNo);
             String areaName = carService.getOrgName(orgMap, areaNo);
             map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, cheLiangSuoShuDanWei);
+            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, carUnitBo);
             map.put("city_no", cityNo);
             String cityName = carService.getOrgName(orgMap, cityNo);
             map.put("city_name", cityName);

+ 12 - 5
src/main/java/com/nokia/finance/tasks/jobs/car/ruixing/CarLiChengMonthJob.java

@@ -4,6 +4,7 @@ import com.nokia.finance.tasks.common.exception.MyRuntimeException;
 import com.nokia.finance.tasks.common.utils.psql.PsqlUtil;
 import com.nokia.finance.tasks.config.JobConfig;
 import com.nokia.finance.tasks.enums.DataStageEnum;
+import com.nokia.finance.tasks.pojo.bo.car.CarUnitBo;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.DataLogPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
@@ -187,6 +188,7 @@ public class CarLiChengMonthJob {
             }
             // 遍历行
             for (int i = 1; i <= lastRowNum; i++) {
+                log.debug("row: {}", i);
                 Row row = sheet.getRow(i);
                 if (row == null || row.getCell(0) == null) {
                     continue;
@@ -194,6 +196,7 @@ public class CarLiChengMonthJob {
                 Map<String, String> rowMap = new LinkedHashMap<>();
                 // 遍历列
                 for (int j = 0; j < columnCount; j++) {
+                    log.debug("column: {}", j);
                     String cellValue = "";
                     rowMap.put(headers.get(j), cellValue);
                     Cell cell = row.getCell(j);
@@ -264,17 +267,21 @@ public class CarLiChengMonthJob {
             String chePaiFail = carService.chePaiFail(rawChePaiHao);
             map.put("che_pai_fail", chePaiFail);
             String cheLiangSuoShuDanWei = map.get("che_liang_suo_shu_dan_wei");
-            String firstUnit = carService.getFirstUnit(cheLiangSuoShuDanWei);
+            CarUnitBo carUnitBo = carService.getCarUnitBo(cheLiangSuoShuDanWei);
+            String firstUnit = carService.getFirstUnit(carUnitBo);
+            if (!StringUtils.hasText(firstUnit)) {
+                throw new MyRuntimeException("车辆单位错误:" + rawChePaiHao + " " + cheLiangSuoShuDanWei);
+            }
             map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(cheLiangSuoShuDanWei, firstUnit);
+            String secondUnit = carService.getSecondUnit(carUnitBo, firstUnit);
             map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(cheLiangSuoShuDanWei, secondUnit);
+            String thirdUnit = carService.getThirdUnit(carUnitBo, secondUnit);
             map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, cheLiangSuoShuDanWei);
+            String areaNo = carService.getAreaNo(secondOrgs, firstUnit);
             map.put("area_no", areaNo);
             String areaName = carService.getOrgName(orgMap, areaNo);
             map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, cheLiangSuoShuDanWei);
+            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, carUnitBo);
             map.put("city_no", cityNo);
             String cityName = carService.getOrgName(orgMap, cityNo);
             map.put("city_name", cityName);

+ 12 - 5
src/main/java/com/nokia/finance/tasks/jobs/car/ruixing/CarWuDanYongCheJob.java

@@ -4,6 +4,7 @@ import com.nokia.finance.tasks.common.exception.MyRuntimeException;
 import com.nokia.finance.tasks.common.utils.psql.PsqlUtil;
 import com.nokia.finance.tasks.config.JobConfig;
 import com.nokia.finance.tasks.enums.DataStageEnum;
+import com.nokia.finance.tasks.pojo.bo.car.CarUnitBo;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.DataLogPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
@@ -174,6 +175,7 @@ public class CarWuDanYongCheJob {
             }
             // 遍历行
             for (int i = 1; i <= lastRowNum; i++) {
+                log.debug("row: {}", i);
                 Row row = sheet.getRow(i);
                 if (row == null || row.getCell(0) == null) {
                     continue;
@@ -181,6 +183,7 @@ public class CarWuDanYongCheJob {
                 Map<String, String> rowMap = new LinkedHashMap<>();
                 // 遍历列
                 for (int j = 0; j < columnCount; j++) {
+                    log.debug("column: {}", j);
                     String header = headers.get(j);
                     String cellValue = "";
                     rowMap.put(header, cellValue);
@@ -252,17 +255,21 @@ public class CarWuDanYongCheJob {
             String chePaiFail = carService.chePaiFail(rawChePaiHao);
             map.put("che_pai_fail", chePaiFail);
             String cheLiangSuoShuDanWei = map.get("che_liang_suo_shu_dan_wei");
-            String firstUnit = carService.getFirstUnit(cheLiangSuoShuDanWei);
+            CarUnitBo carUnitBo = carService.getCarUnitBo(cheLiangSuoShuDanWei);
+            String firstUnit = carService.getFirstUnit(carUnitBo);
+            if (!StringUtils.hasText(firstUnit)) {
+                throw new MyRuntimeException("车辆单位错误:" + rawChePaiHao + " " + cheLiangSuoShuDanWei);
+            }
             map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(cheLiangSuoShuDanWei, firstUnit);
+            String secondUnit = carService.getSecondUnit(carUnitBo, firstUnit);
             map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(cheLiangSuoShuDanWei, secondUnit);
+            String thirdUnit = carService.getThirdUnit(carUnitBo, secondUnit);
             map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, cheLiangSuoShuDanWei);
+            String areaNo = carService.getAreaNo(secondOrgs, firstUnit);
             map.put("area_no", areaNo);
             String areaName = carService.getOrgName(orgMap, areaNo);
             map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, cheLiangSuoShuDanWei);
+            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, carUnitBo);
             map.put("city_no", cityNo);
             String cityName = carService.getOrgName(orgMap, cityNo);
             map.put("city_name", cityName);

+ 15 - 8
src/main/java/com/nokia/finance/tasks/jobs/car/ruixing/CarYongCheJob.java

@@ -4,6 +4,7 @@ import com.nokia.finance.tasks.common.exception.MyRuntimeException;
 import com.nokia.finance.tasks.common.utils.psql.PsqlUtil;
 import com.nokia.finance.tasks.config.JobConfig;
 import com.nokia.finance.tasks.enums.DataStageEnum;
+import com.nokia.finance.tasks.pojo.bo.car.CarUnitBo;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.DataLogPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
@@ -186,6 +187,7 @@ public class CarYongCheJob {
             }
             // 遍历行
             for (int i = 1; i <= lastRowNum; i++) {
+                log.debug("row: {}", i);
                 Row row = sheet.getRow(i);
                 if (row == null || row.getCell(0) == null) {
                     continue;
@@ -193,6 +195,7 @@ public class CarYongCheJob {
                 Map<String, String> rowMap = new LinkedHashMap<>();
                 // 遍历列
                 for (int j = 0; j < columnCount; j++) {
+                    log.debug("column: {}", j);
                     String header = headers.get(j);
                     String cellValue = "";
                     rowMap.put(header, cellValue);
@@ -290,18 +293,22 @@ public class CarYongCheJob {
             map.put("che_pai_hao", chePaiHao);
             String chePaiFail = carService.chePaiFail(rawChePaiHao);
             map.put("che_pai_fail", chePaiFail);
-            String yongCheBuMen = map.get("yong_che_bu_men");
-            String firstUnit = carService.getFirstUnit(yongCheBuMen);
+            String cheLiangSuoShuDanWei = map.get("yong_che_bu_men");
+            CarUnitBo carUnitBo = carService.getCarUnitBo(cheLiangSuoShuDanWei);
+            String firstUnit = carService.getFirstUnit(carUnitBo);
+            if (!StringUtils.hasText(firstUnit)) {
+                throw new MyRuntimeException("车辆单位错误:" + rawChePaiHao + " " + cheLiangSuoShuDanWei);
+            }
             map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(yongCheBuMen, firstUnit);
+            String secondUnit = carService.getSecondUnit(carUnitBo, firstUnit);
             map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(yongCheBuMen, secondUnit);
+            String thirdUnit = carService.getThirdUnit(carUnitBo, secondUnit);
             map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, yongCheBuMen);
+            String areaNo = carService.getAreaNo(secondOrgs, firstUnit);
             map.put("area_no", areaNo);
             String areaName = carService.getOrgName(orgMap, areaNo);
             map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, yongCheBuMen);
+            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, carUnitBo);
             map.put("city_no", cityNo);
             String cityName = carService.getOrgName(orgMap, cityNo);
             map.put("city_name", cityName);
@@ -309,11 +316,11 @@ public class CarYongCheJob {
             map.put("area_no2", areaNo2);
             String areaName2 = carService.getOrgName(orgMap, areaNo2);
             map.put("area_name2", areaName2);
-            String cityId = carService.getCityId(cities, yongCheBuMen);
+            String cityId = carService.getCityId(cities, cheLiangSuoShuDanWei);
             map.put("city_id", cityId);
             String city = carService.getAreaName(areaMap, cityId);
             map.put("city", city);
-            String districtId = carService.getDistrictId(districtListMap, cityId, cityName, yongCheBuMen);
+            String districtId = carService.getDistrictId(districtListMap, cityId, cityName, cheLiangSuoShuDanWei);
             map.put("district_id", districtId);
             String district = carService.getAreaName(areaMap, districtId);
             map.put("district", district);

+ 12 - 5
src/main/java/com/nokia/finance/tasks/jobs/car/ruixing/CarYueJieJob.java

@@ -4,6 +4,7 @@ import com.nokia.finance.tasks.common.exception.MyRuntimeException;
 import com.nokia.finance.tasks.common.utils.psql.PsqlUtil;
 import com.nokia.finance.tasks.config.JobConfig;
 import com.nokia.finance.tasks.enums.DataStageEnum;
+import com.nokia.finance.tasks.pojo.bo.car.CarUnitBo;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.DataLogPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
@@ -175,6 +176,7 @@ public class CarYueJieJob {
             }
             // 遍历行
             for (int i = 1; i <= lastRowNum; i++) {
+                log.debug("row: {}", i);
                 Row row = sheet.getRow(i);
                 if (row == null || row.getCell(0) == null) {
                     continue;
@@ -182,6 +184,7 @@ public class CarYueJieJob {
                 Map<String, String> rowMap = new LinkedHashMap<>();
                 // 遍历列
                 for (int j = 0; j < columnCount; j++) {
+                    log.debug("column: {}", j);
                     String header = headers.get(j);
                     String cellValue = "";
                     rowMap.put(header, cellValue);
@@ -253,17 +256,21 @@ public class CarYueJieJob {
             String chePaiFail = carService.chePaiFail(rawChePaiHao);
             map.put("che_pai_fail", chePaiFail);
             String cheLiangSuoShuDanWei = map.get("che_liang_suo_shu_dan_wei");
-            String firstUnit = carService.getFirstUnit(cheLiangSuoShuDanWei);
+            CarUnitBo carUnitBo = carService.getCarUnitBo(cheLiangSuoShuDanWei);
+            String firstUnit = carService.getFirstUnit(carUnitBo);
+            if (!StringUtils.hasText(firstUnit)) {
+                throw new MyRuntimeException("车辆单位错误:" + rawChePaiHao + " " + cheLiangSuoShuDanWei);
+            }
             map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(cheLiangSuoShuDanWei, firstUnit);
+            String secondUnit = carService.getSecondUnit(carUnitBo, firstUnit);
             map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(cheLiangSuoShuDanWei, secondUnit);
+            String thirdUnit = carService.getThirdUnit(carUnitBo, secondUnit);
             map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, cheLiangSuoShuDanWei);
+            String areaNo = carService.getAreaNo(secondOrgs, firstUnit);
             map.put("area_no", areaNo);
             String areaName = carService.getOrgName(orgMap, areaNo);
             map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, cheLiangSuoShuDanWei);
+            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, carUnitBo);
             map.put("city_no", cityNo);
             String cityName = carService.getOrgName(orgMap, cityNo);
             map.put("city_name", cityName);

+ 10 - 0
src/main/java/com/nokia/finance/tasks/pojo/bo/car/CarUnitBo.java

@@ -0,0 +1,10 @@
+package com.nokia.finance.tasks.pojo.bo.car;
+
+import lombok.Data;
+
+@Data
+public class CarUnitBo {
+    private String firstUnit;
+    private String secondUnit;
+    private String thirdUnit;
+}

+ 187 - 148
src/main/java/com/nokia/finance/tasks/service/car/CarService.java

@@ -4,14 +4,15 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.type.TypeFactory;
 import com.nokia.finance.tasks.common.exception.MyRuntimeException;
+import com.nokia.finance.tasks.pojo.bo.car.CarUnitBo;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
@@ -34,6 +35,10 @@ public class CarService {
     static final Pattern CHE_PAI_PATTERN = Pattern.compile(
             "([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z][A-Z](([DF]((?![IO])[A-Z0-9](?![IO]))\\d{4})|(\\d{5}[DF]))|[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z][A-Z][A-Z0-9]{4}[A-Z0-9挂学警港澳])"
     );
+    /**
+     * 原始一级单位:系统一级单位
+     */
+    static final Map<String, String> FIRST_UNIT_MAP;
 
     /**
      * 一级单位的二级单位字典
@@ -42,6 +47,30 @@ public class CarService {
 
     static {
         try {
+            FIRST_UNIT_MAP = new ObjectMapper().readValue(
+                    """
+{
+  "保定市分公司": "保定",
+  "沧州市分公司": "沧州",
+  "承德市分公司": "承德",
+  "邯郸市分公司": "邯郸",
+  "河北省分公司线路维护中心": "机动局",
+  "河北省机动通信局": "机动局",
+  "衡水市分公司": "衡水",
+  "华北基地建设部": "华北基地建设部",
+  "廊坊市分公司": "廊坊",
+  "秦皇岛市分公司": "秦皇岛",
+  "省公司本部": "省公司本部",
+  "石家庄市分公司": "石家庄",
+  "唐山市分公司": "唐山",
+  "邢台市分公司": "邢台",
+  "雄安基地建设部": "雄安基地建设部",
+  "雄安新区分公司": "雄安",
+  "张家口市分公司": "张家口"
+}
+                            """,
+                    TypeFactory.defaultInstance().constructMapType(Map.class, String.class, String.class)
+            );
             ER_JI_MAP = new ObjectMapper().readValue(
                     """
 {
@@ -119,85 +148,90 @@ public class CarService {
     }
 
     /**
-     * 获取一级单位
-     * @param unit 单位
+     * 分割车辆单位
+     * @param unit 车辆单位
      */
-    public String getFirstUnit(String unit) {
+    public CarUnitBo getCarUnitBo(String unit) {
         if (!StringUtils.hasText(unit)) {
-            return "";
-        }
-        if (unit.contains("机动通信局") || unit.contains("机动局") || unit.contains("传输局") || unit.contains("线路维护中心")) {
-            return "机动局";
-        }
-        if (unit.contains("雄安基地建设部")) {
-            return "雄安基地建设部";
-        }
-        if (unit.contains("华北基地建设部")) {
-            return "华北基地建设部";
-        }
-        for (String yj : ER_JI_MAP.keySet()) {
-            if (unit.contains(yj)) {
-                return yj;
-            }
-        }
-        return "省公司本部";
+            return null;
+        }
+        String[] split = unit.split("_");
+        int length = split.length;
+        if (length == 1) {
+            log.warn("车辆单位异常:{}", unit);
+            return null;
+        }
+        CarUnitBo carUnitBo = new CarUnitBo();
+        carUnitBo.setFirstUnit(length >= 2 ? split[1] : null);
+        carUnitBo.setSecondUnit(length >= 3 ? split[2] : null);
+        carUnitBo.setThirdUnit(length >= 4 ? split[3] : null);
+        return carUnitBo;
+    }
+
+    /**
+     * 获取一级单位
+     * @param carUnitBo 单位
+     */
+    public String getFirstUnit(CarUnitBo carUnitBo) {
+        return FIRST_UNIT_MAP.get(carUnitBo.getFirstUnit());
     }
 
     /**
      * 获取而二级单位
-     * @param unit 单位
+     * @param carUnitBo 单位
      * @param firstUnit 一级单位
      */
-    public String getSecondUnit(String unit, String firstUnit) {
-        if (!StringUtils.hasText(unit)) {
-            return "";
+    public String getSecondUnit(CarUnitBo carUnitBo, String firstUnit) {
+        if (carUnitBo == null || !StringUtils.hasText(firstUnit)) {
+            return null;
         }
-        if ("省公司本部".equals(firstUnit)) {
+        if (org.apache.commons.lang3.StringUtils.equalsAny(firstUnit, "华北基地建设部", "雄安基地建设部", "省公司本部")) {
             return firstUnit;
         }
+        String secondUnit = carUnitBo.getSecondUnit();
+        if (!StringUtils.hasText(secondUnit)) {
+            return firstUnit + "本部";
+        }
         if ("机动局".equals(firstUnit)) {
             for (String yj : ER_JI_MAP.keySet()) {
-                if (unit.contains(yj)) {
+                if (secondUnit.contains(yj)) {
                     return "机动局" + yj;
                 }
             }
             return "机动局本部";
         }
         if ("石家庄".equals(firstUnit)) {
-            if (unit.contains("开发区")) {
+            if (secondUnit.contains("开发区")) {
                 return "石家庄开发区";
             }
         }
         if ("廊坊".equals(firstUnit)) {
-            if (unit.contains("开发区")) {
+            if (secondUnit.contains("开发区")) {
                 return "廊坊开发区";
             }
         }
         if ("邢台".equals(firstUnit)) {
-            if (unit.contains("内丘")) {
+            if (secondUnit.contains("内丘")) {
                 return "内邱";
             }
-            if (unit.contains("任泽")) {
+            if (secondUnit.contains("任泽")) {
                 return "任县";
             }
         }
         if ("唐山".equals(firstUnit)) {
-            if (unit.contains("高开区")) {
+            if (secondUnit.contains("高开区")) {
                 return "唐山高开区";
             }
-            if (unit.contains("滦州")) {
+            if (secondUnit.contains("滦州")) {
                 return "滦县";
             }
         }
-        List<String> ejs = ER_JI_MAP.get(firstUnit);
-        if (CollectionUtils.isEmpty(ejs)) {
-            return firstUnit;
-        }
+        List<String> ejs = ER_JI_MAP.getOrDefault(firstUnit, Collections.emptyList());
         if ("雄安".equals(firstUnit)) {
-            unit = unit.replace("雄安新区", "");
+            secondUnit = secondUnit.replace("雄安新区", "");
         }
         for (String ej : ejs) {
-            if (unit.contains(ej)) {
+            if (secondUnit.contains(ej)) {
                 return ej;
             }
         }
@@ -206,44 +240,34 @@ public class CarService {
 
     /**
      * 获取三级单位
-     * @param unit 单位
+     * @param carUnitBo 单位
      * @param secondUnit 二级单位
      */
-    public String getThirdUnit(String unit, String secondUnit) {
-        if (!StringUtils.hasText(unit)) {
-            return secondUnit;
-        }
-        String[] a = unit.split("_");
-        if (a.length == 1) {
-            return unit;
-        }
-        if (a.length < 4) {
-            return secondUnit;
-        }
-        return a[3];
+    public String getThirdUnit(CarUnitBo carUnitBo, String secondUnit) {
+        return carUnitBo != null && StringUtils.hasText(carUnitBo.getThirdUnit()) ? carUnitBo.getThirdUnit() : secondUnit;
     }
 
     /**
      * 获取二级组织机构编码
      * @param secondOrgs 二级组织机构列表
-     * @param unit 单位
+     * @param firstUnit 一级单位
      */
-    public String getAreaNo(List<OrganizationPo> secondOrgs, String unit) {
-        if (!StringUtils.hasText(unit)) {
-            return "";
+    public String getAreaNo(List<OrganizationPo> secondOrgs, String firstUnit) {
+        if (!StringUtils.hasText(firstUnit)) {
+            return null;
         }
-        if (unit.contains("机动通信局") || unit.contains("机动局") || unit.contains("传输局") || unit.contains("线路维护中心")) {
+        if ("机动局".equals(firstUnit)) {
             return "-11";
         }
-        if (unit.contains("省公司本部") || unit.contains("雄安基地建设部") || unit.contains("华北基地建设部")) {
+        if ("省公司本部".equals(firstUnit) || "雄安基地建设部".equals(firstUnit) || "华北基地建设部".equals(firstUnit)) {
             return "-12";
         }
         for (OrganizationPo secondOrg : secondOrgs) {
-            if (unit.contains(secondOrg.getName())) {
+            if (firstUnit.contains(secondOrg.getName())) {
                 return secondOrg.getId();
             }
         }
-        return "-12";
+        return null;
     }
 
     /**
@@ -253,13 +277,13 @@ public class CarService {
      */
     public String getOrgName(Map<String, OrganizationPo> orgMap, String orgNo) {
         if (!StringUtils.hasText(orgNo)) {
-            return "";
+            return null;
         }
         OrganizationPo po = orgMap.get(orgNo);
         if (po != null) {
             return po.getName();
         }
-        return "";
+        return null;
     }
 
     /**
@@ -267,90 +291,108 @@ public class CarService {
      * @param thirdOrgListMap 三级组织机构列表字典
      * @param areaNo 二级组织机构编码
      * @param areaName 二级组织机构名称
-     * @param unit 单位
+     * @param carUnitBo 单位
      */
     public String getCityNo(Map<String, List<OrganizationPo>> thirdOrgListMap, String areaNo, String areaName,
-                            String unit) {
-        if (!StringUtils.hasText(areaNo) || !StringUtils.hasText(areaName)) {
-            return "";
-        }
-        if ("石家庄".equals(areaName)) {
-            if (unit.contains("井陉矿区")) {
-                return "D0130185";
+                            CarUnitBo carUnitBo) {
+        if (carUnitBo == null || !StringUtils.hasText(areaNo) || !StringUtils.hasText(areaName)) {
+            return null;
+        }
+        String firstUnit = carUnitBo.getFirstUnit();
+        if ("华北基地建设部".equals(firstUnit)) {
+            return "HE018";
+        }
+        if ("雄安基地建设部".equals(firstUnit)) {
+            return "HE019";
+        }
+        String secondUnit = carUnitBo.getSecondUnit();
+        if (StringUtils.hasText(secondUnit)) {
+            if ("石家庄".equals(areaName)) {
+                if (secondUnit.contains("井陉矿区")) {
+                    return "D0130185";
+                }
+                if (secondUnit.contains("井陉")) {
+                    return "D0130121";
+                }
             }
-            if (unit.contains("井陉")) {
-                return "D0130121";
+            if ("秦皇岛".equals(areaName)) {
+                if (secondUnit.contains("北戴河新区")) {
+                    return "D0130325";
+                }
+                if (secondUnit.contains("北戴河")) {
+                    return "D0130304";
+                }
             }
-        }
-        if ("秦皇岛".equals(areaName)) {
-            if (unit.contains("北戴河新区")) {
-                return "D0130325";
+            if ("邯郸".equals(areaName)) {
+                if (secondUnit.contains("峰峰")) {
+                    return "D0130406";
+                }
             }
-            if (unit.contains("北戴河")) {
-                return "D0130304";
+            if ("邢台".equals(areaName)) {
+                if (secondUnit.contains("内丘")) {
+                    return "D0130523";
+                }
+                if (secondUnit.contains("任泽")) {
+                    return "D0130526";
+                }
             }
-        }
-        if ("邯郸".equals(areaName)) {
-            if (unit.contains("峰峰")) {
-                return "D0130406";
+            if ("省机动局".equals(areaName)) {
+                if (secondUnit.contains("沧州")) {
+                    return "HECS180";
+                }
+                if (secondUnit.contains("唐山")) {
+                    return "HECS181";
+                }
+                if (secondUnit.contains("秦皇岛")) {
+                    return "HECS182";
+                }
+                if (secondUnit.contains("廊坊")) {
+                    return "HECS183";
+                }
+                if (secondUnit.contains("张家口")) {
+                    return "HECS184";
+                }
+                if (secondUnit.contains("邢台")) {
+                    return "HECS185";
+                }
+                if (secondUnit.contains("邯郸")) {
+                    return "HECS186";
+                }
+                if (secondUnit.contains("保定")) {
+                    return "HECS187";
+                }
+                if (secondUnit.contains("石家庄")) {
+                    return "HECS188";
+                }
+                if (secondUnit.contains("承德")) {
+                    return "HECS189";
+                }
+                if (secondUnit.contains("衡水")) {
+                    return "HECS720";
+                }
+                if (secondUnit.contains("雄安")) {
+                    return "HECS728";
+                }
+                return "HECS018";
             }
-        }
-        if ("邢台".equals(areaName)) {
-            if (unit.contains("内丘")) {
-                return "D0130523";
+            if ("雄安".equals(areaName)) {
+                secondUnit = secondUnit.replace("雄安新区", "");
             }
-            if (unit.contains("任泽")) {
-                return "D0130526";
+            List<OrganizationPo> l3 = thirdOrgListMap.getOrDefault(areaNo, new ArrayList<>());
+            for (OrganizationPo organizationPo : l3) {
+                if (secondUnit.contains(organizationPo.getName())) {
+                    return organizationPo.getId();
+                }
             }
         }
+        // 河北省分公司
+        if ("省本部".equals(areaName)) {
+            return "HE001";
+        }
+        // 省分公司线路维护中心
         if ("省机动局".equals(areaName)) {
-            if (unit.contains("沧州")) {
-                return "HECS180";
-            }
-            if (unit.contains("唐山")) {
-                return "HECS181";
-            }
-            if (unit.contains("秦皇岛")) {
-                return "HECS182";
-            }
-            if (unit.contains("廊坊")) {
-                return "HECS183";
-            }
-            if (unit.contains("张家口")) {
-                return "HECS184";
-            }
-            if (unit.contains("邢台")) {
-                return "HECS185";
-            }
-            if (unit.contains("邯郸")) {
-                return "HECS186";
-            }
-            if (unit.contains("保定")) {
-                return "HECS187";
-            }
-            if (unit.contains("石家庄")) {
-                return "HECS188";
-            }
-            if (unit.contains("承德")) {
-                return "HECS189";
-            }
-            if (unit.contains("衡水")) {
-                return "HECS720";
-            }
-            if (unit.contains("雄安")) {
-                return "HECS728";
-            }
             return "HECS018";
         }
-        if ("雄安".equals(areaName)) {
-            unit = unit.replace("雄安新区", "");
-        }
-        List<OrganizationPo> l3 = thirdOrgListMap.getOrDefault(areaNo, new ArrayList<>());
-        for (OrganizationPo organizationPo : l3) {
-            if (unit.contains(organizationPo.getName())) {
-                return organizationPo.getId();
-            }
-        }
         // 市区
         if ("沧州".equals(areaName)) {
             return "D0130911";
@@ -388,8 +430,7 @@ public class CarService {
         if ("雄安".equals(areaName)) {
             return "D0130830";
         }
-        // 河北省分公司
-        return "HE001";
+        return null;
     }
 
     /**
@@ -398,8 +439,8 @@ public class CarService {
      * @param cityName 三级组织机构名称
      */
     public String getAreaNo2(String areaName, String cityName) {
-        if (!StringUtils.hasText(areaName)) {
-            return "";
+        if (!StringUtils.hasText(areaName) || "省本部".equals(areaName)) {
+            return null;
         }
         if ("省机动局".equals(areaName) && StringUtils.hasText(cityName)) {
             if (cityName.contains("沧州")) {
@@ -438,6 +479,7 @@ public class CarService {
             if (cityName.contains("雄安")) {
                 return "782";
             }
+            return null;
         }
         if (areaName.contains("沧州")) {
             return "180";
@@ -475,7 +517,7 @@ public class CarService {
         if (areaName.contains("雄安")) {
             return "782";
         }
-        return "";
+        return null;
     }
 
     /**
@@ -485,14 +527,14 @@ public class CarService {
      */
     public String getCityId(List<AreaPo> cities, String unit) {
         if (!StringUtils.hasText(unit)) {
-            return "";
+            return null;
         }
         for (AreaPo city : cities) {
             if (unit.contains(city.getShortName())) {
                 return city.getAreaId();
             }
         }
-        return "";
+        return null;
     }
 
     /**
@@ -502,13 +544,13 @@ public class CarService {
      */
     public String getAreaName(Map<String, AreaPo> areaMap, String id) {
         if (!StringUtils.hasText(id)) {
-            return "";
+            return null;
         }
         AreaPo areaPo = areaMap.get(id);
         if (null != areaPo) {
             return areaPo.getAreaName();
         }
-        return "";
+        return null;
     }
 
     /**
@@ -520,7 +562,7 @@ public class CarService {
      */
     public String getDistrictId(Map<String, List<AreaPo>> districtListMap, String cityId, String cityName, String unit) {
         if (!StringUtils.hasText(cityId) || !StringUtils.hasText(cityName) || !StringUtils.hasText(unit)) {
-            return "";
+            return null;
         }
         if ("石家庄".equals(cityName)) {
             if (unit.contains("井陉矿区")) {
@@ -533,15 +575,12 @@ public class CarService {
         if ("雄安".equals(cityName)) {
             unit = unit.replace("雄安新区", "");
         }
-        List<AreaPo> districts = districtListMap.get(cityId);
-        if (CollectionUtils.isEmpty(districts)) {
-            return "";
-        }
+        List<AreaPo> districts = districtListMap.getOrDefault(cityId, Collections.emptyList());
         for (AreaPo district : districts) {
             if (unit.contains(district.getShortName())) {
                 return district.getAreaId();
             }
         }
-        return "";
+        return null;
     }
 }

+ 371 - 371
src/test/java/com/nokia/finance/tasks/car/CarGongCheShiYongTests3.java

@@ -1,373 +1,373 @@
-package com.nokia.finance.tasks.car;
-
-import com.nokia.finance.tasks.common.exception.MyRuntimeException;
-import com.nokia.finance.tasks.dao.car.CarGongCheShouFeiDao;
-import com.nokia.finance.tasks.pojo.po.common.AreaPo;
-import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
-import com.nokia.finance.tasks.service.car.CarService;
-import com.nokia.finance.tasks.service.common.AreaService;
-import com.nokia.finance.tasks.service.common.OrganizationService;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.csv.CSVFormat;
-import org.apache.commons.csv.CSVPrinter;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.DateUtil;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.ActiveProfiles;
-import org.springframework.util.CollectionUtils;
-
-import java.io.InputStream;
-import java.io.OutputStreamWriter;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Stream;
-
-@Slf4j
-@SpringBootTest
-@ActiveProfiles("dev")
-class CarGongCheShiYongTests3 {
-    @Autowired
-    CarService carService;
-    @Autowired
-    OrganizationService organizationService;
-    @Autowired
-    AreaService areaService;
-    @Autowired
-    CarGongCheShouFeiDao carGongCheShouFeiDao;
-
-    /**
-     * 执行任务
-     */
-    @Test
-    void runJob() {
-        // 数据目录
-        Path dir = Paths.get("test/data/yctjfxmx");
-        try (Stream<Path> stream = Files.list(dir)) {
-            // 获取数据目录下的文件列表
-            List<Path> pathList = stream.filter(t -> t.toString().endsWith(".xlsx")).sorted().toList();
-            log.info("数据文件列表: {}", pathList);
-            if (CollectionUtils.isEmpty(pathList)) {
-                throw new MyRuntimeException("没有文件");
-            }
-            for (Path path : pathList) {
-                singleJob(path);
-            }
-        } catch (Exception e) {
-            log.error(e.toString(), e);
-        }
-    }
-
-    /**
-     * 处理单个文件
-     *
-     * @param path 文件路径
-     */
-    public void singleJob(Path path) throws Exception {
-        List<Map<String, String>> list = readFile(path);
-        List<Map<String, String>> distinctList = dataProcessing(path, list);
-        Path csvPath = toCsv(path, distinctList);
-    }
-
-    /**
-     * 读取文件
-     *
-     * @param path 文件路径
-     */
-    public List<Map<String, String>> readFile(Path path) throws Exception {
-        log.info("读取: {}", path);
-        List<String> headers = Stream.of("shen_qing_dan_hao", "pai_qian_dan_hao", "shen_qing_lei_xing",
-                "che_pai_hao", "che_liang_lei_xing", "che_liang_ji_bie", "si_ji_ming_cheng", "yong_che_ren",
-                "yong_che_bu_men", "yong_che_shi_you", "chu_fa_di", "mu_di_di", "chu_fa_shi_jian", "gui_dui_shi_jian",
-                "xing_shi_li_cheng", "chu_che_shi_chang").toList();
-        try (InputStream inputStream = Files.newInputStream(path);
-             Workbook workbook = new XSSFWorkbook(inputStream)
-        ) {
-            List<Map<String, String>> resultList = new ArrayList<>();
-            // 读取第一个工作表
-            Sheet sheet = workbook.getSheetAt(0);
-            // 表头行
-            Row headerRow = sheet.getRow(0);
-            // 列数
-            int columnCount = headerRow.getPhysicalNumberOfCells();
-            log.info("columnCount: {}", columnCount);
-            // 最后行数
-            int lastRowNum = sheet.getLastRowNum();
-            log.info("lastRowNum: {}", lastRowNum);
-            if (lastRowNum == 0) {
-                throw new MyRuntimeException(path.getFileName() + " 数据0条");
-            }
-            // 遍历行
-            for (int i = 1; i <= lastRowNum; i++) {
-                Row row = sheet.getRow(i);
-                if (row == null) {
-                    continue;
-                }
-                Map<String, String> rowMap = new LinkedHashMap<>();
-                // 遍历列
-                for (int j = 0; j < columnCount; j++) {
-                    String header = headers.get(j);
-                    String cellValue = "";
-                    rowMap.put(header, cellValue);
-                    Cell cell = row.getCell(j);
-                    if (cell == null) {
-                        continue;
-                    }
-                    switch (cell.getCellType()) {
-                        case STRING:
-                            boolean skipTrim = "chu_fa_shi_jian".equals(header)
-                                    || "gui_dui_shi_jian".equals(header);
-                            // 删除字符串空白字符
-                            cellValue = skipTrim ? cell.getStringCellValue()
-                                    : org.springframework.util.StringUtils.trimAllWhitespace(cell.getStringCellValue());
-                            break;
-                        case NUMERIC:
-                            if (DateUtil.isCellDateFormatted(cell)) {
-                                cellValue = DateUtil.getLocalDateTime(cell.getNumericCellValue())
-                                        .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-                                break;
-                            }
-                            cellValue = String.valueOf(cell.getNumericCellValue());
-                            break;
-                        case BOOLEAN:
-                            cellValue = String.valueOf(cell.getBooleanCellValue());
-                            break;
-                        default:
-                            break;
-                    }
-                    rowMap.put(headers.get(j), cellValue);
-                }
-                filter1(resultList, rowMap);
-            }
-            return resultList;
-        }
-    }
-
-    public void filter1(List<Map<String, String>> list, Map<String, String> map) {
-        String yongCheShiYou = Objects.requireNonNullElse(map.get("yong_che_shi_you"), "");
-        String muDiDi = Objects.requireNonNullElse(map.get("mu_di_di"), "");
-        boolean flag = (StringUtils.containsAny(yongCheShiYou, "出差", "开会", "会议", "接站",
-                "培训", "送站", "送机", "接站", "接人", "机场", "站")
-                || StringUtils.containsAny(muDiDi, "出差", "开会", "会议", "接站", "培训", "送站",
-                "送机", "接站", "接人", "机场", "站"))
-                && !StringUtils.containsAny(yongCheShiYou, "障", "营销", "查", "物料", "省公司",
-                "省分", "集团", "勘察", "调研", "审计", "巡", "调测", "维护", "修", "处理", "设备", "客户", "交流", "办事",
-                "访", "政府", "市委", "委员会", "县委", "基站", "收费站", "公交站", "加油站", "服务站", "检查站", "街", "路",
-                "检测站", "液化气站", "总部", "省委", "党建", "机房", "调", "安装", "领导")
-                && !StringUtils.containsAny(muDiDi, "障", "营销", "查", "物料", "省公司",
-                "省分", "集团", "勘察", "调研", "审计", "巡", "调测", "维护", "修", "处理", "设备", "客户", "交流", "办事",
-                "访", "政府", "市委", "委员会", "县委", "基站", "收费站", "公交站", "加油站", "服务站", "检查站", "街", "路",
-                "检测站", "液化气站", "总部", "省委", "党建", "机房", "调", "安装", "领导");
-        if (flag) {
-            list.add(map);
-        }
-    }
-
-    /**
-     * 数据加工
-     *
-     * @param path 文件路径
-     * @param list 数据
-     */
-    public List<Map<String, String>> dataProcessing(Path path, List<Map<String, String>> list) {
-        Integer yearMonth = 202402;
-        List<Map<String, String>> staffs = carGongCheShouFeiDao.getStaffs(yearMonth);
-        Set<String> specialCar = carGongCheShouFeiDao.getSpecialCar();
-        List<OrganizationPo> secondOrgs = organizationService.getSecondOrgs();
-        List<OrganizationPo> thirdOrgs = organizationService.getThirdOrgs();
-        Map<String, OrganizationPo> orgMap = organizationService.getOrgMap(secondOrgs, thirdOrgs);
-        Map<String, List<OrganizationPo>> thirdOrganizationListMap =
-                organizationService.getThirdOrganizationListMap(secondOrgs, thirdOrgs);
-        List<AreaPo> cities = areaService.getCities();
-        List<AreaPo> districts = areaService.getDistricts();
-        Map<String, AreaPo> areaMap = areaService.getAreaMap(cities, districts);
-        Map<String, List<AreaPo>> districtListMap = areaService.getDistrictListMap(cities, districts);
-        List<Map<String, String>> resultList = new ArrayList<>();
-        for (Map<String, String> map : list) {
-//            String shenQingYongCheShiJian = map.get("shen_qing_yong_che_shi_jian");
-//            LocalDateTime localDateTime = LocalDateTime.parse(shenQingYongCheShiJian, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-//            String yearMonth = localDateTime.format(DateTimeFormatter.ofPattern("yyyyMM"));
-//            String year = String.valueOf(localDateTime.getYear());
-//            String month = String.valueOf(localDateTime.getMonthValue());
-//            map.put("year_month", yearMonth);
-//            map.put("year_no", year);
-//            map.put("month_no", month);
-            String chuCheShiChang = map.get("chu_che_shi_chang");
-            String chuCheShiChangSeconds = String.valueOf(durationStrToSeconds(chuCheShiChang));
-            map.put("chu_che_shi_chang_seconds", chuCheShiChangSeconds);
-            String rawChePaiHao = map.get("che_pai_hao");
-//            map.put("raw_che_pai_hao", rawChePaiHao);
-            String chePaiHao = carService.getChePai(rawChePaiHao);
-            map.put("che_pai_hao", chePaiHao);
-//            String chePaiFail = carService.chePaiFail(rawChePaiHao);
-//            map.put("che_pai_fail", chePaiFail);
-            String yongCheBuMen = map.get("yong_che_bu_men");
-            String firstUnit = carService.getFirstUnit(yongCheBuMen);
-            map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(yongCheBuMen, firstUnit);
-            map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(yongCheBuMen, secondUnit);
-            map.put("third_unit", thirdUnit);
-//            String areaNo = carService.getAreaNo(secondOrgs, yongCheDanWei);
-//            map.put("area_no", areaNo);
-//            String areaName = carService.getOrgName(orgMap, areaNo);
-//            map.put("area_name", areaName);
-//            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, yongCheDanWei);
-//            map.put("city_no", cityNo);
-//            String cityName = carService.getOrgName(orgMap, cityNo);
-//            map.put("city_name", cityName);
-//            String areaNo2 = carService.getAreaNo2(areaName, cityName);
-//            map.put("area_no2", areaNo2);
-//            String areaName2 = carService.getOrgName(orgMap, areaNo2);
-//            map.put("area_name2", areaName2);
-//            String cityId = carService.getCityId(cities, yongCheDanWei);
-//            map.put("city_id", cityId);
-//            String city = carService.getAreaName(areaMap, cityId);
-//            map.put("city", city);
-//            String districtId = carService.getDistrictId(districtListMap, cityId, cityName, yongCheDanWei);
-//            map.put("district_id", districtId);
-//            String district = carService.getAreaName(areaMap, districtId);
-//            map.put("district", district);
-//            map.put("source", path.getFileName().toString());
-            filter2(resultList, map, specialCar, staffs);
-        }
-        return resultList;
-    }
-
-    public void filter2(List<Map<String, String>> list, Map<String, String> map, Set<String> specialCar,
-                        List<Map<String, String>> staffs) {
-//        String xingShiLiCheng = Objects.requireNonNullElse(map.get("xing_shi_li_cheng"), "");
-//        String chuCheShiChangSeconds = Objects.requireNonNullElse(map.get("chu_che_shi_chang_seconds"), "");
-        String yongCheShiYou = Objects.requireNonNullElse(map.get("yong_che_shi_you"), "");
-        String yongCheRen = Objects.requireNonNullElse(map.get("yong_che_ren"), "");
-        String chePaiHao = Objects.requireNonNullElse(map.get("che_pai_hao"), "");
-        String firstUnit1 = Objects.requireNonNullElse(map.get("first_unit"), "");
-        boolean notInStaffs = true;
-        for (Map<String, String> staff : staffs) {
-            String firstUnit2 = staff.get("first_unit");
-            String xingMing = staff.get("xing_ming");
-            // 用车人或用车事由包含交通补贴人员且单位相同
-            if (firstUnit1.equals(firstUnit2)
-                    && (yongCheRen.replaceAll("[^一-龥]", "").equals(xingMing)
-                    || yongCheShiYou.contains(xingMing))) {
-                notInStaffs = false;
-                break;
-            }
-        }
-        if (notInStaffs) {
-            return;
-        }
-        if (specialCar.contains(chePaiHao)) {
-            log.info("特殊车辆: {}", chePaiHao);
-            return;
-        }
-//        if (new BigDecimal(chuCheShiChangSeconds).compareTo(new BigDecimal("600")) < 0
-//                || new BigDecimal(xingShiLiCheng).compareTo(BigDecimal.ZERO) = 0
-//                || new BigDecimal(xingShiLiCheng).compareTo(new BigDecimal("20")) >= 0) {
+//package com.nokia.finance.tasks.car;
+//
+//import com.nokia.finance.tasks.common.exception.MyRuntimeException;
+//import com.nokia.finance.tasks.dao.car.CarGongCheShouFeiDao;
+//import com.nokia.finance.tasks.pojo.po.common.AreaPo;
+//import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
+//import com.nokia.finance.tasks.service.car.CarService;
+//import com.nokia.finance.tasks.service.common.AreaService;
+//import com.nokia.finance.tasks.service.common.OrganizationService;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.csv.CSVFormat;
+//import org.apache.commons.csv.CSVPrinter;
+//import org.apache.commons.lang3.StringUtils;
+//import org.apache.poi.ss.usermodel.Cell;
+//import org.apache.poi.ss.usermodel.DateUtil;
+//import org.apache.poi.ss.usermodel.Row;
+//import org.apache.poi.ss.usermodel.Sheet;
+//import org.apache.poi.ss.usermodel.Workbook;
+//import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+//import org.junit.jupiter.api.Test;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.boot.test.context.SpringBootTest;
+//import org.springframework.test.context.ActiveProfiles;
+//import org.springframework.util.CollectionUtils;
+//
+//import java.io.InputStream;
+//import java.io.OutputStreamWriter;
+//import java.nio.charset.StandardCharsets;
+//import java.nio.file.Files;
+//import java.nio.file.Path;
+//import java.nio.file.Paths;
+//import java.time.format.DateTimeFormatter;
+//import java.util.ArrayList;
+//import java.util.LinkedHashMap;
+//import java.util.List;
+//import java.util.Map;
+//import java.util.Objects;
+//import java.util.Set;
+//import java.util.regex.Matcher;
+//import java.util.regex.Pattern;
+//import java.util.stream.Stream;
+//
+//@Slf4j
+//@SpringBootTest
+//@ActiveProfiles("dev")
+//class CarGongCheShiYongTests3 {
+//    @Autowired
+//    CarService carService;
+//    @Autowired
+//    OrganizationService organizationService;
+//    @Autowired
+//    AreaService areaService;
+//    @Autowired
+//    CarGongCheShouFeiDao carGongCheShouFeiDao;
+//
+//    /**
+//     * 执行任务
+//     */
+//    @Test
+//    void runJob() {
+//        // 数据目录
+//        Path dir = Paths.get("test/data/yctjfxmx");
+//        try (Stream<Path> stream = Files.list(dir)) {
+//            // 获取数据目录下的文件列表
+//            List<Path> pathList = stream.filter(t -> t.toString().endsWith(".xlsx")).sorted().toList();
+//            log.info("数据文件列表: {}", pathList);
+//            if (CollectionUtils.isEmpty(pathList)) {
+//                throw new MyRuntimeException("没有文件");
+//            }
+//            for (Path path : pathList) {
+//                singleJob(path);
+//            }
+//        } catch (Exception e) {
+//            log.error(e.toString(), e);
+//        }
+//    }
+//
+//    /**
+//     * 处理单个文件
+//     *
+//     * @param path 文件路径
+//     */
+//    public void singleJob(Path path) throws Exception {
+//        List<Map<String, String>> list = readFile(path);
+//        List<Map<String, String>> distinctList = dataProcessing(path, list);
+//        Path csvPath = toCsv(path, distinctList);
+//    }
+//
+//    /**
+//     * 读取文件
+//     *
+//     * @param path 文件路径
+//     */
+//    public List<Map<String, String>> readFile(Path path) throws Exception {
+//        log.info("读取: {}", path);
+//        List<String> headers = Stream.of("shen_qing_dan_hao", "pai_qian_dan_hao", "shen_qing_lei_xing",
+//                "che_pai_hao", "che_liang_lei_xing", "che_liang_ji_bie", "si_ji_ming_cheng", "yong_che_ren",
+//                "yong_che_bu_men", "yong_che_shi_you", "chu_fa_di", "mu_di_di", "chu_fa_shi_jian", "gui_dui_shi_jian",
+//                "xing_shi_li_cheng", "chu_che_shi_chang").toList();
+//        try (InputStream inputStream = Files.newInputStream(path);
+//             Workbook workbook = new XSSFWorkbook(inputStream)
+//        ) {
+//            List<Map<String, String>> resultList = new ArrayList<>();
+//            // 读取第一个工作表
+//            Sheet sheet = workbook.getSheetAt(0);
+//            // 表头行
+//            Row headerRow = sheet.getRow(0);
+//            // 列数
+//            int columnCount = headerRow.getPhysicalNumberOfCells();
+//            log.info("columnCount: {}", columnCount);
+//            // 最后行数
+//            int lastRowNum = sheet.getLastRowNum();
+//            log.info("lastRowNum: {}", lastRowNum);
+//            if (lastRowNum == 0) {
+//                throw new MyRuntimeException(path.getFileName() + " 数据0条");
+//            }
+//            // 遍历行
+//            for (int i = 1; i <= lastRowNum; i++) {
+//                Row row = sheet.getRow(i);
+//                if (row == null) {
+//                    continue;
+//                }
+//                Map<String, String> rowMap = new LinkedHashMap<>();
+//                // 遍历列
+//                for (int j = 0; j < columnCount; j++) {
+//                    String header = headers.get(j);
+//                    String cellValue = "";
+//                    rowMap.put(header, cellValue);
+//                    Cell cell = row.getCell(j);
+//                    if (cell == null) {
+//                        continue;
+//                    }
+//                    switch (cell.getCellType()) {
+//                        case STRING:
+//                            boolean skipTrim = "chu_fa_shi_jian".equals(header)
+//                                    || "gui_dui_shi_jian".equals(header);
+//                            // 删除字符串空白字符
+//                            cellValue = skipTrim ? cell.getStringCellValue()
+//                                    : org.springframework.util.StringUtils.trimAllWhitespace(cell.getStringCellValue());
+//                            break;
+//                        case NUMERIC:
+//                            if (DateUtil.isCellDateFormatted(cell)) {
+//                                cellValue = DateUtil.getLocalDateTime(cell.getNumericCellValue())
+//                                        .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+//                                break;
+//                            }
+//                            cellValue = String.valueOf(cell.getNumericCellValue());
+//                            break;
+//                        case BOOLEAN:
+//                            cellValue = String.valueOf(cell.getBooleanCellValue());
+//                            break;
+//                        default:
+//                            break;
+//                    }
+//                    rowMap.put(headers.get(j), cellValue);
+//                }
+//                filter1(resultList, rowMap);
+//            }
+//            return resultList;
+//        }
+//    }
+//
+//    public void filter1(List<Map<String, String>> list, Map<String, String> map) {
+//        String yongCheShiYou = Objects.requireNonNullElse(map.get("yong_che_shi_you"), "");
+//        String muDiDi = Objects.requireNonNullElse(map.get("mu_di_di"), "");
+//        boolean flag = (StringUtils.containsAny(yongCheShiYou, "出差", "开会", "会议", "接站",
+//                "培训", "送站", "送机", "接站", "接人", "机场", "站")
+//                || StringUtils.containsAny(muDiDi, "出差", "开会", "会议", "接站", "培训", "送站",
+//                "送机", "接站", "接人", "机场", "站"))
+//                && !StringUtils.containsAny(yongCheShiYou, "障", "营销", "查", "物料", "省公司",
+//                "省分", "集团", "勘察", "调研", "审计", "巡", "调测", "维护", "修", "处理", "设备", "客户", "交流", "办事",
+//                "访", "政府", "市委", "委员会", "县委", "基站", "收费站", "公交站", "加油站", "服务站", "检查站", "街", "路",
+//                "检测站", "液化气站", "总部", "省委", "党建", "机房", "调", "安装", "领导")
+//                && !StringUtils.containsAny(muDiDi, "障", "营销", "查", "物料", "省公司",
+//                "省分", "集团", "勘察", "调研", "审计", "巡", "调测", "维护", "修", "处理", "设备", "客户", "交流", "办事",
+//                "访", "政府", "市委", "委员会", "县委", "基站", "收费站", "公交站", "加油站", "服务站", "检查站", "街", "路",
+//                "检测站", "液化气站", "总部", "省委", "党建", "机房", "调", "安装", "领导");
+//        if (flag) {
+//            list.add(map);
+//        }
+//    }
+//
+//    /**
+//     * 数据加工
+//     *
+//     * @param path 文件路径
+//     * @param list 数据
+//     */
+//    public List<Map<String, String>> dataProcessing(Path path, List<Map<String, String>> list) {
+//        Integer yearMonth = 202402;
+//        List<Map<String, String>> staffs = carGongCheShouFeiDao.getStaffs(yearMonth);
+//        Set<String> specialCar = carGongCheShouFeiDao.getSpecialCar();
+//        List<OrganizationPo> secondOrgs = organizationService.getSecondOrgs();
+//        List<OrganizationPo> thirdOrgs = organizationService.getThirdOrgs();
+//        Map<String, OrganizationPo> orgMap = organizationService.getOrgMap(secondOrgs, thirdOrgs);
+//        Map<String, List<OrganizationPo>> thirdOrganizationListMap =
+//                organizationService.getThirdOrganizationListMap(secondOrgs, thirdOrgs);
+//        List<AreaPo> cities = areaService.getCities();
+//        List<AreaPo> districts = areaService.getDistricts();
+//        Map<String, AreaPo> areaMap = areaService.getAreaMap(cities, districts);
+//        Map<String, List<AreaPo>> districtListMap = areaService.getDistrictListMap(cities, districts);
+//        List<Map<String, String>> resultList = new ArrayList<>();
+//        for (Map<String, String> map : list) {
+////            String shenQingYongCheShiJian = map.get("shen_qing_yong_che_shi_jian");
+////            LocalDateTime localDateTime = LocalDateTime.parse(shenQingYongCheShiJian, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+////            String yearMonth = localDateTime.format(DateTimeFormatter.ofPattern("yyyyMM"));
+////            String year = String.valueOf(localDateTime.getYear());
+////            String month = String.valueOf(localDateTime.getMonthValue());
+////            map.put("year_month", yearMonth);
+////            map.put("year_no", year);
+////            map.put("month_no", month);
+//            String chuCheShiChang = map.get("chu_che_shi_chang");
+//            String chuCheShiChangSeconds = String.valueOf(durationStrToSeconds(chuCheShiChang));
+//            map.put("chu_che_shi_chang_seconds", chuCheShiChangSeconds);
+//            String rawChePaiHao = map.get("che_pai_hao");
+////            map.put("raw_che_pai_hao", rawChePaiHao);
+//            String chePaiHao = carService.getChePai(rawChePaiHao);
+//            map.put("che_pai_hao", chePaiHao);
+////            String chePaiFail = carService.chePaiFail(rawChePaiHao);
+////            map.put("che_pai_fail", chePaiFail);
+//            String yongCheBuMen = map.get("yong_che_bu_men");
+//            String firstUnit = carService.getFirstUnit(yongCheBuMen);
+//            map.put("first_unit", firstUnit);
+//            String secondUnit = carService.getSecondUnit(yongCheBuMen, firstUnit);
+//            map.put("second_unit", secondUnit);
+//            String thirdUnit = carService.getThirdUnit(yongCheBuMen, secondUnit);
+//            map.put("third_unit", thirdUnit);
+////            String areaNo = carService.getAreaNo(secondOrgs, yongCheDanWei);
+////            map.put("area_no", areaNo);
+////            String areaName = carService.getOrgName(orgMap, areaNo);
+////            map.put("area_name", areaName);
+////            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, yongCheDanWei);
+////            map.put("city_no", cityNo);
+////            String cityName = carService.getOrgName(orgMap, cityNo);
+////            map.put("city_name", cityName);
+////            String areaNo2 = carService.getAreaNo2(areaName, cityName);
+////            map.put("area_no2", areaNo2);
+////            String areaName2 = carService.getOrgName(orgMap, areaNo2);
+////            map.put("area_name2", areaName2);
+////            String cityId = carService.getCityId(cities, yongCheDanWei);
+////            map.put("city_id", cityId);
+////            String city = carService.getAreaName(areaMap, cityId);
+////            map.put("city", city);
+////            String districtId = carService.getDistrictId(districtListMap, cityId, cityName, yongCheDanWei);
+////            map.put("district_id", districtId);
+////            String district = carService.getAreaName(areaMap, districtId);
+////            map.put("district", district);
+////            map.put("source", path.getFileName().toString());
+//            filter2(resultList, map, specialCar, staffs);
+//        }
+//        return resultList;
+//    }
+//
+//    public void filter2(List<Map<String, String>> list, Map<String, String> map, Set<String> specialCar,
+//                        List<Map<String, String>> staffs) {
+////        String xingShiLiCheng = Objects.requireNonNullElse(map.get("xing_shi_li_cheng"), "");
+////        String chuCheShiChangSeconds = Objects.requireNonNullElse(map.get("chu_che_shi_chang_seconds"), "");
+//        String yongCheShiYou = Objects.requireNonNullElse(map.get("yong_che_shi_you"), "");
+//        String yongCheRen = Objects.requireNonNullElse(map.get("yong_che_ren"), "");
+//        String chePaiHao = Objects.requireNonNullElse(map.get("che_pai_hao"), "");
+//        String firstUnit1 = Objects.requireNonNullElse(map.get("first_unit"), "");
+//        boolean notInStaffs = true;
+//        for (Map<String, String> staff : staffs) {
+//            String firstUnit2 = staff.get("first_unit");
+//            String xingMing = staff.get("xing_ming");
+//            // 用车人或用车事由包含交通补贴人员且单位相同
+//            if (firstUnit1.equals(firstUnit2)
+//                    && (yongCheRen.replaceAll("[^一-龥]", "").equals(xingMing)
+//                    || yongCheShiYou.contains(xingMing))) {
+//                notInStaffs = false;
+//                break;
+//            }
+//        }
+//        if (notInStaffs) {
+//            return;
+//        }
+//        if (specialCar.contains(chePaiHao)) {
+//            log.info("特殊车辆: {}", chePaiHao);
 //            return;
 //        }
-        list.add(map);
-    }
-
-    /**
-     * 生成csv
-     *
-     * @param path 源文件路径
-     * @param list 数据
-     */
-    public Path toCsv(Path path, List<Map<String, String>> list) throws Exception {
-        log.info("条数:{}", list.size());
-        Files.createDirectories(Paths.get("test/history/"));
-        Path csvPath = Paths.get("test/history/" + path.getFileName() + ".csv");
-        try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(csvPath),
-                StandardCharsets.UTF_8);
-             CSVPrinter printer = new CSVPrinter(osw, CSVFormat.DEFAULT)) {
-            // 添加bom头避免excel乱码
-            osw.write('\ufeff');
-//            Map<String, String> header = list.get(0);
-//            // 表头
-//            printer.printRecord(header.keySet());
-            printer.printRecord("申请单号", "派遣单号", "申请类型", "车牌号", "车辆类型", "车辆级别", "司机名称", "用车人", "用车部门", "用车事由", "出发地", "目的地", "出发时间", "归队时间", "行驶里程", "出车时长", "出车时长秒", "用车单位一级", "用车单位二级", "用车单位三级");
-            for (Map<String, String> map : list) {
-                printer.printRecord(
-                        map.get("shen_qing_dan_hao"),
-                        map.get("pai_qian_dan_hao"),
-                        map.get("shen_qing_lei_xing"),
-                        map.get("che_pai_hao"),
-                        map.get("che_liang_lei_xing"),
-                        map.get("che_liang_ji_bie"),
-                        map.get("si_ji_ming_cheng"),
-                        map.get("yong_che_ren"),
-                        map.get("yong_che_bu_men"),
-                        map.get("yong_che_shi_you"),
-                        map.get("chu_fa_di"),
-                        map.get("mu_di_di"),
-                        map.get("chu_fa_shi_jian"),
-                        map.get("gui_dui_shi_jian"),
-                        map.get("xing_shi_li_cheng"),
-                        map.get("chu_che_shi_chang"),
-                        map.get("chu_che_shi_chang_seconds"),
-                        map.get("first_unit"),
-                        map.get("second_unit"),
-                        map.get("third_unit")
-                );
-            }
-        }
-        return csvPath;
-    }
-
-    /**
-     * 时长字符串转秒数
-     * @param durationStr 时长字符串
-     */
-    public long durationStrToSeconds(String durationStr) {
-        if (StringUtils.isEmpty(durationStr) || "0".equals(durationStr)) {
-            return 0;
-        }
-        // 定义正则表达式,匹配时分秒、分钟秒和秒三种格式
-        String regex = "(\\d+时)?(\\d+分)?(\\d+秒)";
-
-        // 使用Pattern和Matcher进行匹配
-        Pattern pattern = Pattern.compile(regex);
-        Matcher matcher = pattern.matcher(durationStr);
-
-        // 检查是否匹配成功
-        if (!matcher.matches()) {
-            return 0;
-        }
-
-        // 提取时、分、秒的数值
-        long hours = 0;
-        long minutes = 0;
-        long seconds;
-
-        // 根据匹配到的组数确定时、分、秒的值
-        if (matcher.group(1) != null) {
-            hours = Long.parseLong(matcher.group(1).substring(0, matcher.group(1).length() - 1));
-        }
-        if (matcher.group(2) != null) {
-            minutes = Long.parseLong(matcher.group(2).substring(0, matcher.group(2).length() - 1));
-        }
-        seconds = Long.parseLong(matcher.group(3).substring(0, matcher.group(3).length() - 1));
-
-        // 将时、分、秒转换为总秒数
-        return hours * 3600L + minutes * 60L + seconds;
-    }
-}
+////        if (new BigDecimal(chuCheShiChangSeconds).compareTo(new BigDecimal("600")) < 0
+////                || new BigDecimal(xingShiLiCheng).compareTo(BigDecimal.ZERO) = 0
+////                || new BigDecimal(xingShiLiCheng).compareTo(new BigDecimal("20")) >= 0) {
+////            return;
+////        }
+//        list.add(map);
+//    }
+//
+//    /**
+//     * 生成csv
+//     *
+//     * @param path 源文件路径
+//     * @param list 数据
+//     */
+//    public Path toCsv(Path path, List<Map<String, String>> list) throws Exception {
+//        log.info("条数:{}", list.size());
+//        Files.createDirectories(Paths.get("test/history/"));
+//        Path csvPath = Paths.get("test/history/" + path.getFileName() + ".csv");
+//        try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(csvPath),
+//                StandardCharsets.UTF_8);
+//             CSVPrinter printer = new CSVPrinter(osw, CSVFormat.DEFAULT)) {
+//            // 添加bom头避免excel乱码
+//            osw.write('\ufeff');
+////            Map<String, String> header = list.get(0);
+////            // 表头
+////            printer.printRecord(header.keySet());
+//            printer.printRecord("申请单号", "派遣单号", "申请类型", "车牌号", "车辆类型", "车辆级别", "司机名称", "用车人", "用车部门", "用车事由", "出发地", "目的地", "出发时间", "归队时间", "行驶里程", "出车时长", "出车时长秒", "用车单位一级", "用车单位二级", "用车单位三级");
+//            for (Map<String, String> map : list) {
+//                printer.printRecord(
+//                        map.get("shen_qing_dan_hao"),
+//                        map.get("pai_qian_dan_hao"),
+//                        map.get("shen_qing_lei_xing"),
+//                        map.get("che_pai_hao"),
+//                        map.get("che_liang_lei_xing"),
+//                        map.get("che_liang_ji_bie"),
+//                        map.get("si_ji_ming_cheng"),
+//                        map.get("yong_che_ren"),
+//                        map.get("yong_che_bu_men"),
+//                        map.get("yong_che_shi_you"),
+//                        map.get("chu_fa_di"),
+//                        map.get("mu_di_di"),
+//                        map.get("chu_fa_shi_jian"),
+//                        map.get("gui_dui_shi_jian"),
+//                        map.get("xing_shi_li_cheng"),
+//                        map.get("chu_che_shi_chang"),
+//                        map.get("chu_che_shi_chang_seconds"),
+//                        map.get("first_unit"),
+//                        map.get("second_unit"),
+//                        map.get("third_unit")
+//                );
+//            }
+//        }
+//        return csvPath;
+//    }
+//
+//    /**
+//     * 时长字符串转秒数
+//     * @param durationStr 时长字符串
+//     */
+//    public long durationStrToSeconds(String durationStr) {
+//        if (StringUtils.isEmpty(durationStr) || "0".equals(durationStr)) {
+//            return 0;
+//        }
+//        // 定义正则表达式,匹配时分秒、分钟秒和秒三种格式
+//        String regex = "(\\d+时)?(\\d+分)?(\\d+秒)";
+//
+//        // 使用Pattern和Matcher进行匹配
+//        Pattern pattern = Pattern.compile(regex);
+//        Matcher matcher = pattern.matcher(durationStr);
+//
+//        // 检查是否匹配成功
+//        if (!matcher.matches()) {
+//            return 0;
+//        }
+//
+//        // 提取时、分、秒的数值
+//        long hours = 0;
+//        long minutes = 0;
+//        long seconds;
+//
+//        // 根据匹配到的组数确定时、分、秒的值
+//        if (matcher.group(1) != null) {
+//            hours = Long.parseLong(matcher.group(1).substring(0, matcher.group(1).length() - 1));
+//        }
+//        if (matcher.group(2) != null) {
+//            minutes = Long.parseLong(matcher.group(2).substring(0, matcher.group(2).length() - 1));
+//        }
+//        seconds = Long.parseLong(matcher.group(3).substring(0, matcher.group(3).length() - 1));
+//
+//        // 将时、分、秒转换为总秒数
+//        return hours * 3600L + minutes * 60L + seconds;
+//    }
+//}

+ 203 - 203
src/test/java/com/nokia/finance/tasks/car/CarJiaoTongBuTieTests.java

@@ -1,203 +1,203 @@
-package com.nokia.finance.tasks.car;
-
-import com.nokia.finance.tasks.common.exception.MyRuntimeException;
-import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
-import com.nokia.finance.tasks.service.car.CarService;
-import com.nokia.finance.tasks.service.common.OrganizationService;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.csv.CSVFormat;
-import org.apache.commons.csv.CSVPrinter;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.DateUtil;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.ActiveProfiles;
-import org.springframework.util.CollectionUtils;
-
-import java.io.InputStream;
-import java.io.OutputStreamWriter;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Stream;
-
-@Slf4j
-@SpringBootTest
-@ActiveProfiles("dev")
-class CarJiaoTongBuTieTests {
-    @Autowired
-    CarService carService;
-    @Autowired
-    OrganizationService organizationService;
-
-    /**
-     * 执行任务
-     */
-    @Test
-    void runJob() {
-        // 数据目录
-        Path dir = Paths.get("test/data/jiao-tong-bu-tie");
-        try (Stream<Path> stream = Files.list(dir)) {
-            // 获取数据目录下的文件列表
-            List<Path> pathList = stream.filter(t -> t.toString().endsWith(".xlsx")).sorted().toList();
-            log.info("数据文件列表: {}", pathList);
-            if (CollectionUtils.isEmpty(pathList)) {
-                throw new MyRuntimeException("没有文件");
-            }
-            for (Path path : pathList) {
-                singleJob(path);
-            }
-        } catch (Exception e) {
-            log.error(e.toString(), e);
-        }
-    }
-
-    /**
-     * 处理单个文件
-     *
-     * @param path 文件路径
-     */
-    public void singleJob(Path path) throws Exception {
-        List<Map<String, String>> list = readFile(path);
-        List<Map<String, String>> distinctList = dataProcessing(path, list);
-        Path csvPath = toCsv(path, distinctList);
-    }
-
-    /**
-     * 读取文件
-     *
-     * @param path 文件路径
-     */
-    public List<Map<String, String>> readFile(Path path) throws Exception {
-        log.info("读取: {}", path);
-        List<String> headers = Stream.of("year_month","di_shi","bu_men","yuan_gong_bian_hao","xing_ming")
-                .toList();
-        try (InputStream inputStream = Files.newInputStream(path);
-             Workbook workbook = new XSSFWorkbook(inputStream)
-        ) {
-            List<Map<String, String>> resultList = new ArrayList<>();
-            // 读取第一个工作表
-            Sheet sheet = workbook.getSheetAt(0);
-            // 表头行
-            Row headerRow = sheet.getRow(0);
-            // 列数
-            int columnCount = headerRow.getPhysicalNumberOfCells();
-            log.info("columnCount: {}", columnCount);
-            // 最后行数
-            int lastRowNum = sheet.getLastRowNum();
-            log.info("lastRowNum: {}", lastRowNum);
-            if (lastRowNum == 0) {
-                throw new MyRuntimeException(path.getFileName() + " 数据0条");
-            }
-            // 遍历行
-            for (int i = 1; i <= lastRowNum; i++) {
-                Row row = sheet.getRow(i);
-                if (row == null) {
-                    continue;
-                }
-                Map<String, String> rowMap = new LinkedHashMap<>();
-                // 遍历列
-                for (int j = 0; j < columnCount; j++) {
-                    String header = headers.get(j);
-                    String cellValue = "";
-                    rowMap.put(header, cellValue);
-                    Cell cell = row.getCell(j);
-                    if (cell == null) {
-                        continue;
-                    }
-                    switch (cell.getCellType()) {
-                        case STRING:
-                            // 删除字符串空白字符
-                            cellValue = org.springframework.util.StringUtils.trimAllWhitespace(cell.getStringCellValue());
-                            break;
-                        case NUMERIC:
-                            if (DateUtil.isCellDateFormatted(cell)) {
-                                cellValue = DateUtil.getLocalDateTime(cell.getNumericCellValue())
-                                        .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-                                break;
-                            }
-                            cellValue = String.valueOf(cell.getNumericCellValue());
-                            break;
-                        case BOOLEAN:
-                            cellValue = String.valueOf(cell.getBooleanCellValue());
-                            break;
-                        default:
-                            break;
-                    }
-                    rowMap.put(headers.get(j), cellValue);
-                }
-                resultList.add(rowMap);
-            }
-            return resultList;
-        }
-    }
-
-    /**
-     * 数据加工
-     *
-     * @param path 文件路径
-     * @param list 数据
-     */
-    public List<Map<String, String>> dataProcessing(Path path, List<Map<String, String>> list) {
-        List<OrganizationPo> secondOrgs = organizationService.getSecondOrgs();
-        List<OrganizationPo> thirdOrgs = organizationService.getThirdOrgs();
-        Map<String, OrganizationPo> orgMap = organizationService.getOrgMap(secondOrgs, thirdOrgs);
-        Map<String, List<OrganizationPo>> thirdOrganizationListMap =
-                organizationService.getThirdOrganizationListMap(secondOrgs, thirdOrgs);
-        for (Map<String, String> map : list) {
-            String buMen = map.get("bu_men");
-            String firstUnit = carService.getFirstUnit(buMen);
-            map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(buMen, firstUnit);
-            map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(buMen, secondUnit);
-            map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, buMen);
-            map.put("area_no", areaNo);
-            String areaName = carService.getOrgName(orgMap, areaNo);
-            map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, buMen);
-            map.put("city_no", cityNo);
-            String cityName = carService.getOrgName(orgMap, cityNo);
-            map.put("city_name", cityName);
-            map.put("source", path.getFileName().toString());
-        }
-        return list;
-    }
-
-    /**
-     * 生成csv
-     *
-     * @param path 源文件路径
-     * @param list 数据
-     */
-    public Path toCsv(Path path, List<Map<String, String>> list) throws Exception {
-        log.info("条数:{}", list.size());
-        Files.createDirectories(Paths.get("test/history/"));
-        Path csvPath = Paths.get("test/history/" + path.getFileName() + ".csv");
-        try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(csvPath),
-                StandardCharsets.UTF_8);
-             CSVPrinter printer = new CSVPrinter(osw, CSVFormat.DEFAULT)) {
-            // 添加bom头避免excel乱码
-            osw.write('\ufeff');
-            Map<String, String> header = list.get(0);
-            // 表头
-            printer.printRecord(header.keySet());
-            for (Map<String, String> map : list) {
-                printer.printRecord(map.values());
-            }
-        }
-        return csvPath;
-    }
-}
+//package com.nokia.finance.tasks.car;
+//
+//import com.nokia.finance.tasks.common.exception.MyRuntimeException;
+//import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
+//import com.nokia.finance.tasks.service.car.CarService;
+//import com.nokia.finance.tasks.service.common.OrganizationService;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.csv.CSVFormat;
+//import org.apache.commons.csv.CSVPrinter;
+//import org.apache.poi.ss.usermodel.Cell;
+//import org.apache.poi.ss.usermodel.DateUtil;
+//import org.apache.poi.ss.usermodel.Row;
+//import org.apache.poi.ss.usermodel.Sheet;
+//import org.apache.poi.ss.usermodel.Workbook;
+//import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+//import org.junit.jupiter.api.Test;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.boot.test.context.SpringBootTest;
+//import org.springframework.test.context.ActiveProfiles;
+//import org.springframework.util.CollectionUtils;
+//
+//import java.io.InputStream;
+//import java.io.OutputStreamWriter;
+//import java.nio.charset.StandardCharsets;
+//import java.nio.file.Files;
+//import java.nio.file.Path;
+//import java.nio.file.Paths;
+//import java.time.format.DateTimeFormatter;
+//import java.util.ArrayList;
+//import java.util.LinkedHashMap;
+//import java.util.List;
+//import java.util.Map;
+//import java.util.stream.Stream;
+//
+//@Slf4j
+//@SpringBootTest
+//@ActiveProfiles("dev")
+//class CarJiaoTongBuTieTests {
+//    @Autowired
+//    CarService carService;
+//    @Autowired
+//    OrganizationService organizationService;
+//
+//    /**
+//     * 执行任务
+//     */
+//    @Test
+//    void runJob() {
+//        // 数据目录
+//        Path dir = Paths.get("test/data/jiao-tong-bu-tie");
+//        try (Stream<Path> stream = Files.list(dir)) {
+//            // 获取数据目录下的文件列表
+//            List<Path> pathList = stream.filter(t -> t.toString().endsWith(".xlsx")).sorted().toList();
+//            log.info("数据文件列表: {}", pathList);
+//            if (CollectionUtils.isEmpty(pathList)) {
+//                throw new MyRuntimeException("没有文件");
+//            }
+//            for (Path path : pathList) {
+//                singleJob(path);
+//            }
+//        } catch (Exception e) {
+//            log.error(e.toString(), e);
+//        }
+//    }
+//
+//    /**
+//     * 处理单个文件
+//     *
+//     * @param path 文件路径
+//     */
+//    public void singleJob(Path path) throws Exception {
+//        List<Map<String, String>> list = readFile(path);
+//        List<Map<String, String>> distinctList = dataProcessing(path, list);
+//        Path csvPath = toCsv(path, distinctList);
+//    }
+//
+//    /**
+//     * 读取文件
+//     *
+//     * @param path 文件路径
+//     */
+//    public List<Map<String, String>> readFile(Path path) throws Exception {
+//        log.info("读取: {}", path);
+//        List<String> headers = Stream.of("year_month","di_shi","bu_men","yuan_gong_bian_hao","xing_ming")
+//                .toList();
+//        try (InputStream inputStream = Files.newInputStream(path);
+//             Workbook workbook = new XSSFWorkbook(inputStream)
+//        ) {
+//            List<Map<String, String>> resultList = new ArrayList<>();
+//            // 读取第一个工作表
+//            Sheet sheet = workbook.getSheetAt(0);
+//            // 表头行
+//            Row headerRow = sheet.getRow(0);
+//            // 列数
+//            int columnCount = headerRow.getPhysicalNumberOfCells();
+//            log.info("columnCount: {}", columnCount);
+//            // 最后行数
+//            int lastRowNum = sheet.getLastRowNum();
+//            log.info("lastRowNum: {}", lastRowNum);
+//            if (lastRowNum == 0) {
+//                throw new MyRuntimeException(path.getFileName() + " 数据0条");
+//            }
+//            // 遍历行
+//            for (int i = 1; i <= lastRowNum; i++) {
+//                Row row = sheet.getRow(i);
+//                if (row == null) {
+//                    continue;
+//                }
+//                Map<String, String> rowMap = new LinkedHashMap<>();
+//                // 遍历列
+//                for (int j = 0; j < columnCount; j++) {
+//                    String header = headers.get(j);
+//                    String cellValue = "";
+//                    rowMap.put(header, cellValue);
+//                    Cell cell = row.getCell(j);
+//                    if (cell == null) {
+//                        continue;
+//                    }
+//                    switch (cell.getCellType()) {
+//                        case STRING:
+//                            // 删除字符串空白字符
+//                            cellValue = org.springframework.util.StringUtils.trimAllWhitespace(cell.getStringCellValue());
+//                            break;
+//                        case NUMERIC:
+//                            if (DateUtil.isCellDateFormatted(cell)) {
+//                                cellValue = DateUtil.getLocalDateTime(cell.getNumericCellValue())
+//                                        .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+//                                break;
+//                            }
+//                            cellValue = String.valueOf(cell.getNumericCellValue());
+//                            break;
+//                        case BOOLEAN:
+//                            cellValue = String.valueOf(cell.getBooleanCellValue());
+//                            break;
+//                        default:
+//                            break;
+//                    }
+//                    rowMap.put(headers.get(j), cellValue);
+//                }
+//                resultList.add(rowMap);
+//            }
+//            return resultList;
+//        }
+//    }
+//
+//    /**
+//     * 数据加工
+//     *
+//     * @param path 文件路径
+//     * @param list 数据
+//     */
+//    public List<Map<String, String>> dataProcessing(Path path, List<Map<String, String>> list) {
+//        List<OrganizationPo> secondOrgs = organizationService.getSecondOrgs();
+//        List<OrganizationPo> thirdOrgs = organizationService.getThirdOrgs();
+//        Map<String, OrganizationPo> orgMap = organizationService.getOrgMap(secondOrgs, thirdOrgs);
+//        Map<String, List<OrganizationPo>> thirdOrganizationListMap =
+//                organizationService.getThirdOrganizationListMap(secondOrgs, thirdOrgs);
+//        for (Map<String, String> map : list) {
+//            String buMen = map.get("bu_men");
+//            String firstUnit = carService.getFirstUnit(buMen);
+//            map.put("first_unit", firstUnit);
+//            String secondUnit = carService.getSecondUnit(buMen, firstUnit);
+//            map.put("second_unit", secondUnit);
+//            String thirdUnit = carService.getThirdUnit(buMen, secondUnit);
+//            map.put("third_unit", thirdUnit);
+//            String areaNo = carService.getAreaNo(secondOrgs, buMen);
+//            map.put("area_no", areaNo);
+//            String areaName = carService.getOrgName(orgMap, areaNo);
+//            map.put("area_name", areaName);
+//            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, buMen);
+//            map.put("city_no", cityNo);
+//            String cityName = carService.getOrgName(orgMap, cityNo);
+//            map.put("city_name", cityName);
+//            map.put("source", path.getFileName().toString());
+//        }
+//        return list;
+//    }
+//
+//    /**
+//     * 生成csv
+//     *
+//     * @param path 源文件路径
+//     * @param list 数据
+//     */
+//    public Path toCsv(Path path, List<Map<String, String>> list) throws Exception {
+//        log.info("条数:{}", list.size());
+//        Files.createDirectories(Paths.get("test/history/"));
+//        Path csvPath = Paths.get("test/history/" + path.getFileName() + ".csv");
+//        try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(csvPath),
+//                StandardCharsets.UTF_8);
+//             CSVPrinter printer = new CSVPrinter(osw, CSVFormat.DEFAULT)) {
+//            // 添加bom头避免excel乱码
+//            osw.write('\ufeff');
+//            Map<String, String> header = list.get(0);
+//            // 表头
+//            printer.printRecord(header.keySet());
+//            for (Map<String, String> map : list) {
+//                printer.printRecord(map.values());
+//            }
+//        }
+//        return csvPath;
+//    }
+//}

+ 407 - 407
src/test/java/com/nokia/finance/tasks/car/CarLianXuJiaYouTests.java

@@ -1,407 +1,407 @@
-package com.nokia.finance.tasks.car;
-
-import com.nokia.finance.tasks.common.exception.MyRuntimeException;
-import com.nokia.finance.tasks.pojo.po.common.AreaPo;
-import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
-import com.nokia.finance.tasks.service.car.CarService;
-import com.nokia.finance.tasks.service.common.AreaService;
-import com.nokia.finance.tasks.service.common.OrganizationService;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.csv.CSVFormat;
-import org.apache.commons.csv.CSVPrinter;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.DateUtil;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.ActiveProfiles;
-import org.springframework.util.CollectionUtils;
-import org.springframework.util.StringUtils;
-
-import java.io.InputStream;
-import java.io.OutputStreamWriter;
-import java.math.BigDecimal;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.time.Duration;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Stream;
-
-@Slf4j
-@SpringBootTest
-@ActiveProfiles("dev")
-class CarLianXuJiaYouTests {
-    @Autowired
-    CarService carService;
-    @Autowired
-    OrganizationService organizationService;
-    @Autowired
-    AreaService areaService;
-
-    /**
-     * 执行任务
-     */
-    @Test
-    void runJob() {
-        // 数据目录
-        Path dir = Paths.get("test/data/lian-xu-jia-you");
-        try (Stream<Path> stream = Files.list(dir)) {
-            // 获取数据目录下的文件列表
-            List<Path> pathList = stream.filter(t -> t.toString().endsWith(".xlsx")).sorted().toList();
-            log.info("数据文件列表: {}", pathList);
-            if (CollectionUtils.isEmpty(pathList)) {
-                throw new MyRuntimeException("没有文件");
-            }
-            for (Path path : pathList) {
-                singleJob(path);
-            }
-        } catch (Exception e) {
-            log.error(e.toString(), e);
-        }
-    }
-
-    /**
-     * 处理单个文件
-     *
-     * @param path 文件路径
-     */
-    public void singleJob(Path path) throws Exception {
-        List<Map<String, String>> list = readFile(path);
-        List<Map<String, String>> distinctList = dataProcessing(path, list);
-        Path csvPath = toCsv(path, distinctList);
-    }
-
-    /**
-     * 读取文件
-     *
-     * @param path 文件路径
-     */
-    public List<Map<String, String>> readFile(Path path) throws Exception {
-        log.info("读取: {}", path);
-        List<String> headers = Stream.of("shen_qing_dan_hao", "shen_qing_dan_ming_cheng", "bao_zhang_shi_jian",
-                "di_shi", "shen_qing_ren", "ka_hao", "che_pai_hao", "jiao_yi_shi_jian", "bu_han_shui_jin_e", "shui_lv",
-                "shui_e", "jia_shui_he_ji_jin_e", "che_liang_suo_shu_dan_wei", "di_dian").toList();
-        try (InputStream inputStream = Files.newInputStream(path);
-             Workbook workbook = new XSSFWorkbook(inputStream)
-        ) {
-            List<Map<String, String>> resultList = new ArrayList<>();
-            // 读取第一个工作表
-            Sheet sheet = workbook.getSheetAt(0);
-            // 表头行
-            Row headerRow = sheet.getRow(0);
-            // 列数
-            int columnCount = headerRow.getPhysicalNumberOfCells();
-            log.info("columnCount: {}", columnCount);
-            // 最后行数
-            int lastRowNum = sheet.getLastRowNum();
-            log.info("lastRowNum: {}", lastRowNum);
-            if (lastRowNum == 0) {
-                throw new MyRuntimeException(path.getFileName() + " 数据0条");
-            }
-            // 遍历行
-            for (int i = 1; i <= lastRowNum; i++) {
-                Row row = sheet.getRow(i);
-                if (row == null) {
-                    continue;
-                }
-                Map<String, String> rowMap = new LinkedHashMap<>();
-                // 遍历列
-                for (int j = 0; j < columnCount; j++) {
-                    String header = headers.get(j);
-                    String cellValue = "";
-                    rowMap.put(header, cellValue);
-                    Cell cell = row.getCell(j);
-                    if (cell == null) {
-                        continue;
-                    }
-                    switch (cell.getCellType()) {
-                        case STRING:
-                            boolean skipTrim = "bao_zhang_shi_jian".equals(header) || "jiao_yi_shi_jian".equals(header);
-                            // 删除字符串空白字符
-                            cellValue = skipTrim ? cell.getStringCellValue()
-                                    : StringUtils.trimAllWhitespace(cell.getStringCellValue());
-                            break;
-                        case NUMERIC:
-                            if (DateUtil.isCellDateFormatted(cell)) {
-                                cellValue = DateUtil.getLocalDateTime(cell.getNumericCellValue())
-                                        .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-                                break;
-                            }
-                            cellValue = String.valueOf(cell.getNumericCellValue());
-                            break;
-                        case BOOLEAN:
-                            cellValue = String.valueOf(cell.getBooleanCellValue());
-                            break;
-                        default:
-                            break;
-                    }
-                    rowMap.put(headers.get(j), cellValue);
-                }
-                resultList.add(rowMap);
-            }
-            return resultList;
-        }
-    }
-
-    /**
-     * 数据加工
-     *
-     * @param path 文件路径
-     * @param list 数据
-     */
-    public List<Map<String, String>> dataProcessing(Path path, List<Map<String, String>> list) {
-        List<OrganizationPo> secondOrgs = organizationService.getSecondOrgs();
-        List<OrganizationPo> thirdOrgs = organizationService.getThirdOrgs();
-        Map<String, OrganizationPo> orgMap = organizationService.getOrgMap(secondOrgs, thirdOrgs);
-        Map<String, List<OrganizationPo>> thirdOrganizationListMap =
-                organizationService.getThirdOrganizationListMap(secondOrgs, thirdOrgs);
-        List<AreaPo> cities = areaService.getCities();
-        List<AreaPo> districts = areaService.getDistricts();
-        Map<String, AreaPo> areaMap = areaService.getAreaMap(cities, districts);
-        Map<String, List<AreaPo>> districtListMap = areaService.getDistrictListMap(cities, districts);
-        // 按车牌号分组
-        Map<String, List<CarLianXuJiaYouBo>> carLianXuJiaYouMap = new HashMap<>();
-        for (Map<String, String> map : list) {
-            String jiaoYiShiJian = map.get("jiao_yi_shi_jian");
-            LocalDateTime localDateTime = LocalDateTime.parse(jiaoYiShiJian, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-            String jiaoYiDate = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
-            String yearMonth = localDateTime.format(DateTimeFormatter.ofPattern("yyyyMM"));
-            String year = String.valueOf(localDateTime.getYear());
-            String month = String.valueOf(localDateTime.getMonthValue());
-            map.put("jiao_yi_date", jiaoYiDate);
-            map.put("year_month", yearMonth);
-            map.put("year_no", year);
-            map.put("month_no", month);
-            String rawChePaiHao = map.get("che_pai_hao");
-            map.put("raw_che_pai_hao", rawChePaiHao);
-            String chePaiHao = carService.getChePai(rawChePaiHao);
-            map.put("che_pai_hao", chePaiHao);
-            String chePaiFail = carService.chePaiFail(rawChePaiHao);
-            map.put("che_pai_fail", chePaiFail);
-            String cheLiangSuoShuDanWei = map.get("che_liang_suo_shu_dan_wei");
-            String firstUnit = carService.getFirstUnit(cheLiangSuoShuDanWei);
-            map.put("first_unit", firstUnit);
-            String secondUnit = carService.getSecondUnit(cheLiangSuoShuDanWei, firstUnit);
-            map.put("second_unit", secondUnit);
-            String thirdUnit = carService.getThirdUnit(cheLiangSuoShuDanWei, secondUnit);
-            map.put("third_unit", thirdUnit);
-            String areaNo = carService.getAreaNo(secondOrgs, cheLiangSuoShuDanWei);
-            map.put("area_no", areaNo);
-            String areaName = carService.getOrgName(orgMap, areaNo);
-            map.put("area_name", areaName);
-            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, cheLiangSuoShuDanWei);
-            map.put("city_no", cityNo);
-            String cityName = carService.getOrgName(orgMap, cityNo);
-            map.put("city_name", cityName);
-            String areaNo2 = carService.getAreaNo2(areaName, cityName);
-            map.put("area_no2", areaNo2);
-            String areaName2 = carService.getOrgName(orgMap, areaNo2);
-            map.put("area_name2", areaName2);
-            String cityId = carService.getCityId(cities, cheLiangSuoShuDanWei);
-            map.put("city_id", cityId);
-            String city = carService.getAreaName(areaMap, cityId);
-            map.put("city", city);
-            String districtId = carService.getDistrictId(districtListMap, cityId, cityName, cheLiangSuoShuDanWei);
-            map.put("district_id", districtId);
-            String district = carService.getAreaName(areaMap, districtId);
-            map.put("district", district);
-            map.put("source", path.getFileName().toString());
-            carLianXuJiaYouMap.putIfAbsent(chePaiHao, new ArrayList<>());
-            List<CarLianXuJiaYouBo> carLianXuJiaYouBoList = carLianXuJiaYouMap.get(chePaiHao);
-            carLianXuJiaYouBoList.add(new CarLianXuJiaYouBo(map, localDateTime));
-        }
-        List<CarLianXuJiaYouBo> result = new ArrayList<>();
-        for (List<CarLianXuJiaYouBo> l1 : carLianXuJiaYouMap.values()) {
-            List<CarLianXuJiaYouBo> l2 = l1.stream()
-                    .sorted(Comparator.comparing(CarLianXuJiaYouBo::getLocalDateTime)).toList();
-            result.addAll(l2);
-            int size = l2.size() - 1;
-            for (int i = 0; i < size; i++) {
-                CarLianXuJiaYouBo t1 = l2.get(i);
-                CarLianXuJiaYouBo t2 = l2.get(i + 1);
-                Duration duration = Duration.between(t1.getLocalDateTime(), t2.getLocalDateTime());
-                long hours = duration.toHours();
-                if (hours <= 48) {
-                    t1.setNextJiaoYiShiJian(t2.getJiaoYiShiJian());
-                    t1.setNextJiaoYiDate(t2.getJiaoYiDate());
-                    t1.setNextBuHanShuiJinE(t2.getBuHanShuiJinE());
-                    long seconds = duration.toSeconds();
-                    t1.setTimeInterval(String.valueOf(seconds));
-                    BigDecimal n1 = new BigDecimal(Objects.requireNonNull(t1.getBuHanShuiJinE(), "0"));
-                    BigDecimal n2 = new BigDecimal(Objects.requireNonNull(t2.getBuHanShuiJinE(), "0"));
-                    t1.setBuHanShuiJinESum(n1.add(n2).toString());
-                }
-            }
-        }
-        return result.stream().map(CarLianXuJiaYouBo::toMap).toList();
-    }
-
-    /**
-     * 生成csv
-     *
-     * @param path 源文件路径
-     * @param list 数据
-     */
-    public Path toCsv(Path path, List<Map<String, String>> list) throws Exception {
-        log.info("条数:{}", list.size());
-        Files.createDirectories(Paths.get("test/history/"));
-        Path csvPath = Paths.get("test/history/" + path.getFileName() + ".csv");
-        try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(csvPath),
-                StandardCharsets.UTF_8);
-             CSVPrinter printer = new CSVPrinter(osw, CSVFormat.DEFAULT)) {
-            // 添加bom头避免excel乱码
-            osw.write('\ufeff');
-            Map<String, String> header = list.get(0);
-            // 表头
-            printer.printRecord(header.keySet());
-            for (Map<String, String> map : list) {
-                printer.printRecord(map.values());
-            }
-        }
-        return csvPath;
-    }
-
-    @NoArgsConstructor
-    @Data
-    static class CarLianXuJiaYouBo {
-
-        private String shenQingDanHao;
-        private String shenQingDanMingCheng;
-        private String baoZhangShiJian;
-        private String diShi;
-        private String shenQingRen;
-        private String kaHao;
-        private String chePaiHao;
-        private String jiaoYiShiJian;
-        private String buHanShuiJinE;
-        private String shuiLv;
-        private String shuiE;
-        private String jiaShuiHeJiJinE;
-        private String cheLiangSuoShuDanWei;
-        private String diDian;
-        private String jiaoYiDate;
-        private String yearMonth;
-        private String yearNo;
-        private String monthNo;
-        private String rawChePaiHao;
-        private String chePaiFail;
-        private String firstUnit;
-        private String secondUnit;
-        private String thirdUnit;
-        private String areaNo;
-        private String areaName;
-        private String cityNo;
-        private String cityName;
-        private String areaNo2;
-        private String areaName2;
-        private String cityId;
-        private String city;
-        private String districtId;
-        private String district;
-        private String source;
-        private LocalDateTime localDateTime;
-        private String nextJiaoYiShiJian;
-        private String nextJiaoYiDate;
-        private String nextBuHanShuiJinE;
-        private String timeInterval;
-        private String buHanShuiJinESum;
-
-        public CarLianXuJiaYouBo(Map<String, String> map, LocalDateTime localDateTime) {
-            this.shenQingDanHao = map.get("shen_qing_dan_hao");
-            this.shenQingDanMingCheng = map.get("shen_qing_dan_ming_cheng");
-            this.baoZhangShiJian = map.get("bao_zhang_shi_jian");
-            this.diShi = map.get("di_shi");
-            this.shenQingRen = map.get("shen_qing_ren");
-            this.kaHao = map.get("ka_hao");
-            this.chePaiHao = map.get("che_pai_hao");
-            this.jiaoYiShiJian = map.get("jiao_yi_shi_jian");
-            this.buHanShuiJinE = map.get("bu_han_shui_jin_e");
-            this.shuiLv = map.get("shui_lv");
-            this.shuiE = map.get("shui_e");
-            this.jiaShuiHeJiJinE =map.get("jia_shui_he_ji_jin_e");
-            this.cheLiangSuoShuDanWei = map.get("che_liang_suo_shu_dan_wei");
-            this.diDian = map.get("di_dian");
-            this.jiaoYiDate = map.get("jiao_yi_date");
-            this.yearMonth = map.get("year_month");
-            this.yearNo = map.get("year_no");
-            this.monthNo = map.get("month_no");
-            this.rawChePaiHao = map.get("raw_che_pai_hao");
-            this.chePaiFail = map.get("che_pai_fail");
-            this.firstUnit = map.get("first_unit");
-            this.secondUnit = map.get("second_unit");
-            this.thirdUnit = map.get("third_unit");
-            this.areaNo = map.get("area_no");
-            this.areaName = map.get("area_name");
-            this.cityNo = map.get("city_no");
-            this.cityName = map.get("city_name");
-            this.areaNo2 = map.get("area_no2");
-            this.areaName2 = map.get("area_name2");
-            this.cityId = map.get("city_id");
-            this.city = map.get("city");
-            this.districtId = map.get("district_id");
-            this.district = map.get("district");
-            this.source = map.get("source");
-            this.localDateTime = localDateTime;
-        }
-
-        public Map<String, String> toMap() {
-            LinkedHashMap<String, String> map = new LinkedHashMap<>();
-            map.put("shen_qing_dan_hao", shenQingDanHao);
-            map.put("shen_qing_dan_ming_cheng", shenQingDanMingCheng);
-            map.put("bao_zhang_shi_jian", baoZhangShiJian);
-            map.put("di_shi", diShi);
-            map.put("shen_qing_ren", shenQingRen);
-            map.put("ka_hao", kaHao);
-            map.put("che_pai_hao", chePaiHao);
-            map.put("jiao_yi_shi_jian", jiaoYiShiJian);
-            map.put("bu_han_shui_jin_e", buHanShuiJinE);
-            map.put("shui_lv", shuiLv);
-            map.put("shui_e", shuiE);
-            map.put("jia_shui_he_ji_jin_e", jiaShuiHeJiJinE);
-            map.put("che_liang_suo_shu_dan_wei", cheLiangSuoShuDanWei);
-            map.put("di_dian", diDian);
-            map.put("jiao_yi_date", jiaoYiDate);
-            map.put("year_month", yearMonth);
-            map.put("year_no", yearNo);
-            map.put("month_no", monthNo);
-            map.put("raw_che_pai_hao", rawChePaiHao);
-            map.put("che_pai_fail", chePaiFail);
-            map.put("first_unit", firstUnit);
-            map.put("second_unit", secondUnit);
-            map.put("third_unit", thirdUnit);
-            map.put("area_no", areaNo);
-            map.put("area_name", areaName);
-            map.put("city_no", cityNo);
-            map.put("city_name", cityName);
-            map.put("area_no2", areaNo2);
-            map.put("area_name2", areaName2);
-            map.put("city_id", cityId);
-            map.put("city", city);
-            map.put("district_id", districtId);
-            map.put("district", district);
-            map.put("source", source);
-            map.put("next_jiao_yi_shi_jian", nextJiaoYiShiJian);
-            map.put("next_jiao_yi_date", nextJiaoYiDate);
-            map.put("next_bu_han_shui_jin_e", nextBuHanShuiJinE);
-            map.put("time_interval", timeInterval);
-            map.put("bu_han_shui_jin_e_sum", buHanShuiJinESum);
-            return map;
-        }
-    }
-}
+//package com.nokia.finance.tasks.car;
+//
+//import com.nokia.finance.tasks.common.exception.MyRuntimeException;
+//import com.nokia.finance.tasks.pojo.po.common.AreaPo;
+//import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
+//import com.nokia.finance.tasks.service.car.CarService;
+//import com.nokia.finance.tasks.service.common.AreaService;
+//import com.nokia.finance.tasks.service.common.OrganizationService;
+//import lombok.Data;
+//import lombok.NoArgsConstructor;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.csv.CSVFormat;
+//import org.apache.commons.csv.CSVPrinter;
+//import org.apache.poi.ss.usermodel.Cell;
+//import org.apache.poi.ss.usermodel.DateUtil;
+//import org.apache.poi.ss.usermodel.Row;
+//import org.apache.poi.ss.usermodel.Sheet;
+//import org.apache.poi.ss.usermodel.Workbook;
+//import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+//import org.junit.jupiter.api.Test;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.boot.test.context.SpringBootTest;
+//import org.springframework.test.context.ActiveProfiles;
+//import org.springframework.util.CollectionUtils;
+//import org.springframework.util.StringUtils;
+//
+//import java.io.InputStream;
+//import java.io.OutputStreamWriter;
+//import java.math.BigDecimal;
+//import java.nio.charset.StandardCharsets;
+//import java.nio.file.Files;
+//import java.nio.file.Path;
+//import java.nio.file.Paths;
+//import java.time.Duration;
+//import java.time.LocalDateTime;
+//import java.time.format.DateTimeFormatter;
+//import java.util.ArrayList;
+//import java.util.Comparator;
+//import java.util.HashMap;
+//import java.util.LinkedHashMap;
+//import java.util.List;
+//import java.util.Map;
+//import java.util.Objects;
+//import java.util.stream.Stream;
+//
+//@Slf4j
+//@SpringBootTest
+//@ActiveProfiles("dev")
+//class CarLianXuJiaYouTests {
+//    @Autowired
+//    CarService carService;
+//    @Autowired
+//    OrganizationService organizationService;
+//    @Autowired
+//    AreaService areaService;
+//
+//    /**
+//     * 执行任务
+//     */
+//    @Test
+//    void runJob() {
+//        // 数据目录
+//        Path dir = Paths.get("test/data/lian-xu-jia-you");
+//        try (Stream<Path> stream = Files.list(dir)) {
+//            // 获取数据目录下的文件列表
+//            List<Path> pathList = stream.filter(t -> t.toString().endsWith(".xlsx")).sorted().toList();
+//            log.info("数据文件列表: {}", pathList);
+//            if (CollectionUtils.isEmpty(pathList)) {
+//                throw new MyRuntimeException("没有文件");
+//            }
+//            for (Path path : pathList) {
+//                singleJob(path);
+//            }
+//        } catch (Exception e) {
+//            log.error(e.toString(), e);
+//        }
+//    }
+//
+//    /**
+//     * 处理单个文件
+//     *
+//     * @param path 文件路径
+//     */
+//    public void singleJob(Path path) throws Exception {
+//        List<Map<String, String>> list = readFile(path);
+//        List<Map<String, String>> distinctList = dataProcessing(path, list);
+//        Path csvPath = toCsv(path, distinctList);
+//    }
+//
+//    /**
+//     * 读取文件
+//     *
+//     * @param path 文件路径
+//     */
+//    public List<Map<String, String>> readFile(Path path) throws Exception {
+//        log.info("读取: {}", path);
+//        List<String> headers = Stream.of("shen_qing_dan_hao", "shen_qing_dan_ming_cheng", "bao_zhang_shi_jian",
+//                "di_shi", "shen_qing_ren", "ka_hao", "che_pai_hao", "jiao_yi_shi_jian", "bu_han_shui_jin_e", "shui_lv",
+//                "shui_e", "jia_shui_he_ji_jin_e", "che_liang_suo_shu_dan_wei", "di_dian").toList();
+//        try (InputStream inputStream = Files.newInputStream(path);
+//             Workbook workbook = new XSSFWorkbook(inputStream)
+//        ) {
+//            List<Map<String, String>> resultList = new ArrayList<>();
+//            // 读取第一个工作表
+//            Sheet sheet = workbook.getSheetAt(0);
+//            // 表头行
+//            Row headerRow = sheet.getRow(0);
+//            // 列数
+//            int columnCount = headerRow.getPhysicalNumberOfCells();
+//            log.info("columnCount: {}", columnCount);
+//            // 最后行数
+//            int lastRowNum = sheet.getLastRowNum();
+//            log.info("lastRowNum: {}", lastRowNum);
+//            if (lastRowNum == 0) {
+//                throw new MyRuntimeException(path.getFileName() + " 数据0条");
+//            }
+//            // 遍历行
+//            for (int i = 1; i <= lastRowNum; i++) {
+//                Row row = sheet.getRow(i);
+//                if (row == null) {
+//                    continue;
+//                }
+//                Map<String, String> rowMap = new LinkedHashMap<>();
+//                // 遍历列
+//                for (int j = 0; j < columnCount; j++) {
+//                    String header = headers.get(j);
+//                    String cellValue = "";
+//                    rowMap.put(header, cellValue);
+//                    Cell cell = row.getCell(j);
+//                    if (cell == null) {
+//                        continue;
+//                    }
+//                    switch (cell.getCellType()) {
+//                        case STRING:
+//                            boolean skipTrim = "bao_zhang_shi_jian".equals(header) || "jiao_yi_shi_jian".equals(header);
+//                            // 删除字符串空白字符
+//                            cellValue = skipTrim ? cell.getStringCellValue()
+//                                    : StringUtils.trimAllWhitespace(cell.getStringCellValue());
+//                            break;
+//                        case NUMERIC:
+//                            if (DateUtil.isCellDateFormatted(cell)) {
+//                                cellValue = DateUtil.getLocalDateTime(cell.getNumericCellValue())
+//                                        .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+//                                break;
+//                            }
+//                            cellValue = String.valueOf(cell.getNumericCellValue());
+//                            break;
+//                        case BOOLEAN:
+//                            cellValue = String.valueOf(cell.getBooleanCellValue());
+//                            break;
+//                        default:
+//                            break;
+//                    }
+//                    rowMap.put(headers.get(j), cellValue);
+//                }
+//                resultList.add(rowMap);
+//            }
+//            return resultList;
+//        }
+//    }
+//
+//    /**
+//     * 数据加工
+//     *
+//     * @param path 文件路径
+//     * @param list 数据
+//     */
+//    public List<Map<String, String>> dataProcessing(Path path, List<Map<String, String>> list) {
+//        List<OrganizationPo> secondOrgs = organizationService.getSecondOrgs();
+//        List<OrganizationPo> thirdOrgs = organizationService.getThirdOrgs();
+//        Map<String, OrganizationPo> orgMap = organizationService.getOrgMap(secondOrgs, thirdOrgs);
+//        Map<String, List<OrganizationPo>> thirdOrganizationListMap =
+//                organizationService.getThirdOrganizationListMap(secondOrgs, thirdOrgs);
+//        List<AreaPo> cities = areaService.getCities();
+//        List<AreaPo> districts = areaService.getDistricts();
+//        Map<String, AreaPo> areaMap = areaService.getAreaMap(cities, districts);
+//        Map<String, List<AreaPo>> districtListMap = areaService.getDistrictListMap(cities, districts);
+//        // 按车牌号分组
+//        Map<String, List<CarLianXuJiaYouBo>> carLianXuJiaYouMap = new HashMap<>();
+//        for (Map<String, String> map : list) {
+//            String jiaoYiShiJian = map.get("jiao_yi_shi_jian");
+//            LocalDateTime localDateTime = LocalDateTime.parse(jiaoYiShiJian, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+//            String jiaoYiDate = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+//            String yearMonth = localDateTime.format(DateTimeFormatter.ofPattern("yyyyMM"));
+//            String year = String.valueOf(localDateTime.getYear());
+//            String month = String.valueOf(localDateTime.getMonthValue());
+//            map.put("jiao_yi_date", jiaoYiDate);
+//            map.put("year_month", yearMonth);
+//            map.put("year_no", year);
+//            map.put("month_no", month);
+//            String rawChePaiHao = map.get("che_pai_hao");
+//            map.put("raw_che_pai_hao", rawChePaiHao);
+//            String chePaiHao = carService.getChePai(rawChePaiHao);
+//            map.put("che_pai_hao", chePaiHao);
+//            String chePaiFail = carService.chePaiFail(rawChePaiHao);
+//            map.put("che_pai_fail", chePaiFail);
+//            String cheLiangSuoShuDanWei = map.get("che_liang_suo_shu_dan_wei");
+//            String firstUnit = carService.getFirstUnit(cheLiangSuoShuDanWei);
+//            map.put("first_unit", firstUnit);
+//            String secondUnit = carService.getSecondUnit(cheLiangSuoShuDanWei, firstUnit);
+//            map.put("second_unit", secondUnit);
+//            String thirdUnit = carService.getThirdUnit(cheLiangSuoShuDanWei, secondUnit);
+//            map.put("third_unit", thirdUnit);
+//            String areaNo = carService.getAreaNo(secondOrgs, cheLiangSuoShuDanWei);
+//            map.put("area_no", areaNo);
+//            String areaName = carService.getOrgName(orgMap, areaNo);
+//            map.put("area_name", areaName);
+//            String cityNo = carService.getCityNo(thirdOrganizationListMap, areaNo, areaName, cheLiangSuoShuDanWei);
+//            map.put("city_no", cityNo);
+//            String cityName = carService.getOrgName(orgMap, cityNo);
+//            map.put("city_name", cityName);
+//            String areaNo2 = carService.getAreaNo2(areaName, cityName);
+//            map.put("area_no2", areaNo2);
+//            String areaName2 = carService.getOrgName(orgMap, areaNo2);
+//            map.put("area_name2", areaName2);
+//            String cityId = carService.getCityId(cities, cheLiangSuoShuDanWei);
+//            map.put("city_id", cityId);
+//            String city = carService.getAreaName(areaMap, cityId);
+//            map.put("city", city);
+//            String districtId = carService.getDistrictId(districtListMap, cityId, cityName, cheLiangSuoShuDanWei);
+//            map.put("district_id", districtId);
+//            String district = carService.getAreaName(areaMap, districtId);
+//            map.put("district", district);
+//            map.put("source", path.getFileName().toString());
+//            carLianXuJiaYouMap.putIfAbsent(chePaiHao, new ArrayList<>());
+//            List<CarLianXuJiaYouBo> carLianXuJiaYouBoList = carLianXuJiaYouMap.get(chePaiHao);
+//            carLianXuJiaYouBoList.add(new CarLianXuJiaYouBo(map, localDateTime));
+//        }
+//        List<CarLianXuJiaYouBo> result = new ArrayList<>();
+//        for (List<CarLianXuJiaYouBo> l1 : carLianXuJiaYouMap.values()) {
+//            List<CarLianXuJiaYouBo> l2 = l1.stream()
+//                    .sorted(Comparator.comparing(CarLianXuJiaYouBo::getLocalDateTime)).toList();
+//            result.addAll(l2);
+//            int size = l2.size() - 1;
+//            for (int i = 0; i < size; i++) {
+//                CarLianXuJiaYouBo t1 = l2.get(i);
+//                CarLianXuJiaYouBo t2 = l2.get(i + 1);
+//                Duration duration = Duration.between(t1.getLocalDateTime(), t2.getLocalDateTime());
+//                long hours = duration.toHours();
+//                if (hours <= 48) {
+//                    t1.setNextJiaoYiShiJian(t2.getJiaoYiShiJian());
+//                    t1.setNextJiaoYiDate(t2.getJiaoYiDate());
+//                    t1.setNextBuHanShuiJinE(t2.getBuHanShuiJinE());
+//                    long seconds = duration.toSeconds();
+//                    t1.setTimeInterval(String.valueOf(seconds));
+//                    BigDecimal n1 = new BigDecimal(Objects.requireNonNull(t1.getBuHanShuiJinE(), "0"));
+//                    BigDecimal n2 = new BigDecimal(Objects.requireNonNull(t2.getBuHanShuiJinE(), "0"));
+//                    t1.setBuHanShuiJinESum(n1.add(n2).toString());
+//                }
+//            }
+//        }
+//        return result.stream().map(CarLianXuJiaYouBo::toMap).toList();
+//    }
+//
+//    /**
+//     * 生成csv
+//     *
+//     * @param path 源文件路径
+//     * @param list 数据
+//     */
+//    public Path toCsv(Path path, List<Map<String, String>> list) throws Exception {
+//        log.info("条数:{}", list.size());
+//        Files.createDirectories(Paths.get("test/history/"));
+//        Path csvPath = Paths.get("test/history/" + path.getFileName() + ".csv");
+//        try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(csvPath),
+//                StandardCharsets.UTF_8);
+//             CSVPrinter printer = new CSVPrinter(osw, CSVFormat.DEFAULT)) {
+//            // 添加bom头避免excel乱码
+//            osw.write('\ufeff');
+//            Map<String, String> header = list.get(0);
+//            // 表头
+//            printer.printRecord(header.keySet());
+//            for (Map<String, String> map : list) {
+//                printer.printRecord(map.values());
+//            }
+//        }
+//        return csvPath;
+//    }
+//
+//    @NoArgsConstructor
+//    @Data
+//    static class CarLianXuJiaYouBo {
+//
+//        private String shenQingDanHao;
+//        private String shenQingDanMingCheng;
+//        private String baoZhangShiJian;
+//        private String diShi;
+//        private String shenQingRen;
+//        private String kaHao;
+//        private String chePaiHao;
+//        private String jiaoYiShiJian;
+//        private String buHanShuiJinE;
+//        private String shuiLv;
+//        private String shuiE;
+//        private String jiaShuiHeJiJinE;
+//        private String cheLiangSuoShuDanWei;
+//        private String diDian;
+//        private String jiaoYiDate;
+//        private String yearMonth;
+//        private String yearNo;
+//        private String monthNo;
+//        private String rawChePaiHao;
+//        private String chePaiFail;
+//        private String firstUnit;
+//        private String secondUnit;
+//        private String thirdUnit;
+//        private String areaNo;
+//        private String areaName;
+//        private String cityNo;
+//        private String cityName;
+//        private String areaNo2;
+//        private String areaName2;
+//        private String cityId;
+//        private String city;
+//        private String districtId;
+//        private String district;
+//        private String source;
+//        private LocalDateTime localDateTime;
+//        private String nextJiaoYiShiJian;
+//        private String nextJiaoYiDate;
+//        private String nextBuHanShuiJinE;
+//        private String timeInterval;
+//        private String buHanShuiJinESum;
+//
+//        public CarLianXuJiaYouBo(Map<String, String> map, LocalDateTime localDateTime) {
+//            this.shenQingDanHao = map.get("shen_qing_dan_hao");
+//            this.shenQingDanMingCheng = map.get("shen_qing_dan_ming_cheng");
+//            this.baoZhangShiJian = map.get("bao_zhang_shi_jian");
+//            this.diShi = map.get("di_shi");
+//            this.shenQingRen = map.get("shen_qing_ren");
+//            this.kaHao = map.get("ka_hao");
+//            this.chePaiHao = map.get("che_pai_hao");
+//            this.jiaoYiShiJian = map.get("jiao_yi_shi_jian");
+//            this.buHanShuiJinE = map.get("bu_han_shui_jin_e");
+//            this.shuiLv = map.get("shui_lv");
+//            this.shuiE = map.get("shui_e");
+//            this.jiaShuiHeJiJinE =map.get("jia_shui_he_ji_jin_e");
+//            this.cheLiangSuoShuDanWei = map.get("che_liang_suo_shu_dan_wei");
+//            this.diDian = map.get("di_dian");
+//            this.jiaoYiDate = map.get("jiao_yi_date");
+//            this.yearMonth = map.get("year_month");
+//            this.yearNo = map.get("year_no");
+//            this.monthNo = map.get("month_no");
+//            this.rawChePaiHao = map.get("raw_che_pai_hao");
+//            this.chePaiFail = map.get("che_pai_fail");
+//            this.firstUnit = map.get("first_unit");
+//            this.secondUnit = map.get("second_unit");
+//            this.thirdUnit = map.get("third_unit");
+//            this.areaNo = map.get("area_no");
+//            this.areaName = map.get("area_name");
+//            this.cityNo = map.get("city_no");
+//            this.cityName = map.get("city_name");
+//            this.areaNo2 = map.get("area_no2");
+//            this.areaName2 = map.get("area_name2");
+//            this.cityId = map.get("city_id");
+//            this.city = map.get("city");
+//            this.districtId = map.get("district_id");
+//            this.district = map.get("district");
+//            this.source = map.get("source");
+//            this.localDateTime = localDateTime;
+//        }
+//
+//        public Map<String, String> toMap() {
+//            LinkedHashMap<String, String> map = new LinkedHashMap<>();
+//            map.put("shen_qing_dan_hao", shenQingDanHao);
+//            map.put("shen_qing_dan_ming_cheng", shenQingDanMingCheng);
+//            map.put("bao_zhang_shi_jian", baoZhangShiJian);
+//            map.put("di_shi", diShi);
+//            map.put("shen_qing_ren", shenQingRen);
+//            map.put("ka_hao", kaHao);
+//            map.put("che_pai_hao", chePaiHao);
+//            map.put("jiao_yi_shi_jian", jiaoYiShiJian);
+//            map.put("bu_han_shui_jin_e", buHanShuiJinE);
+//            map.put("shui_lv", shuiLv);
+//            map.put("shui_e", shuiE);
+//            map.put("jia_shui_he_ji_jin_e", jiaShuiHeJiJinE);
+//            map.put("che_liang_suo_shu_dan_wei", cheLiangSuoShuDanWei);
+//            map.put("di_dian", diDian);
+//            map.put("jiao_yi_date", jiaoYiDate);
+//            map.put("year_month", yearMonth);
+//            map.put("year_no", yearNo);
+//            map.put("month_no", monthNo);
+//            map.put("raw_che_pai_hao", rawChePaiHao);
+//            map.put("che_pai_fail", chePaiFail);
+//            map.put("first_unit", firstUnit);
+//            map.put("second_unit", secondUnit);
+//            map.put("third_unit", thirdUnit);
+//            map.put("area_no", areaNo);
+//            map.put("area_name", areaName);
+//            map.put("city_no", cityNo);
+//            map.put("city_name", cityName);
+//            map.put("area_no2", areaNo2);
+//            map.put("area_name2", areaName2);
+//            map.put("city_id", cityId);
+//            map.put("city", city);
+//            map.put("district_id", districtId);
+//            map.put("district", district);
+//            map.put("source", source);
+//            map.put("next_jiao_yi_shi_jian", nextJiaoYiShiJian);
+//            map.put("next_jiao_yi_date", nextJiaoYiDate);
+//            map.put("next_bu_han_shui_jin_e", nextBuHanShuiJinE);
+//            map.put("time_interval", timeInterval);
+//            map.put("bu_han_shui_jin_e_sum", buHanShuiJinESum);
+//            return map;
+//        }
+//    }
+//}