From e1aad0580acbe93c3b9544d90825843206398efc Mon Sep 17 00:00:00 2001 From: 86156 <823267011@qq.com> Date: Fri, 21 Feb 2025 20:39:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=90=AD=E5=BB=BA=E6=B5=81=E7=A8=8B=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=9F=BA=E7=A1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/oa/SysOaClaimController.java | 106 ++++++ .../oa/SysOaClaimDetailController.java | 106 ++++++ .../workflow/WfProcessController.java | 12 + .../java/com/ruoyi/oa/domain/SysOaClaim.java | 79 ++++ .../com/ruoyi/oa/domain/SysOaClaimDetail.java | 71 ++++ .../com/ruoyi/oa/domain/bo/SysOaClaimBo.java | 92 +++++ .../oa/domain/bo/SysOaClaimDetailBo.java | 85 +++++ .../oa/domain/vo/SysOaClaimDetailVo.java | 86 +++++ .../com/ruoyi/oa/domain/vo/SysOaClaimVo.java | 112 ++++++ .../oa/mapper/SysOaClaimDetailMapper.java | 15 + .../com/ruoyi/oa/mapper/SysOaClaimMapper.java | 20 + .../oa/service/ISysOaClaimDetailService.java | 49 +++ .../ruoyi/oa/service/ISysOaClaimService.java | 48 +++ .../impl/SysOaClaimDetailServiceImpl.java | 117 ++++++ .../service/impl/SysOaClaimServiceImpl.java | 130 +++++++ .../mapper/oa/SysOaClaimDetailMapper.xml | 26 ++ .../resources/mapper/oa/SysOaClaimMapper.xml | 126 ++++++ .../workflow/service/IWfProcessService.java | 9 + .../service/impl/WfProcessServiceImpl.java | 28 +- ruoyi-ui/src/api/oa/claim.js | 44 +++ ruoyi-ui/src/views/oa/claim/index.vue | 359 ++++++++++++++++++ ruoyi-ui/src/views/workflow/work/index.vue | 1 - ruoyi-ui/src/views/workflow/work/own.vue | 27 -- 23 files changed, 1717 insertions(+), 31 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/SysOaClaimController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/SysOaClaimDetailController.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaClaim.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaClaimDetail.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaClaimBo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaClaimDetailBo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaClaimDetailVo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaClaimVo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaClaimDetailMapper.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaClaimMapper.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaClaimDetailService.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaClaimService.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaClaimDetailServiceImpl.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaClaimServiceImpl.java create mode 100644 ruoyi-oa/src/main/resources/mapper/oa/SysOaClaimDetailMapper.xml create mode 100644 ruoyi-oa/src/main/resources/mapper/oa/SysOaClaimMapper.xml create mode 100644 ruoyi-ui/src/api/oa/claim.js create mode 100644 ruoyi-ui/src/views/oa/claim/index.vue diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/SysOaClaimController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/SysOaClaimController.java new file mode 100644 index 0000000..c440aab --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/SysOaClaimController.java @@ -0,0 +1,106 @@ +package com.ruoyi.web.controller.oa; + +import java.util.List; +import java.util.Arrays; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.oa.domain.vo.SysOaClaimVo; +import com.ruoyi.oa.domain.bo.SysOaClaimBo; +import com.ruoyi.oa.service.ISysOaClaimService; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 差旅费报销 + * + * @author ruoyi + * @date 2025-02-21 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/oaClaim") +public class SysOaClaimController extends BaseController { + + private final ISysOaClaimService iSysOaClaimService; + + /** + * 查询差旅费报销列表 + */ + @SaCheckPermission("system:oaClaim:list") + @GetMapping("/list") + public TableDataInfo list(SysOaClaimBo bo, PageQuery pageQuery) { + return iSysOaClaimService.queryPageList(bo, pageQuery); + } + + /** + * 导出差旅费报销列表 + */ + @SaCheckPermission("system:oaClaim:export") + @Log(title = "差旅费报销", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysOaClaimBo bo, HttpServletResponse response) { + List list = iSysOaClaimService.queryList(bo); + ExcelUtil.exportExcel(list, "差旅费报销", SysOaClaimVo.class, response); + } + + /** + * 获取差旅费报销详细信息 + * + * @param claimId 主键 + */ + @SaCheckPermission("system:oaClaim:query") + @GetMapping("/{claimId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long claimId) { + return R.ok(iSysOaClaimService.queryById(claimId)); + } + + /** + * 新增差旅费报销 + */ + @SaCheckPermission("system:oaClaim:add") + @Log(title = "差旅费报销", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysOaClaimBo bo) { + return toAjax(iSysOaClaimService.insertByBo(bo)); + } + + /** + * 修改差旅费报销 + */ + @SaCheckPermission("system:oaClaim:edit") + @Log(title = "差旅费报销", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysOaClaimBo bo) { + return toAjax(iSysOaClaimService.updateByBo(bo)); + } + + /** + * 删除差旅费报销 + * + * @param claimIds 主键串 + */ + @SaCheckPermission("system:oaClaim:remove") + @Log(title = "差旅费报销", businessType = BusinessType.DELETE) + @DeleteMapping("/{claimIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] claimIds) { + return toAjax(iSysOaClaimService.deleteWithValidByIds(Arrays.asList(claimIds), true)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/SysOaClaimDetailController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/SysOaClaimDetailController.java new file mode 100644 index 0000000..3a3c976 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/SysOaClaimDetailController.java @@ -0,0 +1,106 @@ +package com.ruoyi.web.controller.oa; + +import java.util.List; +import java.util.Arrays; + +import com.ruoyi.oa.domain.bo.SysOaClaimDetailBo; +import com.ruoyi.oa.domain.vo.SysOaClaimDetailVo; +import com.ruoyi.oa.service.ISysOaClaimDetailService; +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 报销明细 + * + * @author hdka + * @date 2025-02-21 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/oaClaimDetail") +public class SysOaClaimDetailController extends BaseController { + + private final ISysOaClaimDetailService iSysOaClaimDetailService; + + /** + * 查询报销明细列表 + */ + @SaCheckPermission("system:oaClaimDetail:list") + @GetMapping("/list") + public TableDataInfo list(SysOaClaimDetailBo bo, PageQuery pageQuery) { + return iSysOaClaimDetailService.queryPageList(bo, pageQuery); + } + + /** + * 导出报销明细列表 + */ + @SaCheckPermission("system:oaClaimDetail:export") + @Log(title = "报销明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysOaClaimDetailBo bo, HttpServletResponse response) { + List list = iSysOaClaimDetailService.queryList(bo); + ExcelUtil.exportExcel(list, "报销明细", SysOaClaimDetailVo.class, response); + } + + /** + * 获取报销明细详细信息 + * + * @param claimDetailId 主键 + */ + @SaCheckPermission("system:oaClaimDetail:query") + @GetMapping("/{claimDetailId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long claimDetailId) { + return R.ok(iSysOaClaimDetailService.queryById(claimDetailId)); + } + + /** + * 新增报销明细 + */ + @SaCheckPermission("system:oaClaimDetail:add") + @Log(title = "报销明细", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysOaClaimDetailBo bo) { + return toAjax(iSysOaClaimDetailService.insertByBo(bo)); + } + + /** + * 修改报销明细 + */ + @SaCheckPermission("system:oaClaimDetail:edit") + @Log(title = "报销明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysOaClaimDetailBo bo) { + return toAjax(iSysOaClaimDetailService.updateByBo(bo)); + } + + /** + * 删除报销明细 + * + * @param claimDetailIds 主键串 + */ + @SaCheckPermission("system:oaClaimDetail:remove") + @Log(title = "报销明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{claimDetailIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] claimDetailIds) { + return toAjax(iSysOaClaimDetailService.deleteWithValidByIds(Arrays.asList(claimDetailIds), true)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfProcessController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfProcessController.java index d860395..33247cb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfProcessController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfProcessController.java @@ -208,6 +208,18 @@ public class WfProcessController extends BaseController { } + /** + * 根据流程定义id启动流程实例 + * + * @param variables 变量集合,json对象 + */ + @SaCheckPermission("workflow:process:start") + @PostMapping("/startClaim") + public R startClaim(@RequestBody Map variables) { + String procInsId = processService.startClaim(variables); + return R.ok("流程启动成功",procInsId); + } + /** * 删除流程实例 * diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaClaim.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaClaim.java new file mode 100644 index 0000000..d03328b --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaClaim.java @@ -0,0 +1,79 @@ +package com.ruoyi.oa.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 差旅费报销对象 sys_oa_claim + * + * @author ruoyi + * @date 2025-02-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_oa_claim") +public class SysOaClaim extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 主键id + */ + @TableId(value = "claim_id") + private Long claimId; + /** + * 报销人 + */ + private Long userId; + /** + * 票据文件id列表 + */ + private String fileIds; + /** + * 报销缘由/备注 + */ + private String remark; + /** + * 开始时间 + */ + private Date startTime; + /** + * 结束时间 + */ + private Date endTime; + /** + * 出差天数 + */ + private Long tripDays; + /** + * 报销金额 + */ + private Double cost; + /** + * 票据总数 + */ + private Long detailNumber; + /** + * 关联项目 + */ + private Long projectId; + /** + * 删除标志 + */ + @TableLogic + private Long delFlag; + /** + * 关联流程id + */ + private String procInsId; + /** + * 报销时间 + */ + private Date completedTime; + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaClaimDetail.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaClaimDetail.java new file mode 100644 index 0000000..21ebaac --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaClaimDetail.java @@ -0,0 +1,71 @@ +package com.ruoyi.oa.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 报销明细对象 sys_oa_claim_detail + * + * @author hdka + * @date 2025-02-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_oa_claim_detail") +public class SysOaClaimDetail extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 主键id + */ + @TableId(value = "claim_detail_id") + private Long claimDetailId; + /** + * 外键id + */ + private Long claimId; + /** + * 报销类型 + */ + private Long claimType; + /** + * 开始时间 + */ + private Date beginTime; + /** + * 结束时间 + */ + private Date endTime; + /** + * 入住地点 + */ + private String lodgingAddress; + /** + * 删除标志 + */ + @TableLogic + private Long delFlag; + /** + * 备注 + */ + private String remark; + /** + * 文件id列表 + */ + private String fileIds; + /** + * 报销金额 + */ + private Double cost; + /** + * 报销金额大写 + */ + private String bigCost; + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaClaimBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaClaimBo.java new file mode 100644 index 0000000..8683489 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaClaimBo.java @@ -0,0 +1,92 @@ +package com.ruoyi.oa.domain.bo; + +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.oa.domain.SysOaClaimDetail; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; +import java.util.List; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 差旅费报销业务对象 sys_oa_claim + * + * @author ruoyi + * @date 2025-02-21 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SysOaClaimBo extends BaseEntity { + + /** + * 主键id + */ + private Long claimId; + + /** + * 报销人 + */ + private Long userId; + + /** + * 票据文件id列表 + */ + private String fileIds; + + /** + * 报销缘由/备注 + */ + private String remark; + + /** + * 开始时间 + */ + private Date startTime; + + /** + * 结束时间 + */ + private Date endTime; + + /** + * 出差天数 + */ + private Long tripDays; + + /** + * 报销金额 + */ + private Double cost; + + /** + * 票据总数 + */ + private Long detailNumber; + + /** + * 关联项目 + */ + private Long projectId; + + /** + * 关联流程id + */ + private String procInsId; + + /** + * 报销时间 + */ + private Date completedTime; + + /** + * 细节列表 + */ + private List claimDetailList; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaClaimDetailBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaClaimDetailBo.java new file mode 100644 index 0000000..602aea8 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaClaimDetailBo.java @@ -0,0 +1,85 @@ +package com.ruoyi.oa.domain.bo; + +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 报销明细业务对象 sys_oa_claim_detail + * + * @author hdka + * @date 2025-02-21 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SysOaClaimDetailBo extends BaseEntity { + + /** + * 主键id + */ + @NotNull(message = "主键id不能为空", groups = { EditGroup.class }) + private Long claimDetailId; + + /** + * 外键id + */ + @NotNull(message = "外键id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long claimId; + + /** + * 报销类型 + */ + @NotNull(message = "报销类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long claimType; + + /** + * 开始时间 + */ + @NotNull(message = "开始时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date beginTime; + + /** + * 结束时间 + */ + @NotNull(message = "结束时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date endTime; + + /** + * 入住地点 + */ + @NotBlank(message = "入住地点不能为空", groups = { AddGroup.class, EditGroup.class }) + private String lodgingAddress; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + /** + * 文件id列表 + */ + @NotBlank(message = "文件id列表不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fileIds; + + /** + * 报销金额 + */ + @NotNull(message = "报销金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Double cost; + + /** + * 报销金额大写 + */ + @NotBlank(message = "报销金额大写不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bigCost; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaClaimDetailVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaClaimDetailVo.java new file mode 100644 index 0000000..e504562 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaClaimDetailVo.java @@ -0,0 +1,86 @@ +package com.ruoyi.oa.domain.vo; + +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.convert.ExcelDictConvert; +import lombok.Data; + + +/** + * 报销明细视图对象 sys_oa_claim_detail + * + * @author hdka + * @date 2025-02-21 + */ +@Data +@ExcelIgnoreUnannotated +public class SysOaClaimDetailVo { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @ExcelProperty(value = "主键id") + private Long claimDetailId; + + /** + * 外键id + */ + @ExcelProperty(value = "外键id") + private Long claimId; + + /** + * 报销类型 + */ + @ExcelProperty(value = "报销类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "claim_detail_type") + private Long claimType; + + /** + * 开始时间 + */ + @ExcelProperty(value = "开始时间") + private Date beginTime; + + /** + * 结束时间 + */ + @ExcelProperty(value = "结束时间") + private Date endTime; + + /** + * 入住地点 + */ + @ExcelProperty(value = "入住地点") + private String lodgingAddress; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 文件id列表 + */ + @ExcelProperty(value = "文件id列表") + private String fileIds; + + /** + * 报销金额 + */ + @ExcelProperty(value = "报销金额") + private Double cost; + + /** + * 报销金额大写 + */ + @ExcelProperty(value = "报销金额大写") + private String bigCost; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaClaimVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaClaimVo.java new file mode 100644 index 0000000..b5c9265 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaClaimVo.java @@ -0,0 +1,112 @@ +package com.ruoyi.oa.domain.vo; + +import java.util.Date; +import java.util.List; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.ruoyi.oa.domain.SysOaClaim; +import com.ruoyi.oa.domain.SysOaFile; +import lombok.Data; + + +/** + * 差旅费报销视图对象 sys_oa_claim + * + * @author ruoyi + * @date 2025-02-21 + */ +@Data +@ExcelIgnoreUnannotated +public class SysOaClaimVo extends SysOaClaim { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @ExcelProperty(value = "主键id") + private Long claimId; + + /** + * 报销人 + */ + @ExcelProperty(value = "报销人") + private Long userId; + + /** + * 票据文件id列表 + */ + @ExcelProperty(value = "票据文件id列表") + private String fileIds; + + /** + * 报销缘由/备注 + */ + @ExcelProperty(value = "报销缘由/备注") + private String remark; + + /** + * 开始时间 + */ + @ExcelProperty(value = "开始时间") + private Date startTime; + + /** + * 结束时间 + */ + @ExcelProperty(value = "结束时间") + private Date endTime; + + /** + * 出差天数 + */ + @ExcelProperty(value = "出差天数") + private Long tripDays; + + /** + * 报销金额 + */ + @ExcelProperty(value = "报销金额") + private Double cost; + + /** + * 票据总数 + */ + @ExcelProperty(value = "票据总数") + private Long detailNumber; + + /** + * 关联项目 + */ + @ExcelProperty(value = "关联项目") + private Long projectId; + + /** + * 关联流程id + */ + @ExcelProperty(value = "关联流程id") + private String procInsId; + + /** + * 报销时间 + */ + @ExcelProperty(value = "报销时间") + private Date completedTime; + + /** + * 报销细节 + */ + private List detailList; + + /** + * 文件列表 + */ + private List fileList; + + /** + * 任务状态 + */ + private Long status; + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaClaimDetailMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaClaimDetailMapper.java new file mode 100644 index 0000000..4400396 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaClaimDetailMapper.java @@ -0,0 +1,15 @@ +package com.ruoyi.oa.mapper; + +import com.ruoyi.common.core.mapper.BaseMapperPlus; +import com.ruoyi.oa.domain.SysOaClaimDetail; +import com.ruoyi.oa.domain.vo.SysOaClaimDetailVo; + +/** + * 报销明细Mapper接口 + * + * @author hdka + * @date 2025-02-21 + */ +public interface SysOaClaimDetailMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaClaimMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaClaimMapper.java new file mode 100644 index 0000000..0d7e899 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaClaimMapper.java @@ -0,0 +1,20 @@ +package com.ruoyi.oa.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.oa.domain.SysOaClaim; +import com.ruoyi.oa.domain.vo.SysOaClaimVo; +import com.ruoyi.common.core.mapper.BaseMapperPlus; + +/** + * 差旅费报销Mapper接口 + * + * @author ruoyi + * @date 2025-02-21 + */ +public interface SysOaClaimMapper extends BaseMapperPlus { + + SysOaClaimVo selectSysOaClaimVoById(Long claimId); + + Page selectPageVo(Page build, LambdaQueryWrapper lqw); +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaClaimDetailService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaClaimDetailService.java new file mode 100644 index 0000000..a012e6b --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaClaimDetailService.java @@ -0,0 +1,49 @@ +package com.ruoyi.oa.service; + + +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.oa.domain.bo.SysOaClaimDetailBo; +import com.ruoyi.oa.domain.vo.SysOaClaimDetailVo; + +import java.util.Collection; +import java.util.List; + +/** + * 报销明细Service接口 + * + * @author hdka + * @date 2025-02-21 + */ +public interface ISysOaClaimDetailService { + + /** + * 查询报销明细 + */ + SysOaClaimDetailVo queryById(Long claimDetailId); + + /** + * 查询报销明细列表 + */ + TableDataInfo queryPageList(SysOaClaimDetailBo bo, PageQuery pageQuery); + + /** + * 查询报销明细列表 + */ + List queryList(SysOaClaimDetailBo bo); + + /** + * 新增报销明细 + */ + Boolean insertByBo(SysOaClaimDetailBo bo); + + /** + * 修改报销明细 + */ + Boolean updateByBo(SysOaClaimDetailBo bo); + + /** + * 校验并批量删除报销明细信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaClaimService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaClaimService.java new file mode 100644 index 0000000..e8bfee6 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaClaimService.java @@ -0,0 +1,48 @@ +package com.ruoyi.oa.service; + +import com.ruoyi.oa.domain.vo.SysOaClaimVo; +import com.ruoyi.oa.domain.bo.SysOaClaimBo; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 差旅费报销Service接口 + * + * @author ruoyi + * @date 2025-02-21 + */ +public interface ISysOaClaimService { + + /** + * 查询差旅费报销 + */ + SysOaClaimVo queryById(Long claimId); + + /** + * 查询差旅费报销列表 + */ + TableDataInfo queryPageList(SysOaClaimBo bo, PageQuery pageQuery); + + /** + * 查询差旅费报销列表 + */ + List queryList(SysOaClaimBo bo); + + /** + * 新增差旅费报销 + */ + Boolean insertByBo(SysOaClaimBo bo); + + /** + * 修改差旅费报销 + */ + Boolean updateByBo(SysOaClaimBo bo); + + /** + * 校验并批量删除差旅费报销信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaClaimDetailServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaClaimDetailServiceImpl.java new file mode 100644 index 0000000..6799305 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaClaimDetailServiceImpl.java @@ -0,0 +1,117 @@ +package com.ruoyi.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.oa.domain.SysOaClaimDetail; +import com.ruoyi.oa.domain.bo.SysOaClaimDetailBo; +import com.ruoyi.oa.domain.vo.SysOaClaimDetailVo; +import com.ruoyi.oa.mapper.SysOaClaimDetailMapper; +import com.ruoyi.oa.service.ISysOaClaimDetailService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 报销明细Service业务层处理 + * + * @author hdka + * @date 2025-02-21 + */ +@RequiredArgsConstructor +@Service +public class SysOaClaimDetailServiceImpl implements ISysOaClaimDetailService { + + private final SysOaClaimDetailMapper baseMapper; + + /** + * 查询报销明细 + */ + @Override + public SysOaClaimDetailVo queryById(Long claimDetailId){ + return baseMapper.selectVoById(claimDetailId); + } + + /** + * 查询报销明细列表 + */ + @Override + public TableDataInfo queryPageList(SysOaClaimDetailBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询报销明细列表 + */ + @Override + public List queryList(SysOaClaimDetailBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysOaClaimDetailBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getClaimId() != null, SysOaClaimDetail::getClaimId, bo.getClaimId()); + lqw.eq(bo.getClaimType() != null, SysOaClaimDetail::getClaimType, bo.getClaimType()); + lqw.eq(bo.getBeginTime() != null, SysOaClaimDetail::getBeginTime, bo.getBeginTime()); + lqw.eq(bo.getEndTime() != null, SysOaClaimDetail::getEndTime, bo.getEndTime()); + lqw.eq(StringUtils.isNotBlank(bo.getLodgingAddress()), SysOaClaimDetail::getLodgingAddress, bo.getLodgingAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getFileIds()), SysOaClaimDetail::getFileIds, bo.getFileIds()); + lqw.eq(bo.getCost() != null, SysOaClaimDetail::getCost, bo.getCost()); + lqw.eq(StringUtils.isNotBlank(bo.getBigCost()), SysOaClaimDetail::getBigCost, bo.getBigCost()); + return lqw; + } + + /** + * 新增报销明细 + */ + @Override + public Boolean insertByBo(SysOaClaimDetailBo bo) { + SysOaClaimDetail add = BeanUtil.toBean(bo, SysOaClaimDetail.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setClaimDetailId(add.getClaimDetailId()); + } + return flag; + } + + /** + * 修改报销明细 + */ + @Override + public Boolean updateByBo(SysOaClaimDetailBo bo) { + SysOaClaimDetail update = BeanUtil.toBean(bo, SysOaClaimDetail.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysOaClaimDetail entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除报销明细 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaClaimServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaClaimServiceImpl.java new file mode 100644 index 0000000..1a19cbe --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaClaimServiceImpl.java @@ -0,0 +1,130 @@ +package com.ruoyi.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.helper.LoginHelper; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.oa.domain.SysOaClaimDetail; +import com.ruoyi.oa.domain.bo.SysOaClaimDetailBo; +import com.ruoyi.oa.service.ISysOaClaimDetailService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.oa.domain.bo.SysOaClaimBo; +import com.ruoyi.oa.domain.vo.SysOaClaimVo; +import com.ruoyi.oa.domain.SysOaClaim; +import com.ruoyi.oa.mapper.SysOaClaimMapper; +import com.ruoyi.oa.service.ISysOaClaimService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 差旅费报销Service业务层处理 + * + * @author ruoyi + * @date 2025-02-21 + */ +@RequiredArgsConstructor +@Service +public class SysOaClaimServiceImpl implements ISysOaClaimService { + + private final SysOaClaimMapper baseMapper; + + @Autowired + private ISysOaClaimDetailService sysOaClaimDetailService; + + /** + * 查询差旅费报销 + */ + @Override + public SysOaClaimVo queryById(Long claimId){ + return baseMapper.selectSysOaClaimVoById(claimId); + } + + /** + * 查询差旅费报销列表 + */ + @Override + public TableDataInfo queryPageList(SysOaClaimBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectPageVo(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询差旅费报销列表 + */ + @Override + public List queryList(SysOaClaimBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysOaClaimBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getUserId() != null, SysOaClaim::getUserId, bo.getUserId()); + lqw.eq(StringUtils.isNotBlank(bo.getFileIds()), SysOaClaim::getFileIds, bo.getFileIds()); + lqw.eq(bo.getStartTime() != null, SysOaClaim::getStartTime, bo.getStartTime()); + lqw.eq(bo.getEndTime() != null, SysOaClaim::getEndTime, bo.getEndTime()); + lqw.eq(bo.getTripDays() != null, SysOaClaim::getTripDays, bo.getTripDays()); + lqw.eq(bo.getCost() != null, SysOaClaim::getCost, bo.getCost()); + lqw.eq(bo.getDetailNumber() != null, SysOaClaim::getDetailNumber, bo.getDetailNumber()); + lqw.eq(bo.getProjectId() != null, SysOaClaim::getProjectId, bo.getProjectId()); + lqw.eq(StringUtils.isNotBlank(bo.getProcInsId()), SysOaClaim::getProcInsId, bo.getProcInsId()); + lqw.eq(bo.getCompletedTime() != null, SysOaClaim::getCompletedTime, bo.getCompletedTime()); + return lqw; + } + + /** + * 新增差旅费报销 + */ + @Override + public Boolean insertByBo(SysOaClaimBo bo) { + bo.setUserId(LoginHelper.getUserId()); + SysOaClaim add = BeanUtil.toBean(bo, SysOaClaim.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + for (SysOaClaimDetailBo sysOaClaimDetail : bo.getClaimDetailList()) { + sysOaClaimDetailService.insertByBo(sysOaClaimDetail); + } + if (flag) { + bo.setClaimId(add.getClaimId()); + } + return flag; + } + + /** + * 修改差旅费报销 + */ + @Override + public Boolean updateByBo(SysOaClaimBo bo) { + SysOaClaim update = BeanUtil.toBean(bo, SysOaClaim.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysOaClaim entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除差旅费报销 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-oa/src/main/resources/mapper/oa/SysOaClaimDetailMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/SysOaClaimDetailMapper.xml new file mode 100644 index 0000000..3f5c0ee --- /dev/null +++ b/ruoyi-oa/src/main/resources/mapper/oa/SysOaClaimDetailMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-oa/src/main/resources/mapper/oa/SysOaClaimMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/SysOaClaimMapper.xml new file mode 100644 index 0000000..8c5cacb --- /dev/null +++ b/ruoyi-oa/src/main/resources/mapper/oa/SysOaClaimMapper.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java index 1befc0b..004354c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java @@ -82,6 +82,7 @@ public interface IWfProcessService { /** * 启动流程实例 + * * @param procDefId 流程定义ID * @param variables 扩展参数 */ @@ -113,4 +114,12 @@ public interface IWfProcessService { * @param taskId 任务ID */ WfDetailVo queryProcessDetail(String procInsId, String taskId); + + + /** + * 开始报销模型 + * @param variables + * @return + */ + String startClaim(Map variables); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java index 711f261..cdd1255 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java @@ -607,7 +607,6 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce * * @param procDefId 流程定义Id * @param variables 流程变量 - * @return */ @Override @Transactional(rollbackFor = Exception.class) @@ -615,7 +614,27 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce try { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionId(procDefId).singleResult(); - startProcess(processDefinition, variables); + startProcess(processDefinition, variables); + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException("流程启动错误"); + } + } + + /** + * 根据流程定义ID启动流程实例 + * + * @param variables 流程变量 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public String startClaim(Map variables) { + try { + + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() + .processDefinitionCategory("claim").singleResult(); + return startProcess(processDefinition, variables); } catch (Exception e) { e.printStackTrace(); throw new ServiceException("流程启动错误"); @@ -708,8 +727,10 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce /** * 启动流程实例 + * + * @return */ - private void startProcess(ProcessDefinition procDef, Map variables) { + private String startProcess(ProcessDefinition procDef, Map variables) { if (ObjectUtil.isNotNull(procDef) && procDef.isSuspended()) { throw new ServiceException("流程已被挂起,请先激活流程"); } @@ -723,6 +744,7 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDef.getId(), variables); // 第一个用户任务为发起人,则自动完成任务 wfTaskService.startFirstTask(processInstance, variables); + return processInstance.getProcessInstanceId(); } diff --git a/ruoyi-ui/src/api/oa/claim.js b/ruoyi-ui/src/api/oa/claim.js new file mode 100644 index 0000000..29f40c3 --- /dev/null +++ b/ruoyi-ui/src/api/oa/claim.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询差旅费报销列表 +export function listOaClaim(query) { + return request({ + url: '/system/oaClaim/list', + method: 'get', + params: query + }) +} + +// 查询差旅费报销详细 +export function getOaClaim(claimId) { + return request({ + url: '/system/oaClaim/' + claimId, + method: 'get' + }) +} + +// 新增差旅费报销 +export function addOaClaim(data) { + return request({ + url: '/system/oaClaim', + method: 'post', + data: data + }) +} + +// 修改差旅费报销 +export function updateOaClaim(data) { + return request({ + url: '/system/oaClaim', + method: 'put', + data: data + }) +} + +// 删除差旅费报销 +export function delOaClaim(claimId) { + return request({ + url: '/system/oaClaim/' + claimId, + method: 'delete' + }) +} diff --git a/ruoyi-ui/src/views/oa/claim/index.vue b/ruoyi-ui/src/views/oa/claim/index.vue new file mode 100644 index 0000000..407765c --- /dev/null +++ b/ruoyi-ui/src/views/oa/claim/index.vue @@ -0,0 +1,359 @@ + + + diff --git a/ruoyi-ui/src/views/workflow/work/index.vue b/ruoyi-ui/src/views/workflow/work/index.vue index 8401c50..d0e009a 100644 --- a/ruoyi-ui/src/views/workflow/work/index.vue +++ b/ruoyi-ui/src/views/workflow/work/index.vue @@ -153,7 +153,6 @@ export default { getList() { this.loading = true; listProcess(this.queryParams).then(response => { - console.log(3333,response) this.processList = response.rows; this.total = response.total; this.loading = false diff --git a/ruoyi-ui/src/views/workflow/work/own.vue b/ruoyi-ui/src/views/workflow/work/own.vue index 396065e..125783e 100644 --- a/ruoyi-ui/src/views/workflow/work/own.vue +++ b/ruoyi-ui/src/views/workflow/work/own.vue @@ -226,33 +226,6 @@ export default { return arr; }, - //对象数组排序(文本类) -/* compare(propertyName, order) { - return function (object1, object2) { - var value1 = object1[propertyName]; - var value2 = object2[propertyName]; - if (order == 0) { - if (value2 < value1) { - return -1; - } else if (value2 > value1) { - return 1; - } else { - return 0; - } - } - if (order == 1) { - if (value2 > value1) { - return -1; - } else if (value2 < value1) { - return 1; - } else { - return 0; - } - } - - } - },*/ - // 取消按钮 cancel() { this.open = false;