diff --git a/nanopart-server/src/main/java/cn/axzo/nanopart/config/exception/ExceptionAdviceHandler.java b/nanopart-server/src/main/java/cn/axzo/nanopart/config/exception/ExceptionAdviceHandler.java index 4e906a5d..b24e462e 100644 --- a/nanopart-server/src/main/java/cn/axzo/nanopart/config/exception/ExceptionAdviceHandler.java +++ b/nanopart-server/src/main/java/cn/axzo/nanopart/config/exception/ExceptionAdviceHandler.java @@ -2,6 +2,7 @@ package cn.axzo.nanopart.config.exception; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.pokonyan.exception.BusinessException; +import cn.axzo.workflow.common.exception.WorkflowEngineException; import lombok.extern.slf4j.Slf4j; import org.springframework.core.annotation.Order; import org.springframework.util.CollectionUtils; @@ -37,13 +38,13 @@ public class ExceptionAdviceHandler { } @ExceptionHandler(cn.axzo.framework.domain.ServiceException.class) - public ApiResult domainServiceExceptionHandler(cn.axzo.framework.domain.ServiceException e){ + public ApiResult domainServiceExceptionHandler(cn.axzo.framework.domain.ServiceException e) { log.warn("业务异常", e); return ApiResult.err(e.getMessage()); } @ExceptionHandler(BusinessException.class) - public ApiResult businessExceptionHandler(BusinessException e){ + public ApiResult businessExceptionHandler(BusinessException e) { log.warn("业务异常", e); return ApiResult.err(e.getErrorMsg()); } @@ -65,4 +66,10 @@ public class ExceptionAdviceHandler { log.warn("业务异常", e); return ApiResult.err(e.getErrorMsg()); } + @ExceptionHandler(WorkflowEngineException.class) + public ApiResult workflowExceptionHandler(WorkflowEngineException e) { + log.warn("业务异常", e); + return ApiResult.err(e.getMessage()); + } + } diff --git a/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/response/VisaDetailByIdResponse.java b/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/response/VisaDetailByIdResponse.java index 8dbfce50..d05a1f43 100644 --- a/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/response/VisaDetailByIdResponse.java +++ b/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/response/VisaDetailByIdResponse.java @@ -211,6 +211,11 @@ public class VisaDetailByIdResponse { */ private String approvalStatus; + /** + * 当前登录人的personId + */ + private Long currentPersonId; + @Data @Builder @NoArgsConstructor diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/dto/VisaExportDto.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/dto/VisaExportDto.java index ca1943ef..69b1aeff 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/dto/VisaExportDto.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/dto/VisaExportDto.java @@ -46,10 +46,16 @@ public class VisaExportDto { private String topic; /** - * 工程 + * 有符号的变更金额 */ - @ExcelProperty("所属工程") - private String relationProject; + @ExcelProperty("金额变化") + private BigDecimal amountChange; + + /** + * 发起人 + */ + @ExcelProperty("发起人") + private String initiator; /** * 提出时间 @@ -57,12 +63,6 @@ public class VisaExportDto { @ExcelProperty("提出时间") private Date happenTime; - /** - * 有符号的变更金额 - */ - @ExcelProperty("金额变化") - private BigDecimal amountChange; - /** * 最终审批时间 */ @@ -70,8 +70,8 @@ public class VisaExportDto { private Date approvalCompleteTime; /** - * 发起人 + * 工程 */ - @ExcelProperty("发起人") - private String initiator; + @ExcelProperty("所属工程") + private String relationProject; } diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/DataObjectApiGateway.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/DataObjectApiGateway.java index 73d4681f..c243c40d 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/DataObjectApiGateway.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/DataObjectApiGateway.java @@ -1,9 +1,11 @@ package cn.axzo.nanopart.visa.server.rpc; +import cn.axzo.foundation.result.ApiResult; import cn.axzo.karma.client.feign.tyr.DataObjectApi; import cn.axzo.karma.client.feign.tyr.request.MatchDataObjectReq; import cn.axzo.karma.client.feign.tyr.response.MatchDataObjectResp; import cn.axzo.karma.client.feign.tyr.response.MergeMatchDataResp; +import com.alibaba.fastjson.JSON; import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -27,11 +29,11 @@ public class DataObjectApiGateway { return MatchDataObjectResp.builder().build(); } try { -// log.info("DataObjectApiGateway match, params:{}", JSON.toJSONString(req)); -// ApiResult match = dataObjectApi.match(req); -// log.info("DataObjectApiGateway match, result:{}", JSON.toJSONString(match)); -// return match.getData(); - return mockDataObject(); + log.info("DataObjectApiGateway match, params:{}", JSON.toJSONString(req)); + ApiResult match = dataObjectApi.match(req); + log.info("DataObjectApiGateway match, result:{}", JSON.toJSONString(match)); + return match.getData(); +// return mockDataObject(); } catch (Exception e) { log.warn("DataObjectApiGateway match exception", e); throw e; 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 6cd50998..99d57113 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 @@ -7,7 +7,6 @@ import cn.axzo.apollo.workspace.api.workspace.res.GetDetailRes; import cn.axzo.apollo.workspace.api.workspace.res.ProjectBriefResp; import cn.axzo.apollo.workspace.api.workspace.res.ProjectDetailRes; import cn.axzo.basics.common.constant.enums.OrganizationalNodeTypeEnum; -import cn.axzo.basics.common.constant.enums.OrganizationalUnitTypeEnum; import cn.axzo.basics.common.util.AssertUtil; import cn.axzo.basics.common.util.NumberUtil; import cn.axzo.basics.profiles.dto.basic.PersonProfileDto; @@ -30,7 +29,6 @@ import cn.axzo.im.center.common.enums.AppTypeEnum; import cn.axzo.im.center.common.enums.GroupType; import cn.axzo.log.platform.client.model.req.LogAddReq; import cn.axzo.maokai.api.vo.request.OrgNodeUserBriefInfoListReq; -import cn.axzo.maokai.api.vo.request.OrganizationalUnitQuery; import cn.axzo.maokai.api.vo.response.OrgNodeUserBriefInfoResp; import cn.axzo.maokai.api.vo.response.OrganizationalUnitVO; import cn.axzo.maokai.common.enums.SaasCooperateShipCooperateTypeEnum; @@ -101,7 +99,6 @@ import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO; import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq; import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq; import cn.axzo.workflow.common.model.dto.CooperationOrgDTO; -import cn.axzo.workflow.common.model.dto.UploadFieldDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; @@ -119,7 +116,6 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; import org.apache.groovy.util.Maps; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -130,7 +126,6 @@ import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.math.BigDecimal; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -141,30 +136,10 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_AMOUNT_CHANGE; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_ATTACH; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_CONTEXT; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_CONTEXT_DESCRIPTION; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_DESCRIPTION; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_HAPPEN_TIME; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_NO; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_PERSON; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_REASON; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATION_AREA; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATION_PROFESSIONAL; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATION_PROJECT; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATION_RECTIFICATION_ORDER; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATION_TASK_ORDER; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATION_VISA_ORDER; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_TOPIC; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_UNIT; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_UNIT_PERSON; -import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_WORKSPACE_NAME; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_INITIATOR_WORKSPACE_ID; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_VISA_ID; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_VISA_TYPE; @@ -176,7 +151,6 @@ import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAct import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAction.CANCEL; import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAction.COMPLETE; import static cn.axzo.nanopart.visa.server.config.BizResultCode.CHANGE_RECORD_NOT_FOUND; -import static cn.axzo.nanopart.visa.server.service.VisaHelper.buildPersonInfosStr; import static cn.axzo.nanopart.visa.server.utils.Constants.DATE_FORMAT; import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING; @@ -836,6 +810,8 @@ public class ChangeRecordServiceImpl extends ServiceImpl taskNos = value.stream().map(VisaChangeTempCreateReq.OrderSimpleModel::getNo).collect(Collectors.toList()); - // 存在性 - QueryOrderToBasicReq queryOrderToBasicReq = new QueryOrderToBasicReq(); - queryOrderToBasicReq.setWorkspaceId(req.getRelationWorkspaceId()); - queryOrderToBasicReq.setTaskNos(taskNos); - queryOrderToBasicReq.setPage(1); - queryOrderToBasicReq.setPageSize(taskNos.size()); - List taskOrders = taskOrderApiGateway.pageOrderByForBasic(queryOrderToBasicReq).getData(); - AssertUtil.isTrue(taskOrders.size() == taskNos.size(), "关联任务单单据不存在,请检查后重试"); - validTaskBillIfRelated(taskNos, req.getType()); + List taskNos = value.stream() + .map(VisaChangeTempCreateReq.OrderSimpleModel::getNo) + .filter(StringUtils::hasText) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(taskNos)) { + // 存在性 + QueryOrderToBasicReq queryOrderToBasicReq = new QueryOrderToBasicReq(); + queryOrderToBasicReq.setWorkspaceId(req.getRelationWorkspaceId()); + queryOrderToBasicReq.setTaskNos(taskNos); + queryOrderToBasicReq.setPage(1); + queryOrderToBasicReq.setPageSize(taskNos.size()); + List taskOrders = taskOrderApiGateway.pageOrderByForBasic(queryOrderToBasicReq).getData(); + AssertUtil.isTrue(CollectionUtils.isNotEmpty(taskOrders) && taskOrders.size() == taskNos.size(), "关联任务单单据不存在,请检查后重试"); + validTaskBillIfRelated(taskNos, req.getType()); + } } else if (Objects.equals(VisaBillTypeEnum.RECTIFY.name(), key)) { /*整改单*/ - List billIds = value.stream().map(v -> String.valueOf(v.getId())).collect(Collectors.toList()); - // 存在性 - ListRectifyOrderReq rectifyOrderReq = ListRectifyOrderReq.builder() - .ids(value.stream().map(VisaChangeTempCreateReq.OrderSimpleModel::getId).collect(Collectors.toSet())) - .build(); - List rectifyOrders = rectifyApiGateway.listRectifyOrders(rectifyOrderReq); - AssertUtil.isTrue(CollectionUtils.isNotEmpty(rectifyOrders) && rectifyOrders.size() == billIds.size(), "关联整改单单据不存在,请检查后重试"); - validBillIfRelated(VisaBillTypeEnum.RECTIFY, billIds, req.getType()); + List billIds = value.stream() + .map(v -> String.valueOf(v.getId())) + .filter(StringUtils::hasText) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(billIds)) { + // 存在性 + ListRectifyOrderReq rectifyOrderReq = ListRectifyOrderReq.builder() + .ids(value.stream().map(VisaChangeTempCreateReq.OrderSimpleModel::getId).collect(Collectors.toSet())) + .build(); + List rectifyOrders = rectifyApiGateway.listRectifyOrders(rectifyOrderReq); + AssertUtil.isTrue(CollectionUtils.isNotEmpty(rectifyOrders) && rectifyOrders.size() == billIds.size(), "关联整改单单据不存在,请检查后重试"); + validBillIfRelated(VisaBillTypeEnum.RECTIFY, billIds, req.getType()); + } } else if (Objects.equals(VisaBillTypeEnum.DESIGN_VISA.name(), key)) { /*变更单*/ AssertUtil.isTrue(VisaTypeEnum.TECHNOLOGY_APPROVED.equals(req.getType()) || VisaTypeEnum.PROJECT_VISA.equals(req.getType()), "变更单关联单据仅支持技术核定/工程签证"); // 关联单据合法性,是否存在,状态是否合法 - List billIds = value.stream().map(v -> String.valueOf(v.getId())).collect(Collectors.toList()); - List relationVisa = listByIds(billIds); - AssertUtil.isTrue(CollectionUtils.isNotEmpty(relationVisa) && relationVisa.size() == billIds.size(), "关联的变更单单据不存在,请检查后重试"); - relationVisa.forEach(r -> { - AssertUtil.isTrue(Objects.equals(r.getRelationWorkspaceId(), req.getRelationWorkspaceId()), "关联的单据所属项目不匹配"); - AssertUtil.isTrue(VisaStatusEnum.COMPLETED.equals(r.getStatus()), String.format("%s单据%s状态为%s,不允许被关联", VisaBillTypeEnum.DESIGN_VISA.getDesc(), r.getNo(), r.getStatus().getDesc())); - }); - validBillIfRelated(VisaBillTypeEnum.DESIGN_VISA, billIds, req.getType()); + List billIds = value.stream() + .map(v -> String.valueOf(v.getId())) + .filter(StringUtils::hasText) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(billIds)) { + List relationVisa = listByIds(billIds); + AssertUtil.isTrue(CollectionUtils.isNotEmpty(relationVisa) && relationVisa.size() == billIds.size(), "关联的变更单单据不存在,请检查后重试"); + relationVisa.forEach(r -> { + AssertUtil.isTrue(Objects.equals(r.getRelationWorkspaceId(), req.getRelationWorkspaceId()), "关联的单据所属项目不匹配"); + AssertUtil.isTrue(VisaStatusEnum.COMPLETED.equals(r.getStatus()), String.format("%s单据%s状态为%s,不允许被关联", VisaBillTypeEnum.DESIGN_VISA.getDesc(), r.getNo(), r.getStatus().getDesc())); + }); + validBillIfRelated(VisaBillTypeEnum.DESIGN_VISA, billIds, req.getType()); + } } else { throw new ServiceException("不支持的关联单据类型"); } @@ -1469,6 +1460,9 @@ public class ChangeRecordServiceImpl extends ServiceImpl mainBill = changeRecordBillService.getRelatedMainBill(VisaBillTypeEnum.TASK, taskNos); + if (CollectionUtils.isEmpty(mainBill)) { + return; + } mainBill.stream() .collect(Collectors.groupingBy(ChangeRecordBill::getBillNo)) .forEach((k, v) -> v.stream() @@ -1699,7 +1693,8 @@ public class ChangeRecordServiceImpl extends ServiceImpl