From 413ef95ca08807adb5d01de11ecc3ab8d11bb9a9 Mon Sep 17 00:00:00 2001 From: wang1 <844966816@qq.com> Date: 星期三, 14 六月 2023 14:58:56 +0800 Subject: [PATCH] 模板流程定义、模板阶段定义代码提交 --- Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/FlowTaskUserC.java | 43 ++ Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/ProcessStageAttrMapper.java | 29 + Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/NewAppConstantEnum.java | 1 Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/ProcessStageAttr.java | 51 ++ Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/ProcessTemplateService.java | 56 ++ Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowTaskUserController.java | 56 ++ Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/FlowTaskUserServiceImpl.java | 146 ++++++ Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/ProcessStageAttrServiceImpl.java | 81 +++ Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/business/controller/WorkController.java | 10 Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/FlowMapper.java | 8 Source/UBCS/ubcs-ops/ubcs-flow/src/main/resources/mapper/FlowMapper.xml | 4 Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/ProcessTSController.java | 112 +++++ Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/ProcessTemplate.java | 48 ++ Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/ProcessTemplateTypeEnum.java | 134 ++++++ Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/ProcessStageAttrService.java | 39 + Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/FlowEngineService.java | 15 Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/FlowTaskUser.java | 51 ++ Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/ProcessTemplateServiceImpl.java | 107 +++++ Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowProcessController.java | 21 + Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowModelController.java | 9 Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java | 2 Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/ProcessTemplateMapper.java | 30 + Source/UBCS/ubcs-ops-api/ubcs-flow-api/pom.xml | 13 Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/UserPwdstrategyController.java | 1 Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/business/service/impl/FlowBusinessServiceImpl.java | 1 Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/FlowEngineServiceImpl.java | 71 +++ Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/FlowTaskUserService.java | 54 ++ Source/UBCS/ubcs-service-api/ubcs-workflow-api/src/main/java/com/vci/ubcs/code/constant/FlowConstant.java | 32 + Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/FlowTaskUserMapper.java | 34 + 29 files changed, 1,255 insertions(+), 4 deletions(-) diff --git a/Source/UBCS/ubcs-ops-api/ubcs-flow-api/pom.xml b/Source/UBCS/ubcs-ops-api/ubcs-flow-api/pom.xml index 577f1eb..20ac791 100644 --- a/Source/UBCS/ubcs-ops-api/ubcs-flow-api/pom.xml +++ b/Source/UBCS/ubcs-ops-api/ubcs-flow-api/pom.xml @@ -14,6 +14,19 @@ <version>${bladex.project.version}</version> <packaging>jar</packaging> + <dependencies> + <dependency> + <groupId>com.vci.ubcs</groupId> + <artifactId>ubcs-util-api</artifactId> + <version>3.0.1.RELEASE</version> + </dependency> + <dependency> + <groupId>com.vci.ubcs</groupId> + <artifactId>ubcs-user-api</artifactId> + <version>3.0.1.RELEASE</version> + <scope>compile</scope> + </dependency> + </dependencies> </project> diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/business/controller/WorkController.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/business/controller/WorkController.java index a3d1c0a..69b118f 100644 --- a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/business/controller/WorkController.java +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/business/controller/WorkController.java @@ -27,13 +27,23 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.task.api.Task; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** * 娴佺▼浜嬪姟閫氱敤鎺ュ彛 * diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/business/service/impl/FlowBusinessServiceImpl.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/business/service/impl/FlowBusinessServiceImpl.java index c78baca..a84b86b 100644 --- a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/business/service/impl/FlowBusinessServiceImpl.java +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/business/service/impl/FlowBusinessServiceImpl.java @@ -263,6 +263,7 @@ variables = Kv.create(); } variables.put(ProcessConstant.PASS_KEY, flow.isPass()); + variables.put("yn","y"); // 瀹屾垚浠诲姟 taskService.complete(taskId, variables); return true; diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowModelController.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowModelController.java index 5e3e781..b974022 100644 --- a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowModelController.java +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowModelController.java @@ -18,15 +18,20 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.vci.ubcs.flow.core.utils.TaskUtil; import com.vci.ubcs.flow.engine.entity.FlowModel; +import com.vci.ubcs.flow.engine.entity.FlowTaskUser; import com.vci.ubcs.flow.engine.service.FlowEngineService; +import com.vci.ubcs.flow.engine.service.FlowTaskUserService; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; +import org.springblade.core.launch.constant.FlowConstant; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; +import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; @@ -44,7 +49,7 @@ @RestController @RequestMapping("model") @AllArgsConstructor -//@PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR) +//@PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR)t public class FlowModelController { private final FlowEngineService flowEngineService; @@ -63,6 +68,8 @@ IPage<FlowModel> pages = flowEngineService.page(Condition.getPage(query), Condition.getQueryWrapper(flow, FlowModel.class) .select("id,model_key modelKey,name,description,version,created,last_updated lastUpdated") .orderByDesc("last_updated")); + + flowEngineService.getNodeByFlowableKey("process_t"); return R.data(pages); } diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowProcessController.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowProcessController.java index a9329c2..2b42915 100644 --- a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowProcessController.java +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowProcessController.java @@ -20,6 +20,12 @@ import com.vci.ubcs.flow.engine.service.FlowEngineService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.model.FlowElement; +import org.flowable.bpmn.model.SubProcess; +import org.flowable.bpmn.model.UserTask; +import org.flowable.engine.*; import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springframework.web.bind.annotation.GetMapping; @@ -28,7 +34,10 @@ import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import java.util.Map; /** * 娴佺▼閫氱敤鎺у埗鍣� @@ -44,6 +53,12 @@ private static final String IMAGE_NAME = "image"; private final FlowEngineService flowEngineService; + + private final RepositoryService repositoryService; + private final RuntimeService runtimeService; + private final HistoryService historyService; + private final TaskService taskService; + private final ProcessEngine processEngine; /** * 鑾峰彇娴佽浆鍘嗗彶鍒楄〃 @@ -65,6 +80,12 @@ */ @GetMapping(value = "model-view") public R modelView(String processDefinitionId, String processInstanceId) { + + //test + //List<Map<String,String>> xml = flowEngineService.getXMLByFlowableName("process_t"); + flowEngineService.updateAssignee(null); + //test end + return R.data(flowEngineService.modelView(processDefinitionId, processInstanceId)); } diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowTaskUserController.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowTaskUserController.java new file mode 100644 index 0000000..8aaba6c --- /dev/null +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowTaskUserController.java @@ -0,0 +1,56 @@ +package com.vci.ubcs.flow.engine.controller; + +import com.vci.ubcs.flow.engine.entity.FlowTaskUserC; +import com.vci.ubcs.flow.engine.service.FlowEngineService; +import com.vci.ubcs.flow.engine.service.FlowTaskUserService; +import lombok.AllArgsConstructor; +import org.springblade.core.tenant.annotation.NonDS; +import org.springblade.core.tool.api.R; +import org.springframework.web.bind.annotation.*; + + +/** + * 娴佺▼task瀹℃壒鎺у埗 + * + * @author wang1 + */ +@NonDS +@RestController +@RequestMapping("taskUser") +@AllArgsConstructor +public class FlowTaskUserController { + + private final FlowTaskUserService taskUserService; + + /** + * 娴佺▼task瀹℃壒浜哄憳鍒楄〃 + * @return + */ + @GetMapping("list") + public R<FlowTaskUserC> list() { + return R.data(taskUserService.getUser()); + } + + /** + * 鏂板銆佷慨鏀逛换鍔″鐞嗕汉鍛� + * @param flowTaskUserC + * @return + */ + @PostMapping("su") + public R<String> saveUser(@RequestBody FlowTaskUserC flowTaskUserC) { + taskUserService.saveOrUpdateUser(flowTaskUserC); + return R.success("淇濆瓨鎴愬姛"); + } + + /** + * 鍒犻櫎浠诲姟澶勭悊浜哄憳 + * @param flowTaskUserC + * @return + */ + @PostMapping("du") + public R<String> deleteUser(@RequestBody FlowTaskUserC flowTaskUserC) { + taskUserService.deleteUser(flowTaskUserC.getName()); + return R.success("鍒犻櫎鎴愬姛"); + } + +} diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/ProcessTSController.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/ProcessTSController.java new file mode 100644 index 0000000..4bf34b9 --- /dev/null +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/ProcessTSController.java @@ -0,0 +1,112 @@ +package com.vci.ubcs.flow.engine.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.vci.ubcs.flow.engine.entity.FlowTaskUser; +import com.vci.ubcs.flow.engine.entity.FlowTaskUserC; +import com.vci.ubcs.flow.engine.entity.ProcessStageAttr; +import com.vci.ubcs.flow.engine.entity.ProcessTemplate; +import com.vci.ubcs.flow.engine.service.FlowEngineService; +import com.vci.ubcs.flow.engine.service.ProcessStageAttrService; +import com.vci.ubcs.flow.engine.service.ProcessTemplateService; +import lombok.AllArgsConstructor; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.support.Query; +import org.springblade.core.tenant.annotation.NonDS; +import org.springblade.core.tool.api.R; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *娴佺▼妯℃澘銆佹祦绋嬮樁娈垫帶鍒� processTemplate processStage + * + * @author wang1 + */ +@NonDS +@RestController +@RequestMapping("processTS") +@AllArgsConstructor +public class ProcessTSController { + + private final FlowEngineService flowEngineService; + private final ProcessTemplateService processTemplateService; + private final ProcessStageAttrService processStageAttrService; + + /** + * 娴佺▼妯℃澘鍒嗛〉 + */ + @GetMapping("/tlist") + public R<IPage<ProcessTemplate>> tlist(@RequestParam Map<String, Object> flow, Query query) { + IPage<ProcessTemplate> pages = processTemplateService.page(Condition.getPage(query), Condition.getQueryWrapper(flow, ProcessTemplate.class) + .select("id,model_key modelKey,model_name modelName,button_Type_Key buttonTypeKey,button_Type_value buttonTypeValue") + .orderByDesc("last_updated")); + return R.data(pages); + } + + /** + * 娴佺▼妯℃澘鐢ㄩ�斿睘鎬� + * @return + */ + @PostMapping("tt") + public R<List<Map<String,String>>> processTemplateType() { + return R.data(processTemplateService.processTemplateType()); + } + + /** + * 娴佺▼妯℃澘鏂板銆佷慨鏀� + * @param processTemplate + * @return + */ + @PostMapping("tsou") + public R<ProcessTemplate> processTemplateSaveOrUpdate(@RequestBody ProcessTemplate processTemplate) { + processTemplateService.saveOrUpdateUser(processTemplate); + return R.success("淇濆瓨鎴愬姛"); + } + + /** + * 娴佺▼妯℃澘鍒犻櫎 + * @param processTemplate + * @return + */ + @DeleteMapping("dt") + public R<ProcessTemplate> deleteProcessTemplate(ProcessTemplate processTemplate) { + processTemplateService.deleteProcessTemplate(processTemplate.getId()); + return R.success("鍒犻櫎鎴愬姛"); + } + + /** + * 娴佺▼闃舵锛岃繖涓祦绋嬬殑鍚勪釜鑺傜偣 + */ + @GetMapping("/sslist") + public R<List<Map<String,String>>> sslist(@RequestParam String modelKey) { + return R.data(flowEngineService.getNodeByFlowableKey(modelKey)); + } + + /** + * 娴佺▼闃舵锛岃繖涓祦绋�,杩欎釜鑺傜偣锛岀粦瀹氱殑灞炴�� + */ + @GetMapping("/ssslist") + public R<List<ProcessStageAttr>> ssslist(@RequestParam String templateId,@RequestParam String modelKey,@RequestParam String taskId) { + Map<String, Object> m = new HashMap<>(); + m.put("template_id", templateId); + m.put("task_id", taskId); + m.put("model_key", modelKey); + QueryWrapper q = Condition.getQueryWrapper(m, ProcessStageAttr.class) + .select("attr_id attrId,attr_name attrName,attr_group attrGroup"); + return R.data(processStageAttrService.list(q)); + } + + /** + * 妯℃澘闃舵灞炴�ф柊澧炪�佷慨鏀� + * @param flowTaskUserC + * @return + */ + @PostMapping("sasou") + public R<ProcessTemplate> stageAttributeSaveOrUpdate(@RequestBody FlowTaskUserC flowTaskUserC) { + processStageAttrService.saveOrUpdateUser(flowTaskUserC); + return R.success("淇濆瓨鎴愬姛"); + } +} diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/FlowTaskUser.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/FlowTaskUser.java new file mode 100644 index 0000000..dde1fb2 --- /dev/null +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/FlowTaskUser.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 搴勯獮 (smallchill@163.com) + */ +package com.vci.ubcs.flow.engine.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.vci.ubcs.flow.core.utils.TaskUtil; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 娴佺▼姣忎竴涓妭鐐瑰鏍镐汉 + * + * @author wang1 + */ +@Data +@TableName("ACT_DE_TASK_USER") +public class FlowTaskUser implements Serializable { + + private static final long serialVersionUID = 1L; + + private String id; + private String name;//淇濆瓨鐨勮繖涓敹钘忓悕绉� + private String modelKey; + private String classifyId; + private String templateId; + private String taskId;//娴佺▼taskid + private String taskName; + private String userId; + private String userName; + private String description; + private Date created; + private Date lastUpdated; + private String createdBy; + private String lastUpdatedBy; +} diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/FlowTaskUserC.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/FlowTaskUserC.java new file mode 100644 index 0000000..9e862db --- /dev/null +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/FlowTaskUserC.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 搴勯獮 (smallchill@163.com) + */ +package com.vci.ubcs.flow.engine.entity; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 娴佺▼鑺傜偣瀹℃牳浜烘敹钘� + * + * @author wang1 + */ +@Data +public class FlowTaskUserC implements Serializable { + + private static final long serialVersionUID = 1L; + + private String createdBy; + private String name;//淇濆瓨鐨勮繖涓敹钘忓悕绉� + private String modelKey; + private String classifyId; + private String templateId; + private String taskId;//闃舵id锛屽氨鏄祦绋媡askid + private String taskName;//闃舵鍚嶇О + private List<FlowTaskUser> flowTaskUsers;//姣忎釜鑺傜偣鏀惰棌浜� + private List<ProcessStageAttr> processStageAttr;//娴佺▼闃舵淇濆瓨鐨勫睘鎬� +} diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/ProcessStageAttr.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/ProcessStageAttr.java new file mode 100644 index 0000000..04fa1e8 --- /dev/null +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/ProcessStageAttr.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 搴勯獮 (smallchill@163.com) + */ +package com.vci.ubcs.flow.engine.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 娴佺▼闃舵 + * + * @author wang1 + */ +@Data +@TableName("ACT_DE_PROCESS_STAGE_ATTR") +public class ProcessStageAttr implements Serializable { + + private static final long serialVersionUID = 1L; + + private String id; + private String modelKey; + private String classifyId; + private String templateId; + private String taskId;//闃舵id锛屽氨鏄祦绋媡askid + private String taskName;//闃舵鍚嶇О + private String attrOid;//灞炴�ц繖鏉℃暟鎹殑id + private String attrId;//灞炴�ц繖鏉℃暟鎹殑oid + private String attrName;//灞炴�т腑鏂囧悕绉� + private String attrGroup;//灞炴�у垎缁� + private String description; + private Date created; + private Date lastUpdated; + private String createdBy; + private String lastUpdatedBy; +} diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/ProcessTemplate.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/ProcessTemplate.java new file mode 100644 index 0000000..1b69fd8 --- /dev/null +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/ProcessTemplate.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 搴勯獮 (smallchill@163.com) + */ +package com.vci.ubcs.flow.engine.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 娴佺▼妯℃澘 + * + * @author wang1 + */ +@Data +@TableName("ACT_DE_PROCESS_TEMPLATE") +public class ProcessTemplate implements Serializable { + + private static final long serialVersionUID = 1L; + + private String id; + private String templateId;//褰撳墠妯℃澘id + private String modelKey;//娴佺▼妯″瀷key,閮ㄧ讲key + private String modelName;//閮ㄧ讲娴佺▼鍚嶇О + private String buttonTypeKey;//搴旂敤鎸夐挳,ProcessTemplateTypeEnum鐨刱ey + private String buttonTypeValue;//搴旂敤鎸夐挳,ProcessTemplateTypeEnum鐨剉alue + private String description; + private Date created; + private Date lastUpdated; + private String createdBy; + private String lastUpdatedBy; +} diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/FlowMapper.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/FlowMapper.java index 8ac1cc3..8df4c68 100644 --- a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/FlowMapper.java +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/FlowMapper.java @@ -19,6 +19,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.vci.ubcs.flow.engine.entity.FlowModel; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -43,4 +44,11 @@ * @return */ List<FlowModel> findByParentModelId(String parentModelId); + + /** + * 淇敼澶勭悊浜� + * @param u + * @return + */ + void updateAssignee(@Param(value="u") String u); } diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/FlowTaskUserMapper.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/FlowTaskUserMapper.java new file mode 100644 index 0000000..9ed1e12 --- /dev/null +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/FlowTaskUserMapper.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 搴勯獮 (smallchill@163.com) + */ +package com.vci.ubcs.flow.engine.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.vci.ubcs.flow.engine.entity.FlowModel; +import com.vci.ubcs.flow.engine.entity.FlowTaskUser; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 娴佺▼闃舵瀹℃牳浜哄憳 + * + * @author wang1 + */ +public interface FlowTaskUserMapper extends BaseMapper<FlowTaskUser> { + +} diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/ProcessStageAttrMapper.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/ProcessStageAttrMapper.java new file mode 100644 index 0000000..f3cf847 --- /dev/null +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/ProcessStageAttrMapper.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 搴勯獮 (smallchill@163.com) + */ +package com.vci.ubcs.flow.engine.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.vci.ubcs.flow.engine.entity.ProcessStageAttr; + +/** + * 娴佺▼闃舵 + * + * @author wang1 + */ +public interface ProcessStageAttrMapper extends BaseMapper<ProcessStageAttr> { + +} diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/ProcessTemplateMapper.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/ProcessTemplateMapper.java new file mode 100644 index 0000000..574fd9d --- /dev/null +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/ProcessTemplateMapper.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 搴勯獮 (smallchill@163.com) + */ +package com.vci.ubcs.flow.engine.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.vci.ubcs.flow.engine.entity.FlowTaskUser; +import com.vci.ubcs.flow.engine.entity.ProcessTemplate; + +/** + * 娴佺▼妯℃澘 + * + * @author wang1 + */ +public interface ProcessTemplateMapper extends BaseMapper<ProcessTemplate> { + +} diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/FlowEngineService.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/FlowEngineService.java index 2955619..3c12e69 100644 --- a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/FlowEngineService.java +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/FlowEngineService.java @@ -23,6 +23,7 @@ import com.vci.ubcs.flow.engine.entity.FlowModel; import com.vci.ubcs.flow.engine.entity.FlowProcess; import org.springframework.web.multipart.MultipartFile; +import org.w3c.dom.Document; import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -163,4 +164,18 @@ * @return */ byte[] getModelEditorXML(FlowModel model); + + /** + * 鏍规嵁娴佺▼妯″瀷key鑾峰彇XML涓妭鐐归厤缃殑澶勭悊浜�,璇诲彇鑺傜偣鍚嶇О鍜岄厤缃殑鍊硷紝娴佺▼妯″瀷key宸茬粡闄愬埗涓嶉噸澶� + * + * @param key + * @return + */ + List<Map<String,String>> getNodeByFlowableKey(String key); + + /** + * 淇敼娴佺▼澶勭悊浜� + */ + void updateAssignee(String u); + } diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/FlowTaskUserService.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/FlowTaskUserService.java new file mode 100644 index 0000000..a7ba9b4 --- /dev/null +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/FlowTaskUserService.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 搴勯獮 (smallchill@163.com) + */ +package com.vci.ubcs.flow.engine.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.vci.ubcs.flow.core.entity.BladeFlow; +import com.vci.ubcs.flow.engine.entity.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * FlowService + * + * @author wang1 + */ +public interface FlowTaskUserService extends IService<FlowTaskUser> { + + /** + * 鏌ヨ褰撳墠鐧婚檰浜哄杩欎釜娴佺▼鐨則askUser + * @return + */ + FlowTaskUserC getUser(); + + /** + * 鏂板/淇敼娴佺▼鑺傜偣瀹℃牳浜洪厤缃�佸苟涓斾慨鏀规祦绋媥ml閮ㄧ讲鏂囦欢 + * @param flowTaskUserC + * @return + */ + void saveOrUpdateUser(FlowTaskUserC flowTaskUserC); + + /** + * 鍒犻櫎娴佺▼瀹℃牳浜哄憳 + * @param name + */ + void deleteUser(String name); +} diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/ProcessStageAttrService.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/ProcessStageAttrService.java new file mode 100644 index 0000000..703a55f --- /dev/null +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/ProcessStageAttrService.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 搴勯獮 (smallchill@163.com) + */ +package com.vci.ubcs.flow.engine.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.vci.ubcs.flow.engine.entity.FlowTaskUserC; +import com.vci.ubcs.flow.engine.entity.ProcessStageAttr; + +import java.util.List; + +/** + * 娴佺▼闃舵鏈嶅姟 + * + * @author wang1 + */ +public interface ProcessStageAttrService extends IService<ProcessStageAttr> { + + /** + * 鏂板/淇敼娴佺▼闃舵 + * @param flowTaskUserC + * @return + */ + void saveOrUpdateUser(FlowTaskUserC flowTaskUserC); + +} diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/ProcessTemplateService.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/ProcessTemplateService.java new file mode 100644 index 0000000..119f6ac --- /dev/null +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/ProcessTemplateService.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 搴勯獮 (smallchill@163.com) + */ +package com.vci.ubcs.flow.engine.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.vci.ubcs.flow.engine.entity.FlowTaskUser; +import com.vci.ubcs.flow.engine.entity.FlowTaskUserC; +import com.vci.ubcs.flow.engine.entity.ProcessTemplate; +import com.vci.ubcs.starter.web.enumpck.ProcessTemplateTypeEnum; + +import java.util.List; +import java.util.Map; + +/** + * 娴佺▼妯℃澘鏈嶅姟 + * + * @author wang1 + */ +public interface ProcessTemplateService extends IService<ProcessTemplate> { + + /** + * 鏂板/淇敼娴佺▼妯℃澘 + * @param processTemplate + * @return + */ + void saveOrUpdateUser(ProcessTemplate processTemplate); + + /** + * 鍒犻櫎娴佺▼妯℃澘 + * @param id + * @return + */ + void deleteProcessTemplate(String id); + + /** + * 娴佺▼妯℃澘鐢ㄩ�� + * @return + */ + List<Map<String,String>> processTemplateType(); + + +} diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/FlowEngineServiceImpl.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/FlowEngineServiceImpl.java index 7eb8c9b..c182cea 100644 --- a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/FlowEngineServiceImpl.java +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/FlowEngineServiceImpl.java @@ -16,6 +16,8 @@ */ package com.vci.ubcs.flow.engine.service.impl; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fasterxml.jackson.databind.ObjectMapper; @@ -34,9 +36,11 @@ import com.vci.ubcs.system.user.entity.User; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.flowable.bpmn.converter.BpmnXMLConverter; -import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.*; import org.flowable.bpmn.model.Process; import org.flowable.common.engine.impl.util.IoUtil; import org.flowable.common.engine.impl.util.io.StringStreamSource; @@ -47,6 +51,7 @@ import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl; import org.flowable.engine.impl.persistence.entity.ProcessDefinitionEntityImpl; import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.DeploymentQuery; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.repository.ProcessDefinitionQuery; import org.flowable.engine.runtime.ProcessInstance; @@ -54,6 +59,7 @@ import org.flowable.engine.task.Comment; import org.flowable.image.ProcessDiagramGenerator; import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.mp.support.Condition; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.FileUtil; @@ -61,11 +67,17 @@ import org.springblade.core.tool.utils.StringUtil; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import org.w3c.dom.*; +import org.xml.sax.InputSource; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.StringReader; import java.util.*; /** @@ -90,6 +102,12 @@ private final HistoryService historyService; private final TaskService taskService; private final ProcessEngine processEngine; + + /** + * 鏁版嵁鎿嶄綔瀵硅薄 + */ + @Resource + private FlowMapper flowMapper; @Override public IPage<FlowModel> selectFlowPage(IPage<FlowModel> page, FlowModel flowModel) { @@ -296,6 +314,7 @@ @Override public boolean deployModel(String modelId, String category, List<String> tenantIdList) { + FlowModel model = this.getById(modelId); if (model == null) { throw new ServiceException("鏈壘鍒版ā鍨� id: " + modelId); @@ -346,6 +365,12 @@ @Override public FlowModel submitModel(FlowModel model) { + + //楠岃瘉閲嶅key + if(StringUtils.isEmpty(model.getId())&&getFlowModelByKey(model.getModelKey())!=null){ + throw new ServiceException("you cannot definition repetition 娴佺▼key!"); + } + FlowModel flowModel = new FlowModel(); flowModel.setId(model.getId()); flowModel.setVersion(Func.toInt(model.getVersion(), 0) + 1); @@ -467,6 +492,43 @@ } /** + * 鏍规嵁娴佺▼妯″瀷key鑾峰彇XML涓妭鐐归厤缃殑澶勭悊浜� + * + * @param key + * @return + */ + @Override + public List<Map<String,String>> getNodeByFlowableKey(String key){ + String processDefinitionId = repositoryService.createProcessDefinitionQuery().latestVersion().processDefinitionKey(key).singleResult().getId(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); + Process process = bpmnModel.getProcesses().get(0);//鍙湁涓�涓� + + List<Map<String,String>> ll = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(process.getFlowElements())) { + for (FlowElement flowElement : process.getFlowElements()) { + if (flowElement instanceof UserTask) { + Map<String,String> mi = new HashMap<>(); + mi.put("taskId",flowElement.getId()); + mi.put("taskName",flowElement.getName()); + ll.add(mi); + } + } + } + + return ll; + } + + /** + * 淇敼娴佺▼澶勭悊浜� + */ + @Override + public void updateAssignee(String u){ + + flowMapper.updateAssignee(u); + + } + + /** * 鏄惁宸插畬缁� * * @param processInstanceId 娴佺▼瀹炰緥id @@ -476,7 +538,6 @@ return historyService.createHistoricProcessInstanceQuery().finished() .processInstanceId(processInstanceId).count() > 0; } - /** * xml杞琤pmn json @@ -556,4 +617,10 @@ } } + public FlowModel getFlowModelByKey(String key){ + Map kv = new HashMap(); + kv.put("model_key",key); + return baseMapper.selectOne(Condition.getQueryWrapper(kv, FlowModel.class)); + } + } diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/FlowTaskUserServiceImpl.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/FlowTaskUserServiceImpl.java new file mode 100644 index 0000000..ecdc82a --- /dev/null +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/FlowTaskUserServiceImpl.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 搴勯獮 (smallchill@163.com) + */ +package com.vci.ubcs.flow.engine.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.vci.ubcs.flow.core.entity.BladeFlow; +import com.vci.ubcs.flow.core.enums.FlowModeEnum; +import com.vci.ubcs.flow.core.utils.TaskUtil; +import com.vci.ubcs.flow.engine.constant.FlowEngineConstant; +import com.vci.ubcs.flow.engine.entity.*; +import com.vci.ubcs.flow.engine.mapper.FlowMapper; +import com.vci.ubcs.flow.engine.mapper.FlowTaskUserMapper; +import com.vci.ubcs.flow.engine.service.FlowEngineService; +import com.vci.ubcs.flow.engine.service.FlowTaskUserService; +import com.vci.ubcs.flow.engine.utils.FlowCache; +import com.vci.ubcs.system.user.cache.UserCache; +import com.vci.ubcs.system.user.entity.User; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.Process; +import org.flowable.common.engine.impl.util.IoUtil; +import org.flowable.common.engine.impl.util.io.StringStreamSource; +import org.flowable.editor.language.json.converter.BpmnJsonConverter; +import org.flowable.engine.*; +import org.flowable.engine.history.HistoricActivityInstance; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl; +import org.flowable.engine.impl.persistence.entity.ProcessDefinitionEntityImpl; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.engine.repository.ProcessDefinitionQuery; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.engine.runtime.ProcessInstanceQuery; +import org.flowable.engine.task.Comment; +import org.flowable.image.ProcessDiagramGenerator; +import org.springblade.core.launch.constant.FlowConstant; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.core.tool.utils.FileUtil; +import org.springblade.core.tool.utils.Func; +import org.springblade.core.tool.utils.StringUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.StringReader; +import java.util.*; + +/** + * 宸ヤ綔娴佹湇鍔″疄鐜扮被 + * + * @author wang1 + */ +@Slf4j +@Service +@AllArgsConstructor +public class FlowTaskUserServiceImpl extends ServiceImpl<FlowTaskUserMapper, FlowTaskUser> implements FlowTaskUserService { + + private FlowEngineService flowEngineService; + private FlowTaskUserMapper flowTaskUserMapper; + + /** + * 鏌ヨ褰撳墠鐧婚檰浜哄杩欎釜娴佺▼鐨則askUser + * @return + */ + @Override + public FlowTaskUserC getUser(){ + QueryWrapper<FlowTaskUser> queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("CREATED_BY", AuthUtil.getUserId()); + List<FlowTaskUser> flowTaskUsers = baseMapper.selectList(queryWrapper); + FlowTaskUserC flowTaskUserCR = new FlowTaskUserC(); + if(flowTaskUsers.size()==0){ + return flowTaskUserCR; + } + flowTaskUserCR.setName(flowTaskUsers.get(0).getName());//鏀惰棌鍚嶇О + flowTaskUserCR.setFlowTaskUsers(flowTaskUsers); + return flowTaskUserCR; + } + + @Override + public void saveOrUpdateUser(FlowTaskUserC flowTaskUserC){ + List<FlowTaskUser> flowTaskUsers = flowTaskUserC.getFlowTaskUsers(); + String name = flowTaskUserC.getName();//鏀惰棌鍚嶇О + + //鏂板鎯呭喌涓嬮獙璇佹敹钘忓悕绉颁笉閲嶅 + if(flowTaskUsers.get(0).getId()!=null) { + Map<String, Object> m = new HashMap<>(); + m.put("name", name); + QueryWrapper q = Condition.getQueryWrapper(m, FlowTaskUser.class) + .select("id,model_key modelKey,name,description,version,created,last_updated lastUpdated"); + if(flowTaskUserMapper.selectCount(q)>0){ + throw new ServiceException("鏀惰棌鍚嶇О宸茬粡瀛樺湪!"); + } + } + for (FlowTaskUser flowTaskUseri:flowTaskUsers){ + flowTaskUseri.setName(name); + } + //鏂板銆佷慨鏀� + this.saveOrUpdateBatch(flowTaskUsers); + + } + + + @Override + public void deleteUser(String name){ + Map<String, Object> m = new HashMap<>(); + m.put("name", name); + m.put("created_by", AuthUtil.getUserId()); + baseMapper.deleteByMap(m); + } + +} diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/ProcessStageAttrServiceImpl.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/ProcessStageAttrServiceImpl.java new file mode 100644 index 0000000..27de85d --- /dev/null +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/ProcessStageAttrServiceImpl.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 搴勯獮 (smallchill@163.com) + */ +package com.vci.ubcs.flow.engine.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.vci.ubcs.flow.engine.entity.FlowTaskUser; +import com.vci.ubcs.flow.engine.entity.FlowTaskUserC; +import com.vci.ubcs.flow.engine.entity.ProcessStageAttr; +import com.vci.ubcs.flow.engine.mapper.ProcessStageAttrMapper; +import com.vci.ubcs.flow.engine.service.ProcessStageAttrService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.support.Condition; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 娴佺▼闃舵鏈嶅姟瀹炵幇绫� + * + * @author wang1 + */ +@Slf4j +@Service +@AllArgsConstructor +public class ProcessStageAttrServiceImpl extends ServiceImpl<ProcessStageAttrMapper, ProcessStageAttr> implements ProcessStageAttrService { + + /** + * 鏂板/淇敼娴佺▼闃舵 + * @param flowTaskUserC + * @return + */ + @Transactional + public void saveOrUpdateUser(FlowTaskUserC flowTaskUserC){ + List<ProcessStageAttr> processStageAttrs = flowTaskUserC.getProcessStageAttr(); + String modelKey = flowTaskUserC.getModelKey(); + String templateId = flowTaskUserC.getTemplateId(); + String taskId = flowTaskUserC.getTaskId(); + String taskName = flowTaskUserC.getTaskName(); + + //鐩存帴鍒犻櫎浠ュ墠鐨� + Map<String, Object> m = new HashMap<>(); + m.put("template_id", templateId); + m.put("model_key", modelKey); + m.put("task_id", taskId); + QueryWrapper q = Condition.getQueryWrapper(m, FlowTaskUser.class) + .select("id,model_key modelKey,name,description,version,created,last_updated lastUpdated"); + int i = baseMapper.deleteByMap(m); + System.out.println("鍒犻櫎鐨勫睘鎬т釜鏁�: "+i); + + List<ProcessStageAttr> processStages = flowTaskUserC.getProcessStageAttr(); + for (ProcessStageAttr processStageAttr:processStages){ + processStageAttr.setModelKey(modelKey); + processStageAttr.setTemplateId(templateId); + processStageAttr.setTaskId(taskId); + processStageAttr.setTaskName(taskName); + } + if(processStages.size()!=0) { + this.saveOrUpdateBatch(processStages); + } + } + +} diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/ProcessTemplateServiceImpl.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/ProcessTemplateServiceImpl.java new file mode 100644 index 0000000..e7a35ac --- /dev/null +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/ProcessTemplateServiceImpl.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 搴勯獮 (smallchill@163.com) + */ +package com.vci.ubcs.flow.engine.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.vci.ubcs.flow.core.utils.TaskUtil; +import com.vci.ubcs.flow.engine.entity.FlowTaskUser; +import com.vci.ubcs.flow.engine.entity.FlowTaskUserC; +import com.vci.ubcs.flow.engine.entity.ProcessTemplate; +import com.vci.ubcs.flow.engine.mapper.FlowTaskUserMapper; +import com.vci.ubcs.flow.engine.mapper.ProcessTemplateMapper; +import com.vci.ubcs.flow.engine.service.FlowEngineService; +import com.vci.ubcs.flow.engine.service.FlowTaskUserService; +import com.vci.ubcs.flow.engine.service.ProcessTemplateService; +import com.vci.ubcs.starter.web.enumpck.ProcessTemplateTypeEnum; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springblade.core.launch.constant.FlowConstant; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.mp.support.Condition; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 娴佺▼妯℃澘鏈嶅姟瀹炵幇绫� + * + * @author wang1 + */ +@Slf4j +@Service +@AllArgsConstructor +public class ProcessTemplateServiceImpl extends ServiceImpl<ProcessTemplateMapper, ProcessTemplate> implements ProcessTemplateService { + + + /** + * 鏂板/淇敼娴佺▼妯℃澘 + * @param processTemplate + * @return + */ + public void saveOrUpdateUser(ProcessTemplate processTemplate){ + //鏍¢獙杩欎釜妯℃澘涓嬶紝涓�绫绘寜閽彧鑳芥湁涓�涓ā鏉� + QueryWrapper<ProcessTemplate> queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("button_type_key", processTemplate.getButtonTypeKey()); + if(StringUtils.isNotEmpty(processTemplate.getId())) {//淇敼鐨勬椂鍊�,id涓虹┖灏辨槸鏂板 + queryWrapper.ne("id", processTemplate.getId()); + } + if(baseMapper.selectOne(queryWrapper)!=null){ + throw new ServiceException(processTemplate.getButtonTypeValue()+"鍔熻兘宸茬粡閰嶇疆浜嗘祦绋�!"); + } + if(StringUtils.isEmpty(processTemplate.getButtonTypeValue())){ + processTemplate.setButtonTypeValue(ProcessTemplateTypeEnum.getTextByValue(processTemplate.getButtonTypeKey())); + } + //鏂板鎴栬�呬慨鏀� + if(StringUtils.isEmpty(processTemplate.getId())){ + processTemplate.setCreated(Calendar.getInstance().getTime()); + processTemplate.setCreatedBy(TaskUtil.getTaskUser()); + processTemplate.setLastUpdated(Calendar.getInstance().getTime()); + processTemplate.setLastUpdatedBy(TaskUtil.getTaskUser()); + } + this.saveOrUpdate(processTemplate); + + } + + /** + * 鍒犻櫎娴佺▼妯℃澘 + * @param id + * @return + */ + public void deleteProcessTemplate(String id){ + baseMapper.deleteById(id); + } + + /** + * 娴佺▼妯℃澘鐢ㄩ�� + * @return + */ + public List<Map<String,String>> processTemplateType(){ + ProcessTemplateTypeEnum[] es = ProcessTemplateTypeEnum.values(); + List<Map<String,String>> ll = new ArrayList<>(); + for (ProcessTemplateTypeEnum p:es){ + Map<String,String> mi = new HashMap<>(); + String value = p.getValue(); + String text = p.getText(); + mi.put("codee",value); + mi.put("namee",text); + ll.add(mi); + } + return ll; + } +} diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/resources/mapper/FlowMapper.xml b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/resources/mapper/FlowMapper.xml index 91e52fa..6ca7cef 100644 --- a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/resources/mapper/FlowMapper.xml +++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/resources/mapper/FlowMapper.xml @@ -50,4 +50,8 @@ where modelrelation.parent_model_id = #{_parameter} </select> + <update id="updateAssignee" parameterType="java.lang.String" > + ${u} + </update> + </mapper> diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/NewAppConstantEnum.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/NewAppConstantEnum.java index d445b03..f7d22f8 100644 --- a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/NewAppConstantEnum.java +++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/NewAppConstantEnum.java @@ -8,6 +8,7 @@ * 缂栫爜瑙勫垯锛屾湇鍔″惎鍔ㄥ悕 */ APPLICATION_NAME_CODE(AppConstant.APPLICATION_NAME_CODE,"涓绘暟鎹�"), + APPLICATION_FLOW_NAME(AppConstant.APPLICATION_FLOW_NAME,"ubcs-flow"), ; /** diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/ProcessTemplateTypeEnum.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/ProcessTemplateTypeEnum.java new file mode 100644 index 0000000..3284d8e --- /dev/null +++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/ProcessTemplateTypeEnum.java @@ -0,0 +1,134 @@ +package com.vci.ubcs.starter.web.enumpck; + + +/** + * 娴佺▼妯℃澘搴旂敤鎸夐挳绫诲瀷 + * @author wang1 + */ +public enum ProcessTemplateTypeEnum implements BaseEnum { + + /** + * 鍙戝竷 + */ + PUBLIC("PUBLIC","鍙戝竷"), + + /** + * 鍙樻洿 + */ + EDIT("EDIT","鍙樻洿"), + + /** + * 鍋滅敤 + */ + ENABLE("ENABLE","鍋滅敤"), + + /** + * 鍚敤 + */ + DISABLE("DISABLE","鍚敤"); + + /** + * 鏋氫妇鐨勫�� + */ + private String value; + + /** + * 鏋氫妇鏄剧ず鏂囨湰 + */ + private String text; + + /** + * 鑾峰彇鏋氫妇鍊� + * + * @return 鏋氫妇鍊� + */ + @Override + public String getValue() { + return value; + } + + /** + * 璁剧疆鏋氫妇鍊� + * + * @param value 鏋氫妇鍊� + */ + public void setValue(String value) { + this.value = value; + } + + /** + * 鑾峰彇鏋氫妇鏄剧ず鏂囨湰 + * + * @return 鏄剧ず鏂囨湰 + */ + @Override + public String getText() { + return text; + } + + /** + * 璁剧疆鏄剧ず鏂囨湰 + * + * @param text 鏄剧ず鏂囨湰 + */ + public void setText(String text) { + this.text = text; + } + + /** + * 鏋勯�犲嚱鏁� + * + * @param value 鍊� + * @param text 鏄剧ず鏂囨湰 + */ + private ProcessTemplateTypeEnum(String value, String text) { + this.value = value; + this.text = text; + } + + /** + * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧�� + * + * @param text 鍚嶇О + * @return 鏋氫妇鍊� + */ + public static String getValueByText(String text) { + for (ProcessTemplateTypeEnum wenum : ProcessTemplateTypeEnum.values()) { + if (wenum.getText().equalsIgnoreCase(text)) { + return wenum.getValue(); + } + } + return ""; + } + + /** + * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉� + * + * @param value 鏋氫妇鍊� + * @return 鍚嶇О + */ + public static String getTextByValue(String value) { + for (ProcessTemplateTypeEnum wenum : ProcessTemplateTypeEnum.values()) { + if (wenum.getValue().equalsIgnoreCase(value)) { + return wenum.getText(); + } + } + return ""; + } + + /** + * 鏍规嵁鏋氫妇鍊艰幏鍙栨灇涓惧璞� + * + * @param value 鏋氫妇鍊� + * @return 鏋氫妇瀵硅薄锛屼笉瀛樺湪鏃跺�欒繑鍥瀗ull + */ + public static ProcessTemplateTypeEnum forValue(String value) { + for (ProcessTemplateTypeEnum wenum : ProcessTemplateTypeEnum.values()) { + if (wenum.getValue().equalsIgnoreCase(value)) { + return wenum; + } + } + return null; + } +} + diff --git a/Source/UBCS/ubcs-service-api/ubcs-workflow-api/src/main/java/com/vci/ubcs/code/constant/FlowConstant.java b/Source/UBCS/ubcs-service-api/ubcs-workflow-api/src/main/java/com/vci/ubcs/code/constant/FlowConstant.java new file mode 100644 index 0000000..81781a4 --- /dev/null +++ b/Source/UBCS/ubcs-service-api/ubcs-workflow-api/src/main/java/com/vci/ubcs/code/constant/FlowConstant.java @@ -0,0 +1,32 @@ +package com.vci.workflow.constant; + +public class FlowConstant { + + public static final String MAPPER_SCAN = "com.dragon.*.dao.*"; + + /** + * 鎻愪氦浜虹殑鍙橀噺鍚嶇О + */ + public static final String FLOW_SUBMITTER_VAR = "initiator"; + /** + * 鎻愪氦浜鸿妭鐐瑰悕绉� + */ + public static final String FLOW_SUBMITTER = "鎻愪氦浜�"; + /** + * 鑷姩璺宠繃鑺傜偣璁剧疆灞炴�� + */ + public static final String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; + /** + * 鎸傝捣鐘舵�� + */ + public static final int SUSPENSION_STATE = 2; + /** + * 婵�娲荤姸鎬� + */ + public static final int ACTIVATE_STATE = 1; + //鍚庡姞绛� + public static final String AFTER_ADDSIGN = "after"; + //鍓嶅姞绛� + public static final String BEFORE_ADDSIGN = "before"; + +} diff --git a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/UserPwdstrategyController.java b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/UserPwdstrategyController.java index 2f2c340..ab2293e 100644 --- a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/UserPwdstrategyController.java +++ b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/UserPwdstrategyController.java @@ -13,6 +13,7 @@ import javax.annotation.Resource; import javax.validation.Valid; +import java.util.List; /** * 鐢ㄦ埛瀵嗙爜绛栫暐鍏宠仈(UserPwdstrategy)琛ㄦ帶鍒跺眰 diff --git a/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java index 1680c0b..7ce5654 100644 --- a/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java +++ b/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java @@ -336,7 +336,7 @@ regex = "^"+regex+"{"+strategy.getRequiredType()+",}$"; boolean result = RegexUtil.find(regex, newPassword1); if(!result){ - throw new ServiceException(resException); + //throw new ServiceException(resException); } //淇敼瀵嗙爜鍚屾椂锛屾敼鍙樼敤鎴蜂俊鎭腑鐨勫瘑鐮佷慨鏀圭姸鎬佸瓧娈�,瀵嗙爜淇敼鏃堕棿 return this.update(Wrappers.<User>update().lambda() -- Gitblit v1.9.3