From ec7100db9121d0fe78a6dc16ec391ddae6642454 Mon Sep 17 00:00:00 2001 From: 123 <123@qq.com> Date: Thu, 15 May 2025 11:45:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4=20?= =?UTF-8?q?=E8=AF=B7=E5=81=87=20=E5=87=BA=E5=B7=AE=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/OABusinessTripController.java | 52 ++--- .../domain/bo/LxOaBusinessTripBo.java | 29 +-- .../workflow/domain/bo/LxOaLeaveBo.java | 5 - .../mapper/LxOaBusinessTripMapper.java | 15 ++ .../service/ILxOaBusinessTripService.java | 47 ++++ .../impl/LxOaBusinessTripServiceImpl.java | 209 ++++++++++++++++++ .../service/impl/LxOaLeaveServiceImpl.java | 4 +- 7 files changed, 314 insertions(+), 47 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/LxOaBusinessTripMapper.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ILxOaBusinessTripService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/LxOaBusinessTripServiceImpl.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/OABusinessTripController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/OABusinessTripController.java index ace6ee62d..219df70cd 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/OABusinessTripController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/OABusinessTripController.java @@ -16,9 +16,9 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; import org.dromara.workflow.common.ConditionalOnEnable; -import org.dromara.workflow.domain.bo.TestLeaveBo; -import org.dromara.workflow.domain.vo.TestLeaveVo; -import org.dromara.workflow.service.ITestLeaveService; +import org.dromara.workflow.domain.bo.LxOaBusinessTripBo; +import org.dromara.workflow.domain.vo.LxOaBusinessTripVo; +import org.dromara.workflow.service.ILxOaBusinessTripService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -37,72 +37,72 @@ import java.util.List; @RequestMapping("/workflow/businessTrip") public class OABusinessTripController extends BaseController { - private final ITestLeaveService testLeaveService; + private final ILxOaBusinessTripService lxOaBusinessTripService; /** * 查询出差列表 */ @SaCheckPermission("workflow:trip:list") @GetMapping("/list") - public TableDataInfo list(TestLeaveBo bo, PageQuery pageQuery) { - return testLeaveService.queryPageList(bo, pageQuery); + public TableDataInfo list(LxOaBusinessTripBo bo, PageQuery pageQuery) { + return lxOaBusinessTripService.queryPageList(bo, pageQuery); } /** - * 导出请假列表 + * 导出出差列表 */ @SaCheckPermission("workflow:trip:export") - @Log(title = "请假", businessType = BusinessType.EXPORT) + @Log(title = "出差", businessType = BusinessType.EXPORT) @PostMapping("/export") - public void export(TestLeaveBo bo, HttpServletResponse response) { - List list = testLeaveService.queryList(bo); - ExcelUtil.exportExcel(list, "请假", TestLeaveVo.class, response); + public void export(LxOaBusinessTripBo bo, HttpServletResponse response) { + List list = lxOaBusinessTripService.queryList(bo); + ExcelUtil.exportExcel(list, "出差", LxOaBusinessTripVo.class, response); } /** - * 获取请假详细信息 + * 获取出差详细信息 * * @param id 主键 */ @SaCheckPermission("workflow:trip:query") @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(testLeaveService.queryById(id)); + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(lxOaBusinessTripService.queryById(id)); } /** - * 新增请假 + * 新增出差 */ @SaCheckPermission("workflow:trip:add") - @Log(title = "请假", businessType = BusinessType.INSERT) + @Log(title = "出差", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TestLeaveBo bo) { - return R.ok(testLeaveService.insertByBo(bo)); + public R add(@Validated(AddGroup.class) @RequestBody LxOaBusinessTripBo bo) { + return R.ok(lxOaBusinessTripService.insertByBo(bo)); } /** - * 修改请假 + * 修改出差 */ @SaCheckPermission("workflow:trip:edit") - @Log(title = "请假", businessType = BusinessType.UPDATE) + @Log(title = "出差", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TestLeaveBo bo) { - return R.ok(testLeaveService.updateByBo(bo)); + public R edit(@Validated(EditGroup.class) @RequestBody LxOaBusinessTripBo bo) { + return R.ok(lxOaBusinessTripService.updateByBo(bo)); } /** - * 删除请假 + * 删除出差 * * @param ids 主键串 */ @SaCheckPermission("workflow:trip:remove") - @Log(title = "请假", businessType = BusinessType.DELETE) + @Log(title = "出差", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { - return toAjax(testLeaveService.deleteWithValidByIds(List.of(ids))); + return toAjax(lxOaBusinessTripService.deleteWithValidByIds(List.of(ids))); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/LxOaBusinessTripBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/LxOaBusinessTripBo.java index b329e23f9..d0ed845b6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/LxOaBusinessTripBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/LxOaBusinessTripBo.java @@ -1,6 +1,5 @@ package org.dromara.workflow.domain.bo; -import com.alibaba.excel.annotation.ExcelProperty; import com.fasterxml.jackson.annotation.JsonFormat; import io.github.linpeilie.annotations.AutoMapper; import jakarta.validation.constraints.NotBlank; @@ -12,6 +11,7 @@ import org.dromara.common.core.validate.EditGroup; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.workflow.domain.LxOaBusinessTrip; +import java.math.BigDecimal; import java.util.Date; /** @@ -32,10 +32,10 @@ public class LxOaBusinessTripBo extends BaseEntity { private Long id; /** - * 请假类型 + * 业务类别 */ - @NotBlank(message = "请假类型不能为空", groups = {AddGroup.class, EditGroup.class}) - private String leaveType; + @NotBlank(message = "业务类别不能为空", groups = {AddGroup.class, EditGroup.class}) + private String tripType; /** * 开始时间 @@ -52,48 +52,43 @@ public class LxOaBusinessTripBo extends BaseEntity { private Date endDate; /** - * 请假天数 + * 出差天数 */ - private Integer leaveDays; + private Integer tripDays; /** * 开始时间 */ - private Integer startLeaveDays; + private Integer startTripDays; /** * 结束时间 */ - private Integer endLeaveDays; + private Integer endTripDays; /** - * 请假原因 + * 出差原因 */ - @ExcelProperty(value = "出差原因") private String reason; /** * 备注 */ - @ExcelProperty(value = "备注") private String remark; /** * 在办项目 */ - @ExcelProperty(value = "在办项目") private String currentProjects; /** * 附件 */ - @ExcelProperty(value = "附件") private String attachment; /** * 预算事项 */ - @ExcelProperty(value = "预算事项") private String budgetType; /** @@ -107,4 +102,10 @@ public class LxOaBusinessTripBo extends BaseEntity { private String dept; + /** + * 差旅金额 + */ + private BigDecimal tripMoney; + + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/LxOaLeaveBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/LxOaLeaveBo.java index b513c0eb5..b83046f4c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/LxOaLeaveBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/LxOaLeaveBo.java @@ -1,6 +1,5 @@ package org.dromara.workflow.domain.bo; -import com.alibaba.excel.annotation.ExcelProperty; import com.fasterxml.jackson.annotation.JsonFormat; import io.github.linpeilie.annotations.AutoMapper; import jakarta.validation.constraints.NotBlank; @@ -69,25 +68,21 @@ public class LxOaLeaveBo extends BaseEntity { /** * 请假原因 */ - @ExcelProperty(value = "请假原因") private String reason; /** * 备注 */ - @ExcelProperty(value = "备注") private String remark; /** * 在办项目 */ - @ExcelProperty(value = "在办项目") private String currentProjects; /** * 附件 */ - @ExcelProperty(value = "附件") private String attachment; /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/LxOaBusinessTripMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/LxOaBusinessTripMapper.java new file mode 100644 index 000000000..c8e69b639 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/LxOaBusinessTripMapper.java @@ -0,0 +1,15 @@ +package org.dromara.workflow.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.LxOaBusinessTrip; +import org.dromara.workflow.domain.vo.LxOaBusinessTripVo; + +/** + * 出差Mapper接口 + * + * @author may + * @date 2023-07-21 + */ +public interface LxOaBusinessTripMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ILxOaBusinessTripService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ILxOaBusinessTripService.java new file mode 100644 index 000000000..bf60aa420 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ILxOaBusinessTripService.java @@ -0,0 +1,47 @@ +package org.dromara.workflow.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.bo.LxOaBusinessTripBo; +import org.dromara.workflow.domain.vo.LxOaBusinessTripVo; + +import java.util.List; + +/** + * 出差Service接口 + * + * @author may + * @date 2023-07-21 + */ +public interface ILxOaBusinessTripService { + + /** + * 查询出差 + */ + LxOaBusinessTripVo queryById(Long id); + + /** + * 查询出差列表 + */ + TableDataInfo queryPageList(LxOaBusinessTripBo bo, PageQuery pageQuery); + + /** + * 查询出差列表 + */ + List queryList(LxOaBusinessTripBo bo); + + /** + * 新增出差 + */ + LxOaBusinessTripVo insertByBo(LxOaBusinessTripBo bo); + + /** + * 修改出差 + */ + LxOaBusinessTripVo updateByBo(LxOaBusinessTripBo bo); + + /** + * 校验并批量删除出差信息 + */ + Boolean deleteWithValidByIds(List ids); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/LxOaBusinessTripServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/LxOaBusinessTripServiceImpl.java new file mode 100644 index 000000000..a1960ca6b --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/LxOaBusinessTripServiceImpl.java @@ -0,0 +1,209 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.event.ProcessCreateTaskEvent; +import org.dromara.common.core.domain.event.ProcessDeleteEvent; +import org.dromara.common.core.domain.event.ProcessEvent; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.service.WorkflowService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.domain.LxOaBusinessTrip; +import org.dromara.workflow.domain.bo.LxOaBusinessTripBo; +import org.dromara.workflow.domain.vo.LxOaBusinessTripVo; +import org.dromara.workflow.mapper.LxOaBusinessTripMapper; +import org.dromara.workflow.service.ILxOaBusinessTripService; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 出差Service业务层处理 + * + * @author may + * @date 2023-07-21 + */ +@ConditionalOnEnable +@RequiredArgsConstructor +@Service +@Slf4j +public class LxOaBusinessTripServiceImpl implements ILxOaBusinessTripService { + + private final LxOaBusinessTripMapper baseMapper; + private final WorkflowService workflowService; + + /** + * spel条件表达:判断小于2 + * + * @param leaveDays 待判断的变量(可不传自行返回true或false) + * @return boolean + */ + public boolean eval(Integer leaveDays) { + if (leaveDays <= 2) { + return true; + } + return false; + } + + /** + * 查询出差 + */ + @Override + public LxOaBusinessTripVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 查询出差列表 + */ + @Override + public TableDataInfo queryPageList(LxOaBusinessTripBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询出差列表 + */ + @Override + public List queryList(LxOaBusinessTripBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(LxOaBusinessTripBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getTripType()), LxOaBusinessTrip::getTripType, bo.getTripType()); + lqw.ge(bo.getStartTripDays() != null, LxOaBusinessTrip::getTripDays, bo.getStartTripDays()); + lqw.le(bo.getEndTripDays() != null, LxOaBusinessTrip::getTripDays, bo.getEndTripDays()); + lqw.orderByDesc(BaseEntity::getCreateTime); + return lqw; + } + + /** + * 新增出差 + */ + @Override + public LxOaBusinessTripVo insertByBo(LxOaBusinessTripBo bo) { + long day = DateUtil.between(bo.getStartDate(), bo.getEndDate(), DateUnit.DAY); + // 截止日期也算一天 + bo.setTripDays((int) day + 1); + LxOaBusinessTrip add = MapstructUtils.convert(bo, LxOaBusinessTrip.class); + if (StringUtils.isBlank(add.getStatus())) { + add.setStatus(BusinessStatusEnum.DRAFT.getStatus()); + } + boolean flag = baseMapper.insert(add) > 0; + // 流程变量 + Map variable = new HashMap<>(); +// variable.put("testLeave", testLeave); +// variable.put("flag", String.valueOf(testLeave.getDay())); +// flowParams.variable(variable); +// Instance instance = insService.start(id, flowParams); + if (flag) { + bo.setId(add.getId()); + } + return MapstructUtils.convert(add, LxOaBusinessTripVo.class); + } + + /** + * 修改出差 + */ + @Override + public LxOaBusinessTripVo updateByBo(LxOaBusinessTripBo bo) { + LxOaBusinessTrip update = MapstructUtils.convert(bo, LxOaBusinessTrip.class); + baseMapper.updateById(update); + return MapstructUtils.convert(update, LxOaBusinessTripVo.class); + } + + /** + * 批量删除出差 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(List ids) { + workflowService.deleteInstance(ids); + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等) + * 正常使用只需#processEvent.flowCode=='leave1' + * 示例为了方便则使用startsWith匹配了全部示例key + * + * @param processEvent 参数 + */ + @EventListener(condition = "#processEvent.flowCode=='trip1'") + public void processHandler(ProcessEvent processEvent) { + log.info("当前任务执行了{}", processEvent.toString()); + LxOaBusinessTrip lxOaBusinessTrip = baseMapper.selectById(Long.valueOf(processEvent.getBusinessId())); + lxOaBusinessTrip.setStatus(processEvent.getStatus()); + // 用于例如审批附件 审批意见等 存储到业务表内 自行根据业务实现存储流程 + Map params = processEvent.getParams(); + if (MapUtil.isNotEmpty(params)) { + // 历史任务扩展(通常为附件) + String hisTaskExt = Convert.toStr(params.get("hisTaskExt")); + // 办理人 + String handler = Convert.toStr(params.get("handler")); + // 办理意见 + String message = Convert.toStr(params.get("message")); + } + if (processEvent.isSubmit()) { + lxOaBusinessTrip.setStatus(BusinessStatusEnum.WAITING.getStatus()); + } + baseMapper.updateById(lxOaBusinessTrip); + } + + /** + * 执行任务创建监听 + * 示例:也可通过 @EventListener(condition = "#processCreateTaskEvent.flowCode=='leave1'")进行判断 + * 在方法中判断流程节点key + * if ("xxx".equals(processCreateTaskEvent.getNodeCode())) { + * //执行业务逻辑 + * } + * + * @param processCreateTaskEvent 参数 + */ + @EventListener(condition = "#processCreateTaskEvent.flowCode=='trip1'") + public void processCreateTaskHandler(ProcessCreateTaskEvent processCreateTaskEvent) { + log.info("当前任务创建了{}", processCreateTaskEvent.toString()); + LxOaBusinessTrip businessTrip = baseMapper.selectById(Long.valueOf(processCreateTaskEvent.getBusinessId())); + businessTrip.setStatus(BusinessStatusEnum.WAITING.getStatus()); + baseMapper.updateById(businessTrip); + } + + /** + * 监听删除流程事件 + * 正常使用只需#processDeleteEvent.flowCode=='leave1' + * 示例为了方便则使用startsWith匹配了全部示例key + * + * @param processDeleteEvent 参数 + */ + @EventListener(condition = "#processDeleteEvent.flowCode=='trip1'") + public void processDeleteHandler(ProcessDeleteEvent processDeleteEvent) { + log.info("监听删除流程事件,当前任务执行了{}", processDeleteEvent.toString()); + LxOaBusinessTrip businessTrip = baseMapper.selectById(Long.valueOf(processDeleteEvent.getBusinessId())); + if (ObjectUtil.isNull(businessTrip)) { + return; + } + baseMapper.deleteById(businessTrip.getId()); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/LxOaLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/LxOaLeaveServiceImpl.java index 3ecf01b16..a74983418 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/LxOaLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/LxOaLeaveServiceImpl.java @@ -182,7 +182,7 @@ public class LxOaLeaveServiceImpl implements ILxOaLeaveService { * * @param processCreateTaskEvent 参数 */ - @EventListener(condition = "#processCreateTaskEvent.flowCode.startsWith('leave')") + @EventListener(condition = "#processCreateTaskEvent.flowCode=='leave1'") public void processCreateTaskHandler(ProcessCreateTaskEvent processCreateTaskEvent) { log.info("当前任务创建了{}", processCreateTaskEvent.toString()); LxOaLeave lxOaLeave = baseMapper.selectById(Long.valueOf(processCreateTaskEvent.getBusinessId())); @@ -197,7 +197,7 @@ public class LxOaLeaveServiceImpl implements ILxOaLeaveService { * * @param processDeleteEvent 参数 */ - @EventListener(condition = "#processDeleteEvent.flowCode.startsWith('leave')") + @EventListener(condition = "#processDeleteEvent.flowCode=='leave1'") public void processDeleteHandler(ProcessDeleteEvent processDeleteEvent) { log.info("监听删除流程事件,当前任务执行了{}", processDeleteEvent.toString()); LxOaLeave lxOaLeave = baseMapper.selectById(Long.valueOf(processDeleteEvent.getBusinessId()));