Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
@@ -125,12 +125,4 @@ public class ErpCompanyController {
|
||||
return success(TEST);
|
||||
}
|
||||
|
||||
@PostMapping("/test2")
|
||||
@Operation(summary = "获取base的金属元素")
|
||||
@PreAuthorize("@ss.hasPermission('sply:erp-company:get')")
|
||||
public CommonResult<String> test2() {
|
||||
String TEST = erpCompanyService.test2();
|
||||
return success(TEST);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -19,7 +19,7 @@ public class ErpProductiveOrderPageReqVO extends PageParam {
|
||||
private String companyNumber;
|
||||
|
||||
@Schema(description = "工厂编码")
|
||||
@NotEmpty(message = "公司编号不能为空")
|
||||
@NotEmpty(message = "工厂编码不能为空")
|
||||
private String factoryNumber;
|
||||
|
||||
@Schema(description = "工厂名称", example = "赵六")
|
||||
@@ -30,12 +30,12 @@ public class ErpProductiveOrderPageReqVO extends PageParam {
|
||||
|
||||
@Schema(description = "基本开始日期")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
@NotEmpty(message = "公司编号不能为空")
|
||||
@NotEmpty(message = "基本开始日期不能为空")
|
||||
private LocalDateTime[] startDate;
|
||||
|
||||
@Schema(description = "基本完成日期")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
@NotEmpty(message = "公司编号不能为空")
|
||||
@NotEmpty(message = "基本完成日期不能为空")
|
||||
private LocalDateTime[] endDate;
|
||||
|
||||
@Schema(description = "主产品物料编号")
|
||||
|
||||
@@ -6,6 +6,9 @@ import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpCustomerPageReqVO;
|
||||
import com.zt.plat.module.erp.dal.dataobject.erp.ErpCustomerDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* ERP客商主数据 Mapper
|
||||
@@ -29,4 +32,5 @@ public interface ErpCustomerMapper extends BaseMapperX<ErpCustomerDO> {
|
||||
.orderByDesc(ErpCustomerDO::getId));
|
||||
}
|
||||
|
||||
void updateBatchByNumber(@Param("toUpdate") List<ErpCustomerDO> toUpdate);
|
||||
}
|
||||
@@ -74,6 +74,4 @@ public interface ErpCompanyService {
|
||||
void test();
|
||||
|
||||
String test1();
|
||||
|
||||
String test2();
|
||||
}
|
||||
@@ -286,11 +286,4 @@ public class ErpCompanyServiceImpl implements ErpCompanyService {
|
||||
return url + requestEntity;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String test2() {
|
||||
ElementDTO respVO = new ElementDTO();
|
||||
CommonResult<List<ElementDTO>> dtos = baseApi.getElementNoPage();
|
||||
return dtos.toString();
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import com.xxl.job.core.handler.annotation.XxlJob;
|
||||
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.dal.dataobject.erp.ErpMaterialDO;
|
||||
import com.zt.plat.module.erp.utils.ErpConfig;
|
||||
import com.zt.plat.module.erp.utils.MyRedisConfig;
|
||||
import com.zt.plat.module.erp.enums.OftenEnum;
|
||||
@@ -113,31 +114,37 @@ public class ErpCustomerServiceImpl implements ErpCustomerService {
|
||||
OftenEnum.FuncnrEnum funcnrEnum = OftenEnum.FuncnrEnum.客商信息;
|
||||
String funcnr = funcnrEnum.getFuncnr();
|
||||
|
||||
String key = "erpMap" + funcnrEnum.getFuncnr();
|
||||
if (myRedisConfig.getRedisCacheMap(key).isEmpty()) {
|
||||
initializeMap(key);
|
||||
String key = "erp" + funcnrEnum.getFuncnr();
|
||||
if (myRedisConfig.getRedisCache(key) == null) {
|
||||
initialize(key);
|
||||
}
|
||||
// 构建req参数
|
||||
Map<String, Object> req = new HashMap<>();
|
||||
List<Map<String, String>> datumList = new ArrayList<>();
|
||||
Map<String, String> datumEntry = new HashMap<>();
|
||||
// 构建datum参数数组
|
||||
datumEntry.put("sign", "I");
|
||||
datumEntry.put("option", "EQ");
|
||||
datumEntry.put("low", LocalDate.now().toString());
|
||||
datumList.add(datumEntry);
|
||||
req.put(funcnrEnum.getDatekey(), datumList);
|
||||
|
||||
// 1. 调用ERP接口获取数据
|
||||
//循环近五年日期,
|
||||
JSONArray dataArrayALL = new JSONArray();
|
||||
for (OftenEnum.ModeTypeEnum type : OftenEnum.ModeTypeEnum.values()) {
|
||||
req.put("mode", type.modetype);
|
||||
HashMap<String, Object> dataFromERP = erpConfig.fetchDataFromERP(funcnr, req);
|
||||
JSONArray dataArray = (JSONArray) dataFromERP.get(funcnrEnum.getDatakey());
|
||||
if (dataArray == null || dataArray.isEmpty()) {
|
||||
continue;
|
||||
LocalDate endDate = LocalDate.now();
|
||||
LocalDate startDate = endDate.minusYears(5);
|
||||
for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
|
||||
// 构建req参数
|
||||
Map<String, Object> req = new HashMap<>();
|
||||
List<Map<String, String>> datumList = new ArrayList<>();
|
||||
Map<String, String> datumEntry = new HashMap<>();
|
||||
// 构建datum参数数组
|
||||
datumEntry.put("sign", "I");
|
||||
datumEntry.put("option", "EQ");
|
||||
// 把每次循环的日期,放在这里
|
||||
datumEntry.put("low", date.toString());
|
||||
datumList.add(datumEntry);
|
||||
req.put(funcnrEnum.getDatekey(), datumList);
|
||||
|
||||
// 1. 调用ERP接口获取数据
|
||||
for (OftenEnum.ModeTypeEnum type : OftenEnum.ModeTypeEnum.values()) {
|
||||
req.put("MODE", type.modetype);
|
||||
HashMap<String, Object> dataFromERP = erpConfig.fetchDataFromERP(funcnr, req);
|
||||
JSONArray dataArray = (JSONArray) dataFromERP.get(funcnrEnum.getDatakey());
|
||||
if (dataArray == null || dataArray.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
dataArrayALL.addAll(dataArray);
|
||||
}
|
||||
dataArrayALL.addAll(dataArray);
|
||||
}
|
||||
if (dataArrayALL.isEmpty()) {
|
||||
return;
|
||||
@@ -153,17 +160,18 @@ public class ErpCustomerServiceImpl implements ErpCustomerService {
|
||||
/**
|
||||
* 处理数据,区分新增和更新
|
||||
*/
|
||||
private ProcessingResult processData(JSONArray dataArray, OftenEnum.FuncnrEnum funcnrEnum) {
|
||||
String key = "erpMap" + funcnrEnum.getFuncnr();
|
||||
Map<String, Long> numbers = myRedisConfig.getRedisCacheMap(key);
|
||||
|
||||
private ProcessingResult processData(JSONArray dataArray, OftenEnum.FuncnrEnum funcnr) {
|
||||
String key = "erp" + funcnr.getFuncnr();
|
||||
Map<String, List<String>> numbers = myRedisConfig.numbers(dataArray, key, funcnr.getDatakey());
|
||||
List<String> allnumbers = numbers.get("all");
|
||||
List<String> comnumbers = numbers.get("com");
|
||||
List<ErpCustomerDO> toUpdate = new ArrayList<>();
|
||||
List<ErpCustomerDO> toInsert = new ArrayList<>();
|
||||
|
||||
for (int i = 0; i < dataArray.size(); i++) {
|
||||
JSONObject dataJson = dataArray.getJSONObject(i);
|
||||
if (dataJson != null) {
|
||||
String number = dataJson.getString(funcnrEnum.getDatakey());
|
||||
String number = dataJson.getString(funcnr.getDatakey());
|
||||
if (number != null) {
|
||||
number = number.trim();
|
||||
}
|
||||
@@ -185,10 +193,8 @@ public class ErpCustomerServiceImpl implements ErpCustomerService {
|
||||
DO.setIsProvisional(dataJson.getString("XBLCK"));
|
||||
DO.setTaxNumber(dataJson.getString("TAXNO"));
|
||||
|
||||
// 使用 Map 优化查找效率,避免每次遍历 comnumbers 列表
|
||||
if (number != null && numbers.get(number) != null) {
|
||||
if (comnumbers.contains(number)) {
|
||||
// 更新
|
||||
DO.setId(numbers.get(number));
|
||||
toUpdate.add(DO);
|
||||
} else {
|
||||
// 新增
|
||||
@@ -197,7 +203,7 @@ public class ErpCustomerServiceImpl implements ErpCustomerService {
|
||||
}
|
||||
}
|
||||
|
||||
return new ProcessingResult(toUpdate, toInsert, key);
|
||||
return new ProcessingResult(toUpdate, toInsert, key, allnumbers);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -207,21 +213,11 @@ public class ErpCustomerServiceImpl implements ErpCustomerService {
|
||||
// 批量新增和更新
|
||||
if (!result.toInsert.isEmpty()) {
|
||||
erpCustomerMapper.insertBatch(result.toInsert);
|
||||
// 批量查询刚插入数据的id,提升效率
|
||||
List<String> insertedNumbers = result.toInsert.stream()
|
||||
.map(ErpCustomerDO::getNumber)
|
||||
.collect(Collectors.toList());
|
||||
List<ErpCustomerDO> insertedRecords = erpCustomerMapper.selectList(
|
||||
new LambdaQueryWrapperX<ErpCustomerDO>()
|
||||
.in(ErpCustomerDO::getNumber, insertedNumbers)
|
||||
);
|
||||
Map<String, Long> numberIdMap = insertedRecords.stream()
|
||||
.collect(Collectors.toMap(ErpCustomerDO::getNumber, ErpCustomerDO::getId));
|
||||
myRedisConfig.addRedisCacheMap(result.key, numberIdMap);
|
||||
}
|
||||
if (!result.toUpdate.isEmpty()) {
|
||||
erpCustomerMapper.updateBatch(result.toUpdate);
|
||||
erpCustomerMapper.updateBatchByNumber(result.toUpdate);
|
||||
}
|
||||
myRedisConfig.updateRedisCache(result.key, result.allnumbers);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -231,18 +227,21 @@ public class ErpCustomerServiceImpl implements ErpCustomerService {
|
||||
private final List<ErpCustomerDO> toUpdate;
|
||||
private final List<ErpCustomerDO> toInsert;
|
||||
private final String key;
|
||||
private final List<String> allnumbers;
|
||||
|
||||
public ProcessingResult(List<ErpCustomerDO> toUpdate, List<ErpCustomerDO> toInsert, String key) {
|
||||
public ProcessingResult(List<ErpCustomerDO> toUpdate, List<ErpCustomerDO> toInsert, String key, List<String> allnumbers) {
|
||||
this.toUpdate = toUpdate;
|
||||
this.toInsert = toInsert;
|
||||
this.key = key;
|
||||
this.allnumbers = allnumbers;
|
||||
}
|
||||
}
|
||||
|
||||
private void initializeMap(String key) {
|
||||
Map<String, Long> existingNumbers = erpCustomerMapper.selectList(new LambdaQueryWrapperX<ErpCustomerDO>())
|
||||
private void initialize(String key) {
|
||||
List<String> existingNumbers = erpCustomerMapper.selectList(new LambdaQueryWrapperX<ErpCustomerDO>())
|
||||
.stream()
|
||||
.collect(Collectors.toMap(ErpCustomerDO::getNumber, ErpCustomerDO::getId));
|
||||
myRedisConfig.addRedisCacheMap(key, existingNumbers);
|
||||
.map(ErpCustomerDO::getNumber)
|
||||
.collect(Collectors.toList());
|
||||
myRedisConfig.updateRedisCache(key, existingNumbers);
|
||||
}
|
||||
}
|
||||
@@ -6,8 +6,10 @@ import com.alibaba.fastjson.JSONObject;
|
||||
import com.xxl.job.core.handler.annotation.XxlJob;
|
||||
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.controller.admin.erp.vo.ErpProductiveVersionPageReqVO;
|
||||
import com.zt.plat.module.erp.dal.dataobject.erp.ErpProductiveVersionDO;
|
||||
import com.zt.plat.module.erp.dal.dataobject.erp.ErpPurchaseOrganizationDO;
|
||||
import com.zt.plat.module.erp.utils.ErpConfig;
|
||||
import com.zt.plat.module.erp.utils.MyRedisConfig;
|
||||
import com.zt.plat.module.erp.enums.OftenEnum;
|
||||
@@ -28,6 +30,7 @@ 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.*;
|
||||
@@ -102,123 +105,158 @@ public class ErpProductiveOrderServiceImpl implements ErpProductiveOrderService
|
||||
return erpProductiveOrderMapper.selectById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<ErpProductiveOrderDO> getErpProductiveOrderPage(ErpProductiveOrderPageReqVO pageReqVO) {
|
||||
return erpProductiveOrderMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
//直接从erp查询生产订单
|
||||
// @Override
|
||||
// public PageResult<ErpProductiveOrderDO> getErpProductiveOrderPage(ErpProductiveOrderPageReqVO pageReqVO) {
|
||||
// OftenEnum.FuncnrEnum funcnrEnum = OftenEnum.FuncnrEnum.生产订单;
|
||||
// String funcnr = funcnrEnum.getFuncnr();
|
||||
// Map<String, Object> req = new HashMap<>();
|
||||
//
|
||||
// // 构建查询参数
|
||||
// req.put("BUKRS", pageReqVO.getCompanyNumber());
|
||||
// req.put("WERKS", pageReqVO.getFactoryNumber());
|
||||
//
|
||||
// // 处理日期参数
|
||||
// if (pageReqVO.getStartDate() != null) {
|
||||
// req.put("BEGDA", pageReqVO.getStartDate()[0].format(DateTimeFormatter.ofPattern("yyyyMMdd")));
|
||||
// }
|
||||
// if (pageReqVO.getEndDate() != null) {
|
||||
// req.put("ENDDA", pageReqVO.getEndDate()[0].format(DateTimeFormatter.ofPattern("yyyyMMdd")));
|
||||
// }
|
||||
//
|
||||
// // 调用ERP接口获取数据
|
||||
// HashMap<String, Object> dataFromERP = erpConfig.fetchDataFromERP(funcnr, req);
|
||||
// JSONArray dataArray = (JSONArray) dataFromERP.get("E_RESP");
|
||||
// if (dataArray == null || dataArray.isEmpty()) {
|
||||
// // 返回空结果而不是抛出异常
|
||||
// return new PageResult<>(new ArrayList<>(), 0L);
|
||||
// }
|
||||
//
|
||||
// List<ErpProductiveOrderDO> list = new ArrayList<>();
|
||||
// for (int i = 0; i < dataArray.size(); i++) {
|
||||
// JSONObject dataJson = dataArray.getJSONObject(i);
|
||||
// if (dataJson != null) {
|
||||
// ErpProductiveOrderDO orderDO = new ErpProductiveOrderDO();
|
||||
//
|
||||
// // 基本信息
|
||||
// orderDO.setCompanyNumber(dataJson.getString("BUKRS"));
|
||||
// orderDO.setFactoryNumber(dataJson.getString("WERKS").trim());
|
||||
// orderDO.setFactoryName(dataJson.getString("NAME1"));
|
||||
// orderDO.setOrderNumber(dataJson.getString("AUFNR"));
|
||||
//
|
||||
// // 日期处理
|
||||
// String plannedStartDate = dataJson.getString("GLTRP");
|
||||
// String actualStartDate = dataJson.getString("GSTRP");
|
||||
//
|
||||
// if (plannedStartDate != null && !plannedStartDate.equals("0000-00-00")) {
|
||||
// try {
|
||||
// orderDO.setStartDate(LocalDateTime.parse(plannedStartDate));
|
||||
// } catch (Exception e) {
|
||||
// // 忽略日期解析错误
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// if (actualStartDate != null && !actualStartDate.equals("0000-00-00")) {
|
||||
// try {
|
||||
// orderDO.setEndDate(LocalDateTime.parse(actualStartDate));
|
||||
// } catch (Exception e) {
|
||||
// // 忽略日期解析错误
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // 物料和工艺信息
|
||||
// orderDO.setMainMaterialNumber(dataJson.getString("STLBEZ"));
|
||||
// orderDO.setUnit(dataJson.getString("GMEIN"));
|
||||
// orderDO.setMaterialDescription(dataJson.getString("MAKTX"));
|
||||
// orderDO.setProcessingList(dataJson.getString("L_AFVC"));
|
||||
// orderDO.setProcessingNumber(dataJson.getString("VORNR"));
|
||||
// orderDO.setProcessingDescription(dataJson.getString("LTXA1"));
|
||||
// orderDO.setObjectNumber(dataJson.getString("OBJID"));
|
||||
// orderDO.setWorkCenterNumber(dataJson.getString("ARBPL"));
|
||||
// orderDO.setWorkCenterDescription(dataJson.getString("KTEXT"));
|
||||
// orderDO.setCostcenterNumber(dataJson.getString("KOSTL"));
|
||||
// orderDO.setCostcenterName(dataJson.getString("TEXT_C"));
|
||||
//
|
||||
// list.add(orderDO);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // 返回分页结果
|
||||
// return new PageResult<>(list, (long) list.size());
|
||||
// return erpProductiveOrderMapper.selectPage(pageReqVO);
|
||||
// }
|
||||
|
||||
// 直接从erp查询生产订单
|
||||
@Override
|
||||
public PageResult<ErpProductiveOrderDO> getErpProductiveOrderPage(ErpProductiveOrderPageReqVO pageReqVO) {
|
||||
OftenEnum.FuncnrEnum funcnrEnum = OftenEnum.FuncnrEnum.生产订单明细;
|
||||
String funcnr = funcnrEnum.getFuncnr();
|
||||
Map<String, Object> req = new HashMap<>();
|
||||
|
||||
// 构建查询参数
|
||||
req.put("BUKRS", pageReqVO.getCompanyNumber());
|
||||
req.put("WERKS", pageReqVO.getFactoryNumber());
|
||||
|
||||
// 处理日期参数
|
||||
if (pageReqVO.getStartDate() != null) {
|
||||
req.put("BEGDA", pageReqVO.getStartDate()[0].format(DateTimeFormatter.ofPattern("yyyyMMdd")));
|
||||
}
|
||||
if (pageReqVO.getEndDate() != null) {
|
||||
req.put("ENDDA", pageReqVO.getEndDate()[0].format(DateTimeFormatter.ofPattern("yyyyMMdd")));
|
||||
}
|
||||
|
||||
// 调用ERP接口获取数据
|
||||
HashMap<String, Object> dataFromERP = erpConfig.fetchDataFromERP(funcnr, req);
|
||||
JSONArray dataArray = (JSONArray) dataFromERP.get("E_RESP");
|
||||
if (dataArray == null || dataArray.isEmpty()) {
|
||||
// 返回空结果而不是抛出异常
|
||||
return new PageResult<>(new ArrayList<>(), 0L);
|
||||
}
|
||||
|
||||
List<ErpProductiveOrderDO> list = new ArrayList<>();
|
||||
for (int i = 0; i < dataArray.size(); i++) {
|
||||
JSONObject dataJson = dataArray.getJSONObject(i);
|
||||
if (dataJson != null) {
|
||||
ErpProductiveOrderDO orderDO = new ErpProductiveOrderDO();
|
||||
|
||||
// 基本信息
|
||||
orderDO.setCompanyNumber(dataJson.getString("BUKRS"));
|
||||
orderDO.setFactoryNumber(dataJson.getString("WERKS").trim());
|
||||
orderDO.setFactoryName(dataJson.getString("NAME1"));
|
||||
orderDO.setOrderNumber(dataJson.getString("AUFNR"));
|
||||
|
||||
// 日期处理
|
||||
String plannedStartDate = dataJson.getString("GLTRP");
|
||||
String actualStartDate = dataJson.getString("GSTRP");
|
||||
|
||||
if (plannedStartDate != null && !plannedStartDate.equals("0000-00-00")) {
|
||||
try {
|
||||
orderDO.setStartDate(LocalDateTime.parse(plannedStartDate));
|
||||
} catch (Exception e) {
|
||||
// 忽略日期解析错误
|
||||
}
|
||||
}
|
||||
|
||||
if (actualStartDate != null && !actualStartDate.equals("0000-00-00")) {
|
||||
try {
|
||||
orderDO.setEndDate(LocalDateTime.parse(actualStartDate));
|
||||
} catch (Exception e) {
|
||||
// 忽略日期解析错误
|
||||
}
|
||||
}
|
||||
|
||||
// 物料和工艺信息
|
||||
orderDO.setMainMaterialNumber(dataJson.getString("STLBEZ"));
|
||||
orderDO.setUnit(dataJson.getString("GMEIN"));
|
||||
orderDO.setMaterialDescription(dataJson.getString("MAKTX"));
|
||||
orderDO.setProcessingList(dataJson.getString("L_AFVC"));
|
||||
orderDO.setProcessingNumber(dataJson.getString("VORNR"));
|
||||
orderDO.setProcessingDescription(dataJson.getString("LTXA1"));
|
||||
orderDO.setObjectNumber(dataJson.getString("OBJID"));
|
||||
orderDO.setWorkCenterNumber(dataJson.getString("ARBPL"));
|
||||
orderDO.setWorkCenterDescription(dataJson.getString("KTEXT"));
|
||||
orderDO.setCostcenterNumber(dataJson.getString("KOSTL"));
|
||||
orderDO.setCostcenterName(dataJson.getString("TEXT_C"));
|
||||
|
||||
list.add(orderDO);
|
||||
}
|
||||
}
|
||||
|
||||
List<ErpProductiveOrderDO> listLast = list.stream()
|
||||
.filter(orderDO -> pageReqVO.getFactoryName() == null || pageReqVO.getFactoryName().equals(orderDO.getFactoryName()))
|
||||
.filter(orderDO -> pageReqVO.getOrderNumber() == null || pageReqVO.getOrderNumber().equals(orderDO.getOrderNumber()))
|
||||
.filter(orderDO -> pageReqVO.getMainMaterialNumber() == null || pageReqVO.getMainMaterialNumber().equals(orderDO.getMainMaterialNumber()))
|
||||
.filter(orderDO -> pageReqVO.getProcessingList() == null || pageReqVO.getProcessingList().equals(orderDO.getProcessingList()))
|
||||
.filter(orderDO -> pageReqVO.getProcessingNumber() == null || pageReqVO.getProcessingNumber().equals(orderDO.getProcessingNumber()))
|
||||
.filter(orderDO -> pageReqVO.getProcessingDescription() == null || pageReqVO.getProcessingDescription().equals(orderDO.getProcessingDescription()))
|
||||
.filter(orderDO -> pageReqVO.getObjectNumber() == null || pageReqVO.getObjectNumber().equals(orderDO.getObjectNumber()))
|
||||
.filter(orderDO -> pageReqVO.getWorkCenterNumber() == null || pageReqVO.getWorkCenterNumber().equals(orderDO.getWorkCenterNumber()))
|
||||
.filter(orderDO -> pageReqVO.getWorkCenterDescription() == null || pageReqVO.getWorkCenterDescription().equals(orderDO.getWorkCenterDescription()))
|
||||
.filter(orderDO -> pageReqVO.getCostcenterNumber() == null || pageReqVO.getCostcenterNumber().equals(orderDO.getCostcenterNumber()))
|
||||
.filter(orderDO -> pageReqVO.getCostcenterName() == null || pageReqVO.getCostcenterName().equals(orderDO.getCostcenterName()))
|
||||
.toList();
|
||||
|
||||
// 返回分页结果
|
||||
return new PageResult<>(listLast, (long) listLast.size());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@XxlJob("getErpProductiveOrderTask")
|
||||
// @XxlJob("getErpProductiveOrderTask")
|
||||
public void callErpRfcInterface() {
|
||||
OftenEnum.FuncnrEnum funcnrEnum = OftenEnum.FuncnrEnum.生产订单;
|
||||
OftenEnum.FuncnrEnum funcnrEnum = OftenEnum.FuncnrEnum.生产订单明细;
|
||||
String funcnr = funcnrEnum.getFuncnr();
|
||||
|
||||
//防止缓存数据丢失
|
||||
String key = "erpMap" + funcnrEnum.getFuncnr();
|
||||
if (myRedisConfig.getRedisCacheMap(key).isEmpty()) {
|
||||
initializeMap(key);
|
||||
}
|
||||
Map<String, Object> req = new HashMap<>();
|
||||
List<Map<String, String>> datumList = new ArrayList<>();
|
||||
Map<String, String> datumEntry = new HashMap<>();
|
||||
List<Map<String, String>> datumListS = new ArrayList<>();
|
||||
Map<String, String> datumEntryS = new HashMap<>();
|
||||
// 构建datum参数数组
|
||||
datumEntry.put("sign", "I");
|
||||
datumEntry.put("option", "EQ");
|
||||
datumEntry.put("low", LocalDate.now().toString());
|
||||
datumList.add(datumEntry);
|
||||
req.put(funcnrEnum.getDatekey(), datumList);
|
||||
datumEntryS.put("sign", "I");
|
||||
datumEntryS.put("option", "EQ");
|
||||
datumEntryS.put("low", LocalDate.now().toString());
|
||||
datumListS.add(datumEntryS);
|
||||
req.put("BEGDA", datumListS);
|
||||
List<Map<String, String>> datumListE = new ArrayList<>();
|
||||
Map<String, String> datumEntryE = new HashMap<>();
|
||||
// 构建datum参数数组
|
||||
datumEntryE.put("sign", "I");
|
||||
datumEntryE.put("option", "EQ");
|
||||
datumEntryE.put("low", LocalDate.now().toString());
|
||||
datumListE.add(datumEntryE);
|
||||
req.put("ENDDA", datumListE);
|
||||
JSONArray dataArrayALL = new JSONArray();
|
||||
List<String> redisCache = myRedisConfig.getRedisCache(OftenEnum.FuncnrEnum.工厂信息.getFuncnr());
|
||||
if (CollUtil.isEmpty(redisCache)) {
|
||||
List<String> redisCacheF = myRedisConfig.getRedisCache(OftenEnum.FuncnrEnum.工厂信息.getFuncnr());
|
||||
if (CollUtil.isEmpty(redisCacheF)) {
|
||||
throw exception(ERP_FACTORY_NOT_EXISTS);
|
||||
}
|
||||
List<String> redisCacheC = myRedisConfig.getRedisCache(OftenEnum.FuncnrEnum.公司代码.getFuncnr());
|
||||
if (CollUtil.isEmpty(redisCacheC)) {
|
||||
throw exception(ERP_FACTORY_NOT_EXISTS);
|
||||
}
|
||||
// 1. 调用ERP接口获取数据
|
||||
for (String number : redisCache) {
|
||||
req.put("WERKS", number);
|
||||
// 1. 调用ERP接口获取数据
|
||||
HashMap<String, Object> dataFromERP = erpConfig.fetchDataFromERP(funcnr, req);
|
||||
JSONArray dataArray = (JSONArray) dataFromERP.get("E_RESP");
|
||||
if (dataArray == null || dataArray.isEmpty()) {
|
||||
continue;
|
||||
for (String numberC : redisCacheC) {
|
||||
for (String numberF : redisCacheF) {
|
||||
req.put("BUKRS", numberC);
|
||||
req.put("WERKS", numberF);
|
||||
// 1. 调用ERP接口获取数据
|
||||
HashMap<String, Object> dataFromERP = erpConfig.fetchDataFromERP(funcnr, req);
|
||||
JSONArray dataArray = (JSONArray) dataFromERP.get("E_RESP");
|
||||
if (dataArray == null || dataArray.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
dataArrayALL.addAll(dataArray);
|
||||
}
|
||||
dataArrayALL.addAll(dataArray);
|
||||
}
|
||||
|
||||
if (dataArrayALL.isEmpty()) {
|
||||
throw exception(ERP_PRODUCTIVE_ORDER_NOT_EXISTS);
|
||||
}
|
||||
@@ -234,34 +272,58 @@ public class ErpProductiveOrderServiceImpl implements ErpProductiveOrderService
|
||||
* 处理数据,区分新增和更新
|
||||
*/
|
||||
private ProcessingResult processData(JSONArray dataArray, OftenEnum.FuncnrEnum funcnr) {
|
||||
String key = "erp" + funcnr.getFuncnr();
|
||||
Map<String, List<String>> numbers = myRedisConfig.numbers(dataArray, key, funcnr.getDatakey());
|
||||
List<String> allnumbers = numbers.get("all");
|
||||
List<String> comnumbers = numbers.get("com");
|
||||
String key = "erpMap" + funcnr.getFuncnr();
|
||||
Map<String, Long> numbers = myRedisConfig.getRedisCacheMap(key);
|
||||
List<ErpProductiveOrderDO> toUpdate = new ArrayList<>();
|
||||
List<ErpProductiveOrderDO> toInsert = new ArrayList<>();
|
||||
|
||||
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) {
|
||||
ErpProductiveOrderDO DO = new ErpProductiveOrderDO();
|
||||
// DO.setName(dataJson.getString("BUTXT"));
|
||||
// DO.setNumber(number);
|
||||
// DO.setCurrency(dataJson.getString("WAERS"));
|
||||
if (comnumbers.contains(number)) {
|
||||
// 更新
|
||||
toUpdate.add(DO);
|
||||
} else {
|
||||
// 新增
|
||||
toInsert.add(DO);
|
||||
}
|
||||
String number = dataJson.getString("AUFNR").trim();
|
||||
ErpProductiveOrderDO DO = new ErpProductiveOrderDO();
|
||||
DO.setCompanyNumber(dataJson.getString("BUKRS").trim());
|
||||
DO.setFactoryNumber(dataJson.getString("WERKS").trim());
|
||||
DO.setFactoryName(dataJson.getString("NAME1").trim());
|
||||
DO.setOrderNumber(dataJson.getString("AUFNR").trim());
|
||||
if (!dataJson.getString("GLTRP").equals("0000-00-00")) {
|
||||
DO.setStartDate(LocalDateTime.parse(dataJson.getString("GLTRP") + "T00:00:00"));
|
||||
}
|
||||
if (!dataJson.getString("GSTRP").equals("0000-00-00")) {
|
||||
DO.setEndDate(LocalDateTime.parse(dataJson.getString("GSTRP") + "T00:00:00"));
|
||||
}
|
||||
DO.setMainMaterialNumber(dataJson.getString("STLBEZ").trim());
|
||||
DO.setUnit(dataJson.getString("GMEIN").trim());
|
||||
DO.setMaterialDescription(dataJson.getString("MAKTX").trim());
|
||||
DO.setProcessingList(dataJson.getString("L_AFVC").trim());
|
||||
DO.setProcessingNumber(dataJson.getString("VORNR").trim());
|
||||
DO.setProcessingDescription(dataJson.getString("LTXA1").trim());
|
||||
DO.setObjectNumber(dataJson.getString("OBJID").trim());
|
||||
DO.setWorkCenterNumber(dataJson.getString("ARBPL").trim());
|
||||
DO.setWorkCenterDescription(dataJson.getString("KTEXT").trim());
|
||||
DO.setCostcenterNumber(dataJson.getString("KOSTL").trim());
|
||||
DO.setCostcenterName(dataJson.getString("TEXT_C").trim());
|
||||
if (numbers.get(number) != null) {
|
||||
// 更新
|
||||
DO.setId(numbers.get(number));
|
||||
toUpdate.add(DO);
|
||||
} else {
|
||||
// 新增
|
||||
toInsert.add(DO);
|
||||
}
|
||||
dataArrayNumbers.add(number);
|
||||
}
|
||||
}
|
||||
// 过滤出numbers中有,但dataArray中KOSTL没有的记录,即为需要删除的数据
|
||||
List<String> deleteNumbers = new ArrayList<>();
|
||||
for (String number : numbers.keySet()) {
|
||||
if (!dataArrayNumbers.contains(number)) {
|
||||
deleteNumbers.add(number);
|
||||
}
|
||||
}
|
||||
|
||||
return new ProcessingResult(toUpdate, toInsert, key, allnumbers);
|
||||
return new ProcessingResult(toUpdate, toInsert, key, deleteNumbers);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -271,11 +333,26 @@ public class ErpProductiveOrderServiceImpl implements ErpProductiveOrderService
|
||||
// 批量新增和更新
|
||||
if (!result.toInsert.isEmpty()) {
|
||||
erpProductiveOrderMapper.insertBatch(result.toInsert);
|
||||
// 批量查询刚插入数据的id,提升效率
|
||||
List<String> insertedNumbers = result.toInsert.stream()
|
||||
.map(ErpProductiveOrderDO::getOrderNumber)
|
||||
.collect(Collectors.toList());
|
||||
List<ErpProductiveOrderDO> insertedRecords = erpProductiveOrderMapper.selectList(
|
||||
new LambdaQueryWrapperX<ErpProductiveOrderDO>()
|
||||
.in(ErpProductiveOrderDO::getOrderNumber, insertedNumbers)
|
||||
);
|
||||
Map<String, Long> numberIdMap = insertedRecords.stream()
|
||||
.collect(Collectors.toMap(ErpProductiveOrderDO::getOrderNumber, ErpProductiveOrderDO::getId));
|
||||
myRedisConfig.addRedisCacheMap(result.key, numberIdMap);
|
||||
}
|
||||
if (!result.toUpdate.isEmpty()) {
|
||||
erpProductiveOrderMapper.updateBatch(result.toUpdate);
|
||||
}
|
||||
myRedisConfig.updateRedisCache(result.key, result.allnumbers);
|
||||
if (!result.deleteNumbers.isEmpty()) {
|
||||
// 使用 in 条件批量删除,提高删除效率
|
||||
erpProductiveOrderMapper.delete(new LambdaQueryWrapperX<ErpProductiveOrderDO>().in(ErpProductiveOrderDO::getOrderNumber, result.deleteNumbers));
|
||||
myRedisConfig.deleteRedisCacheMap(result.key, result.deleteNumbers);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -285,13 +362,24 @@ public class ErpProductiveOrderServiceImpl implements ErpProductiveOrderService
|
||||
private final List<ErpProductiveOrderDO> toUpdate;
|
||||
private final List<ErpProductiveOrderDO> toInsert;
|
||||
private final String key;
|
||||
private final List<String> allnumbers;
|
||||
private final List<String> deleteNumbers;
|
||||
|
||||
public ProcessingResult(List<ErpProductiveOrderDO> toUpdate, List<ErpProductiveOrderDO> toInsert, String key, List<String> allnumbers) {
|
||||
public ProcessingResult(List<ErpProductiveOrderDO> toUpdate, List<ErpProductiveOrderDO> toInsert, String key, List<String> deleteNumbers) {
|
||||
this.toUpdate = toUpdate;
|
||||
this.toInsert = toInsert;
|
||||
this.key = key;
|
||||
this.allnumbers = allnumbers;
|
||||
this.deleteNumbers = deleteNumbers;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void initializeMap(String key) {
|
||||
List<ErpProductiveOrderDO> assets = erpProductiveOrderMapper.selectList(new LambdaQueryWrapperX<ErpProductiveOrderDO>());
|
||||
Map<String, Long> existingNumbers = new HashMap<>();
|
||||
for (ErpProductiveOrderDO asset : assets) {
|
||||
String mapKey = asset.getOrderNumber();
|
||||
existingNumbers.put(mapKey, asset.getId());
|
||||
}
|
||||
myRedisConfig.addRedisCacheMap(key, existingNumbers);
|
||||
}
|
||||
}
|
||||
@@ -8,4 +8,22 @@
|
||||
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
|
||||
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
|
||||
-->
|
||||
<update id="updateBatchByNumber">
|
||||
<foreach collection="toUpdate" item="item" separator=";" open="BEGIN" close=";END;">
|
||||
UPDATE sply_erp_cstm
|
||||
<set>
|
||||
<if test="item.number != null">NUM = #{item.number},</if>
|
||||
<if test="item.name != null">NAME = #{item.name},</if>
|
||||
<if test="item.accountGroup != null">ACCT_GRP = #{item.accountGroup},</if>
|
||||
<if test="item.description != null">DSP = #{item.description},</if>
|
||||
<if test="item.centerNumber != null">CTR_NUM = #{item.centerNumber},</if>
|
||||
<if test="item.createDate != null">CRT_DT = #{item.createDate},</if>
|
||||
<if test="item.repairDate != null">RPR_DT = #{item.repairDate},</if>
|
||||
<if test="item.isGiveback != null">IS_GIV = #{item.isGiveback},</if>
|
||||
<if test="item.isProvisional != null">IS_PRVS = #{item.isProvisional},</if>
|
||||
<if test="item.taxNumber != null">TAX_NUM = #{item.taxNumber},</if>
|
||||
</set>
|
||||
WHERE NUM = #{item.downCenterNumber}
|
||||
</foreach>
|
||||
</update>
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user