Commit f26c17cff033439e6438efcc74cac17313069de6
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
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<OaLeaveDO> { |
| 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
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 | ... | ... |