Merge branch 'feature/REQ-3982'

This commit is contained in:
wangli 2025-05-07 14:20:21 +08:00
commit e7a9238a43
50 changed files with 2366 additions and 436 deletions

View File

@ -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());
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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";
}

View File

@ -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;
}
}

View File

@ -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)));

View File

@ -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", "所属工程"),
;

View File

@ -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用印申请均签署通过!"),
;
/**

View File

@ -0,0 +1,13 @@
package cn.axzo.nanopart.visa.api.enums;
/**
* 流程审批阶段 (临时方案)
*
* @author yanglin
*/
public enum VisaProcessPhase {
// 立项审批
PROJECT,
// 完工价款确认审批
PAYMENT
}

View File

@ -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不是附件类型
*/

View File

@ -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);
/**
* 无效状态集合审批不通过到待提报/已废除

View File

@ -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;
/**
@ -17,9 +19,11 @@ import java.util.Set;
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public enum VisaTypeEnum {
DESIGN_CHANGE("bgqz01","design_change", "设计变更"),
TECHNOLOGY_APPROVED("bgqz02","technology_approved", "技术核定"),
PROJECT_VISA("bgqz03", "project_visa","工程签证");
DESIGN_CHANGE("bgqz01", "design_change", "设计变更"),
TECHNOLOGY_APPROVED("bgqz02", "technology_approved", "技术核定"),
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);
}
}

View File

@ -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("不是审核不通过日志");

View File

@ -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;
}

View File

@ -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;

View File

@ -164,6 +164,16 @@ public class VisaChangeTempCreateReq {
*/
private Long operatorPersonId;
/**
* 业务合同名称
*/
private String contractName;
/**
* 业务合同编号
*/
private String contractNo;
@Data
@Builder
@NoArgsConstructor

View File

@ -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;
}

View File

@ -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;
/**
* 变洽签关联数据查询入参模型
*

View File

@ -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

View File

@ -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();
}
}

View File

@ -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;
}

View File

@ -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

View File

@ -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;
}

View File

@ -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>

View File

@ -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));
}
}

View File

@ -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();
}

View File

@ -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
@ -66,7 +67,7 @@ public class ChangeRecord extends BaseEntity<ChangeRecord> {
/**
* 区域集合
* 示例
* <pre>
* <pre>
* [
* {"areaId": 249556},
* {"areaId": 249555}
@ -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();
}
}

View File

@ -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;
}

View File

@ -63,11 +63,17 @@ public class VisaExportDto {
@ExcelProperty("提出时间")
private Date happenTime;
/**
* 立项审批时间
*/
@ExcelProperty("立项审批通过时间")
private Date approvalCompleteTime;
/**
* 最终审批时间
*/
@ExcelProperty("审批通过时间")
private Date approvalCompleteTime;
@ExcelProperty("价款审批通过时间")
private Date approvalCompleteTimePay;
/**
* 工程

View File

@ -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;
/**
* 获取删除附件信息

View File

@ -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);
}
@ -208,6 +234,11 @@ public class EssAllEventHandler implements EventHandler, InitializingBean {
private String findTaskId(String processInstanceId, String personId) {
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 {

View File

@ -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 nullprocessInstanceId: {}", dto.getProcessInstanceId());

View File

@ -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());
}
}

View File

@ -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;

View File

@ -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);
changeRecordService.lambdaUpdate()
.eq(ChangeRecord::getId, Long.valueOf(dto.getBusinessKey()))
.set(ChangeRecord::getStampStatus, VisaStampStatusEnum.UNPRINTED.name())
.update();
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,27 +273,46 @@ 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)) {
changeRecord.setApprovalStatus(resultEnum.getStatus());
changeRecord.setApprovalCompleteTime(new Date());
if (isPayConfirm) {
changeRecord.setApprovalStatusPay(resultEnum.getStatus());
changeRecord.setApprovalCompleteTimePay(new Date());
} else {
changeRecord.setApprovalStatus(resultEnum.getStatus());
changeRecord.setApprovalCompleteTime(new Date());
}
} else {
changeRecord.setApprovalId("");
changeRecord.setApprovalStatus("");
changeRecord.setApprovalCompleteTime(null);
if (isPayConfirm) {
changeRecord.setApprovalStatusPay(resultEnum.getStatus());
changeRecord.setApprovalCompleteTimePay(null);
} else {
changeRecord.setApprovalStatus(resultEnum.getStatus());
changeRecord.setApprovalCompleteTime(null);
}
}
changeRecordService.updateById(changeRecord);
});
@ -278,7 +320,7 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
// 更新关联表审批信息
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)) {
changeRecordService.changeStatus(ChangeStatusRequest.builder()
.visaId(visaId)
.personId(Long.valueOf(lastOperationAssigner.getPersonId()))
.ouId(Long.valueOf(lastOperationAssigner.getOuId()))
.workspaceId(Long.valueOf(lastOperationAssigner.getTenantId()))
.updateStatus(VisaStatusEnum.COMPLETED)
.editFormFlag(false)
.build());
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;
}
// 回退到待提报或决策中
changeRecordService.changeStatus(ChangeStatusRequest.builder()
.visaId(visaId)
.personId(Long.valueOf(lastOperationAssigner.getPersonId()))
.ouId(Long.valueOf(lastOperationAssigner.getOuId()))
.workspaceId(Long.valueOf(lastOperationAssigner.getTenantId()))
.updateStatus(Objects.isNull(visa.getImGroupId()) ? VisaStatusEnum.REPORT_FROM_APPROVE : VisaStatusEnum.DECIDING_FROM_APPROVE)
.editFormFlag(false)
.build());
if (!isPayConfirm) {
// 回退到待提报或决策中
changeRecordService.changeStatus(ChangeStatusRequest.builder()
.visaId(visaId)
.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()));
}
}

View File

@ -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();

View File

@ -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);
}
}

View File

@ -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);
/**
* 权限过滤

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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();

View File

@ -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
@ -39,7 +43,7 @@ import java.util.stream.Collectors;
*/
@Slf4j
@Service
public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao, ChangeRecordLog> implements ChangeRecordLogService {
public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao, ChangeRecordLog> implements ChangeRecordLogService {
@Resource
private VisaOrganizationalNodeUserGateway visaOrganizationalNodeUserGateway;
@ -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:
// 编辑表单
@ -114,7 +121,7 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
userName = this.buildUserName(param.getPersonId(), param.getOuId(), param.getWorkspaceId());
logList.add(ChangeRecordLog.builder().visaId(visaId)
.action(VisaLogTypeEnum.EDIT_AMOUNT.name())
.title(String.format(VisaLogTypeEnum.EDIT_AMOUNT.getTitle(),userName ))
.title(String.format(VisaLogTypeEnum.EDIT_AMOUNT.getTitle(), userName))
.content(String.format(VisaLogTypeEnum.EDIT_AMOUNT.getContent()
, NumberUtil.roundDown(param.getOldAmountChange(), 2).toPlainString()
, NumberUtil.roundDown(param.getNewAmountChange(), 2).toPlainString()))
@ -137,76 +144,97 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
userName = this.buildUserName(param.getPersonId(), param.getOuId(), param.getWorkspaceId());
logList.add(ChangeRecordLog.builder().visaId(visaId)
.action(VisaLogTypeEnum.DELETE_UPLOAD_FILE.name())
.title(String.format(VisaLogTypeEnum.DELETE_UPLOAD_FILE.getTitle(),userName))
.content(String.format(VisaLogTypeEnum.DELETE_UPLOAD_FILE.getContent(),userName, param.getDeleteAttach().size(), this.buildAttach(param.getDeleteAttach())))
.title(String.format(VisaLogTypeEnum.DELETE_UPLOAD_FILE.getTitle(), userName))
.content(String.format(VisaLogTypeEnum.DELETE_UPLOAD_FILE.getContent(), userName, param.getDeleteAttach().size(), this.buildAttach(param.getDeleteAttach())))
.orderBy(Constants.DELETE_UPLOAD_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_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:
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
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());
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,7 +350,8 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
/**
* 通过变签Id获取日志
* @param visaId 变签Id
*
* @param visaId 变签Id
* @param logType 类型
*/
public List<ChangeRecordLog> listByVisaIdType(Long visaId, VisaLogTypeEnum logType) {
@ -334,7 +382,8 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
/**
* 是否有日志类型
* @param visaId 变更签证Id
*
* @param visaId 变更签证Id
* @param logType 类型
* @return true:;false:没有
*/

View File

@ -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());
stamp.setVarName(PROCESS_INSTANCE_OF_ESS.name());
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,21 +543,35 @@ 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()))) {
// 记录单位与其在合同中的签章位置
ChangeRecordRelation recipientRelation = new ChangeRecordRelation();
recipientRelation.setVisaId(visa.getId());
recipientRelation.setVarName(ESS_RECIPIENT_ID_MAP.name());
recipientRelation.setVarType(VisaRelationVarTypeEnum.JSON.getType());
recipientRelation.setContent(JSON.toJSONString(essRecipientIdMap));
relations.add(recipientRelation);
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());
recipientRelation.setVarName(ESS_RECIPIENT_ID_MAP.name());
recipientRelation.setVarType(VisaRelationVarTypeEnum.JSON.getType());
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());
}
visa.setAppliedStamp(true);
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,11 +657,13 @@ 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));
}
deleteByVisaId(visa.getId(), Lists.newArrayList(PRINT_PDF_FILE, PROCESS_INSTANCE_OF_ESS, ESS_RECIPIENT_ID_MAP));
}
private Map<Long, String> listCooperateShipTypes(VisaRequestStampReq req, ChangeRecord visa) {
@ -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, "腾讯电子签合同创建失败");
visa.setContractId(contract.getEssContractId());
visa.setStampStatus(VisaStampStatusEnum.WITH_PRINT);
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(),

View File

@ -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);
changeRecord.setApprovalId(processInstanceId);
changeRecord.setApprovalStatus(PROCESSING.getStatus());
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);
processRelation.setVarName(VisaRelationFieldEnum.PROCESS_INSTANCE_OF_VISA.name());
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, "价款审批完成结束时间不能小于开始时间");
// 时间修正补充时分秒数据起始时间为0000: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)) {
result.setContractId("");
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;
}
}

View File

@ -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());
}
}
}

View File

@ -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 {
// 目前操作日志的记录不是核心流程这个方法不抛出异常以免影响正常业务流程
// 异步处理

View File

@ -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);
}
}