Sfoglia il codice sorgente

1、报销代码生成

dongpo 7 mesi fa
parent
commit
91d3c77424
12 ha cambiato i file con 804 aggiunte e 0 eliminazioni
  1. 7 0
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
  2. 107 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/expense/OaExpenseController.java
  3. 81 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/expense/vo/OaExpensePageReqVO.java
  4. 101 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/expense/vo/OaExpenseRespVO.java
  5. 39 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/expense/vo/OaExpenseSaveReqVO.java
  6. 141 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/expense/OaExpenseDO.java
  7. 68 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/expense/OaExpenseObjDO.java
  8. 43 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/expense/OaExpenseMapper.java
  9. 25 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/expense/OaExpenseObjMapper.java
  10. 67 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/expense/OaExpenseService.java
  11. 113 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/expense/OaExpenseServiceImpl.java
  12. 12 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/oa/expense/OaExpenseMapper.xml

+ 7 - 0
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java

@@ -109,6 +109,9 @@ public interface ErrorCodeConstants {
     ErrorCode OA_RECEIVE_NOT_EXISTS = new ErrorCode(1_009_017_008, "领用流程信息不存在");
     // ========== 采购流程信息 1_009_017_009 ==========
     ErrorCode OA_PURCHASE_NOT_EXISTS = new ErrorCode(1_009_017_009, "采购流程信息不存在");
+    // ========== 报销流程信息 1_009_017_010 ==========
+    ErrorCode OA_EXPENSE_NOT_EXISTS = new ErrorCode(1_009_017_010, "报销流程信息不存在");
+
 
     // ========== 员工信息 1_009_018_000 ==========
     ErrorCode OA_EMPLOYEE_NOT_EXISTS = new ErrorCode(1_009_018_000, "员工信息不存在");
@@ -121,4 +124,8 @@ public interface ErrorCodeConstants {
     ErrorCode OA_PURCHASE_OBJ_NAME_BLANK = new ErrorCode(1_009_018_004, "采购子项采购物品名字不能为空");
     ErrorCode OA_PURCHASE_OBJ_AMOUNT_ZERO = new ErrorCode(1_009_018_005, "采购子项采购物品数量必须为大于0的自然数");
     ErrorCode OA_PURCHASE_OBJ_BUDGET_ZERO = new ErrorCode(1_009_018_006, "采购子项预算金额不能为空");
+    ErrorCode OA_EXPENSE_OBJ_ITEM_BLANK = new ErrorCode(1_009_018_007, "报销子项费用项目不能为空");
+    ErrorCode OA_EXPENSE_OBJ_MONEY_ZERO = new ErrorCode(1_009_018_008, "报销子项报销金额不能为空");
+    ErrorCode OA_EXPENSE_OBJ_START_DATE_NULL = new ErrorCode(1_009_018_009, "报销子项开始日期不能为空");
+    ErrorCode OA_EXPENSE_OBJ_END_DATE_NULL = new ErrorCode(1_009_018_010, "报销子项结束日期不能为空");
 }

+ 107 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/expense/OaExpenseController.java

@@ -0,0 +1,107 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.expense;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.expense.vo.OaExpensePageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.expense.vo.OaExpenseRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.expense.vo.OaExpenseSaveReqVO;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.expense.OaExpenseDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.expense.OaExpenseObjDO;
+import cn.iocoder.yudao.module.bpm.service.oa.expense.OaExpenseService;
+
+@Tag(name = "管理后台 - 报销流程信息")
+@RestController
+@RequestMapping("/bpm/oa-expense")
+@Validated
+public class OaExpenseController {
+
+    @Resource
+    private OaExpenseService oaExpenseService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建报销流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-expense:create')")
+    public CommonResult<Long> createOaExpense(@Valid @RequestBody OaExpenseSaveReqVO createReqVO) {
+        return success(oaExpenseService.createOaExpense(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新报销流程信息")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-expense:update')")
+    public CommonResult<Boolean> updateOaExpense(@Valid @RequestBody OaExpenseSaveReqVO updateReqVO) {
+        oaExpenseService.updateOaExpense(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除报销流程信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('bpm:oa-expense:delete')")
+    public CommonResult<Boolean> deleteOaExpense(@RequestParam("id") Long id) {
+        oaExpenseService.deleteOaExpense(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得报销流程信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-expense:query')")
+    public CommonResult<OaExpenseRespVO> getOaExpense(@RequestParam("id") Long id) {
+        OaExpenseDO oaExpense = oaExpenseService.getOaExpense(id);
+        return success(BeanUtils.toBean(oaExpense, OaExpenseRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得报销流程信息分页")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-expense:query')")
+    public CommonResult<PageResult<OaExpenseRespVO>> getOaExpensePage(@Valid OaExpensePageReqVO pageReqVO) {
+        PageResult<OaExpenseDO> pageResult = oaExpenseService.getOaExpensePage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, OaExpenseRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出报销流程信息 Excel")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-expense:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportOaExpenseExcel(@Valid OaExpensePageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<OaExpenseDO> list = oaExpenseService.getOaExpensePage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "报销流程信息.xls", "数据", OaExpenseRespVO.class,
+                        BeanUtils.toBean(list, OaExpenseRespVO.class));
+    }
+
+    // ==================== 子表(报销流程信息子) ====================
+
+    @GetMapping("/oa-expense-obj/list-by-expense-id")
+    @Operation(summary = "获得报销流程信息子列表")
+    @Parameter(name = "expenseId", description = "报销主表主键id")
+    @PreAuthorize("@ss.hasPermission('bpm:oa-expense:query')")
+    public CommonResult<List<OaExpenseObjDO>> getOaExpenseObjListByExpenseId(@RequestParam("expenseId") Long expenseId) {
+        return success(oaExpenseService.getOaExpenseObjListByExpenseId(expenseId));
+    }
+
+}

+ 81 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/expense/vo/OaExpensePageReqVO.java

@@ -0,0 +1,81 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.expense.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 报销流程信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class OaExpensePageReqVO extends PageParam {
+
+    @Schema(description = "报销申请人id")
+    private Long employeeId;
+
+    @Schema(description = "报销申请员工姓名")
+    private String employeeName;
+
+    @Schema(description = "报销申请员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id")
+    private Long userId;
+
+    @Schema(description = "部门id")
+    private Long deptId;
+
+    @Schema(description = "员工职位")
+    private String position;
+
+    @Schema(description = "报销类型主键id")
+    private Long expenseTypeId;
+
+    @Schema(description = "报销类型名称")
+    private String expenseTypeName;
+
+    @Schema(description = "费用所属区间")
+    private String expenseMonth;
+
+    @Schema(description = "总预算金额,单位(元)")
+    private BigDecimal totalMoney;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人员工id")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工姓名")
+    private String currentAuditEmployeeName;
+
+    @Schema(description = "当前审核人用户id")
+    private Long currentAuditUserId;
+
+    @Schema(description = "最后审核时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] finalAuditDate;
+
+    @Schema(description = "申请人员工id")
+    private Long applyEmployeeId;
+
+    @Schema(description = "申请人员工姓名")
+    private String applyEmployeeName;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 101 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/expense/vo/OaExpenseRespVO.java

@@ -0,0 +1,101 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.expense.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 报销流程信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class OaExpenseRespVO {
+
+    @Schema(description = "表单主键")
+    @ExcelProperty("表单主键")
+    private Long id;
+
+    @Schema(description = "报销申请人id")
+    @ExcelProperty("报销申请人id")
+    private Long employeeId;
+
+    @Schema(description = "报销申请员工姓名")
+    @ExcelProperty("报销申请员工姓名")
+    private String employeeName;
+
+    @Schema(description = "报销申请员工手机号")
+    @ExcelProperty("报销申请员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id")
+    @ExcelProperty("用户账号id")
+    private Long userId;
+
+    @Schema(description = "部门id")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "员工职位")
+    @ExcelProperty("员工职位")
+    private String position;
+
+    @Schema(description = "报销类型主键id")
+    @ExcelProperty("报销类型主键id")
+    private Long expenseTypeId;
+
+    @Schema(description = "报销类型名称")
+    @ExcelProperty("报销类型名称")
+    private String expenseTypeName;
+
+    @Schema(description = "费用所属区间")
+    @ExcelProperty("费用所属区间")
+    private String expenseMonth;
+
+    @Schema(description = "总预算金额,单位(元)")
+    @ExcelProperty("总预算金额,单位(元)")
+    private BigDecimal totalMoney;
+
+    @Schema(description = "备注")
+    @ExcelProperty("备注")
+    private String remarks;
+
+    @Schema(description = "流程实例id")
+    @ExcelProperty("流程实例id")
+    private String procInstId;
+
+    @Schema(description = "审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)")
+    @ExcelProperty("审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)")
+    private String auditStatus;
+
+    @Schema(description = "当前审核人员工id")
+    @ExcelProperty("当前审核人员工id")
+    private Long currentAuditEmployeeId;
+
+    @Schema(description = "当前审核人员工姓名")
+    @ExcelProperty("当前审核人员工姓名")
+    private String currentAuditEmployeeName;
+
+    @Schema(description = "当前审核人用户id")
+    @ExcelProperty("当前审核人用户id")
+    private Long currentAuditUserId;
+
+    @Schema(description = "最后审核时间")
+    @ExcelProperty("最后审核时间")
+    private LocalDateTime finalAuditDate;
+
+    @Schema(description = "申请人员工id")
+    @ExcelProperty("申请人员工id")
+    private Long applyEmployeeId;
+
+    @Schema(description = "申请人员工姓名")
+    @ExcelProperty("申请人员工姓名")
+    private String applyEmployeeName;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 39 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/expense/vo/OaExpenseSaveReqVO.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.expense.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+import java.math.BigDecimal;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.expense.OaExpenseObjDO;
+
+@Schema(description = "管理后台 - 报销流程信息新增/修改 Request VO")
+@Data
+public class OaExpenseSaveReqVO {
+
+    @Schema(description = "表单主键", example = "1")
+    private Long id;
+
+    @Schema(description = "报销类型主键id", example = "1")
+    @NotNull(message = "报销类型主键id不能为空")
+    private Long expenseTypeId;
+
+    @Schema(description = "报销类型名称", example = "差旅费报销")
+    private String expenseTypeName;
+
+    @Schema(description = "费用所属区间")
+    @NotEmpty(message = "费用所属区间不能为空")
+    private String expenseMonth;
+
+    @Schema(description = "总预算金额,单位(元)")
+    @NotNull(message = "总预算金额,单位(元)不能为空")
+    @Min(value = 0, message = "总预算金额,单位(元)最小值为 0")
+    private BigDecimal totalMoney;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "报销流程信息子列表")
+    private List<OaExpenseObjDO> oaExpenseObjs;
+
+}

+ 141 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/expense/OaExpenseDO.java

@@ -0,0 +1,141 @@
+package cn.iocoder.yudao.module.bpm.dal.dataobject.oa.expense;
+
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 报销流程信息 DO
+ *
+ * @author dp
+ */
+@TableName("bpm_oa_expense")
+@KeySequence("bpm_oa_expense_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class OaExpenseDO extends BaseDO {
+
+    /**
+     * 表单主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * uuid
+     */
+    private String expenseUuid;
+    /**
+     * 报销申请人id
+     */
+    private Long employeeId;
+    /**
+     * 报销申请人uuid
+     */
+    private String employeeUuid;
+    /**
+     * 报销申请员工姓名
+     */
+    private String employeeName;
+    /**
+     * 报销申请员工手机号
+     */
+    private String employeePhone;
+    /**
+     * 用户账号id
+     */
+    private Long userId;
+    /**
+     * 用户账号uuid
+     */
+    private String userUuid;
+    /**
+     * 部门id
+     */
+    private Long deptId;
+    /**
+     * 部门uuid
+     */
+    private String deptUuid;
+    /**
+     * 员工职位
+     */
+    private String position;
+    /**
+     * 报销类型主键id
+     */
+    private Long expenseTypeId;
+    /**
+     * 报销类型名称
+     */
+    private String expenseTypeName;
+    /**
+     * 费用所属区间
+     */
+    private String expenseMonth;
+    /**
+     * 总预算金额,单位(元)
+     */
+    private BigDecimal totalMoney;
+    /**
+     * 备注
+     */
+    private String remarks;
+    /**
+     * 流程实例id
+     */
+    private String procInstId;
+    /**
+     * 审核状态(0暂存、1已提交、2审核中、3已审核、4已关闭、5已驳回)
+     */
+    private String auditStatus;
+    /**
+     * 当前审核人员工id
+     */
+    private Long currentAuditEmployeeId;
+    /**
+     * 当前审核人员工uuid
+     */
+    private String currentAuditEmployeeUuid;
+    /**
+     * 当前审核人员工姓名
+     */
+    private String currentAuditEmployeeName;
+    /**
+     * 当前审核人用户id
+     */
+    private Long currentAuditUserId;
+    /**
+     * 当前审核人用户uuid
+     */
+    private String currentAuditUserUuid;
+    /**
+     * 最后审核时间
+     */
+    private LocalDateTime finalAuditDate;
+    /**
+     * 发起人选择的审批人
+     */
+    private String startUserSelectAssignees;
+    /**
+     * 申请人员工id
+     */
+    private Long applyEmployeeId;
+    /**
+     * 申请人员工姓名
+     */
+    private String applyEmployeeName;
+    /**
+     * 数据来源,0流程添加、1手动添加
+     */
+    private String infoSource;
+
+}

+ 68 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/expense/OaExpenseObjDO.java

@@ -0,0 +1,68 @@
+package cn.iocoder.yudao.module.bpm.dal.dataobject.oa.expense;
+
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 报销流程信息子 DO
+ *
+ * @author dp
+ */
+@TableName("bpm_oa_expense_obj")
+@KeySequence("bpm_oa_expense_obj_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class OaExpenseObjDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 报销主表主键id
+     */
+    private Long expenseId;
+    /**
+     * 报销主表uuid
+     */
+    private String expenseUuid;
+    /**
+     * 报销子表uuid
+     */
+    private String expenseObjUuid;
+    /**
+     * 费用项目主键id
+     */
+    private Long expenseItemId;
+    /**
+     * 费用项目名称
+     */
+    private String expenseItemName;
+    /**
+     * 预算金额,单位(元)
+     */
+    private BigDecimal money;
+    /**
+     * 开始日期
+     */
+    private String startDate;
+    /**
+     * 结束日期
+     */
+    private String endDate;
+    /**
+     * 说明
+     */
+    private String remarks;
+
+}

+ 43 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/expense/OaExpenseMapper.java

@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.bpm.dal.mysql.oa.expense;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.expense.vo.OaExpensePageReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.expense.OaExpenseDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 报销流程信息 Mapper
+ *
+ * @author dp
+ */
+@Mapper
+public interface OaExpenseMapper extends BaseMapperX<OaExpenseDO> {
+
+    default PageResult<OaExpenseDO> selectPage(OaExpensePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<OaExpenseDO>()
+                .eqIfPresent(OaExpenseDO::getEmployeeId, reqVO.getEmployeeId())
+                .likeIfPresent(OaExpenseDO::getEmployeeName, reqVO.getEmployeeName())
+                .eqIfPresent(OaExpenseDO::getEmployeePhone, reqVO.getEmployeePhone())
+                .eqIfPresent(OaExpenseDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(OaExpenseDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(OaExpenseDO::getPosition, reqVO.getPosition())
+                .eqIfPresent(OaExpenseDO::getExpenseTypeId, reqVO.getExpenseTypeId())
+                .likeIfPresent(OaExpenseDO::getExpenseTypeName, reqVO.getExpenseTypeName())
+                .eqIfPresent(OaExpenseDO::getExpenseMonth, reqVO.getExpenseMonth())
+                .eqIfPresent(OaExpenseDO::getTotalMoney, reqVO.getTotalMoney())
+                .eqIfPresent(OaExpenseDO::getRemarks, reqVO.getRemarks())
+                .eqIfPresent(OaExpenseDO::getProcInstId, reqVO.getProcInstId())
+                .eqIfPresent(OaExpenseDO::getAuditStatus, reqVO.getAuditStatus())
+                .eqIfPresent(OaExpenseDO::getCurrentAuditEmployeeId, reqVO.getCurrentAuditEmployeeId())
+                .likeIfPresent(OaExpenseDO::getCurrentAuditEmployeeName, reqVO.getCurrentAuditEmployeeName())
+                .eqIfPresent(OaExpenseDO::getCurrentAuditUserId, reqVO.getCurrentAuditUserId())
+                .betweenIfPresent(OaExpenseDO::getFinalAuditDate, reqVO.getFinalAuditDate())
+                .eqIfPresent(OaExpenseDO::getApplyEmployeeId, reqVO.getApplyEmployeeId())
+                .likeIfPresent(OaExpenseDO::getApplyEmployeeName, reqVO.getApplyEmployeeName())
+                .betweenIfPresent(OaExpenseDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(OaExpenseDO::getId));
+    }
+
+}

+ 25 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/expense/OaExpenseObjMapper.java

@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.bpm.dal.mysql.oa.expense;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.expense.OaExpenseObjDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 报销流程信息子 Mapper
+ *
+ * @author dp
+ */
+@Mapper
+public interface OaExpenseObjMapper extends BaseMapperX<OaExpenseObjDO> {
+
+    default List<OaExpenseObjDO> selectListByExpenseId(Long expenseId) {
+        return selectList(OaExpenseObjDO::getExpenseId, expenseId);
+    }
+
+    default int deleteByExpenseId(Long expenseId) {
+        return delete(OaExpenseObjDO::getExpenseId, expenseId);
+    }
+
+}

+ 67 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/expense/OaExpenseService.java

@@ -0,0 +1,67 @@
+package cn.iocoder.yudao.module.bpm.service.oa.expense;
+
+import java.util.*;
+import javax.validation.*;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.expense.vo.OaExpensePageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.expense.vo.OaExpenseSaveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.expense.OaExpenseDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.expense.OaExpenseObjDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+
+/**
+ * 报销流程信息 Service 接口
+ *
+ * @author dp
+ */
+public interface OaExpenseService {
+
+    /**
+     * 创建报销流程信息
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createOaExpense(@Valid OaExpenseSaveReqVO createReqVO);
+
+    /**
+     * 更新报销流程信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateOaExpense(@Valid OaExpenseSaveReqVO updateReqVO);
+
+    /**
+     * 删除报销流程信息
+     *
+     * @param id 编号
+     */
+    void deleteOaExpense(Long id);
+
+    /**
+     * 获得报销流程信息
+     *
+     * @param id 编号
+     * @return 报销流程信息
+     */
+    OaExpenseDO getOaExpense(Long id);
+
+    /**
+     * 获得报销流程信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 报销流程信息分页
+     */
+    PageResult<OaExpenseDO> getOaExpensePage(OaExpensePageReqVO pageReqVO);
+
+    // ==================== 子表(报销流程信息子) ====================
+
+    /**
+     * 获得报销流程信息子列表
+     *
+     * @param expenseId 报销主表主键id
+     * @return 报销流程信息子列表
+     */
+    List<OaExpenseObjDO> getOaExpenseObjListByExpenseId(Long expenseId);
+
+}

+ 113 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/expense/OaExpenseServiceImpl.java

@@ -0,0 +1,113 @@
+package cn.iocoder.yudao.module.bpm.service.oa.expense;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.expense.vo.OaExpensePageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.expense.vo.OaExpenseSaveReqVO;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.expense.OaExpenseDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.expense.OaExpenseObjDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.bpm.dal.mysql.oa.expense.OaExpenseMapper;
+import cn.iocoder.yudao.module.bpm.dal.mysql.oa.expense.OaExpenseObjMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
+
+/**
+ * 报销流程信息 Service 实现类
+ *
+ * @author dp
+ */
+@Service
+@Validated
+public class OaExpenseServiceImpl implements OaExpenseService {
+
+    @Resource
+    private OaExpenseMapper oaExpenseMapper;
+    @Resource
+    private OaExpenseObjMapper oaExpenseObjMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createOaExpense(OaExpenseSaveReqVO createReqVO) {
+        // 插入
+        OaExpenseDO oaExpense = BeanUtils.toBean(createReqVO, OaExpenseDO.class);
+        oaExpenseMapper.insert(oaExpense);
+
+        // 插入子表
+        createOaExpenseObjList(oaExpense.getId(), createReqVO.getOaExpenseObjs());
+        // 返回
+        return oaExpense.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateOaExpense(OaExpenseSaveReqVO updateReqVO) {
+        // 校验存在
+        validateOaExpenseExists(updateReqVO.getId());
+        // 更新
+        OaExpenseDO updateObj = BeanUtils.toBean(updateReqVO, OaExpenseDO.class);
+        oaExpenseMapper.updateById(updateObj);
+
+        // 更新子表
+        updateOaExpenseObjList(updateReqVO.getId(), updateReqVO.getOaExpenseObjs());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteOaExpense(Long id) {
+        // 校验存在
+        validateOaExpenseExists(id);
+        // 删除
+        oaExpenseMapper.deleteById(id);
+
+        // 删除子表
+        deleteOaExpenseObjByExpenseId(id);
+    }
+
+    private void validateOaExpenseExists(Long id) {
+        if (oaExpenseMapper.selectById(id) == null) {
+            throw exception(OA_EXPENSE_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public OaExpenseDO getOaExpense(Long id) {
+        return oaExpenseMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<OaExpenseDO> getOaExpensePage(OaExpensePageReqVO pageReqVO) {
+        return oaExpenseMapper.selectPage(pageReqVO);
+    }
+
+    // ==================== 子表(报销流程信息子) ====================
+
+    @Override
+    public List<OaExpenseObjDO> getOaExpenseObjListByExpenseId(Long expenseId) {
+        return oaExpenseObjMapper.selectListByExpenseId(expenseId);
+    }
+
+    private void createOaExpenseObjList(Long expenseId, List<OaExpenseObjDO> list) {
+        list.forEach(o -> o.setExpenseId(expenseId));
+        oaExpenseObjMapper.insertBatch(list);
+    }
+
+    private void updateOaExpenseObjList(Long expenseId, List<OaExpenseObjDO> list) {
+        deleteOaExpenseObjByExpenseId(expenseId);
+		list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新
+        createOaExpenseObjList(expenseId, list);
+    }
+
+    private void deleteOaExpenseObjByExpenseId(Long expenseId) {
+        oaExpenseObjMapper.deleteByExpenseId(expenseId);
+    }
+
+}

+ 12 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/oa/expense/OaExpenseMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.bpm.dal.mysql.oa.expense.OaExpenseMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>