Merge branch 'feature/REQ-3982'
This commit is contained in:
commit
e7a9238a43
@ -239,7 +239,7 @@ public class IndexManager {
|
||||
// resolve the name issue
|
||||
if (!indexSupport.childrenNameDuplicatable(rootNode))
|
||||
indexSupport.incrNameIfDuplicate(rootNode);
|
||||
// get the coped root with full props
|
||||
// get the copied root with full props
|
||||
return indexNodeDao.findOrNull(rootNode.getCode());
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,220 @@
|
||||
package cn.axzo.nanopart.visa.server.mq.listener.workflow.process;
|
||||
|
||||
import cn.axzo.nanopart.NanopartApplication;
|
||||
import cn.axzo.workflow.common.model.response.mq.ProcessInstanceDTO;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/**
|
||||
* @author yanglin
|
||||
*/
|
||||
@SpringBootTest(classes = NanopartApplication.class)
|
||||
@RequiredArgsConstructor(onConstructor_ = @Autowired)
|
||||
class CompleteVisaChangeStampHandlerTest {
|
||||
private final CompleteVisaChangeStampHandler completeVisaChangeStampHandler;
|
||||
|
||||
@Test
|
||||
void exec() {
|
||||
ProcessInstanceDTO dto = JSON.parseObject("{\n" +
|
||||
" \"businessKey\": \"904\",\n" +
|
||||
" \"businessProcessInstanceName\": \"变更签证用印审批\",\n" +
|
||||
" \"category\": \"bgqzyy\",\n" +
|
||||
" \"currentElementKey\": \"驳回流程实例无节点信息\",\n" +
|
||||
" \"initiator\": {\n" +
|
||||
" \"assignee\": null,\n" +
|
||||
" \"assigneeType\": null,\n" +
|
||||
" \"assignerName\": \"宋爱弟\",\n" +
|
||||
" \"avatar\": \"https://axzo-app.oss-cn-chengdu.aliyuncs.com/face/face_test/b048b3d99ef048739a258e48f7feb3dd.jpg\",\n" +
|
||||
" \"nodeId\": null,\n" +
|
||||
" \"ouId\": \"6158\",\n" +
|
||||
" \"personId\": \"9000398967\",\n" +
|
||||
" \"tenantId\": \"400\"\n" +
|
||||
" },\n" +
|
||||
" \"lastOperationAssigner\": {\n" +
|
||||
" \"assignee\": \"2008269\",\n" +
|
||||
" \"assigneeType\": \"3\",\n" +
|
||||
" \"assignerName\": \"高志鹏\",\n" +
|
||||
" \"avatar\": \"https://axzo-public.oss-cn-chengdu.aliyuncs.com/banner/banner_test/5c441569ee524c208295de72b64863d4.jpg\",\n" +
|
||||
" \"nodeId\": null,\n" +
|
||||
" \"ouId\": \"6158\",\n" +
|
||||
" \"personId\": \"9000400266\",\n" +
|
||||
" \"tenantId\": \"400\"\n" +
|
||||
" },\n" +
|
||||
" \"noticeConf\": {\n" +
|
||||
" \"carbonCopy\": {\n" +
|
||||
" \"carbonCopyMessageId\": \"8733f93de8db49699a78eda5a342763c\",\n" +
|
||||
" \"viewJson\": \"{\\\"templateName\\\":\\\"审批流抄送通用模板\\\",\\\"templateCode\\\":\\\"8733f93de8db49699a78eda5a342763c\\\"}\"\n" +
|
||||
" },\n" +
|
||||
" \"notice\": {\n" +
|
||||
" \"assigners\": {\n" +
|
||||
" \"selected\": false,\n" +
|
||||
" \"viewJson\": null\n" +
|
||||
" },\n" +
|
||||
" \"histories\": {\n" +
|
||||
" \"selected\": false,\n" +
|
||||
" \"viewJson\": null\n" +
|
||||
" },\n" +
|
||||
" \"initiator\": {\n" +
|
||||
" \"selected\": false,\n" +
|
||||
" \"viewJson\": null\n" +
|
||||
" },\n" +
|
||||
" \"noticeMessageId\": null,\n" +
|
||||
" \"positions\": {\n" +
|
||||
" \"selected\": false,\n" +
|
||||
" \"viewJson\": null\n" +
|
||||
" },\n" +
|
||||
" \"roles\": {\n" +
|
||||
" \"selected\": false,\n" +
|
||||
" \"viewJson\": null\n" +
|
||||
" },\n" +
|
||||
" \"sendMessage\": null,\n" +
|
||||
" \"triggerEvents\": []\n" +
|
||||
" },\n" +
|
||||
" \"pending\": {\n" +
|
||||
" \"pendingMessageId\": \"95c89a0db50c48fe9956068090b63ffb\",\n" +
|
||||
" \"viewJson\": \"{\\\"templateName\\\":\\\"变更签证用印审批待办\\\",\\\"templateCode\\\":\\\"95c89a0db50c48fe9956068090b63ffb\\\",\\\"category\\\":\\\"APPROVAL_PENDING_MESSAGE\\\",\\\"title\\\":\\\"变更签证用印申请\\\",\\\"content\\\":\\\"${initiatorName}发起了一个“${visaType}用印申请,请前往审批\\\",\\\"groupNodeNamePaths\\\":[\\\"SaaS待办中心/变更签证管理/用印\\\"],\\\"status\\\":\\\"ENABLE\\\",\\\"createPersonId\\\":290752,\\\"createPersonName\\\":\\\"马翔\\\",\\\"updatePersonId\\\":9100404971,\\\"updatePersonName\\\":\\\"马翔\\\",\\\"styleType\\\":{\\\"code\\\":\\\"FLOW_COMMON\\\",\\\"category\\\":\\\"APPROVAL_PENDING_MESSAGE\\\",\\\"name\\\":\\\"样式2001(审批详情页通用样式)\\\",\\\"url\\\":null},\\\"pushData\\\":{\\\"switchOn\\\":false,\\\"ability\\\":[],\\\"type\\\":\\\"\\\",\\\"voiceType\\\":\\\"\\\"}}\"\n" +
|
||||
" },\n" +
|
||||
" \"sms\": {\n" +
|
||||
" \"smsId\": \"\",\n" +
|
||||
" \"viewJson\": null\n" +
|
||||
" }\n" +
|
||||
" },\n" +
|
||||
" \"processDefinitionId\": \"bgqzyy:4:202503052021100000009\",\n" +
|
||||
" \"processDefinitionKey\": \"bgqzyy\",\n" +
|
||||
" \"processDefinitionVersion\": 4,\n" +
|
||||
" \"processInstanceId\": \"202504291615200000000\",\n" +
|
||||
" \"reason\": \"\",\n" +
|
||||
" \"signConf\": null,\n" +
|
||||
" \"startTime\": 1745914538900,\n" +
|
||||
" \"tenantId\": \"398\",\n" +
|
||||
" \"type\": \"PROCESS_INSTANCE_REJECTED\",\n" +
|
||||
" \"variables\": {\n" +
|
||||
" \"reason\": \"123\",\n" +
|
||||
" \"no\": \"123\",\n" +
|
||||
" \"[_INTERNAL_INITIATOR_]\": \"{\\\"assignerName\\\":\\\"宋爱弟\\\",\\\"avatar\\\":\\\"https://axzo-app.oss-cn-chengdu.aliyuncs.com/face/face_test/b048b3d99ef048739a258e48f7feb3dd.jpg\\\",\\\"ouId\\\":\\\"6158\\\",\\\"personId\\\":\\\"9000398967\\\",\\\"tenantId\\\":\\\"400\\\"}\",\n" +
|
||||
" \"initiatorUnitName\": \"四川星腾贸易有限公司\",\n" +
|
||||
" \"_TASK_COMPLETE_TYPE202504291615200000053\": \"APPROVED\",\n" +
|
||||
" \"[_INITIATOR_SPECIFY_]\": {\n" +
|
||||
" \"node_289121268979\": [\n" +
|
||||
" {\n" +
|
||||
" \"assignee\": null,\n" +
|
||||
" \"assigneeType\": null,\n" +
|
||||
" \"assignerName\": null,\n" +
|
||||
" \"avatar\": null,\n" +
|
||||
" \"nodeId\": null,\n" +
|
||||
" \"ouId\": \"6158\",\n" +
|
||||
" \"personId\": \"9000400266\",\n" +
|
||||
" \"tenantId\": \"398\"\n" +
|
||||
" }\n" +
|
||||
" ]\n" +
|
||||
" },\n" +
|
||||
" \"[_INTERNAL_PROCESS_DELETE_REASON_]\": \"\",\n" +
|
||||
" \"[_ASSIGNEE_LIST_INFO_]node_289121268979\": [\n" +
|
||||
" \"6158|9000400266\"\n" +
|
||||
" ],\n" +
|
||||
" \"stampType\": \"OFFICIAL\",\n" +
|
||||
" \"[_ASSIGNEE_INFO_]202504291615200000081\": \"{\\\"ouId\\\":\\\"6158\\\",\\\"personId\\\":\\\"9000400266\\\",\\\"tenantId\\\":\\\"398\\\"}\",\n" +
|
||||
" \"[_INTERNAL_PROCESS_BIZ_TYPE]\": \"approval\",\n" +
|
||||
" \"[_INTERNAL_PROCESS_AGENT]\": false,\n" +
|
||||
" \"[_PROCESS_OWNERSHIP_APPLICATION_]\": \"nanopart\",\n" +
|
||||
" \"visaTypeDesc\": \"设计变更\",\n" +
|
||||
" \"[_PROCESS_CLOSING_TYPE]\": \"REJECTED\",\n" +
|
||||
" \"[_INTERNAL_DELETE_PROCESS_FLAG_]\": \"[_INTERNAL_PROCESS_TYPE_REJECT_]\",\n" +
|
||||
" \"[_ASSIGNEE_INFO_]202504291615200000053\": \"{\\\"assignerName\\\":\\\"宋爱弟\\\",\\\"avatar\\\":\\\"https://axzo-app.oss-cn-chengdu.aliyuncs.com/face/face_test/b048b3d99ef048739a258e48f7feb3dd.jpg\\\",\\\"ouId\\\":\\\"6158\\\",\\\"personId\\\":\\\"9000398967\\\",\\\"tenantId\\\":\\\"400\\\"}\",\n" +
|
||||
" \"unitPerson\": [\n" +
|
||||
" {\n" +
|
||||
" \"unit\": \"四川星腾贸易有限公司(总包单位)\",\n" +
|
||||
" \"person\": \"张鹏辉-职员\"\n" +
|
||||
" }\n" +
|
||||
" ],\n" +
|
||||
" \"stampOuId\": 6158,\n" +
|
||||
" \"pdfFileUrl\": \"https://axzo-public.oss-cn-chengdu.aliyuncs.com/cms/cms_test/55bc64fb1a3e4185a0bb076fef0267e9.pdf\",\n" +
|
||||
" \"workspaceName\": \"test-0925项目2\",\n" +
|
||||
" \"attach\": \"null\",\n" +
|
||||
" \"stampContractId\": \"yDtB3UUckpxbd98wUxfgmNJRzSKgRqTy\",\n" +
|
||||
" \"happenTime\": \"2025.04.25\",\n" +
|
||||
" \"[_ACTIVITY_INFO_SNAPSHOT_]NODE_STARTER\": [\n" +
|
||||
" {\n" +
|
||||
" \"assignee\": null,\n" +
|
||||
" \"assigneeType\": null,\n" +
|
||||
" \"assignerName\": \"宋爱弟\",\n" +
|
||||
" \"avatar\": \"https://axzo-app.oss-cn-chengdu.aliyuncs.com/face/face_test/b048b3d99ef048739a258e48f7feb3dd.jpg\",\n" +
|
||||
" \"nodeId\": null,\n" +
|
||||
" \"ouId\": \"6158\",\n" +
|
||||
" \"personId\": \"9000398967\",\n" +
|
||||
" \"tenantId\": \"400\"\n" +
|
||||
" }\n" +
|
||||
" ],\n" +
|
||||
" \"[_ACTIVITY_INFO_SNAPSHOT_]node_289121268979\": [\n" +
|
||||
" {\n" +
|
||||
" \"assignee\": null,\n" +
|
||||
" \"assigneeType\": null,\n" +
|
||||
" \"assignerName\": null,\n" +
|
||||
" \"avatar\": null,\n" +
|
||||
" \"nodeId\": null,\n" +
|
||||
" \"ouId\": \"6158\",\n" +
|
||||
" \"personId\": \"9000400266\",\n" +
|
||||
" \"tenantId\": \"398\"\n" +
|
||||
" }\n" +
|
||||
" ],\n" +
|
||||
" \"_TASK_COMPLETE_TYPE202504291615200000081\": \"DELETED\",\n" +
|
||||
" \"relationArea\": \"\",\n" +
|
||||
" \"[_SIGNATURE_COLLECTION_]\": [\n" +
|
||||
" {\n" +
|
||||
" \"activityId\": \"NODE_STARTER\",\n" +
|
||||
" \"activityName\": \"发起人\",\n" +
|
||||
" \"signatures\": []\n" +
|
||||
" }\n" +
|
||||
" ],\n" +
|
||||
" \"visaId\": 904,\n" +
|
||||
" \"[_INTERNAL_PROCESS_WORKSPACE_TYPE]\": 1,\n" +
|
||||
" \"initiatorName\": \"宋爱弟\",\n" +
|
||||
" \"[_CLOSE_PROCESS_ASSIGNER_]\": {\n" +
|
||||
" \"assignee\": \"2008269\",\n" +
|
||||
" \"assigneeType\": \"3\",\n" +
|
||||
" \"assignerName\": \"高志鹏\",\n" +
|
||||
" \"avatar\": \"https://axzo-public.oss-cn-chengdu.aliyuncs.com/banner/banner_test/5c441569ee524c208295de72b64863d4.jpg\",\n" +
|
||||
" \"nodeId\": null,\n" +
|
||||
" \"ouId\": \"6158\",\n" +
|
||||
" \"personId\": \"9000400266\",\n" +
|
||||
" \"tenantId\": \"400\"\n" +
|
||||
" },\n" +
|
||||
" \"[_CREATE_INSTANCE_PARAMS]\": \"{\\\"processDefinitionKey\\\":\\\"bgqzyy\\\",\\\"tenantId\\\":\\\"398\\\",\\\"specifyAssignerMap\\\":{\\\"node_289121268979\\\":[{\\\"personId\\\":\\\"9000400266\\\",\\\"tenantId\\\":\\\"398\\\",\\\"ouId\\\":\\\"6158\\\"}]},\\\"variables\\\":{\\\"visaId\\\":904,\\\"stampOuId\\\":6158,\\\"topic\\\":\\\"123123\\\",\\\"initiatorUnitName\\\":\\\"四川星腾贸易有限公司\\\",\\\"stampType\\\":\\\"OFFICIAL\\\",\\\"stampTypeDesc\\\":\\\"公章\\\",\\\"stampRecipient\\\":\\\"yDtB3UUckpxbd98vUxfgmNJ8GHnqu6Sd\\\",\\\"stampContractId\\\":\\\"yDtB3UUckpxbd98wUxfgmNJRzSKgRqTy\\\",\\\"pdfFileUrl\\\":\\\"https://axzo-public.oss-cn-chengdu.aliyuncs.com/cms/cms_test/55bc64fb1a3e4185a0bb076fef0267e9.pdf\\\",\\\"initiatorName\\\":\\\"宋爱弟\\\",\\\"visaType\\\":\\\"DESIGN_CHANGE\\\",\\\"visaTypeDesc\\\":\\\"设计变更\\\",\\\"[_INTERNAL_PROCESS_WORKSPACE_TYPE]\\\":1,\\\"[_INTERNAL_PROCESS_BIZ_TYPE]\\\":\\\"approval\\\",\\\"[_INTERNAL_INITIATOR_]\\\":\\\"{\\\\\\\"assignerName\\\\\\\":\\\\\\\"宋爱弟\\\\\\\",\\\\\\\"avatar\\\\\\\":\\\\\\\"https://axzo-app.oss-cn-chengdu.aliyuncs.com/face/face_test/b048b3d99ef048739a258e48f7feb3dd.jpg\\\\\\\",\\\\\\\"ouId\\\\\\\":\\\\\\\"6158\\\\\\\",\\\\\\\"personId\\\\\\\":\\\\\\\"9000398967\\\\\\\",\\\\\\\"tenantId\\\\\\\":\\\\\\\"400\\\\\\\"}\\\",\\\"[_BIZ_ORG_RELATION_]\\\":{},\\\"[_WORKFLOW_ENGINE_VERSION_]\\\":\\\"1.5.2\\\",\\\"[_PENDING_VARIABLES]\\\":{\\\"visaId\\\":904,\\\"stampOuId\\\":6158,\\\"topic\\\":\\\"123123\\\",\\\"initiatorUnitName\\\":\\\"四川星腾贸易有限公司\\\",\\\"stampType\\\":\\\"OFFICIAL\\\",\\\"stampTypeDesc\\\":\\\"公章\\\",\\\"stampRecipient\\\":\\\"yDtB3UUckpxbd98vUxfgmNJ8GHnqu6Sd\\\",\\\"stampContractId\\\":\\\"yDtB3UUckpxbd98wUxfgmNJRzSKgRqTy\\\",\\\"pdfFileUrl\\\":\\\"https://axzo-public.oss-cn-chengdu.aliyuncs.com/cms/cms_test/55bc64fb1a3e4185a0bb076fef0267e9.pdf\\\",\\\"initiatorName\\\":\\\"宋爱弟\\\",\\\"visaType\\\":\\\"DESIGN_CHANGE\\\",\\\"visaTypeDesc\\\":\\\"设计变更\\\"},\\\"[_INTERNAL_PROCESS_AGENT]\\\":false,\\\"[_PROCESS_OWNERSHIP_APPLICATION_]\\\":\\\"nanopart\\\",\\\"[_INITIATOR_SPECIFY_]\\\":{\\\"node_289121268979\\\":[{\\\"personId\\\":\\\"9000400266\\\",\\\"tenantId\\\":\\\"398\\\",\\\"ouId\\\":\\\"6158\\\"}]}},\\\"signVariables\\\":{},\\\"pendingVariables\\\":{\\\"visaId\\\":904,\\\"stampOuId\\\":6158,\\\"topic\\\":\\\"123123\\\",\\\"initiatorUnitName\\\":\\\"四川星腾贸易有限公司\\\",\\\"stampType\\\":\\\"OFFICIAL\\\",\\\"stampTypeDesc\\\":\\\"公章\\\",\\\"stampRecipient\\\":\\\"yDtB3UUckpxbd98vUxfgmNJ8GHnqu6Sd\\\",\\\"stampContractId\\\":\\\"yDtB3UUckpxbd98wUxfgmNJRzSKgRqTy\\\",\\\"pdfFileUrl\\\":\\\"https://axzo-public.oss-cn-chengdu.aliyuncs.com/cms/cms_test/55bc64fb1a3e4185a0bb076fef0267e9.pdf\\\",\\\"initiatorName\\\":\\\"宋爱弟\\\",\\\"visaType\\\":\\\"DESIGN_CHANGE\\\",\\\"visaTypeDesc\\\":\\\"设计变更\\\"},\\\"cooperationOrg\\\":{},\\\"businessKey\\\":\\\"904\\\",\\\"initiator\\\":{\\\"assignerName\\\":\\\"宋爱弟\\\",\\\"personId\\\":\\\"9000398967\\\",\\\"tenantId\\\":\\\"400\\\",\\\"ouId\\\":\\\"6158\\\",\\\"avatar\\\":\\\"https://axzo-app.oss-cn-chengdu.aliyuncs.com/face/face_test/b048b3d99ef048739a258e48f7feb3dd.jpg\\\"},\\\"async\\\":false,\\\"startFormVariables\\\":{\\\"no\\\":\\\"123\\\",\\\"reason\\\":\\\"123\\\",\\\"relationArea\\\":\\\"\\\",\\\"contractNo\\\":\\\"111\\\",\\\"unitPerson\\\":[{\\\"unit\\\":\\\"四川星腾贸易有限公司(总包单位)\\\",\\\"person\\\":\\\"张鹏辉-职员\\\"}],\\\"relationProfessional\\\":\\\"\\\",\\\"topic\\\":\\\"123123\\\",\\\"contextDescription\\\":[],\\\"workspaceName\\\":\\\"test-0925项目2\\\",\\\"contractName\\\":\\\"111\\\",\\\"happenTime\\\":\\\"2025.04.25\\\",\\\"relationProject\\\":\\\"0925工程\\\"}}\",\n" +
|
||||
" \"visaType\": \"DESIGN_CHANGE\",\n" +
|
||||
" \"[_WORKFLOW_ENGINE_VERSION_]\": \"1.5.2\",\n" +
|
||||
" \"[_BIZ_ORG_RELATION_]\": {\n" +
|
||||
" \"orgScopes\": [],\n" +
|
||||
" \"workerTeamScopes\": []\n" +
|
||||
" },\n" +
|
||||
" \"stampRecipient\": \"yDtB3UUckpxbd98vUxfgmNJ8GHnqu6Sd\",\n" +
|
||||
" \"stampTypeDesc\": \"公章\",\n" +
|
||||
" \"relationProfessional\": \"\",\n" +
|
||||
" \"contextDescription\": [],\n" +
|
||||
" \"topic\": \"123123\",\n" +
|
||||
" \"[_PENDING_VARIABLES]\": {\n" +
|
||||
" \"visaId\": 904,\n" +
|
||||
" \"stampOuId\": 6158,\n" +
|
||||
" \"topic\": \"123123\",\n" +
|
||||
" \"initiatorUnitName\": \"四川星腾贸易有限公司\",\n" +
|
||||
" \"stampType\": \"OFFICIAL\",\n" +
|
||||
" \"stampTypeDesc\": \"公章\",\n" +
|
||||
" \"stampRecipient\": \"yDtB3UUckpxbd98vUxfgmNJ8GHnqu6Sd\",\n" +
|
||||
" \"stampContractId\": \"yDtB3UUckpxbd98wUxfgmNJRzSKgRqTy\",\n" +
|
||||
" \"pdfFileUrl\": \"https://axzo-public.oss-cn-chengdu.aliyuncs.com/cms/cms_test/55bc64fb1a3e4185a0bb076fef0267e9.pdf\",\n" +
|
||||
" \"initiatorName\": \"宋爱弟\",\n" +
|
||||
" \"visaType\": \"DESIGN_CHANGE\",\n" +
|
||||
" \"visaTypeDesc\": \"设计变更\"\n" +
|
||||
" },\n" +
|
||||
" \"relationProject\": \"0925工程\"\n" +
|
||||
" },\n" +
|
||||
" \"workflowEngineVersion\": \"1.5.2\"\n" +
|
||||
" }", ProcessInstanceDTO.class);
|
||||
completeVisaChangeStampHandler.onCompleted(dto);
|
||||
}
|
||||
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@ -17,17 +17,21 @@ import cn.axzo.nanopart.visa.api.request.VisaChangePageSearchReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaChangeTempCreateReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaDetailByIdRequest;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaInitiatorListReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaPayApproveCreateReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaSearchReq;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangeDiscussCreateResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangeInitiatorResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangePageSearchResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangeRelationOrdersResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaSearchResp;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
@ -194,4 +198,20 @@ public interface ChangeRecordApi {
|
||||
@PostMapping("/api/visa/change/update")
|
||||
ApiResult<Void> update(@RequestBody @Validated UpdateVisaChangeReq req);
|
||||
|
||||
/**
|
||||
* 价款表单提交创建审批
|
||||
*
|
||||
* @param req
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/api/visa/pay/approveCreate")
|
||||
ApiResult<Void> approveCreateVisaPay(@Validated @RequestBody VisaPayApproveCreateReq req);
|
||||
|
||||
/**
|
||||
* 根据签证id获取关联的单据信息
|
||||
* @param visaId
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/api/visa/change/relationOrdersById")
|
||||
ApiResult<VisaChangeRelationOrdersResp> getRelationOrdersById(@RequestParam("visaId") Long visaId);
|
||||
}
|
||||
|
||||
@ -91,10 +91,29 @@ public interface VisaConstant {
|
||||
String FORM_FIELD_RELATION_VISA_ORDER = "relationVisaOrders";
|
||||
// 附件
|
||||
String FORM_FIELD_ATTACH = "attach";
|
||||
// 合同名称
|
||||
String FORM_CONTRACT_NAME = "contractName";
|
||||
// 合同编号
|
||||
String FORM_CONTRACT_NO = "contractNo";
|
||||
|
||||
// ***************** IM-Group-Tips ******************
|
||||
String IM_GROUP_OWNER_TIPS = "群成员共计%d人,收到回复%d人,其中%d人同意,%d人拒绝。";
|
||||
String IM_GROUP_PARTICIPATE_TIPS = "由 %s 提交的【%s】,需要你处理,是否同意?";
|
||||
String IM_GROUP_PARTICIPATE_TIPS_OPERATED = "你已%s由 %s 提交的【%s】";
|
||||
|
||||
// ********************* 价款审批表单 ********************
|
||||
// 完工确认单编号
|
||||
String FORM_PAY_COMPLETE_WORKER_NO = "completeWorkNo";
|
||||
|
||||
// 确认事项
|
||||
String FORM_PAY_CONFIRM_MATTER = "confirmMatter";
|
||||
// 实际施工完工时间
|
||||
String FORM_PAY_ACTUAL_CONSTRUCTION_COMPLETE_DATE = "actualConstructionCompleteDate";
|
||||
// 申报金额(元)
|
||||
String FORM_PAY_DECLARED_AMOUNT = "declaredAmount";
|
||||
//审定金额(元)
|
||||
String FORM_PAY_APPROVAL_AMOUNT = "approvalAmount";
|
||||
// 价款表单附件
|
||||
String FORM_PAY_COMPLETE_CONFIRM_ATTACH = "completeConfirmAttach";
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,50 @@
|
||||
package cn.axzo.nanopart.visa.api.enums;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
/**
|
||||
* 审批单状态
|
||||
*
|
||||
* @author chenwenjian
|
||||
* @version 1.0
|
||||
* @date 2025/4/18 10:06
|
||||
*/
|
||||
public enum VisaApprovalStatusEnum {
|
||||
|
||||
// 立项审批中
|
||||
PROJECT_APPROVING("立项审批中"),
|
||||
// 立项已驳回
|
||||
PROJECT_APPROVAL_REJECTED("立项已驳回"),
|
||||
// 立项已通过
|
||||
PROJECT_APPROVAL_PASSED("立项已通过"),
|
||||
// 价款审批中
|
||||
AMOUNT_APPROVING("价款审批中"),
|
||||
// 价款已驳回
|
||||
AMOUNT_APPROVAL_REJECTED("价款已驳回"),
|
||||
// 价款已确认
|
||||
AMOUNT_APPROVAL_PASSED("价款已确认"),
|
||||
;
|
||||
|
||||
private final String desc;
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
VisaApprovalStatusEnum(String desc) {
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public static VisaApprovalStatusEnum getByName(String name) {
|
||||
if (StringUtils.isBlank(name)) {
|
||||
return null;
|
||||
}
|
||||
for (VisaApprovalStatusEnum value : values()) {
|
||||
if (value.name().equals(name)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@ -30,9 +30,10 @@ public enum VisaButtonTypeEnum {
|
||||
UPDATE("update", "编辑",55),
|
||||
DELETE("delete", "删除",50),
|
||||
FORBID("forbid", "作废",5),
|
||||
EXECUTE("execute", "发起执行",40),
|
||||
// EXECUTE("execute", "发起执行",40),
|
||||
REDECISION("redecision", "重新发起",0),
|
||||
TO_APPROVE("to_approve", "提交审批",30),
|
||||
TO_APPROVE("to_approve", "提交立项审批",30),
|
||||
TO_PAY_APPROVE("to_pay_approve", "申请价款确认", 30),
|
||||
AGAIN_TO_APPROVE("again_to_approve", "重新提交审批",20),
|
||||
AGREE("agree", "同意",0),
|
||||
REJECT("reject", "拒绝",0),
|
||||
@ -65,31 +66,31 @@ public enum VisaButtonTypeEnum {
|
||||
// 发起人不同状态按钮权限-详情页
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.TO_REPORT.name(), Sets.newLinkedHashSet(Arrays.asList(UPDATE, DELETE)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.REPORT_FROM_APPROVE.name(), Sets.newLinkedHashSet(Arrays.asList(UPDATE, FORBID)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.DECIDING.name(), Sets.newLinkedHashSet(Arrays.asList(UPDATE, EXECUTE, TO_APPROVE, FORBID, CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.DECIDING_FROM_APPROVE.name(), Sets.newLinkedHashSet(Arrays.asList(UPDATE, EXECUTE, TO_APPROVE, FORBID, CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.EXECUTING.name(), Sets.newLinkedHashSet(Arrays.asList(UPDATE, TO_APPROVE, FORBID, CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.APPROVING.name(), Sets.newLinkedHashSet(Arrays.asList(UPLOAD_FILE, FORBID, CHAT_GROUP_RECORD, APPROVAL_RECORD,PRINT)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.COMPLETED.name(), Sets.newLinkedHashSet(Arrays.asList(UPLOAD_FILE, CHAT_GROUP_RECORD, APPROVAL_RECORD,PRINT)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.FORBIDED.name(), Sets.newLinkedHashSet(Arrays.asList(CHAT_GROUP_RECORD, APPROVAL_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.DECIDING.name(), Sets.newLinkedHashSet(Arrays.asList(UPDATE, TO_APPROVE, FORBID, CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.DECIDING_FROM_APPROVE.name(), Sets.newLinkedHashSet(Arrays.asList(UPDATE, TO_APPROVE, FORBID, CHAT_GROUP_RECORD)));
|
||||
// bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.EXECUTING.name(), Sets.newLinkedHashSet(Arrays.asList(UPDATE, TO_APPROVE, FORBID, CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.APPROVING.name(), Sets.newLinkedHashSet(Arrays.asList(UPLOAD_FILE, CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.COMPLETED.name(), Sets.newLinkedHashSet(Arrays.asList(CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.FORBIDED.name(), Sets.newLinkedHashSet(Arrays.asList(CHAT_GROUP_RECORD)));
|
||||
|
||||
// 决策人不同状态按钮权限-详情页
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.DECIDING.name(), Sets.newLinkedHashSet(Arrays.asList(UPDATE, CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.DECIDING_FROM_APPROVE.name(), Sets.newLinkedHashSet(Arrays.asList(UPDATE, CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.EXECUTING.name(), Sets.newLinkedHashSet(Arrays.asList(UPDATE, CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.APPROVING.name(), Sets.newLinkedHashSet(Arrays.asList(UPLOAD_FILE, CHAT_GROUP_RECORD, APPROVAL_RECORD,PRINT)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.COMPLETED.name(), Sets.newLinkedHashSet(Arrays.asList(UPLOAD_FILE, CHAT_GROUP_RECORD, APPROVAL_RECORD,PRINT)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.FORBIDED.name(), Sets.newLinkedHashSet(Arrays.asList(CHAT_GROUP_RECORD, APPROVAL_RECORD)));
|
||||
// bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.EXECUTING.name(), Sets.newLinkedHashSet(Arrays.asList(UPDATE, CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.APPROVING.name(), Sets.newLinkedHashSet(Arrays.asList(UPLOAD_FILE, CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.COMPLETED.name(), Sets.newLinkedHashSet(Arrays.asList(CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.FORBIDED.name(), Sets.newLinkedHashSet(Arrays.asList(CHAT_GROUP_RECORD)));
|
||||
|
||||
//审核人不同状态按钮权限-详情页
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.APPROVE.name() + VisaStatusEnum.APPROVING.name(), Sets.newLinkedHashSet(Arrays.asList(TO_HANDLE, CHAT_GROUP_RECORD,PRINT)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.APPROVE.name() + VisaStatusEnum.APPROVING.name(), Sets.newLinkedHashSet(Arrays.asList(TO_HANDLE, CHAT_GROUP_RECORD)));
|
||||
|
||||
//其他不同状态按钮权限-详情页
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.DECIDING.name(), Sets.newLinkedHashSet(Arrays.asList(CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.DECIDING_FROM_APPROVE.name(), Sets.newLinkedHashSet(Arrays.asList(CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.EXECUTING.name(), Sets.newLinkedHashSet(Arrays.asList(CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.APPROVING.name(), Sets.newLinkedHashSet(Arrays.asList(PRINT, CHAT_GROUP_RECORD, APPROVAL_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.COMPLETED.name(), Sets.newLinkedHashSet(Arrays.asList(PRINT, CHAT_GROUP_RECORD, APPROVAL_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.FORBIDED.name(), Sets.newLinkedHashSet(Arrays.asList(CHAT_GROUP_RECORD, APPROVAL_RECORD)));
|
||||
// bizTypeBtnMap.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.EXECUTING.name(), Sets.newLinkedHashSet(Arrays.asList(CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.APPROVING.name(), Sets.newLinkedHashSet(Arrays.asList(CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.COMPLETED.name(), Sets.newLinkedHashSet(Arrays.asList(CHAT_GROUP_RECORD)));
|
||||
bizTypeBtnMap.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.FORBIDED.name(), Sets.newLinkedHashSet(Arrays.asList(CHAT_GROUP_RECORD)));
|
||||
|
||||
//[打印]按钮是通过OMS统一配置,故此处不处理
|
||||
|
||||
@ -105,7 +106,7 @@ public enum VisaButtonTypeEnum {
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.REPORT_FROM_APPROVE.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL, UPDATE)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.DECIDING.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL, UPDATE)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.DECIDING_FROM_APPROVE.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL, UPDATE)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.EXECUTING.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL, UPDATE)));
|
||||
// bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.EXECUTING.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL, UPDATE)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.APPROVING.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.COMPLETED.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CREATE.name() + VisaStatusEnum.FORBIDED.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL)));
|
||||
@ -116,7 +117,7 @@ public enum VisaButtonTypeEnum {
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.REPORT_FROM_APPROVE.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.DECIDING.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL, UPDATE)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.DECIDING_FROM_APPROVE.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL, UPDATE)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.EXECUTING.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL, UPDATE)));
|
||||
// bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.EXECUTING.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL, UPDATE)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.APPROVING.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.COMPLETED.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.CONFIRM.name() + VisaStatusEnum.FORBIDED.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL)));
|
||||
@ -126,7 +127,7 @@ public enum VisaButtonTypeEnum {
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.REPORT_FROM_APPROVE.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.DECIDING.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.DECIDING_FROM_APPROVE.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.EXECUTING.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL)));
|
||||
// bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.EXECUTING.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.APPROVING.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.COMPLETED.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL)));
|
||||
bizTypeBtnMapWhenPage.put(VisaConfirmBizTypeEnum.OTHER.name() + VisaStatusEnum.FORBIDED.name(), Sets.newLinkedHashSet(Arrays.asList(DETAIL)));
|
||||
|
||||
@ -17,7 +17,8 @@ public enum VisaChangeFieldEnum {
|
||||
AMOUNT_CHANGE("amountChange", "金额变化"),
|
||||
INITIATOR("initiator", "发起人"),
|
||||
CREATE_AT("happenTime", "提出时间"),
|
||||
APPROVAL_COMPLETE_TIME("approvalCompleteTime", "审批通过时间"),
|
||||
APPROVAL_COMPLETE_TIME("approvalCompleteTime", "立项审批通过时间"),
|
||||
APPROVAL_COMPLETE_TIME_PAY("approvalCompleteTimePay,", "价款审批通过时间"),
|
||||
RELATION_PROJECT("relationProject", "所属工程"),
|
||||
;
|
||||
|
||||
|
||||
@ -22,20 +22,21 @@ public enum VisaLogTypeEnum {
|
||||
EDIT_AMOUNT("edit_amount", "编辑金额变化","%s编辑金额变化","原值:金额变化:%s;<br> 新值:金额变化:%s;"),
|
||||
UPLOAD_FILE("upload_file", "上传附件","%s上传附件","%s上传%d个附件:%s"),
|
||||
DELETE_UPLOAD_FILE("delete_upload_file", "删除附件","%s删除附件","%s删除%d个附件:%s"),
|
||||
TO_EXECUTE("to_execute", "发起执行","发起执行", "%s发起执行"),
|
||||
TO_APPRROVE("to_apprrove", "发起审批","发起%s审批", "%s发起%s审批"),
|
||||
APPROVED_AGRESS("approved_agress", "审批流:某审批人审批通过","%s审批通过", "%s审批通过"),
|
||||
// TO_EXECUTE("to_execute", "发起执行","发起执行", "%s发起执行"),
|
||||
TO_APPRROVE("to_apprrove", "发起审批", "发起%s", "%s发起%s"),
|
||||
APPROVED_AGRESS("approved_agress", "审批流:某审批人审批通过", "%s审批通过", "%s:%s审批通过"),
|
||||
FORBIDED("forbided", "单据作废","单据废止", "%s操作废止单据"),
|
||||
REVERT_APPROVE("revert_approve", "审批流:撤回审批","审批流程撤回", "%s撤回审批流程"),
|
||||
REJECT_APPROVE("reject_approve", "审批流:已驳回","%s驳回审批", "%s已驳回,原因为%s"),
|
||||
TRANSMIT_APPROVE("transmit_approve", "审批流操作:转交","审批人变更", "%s将审批转交至%s,原因为%s"),
|
||||
REVERT_APPROVE("revert_approve", "审批流:撤回审批", "%s撤回", "%s撤回%s"),
|
||||
REJECT_APPROVE("reject_approve", "审批流:已驳回", "%s驳回%s", "%s已驳回,原因为%s"),
|
||||
TRANSMIT_APPROVE("transmit_approve", "审批流操作:转交", "审批人变更", "%s将%s转交至%s,原因为%s"),
|
||||
FALLBACK_APPROVE("fallback_approve", "审批流操作:回退","%s回退审批", "%s回退审批至审批节点:%s"),
|
||||
APPROVE_COMPLETED("approved_completed", "审批流:审批通过","%s通过", "%s流程已完成"),
|
||||
REQUEST_STAMP("request_stamp", "发起用印申请", "%s发起用印申请", "%s发起电子印章用印申请"),
|
||||
CANCEL_STAMP("stamp_canceled", "操作取消用印","%s取消用印", "%s操作取消单据用印申请"),
|
||||
APPROVE_COMPLETED("approved_completed", "审批流:审批通过", "%s通过", "%s已通过"),
|
||||
APPROVE_ABORT("approved_abort", "审批流:中止", "%s中止", "因系统原因,%s已中止"),
|
||||
REQUEST_STAMP("request_stamp", "发起用印申请", "%s发起%s用印申请", "%s发起电子印章用印申请"),
|
||||
CANCEL_STAMP("stamp_canceled", "操作取消用印","%s取消%s用印", "%s操作取消单据用印申请"),
|
||||
TX_CANCEL_STAMP("tx_stamp_canceled", "腾讯小程序撤销合同", "签署人撤销合同", "存在签署人撤销合同,单据状态流转为“未用印”"),
|
||||
COMPLETE_STAMP("stamp_complete", "操作完成用印","%s完成用印", "%s操作完成用印"),
|
||||
AUTO_COMPLETE_STAMP("stamp_auto_complete", "电子签合同状态\"签署完成\"回调时","用印成功", "单据用印申请均签署通过!"),
|
||||
COMPLETE_STAMP("stamp_complete", "操作完成用印","%s完成%s用印", "%s操作完成用印"),
|
||||
AUTO_COMPLETE_STAMP("stamp_auto_complete", "电子签合同状态\"签署完成\"回调时","用印成功", "%s用印申请均签署通过!"),
|
||||
;
|
||||
|
||||
/**
|
||||
|
||||
@ -0,0 +1,13 @@
|
||||
package cn.axzo.nanopart.visa.api.enums;
|
||||
|
||||
/**
|
||||
* 流程审批阶段 (临时方案)
|
||||
*
|
||||
* @author yanglin
|
||||
*/
|
||||
public enum VisaProcessPhase {
|
||||
// 立项审批
|
||||
PROJECT,
|
||||
// 完工价款确认审批
|
||||
PAYMENT
|
||||
}
|
||||
@ -21,17 +21,22 @@ public enum VisaRelationFieldEnum {
|
||||
VISA_ORDER("visa_order", "变洽签变更单"),
|
||||
ATTACHMENT("attachment", "附件"),
|
||||
PROCESS_INSTANCE_OF_VISA("process_instance_of_visa", "变洽签审批实例"),
|
||||
PROCESS_INSTANCE_OF_PAY("process_instance_of_pay", "价款审批实例"),
|
||||
PROCESS_INSTANCE_OF_ESS("process_instance_of_ess", "用印审批实例"),
|
||||
PROCESS_INSTANCE_OF_ESS_PAY("process_instance_of_ess_pay", "用印审批实例"),
|
||||
ORDER("order", "单据"),
|
||||
IM_GROUP_PARTICIPATE("im_group_participate", "im群聊参与人"),
|
||||
PRINT_PDF_FILE("print_pdf_file", "打印生成的PDF文件"),
|
||||
PRINT_PDF_FILE_PAY("print_pdf_file_pay", "打印生成的PDF文件"),
|
||||
ESS_RECIPIENT_ID_MAP("ess_recipient_id_map", "电子签章单位与签证位置的映射"),
|
||||
ESS_RECIPIENT_ID_MAP_PAY("ess_recipient_id_map_pay", "电子签章单位与签证位置的映射"),
|
||||
;
|
||||
private final String code;
|
||||
private final String desc;
|
||||
|
||||
/**
|
||||
* 是否附件类型
|
||||
*
|
||||
* @param name 枚举的名称
|
||||
* @return true:是附件类型;false:不是附件类型
|
||||
*/
|
||||
|
||||
@ -22,8 +22,8 @@ public enum VisaStatusEnum {
|
||||
|
||||
TO_REPORT("to_report", "待提报", null),
|
||||
DECIDING("deciding", "决策中", VisaLogTypeEnum.CHAT_GROUP),
|
||||
EXECUTING("executing","执行中", VisaLogTypeEnum.TO_EXECUTE),
|
||||
APPROVING("approving","审批中", VisaLogTypeEnum.TO_APPRROVE),
|
||||
// EXECUTING("executing","执行中", VisaLogTypeEnum.TO_EXECUTE),
|
||||
APPROVING("approving","处理中", VisaLogTypeEnum.TO_APPRROVE),
|
||||
COMPLETED("completed","已完成",VisaLogTypeEnum.APPROVE_COMPLETED),
|
||||
FORBIDED("forbided","已废除",VisaLogTypeEnum.FORBIDED),
|
||||
REPORT_FROM_APPROVE("report_from_approve","待提报(审批驳回)", null),
|
||||
@ -33,7 +33,8 @@ public enum VisaStatusEnum {
|
||||
/**
|
||||
* 可以编辑变更签证单的状态
|
||||
*/
|
||||
private static Set<VisaStatusEnum> editFormStatus = Sets.newHashSet(DECIDING, EXECUTING, DECIDING_FROM_APPROVE);
|
||||
// private static Set<VisaStatusEnum> editFormStatus = Sets.newHashSet(DECIDING, EXECUTING, DECIDING_FROM_APPROVE);
|
||||
private static Set<VisaStatusEnum> editFormStatus = Sets.newHashSet(DECIDING, DECIDING_FROM_APPROVE);
|
||||
|
||||
/**
|
||||
* 无效状态集合,审批不通过到待提报/已废除
|
||||
|
||||
@ -5,6 +5,8 @@ import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
@ -19,7 +21,9 @@ public enum VisaTypeEnum {
|
||||
|
||||
DESIGN_CHANGE("bgqz01", "design_change", "设计变更"),
|
||||
TECHNOLOGY_APPROVED("bgqz02", "technology_approved", "技术核定"),
|
||||
PROJECT_VISA("bgqz03", "project_visa","工程签证");
|
||||
PROJECT_VISA("bgqz03", "project_visa", "工程签证"),
|
||||
PAY_CONFIRM("wgjkqr", "pay_confirm", "价款确认"),
|
||||
;
|
||||
|
||||
private final String processDefinitionKey;
|
||||
private final String code;
|
||||
@ -42,4 +46,11 @@ public enum VisaTypeEnum {
|
||||
public static Set<VisaTypeEnum> fetchProjectVisaSet() {
|
||||
return projectVisaSet;
|
||||
}
|
||||
|
||||
public static VisaTypeEnum valueOfProcessDefinitionKey(String processDefinitionKey) {
|
||||
return Arrays.stream(VisaTypeEnum.values())
|
||||
.filter(i -> Objects.equals(i.getProcessDefinitionKey(), processDefinitionKey))
|
||||
.findAny()
|
||||
.orElse(null);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,6 +3,7 @@ package cn.axzo.nanopart.visa.api.request;
|
||||
import cn.axzo.framework.domain.ServiceException;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
@ -86,7 +87,7 @@ public class ChangeStatusRequest {
|
||||
*/
|
||||
private boolean editFormFlag = true;
|
||||
|
||||
|
||||
private VisaTypeEnum visaType;
|
||||
public void check() {
|
||||
if (Objects.nonNull(logType) && !VisaLogTypeEnum.isApproveNotAgree(logType)) {
|
||||
throw new ServiceException("不是审核不通过日志");
|
||||
|
||||
@ -1,5 +1,8 @@
|
||||
package cn.axzo.nanopart.visa.api.request;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaProcessPhase;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
@ -7,8 +10,6 @@ import lombok.Data;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@ -40,6 +41,14 @@ public class UpdateVisaChangeReq {
|
||||
*/
|
||||
private String scene;
|
||||
|
||||
/**
|
||||
* 审批截断. PROJECT: 立项审批, PAYMENT: 完工价款确认审批
|
||||
*/
|
||||
@NotNull(message = "phase不能为空")
|
||||
private VisaProcessPhase phase;
|
||||
|
||||
private String context;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public enum VisaStampAction {
|
||||
@ -48,7 +57,8 @@ public class UpdateVisaChangeReq {
|
||||
CANCEL("取消用印"),
|
||||
TX_CANCEL("腾讯侧撤销合同"),
|
||||
// 所有审批流审批完成时,自动完成审批,要区别手动完成用印操作,记录日志
|
||||
AUTO_COMPLETE("自动完成用印");
|
||||
AUTO_COMPLETE("自动完成用印"),
|
||||
ALL_PROCESS_REJECTED("用印申请全被驳回");
|
||||
|
||||
private String desc;
|
||||
}
|
||||
|
||||
@ -84,11 +84,17 @@ public class VisaChangePageSearchReq {
|
||||
private List<Date> happenTime;
|
||||
|
||||
/**
|
||||
* 审批完成时间区间
|
||||
* 立项通过时间区间
|
||||
* 0:起始时间 1:结束时间
|
||||
*/
|
||||
private List<Date> approveCompletedDate;
|
||||
|
||||
/**
|
||||
* 价款确认通过时间区间
|
||||
* 0:起始时间 1:结束时间
|
||||
*/
|
||||
private List<Date> approvalCompleteTimePay;
|
||||
|
||||
private Long page;
|
||||
|
||||
private Long pageSize;
|
||||
|
||||
@ -164,6 +164,16 @@ public class VisaChangeTempCreateReq {
|
||||
*/
|
||||
private Long operatorPersonId;
|
||||
|
||||
/**
|
||||
* 业务合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 业务合同编号
|
||||
*/
|
||||
private String contractNo;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
|
||||
@ -0,0 +1,88 @@
|
||||
package cn.axzo.nanopart.visa.api.request;
|
||||
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaBillTypeEnum;
|
||||
import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.hibernate.validator.constraints.Length;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import javax.validation.constraints.Size;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 价款审批表单提交
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-04-18 17:48
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class VisaPayApproveCreateReq {
|
||||
/**
|
||||
* 变洽签主业务 ID
|
||||
*/
|
||||
@ApiModelProperty(value = "变洽签主业务 ID")
|
||||
@NotNull(message = "变洽签业务 ID 不能为空")
|
||||
private Long visaId;
|
||||
/**
|
||||
* 完工确认编号
|
||||
*/
|
||||
@NotBlank(message = "完工确认编号不能为空")
|
||||
@Length(max = 100, message = "完工确认编号最多 100 字")
|
||||
private String completeWorkNo;
|
||||
|
||||
|
||||
/**
|
||||
* 实际施工完成时间
|
||||
*/
|
||||
@NotBlank(message = "实际施工完成时间不能为空")
|
||||
private String actualConstructionCompleteDate;
|
||||
/**
|
||||
* 申报金额
|
||||
*/
|
||||
@NotBlank(message = "申报金额不能为空")
|
||||
private String declaredAmount;
|
||||
|
||||
/**
|
||||
* 确认事项
|
||||
*/
|
||||
@NotBlank(message = "确认事项不能为空")
|
||||
@Length(max = 100, message = "确认事项最多 100 字")
|
||||
private String confirmMatter;
|
||||
|
||||
/**
|
||||
* 附件
|
||||
*/
|
||||
@ApiModelProperty(value = "附件")
|
||||
@Size(max = 30, message = "最多支持 30个附件")
|
||||
private List<UploadFieldDTO> attachments;
|
||||
|
||||
/**
|
||||
* 关联的单据,key: 单据类型,value: 单据id集合
|
||||
* <p>
|
||||
* TASK :任务单 RECTIFY :整改单 DESIGN_VISA:变更单
|
||||
* 只有变更签证类型即{@code type}为“技术核定”或“工程签证”时才可能会有关联变更单
|
||||
* </p>
|
||||
*
|
||||
* @see VisaBillTypeEnum
|
||||
*/
|
||||
private Map<String, List<VisaChangeTempCreateReq.OrderSimpleModel>> relationOrderMap;
|
||||
|
||||
/**
|
||||
* 操作人 OUID
|
||||
*/
|
||||
private Long operatorOuId;
|
||||
|
||||
/**
|
||||
* 操作人 personID
|
||||
*/
|
||||
private Long operatorPersonId;
|
||||
}
|
||||
@ -1,5 +1,7 @@
|
||||
package cn.axzo.nanopart.visa.api.request;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
@ -7,8 +9,6 @@ import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* 变洽签关联数据查询入参模型
|
||||
*
|
||||
|
||||
@ -1,17 +1,21 @@
|
||||
package cn.axzo.nanopart.visa.api.request;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.enums.EssSealType;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaProcessPhase;
|
||||
import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 用印申请入参模型
|
||||
*
|
||||
@ -55,6 +59,17 @@ public class VisaRequestStampReq {
|
||||
*/
|
||||
private Long operatorOuId;
|
||||
|
||||
/**
|
||||
* 审批截断. PROJECT: 立项审批, PAYMENT: 完工价款确认审批
|
||||
*/
|
||||
@NotNull(message = "phase不能为空")
|
||||
private VisaProcessPhase phase;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
package cn.axzo.nanopart.visa.api.response;
|
||||
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaApprovalStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaButtonTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStampStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
|
||||
import lombok.AllArgsConstructor;
|
||||
@ -11,6 +11,7 @@ import lombok.NoArgsConstructor;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
@ -58,15 +59,24 @@ public class VisaChangePageSearchResp {
|
||||
private Date happenTime;
|
||||
|
||||
/**
|
||||
* 审批实例 ID
|
||||
* 立项审批实例 ID
|
||||
*/
|
||||
private String approvalId;
|
||||
|
||||
/**
|
||||
* 最终审批时间
|
||||
* 立项审批通过时间
|
||||
*/
|
||||
private Date approvalCompleteTime;
|
||||
|
||||
/**
|
||||
* 价款确认审批实例 ID
|
||||
*/
|
||||
private String approvalIdPay;
|
||||
|
||||
/**
|
||||
* 价款确认审批通过时间
|
||||
*/
|
||||
private Date approvalCompleteTimePay;
|
||||
/**
|
||||
* 单据类型
|
||||
* <p>
|
||||
@ -104,20 +114,39 @@ public class VisaChangePageSearchResp {
|
||||
*/
|
||||
private String statusDesc;
|
||||
|
||||
/**
|
||||
* 用印状态
|
||||
* <p>
|
||||
* UNKNOWN:
|
||||
* UNPRINTED: 未用印,
|
||||
* WITH_PRINT: 用印中
|
||||
* USED_PRINTS: 已用印
|
||||
*/
|
||||
private VisaStampStatusEnum stampStatus;
|
||||
// /**
|
||||
// * 用印状态
|
||||
// * <p>
|
||||
// * UNKNOWN:
|
||||
// * UNPRINTED: 未用印,
|
||||
// * WITH_PRINT: 用印中
|
||||
// * USED_PRINTS: 已用印
|
||||
// */
|
||||
// private VisaStampStatusEnum stampStatus;
|
||||
//
|
||||
// /**
|
||||
// * 用印状态描述
|
||||
// */
|
||||
// private String stampStatusDesc;
|
||||
|
||||
/**
|
||||
* 用印状态描述
|
||||
* 审批流程状态
|
||||
* <p>
|
||||
* PROJECT_APPROVING: 立项审批中
|
||||
* PROJECT_APPROVAL_REJECTED: 立项已驳回
|
||||
* PROJECT_APPROVAL_PASSED: 立项已通过
|
||||
* AMOUNT_APPROVING: 价款审批中
|
||||
* AMOUNT_APPROVAL_REJECTED: 价款已驳回
|
||||
* AMOUNT_APPROVAL_PASSED: 价款已确认
|
||||
* @see VisaApprovalStatusEnum
|
||||
* <p>
|
||||
*/
|
||||
private String stampStatusDesc;
|
||||
private VisaApprovalStatusEnum visaApprovalStatus;
|
||||
|
||||
/**
|
||||
* 审批流程状态描述
|
||||
*/
|
||||
private String visaApprovalStatusDesc;
|
||||
|
||||
/**
|
||||
* 有符号的变更金额
|
||||
@ -146,12 +175,18 @@ public class VisaChangePageSearchResp {
|
||||
* DETAIL: 详情
|
||||
* UPLOAD_FILE: 上传附件
|
||||
* APPROVE_RECORD: 查看审批记录
|
||||
* TO_PAY_APPROVE: 申请价款确认
|
||||
* </p>
|
||||
*
|
||||
* @see VisaButtonTypeEnum
|
||||
*/
|
||||
private Set<VisaButtonTypeEnum> operateBtnSet;
|
||||
|
||||
/**
|
||||
* 区域集合
|
||||
*/
|
||||
private List<VisaDetailByIdResponse.RelationAreaDetail> relationAreaList;
|
||||
|
||||
public String getTypeDesc() {
|
||||
if (Objects.isNull(type)) {
|
||||
return null;
|
||||
@ -173,11 +208,18 @@ public class VisaChangePageSearchResp {
|
||||
return status.getDesc();
|
||||
}
|
||||
|
||||
public String getStampStatusDesc() {
|
||||
if (Objects.isNull(stampStatus)) {
|
||||
// public String getStampStatusDesc() {
|
||||
// if (Objects.isNull(stampStatus)) {
|
||||
// return null;
|
||||
// }
|
||||
// return stampStatus.getDesc();
|
||||
// }
|
||||
|
||||
public String getVisaApprovalStatusDesc() {
|
||||
if (Objects.isNull(visaApprovalStatus)) {
|
||||
return null;
|
||||
}
|
||||
return stampStatus.getDesc();
|
||||
return visaApprovalStatus.getDesc();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,41 @@
|
||||
package cn.axzo.nanopart.visa.api.response;
|
||||
|
||||
import cn.axzo.nanopart.visa.api.request.VisaChangeTempCreateReq;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author chenwenjian
|
||||
* @version 1.0
|
||||
* @date 2025/4/19 10:52
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class VisaChangeRelationOrdersResp {
|
||||
|
||||
/**
|
||||
* 任务单
|
||||
*/
|
||||
private List<VisaChangeTempCreateReq.OrderSimpleModel> relationTaskList;
|
||||
|
||||
/**
|
||||
* 整改单
|
||||
*/
|
||||
private List<VisaChangeTempCreateReq.OrderSimpleModel> relationRectifyList;
|
||||
|
||||
/**
|
||||
* 变更单
|
||||
*/
|
||||
private List<VisaChangeTempCreateReq.OrderSimpleModel> relationVisaList;
|
||||
|
||||
/**
|
||||
* 关联无效的变更单
|
||||
*/
|
||||
private List<String> relationInvalidVisaList;
|
||||
}
|
||||
@ -1,27 +1,35 @@
|
||||
package cn.axzo.nanopart.visa.api.response;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaProcessPhase;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
import cn.axzo.maokai.common.enums.SaasCooperateShipCooperateTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaButtonTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStampStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaChangeTempCreateReq;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Sets;
|
||||
import cn.axzo.workflow.common.model.response.form.model.FormModelVO;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import lombok.Setter;
|
||||
|
||||
/**
|
||||
* @author xudawei
|
||||
@ -132,7 +140,7 @@ public class VisaDetailByIdResponse {
|
||||
|
||||
|
||||
/**
|
||||
* 最终审批时间
|
||||
* 立项审批时间
|
||||
*/
|
||||
private String approvalCompleteTime;
|
||||
|
||||
@ -213,10 +221,20 @@ public class VisaDetailByIdResponse {
|
||||
private String approvalId;
|
||||
|
||||
/**
|
||||
* 最终审批状态
|
||||
* 最终审批ID
|
||||
*/
|
||||
private String approvalIdPay;
|
||||
|
||||
/**
|
||||
* 立项审批状态
|
||||
*/
|
||||
private String approvalStatus;
|
||||
|
||||
/**
|
||||
* 价款审批状态
|
||||
*/
|
||||
private String approvalStatusPay;
|
||||
|
||||
/**
|
||||
* 当前登录人的personId
|
||||
*/
|
||||
@ -227,11 +245,141 @@ public class VisaDetailByIdResponse {
|
||||
*/
|
||||
private String contractId;
|
||||
|
||||
/**
|
||||
* 合同 ID
|
||||
*/
|
||||
private String contractIdPay;
|
||||
|
||||
/**
|
||||
* 用印状态
|
||||
*/
|
||||
private VisaStampStatusEnum stampStatus;
|
||||
|
||||
/**
|
||||
* 用印状态
|
||||
*/
|
||||
private VisaStampStatusEnum stampStatusPay;
|
||||
|
||||
/**
|
||||
* 业务合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 业务合同编号
|
||||
*/
|
||||
private String contractNo;
|
||||
|
||||
/**
|
||||
* 相关审批表单
|
||||
*/
|
||||
private List<DetailCard> cards;
|
||||
|
||||
@Setter @Getter
|
||||
public static class DetailCard {
|
||||
|
||||
/**
|
||||
* 变签Id
|
||||
*/
|
||||
private Long visaId;
|
||||
|
||||
/**
|
||||
* 审批实例Id
|
||||
*/
|
||||
private String workflowInstanceId;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 审批状态. PROCESSING: 审批中, APPROVED: 已通过, REJECTED: 已驳回
|
||||
*/
|
||||
private String workflowStatus;
|
||||
|
||||
/**
|
||||
* 审批状态描述
|
||||
*/
|
||||
private String workflowStatusDesc;
|
||||
|
||||
/**
|
||||
* 用印状态. UNPRINTED: 未用印, WITH_PRINT: 用印中, USED_PRINTS: 已用印
|
||||
*/
|
||||
private String stampStatus;
|
||||
|
||||
/**
|
||||
* 用印状态描述
|
||||
*/
|
||||
private String stampStatusDesc;
|
||||
|
||||
/**
|
||||
* 表单模型
|
||||
*/
|
||||
private FormModelVO formModel;
|
||||
|
||||
/**
|
||||
* 按钮
|
||||
*/
|
||||
private List<WorkflowDetailButton> buttons;
|
||||
|
||||
/**
|
||||
* 待办编码
|
||||
*/
|
||||
private String todoIdentityCode;
|
||||
|
||||
/**
|
||||
* 流程阶段. PROJECT: 立项审批, PAYMENT: 完工价款确认审批
|
||||
*/
|
||||
private VisaProcessPhase phase;
|
||||
|
||||
public void addButton(String name, WorkflowButtonType type) {
|
||||
if (buttons == null)
|
||||
buttons = new ArrayList<>();
|
||||
if (containsButtonOfType(type))
|
||||
return;
|
||||
WorkflowDetailButton workflowDetailButton = new WorkflowDetailButton();
|
||||
workflowDetailButton.setName(name);
|
||||
workflowDetailButton.setType(type);
|
||||
buttons.add(workflowDetailButton);
|
||||
}
|
||||
|
||||
public boolean containsButtonOfType(WorkflowButtonType type) {
|
||||
return buttons.stream().anyMatch(button -> button.type == type);
|
||||
}
|
||||
|
||||
public void removeButtonsOfType(WorkflowButtonType... types) {
|
||||
if (buttons == null || types.length == 0) return;
|
||||
HashSet<WorkflowButtonType> typesSet = Sets.newHashSet(types);
|
||||
buttons.removeIf(button -> typesSet.contains(button.type));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Setter @Getter
|
||||
public static class WorkflowDetailButton {
|
||||
/**
|
||||
* 按钮描述
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 按钮类型. 查询详情: DETAIL, PRINT_PREVIEW: 打印预览, REQUEST_STAMP: 申请用印, STAMP_PROGRESS: 用印进展, 打印(用印文件): PRINT
|
||||
*/
|
||||
private WorkflowButtonType type;
|
||||
}
|
||||
|
||||
public enum WorkflowButtonType {
|
||||
DETAIL,
|
||||
// 打印预览
|
||||
PRINT_PREVIEW,
|
||||
REQUEST_STAMP,
|
||||
STAMP_PROGRESS,
|
||||
// 打印
|
||||
PRINT
|
||||
}
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
|
||||
@ -4,6 +4,7 @@ import cn.axzo.nanopart.visa.api.enums.VisaStampStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
@ -147,8 +148,19 @@ public class VisaSearchResp {
|
||||
*/
|
||||
private String stampStatus;
|
||||
|
||||
/**
|
||||
* 用印状态
|
||||
* @see VisaStampStatusEnum
|
||||
*/
|
||||
private String stampStatusPay;
|
||||
|
||||
/**
|
||||
* 合同id
|
||||
*/
|
||||
private String contractId;
|
||||
|
||||
/**
|
||||
* 合同id
|
||||
*/
|
||||
private String contractIdPay;
|
||||
}
|
||||
|
||||
@ -7,6 +7,18 @@
|
||||
<version>${revision}</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>8</source>
|
||||
<target>8</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>visa-server</artifactId>
|
||||
|
||||
@ -3,6 +3,7 @@ package cn.axzo.nanopart.visa.server.controller;
|
||||
import cn.axzo.framework.domain.web.result.ApiPageResult;
|
||||
import cn.axzo.framework.domain.web.result.ApiResult;
|
||||
import cn.axzo.framework.domain.web.result.PageData;
|
||||
import cn.axzo.framework.jackson.utility.JSON;
|
||||
import cn.axzo.nanopart.visa.api.changerecord.ChangeRecordApi;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaConfirmBizTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
@ -21,15 +22,19 @@ import cn.axzo.nanopart.visa.api.request.VisaChangePageSearchReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaChangeTempCreateReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaDetailByIdRequest;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaInitiatorListReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaPayApproveCreateReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaSearchReq;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangeDiscussCreateResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangeInitiatorResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangePageSearchResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangeRelationOrdersResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaSearchResp;
|
||||
import cn.axzo.nanopart.visa.server.dto.FetchBtnConditionDto;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordBillService;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordConfirmService;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordService;
|
||||
import cn.axzo.nanopart.visa.server.service.impl.DetailCardBuilder;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@ -63,6 +68,9 @@ public class ChangeRecordController implements ChangeRecordApi {
|
||||
@Autowired
|
||||
private ChangeRecordBillService changeRecordBillService;
|
||||
|
||||
@Autowired
|
||||
private DetailCardBuilder detailCardBuilder;
|
||||
|
||||
@Override
|
||||
public ApiResult<Long> tempCreateVisaChangeRecord(VisaChangeTempCreateReq req) {
|
||||
return ApiResult.ok(changeRecordService.tempCreateVisaChangeRecord(req));
|
||||
@ -99,10 +107,20 @@ public class ChangeRecordController implements ChangeRecordApi {
|
||||
@Override
|
||||
public ApiResult<VisaDetailByIdResponse> visaDetailById(@RequestBody @Valid VisaDetailByIdRequest req) {
|
||||
VisaDetailByIdResponse resp = changeRecordService.detailById(req.getVisaId());
|
||||
detailCardBuilder.populateCardTodoIdentityCode(resp.getCards(), req.getPersonId());
|
||||
|
||||
if (req.isNeedBtnList()) {
|
||||
// resp.setBtnList(VisaButtonTypeEnum.sort(VisaButtonTypeEnum.all()));
|
||||
resp.setBtnList(changeRecordConfirmService.fetchBtnsByCondition(req.getVisaId(), req.getPersonId(), req.getOuId(), req.getWorkspaceId(), resp.getStatus(), resp.getApprovalId(), resp.getStampStatus()));
|
||||
FetchBtnConditionDto btnConditionDto = FetchBtnConditionDto.builder()
|
||||
.visaId(resp.getVisaId())
|
||||
.personId(req.getPersonId())
|
||||
.ouId(req.getOuId())
|
||||
.workspaceId(req.getWorkspaceId())
|
||||
.status(resp.getStatus())
|
||||
.approvalStatus(resp.getApprovalStatus())
|
||||
.approvalStatusPay(resp.getApprovalStatusPay())
|
||||
.build();
|
||||
resp.setBtnList(changeRecordConfirmService.fetchBtnsByCondition(btnConditionDto));
|
||||
}
|
||||
return ApiResult.ok(resp);
|
||||
}
|
||||
@ -183,6 +201,7 @@ public class ChangeRecordController implements ChangeRecordApi {
|
||||
|
||||
@Override
|
||||
public ApiResult<Map<String, Boolean>> getBillIfRelated(GetBillIfRelatedReq req) {
|
||||
log.info("getBillIfRelated, request: {}", JSON.toJSONString(req));
|
||||
return ApiResult.ok(changeRecordBillService.getBillIfRelated(req));
|
||||
}
|
||||
|
||||
@ -196,4 +215,15 @@ public class ChangeRecordController implements ChangeRecordApi {
|
||||
public ApiResult<List<BpmnTaskDelegateAssigner>> bizActivityDecisionAssignee(BizActivityAssigneeDecisionReq req) {
|
||||
return ApiResult.ok(changeRecordService.bizActivityDecisionAssignee(req));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<Void> approveCreateVisaPay(VisaPayApproveCreateReq req) {
|
||||
changeRecordService.approveCreateVisaPay(req);
|
||||
return ApiResult.ok();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<VisaChangeRelationOrdersResp> getRelationOrdersById(Long visaId) {
|
||||
return ApiResult.ok(changeRecordService.getRelationOrdersById(visaId));
|
||||
}
|
||||
}
|
||||
|
||||
@ -75,6 +75,7 @@ public class ChangeRecordRelationController implements ChangeRecordRelationApi {
|
||||
|
||||
@Override
|
||||
public ApiResult<Void> requestStamp(VisaRequestStampReq req) {
|
||||
log.info("requestStamp: {}", req);
|
||||
changeRecordRelationService.requestStamp(req);
|
||||
return ApiResult.ok();
|
||||
}
|
||||
|
||||
@ -1,11 +1,8 @@
|
||||
package cn.axzo.nanopart.visa.server.domain;
|
||||
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStampStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq;
|
||||
import cn.axzo.nanopart.visa.server.config.BizResultCode;
|
||||
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.annotation.FieldStrategy;
|
||||
@ -14,6 +11,14 @@ import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
|
||||
import com.google.common.collect.HashBasedTable;
|
||||
import com.google.common.collect.Table;
|
||||
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaProcessPhase;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStampStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq;
|
||||
import cn.axzo.nanopart.visa.server.config.BizResultCode;
|
||||
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
@ -21,10 +26,6 @@ import lombok.EqualsAndHashCode;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* @author xudawei
|
||||
* @date 2025/01/15
|
||||
@ -150,7 +151,7 @@ public class ChangeRecord extends BaseEntity<ChangeRecord> {
|
||||
/**
|
||||
* 最终审批时间
|
||||
*/
|
||||
@TableField(value = "approval_complete_time", updateStrategy = FieldStrategy.IGNORED)
|
||||
@TableField(value = "approval_complete_time", updateStrategy = FieldStrategy.NOT_EMPTY)
|
||||
private Date approvalCompleteTime;
|
||||
|
||||
/**
|
||||
@ -177,16 +178,74 @@ public class ChangeRecord extends BaseEntity<ChangeRecord> {
|
||||
@TableField(value = "update_by")
|
||||
private Long updateBy;
|
||||
|
||||
/**
|
||||
* 业务合同名称
|
||||
*/
|
||||
@TableField(value = "contract_name")
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 业务合同编号
|
||||
*/
|
||||
@TableField(value = "contract_no")
|
||||
private String contractNo;
|
||||
|
||||
/**
|
||||
* 用印状态
|
||||
*/
|
||||
@TableField(value = "stamp_status_pay")
|
||||
private VisaStampStatusEnum stampStatusPay;
|
||||
|
||||
/**
|
||||
* 是否申请过用印
|
||||
*/
|
||||
@TableField(value = "applied_stamp_pay")
|
||||
private Boolean appliedStampPay;
|
||||
|
||||
/**
|
||||
* 价款电子签合同 ID
|
||||
*/
|
||||
@TableField(value = "contract_id_pay")
|
||||
private String contractIdPay;
|
||||
|
||||
/**
|
||||
* 最终审批ID
|
||||
*/
|
||||
@TableField(value = "approval_id_pay")
|
||||
private String approvalIdPay;
|
||||
|
||||
/**
|
||||
* 最终审批状态
|
||||
*/
|
||||
@TableField(value = "approval_status_pay")
|
||||
private String approvalStatusPay;
|
||||
|
||||
/**
|
||||
* 最终审批时间
|
||||
*/
|
||||
@TableField(value = "approval_complete_time_pay", updateStrategy = FieldStrategy.NOT_EMPTY)
|
||||
private Date approvalCompleteTimePay;
|
||||
|
||||
private static final Table<VisaStampStatusEnum, UpdateVisaChangeReq.VisaStampAction, VisaStampStatusEnum> VISA_STAMP_STATUS_ACTION = HashBasedTable.create();
|
||||
|
||||
static {
|
||||
VISA_STAMP_STATUS_ACTION.put(VisaStampStatusEnum.WITH_PRINT, UpdateVisaChangeReq.VisaStampAction.COMPLETE, VisaStampStatusEnum.USED_PRINTS);
|
||||
VISA_STAMP_STATUS_ACTION.put(VisaStampStatusEnum.WITH_PRINT, UpdateVisaChangeReq.VisaStampAction.CANCEL, VisaStampStatusEnum.UNPRINTED);
|
||||
VISA_STAMP_STATUS_ACTION.put(VisaStampStatusEnum.WITH_PRINT, UpdateVisaChangeReq.VisaStampAction.TX_CANCEL, VisaStampStatusEnum.UNPRINTED);
|
||||
VISA_STAMP_STATUS_ACTION.put(VisaStampStatusEnum.WITH_PRINT, UpdateVisaChangeReq.VisaStampAction.ALL_PROCESS_REJECTED, VisaStampStatusEnum.UNPRINTED);
|
||||
VISA_STAMP_STATUS_ACTION.put(VisaStampStatusEnum.WITH_PRINT, UpdateVisaChangeReq.VisaStampAction.AUTO_COMPLETE, VisaStampStatusEnum.USED_PRINTS);
|
||||
}
|
||||
|
||||
public VisaStampStatusEnum nextStampStatus(UpdateVisaChangeReq.VisaStampAction action) {
|
||||
return Optional.ofNullable(VISA_STAMP_STATUS_ACTION.get(this.getStampStatus(), action)).orElseThrow(BizResultCode.VISA_STAMP_STATUS_ERROR::toException);
|
||||
public VisaStampStatusEnum nextStampStatus(UpdateVisaChangeReq.VisaStampAction action, VisaProcessPhase phase) {
|
||||
switch (action) {
|
||||
case COMPLETE:
|
||||
case AUTO_COMPLETE:
|
||||
return VisaStampStatusEnum.USED_PRINTS;
|
||||
case CANCEL:
|
||||
case TX_CANCEL:
|
||||
case ALL_PROCESS_REJECTED:
|
||||
return VisaStampStatusEnum.UNPRINTED;
|
||||
}
|
||||
throw BizResultCode.VISA_STAMP_STATUS_ERROR.toException();
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,39 @@
|
||||
package cn.axzo.nanopart.visa.server.dto;
|
||||
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author chenwenjian
|
||||
* @version 1.0
|
||||
* @date 2025/4/19 14:26
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class FetchBtnConditionDto {
|
||||
|
||||
private Long visaId;
|
||||
|
||||
private Long personId;
|
||||
|
||||
private Long ouId;
|
||||
|
||||
private Long workspaceId;
|
||||
|
||||
private VisaStatusEnum status;
|
||||
|
||||
/**
|
||||
* 立项审批状态
|
||||
*/
|
||||
private String approvalStatus;
|
||||
|
||||
/**
|
||||
* 价款审批状态
|
||||
*/
|
||||
private String approvalStatusPay;
|
||||
}
|
||||
@ -63,11 +63,17 @@ public class VisaExportDto {
|
||||
@ExcelProperty("提出时间")
|
||||
private Date happenTime;
|
||||
|
||||
/**
|
||||
* 立项审批时间
|
||||
*/
|
||||
@ExcelProperty("立项审批通过时间")
|
||||
private Date approvalCompleteTime;
|
||||
|
||||
/**
|
||||
* 最终审批时间
|
||||
*/
|
||||
@ExcelProperty("审批通过时间")
|
||||
private Date approvalCompleteTime;
|
||||
@ExcelProperty("价款审批通过时间")
|
||||
private Date approvalCompleteTimePay;
|
||||
|
||||
/**
|
||||
* 工程
|
||||
|
||||
@ -2,6 +2,7 @@ package cn.axzo.nanopart.visa.server.dto;
|
||||
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
@ -86,6 +87,10 @@ public class VisaLogParam {
|
||||
*/
|
||||
private VisaStatusEnum oldStatus;
|
||||
|
||||
/**
|
||||
* 用于区别原始三个单据类型和价款审批
|
||||
*/
|
||||
private VisaTypeEnum visaType;
|
||||
|
||||
/**
|
||||
* 获取删除附件信息
|
||||
|
||||
@ -1,5 +1,26 @@
|
||||
package cn.axzo.nanopart.visa.server.mq.listener.ess;
|
||||
|
||||
import static cn.axzo.nanopart.ess.api.enums.EssContractApproveState.ACCEPT;
|
||||
import static cn.axzo.nanopart.ess.api.enums.MQEvent.ESS_CONTRACT_STATE_CHANGE;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS_PAY;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStampStatusEnum;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
|
||||
import cn.axzo.apollo.workspace.api.workspace.req.GetWorkspaceDetailReq;
|
||||
import cn.axzo.apollo.workspace.api.workspace.res.GetWorkspaceDetailRes;
|
||||
import cn.axzo.basics.common.util.AssertUtil;
|
||||
@ -11,6 +32,8 @@ import cn.axzo.nanopart.ess.api.domain.contract.EssContractInfo;
|
||||
import cn.axzo.nanopart.ess.api.enums.EssContractState;
|
||||
import cn.axzo.nanopart.ess.api.mq.EssContractStateChangeMessage;
|
||||
import cn.axzo.nanopart.ess.api.request.SaveContractSnapshotRequest;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaProcessPhase;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum;
|
||||
import cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq;
|
||||
import cn.axzo.nanopart.visa.server.domain.ChangeRecord;
|
||||
import cn.axzo.nanopart.visa.server.domain.ChangeRecordRelation;
|
||||
@ -21,29 +44,14 @@ import cn.axzo.nanopart.visa.server.rpc.WorkflowGateway;
|
||||
import cn.axzo.nanopart.visa.server.rpc.WorkspaceGateway;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordRelationService;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordService;
|
||||
import cn.axzo.nanopart.visa.server.service.OperateLogService;
|
||||
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
|
||||
import cn.azxo.framework.common.utils.StringUtils;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.nanopart.ess.api.enums.EssContractApproveState.ACCEPT;
|
||||
import static cn.axzo.nanopart.ess.api.enums.MQEvent.ESS_CONTRACT_STATE_CHANGE;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS;
|
||||
|
||||
/**
|
||||
* 腾讯电子签的处理器
|
||||
@ -66,6 +74,8 @@ public class EssAllEventHandler implements EventHandler, InitializingBean {
|
||||
private ChangeRecordService changeRecordService;
|
||||
@Resource
|
||||
private ChangeRecordRelationService changeRecordRelationService;
|
||||
@Resource
|
||||
private OperateLogService operateLogService;
|
||||
|
||||
@Override
|
||||
public void onEvent(Event event, EventConsumer.Context context) {
|
||||
@ -77,9 +87,13 @@ public class EssAllEventHandler implements EventHandler, InitializingBean {
|
||||
EssContractStateChangeMessage essContractStateChangeMessage = event.normalizedData(EssContractStateChangeMessage.class);
|
||||
EssContractInfo contract = essContractStateChangeMessage.getContract();
|
||||
AssertUtil.isTrue(Objects.nonNull(contract), "腾讯电子签事件对象异常");
|
||||
operateLogService.save("essMQ", contract.getEssContractId(), "message", essContractStateChangeMessage);
|
||||
|
||||
// 取消用印会清空合同 id,这里兼容该情况
|
||||
Optional<ChangeRecord> optVisa = changeRecordService.lambdaQuery().eq(ChangeRecord::getContractId, contract.getEssContractId())
|
||||
Optional<ChangeRecord> optVisa = changeRecordService.lambdaQuery()
|
||||
.eq(ChangeRecord::getContractId, contract.getEssContractId())
|
||||
.or()
|
||||
.eq(ChangeRecord::getContractIdPay, contract.getEssContractId())
|
||||
.oneOpt();
|
||||
|
||||
if (Objects.equals(EssContractState.CANCEL, contract.getState()) && optVisa.isPresent()) {
|
||||
@ -110,9 +124,11 @@ public class EssAllEventHandler implements EventHandler, InitializingBean {
|
||||
.filter(i -> Objects.equals(i.getState(), ACCEPT))
|
||||
.collect(Collectors.toMap(i -> i.getSignPerson().getOuId(), Function.identity(), (s, t) -> s));
|
||||
|
||||
VisaProcessPhase phase = determinePhase(changeRecord, contract);
|
||||
VisaRelationFieldEnum fieldType = phase == VisaProcessPhase.PROJECT ? PROCESS_INSTANCE_OF_ESS : PROCESS_INSTANCE_OF_ESS_PAY;
|
||||
List<ChangeRecordRelation> essInstances = changeRecordRelationService.findByCondition(VisaRelationDto.builder()
|
||||
.visaId(changeRecord.getId())
|
||||
.varName(PROCESS_INSTANCE_OF_ESS.name())
|
||||
.varName(fieldType.name())
|
||||
.contentExt(BpmnProcessInstanceResultEnum.PROCESSING.getStatus())
|
||||
.build());
|
||||
|
||||
@ -125,8 +141,9 @@ public class EssAllEventHandler implements EventHandler, InitializingBean {
|
||||
.organizationUnitId(approveDetail.getOuId())
|
||||
.type(1)
|
||||
.build());
|
||||
if (CollectionUtils.isEmpty(workspaces) || workspaces.size() != 1) {
|
||||
if (CollectionUtils.isEmpty(workspaces)) {
|
||||
log.error("未获取到指定单位的企业工作台信息, ouId:{}", approveDetail.getOuId());
|
||||
return;
|
||||
}
|
||||
GetWorkspaceDetailRes entWorkspace = workspaces.get(0);
|
||||
|
||||
@ -154,9 +171,16 @@ public class EssAllEventHandler implements EventHandler, InitializingBean {
|
||||
// 撤回合同,则取消用印
|
||||
if (Objects.equals(EssContractState.CANCEL, contract.getState()) && optVisa.isPresent()) {
|
||||
ChangeRecord changeRecord = optVisa.get();
|
||||
VisaProcessPhase phase = determinePhase(changeRecord, contract);
|
||||
VisaStampStatusEnum stampStatus = phase == VisaProcessPhase.PROJECT ? changeRecord.getStampStatus() : changeRecord.getStampStatusPay();
|
||||
if (stampStatus == VisaStampStatusEnum.UNPRINTED) {
|
||||
return;
|
||||
}
|
||||
VisaRelationFieldEnum fieldType = phase == VisaProcessPhase.PROJECT ? PROCESS_INSTANCE_OF_ESS
|
||||
: PROCESS_INSTANCE_OF_ESS_PAY;
|
||||
List<ChangeRecordRelation> visaRelations = changeRecordRelationService.findByCondition(VisaRelationDto.builder()
|
||||
.visaId(changeRecord.getId())
|
||||
.varName(PROCESS_INSTANCE_OF_ESS.name())
|
||||
.varName(fieldType.name())
|
||||
.contentExt(BpmnProcessInstanceResultEnum.PROCESSING.getStatus())
|
||||
.build());
|
||||
if (CollectionUtils.isNotEmpty(visaRelations)) {
|
||||
@ -173,10 +197,12 @@ public class EssAllEventHandler implements EventHandler, InitializingBean {
|
||||
// 3、修改变更签证状态
|
||||
UpdateVisaChangeReq updateVisaChangeReq = UpdateVisaChangeReq.builder()
|
||||
.visaId(changeRecord.getId())
|
||||
.phase(phase)
|
||||
.visaStampAction(UpdateVisaChangeReq.VisaStampAction.CANCEL)
|
||||
.operatorId(0L)
|
||||
.operatorName("腾讯撤销合同")
|
||||
.scene("取消用印")
|
||||
.context("stamp:cancelOfEssCancelContract")
|
||||
.build();
|
||||
changeRecordService.update(updateVisaChangeReq);
|
||||
}
|
||||
@ -209,6 +235,11 @@ public class EssAllEventHandler implements EventHandler, InitializingBean {
|
||||
return workflowGateway.findTaskIdByInstanceIdAndPersonId(processInstanceId, personId);
|
||||
}
|
||||
|
||||
public VisaProcessPhase determinePhase(ChangeRecord visa, EssContractInfo contract) {
|
||||
return Objects.equals(visa.getContractId(), contract.getEssContractId()) ? VisaProcessPhase.PROJECT
|
||||
: VisaProcessPhase.PAYMENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
eventConsumer.registerHandler(ESS_CONTRACT_STATE_CHANGE.getEventCode(), this);
|
||||
|
||||
@ -1,25 +1,27 @@
|
||||
package cn.axzo.nanopart.visa.server.mq.listener.workflow.activity;
|
||||
|
||||
import static cn.axzo.nanopart.visa.server.mq.listener.workflow.process.ProcessInstanceOfVisaAllEventHandler.SUPPORTED_DEFINITION_KEYS;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import cn.axzo.framework.jackson.utility.JSON;
|
||||
import cn.axzo.framework.rocketmq.Event;
|
||||
import cn.axzo.framework.rocketmq.EventConsumer;
|
||||
import cn.axzo.nanopart.visa.api.request.BizActivityAssigneeDecisionReq;
|
||||
import cn.axzo.nanopart.visa.server.rpc.WorkflowGateway;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordService;
|
||||
import cn.axzo.nanopart.visa.server.service.OperateLogService;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivitySetAssigneeDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.common.model.response.mq.ProcessActivityDTO;
|
||||
import cn.axzo.workflow.starter.handler.ProcessActivityEventHandler;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.axzo.nanopart.visa.server.mq.listener.workflow.process.ProcessInstanceOfVisaAllEventHandler.SUPPORTED_DEFINITION_KEYS;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
|
||||
/**
|
||||
* 签证审批第一个业务节点“业务指定审批人”配法的处理
|
||||
@ -33,6 +35,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
public class ProcessActivityAllEventHandler implements ProcessActivityEventHandler {
|
||||
private final ChangeRecordService changeRecordService;
|
||||
private final WorkflowGateway workflowGateway;
|
||||
private final OperateLogService operateLogService;
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
@ -47,6 +50,8 @@ public class ProcessActivityAllEventHandler implements ProcessActivityEventHandl
|
||||
|
||||
@Override
|
||||
public void onWaitAssignee(ProcessActivityDTO dto) {
|
||||
log.info("onWaitAssignee, processActivityDTO: {}", JSON.toJSONString(dto));
|
||||
operateLogService.save("ProcessActivityAllEventHandler:onWaitAssignee", dto.getProcessInstanceId(), "message", dto);
|
||||
BpmnTaskDelegateAssigner initiator = BpmnTaskDelegateAssigner.toObjectCompatible(dto.getVariables().getOrDefault(INTERNAL_INITIATOR, null));
|
||||
if (Objects.isNull(initiator)) {
|
||||
log.error("data error ,process instance creator is null,processInstanceId: {}", dto.getProcessInstanceId());
|
||||
|
||||
@ -1,9 +1,21 @@
|
||||
package cn.axzo.nanopart.visa.server.mq.listener.workflow.process;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStampStatusEnum;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
|
||||
import cn.axzo.framework.rocketmq.Event;
|
||||
import cn.axzo.framework.rocketmq.EventConsumer;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaProcessPhase;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStampStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq;
|
||||
import cn.axzo.nanopart.visa.server.config.RefreshableConfiguration;
|
||||
import cn.axzo.nanopart.visa.server.domain.ChangeRecord;
|
||||
@ -15,16 +27,7 @@ import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.common.model.response.mq.ProcessInstanceDTO;
|
||||
import cn.axzo.workflow.starter.handler.ProcessInstanceEventHandler;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 完成变更签证用印申请
|
||||
@ -46,8 +49,17 @@ public class CompleteVisaChangeStampHandler implements ProcessInstanceEventHandl
|
||||
return Objects.equals(dto.getProcessDefinitionKey(), refreshableConfiguration.getStampProcessDefinitionKey());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRejected(ProcessInstanceDTO dto) {
|
||||
process(dto, BpmnProcessInstanceResultEnum.REJECTED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCompleted(ProcessInstanceDTO dto) {
|
||||
process(dto, BpmnProcessInstanceResultEnum.APPROVED);
|
||||
}
|
||||
|
||||
private void process(ProcessInstanceDTO dto, BpmnProcessInstanceResultEnum result) {
|
||||
Long visaId = Long.valueOf(dto.getBusinessKey());
|
||||
log.info("CompleteVisaChangeStampHandler visaId, {}", visaId);
|
||||
Long operatorId = Optional.ofNullable(dto.getLastOperationAssigner())
|
||||
@ -57,11 +69,15 @@ public class CompleteVisaChangeStampHandler implements ProcessInstanceEventHandl
|
||||
.map(BpmnTaskDelegateAssigner::getAssignerName)
|
||||
.orElse(null);
|
||||
|
||||
VisaRelationDto visaRelationDto = VisaRelationDto.builder()
|
||||
ChangeRecord changeRecord = changeRecordService.getById(visaId);
|
||||
List<ChangeRecordRelation> allRecordRelations = changeRecordRelationService.findByCondition(VisaRelationDto.builder()
|
||||
.visaId(visaId)
|
||||
.varName(VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS.name())
|
||||
.build();
|
||||
List<ChangeRecordRelation> allRecordRelations = changeRecordRelationService.findByCondition(visaRelationDto);
|
||||
.build());
|
||||
allRecordRelations.addAll(changeRecordRelationService.findByCondition(VisaRelationDto.builder()
|
||||
.visaId(visaId)
|
||||
.varName(VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS_PAY.name())
|
||||
.build()));
|
||||
|
||||
List<ChangeRecordRelation> changeRecordRelations = allRecordRelations.stream()
|
||||
.filter(e -> Objects.equals(JSON.parseObject(e.getContent()).getString("approvalId"), dto.getProcessInstanceId()))
|
||||
@ -71,6 +87,15 @@ public class CompleteVisaChangeStampHandler implements ProcessInstanceEventHandl
|
||||
return;
|
||||
}
|
||||
|
||||
String varName = changeRecordRelations.get(0).getVarName();
|
||||
VisaProcessPhase phase = varName.equals(VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS.name())
|
||||
? VisaProcessPhase.PROJECT
|
||||
: VisaProcessPhase.PAYMENT;
|
||||
|
||||
allRecordRelations = allRecordRelations.stream()
|
||||
.filter(r -> r.getVarName().equals(varName))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (changeRecordRelations.size() > 1) {
|
||||
log.warn("CompleteVisaChangeStampHandler 用印审核完成数据异常,找到多条对应的用印申请记录,visaId,{}; processInstanceId,{}", visaId, dto.getProcessInstanceId());
|
||||
}
|
||||
@ -80,31 +105,29 @@ public class CompleteVisaChangeStampHandler implements ProcessInstanceEventHandl
|
||||
|
||||
ChangeRecordRelation update = new ChangeRecordRelation();
|
||||
update.setId(changeRecordRelation.getId());
|
||||
update.setContentExt(BpmnProcessInstanceResultEnum.APPROVED.getStatus());
|
||||
update.setContentExt(result.getStatus());
|
||||
update.setUpdateBy(operatorId);
|
||||
changeRecordRelationService.updateById(update);
|
||||
|
||||
boolean approved = allRecordRelations.stream()
|
||||
boolean approvedOrRejected = allRecordRelations.stream()
|
||||
.filter(e -> !Objects.equals(e.getVarExt(), changeRecordRelation.getVarExt()))
|
||||
.collect(Collectors.groupingBy(ChangeRecordRelation::getVarExt))
|
||||
.entrySet()
|
||||
.stream()
|
||||
.allMatch(e -> e.getValue().stream()
|
||||
.anyMatch(relation -> Objects.equals(BpmnProcessInstanceResultEnum.APPROVED.getStatus(), relation.getContentExt())));
|
||||
if (approved) {
|
||||
// 有可能用户在界面手动完成用印, 这里就无法自动完成
|
||||
ChangeRecord changeRecord = changeRecordService.getById(visaId);
|
||||
if (Objects.isNull(changeRecord) || !Objects.equals(changeRecord.getStampStatus(), VisaStampStatusEnum.WITH_PRINT)) {
|
||||
log.info("CompleteVisaChangeStampHandler changeRecord stampStatus not withPrint");
|
||||
return;
|
||||
}
|
||||
|
||||
.anyMatch(relation -> Objects.equals(result.getStatus(), relation.getContentExt())));
|
||||
if (approvedOrRejected) {
|
||||
boolean approved = result == BpmnProcessInstanceResultEnum.APPROVED;
|
||||
changeRecordService.update(UpdateVisaChangeReq.builder()
|
||||
.visaId(visaId)
|
||||
.phase(phase)
|
||||
.operatorId(operatorId)
|
||||
.operatorName(operatorName)
|
||||
.visaStampAction(UpdateVisaChangeReq.VisaStampAction.AUTO_COMPLETE)
|
||||
.scene("用印审批完成,自动完成用印申请")
|
||||
.visaStampAction(approved
|
||||
? UpdateVisaChangeReq.VisaStampAction.AUTO_COMPLETE
|
||||
: UpdateVisaChangeReq.VisaStampAction.ALL_PROCESS_REJECTED)
|
||||
.scene(approved ? "用印审批完成,自动完成用印申请" : "用印审批全被驳回,设置成未用印")
|
||||
.context(approved ? "stamp:autoComplete" : "stamp:allProcessRejected")
|
||||
.build());
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,27 +1,31 @@
|
||||
package cn.axzo.nanopart.visa.server.mq.listener.workflow.process;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
|
||||
import cn.axzo.framework.rocketmq.Event;
|
||||
import cn.axzo.framework.rocketmq.EventConsumer;
|
||||
import cn.axzo.framework.rocketmq.EventProducer;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum;
|
||||
import cn.axzo.nanopart.visa.server.config.RefreshableConfiguration;
|
||||
import cn.axzo.nanopart.visa.server.domain.ChangeRecord;
|
||||
import cn.axzo.nanopart.visa.server.domain.ChangeRecordRelation;
|
||||
import cn.axzo.nanopart.visa.server.dto.RelationEssContextDto;
|
||||
import cn.axzo.nanopart.visa.server.dto.VisaRelationDto;
|
||||
import cn.axzo.nanopart.visa.server.mq.listener.workflow.BasicLogSupport;
|
||||
import cn.axzo.nanopart.visa.server.rpc.VisaOrganizationalNodeUserGateway;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordRelationService;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordService;
|
||||
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
|
||||
import cn.axzo.workflow.common.model.response.mq.ProcessInstanceDTO;
|
||||
import cn.axzo.workflow.starter.handler.ProcessInstanceEventHandler;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* 工作流广播的实例维度的所有事件类型
|
||||
@ -34,14 +38,17 @@ import java.util.Optional;
|
||||
public class ProcessInstanceOfEssAllEventHandler extends BasicLogSupport implements ProcessInstanceEventHandler {
|
||||
private final RefreshableConfiguration refreshableConfiguration;
|
||||
private final ChangeRecordRelationService changeRecordRelationService;
|
||||
private final ChangeRecordService changeRecordService;
|
||||
|
||||
public ProcessInstanceOfEssAllEventHandler(EventProducer eventProducer,
|
||||
VisaOrganizationalNodeUserGateway visaOrganizationalNodeUserGateway,
|
||||
RefreshableConfiguration refreshableConfiguration,
|
||||
ChangeRecordRelationService changeRecordRelationService) {
|
||||
ChangeRecordRelationService changeRecordRelationService,
|
||||
ChangeRecordService changeRecordService) {
|
||||
super(eventProducer, visaOrganizationalNodeUserGateway);
|
||||
this.refreshableConfiguration = refreshableConfiguration;
|
||||
this.changeRecordRelationService = changeRecordRelationService;
|
||||
this.changeRecordService = changeRecordService;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -90,17 +97,26 @@ public class ProcessInstanceOfEssAllEventHandler extends BasicLogSupport impleme
|
||||
changeProcessInstanceOfEss(dto);
|
||||
}
|
||||
|
||||
private void changeProcessInstanceOfEss(ProcessInstanceDTO dto) {
|
||||
public void changeProcessInstanceOfEss(ProcessInstanceDTO dto) {
|
||||
log.info("change process instance of ess: {}, instance result: {}", dto.getProcessInstanceId(), dto.getType().getTag());
|
||||
Long visaId = Long.valueOf(dto.getBusinessKey());
|
||||
Long operatorId = Optional.ofNullable(dto.getLastOperationAssigner())
|
||||
.filter(e -> StringUtils.hasText(e.getPersonId()))
|
||||
.map(e -> Long.valueOf(e.getPersonId()))
|
||||
.orElse(0L);
|
||||
List<ChangeRecordRelation> essInstances = changeRecordRelationService.findByCondition(VisaRelationDto.builder()
|
||||
.visaId(visaId)
|
||||
.varName(VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS.name())
|
||||
ChangeRecord visa = changeRecordService.getById(visaId);
|
||||
if (visa == null) {
|
||||
log.error("visa not found, visaId: {}", visaId);
|
||||
return;
|
||||
}
|
||||
List<ChangeRecordRelation> essInstances = changeRecordRelationService.findByCondition(VisaRelationDto.builder() //
|
||||
.visaId(visaId) //
|
||||
.varName(VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS.name()) //
|
||||
.build());
|
||||
essInstances.addAll(changeRecordRelationService.findByCondition(VisaRelationDto.builder() //
|
||||
.visaId(visaId) //
|
||||
.varName(VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS_PAY.name()) //
|
||||
.build()));
|
||||
essInstances.forEach(e -> {
|
||||
String approvalId = JSON.parseObject(e.getContent(), RelationEssContextDto.class).getApprovalId();
|
||||
e.setUpdateBy(operatorId);
|
||||
@ -109,9 +125,9 @@ public class ProcessInstanceOfEssAllEventHandler extends BasicLogSupport impleme
|
||||
// case PROCESS_INSTANCE_COMPLETED:
|
||||
// e.setContentExt(BpmnProcessInstanceResultEnum.APPROVED.getStatus());
|
||||
// break;
|
||||
case PROCESS_INSTANCE_REJECTED:
|
||||
e.setContentExt(BpmnProcessInstanceResultEnum.REJECTED.getStatus());
|
||||
break;
|
||||
// case PROCESS_INSTANCE_REJECTED:
|
||||
// e.setContentExt(BpmnProcessInstanceResultEnum.REJECTED.getStatus());
|
||||
// break;
|
||||
case PROCESS_INSTANCE_ABORTED:
|
||||
e.setContentExt(BpmnProcessInstanceResultEnum.ABORTED.getStatus());
|
||||
break;
|
||||
|
||||
@ -20,12 +20,14 @@ import cn.axzo.nanopart.visa.server.domain.ChangeRecordRelation;
|
||||
import cn.axzo.nanopart.visa.server.mq.listener.workflow.BasicLogSupport;
|
||||
import cn.axzo.nanopart.visa.server.mq.producer.VisaChangeLogPayload;
|
||||
import cn.axzo.nanopart.visa.server.rpc.VisaOrganizationalNodeUserGateway;
|
||||
import cn.axzo.nanopart.visa.server.rpc.WorkflowGateway;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordBillService;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordConfirmService;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordRelationService;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordService;
|
||||
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO;
|
||||
import cn.axzo.workflow.common.model.response.mq.ProcessInstanceDTO;
|
||||
import cn.axzo.workflow.starter.handler.ProcessInstanceEventHandler;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
@ -48,10 +50,14 @@ import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_WORKSPA
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_INITIATOR_OU_ID;
|
||||
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.WORKFLOW_VAR_VISA_TYPE_KEY;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.APPROVE_ABORT;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.APPROVE_COMPLETED;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.REJECT_APPROVE;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.REVERT_APPROVE;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_PAY;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_VISA;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaTypeEnum.DESIGN_CHANGE;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaTypeEnum.PAY_CONFIRM;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaTypeEnum.PROJECT_VISA;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaTypeEnum.TECHNOLOGY_APPROVED;
|
||||
|
||||
@ -68,11 +74,13 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
|
||||
protected final ChangeRecordRelationService changeRecordRelationService;
|
||||
protected final ChangeRecordBillService changeRecordBillService;
|
||||
protected final ChangeRecordConfirmService changeRecordConfirmService;
|
||||
protected final WorkflowGateway workflowGateway;
|
||||
protected final MessageAPIV3 noticeApi;
|
||||
public final static List<String> SUPPORTED_DEFINITION_KEYS = Lists.newArrayList(
|
||||
DESIGN_CHANGE.getProcessDefinitionKey(),
|
||||
TECHNOLOGY_APPROVED.getProcessDefinitionKey(),
|
||||
PROJECT_VISA.getProcessDefinitionKey()
|
||||
PROJECT_VISA.getProcessDefinitionKey(),
|
||||
PAY_CONFIRM.getProcessDefinitionKey()
|
||||
);
|
||||
private final RefreshableConfiguration refreshableConfiguration;
|
||||
|
||||
@ -82,6 +90,7 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
|
||||
ChangeRecordRelationService changeRecordRelationService,
|
||||
ChangeRecordBillService changeRecordBillService,
|
||||
ChangeRecordConfirmService changeRecordConfirmService,
|
||||
WorkflowGateway workflowGateway,
|
||||
MessageAPIV3 noticeApi,
|
||||
RefreshableConfiguration refreshableConfiguration) {
|
||||
super(eventProducer, visaOrganizationalNodeUserGateway);
|
||||
@ -89,6 +98,7 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
|
||||
this.changeRecordRelationService = changeRecordRelationService;
|
||||
this.changeRecordBillService = changeRecordBillService;
|
||||
this.changeRecordConfirmService = changeRecordConfirmService;
|
||||
this.workflowGateway = workflowGateway;
|
||||
this.noticeApi = noticeApi;
|
||||
this.refreshableConfiguration = refreshableConfiguration;
|
||||
}
|
||||
@ -115,18 +125,25 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
|
||||
|
||||
@Override
|
||||
public void onCompleted(ProcessInstanceDTO dto) {
|
||||
String visaTypeDesc = parseVisaType(dto);
|
||||
|
||||
log.info("send complete notice");
|
||||
log.info("send complete notice, onCompleted, processInstanceDTO: {}", JSON.toJSONString(dto));
|
||||
sendCompleteNotice(dto);
|
||||
log.info("send complete notice success");
|
||||
BpmnProcessDefinitionVO processDefinition = workflowGateway.getActiveProcessDefinitionByKey(dto.getProcessDefinitionKey());
|
||||
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.APPROVED, processDefinition);
|
||||
|
||||
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.APPROVED);
|
||||
|
||||
if (isPayConfirm(dto)) {
|
||||
changeRecordService.lambdaUpdate()
|
||||
.eq(ChangeRecord::getId, Long.valueOf(dto.getBusinessKey()))
|
||||
.eq(ChangeRecord::getApprovalIdPay, dto.getProcessInstanceId())
|
||||
.set(ChangeRecord::getStampStatusPay, VisaStampStatusEnum.UNPRINTED.name())
|
||||
.update();
|
||||
} else {
|
||||
changeRecordService.lambdaUpdate()
|
||||
.eq(ChangeRecord::getId, Long.valueOf(dto.getBusinessKey()))
|
||||
.eq(ChangeRecord::getApprovalId, dto.getProcessInstanceId())
|
||||
.set(ChangeRecord::getStampStatus, VisaStampStatusEnum.UNPRINTED.name())
|
||||
.update();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -141,8 +158,10 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
|
||||
String visaType = (String) variables.getOrDefault(WORKFLOW_VAR_VISA_TYPE_KEY, "");
|
||||
String VisaTypeDesc = StringUtils.hasText(visaType) ? VisaTypeEnum.valueOf(visaType).getDesc() : "";
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
BpmnProcessDefinitionVO processDefinition = workflowGateway.getActiveProcessDefinitionByKey(dto.getProcessDefinitionKey());
|
||||
completeNotice.setBizExtParams(new JSONObject(Maps.of(
|
||||
"initiatorName", initiator.getAssignerName(),
|
||||
"instanceName", processDefinition.getName(),
|
||||
"handleUserName", initiator.getAssignerName(),
|
||||
"topic", variables.getOrDefault(FORM_FIELD_TOPIC, ""),
|
||||
"visaTypeDesc", VisaTypeDesc,
|
||||
"workspaceName", variables.getOrDefault(FORM_FIELD_WORKSPACE_NAME, ""),
|
||||
@ -178,18 +197,18 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
|
||||
*/
|
||||
@Override
|
||||
public void onCancelled(ProcessInstanceDTO dto) {
|
||||
log.info("onCancelled, processInstanceDTO: {}", JSON.toJSONString(dto));
|
||||
BpmnTaskDelegateAssigner initiator = dto.getInitiator();
|
||||
String visaTypeDesc = parseVisaType(dto);
|
||||
|
||||
BpmnProcessDefinitionVO processDefinition = workflowGateway.getActiveProcessDefinitionByKey(dto.getProcessDefinitionKey());
|
||||
ChangeRecordLog log = ChangeRecordLog.builder()
|
||||
.visaId(Long.valueOf(dto.getBusinessKey()))
|
||||
.action(dto.getType().getTag())
|
||||
.title(String.format(REVERT_APPROVE.getTitle(), visaTypeDesc))
|
||||
.content(String.format(REVERT_APPROVE.getContent(), buildLogUserInfo(initiator)))
|
||||
.title(String.format(REVERT_APPROVE.getTitle(), processDefinition.getName()))
|
||||
.content(String.format(REVERT_APPROVE.getContent(), buildLogUserInfo(initiator), processDefinition.getName()))
|
||||
.build();
|
||||
eventProducer.send(VisaChangeLogPayload.form(log));
|
||||
|
||||
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.CANCELLED);
|
||||
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.CANCELLED, processDefinition);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -199,20 +218,22 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
|
||||
*/
|
||||
@Override
|
||||
public void onRejected(ProcessInstanceDTO dto) {
|
||||
log.info("onRejected, processInstanceDTO: {}", JSON.toJSONString(dto));
|
||||
log.info("send reject notice");
|
||||
sendRejectNotice(dto);
|
||||
log.info("send reject notice success");
|
||||
|
||||
BpmnTaskDelegateAssigner lastOperationAssigner = dto.getLastOperationAssigner();
|
||||
BpmnProcessDefinitionVO processDefinition = workflowGateway.getActiveProcessDefinitionByKey(dto.getProcessDefinitionKey());
|
||||
ChangeRecordLog log = ChangeRecordLog.builder()
|
||||
.visaId(Long.valueOf(dto.getBusinessKey()))
|
||||
.action(dto.getType().getTag())
|
||||
.title(String.format(REJECT_APPROVE.getTitle(), lastOperationAssigner.getAssignerName()))
|
||||
.content(String.format(REJECT_APPROVE.getContent(), buildLogUserInfo(lastOperationAssigner), dto.getReason()))
|
||||
.title(String.format(REJECT_APPROVE.getTitle(), lastOperationAssigner.getAssignerName(), processDefinition.getName()))
|
||||
.content(String.format(REJECT_APPROVE.getContent(), buildLogUserInfo(lastOperationAssigner), StringUtils.hasText(dto.getReason()) ? dto.getReason() : ""))
|
||||
.build();
|
||||
eventProducer.send(VisaChangeLogPayload.form(log));
|
||||
|
||||
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.REJECTED);
|
||||
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.REJECTED, processDefinition);
|
||||
|
||||
}
|
||||
|
||||
@ -225,10 +246,12 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
|
||||
rejectNotice.setBizEventMappingCode(refreshableConfiguration.getProcessInstanceRejectMsgEventCode());
|
||||
rejectNotice.setBizCode(dto.getBusinessKey());
|
||||
|
||||
BpmnProcessDefinitionVO processDefinition = workflowGateway.getActiveProcessDefinitionByKey(dto.getProcessDefinitionKey());
|
||||
String visaType = (String) variables.getOrDefault(WORKFLOW_VAR_VISA_TYPE_KEY, "");
|
||||
String VisaTypeDesc = StringUtils.hasText(visaType) ? VisaTypeEnum.valueOf(visaType).getDesc() : "";
|
||||
rejectNotice.setBizExtParams(new JSONObject(Maps.of(
|
||||
"initiatorName", initiator.getAssignerName(),
|
||||
"instanceName", processDefinition.getName(),
|
||||
"handleUserName", initiator.getAssignerName(),
|
||||
"topic", variables.getOrDefault(FORM_FIELD_TOPIC, ""),
|
||||
"visaTypeDesc", VisaTypeDesc,
|
||||
"workspaceName", variables.getOrDefault(FORM_FIELD_WORKSPACE_NAME, ""),
|
||||
@ -250,35 +273,54 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
|
||||
|
||||
@Override
|
||||
public void onAborted(ProcessInstanceDTO dto) {
|
||||
ProcessInstanceEventHandler.super.onAborted(dto);
|
||||
log.info("onAborted, processInstanceDTO: {}", JSON.toJSONString(dto));
|
||||
BpmnProcessDefinitionVO processDefinition = workflowGateway.getActiveProcessDefinitionByKey(dto.getProcessDefinitionKey());
|
||||
ChangeRecordLog log = ChangeRecordLog.builder()
|
||||
.visaId(Long.valueOf(dto.getBusinessKey()))
|
||||
.action(dto.getType().getTag())
|
||||
.title(String.format(APPROVE_ABORT.getTitle(), processDefinition.getName()))
|
||||
.content(String.format(APPROVE_ABORT.getContent(), processDefinition.getName()))
|
||||
.build();
|
||||
eventProducer.send(VisaChangeLogPayload.form(log));
|
||||
|
||||
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.ABORTED);
|
||||
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.ABORTED, processDefinition);
|
||||
}
|
||||
|
||||
private void updateChangeRecordApprovalStatus(ProcessInstanceDTO dto, BpmnProcessInstanceResultEnum resultEnum) {
|
||||
private void updateChangeRecordApprovalStatus(ProcessInstanceDTO dto, BpmnProcessInstanceResultEnum resultEnum, BpmnProcessDefinitionVO processDefinition) {
|
||||
boolean isPayConfirm = isPayConfirm(dto);
|
||||
// 更新主表审批状态信息
|
||||
Long visaId = Long.valueOf(dto.getBusinessKey());
|
||||
changeRecordService.lambdaQuery()
|
||||
.eq(ChangeRecord::getId, visaId)
|
||||
.eq(ChangeRecord::getApprovalId, dto.getProcessInstanceId())
|
||||
.eq(ChangeRecord::getIsDelete, 0)
|
||||
.or(q -> q.eq(ChangeRecord::getApprovalId, dto.getProcessInstanceId())
|
||||
.eq(ChangeRecord::getApprovalIdPay, dto.getProcessInstanceId()))
|
||||
.oneOpt()
|
||||
.ifPresent(changeRecord -> {
|
||||
if (Objects.equals(resultEnum, BpmnProcessInstanceResultEnum.APPROVED)) {
|
||||
if (isPayConfirm) {
|
||||
changeRecord.setApprovalStatusPay(resultEnum.getStatus());
|
||||
changeRecord.setApprovalCompleteTimePay(new Date());
|
||||
} else {
|
||||
changeRecord.setApprovalStatus(resultEnum.getStatus());
|
||||
changeRecord.setApprovalCompleteTime(new Date());
|
||||
}
|
||||
} else {
|
||||
changeRecord.setApprovalId("");
|
||||
changeRecord.setApprovalStatus("");
|
||||
if (isPayConfirm) {
|
||||
changeRecord.setApprovalStatusPay(resultEnum.getStatus());
|
||||
changeRecord.setApprovalCompleteTimePay(null);
|
||||
} else {
|
||||
changeRecord.setApprovalStatus(resultEnum.getStatus());
|
||||
changeRecord.setApprovalCompleteTime(null);
|
||||
}
|
||||
}
|
||||
changeRecordService.updateById(changeRecord);
|
||||
});
|
||||
|
||||
// 更新关联表审批信息
|
||||
changeRecordRelationService.lambdaQuery()
|
||||
.eq(ChangeRecordRelation::getVisaId, visaId)
|
||||
.eq(ChangeRecordRelation::getVarName, PROCESS_INSTANCE_OF_VISA.name())
|
||||
.eq(ChangeRecordRelation::getVarName, isPayConfirm ? PROCESS_INSTANCE_OF_PAY.name() : PROCESS_INSTANCE_OF_VISA.name())
|
||||
.eq(ChangeRecordRelation::getContent, dto.getProcessInstanceId())
|
||||
.oneOpt()
|
||||
.ifPresent(changeRecordRelation -> {
|
||||
@ -289,25 +331,40 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
|
||||
ChangeRecord visa = changeRecordService.getById(visaId);
|
||||
BpmnTaskDelegateAssigner lastOperationAssigner = dto.getLastOperationAssigner();
|
||||
if (Objects.equals(resultEnum, BpmnProcessInstanceResultEnum.APPROVED)) {
|
||||
if (isPayConfirm) {
|
||||
// 修改状态,并记录日志
|
||||
changeRecordService.changeStatus(ChangeStatusRequest.builder()
|
||||
.visaId(visaId)
|
||||
.personId(Long.valueOf(lastOperationAssigner.getPersonId()))
|
||||
.ouId(Long.valueOf(lastOperationAssigner.getOuId()))
|
||||
.workspaceId(Long.valueOf(lastOperationAssigner.getTenantId()))
|
||||
.updateStatus(VisaStatusEnum.COMPLETED)
|
||||
.visaType(PAY_CONFIRM)
|
||||
.editFormFlag(false)
|
||||
.build());
|
||||
|
||||
} else {
|
||||
ChangeRecordLog log = ChangeRecordLog.builder()
|
||||
.visaId(Long.valueOf(dto.getBusinessKey()))
|
||||
.action(dto.getType().getTag())
|
||||
.title(String.format(APPROVE_COMPLETED.getTitle(), processDefinition.getName()))
|
||||
.content(String.format(APPROVE_COMPLETED.getContent(), processDefinition.getName()))
|
||||
.build();
|
||||
eventProducer.send(VisaChangeLogPayload.form(log));
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (!isPayConfirm) {
|
||||
// 回退到待提报或决策中
|
||||
changeRecordService.changeStatus(ChangeStatusRequest.builder()
|
||||
.visaId(visaId)
|
||||
.personId(Long.valueOf(lastOperationAssigner.getPersonId()))
|
||||
.ouId(Long.valueOf(lastOperationAssigner.getOuId()))
|
||||
.workspaceId(Long.valueOf(lastOperationAssigner.getTenantId()))
|
||||
.personId(Long.valueOf(StringUtils.hasText(lastOperationAssigner.getPersonId()) ? lastOperationAssigner.getPersonId() : "0"))
|
||||
.ouId(Long.valueOf(StringUtils.hasText(lastOperationAssigner.getOuId()) ? lastOperationAssigner.getOuId() : "0"))
|
||||
.workspaceId(Long.valueOf(StringUtils.hasText(lastOperationAssigner.getTenantId()) ? lastOperationAssigner.getTenantId() : "0"))
|
||||
.updateStatus(Objects.isNull(visa.getImGroupId()) ? VisaStatusEnum.REPORT_FROM_APPROVE : VisaStatusEnum.DECIDING_FROM_APPROVE)
|
||||
.editFormFlag(false)
|
||||
.build());
|
||||
}
|
||||
|
||||
// 取消当前主单据关联的其他单据的关联状态
|
||||
changeRecordBillService.billRelationStatus(visaId, false);
|
||||
@ -315,4 +372,8 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
|
||||
changeRecordService.syncDrawAnnotationUnBindRelation(visaId);
|
||||
|
||||
}
|
||||
|
||||
private boolean isPayConfirm(ProcessInstanceDTO dto) {
|
||||
return Objects.equals(PAY_CONFIRM, VisaTypeEnum.valueOfProcessDefinitionKey(dto.getProcessDefinitionKey()));
|
||||
}
|
||||
}
|
||||
|
||||
@ -8,8 +8,11 @@ import cn.axzo.nanopart.visa.server.domain.ChangeRecordLog;
|
||||
import cn.axzo.nanopart.visa.server.mq.listener.workflow.BasicLogSupport;
|
||||
import cn.axzo.nanopart.visa.server.mq.producer.VisaChangeLogPayload;
|
||||
import cn.axzo.nanopart.visa.server.rpc.VisaOrganizationalNodeUserGateway;
|
||||
import cn.axzo.nanopart.visa.server.rpc.WorkflowGateway;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO;
|
||||
import cn.axzo.workflow.common.model.response.mq.ProcessTaskDTO;
|
||||
import cn.axzo.workflow.starter.handler.ProcessTaskEventHandler;
|
||||
import org.apache.commons.lang3.math.NumberUtils;
|
||||
import org.springframework.context.annotation.DependsOn;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@ -18,6 +21,7 @@ import java.util.Objects;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.APPROVED_AGRESS;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.TRANSMIT_APPROVE;
|
||||
import static cn.axzo.nanopart.visa.server.mq.listener.workflow.process.ProcessInstanceOfVisaAllEventHandler.SUPPORTED_DEFINITION_KEYS;
|
||||
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER;
|
||||
|
||||
/**
|
||||
* 工作流广播的任务维度的所有事件类型
|
||||
@ -28,9 +32,11 @@ import static cn.axzo.nanopart.visa.server.mq.listener.workflow.process.ProcessI
|
||||
@Component
|
||||
@DependsOn("processInstanceOfVisaAllEventHandler")
|
||||
public class ProcessTaskOfVisaAllEventHandler extends BasicLogSupport implements ProcessTaskEventHandler {
|
||||
protected final WorkflowGateway workflowGateway;
|
||||
|
||||
public ProcessTaskOfVisaAllEventHandler(EventProducer eventProducer, VisaOrganizationalNodeUserGateway visaOrganizationalNodeUserGateway) {
|
||||
public ProcessTaskOfVisaAllEventHandler(EventProducer eventProducer, VisaOrganizationalNodeUserGateway visaOrganizationalNodeUserGateway, WorkflowGateway workflowGateway) {
|
||||
super(eventProducer, visaOrganizationalNodeUserGateway);
|
||||
this.workflowGateway = workflowGateway;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -60,17 +66,19 @@ public class ProcessTaskOfVisaAllEventHandler extends BasicLogSupport implements
|
||||
*/
|
||||
@Override
|
||||
public void onCompleted(ProcessTaskDTO dto) {
|
||||
if (Objects.nonNull(dto.getApprover())
|
||||
&& Objects.equals(dto.getInitiator().getPersonId(), dto.getApprover().getPersonId())) {
|
||||
if (Objects.nonNull(dto.getApprover()) && !NumberUtils.isDigits(dto.getApprover().getPersonId())) {
|
||||
return;
|
||||
}
|
||||
if (Objects.equals(NODE_STARTER.getType(), dto.getCurrentElementKey())) {
|
||||
return;
|
||||
}
|
||||
OrgNodeUserBriefInfoResp user = getOneUserInfo(dto.getApprover());
|
||||
|
||||
BpmnProcessDefinitionVO processDefinition = workflowGateway.getActiveProcessDefinitionByKey(dto.getProcessDefinitionKey());
|
||||
ChangeRecordLog log = ChangeRecordLog.builder()
|
||||
.visaId(Long.valueOf(dto.getBusinessKey()))
|
||||
.action(dto.getType().getTag())
|
||||
.title(String.format(APPROVED_AGRESS.getTitle(), Objects.isNull(user) ? "" : user.getRealName()))
|
||||
.content(String.format(APPROVED_AGRESS.getContent(), Objects.isNull(user) ? "系统自动通过" : buildLogUserInfo(user)))
|
||||
.content(String.format(APPROVED_AGRESS.getContent(), processDefinition.getName(), Objects.isNull(user) ? "系统自动通过" : buildLogUserInfo(user)))
|
||||
.build();
|
||||
eventProducer.send(VisaChangeLogPayload.form(log));
|
||||
}
|
||||
@ -82,12 +90,14 @@ public class ProcessTaskOfVisaAllEventHandler extends BasicLogSupport implements
|
||||
|
||||
@Override
|
||||
public void onTransfer(ProcessTaskDTO dto) {
|
||||
BpmnProcessDefinitionVO processDefinition = workflowGateway.getActiveProcessDefinitionByKey(dto.getProcessDefinitionKey());
|
||||
ChangeRecordLog log = ChangeRecordLog.builder()
|
||||
.visaId(Long.valueOf(dto.getBusinessKey()))
|
||||
.action(dto.getType().getTag())
|
||||
.title(String.format(TRANSMIT_APPROVE.getTitle()))
|
||||
.content(String.format(TRANSMIT_APPROVE.getContent(),
|
||||
buildLogUserInfo(dto.getApprover()),
|
||||
processDefinition.getName(),
|
||||
buildLogUserInfo(dto.getTransferTargetApprover()),
|
||||
dto.getAdvice()))
|
||||
.build();
|
||||
|
||||
@ -1,14 +1,19 @@
|
||||
package cn.axzo.nanopart.visa.server.rpc;
|
||||
|
||||
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigQueryDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivitySetAssigneeDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.NodesByModelVO;
|
||||
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
|
||||
import cn.axzo.workflow.common.model.response.print.PrintModelDTO;
|
||||
import cn.axzo.workflow.starter.api.WorkflowCoreService;
|
||||
import cn.axzo.workflow.starter.api.WorkflowManageService;
|
||||
import cn.azxo.framework.common.logger.MethodAroundLog;
|
||||
@ -94,4 +99,24 @@ public class WorkflowGateway {
|
||||
public Boolean setAssignee(BpmnActivitySetAssigneeDTO dto) {
|
||||
return workflowCoreService.sync().setAssignee(dto);
|
||||
}
|
||||
|
||||
@MethodAroundLog(target = "workflow-engine", source = "nanopart", value = "获取打印模板配置内容")
|
||||
public PrintModelDTO getPrintTemplateConfig(PrintTemplateConfigQueryDTO request) {
|
||||
return workflowManageService.getPrintTemplateConfig(request);
|
||||
}
|
||||
|
||||
@MethodAroundLog(target = "workflow-engine", source = "nanopart", value = "查询指定审批实例的表单模型和数据")
|
||||
public FormInstanceVO getFormInstance(FormDetailDTO request) {
|
||||
return workflowManageService.getFormInstance(request);
|
||||
}
|
||||
|
||||
@MethodAroundLog(target = "workflow-engine", source = "nanopart", value = "获得流程定义标识对应的激活的流程定义")
|
||||
public BpmnProcessDefinitionVO getActiveProcessDefinitionByKey(String processDefinitionKey) {
|
||||
return getActiveProcessDefinitionByKey(processDefinitionKey, null);
|
||||
}
|
||||
|
||||
@MethodAroundLog(target = "workflow-engine", source = "nanopart", value = "获得流程定义标识对应的激活的流程定义")
|
||||
public BpmnProcessDefinitionVO getActiveProcessDefinitionByKey(String processDefinitionKey, String workspaceId) {
|
||||
return workflowManageService.getActiveProcessDefinitionByKey(processDefinitionKey, workspaceId);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,12 +2,11 @@ package cn.axzo.nanopart.visa.server.service;
|
||||
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaButtonTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaConfirmBizTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStampStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaChangeApproveCreateReq;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
|
||||
import cn.axzo.nanopart.visa.server.domain.ChangeRecordConfirm;
|
||||
import cn.axzo.nanopart.visa.server.dto.FetchBtnConditionDto;
|
||||
import cn.axzo.nanopart.visa.server.dto.VisaConfirmDto;
|
||||
|
||||
import java.util.List;
|
||||
@ -59,7 +58,7 @@ public interface ChangeRecordConfirmService {
|
||||
* 获取按钮集合
|
||||
* 确认人与发起人的不同的单据状态,按钮列表不相同
|
||||
*/
|
||||
List<VisaButtonTypeEnum> fetchBtnsByCondition(Long visaId, Long personId, Long ouId, Long workspaceId, VisaStatusEnum status, String approvalId, VisaStampStatusEnum stampStatus);
|
||||
List<VisaButtonTypeEnum> fetchBtnsByCondition(FetchBtnConditionDto btnConditionDto);
|
||||
|
||||
/**
|
||||
* 权限过滤
|
||||
|
||||
@ -1,5 +1,9 @@
|
||||
package cn.axzo.nanopart.visa.server.service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import cn.axzo.framework.domain.web.result.PageData;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.request.BizActivityAssigneeDecisionReq;
|
||||
@ -14,18 +18,17 @@ import cn.axzo.nanopart.visa.api.request.VisaChangeExportReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaChangePageSearchReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaChangeTempCreateReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaInitiatorListReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaPayApproveCreateReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaSearchReq;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangeDiscussCreateResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangeInitiatorResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangePageSearchResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangeRelationOrdersResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaSearchResp;
|
||||
import cn.axzo.nanopart.visa.server.domain.ChangeRecord;
|
||||
import cn.axzo.nanopart.visa.server.domain.ChangeRecordRelation;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author xudawei
|
||||
@ -165,4 +168,16 @@ public interface ChangeRecordService extends IService<ChangeRecord> {
|
||||
void update(UpdateVisaChangeReq req);
|
||||
|
||||
List<BpmnTaskDelegateAssigner> bizActivityDecisionAssignee(BizActivityAssigneeDecisionReq req);
|
||||
|
||||
/**
|
||||
* 获取关联的单据信息
|
||||
*/
|
||||
VisaChangeRelationOrdersResp getRelationOrdersById(Long visaId);
|
||||
|
||||
/**
|
||||
* 价款审批表单提交
|
||||
*
|
||||
* @param req
|
||||
*/
|
||||
void approveCreateVisaPay(VisaPayApproveCreateReq req);
|
||||
}
|
||||
|
||||
@ -4,5 +4,11 @@ import cn.axzo.log.platform.client.model.req.LogAddReq;
|
||||
|
||||
public interface OperateLogService {
|
||||
|
||||
void saveRequest(String scene, Long tag, Object request);
|
||||
|
||||
void save(String scene, Long tag, Object... messages);
|
||||
|
||||
void save(String scene, String tag, Object... messages);
|
||||
|
||||
void save(LogAddReq param);
|
||||
}
|
||||
|
||||
@ -22,6 +22,7 @@ import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.request.ChangeStatusRequest;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaChangeApproveCreateReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaChangeTempCreateReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaPayApproveCreateReq;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
|
||||
import cn.axzo.nanopart.visa.server.domain.ChangeRecord;
|
||||
import cn.axzo.nanopart.visa.server.domain.ChangeRecordBill;
|
||||
@ -37,6 +38,7 @@ import cn.axzo.nanopart.visa.server.rpc.LogApiGateway;
|
||||
import cn.axzo.nanopart.visa.server.rpc.OrganizationalUnitGateway;
|
||||
import cn.axzo.nanopart.visa.server.rpc.RectifyApiGateway;
|
||||
import cn.axzo.nanopart.visa.server.rpc.VisaOrganizationalNodeUserGateway;
|
||||
import cn.axzo.nanopart.visa.server.rpc.VisaProfileGateway;
|
||||
import cn.axzo.nanopart.visa.server.rpc.VisaProjectApiGateway;
|
||||
import cn.axzo.nanopart.visa.server.rpc.WorkflowGateway;
|
||||
import cn.axzo.nanopart.visa.server.rpc.WorkspaceGateway;
|
||||
@ -45,6 +47,7 @@ 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.thor.client.model.DrawingMajorResp;
|
||||
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
|
||||
import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.lang.Pair;
|
||||
@ -57,6 +60,7 @@ 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.commons.collections4.ListUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
@ -75,6 +79,8 @@ import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_CONTRACT_NAME;
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_CONTRACT_NO;
|
||||
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;
|
||||
@ -94,7 +100,12 @@ 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.enums.VisaStampStatusEnum.USED_PRINTS;
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_PAY_ACTUAL_CONSTRUCTION_COMPLETE_DATE;
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_PAY_APPROVAL_AMOUNT;
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_PAY_COMPLETE_CONFIRM_ATTACH;
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_PAY_COMPLETE_WORKER_NO;
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_PAY_CONFIRM_MATTER;
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_PAY_DECLARED_AMOUNT;
|
||||
import static cn.axzo.nanopart.visa.server.utils.Constants.DATE_FORMAT;
|
||||
|
||||
/**
|
||||
@ -151,6 +162,9 @@ public class VisaHelper {
|
||||
@Resource
|
||||
private WorkflowGateway workflowGateway;
|
||||
|
||||
@Resource
|
||||
private VisaProfileGateway visaProfileGateway;
|
||||
|
||||
/**
|
||||
* 状态更新与添加日志,此时新增记录时状态没有维护
|
||||
*/
|
||||
@ -255,7 +269,7 @@ public class VisaHelper {
|
||||
if (CollectionUtils.isEmpty(areaFullNameInfoByAreaId)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
Map<Long, String> areaIdAndNameMap = areaFullNameInfoByAreaId.stream().collect(Collectors.toMap(ConstructionAreaDTO::getId, ConstructionAreaDTO::getAreaFullName));
|
||||
Map<Long, String> areaIdAndNameMap = areaFullNameInfoByAreaId.stream().collect(Collectors.toMap(ConstructionAreaDTO::getId, ConstructionAreaDTO::getAreaFullName, (v1, v2) -> v1));
|
||||
|
||||
areas.forEach(area -> {
|
||||
area.setAreaName(areaIdAndNameMap.get(area.getAreaId()));
|
||||
@ -350,27 +364,31 @@ public class VisaHelper {
|
||||
ChangeRecord changeRecord = visaIdMap.get(key);
|
||||
if (Objects.nonNull(changeRecord) && Objects.nonNull(changeRecord.getStatus())) {
|
||||
Set<VisaButtonTypeEnum> buttons = VisaButtonTypeEnum.fetchBtnsByBizTypeAndStatusWhenPage(value, changeRecord.getStatus());
|
||||
if (Objects.equals(changeRecord.getStatus(), VisaStatusEnum.COMPLETED) && Objects.nonNull(changeRecord.getStampStatus())) {
|
||||
if (value.contains(VisaConfirmBizTypeEnum.CREATE)) {
|
||||
switch (changeRecord.getStampStatus()) {
|
||||
case UNPRINTED:
|
||||
if (StringUtils.hasText(changeRecord.getApprovalId()) && workflowGateway.hasPrintTemplate(changeRecord.getApprovalId())) {
|
||||
buttons.add(VisaButtonTypeEnum.REQUEST_STAMP);
|
||||
}
|
||||
if (changeRecord.getAppliedStamp()) {
|
||||
buttons.add(VisaButtonTypeEnum.STAMP_PROGRESS);
|
||||
}
|
||||
break;
|
||||
case WITH_PRINT:
|
||||
buttons.add(VisaButtonTypeEnum.STAMP_PROGRESS);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (Objects.equals(changeRecord.getStampStatus(), USED_PRINTS)) {
|
||||
buttons.add(VisaButtonTypeEnum.STAMP_FILE);
|
||||
}
|
||||
// if (Objects.equals(changeRecord.getStatus(), VisaStatusEnum.COMPLETED) && Objects.nonNull(changeRecord.getStampStatus())) {
|
||||
// if (value.contains(VisaConfirmBizTypeEnum.CREATE)) {
|
||||
// switch (changeRecord.getStampStatus()) {
|
||||
// case UNPRINTED:
|
||||
// if (StringUtils.hasText(changeRecord.getApprovalId()) && workflowGateway.hasPrintTemplate(changeRecord.getApprovalId())) {
|
||||
// buttons.add(VisaButtonTypeEnum.REQUEST_STAMP);
|
||||
// }
|
||||
// if (changeRecord.getAppliedStamp()) {
|
||||
// buttons.add(VisaButtonTypeEnum.STAMP_PROGRESS);
|
||||
// }
|
||||
// break;
|
||||
// case WITH_PRINT:
|
||||
// buttons.add(VisaButtonTypeEnum.STAMP_PROGRESS);
|
||||
// break;
|
||||
// default:
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// if (Objects.equals(changeRecord.getStampStatus(), USED_PRINTS)) {
|
||||
// buttons.add(VisaButtonTypeEnum.STAMP_FILE);
|
||||
// }
|
||||
// }
|
||||
// 判断单据是否拥有【申请价款确认】按钮
|
||||
if (hasBtnToPayApprove(changeRecord.getStatus(), changeRecord.getApprovalStatus(), changeRecord.getApprovalStatusPay())) {
|
||||
buttons.add(VisaButtonTypeEnum.TO_PAY_APPROVE);
|
||||
}
|
||||
returnMap.put(key, buttons);
|
||||
}
|
||||
@ -378,6 +396,24 @@ public class VisaHelper {
|
||||
return returnMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 单据通过立项审批或完工价款确认审批被驳回/中止
|
||||
*
|
||||
* @param status 变洽签状态
|
||||
* @param approvalStatus 立项审批状态
|
||||
* @param approvalStatusPay 价款确认审批状态
|
||||
* @return true - 有【申请价款确认】按钮,false - 无【申请价款确认】按钮
|
||||
*/
|
||||
public static boolean hasBtnToPayApprove(VisaStatusEnum status, String approvalStatus, String approvalStatusPay) {
|
||||
if (Objects.equals(status, VisaStatusEnum.APPROVING)) {
|
||||
return Objects.equals(approvalStatus, BpmnProcessInstanceResultEnum.APPROVED.getStatus())
|
||||
&& (!StringUtils.hasText(approvalStatusPay)
|
||||
|| Objects.equals(approvalStatusPay, BpmnProcessInstanceResultEnum.REJECTED.getStatus())
|
||||
|| Objects.equals(approvalStatusPay, BpmnProcessInstanceResultEnum.ABORTED.getStatus()));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static String buildChangeAmount(BigDecimal changeAmount) {
|
||||
if (Objects.isNull(changeAmount)) {
|
||||
return "";
|
||||
@ -407,6 +443,9 @@ public class VisaHelper {
|
||||
formVariables.put(FORM_FIELD_RELATION_AREA, buildAreaName(req.getRelationArea()));
|
||||
formVariables.put(FORM_FIELD_CONTEXT_DESCRIPTION, buildContextDescription(req.getChangeContextAndDescriptionList()));
|
||||
formVariables.put(FORM_FIELD_UNIT_PERSON, buildUnitPerson(req.getRelationUnitAndPersonList(), req.getRelationWorkspaceId()));
|
||||
formVariables.put(FORM_CONTRACT_NAME, req.getContractName());
|
||||
formVariables.put(FORM_CONTRACT_NO, req.getContractNo());
|
||||
|
||||
|
||||
// 非必填项
|
||||
if (Objects.nonNull(req.getAmountChange())) {
|
||||
@ -640,4 +679,27 @@ public class VisaHelper {
|
||||
}
|
||||
return req;
|
||||
}
|
||||
|
||||
public Map<String, Object> buildPayStartFormVariables(VisaPayApproveCreateReq req, Long visaId) {
|
||||
Map<String, Object> variables = Maps.newHashMap();
|
||||
variables.put(FORM_PAY_COMPLETE_WORKER_NO, req.getCompleteWorkNo());
|
||||
variables.put(FORM_PAY_CONFIRM_MATTER, req.getConfirmMatter());
|
||||
variables.put(FORM_PAY_ACTUAL_CONSTRUCTION_COMPLETE_DATE, req.getActualConstructionCompleteDate());
|
||||
variables.put(FORM_PAY_DECLARED_AMOUNT, req.getDeclaredAmount());
|
||||
variables.put(FORM_PAY_APPROVAL_AMOUNT, null);
|
||||
variables.put(FORM_PAY_COMPLETE_CONFIRM_ATTACH, ListUtils.emptyIfNull(req.getAttachments()));
|
||||
|
||||
VisaChangeApproveCreateReq createReq = buildVisaChangeApproveCreateReqByVisaId(visaId);
|
||||
Map<String, Object> visaFormVariables = buildStartFormVariables(createReq);
|
||||
variables.put(FORM_CONTRACT_NAME, createReq.getContractName());
|
||||
variables.put(FORM_CONTRACT_NO, createReq.getContractNo());
|
||||
variables.put(FORM_FIELD_NO, visaFormVariables.getOrDefault(FORM_FIELD_NO, null));
|
||||
variables.put(FORM_FIELD_TOPIC, visaFormVariables.getOrDefault(FORM_FIELD_TOPIC, null));
|
||||
variables.put(FORM_FIELD_WORKSPACE_NAME, visaFormVariables.getOrDefault(FORM_FIELD_WORKSPACE_NAME, null));
|
||||
variables.put(FORM_FIELD_RELATION_PROFESSIONAL, visaFormVariables.getOrDefault(FORM_FIELD_RELATION_PROFESSIONAL, null));
|
||||
variables.put(FORM_FIELD_REASON, visaFormVariables.getOrDefault(FORM_FIELD_REASON, null));
|
||||
variables.put(FORM_FIELD_UNIT_PERSON, visaFormVariables.getOrDefault(FORM_FIELD_UNIT_PERSON, null));
|
||||
|
||||
return variables;
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,6 +17,7 @@ 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 org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
@ -63,6 +64,7 @@ public class ChangeRecordBillServiceImpl extends ServiceImpl<ChangeRecordBillDao
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean deleteByVisaId(Long visaId) {
|
||||
if (Objects.isNull(visaId)) {
|
||||
return false;
|
||||
|
||||
@ -12,13 +12,12 @@ import cn.axzo.maokai.api.vo.response.OrganizationalUnitVO;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaButtonTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaConfirmBizTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStampStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaChangeApproveCreateReq;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
|
||||
import cn.axzo.nanopart.visa.server.domain.ChangeRecord;
|
||||
import cn.axzo.nanopart.visa.server.domain.ChangeRecordConfirm;
|
||||
import cn.axzo.nanopart.visa.server.dto.FetchBtnConditionDto;
|
||||
import cn.axzo.nanopart.visa.server.dto.VisaConfirmDto;
|
||||
import cn.axzo.nanopart.visa.server.mapper.ChangeRecordConfirmDao;
|
||||
import cn.axzo.nanopart.visa.server.rpc.DataObjectApiGateway;
|
||||
@ -30,6 +29,7 @@ import cn.axzo.nanopart.visa.server.rpc.WorkflowGateway;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordConfirmService;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordLogService;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordService;
|
||||
import cn.axzo.nanopart.visa.server.service.VisaHelper;
|
||||
import cn.axzo.nanopart.visa.server.utils.Constants;
|
||||
import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq;
|
||||
@ -44,6 +44,7 @@ import com.google.common.collect.Sets;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@ -53,8 +54,6 @@ import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaStampStatusEnum.USED_PRINTS;
|
||||
|
||||
/**
|
||||
* @author xudawei
|
||||
* @date 2025/01/15
|
||||
@ -121,6 +120,7 @@ public class ChangeRecordConfirmServiceImpl extends ServiceImpl<ChangeRecordConf
|
||||
/**
|
||||
* 通过变更签证Id,删除变更签证确认信息
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean deleteByVisaId(Long visaId, List<VisaConfirmBizTypeEnum> bizTypes) {
|
||||
if (Objects.isNull(visaId)) {
|
||||
return false;
|
||||
@ -136,54 +136,58 @@ public class ChangeRecordConfirmServiceImpl extends ServiceImpl<ChangeRecordConf
|
||||
* 确认人与发起人的不同的单据状态,按钮列表不相同
|
||||
*/
|
||||
@Override
|
||||
public List<VisaButtonTypeEnum> fetchBtnsByCondition(Long visaId, Long personId, Long ouId, Long workspaceId, VisaStatusEnum status, String approvalId, VisaStampStatusEnum stampStatus) {
|
||||
Set<VisaConfirmBizTypeEnum> bizTypes = fetchBizTypesByCondition(visaId, personId, ouId, workspaceId);
|
||||
public List<VisaButtonTypeEnum> fetchBtnsByCondition(FetchBtnConditionDto btnConditionDto) {
|
||||
Set<VisaConfirmBizTypeEnum> bizTypes = fetchBizTypesByCondition(btnConditionDto.getVisaId(), btnConditionDto.getPersonId(), btnConditionDto.getOuId(), btnConditionDto.getWorkspaceId());
|
||||
//添加审批人添加到集合bizTypes中
|
||||
this.addBizTypeApprove(bizTypes, visaId, personId, ouId, workspaceId);
|
||||
this.addBizTypeApprove(bizTypes, btnConditionDto.getVisaId(), btnConditionDto.getPersonId(), btnConditionDto.getOuId(), btnConditionDto.getWorkspaceId());
|
||||
|
||||
Set<VisaButtonTypeEnum> visaButtonTypeEnums = VisaButtonTypeEnum.fetchBtnSetByBizTypeAndStatus(bizTypes, status);
|
||||
Set<VisaButtonTypeEnum> visaButtonTypeEnums = VisaButtonTypeEnum.fetchBtnSetByBizTypeAndStatus(bizTypes, btnConditionDto.getStatus());
|
||||
// 判断单据是否拥有【申请价款确认】按钮
|
||||
if (VisaHelper.hasBtnToPayApprove(btnConditionDto.getStatus(), btnConditionDto.getApprovalStatus(), btnConditionDto.getApprovalStatusPay())) {
|
||||
visaButtonTypeEnums.add(VisaButtonTypeEnum.TO_PAY_APPROVE);
|
||||
}
|
||||
//没有点击[审批记录],则不展示[查看审批记录]按钮
|
||||
if (!changeRecordLogService.hasLogType(visaId, VisaLogTypeEnum.TO_APPRROVE)) {
|
||||
visaButtonTypeEnums.remove(VisaButtonTypeEnum.APPROVAL_RECORD);
|
||||
visaButtonTypeEnums.remove(VisaButtonTypeEnum.PRINT);
|
||||
} else {
|
||||
if (visaButtonTypeEnums.contains(VisaButtonTypeEnum.TO_APPROVE)) {
|
||||
visaButtonTypeEnums.remove(VisaButtonTypeEnum.TO_APPROVE);
|
||||
visaButtonTypeEnums.add(VisaButtonTypeEnum.AGAIN_TO_APPROVE);
|
||||
}
|
||||
}
|
||||
// if (!changeRecordLogService.hasLogType(visaId, VisaLogTypeEnum.TO_APPRROVE)) {
|
||||
// visaButtonTypeEnums.remove(VisaButtonTypeEnum.APPROVAL_RECORD);
|
||||
// visaButtonTypeEnums.remove(VisaButtonTypeEnum.PRINT);
|
||||
// } else {
|
||||
// if (visaButtonTypeEnums.contains(VisaButtonTypeEnum.TO_APPROVE)) {
|
||||
// visaButtonTypeEnums.remove(VisaButtonTypeEnum.TO_APPROVE);
|
||||
// visaButtonTypeEnums.add(VisaButtonTypeEnum.AGAIN_TO_APPROVE);
|
||||
// }
|
||||
// }
|
||||
|
||||
if (!workflowGateway.hasPrintTemplate(approvalId)) {
|
||||
visaButtonTypeEnums.remove(VisaButtonTypeEnum.PRINT);
|
||||
}
|
||||
// if (!workflowGateway.hasPrintTemplate(approvalId)) {
|
||||
// visaButtonTypeEnums.remove(VisaButtonTypeEnum.PRINT);
|
||||
// }
|
||||
//没有点击[发起洽商群聊],则不展示[查看洽商记录]按钮
|
||||
if (!changeRecordLogService.hasLogType(visaId, VisaLogTypeEnum.CHAT_GROUP)) {
|
||||
if (!changeRecordLogService.hasLogType(btnConditionDto.getVisaId(), VisaLogTypeEnum.CHAT_GROUP)) {
|
||||
visaButtonTypeEnums.remove(VisaButtonTypeEnum.CHAT_GROUP_RECORD);
|
||||
}
|
||||
|
||||
if (Objects.nonNull(stampStatus)) {
|
||||
if (bizTypes.contains(VisaConfirmBizTypeEnum.CREATE)) {
|
||||
switch (stampStatus) {
|
||||
case UNPRINTED:
|
||||
if (StringUtils.hasText(approvalId) && workflowGateway.hasPrintTemplate(approvalId)) {
|
||||
visaButtonTypeEnums.add(VisaButtonTypeEnum.REQUEST_STAMP);
|
||||
}
|
||||
ChangeRecord visa = changeRecordService.getById(visaId);
|
||||
if (visa.getAppliedStamp()) {
|
||||
visaButtonTypeEnums.add(VisaButtonTypeEnum.STAMP_PROGRESS);
|
||||
}
|
||||
break;
|
||||
case WITH_PRINT:
|
||||
visaButtonTypeEnums.add(VisaButtonTypeEnum.STAMP_PROGRESS);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (Objects.equals(stampStatus, USED_PRINTS)) {
|
||||
visaButtonTypeEnums.add(VisaButtonTypeEnum.STAMP_FILE);
|
||||
}
|
||||
}
|
||||
//
|
||||
// if (Objects.nonNull(stampStatus)) {
|
||||
// if (bizTypes.contains(VisaConfirmBizTypeEnum.CREATE)) {
|
||||
// switch (stampStatus) {
|
||||
// case UNPRINTED:
|
||||
// if (StringUtils.hasText(approvalId) && workflowGateway.hasPrintTemplate(approvalId)) {
|
||||
// visaButtonTypeEnums.add(VisaButtonTypeEnum.REQUEST_STAMP);
|
||||
// }
|
||||
// ChangeRecord visa = changeRecordService.getById(visaId);
|
||||
// if (visa.getAppliedStamp()) {
|
||||
// visaButtonTypeEnums.add(VisaButtonTypeEnum.STAMP_PROGRESS);
|
||||
// }
|
||||
// break;
|
||||
// case WITH_PRINT:
|
||||
// visaButtonTypeEnums.add(VisaButtonTypeEnum.STAMP_PROGRESS);
|
||||
// break;
|
||||
// default:
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// if (Objects.equals(stampStatus, USED_PRINTS)) {
|
||||
// visaButtonTypeEnums.add(VisaButtonTypeEnum.STAMP_FILE);
|
||||
// }
|
||||
// }
|
||||
|
||||
if (CollectionUtils.isEmpty(visaButtonTypeEnums)) {
|
||||
return Lists.newArrayList();
|
||||
|
||||
@ -10,12 +10,14 @@ import cn.axzo.nanopart.visa.server.dto.VisaLogDto;
|
||||
import cn.axzo.nanopart.visa.server.dto.VisaLogParam;
|
||||
import cn.axzo.nanopart.visa.server.mapper.ChangeRecordLogDao;
|
||||
import cn.axzo.nanopart.visa.server.rpc.VisaOrganizationalNodeUserGateway;
|
||||
import cn.axzo.nanopart.visa.server.rpc.WorkflowGateway;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordLogService;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordService;
|
||||
import cn.axzo.nanopart.visa.server.utils.Constants;
|
||||
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.response.bpmn.process.BpmnProcessDefinitionVO;
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
@ -32,6 +34,8 @@ import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.nanopart.visa.server.utils.Constants.CHANGE_STATUS_FILE_ORDER_BY;
|
||||
|
||||
/**
|
||||
* @author xudawei
|
||||
* @date 2025/01/15
|
||||
@ -47,6 +51,9 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
|
||||
@Resource
|
||||
private ChangeRecordService changeRecordService;
|
||||
|
||||
@Resource
|
||||
private WorkflowGateway workflowGateway;
|
||||
|
||||
/**
|
||||
* 增加操作日志
|
||||
*/
|
||||
@ -96,7 +103,7 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
|
||||
.action(VisaLogTypeEnum.CHAT_GROUP.name())
|
||||
.title(VisaLogTypeEnum.CHAT_GROUP.getTitle())
|
||||
.content(String.format(VisaLogTypeEnum.CHAT_GROUP.getContent(), userName))
|
||||
.orderBy(Constants.CHANGE_STATUS_FILE_ORDER_BY).build());
|
||||
.orderBy(CHANGE_STATUS_FILE_ORDER_BY).build());
|
||||
break;
|
||||
case EDIT_FORM:
|
||||
// 编辑表单
|
||||
@ -143,70 +150,91 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
|
||||
.build());
|
||||
}
|
||||
break;
|
||||
case TO_EXECUTE:
|
||||
// 动作:执行
|
||||
// 状态流转:[决策中|审核不通过的待提报]-->[执行中]
|
||||
userName = this.buildUserName(param.getPersonId(), param.getOuId(), param.getWorkspaceId());
|
||||
|
||||
logList.add(ChangeRecordLog.builder().visaId(visaId)
|
||||
.action(VisaLogTypeEnum.TO_EXECUTE.name())
|
||||
.title(VisaLogTypeEnum.TO_EXECUTE.getTitle())
|
||||
.content(String.format(VisaLogTypeEnum.TO_EXECUTE.getContent(), userName))
|
||||
.orderBy(Constants.CHANGE_STATUS_FILE_ORDER_BY).build());
|
||||
break;
|
||||
// case TO_EXECUTE:
|
||||
// // 动作:执行
|
||||
// // 状态流转:[决策中|审核不通过的待提报]-->[执行中]
|
||||
// userName = this.buildUserName(param.getPersonId(), param.getOuId(), param.getWorkspaceId());
|
||||
//
|
||||
// logList.add(ChangeRecordLog.builder().visaId(visaId)
|
||||
// .action(VisaLogTypeEnum.TO_EXECUTE.name())
|
||||
// .title(VisaLogTypeEnum.TO_EXECUTE.getTitle())
|
||||
// .content(String.format(VisaLogTypeEnum.TO_EXECUTE.getContent(), userName))
|
||||
// .orderBy(Constants.CHANGE_STATUS_FILE_ORDER_BY).build());
|
||||
// break;
|
||||
case TO_APPRROVE:
|
||||
if (Objects.isNull(param.getVisaType())) {
|
||||
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
|
||||
param.setVisaType(changeRecord.getType());
|
||||
}
|
||||
userName = this.buildUserName(param.getPersonId(), param.getOuId(), param.getWorkspaceId());
|
||||
BpmnProcessDefinitionVO processDefinition = workflowGateway.getActiveProcessDefinitionByKey(param.getVisaType().getProcessDefinitionKey());
|
||||
// 动作:发起审批
|
||||
// 状态流转:[待提报|审批不通过的待提报|决策中|审批不通过的决策中|执行中]-->[审批中]
|
||||
logList.add(ChangeRecordLog.builder().visaId(visaId)
|
||||
.action(VisaLogTypeEnum.TO_APPRROVE.name())
|
||||
.title(String.format(VisaLogTypeEnum.TO_APPRROVE.getTitle(), changeRecord.getType().getDesc()))
|
||||
.content(String.format(VisaLogTypeEnum.TO_APPRROVE.getContent(), userName, changeRecord.getType().getDesc()))
|
||||
.orderBy(Constants.CHANGE_STATUS_FILE_ORDER_BY).build());
|
||||
.title(String.format(VisaLogTypeEnum.TO_APPRROVE.getTitle(), processDefinition.getName()))
|
||||
.content(String.format(VisaLogTypeEnum.TO_APPRROVE.getContent(), userName, processDefinition.getName()))
|
||||
.orderBy(CHANGE_STATUS_FILE_ORDER_BY).build());
|
||||
break;
|
||||
case APPROVED_AGRESS:
|
||||
if (Objects.isNull(param.getVisaType())) {
|
||||
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
|
||||
param.setVisaType(changeRecord.getType());
|
||||
}
|
||||
// 动作:审批流:某审批人审批通过
|
||||
// 状态流转:仍然是审批中 [审批中] -> [审批中]
|
||||
userName = this.buildUserName(param.getPersonId(), param.getOuId(), param.getWorkspaceId());
|
||||
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(param.getVisaType().getProcessDefinitionKey());
|
||||
logList.add(ChangeRecordLog.builder().visaId(visaId)
|
||||
.action(VisaLogTypeEnum.APPROVED_AGRESS.name())
|
||||
.title(String.format(VisaLogTypeEnum.APPROVED_AGRESS.getTitle(), userName))
|
||||
.content(String.format(VisaLogTypeEnum.APPROVED_AGRESS.getContent(), userName))
|
||||
.content(String.format(VisaLogTypeEnum.APPROVED_AGRESS.getContent(), processDefinition.getName(), userName))
|
||||
.orderBy(Constants.ONE_APPROVED_ORDER_BY).build());
|
||||
break;
|
||||
case REVERT_APPROVE:
|
||||
if (Objects.isNull(param.getVisaType())) {
|
||||
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
|
||||
param.setVisaType(changeRecord.getType());
|
||||
}
|
||||
// 动作:审批流:撤回审批
|
||||
// 状态流转:[审批中] -> [审批到待提报|审批到决策中]
|
||||
// 状态流转:[审批中] -> [审批到待提报|审批到决策中] 仅限第一个立项审批
|
||||
userName = this.buildUserName(param.getPersonId(), param.getOuId(), param.getWorkspaceId());
|
||||
|
||||
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(param.getVisaType().getProcessDefinitionKey());
|
||||
logList.add(ChangeRecordLog.builder().visaId(visaId)
|
||||
.action(VisaLogTypeEnum.REVERT_APPROVE.name())
|
||||
.title(VisaLogTypeEnum.REVERT_APPROVE.getTitle())
|
||||
.content(String.format(VisaLogTypeEnum.REVERT_APPROVE.getContent(), userName))
|
||||
.orderBy(Constants.CHANGE_STATUS_FILE_ORDER_BY).build());
|
||||
.title(String.format(VisaLogTypeEnum.REVERT_APPROVE.getTitle(), processDefinition.getName()))
|
||||
.content(String.format(VisaLogTypeEnum.REVERT_APPROVE.getContent(), userName, processDefinition.getName()))
|
||||
.orderBy(CHANGE_STATUS_FILE_ORDER_BY).build());
|
||||
break;
|
||||
case REJECT_APPROVE:
|
||||
if (Objects.isNull(param.getVisaType())) {
|
||||
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
|
||||
param.setVisaType(changeRecord.getType());
|
||||
}
|
||||
// 动作:审批流:撤回审批
|
||||
// 状态流转:[审批中] -> [审批到待提报|审批到决策中]
|
||||
// 状态流转:[审批中] -> [审批到待提报|审批到决策中] 仅限第一个立项审批
|
||||
userName = this.buildUserName(param.getPersonId(), param.getOuId(), param.getWorkspaceId());
|
||||
|
||||
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(param.getVisaType().getProcessDefinitionKey());
|
||||
logList.add(ChangeRecordLog.builder().visaId(visaId)
|
||||
.action(VisaLogTypeEnum.REJECT_APPROVE.name())
|
||||
.title(String.format(VisaLogTypeEnum.REJECT_APPROVE.getTitle(), userName))
|
||||
.title(String.format(VisaLogTypeEnum.REJECT_APPROVE.getTitle(), userName, processDefinition.getName()))
|
||||
.content(String.format(VisaLogTypeEnum.REJECT_APPROVE.getContent(), userName, param.getReason()))
|
||||
.orderBy(Constants.CHANGE_STATUS_FILE_ORDER_BY).build());
|
||||
.orderBy(CHANGE_STATUS_FILE_ORDER_BY).build());
|
||||
break;
|
||||
case TRANSMIT_APPROVE:
|
||||
if (Objects.isNull(param.getVisaType())) {
|
||||
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
|
||||
param.setVisaType(changeRecord.getType());
|
||||
}
|
||||
// 动作:审批流操作:转交
|
||||
// 状态流转:[审批中] -> [审批到待提报|审批到决策中]
|
||||
// 状态流转:[审批中] -> [审批到待提报|审批到决策中] 仅限第一个立项审批
|
||||
userName = this.buildUserName(param.getPersonId(), param.getOuId(), param.getWorkspaceId());
|
||||
|
||||
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(param.getVisaType().getProcessDefinitionKey());
|
||||
logList.add(ChangeRecordLog.builder().visaId(visaId)
|
||||
.action(VisaLogTypeEnum.TRANSMIT_APPROVE.name())
|
||||
.title(VisaLogTypeEnum.TRANSMIT_APPROVE.getTitle())
|
||||
.content(String.format(VisaLogTypeEnum.TRANSMIT_APPROVE.getContent(), userName, param.getTransmitTo(),param.getReason()))
|
||||
.orderBy(Constants.CHANGE_STATUS_FILE_ORDER_BY).build());
|
||||
.content(String.format(VisaLogTypeEnum.TRANSMIT_APPROVE.getContent(), userName, processDefinition.getName(), param.getTransmitTo(), param.getReason()))
|
||||
.orderBy(CHANGE_STATUS_FILE_ORDER_BY).build());
|
||||
break;
|
||||
case FORBIDED:
|
||||
// 动作:作废
|
||||
@ -216,18 +244,36 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
|
||||
.action(VisaLogTypeEnum.FORBIDED.name())
|
||||
.title(VisaLogTypeEnum.FORBIDED.getTitle())
|
||||
.content(String.format(VisaLogTypeEnum.FORBIDED.getContent(), userName))
|
||||
.orderBy(Constants.CHANGE_STATUS_FILE_ORDER_BY).build());
|
||||
.orderBy(CHANGE_STATUS_FILE_ORDER_BY).build());
|
||||
break;
|
||||
case APPROVE_COMPLETED:
|
||||
changeRecord = this.changeRecordService.getById(visaId);
|
||||
if (Objects.isNull(param.getVisaType())) {
|
||||
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
|
||||
param.setVisaType(changeRecord.getType());
|
||||
}
|
||||
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(param.getVisaType().getProcessDefinitionKey());
|
||||
// 动作:整个审批通过
|
||||
// 状态流转:[审批中]-->[已完成]
|
||||
logList.add(ChangeRecordLog.builder().visaId(visaId)
|
||||
.action(VisaLogTypeEnum.APPROVE_COMPLETED.name())
|
||||
.title(String.format(VisaLogTypeEnum.APPROVE_COMPLETED.getTitle(), changeRecord.getType().getDesc()))
|
||||
.content(String.format(VisaLogTypeEnum.APPROVE_COMPLETED.getContent(), changeRecord.getType().getDesc()))
|
||||
.title(String.format(VisaLogTypeEnum.APPROVE_COMPLETED.getTitle(), processDefinition.getName()))
|
||||
.content(String.format(VisaLogTypeEnum.APPROVE_COMPLETED.getContent(), processDefinition.getName()))
|
||||
.orderBy(Constants.APPROVE_COMPLETED_ORDER_BY).build());
|
||||
break;
|
||||
case APPROVE_ABORT:
|
||||
if (Objects.isNull(param.getVisaType())) {
|
||||
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
|
||||
param.setVisaType(changeRecord.getType());
|
||||
}
|
||||
// 动作:审批过程异常,被流程引擎中止
|
||||
// 状态流转:[审批中]->[审批到待提报|审批到决策中] 仅限第一个立项审批
|
||||
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(param.getVisaType().getProcessDefinitionKey());
|
||||
logList.add(ChangeRecordLog.builder().visaId(visaId)
|
||||
.action(VisaLogTypeEnum.APPROVE_ABORT.name())
|
||||
.title(String.format(VisaLogTypeEnum.APPROVE_ABORT.getTitle(), processDefinition.getName()))
|
||||
.content(String.format(VisaLogTypeEnum.APPROVE_ABORT.getContent(), processDefinition.getName()))
|
||||
.orderBy(CHANGE_STATUS_FILE_ORDER_BY).build());
|
||||
break;
|
||||
default:
|
||||
throw new ServiceException("变签日志类型不匹配");
|
||||
}
|
||||
@ -267,6 +313,7 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
|
||||
|
||||
/**
|
||||
* 通过变签Id获取日志
|
||||
*
|
||||
* @param visaId 变签Id
|
||||
*/
|
||||
public List<FetchVisaLogByVisaIdResponse> fetchVisaLogByVisaId(Long visaId) {
|
||||
@ -303,6 +350,7 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
|
||||
|
||||
/**
|
||||
* 通过变签Id获取日志
|
||||
*
|
||||
* @param visaId 变签Id
|
||||
* @param logType 类型
|
||||
*/
|
||||
@ -334,6 +382,7 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
|
||||
|
||||
/**
|
||||
* 是否有日志类型
|
||||
*
|
||||
* @param visaId 变更签证Id
|
||||
* @param logType 类型
|
||||
* @return true:有;false:没有
|
||||
|
||||
@ -24,6 +24,7 @@ import cn.axzo.nanopart.ess.api.request.GetSealsRequest;
|
||||
import cn.axzo.nanopart.ess.api.response.CreateContractByFileResponse;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaButtonTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaProcessPhase;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaRelationVarTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStampStatusEnum;
|
||||
@ -56,6 +57,7 @@ import cn.axzo.nanopart.visa.server.rpc.WorkspaceGateway;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordLogService;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordRelationService;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordService;
|
||||
import cn.axzo.nanopart.visa.server.service.OperateLogService;
|
||||
import cn.axzo.nanopart.visa.server.service.VisaHelper;
|
||||
import cn.axzo.nanopart.visa.server.utils.Constants;
|
||||
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
|
||||
@ -65,6 +67,7 @@ import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCre
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.NodesByModelVO;
|
||||
import cn.axzo.workflow.common.model.response.print.PrintModelDTO;
|
||||
import cn.hutool.core.lang.UUID;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
@ -118,8 +121,11 @@ import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_VAR_STAMP
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_VAR_STAMP_RECIPIENT;
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_VAR_STAMP_TYPE;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.ESS_RECIPIENT_ID_MAP;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.ESS_RECIPIENT_ID_MAP_PAY;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PRINT_PDF_FILE;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PRINT_PDF_FILE_PAY;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS_PAY;
|
||||
import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAction.REQUEST_STAMP;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
|
||||
@ -143,6 +149,8 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
private final RefreshableConfiguration refreshableConfiguration;
|
||||
private final VisaCooperateShipGateway visaCooperateShipGateway;
|
||||
private final OrganizationalUnitGateway organizationalUnitGateway;
|
||||
private final PrintModelService printModelService;
|
||||
private final OperateLogService operateLogService;
|
||||
@Resource
|
||||
@Lazy
|
||||
private VisaHelper visaHelper;
|
||||
@ -203,6 +211,7 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean deleteByVisaId(Long visaId, List<VisaRelationFieldEnum> relationTypes) {
|
||||
if (NumberUtil.isNotPositiveNumber(visaId)) {
|
||||
return false;
|
||||
@ -336,28 +345,10 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
.name(VisaButtonTypeEnum.TO_APPROVE.getDesc())
|
||||
.type(VisaButtonTypeEnum.TO_APPROVE.name())
|
||||
.build());
|
||||
buttons.add(ImGroupButton.builder()
|
||||
.name(VisaButtonTypeEnum.EXECUTE.getDesc())
|
||||
.type(VisaButtonTypeEnum.EXECUTE.name())
|
||||
.build());
|
||||
} else {
|
||||
buttons.add(ImGroupButton.builder()
|
||||
.name(VisaButtonTypeEnum.FORBID.getDesc())
|
||||
.type(VisaButtonTypeEnum.FORBID.name())
|
||||
.build());
|
||||
buttons.add(ImGroupButton.builder()
|
||||
.name(VisaButtonTypeEnum.REDECISION.getDesc())
|
||||
.type(VisaButtonTypeEnum.REDECISION.name())
|
||||
.build());
|
||||
}
|
||||
break;
|
||||
case EXECUTING:
|
||||
if (req.getGroupTotalPersonCount() - 1 == agreeCount) {
|
||||
// 全部同意
|
||||
buttons.add(ImGroupButton.builder()
|
||||
.name(VisaButtonTypeEnum.TO_APPROVE.getDesc())
|
||||
.type(VisaButtonTypeEnum.TO_APPROVE.name())
|
||||
.build());
|
||||
//buttons.add(ImGroupButton.builder()
|
||||
// .name(VisaButtonTypeEnum.EXECUTE.getDesc())
|
||||
// .type(VisaButtonTypeEnum.EXECUTE.name())
|
||||
// .build());
|
||||
} else {
|
||||
buttons.add(ImGroupButton.builder()
|
||||
.name(VisaButtonTypeEnum.FORBID.getDesc())
|
||||
@ -369,11 +360,29 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
.build());
|
||||
}
|
||||
break;
|
||||
//case EXECUTING:
|
||||
// if (req.getGroupTotalPersonCount() - 1 == agreeCount) {
|
||||
// // 全部同意
|
||||
// buttons.add(ImGroupButton.builder()
|
||||
// .name(VisaButtonTypeEnum.TO_APPROVE.getDesc())
|
||||
// .type(VisaButtonTypeEnum.TO_APPROVE.name())
|
||||
// .build());
|
||||
// } else {
|
||||
// buttons.add(ImGroupButton.builder()
|
||||
// .name(VisaButtonTypeEnum.FORBID.getDesc())
|
||||
// .type(VisaButtonTypeEnum.FORBID.name())
|
||||
// .build());
|
||||
// buttons.add(ImGroupButton.builder()
|
||||
// .name(VisaButtonTypeEnum.REDECISION.getDesc())
|
||||
// .type(VisaButtonTypeEnum.REDECISION.name())
|
||||
// .build());
|
||||
// }
|
||||
// break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else if (Objects.equals(VisaStatusEnum.DECIDING, record.getStatus())
|
||||
|| Objects.equals(VisaStatusEnum.EXECUTING, record.getStatus())) {
|
||||
/*|| Objects.equals(VisaStatusEnum.EXECUTING, record.getStatus())*/) {
|
||||
// IM 群中非群主的人
|
||||
Optional<ChangeRecordRelation> any = imGroupParticipate.stream()
|
||||
.filter(i -> Objects.equals(i.getCreateBy(), req.getPersonId()))
|
||||
@ -490,10 +499,11 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
AssertUtil.isTrue(Objects.nonNull(req.getOperatorOuId()) && Objects.nonNull(req.getOperatorPersonId()), "操作人信息不能为空");
|
||||
ChangeRecord visa = changeRecordService.getById(req.getVisaId());
|
||||
AssertUtil.notNull(visa, "变洽签单据不存在");
|
||||
operateLogService.saveRequest("requestStamp", visa.getId(), req);
|
||||
|
||||
final boolean addLog = !StringUtils.hasText(visa.getContractId());
|
||||
final boolean addLog = !StringUtils.hasText(visa.getContractId()) || !StringUtils.hasText(visa.getContractIdPay());
|
||||
// 移除上一次申请
|
||||
removeLastRequest(visa);
|
||||
removeLastRequest(visa, req.getPhase());
|
||||
// 或者指定单位下的签章人作为审批人
|
||||
Map<Long, List<EssSealPersonInfo>> stampUserMap = listOuAssignees(req);
|
||||
// 创建电子签合同
|
||||
@ -513,7 +523,10 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
List<ChangeRecordRelation> relations = req.getRequestStamps().stream().map(i -> {
|
||||
ChangeRecordRelation stamp = new ChangeRecordRelation();
|
||||
stamp.setVisaId(req.getVisaId());
|
||||
if (req.getPhase() == VisaProcessPhase.PROJECT)
|
||||
stamp.setVarName(PROCESS_INSTANCE_OF_ESS.name());
|
||||
else
|
||||
stamp.setVarName(PROCESS_INSTANCE_OF_ESS_PAY.name());
|
||||
stamp.setVarExt(String.valueOf(i.getOuId()));
|
||||
stamp.setVarType(VisaRelationVarTypeEnum.JSON.getType());
|
||||
stamp.setContent(JSON.toJSONString(RelationEssContextDto.builder()
|
||||
@ -530,7 +543,8 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
return stamp;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
if (Objects.nonNull(essRecipientIdMap) && CollectionUtils.isEmpty(findByVisaAndVarName(visa.getId(), ESS_RECIPIENT_ID_MAP.name()))) {
|
||||
if (Objects.nonNull(essRecipientIdMap)) {
|
||||
if (req.getPhase() == VisaProcessPhase.PROJECT && CollectionUtils.isEmpty(findByVisaAndVarName(visa.getId(), ESS_RECIPIENT_ID_MAP.name()))) {
|
||||
// 记录单位与其在合同中的签章位置
|
||||
ChangeRecordRelation recipientRelation = new ChangeRecordRelation();
|
||||
recipientRelation.setVisaId(visa.getId());
|
||||
@ -539,12 +553,25 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
recipientRelation.setContent(JSON.toJSONString(essRecipientIdMap));
|
||||
relations.add(recipientRelation);
|
||||
}
|
||||
if (req.getPhase() == VisaProcessPhase.PAYMENT && CollectionUtils.isEmpty(findByVisaAndVarName(visa.getId(), ESS_RECIPIENT_ID_MAP_PAY.name()))) {
|
||||
// 记录单位与其在合同中的签章位置
|
||||
ChangeRecordRelation recipientRelation = new ChangeRecordRelation();
|
||||
recipientRelation.setVisaId(visa.getId());
|
||||
recipientRelation.setVarName(ESS_RECIPIENT_ID_MAP_PAY.name());
|
||||
recipientRelation.setVarType(VisaRelationVarTypeEnum.JSON.getType());
|
||||
recipientRelation.setContent(JSON.toJSONString(essRecipientIdMap));
|
||||
relations.add(recipientRelation);
|
||||
}
|
||||
}
|
||||
|
||||
// 打印生成的 PDF 文件信息
|
||||
if (Objects.nonNull(req.getPdfFile())) {
|
||||
ChangeRecordRelation relation = new ChangeRecordRelation();
|
||||
relation.setVisaId(req.getVisaId());
|
||||
relation.setVarName(PRINT_PDF_FILE.name());
|
||||
VisaRelationFieldEnum filedType = req.getPhase() == VisaProcessPhase.PROJECT //
|
||||
? PRINT_PDF_FILE
|
||||
: PRINT_PDF_FILE_PAY;
|
||||
relation.setVarName(filedType.name());
|
||||
relation.setVarType(VisaRelationVarTypeEnum.JSON.getType());
|
||||
relation.setContent(JSON.toJSONString(req.getPdfFile()));
|
||||
relation.setCreateBy(req.getOperatorPersonId());
|
||||
@ -556,15 +583,19 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
|
||||
if (addLog) {
|
||||
// 仅完全重新发起时,才记录日志
|
||||
insertLog(UpdateVisaChangeReq.builder()
|
||||
insertLog(visa, UpdateVisaChangeReq.builder()
|
||||
.visaId(visa.getId())
|
||||
.phase(req.getPhase())
|
||||
.operatorId(req.getOperatorPersonId())
|
||||
.operatorName(req.getOperatorPersonName())
|
||||
.visaStampAction(REQUEST_STAMP)
|
||||
.build());
|
||||
}
|
||||
|
||||
if (req.getPhase() == VisaProcessPhase.PROJECT)
|
||||
visa.setAppliedStamp(true);
|
||||
else
|
||||
visa.setAppliedStampPay(true);
|
||||
changeRecordService.updateById(visa);
|
||||
}
|
||||
|
||||
@ -585,12 +616,13 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
));
|
||||
}
|
||||
|
||||
private void insertLog(UpdateVisaChangeReq req) {
|
||||
private void insertLog(ChangeRecord visa, UpdateVisaChangeReq req) {
|
||||
PrintModelDTO printModel = printModelService.getPrintTemplateConfig(visa, req.getPhase());
|
||||
if (Objects.equals(req.getVisaStampAction(), REQUEST_STAMP)) {
|
||||
changeRecordLogService.addLog(ChangeRecordLog.builder()
|
||||
.visaId(req.getVisaId())
|
||||
.action(VisaLogTypeEnum.REQUEST_STAMP.name())
|
||||
.title(String.format(VisaLogTypeEnum.REQUEST_STAMP.getTitle(), req.getOperatorName()))
|
||||
.title(String.format(VisaLogTypeEnum.REQUEST_STAMP.getTitle(), req.getOperatorName(), printModel.getPrintFileName()))
|
||||
.content(String.format(VisaLogTypeEnum.REQUEST_STAMP.getContent(), req.getOperatorName()))
|
||||
.orderBy(Constants.APPROVE_ORDER_BY)
|
||||
.build());
|
||||
@ -625,12 +657,14 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
return stampUserMap;
|
||||
}
|
||||
|
||||
private void removeLastRequest(ChangeRecord visa) {
|
||||
if (StringUtils.hasText(visa.getContractId())) {
|
||||
return;
|
||||
}
|
||||
private void removeLastRequest(ChangeRecord visa, VisaProcessPhase phase) {
|
||||
if (phase == VisaProcessPhase.PROJECT && !StringUtils.hasText(visa.getContractId())) {
|
||||
deleteByVisaId(visa.getId(), Lists.newArrayList(PRINT_PDF_FILE, PROCESS_INSTANCE_OF_ESS, ESS_RECIPIENT_ID_MAP));
|
||||
}
|
||||
if (phase == VisaProcessPhase.PAYMENT && !StringUtils.hasText(visa.getContractIdPay())) {
|
||||
deleteByVisaId(visa.getId(), Lists.newArrayList(PRINT_PDF_FILE_PAY, PROCESS_INSTANCE_OF_ESS_PAY, ESS_RECIPIENT_ID_MAP_PAY));
|
||||
}
|
||||
}
|
||||
|
||||
private Map<Long, String> listCooperateShipTypes(VisaRequestStampReq req, ChangeRecord visa) {
|
||||
List<Long> ouIds = req.getRequestStamps().stream().map(VisaRequestStampReq.RequestStampModel::getOuId).distinct().collect(Collectors.toList());
|
||||
@ -644,11 +678,16 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
}
|
||||
|
||||
private Map<String, String> createContract(VisaRequestStampReq req, ChangeRecord visa, Map<Long, List<EssSealPersonInfo>> stampUserMap) {
|
||||
if (StringUtils.hasText(visa.getContractId())) {
|
||||
if (req.getPhase() == VisaProcessPhase.PROJECT && StringUtils.hasText(visa.getContractId())) {
|
||||
List<ChangeRecordRelation> recipientIds = findByVisaAndVarName(visa.getId(), ESS_RECIPIENT_ID_MAP.name());
|
||||
AssertUtil.notEmpty(recipientIds, "未找到签章位置信息");
|
||||
return JSON.parseObject(recipientIds.get(0).getContent(), Map.class);
|
||||
}
|
||||
if (req.getPhase() == VisaProcessPhase.PAYMENT && StringUtils.hasText(visa.getContractIdPay())) {
|
||||
List<ChangeRecordRelation> recipientIds = findByVisaAndVarName(visa.getId(), ESS_RECIPIENT_ID_MAP_PAY.name());
|
||||
AssertUtil.notEmpty(recipientIds, "未找到签章位置信息");
|
||||
return JSON.parseObject(recipientIds.get(0).getContent(), Map.class);
|
||||
}
|
||||
CreateContractByFileRequest createContractRequest = new CreateContractByFileRequest();
|
||||
CreateContractByFile pdfFile = new CreateContractByFile();
|
||||
pdfFile.setContractName(visa.getTopic());
|
||||
@ -665,7 +704,7 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
|
||||
createContractRequest.setByFile(pdfFile);
|
||||
createContractRequest.setAppCode(MSG_CENTER_APP_CODE);
|
||||
createContractRequest.setBizCode(String.valueOf(visa.getId()));
|
||||
createContractRequest.setBizCode(String.format("%s:%s", visa.getId(), req.getPhase()));
|
||||
|
||||
List<EssSealPersonInfo> mergedList = stampUserMap.values().stream()
|
||||
.flatMap(Collection::stream)
|
||||
@ -679,8 +718,13 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
|
||||
CreateContractByFileResponse contract = essGateway.createContract(createContractRequest);
|
||||
AssertUtil.notNull(contract, "腾讯电子签合同创建失败");
|
||||
if (req.getPhase() == VisaProcessPhase.PROJECT) {
|
||||
visa.setContractId(contract.getEssContractId());
|
||||
visa.setStampStatus(VisaStampStatusEnum.WITH_PRINT);
|
||||
} else {
|
||||
visa.setContractIdPay(contract.getEssContractId());
|
||||
visa.setStampStatusPay(VisaStampStatusEnum.WITH_PRINT);
|
||||
}
|
||||
changeRecordService.updateById(visa);
|
||||
|
||||
Map<String, String> essRecipientIdMap = new HashMap<>();
|
||||
@ -740,7 +784,8 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
AssertUtil.notNull(createReq, "未找到变洽签单据");
|
||||
|
||||
if (Objects.isNull(req.getPdfFile())) {
|
||||
List<ChangeRecordRelation> pdfs = findByVisaAndVarName(visa.getId(), PRINT_PDF_FILE.name());
|
||||
VisaRelationFieldEnum type = req.getPhase() == VisaProcessPhase.PROJECT ? PRINT_PDF_FILE : PRINT_PDF_FILE_PAY;
|
||||
List<ChangeRecordRelation> pdfs = findByVisaAndVarName(visa.getId(), type.name());
|
||||
AssertUtil.notEmpty(pdfs, "数据异常,未找到变洽签 PDF 文件");
|
||||
req.setPdfFile(JSON.parseObject(pdfs.get(0).getContent(), UploadFieldDTO.class));
|
||||
}
|
||||
@ -754,7 +799,7 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
|
||||
WORKFLOW_VAR_STAMP_TYPE, model.getSealType().name(),
|
||||
WORKFLOW_PENDING_STAMP_TYPE_DESC, model.getSealType().getDescription(),
|
||||
WORKFLOW_VAR_STAMP_RECIPIENT, MapUtils.emptyIfNull(essRecipientIdMap).getOrDefault(String.valueOf(model.getOuId()), ""),
|
||||
WORKFLOW_VAR_STAMP_CONTRACT_ID, visa.getContractId(),
|
||||
WORKFLOW_VAR_STAMP_CONTRACT_ID, req.getPhase() == VisaProcessPhase.PROJECT ? visa.getContractId() : visa.getContractIdPay(),
|
||||
WORKFLOW_PENDING_PDF_FILE_URL, req.getPdfFile().getFileUrl(),
|
||||
WORKFLOW_PENDING_INITIATOR_NAME, profile.getRealName(),
|
||||
IM_GROUP_BIZ_INFO_VISA_TYPE, visa.getType(),
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package cn.axzo.nanopart.visa.server.service.impl;
|
||||
|
||||
import cn.axzo.apollo.api.req.QueryOrderToBasicReq;
|
||||
import cn.axzo.apollo.api.res.ConstructionAreaDTO;
|
||||
import cn.axzo.apollo.api.res.ConstructionAreaInfo;
|
||||
import cn.axzo.apollo.api.res.TaskOrderToBasicRes;
|
||||
import cn.axzo.apollo.workspace.api.workspace.req.QueryProjectApiReq;
|
||||
@ -28,7 +29,6 @@ import cn.axzo.im.center.api.vo.req.SendChatMessageRequest;
|
||||
import cn.axzo.im.center.api.vo.resp.GroupCreateResponse;
|
||||
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.CooperateShipQueryReq;
|
||||
import cn.axzo.maokai.api.vo.request.OrgNodeUserBriefInfoListReq;
|
||||
import cn.axzo.maokai.api.vo.response.CooperateShipResp;
|
||||
@ -37,13 +37,16 @@ import cn.axzo.maokai.api.vo.response.OrganizationalUnitVO;
|
||||
import cn.axzo.maokai.common.enums.SaasCooperateShipCooperateTypeEnum;
|
||||
import cn.axzo.msg.center.service.dto.PeerPerson;
|
||||
import cn.axzo.msg.center.service.pending.request.CardSendRequest;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaApprovalStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaBillTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaButtonTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaChangeFieldEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaConfirmBizTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaProcessPhase;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaRelationVarTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStampStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.request.BizActivityAssigneeDecisionReq;
|
||||
@ -60,10 +63,12 @@ import cn.axzo.nanopart.visa.api.request.VisaChangeExportReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaChangePageSearchReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaChangeTempCreateReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaInitiatorListReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaPayApproveCreateReq;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaSearchReq;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangeDiscussCreateResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangeInitiatorResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangePageSearchResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaChangeRelationOrdersResp;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaSearchResp;
|
||||
import cn.axzo.nanopart.visa.server.config.RefreshableConfiguration;
|
||||
@ -102,10 +107,12 @@ import cn.axzo.nanopart.visa.server.utils.Constants;
|
||||
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.enums.BpmnProcessInstanceResultEnum;
|
||||
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
|
||||
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;
|
||||
import cn.axzo.workflow.common.model.response.print.PrintModelDTO;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
@ -150,10 +157,12 @@ import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_
|
||||
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;
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_VISA_TYPE_DESC;
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.MSG_CENTER_APP_CODE;
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_PENDING_INITIATOR_NAME;
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_PENDING_TOPIC;
|
||||
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_VAR_VISA_TYPE_KEY;
|
||||
import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAction.ALL_PROCESS_REJECTED;
|
||||
import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAction.AUTO_COMPLETE;
|
||||
import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAction.CANCEL;
|
||||
import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAction.COMPLETE;
|
||||
@ -161,7 +170,10 @@ import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAct
|
||||
import static cn.axzo.nanopart.visa.server.config.BizResultCode.CHANGE_RECORD_NOT_FOUND;
|
||||
import static cn.axzo.nanopart.visa.server.utils.Constants.DATE_FORMAT;
|
||||
import static cn.axzo.nanopart.visa.server.utils.Constants.FORM_FIELD_BILL_NAME;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.ABORTED;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.APPROVED;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.REJECTED;
|
||||
|
||||
/**
|
||||
* @author xudawei
|
||||
@ -238,6 +250,10 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
private ApolloTaskOrderApiGateway taskOrderApiGateway;
|
||||
@Resource
|
||||
private DrawingAnnotationApiGateway drawingAnnotationApiGateway;
|
||||
@Resource
|
||||
private PrintModelService printModelService;
|
||||
@Resource
|
||||
private DetailCardBuilder detailCardBuilder;
|
||||
@Value("${permission.data.flag:true}")
|
||||
private boolean permissionDataFlag;
|
||||
@Autowired
|
||||
@ -267,7 +283,9 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
.newAmountChange(request.getNewAmountChange())
|
||||
.oldAmountChange(request.getOldAmountChange())
|
||||
.uploadAttach(VisaLogParam.uploadAttachWithObject(request.getNewAttach(), request.getOldAttach()))
|
||||
.deleteAttach(VisaLogParam.deleteAttachWithObject(request.getOldAttach(), request.getNewAttach())).build());
|
||||
.deleteAttach(VisaLogParam.deleteAttachWithObject(request.getOldAttach(), request.getNewAttach()))
|
||||
.visaType(request.getVisaType())
|
||||
.build());
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -335,15 +353,16 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
// 状态流转:[待提报|审核不通过的待提报]-->[决策中]
|
||||
preStatusList = Lists.newArrayList(VisaStatusEnum.TO_REPORT, VisaStatusEnum.REPORT_FROM_APPROVE);
|
||||
break;
|
||||
case EXECUTING:
|
||||
// 动作:执行
|
||||
// 状态流转:[决策中|审核不通过的待提报]-->[执行中]
|
||||
preStatusList = Lists.newArrayList(VisaStatusEnum.DECIDING, VisaStatusEnum.DECIDING_FROM_APPROVE);
|
||||
break;
|
||||
// case EXECUTING:
|
||||
// // 动作:执行
|
||||
// // 状态流转:[决策中|审核不通过的待提报]-->[执行中]
|
||||
// preStatusList = Lists.newArrayList(VisaStatusEnum.DECIDING, VisaStatusEnum.DECIDING_FROM_APPROVE);
|
||||
// break;
|
||||
case APPROVING:
|
||||
// 动作:发起审批
|
||||
// 状态流转:[待提报|审批不通过的待提报|决策中|审批不通过的决策中|执行中]-->[审批中]
|
||||
preStatusList = Lists.newArrayList(VisaStatusEnum.TO_REPORT, VisaStatusEnum.REPORT_FROM_APPROVE, VisaStatusEnum.DECIDING, VisaStatusEnum.DECIDING_FROM_APPROVE, VisaStatusEnum.EXECUTING);
|
||||
// preStatusList = Lists.newArrayList(VisaStatusEnum.TO_REPORT, VisaStatusEnum.REPORT_FROM_APPROVE, VisaStatusEnum.DECIDING, VisaStatusEnum.DECIDING_FROM_APPROVE, VisaStatusEnum.EXECUTING);
|
||||
preStatusList = Lists.newArrayList(VisaStatusEnum.TO_REPORT, VisaStatusEnum.REPORT_FROM_APPROVE, VisaStatusEnum.DECIDING, VisaStatusEnum.DECIDING_FROM_APPROVE);
|
||||
break;
|
||||
case REPORT_FROM_APPROVE:
|
||||
// 动作:审批不通过(已驳回/已撤回/已中止)
|
||||
@ -356,7 +375,8 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
case FORBIDED:
|
||||
// 动作:作废
|
||||
// 状态流转:[待提报|审核不通过的待提报|决策中|审核不通过的决策中|执行中|审批中]-->[审核不通过的决策中]
|
||||
preStatusList = Lists.newArrayList(VisaStatusEnum.TO_REPORT, VisaStatusEnum.REPORT_FROM_APPROVE, VisaStatusEnum.DECIDING, VisaStatusEnum.DECIDING_FROM_APPROVE, VisaStatusEnum.EXECUTING, VisaStatusEnum.APPROVING);
|
||||
// preStatusList = Lists.newArrayList(VisaStatusEnum.TO_REPORT, VisaStatusEnum.REPORT_FROM_APPROVE, VisaStatusEnum.DECIDING, VisaStatusEnum.DECIDING_FROM_APPROVE, VisaStatusEnum.EXECUTING, VisaStatusEnum.APPROVING);
|
||||
preStatusList = Lists.newArrayList(VisaStatusEnum.TO_REPORT, VisaStatusEnum.REPORT_FROM_APPROVE, VisaStatusEnum.DECIDING, VisaStatusEnum.DECIDING_FROM_APPROVE, VisaStatusEnum.APPROVING);
|
||||
break;
|
||||
case COMPLETED:
|
||||
// 动作:整个审批通过
|
||||
@ -405,6 +425,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
|
||||
return VisaDetailByIdResponse.builder()
|
||||
.visaId(visaId)
|
||||
.cards(detailCardBuilder.build(visa))
|
||||
.no(visa.getNo()) //单号
|
||||
.type(visa.getType()) //单据类型,DESIGN_CHANGE:设计变更,TECHNOLOGY_APPROVED:技术核定,PROJECT_VISA:工程签证
|
||||
.reason(visa.getReason()) //发生原因
|
||||
@ -439,11 +460,17 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
.statusDesc(visa.getStatus().getDesc())
|
||||
.attach(this.buildAttachUploadFile(visaId)) // 附件
|
||||
.imGroupId(visa.getImGroupId()) // 群组ID
|
||||
.approvalId(visa.getApprovalId()) //最终审批ID
|
||||
.approvalStatus(visa.getApprovalStatus()) //最终审批状态
|
||||
.approvalId(visa.getApprovalId()) //立项审批ID
|
||||
.approvalIdPay(visa.getApprovalIdPay()) //立项审批ID
|
||||
.approvalStatus(visa.getApprovalStatus()) //立项审批状态
|
||||
.approvalStatusPay(visa.getApprovalStatusPay()) // 价款审批状态
|
||||
.topic(visa.getTopic()) // 主题
|
||||
.contractId(visa.getContractId())
|
||||
.contractIdPay(visa.getContractIdPay())
|
||||
.stampStatus(visa.getStampStatus())
|
||||
.stampStatusPay(visa.getStampStatusPay())
|
||||
.contractName(visa.getContractName())
|
||||
.contractNo(visa.getContractNo())
|
||||
.build();
|
||||
}
|
||||
|
||||
@ -786,7 +813,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
AssertUtil.isTrue(StringUtils.hasText(processInstanceId), "创建审批异常");
|
||||
|
||||
// 更新主表中的审批字段,记录变量表的审批的信息
|
||||
updateApprovalInfo(visaId, processInstanceId, req.getOperatorPersonId());
|
||||
updateApprovalInfo(visaId, processInstanceId, req.getOperatorPersonId(), changeRecord.getType());
|
||||
|
||||
this.changeStatusWhenApproveCreate(visaId, req, oldChangeRecord, visaUploadFiles);
|
||||
|
||||
@ -866,18 +893,27 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
* @param processInstanceId
|
||||
* @param personId
|
||||
*/
|
||||
private void updateApprovalInfo(Long visaId, String processInstanceId, Long personId) {
|
||||
// 主表更新审批信息
|
||||
private void updateApprovalInfo(Long visaId, String processInstanceId, Long personId, VisaTypeEnum visaType) {
|
||||
ChangeRecord changeRecord = new ChangeRecord();
|
||||
changeRecord.setId(visaId);
|
||||
if (Objects.equals(VisaTypeEnum.PAY_CONFIRM, visaType)) {
|
||||
changeRecord.setApprovalIdPay(processInstanceId);
|
||||
changeRecord.setApprovalStatusPay(PROCESSING.getStatus());
|
||||
} else {
|
||||
// 原三种单据类型主表更新审批信息
|
||||
changeRecord.setApprovalId(processInstanceId);
|
||||
changeRecord.setApprovalStatus(PROCESSING.getStatus());
|
||||
}
|
||||
updateById(changeRecord);
|
||||
|
||||
// 设置关联表的审批信息
|
||||
ChangeRecordRelation processRelation = new ChangeRecordRelation();
|
||||
processRelation.setVisaId(visaId);
|
||||
if (Objects.equals(VisaTypeEnum.PAY_CONFIRM, visaType)) {
|
||||
processRelation.setVarName(VisaRelationFieldEnum.PROCESS_INSTANCE_OF_PAY.name());
|
||||
} else {
|
||||
processRelation.setVarName(VisaRelationFieldEnum.PROCESS_INSTANCE_OF_VISA.name());
|
||||
}
|
||||
processRelation.setVarType(VisaRelationVarTypeEnum.STRING.getType());
|
||||
processRelation.setContent(processInstanceId);
|
||||
processRelation.setContentExt(PROCESSING.getStatus());
|
||||
@ -1054,7 +1090,8 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
.relationProject(CollUtil.isNotEmpty(projectInfoMapById) ? projectInfoMapById.getOrDefault(item.getRelationProject(), "") : "")
|
||||
.happenTime(item.getHappenTime())
|
||||
.amountChange(item.getAmountChange())
|
||||
.approvalCompleteTime(Objects.equals(VisaStatusEnum.COMPLETED, item.getStatus()) ? item.getApprovalCompleteTime() : null)
|
||||
.approvalCompleteTime(item.getApprovalCompleteTime())
|
||||
.approvalCompleteTimePay(item.getApprovalCompleteTimePay())
|
||||
.initiator(CollUtil.isNotEmpty(initiatorMap) ? initiatorMap.getOrDefault(item.getCreateBy(), OrgNodeUserBriefInfoResp.builder().build()).getRealName() : "")
|
||||
.build())
|
||||
.collect(Collectors.toList());
|
||||
@ -1112,6 +1149,10 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(filter.getApproveCompletedDate())) {
|
||||
queryChainWrapper.between(ChangeRecord::getApprovalCompleteTime, filter.getApproveCompletedDate().get(0), filter.getApproveCompletedDate().get(1));
|
||||
queryChainWrapper.eq(ChangeRecord::getApprovalStatus, BpmnProcessInstanceResultEnum.APPROVED.getStatus());
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(filter.getApprovalCompleteTimePay())) {
|
||||
queryChainWrapper.between(ChangeRecord::getApprovalCompleteTimePay, filter.getApprovalCompleteTimePay().get(0), filter.getApprovalCompleteTimePay().get(1));
|
||||
queryChainWrapper.eq(ChangeRecord::getStatus, VisaStatusEnum.COMPLETED);
|
||||
}
|
||||
if (Objects.nonNull(filter) && Objects.nonNull(filter.getCurrentPersonId()) && !Objects.equals(filter.getCurrentPersonId(), 0L)) {
|
||||
@ -1248,6 +1289,9 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
// 操作列按钮
|
||||
Map<Long, Set<VisaButtonTypeEnum>> operateBtnMap = visaHelper.fetchBtnsByBizTypeAndStatus(records, req.getCurrentPersonId(), req.getCurrentOuId(), req.getCurrentWorkspaceId());
|
||||
|
||||
// 发生区域
|
||||
Map<Long, List<VisaDetailByIdResponse.RelationAreaDetail>> visaIdAreaMap = buildRelationArea(records);
|
||||
|
||||
/*组装信息*/
|
||||
return records.stream()
|
||||
.map(r -> {
|
||||
@ -1260,11 +1304,66 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
resp.setIsRelated(req.getNeedRelatedBill() ? CollUtil.isNotEmpty(billIfRelated) && billIfRelated.get(String.valueOf(r.getId())) : null);
|
||||
// 操作列按钮
|
||||
resp.setOperateBtnSet(CollUtil.isNotEmpty(operateBtnMap) ? operateBtnMap.get(r.getId()) : null);
|
||||
// 审批流程状态
|
||||
resp.setVisaApprovalStatus(buildApprovalStatus(r));
|
||||
// 发生区域
|
||||
resp.setRelationAreaList(visaIdAreaMap.getOrDefault(r.getId(), Collections.emptyList()));
|
||||
return resp;
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private Map<Long, List<VisaDetailByIdResponse.RelationAreaDetail>> buildRelationArea(List<ChangeRecord> records) {
|
||||
Map<Long, List<VisaDetailByIdResponse.RelationAreaDetail>> visaIdAreaMap = records.stream()
|
||||
.collect(Collectors.toMap(ChangeRecord::getId, r -> VisaDetailByIdResponse.RelationAreaDetail.buildAreaWithObject(r.getRelationArea())));
|
||||
List<ConstructionAreaDTO> areaFullNameInfoByAreaId = apolloConstructionAreaGateway.getAreaFullNameInfoByAreaId(visaIdAreaMap.values().stream()
|
||||
.flatMap(Collection::stream)
|
||||
.map(VisaDetailByIdResponse.RelationAreaDetail::getAreaId)
|
||||
.distinct()
|
||||
.collect(Collectors.toList()));
|
||||
if (CollectionUtils.isNotEmpty(areaFullNameInfoByAreaId)) {
|
||||
Map<Long, String> areaIdAndNameMap = areaFullNameInfoByAreaId.stream()
|
||||
.collect(Collectors.toMap(ConstructionAreaDTO::getId, ConstructionAreaDTO::getAreaFullName, (v1, v2) -> v1));
|
||||
visaIdAreaMap.forEach((visaId, areas) -> {
|
||||
if (CollUtil.isNotEmpty(areaIdAndNameMap) && CollUtil.isNotEmpty(areas)) {
|
||||
areas.forEach(area -> {
|
||||
area.setAreaName(areaIdAndNameMap.get(area.getAreaId()));
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
return visaIdAreaMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 立项审批和价款审批状态联合决定审批状态
|
||||
*
|
||||
* @param r 变洽签单据
|
||||
* @return 审批状态
|
||||
*/
|
||||
private VisaApprovalStatusEnum buildApprovalStatus(ChangeRecord r) {
|
||||
if (Objects.equals(r.getApprovalStatus(), PROCESSING.getStatus())) {
|
||||
return VisaApprovalStatusEnum.PROJECT_APPROVING;
|
||||
}
|
||||
if (Objects.equals(r.getApprovalStatus(), REJECTED.getStatus()) || Objects.equals(r.getApprovalStatus(), ABORTED.getStatus())) {
|
||||
return VisaApprovalStatusEnum.PROJECT_APPROVAL_REJECTED;
|
||||
}
|
||||
if (Objects.equals(r.getApprovalStatus(), APPROVED.getStatus())) {
|
||||
if (org.apache.commons.lang3.StringUtils.isNotBlank(r.getApprovalStatusPay())) {
|
||||
if (Objects.equals(r.getApprovalStatusPay(), PROCESSING.getStatus())) {
|
||||
return VisaApprovalStatusEnum.AMOUNT_APPROVING;
|
||||
} else if (Objects.equals(r.getApprovalStatusPay(), REJECTED.getStatus())
|
||||
|| Objects.equals(r.getApprovalStatusPay(), ABORTED.getStatus())) {
|
||||
return VisaApprovalStatusEnum.AMOUNT_APPROVAL_REJECTED;
|
||||
} else if (Objects.equals(r.getApprovalStatusPay(), APPROVED.getStatus())) {
|
||||
return VisaApprovalStatusEnum.AMOUNT_APPROVAL_PASSED;
|
||||
}
|
||||
}
|
||||
return VisaApprovalStatusEnum.PROJECT_APPROVAL_PASSED;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private Map<Long, String> getProjectInfoMapById(List<Long> projectIdList) {
|
||||
QueryProjectApiReq req = QueryProjectApiReq.builder()
|
||||
.ids(projectIdList)
|
||||
@ -1322,6 +1421,16 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
req.getApproveCompletedDate().set(0, DateUtil.beginOfDay(start));
|
||||
req.getApproveCompletedDate().set(1, DateUtil.endOfDay(end));
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(req.getApprovalCompleteTimePay())) {
|
||||
AssertUtil.isFalse(req.getApprovalCompleteTimePay().size() < 2, "请填写价款审批完成时间范围");
|
||||
Date start = req.getApprovalCompleteTimePay().get(0);
|
||||
Date end = req.getApprovalCompleteTimePay().get(1);
|
||||
AssertUtil.isTrue(Objects.nonNull(start) && Objects.nonNull(end), "请填写价款审批完成时间范围");
|
||||
AssertUtil.isTrue(start.compareTo(end) <= 0, "价款审批完成结束时间不能小于开始时间");
|
||||
// 时间修正,补充时分秒数据,起始时间为00:00:00:00,结束时间为23:59:59
|
||||
req.getApprovalCompleteTimePay().set(0, DateUtil.beginOfDay(start));
|
||||
req.getApprovalCompleteTimePay().set(1, DateUtil.endOfDay(end));
|
||||
}
|
||||
}
|
||||
|
||||
private static VisaConfirmDto buildCreateVisaConfirmDto(VisaChangeTempCreateReq req, ChangeRecord changeRecord) {
|
||||
@ -1415,8 +1524,12 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
AssertUtil.isTrue(req.getAmountChange().compareTo(maxAmount) <= 0 && req.getAmountChange().compareTo(minAmount) >= 0, "金额变化超出范围");
|
||||
}
|
||||
// 关联单据合法性
|
||||
if (CollUtil.isNotEmpty(req.getRelationOrderMap())) {
|
||||
req.getRelationOrderMap().forEach((key, value) -> {
|
||||
validRelationOrder(req.getRelationOrderMap(), req.getRelationWorkspaceId(), req.getType(), req.getId());
|
||||
}
|
||||
|
||||
private void validRelationOrder(Map<String, List<VisaChangeTempCreateReq.OrderSimpleModel>> relationOrderMap, Long workspaceId, VisaTypeEnum type, Long visaId) {
|
||||
if (CollUtil.isNotEmpty(relationOrderMap)) {
|
||||
relationOrderMap.forEach((key, value) -> {
|
||||
if (CollectionUtils.isNotEmpty(value)) {
|
||||
// 关联单据数量限制
|
||||
AssertUtil.isTrue(value.size() <= refreshableConfiguration.getVerifyVisaLimit(),
|
||||
@ -1430,13 +1543,13 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
if (CollUtil.isNotEmpty(taskNos)) {
|
||||
// 存在性
|
||||
QueryOrderToBasicReq queryOrderToBasicReq = new QueryOrderToBasicReq();
|
||||
queryOrderToBasicReq.setWorkspaceId(req.getRelationWorkspaceId());
|
||||
queryOrderToBasicReq.setWorkspaceId(workspaceId);
|
||||
queryOrderToBasicReq.setTaskNos(taskNos);
|
||||
queryOrderToBasicReq.setPage(1);
|
||||
queryOrderToBasicReq.setPageSize(taskNos.size());
|
||||
List<TaskOrderToBasicRes> taskOrders = taskOrderApiGateway.pageOrderByForBasic(queryOrderToBasicReq).getData();
|
||||
AssertUtil.isTrue(CollectionUtils.isNotEmpty(taskOrders) && taskOrders.size() == taskNos.size(), "关联任务单单据不存在,请检查后重试");
|
||||
validTaskBillIfRelated(taskNos, req.getType());
|
||||
validTaskBillIfRelated(taskNos, type, visaId);
|
||||
}
|
||||
} else if (Objects.equals(VisaBillTypeEnum.RECTIFY.name(), key)) {
|
||||
/*整改单*/
|
||||
@ -1451,11 +1564,11 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
.build();
|
||||
List<RectifyOrderResp> rectifyOrders = rectifyApiGateway.listRectifyOrders(rectifyOrderReq);
|
||||
AssertUtil.isTrue(CollectionUtils.isNotEmpty(rectifyOrders) && rectifyOrders.size() == billIds.size(), "关联整改单单据不存在,请检查后重试");
|
||||
validBillIfRelated(VisaBillTypeEnum.RECTIFY, billIds, req.getType());
|
||||
validBillIfRelated(VisaBillTypeEnum.RECTIFY, billIds, type, visaId);
|
||||
}
|
||||
} else if (Objects.equals(VisaBillTypeEnum.DESIGN_VISA.name(), key)) {
|
||||
/*变更单*/
|
||||
AssertUtil.isTrue(VisaTypeEnum.TECHNOLOGY_APPROVED.equals(req.getType()) || VisaTypeEnum.PROJECT_VISA.equals(req.getType()), "变更单关联单据仅支持技术核定/工程签证");
|
||||
AssertUtil.isTrue(VisaTypeEnum.TECHNOLOGY_APPROVED.equals(type) || VisaTypeEnum.PROJECT_VISA.equals(type), "变更单关联单据仅支持技术核定/工程签证");
|
||||
// 关联单据合法性,是否存在,状态是否合法
|
||||
List<String> billIds = value.stream()
|
||||
.map(v -> String.valueOf(v.getId()))
|
||||
@ -1465,10 +1578,10 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
List<ChangeRecord> 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(Objects.equals(r.getRelationWorkspaceId(), workspaceId), "关联的单据所属项目不匹配");
|
||||
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());
|
||||
validBillIfRelated(VisaBillTypeEnum.DESIGN_VISA, billIds, type, visaId);
|
||||
}
|
||||
} else {
|
||||
throw new ServiceException("不支持的关联单据类型");
|
||||
@ -1486,12 +1599,13 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
.one();
|
||||
}
|
||||
|
||||
private void validBillIfRelated(VisaBillTypeEnum billType, List<String> value, VisaTypeEnum visaType) {
|
||||
private void validBillIfRelated(VisaBillTypeEnum billType, List<String> value, VisaTypeEnum visaType, Long visaId) {
|
||||
AssertUtil.notNull(billType, "关联单据类型不能为空");
|
||||
AssertUtil.notEmpty(value, "关联单据Id不能为空");
|
||||
AssertUtil.notNull(visaType, "单据类型不能为空");
|
||||
List<ChangeRecordBill> mainBill = changeRecordBillService.getRelatedMainBill(billType, value);
|
||||
mainBill.stream()
|
||||
.filter(i -> !Objects.equals(visaId, i.getVisaId()))
|
||||
.collect(Collectors.groupingBy(ChangeRecordBill::getBillId))
|
||||
.forEach((k, v) -> v.stream()
|
||||
.filter(m -> Objects.equals(m.getVisaType(), visaType))
|
||||
@ -1502,7 +1616,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
}));
|
||||
}
|
||||
|
||||
private void validTaskBillIfRelated(List<String> taskNos, VisaTypeEnum visaType) {
|
||||
private void validTaskBillIfRelated(List<String> taskNos, VisaTypeEnum visaType, Long visaId) {
|
||||
AssertUtil.notEmpty(taskNos, "关联单据Id不能为空");
|
||||
AssertUtil.notNull(visaType, "单据类型不能为空");
|
||||
List<ChangeRecordBill> mainBill = changeRecordBillService.getRelatedMainBill(VisaBillTypeEnum.TASK, taskNos);
|
||||
@ -1510,6 +1624,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
return;
|
||||
}
|
||||
mainBill.stream()
|
||||
.filter(i -> !Objects.equals(visaId, i.getVisaId()))
|
||||
.collect(Collectors.groupingBy(ChangeRecordBill::getBillNo))
|
||||
.forEach((k, v) -> v.stream()
|
||||
.filter(m -> Objects.equals(m.getVisaType(), visaType))
|
||||
@ -1676,7 +1791,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
|
||||
String processInstanceId = createProcessInstance(createReq, req.getVisaId());
|
||||
// 更新主表中的审批字段,记录变量表的审批的信息
|
||||
updateApprovalInfo(visa.getId(), processInstanceId, req.getOperatorPersonId());
|
||||
updateApprovalInfo(visa.getId(), processInstanceId, req.getOperatorPersonId(), visa.getType());
|
||||
return req.getVisaId();
|
||||
}
|
||||
|
||||
@ -1748,7 +1863,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
.personId(req.getOperatorPersonId())
|
||||
.ouId(req.getOperatorOuId())
|
||||
.workspaceId(req.getOperatorWorkspaceId())
|
||||
.updateStatus(VisaStatusEnum.EXECUTING)
|
||||
// .updateStatus(VisaStatusEnum.EXECUTING)
|
||||
.editFormFlag(false)
|
||||
.build());
|
||||
}
|
||||
@ -1837,6 +1952,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
visaSearchResp.setRelationProfessional(VisaDetailByIdResponse.RelationProfessionalDetail.buildProfessionWithObject(item.getRelationProfessional()));
|
||||
visaSearchResp.setAmountChange(Objects.nonNull(item.getAmountChange()) ? item.getAmountChange().toPlainString() : "");
|
||||
visaSearchResp.setStampStatus(item.getStampStatus().name());
|
||||
visaSearchResp.setStampStatusPay(item.getStampStatusPay().name());
|
||||
return visaSearchResp;
|
||||
}).collect(Collectors.toList()))
|
||||
.build();
|
||||
@ -1873,16 +1989,10 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
// 在某些用印操作时,需要记录recordLog,用于详情展示,因为以前详情展示的操作日志是使用的recordLog
|
||||
insertRecordLog(req);
|
||||
|
||||
operateLogService.save(LogAddReq.builder()
|
||||
.scene("UPSERT_CHANGE_RECORD")
|
||||
.level("INFO")
|
||||
.tags(Lists.newArrayList(req.getVisaId().toString()))
|
||||
.message(new JSONObject()
|
||||
.fluentPut("param", req)
|
||||
.fluentPut("oldValue", oldValue)
|
||||
.fluentPut("newValue", this.getById(req.getVisaId()))
|
||||
.toJSONString())
|
||||
.build());
|
||||
operateLogService.save(req.getContext(), req.getVisaId(), //
|
||||
"request", req, //
|
||||
"oldValue", oldValue, //
|
||||
"newValue", this.getById(req.getVisaId()));
|
||||
}
|
||||
|
||||
public ChangeRecord toUpdate(UpdateVisaChangeReq req, ChangeRecord oldValue) {
|
||||
@ -1893,12 +2003,20 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
result.setId(req.getVisaId());
|
||||
|
||||
if (Objects.nonNull(req.getVisaStampAction())) {
|
||||
result.setStampStatus(oldValue.nextStampStatus(req.getVisaStampAction()));
|
||||
VisaStampStatusEnum nextStampStatus = oldValue.nextStampStatus(req.getVisaStampAction(), req.getPhase());
|
||||
if (req.getPhase() == VisaProcessPhase.PROJECT)
|
||||
result.setStampStatus(nextStampStatus);
|
||||
else
|
||||
result.setStampStatusPay(nextStampStatus);
|
||||
}
|
||||
|
||||
// 取消用印默认把合同id清空掉,后续如果有多种case,可以默认就清空,使用流程编排重构进行扩展
|
||||
if (Objects.equals(req.getVisaStampAction(), CANCEL) || Objects.equals(req.getVisaStampAction(), TX_CANCEL)) {
|
||||
if (Objects.equals(req.getVisaStampAction(), CANCEL) || Objects.equals(req.getVisaStampAction(), TX_CANCEL)
|
||||
|| Objects.equals(req.getVisaStampAction(), ALL_PROCESS_REJECTED)) {
|
||||
if (req.getPhase() == VisaProcessPhase.PROJECT)
|
||||
result.setContractId("");
|
||||
else
|
||||
result.setContractIdPay("");
|
||||
}
|
||||
|
||||
return result;
|
||||
@ -1908,12 +2026,13 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
if (Objects.isNull(req.getVisaStampAction())) {
|
||||
return;
|
||||
}
|
||||
PrintModelDTO printModel = printModelService.getPrintTemplateConfig(getById(req.getVisaId()), req.getPhase());
|
||||
|
||||
if (Objects.equals(req.getVisaStampAction(), COMPLETE)) {
|
||||
changeRecordLogService.addLog(ChangeRecordLog.builder()
|
||||
.visaId(req.getVisaId())
|
||||
.action(VisaLogTypeEnum.COMPLETE_STAMP.name())
|
||||
.title(String.format(VisaLogTypeEnum.COMPLETE_STAMP.getTitle(), req.getOperatorName()))
|
||||
.title(String.format(VisaLogTypeEnum.COMPLETE_STAMP.getTitle(), req.getOperatorName(), printModel.getPrintFileName()))
|
||||
.content(String.format(VisaLogTypeEnum.COMPLETE_STAMP.getContent(), req.getOperatorName()))
|
||||
.orderBy(Constants.APPROVE_ORDER_BY)
|
||||
.build());
|
||||
@ -1923,7 +2042,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
changeRecordLogService.addLog(ChangeRecordLog.builder()
|
||||
.visaId(req.getVisaId())
|
||||
.action(VisaLogTypeEnum.CANCEL_STAMP.name())
|
||||
.title(String.format(VisaLogTypeEnum.CANCEL_STAMP.getTitle(), req.getOperatorName()))
|
||||
.title(String.format(VisaLogTypeEnum.CANCEL_STAMP.getTitle(), req.getOperatorName(), printModel.getPrintFileName()))
|
||||
.content(String.format(VisaLogTypeEnum.CANCEL_STAMP.getContent(), req.getOperatorName()))
|
||||
.orderBy(Constants.APPROVE_ORDER_BY)
|
||||
.build());
|
||||
@ -1944,7 +2063,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
.visaId(req.getVisaId())
|
||||
.action(VisaLogTypeEnum.AUTO_COMPLETE_STAMP.name())
|
||||
.title(VisaLogTypeEnum.AUTO_COMPLETE_STAMP.getTitle())
|
||||
.content(VisaLogTypeEnum.AUTO_COMPLETE_STAMP.getContent())
|
||||
.content(String.format(VisaLogTypeEnum.AUTO_COMPLETE_STAMP.getContent(), printModel.getPrintFileName()))
|
||||
.orderBy(Constants.APPROVE_ORDER_BY)
|
||||
.build());
|
||||
}
|
||||
@ -2017,6 +2136,66 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void approveCreateVisaPay(VisaPayApproveCreateReq req) {
|
||||
ChangeRecord visa = changeRecordService.getById(req.getVisaId());
|
||||
AssertUtil.notNull(visa, "未找到变洽签单据");
|
||||
check(req, visa);
|
||||
|
||||
// 更新主业务单据中的相关数据数据
|
||||
changeRecordBillService.deleteByVisaId(visa.getId());
|
||||
// 保存关联单据
|
||||
if (CollUtil.isNotEmpty(req.getRelationOrderMap())) {
|
||||
VisaChangeTempCreateReq build = VisaChangeTempCreateReq.builder().build();
|
||||
build.setRelationOrderMap(req.getRelationOrderMap());
|
||||
changeRecordBillService.addBill(buildVisaBillDto(build, visa));
|
||||
}
|
||||
|
||||
// 读取主业务数据,传入审批的流程审批
|
||||
BpmnProcessInstanceCreateDTO creator = BpmnProcessInstanceCreateDTO.builder().build();
|
||||
creator.setProcessDefinitionKey(VisaTypeEnum.PAY_CONFIRM.getProcessDefinitionKey());
|
||||
creator.setTenantId(String.valueOf(visa.getRelationWorkspaceId()));
|
||||
creator.setBusinessKey(String.valueOf(visa.getId()));
|
||||
creator.setCooperationOrg(new CooperationOrgDTO());
|
||||
Map<String, Object> startFormVariables = visaHelper.buildPayStartFormVariables(req, visa.getId());
|
||||
creator.setStartFormVariables(startFormVariables);
|
||||
Map<String, Object> pendingVariables = new HashMap<>();
|
||||
pendingVariables.put(IM_GROUP_BIZ_INFO_VISA_ID, visa.getId());
|
||||
pendingVariables.put(IM_GROUP_BIZ_INFO_VISA_TYPE_DESC, visa.getType().getDesc());
|
||||
pendingVariables.put(FORM_FIELD_TOPIC, visa.getTopic());
|
||||
pendingVariables.put(FORM_FIELD_WORKSPACE_NAME, startFormVariables.getOrDefault(FORM_FIELD_WORKSPACE_NAME, null));
|
||||
creator.setPendingVariables(pendingVariables);
|
||||
creator.setInitiator(BpmnTaskDelegateAssigner.builder()
|
||||
.tenantId(String.valueOf(visa.getRelationWorkspaceId()))
|
||||
.ouId(String.valueOf(req.getOperatorOuId()))
|
||||
.personId(String.valueOf(req.getOperatorPersonId()))
|
||||
.build());
|
||||
|
||||
String processInstanceId = workflowGateway.processInstanceCreate(creator);
|
||||
AssertUtil.isTrue(StringUtils.hasText(processInstanceId), "创建审批异常");
|
||||
|
||||
// 更新主表中的审批字段,记录变量表的审批的信息
|
||||
updateApprovalInfo(visa.getId(), processInstanceId, req.getOperatorPersonId(), VisaTypeEnum.PAY_CONFIRM);
|
||||
|
||||
// 写入发起审批的日志
|
||||
changeRecordLogService.batchAddLog(changeRecordLogService.buildLogList(visa.getId(), VisaLogTypeEnum.TO_APPRROVE, VisaLogParam.builder()
|
||||
.ouId(req.getOperatorOuId())
|
||||
.personId(req.getOperatorPersonId())
|
||||
.workspaceId(visa.getRelationWorkspaceId())
|
||||
.visaType(VisaTypeEnum.PAY_CONFIRM)
|
||||
.build()));
|
||||
}
|
||||
|
||||
private void check(VisaPayApproveCreateReq req, ChangeRecord visa) {
|
||||
// 验证单据
|
||||
validRelationOrder(req.getRelationOrderMap(), visa.getRelationWorkspaceId(), visa.getType(), visa.getId());
|
||||
// 校验是否已经发起过价款申请,审批中和已通过
|
||||
List<BpmnProcessInstanceResultEnum> checkResults = Lists.newArrayList(PROCESSING, APPROVED);
|
||||
boolean checkResult = StringUtils.hasText(visa.getApprovalIdPay()) && checkResults.contains(BpmnProcessInstanceResultEnum.valueOfStatus(visa.getApprovalStatusPay()));
|
||||
AssertUtil.isFalse(checkResult, "完工价款确认审批已发起");
|
||||
}
|
||||
|
||||
private List<BpmnTaskDelegateAssigner> getDefaultAssignee(BizActivityAssigneeDecisionReq req) {
|
||||
PersonProfileDto profile = visaProfileGateway.getProfile(req.getOperatorPersonId());
|
||||
return Lists.newArrayList(BpmnTaskDelegateAssigner.builder()
|
||||
@ -2026,4 +2205,28 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
.avatar(profile.getAvatarUrl())
|
||||
.build());
|
||||
}
|
||||
|
||||
@Override
|
||||
public VisaChangeRelationOrdersResp getRelationOrdersById(Long visaId) {
|
||||
List<ChangeRecordBill> changeRecordBills = changeRecordBillService.listById(visaId);
|
||||
if (CollectionUtils.isNotEmpty(changeRecordBills)) {
|
||||
Map<VisaBillTypeEnum, List<VisaChangeTempCreateReq.OrderSimpleModel>> billMap = changeRecordBills.stream()
|
||||
.collect(Collectors.groupingBy(ChangeRecordBill::getBillType
|
||||
, Collectors.mapping(item -> VisaChangeTempCreateReq.OrderSimpleModel.builder()
|
||||
.id(item.getBillId())
|
||||
.no(item.getBillNo())
|
||||
.name(item.getBillName())
|
||||
.build(), Collectors.toList())));
|
||||
return VisaChangeRelationOrdersResp.builder()
|
||||
.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.DESIGN_VISA)) ? Lists.newArrayList() : billMap.get(VisaBillTypeEnum.DESIGN_VISA)) // 关联变更单
|
||||
.relationInvalidVisaList(this.detailPageInvalidVisaIdList(billMap.getOrDefault(VisaBillTypeEnum.DESIGN_VISA, Lists.newArrayList())
|
||||
.stream()
|
||||
.map(item -> String.valueOf(item.getId()))
|
||||
.collect(Collectors.toList())))
|
||||
.build();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,144 @@
|
||||
|
||||
package cn.axzo.nanopart.visa.server.service.impl;
|
||||
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS_PAY;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_PAY;
|
||||
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_VISA;
|
||||
import static java.util.stream.Collectors.groupingBy;
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import cn.axzo.msg.center.service.pending.client.PendingMessageClient;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessageByBizCodeRequest;
|
||||
import cn.axzo.msg.center.service.pending.response.PendingMessageSimpleDTO;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaProcessPhase;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStampStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse.DetailCard;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse.WorkflowButtonType;
|
||||
import cn.axzo.nanopart.visa.server.domain.ChangeRecord;
|
||||
import cn.axzo.nanopart.visa.server.domain.ChangeRecordRelation;
|
||||
import cn.axzo.nanopart.visa.server.dto.VisaRelationDto;
|
||||
import cn.axzo.nanopart.visa.server.rpc.WorkflowGateway;
|
||||
import cn.axzo.nanopart.visa.server.service.ChangeRecordRelationService;
|
||||
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
|
||||
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
|
||||
import cn.axzo.workflow.common.model.response.print.PrintModelDTO;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* @author yanglin
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class DetailCardBuilder {
|
||||
|
||||
private final PrintModelService printModelService;
|
||||
private final ChangeRecordRelationService changeRecordRelationService;
|
||||
private final PendingMessageClient pendingMessageClient;
|
||||
private final WorkflowGateway workflowGateway;
|
||||
|
||||
List<DetailCard> build(ChangeRecord visa) {
|
||||
ArrayList<DetailCard> details = new ArrayList<>();
|
||||
Consumer<VisaProcessPhase> builder = (phase) -> {
|
||||
VisaRelationFieldEnum workflowField = phase == VisaProcessPhase.PROJECT ? PROCESS_INSTANCE_OF_VISA
|
||||
: PROCESS_INSTANCE_OF_PAY;
|
||||
ChangeRecordRelation workflowRelation = changeRecordRelationService.lambdaQuery() //
|
||||
.eq(ChangeRecordRelation::getVisaId, visa.getId()) //
|
||||
.eq(ChangeRecordRelation::getVarName, workflowField.name()) //
|
||||
.orderByDesc(ChangeRecordRelation::getId) //
|
||||
.last("LIMIT 1") //
|
||||
.one();
|
||||
if (workflowRelation == null)
|
||||
return;
|
||||
DetailCard detail = new DetailCard();
|
||||
detail.setVisaId(visa.getId());
|
||||
detail.setPhase(phase);
|
||||
detail.setWorkflowInstanceId(workflowRelation.getContent());
|
||||
FormInstanceVO formInstance = printModelService.getFormInstance(workflowRelation.getContent());
|
||||
if (formInstance != null)
|
||||
detail.setFormModel(formInstance.getFormModel());
|
||||
BpmnProcessInstanceResultEnum workflowStatus = BpmnProcessInstanceResultEnum.valueOfStatus(
|
||||
workflowRelation.getContentExt());
|
||||
|
||||
PrintModelDTO printModel = printModelService.getPrintTemplateConfig(visa, phase);
|
||||
detail.setTitle(printModel.getPrintFileName());
|
||||
if (workflowStatus != null) {
|
||||
detail.setWorkflowStatus(workflowStatus.getStatus());
|
||||
String prefix = phase == VisaProcessPhase.PROJECT ? "立项" : "价款";
|
||||
detail.setWorkflowStatusDesc(prefix + workflowStatus.getDesc());
|
||||
}
|
||||
VisaStampStatusEnum stampStatus = phase == VisaProcessPhase.PROJECT ? visa.getStampStatus()
|
||||
: visa.getStampStatusPay();
|
||||
if (stampStatus != null && stampStatus != VisaStampStatusEnum.UNKNOWN) {
|
||||
detail.setStampStatus(stampStatus.name());
|
||||
detail.setStampStatusDesc(stampStatus.getDesc());
|
||||
}
|
||||
detail.addButton("查看详情", WorkflowButtonType.DETAIL);
|
||||
if (workflowStatus == BpmnProcessInstanceResultEnum.APPROVED) {
|
||||
if (stampStatus == VisaStampStatusEnum.USED_PRINTS)
|
||||
detail.addButton("打印", WorkflowButtonType.PRINT);
|
||||
else if (stampStatus == VisaStampStatusEnum.UNPRINTED || stampStatus == VisaStampStatusEnum.WITH_PRINT)
|
||||
detail.addButton("打印预览", WorkflowButtonType.PRINT_PREVIEW);
|
||||
if (stampStatus == VisaStampStatusEnum.UNPRINTED)
|
||||
detail.addButton("申请用印", WorkflowButtonType.REQUEST_STAMP);
|
||||
else if (stampStatus == VisaStampStatusEnum.WITH_PRINT)
|
||||
detail.addButton("用印进展", WorkflowButtonType.STAMP_PROGRESS);
|
||||
// 未用印,但有历史被驳回的用印
|
||||
if (stampStatus == VisaStampStatusEnum.UNPRINTED
|
||||
&& !detail.containsButtonOfType(WorkflowButtonType.STAMP_PROGRESS)) {
|
||||
VisaRelationFieldEnum fieldType = phase == VisaProcessPhase.PROJECT ? PROCESS_INSTANCE_OF_ESS : PROCESS_INSTANCE_OF_ESS_PAY;
|
||||
List<ChangeRecordRelation> essInstances = changeRecordRelationService.findByCondition(VisaRelationDto.builder()
|
||||
.visaId(visa.getId())
|
||||
.varName(fieldType.name())
|
||||
.contentExt(BpmnProcessInstanceResultEnum.REJECTED.getStatus())
|
||||
.build());
|
||||
if (CollectionUtils.isNotEmpty(essInstances))
|
||||
detail.addButton("用印进展", WorkflowButtonType.STAMP_PROGRESS);
|
||||
}
|
||||
|
||||
if (!workflowGateway.hasPrintTemplate(detail.getWorkflowInstanceId())) {
|
||||
log.info("没有打印模版, 去掉打印/用印相关按钮. workflowInstanceId={}", detail.getWorkflowInstanceId());
|
||||
detail.removeButtonsOfType(WorkflowButtonType.PRINT, //
|
||||
WorkflowButtonType.PRINT_PREVIEW, //
|
||||
WorkflowButtonType.STAMP_PROGRESS, //
|
||||
WorkflowButtonType.REQUEST_STAMP);
|
||||
}
|
||||
}
|
||||
details.add(detail);
|
||||
};
|
||||
builder.accept(VisaProcessPhase.PROJECT);
|
||||
builder.accept(VisaProcessPhase.PAYMENT);
|
||||
return details;
|
||||
}
|
||||
|
||||
public void populateCardTodoIdentityCode(List<DetailCard> cards, Long personId) {
|
||||
if (cards == null)
|
||||
return;
|
||||
List<String> bizCodes = cards.stream().map(DetailCard::getWorkflowInstanceId).collect(toList());
|
||||
PendingMessageByBizCodeRequest request = new PendingMessageByBizCodeRequest();
|
||||
request.setBizCodes(bizCodes);
|
||||
request.setOperatorPersonId(personId);
|
||||
Map<String, List<PendingMessageSimpleDTO>> biz2Todos = pendingMessageClient //
|
||||
.getLatestByBizCode(request).getData().stream() //
|
||||
.collect(groupingBy(PendingMessageSimpleDTO::getBizCode));
|
||||
for (DetailCard card : cards) {
|
||||
List<PendingMessageSimpleDTO> todos = biz2Todos.getOrDefault(card.getWorkflowInstanceId(),
|
||||
Collections.emptyList());
|
||||
if (!todos.isEmpty())
|
||||
card.setTodoIdentityCode(todos.get(0).getIdentityCode());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,15 +1,22 @@
|
||||
package cn.axzo.nanopart.visa.server.service.impl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import cn.axzo.framework.domain.ServiceException;
|
||||
import cn.axzo.framework.jackson.utility.JSON;
|
||||
import cn.axzo.log.platform.client.feign.LogApi;
|
||||
import cn.axzo.log.platform.client.model.req.LogAddReq;
|
||||
import cn.axzo.nanopart.visa.server.service.OperateLogService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@ -23,8 +30,40 @@ public class OperateLogServiceImpl implements OperateLogService {
|
||||
private ExecutorService asyncExecutor;
|
||||
|
||||
@Override
|
||||
public void save(LogAddReq param) {
|
||||
public void saveRequest(String scene, Long tag, Object request) {
|
||||
save(scene, tag, "request", JSON.toJSONString(request));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save(String scene, Long tag, Object... arguments) {
|
||||
save(scene, String.valueOf(tag), arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save(String scene, String tag, Object... arguments) {
|
||||
if (arguments.length % 2 != 0)
|
||||
throw new ServiceException("messages length is not even");
|
||||
JSONObject message = new JSONObject();
|
||||
for (int i = 0; i < arguments.length; i += 2)
|
||||
message.put(String.valueOf(arguments[i]), arguments[i + 1]);
|
||||
save(LogAddReq.builder()
|
||||
.scene(scene)
|
||||
.level("INFO")
|
||||
.tags(Lists.newArrayList(tag))
|
||||
.message(message.toJSONString())
|
||||
.build());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save(LogAddReq param) {
|
||||
List<String> tags = param.getTags();
|
||||
if (tags == null)
|
||||
tags = new ArrayList<>();
|
||||
else
|
||||
tags = new ArrayList<>(tags);
|
||||
tags.add("nanopart");
|
||||
tags.add("visa");
|
||||
param.setTags(tags);
|
||||
try {
|
||||
// 目前操作日志的记录,不是核心流程,这个方法,不抛出异常,以免影响正常业务流程。
|
||||
// 异步处理
|
||||
|
||||
@ -0,0 +1,41 @@
|
||||
|
||||
package cn.axzo.nanopart.visa.server.service.impl;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaProcessPhase;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
|
||||
import cn.axzo.nanopart.visa.server.domain.ChangeRecord;
|
||||
import cn.axzo.nanopart.visa.server.rpc.WorkflowGateway;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigQueryDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
|
||||
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
|
||||
import cn.axzo.workflow.common.model.response.print.PrintModelDTO;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author yanglin
|
||||
*/
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class PrintModelService {
|
||||
|
||||
private final WorkflowGateway workflowGateway;
|
||||
|
||||
public PrintModelDTO getPrintTemplateConfig(ChangeRecord visa, VisaProcessPhase phase) {
|
||||
String tenantId = phase == VisaProcessPhase.PROJECT ? visa.getApprovalId() : visa.getApprovalIdPay();
|
||||
PrintTemplateConfigQueryDTO request = new PrintTemplateConfigQueryDTO();
|
||||
request.setProcessDefinitionKey(
|
||||
phase == VisaProcessPhase.PROJECT ? visa.getType().getProcessDefinitionKey()
|
||||
: VisaTypeEnum.PAY_CONFIRM.getProcessDefinitionKey());
|
||||
request.setTenantId(tenantId);
|
||||
return workflowGateway.getPrintTemplateConfig(request);
|
||||
}
|
||||
|
||||
public FormInstanceVO getFormInstance(String approvalId) {
|
||||
FormDetailDTO request = new FormDetailDTO();
|
||||
request.setProcessInstanceId(approvalId);
|
||||
return workflowGateway.getFormInstance(request);
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user