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