refactor(inspection): 优化入库检验任务检查项提交逻辑
- 提取当前用户和时间,统一设置记录创建信息 - 批量保存和更新检验项,提升数据库操作效率 - 批量保存和更新样本数据,避免重复调用单条保存 - 使用集合分别存储新增和更新的数据,简化数据处理流程 refactor(material-sync): 优化物料同步逻辑和查询性能 - 过滤物料类别编码为空的记录并去重物料列表 - 分批查询数据库,避免SQL语句中IN子句过长 - 批量处理新增和更新的物料数据,提升同步效率 - 详细记录新增和更新的物料数量日志信息 - 优化异常处理,返回包含异常信息的失败结果
This commit is contained in:
parent
7b95137a81
commit
b41fbee362
|
|
@ -21,6 +21,7 @@ import org.springframework.stereotype.Component;
|
|||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
|
@ -769,7 +770,13 @@ public class IncomingInspectionTaskControllerService {
|
|||
return samplingPlanInspection.getCodeLetterId();
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void submitCheckItem(QmsIncomingInspectionTaskTodoCheckSubmitQO request) {
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
Long userId = UserUtil.getUserId();
|
||||
String userName = UserUtil.getUserName();
|
||||
|
||||
// 1. 保存/更新检验记录
|
||||
QmsIncomingInspectionTaskRecord record = new QmsIncomingInspectionTaskRecord()
|
||||
.setId(request.getId())
|
||||
.setTaskId(request.getTaskId())
|
||||
|
|
@ -778,35 +785,70 @@ public class IncomingInspectionTaskControllerService {
|
|||
.setUnqualifiedQty(request.getUnqualifiedQty())
|
||||
.setInspectionQty(request.getInspectionQty())
|
||||
.setQualified(Objects.equals(request.getQualifiedQty(), request.getInspectionQty()))
|
||||
.setCreateUserId(UserUtil.getUserId())
|
||||
.setCreateUserName(UserUtil.getUserName())
|
||||
.setCreateTime(LocalDateTime.now());
|
||||
.setCreateUserId(userId)
|
||||
.setCreateUserName(userName)
|
||||
.setCreateTime(now);
|
||||
incomingInspectionTaskRecordService.saveOrUpdate(record);
|
||||
request.getItems().forEach(item -> {
|
||||
|
||||
// 2. 收集所有检验项实体,区分新增和更新
|
||||
List<QmsIncomingInspectionTaskRecordItem> allItemEntities = new ArrayList<>();
|
||||
List<QmsIncomingInspectionTaskRecordItem> insertItems = new ArrayList<>();
|
||||
List<QmsIncomingInspectionTaskRecordItem> updateItems = new ArrayList<>();
|
||||
|
||||
for (QmsIncomingInspectionTaskTodoCheckSubmitItemQO item : request.getItems()) {
|
||||
QmsIncomingInspectionTaskRecordItem ditem = new QmsIncomingInspectionTaskRecordItem()
|
||||
.setId(item.getId())
|
||||
.setRecordId(record.getId())
|
||||
.setRemark(item.getRemark())
|
||||
.setInspectionStandardItemContentId(item.getInspectionStandardItemContentId());
|
||||
incomingInspectionTaskRecordItemService.saveOrUpdate(ditem);
|
||||
item.getDatas().forEach(data -> {
|
||||
allItemEntities.add(ditem);
|
||||
if (item.getId() == null) {
|
||||
insertItems.add(ditem);
|
||||
} else {
|
||||
updateItems.add(ditem);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 批量保存/更新检验项
|
||||
if (!insertItems.isEmpty()) {
|
||||
incomingInspectionTaskRecordItemService.saveBatch(insertItems);
|
||||
}
|
||||
if (!updateItems.isEmpty()) {
|
||||
incomingInspectionTaskRecordItemService.updateBatchById(updateItems);
|
||||
}
|
||||
|
||||
// 4. 收集所有样本数据实体,区分新增和更新
|
||||
List<QmsIncomingInspectionTaskRecordItemData> insertDatas = new ArrayList<>();
|
||||
List<QmsIncomingInspectionTaskRecordItemData> updateDatas = new ArrayList<>();
|
||||
|
||||
List<QmsIncomingInspectionTaskTodoCheckSubmitItemQO> itemQOs = request.getItems();
|
||||
for (int i = 0; i < itemQOs.size(); i++) {
|
||||
QmsIncomingInspectionTaskRecordItem ditem = allItemEntities.get(i);
|
||||
for (QmsIncomingInspectionTaskTodoCheckSubmitItemDataQO data : itemQOs.get(i).getDatas()) {
|
||||
String imageIds = CollectionUtil.isEmpty(data.getImages()) ? null
|
||||
: StrUtil.join(",", data.getImages().stream().map(FileUploadVO::getId).toList());
|
||||
QmsIncomingInspectionTaskRecordItemData ddata = new QmsIncomingInspectionTaskRecordItemData()
|
||||
.setId(data.getId())
|
||||
.setTaskId(record.getTaskId())
|
||||
.setItemId(ditem.getId())
|
||||
.setQualified(data.getQualified())
|
||||
.setMeasuredValue(data.getMeasuredValue())
|
||||
.setImages(
|
||||
StrUtil.join(",",
|
||||
data.getImages()
|
||||
.stream()
|
||||
.map(FileUploadVO::getId)
|
||||
.toList()
|
||||
)
|
||||
);
|
||||
incomingInspectionTaskRecordItemDataService.saveOrUpdate(ddata);
|
||||
});
|
||||
});
|
||||
.setImages(imageIds);
|
||||
if (data.getId() == null) {
|
||||
insertDatas.add(ddata);
|
||||
} else {
|
||||
updateDatas.add(ddata);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 5. 批量保存/更新样本数据
|
||||
if (!insertDatas.isEmpty()) {
|
||||
incomingInspectionTaskRecordItemDataService.saveBatch(insertDatas);
|
||||
}
|
||||
if (!updateDatas.isEmpty()) {
|
||||
incomingInspectionTaskRecordItemDataService.updateBatchById(updateDatas);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.nflg.wms.scheduled.processor;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.nflg.wms.common.pojo.dto.MaterialMainListByDateDTO;
|
||||
|
|
@ -17,8 +18,11 @@ import tech.powerjob.worker.log.OmsLogger;
|
|||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 从主物料同步物料到QMS
|
||||
|
|
@ -44,16 +48,16 @@ public class QCMaterialSyncProcessor implements BasicProcessor {
|
|||
|
||||
// 从主物料系统查询指定日期范围的物料列表
|
||||
List<MaterialMainListByDateDTO> materials = bomMaterialService.getListByDate(startDateTime, endDateTime);
|
||||
|
||||
if (CollectionUtil.isEmpty(materials)) {
|
||||
log.info("没有需要同步的物料");
|
||||
} else {
|
||||
return new ProcessResult(true);
|
||||
}
|
||||
|
||||
Long userId = UserUtil.getUserId();
|
||||
String operator = UserUtil.getUserName();
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
|
||||
// 过滤掉物料类别编码为空的记录
|
||||
// 过滤掉物料类别编码为空的记录,并按 materialNo 去重
|
||||
List<MaterialMainListByDateDTO> validMaterials = materials.stream()
|
||||
.filter(dto -> {
|
||||
if (StrUtil.isBlank(dto.getMaterialCategoryCode())) {
|
||||
|
|
@ -62,24 +66,27 @@ public class QCMaterialSyncProcessor implements BasicProcessor {
|
|||
}
|
||||
return true;
|
||||
})
|
||||
.collect(java.util.stream.Collectors.toList());
|
||||
.collect(Collectors.toMap(
|
||||
MaterialMainListByDateDTO::getMaterialNo,
|
||||
dto -> dto,
|
||||
(existing, replacement) -> existing))
|
||||
.values()
|
||||
.stream()
|
||||
.toList();
|
||||
|
||||
if (CollectionUtil.isEmpty(validMaterials)) {
|
||||
log.info("没有需要同步的物料");
|
||||
} else {
|
||||
return new ProcessResult(true);
|
||||
}
|
||||
|
||||
// 批量查询已存在的物料,构建 materialNo -> QmsQcMaterial 映射
|
||||
// 批量查询已存在的物料,构建 materialNo -> QmsQcMaterial 映射(分批查询避免 IN 子句过长)
|
||||
List<String> materialNos = validMaterials.stream()
|
||||
.map(MaterialMainListByDateDTO::getMaterialNo)
|
||||
.collect(java.util.stream.Collectors.toList());
|
||||
Map<String, QmsQcMaterial> existMaterialMap = qcMaterialService.lambdaQuery()
|
||||
.in(QmsQcMaterial::getMaterialNo, materialNos)
|
||||
.list()
|
||||
.stream()
|
||||
.collect(java.util.stream.Collectors.toMap(QmsQcMaterial::getMaterialNo, m -> m));
|
||||
.toList();
|
||||
Map<String, QmsQcMaterial> existMaterialMap = batchQueryExistMaterials(materialNos);
|
||||
|
||||
List<QmsQcMaterial> insertList = new java.util.ArrayList<>();
|
||||
List<QmsQcMaterial> updateList = new java.util.ArrayList<>();
|
||||
List<QmsQcMaterial> insertList = new ArrayList<>();
|
||||
List<QmsQcMaterial> updateList = new ArrayList<>();
|
||||
|
||||
for (MaterialMainListByDateDTO materialDTO : validMaterials) {
|
||||
QmsQcMaterial existMaterial = existMaterialMap.get(materialDTO.getMaterialNo());
|
||||
|
|
@ -111,6 +118,7 @@ public class QCMaterialSyncProcessor implements BasicProcessor {
|
|||
.setMaterialSpecifications(materialDTO.getMaterialSpecifications())
|
||||
.setDrawingNo(materialDTO.getDrawingNo())
|
||||
.setDrawingNoVer(materialDTO.getDrawingNoVersion())
|
||||
.setMaterialTexture(materialDTO.getMaterialTexture())
|
||||
.setMaterialCategoryCode(materialDTO.getMaterialCategoryCode())
|
||||
.setMaterialCategoryCodePathName(materialDTO.getMaterialCategoryFullName())
|
||||
.setUpdateBy(userId)
|
||||
|
|
@ -130,11 +138,30 @@ public class QCMaterialSyncProcessor implements BasicProcessor {
|
|||
log.info("开始更新物料,数量:{}", updateList.size());
|
||||
qcMaterialService.updateBatchById(updateList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new ProcessResult(true);
|
||||
} catch (Exception ex) {
|
||||
return new ProcessResult(false, "同步物料失败");
|
||||
return new ProcessResult(false, "同步物料失败: " + ex.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 分批查询已存在的物料,避免 IN 子句过长
|
||||
*/
|
||||
private Map<String, QmsQcMaterial> batchQueryExistMaterials(List<String> materialNos) {
|
||||
Map<String, QmsQcMaterial> result = new LinkedHashMap<>();
|
||||
// 每批500条,避免SQL IN子句过长
|
||||
CollUtil.split(materialNos, 500).forEach(batch -> {
|
||||
Map<String, QmsQcMaterial> batchMap = qcMaterialService.lambdaQuery()
|
||||
.in(QmsQcMaterial::getMaterialNo, batch)
|
||||
.list()
|
||||
.stream()
|
||||
.collect(Collectors.toMap(
|
||||
QmsQcMaterial::getMaterialNo,
|
||||
m -> m,
|
||||
(existing, replacement) -> existing));
|
||||
result.putAll(batchMap);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue