diff --git a/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/ErpExternalApi.java b/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/ErpExternalApi.java index f55cdfb..875db6a 100644 --- a/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/ErpExternalApi.java +++ b/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/api/ErpExternalApi.java @@ -11,6 +11,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import java.util.HashMap; + @FeignClient(name = ApiConstants.NAME) @Tag(name = "RPC 服务 - ERP") public interface ErpExternalApi { @@ -19,6 +21,6 @@ public interface ErpExternalApi { @PostMapping(PREFIX + "/submit") @Operation(summary = "erp数据提交") - ResponseEntity submitDataToErp(@Valid @RequestBody ErpSubmitReqDTO reqDTO); + HashMap submitDataToErp(@Valid @RequestBody ErpSubmitReqDTO reqDTO); } diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/api/ErpExternalApiImpl.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/api/ErpExternalApiImpl.java index 6861777..27b4237 100644 --- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/api/ErpExternalApiImpl.java +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/api/ErpExternalApiImpl.java @@ -7,6 +7,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RestController; +import java.util.HashMap; + /** * ERP Api 实现类 * @@ -21,7 +23,7 @@ public class ErpExternalApiImpl implements ErpExternalApi { private ErpConfig erpConfig; @Override - public ResponseEntity submitDataToErp(ErpSubmitReqDTO reqDTO) { + public HashMap submitDataToErp(ErpSubmitReqDTO reqDTO) { return erpConfig.pushDataToErp(reqDTO); } } diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/common/conf/ErpConfig.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/common/conf/ErpConfig.java index 487f5ed..096e015 100644 --- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/common/conf/ErpConfig.java +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/common/conf/ErpConfig.java @@ -82,45 +82,114 @@ public class ErpConfig { } } + // GET请求处理 +// public HashMap getResult(SAPInterfaceResult result) { +// HashMap resMap = new HashMap<>(); +// String E_RSLT = null; +// JSONObject jsonObject = result.getData(); +// //判断 result里的succeed是否为true +// boolean succeed = result.isSucceed(); +// if (succeed && "S".equals(jsonObject.getString("E_FLAG"))) { +// JSONObject data = result.getData(); +// String flag = "S"; +// String E_RESP = data.getString("E_DATA"); +// +// String E_MSG = result.getMsg(); +//// log.info("请求SAP成功 E_RESP:{}", E_RESP); +//// log.info("请求SAP成功 E_MSG:{}", E_MSG); +// resMap.put("E_RESP", E_RESP); +// resMap.put("resStr", E_MSG); +// resMap.put("flag", flag); +// return resMap; +// } else { +// String E_MSG = result.getMsg(); +// String flag = "E"; +// resMap.put("resStr", E_MSG); +// resMap.put("flag", flag); +//// log.info("请求SAP失败 E_MSG:{}", E_MSG); +// return resMap; +// } +// } + /** * 调用ERP接口更新erp数据 */ -public ResponseEntity pushDataToErp(ErpSubmitReqDTO reqDTO) { - try { - // 构建完整URL - String url = "http://" + erpAddress + "/api/rfc/post"; - // 构建请求参数 - JSONObject requestBody = new JSONObject(); - requestBody.put("uuid", UUID.randomUUID().toString()); - requestBody.put("sapsys", sapsys); - requestBody.put("srcsys", "DSC"); - requestBody.put("funcnr", reqDTO.getFuncnr()); - requestBody.put("bskey", reqDTO.getBskey()); - requestBody.put("usrid", reqDTO.getUsrid()); - requestBody.put("usrnm", reqDTO.getUsrnm()); - if (reqDTO.getSign() != null){ - requestBody.put("sign", reqDTO.getSign()); + public HashMap pushDataToErp(ErpSubmitReqDTO reqDTO) { + try { + // 构建完整URL + String url = "http://" + erpAddress + "/api/rfc/post"; + // 构建请求参数 + JSONObject requestBody = new JSONObject(); + requestBody.put("uuid", UUID.randomUUID().toString()); + requestBody.put("sapsys", sapsys); + requestBody.put("srcsys", "DSC"); + requestBody.put("funcnr", reqDTO.getFuncnr()); + requestBody.put("bskey", reqDTO.getBskey()); + requestBody.put("usrid", reqDTO.getUsrid()); + requestBody.put("usrnm", reqDTO.getUsrnm()); + if (reqDTO.getSign() != null) { + requestBody.put("sign", reqDTO.getSign()); + } + if (reqDTO.getReq() != null) { + requestBody.put("req", reqDTO.getReq()); + } + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + // 创建HTTP请求实体 + HttpEntity requestEntity = new HttpEntity<>(requestBody.toJSONString(), headers); + + // 发送POST请求 + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity response = restTemplate.postForEntity(url, requestEntity, String.class); + + return postResult(response); + } catch (Exception e) { + log.error("调用ERP RFC接口失败:" + e.getMessage(), e); + return null; } - if (reqDTO.getReq() != null) { - requestBody.put("req", reqDTO.getReq()); - } - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - // 创建HTTP请求实体 - HttpEntity requestEntity = new HttpEntity<>(requestBody.toJSONString(), headers); - - // 发送POST请求 - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity response = restTemplate.postForEntity(url, requestEntity, String.class); - - return response; - } catch (Exception e) { - log.error("调用ERP RFC接口失败:"+e.getMessage(), e); - return ResponseEntity.status(500).body("调用ERP接口失败: " + e.getMessage()); } -} + + // POST请求处理 + public HashMap postResult(ResponseEntity result) { + HashMap resMap = new HashMap<>(); + String E_RSLT = null; + + boolean succeed = result.getHeaders().containsKey("succeed"); +// JSONObject data = result.getBody("data"); +// if (data == null) { +// throw new RuntimeException("SAP接口返回值为空," + result.getMsg()); +// } else if (succeed && "S".equals(data.getString("E_FLAG"))) { +// String E_FLAG = data.getString("E_FLAG"); +// String flag = "S"; +// String E_RESP = data.getString("E_RESP"); +// String E_MSG = data.getString("ET_MSG"); +//// log.info("请求SAP成功 E_RESP:{}", E_RESP); +//// log.info("请求SAP成功 E_MSG:{}", E_MSG); +// resMap.put("E_RESP", E_RESP); +// resMap.put("resStr", E_MSG); +// resMap.put("flag", flag); +// return resMap; +// } else if (!succeed && "E".equals(data.getString("E_FLAG"))) { +// String E_FLAG = data.getString("E_FLAG"); +// String flag = "E"; +// String E_RESP = data.getString("E_DATA"); +// String E_MSG = data.getString("ET_MSG"); +// if (StrUtil.isBlank(E_MSG)) { +// E_MSG = result.getMsg(); +// E_MSG = "[{\"MESSAGE\":\"" + result.getMsg() + "\"}]"; +// } +// resMap.put("resStr", E_MSG); +// resMap.put("flag", flag); +//// log.info("请求SAP失败 E_MSG:{}", E_MSG); +// return resMap; +// } else { +// throw new RuntimeException("SAP接口异常," + result); +// } + return resMap; + } + //list public Map> numbers(JSONArray dataArray, String key, String dataKey) { diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/ErpAssetController.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/ErpAssetController.java index 098191d..a129747 100644 --- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/ErpAssetController.java +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/ErpAssetController.java @@ -104,7 +104,7 @@ public class ErpAssetController { @PostMapping("/getErpAssetTask") @Operation(summary = "定时获得erp更新资产卡片") @PreAuthorize("@ss.hasPermission('sply:erp-asset:create')") - public CommonResult getErpCompanyTask() { + public CommonResult getErpAssetTask() { erpAssetService.callErpRfcInterface(); return success(true); } diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpProcessPageReqVO.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpProcessPageReqVO.java index a6bdae0..ee384cf 100644 --- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpProcessPageReqVO.java +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpProcessPageReqVO.java @@ -11,7 +11,7 @@ import java.math.BigDecimal; public class ErpProcessPageReqVO extends PageParam { @Schema(description = "工厂编码") - private BigDecimal factoryNumber; + private String factoryNumber; @Schema(description = "物料编码") private String materialNumber; diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpProcessRespVO.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpProcessRespVO.java index e7f9c44..fb285f1 100644 --- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpProcessRespVO.java +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpProcessRespVO.java @@ -18,7 +18,7 @@ public class ErpProcessRespVO { @Schema(description = "工厂编码", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("工厂编码") - private BigDecimal factoryNumber; + private String factoryNumber; @Schema(description = "物料编码", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("物料编码") diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpProcessSaveReqVO.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpProcessSaveReqVO.java index b6ddd3c..b9dbe90 100644 --- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpProcessSaveReqVO.java +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpProcessSaveReqVO.java @@ -16,7 +16,7 @@ public class ErpProcessSaveReqVO { @Schema(description = "工厂编码", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "工厂编码不能为空") - private BigDecimal factoryNumber; + private String factoryNumber; @Schema(description = "物料编码", requiredMode = Schema.RequiredMode.REQUIRED) @NotEmpty(message = "物料编码不能为空") diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/dal/dataobject/erp/ErpProcessDO.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/dal/dataobject/erp/ErpProcessDO.java index 18de83f..e55a72a 100644 --- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/dal/dataobject/erp/ErpProcessDO.java +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/dal/dataobject/erp/ErpProcessDO.java @@ -34,7 +34,7 @@ public class ErpProcessDO { * 工厂编码 */ @TableField("FACT_NUM") - private BigDecimal factoryNumber; + private String factoryNumber; /** * 物料编码 */ @@ -63,7 +63,7 @@ public class ErpProcessDO { /** * 计量单位 */ - @TableField("UOM") + @TableField("UNT") private String uom; /** * 用途 diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/dal/dataobject/erp/ErpProcessDetailDO.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/dal/dataobject/erp/ErpProcessDetailDO.java index 306f013..31b09f6 100644 --- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/dal/dataobject/erp/ErpProcessDetailDO.java +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/dal/dataobject/erp/ErpProcessDetailDO.java @@ -48,7 +48,7 @@ public class ErpProcessDetailDO { /** * 作业的计量单位 */ - @TableField("UOM") + @TableField("UNT") private String uom; /** * 工作中心编号 diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpBomServiceImpl.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpBomServiceImpl.java index ee0ccce..7c3e518 100644 --- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpBomServiceImpl.java +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpBomServiceImpl.java @@ -312,8 +312,8 @@ public class ErpBomServiceImpl implements ErpBomService { items.add(item); req.put("item", items); reqDTO.setReq(req); - ResponseEntity response = erpExternalApi.submitDataToErp(reqDTO); - if (response.getStatusCode() == HttpStatus.OK) { + HashMap response = erpExternalApi.submitDataToErp(reqDTO); + if (response.get("result").isEmpty()) { log.info("ERP数据提交成功"); } } diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpProcessDetailServiceImpl.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpProcessDetailServiceImpl.java index c1c1e32..472a12a 100644 --- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpProcessDetailServiceImpl.java +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpProcessDetailServiceImpl.java @@ -3,16 +3,24 @@ package com.zt.plat.module.erp.service.erp; import cn.hutool.core.collection.CollUtil; import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.util.object.BeanUtils; +import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zt.plat.module.erp.common.conf.ErpConfig; +import com.zt.plat.module.erp.common.enums.OftenEnum; import com.zt.plat.module.erp.controller.admin.erp.vo.ErpProcessDetailPageReqVO; import com.zt.plat.module.erp.controller.admin.erp.vo.ErpProcessDetailRespVO; import com.zt.plat.module.erp.controller.admin.erp.vo.ErpProcessDetailSaveReqVO; +import com.zt.plat.module.erp.dal.dataobject.erp.ErpBomDetailDO; import com.zt.plat.module.erp.dal.dataobject.erp.ErpProcessDetailDO; import com.zt.plat.module.erp.dal.mysql.erp.ErpProcessDetailMapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.zt.plat.module.erp.enums.ErrorCodeConstants.ERP_PROCESS_DETAIL_NOT_EXISTS; @@ -29,6 +37,9 @@ public class ErpProcessDetailServiceImpl implements ErpProcessDetailService { @Resource private ErpProcessDetailMapper erpProcessDetailMapper; + @Resource + private ErpConfig erpConfig; + @Override public ErpProcessDetailRespVO createErpProcessDetail(ErpProcessDetailSaveReqVO createReqVO) { // 插入 @@ -86,4 +97,92 @@ public class ErpProcessDetailServiceImpl implements ErpProcessDetailService { return erpProcessDetailMapper.selectPage(pageReqVO); } + public void saveOrUpdateErpProcessDetail(List updateReqVOS) { + String key = "erpMap" + OftenEnum.FuncnrEnum.工艺路线.getFuncnr() + "Detail"; + // 1. 处理公司数据,区分新增和更新 + ProcessingResult result = processData(updateReqVOS, key); + + // 2. 批量保存数据 + saveData(result); + } + + private ProcessingResult processData(List updateReqVOS, String key) { + if (erpConfig.getRedisCacheMap(key).isEmpty()) { + initializeMap(key); + } + List toUpdate = new ArrayList<>(); + List toInsert = new ArrayList<>(); + + List dataArrayNumbers = new ArrayList<>(); + Map existingNumbers = erpConfig.getRedisCacheMap(key); + for (ErpProcessDetailDO updateReqVO : updateReqVOS) { + String mapKey = updateReqVO.getProcessId() + "-" + updateReqVO.getProcessingNumber().toEngineeringString(); + if (updateReqVO.getId() == null) { + toInsert.add(updateReqVO); + } else { + toUpdate.add(updateReqVO); + } + dataArrayNumbers.add(mapKey); + } + + Map deleteNumbers = new HashMap<>(); + for (Map.Entry entry : existingNumbers.entrySet()) { + if (!dataArrayNumbers.contains(entry.getKey())) { + deleteNumbers.put(entry.getKey(), entry.getValue()); + } + } + + return new ProcessingResult(toUpdate, toInsert, deleteNumbers, key); + } + + private void saveData(ProcessingResult result) { + // 批量新增和更新 + if (!result.toInsert.isEmpty()) { + erpProcessDetailMapper.insertBatch(result.toInsert); + // 批量查询刚插入数据的id,提升效率 + List insertedRecords = erpProcessDetailMapper.selectList( + new LambdaQueryWrapperX() + .in(ErpProcessDetailDO::getProcessId, result.toInsert.stream().map(ErpProcessDetailDO::getProcessId).distinct().collect(Collectors.toList())) + .in(ErpProcessDetailDO::getProcessingNumber, result.toInsert.stream().map(ErpProcessDetailDO::getProcessingNumber).distinct().collect(Collectors.toList())) + ); + Map numberIdMap = insertedRecords.stream() + .collect(Collectors.toMap(asset -> asset.getProcessId() + "-" + asset.getProcessingNumber(), ErpProcessDetailDO::getId)); + erpConfig.addRedisCacheMap(result.key, numberIdMap); + } + if (!result.toUpdate.isEmpty()) { + erpProcessDetailMapper.updateBatch(result.toUpdate); + } + if (!result.deleteNumbers.isEmpty()) { + // 使用流式处理和批处理优化删除逻辑 + List idsToDelete = new ArrayList<>(result.deleteNumbers.values()); + if (!idsToDelete.isEmpty()) { + erpProcessDetailMapper.deleteByIds(idsToDelete); + } + erpConfig.deleteRedisCacheMap(result.key, new ArrayList<>(result.deleteNumbers.keySet())); + } + } + + private static class ProcessingResult { + private final List toUpdate; + private final List toInsert; + private final Map deleteNumbers; + private final String key; + + public ProcessingResult(List toUpdate, List toInsert, Map deleteNumbers, String key) { + this.toUpdate = toUpdate; + this.toInsert = toInsert; + this.deleteNumbers = deleteNumbers; + this.key = key; + } + } + + private void initializeMap(String key) { + List assets = erpProcessDetailMapper.selectList(new LambdaQueryWrapperX()); + Map existingNumbers = new HashMap<>(); + for (ErpProcessDetailDO asset : assets) { + String mapKey = asset.getProcessId() + "-" + asset.getProcessingNumber(); + existingNumbers.put(mapKey, asset.getId()); + } + erpConfig.addRedisCacheMap(key, existingNumbers); + } } \ No newline at end of file diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpProcessServiceImpl.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpProcessServiceImpl.java index e5a73a5..967fdf5 100644 --- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpProcessServiceImpl.java +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpProcessServiceImpl.java @@ -3,12 +3,13 @@ package com.zt.plat.module.erp.service.erp; import cn.hutool.core.collection.CollUtil; import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.util.object.BeanUtils; +import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; import com.zt.plat.module.erp.common.conf.ErpConfig; import com.zt.plat.module.erp.common.enums.OftenEnum; import com.zt.plat.module.erp.controller.admin.erp.vo.ErpProcessPageReqVO; import com.zt.plat.module.erp.controller.admin.erp.vo.ErpProcessRespVO; import com.zt.plat.module.erp.controller.admin.erp.vo.ErpProcessSaveReqVO; -import com.zt.plat.module.erp.dal.dataobject.erp.ErpProcessDO; +import com.zt.plat.module.erp.dal.dataobject.erp.*; import com.zt.plat.module.erp.dal.dataobject.erp.ErpProcessDO; import com.zt.plat.module.erp.dal.mysql.erp.ErpProcessMapper; import com.alibaba.fastjson.JSONArray; @@ -20,10 +21,12 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zt.plat.module.erp.enums.ErrorCodeConstants.ERP_BOM_NOT_EXISTS; import static com.zt.plat.module.erp.enums.ErrorCodeConstants.ERP_PROCESS_NOT_EXISTS; import static dm.jdbc.util.DriverUtil.log; @@ -42,6 +45,10 @@ public class ErpProcessServiceImpl implements ErpProcessService { @Resource private ErpConfig erpConfig; + @Resource + private ErpProcessDetailServiceImpl processDetailService; + + @Override public ErpProcessRespVO createErpProcess(ErpProcessSaveReqVO createReqVO) { // 插入 @@ -69,12 +76,12 @@ public class ErpProcessServiceImpl implements ErpProcessService { } @Override - public void deleteErpProcessListByIds(List ids) { + public void deleteErpProcessListByIds(List ids) { // 校验存在 validateErpProcessExists(ids); // 删除 erpProcessMapper.deleteByIds(ids); - } + } private void validateErpProcessExists(List ids) { List list = erpProcessMapper.selectByIds(ids); @@ -104,16 +111,32 @@ public class ErpProcessServiceImpl implements ErpProcessService { @XxlJob("getErpProcessTask") public void callErpRfcInterface() { try { - OftenEnum.FuncnrEnum funcnrEnum =OftenEnum.FuncnrEnum.公司代码; + OftenEnum.FuncnrEnum funcnrEnum = OftenEnum.FuncnrEnum.公司代码; String funcnr = funcnrEnum.getFuncnr(); + String key = "erpMap" + funcnr; + if (erpConfig.getRedisCacheMap(key).isEmpty()) { + initializeMap(key); + } + Map req = new HashMap<>(); + JSONArray dataArrayALL = new JSONArray(); + String factKey = "erpMap" + OftenEnum.FuncnrEnum.工厂信息.getFuncnr(); + Map redisCache = erpConfig.getRedisCacheMap(factKey); + if (CollUtil.isEmpty(redisCache)) { + throw exception(ERP_PROCESS_NOT_EXISTS); + } // 1. 调用ERP接口获取数据 - JSONArray dataArray = erpConfig.fetchDataFromERP(funcnr, null); - if (dataArray == null || dataArray.isEmpty()) { - return; + for (String factoryNumber : redisCache.keySet()) { + req.put("WERKS", factoryNumber); + // 1. 调用ERP接口获取数据 + JSONArray dataArray = erpConfig.fetchDataFromERP(funcnr, req); + if (dataArray == null || dataArray.isEmpty()) { + continue; + } + dataArrayALL.addAll(dataArray); } // 2. 处理公司数据,区分新增和更新 - ProcessingResult result = processData(dataArray,funcnrEnum); + ProcessingResult result = processData(dataArrayALL, funcnrEnum); // 3. 批量保存数据 saveData(result); @@ -127,35 +150,65 @@ public class ErpProcessServiceImpl implements ErpProcessService { /** * 处理数据,区分新增和更新 */ - private ProcessingResult processData(JSONArray dataArray, OftenEnum.FuncnrEnum funcnr) { - String key = "erp" + funcnr.getFuncnr(); - Map> numbers = erpConfig.numbers(dataArray, key,funcnr.getDatakey()); - List allnumbers = numbers.get("all"); - List comnumbers = numbers.get("com"); + private ProcessingResult processData(JSONArray dataArray, OftenEnum.FuncnrEnum funcnrEnum) { + String key = "erpMap" + funcnrEnum.getFuncnr(); + Map numbers = erpConfig.getRedisCacheMap(key); List toUpdate = new ArrayList<>(); - List toInsert = new ArrayList<>(); + + List erpProcessDetailDOList = new ArrayList<>(); + Map addnumbers = new HashMap<>(); + List dataArrayNumbers = new ArrayList<>(); for (int i = 0; i < dataArray.size(); i++) { JSONObject dataJson = dataArray.getJSONObject(i); if (dataJson != null) { - String number = dataJson.getString("BUKRS").trim(); - if (number != null) { - ErpProcessDO DO = new ErpProcessDO(); -// DO.setName(dataJson.getString("BUTXT")); -// DO.setNumber(number); -// DO.setCurrency(dataJson.getString("WAERS")); - if (comnumbers.contains(number)) { - // 更新 - toUpdate.add(DO); - } else { - // 新增 - toInsert.add(DO); + ErpProcessDO DO = new ErpProcessDO(); + DO.setFactoryNumber(dataJson.getString("WERKS")); + DO.setMaterialNumber(dataJson.getString("MATNR")); + DO.setMaterialName(dataJson.getString("MAKTX")); + DO.setBlineGroup(dataJson.getString("PLNAL")); + DO.setGroupCount(dataJson.getLong("PLNNR")); + DO.setBlineDescription(dataJson.getString("KTEXT")); + DO.setUom(dataJson.getString("PLNME")); + DO.setUseDescription(dataJson.getString("VERWE")); + DO.setStatus(dataJson.getString("STATU")); + String number = DO.getFactoryNumber() + "-" + DO.getMaterialNumber() + "-" + DO.getBlineGroup(); + dataArrayNumbers.add(number); + if (numbers.get(number) != null) { + // 更新 + toUpdate.add(DO); + } else { + // 新增 + erpProcessMapper.insert(DO); + addnumbers.put(number, DO.getId()); + } + + JSONArray dataJsonItem = dataJson.getJSONArray("ITEM"); + if (dataJsonItem != null && !dataJsonItem.isEmpty()) { + for (int j = 0; j < dataJsonItem.size(); j++) { + JSONObject itemJson = dataJsonItem.getJSONObject(j); + ErpProcessDetailDO detailDO = new ErpProcessDetailDO(); + detailDO.setProcessId(String.valueOf(DO.getId())); + detailDO.setProcessingNumber(itemJson.getBigDecimal("VORNR")); + detailDO.setProcessingName(itemJson.getString("LTXA1")); + detailDO.setUom(itemJson.getString("MEINH")); + detailDO.setWorkCenterNumber(itemJson.getString("ARBPL")); + detailDO.setWorkCenterName(itemJson.getString("KTEXT1")); + erpProcessDetailDOList.add(detailDO); } } } } - return new ProcessingResult(toUpdate, toInsert,key,allnumbers); + // 识别需要删除的数据 + List deleteNumbers = new ArrayList<>(); + for (String number : numbers.keySet()) { + if (!dataArrayNumbers.contains(number)) { + deleteNumbers.add(number); + } + } + + return new ProcessingResult(toUpdate, key, addnumbers, deleteNumbers, erpProcessDetailDOList); } /** @@ -163,13 +216,22 @@ public class ErpProcessServiceImpl implements ErpProcessService { */ private void saveData(ProcessingResult result) { // 批量新增和更新 - if (!result.toInsert.isEmpty()) { - erpProcessMapper.insertBatch(result.toInsert); - } if (!result.toUpdate.isEmpty()) { erpProcessMapper.updateBatch(result.toUpdate); } - erpConfig.updateRedisCache(result.key,result.allnumbers); + // 保存或更新BOM详情 + if (!result.erpProcessDetailDOList.isEmpty()) { + processDetailService.saveOrUpdateErpProcessDetail(result.erpProcessDetailDOList); + } + + // 更新Redis缓存 + if (!result.addnumbers.isEmpty()) { + erpConfig.addRedisCacheMap(result.key, result.addnumbers); + } + + if (!result.deleteNumbers.isEmpty()) { + erpConfig.deleteRedisCacheMap(result.key, result.deleteNumbers); + } } /** @@ -177,15 +239,28 @@ public class ErpProcessServiceImpl implements ErpProcessService { */ private static class ProcessingResult { private final List toUpdate; - private final List toInsert; private final String key; - private final List allnumbers; + private final Map addnumbers; + private final List deleteNumbers; + private final List erpProcessDetailDOList; - public ProcessingResult(List toUpdate, List toInsert,String key,List allnumbers) { + public ProcessingResult(List toUpdate, String key, Map addnumbers, + List deleteNumbers, List erpProcessDetailDOList) { this.toUpdate = toUpdate; - this.toInsert = toInsert; this.key = key; - this.allnumbers = allnumbers; + this.addnumbers = addnumbers; + this.deleteNumbers = deleteNumbers; + this.erpProcessDetailDOList = erpProcessDetailDOList; } } + + private void initializeMap(String key) { + List bomList = erpProcessMapper.selectList(new LambdaQueryWrapperX()); + Map existingNumbers = new HashMap<>(); + for (ErpProcessDO bom : bomList) { + String mapKey = bom.getFactoryNumber() + "-" + bom.getMaterialNumber() + "-" + bom.getBlineGroup(); + existingNumbers.put(mapKey, bom.getId()); + } + erpConfig.addRedisCacheMap(key, existingNumbers); + } } \ No newline at end of file