From b31b25b6ff15a47b4e0720153887293a047c68da Mon Sep 17 00:00:00 2001 From: dengjun Date: Tue, 12 Mar 2024 13:05:03 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9B=E6=B8=AF=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../haitonggauto/rtosc/dto/ExportInVo.java | 2 +- .../rtosc/excel/ExportInExportExcel.java | 2 +- .../rtosc/excel/ExportInPlanExcel.java | 2 +- .../rtosc/excel/ExportLoadInsideExcel.java | 2 +- nuzar-customer-controller/Dockerfile | 1 + nuzar-customer-controller/pom.xml | 14 +++ .../haitonggauto/rtosc/api/NuzarPubApi.java | 4 + .../rtosc/api/dto/PubMappingMapDto.java | 23 ++++ .../rtosc/handler/ExportInHandler.java | 79 +++++++++++--- .../rtosc/handler/excel/ExcelMergeUtil.java | 100 ++++++++++++++++++ .../rtosc/job/SyncToOldHandler.java | 72 +++++++++++++ .../src/main/resources/templates/in_temp.xlsx | Bin 20314 -> 20109 bytes 12 files changed, 284 insertions(+), 17 deletions(-) create mode 100644 nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/api/dto/PubMappingMapDto.java create mode 100644 nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/handler/excel/ExcelMergeUtil.java create mode 100644 nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/job/SyncToOldHandler.java diff --git a/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/dto/ExportInVo.java b/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/dto/ExportInVo.java index 3d3044e..39303f7 100644 --- a/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/dto/ExportInVo.java +++ b/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/dto/ExportInVo.java @@ -25,7 +25,7 @@ import java.util.List; @Data @ApiModel(value = "出口进场基本表", description = "") @MoreThan(groups = {ValidationGroup.insert.class, ValidationGroup.update.class}, field1 = "quantity", field2 = "eachQuantity", message = "数量不得超过单票件数") -@DependsOn(groups = {ValidationGroup.insert.class, ValidationGroup.update.class}, field1 = "natureFlagName", fields = {"transferShipId", "transferShipName", "transferVoyageId", "transferVoyage"}, message = "货物性质为“正常”时,中转船ID,中转船名,中转航次ID,中转航次为空, 否则必填") +@DependsOn(groups = {ValidationGroup.insert.class, ValidationGroup.update.class}, field1 = "natureFlagName", fields = {"transferShipId", "transferShipName", "transferVoyageId", "transferVoyage"}, message = "货物性质为“正常”时,中转船名,中转航次为空, 否则必填") public class ExportInVo implements Serializable { @ApiModelProperty(value = "是否直接提交审核") diff --git a/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/excel/ExportInExportExcel.java b/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/excel/ExportInExportExcel.java index 963b362..30658a9 100644 --- a/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/excel/ExportInExportExcel.java +++ b/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/excel/ExportInExportExcel.java @@ -83,7 +83,7 @@ public class ExportInExportExcel { @ExcelProperty("单票件数") private Integer eachQuantity; - @ExcelProperty("单票重量(吨)") + @ExcelProperty("单票重量(千克)") private BigDecimal eachWeight; @ExcelProperty("单票体积") diff --git a/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/excel/ExportInPlanExcel.java b/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/excel/ExportInPlanExcel.java index a0eb724..cc4564d 100644 --- a/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/excel/ExportInPlanExcel.java +++ b/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/excel/ExportInPlanExcel.java @@ -37,7 +37,7 @@ import java.util.Date; * 19.源类型必须是是新能源、不是新能源,否则的导入不成功 */ @Data -@DependsOn(field1 = "natureFlagName", fields = {"transferShipName", "transferVoyage"}, message = "货物性质为“正常”时,中转船ID,中转船名,中转航次ID,中转航次为空, 否则必填") +@DependsOn(field1 = "natureFlagName", fields = {"transferShipName", "transferVoyage"}, message = "货物性质为“正常”时,中转船名,中转航次为空, 否则必填") public class ExportInPlanExcel { /** diff --git a/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/excel/ExportLoadInsideExcel.java b/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/excel/ExportLoadInsideExcel.java index 556e1fd..d53b5ab 100644 --- a/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/excel/ExportLoadInsideExcel.java +++ b/nuzar-customer-client/src/main/java/com/haitonggauto/rtosc/excel/ExportLoadInsideExcel.java @@ -9,7 +9,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; @Data -@DependsOn(field1 = "natureFlagName", fields = {"transferShipName", "transferVoyage"}, message = "货物性质为“正常”时,中转船ID,中转船名,中转航次ID,中转航次为空, 否则必填") +@DependsOn(field1 = "natureFlagName", fields = {"transferShipName", "transferVoyage"}, message = "货物性质为“正常”时,中转船名,中转航次为空, 否则必填") public class ExportLoadInsideExcel { @ExcelProperty("*船名") diff --git a/nuzar-customer-controller/Dockerfile b/nuzar-customer-controller/Dockerfile index f33c2f2..7b45921 100644 --- a/nuzar-customer-controller/Dockerfile +++ b/nuzar-customer-controller/Dockerfile @@ -2,6 +2,7 @@ FROM adoptopenjdk/openjdk8:ubi WORKDIR /home COPY target/*.jar /home/app.jar EXPOSE 9000 +EXPOSE 18085 ENV TZ "Asia/Shanghai" RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime ENV PROFILES_OPTS="" diff --git a/nuzar-customer-controller/pom.xml b/nuzar-customer-controller/pom.xml index e1cebcd..c112359 100644 --- a/nuzar-customer-controller/pom.xml +++ b/nuzar-customer-controller/pom.xml @@ -81,6 +81,20 @@ org.elasticsearch.client 7.17.2 + + com.nuzar + nuzar-xxl-starter + + + org.apache.groovy + groovy + 4.0.19 + + + com.google.code.gson + gson + 2.9.0 + diff --git a/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/api/NuzarPubApi.java b/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/api/NuzarPubApi.java index e73d77c..8201058 100644 --- a/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/api/NuzarPubApi.java +++ b/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/api/NuzarPubApi.java @@ -78,4 +78,8 @@ public interface NuzarPubApi { @GetMapping(value = "/shipManage/queryLikeShipManage") List getShipList(@RequestParam("key") String key, @RequestParam("query") String query, @RequestParam("spmId") String spmId , @RequestParam("valid") String valid, @RequestParam("vslCd") String vslCd, @RequestParam("vslCnname") String vslCnname, @RequestParam("vslEnnameList") List vslEnnameList); + + // 类型匹配 + @PostMapping("/attachment/mappingMap") + PubMappingMapDto getPubMapping(); } diff --git a/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/api/dto/PubMappingMapDto.java b/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/api/dto/PubMappingMapDto.java new file mode 100644 index 0000000..36e1ad7 --- /dev/null +++ b/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/api/dto/PubMappingMapDto.java @@ -0,0 +1,23 @@ +package com.haitonggauto.rtosc.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +@Data +@ApiModel("字典映射关系") +public class PubMappingMapDto implements Serializable { + + @ApiModelProperty(value ="车型-车型明细-code") + private Map> vehicleDetail; + + @ApiModelProperty(value ="车型-操作模式-code") + private Map> opprocMode; + + @ApiModelProperty(value ="国家-港口-id") + private Map> port; +} diff --git a/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/handler/ExportInHandler.java b/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/handler/ExportInHandler.java index 60fe97c..105c87e 100644 --- a/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/handler/ExportInHandler.java +++ b/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/handler/ExportInHandler.java @@ -26,6 +26,7 @@ import com.haitonggauto.rtosc.common.handler.BaseHandler; import com.haitonggauto.rtosc.common.utils.*; import com.haitonggauto.rtosc.dto.*; import com.haitonggauto.rtosc.excel.*; +import com.haitonggauto.rtosc.handler.excel.ExcelMergeUtil; import com.haitonggauto.rtosc.handler.excel.ExcelValidationUtils; import com.haitonggauto.rtosc.query.CargoQuery; import com.haitonggauto.rtosc.query.ExportInCheckQuery; @@ -798,7 +799,8 @@ public class ExportInHandler implements BaseHandler { if (CollectionUtils.isNotEmpty(cargos)) { // 验证车架号 // 查询 车架号在系统中是否已经存在, 编辑的和新增的判断方式是不一样的 List vins = cargos.stream().map(item -> item.getVin()).collect(Collectors.toList()); - List exists = customerExportInCargoService.list(new LambdaQueryWrapper().in(CustomerExportInCargo::getVin, vins)); + List exists = customerExportInCargoService.list(new LambdaQueryWrapper().in(CustomerExportInCargo::getVin, vins) + .notExists("select id from customer_export_in where customer_export_in.id=customer_export_in_cargo.export_in_id and customer_export_in.check_status={0}", AuditEnum.AUDIT_REJECT)); if (CollectionUtils.isNotEmpty(exists)) { // 查询出对应的港区 List list = customerExportInService.lambdaQuery().in(CustomerExportIn::getId, exists.stream().map(item -> item.getExportInId()).collect(Collectors.toList())).list(); @@ -1143,7 +1145,9 @@ public class ExportInHandler implements BaseHandler { if (CollectionUtils.isNotEmpty(cargos)) { // 查询 车架号在系统中是否已经存在, 编辑的和新增的判断方式是不一样的 List vins = cargos.stream().map(item -> item.getVin()).collect(Collectors.toList()); - List exists = customerExportInCargoService.list(new LambdaQueryWrapper().isNotNull(CustomerExportInCargo::getExportInId).in(CustomerExportInCargo::getVin, vins).ne(CustomerExportInCargo::getExportInId, exportIn.getId())); + List exists = customerExportInCargoService.list(new LambdaQueryWrapper().isNotNull(CustomerExportInCargo::getExportInId).in(CustomerExportInCargo::getVin, vins) + .notExists("select id from customer_export_in where customer_export_in.id=customer_export_in_cargo.export_in_id and customer_export_in.check_status={0}", AuditEnum.AUDIT_REJECT) + .ne(CustomerExportInCargo::getExportInId, exportIn.getId())); if (CollectionUtils.isNotEmpty(exists)) { // 查询出对应的港区 List list = customerExportInService.lambdaQuery().in(CustomerExportIn::getId, exists.stream().map(item -> item.getExportInId()).collect(Collectors.toList())).list(); @@ -1581,7 +1585,8 @@ public class ExportInHandler implements BaseHandler { // 移除oExists已经存在的 List vins = form.getVins().stream().filter(item -> !oExists.contains(item)).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(vins)) { - List exists = customerExportInCargoService.list(new LambdaQueryWrapper().in(CustomerExportInCargo::getVin, vins)); + List exists = customerExportInCargoService.list(new LambdaQueryWrapper().in(CustomerExportInCargo::getVin, vins) + .notExists("select id from customer_export_in where customer_export_in.id=customer_export_in_cargo.export_in_id and customer_export_in.check_status={0}", AuditEnum.AUDIT_REJECT)); List existVins = exists.stream().map(p -> p.getVin()).collect(Collectors.toList()); // 查询出对应的港区 @@ -1683,7 +1688,8 @@ public class ExportInHandler implements BaseHandler { List vins = cargos.stream().map(p -> p.getVin()).collect(Collectors.toList()); // 验证哪些车架号已经存在了 - List existCargos = customerExportInCargoService.list(new LambdaQueryWrapper().in(CustomerExportInCargo::getVin, vins)); + List existCargos = customerExportInCargoService.list(new LambdaQueryWrapper().in(CustomerExportInCargo::getVin, vins) + .notExists("select id from customer_export_in where customer_export_in.id=customer_export_in_cargo.export_in_id and customer_export_in.check_status={0}", AuditEnum.AUDIT_REJECT)); List existVins = existCargos.stream().map(p -> p.getVin()).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(existCargos)) { @@ -1907,7 +1913,9 @@ public class ExportInHandler implements BaseHandler { List vins = cargos.stream().map(p -> p.getVin()).collect(Collectors.toList()); // 验证哪些车架号已经存在了 - List existCargos = customerExportInCargoService.list(new LambdaQueryWrapper().in(CustomerExportInCargo::getVin, vins).ne(CustomerExportInCargo::getExportInId, exportIn.getId())); + List existCargos = customerExportInCargoService.list(new LambdaQueryWrapper().in(CustomerExportInCargo::getVin, vins) + .notExists("select id from customer_export_in where customer_export_in.id=customer_export_in_cargo.export_in_id and customer_export_in.check_status={0}", AuditEnum.AUDIT_REJECT) + .ne(CustomerExportInCargo::getExportInId, exportIn.getId())); List existVins = existCargos.stream().map(p -> p.getVin()).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(existCargos)) { @@ -2099,7 +2107,9 @@ public class ExportInHandler implements BaseHandler { List vins = cargos.stream().map(p -> p.getVin()).collect(Collectors.toList()); // 验证哪些车架号已经存在了 - List existCargos = customerExportInCargoService.list(new LambdaQueryWrapper().in(CustomerExportInCargo::getVin, vins).ne(CustomerExportInCargo::getExportInId, exportIn.getId())); + List existCargos = customerExportInCargoService.list(new LambdaQueryWrapper().in(CustomerExportInCargo::getVin, vins) + .notExists("select id from customer_export_in where customer_export_in.id=customer_export_in_cargo.export_in_id and customer_export_in.check_status={0}", AuditEnum.AUDIT_REJECT) + .ne(CustomerExportInCargo::getExportInId, exportIn.getId())); List existVins = existCargos.stream().map(p -> p.getVin()).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(existCargos)) { @@ -2273,6 +2283,7 @@ public class ExportInHandler implements BaseHandler { .eq(CustomerExportIn::getBillNum, billNo) .eq(CustomerExportIn::getBrand, brand) .eq(CustomerExportIn::getModels, models) + .ne(CustomerExportIn::getCheckStatus, AuditEnum.AUDIT_REJECT) .ne(CustomerExportIn::getCartType, "备件"); // 备件的不允许整船导入 // if (StringUtils.equals(type, "0")) { // cQuery.and((wrapper) -> { @@ -2386,7 +2397,10 @@ public class ExportInHandler implements BaseHandler { List vins = cargos.stream().map(p -> p.getVin()).collect(Collectors.toList()); // 验证哪些车架号已经存在了 - List existCargos = customerExportInCargoService.list(new LambdaQueryWrapper().in(CustomerExportInCargo::getVin, vins).ne(CustomerExportInCargo::getExportInId, exportIn.getId())); + List existCargos = customerExportInCargoService + .list(new LambdaQueryWrapper().in(CustomerExportInCargo::getVin, vins) + .notExists("select id from customer_export_in where customer_export_in.id=customer_export_in_cargo.export_in_id and customer_export_in.check_status={0}", AuditEnum.AUDIT_REJECT) + .ne(CustomerExportInCargo::getExportInId, exportIn.getId())); List existVins = existCargos.stream().map(p -> p.getVin()).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(existCargos)) { @@ -2598,7 +2612,7 @@ public class ExportInHandler implements BaseHandler { if (exportIn == null) { errorDataList.addAll(item.getValue().stream().map(p -> { JSONObject o = JSONObject.from(p); - o.put("status", "数量不一致不允许导入"); + o.put("status", "未匹配到数量一致的进港计划"); return o; }).collect(Collectors.toList())); return; @@ -2653,7 +2667,9 @@ public class ExportInHandler implements BaseHandler { List vins = cargos.stream().map(p -> p.getVin()).collect(Collectors.toList()); // 验证哪些车架号已经存在了 - List existCargos = customerExportInCargoService.list(new LambdaQueryWrapper().in(CustomerExportInCargo::getVin, vins).ne(CustomerExportInCargo::getExportInId, exportIn.getId())); + List existCargos = customerExportInCargoService.list(new LambdaQueryWrapper().in(CustomerExportInCargo::getVin, vins) + .notExists("select id from customer_export_in where customer_export_in.id=customer_export_in_cargo.export_in_id and customer_export_in.check_status={0}", AuditEnum.AUDIT_REJECT) + .ne(CustomerExportInCargo::getExportInId, exportIn.getId())); List existVins = existCargos.stream().map(p -> p.getVin()).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(existCargos)) { @@ -2787,7 +2803,14 @@ public class ExportInHandler implements BaseHandler { String fileName = URLEncoder.encode(DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN) + "出口进港计划清单", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); - excelWriter = EasyExcel.write(out).build(); + //合并坐标 + int[] mergeColumeIndex = {22,23,24}; + //从第二行后开始合并 + int mergeRowIndex = 1; + + excelWriter = EasyExcel.write(out) + .registerWriteHandler(new ExcelMergeUtil(9, mergeRowIndex, mergeColumeIndex)) + .build(); WriteSheet writeSheet = EasyExcel.writerSheet(0, "出口进港计划").head(ExportInExportExcel.class).build(); @@ -3143,7 +3166,8 @@ public class ExportInHandler implements BaseHandler { // 获取用户绑定的货代 List userBindFreight = openApi.getUserBindFreight(); - ; + + PubMappingMapDto pubMapping = pubApi.getPubMapping(); // 国家数据 List countryList = openApi.getCountryList(); @@ -3218,12 +3242,18 @@ public class ExportInHandler implements BaseHandler { return; } String tmpCountryId = countryList.stream().filter(p -> StringUtils.equalsIgnoreCase(p.getCtyCnname(), item.getCountry())).findFirst().get().getCtyId(); - if (portList.stream().filter(p -> StringUtils.equalsIgnoreCase(p.getText(), item.getPortName()) && StringUtils.equals(tmpCountryId, p.getExtra2())).count() == 0) { + if (portList.stream().filter(p -> StringUtils.equalsIgnoreCase(p.getText(), item.getPortName())).count() == 0) { JSONObject o = JSONObject.from(item); o.put("status", "港口不存在"); errorDataList.add(o); return; } + if (portList.stream().filter(p -> StringUtils.equalsIgnoreCase(p.getText(), item.getPortName()) && StringUtils.equals(tmpCountryId, p.getExtra2())).count() == 0) { + JSONObject o = JSONObject.from(item); + o.put("status", "国家和港口不匹配"); + errorDataList.add(o); + return; + } if (shipList.stream().filter(p -> StringUtils.equalsIgnoreCase(p.getText(), item.getShipName())).count() == 0) { JSONObject o = JSONObject.from(item); o.put("status", "船名不存在"); @@ -3236,6 +3266,15 @@ public class ExportInHandler implements BaseHandler { errorDataList.add(o); return; } + // 港区要和航次进行匹配 + if (!((StringUtils.equals(item.getPortArea(), "外高桥") && StringUtils.equals(item.getVoyage(), "HT6")) || + (StringUtils.equals(item.getPortArea(), "临港") && StringUtils.equals(item.getVoyage(), "HTLG")) || + (StringUtils.equals(item.getPortArea(), "太仓") && StringUtils.equals(item.getVoyage(), "HTTC")))) { + JSONObject o = JSONObject.from(item); + o.put("status", "港区和航次不匹配"); + errorDataList.add(o); + return; + } if (brandList.stream().filter(p -> StringUtils.equalsIgnoreCase(p.getText(), item.getBrand())).count() == 0) { JSONObject o = JSONObject.from(item); o.put("status", "品牌不存在"); @@ -3248,6 +3287,7 @@ public class ExportInHandler implements BaseHandler { errorDataList.add(o); return; } + String tmpCarTypeId = carTypeList.stream().filter(p -> StringUtils.equalsIgnoreCase(p.getText(), item.getCartType())).findFirst().get().getId(); if (originPlaceList.stream().filter(p -> StringUtils.equalsIgnoreCase(p.getCiyCnname(), item.getOriginPlace())).count() == 0) { JSONObject o = JSONObject.from(item); o.put("status", "产地错误"); @@ -3297,7 +3337,7 @@ public class ExportInHandler implements BaseHandler { } if (carDetailTypeList.get(item.getCartType()).stream().filter(p -> StringUtils.equalsIgnoreCase(p.getText(), item.getCartTypeDetail())).count() == 0) { JSONObject o = JSONObject.from(item); - o.put("status", "车型明细错误"); + o.put("status", "车型明细错误或者车型和车型明细不匹配"); errorDataList.add(o); return; } @@ -3308,6 +3348,13 @@ public class ExportInHandler implements BaseHandler { errorDataList.add(o); return; } + String tmpOperateTypeId = operateTypeList.stream().filter(p -> StringUtils.equalsIgnoreCase(p.getText(), item.getOperateType())).findFirst().get().getId(); + if (MapUtils.isEmpty(pubMapping.getOpprocMode()) || !pubMapping.getOpprocMode().containsKey(tmpCarTypeId) || CollectionUtils.isEmpty(pubMapping.getOpprocMode().get(tmpCarTypeId)) || !pubMapping.getOpprocMode().get(tmpCarTypeId).contains(tmpOperateTypeId)) { + JSONObject o = JSONObject.from(item); + o.put("status", "车型和操作模式不匹配"); + errorDataList.add(o); + return; + } if (specWorkList.stream().filter(p -> StringUtils.equalsIgnoreCase(p.getText(), item.getSpecWork())).count() == 0) { JSONObject o = JSONObject.from(item); o.put("status", "特殊作业错误"); @@ -3372,6 +3419,12 @@ public class ExportInHandler implements BaseHandler { errorDataList.add(o); return; } + if (bDate.getTime() > eDate.getTime()) { + JSONObject o = JSONObject.from(item); + o.put("status", "进场开始日期晚于进场结束日期"); + errorDataList.add(o); + return; + } if (StringUtils.isNotEmpty(item.getEnterTime())) { // 验证进场时间是否正确 Date d = DateUtils.parseDate(StringUtils.trim(item.getEnterTime()), "yyyy/MM/dd HH:mm"); diff --git a/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/handler/excel/ExcelMergeUtil.java b/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/handler/excel/ExcelMergeUtil.java new file mode 100644 index 0000000..ff2e9b0 --- /dev/null +++ b/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/handler/excel/ExcelMergeUtil.java @@ -0,0 +1,100 @@ +package com.haitonggauto.rtosc.handler.excel; + +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.write.handler.CellWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; + +import java.util.List; + +public class ExcelMergeUtil implements CellWriteHandler { + private int[] mergeColumnIndex; + private int mergeRowIndex; + private int baseColIndex; + + public ExcelMergeUtil() { + } + + public ExcelMergeUtil(int baseColIndex, int mergeRowIndex, int[] mergeColumnIndex) { + this.baseColIndex = baseColIndex; + this.mergeRowIndex = mergeRowIndex; + this.mergeColumnIndex = mergeColumnIndex; + } + + @Override + public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) { + + } + + @Override + public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + + } + + + + + @Override + public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + + //当前行 + int curRowIndex = cell.getRowIndex(); + //当前列 + int curColIndex = cell.getColumnIndex(); + + if (curRowIndex > mergeRowIndex) { + for (int i = 0; i < mergeColumnIndex.length; i++) { + if (curColIndex == mergeColumnIndex[i]) { + mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex); + break; + } + } + } + + } + + /** + * 当前单元格向上合并 + * + * @param writeSheetHolder + * @param cell 当前单元格 + * @param curRowIndex 当前行 + * @param curColIndex 当前列 + */ + private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) { + Object curData = cell.getCellType() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue(); + Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex); + Object preData = preCell.getCellType()== CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue(); + // 将当前单元格数据与上一个单元格数据比较 + Boolean dataBool = preData.equals(curData); + //此处需要注意,获取每一行第二列数据和上一行第一列数据进行比较,如果相等合并,getCell里面的值,是名称所在列的下标 + System.err.println(cell.getRow().getCell(baseColIndex).getStringCellValue()); + Boolean bool = cell.getRow().getCell(baseColIndex).getStringCellValue().equals(cell.getSheet().getRow(curRowIndex - 1).getCell(baseColIndex).getStringCellValue()); + if (dataBool && bool) { + Sheet sheet = writeSheetHolder.getSheet(); + List mergeRegions = sheet.getMergedRegions(); + boolean isMerged = false; + for (int i = 0; i < mergeRegions.size() && !isMerged; i++) { + CellRangeAddress cellRangeAddr = mergeRegions.get(i); + // 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元 + if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) { + sheet.removeMergedRegion(i); + cellRangeAddr.setLastRow(curRowIndex); + sheet.addMergedRegion(cellRangeAddr); + isMerged = true; + } + } + // 若上一个单元格未被合并,则新增合并单元 + if (!isMerged) { + CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex); + sheet.addMergedRegion(cellRangeAddress); + } + } + } +} diff --git a/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/job/SyncToOldHandler.java b/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/job/SyncToOldHandler.java new file mode 100644 index 0000000..a9786d0 --- /dev/null +++ b/nuzar-customer-controller/src/main/java/com/haitonggauto/rtosc/job/SyncToOldHandler.java @@ -0,0 +1,72 @@ +package com.haitonggauto.rtosc.job; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.haitonggauto.rtosc.common.context.UserContext; +import com.haitonggauto.rtosc.common.dto.LoginUser; +import com.haitonggauto.rtosc.common.utils.OkHttpUtils; +import com.haitonggauto.rtosc.config.SyncConfig; +import com.haitonggauto.rtosc.repository.entity.CustomerExportInSyncLog; +import com.haitonggauto.rtosc.repository.service.CustomerExportInSyncLogService; +import com.nuzar.common.security5.common.util.SecurityUtils; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class SyncToOldHandler { + + @Resource + private CustomerExportInSyncLogService syncLogService; + + @Resource + private SyncConfig syncConfig; + + /** + * 1、同步进港计划 + */ + @XxlJob("exportInSyncHandler") + public void exportInSyncHandler() throws Exception { + XxlJobHelper.log("同步开始"); + + Page page = syncLogService.lambdaQuery().like(CustomerExportInSyncLog::getResponseStr, "Failed to connect to").page(new Page<>(1, 10)); + + List collect = page.getRecords().stream().map(item -> item.getRequestStr()).collect(Collectors.toList()); + + XxlJobHelper.log("需要同步的数据:" + JSONObject.toJSONString(collect)); + + // 异步时,变量会丢失 +// LoginUser tmpUser = new LoginUser(); +// tmpUser.setUserId(SecurityUtils.getUserId()); +// tmpUser.setRoleId(0L); +// tmpUser.setAdmin(true); +// +// UserContext.setUser(tmpUser); + for (CustomerExportInSyncLog item : page.getRecords()) { + try { + + XxlJobHelper.log("同步老系统:" + item.getRequestStr()); + + String post = OkHttpUtils.post(syncConfig.getUrl() + "/execInPortPlanAdd", OkHttpUtils.buildJsonRequestBody(item.getRequestStr()), null); + + JSONObject rst = JSONObject.parseObject(post); + + XxlJobHelper.log("同步老系统结果:" + JSONObject.toJSONString(rst)); + + if (StringUtils.equals("0", rst.getString("success"))) { + throw new RuntimeException("请求参数:" + item.getRequestStr() + ", 错误信息:" + rst.getString("errmsg")); + } + + // 成功后就删除 + syncLogService.removeById(item); + } catch (Exception e) { + XxlJobHelper.log("同步失败:" + e.getMessage()); + } + } + } +} diff --git a/nuzar-customer-controller/src/main/resources/templates/in_temp.xlsx b/nuzar-customer-controller/src/main/resources/templates/in_temp.xlsx index 02a3a7f01f9b7f0002d6a827b698ee5561301ee5..fb98092b2c99f26743aa40b48d508a5a27fa35dc 100644 GIT binary patch literal 20109 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 Vqe%9LXNn9!|4~RomHgxG{{XjyTc`j4