Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
潘荣晟
2025-09-24 18:12:49 +08:00
17 changed files with 352 additions and 93 deletions

View File

@@ -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<String> submitDataToErp(@Valid @RequestBody ErpSubmitReqDTO reqDTO);
HashMap<String, String> submitDataToErp(@Valid @RequestBody ErpSubmitReqDTO reqDTO);
}

View File

@@ -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<String> submitDataToErp(ErpSubmitReqDTO reqDTO) {
public HashMap<String, String> submitDataToErp(ErpSubmitReqDTO reqDTO) {
return erpConfig.pushDataToErp(reqDTO);
}
}

View File

@@ -1,5 +1,6 @@
package com.zt.plat.module.erp.common.conf;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@@ -82,10 +83,39 @@ public class ErpConfig {
}
}
// GET请求处理
// public HashMap<String, String> getResult(SAPInterfaceResult result) {
// HashMap<String, String> 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<String> pushDataToErp(ErpSubmitReqDTO reqDTO) {
public HashMap<String, String> pushDataToErp(ErpSubmitReqDTO reqDTO) {
try {
// 构建完整URL
String url = "http://" + erpAddress + "/api/rfc/post";
@@ -115,13 +145,53 @@ public ResponseEntity<String> pushDataToErp(ErpSubmitReqDTO reqDTO) {
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
return response;
// 解析响应结果
String responseBody = response.getBody();
if (responseBody.isEmpty()) {
throw new RuntimeException("ERP接口返回结果为空");
}
JSONObject jsonResponse = JSON.parseObject(responseBody);
if (jsonResponse == null) {
throw new RuntimeException("ERP接口响应无法解析为JSON");
}
return postResult(jsonResponse);
} catch (Exception e) {
log.error("调用ERP RFC接口失败:"+e.getMessage(), e);
return ResponseEntity.status(500).body("调用ERP接口失败: " + e.getMessage());
throw new RuntimeException("调用ERP RFC接口失败: " + e);
}
}
// POST请求处理
public HashMap<String, String> postResult(JSONObject result) {
HashMap<String, String> resMap = new HashMap<>();
boolean succeed = result.getBoolean("succeed");
JSONObject data = result.getJSONObject("data");
if (data == null) {
throw new RuntimeException("SAP接口返回值为空," + result.getString("msg"));
} else if (succeed && "S".equals(data.getString("E_FLAG"))) {
String flag = "S";
String E_RESP = data.getString("E_RESP");
String E_MSG = data.getString("ET_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 flag = "E";
String E_MSG = data.getString("ET_MSG");
if (StrUtil.isBlank(E_MSG)) {
E_MSG = result.getString("msg");
}
resMap.put("resStr", E_MSG);
resMap.put("flag", flag);
return resMap;
} else {
throw new RuntimeException("SAP接口异常," + result);
}
}
//list
public Map<String, List<String>> numbers(JSONArray dataArray, String key, String dataKey) {
// 使用 Redis 获取缓存数据

View File

@@ -104,7 +104,7 @@ public class ErpAssetController {
@PostMapping("/getErpAssetTask")
@Operation(summary = "定时获得erp更新资产卡片")
@PreAuthorize("@ss.hasPermission('sply:erp-asset:create')")
public CommonResult<Boolean> getErpCompanyTask() {
public CommonResult<Boolean> getErpAssetTask() {
erpAssetService.callErpRfcInterface();
return success(true);
}

View File

@@ -40,14 +40,14 @@ public class ErpFactoryController {
@PostMapping("/create")
@Operation(summary = "创建ERP工厂")
@PreAuthorize("@ss.hasPermission('sply:erp-factory:create')")
@PreAuthorize("@ss.hasPermission('base:erp-factory:create')")
public CommonResult<ErpFactoryRespVO> createErpFactory(@Valid @RequestBody ErpFactorySaveReqVO createReqVO) {
return success(erpFactoryService.createErpFactory(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新ERP工厂")
@PreAuthorize("@ss.hasPermission('sply:erp-factory:update')")
@PreAuthorize("@ss.hasPermission('base:erp-factory:update')")
public CommonResult<Boolean> updateErpFactory(@Valid @RequestBody ErpFactorySaveReqVO updateReqVO) {
erpFactoryService.updateErpFactory(updateReqVO);
return success(true);
@@ -56,7 +56,7 @@ public class ErpFactoryController {
@DeleteMapping("/delete")
@Operation(summary = "删除ERP工厂")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('sply:erp-factory:delete')")
@PreAuthorize("@ss.hasPermission('base:erp-factory:delete')")
public CommonResult<Boolean> deleteErpFactory(@RequestParam("id") Long id) {
erpFactoryService.deleteErpFactory(id);
return success(true);
@@ -65,7 +65,7 @@ public class ErpFactoryController {
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除ERP工厂")
@PreAuthorize("@ss.hasPermission('sply:erp-factory:delete')")
@PreAuthorize("@ss.hasPermission('base:erp-factory:delete')")
public CommonResult<Boolean> deleteErpFactoryList(@RequestBody BatchDeleteReqVO req) {
erpFactoryService.deleteErpFactoryListByIds(req.getIds());
return success(true);
@@ -74,7 +74,7 @@ public class ErpFactoryController {
@GetMapping("/get")
@Operation(summary = "获得ERP工厂")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('sply:erp-factory:query')")
@PreAuthorize("@ss.hasPermission('base:erp-factory:query')")
public CommonResult<ErpFactoryRespVO> getErpFactory(@RequestParam("id") Long id) {
ErpFactoryDO erpFactory = erpFactoryService.getErpFactory(id);
return success(BeanUtils.toBean(erpFactory, ErpFactoryRespVO.class));
@@ -82,7 +82,7 @@ public class ErpFactoryController {
@GetMapping("/page")
@Operation(summary = "获得ERP工厂分页")
@PreAuthorize("@ss.hasPermission('sply:erp-factory:query')")
@PreAuthorize("@ss.hasPermission('base:erp-factory:query')")
public CommonResult<PageResult<ErpFactoryRespVO>> getErpFactoryPage(@Valid ErpFactoryPageReqVO pageReqVO) {
PageResult<ErpFactoryDO> pageResult = erpFactoryService.getErpFactoryPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ErpFactoryRespVO.class));
@@ -90,7 +90,7 @@ public class ErpFactoryController {
@GetMapping("/export-excel")
@Operation(summary = "导出ERP工厂 Excel")
@PreAuthorize("@ss.hasPermission('sply:erp-factory:export')")
@PreAuthorize("@ss.hasPermission('base:erp-factory:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportErpFactoryExcel(@Valid ErpFactoryPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
@@ -103,7 +103,7 @@ public class ErpFactoryController {
@PostMapping("/getErpFactoryTask")
@Operation(summary = "定时获得erp工厂数据")
@PreAuthorize("@ss.hasPermission('sply:erp-factory:create')")
@PreAuthorize("@ss.hasPermission('base:erp-factory:create')")
public CommonResult<Boolean> getErpFactoryTask() {
erpFactoryService.callErpRfcInterface();
return success(true);

View File

@@ -14,7 +14,7 @@ public class ErpProcessDetailPageReqVO extends PageParam {
private String processId;
@Schema(description = "工序编码")
private BigDecimal processingNumber;
private String processingNumber;
@Schema(description = "工序描述", example = "李四")
private String processingName;

View File

@@ -22,7 +22,7 @@ public class ErpProcessDetailRespVO {
@Schema(description = "工序编码", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("工序编码")
private BigDecimal processingNumber;
private String processingNumber;
@Schema(description = "工序描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
@ExcelProperty("工序描述")

View File

@@ -20,7 +20,7 @@ public class ErpProcessDetailSaveReqVO {
@Schema(description = "工序编码", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "工序编码不能为空")
private BigDecimal processingNumber;
private String processingNumber;
@Schema(description = "工序描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
@NotEmpty(message = "工序描述不能为空")

View File

@@ -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;

View File

@@ -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("物料编码")

View File

@@ -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 = "物料编码不能为空")

View File

@@ -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;
/**
* 用途

View File

@@ -39,7 +39,7 @@ public class ErpProcessDetailDO {
* 工序编码
*/
@TableField("PROC_NUM")
private BigDecimal processingNumber;
private String processingNumber;
/**
* 工序描述
*/
@@ -48,7 +48,7 @@ public class ErpProcessDetailDO {
/**
* 作业的计量单位
*/
@TableField("UOM")
@TableField("UNT")
private String uom;
/**
* 工作中心编号

View File

@@ -122,6 +122,9 @@ public class ErpBomDetailServiceImpl implements ErpBomDetailService {
Map<String, Long> existingNumbers = erpConfig.getRedisCacheMap(key);
for (ErpBomDetailDO updateReqVO : updateReqVOS) {
String mapKey = updateReqVO.getBomId() + "-" + updateReqVO.getErpBomId();
if (existingNumbers.containsKey(mapKey)) {
updateReqVO.setId(existingNumbers.get(mapKey));
}
if (updateReqVO.getId() == null) {
toInsert.add(updateReqVO);
} else {

View File

@@ -312,8 +312,8 @@ public class ErpBomServiceImpl implements ErpBomService {
items.add(item);
req.put("item", items);
reqDTO.setReq(req);
ResponseEntity<String> response = erpExternalApi.submitDataToErp(reqDTO);
if (response.getStatusCode() == HttpStatus.OK) {
HashMap<String, String> response = erpExternalApi.submitDataToErp(reqDTO);
if (response.get("result").isEmpty()) {
log.info("ERP数据提交成功");
}
}

View File

@@ -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,96 @@ public class ErpProcessDetailServiceImpl implements ErpProcessDetailService {
return erpProcessDetailMapper.selectPage(pageReqVO);
}
public void saveOrUpdateErpProcessDetail(List<ErpProcessDetailDO> updateReqVOS) {
String key = "erpMap" + OftenEnum.FuncnrEnum.工艺路线.getFuncnr() + "Detail";
// 1. 处理公司数据,区分新增和更新
ProcessingResult result = processData(updateReqVOS, key);
// 2. 批量保存数据
saveData(result);
}
private ProcessingResult processData(List<ErpProcessDetailDO> updateReqVOS, String key) {
if (erpConfig.getRedisCacheMap(key).isEmpty()) {
initializeMap(key);
}
List<ErpProcessDetailDO> toUpdate = new ArrayList<>();
List<ErpProcessDetailDO> toInsert = new ArrayList<>();
List<String> dataArrayNumbers = new ArrayList<>();
Map<String, Long> existingNumbers = erpConfig.getRedisCacheMap(key);
for (ErpProcessDetailDO updateReqVO : updateReqVOS) {
String mapKey = updateReqVO.getProcessId() + "-" + updateReqVO.getProcessingNumber()+"-"+updateReqVO.getProcessingName();
if (existingNumbers.containsKey(mapKey)) {
updateReqVO.setId(existingNumbers.get(mapKey));
}
if (updateReqVO.getId() == null) {
toInsert.add(updateReqVO);
} else {
toUpdate.add(updateReqVO);
}
dataArrayNumbers.add(mapKey);
}
Map<String, Long> deleteNumbers = new HashMap<>();
for (Map.Entry<String, Long> 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<ErpProcessDetailDO> insertedRecords = erpProcessDetailMapper.selectList(
new LambdaQueryWrapperX<ErpProcessDetailDO>()
.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()))
.in(ErpProcessDetailDO::getProcessingName, result.toInsert.stream().map(ErpProcessDetailDO::getProcessingName).distinct().collect(Collectors.toList()))
);
Map<String, Long> numberIdMap = insertedRecords.stream()
.collect(Collectors.toMap(asset -> asset.getProcessId() + "-" + asset.getProcessingNumber()+"-"+asset.getProcessingName(), ErpProcessDetailDO::getId));
erpConfig.addRedisCacheMap(result.key, numberIdMap);
}
if (!result.toUpdate.isEmpty()) {
erpProcessDetailMapper.updateBatch(result.toUpdate);
}
if (!result.deleteNumbers.isEmpty()) {
// 使用流式处理和批处理优化删除逻辑
List<Long> 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<ErpProcessDetailDO> toUpdate;
private final List<ErpProcessDetailDO> toInsert;
private final Map<String, Long> deleteNumbers;
private final String key;
public ProcessingResult(List<ErpProcessDetailDO> toUpdate, List<ErpProcessDetailDO> toInsert, Map<String, Long> deleteNumbers, String key) {
this.toUpdate = toUpdate;
this.toInsert = toInsert;
this.deleteNumbers = deleteNumbers;
this.key = key;
}
}
private void initializeMap(String key) {
List<ErpProcessDetailDO> assets = erpProcessDetailMapper.selectList(new LambdaQueryWrapperX<ErpProcessDetailDO>());
Map<String, Long> existingNumbers = new HashMap<>();
for (ErpProcessDetailDO asset : assets) {
String mapKey = asset.getProcessId() + "-" + asset.getProcessingNumber()+"-"+asset.getProcessingName();
existingNumbers.put(mapKey, asset.getId());
}
erpConfig.addRedisCacheMap(key, existingNumbers);
}
}

View File

@@ -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) {
// 插入
@@ -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<String, Object> req = new HashMap<>();
JSONArray dataArrayALL = new JSONArray();
String factKey = "erpMap" + OftenEnum.FuncnrEnum.工厂信息.getFuncnr();
Map<String, Long> redisCache = erpConfig.getRedisCacheMap(factKey);
if (CollUtil.isEmpty(redisCache)) {
throw exception(ERP_PROCESS_NOT_EXISTS);
}
// 1. 调用ERP接口获取数据
JSONArray dataArray = erpConfig.fetchDataFromERP(funcnr, null);
for (String factoryNumber : redisCache.keySet()) {
req.put("WERKS", factoryNumber);
// 1. 调用ERP接口获取数据
JSONArray dataArray = erpConfig.fetchDataFromERP(funcnr, req);
if (dataArray == null || dataArray.isEmpty()) {
return;
continue;
}
dataArrayALL.addAll(dataArray);
}
// 2. 处理公司数据,区分新增和更新
ProcessingResult result = processData(dataArray,funcnrEnum);
ProcessingResult result = processData(dataArrayALL, funcnrEnum);
// 3. 批量保存数据
saveData(result);
@@ -127,35 +150,69 @@ public class ErpProcessServiceImpl implements ErpProcessService {
/**
* 处理数据,区分新增和更新
*/
private ProcessingResult processData(JSONArray dataArray, OftenEnum.FuncnrEnum funcnr) {
String key = "erp" + funcnr.getFuncnr();
Map<String,List<String>> numbers = erpConfig.numbers(dataArray, key,funcnr.getDatakey());
List<String> allnumbers = numbers.get("all");
List<String> comnumbers = numbers.get("com");
private ProcessingResult processData(JSONArray dataArray, OftenEnum.FuncnrEnum funcnrEnum) {
String key = "erpMap" + funcnrEnum.getFuncnr();
Map<String, Long> numbers = erpConfig.getRedisCacheMap(key);
List<ErpProcessDO> toUpdate = new ArrayList<>();
List<ErpProcessDO> toInsert = new ArrayList<>();
List<ErpProcessDetailDO> erpProcessDetailDOList = new ArrayList<>();
Map<String, Long> addnumbers = new HashMap<>();
List<String> 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)) {
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 {
// 新增
toInsert.add(DO);
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()));
String processingNumber = itemJson.getString("VORNR");
if (processingNumber != null) {
processingNumber = processingNumber.replaceFirst("^0+(?!$)", "");
}
detailDO.setProcessingNumber(processingNumber);
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<String> 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 +220,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 +243,28 @@ public class ErpProcessServiceImpl implements ErpProcessService {
*/
private static class ProcessingResult {
private final List<ErpProcessDO> toUpdate;
private final List<ErpProcessDO> toInsert;
private final String key;
private final List<String> allnumbers;
private final Map<String, Long> addnumbers;
private final List<String> deleteNumbers;
private final List<ErpProcessDetailDO> erpProcessDetailDOList;
public ProcessingResult(List<ErpProcessDO> toUpdate, List<ErpProcessDO> toInsert,String key,List<String> allnumbers) {
public ProcessingResult(List<ErpProcessDO> toUpdate, String key, Map<String, Long> addnumbers,
List<String> deleteNumbers, List<ErpProcessDetailDO> 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<ErpProcessDO> bomList = erpProcessMapper.selectList(new LambdaQueryWrapperX<ErpProcessDO>());
Map<String, Long> existingNumbers = new HashMap<>();
for (ErpProcessDO bom : bomList) {
String mapKey = bom.getFactoryNumber() + "-" + bom.getMaterialNumber() + "-" + bom.getBlineGroup();
existingNumbers.put(mapKey, bom.getId());
}
erpConfig.addRedisCacheMap(key, existingNumbers);
}
}