feat(REQ-3300): 任务单使用单号作为唯一键

This commit is contained in:
chenwenjian 2025-02-12 14:51:11 +08:00
parent ec5eb6628e
commit 6b27021b5b
3 changed files with 41 additions and 15 deletions

View File

@ -48,4 +48,12 @@ public interface ChangeRecordBillService {
*/
List<ChangeRecordBill> findMainBill(VisaBillTypeEnum billType, List<Long> billIds);
/**
* 获取任务单的主单据
*
* @param taskNos 任务单单号
* @return 主单据信息
*/
List<ChangeRecordBill> findTaskMainBill(List<String> taskNos);
}

View File

@ -1,6 +1,5 @@
package cn.axzo.nanopart.visa.server.service.impl;
import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.nanopart.visa.api.enums.VisaBillTypeEnum;
import cn.axzo.nanopart.visa.server.domain.ChangeRecordBill;
import cn.axzo.nanopart.visa.server.dto.VisaBillDto;
@ -11,10 +10,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
@ -79,12 +80,20 @@ public class ChangeRecordBillServiceImpl extends ServiceImpl<ChangeRecordBillDao
@Override
public List<ChangeRecordBill> findMainBill(VisaBillTypeEnum billType, List<Long> billIds) {
AssertUtil.notNull(billType, "单据类型不能为空");
AssertUtil.notEmpty(billIds, "单据Id不能为空");
if (Objects.isNull(billIds) || CollectionUtils.isEmpty(billIds)) {
return Collections.emptyList();
}
return lambdaQuery().in(ChangeRecordBill::getBillId, billIds)
.eq(ChangeRecordBill::getBillType, billType)
.eq(ChangeRecordBill::getIsDelete, 0)
.orderByDesc(ChangeRecordBill::getUpdateAt)
.list();
}
@Override
public List<ChangeRecordBill> findTaskMainBill(List<String> taskNos) {
return lambdaQuery().in(ChangeRecordBill::getBillNo, taskNos)
.eq(ChangeRecordBill::getBillType, VisaBillTypeEnum.TASK)
.eq(ChangeRecordBill::getIsDelete, 0)
.list();
}

View File

@ -1185,26 +1185,20 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
// 关联单据合法性
if (CollUtil.isNotEmpty(req.getRelationOrderMap())) {
req.getRelationOrderMap().forEach((key, value) -> {
// 关联单据数量限制
AssertUtil.isTrue(value.size() <= refreshableConfiguration.getVerifyVisaLimit(),
String.format("最多可关联%d个%s单请重新选择", refreshableConfiguration.getVerifyVisaLimit(), VisaBillTypeEnum.valueOf(key).getDesc()));
if (Objects.equals(VisaRelationFieldEnum.TASK_ORDER.name(), key)) {
/*任务单*/
// 关联单据数量限制
AssertUtil.isTrue(value.size() <= refreshableConfiguration.getVerifyVisaLimit(),
String.format("最多可关联%d个变更单请重新选择", refreshableConfiguration.getVerifyVisaLimit()));
List<Long> billIds = value.stream().map(VisaChangeTempCreateReq.OrderSimpleModel::getId).collect(Collectors.toList());
validBillIfRelated(VisaBillTypeEnum.TASK, billIds, req.getType());
List<String> taskNos = value.stream().map(VisaChangeTempCreateReq.OrderSimpleModel::getNo).collect(Collectors.toList());
validTaskBillIfRelated(taskNos, req.getType());
} else if (Objects.equals(VisaRelationFieldEnum.RECTIFICATION_ORDER.name(), key)) {
/*整改单*/
// 关联单据数量限制
AssertUtil.isTrue(value.size() <= refreshableConfiguration.getVerifyVisaLimit(),
String.format("最多可关联%d个变更单请重新选择", refreshableConfiguration.getVerifyVisaLimit()));
List<Long> billIds = value.stream().map(VisaChangeTempCreateReq.OrderSimpleModel::getId).collect(Collectors.toList());
validBillIfRelated(VisaBillTypeEnum.RECTIFY, billIds, req.getType());
} else if (Objects.equals(VisaRelationFieldEnum.VISA_ORDER.name(), key)) {
/*变更单*/
AssertUtil.isTrue(VisaTypeEnum.TECHNOLOGY_APPROVED.equals(req.getType()) || VisaTypeEnum.PROJECT_VISA.equals(req.getType()), "变更单关联单据仅支持技术核定/工程签证");
// 关联单据数量限制
AssertUtil.isTrue(value.size() <= refreshableConfiguration.getVerifyVisaLimit(),
String.format("最多可关联%d个变更单请重新选择", refreshableConfiguration.getVerifyVisaLimit()));
// 关联单据合法性是否存在状态是否合法
List<Long> billIds = value.stream().map(VisaChangeTempCreateReq.OrderSimpleModel::getId).collect(Collectors.toList());
List<ChangeRecord> relationVisa = listByIds(billIds);
@ -1245,6 +1239,21 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
}));
}
private void validTaskBillIfRelated(List<String> taskNos, VisaTypeEnum visaType) {
AssertUtil.notEmpty(taskNos, "关联单据Id不能为空");
AssertUtil.notNull(visaType, "单据类型不能为空");
List<ChangeRecordBill> mainBill = changeRecordBillService.findTaskMainBill(taskNos);
mainBill.stream()
.collect(Collectors.groupingBy(ChangeRecordBill::getBillNo))
.forEach((k, v) -> v.stream()
.filter(m -> Objects.equals(m.getVisaType(), visaType))
.findAny()
.ifPresent(m -> {
log.info("{} bill {} is related by {} visa {}", m.getBillType(), m.getBillId(), m.getVisaType(), m.getVisaId());
throw new ServiceException(String.format("单据%s已被其他单据关联请重新选择", m.getBillNo()));
}));
}
/**
* 通过变更签证Id获取Entity
*