金属元素缩写重复校验,生产订单定时任务获取

This commit is contained in:
liss
2025-11-17 00:45:26 +08:00
parent 82219fd733
commit 8faa14d227
6 changed files with 202 additions and 91 deletions

View File

@@ -36,4 +36,9 @@ public interface ElementMapper extends BaseMapperX<ElementDO> {
.eq(ElementDO::getIsEnable, 1) .eq(ElementDO::getIsEnable, 1)
.orderByDesc(ElementDO::getSort)); .orderByDesc(ElementDO::getSort));
} }
default ElementDO getElementName(String code){
return selectOne(new LambdaQueryWrapperX<ElementDO>()
.eq(ElementDO::getAbbreviation, code));
};
} }

View File

@@ -35,6 +35,8 @@ public class ElementServiceImpl implements ElementService {
public ElementRespVO createElement(ElementSaveReqVO createReqVO) { public ElementRespVO createElement(ElementSaveReqVO createReqVO) {
// 插入 // 插入
ElementDO element = BeanUtils.toBean(createReqVO, ElementDO.class); ElementDO element = BeanUtils.toBean(createReqVO, ElementDO.class);
// 校验存在
validateElementCodeExists(createReqVO.getAbbreviation());
//金属编码自动生成,格式 JSYS-00001,依次新增 //金属编码自动生成,格式 JSYS-00001,依次新增
String maxCode = elementMapper.selectMaxCode(); String maxCode = elementMapper.selectMaxCode();
if (maxCode == null) { if (maxCode == null) {
@@ -55,6 +57,8 @@ public class ElementServiceImpl implements ElementService {
public void updateElement(ElementSaveReqVO updateReqVO) { public void updateElement(ElementSaveReqVO updateReqVO) {
// 校验存在 // 校验存在
validateElementExists(updateReqVO.getId()); validateElementExists(updateReqVO.getId());
// 校验存在
validateElementCodeExists(updateReqVO.getAbbreviation());
// 更新 // 更新
ElementDO updateObj = BeanUtils.toBean(updateReqVO, ElementDO.class); ElementDO updateObj = BeanUtils.toBean(updateReqVO, ElementDO.class);
elementMapper.updateById(updateObj); elementMapper.updateById(updateObj);
@@ -69,12 +73,12 @@ public class ElementServiceImpl implements ElementService {
} }
@Override @Override
public void deleteElementListByIds(List<Long> ids) { public void deleteElementListByIds(List<Long> ids) {
// 校验存在 // 校验存在
validateElementExists(ids); validateElementExists(ids);
// 删除 // 删除
elementMapper.deleteByIds(ids); elementMapper.deleteByIds(ids);
} }
private void validateElementExists(List<Long> ids) { private void validateElementExists(List<Long> ids) {
List<ElementDO> list = elementMapper.selectByIds(ids); List<ElementDO> list = elementMapper.selectByIds(ids);
@@ -89,6 +93,13 @@ public class ElementServiceImpl implements ElementService {
} }
} }
private void validateElementCodeExists(String code) {
ElementDO elementDO = elementMapper.getElementName(code);
if (elementDO == null) {
throw exception(ELEMENT_NOT_EXISTS);
}
}
@Override @Override
public ElementDO getElement(Long id) { public ElementDO getElement(Long id) {
return elementMapper.selectById(id); return elementMapper.selectById(id);
@@ -102,7 +113,7 @@ public class ElementServiceImpl implements ElementService {
@Override @Override
public void enableElementList(List<ElementRespVO> saveReqVOS) { public void enableElementList(List<ElementRespVO> saveReqVOS) {
List<ElementDO> updateObj = BeanUtils.toBean(saveReqVOS, ElementDO.class); List<ElementDO> updateObj = BeanUtils.toBean(saveReqVOS, ElementDO.class);
List<BatchResult> count = elementMapper.updateById(updateObj); List<BatchResult> count = elementMapper.updateById(updateObj);
if (CollUtil.isEmpty(count)) { if (CollUtil.isEmpty(count)) {
throw exception(ELEMENT_NOT_EXISTS); throw exception(ELEMENT_NOT_EXISTS);
} }

View File

@@ -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.controller.admin.erp.vo.ErpCustomerPageReqVO;
import com.zt.plat.module.erp.dal.dataobject.erp.ErpCustomerDO; import com.zt.plat.module.erp.dal.dataobject.erp.ErpCustomerDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* ERP客商主数据 Mapper * ERP客商主数据 Mapper
@@ -29,4 +32,5 @@ public interface ErpCustomerMapper extends BaseMapperX<ErpCustomerDO> {
.orderByDesc(ErpCustomerDO::getId)); .orderByDesc(ErpCustomerDO::getId));
} }
void updateBatchByNumber(@Param("toUpdate") List<ErpCustomerDO> toUpdate);
} }

View File

@@ -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.pojo.PageResult;
import com.zt.plat.framework.common.util.object.BeanUtils; import com.zt.plat.framework.common.util.object.BeanUtils;
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; 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.ErpConfig;
import com.zt.plat.module.erp.utils.MyRedisConfig; import com.zt.plat.module.erp.utils.MyRedisConfig;
import com.zt.plat.module.erp.enums.OftenEnum; import com.zt.plat.module.erp.enums.OftenEnum;
@@ -113,31 +114,37 @@ public class ErpCustomerServiceImpl implements ErpCustomerService {
OftenEnum.FuncnrEnum funcnrEnum = OftenEnum.FuncnrEnum.客商信息; OftenEnum.FuncnrEnum funcnrEnum = OftenEnum.FuncnrEnum.客商信息;
String funcnr = funcnrEnum.getFuncnr(); String funcnr = funcnrEnum.getFuncnr();
String key = "erpMap" + funcnrEnum.getFuncnr(); String key = "erp" + funcnrEnum.getFuncnr();
if (myRedisConfig.getRedisCacheMap(key).isEmpty()) { if (myRedisConfig.getRedisCache(key) == null) {
initializeMap(key); 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(); JSONArray dataArrayALL = new JSONArray();
for (OftenEnum.ModeTypeEnum type : OftenEnum.ModeTypeEnum.values()) { LocalDate endDate = LocalDate.now();
req.put("mode", type.modetype); LocalDate startDate = endDate.minusYears(5);
HashMap<String, Object> dataFromERP = erpConfig.fetchDataFromERP(funcnr, req); for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
JSONArray dataArray = (JSONArray) dataFromERP.get(funcnrEnum.getDatakey()); // 构建req参数
if (dataArray == null || dataArray.isEmpty()) { Map<String, Object> req = new HashMap<>();
continue; 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()) { if (dataArrayALL.isEmpty()) {
return; return;
@@ -153,17 +160,18 @@ public class ErpCustomerServiceImpl implements ErpCustomerService {
/** /**
* 处理数据,区分新增和更新 * 处理数据,区分新增和更新
*/ */
private ProcessingResult processData(JSONArray dataArray, OftenEnum.FuncnrEnum funcnrEnum) { private ProcessingResult processData(JSONArray dataArray, OftenEnum.FuncnrEnum funcnr) {
String key = "erpMap" + funcnrEnum.getFuncnr(); String key = "erp" + funcnr.getFuncnr();
Map<String, Long> numbers = myRedisConfig.getRedisCacheMap(key); 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> toUpdate = new ArrayList<>();
List<ErpCustomerDO> toInsert = new ArrayList<>(); List<ErpCustomerDO> toInsert = new ArrayList<>();
for (int i = 0; i < dataArray.size(); i++) { for (int i = 0; i < dataArray.size(); i++) {
JSONObject dataJson = dataArray.getJSONObject(i); JSONObject dataJson = dataArray.getJSONObject(i);
if (dataJson != null) { if (dataJson != null) {
String number = dataJson.getString(funcnrEnum.getDatakey()); String number = dataJson.getString(funcnr.getDatakey());
if (number != null) { if (number != null) {
number = number.trim(); number = number.trim();
} }
@@ -185,10 +193,8 @@ public class ErpCustomerServiceImpl implements ErpCustomerService {
DO.setIsProvisional(dataJson.getString("XBLCK")); DO.setIsProvisional(dataJson.getString("XBLCK"));
DO.setTaxNumber(dataJson.getString("TAXNO")); DO.setTaxNumber(dataJson.getString("TAXNO"));
// 使用 Map 优化查找效率,避免每次遍历 comnumbers 列表 if (comnumbers.contains(number)) {
if (number != null && numbers.get(number) != null) {
// 更新 // 更新
DO.setId(numbers.get(number));
toUpdate.add(DO); toUpdate.add(DO);
} else { } 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()) { if (!result.toInsert.isEmpty()) {
erpCustomerMapper.insertBatch(result.toInsert); 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()) { 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> toUpdate;
private final List<ErpCustomerDO> toInsert; private final List<ErpCustomerDO> toInsert;
private final String key; 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.toUpdate = toUpdate;
this.toInsert = toInsert; this.toInsert = toInsert;
this.key = key; this.key = key;
this.allnumbers = allnumbers;
} }
} }
private void initializeMap(String key) { private void initialize(String key) {
Map<String, Long> existingNumbers = erpCustomerMapper.selectList(new LambdaQueryWrapperX<ErpCustomerDO>()) List<String> existingNumbers = erpCustomerMapper.selectList(new LambdaQueryWrapperX<ErpCustomerDO>())
.stream() .stream()
.collect(Collectors.toMap(ErpCustomerDO::getNumber, ErpCustomerDO::getId)); .map(ErpCustomerDO::getNumber)
myRedisConfig.addRedisCacheMap(key, existingNumbers); .collect(Collectors.toList());
myRedisConfig.updateRedisCache(key, existingNumbers);
} }
} }

View File

@@ -6,8 +6,10 @@ import com.alibaba.fastjson.JSONObject;
import com.xxl.job.core.handler.annotation.XxlJob; import com.xxl.job.core.handler.annotation.XxlJob;
import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.common.util.object.BeanUtils; 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.controller.admin.erp.vo.ErpProductiveVersionPageReqVO;
import com.zt.plat.module.erp.dal.dataobject.erp.ErpProductiveVersionDO; 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.ErpConfig;
import com.zt.plat.module.erp.utils.MyRedisConfig; import com.zt.plat.module.erp.utils.MyRedisConfig;
import com.zt.plat.module.erp.enums.OftenEnum; import com.zt.plat.module.erp.enums.OftenEnum;
@@ -28,6 +30,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; 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.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.zt.plat.module.erp.enums.ErrorCodeConstants.*; import static com.zt.plat.module.erp.enums.ErrorCodeConstants.*;
@@ -191,34 +194,55 @@ public class ErpProductiveOrderServiceImpl implements ErpProductiveOrderService
@Transactional @Transactional
@XxlJob("getErpProductiveOrderTask") @XxlJob("getErpProductiveOrderTask")
public void callErpRfcInterface() { public void callErpRfcInterface() {
OftenEnum.FuncnrEnum funcnrEnum = OftenEnum.FuncnrEnum.生产订单; OftenEnum.FuncnrEnum funcnrEnum = OftenEnum.FuncnrEnum.生产订单明细;
String funcnr = funcnrEnum.getFuncnr(); String funcnr = funcnrEnum.getFuncnr();
//防止缓存数据丢失
String key = "erpMap" + funcnrEnum.getFuncnr();
if (myRedisConfig.getRedisCacheMap(key).isEmpty()) {
initializeMap(key);
}
Map<String, Object> req = new HashMap<>(); Map<String, Object> req = new HashMap<>();
List<Map<String, String>> datumList = new ArrayList<>(); List<Map<String, String>> datumListS = new ArrayList<>();
Map<String, String> datumEntry = new HashMap<>(); Map<String, String> datumEntryS = new HashMap<>();
// 构建datum参数数组 // 构建datum参数数组
datumEntry.put("sign", "I"); datumEntryS.put("sign", "I");
datumEntry.put("option", "EQ"); datumEntryS.put("option", "EQ");
datumEntry.put("low", LocalDate.now().toString()); datumEntryS.put("low", LocalDate.now().toString());
datumList.add(datumEntry); datumListS.add(datumEntryS);
req.put(funcnrEnum.getDatekey(), datumList); 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(); JSONArray dataArrayALL = new JSONArray();
List<String> redisCache = myRedisConfig.getRedisCache(OftenEnum.FuncnrEnum.工厂信息.getFuncnr()); List<String> redisCacheF = myRedisConfig.getRedisCache(OftenEnum.FuncnrEnum.工厂信息.getFuncnr());
if (CollUtil.isEmpty(redisCache)) { 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); throw exception(ERP_FACTORY_NOT_EXISTS);
} }
// 1. 调用ERP接口获取数据 // 1. 调用ERP接口获取数据
for (String number : redisCache) { for (String numberC : redisCacheC) {
req.put("WERKS", number); for (String numberF : redisCacheF) {
// 1. 调用ERP接口获取数据 req.put("BUKRS", numberC);
HashMap<String, Object> dataFromERP = erpConfig.fetchDataFromERP(funcnr, req); req.put("WERKS", numberF);
JSONArray dataArray = (JSONArray) dataFromERP.get("E_RESP"); // 1. 调用ERP接口获取数据
if (dataArray == null || dataArray.isEmpty()) { HashMap<String, Object> dataFromERP = erpConfig.fetchDataFromERP(funcnr, req);
continue; JSONArray dataArray = (JSONArray) dataFromERP.get("E_RESP");
if (dataArray == null || dataArray.isEmpty()) {
continue;
}
dataArrayALL.addAll(dataArray);
} }
dataArrayALL.addAll(dataArray);
} }
if (dataArrayALL.isEmpty()) { if (dataArrayALL.isEmpty()) {
throw exception(ERP_PRODUCTIVE_ORDER_NOT_EXISTS); throw exception(ERP_PRODUCTIVE_ORDER_NOT_EXISTS);
} }
@@ -234,34 +258,58 @@ public class ErpProductiveOrderServiceImpl implements ErpProductiveOrderService
* 处理数据,区分新增和更新 * 处理数据,区分新增和更新
*/ */
private ProcessingResult processData(JSONArray dataArray, OftenEnum.FuncnrEnum funcnr) { private ProcessingResult processData(JSONArray dataArray, OftenEnum.FuncnrEnum funcnr) {
String key = "erp" + funcnr.getFuncnr(); String key = "erpMap" + funcnr.getFuncnr();
Map<String, List<String>> numbers = myRedisConfig.numbers(dataArray, key, funcnr.getDatakey()); Map<String, Long> numbers = myRedisConfig.getRedisCacheMap(key);
List<String> allnumbers = numbers.get("all");
List<String> comnumbers = numbers.get("com");
List<ErpProductiveOrderDO> toUpdate = new ArrayList<>(); List<ErpProductiveOrderDO> toUpdate = new ArrayList<>();
List<ErpProductiveOrderDO> toInsert = new ArrayList<>(); List<ErpProductiveOrderDO> toInsert = new ArrayList<>();
List<String> dataArrayNumbers = new ArrayList<>();
for (int i = 0; i < dataArray.size(); i++) { for (int i = 0; i < dataArray.size(); i++) {
JSONObject dataJson = dataArray.getJSONObject(i); JSONObject dataJson = dataArray.getJSONObject(i);
if (dataJson != null) { if (dataJson != null) {
String number = dataJson.getString("BUKRS").trim(); String number = dataJson.getString("AUFNR").trim();
if (number != null) { ErpProductiveOrderDO DO = new ErpProductiveOrderDO();
ErpProductiveOrderDO DO = new ErpProductiveOrderDO(); DO.setCompanyNumber(dataJson.getString("BUKRS").trim());
// DO.setName(dataJson.getString("BUTXT")); DO.setFactoryNumber(dataJson.getString("WERKS").trim());
// DO.setNumber(number); DO.setFactoryName(dataJson.getString("NAME1").trim());
// DO.setCurrency(dataJson.getString("WAERS")); DO.setOrderNumber(dataJson.getString("AUFNR").trim());
if (comnumbers.contains(number)) { if (!dataJson.getString("GLTRP").equals("0000-00-00")) {
// 更新 DO.setStartDate(LocalDateTime.parse(dataJson.getString("GLTRP") + "T00:00:00"));
toUpdate.add(DO);
} else {
// 新增
toInsert.add(DO);
}
} }
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 +319,26 @@ public class ErpProductiveOrderServiceImpl implements ErpProductiveOrderService
// 批量新增和更新 // 批量新增和更新
if (!result.toInsert.isEmpty()) { if (!result.toInsert.isEmpty()) {
erpProductiveOrderMapper.insertBatch(result.toInsert); 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()) { if (!result.toUpdate.isEmpty()) {
erpProductiveOrderMapper.updateBatch(result.toUpdate); 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 +348,24 @@ public class ErpProductiveOrderServiceImpl implements ErpProductiveOrderService
private final List<ErpProductiveOrderDO> toUpdate; private final List<ErpProductiveOrderDO> toUpdate;
private final List<ErpProductiveOrderDO> toInsert; private final List<ErpProductiveOrderDO> toInsert;
private final String key; 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.toUpdate = toUpdate;
this.toInsert = toInsert; this.toInsert = toInsert;
this.key = key; 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);
}
} }

View File

@@ -8,4 +8,22 @@
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。 代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/ 文档可见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> </mapper>