diff --git a/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/enums/VisaBillTypeEnum.java b/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/enums/VisaBillTypeEnum.java index 437943cd..0bf38b9e 100644 --- a/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/enums/VisaBillTypeEnum.java +++ b/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/enums/VisaBillTypeEnum.java @@ -15,7 +15,7 @@ public enum VisaBillTypeEnum { TASK("task", "任务单"), RECTIFY("rectify", "整改单"), - VISA("visa", "变更单"), + DESIGN_VISA("design_visa", "设计变更单"), ; diff --git a/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/request/VisaChangeTempCreateReq.java b/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/request/VisaChangeTempCreateReq.java index 1bec835a..95881fd1 100644 --- a/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/request/VisaChangeTempCreateReq.java +++ b/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/request/VisaChangeTempCreateReq.java @@ -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 { /** * 区域集合 + * 示例: + *
+     * [
+     *     {
+     *         "areaId": 249556,
+     *         "childrenAreaList": [
+     *             {
+     *                 "areaId": 249739,
+     *                 "childrenAreaList": []
+     *             }
+     *         ]
+     *     },
+     *     {
+     *         "areaId": 249556,
+     *         "childrenAreaList": [
+     *             {
+     *                 "areaId": 249739,
+     *                 "childrenAreaList": []
+     *             }
+     *         ]
+     *     }
+     * ]
+     *  
*/ private JSONObject relationArea; @@ -83,9 +107,25 @@ public class VisaChangeTempCreateReq { /** * 专业集合 + * 示例: + *
+     * [
+     *     {
+     *         "id": 9658,
+     *         "code": "JIANZHU_CUOSHIBIAO",
+     *         "children": [
+     *             {
+     *                 "id": 9659,
+     *                 "code": "JIANZHU_CUOSHIBIAOSHINEIWAIZHUANGXIUGOUZAOZUOFABIAO",
+     *                 "children": []
+     *             }
+     *         ]
+     *     }
+     * ]
+     * 
*/ @NotNull(message = "请选择专业") - private JSONObject relationProfessional; + private JSONArray relationProfessional; /** * 发生原因 diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/domain/ChangeRecord.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/domain/ChangeRecord.java index b3ef1b9d..7628c57f 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/domain/ChangeRecord.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/domain/ChangeRecord.java @@ -58,6 +58,7 @@ public class ChangeRecord extends BaseEntity { /** * 区域集合 + * 示例: *
      * [
      *     {
@@ -86,7 +87,8 @@ public class ChangeRecord extends BaseEntity {
 
     /**
      * 专业集合
-     * 示例
+     * 示例:
+     * 
      * [
      *     {
      *         "id": 9658,
@@ -100,6 +102,7 @@ public class ChangeRecord extends BaseEntity {
      *         ]
      *     }
      * ]
+     * 
*/ @TableField(value = "relation_professional", typeHandler = FastjsonTypeHandler.class) private JSONArray relationProfessional; diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/dto/VisaBillDto.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/dto/VisaBillDto.java index b1cd2807..83f43beb 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/dto/VisaBillDto.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/dto/VisaBillDto.java @@ -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 */ diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/ChangeRecordBillService.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/ChangeRecordBillService.java index ec18d3ba..6cbb647f 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/ChangeRecordBillService.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/ChangeRecordBillService.java @@ -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 findMainBill(VisaRelationFieldEnum billType, List billIds); + List findMainBill(VisaBillTypeEnum billType, List billIds); } diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordBillServiceImpl.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordBillServiceImpl.java index 63869a68..25a79e72 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordBillServiceImpl.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordBillServiceImpl.java @@ -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 findMainBill(VisaRelationFieldEnum billType, List billIds) { + public List findMainBill(VisaBillTypeEnum billType, List billIds) { AssertUtil.notNull(billType, "单据类型不能为空"); AssertUtil.notEmpty(billIds, "单据Id不能为空"); return lambdaQuery().in(ChangeRecordBill::getBillId, billIds) diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordServiceImpl.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordServiceImpl.java index fedfa60d..1c40f774 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordServiceImpl.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordServiceImpl.java @@ -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 changeRecordBills = changeRecordBillService.listById(visaId); Map> 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 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 billMainMap; if (req.getNeedRelatedBill()) { List billIds = records.stream().map(ChangeRecord::getId).distinct().collect(Collectors.toList()); - List mainBill = changeRecordBillService.findMainBill(VisaRelationFieldEnum.VISA_ORDER, billIds); + List mainBill = changeRecordBillService.findMainBill(VisaBillTypeEnum.DESIGN_VISA, billIds); if (CollectionUtils.isEmpty(mainBill)) { billMainMap = null; - log.info("所有单据均为主单据"); + log.info("all bill is main bill"); } else { // Map billMainMap = mainBill.stream().collect(Collectors.toMap(ChangeRecordBill::getBillId, ChangeRecordBill::getVisaId, (v1, v2) -> v2)); @@ -1003,14 +1003,28 @@ public class ChangeRecordServiceImpl extends ServiceImpl { 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 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 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 value, VisaTypeEnum visaType) { + AssertUtil.notNull(billType, "关联单据类型不能为空"); + AssertUtil.notEmpty(value, "关联单据Id不能为空"); + AssertUtil.notNull(visaType, "单据类型不能为空"); + List 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 buildArea(JSONArray relationArea) { if (CollectionUtils.isEmpty(relationArea)) { return Lists.newArrayList(); @@ -1152,8 +1182,8 @@ public class ChangeRecordServiceImpl extends ServiceImpl