feat(REQ-3300): 提交审批校验

This commit is contained in:
chenwenjian 2025-02-07 11:44:00 +08:00
parent 84b18ee6f6
commit 7db033260d
7 changed files with 101 additions and 22 deletions

View File

@ -15,7 +15,7 @@ public enum VisaBillTypeEnum {
TASK("task", "任务单"),
RECTIFY("rectify", "整改单"),
VISA("visa", "变更单"),
DESIGN_VISA("design_visa", "设计变更单"),
;

View File

@ -1,9 +1,10 @@
package cn.axzo.nanopart.visa.api.request;
import cn.axzo.maokai.common.enums.SaasCooperateShipCooperateTypeEnum;
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
import cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum;
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -72,6 +73,29 @@ public class VisaChangeTempCreateReq {
/**
* 区域集合
* 示例
* <pre>
* [
* {
* "areaId": 249556,
* "childrenAreaList": [
* {
* "areaId": 249739,
* "childrenAreaList": []
* }
* ]
* },
* {
* "areaId": 249556,
* "childrenAreaList": [
* {
* "areaId": 249739,
* "childrenAreaList": []
* }
* ]
* }
* ]
* </pre>
*/
private JSONObject relationArea;
@ -83,9 +107,25 @@ public class VisaChangeTempCreateReq {
/**
* 专业集合
* 示例
* <pre>
* [
* {
* "id": 9658,
* "code": "JIANZHU_CUOSHIBIAO",
* "children": [
* {
* "id": 9659,
* "code": "JIANZHU_CUOSHIBIAOSHINEIWAIZHUANGXIUGOUZAOZUOFABIAO",
* "children": []
* }
* ]
* }
* ]
* </pre>
*/
@NotNull(message = "请选择专业")
private JSONObject relationProfessional;
private JSONArray relationProfessional;
/**
* 发生原因

View File

@ -58,6 +58,7 @@ public class ChangeRecord extends BaseEntity<ChangeRecord> {
/**
* 区域集合
* 示例
* <pre>
* [
* {
@ -86,7 +87,8 @@ public class ChangeRecord extends BaseEntity<ChangeRecord> {
/**
* 专业集合
* 示例
* 示例
* <pre>
* [
* {
* "id": 9658,
@ -100,6 +102,7 @@ public class ChangeRecord extends BaseEntity<ChangeRecord> {
* ]
* }
* ]
* </pre>
*/
@TableField(value = "relation_professional", typeHandler = FastjsonTypeHandler.class)
private JSONArray relationProfessional;

View File

@ -1,6 +1,7 @@
package cn.axzo.nanopart.visa.server.dto;
import cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum;
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -25,6 +26,11 @@ public class VisaBillDto {
*/
private Long visaId;
/**
* 变更签证单据类型
*/
private VisaTypeEnum visaType;
/**
* 单据id
*/

View File

@ -1,6 +1,6 @@
package cn.axzo.nanopart.visa.server.service;
import cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum;
import cn.axzo.nanopart.visa.api.enums.VisaBillTypeEnum;
import cn.axzo.nanopart.visa.server.domain.ChangeRecordBill;
import cn.axzo.nanopart.visa.server.dto.VisaBillDto;
@ -46,6 +46,6 @@ public interface ChangeRecordBillService {
* @param billIds 单据id
* @return 主单据信息
*/
List<ChangeRecordBill> findMainBill(VisaRelationFieldEnum billType, List<Long> billIds);
List<ChangeRecordBill> findMainBill(VisaBillTypeEnum billType, List<Long> billIds);
}

View File

@ -1,7 +1,7 @@
package cn.axzo.nanopart.visa.server.service.impl;
import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum;
import cn.axzo.nanopart.visa.api.enums.VisaBillTypeEnum;
import cn.axzo.nanopart.visa.server.domain.ChangeRecordBill;
import cn.axzo.nanopart.visa.server.dto.VisaBillDto;
import cn.axzo.nanopart.visa.server.mapper.ChangeRecordBillDao;
@ -78,7 +78,7 @@ public class ChangeRecordBillServiceImpl extends ServiceImpl<ChangeRecordBillDao
}
@Override
public List<ChangeRecordBill> findMainBill(VisaRelationFieldEnum billType, List<Long> billIds) {
public List<ChangeRecordBill> findMainBill(VisaBillTypeEnum billType, List<Long> billIds) {
AssertUtil.notNull(billType, "单据类型不能为空");
AssertUtil.notEmpty(billIds, "单据Id不能为空");
return lambdaQuery().in(ChangeRecordBill::getBillId, billIds)

View File

@ -56,7 +56,6 @@ import cn.axzo.nanopart.visa.server.rpc.ApolloConstructionAreaGateway;
import cn.axzo.nanopart.visa.server.rpc.DrawingMajorGateway;
import cn.axzo.nanopart.visa.server.rpc.MsgCenterGateway;
import cn.axzo.nanopart.visa.server.rpc.OrganizationalUnitGateway;
import cn.axzo.nanopart.visa.server.rpc.VisaCooperateShipGateway;
import cn.axzo.nanopart.visa.server.rpc.VisaOrganizationalNodeUserGateway;
import cn.axzo.nanopart.visa.server.rpc.VisaProfileGateway;
import cn.axzo.nanopart.visa.server.rpc.VisaProjectApiGateway;
@ -333,7 +332,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
List<ChangeRecordBill> changeRecordBills = changeRecordBillService.listById(visaId);
Map<VisaBillTypeEnum, List<String>> billMap = changeRecordBills.stream()
.collect(Collectors.groupingBy(ChangeRecordBill::getBillType
, Collectors.mapping(item -> Objects.equals(0L, item.getBillId()) ? item.getBillNo() : item.getBillId().toString(), Collectors.toList())));
, Collectors.mapping(item -> Objects.equals(0L, item.getBillId()) ? item.getBillNo() : item.getBillId().toString(), Collectors.toList())));
ProjectDetailRes projectDetailRes = visaProjectApiGateway.getProjectById(visa.getRelationProject());
GetDetailRes workspace = workspaceGateway.getById(visa.getRelationWorkspaceId());
@ -366,7 +365,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
.relationOuAndPersonList(changeRecordConfirmService.listRelationByVisaId(pair.getKey())) // 相关单位与确认人
.relationTaskList(CollectionUtils.isEmpty(billMap.get(VisaBillTypeEnum.TASK)) ? Lists.newArrayList() : billMap.get(VisaBillTypeEnum.TASK)) // 关联任务单
.relationRectifyList(CollectionUtils.isEmpty(billMap.get(VisaBillTypeEnum.RECTIFY)) ? Lists.newArrayList() : billMap.get(VisaBillTypeEnum.RECTIFY)) //关联整改单
.relationVisaList(CollectionUtils.isEmpty(billMap.get(VisaBillTypeEnum.VISA)) ? Lists.newArrayList() : billMap.get(VisaBillTypeEnum.VISA)) // 关联变更单
.relationVisaList(CollectionUtils.isEmpty(billMap.get(VisaBillTypeEnum.DESIGN_VISA)) ? Lists.newArrayList() : billMap.get(VisaBillTypeEnum.DESIGN_VISA)) // 关联变更单
.amountChange(Objects.nonNull(visa.getAmountChange()) ? visa.getAmountChange().toPlainString() : "")
.changeContextAndDescriptionList(this.buildDesc(visaId))
.status(visa.getStatus())
@ -530,6 +529,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
.flatMap(os -> os.getValue().stream()
.map(o -> VisaBillDto.builder()
.visaId(changeRecord.getId())
.visaType(changeRecord.getType())
.billId(o)
.billType(VisaRelationFieldEnum.valueOf(os.getKey()))
.createBy(req.getOperatorPersonId())
@ -870,10 +870,10 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
Map<Long, Long> billMainMap;
if (req.getNeedRelatedBill()) {
List<Long> billIds = records.stream().map(ChangeRecord::getId).distinct().collect(Collectors.toList());
List<ChangeRecordBill> mainBill = changeRecordBillService.findMainBill(VisaRelationFieldEnum.VISA_ORDER, billIds);
List<ChangeRecordBill> mainBill = changeRecordBillService.findMainBill(VisaBillTypeEnum.DESIGN_VISA, billIds);
if (CollectionUtils.isEmpty(mainBill)) {
billMainMap = null;
log.info("所有单据均为主单据");
log.info("all bill is main bill");
} else {
// Map<billId,visaId>
billMainMap = mainBill.stream().collect(Collectors.toMap(ChangeRecordBill::getBillId, ChangeRecordBill::getVisaId, (v1, v2) -> v2));
@ -1003,14 +1003,28 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
if (CollUtil.isNotEmpty(req.getRelationOrderMap())) {
req.getRelationOrderMap().forEach((key, value) -> {
if (Objects.equals(VisaRelationFieldEnum.TASK_ORDER.name(), key)) {
// 任务单 TODO
} else if (Objects.equals(VisaRelationFieldEnum.RECTIFICATION_ORDER.name(), key)) {
// 整改单 TODO
} 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() <= verifyVisaLimit, String.format("最多可关联%d个变更单请重新选择", verifyVisaLimit));
List<ChangeRecordBill> mainBill = changeRecordBillService.findMainBill(VisaRelationFieldEnum.VISA_ORDER, value);
validBillIfRelated(VisaBillTypeEnum.TASK, value, req.getType());
} else if (Objects.equals(VisaRelationFieldEnum.RECTIFICATION_ORDER.name(), key)) {
/*整改单*/
// 关联单据数量限制
AssertUtil.isTrue(value.size() <= verifyVisaLimit, String.format("最多可关联%d个变更单请重新选择", verifyVisaLimit));
validBillIfRelated(VisaBillTypeEnum.RECTIFY, value, 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() <= verifyVisaLimit, String.format("最多可关联%d个变更单请重新选择", verifyVisaLimit));
// 关联单据合法性是否存在状态是否合法
List<ChangeRecord> relationVisa = listByIds(value);
AssertUtil.notEmpty(relationVisa, "关联的单据不存在");
relationVisa.forEach(r -> {
AssertUtil.isTrue(Objects.equals(r.getRelationWorkspaceId(), req.getRelationWorkspaceId()), "关联的单据所属项目不匹配");
AssertUtil.isFalse(Objects.equals(r.getStatus(), VisaStatusEnum.TO_REPORT) || Objects.equals(r.getStatus(), VisaStatusEnum.FORBIDED), String.format("单据%s状态为%s不允许被关联", r.getNo(), r.getStatus().getDesc()));
});
validBillIfRelated(VisaBillTypeEnum.DESIGN_VISA, value, req.getType());
} else {
throw new ServiceException("不支持的关联单据类型");
}
@ -1018,6 +1032,22 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
}
}
private void validBillIfRelated(VisaBillTypeEnum billType, List<Long> value, VisaTypeEnum visaType) {
AssertUtil.notNull(billType, "关联单据类型不能为空");
AssertUtil.notEmpty(value, "关联单据Id不能为空");
AssertUtil.notNull(visaType, "单据类型不能为空");
List<ChangeRecordBill> mainBill = changeRecordBillService.findMainBill(billType, value);
mainBill.stream()
.collect(Collectors.groupingBy(ChangeRecordBill::getBillId))
.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()));
}));
}
private List<VisaDetailByIdResponse.RelationAreaDetail> buildArea(JSONArray relationArea) {
if (CollectionUtils.isEmpty(relationArea)) {
return Lists.newArrayList();
@ -1152,8 +1182,8 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
validOperationPermission(req.getVisaId(), req.getOperatorPersonId(), req.getOperatorOuId(), req.getOperatorWorkspaceId());
changeRecordRelationService.clearImOperationParticipate(ImGroupOperationReq.builder()
.visaId(req.getVisaId())
.imGroupId(req.getImGroupId())
.visaId(req.getVisaId())
.imGroupId(req.getImGroupId())
.build());
}