Commit f26c17cff033439e6438efcc74cac17313069de6

Authored by jason
1 parent 722eaf35

修改code review

Showing 21 changed files with 768 additions and 115 deletions
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/OALeaveController.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*;
  4 +import cn.iocoder.yudao.adminserver.modules.activiti.convert.oa.OALeaveConvert;
  5 +import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OALeaveDO;
  6 +import cn.iocoder.yudao.adminserver.modules.activiti.service.oa.OALeaveService;
  7 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  8 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  9 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  10 +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
  11 +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
  12 +import io.swagger.annotations.Api;
  13 +import io.swagger.annotations.ApiImplicitParam;
  14 +import io.swagger.annotations.ApiOperation;
  15 +import org.springframework.security.access.prepost.PreAuthorize;
  16 +import org.springframework.validation.annotation.Validated;
  17 +import org.springframework.web.bind.annotation.*;
  18 +
  19 +import javax.annotation.Resource;
  20 +import javax.servlet.http.HttpServletResponse;
  21 +import javax.validation.Valid;
  22 +import java.io.IOException;
  23 +import java.util.Collection;
  24 +import java.util.List;
  25 +
  26 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  27 +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
  28 +
  29 +
  30 +@Api(tags = "请假申请")
  31 +@RestController
  32 +@RequestMapping("/oa/leave")
  33 +@Validated
  34 +public class OALeaveController {
  35 +
  36 + @Resource
  37 + private OALeaveService leaveService;
  38 +
  39 + @PostMapping("/create")
  40 + @ApiOperation("创建请假申请")
  41 + @PreAuthorize("@ss.hasPermission('oa:leave:create')")
  42 + public CommonResult<Long> createLeave(@Valid @RequestBody OALeaveCreateReqVO createReqVO) {
  43 + // TODO @芋艿:processKey 自己去理解下。不过得把 leave 变成枚举
  44 + createReqVO.setProcessKey("leave");
  45 + return success(leaveService.createLeave(createReqVO));
  46 + }
  47 +
  48 + @PostMapping("/form-key/create")
  49 + @ApiOperation("创建外置请假申请")
  50 + public CommonResult<Long> createFormKeyLeave(@Valid @RequestBody OALeaveCreateReqVO createReqVO) {
  51 + // TODO @芋艿:processKey 自己去理解下。不过得把 formkey 变成枚举
  52 + createReqVO.setProcessKey("leave-formkey");
  53 + return success(leaveService.createLeave(createReqVO));
  54 + }
  55 +
  56 + @PutMapping("/update")
  57 + @ApiOperation("更新请假申请")
  58 + @PreAuthorize("@ss.hasPermission('oa:leave:update')")
  59 + public CommonResult<Boolean> updateLeave(@Valid @RequestBody OALeaveUpdateReqVO updateReqVO) {
  60 + leaveService.updateLeave(updateReqVO);
  61 + return success(true);
  62 + }
  63 +
  64 + @DeleteMapping("/delete")
  65 + @ApiOperation("删除请假申请")
  66 + @ApiImplicitParam(name = "id", value = "编号", required = true)
  67 + @PreAuthorize("@ss.hasPermission('oa:leave:delete')")
  68 + public CommonResult<Boolean> deleteLeave(@RequestParam("id") Long id) {
  69 + leaveService.deleteLeave(id);
  70 + return success(true);
  71 + }
  72 +
  73 + @GetMapping("/get")
  74 + @ApiOperation("获得请假申请")
  75 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
  76 + @PreAuthorize("@ss.hasPermission('oa:leave:query')")
  77 + public CommonResult<OALeaveRespVO> getLeave(@RequestParam("id") Long id) {
  78 + OALeaveDO leave = leaveService.getLeave(id);
  79 + return success(OALeaveConvert.INSTANCE.convert(leave));
  80 + }
  81 +
  82 + @GetMapping("/list")
  83 + @ApiOperation("获得请假申请列表")
  84 + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
  85 + @PreAuthorize("@ss.hasPermission('oa:leave:query')")
  86 + public CommonResult<List<OALeaveRespVO>> getLeaveList(@RequestParam("ids") Collection<Long> ids) {
  87 + List<OALeaveDO> list = leaveService.getLeaveList(ids);
  88 + return success(OALeaveConvert.INSTANCE.convertList(list));
  89 + }
  90 +
  91 + @GetMapping("/page")
  92 + @ApiOperation("获得请假申请分页")
  93 + @PreAuthorize("@ss.hasPermission('oa:leave:query')")
  94 + public CommonResult<PageResult<OALeaveRespVO>> getLeavePage(@Valid OALeavePageReqVO pageVO) {
  95 + //值查询自己申请请假
  96 + // TODO @芋艿:这里的传值,到底前端搞,还是后端搞。
  97 + pageVO.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername());
  98 + PageResult<OALeaveDO> pageResult = leaveService.getLeavePage(pageVO);
  99 + return success(OALeaveConvert.INSTANCE.convertPage(pageResult));
  100 + }
  101 +
  102 + @GetMapping("/export-excel")
  103 + @ApiOperation("导出请假申请 Excel")
  104 + @PreAuthorize("@ss.hasPermission('oa:leave:export')")
  105 + @OperateLog(type = EXPORT)
  106 + public void exportLeaveExcel(@Valid OALeaveExportReqVO exportReqVO,
  107 + HttpServletResponse response) throws IOException {
  108 + List<OALeaveDO> list = leaveService.getLeaveList(exportReqVO);
  109 + // 导出 Excel
  110 + List<OALeaveExcelVO> datas = OALeaveConvert.INSTANCE.convertList02(list);
  111 + ExcelUtils.write(response, "请假申请.xls", "数据", OALeaveExcelVO.class, datas);
  112 + }
  113 +
  114 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveBaseVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo;
  2 +
  3 +import lombok.*;
  4 +import java.util.*;
  5 +import io.swagger.annotations.*;
  6 +import javax.validation.constraints.*;
  7 +import org.springframework.format.annotation.DateTimeFormat;
  8 +
  9 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  10 +
  11 +/**
  12 +* 请假申请 Base VO,提供给添加、修改、详细的子 VO 使用
  13 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  14 +*/
  15 +@Data
  16 +public class OALeaveBaseVO {
  17 +
  18 + @ApiModelProperty(value = "流程id")
  19 + private String processInstanceId;
  20 +
  21 + @ApiModelProperty(value = "状态", required = true)
  22 + private Integer status;
  23 +
  24 + @ApiModelProperty(value = "申请人id", required = true)
  25 + private String userId;
  26 +
  27 + @ApiModelProperty(value = "开始时间", required = true)
  28 + @NotNull(message = "开始时间不能为空")
  29 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  30 + private Date startTime;
  31 +
  32 + @ApiModelProperty(value = "结束时间", required = true)
  33 + @NotNull(message = "结束时间不能为空")
  34 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  35 + private Date endTime;
  36 +
  37 + @ApiModelProperty(value = "请假类型")
  38 + private String leaveType;
  39 +
  40 + @ApiModelProperty(value = "原因")
  41 + private String reason;
  42 +
  43 + @ApiModelProperty(value = "申请时间", required = true)
  44 + @NotNull(message = "申请时间不能为空")
  45 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  46 + private Date applyTime;
  47 +
  48 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo;
  2 +
  3 +import lombok.*;
  4 +import io.swagger.annotations.*;
  5 +
  6 +@ApiModel("请假申请创建 Request VO")
  7 +@Data
  8 +@EqualsAndHashCode(callSuper = true)
  9 +@ToString(callSuper = true)
  10 +public class OALeaveCreateReqVO extends OALeaveBaseVO {
  11 +
  12 + private String processKey;
  13 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveExcelVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo;
  2 +
  3 +import lombok.*;
  4 +import java.util.*;
  5 +import io.swagger.annotations.*;
  6 +
  7 +import com.alibaba.excel.annotation.ExcelProperty;
  8 +
  9 +/**
  10 + * 请假申请 Excel VO
  11 + *
  12 + * @author 芋艿
  13 + */
  14 +@Data
  15 +public class OALeaveExcelVO {
  16 +
  17 + @ExcelProperty("请假表单主键")
  18 + private Long id;
  19 +
  20 + @ExcelProperty("流程id")
  21 + private String processInstanceId;
  22 +
  23 + @ExcelProperty("状态")
  24 + private Integer status;
  25 +
  26 + @ExcelProperty("申请人id")
  27 + private String userId;
  28 +
  29 + @ExcelProperty("开始时间")
  30 + private Date startTime;
  31 +
  32 + @ExcelProperty("结束时间")
  33 + private Date endTime;
  34 +
  35 + @ExcelProperty("请假类型")
  36 + private String leaveType;
  37 +
  38 + @ExcelProperty("原因")
  39 + private String reason;
  40 +
  41 + @ExcelProperty("申请时间")
  42 + private Date applyTime;
  43 +
  44 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveExportReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo;
  2 +
  3 +import lombok.*;
  4 +import java.util.*;
  5 +import io.swagger.annotations.*;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  7 +import org.springframework.format.annotation.DateTimeFormat;
  8 +
  9 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  10 +
  11 +@ApiModel(value = "请假申请 Excel 导出 Request VO", description = "参数和 OaLeavePageReqVO 是一致的")
  12 +@Data
  13 +public class OALeaveExportReqVO {
  14 +
  15 + @ApiModelProperty(value = "流程id")
  16 + private String processInstanceId;
  17 +
  18 + @ApiModelProperty(value = "状态")
  19 + private Integer status;
  20 +
  21 + @ApiModelProperty(value = "申请人id")
  22 + private String userId;
  23 +
  24 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  25 + @ApiModelProperty(value = "开始开始时间")
  26 + private Date beginStartTime;
  27 +
  28 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  29 + @ApiModelProperty(value = "结束开始时间")
  30 + private Date endStartTime;
  31 +
  32 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  33 + @ApiModelProperty(value = "开始结束时间")
  34 + private Date beginEndTime;
  35 +
  36 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  37 + @ApiModelProperty(value = "结束结束时间")
  38 + private Date endEndTime;
  39 +
  40 + @ApiModelProperty(value = "请假类型")
  41 + private String leaveType;
  42 +
  43 + @ApiModelProperty(value = "原因")
  44 + private String reason;
  45 +
  46 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  47 + @ApiModelProperty(value = "开始申请时间")
  48 + private Date beginApplyTime;
  49 +
  50 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  51 + @ApiModelProperty(value = "结束申请时间")
  52 + private Date endApplyTime;
  53 +
  54 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeavePageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo;
  2 +
  3 +import lombok.*;
  4 +import java.util.*;
  5 +import io.swagger.annotations.*;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  7 +import org.springframework.format.annotation.DateTimeFormat;
  8 +
  9 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  10 +
  11 +@ApiModel("请假申请分页 Request VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class OALeavePageReqVO extends PageParam {
  16 +
  17 + @ApiModelProperty(value = "流程id")
  18 + private String processInstanceId;
  19 +
  20 + @ApiModelProperty(value = "状态")
  21 + private Integer status;
  22 +
  23 + @ApiModelProperty(value = "申请人id")
  24 + private String userId;
  25 +
  26 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  27 + @ApiModelProperty(value = "开始开始时间")
  28 + private Date beginStartTime;
  29 +
  30 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  31 + @ApiModelProperty(value = "结束开始时间")
  32 + private Date endStartTime;
  33 +
  34 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  35 + @ApiModelProperty(value = "开始结束时间")
  36 + private Date beginEndTime;
  37 +
  38 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  39 + @ApiModelProperty(value = "结束结束时间")
  40 + private Date endEndTime;
  41 +
  42 + @ApiModelProperty(value = "请假类型")
  43 + private String leaveType;
  44 +
  45 + @ApiModelProperty(value = "原因")
  46 + private String reason;
  47 +
  48 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  49 + @ApiModelProperty(value = "开始申请时间")
  50 + private Date beginApplyTime;
  51 +
  52 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  53 + @ApiModelProperty(value = "结束申请时间")
  54 + private Date endApplyTime;
  55 +
  56 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo;
  2 +
  3 +import lombok.*;
  4 +import io.swagger.annotations.*;
  5 +
  6 +@ApiModel("请假申请 Response VO")
  7 +@Data
  8 +@EqualsAndHashCode(callSuper = true)
  9 +@ToString(callSuper = true)
  10 +public class OALeaveRespVO extends OALeaveBaseVO {
  11 +
  12 + @ApiModelProperty(value = "请假表单主键", required = true)
  13 + private Long id;
  14 +
  15 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/controller/oa/vo/OALeaveUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import javax.validation.constraints.NotNull;
  10 +import java.util.Map;
  11 +
  12 +@ApiModel("请假申请更新 Request VO")
  13 +@Data
  14 +@EqualsAndHashCode(callSuper = true)
  15 +@ToString(callSuper = true)
  16 +public class OALeaveUpdateReqVO extends OALeaveBaseVO {
  17 +
  18 + @ApiModelProperty(value = "请假表单主键", required = true)
  19 + @NotNull(message = "请假表单主键不能为空")
  20 + private Long id;
  21 +
  22 + // TODO @json:swagger 和 validator 的注解要加哈。
  23 +
  24 + private String taskId;
  25 +
  26 + private String comment;
  27 +
  28 + private Map<String,Object> variables;
  29 +
  30 + // TODO @芋艿:variables 的作用是啥。
  31 +
  32 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/oa/OALeaveConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.activiti.convert.oa;
  2 +
  3 +import java.util.*;
  4 +
  5 +import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OALeaveDO;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +
  8 +import org.mapstruct.Mapper;
  9 +import org.mapstruct.factory.Mappers;
  10 +import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*;
  11 +
  12 +/**
  13 + * 请假申请 Convert
  14 + *
  15 + * @author 芋艿
  16 + */
  17 +@Mapper
  18 +public interface OALeaveConvert {
  19 +
  20 + OALeaveConvert INSTANCE = Mappers.getMapper(OALeaveConvert.class);
  21 +
  22 + OALeaveDO convert(OALeaveCreateReqVO bean);
  23 +
  24 + OALeaveDO convert(OALeaveUpdateReqVO bean);
  25 +
  26 + OALeaveRespVO convert(OALeaveDO bean);
  27 +
  28 + List<OALeaveRespVO> convertList(List<OALeaveDO> list);
  29 +
  30 + PageResult<OALeaveRespVO> convertPage(PageResult<OALeaveDO> page);
  31 +
  32 + List<OALeaveExcelVO> convertList02(List<OALeaveDO> list);
  33 +
  34 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/workflow/TaskConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.activiti.convert.workflow;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo.TaskStepVO;
  4 +import cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo.TodoTaskRespVO;
  5 +import org.activiti.api.task.model.Task;
  6 +import org.activiti.engine.history.HistoricActivityInstance;
  7 +import org.activiti.engine.repository.ProcessDefinition;
  8 +import org.mapstruct.Mapper;
  9 +import org.mapstruct.Mapping;
  10 +import org.mapstruct.Mappings;
  11 +import org.mapstruct.Named;
  12 +import org.mapstruct.factory.Mappers;
  13 +
  14 +@Mapper
  15 +public interface TaskConvert {
  16 + TaskConvert INSTANCE = Mappers.getMapper(TaskConvert.class);
  17 +
  18 + @Mappings(value = {
  19 + @Mapping(source = "task.id", target = "id"),
  20 + @Mapping(source = "task.businessKey", target = "businessKey"),
  21 + @Mapping(source = "task.assignee", target = "status",qualifiedByName = "convertAssigneeToStatus"),
  22 + @Mapping(source = "definition.name", target = "processName"),
  23 + @Mapping(source = "definition.key", target = "processKey")
  24 + })
  25 + TodoTaskRespVO convert(Task task, ProcessDefinition definition);
  26 +
  27 +
  28 + @Named("convertAssigneeToStatus")
  29 + default Integer convertAssigneeToStatus(String assignee) {
  30 + //TODO 不应该通过 assignee 定义状态 需要定义更多的状态
  31 + return assignee == null ? 1 : 2;
  32 + }
  33 +
  34 + @Mappings(value = {
  35 + @Mapping(source = "activityName", target = "stepName"),
  36 + @Mapping(source = "assignee", target = "assignee")
  37 + })
  38 + TaskStepVO convert(HistoricActivityInstance instance);
  39 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/convert/workflow/TodoTaskConvert.java deleted
1   -package cn.iocoder.yudao.adminserver.modules.activiti.convert.workflow;
2   -
3   -import org.mapstruct.Mapper;
4   -import org.mapstruct.factory.Mappers;
5   -
6   -@Mapper
7   -public interface TodoTaskConvert {
8   - TodoTaskConvert INSTANCE = Mappers.getMapper(TodoTaskConvert.class);
9   -}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/dataobject/oa/OALeaveDO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa;
  2 +
  3 +import lombok.*;
  4 +import java.util.*;
  5 +import com.baomidou.mybatisplus.annotation.*;
  6 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  7 +
  8 +/**
  9 + * 请假申请 DO
  10 + *
  11 + * @author 芋艿
  12 + */
  13 +@TableName("oa_leave")
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +@ToString(callSuper = true)
  17 +@Builder
  18 +@NoArgsConstructor
  19 +@AllArgsConstructor
  20 +public class OALeaveDO extends BaseDO {
  21 +
  22 + /**
  23 + * 请假表单主键
  24 + */
  25 + @TableId
  26 + private Long id;
  27 + /**
  28 + * 流程id
  29 + */
  30 + private String processInstanceId;
  31 + /**
  32 + * 状态
  33 + */
  34 + private Integer status;
  35 + /**
  36 + * 申请人id
  37 + */
  38 + private String userId;
  39 + /**
  40 + * 开始时间
  41 + */
  42 + private Date startTime;
  43 + /**
  44 + * 结束时间
  45 + */
  46 + private Date endTime;
  47 + /**
  48 + * 请假类型
  49 + */
  50 + private String leaveType;
  51 + /**
  52 + * 原因
  53 + */
  54 + private String reason;
  55 + /**
  56 + * 申请时间
  57 + */
  58 + private Date applyTime;
  59 +
  60 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/dal/mysql/oa/OaLeaveMapper.java
... ... @@ -2,10 +2,10 @@ package cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa;
2 2  
3 3 import java.util.*;
4 4  
  5 +import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OALeaveDO;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 7 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
7 8 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
8   -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO;
9 9 import org.apache.ibatis.annotations.Mapper;
10 10 import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*;
11 11  
... ... @@ -15,10 +15,10 @@ import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*;
15 15 * @author 芋艿
16 16 */
17 17 @Mapper
18   -public interface OaLeaveMapper extends BaseMapperX<OaLeaveDO> {
  18 +public interface OaLeaveMapper extends BaseMapperX<OALeaveDO> {
19 19  
20   - default PageResult<OaLeaveDO> selectPage(OaLeavePageReqVO reqVO) {
21   - return selectPage(reqVO, new QueryWrapperX<OaLeaveDO>()
  20 + default PageResult<OALeaveDO> selectPage(OALeavePageReqVO reqVO) {
  21 + return selectPage(reqVO, new QueryWrapperX<OALeaveDO>()
22 22 .eqIfPresent("process_instance_id", reqVO.getProcessInstanceId())
23 23 .eqIfPresent("status", reqVO.getStatus())
24 24 .eqIfPresent("user_id", reqVO.getUserId())
... ... @@ -30,8 +30,8 @@ public interface OaLeaveMapper extends BaseMapperX&lt;OaLeaveDO&gt; {
30 30 .orderByDesc("id") );
31 31 }
32 32  
33   - default List<OaLeaveDO> selectList(OaLeaveExportReqVO reqVO) {
34   - return selectList(new QueryWrapperX<OaLeaveDO>()
  33 + default List<OALeaveDO> selectList(OALeaveExportReqVO reqVO) {
  34 + return selectList(new QueryWrapperX<OALeaveDO>()
35 35 .eqIfPresent("process_instance_id", reqVO.getProcessInstanceId())
36 36 .eqIfPresent("status", reqVO.getStatus())
37 37 .eqIfPresent("user_id", reqVO.getUserId())
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/enums/OaErrorCodeConstants.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/enums/OAErrorCodeConstants.java
... ... @@ -8,6 +8,6 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode;
8 8 * 001 oa
9 9 * activiti 系统,使用 1-003-000-000 段
10 10 */
11   -public interface OaErrorCodeConstants {
  11 +public interface OAErrorCodeConstants {
12 12 ErrorCode LEAVE_NOT_EXISTS = new ErrorCode(1003001001, "请假申请不存在");
13 13 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/OALeaveService.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.activiti.service.oa;
  2 +
  3 +
  4 +import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeaveCreateReqVO;
  5 +import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeaveUpdateReqVO;
  6 +import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeaveExportReqVO;
  7 +import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeavePageReqVO;
  8 +import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OALeaveDO;
  9 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  10 +
  11 +import javax.validation.Valid;
  12 +import java.util.Collection;
  13 +import java.util.List;
  14 +
  15 +/**
  16 + * 请假申请 Service 接口
  17 + *
  18 + * @author 芋艿
  19 + */
  20 +public interface OALeaveService {
  21 +
  22 + /**
  23 + * 创建请假申请
  24 + *
  25 + * @param createReqVO 创建信息
  26 + * @return 编号
  27 + */
  28 + Long createLeave(@Valid OALeaveCreateReqVO createReqVO);
  29 +
  30 + /**
  31 + * 更新请假申请
  32 + *
  33 + * @param updateReqVO 更新信息
  34 + */
  35 + void updateLeave(@Valid OALeaveUpdateReqVO updateReqVO);
  36 +
  37 + /**
  38 + * 删除请假申请
  39 + *
  40 + * @param id 编号
  41 + */
  42 + void deleteLeave(Long id);
  43 +
  44 + /**
  45 + * 获得请假申请
  46 + *
  47 + * @param id 编号
  48 + * @return 请假申请
  49 + */
  50 + OALeaveDO getLeave(Long id);
  51 +
  52 + /**
  53 + * 获得请假申请列表
  54 + *
  55 + * @param ids 编号
  56 + * @return 请假申请列表
  57 + */
  58 + List<OALeaveDO> getLeaveList(Collection<Long> ids);
  59 +
  60 + /**
  61 + * 获得请假申请分页
  62 + *
  63 + * @param pageReqVO 分页查询
  64 + * @return 请假申请分页
  65 + */
  66 + PageResult<OALeaveDO> getLeavePage(OALeavePageReqVO pageReqVO);
  67 +
  68 + /**
  69 + * 获得请假申请列表, 用于 Excel 导出
  70 + *
  71 + * @param exportReqVO 查询条件
  72 + * @return 请假申请列表
  73 + */
  74 + List<OALeaveDO> getLeaveList(OALeaveExportReqVO exportReqVO);
  75 +
  76 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/ReportBackEndProcessor.java
1 1 package cn.iocoder.yudao.adminserver.modules.activiti.service.oa;
2 2  
3   -import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO;
  3 +import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OALeaveDO;
4 4 import cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa.OaLeaveMapper;
5   -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
6 5 import org.activiti.engine.delegate.DelegateExecution;
7 6 import org.activiti.engine.delegate.ExecutionListener;
8 7 import org.springframework.stereotype.Component;
... ... @@ -17,27 +16,15 @@ public class ReportBackEndProcessor implements ExecutionListener {
17 16 private OaLeaveMapper leaveMapper;
18 17  
19 18  
20   -// @Override
21   -// @Transactional(rollbackFor = Exception.class)
22   -// public void notify(DelegateTask delegateTask) {
23   -// final String businessKey = delegateTask.getExecution().getProcessInstanceBusinessKey();
24   -// UpdateWrapper<OaLeaveDO> updateWrapper = new UpdateWrapper<>();
25   -// updateWrapper.eq("id", Long.valueOf(businessKey));
26   -// OaLeaveDO updateDo = new OaLeaveDO();
27   -// updateDo.setStatus(2);
28   -// leaveMapper.update(updateDo, updateWrapper);
29   -// }
30   -
31 19 @Override
32 20 @Transactional(rollbackFor = Exception.class)
33 21 public void notify(DelegateExecution delegateExecution) {
34 22 final String businessKey = delegateExecution.getProcessInstanceBusinessKey();
35   - // TODO @json:service 不要出现 dao 的元素,例如说 UpdateWrapper。这里,我们可以调用 updateById 方法
36   - UpdateWrapper<OaLeaveDO> updateWrapper = new UpdateWrapper<>();
37   - updateWrapper.eq("id", Long.valueOf(businessKey));
38   - OaLeaveDO updateDo = new OaLeaveDO();
39   - updateDo.setStatus(2); // TODO @json:status 要枚举起来,不要出现 magic number
40   - leaveMapper.update(updateDo, updateWrapper);
  23 + OALeaveDO updateDo = new OALeaveDO();
  24 + updateDo.setId(Long.valueOf(businessKey));
  25 + // TODO @json:status 要枚举起来,不要出现 magic number
  26 + updateDo.setStatus(2);
  27 + leaveMapper.updateById(updateDo);
41 28 }
42 29  
43 30 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/oa/impl/OALeaveServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.activiti.service.oa.impl;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeaveCreateReqVO;
  4 +import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeaveUpdateReqVO;
  5 +import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeaveExportReqVO;
  6 +import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OALeavePageReqVO;
  7 +import cn.iocoder.yudao.adminserver.modules.activiti.convert.oa.OALeaveConvert;
  8 +import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OALeaveDO;
  9 +import cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa.OaLeaveMapper;
  10 +import cn.iocoder.yudao.adminserver.modules.activiti.service.oa.OALeaveService;
  11 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  12 +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
  13 +import org.activiti.api.task.model.Task;
  14 +import org.activiti.api.task.model.builders.TaskPayloadBuilder;
  15 +import org.activiti.api.task.runtime.TaskRuntime;
  16 +import org.activiti.engine.RuntimeService;
  17 +import org.activiti.engine.runtime.ProcessInstance;
  18 +import org.springframework.stereotype.Service;
  19 +import org.springframework.transaction.annotation.Transactional;
  20 +import org.springframework.validation.annotation.Validated;
  21 +
  22 +import javax.annotation.Resource;
  23 +import java.util.*;
  24 +
  25 +import static cn.iocoder.yudao.adminserver.modules.activiti.enums.OAErrorCodeConstants.LEAVE_NOT_EXISTS;
  26 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  27 +
  28 +/**
  29 + * 请假申请 Service 实现类
  30 + *
  31 + * @author 芋艿
  32 + */
  33 +@Service
  34 +@Validated
  35 +public class OALeaveServiceImpl implements OALeaveService {
  36 +
  37 + @Resource
  38 + private OaLeaveMapper leaveMapper;
  39 +
  40 + @Resource
  41 + private RuntimeService runtimeService;
  42 +
  43 + @Resource
  44 + private org.activiti.engine.TaskService activitiTaskService;
  45 +
  46 + @Resource
  47 + private TaskRuntime taskRuntime;
  48 +
  49 + @Override
  50 + @Transactional(rollbackFor = Exception.class)
  51 + public Long createLeave(OALeaveCreateReqVO createReqVO) {
  52 + // 插入 OA 请假单
  53 + OALeaveDO leave = OALeaveConvert.INSTANCE.convert(createReqVO);
  54 + leave.setStatus(1);
  55 + leave.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername());
  56 + leaveMapper.insert(leave);
  57 +
  58 + // 创建工作流
  59 + Map<String, Object> variables = new HashMap<>();
  60 + // 如何得到部门领导人,暂时写死
  61 + variables.put("deptLeader", "admin"); // TODO @芋艿:需要部门的负责人
  62 + Long id = leave.getId();
  63 + String businessKey = String.valueOf(id);
  64 + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(createReqVO.getProcessKey(), businessKey, variables);
  65 + String processInstanceId = processInstance.getProcessInstanceId();
  66 +
  67 + // 将工作流的编号,更新到 OA 请假单中
  68 + OALeaveDO updateDo = new OALeaveDO();
  69 + updateDo.setProcessInstanceId(processInstanceId);
  70 + updateDo.setId(id);
  71 + leaveMapper.updateById(updateDo);
  72 + return id;
  73 + }
  74 +
  75 + @Override
  76 + @Transactional(rollbackFor = Exception.class)
  77 + public void updateLeave(OALeaveUpdateReqVO updateReqVO) {
  78 + // 校验存在
  79 + this.validateLeaveExists(updateReqVO.getId());
  80 +
  81 + final Task task = taskRuntime.task(updateReqVO.getTaskId());
  82 + activitiTaskService.addComment(task.getId(), task.getProcessInstanceId(), updateReqVO.getComment());
  83 + Map<String, Object> variables = updateReqVO.getVariables();
  84 +
  85 + //如何得到部门领导人, 暂时写死
  86 + variables.put("deptLeader", "admin");
  87 + taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId())
  88 + .withVariables(variables)
  89 + .build());
  90 +
  91 + // TOTO @芋道源码 貌似 IDEA 会自动加上final(不需要加 final 哈。虽然是不变,但是代码比较少这么去写)
  92 + Object reApply = variables.get("reApply");
  93 + if(Objects.equals(reApply, true)){
  94 + // 更新 表单
  95 + OALeaveDO updateObj = OALeaveConvert.INSTANCE.convert(updateReqVO);
  96 + leaveMapper.updateById(updateObj);
  97 + }
  98 + }
  99 +
  100 + @Override
  101 + public void deleteLeave(Long id) {
  102 + // 校验存在
  103 + this.validateLeaveExists(id);
  104 + // 删除
  105 + leaveMapper.deleteById(id);
  106 + // TODO @jason:需要调用 runtimeService 的 delete 方法,删除???
  107 + // TOTO @芋道源码 目前页面暂时没有实现基于业务表单的删除, 该代码自动生成的。
  108 + // TODO @芋道源码 我理解提交流程后,是不允许删除的? , 只能在流程处理中作废流程
  109 + }
  110 +
  111 + private void validateLeaveExists(Long id) {
  112 + if (leaveMapper.selectById(id) == null) {
  113 + throw exception(LEAVE_NOT_EXISTS);
  114 + }
  115 + }
  116 +
  117 + @Override
  118 + public OALeaveDO getLeave(Long id) {
  119 + return leaveMapper.selectById(id);
  120 + }
  121 +
  122 + @Override
  123 + public List<OALeaveDO> getLeaveList(Collection<Long> ids) {
  124 + return leaveMapper.selectBatchIds(ids);
  125 + }
  126 +
  127 + @Override
  128 + public PageResult<OALeaveDO> getLeavePage(OALeavePageReqVO pageReqVO) {
  129 + return leaveMapper.selectPage(pageReqVO);
  130 + }
  131 +
  132 + @Override
  133 + public List<OALeaveDO> getLeaveList(OALeaveExportReqVO exportReqVO) {
  134 + return leaveMapper.selectList(exportReqVO);
  135 + }
  136 +
  137 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/workflow/TaskService.java
... ... @@ -12,7 +12,6 @@ public interface TaskService {
12 12  
13 13 void claimTask(String taskId);
14 14  
15   - void getTaskHistory(String taskId);
16 15  
17 16 void completeTask(TaskReqVO taskReq);
18 17  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/activiti/service/workflow/impl/TaskServiceImpl.java
1 1 package cn.iocoder.yudao.adminserver.modules.activiti.service.workflow.impl;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo.*;
4   -import cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa.OaLeaveMapper;
  5 +import cn.iocoder.yudao.adminserver.modules.activiti.convert.workflow.TaskConvert;
5 6 import cn.iocoder.yudao.adminserver.modules.activiti.service.workflow.TaskService;
6 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 8 import cn.iocoder.yudao.framework.security.core.LoginUser;
8 9 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
9   -import com.google.common.collect.ImmutableMap;
10 10 import org.activiti.api.runtime.shared.query.Page;
11 11 import org.activiti.api.runtime.shared.query.Pageable;
12 12 import org.activiti.api.task.model.Task;
... ... @@ -16,7 +16,6 @@ import org.activiti.api.task.runtime.TaskRuntime;
16 16 import org.activiti.engine.HistoryService;
17 17 import org.activiti.engine.RepositoryService;
18 18 import org.activiti.engine.history.HistoricActivityInstance;
19   -import org.activiti.engine.history.HistoricProcessInstance;
20 19 import org.activiti.engine.repository.ProcessDefinition;
21 20 import org.activiti.engine.task.Comment;
22 21 import org.springframework.stereotype.Service;
... ... @@ -25,7 +24,6 @@ import org.springframework.transaction.annotation.Transactional;
25 24 import javax.annotation.Resource;
26 25 import java.util.ArrayList;
27 26 import java.util.List;
28   -import java.util.Map;
29 27 import java.util.Optional;
30 28 import java.util.stream.Collectors;
31 29  
... ... @@ -44,13 +42,6 @@ public class TaskServiceImpl implements TaskService {
44 42 @Resource
45 43 private RepositoryService repositoryService;
46 44  
47   - @Resource
48   - private OaLeaveMapper leaveMapper;
49   -
50   - private static Map<String,String> taskVariable = ImmutableMap.<String,String>builder()
51   - .put("deptLeaderVerify","deptLeaderApproved")
52   - .put("hrVerify","hrApproved")
53   - .build();
54 45  
55 46 public TaskServiceImpl() {
56 47  
... ... @@ -58,25 +49,16 @@ public class TaskServiceImpl implements TaskService {
58 49  
59 50 @Override
60 51 public PageResult<TodoTaskRespVO> getTodoTaskPage(TodoTaskPageReqVO pageReqVO) {
61   - final LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
62 52 // TODO @jason:封装一个方法,用于转换成 activiti 的分页对象
63 53 final Pageable pageable = Pageable.of((pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize(), pageReqVO.getPageSize());
64 54 Page<Task> pageTasks = taskRuntime.tasks(pageable);
65   - // TODO @jason:convert 里转换
66   - List<Task> tasks = pageTasks.getContent();
67 55 int totalItems = pageTasks.getTotalItems();
  56 + List<Task> tasks = pageTasks.getContent();
68 57 final List<TodoTaskRespVO> respVOList = tasks.stream().map(task -> {
69   - TodoTaskRespVO respVO = new TodoTaskRespVO();
70   - respVO.setId(task.getId());
71   - final ProcessDefinition definition = repositoryService.getProcessDefinition(task.getProcessDefinitionId());
72   - respVO.setProcessName(definition.getName());
73   - respVO.setProcessKey(definition.getKey());
74   - respVO.setBusinessKey(task.getBusinessKey());
75   - respVO.setStatus(task.getAssignee() == null ? 1 : 2);
76   - return respVO;
  58 + ProcessDefinition definition = repositoryService.getProcessDefinition(task.getProcessDefinitionId());
  59 + return TaskConvert.INSTANCE.convert(task, definition);
77 60 }).collect(Collectors.toList());
78   - // TODO @jason:要注意泛型哈。
79   - return new PageResult(respVOList, Long.valueOf(totalItems)); // TODO @jason:(long) 转换即可
  61 + return new PageResult<>(respVOList, (long)totalItems);
80 62 }
81 63  
82 64  
... ... @@ -88,35 +70,22 @@ public class TaskServiceImpl implements TaskService {
88 70 .build());
89 71 }
90 72  
91   - @Override
92   - public void getTaskHistory(String taskId) {
93   - final List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().
94   - processInstanceId("8e2801fc-1a38-11ec-98ce-74867a13730f").list();
95   - }
96 73  
97   - // TODO @jason:一个方法里,会有多个方法的调用,最好写下对应的注释。这样容易理解
  74 + /**
  75 + * 工作流,完成 userTask, 完成用户任务 一般传入参数 1。是否同意(variables). 2. 评论(comment)
  76 + * variables 变量名 和 评论 由前台传入
  77 + * @param taskReq
  78 + */
98 79 @Override
99 80 @Transactional
100 81 public void completeTask(TaskReqVO taskReq) {
101 82 final Task task = taskRuntime.task(taskReq.getTaskId());
102 83  
103   - final Map<String, Object> variables = taskReq.getVariables();
104   -
105 84 activitiTaskService.addComment(taskReq.getTaskId(), task.getProcessInstanceId(), taskReq.getComment());
106 85  
107 86 taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskReq.getTaskId())
108 87 .withVariables(taskReq.getVariables())
109 88 .build());
110   -
111   -// if(variables.containsValue(Boolean.FALSE)){
112   -// final String businessKey = task.getBusinessKey();
113   -// UpdateWrapper<OaLeaveDO> updateWrapper = new UpdateWrapper<>();
114   -// updateWrapper.eq("id", Long.valueOf(businessKey));
115   -// OaLeaveDO updateDo = new OaLeaveDO();
116   -// updateDo.setStatus(2);
117   -// leaveMapper.update(updateDo, updateWrapper);
118   -// }
119   -
120 89 }
121 90  
122 91 // @Override
... ... @@ -142,22 +111,8 @@ public class TaskServiceImpl implements TaskService {
142 111 @Override
143 112 public TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery) {
144 113 TaskHandleVO handleVO = new TaskHandleVO();
145   -
146   -// String processKey = taskQuery.getProcessKey();
147   -// if ("leave".equals(processKey)) {
148   -// String businessKey = taskQuery.getBusinessKey();
149   -// final OaLeaveDO leave = leaveMapper.selectById(Long.valueOf(businessKey));
150   -// handleVO.setFormObject( OaLeaveConvert.INSTANCE.convert(leave));
151   -// }
152   -
153   -//
154   -// final String taskDefKey = task.getTaskDefinitionKey();
155   -// final String variableName = Optional.ofNullable(taskVariable.get(taskDefKey)).orElse("");
156   -// handleVO.setTaskVariable(variableName);
157 114 final Task task = taskRuntime.task(taskQuery.getTaskId());
158   -
159 115 List<TaskStepVO> steps = getTaskSteps(task.getProcessInstanceId());
160   -
161 116 handleVO.setHistoryTask(steps);
162 117 return handleVO;
163 118 }
... ... @@ -173,21 +128,13 @@ public class TaskServiceImpl implements TaskService {
173 128 // 获得对应的步骤
174 129 List<TaskStepVO> steps = new ArrayList<>();
175 130 finished.forEach(instance -> {
176   - // TODO @jason:放到 convert 里
177   - TaskStepVO step = new TaskStepVO();
178   - step.setStepName(instance.getActivityName());
179   - step.setStartTime(instance.getStartTime());
180   - step.setEndTime(instance.getEndTime());
181   - step.setAssignee(instance.getAssignee());
182   - step.setStatus(1);
183   - // TODO @jason:一般判数组为空,使用 CollUtil.isEmpty 会好点哈。另外,null 时候,不用填写 "" 的哈
  131 + TaskStepVO stepVO = TaskConvert.INSTANCE.convert(instance);
  132 + stepVO.setStatus(1);
184 133 List<Comment> comments = activitiTaskService.getTaskComments(instance.getTaskId());
185   - if (comments.size() > 0) {
186   - step.setComment(comments.get(0).getFullMessage());
187   - } else {
188   - step.setComment("");
  134 + if (!CollUtil.isEmpty(comments)) {
  135 + stepVO.setComment(Optional.ofNullable(comments.get(0)).map(t->t.getFullMessage()).orElse(""));
189 136 }
190   - steps.add(step);
  137 + steps.add(stepVO);
191 138 });
192 139  
193 140 // 获得未完成的活动
... ... @@ -197,16 +144,11 @@ public class TaskServiceImpl implements TaskService {
197 144 .activityType("userTask")
198 145 .unfinished().list();
199 146 // 获得对应的步骤
200   - // TODO @json:其实已完成和未完成,它们的 convert 的逻辑,是一致的
201 147 for (HistoricActivityInstance instance : unfinished) {
202   - TaskStepVO step = new TaskStepVO();
203   - step.setStepName(instance.getActivityName());
204   - step.setStartTime(instance.getStartTime());
205   - step.setEndTime(instance.getEndTime());
206   - step.setAssignee(Optional.ofNullable(instance.getAssignee()).orElse(""));
207   - step.setComment("");
208   - step.setStatus(0);
209   - steps.add(step);
  148 + TaskStepVO stepVO = TaskConvert.INSTANCE.convert(instance);
  149 + stepVO.setComment("");
  150 + stepVO.setStatus(0);
  151 + steps.add(stepVO);
210 152 }
211 153 return steps;
212 154 }
... ...
yudao-admin-ui/src/views/oa/leave/index.vue
... ... @@ -139,7 +139,7 @@
139 139  
140 140 <el-dialog :title="title" :visible.sync="dialogStepsVisible" width="600px" append-to-body>
141 141 <el-steps :active="stepActive" finish-status="success" >
142   - <el-step :title="stepTitle(item)" :description="' 办理人:' + item.assignee " icon="el-icon-edit" v-for="(item) in handleTask.historyTask"></el-step>
  142 + <el-step :title="stepTitle(item)" :description="stepAssignee(item.assignee)" icon="el-icon-edit" v-for="(item) in handleTask.historyTask"></el-step>
143 143 </el-steps>
144 144 <br/>
145 145 <el-steps direction="vertical" :active="stepActive">
... ... @@ -253,6 +253,17 @@ export default {
253 253 }
254 254 return desc;
255 255 }
  256 + },
  257 + stepAssignee() {
  258 + return function (assignee) {
  259 + let desc = "";
  260 + if(assignee){
  261 + desc += "办理人:[" + assignee + "]";
  262 + }else{
  263 + desc += "办理人未签收";
  264 + }
  265 + return desc;
  266 + }
256 267 }
257 268 },
258 269 methods: {
... ...
yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/util/SecurityFrameworkUtils.java
... ... @@ -100,6 +100,7 @@ public class SecurityFrameworkUtils {
100 100 WebFrameworkUtils.setLoginUserId(request, loginUser.getId());
101 101 WebFrameworkUtils.setLoginUserType(request, loginUser.getUserType());
102 102 // TODO @jason:使用 userId 会不会更合适哈?
  103 + // TODO @芋道源码 该值被赋值给 user task 中assignee , username 显示更直白一点
103 104 org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(loginUser.getUsername());
104 105 }
105 106  
... ...