From 1e72052f14083ce772bc7664aea606d86325150f Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期四, 02 一月 2025 18:23:47 +0800 Subject: [PATCH] 流程日志代码、流程推进详情页查询中的处理人、处理单位数据结构调整 --- common/src/main/java/com/ycl/common/enums/business/FlowLogEventTypeEnum.java | 33 ++ business/src/main/java/com/ycl/mapper/FlowLogMapper.java | 33 ++ business/src/main/java/com/ycl/service/impl/FlowLogServiceImpl.java | 110 +++++++ business/src/main/java/com/ycl/domain/json/TaskDelegateData.java | 36 ++ business/src/main/resources/mapper/FlowLogMapper.xml | 52 +++ business/src/main/java/com/ycl/controller/FlowLogController.java | 38 ++ business/src/main/java/com/ycl/domain/entity/FlowLog.java | 46 +++ business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java | 11 business/src/main/java/com/ycl/domain/vo/FlowLogVO.java | 55 +++ business/src/main/java/com/ycl/domain/form/TaskDelegationForm.java | 6 business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java | 291 +++++++++++++------- business/src/main/java/com/ycl/service/FlowLogService.java | 61 ++++ business/src/main/java/com/ycl/domain/query/FlowLogQuery.java | 22 + 13 files changed, 687 insertions(+), 107 deletions(-) diff --git a/business/src/main/java/com/ycl/controller/FlowLogController.java b/business/src/main/java/com/ycl/controller/FlowLogController.java new file mode 100644 index 0000000..d654862 --- /dev/null +++ b/business/src/main/java/com/ycl/controller/FlowLogController.java @@ -0,0 +1,38 @@ +package com.ycl.controller; + +import com.ycl.common.base.Result; +import com.ycl.domain.query.FlowLogQuery; +import com.ycl.service.FlowLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 娴佺▼鏃ュ織 鍓嶇鎺у埗鍣� + * + * @author xp + * @since 2025-01-02 + */ +@Validated +@RequiredArgsConstructor +@Api(value = "娴佺▼鏃ュ織", tags = "娴佺▼鏃ュ織绠$悊") +@RestController +@RequestMapping("/flow-log") +public class FlowLogController { + + private final FlowLogService flowLogService; + + + @GetMapping("/page") + @ApiOperation(value = "鍒嗛〉", notes = "鍒嗛〉") + @PreAuthorize("@ss.hasPermi('flowLog:page')") + public Result page(FlowLogQuery query) { + return flowLogService.page(query); + } + +} diff --git a/business/src/main/java/com/ycl/domain/entity/FlowLog.java b/business/src/main/java/com/ycl/domain/entity/FlowLog.java new file mode 100644 index 0000000..c851688 --- /dev/null +++ b/business/src/main/java/com/ycl/domain/entity/FlowLog.java @@ -0,0 +1,46 @@ +package com.ycl.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ycl.common.enums.business.FlowLogEventTypeEnum; +import com.ycl.system.domain.base.AbsEntity; +import lombok.Data; + +/** + * 娴佺▼鏃ュ織 + * + * @author xp + * @since 2025-01-02 + */ +@Data +@TableName("t_flow_log") +public class FlowLog extends AbsEntity { + + private static final long serialVersionUID = 1L; + + @TableField("task_id") + /** 浠诲姟id */ + private String taskId; + + @TableField("event_type") + /** 浜嬩欢鏃ュ織绫诲瀷 */ + private FlowLogEventTypeEnum eventType; + + @TableField("project_id") + /** 椤圭洰id */ + private Integer projectId; + + @TableField("flow_ins_id") + /** 娴佺▼瀹炰緥id */ + private String flowInsId; + + @TableField("user_id") + /** 浜х敓鏃ュ織鐨勪汉/鎴栧叾瀹� */ + private Integer userId; + + @TableField("event_data_json") + /** 浜嬩欢鏁版嵁锛屾牴鎹笉鍚岀殑浜嬩欢鍙瓨鍌ㄥ搴旂殑鎵╁睍鏁版嵁銆傚杞姙浜嬩欢鍙瓨鍌ㄨ浆鍔炲墠鍚庣殑澶勭悊浜轰俊鎭� */ + private String eventDataJson; + + +} diff --git a/business/src/main/java/com/ycl/domain/form/TaskDelegationForm.java b/business/src/main/java/com/ycl/domain/form/TaskDelegationForm.java index 8622742..9d628fa 100644 --- a/business/src/main/java/com/ycl/domain/form/TaskDelegationForm.java +++ b/business/src/main/java/com/ycl/domain/form/TaskDelegationForm.java @@ -33,4 +33,10 @@ */ @ApiModelProperty("涓嶅悓鐢ㄦ埛缁勫搴旈�夋嫨鐨刬d, 濡傦細peopleType鏄鑹诧紝杩欓噷灏卞搴旇鑹瞚d锛屽涓敤鑻辨枃閫楀彿闅斿紑") private String targetId; + + @ApiModelProperty("椤圭洰id锛岀敤浜庝繚瀛樻棩蹇�") + private Integer projectId; + + @ApiModelProperty("娴佺▼瀹炰緥id锛岀敤浜庝繚瀛樻棩蹇�") + private String processInsId; } diff --git a/business/src/main/java/com/ycl/domain/json/TaskDelegateData.java b/business/src/main/java/com/ycl/domain/json/TaskDelegateData.java new file mode 100644 index 0000000..e7cd897 --- /dev/null +++ b/business/src/main/java/com/ycl/domain/json/TaskDelegateData.java @@ -0,0 +1,36 @@ +package com.ycl.domain.json; + +import com.ycl.common.enums.business.HandlerTypeEnum; +import lombok.Data; + +import java.util.List; + +/** + * 浠诲姟杞姙鐨刯son鏃ュ織鏁版嵁 + * + * @author锛歺p + * @date锛�2025/1/2 14:39 + */ +@Data +public class TaskDelegateData { + + /** + * 杞姙鍓嶇殑澶勭悊浜篿d + */ + private List<String> beforeHandlerIds; + + /** + * 杞姙鍓嶇殑澶勭悊浜虹被鍨� + */ + private HandlerTypeEnum beforeHandlerType; + + /** + * 杞姙鍚庣殑澶勭悊浜篿d + */ + private List<String> afterHandlerIds; + + /** + * 杞姙鍚庣殑澶勭悊浜虹被鍨� + */ + private HandlerTypeEnum afterHandlerType; +} diff --git a/business/src/main/java/com/ycl/domain/query/FlowLogQuery.java b/business/src/main/java/com/ycl/domain/query/FlowLogQuery.java new file mode 100644 index 0000000..124437b --- /dev/null +++ b/business/src/main/java/com/ycl/domain/query/FlowLogQuery.java @@ -0,0 +1,22 @@ +package com.ycl.domain.query; + +import com.ycl.system.domain.base.AbsQuery; +import java.util.List; +import org.springframework.lang.NonNull; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 娴佺▼鏃ュ織鏌ヨ + * + * @author xp + * @since 2025-01-02 + */ +@Data +@ApiModel(value = "FlowLog鏌ヨ鍙傛暟", description = "娴佺▼鏃ュ織鏌ヨ鍙傛暟") +public class FlowLogQuery extends AbsQuery { +} + diff --git a/business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java b/business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java index ec3b9e0..e14bbd0 100644 --- a/business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java +++ b/business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java @@ -5,6 +5,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** * 浠诲姟鍥炴樉鍐呭 @@ -78,22 +79,22 @@ /** * 澶勭悊浜� */ - private String handlerName; + private List<String> handlerName; /** - * 鍙戣捣浜篿d + * 澶勭悊浜篿d */ - private Long handlerId; + private List<Long> handlerId; /** * 澶勭悊浜哄崟浣峣d */ - private Long handlerUnitId; + private List<Long> handlerUnitId; /** * 澶勭悊浜哄崟浣嶅悕绉� */ - private String handlerUnitName; + private List<String> handlerUnitName; /** * 鍔炵悊鏈熼檺 diff --git a/business/src/main/java/com/ycl/domain/vo/FlowLogVO.java b/business/src/main/java/com/ycl/domain/vo/FlowLogVO.java new file mode 100644 index 0000000..4983434 --- /dev/null +++ b/business/src/main/java/com/ycl/domain/vo/FlowLogVO.java @@ -0,0 +1,55 @@ +package com.ycl.domain.vo; + +import com.ycl.system.domain.base.AbsVo; +import com.ycl.domain.entity.FlowLog; +import java.util.List; +import org.springframework.lang.NonNull; +import org.springframework.beans.BeanUtils; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.util.Date; + +/** + * 娴佺▼鏃ュ織灞曠ず + * + * @author xp + * @since 2025-01-02 + */ +@Data +@ApiModel(value = "娴佺▼鏃ュ織鍝嶅簲鏁版嵁", description = "娴佺▼鏃ュ織鍝嶅簲鏁版嵁") +public class FlowLogVO extends AbsVo { + + /** 浠诲姟id */ + @ApiModelProperty("浠诲姟id") + private String taskId; + + /** 浜嬩欢鏃ュ織绫诲瀷 */ + @ApiModelProperty("浜嬩欢鏃ュ織绫诲瀷") + private String eventType; + + /** 椤圭洰id */ + @ApiModelProperty("椤圭洰id") + private Integer projectId; + + /** 娴佺▼瀹炰緥id */ + @ApiModelProperty("娴佺▼瀹炰緥id") + private String flowInsId; + + /** 浜х敓鏃ュ織鐨勪汉/鎴栧叾瀹� */ + @ApiModelProperty("浜х敓鏃ュ織鐨勪汉/鎴栧叾瀹�") + private Integer userId; + + /** 浜嬩欢鏁版嵁锛屾牴鎹笉鍚岀殑浜嬩欢鍙瓨鍌ㄥ搴旂殑鎵╁睍鏁版嵁銆傚杞姙浜嬩欢鍙瓨鍌ㄨ浆鍔炲墠鍚庣殑澶勭悊浜轰俊鎭� */ + @ApiModelProperty("浜嬩欢鏁版嵁锛屾牴鎹笉鍚岀殑浜嬩欢鍙瓨鍌ㄥ搴旂殑鎵╁睍鏁版嵁銆傚杞姙浜嬩欢鍙瓨鍌ㄨ浆鍔炲墠鍚庣殑澶勭悊浜轰俊鎭�") + private String eventDataJson; + + public static FlowLogVO getVoByEntity(@NonNull FlowLog entity, FlowLogVO vo) { + if(vo == null) { + vo = new FlowLogVO(); + } + BeanUtils.copyProperties(entity, vo); + return vo; + } + +} diff --git a/business/src/main/java/com/ycl/mapper/FlowLogMapper.java b/business/src/main/java/com/ycl/mapper/FlowLogMapper.java new file mode 100644 index 0000000..0ece857 --- /dev/null +++ b/business/src/main/java/com/ycl/mapper/FlowLogMapper.java @@ -0,0 +1,33 @@ +package com.ycl.mapper; + +import com.ycl.domain.entity.FlowLog; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ycl.domain.vo.FlowLogVO; +import com.ycl.domain.query.FlowLogQuery; +import java.util.List; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 娴佺▼鏃ュ織 Mapper 鎺ュ彛 + * + * @author xp + * @since 2025-01-02 + */ +@Mapper +public interface FlowLogMapper extends BaseMapper<FlowLog> { + + /** + * id鏌ユ壘娴佺▼鏃ュ織 + * @param id + * @return + */ + FlowLogVO getById(Integer id); + + /** + * 鍒嗛〉 + */ + IPage getPage(IPage page, @Param("query") FlowLogQuery query); + +} diff --git a/business/src/main/java/com/ycl/service/FlowLogService.java b/business/src/main/java/com/ycl/service/FlowLogService.java new file mode 100644 index 0000000..3b9ec6f --- /dev/null +++ b/business/src/main/java/com/ycl/service/FlowLogService.java @@ -0,0 +1,61 @@ +package com.ycl.service; + +import com.ycl.common.enums.business.FlowLogEventTypeEnum; +import com.ycl.domain.entity.FlowLog; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ycl.common.base.Result; +import com.ycl.domain.query.FlowLogQuery; +import java.util.List; + +/** + * 娴佺▼鏃ュ織 鏈嶅姟绫� + * + * @author xp + * @since 2025-01-02 + */ +public interface FlowLogService extends IService<FlowLog> { + + /** + * 娣诲姞 + * @param taskId 浠诲姟id + * @param flowInsId 娴佺▼瀹炰緥id + * @param eventType 浜嬩欢绫诲瀷 + * @param projectId 椤圭洰id + * @param eventDataJson json鎵╁睍鍐呭 + */ + void add(String taskId, String flowInsId, FlowLogEventTypeEnum eventType, Integer projectId, String eventDataJson); + + /** + * 鎵归噺鍒犻櫎 + * @param ids + * @return + */ + Result remove(List<String> ids); + + /** + * id鍒犻櫎 + * @param id + * @return + */ + Result removeById(String id); + + /** + * 鍒嗛〉鏌ヨ + * @param query + * @return + */ + Result page(FlowLogQuery query); + + /** + * 鏍规嵁id鏌ユ壘 + * @param id + * @return + */ + Result detail(Integer id); + + /** + * 鍒楄〃 + * @return + */ + Result all(); +} diff --git a/business/src/main/java/com/ycl/service/impl/FlowLogServiceImpl.java b/business/src/main/java/com/ycl/service/impl/FlowLogServiceImpl.java new file mode 100644 index 0000000..b70c29b --- /dev/null +++ b/business/src/main/java/com/ycl/service/impl/FlowLogServiceImpl.java @@ -0,0 +1,110 @@ +package com.ycl.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.ycl.common.enums.business.FlowLogEventTypeEnum; +import com.ycl.domain.entity.FlowLog; +import com.ycl.mapper.FlowLogMapper; +import com.ycl.service.FlowLogService; +import com.ycl.common.base.Result; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ycl.domain.vo.FlowLogVO; +import com.ycl.domain.query.FlowLogQuery; +import org.springframework.stereotype.Service; +import lombok.RequiredArgsConstructor; +import com.ycl.framework.utils.PageUtil; +import org.springframework.util.Assert; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 娴佺▼鏃ュ織 鏈嶅姟瀹炵幇绫� + * + * @author xp + * @since 2025-01-02 + */ +@Service +@RequiredArgsConstructor +public class FlowLogServiceImpl extends ServiceImpl<FlowLogMapper, FlowLog> implements FlowLogService { + + private final FlowLogMapper flowLogMapper; + + /** + * 娣诲姞鏃ュ織 + * + * @param taskId 浠诲姟id + * @param flowInsId 娴佺▼瀹炰緥id + * @param eventType 浜嬩欢绫诲瀷 + * @param projectId 椤圭洰id + * @param eventDataJson json鎵╁睍鍐呭 + */ + @Override + public void add(String taskId, String flowInsId, FlowLogEventTypeEnum eventType, Integer projectId, String eventDataJson) { + FlowLog log = new FlowLog(); + log.setTaskId(taskId); + log.setFlowInsId(flowInsId); + log.setProjectId(projectId); + log.setEventType(eventType); + log.setEventDataJson(eventDataJson); + baseMapper.insert(log); + } + + /** + * 鎵归噺鍒犻櫎 + * @param ids + * @return + */ + @Override + public Result remove(List<String> ids) { + baseMapper.deleteBatchIds(ids); + return Result.ok("鍒犻櫎鎴愬姛"); + } + + /** + * id鍒犻櫎 + * @param id + * @return + */ + @Override + public Result removeById(String id) { + baseMapper.deleteById(id); + return Result.ok("鍒犻櫎鎴愬姛"); + } + + /** + * 鍒嗛〉鏌ヨ + * @param query + * @return + */ + @Override + public Result page(FlowLogQuery query) { + IPage<FlowLogVO> page = PageUtil.getPage(query, FlowLogVO.class); + baseMapper.getPage(page, query); + return Result.ok().data(page.getRecords()).total(page.getTotal()); + } + + /** + * 鏍规嵁id鏌ユ壘 + * @param id + * @return + */ + @Override + public Result detail(Integer id) { + FlowLogVO vo = baseMapper.getById(id); + Assert.notNull(vo, "璁板綍涓嶅瓨鍦�"); + return Result.ok().data(vo); + } + + /** + * 鍒楄〃 + * @return + */ + @Override + public Result all() { + List<FlowLog> entities = baseMapper.selectList(null); + List<FlowLogVO> vos = entities.stream() + .map(entity -> FlowLogVO.getVoByEntity(entity, null)) + .collect(Collectors.toList()); + return Result.ok().data(vos); + } +} diff --git a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java index 61d4bc3..77e0ac6 100644 --- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java +++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java @@ -12,19 +12,23 @@ import com.ycl.common.core.domain.entity.SysRole; import com.ycl.common.core.domain.entity.SysUser; import com.ycl.common.enums.FlowComment; +import com.ycl.common.enums.business.FlowLogEventTypeEnum; import com.ycl.common.enums.business.HandlerTypeEnum; import com.ycl.common.enums.business.TaskStatusEnum; import com.ycl.common.utils.SecurityUtils; import com.ycl.constant.TaskTypeConstant; import com.ycl.domain.dto.FlowTaskDto; +import com.ycl.domain.entity.FlowLog; import com.ycl.domain.entity.ProjectInfo; import com.ycl.domain.entity.ProjectProcess; import com.ycl.domain.form.RejectTaskForm; import com.ycl.domain.form.TaskDelegationForm; +import com.ycl.domain.json.TaskDelegateData; import com.ycl.domain.vo.CustomerTaskVO; import com.ycl.domain.vo.ProjectProcessDetailVO; import com.ycl.mapper.ProjectInfoMapper; import com.ycl.mapper.ProjectProcessMapper; +import com.ycl.service.FlowLogService; import com.ycl.service.ProjectProcessService; import com.ycl.common.base.Result; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -83,6 +87,7 @@ private final ISysRoleService sysRoleService; private final ISysDeptService sysDeptService; private final TaskCommonService taskCommonService; + private final FlowLogService flowLogService; /** * 鍒嗛〉鏌ヨ @@ -99,6 +104,7 @@ ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(vo.getProcessDefId()).singleResult(); if (Objects.nonNull(processDefinition)) { vo.setSuspended(processDefinition.isSuspended()); + vo.setFlowableProcessName(processDefinition.getName()); } } } @@ -286,6 +292,12 @@ // 娴佺▼鍙戣捣浜轰俊鎭� this.setPromoterInfo(taskVO); + // 涓�涓换鍔″彲鑳芥湁澶氫釜鍊欓�変汉/缁勶紝鎵�浠ラ渶瑕佷娇鐢╨ist + List<Long> handlerIds = new ArrayList<>(2); + List<String> handlerNames = new ArrayList<>(2); + List<Long> handlerUnitIds = new ArrayList<>(2); + List<String> handlerUnitNames = new ArrayList<>(2); + // 娴佺▼澶勭悊浜轰俊鎭� List<? extends IdentityLinkInfo> identityLinks = task.getIdentityLinks(); for (IdentityLinkInfo identityLink : identityLinks) { @@ -294,12 +306,12 @@ taskVO.setHandlerType(HandlerTypeEnum.USER); SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); if (Objects.nonNull(sysUser)) { - taskVO.setHandlerId(sysUser.getUserId()); + handlerIds.add(sysUser.getUserId()); + handlerNames.add(sysUser.getNickName()); if (Objects.nonNull(sysUser.getDept())) { - taskVO.setHandlerUnitId(sysUser.getDept().getDeptId()); - taskVO.setHandlerUnitName(sysUser.getDept().getDeptName()); + handlerUnitIds.add(sysUser.getDept().getDeptId()); + handlerUnitNames.add(sysUser.getDept().getDeptName()); } - taskVO.setHandlerName(sysUser.getNickName()); } // 缁戝畾鐨勬槸瑙掕壊鎴栬�呴儴闂� } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { @@ -310,20 +322,16 @@ // 閮ㄩ棬 SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); if (Objects.nonNull(dept)) { - taskVO.setHandlerUnitId(dept.getDeptId()); - taskVO.setHandlerUnitName(dept.getDeptName()); - taskVO.setHandlerName("鏆傛湭澶勭悊"); - taskVO.setHandlerId(null); + handlerUnitIds.add(dept.getDeptId()); + handlerUnitNames.add(dept.getDeptName()); } } } else { taskVO.setHandlerType(HandlerTypeEnum.ROLE); SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); if (Objects.nonNull(role)) { - taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); - taskVO.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�"); - taskVO.setHandlerName("鏆傛湭澶勭悊"); - taskVO.setHandlerId(null); + handlerUnitIds.add(role.getRoleId()); + handlerUnitNames.add(role.getRoleName()); } } } @@ -368,29 +376,74 @@ if (Objects.isNull(task)) { throw new RuntimeException("鏈湪杩愯浠诲姟涓壘鍒拌浠诲姟锛屾棤娉曟墽琛岃浆鍔炴搷浣�"); } + // 杞姙涔嬪墠鐨勫鐞嗕汉 + List<String> beforeHandlerIds = new ArrayList<>(2); + // 杞姙涔嬪墠鐨勫鐞嗕汉绫诲瀷 + HandlerTypeEnum beforeHandlerType = null; // 闇�瑕佸厛绉婚櫎涔嬪墠鐨勫鐞嗕汉 for (IdentityLinkInfo identityLink : task.getIdentityLinks()) { if (StringUtils.isNotBlank(identityLink.getUserId())) { + beforeHandlerIds.add(identityLink.getUserId()); + beforeHandlerType = HandlerTypeEnum.USER; taskService.deleteCandidateUser(task.getId(), identityLink.getUserId()); } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { + beforeHandlerIds.add(identityLink.getGroupId()); + if (identityLink.getGroupId().contains("dept")) { + beforeHandlerType = HandlerTypeEnum.DEPT; + } else { + beforeHandlerType = HandlerTypeEnum.ROLE; + } + // 浠庡�欓�夌粍涓垹闄よ繖涓粍锛屼究涓嶈兘鐢抽鎵ц浠诲姟浜� taskService.deleteCandidateGroup(task.getId(), identityLink.getGroupId()); } } + TaskDelegateData jsonData = new TaskDelegateData(); + jsonData.setBeforeHandlerIds(beforeHandlerIds); + jsonData.setBeforeHandlerType(beforeHandlerType); + + List<String> afterHandlerIds = new ArrayList<>(2); // 鍐嶆柊澧炲鐞嗕汉 switch (form.getPeopleType()) { case FIX_USER: // 鎸囧畾鐢ㄦ埛鐨勮瘽锛屽彧鑳介�変竴涓敤鎴� - taskService.delegateTask(task.getId(), form.getTargetId()); + taskService.setAssignee(task.getId(), form.getTargetId()); + afterHandlerIds.add(form.getTargetId()); break; case USER: - // 鐢ㄦ埛缁勭殑璇濓紝鍙互閫夊涓敤鎴凤紝涓ユ牸鏉ヨ杩欓噷鐨勭敤鎴风粍骞朵笉鏄痜lowable涓殑缁勭殑姒傚康锛屽彧鏄紑婧愭鏋舵湁杩欎釜瀹氫箟 + // 鐢ㄦ埛缁勭殑璇濓紝鍙互閫夊涓敤鎴� + String[] userList = form.getTargetId().split(","); + for (String userId : userList) { + taskService.addCandidateUser(task.getId(), userId); + } + afterHandlerIds.addAll(List.of(userList)); break; case DEPT: - taskService.addCandidateGroup(task.getId(), form.getTargetId()); + String[] deptList = form.getTargetId().split(","); + for (String deptId : deptList) { + // 娣诲姞鍊欓�夌粍锛屼究鍙互鐢抽鎵ц浠诲姟浜� + taskService.addCandidateGroup(task.getId(), deptId); + } + List<String> deptIds = Arrays.stream(deptList).map(id -> { + // 鍥犱负閮ㄩ棬鐨刬d鏄姞浜� dept:鍓嶇紑鐨勶紝鐢ㄤ簬鍖哄垎閮ㄩ棬鍜岃鑹茶繖涓や釜缁勭殑姒傚康 + String[] split = id.split(":"); + return split[1]; + }).collect(Collectors.toList()); + afterHandlerIds.addAll(deptIds); + break; + case ROLE: + String[] roleList = form.getTargetId().split(","); + for (String roleId : roleList) { + taskService.addCandidateGroup(task.getId(), roleId); + } + afterHandlerIds.addAll(List.of(roleList)); break; default: break; } + jsonData.setAfterHandlerIds(afterHandlerIds); + jsonData.setAfterHandlerType(form.getPeopleType()); + // 娣诲姞鏃ュ織 + flowLogService.add(task.getId(), form.getProcessInsId(), FlowLogEventTypeEnum.DELEGATE, form.getProjectId(), JSON.toJSONString(jsonData)); return Result.ok("杞姙鎴愬姛"); } @@ -438,6 +491,12 @@ // 娴佺▼鍙戣捣浜轰俊鎭� this.setPromoterInfo(taskVO); + // 涓�涓换鍔″彲鑳芥湁澶氫釜鍊欓�変汉/缁勶紝鎵�浠ラ渶瑕佷娇鐢╨ist + List<Long> handlerIds = new ArrayList<>(2); + List<String> handlerNames = new ArrayList<>(2); + List<Long> handlerUnitIds = new ArrayList<>(2); + List<String> handlerUnitNames = new ArrayList<>(2); + // 娴佺▼澶勭悊浜轰俊鎭� List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId()); for (IdentityLink identityLink : identityLinksForTask) { @@ -446,12 +505,12 @@ taskVO.setHandlerType(HandlerTypeEnum.USER); SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); if (Objects.nonNull(sysUser)) { - taskVO.setHandlerId(sysUser.getUserId()); + handlerIds.add(sysUser.getUserId()); + handlerNames.add(sysUser.getNickName()); if (Objects.nonNull(sysUser.getDept())) { - taskVO.setHandlerUnitId(sysUser.getDept().getDeptId()); - taskVO.setHandlerUnitName(sysUser.getDept().getDeptName()); + handlerUnitIds.add(sysUser.getDept().getDeptId()); + handlerUnitNames.add(sysUser.getDept().getDeptName()); } - taskVO.setHandlerName(sysUser.getNickName()); } // 缁戝畾鐨勬槸瑙掕壊鎴栬�呴儴闂� } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { @@ -462,23 +521,22 @@ // 閮ㄩ棬 SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); if (Objects.nonNull(dept)) { - taskVO.setHandlerUnitId(dept.getDeptId()); - taskVO.setHandlerUnitName(dept.getDeptName()); - taskVO.setHandlerName("鏆傛湭澶勭悊"); - taskVO.setHandlerId(null); + handlerUnitIds.add(dept.getDeptId()); + handlerUnitNames.add(dept.getDeptName()); } } } else { taskVO.setHandlerType(HandlerTypeEnum.ROLE); SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); if (Objects.nonNull(role)) { - taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); - taskVO.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�"); - taskVO.setHandlerName("鏆傛湭澶勭悊"); - taskVO.setHandlerId(null); + handlerUnitIds.add(Long.parseLong(identityLink.getGroupId())); } } } + taskVO.setHandlerId(handlerIds); + taskVO.setHandlerName(handlerNames); + taskVO.setHandlerUnitId(handlerUnitIds); + taskVO.setHandlerUnitName(handlerUnitNames); } vos.add(taskVO); } @@ -527,6 +585,13 @@ vo.setTaskName(userTask.getName()); vo.setProcessName(process.getProcessDefinitionName()); Task task = taskService.createTaskQuery().processInstanceId(process.getId()).taskDefinitionKey(userTask.getId()).singleResult(); + + // 涓�涓换鍔″彲鑳芥湁澶氫釜鍊欓�変汉/缁勶紝鎵�浠ラ渶瑕佷娇鐢╨ist + List<Long> handlerIds = new ArrayList<>(2); + List<String> handlerNames = new ArrayList<>(2); + List<Long> handlerUnitIds = new ArrayList<>(2); + List<String> handlerUnitNames = new ArrayList<>(2); + if (Objects.isNull(task)) { // 濡傛灉浠诲姟鍦ㄨ繍琛屾椂娌℃壘鍒帮紝閭d箞鍙兘涓烘湭寮�濮嬫垨鑰呭凡瀹屾垚锛岄渶瑕佷粠鍘嗗彶浠诲姟涓啀鎵句竴涓� List<HistoricTaskInstance> historicTasks = historyService.createHistoricTaskInstanceQuery() @@ -544,34 +609,35 @@ vo.setHandlerType(HandlerTypeEnum.USER); SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee())); if (Objects.nonNull(sysUser)) { - vo.setHandlerId(sysUser.getUserId()); - vo.setHandlerName(sysUser.getNickName()); - vo.setHandlerUnitId(Objects.nonNull(sysUser.getDept()) ? sysUser.getDept().getDeptId() : null); - vo.setHandlerUnitName(Objects.nonNull(sysUser.getDept()) ? sysUser.getDept().getDeptName() : null); + handlerIds.add(sysUser.getUserId()); + handlerNames.add(sysUser.getNickName()); + if (Objects.nonNull(sysUser.getDept())) { + handlerUnitIds.add(sysUser.getDept().getDeptId()); + handlerUnitNames.add(sysUser.getDept().getDeptName()); + } } } else if (CollectionUtil.isNotEmpty(userTask.getCandidateGroups())) { - String groupId = userTask.getCandidateGroups().get(0); - if (groupId.startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1 - vo.setHandlerType(HandlerTypeEnum.DEPT); - String[] split = groupId.split(":"); - if (split.length > 1) { - // 閮ㄩ棬 - SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); - if (Objects.nonNull(dept)) { - vo.setHandlerUnitId(dept.getDeptId()); - vo.setHandlerUnitName(dept.getDeptName()); - vo.setHandlerName("鏈紑濮�"); - vo.setHandlerId(null); + List<String> groupIds = userTask.getCandidateGroups(); + for (String groupId : groupIds) { + if (groupId.startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1 + vo.setHandlerType(HandlerTypeEnum.DEPT); + String[] split = groupId.split(":"); + if (split.length > 1) { + // 閮ㄩ棬 + SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); + if (Objects.nonNull(dept)) { + handlerUnitIds.add(dept.getDeptId()); + handlerUnitNames.add(dept.getDeptName()); + + } } - } - } else { - vo.setHandlerType(HandlerTypeEnum.ROLE); - SysRole role = sysRoleService.selectRoleById(Long.parseLong(groupId)); - if (Objects.nonNull(role)) { - vo.setHandlerUnitId(Long.parseLong(groupId)); - vo.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�"); - vo.setHandlerName("鏈紑濮�"); - vo.setHandlerId(null); + } else { + vo.setHandlerType(HandlerTypeEnum.ROLE); + SysRole role = sysRoleService.selectRoleById(Long.parseLong(groupId)); + if (Objects.nonNull(role)) { + handlerUnitIds.add(role.getRoleId()); + handlerUnitNames.add(role.getRoleName()); + } } } } @@ -586,8 +652,8 @@ long handlerUserId = Long.parseLong(historicTasks.get(0).getAssignee()); SysUser handlerUser = sysUserService.selectUserById(handlerUserId); if (Objects.nonNull(handlerUser)) { - vo.setHandlerId(handlerUserId); - vo.setHandlerName(handlerUser.getNickName()); + handlerIds.add(handlerUserId); + handlerNames.add(handlerUser.getNickName()); } vo.setTaskDefinitionKey(historicTasks.get(0).getTaskDefinitionKey()); this.setPromoterAndHandler(vo, historicTasks.get(0).getIdentityLinks()); @@ -601,6 +667,10 @@ this.setPromoterAndHandler(vo, null); } + vo.setHandlerId(handlerIds); + vo.setHandlerName(handlerNames); + vo.setHandlerUnitId(handlerUnitIds); + vo.setHandlerUnitName(handlerUnitNames); return vo; }).collect(Collectors.toList()); result.data(vos); @@ -642,8 +712,9 @@ long handlerUserId = Long.parseLong(hisTaskList.get(0).getAssignee()); SysUser handlerUser = sysUserService.selectUserById(handlerUserId); if (Objects.nonNull(handlerUser)) { - vo.setHandlerId(handlerUserId); - vo.setHandlerName(handlerUser.getNickName()); + + vo.setHandlerId(Arrays.asList(handlerUserId)); + vo.setHandlerName(Arrays.asList(handlerUser.getNickName())); } vo.setTaskDefinitionKey(hisTaskList.get(0).getTaskDefinitionKey()); this.setPromoterAndHandler(vo, hisTaskList.get(0).getIdentityLinks()); @@ -688,6 +759,13 @@ result.data(vos); return vos; } + + // 涓�涓换鍔″彲鑳芥湁澶氫釜鍊欓�変汉/缁勶紝鎵�浠ラ渶瑕佷娇鐢╨ist + List<Long> handlerIds = new ArrayList<>(2); + List<String> handlerNames = new ArrayList<>(2); + List<Long> handlerUnitIds = new ArrayList<>(2); + List<String> handlerUnitNames = new ArrayList<>(2); + // 鍒ゆ柇浠诲姟鐘舵�� List<CustomerTaskVO> vos = userTasks.stream().map(userTask -> { CustomerTaskVO vo = new CustomerTaskVO(); @@ -712,38 +790,43 @@ vo.setHandlerType(HandlerTypeEnum.USER); SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee())); if (Objects.nonNull(sysUser)) { - vo.setHandlerId(sysUser.getUserId()); - vo.setHandlerName(sysUser.getNickName()); - vo.setHandlerUnitId(Objects.nonNull(sysUser.getDept()) ? sysUser.getDept().getDeptId() : null); - vo.setHandlerUnitName(Objects.nonNull(sysUser.getDept()) ? sysUser.getDept().getDeptName() : null); + handlerIds.add(sysUser.getUserId()); + handlerNames.add(sysUser.getNickName()); + if (Objects.nonNull(sysUser.getDept())) { + handlerUnitIds.add(sysUser.getDept().getDeptId()); + handlerUnitNames.add(sysUser.getDept().getDeptName()); + } } } else if (CollectionUtil.isNotEmpty(userTask.getCandidateGroups())) { - String groupId = userTask.getCandidateGroups().get(0); - if (groupId.startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1 - vo.setHandlerType(HandlerTypeEnum.DEPT); - String[] split = groupId.split(":"); - if (split.length > 1) { - // 閮ㄩ棬 - SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); - if (Objects.nonNull(dept)) { - vo.setHandlerUnitId(dept.getDeptId()); - vo.setHandlerUnitName(dept.getDeptName()); - vo.setHandlerName("鏈紑濮�"); - vo.setHandlerId(null); + List<String> groupIds = userTask.getCandidateGroups(); + for (String groupId : groupIds) { + if (groupId.startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1 + vo.setHandlerType(HandlerTypeEnum.DEPT); + String[] split = groupId.split(":"); + if (split.length > 1) { + // 閮ㄩ棬 + SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); + if (Objects.nonNull(dept)) { + handlerUnitIds.add(dept.getDeptId()); + handlerUnitNames.add(dept.getDeptName()); + + } } - } - } else { - vo.setHandlerType(HandlerTypeEnum.ROLE); - SysRole role = sysRoleService.selectRoleById(Long.parseLong(groupId)); - if (Objects.nonNull(role)) { - vo.setHandlerUnitId(Long.parseLong(groupId)); - vo.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�"); - vo.setHandlerName("鏈紑濮�"); - vo.setHandlerId(null); + } else { + vo.setHandlerType(HandlerTypeEnum.ROLE); + SysRole role = sysRoleService.selectRoleById(Long.parseLong(groupId)); + if (Objects.nonNull(role)) { + handlerUnitIds.add(role.getRoleId()); + handlerUnitNames.add(role.getRoleName()); + } } } } vo.setTaskStatus(TaskStatusEnum.NOT_START); + vo.setHandlerId(handlerIds); + vo.setHandlerName(handlerNames); + vo.setHandlerUnitId(handlerUnitIds); + vo.setHandlerUnitName(handlerUnitNames); return vo; } else { return null; @@ -802,6 +885,13 @@ */ private void setPromoterAndHandler(CustomerTaskVO taskVO, List<? extends IdentityLinkInfo> identityLinkInfos) { this.setPromoterInfo(taskVO); + + // 涓�涓换鍔″彲鑳芥湁澶氫釜鍊欓�変汉/缁勶紝鎵�浠ラ渶瑕佷娇鐢╨ist + List<Long> handlerIds = new ArrayList<>(2); + List<String> handlerNames = new ArrayList<>(2); + List<Long> handlerUnitIds = new ArrayList<>(2); + List<String> handlerUnitNames = new ArrayList<>(2); + // 娴佺▼澶勭悊浜轰俊鎭� if (TaskStatusEnum.TODO.equals(taskVO.getTaskStatus())) { List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(taskVO.getTaskId()); @@ -811,12 +901,12 @@ SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); if (Objects.nonNull(sysUser)) { taskVO.setHandlerType(HandlerTypeEnum.USER); - taskVO.setHandlerId(sysUser.getUserId()); + handlerIds.add(sysUser.getUserId()); + handlerNames.add(sysUser.getNickName()); if (Objects.nonNull(sysUser.getDept())) { - taskVO.setHandlerUnitId(sysUser.getDept().getDeptId()); - taskVO.setHandlerUnitName(sysUser.getDept().getDeptName()); + handlerUnitIds.add(sysUser.getDept().getDeptId()); + handlerUnitNames.add(sysUser.getDept().getDeptName()); } - taskVO.setHandlerName(sysUser.getNickName()); } // 缁戝畾鐨勬槸瑙掕壊鎴栬�呮槸閮ㄩ棬锛岄渶瑕佹牴鎹甶d鍒ゆ柇 } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { @@ -827,20 +917,16 @@ // 閮ㄩ棬 SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); if (Objects.nonNull(dept)) { - taskVO.setHandlerUnitId(dept.getDeptId()); - taskVO.setHandlerUnitName(dept.getDeptName()); - taskVO.setHandlerName("鏆傛湭澶勭悊"); - taskVO.setHandlerId(null); + handlerUnitIds.add(dept.getDeptId()); + handlerUnitNames.add(dept.getDeptName()); } } } else { taskVO.setHandlerType(HandlerTypeEnum.ROLE); SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); if (Objects.nonNull(role)) { - taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); - taskVO.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�"); - taskVO.setHandlerName("鏆傛湭澶勭悊"); - taskVO.setHandlerId(null); + handlerUnitIds.add(role.getRoleId()); + handlerUnitNames.add(role.getRoleName()); } } } @@ -854,8 +940,8 @@ if (Objects.nonNull(sysUser)) { // taskVO.setHandlerId(sysUser.getUserId()); if (Objects.nonNull(sysUser.getDept())) { - taskVO.setHandlerUnitId(sysUser.getDept().getDeptId()); - taskVO.setHandlerUnitName(sysUser.getDept().getDeptName()); + handlerUnitIds.add(sysUser.getDept().getDeptId()); + handlerUnitNames.add(sysUser.getDept().getDeptName()); } // taskVO.setHandlerName(sysUser.getNickName()); } @@ -868,24 +954,25 @@ // 閮ㄩ棬 SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); if (Objects.nonNull(dept)) { - taskVO.setHandlerUnitId(dept.getDeptId()); - taskVO.setHandlerUnitName(dept.getDeptName()); + handlerUnitIds.add(dept.getDeptId()); + handlerUnitNames.add(dept.getDeptName()); } } } else { taskVO.setHandlerType(HandlerTypeEnum.ROLE); SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); if (Objects.nonNull(role)) { - taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); - taskVO.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�"); -// taskVO.setHandlerName(role.getRoleName()); -// taskVO.setHandlerId(null); + handlerUnitIds.add(role.getRoleId()); + handlerUnitNames.add(role.getRoleName()); } } } } } - + taskVO.setHandlerId(handlerIds); + taskVO.setHandlerName(handlerNames); + taskVO.setHandlerUnitId(handlerUnitIds); + taskVO.setHandlerUnitName(handlerUnitNames); } /** diff --git a/business/src/main/resources/mapper/FlowLogMapper.xml b/business/src/main/resources/mapper/FlowLogMapper.xml new file mode 100644 index 0000000..5a5c24a --- /dev/null +++ b/business/src/main/resources/mapper/FlowLogMapper.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ycl.mapper.FlowLogMapper"> + + <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 --> + <resultMap id="BaseResultMap" type="com.ycl.domain.vo.FlowLogVO"> + <result column="task_id" property="taskId" /> + <result column="event_type" property="eventType" /> + <result column="project_id" property="projectId" /> + <result column="flow_ins_id" property="flowInsId" /> + <result column="user_id" property="userId" /> + <result column="event_data_json" property="eventDataJson" /> + </resultMap> + + + + + + + + <select id="getById" resultMap="BaseResultMap"> + SELECT + TFL.task_id, + TFL.event_type, + TFL.project_id, + TFL.flow_ins_id, + TFL.user_id, + TFL.event_data_json, + TFL.id + FROM + t_flow_log TFL + WHERE + TFL.id = #{id} AND TFL.deleted = 0 + </select> + + + <select id="getPage" resultMap="BaseResultMap"> + SELECT + TFL.task_id, + TFL.event_type, + TFL.project_id, + TFL.flow_ins_id, + TFL.user_id, + TFL.event_data_json, + TFL.id + FROM + t_flow_log TFL + WHERE + TFL.deleted = 0 + </select> + +</mapper> diff --git a/common/src/main/java/com/ycl/common/enums/business/FlowLogEventTypeEnum.java b/common/src/main/java/com/ycl/common/enums/business/FlowLogEventTypeEnum.java new file mode 100644 index 0000000..e3bfdce --- /dev/null +++ b/common/src/main/java/com/ycl/common/enums/business/FlowLogEventTypeEnum.java @@ -0,0 +1,33 @@ +package com.ycl.common.enums.business; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.Getter; + +/** + * 娴佺▼鏃ュ織浜嬩欢绫诲瀷 + * + * @author锛歺p + * @date锛�2024/11/29 11:13 + */ +@Getter +public enum FlowLogEventTypeEnum { + + DELEGATE("DELEGATE", "杞姙"), + FINISHED("FINISHED", "瀹屾垚"), + TEAM_WORK("TEAM_WORK", "鍗忓悓鍔炵悊"), + + ; + + @EnumValue + @JsonValue + private final String value; + + + private final String desc; + + FlowLogEventTypeEnum(String value, String desc) { + this.value = value; + this.desc = desc; + } +} -- Gitblit v1.8.0