Browse Source

feat: 实现河北成本管理系统车辆燃油、大额维修、普通维修、路桥、保险、年检、其他费用、自有类房产维修数据入库定时任务

weijianghai 1 year ago
parent
commit
ef8b91e467
22 changed files with 2273 additions and 2 deletions
  1. 64 0
      src/main/java/com/nokia/finance/tasks/config/JobConfig.java
  2. 32 0
      src/main/java/com/nokia/finance/tasks/enums/JobEnum.java
  3. 244 0
      src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarBaoXianJob.java
  4. 241 0
      src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarDaWeiXiuJob.java
  5. 240 0
      src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarLuQiaoJob.java
  6. 240 0
      src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarNianJianFeiJob.java
  7. 240 0
      src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarQiTaJob.java
  8. 242 0
      src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarRanYouJob.java
  9. 241 0
      src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarWeiXiuJob.java
  10. 196 0
      src/main/java/com/nokia/finance/tasks/jobs/house/chengben/HouseBuildingRepairMonthJob.java
  11. 52 1
      src/main/java/com/nokia/finance/tasks/service/JobService.java
  12. 1 1
      src/main/java/com/nokia/finance/tasks/service/car/CarService.java
  13. 32 0
      src/main/resources/application-dev.yml
  14. 32 0
      src/main/resources/application-prod.yml
  15. 22 0
      src/test/java/com/nokia/finance/tasks/car/chengben/CarBaoXianJobTests.java
  16. 22 0
      src/test/java/com/nokia/finance/tasks/car/chengben/CarDaWeiXiuJobTests.java
  17. 22 0
      src/test/java/com/nokia/finance/tasks/car/chengben/CarLuQiaoJobTests.java
  18. 22 0
      src/test/java/com/nokia/finance/tasks/car/chengben/CarNianJianFeiJobTests.java
  19. 22 0
      src/test/java/com/nokia/finance/tasks/car/chengben/CarQiTaJobTests.java
  20. 22 0
      src/test/java/com/nokia/finance/tasks/car/chengben/CarRanYouJobTests.java
  21. 22 0
      src/test/java/com/nokia/finance/tasks/car/chengben/CarWeiXiuJobTests.java
  22. 22 0
      src/test/java/com/nokia/finance/tasks/house/chengben/HouseBuildingRepairMonthJobTests.java

+ 64 - 0
src/main/java/com/nokia/finance/tasks/config/JobConfig.java

@@ -64,4 +64,68 @@ public class JobConfig {
      * 睿行车辆行驶里程月数据归档路径
      */
     private String xslcytjHistoryPath;
+    /**
+     * 河北成本管理系统车辆燃油数据路径
+     */
+    private String carRanYouSourcePath;
+    /**
+     * 河北成本管理系统车辆燃油数据归档路径
+     */
+    private String carRanYouHistoryPath;
+    /**
+     * 河北成本管理系统车辆大额维修数据路径
+     */
+    private String carDaWeiXiuSourcePath;
+    /**
+     * 河北成本管理系统车辆大额维修数据归档路径
+     */
+    private String carDaWeiXiuHistoryPath;
+    /**
+     * 河北成本管理系统车辆普通维修数据路径
+     */
+    private String carWeiXiuSourcePath;
+    /**
+     * 河北成本管理系统车辆普通维修数据归档路径
+     */
+    private String carWeiXiuHistoryPath;
+    /**
+     * 河北成本管理系统车辆路桥数据路径
+     */
+    private String carLuQiaoSourcePath;
+    /**
+     * 河北成本管理系统车辆路桥数据归档路径
+     */
+    private String carLuQiaoHistoryPath;
+    /**
+     * 河北成本管理系统车辆保险数据路径
+     */
+    private String carBaoXianSourcePath;
+    /**
+     * 河北成本管理系统车辆保险数据归档路径
+     */
+    private String carBaoXianHistoryPath;
+    /**
+     * 河北成本管理系统车辆年检数据路径
+     */
+    private String carNianJianFeiSourcePath;
+    /**
+     * 河北成本管理系统车辆年检数据归档路径
+     */
+    private String carNianJianFeiHistoryPath;
+    /**
+     * 河北成本管理系统车辆其他费用数据路径
+     */
+    private String carQiTaSourcePath;
+    /**
+     * 河北成本管理系统车辆其他费用数据归档路径
+     */
+    private String carQiTaHistoryPath;
+    /**
+     * 河北成本管理系统自有类房产维修数据路径
+     */
+    private String houseBuildingRepairMonthSourcePath;
+    /**
+     * 河北成本管理系统自有类房产维修数据归档路径
+     */
+    private String houseBuildingRepairMonthHistoryPath;
 }

+ 32 - 0
src/main/java/com/nokia/finance/tasks/enums/JobEnum.java

@@ -17,5 +17,37 @@ public enum JobEnum {
      * 睿行车辆行驶里程月数据入库定时任务
      */
     XSLCYTJ_JOB,
+    /**
+     * 河北成本管理系统车辆燃油数据入库定时任务
+     */
+    CAR_RAN_YOU_JOB,
+    /**
+     * 河北成本管理系统车辆大额维修数据入库定时任务
+     */
+    CAR_DA_WEI_XIU_JOB,
+    /**
+     * 河北成本管理系统车辆普通维修数据入库定时任务
+     */
+    CAR_WEI_XIU_JOB,
+    /**
+     * 河北成本管理系统车辆路桥数据入库定时任务
+     */
+    CAR_LU_QIAO_JOB,
+    /**
+     * 河北成本管理系统车辆保险数据入库定时任务
+     */
+    CAR_BAO_XIAN_JOB,
+    /**
+     * 河北成本管理系统车辆年检数据入库定时任务
+     */
+    CAR_NIAN_JIAN_FEI_JOB,
+    /**
+     * 河北成本管理系统车辆其他费用数据入库定时任务
+     */
+    CAR_QI_TA_JOB,
+    /**
+     * 河北成本管理系统自有类房产维修数据入库定时任务
+     */
+    HOUSE_BUILDING_REPAIR_MONTH_JOB,
     ;
 }

+ 244 - 0
src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarBaoXianJob.java

@@ -0,0 +1,244 @@
+package com.nokia.finance.tasks.jobs.car.chengben;
+
+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.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.CSVParser;
+import org.apache.commons.csv.CSVPrinter;
+import org.apache.commons.csv.CSVRecord;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.io.InputStreamReader;
+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.nio.file.StandardCopyOption;
+import java.time.LocalDateTime;
+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
+@Service
+public class CarBaoXianJob {
+    private final JobConfig jobConfig;
+    private final CarService carService;
+    private final OrganizationService organizationService;
+    private final AreaService areaService;
+
+    public CarBaoXianJob(JobConfig jobConfig, CarService carService, OrganizationService organizationService,
+                         AreaService areaService) {
+        this.jobConfig = jobConfig;
+        this.carService = carService;
+        this.organizationService = organizationService;
+        this.areaService = areaService;
+    }
+
+    /**
+     * 执行任务
+     */
+//    @Scheduled(cron = "0 35 23 1 * ?")
+    public void runJob() {
+        // 数据目录
+        Path dir = Paths.get(jobConfig.getCarBaoXianSourcePath());
+        try (Stream<Path> stream = Files.list(dir)) {
+            // 获取数据目录下的文件列表
+            List<Path> pathList = stream.filter(t -> !t.toString().endsWith(".MD5")).sorted().toList();
+            log.info("河北成本管理系统车辆保险数据文件列表: {}", pathList);
+            if (CollectionUtils.isEmpty(pathList)) {
+                throw new MyRuntimeException("河北成本管理系统车辆保险数据没有文件");
+            }
+            for (Path path : pathList) {
+                singleJob(path);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), 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);
+        copyCsv(csvPath);
+        move(path);
+    }
+
+    /**
+     * 读取文件
+     *
+     * @param path 文件路径
+     */
+    public List<Map<String, String>> readFile(Path path) throws Exception {
+        log.info("读取: {}", path);
+        List<String> headers = Stream.of(
+                "data_time_nlsd",
+                "data_time", "form_type", "submitter", "submitter_dept_id", "form_no", "reimbursement_no",
+                "start_time", "form_id", "license_plate_number", "motorcycle_type", "dept_id", "rent_start_time",
+                "rent_end_time", "supplier", "invoice_type", "jq_amount_excluding_tax", "cc_tax_amount",
+                "jq_total_amount", "sy_amount_excluding_tax", "sy_total_amount", "total_amount",
+                "commercial_insurance").toList();
+        int headerSize = headers.size();
+        char delimiter = 1;
+        try (CSVParser parser = CSVFormat.DEFAULT.builder().setDelimiter(delimiter).build()
+                .parse(new InputStreamReader(Files.newInputStream(path), StandardCharsets.UTF_8))
+        ) {
+            List<Map<String, String>> resultList = new ArrayList<>();
+            for (CSVRecord csvRecord : parser) {
+                Map<String, String> rowMap = new LinkedHashMap<>();
+                for (int i = 0; i < headerSize; i++) {
+                    String header = headers.get(i);
+                    String value = csvRecord.get(i);
+                    if (!"start_time".equals(header)
+                            && !"rent_start_time".equals(header)
+                            && !"rent_end_time".equals(header)) {
+                        // 删除空白字符
+                        value = StringUtils.trimAllWhitespace(value);
+                    }
+                    rowMap.put(header, value);
+                }
+                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);
+        for (Map<String, String> map : list) {
+            String startTime = map.get("start_time");
+            LocalDateTime localDateTime = LocalDateTime.parse(startTime,
+                    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 rawChePaiHao = map.get("license_plate_number");
+            map.put("raw_license_plate_number", rawChePaiHao);
+            String chePaiHao = carService.getChePai(rawChePaiHao);
+            map.put("license_plate_number", chePaiHao);
+            String chePaiFail = carService.chePaiFail(rawChePaiHao);
+            map.put("che_pai_fail", chePaiFail);
+            String cheLiangSuoShuDanWei = map.get("dept_id");
+            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());
+        }
+        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(jobConfig.getCarBaoXianHistoryPath()));
+        Path csvPath = Paths.get(jobConfig.getCarBaoXianHistoryPath() + 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;
+    }
+
+    /**
+     * 导入数据库
+     *
+     * @param path 文件路径
+     */
+    public void copyCsv(Path path) {
+        String dbTable = "car.car_bao_xian";
+        String csv = path.toString();
+        String columns = "(data_time_nlsd,data_time,form_type,submitter,submitter_dept_id,form_no,reimbursement_no,start_time,form_id,license_plate_number,motorcycle_type,dept_id,rent_start_time,rent_end_time,supplier,invoice_type,jq_amount_excluding_tax,cc_tax_amount,jq_total_amount,sy_amount_excluding_tax,sy_total_amount,total_amount,commercial_insurance,year_month,year_no,month_no,raw_license_plate_number,che_pai_fail,first_unit,second_unit,third_unit,area_no,area_name,city_no,city_name,area_no2,area_name2,city_id,city,district_id,district,source)";
+        Long timeout = 60000L;
+        PsqlUtil.copyCsv(jobConfig.getCopyScriptPath(), jobConfig.getDbHost(), jobConfig.getDbPort(),
+                jobConfig.getDbUsername(), jobConfig.getDbPassword(), jobConfig.getDbName(), dbTable, csv, columns,
+                timeout, null);
+    }
+
+    /**
+     * 移动源文件到历史文件夹
+     *
+     * @param path 源文件路径
+     */
+    public void move(Path path) throws Exception {
+        Files.move(Paths.get(path + ".MD5"),
+                Paths.get(jobConfig.getCarBaoXianHistoryPath(), path.getFileName().toString() + ".MD5"),
+                StandardCopyOption.REPLACE_EXISTING);
+        Files.move(path, Paths.get(jobConfig.getCarBaoXianHistoryPath(), path.getFileName().toString()),
+                StandardCopyOption.REPLACE_EXISTING);
+    }
+}

+ 241 - 0
src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarDaWeiXiuJob.java

@@ -0,0 +1,241 @@
+package com.nokia.finance.tasks.jobs.car.chengben;
+
+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.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.CSVParser;
+import org.apache.commons.csv.CSVPrinter;
+import org.apache.commons.csv.CSVRecord;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.io.InputStreamReader;
+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.nio.file.StandardCopyOption;
+import java.time.LocalDateTime;
+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
+@Service
+public class CarDaWeiXiuJob {
+    private final JobConfig jobConfig;
+    private final CarService carService;
+    private final OrganizationService organizationService;
+    private final AreaService areaService;
+
+    public CarDaWeiXiuJob(JobConfig jobConfig, CarService carService, OrganizationService organizationService,
+                          AreaService areaService) {
+        this.jobConfig = jobConfig;
+        this.carService = carService;
+        this.organizationService = organizationService;
+        this.areaService = areaService;
+    }
+
+    /**
+     * 执行任务
+     */
+//    @Scheduled(cron = "0 35 23 1 * ?")
+    public void runJob() {
+        // 数据目录
+        Path dir = Paths.get(jobConfig.getCarDaWeiXiuSourcePath());
+        try (Stream<Path> stream = Files.list(dir)) {
+            // 获取数据目录下的文件列表
+            List<Path> pathList = stream.filter(t -> !t.toString().endsWith(".MD5")).sorted().toList();
+            log.info("河北成本管理系统车辆大额维修数据文件列表: {}", pathList);
+            if (CollectionUtils.isEmpty(pathList)) {
+                throw new MyRuntimeException("河北成本管理系统车辆大额维修数据没有文件");
+            }
+            for (Path path : pathList) {
+                singleJob(path);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), 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);
+        copyCsv(csvPath);
+        move(path);
+    }
+
+    /**
+     * 读取文件
+     *
+     * @param path 文件路径
+     */
+    public List<Map<String, String>> readFile(Path path) throws Exception {
+        log.info("读取: {}", path);
+        List<String> headers = Stream.of(
+                "data_time_nlsd",
+                "data_time", "form_type", "submitter", "submitter_dept_id", "form_no", "reimbursement_no",
+                "start_time", "form_id", "license_plate_number", "motorcycle_type", "maintenance_type",
+                "maintenance_items", "estimated_amount", "maintenance_organization", "labor_cost",
+                "amount_excluding_tax", "tax_rate", "tax_amount", "total_amount", "remark", "vehicle_unit").toList();
+        int headerSize = headers.size();
+        char delimiter = 1;
+        try (CSVParser parser = CSVFormat.DEFAULT.builder().setDelimiter(delimiter).build()
+                .parse(new InputStreamReader(Files.newInputStream(path), StandardCharsets.UTF_8))
+        ) {
+            List<Map<String, String>> resultList = new ArrayList<>();
+            for (CSVRecord csvRecord : parser) {
+                Map<String, String> rowMap = new LinkedHashMap<>();
+                for (int i = 0; i < headerSize; i++) {
+                    String header = headers.get(i);
+                    String value = csvRecord.get(i);
+                    if (!"start_time".equals(header)) {
+                        // 删除空白字符
+                        value = StringUtils.trimAllWhitespace(value);
+                    }
+                    rowMap.put(header, value);
+                }
+                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);
+        for (Map<String, String> map : list) {
+            String startTime = map.get("start_time");
+            LocalDateTime localDateTime = LocalDateTime.parse(startTime,
+                    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 rawChePaiHao = map.get("license_plate_number");
+            map.put("raw_license_plate_number", rawChePaiHao);
+            String chePaiHao = carService.getChePai(rawChePaiHao);
+            map.put("license_plate_number", chePaiHao);
+            String chePaiFail = carService.chePaiFail(rawChePaiHao);
+            map.put("che_pai_fail", chePaiFail);
+            String cheLiangSuoShuDanWei = map.get("vehicle_unit");
+            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());
+        }
+        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(jobConfig.getCarDaWeiXiuHistoryPath()));
+        Path csvPath = Paths.get(jobConfig.getCarDaWeiXiuHistoryPath() + 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;
+    }
+
+    /**
+     * 导入数据库
+     *
+     * @param path 文件路径
+     */
+    public void copyCsv(Path path) {
+        String dbTable = "car.car_da_wei_xiu";
+        String csv = path.toString();
+        String columns = "(data_time_nlsd,data_time,form_type,submitter,submitter_dept_id,form_no,reimbursement_no,start_time,form_id,license_plate_number,motorcycle_type,maintenance_type,maintenance_items,estimated_amount,maintenance_organization,labor_cost,amount_excluding_tax,tax_rate,tax_amount,total_amount,remark,vehicle_unit,year_month,year_no,month_no,raw_license_plate_number,che_pai_fail,first_unit,second_unit,third_unit,area_no,area_name,city_no,city_name,area_no2,area_name2,city_id,city,district_id,district,source)";
+        Long timeout = 60000L;
+        PsqlUtil.copyCsv(jobConfig.getCopyScriptPath(), jobConfig.getDbHost(), jobConfig.getDbPort(),
+                jobConfig.getDbUsername(), jobConfig.getDbPassword(), jobConfig.getDbName(), dbTable, csv, columns,
+                timeout, null);
+    }
+
+    /**
+     * 移动源文件到历史文件夹
+     *
+     * @param path 源文件路径
+     */
+    public void move(Path path) throws Exception {
+        Files.move(Paths.get(path + ".MD5"),
+                Paths.get(jobConfig.getCarDaWeiXiuHistoryPath(), path.getFileName().toString() + ".MD5"),
+                StandardCopyOption.REPLACE_EXISTING);
+        Files.move(path, Paths.get(jobConfig.getCarDaWeiXiuHistoryPath(), path.getFileName().toString()),
+                StandardCopyOption.REPLACE_EXISTING);
+    }
+}

+ 240 - 0
src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarLuQiaoJob.java

@@ -0,0 +1,240 @@
+package com.nokia.finance.tasks.jobs.car.chengben;
+
+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.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.CSVParser;
+import org.apache.commons.csv.CSVPrinter;
+import org.apache.commons.csv.CSVRecord;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.io.InputStreamReader;
+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.nio.file.StandardCopyOption;
+import java.time.LocalDateTime;
+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
+@Service
+public class CarLuQiaoJob {
+    private final JobConfig jobConfig;
+    private final CarService carService;
+    private final OrganizationService organizationService;
+    private final AreaService areaService;
+
+    public CarLuQiaoJob(JobConfig jobConfig, CarService carService, OrganizationService organizationService,
+                        AreaService areaService) {
+        this.jobConfig = jobConfig;
+        this.carService = carService;
+        this.organizationService = organizationService;
+        this.areaService = areaService;
+    }
+
+    /**
+     * 执行任务
+     */
+//    @Scheduled(cron = "0 35 23 1 * ?")
+    public void runJob() {
+        // 数据目录
+        Path dir = Paths.get(jobConfig.getCarLuQiaoSourcePath());
+        try (Stream<Path> stream = Files.list(dir)) {
+            // 获取数据目录下的文件列表
+            List<Path> pathList = stream.filter(t -> !t.toString().endsWith(".MD5")).sorted().toList();
+            log.info("河北成本管理系统车辆路桥数据文件列表: {}", pathList);
+            if (CollectionUtils.isEmpty(pathList)) {
+                throw new MyRuntimeException("河北成本管理系统车辆路桥数据没有文件");
+            }
+            for (Path path : pathList) {
+                singleJob(path);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), 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);
+        copyCsv(csvPath);
+        move(path);
+    }
+
+    /**
+     * 读取文件
+     *
+     * @param path 文件路径
+     */
+    public List<Map<String, String>> readFile(Path path) throws Exception {
+        log.info("读取: {}", path);
+        List<String> headers = Stream.of(
+                "data_time_nlsd",
+                "data_time", "form_type", "submitter", "submitter_dept_id", "form_no", "reimbursement_no",
+                "start_time", "form_id", "license_plate_number", "motorcycle_type", "dept_id", "invoice_type",
+                "amount_excluding_tax", "tax_rate", "tax_amount", "total_amount", "sheets_num").toList();
+        int headerSize = headers.size();
+        char delimiter = 1;
+        try (CSVParser parser = CSVFormat.DEFAULT.builder().setDelimiter(delimiter).build()
+                .parse(new InputStreamReader(Files.newInputStream(path), StandardCharsets.UTF_8))
+        ) {
+            List<Map<String, String>> resultList = new ArrayList<>();
+            for (CSVRecord csvRecord : parser) {
+                Map<String, String> rowMap = new LinkedHashMap<>();
+                for (int i = 0; i < headerSize; i++) {
+                    String header = headers.get(i);
+                    String value = csvRecord.get(i);
+                    if (!"start_time".equals(header)) {
+                        // 删除空白字符
+                        value = StringUtils.trimAllWhitespace(value);
+                    }
+                    rowMap.put(header, value);
+                }
+                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);
+        for (Map<String, String> map : list) {
+            String startTime = map.get("start_time");
+            LocalDateTime localDateTime = LocalDateTime.parse(startTime,
+                    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 rawChePaiHao = map.get("license_plate_number");
+            map.put("raw_license_plate_number", rawChePaiHao);
+            String chePaiHao = carService.getChePai(rawChePaiHao);
+            map.put("license_plate_number", chePaiHao);
+            String chePaiFail = carService.chePaiFail(rawChePaiHao);
+            map.put("che_pai_fail", chePaiFail);
+            String cheLiangSuoShuDanWei = map.get("dept_id");
+            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());
+        }
+        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(jobConfig.getCarLuQiaoHistoryPath()));
+        Path csvPath = Paths.get(jobConfig.getCarLuQiaoHistoryPath() + 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;
+    }
+
+    /**
+     * 导入数据库
+     *
+     * @param path 文件路径
+     */
+    public void copyCsv(Path path) {
+        String dbTable = "car.car_lu_qiao";
+        String csv = path.toString();
+        String columns = "(data_time_nlsd,data_time,form_type,submitter,submitter_dept_id,form_no,reimbursement_no,start_time,form_id,license_plate_number,motorcycle_type,dept_id,invoice_type,amount_excluding_tax,tax_rate,tax_amount,total_amount,sheets_num,year_month,year_no,month_no,raw_license_plate_number,che_pai_fail,first_unit,second_unit,third_unit,area_no,area_name,city_no,city_name,area_no2,area_name2,city_id,city,district_id,district,source)";
+        Long timeout = 60000L;
+        PsqlUtil.copyCsv(jobConfig.getCopyScriptPath(), jobConfig.getDbHost(), jobConfig.getDbPort(),
+                jobConfig.getDbUsername(), jobConfig.getDbPassword(), jobConfig.getDbName(), dbTable, csv, columns,
+                timeout, null);
+    }
+
+    /**
+     * 移动源文件到历史文件夹
+     *
+     * @param path 源文件路径
+     */
+    public void move(Path path) throws Exception {
+        Files.move(Paths.get(path + ".MD5"),
+                Paths.get(jobConfig.getCarLuQiaoHistoryPath(), path.getFileName().toString() + ".MD5"),
+                StandardCopyOption.REPLACE_EXISTING);
+        Files.move(path, Paths.get(jobConfig.getCarLuQiaoHistoryPath(), path.getFileName().toString()),
+                StandardCopyOption.REPLACE_EXISTING);
+    }
+}

+ 240 - 0
src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarNianJianFeiJob.java

@@ -0,0 +1,240 @@
+package com.nokia.finance.tasks.jobs.car.chengben;
+
+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.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.CSVParser;
+import org.apache.commons.csv.CSVPrinter;
+import org.apache.commons.csv.CSVRecord;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.io.InputStreamReader;
+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.nio.file.StandardCopyOption;
+import java.time.LocalDateTime;
+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
+@Service
+public class CarNianJianFeiJob {
+    private final JobConfig jobConfig;
+    private final CarService carService;
+    private final OrganizationService organizationService;
+    private final AreaService areaService;
+
+    public CarNianJianFeiJob(JobConfig jobConfig, CarService carService, OrganizationService organizationService,
+                             AreaService areaService) {
+        this.jobConfig = jobConfig;
+        this.carService = carService;
+        this.organizationService = organizationService;
+        this.areaService = areaService;
+    }
+
+    /**
+     * 执行任务
+     */
+//    @Scheduled(cron = "0 35 23 1 * ?")
+    public void runJob() {
+        // 数据目录
+        Path dir = Paths.get(jobConfig.getCarNianJianFeiSourcePath());
+        try (Stream<Path> stream = Files.list(dir)) {
+            // 获取数据目录下的文件列表
+            List<Path> pathList = stream.filter(t -> !t.toString().endsWith(".MD5")).sorted().toList();
+            log.info("河北成本管理系统车辆年检数据文件列表: {}", pathList);
+            if (CollectionUtils.isEmpty(pathList)) {
+                throw new MyRuntimeException("河北成本管理系统车辆年检数据没有文件");
+            }
+            for (Path path : pathList) {
+                singleJob(path);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), 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);
+        copyCsv(csvPath);
+        move(path);
+    }
+
+    /**
+     * 读取文件
+     *
+     * @param path 文件路径
+     */
+    public List<Map<String, String>> readFile(Path path) throws Exception {
+        log.info("读取: {}", path);
+        List<String> headers = Stream.of(
+                "data_time_nlsd",
+                "data_time", "form_type", "submitter", "submitter_dept_id", "form_no", "reimbursement_no",
+                "start_time", "form_id", "license_plate_number", "motorcycle_type", "dept_id", "invoice_type",
+                "amount_excluding_tax", "tax_rate", "tax_amount", "total_amount", "year").toList();
+        int headerSize = headers.size();
+        char delimiter = 1;
+        try (CSVParser parser = CSVFormat.DEFAULT.builder().setDelimiter(delimiter).build()
+                .parse(new InputStreamReader(Files.newInputStream(path), StandardCharsets.UTF_8))
+        ) {
+            List<Map<String, String>> resultList = new ArrayList<>();
+            for (CSVRecord csvRecord : parser) {
+                Map<String, String> rowMap = new LinkedHashMap<>();
+                for (int i = 0; i < headerSize; i++) {
+                    String header = headers.get(i);
+                    String value = csvRecord.get(i);
+                    if (!"start_time".equals(header)) {
+                        // 删除空白字符
+                        value = StringUtils.trimAllWhitespace(value);
+                    }
+                    rowMap.put(header, value);
+                }
+                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);
+        for (Map<String, String> map : list) {
+            String startTime = map.get("start_time");
+            LocalDateTime localDateTime = LocalDateTime.parse(startTime,
+                    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 rawChePaiHao = map.get("license_plate_number");
+            map.put("raw_license_plate_number", rawChePaiHao);
+            String chePaiHao = carService.getChePai(rawChePaiHao);
+            map.put("license_plate_number", chePaiHao);
+            String chePaiFail = carService.chePaiFail(rawChePaiHao);
+            map.put("che_pai_fail", chePaiFail);
+            String cheLiangSuoShuDanWei = map.get("dept_id");
+            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());
+        }
+        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(jobConfig.getCarNianJianFeiHistoryPath()));
+        Path csvPath = Paths.get(jobConfig.getCarNianJianFeiHistoryPath() + 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;
+    }
+
+    /**
+     * 导入数据库
+     *
+     * @param path 文件路径
+     */
+    public void copyCsv(Path path) {
+        String dbTable = "car.car_nian_jian_fei";
+        String csv = path.toString();
+        String columns = "(data_time_nlsd,data_time,form_type,submitter,submitter_dept_id,form_no,reimbursement_no,start_time,form_id,license_plate_number,motorcycle_type,dept_id,invoice_type,amount_excluding_tax,tax_rate,tax_amount,total_amount,year,year_month,year_no,month_no,raw_license_plate_number,che_pai_fail,first_unit,second_unit,third_unit,area_no,area_name,city_no,city_name,area_no2,area_name2,city_id,city,district_id,district,source)";
+        Long timeout = 60000L;
+        PsqlUtil.copyCsv(jobConfig.getCopyScriptPath(), jobConfig.getDbHost(), jobConfig.getDbPort(),
+                jobConfig.getDbUsername(), jobConfig.getDbPassword(), jobConfig.getDbName(), dbTable, csv, columns,
+                timeout, null);
+    }
+
+    /**
+     * 移动源文件到历史文件夹
+     *
+     * @param path 源文件路径
+     */
+    public void move(Path path) throws Exception {
+        Files.move(Paths.get(path + ".MD5"),
+                Paths.get(jobConfig.getCarNianJianFeiHistoryPath(), path.getFileName().toString() + ".MD5"),
+                StandardCopyOption.REPLACE_EXISTING);
+        Files.move(path, Paths.get(jobConfig.getCarNianJianFeiHistoryPath(), path.getFileName().toString()),
+                StandardCopyOption.REPLACE_EXISTING);
+    }
+}

+ 240 - 0
src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarQiTaJob.java

@@ -0,0 +1,240 @@
+package com.nokia.finance.tasks.jobs.car.chengben;
+
+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.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.CSVParser;
+import org.apache.commons.csv.CSVPrinter;
+import org.apache.commons.csv.CSVRecord;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.io.InputStreamReader;
+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.nio.file.StandardCopyOption;
+import java.time.LocalDateTime;
+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
+@Service
+public class CarQiTaJob {
+    private final JobConfig jobConfig;
+    private final CarService carService;
+    private final OrganizationService organizationService;
+    private final AreaService areaService;
+
+    public CarQiTaJob(JobConfig jobConfig, CarService carService, OrganizationService organizationService,
+                      AreaService areaService) {
+        this.jobConfig = jobConfig;
+        this.carService = carService;
+        this.organizationService = organizationService;
+        this.areaService = areaService;
+    }
+
+    /**
+     * 执行任务
+     */
+//    @Scheduled(cron = "0 35 23 1 * ?")
+    public void runJob() {
+        // 数据目录
+        Path dir = Paths.get(jobConfig.getCarQiTaSourcePath());
+        try (Stream<Path> stream = Files.list(dir)) {
+            // 获取数据目录下的文件列表
+            List<Path> pathList = stream.filter(t -> !t.toString().endsWith(".MD5")).sorted().toList();
+            log.info("河北成本管理系统车辆其他费用数据文件列表: {}", pathList);
+            if (CollectionUtils.isEmpty(pathList)) {
+                throw new MyRuntimeException("河北成本管理系统车辆其他费用数据没有文件");
+            }
+            for (Path path : pathList) {
+                singleJob(path);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), 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);
+        copyCsv(csvPath);
+        move(path);
+    }
+
+    /**
+     * 读取文件
+     *
+     * @param path 文件路径
+     */
+    public List<Map<String, String>> readFile(Path path) throws Exception {
+        log.info("读取: {}", path);
+        List<String> headers = Stream.of(
+                "data_time_nlsd",
+                "data_time", "form_type", "submitter", "submitter_dept_id", "form_no", "reimbursement_no",
+                "start_time", "form_id", "license_plate_number", "motorcycle_type", "dept_id", "invoice_type",
+                "amount_excluding_tax", "tax_rate", "tax_amount", "total_amount", "item").toList();
+        int headerSize = headers.size();
+        char delimiter = 1;
+        try (CSVParser parser = CSVFormat.DEFAULT.builder().setDelimiter(delimiter).build()
+                .parse(new InputStreamReader(Files.newInputStream(path), StandardCharsets.UTF_8))
+        ) {
+            List<Map<String, String>> resultList = new ArrayList<>();
+            for (CSVRecord csvRecord : parser) {
+                Map<String, String> rowMap = new LinkedHashMap<>();
+                for (int i = 0; i < headerSize; i++) {
+                    String header = headers.get(i);
+                    String value = csvRecord.get(i);
+                    if (!"start_time".equals(header)) {
+                        // 删除空白字符
+                        value = StringUtils.trimAllWhitespace(value);
+                    }
+                    rowMap.put(header, value);
+                }
+                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);
+        for (Map<String, String> map : list) {
+            String startTime = map.get("start_time");
+            LocalDateTime localDateTime = LocalDateTime.parse(startTime,
+                    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 rawChePaiHao = map.get("license_plate_number");
+            map.put("raw_license_plate_number", rawChePaiHao);
+            String chePaiHao = carService.getChePai(rawChePaiHao);
+            map.put("license_plate_number", chePaiHao);
+            String chePaiFail = carService.chePaiFail(rawChePaiHao);
+            map.put("che_pai_fail", chePaiFail);
+            String cheLiangSuoShuDanWei = map.get("dept_id");
+            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());
+        }
+        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(jobConfig.getCarQiTaHistoryPath()));
+        Path csvPath = Paths.get(jobConfig.getCarQiTaHistoryPath() + 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;
+    }
+
+    /**
+     * 导入数据库
+     *
+     * @param path 文件路径
+     */
+    public void copyCsv(Path path) {
+        String dbTable = "car.car_qi_ta";
+        String csv = path.toString();
+        String columns = "(data_time_nlsd,data_time,form_type,submitter,submitter_dept_id,form_no,reimbursement_no,start_time,form_id,license_plate_number,motorcycle_type,dept_id,invoice_type,amount_excluding_tax,tax_rate,tax_amount,total_amount,item,year_month,year_no,month_no,raw_license_plate_number,che_pai_fail,first_unit,second_unit,third_unit,area_no,area_name,city_no,city_name,area_no2,area_name2,city_id,city,district_id,district,source)";
+        Long timeout = 60000L;
+        PsqlUtil.copyCsv(jobConfig.getCopyScriptPath(), jobConfig.getDbHost(), jobConfig.getDbPort(),
+                jobConfig.getDbUsername(), jobConfig.getDbPassword(), jobConfig.getDbName(), dbTable, csv, columns,
+                timeout, null);
+    }
+
+    /**
+     * 移动源文件到历史文件夹
+     *
+     * @param path 源文件路径
+     */
+    public void move(Path path) throws Exception {
+        Files.move(Paths.get(path + ".MD5"),
+                Paths.get(jobConfig.getCarQiTaHistoryPath(), path.getFileName().toString() + ".MD5"),
+                StandardCopyOption.REPLACE_EXISTING);
+        Files.move(path, Paths.get(jobConfig.getCarQiTaHistoryPath(), path.getFileName().toString()),
+                StandardCopyOption.REPLACE_EXISTING);
+    }
+}

+ 242 - 0
src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarRanYouJob.java

@@ -0,0 +1,242 @@
+package com.nokia.finance.tasks.jobs.car.chengben;
+
+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.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.CSVParser;
+import org.apache.commons.csv.CSVPrinter;
+import org.apache.commons.csv.CSVRecord;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.io.InputStreamReader;
+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.nio.file.StandardCopyOption;
+import java.time.LocalDateTime;
+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
+@Service
+public class CarRanYouJob {
+    private final JobConfig jobConfig;
+    private final CarService carService;
+    private final OrganizationService organizationService;
+    private final AreaService areaService;
+
+    public CarRanYouJob(JobConfig jobConfig, CarService carService, OrganizationService organizationService,
+                        AreaService areaService) {
+        this.jobConfig = jobConfig;
+        this.carService = carService;
+        this.organizationService = organizationService;
+        this.areaService = areaService;
+    }
+
+    /**
+     * 执行任务
+     */
+//    @Scheduled(cron = "0 35 23 1 * ?")
+    public void runJob() {
+        // 数据目录
+        Path dir = Paths.get(jobConfig.getCarRanYouSourcePath());
+        try (Stream<Path> stream = Files.list(dir)) {
+            // 获取数据目录下的文件列表
+            List<Path> pathList = stream.filter(t -> !t.toString().endsWith(".MD5")).sorted().toList();
+            log.info("河北成本管理系统车辆燃油数据文件列表: {}", pathList);
+            if (CollectionUtils.isEmpty(pathList)) {
+                throw new MyRuntimeException("河北成本管理系统车辆燃油数据没有文件");
+            }
+            for (Path path : pathList) {
+                singleJob(path);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), 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);
+        copyCsv(csvPath);
+        move(path);
+    }
+
+    /**
+     * 读取文件
+     *
+     * @param path 文件路径
+     */
+    public List<Map<String, String>> readFile(Path path) throws Exception {
+        log.info("读取: {}", path);
+        List<String> headers = Stream.of(
+                "data_time_nlsd",
+                "data_time", "form_type", "submitter",
+                "submitter_dept_id", "form_no", "reimbursement_no", "start_time", "form_id", "card_number",
+                "license_plate_number", "transaction_time", "invoice_type", "amount_excluding_tax", "tax_rate",
+                "tax_amount", "total_amount", "oils", "quantity", "price", "address", "discount",
+                "acceptance_institution", "vehicle_unit").toList();
+        int headerSize = headers.size();
+        char delimiter = 1;
+        try (CSVParser parser = CSVFormat.DEFAULT.builder().setDelimiter(delimiter).build()
+                .parse(new InputStreamReader(Files.newInputStream(path), StandardCharsets.UTF_8))
+        ) {
+            List<Map<String, String>> resultList = new ArrayList<>();
+            for (CSVRecord csvRecord : parser) {
+                Map<String, String> rowMap = new LinkedHashMap<>();
+                for (int i = 0; i < headerSize; i++) {
+                    String header = headers.get(i);
+                    String value = csvRecord.get(i);
+                    if (!"start_time".equals(header) && !"transaction_time".equals(header)) {
+                        // 删除空白字符
+                        value = StringUtils.trimAllWhitespace(value);
+                    }
+                    rowMap.put(header, value);
+                }
+                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);
+        for (Map<String, String> map : list) {
+            String startTime = map.get("start_time");
+            LocalDateTime localDateTime = LocalDateTime.parse(startTime,
+                    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 rawChePaiHao = map.get("license_plate_number");
+            map.put("raw_license_plate_number", rawChePaiHao);
+            String chePaiHao = carService.getChePai(rawChePaiHao);
+            map.put("license_plate_number", chePaiHao);
+            String chePaiFail = carService.chePaiFail(rawChePaiHao);
+            map.put("che_pai_fail", chePaiFail);
+            String cheLiangSuoShuDanWei = map.get("vehicle_unit");
+            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());
+        }
+        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(jobConfig.getCarRanYouHistoryPath()));
+        Path csvPath = Paths.get(jobConfig.getCarRanYouHistoryPath() + 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;
+    }
+
+    /**
+     * 导入数据库
+     *
+     * @param path 文件路径
+     */
+    public void copyCsv(Path path) {
+        String dbTable = "car.car_ran_you";
+        String csv = path.toString();
+        String columns = "(data_time_nlsd,data_time,form_type,submitter,submitter_dept_id,form_no,reimbursement_no,start_time,form_id,card_number,license_plate_number,transaction_time,invoice_type,amount_excluding_tax,tax_rate,tax_amount,total_amount,oils,quantity,price,address,discount,acceptance_institution,vehicle_unit,year_month,year_no,month_no,raw_license_plate_number,che_pai_fail,first_unit,second_unit,third_unit,area_no,area_name,city_no,city_name,area_no2,area_name2,city_id,city,district_id,district,source)";
+        Long timeout = 60000L;
+        PsqlUtil.copyCsv(jobConfig.getCopyScriptPath(), jobConfig.getDbHost(), jobConfig.getDbPort(),
+                jobConfig.getDbUsername(), jobConfig.getDbPassword(), jobConfig.getDbName(), dbTable, csv, columns,
+                timeout, null);
+    }
+
+    /**
+     * 移动源文件到历史文件夹
+     *
+     * @param path 源文件路径
+     */
+    public void move(Path path) throws Exception {
+        Files.move(Paths.get(path + ".MD5"),
+                Paths.get(jobConfig.getCarRanYouHistoryPath(), path.getFileName().toString() + ".MD5"),
+                StandardCopyOption.REPLACE_EXISTING);
+        Files.move(path, Paths.get(jobConfig.getCarRanYouHistoryPath(), path.getFileName().toString()),
+                StandardCopyOption.REPLACE_EXISTING);
+    }
+}

+ 241 - 0
src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarWeiXiuJob.java

@@ -0,0 +1,241 @@
+package com.nokia.finance.tasks.jobs.car.chengben;
+
+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.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.CSVParser;
+import org.apache.commons.csv.CSVPrinter;
+import org.apache.commons.csv.CSVRecord;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.io.InputStreamReader;
+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.nio.file.StandardCopyOption;
+import java.time.LocalDateTime;
+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
+@Service
+public class CarWeiXiuJob {
+    private final JobConfig jobConfig;
+    private final CarService carService;
+    private final OrganizationService organizationService;
+    private final AreaService areaService;
+
+    public CarWeiXiuJob(JobConfig jobConfig, CarService carService, OrganizationService organizationService,
+                        AreaService areaService) {
+        this.jobConfig = jobConfig;
+        this.carService = carService;
+        this.organizationService = organizationService;
+        this.areaService = areaService;
+    }
+
+    /**
+     * 执行任务
+     */
+//    @Scheduled(cron = "0 35 23 1 * ?")
+    public void runJob() {
+        // 数据目录
+        Path dir = Paths.get(jobConfig.getCarWeiXiuSourcePath());
+        try (Stream<Path> stream = Files.list(dir)) {
+            // 获取数据目录下的文件列表
+            List<Path> pathList = stream.filter(t -> !t.toString().endsWith(".MD5")).sorted().toList();
+            log.info("河北成本管理系统车辆普通维修数据文件列表: {}", pathList);
+            if (CollectionUtils.isEmpty(pathList)) {
+                throw new MyRuntimeException("河北成本管理系统车辆普通维修数据没有文件");
+            }
+            for (Path path : pathList) {
+                singleJob(path);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), 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);
+        copyCsv(csvPath);
+        move(path);
+    }
+
+    /**
+     * 读取文件
+     *
+     * @param path 文件路径
+     */
+    public List<Map<String, String>> readFile(Path path) throws Exception {
+        log.info("读取: {}", path);
+        List<String> headers = Stream.of(
+                "data_time_nlsd",
+                "data_time", "form_type", "submitter", "submitter_dept_id", "form_no", "reimbursement_no",
+                "start_time", "form_id", "license_plate_number", "motorcycle_type", "maintenance_type",
+                "maintenance_items", "organization", "maintenance_organization", "labor_cost", "amount_excluding_tax",
+                "tax_rate", "tax_amount", "total_amount", "remark").toList();
+        int headerSize = headers.size();
+        char delimiter = 1;
+        try (CSVParser parser = CSVFormat.DEFAULT.builder().setDelimiter(delimiter).build()
+                .parse(new InputStreamReader(Files.newInputStream(path), StandardCharsets.UTF_8))
+        ) {
+            List<Map<String, String>> resultList = new ArrayList<>();
+            for (CSVRecord csvRecord : parser) {
+                Map<String, String> rowMap = new LinkedHashMap<>();
+                for (int i = 0; i < headerSize; i++) {
+                    String header = headers.get(i);
+                    String value = csvRecord.get(i);
+                    if (!"start_time".equals(header)) {
+                        // 删除空白字符
+                        value = StringUtils.trimAllWhitespace(value);
+                    }
+                    rowMap.put(header, value);
+                }
+                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);
+        for (Map<String, String> map : list) {
+            String startTime = map.get("start_time");
+            LocalDateTime localDateTime = LocalDateTime.parse(startTime,
+                    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 rawChePaiHao = map.get("license_plate_number");
+            map.put("raw_license_plate_number", rawChePaiHao);
+            String chePaiHao = carService.getChePai(rawChePaiHao);
+            map.put("license_plate_number", chePaiHao);
+            String chePaiFail = carService.chePaiFail(rawChePaiHao);
+            map.put("che_pai_fail", chePaiFail);
+            String cheLiangSuoShuDanWei = map.get("organization");
+            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());
+        }
+        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(jobConfig.getCarWeiXiuHistoryPath()));
+        Path csvPath = Paths.get(jobConfig.getCarWeiXiuHistoryPath() + 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;
+    }
+
+    /**
+     * 导入数据库
+     *
+     * @param path 文件路径
+     */
+    public void copyCsv(Path path) {
+        String dbTable = "car.car_wei_xiu";
+        String csv = path.toString();
+        String columns = "(data_time_nlsd,data_time,form_type,submitter,submitter_dept_id,form_no,reimbursement_no,start_time,form_id,license_plate_number,motorcycle_type,maintenance_type,maintenance_items,organization,maintenance_organization,labor_cost,amount_excluding_tax,tax_rate,tax_amount,total_amount,remark,year_month,year_no,month_no,raw_license_plate_number,che_pai_fail,first_unit,second_unit,third_unit,area_no,area_name,city_no,city_name,area_no2,area_name2,city_id,city,district_id,district,source)";
+        Long timeout = 60000L;
+        PsqlUtil.copyCsv(jobConfig.getCopyScriptPath(), jobConfig.getDbHost(), jobConfig.getDbPort(),
+                jobConfig.getDbUsername(), jobConfig.getDbPassword(), jobConfig.getDbName(), dbTable, csv, columns,
+                timeout, null);
+    }
+
+    /**
+     * 移动源文件到历史文件夹
+     *
+     * @param path 源文件路径
+     */
+    public void move(Path path) throws Exception {
+        Files.move(Paths.get(path + ".MD5"),
+                Paths.get(jobConfig.getCarWeiXiuHistoryPath(), path.getFileName().toString() + ".MD5"),
+                StandardCopyOption.REPLACE_EXISTING);
+        Files.move(path, Paths.get(jobConfig.getCarWeiXiuHistoryPath(), path.getFileName().toString()),
+                StandardCopyOption.REPLACE_EXISTING);
+    }
+}

+ 196 - 0
src/main/java/com/nokia/finance/tasks/jobs/house/chengben/HouseBuildingRepairMonthJob.java

@@ -0,0 +1,196 @@
+package com.nokia.finance.tasks.jobs.house.chengben;
+
+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 lombok.extern.slf4j.Slf4j;
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVParser;
+import org.apache.commons.csv.CSVPrinter;
+import org.apache.commons.csv.CSVRecord;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.io.InputStreamReader;
+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.nio.file.StandardCopyOption;
+import java.time.LocalDateTime;
+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
+@Service
+public class HouseBuildingRepairMonthJob {
+    private final JobConfig jobConfig;
+
+    public HouseBuildingRepairMonthJob(JobConfig jobConfig) {
+        this.jobConfig = jobConfig;
+    }
+
+    /**
+     * 执行任务
+     */
+//    @Scheduled(cron = "0 35 23 1 * ?")
+    public void runJob() {
+        // 数据目录
+        Path dir = Paths.get(jobConfig.getHouseBuildingRepairMonthSourcePath());
+        try (Stream<Path> stream = Files.list(dir)) {
+            // 获取数据目录下的文件列表
+            List<Path> pathList = stream.filter(t -> !t.toString().endsWith(".MD5")).sorted().toList();
+            log.info("河北成本管理系统自有类房产维修数据文件列表: {}", pathList);
+            if (CollectionUtils.isEmpty(pathList)) {
+                throw new MyRuntimeException("河北成本管理系统自有类房产维修数据没有文件");
+            }
+            for (Path path : pathList) {
+                singleJob(path);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), 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);
+        copyCsv(csvPath);
+        move(path);
+    }
+
+    /**
+     * 读取文件
+     *
+     * @param path 文件路径
+     */
+    public List<Map<String, String>> readFile(Path path) throws Exception {
+        log.info("读取: {}", path);
+        List<String> headers = Stream.of(
+                "data_time_nlsd",
+                "data_time", "form_type", "submitter", "submitter_dept_id", "form_no", "reimbursement_no",
+                "start_time", "form_id", "investor", "fwxs_big_type", "jz_jzbh", "zrqk_jzmc", "location_info",
+                "content_category", "estimate_cost", "describe", "del_flag", "final_cost", "description", "jz_jzid").toList();
+        int headerSize = headers.size();
+        char delimiter = 1;
+        try (CSVParser parser = CSVFormat.DEFAULT.builder().setDelimiter(delimiter).build()
+                .parse(new InputStreamReader(Files.newInputStream(path), StandardCharsets.UTF_8))
+        ) {
+            List<Map<String, String>> resultList = new ArrayList<>();
+            for (CSVRecord csvRecord : parser) {
+                Map<String, String> rowMap = new LinkedHashMap<>();
+                for (int i = 0; i < headerSize; i++) {
+                    String header = headers.get(i);
+                    String value = csvRecord.get(i);
+                    if (!"start_time".equals(header)) {
+                        // 删除空白字符
+                        value = StringUtils.trimAllWhitespace(value);
+                    }
+                    rowMap.put(header, value);
+                }
+                resultList.add(rowMap);
+            }
+            return resultList;
+        }
+    }
+
+    /**
+     * 数据加工
+     *
+     * @param path 文件路径
+     * @param list 数据
+     */
+    public List<Map<String, String>> dataProcessing(Path path, List<Map<String, String>> list) {
+        for (Map<String, String> map : list) {
+            String startTime = map.get("start_time");
+            LocalDateTime localDateTime = LocalDateTime.parse(startTime,
+                    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 formType = map.get("form_type");
+            String repairType = "";
+            if ("13".equals(formType)) {
+                repairType = "零星维修";
+            } else if ("14".equals(formType)) {
+                repairType = "应急维修";
+            } else if ("15".equals(formType) || "16".equals(formType)) {
+                repairType = "项目制维修";
+            }
+            map.put("repair_type", repairType);
+            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(jobConfig.getHouseBuildingRepairMonthHistoryPath()));
+        Path csvPath = Paths.get(jobConfig.getHouseBuildingRepairMonthHistoryPath() + 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;
+    }
+
+    /**
+     * 导入数据库
+     *
+     * @param path 文件路径
+     */
+    public void copyCsv(Path path) {
+        String dbTable = "house.building_repair_month";
+        String csv = path.toString();
+        String columns = "(data_time_nlsd,data_time,form_type,submitter,submitter_dept_id,form_no,reimbursement_no,start_time,form_id,investor,fwxs_big_type,jz_jzbh,zrqk_jzmc,location_info,content_category,estimate_cost,describe,del_flag,final_cost,description,jz_jzid,year_month,year_no,month_no,repair_type,source)";
+        Long timeout = 60000L;
+        PsqlUtil.copyCsv(jobConfig.getCopyScriptPath(), jobConfig.getDbHost(), jobConfig.getDbPort(),
+                jobConfig.getDbUsername(), jobConfig.getDbPassword(), jobConfig.getDbName(), dbTable, csv, columns,
+                timeout, null);
+    }
+
+    /**
+     * 移动源文件到历史文件夹
+     *
+     * @param path 源文件路径
+     */
+    public void move(Path path) throws Exception {
+        Files.move(Paths.get(path + ".MD5"),
+                Paths.get(jobConfig.getHouseBuildingRepairMonthHistoryPath(), path.getFileName().toString() + ".MD5"),
+                StandardCopyOption.REPLACE_EXISTING);
+        Files.move(path, Paths.get(jobConfig.getHouseBuildingRepairMonthHistoryPath(), path.getFileName().toString()),
+                StandardCopyOption.REPLACE_EXISTING);
+    }
+}

+ 52 - 1
src/main/java/com/nokia/finance/tasks/service/JobService.java

@@ -1,10 +1,18 @@
 package com.nokia.finance.tasks.service;
 
 import com.nokia.finance.tasks.common.R;
+import com.nokia.finance.tasks.jobs.car.chengben.CarBaoXianJob;
+import com.nokia.finance.tasks.jobs.car.chengben.CarDaWeiXiuJob;
+import com.nokia.finance.tasks.jobs.car.chengben.CarLuQiaoJob;
+import com.nokia.finance.tasks.jobs.car.chengben.CarNianJianFeiJob;
+import com.nokia.finance.tasks.jobs.car.chengben.CarQiTaJob;
+import com.nokia.finance.tasks.jobs.car.chengben.CarRanYouJob;
+import com.nokia.finance.tasks.jobs.car.chengben.CarWeiXiuJob;
 import com.nokia.finance.tasks.jobs.car.ruixing.ClbfJob;
 import com.nokia.finance.tasks.jobs.car.ruixing.CljbxxJob;
 import com.nokia.finance.tasks.jobs.car.ruixing.XslcytjJob;
 import com.nokia.finance.tasks.jobs.car.ruixing.YjbjrtjJob;
+import com.nokia.finance.tasks.jobs.house.chengben.HouseBuildingRepairMonthJob;
 import com.nokia.finance.tasks.pojo.RunJobDto;
 import org.springframework.stereotype.Service;
 
@@ -14,12 +22,31 @@ public class JobService {
     private final YjbjrtjJob yjbjrtjJob;
     private final ClbfJob clbfJob;
     private final XslcytjJob xslcytjJob;
+    private final CarRanYouJob carRanYouJob;
+    private final CarDaWeiXiuJob carDaWeiXiuJob;
+    private final CarWeiXiuJob carWeiXiuJob;
+    private final CarLuQiaoJob carLuQiaoJob;
+    private final CarBaoXianJob carBaoXianJob;
+    private final CarNianJianFeiJob carNianJianFeiJob;
+    private final CarQiTaJob carQiTaJob;
+    private final HouseBuildingRepairMonthJob houseBuildingRepairMonthJob;
 
-    public JobService(CljbxxJob cljbxxJob, YjbjrtjJob yjbjrtjJob, ClbfJob clbfJob, XslcytjJob xslcytjJob) {
+    public JobService(CljbxxJob cljbxxJob, YjbjrtjJob yjbjrtjJob, ClbfJob clbfJob, XslcytjJob xslcytjJob,
+                      CarRanYouJob carRanYouJob, CarDaWeiXiuJob carDaWeiXiuJob, CarWeiXiuJob carWeiXiuJob,
+                      CarLuQiaoJob carLuQiaoJob, CarBaoXianJob carBaoXianJob, CarNianJianFeiJob carNianJianFeiJob,
+                      CarQiTaJob carQiTaJob, HouseBuildingRepairMonthJob houseBuildingRepairMonthJob) {
         this.cljbxxJob = cljbxxJob;
         this.yjbjrtjJob = yjbjrtjJob;
         this.clbfJob = clbfJob;
         this.xslcytjJob = xslcytjJob;
+        this.carRanYouJob = carRanYouJob;
+        this.carDaWeiXiuJob = carDaWeiXiuJob;
+        this.carWeiXiuJob = carWeiXiuJob;
+        this.carLuQiaoJob = carLuQiaoJob;
+        this.carBaoXianJob = carBaoXianJob;
+        this.carNianJianFeiJob = carNianJianFeiJob;
+        this.carQiTaJob = carQiTaJob;
+        this.houseBuildingRepairMonthJob = houseBuildingRepairMonthJob;
     }
 
     public R<Object> runJob(RunJobDto dto) {
@@ -36,6 +63,30 @@ public class JobService {
             case XSLCYTJ_JOB:
                 xslcytjJob.runJob();
                 break;
+            case CAR_RAN_YOU_JOB:
+                carRanYouJob.runJob();
+                break;
+            case CAR_DA_WEI_XIU_JOB:
+                carDaWeiXiuJob.runJob();
+                break;
+            case CAR_WEI_XIU_JOB:
+                carWeiXiuJob.runJob();
+                break;
+            case CAR_LU_QIAO_JOB:
+                carLuQiaoJob.runJob();
+                break;
+            case CAR_BAO_XIAN_JOB:
+                carBaoXianJob.runJob();
+                break;
+            case CAR_NIAN_JIAN_FEI_JOB:
+                carNianJianFeiJob.runJob();
+                break;
+            case CAR_QI_TA_JOB:
+                carQiTaJob.runJob();
+                break;
+            case HOUSE_BUILDING_REPAIR_MONTH_JOB:
+                houseBuildingRepairMonthJob.runJob();
+                break;
             default:
                 break;
         }

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

@@ -21,7 +21,7 @@ public class CarService {
     /**
      * 匹配非车牌字符
      */
-    static final Pattern NOT_CHE_PAI_PATTERN = Pattern.compile("[^京津晋冀蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川贵云藏陕甘青宁新港澳学挂领试超练警A-Z\\d]");
+    static final Pattern NOT_CHE_PAI_PATTERN = Pattern.compile("[^京津晋冀蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川贵云藏陕甘青宁新港澳学挂领试超练警国防A-Z\\d]");
     /**
      * 车牌正则
      */

+ 32 - 0
src/main/resources/application-dev.yml

@@ -35,3 +35,35 @@ job:
     xslcytj-source-path: data/rxftp/xslcytj/
     # 睿行车辆行驶里程月数据归档路径
     xslcytj-history-path: data/history/rxftp/xslcytj/
+    # 河北成本管理系统车辆燃油数据路径
+    car-ran-you-source-path: data/jzftp/HE_M_MTC_VEHICLE_OIL/
+    # 河北成本管理系统车辆燃油数据归档路径
+    car-ran-you-history-path: data/history/jzftp/HE_M_MTC_VEHICLE_OIL/
+    # 河北成本管理系统车辆大额维修数据路径
+    car-da-wei-xiu-source-path: data/jzftp/HE_M_MTC_VEHICLE_DEBX/
+    # 河北成本管理系统车辆大额维修数据归档路径
+    car-da-wei-xiu-history-path: data/history/jzftp/HE_M_MTC_VEHICLE_DEBX/
+    # 河北成本管理系统车辆普通维修数据路径
+    car-wei-xiu-source-path: data/jzftp/HE_M_MTC_VEHICLE_MAINTENANCE/
+    # 河北成本管理系统车辆普通维修数据归档路径
+    car-wei-xiu-history-path: data/history/jzftp/HE_M_MTC_VEHICLE_MAINTENANCE/
+    # 河北成本管理系统车辆路桥数据路径
+    car-lu-qiao-source-path: data/jzftp/HE_M_MTC_VEHICLE_CLLQ/
+    # 河北成本管理系统车辆路桥数据归档路径
+    car-lu-qiao-history-path: data/history/jzftp/HE_M_MTC_VEHICLE_CLLQ/
+    # 河北成本管理系统车辆保险数据路径
+    car-bao-xian-source-path: data/jzftp/HE_M_MTC_VEHICLE_INSURANCE/
+    # 河北成本管理系统车辆保险数据归档路径
+    car-bao-xian-history-path: data/history/jzftp/HE_M_MTC_VEHICLE_INSURANCE/
+    # 河北成本管理系统车辆年检数据路径
+    car-nian-jian-fei-source-path: data/jzftp/HE_M_MTC_VEHICLE_INSPECTION/
+    # 河北成本管理系统车辆年检数据归档路径
+    car-nian-jian-fei-history-path: data/history/jzftp/HE_M_MTC_VEHICLE_INSPECTION/
+    # 河北成本管理系统车辆其他费用数据路径
+    car-qi-ta-source-path: data/jzftp/HE_M_MTC_VEHICLE_OTHER/
+    # 河北成本管理系统车辆其他费用数据归档路径
+    car-qi-ta-history-path: data/history/jzftp/HE_M_MTC_VEHICLE_OTHER/
+    # 河北成本管理系统自有类房产维修数据路径
+    house-building-repair-month-source-path: data/jzftp/HE_M_MTC_HOUSE/
+    # 河北成本管理系统自有类房产维修数据归档路径
+    house-building-repair-month-history-path: data/history/jzftp/HE_M_MTC_HOUSE/

+ 32 - 0
src/main/resources/application-prod.yml

@@ -35,3 +35,35 @@ job:
     xslcytj-source-path: /data/rxftp/xslcytj/
     # 睿行车辆行驶里程月数据归档路径
     xslcytj-history-path: /data/history/rxftp/xslcytj/
+    # 河北成本管理系统车辆燃油数据路径
+    car-ran-you-source-path: /data/jzftp/HE_M_MTC_VEHICLE_OIL/
+    # 河北成本管理系统车辆燃油数据归档路径
+    car-ran-you-history-path: /data/history/jzftp/HE_M_MTC_VEHICLE_OIL/
+    # 河北成本管理系统车辆大额维修数据路径
+    car-da-wei-xiu-source-path: /data/jzftp/HE_M_MTC_VEHICLE_DEBX/
+    # 河北成本管理系统车辆大额维修数据归档路径
+    car-da-wei-xiu-history-path: /data/history/jzftp/HE_M_MTC_VEHICLE_DEBX/
+    # 河北成本管理系统车辆普通维修数据路径
+    car-wei-xiu-source-path: /data/jzftp/HE_M_MTC_VEHICLE_MAINTENANCE/
+    # 河北成本管理系统车辆普通维修数据归档路径
+    car-wei-xiu-history-path: /data/history/jzftp/HE_M_MTC_VEHICLE_MAINTENANCE/
+    # 河北成本管理系统车辆路桥数据路径
+    car-lu-qiao-source-path: /data/jzftp/HE_M_MTC_VEHICLE_CLLQ/
+    # 河北成本管理系统车辆路桥数据归档路径
+    car-lu-qiao-history-path: /data/history/jzftp/HE_M_MTC_VEHICLE_CLLQ/
+    # 河北成本管理系统车辆保险数据路径
+    car-bao-xian-source-path: /data/jzftp/HE_M_MTC_VEHICLE_INSURANCE/
+    # 河北成本管理系统车辆保险数据归档路径
+    car-bao-xian-history-path: /data/history/jzftp/HE_M_MTC_VEHICLE_INSURANCE/
+    # 河北成本管理系统车辆年检数据路径
+    car-nian-jian-fei-source-path: /data/jzftp/HE_M_MTC_VEHICLE_INSPECTION/
+    # 河北成本管理系统车辆年检数据归档路径
+    car-nian-jian-fei-history-path: /data/history/jzftp/HE_M_MTC_VEHICLE_INSPECTION/
+    # 河北成本管理系统车辆其他费用数据路径
+    car-qi-ta-source-path: /data/jzftp/HE_M_MTC_VEHICLE_OTHER/
+    # 河北成本管理系统车辆其他费用数据归档路径
+    car-qi-ta-history-path: /data/history/jzftp/HE_M_MTC_VEHICLE_OTHER/
+    # 河北成本管理系统自有类房产维修数据路径
+    house-building-repair-month-source-path: /data/jzftp/HE_M_MTC_HOUSE/
+    # 河北成本管理系统自有类房产维修数据归档路径
+    house-building-repair-month-history-path: /data/history/jzftp/HE_M_MTC_HOUSE/

+ 22 - 0
src/test/java/com/nokia/finance/tasks/car/chengben/CarBaoXianJobTests.java

@@ -0,0 +1,22 @@
+package com.nokia.finance.tasks.car.chengben;
+
+import com.nokia.finance.tasks.jobs.car.chengben.CarBaoXianJob;
+import lombok.extern.slf4j.Slf4j;
+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;
+
+@Slf4j
+@SpringBootTest
+@ActiveProfiles("dev")
+class CarBaoXianJobTests {
+    @Autowired
+    CarBaoXianJob carBaoXianJob;
+
+    @Test
+    void runJobTest() {
+        carBaoXianJob.runJob();
+    }
+
+}

+ 22 - 0
src/test/java/com/nokia/finance/tasks/car/chengben/CarDaWeiXiuJobTests.java

@@ -0,0 +1,22 @@
+package com.nokia.finance.tasks.car.chengben;
+
+import com.nokia.finance.tasks.jobs.car.chengben.CarDaWeiXiuJob;
+import lombok.extern.slf4j.Slf4j;
+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;
+
+@Slf4j
+@SpringBootTest
+@ActiveProfiles("dev")
+class CarDaWeiXiuJobTests {
+    @Autowired
+    CarDaWeiXiuJob carDaWeiXiuJob;
+
+    @Test
+    void runJobTest() {
+        carDaWeiXiuJob.runJob();
+    }
+
+}

+ 22 - 0
src/test/java/com/nokia/finance/tasks/car/chengben/CarLuQiaoJobTests.java

@@ -0,0 +1,22 @@
+package com.nokia.finance.tasks.car.chengben;
+
+import com.nokia.finance.tasks.jobs.car.chengben.CarLuQiaoJob;
+import lombok.extern.slf4j.Slf4j;
+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;
+
+@Slf4j
+@SpringBootTest
+@ActiveProfiles("dev")
+class CarLuQiaoJobTests {
+    @Autowired
+    CarLuQiaoJob carLuQiaoJob;
+
+    @Test
+    void runJobTest() {
+        carLuQiaoJob.runJob();
+    }
+
+}

+ 22 - 0
src/test/java/com/nokia/finance/tasks/car/chengben/CarNianJianFeiJobTests.java

@@ -0,0 +1,22 @@
+package com.nokia.finance.tasks.car.chengben;
+
+import com.nokia.finance.tasks.jobs.car.chengben.CarNianJianFeiJob;
+import lombok.extern.slf4j.Slf4j;
+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;
+
+@Slf4j
+@SpringBootTest
+@ActiveProfiles("dev")
+class CarNianJianFeiJobTests {
+    @Autowired
+    CarNianJianFeiJob carNianJianFeiJob;
+
+    @Test
+    void runJobTest() {
+        carNianJianFeiJob.runJob();
+    }
+
+}

+ 22 - 0
src/test/java/com/nokia/finance/tasks/car/chengben/CarQiTaJobTests.java

@@ -0,0 +1,22 @@
+package com.nokia.finance.tasks.car.chengben;
+
+import com.nokia.finance.tasks.jobs.car.chengben.CarQiTaJob;
+import lombok.extern.slf4j.Slf4j;
+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;
+
+@Slf4j
+@SpringBootTest
+@ActiveProfiles("dev")
+class CarQiTaJobTests {
+    @Autowired
+    CarQiTaJob carQiTaJob;
+
+    @Test
+    void runJobTest() {
+        carQiTaJob.runJob();
+    }
+
+}

+ 22 - 0
src/test/java/com/nokia/finance/tasks/car/chengben/CarRanYouJobTests.java

@@ -0,0 +1,22 @@
+package com.nokia.finance.tasks.car.chengben;
+
+import com.nokia.finance.tasks.jobs.car.chengben.CarRanYouJob;
+import lombok.extern.slf4j.Slf4j;
+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;
+
+@Slf4j
+@SpringBootTest
+@ActiveProfiles("dev")
+class CarRanYouJobTests {
+    @Autowired
+    CarRanYouJob carRanYouJob;
+
+    @Test
+    void runJobTest() {
+        carRanYouJob.runJob();
+    }
+
+}

+ 22 - 0
src/test/java/com/nokia/finance/tasks/car/chengben/CarWeiXiuJobTests.java

@@ -0,0 +1,22 @@
+package com.nokia.finance.tasks.car.chengben;
+
+import com.nokia.finance.tasks.jobs.car.chengben.CarWeiXiuJob;
+import lombok.extern.slf4j.Slf4j;
+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;
+
+@Slf4j
+@SpringBootTest
+@ActiveProfiles("dev")
+class CarWeiXiuJobTests {
+    @Autowired
+    CarWeiXiuJob carWeiXiuJob;
+
+    @Test
+    void runJobTest() {
+        carWeiXiuJob.runJob();
+    }
+
+}

+ 22 - 0
src/test/java/com/nokia/finance/tasks/house/chengben/HouseBuildingRepairMonthJobTests.java

@@ -0,0 +1,22 @@
+package com.nokia.finance.tasks.house.chengben;
+
+import com.nokia.finance.tasks.jobs.house.chengben.HouseBuildingRepairMonthJob;
+import lombok.extern.slf4j.Slf4j;
+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;
+
+@Slf4j
+@SpringBootTest
+@ActiveProfiles("dev")
+class HouseBuildingRepairMonthJobTests {
+    @Autowired
+    HouseBuildingRepairMonthJob houseBuildingRepairMonthJob;
+
+    @Test
+    void runJobTest() {
+        houseBuildingRepairMonthJob.runJob();
+    }
+
+}