Browse Source

1、报销审批完成添加报销单据

dongpo 7 months ago
parent
commit
0f68fe8d76
11 changed files with 275 additions and 13 deletions
  1. 26 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/expense/OaExpenseServiceImpl.java
  2. 14 0
      yudao-module-finance/yudao-module-expense-api/src/main/java/cn/iocoder/yudao/module/expense/api/expenseinfo/ExpenseInfoApi.java
  3. 97 0
      yudao-module-finance/yudao-module-expense-api/src/main/java/cn/iocoder/yudao/module/expense/api/expenseinfo/dto/ExpenseInfoCreateReqDTO.java
  4. 45 0
      yudao-module-finance/yudao-module-expense-api/src/main/java/cn/iocoder/yudao/module/expense/api/expenseinfo/dto/ExpenseInfoObjCreateReqDTO.java
  5. 23 0
      yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/api/expenseinfo/ExpenseInfoApiImpl.java
  6. 3 3
      yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/controller/admin/expenseitem/ExpenseItemController.java
  7. 3 3
      yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/controller/admin/expensetype/ExpenseTypeController.java
  8. 9 0
      yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/service/expenseinfo/ExpenseInfoService.java
  9. 25 0
      yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/service/expenseinfo/ExpenseInfoServiceImpl.java
  10. 16 2
      yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/service/expenseitem/ExpenseItemServiceImpl.java
  11. 14 4
      yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/service/expensetype/ExpenseTypeServiceImpl.java

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

@@ -27,6 +27,9 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants;
 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
 import cn.iocoder.yudao.module.employee.api.EmployeeApi;
 import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
+import cn.iocoder.yudao.module.expense.api.expenseinfo.ExpenseInfoApi;
+import cn.iocoder.yudao.module.expense.api.expenseinfo.dto.ExpenseInfoCreateReqDTO;
+import cn.iocoder.yudao.module.expense.api.expenseinfo.dto.ExpenseInfoObjCreateReqDTO;
 import cn.iocoder.yudao.module.expense.api.expenseitem.ExpenseItemApi;
 import cn.iocoder.yudao.module.expense.api.expenseitem.dto.ExpenseItemRespDTO;
 import cn.iocoder.yudao.module.expense.api.expensetype.ExpenseTypeApi;
@@ -99,6 +102,9 @@ public class OaExpenseServiceImpl implements OaExpenseService {
     @Resource
     private ExpenseItemApi expenseItemApi;
 
+    @Resource
+    private ExpenseInfoApi expenseInfoApi;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long stagingOaExpense(OaExpenseSaveReqVO stagingReqVO) {
@@ -325,10 +331,29 @@ public class OaExpenseServiceImpl implements OaExpenseService {
                     .setFinalAuditDate(LocalDateTime.now())
                     .setId(oaExpense.getId());
 
-            // TODO 复制业务单据信息到业务模块单据表
 
         }
         oaExpenseMapper.updateById(oaExpenseDO);
+        // 复制业务单据信息到业务模块单据表
+        if (Objects.isNull(nextTask)) {
+            // 根据ID查询费用报销单
+            OaExpenseDO expenseDO = oaExpenseMapper.selectById(oaExpense.getId());
+            // 将费用报销单转换为费用信息创建请求对象
+            ExpenseInfoCreateReqDTO expenseInfoCreateReqDTO = BeanUtils.toBean(expenseDO, ExpenseInfoCreateReqDTO.class);
+            // 设置费用信息状态为已完成
+            expenseInfoCreateReqDTO.setStatus("0");
+
+            // 查询费用报销单关联的费用明细
+            List<OaExpenseObjDO> oaExpenseObjListByExpenseId = getOaExpenseObjListByExpenseId(expenseDO.getId());
+            // 将费用明细转换为费用信息明细创建请求对象列表
+            List<ExpenseInfoObjCreateReqDTO> expenseInfoObjCreateReqDTOs = BeanUtils.toBean(oaExpenseObjListByExpenseId, ExpenseInfoObjCreateReqDTO.class);
+
+            // 设置费用信息明细列表
+            expenseInfoCreateReqDTO.setExpenseInfoObjs(expenseInfoObjCreateReqDTOs);
+
+            // 调用接口创建费用信息
+            expenseInfoApi.createExpenseInfo(expenseInfoCreateReqDTO);
+        }
         // 发送通知
 
         // 返回

+ 14 - 0
yudao-module-finance/yudao-module-expense-api/src/main/java/cn/iocoder/yudao/module/expense/api/expenseinfo/ExpenseInfoApi.java

@@ -0,0 +1,14 @@
+package cn.iocoder.yudao.module.expense.api.expenseinfo;
+
+import cn.iocoder.yudao.module.expense.api.expenseinfo.dto.ExpenseInfoCreateReqDTO;
+
+public interface ExpenseInfoApi {
+
+    /**
+     * 创建费用信息
+     *
+     * @param createReqDTO 费用信息创建请求数据传输对象,包含创建费用信息所需的各项数据
+     * @return 返回新创建的费用信息的唯一标识符
+     */
+    Long createExpenseInfo(ExpenseInfoCreateReqDTO createReqDTO);
+}

+ 97 - 0
yudao-module-finance/yudao-module-expense-api/src/main/java/cn/iocoder/yudao/module/expense/api/expenseinfo/dto/ExpenseInfoCreateReqDTO.java

@@ -0,0 +1,97 @@
+package cn.iocoder.yudao.module.expense.api.expenseinfo.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class ExpenseInfoCreateReqDTO {
+
+    /**
+     * 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;
+    /**
+     * 职位id
+     */
+    private Long postId;
+    /**
+     * 员工职位
+     */
+    private String position;
+    /**
+     * 报销类型主键id
+     */
+    private Long expenseTypeId;
+    /**
+     * 报销类型名称
+     */
+    private String expenseTypeName;
+    /**
+     * 费用所属区间
+     */
+    private String expenseMonth;
+    /**
+     * 总预算金额,单位(元)
+     */
+    private BigDecimal totalMoney;
+    /**
+     * 备注
+     */
+    private String remarks;
+    /**
+     * 状态(0已完成、1已作废、2已生效)
+     */
+    private String status;
+    /**
+     * 数据来源,0流程添加、1手动添加
+     */
+    private String infoSource;
+    /**
+     * 创建员工id
+     */
+    private Long createEmployeeId;
+
+    /**
+     * 创建人
+     */
+    private String creator;
+
+    /**
+     * 子项列表
+     */
+    private List<ExpenseInfoObjCreateReqDTO> expenseInfoObjs;
+}

+ 45 - 0
yudao-module-finance/yudao-module-expense-api/src/main/java/cn/iocoder/yudao/module/expense/api/expenseinfo/dto/ExpenseInfoObjCreateReqDTO.java

@@ -0,0 +1,45 @@
+package cn.iocoder.yudao.module.expense.api.expenseinfo.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class ExpenseInfoObjCreateReqDTO {
+    /**
+     * 报销主表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;
+    /**
+     * 创建者
+     */
+    private String creator;
+}

+ 23 - 0
yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/api/expenseinfo/ExpenseInfoApiImpl.java

@@ -0,0 +1,23 @@
+package cn.iocoder.yudao.module.expense.api.expenseinfo;
+
+import cn.iocoder.yudao.module.expense.api.expenseinfo.dto.ExpenseInfoCreateReqDTO;
+import cn.iocoder.yudao.module.expense.service.expenseinfo.ExpenseInfoService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Objects;
+
+@Service
+public class ExpenseInfoApiImpl implements ExpenseInfoApi{
+
+    @Resource
+    private ExpenseInfoService expenseInfoService;
+
+    @Override
+    public Long createExpenseInfo(ExpenseInfoCreateReqDTO createReqDTO) {
+        if (Objects.isNull(createReqDTO)) {
+            return -1L;
+        }
+        return expenseInfoService.createExpenseInfo(createReqDTO);
+    }
+}

+ 3 - 3
yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/controller/admin/expenseitem/ExpenseItemController.java

@@ -87,9 +87,9 @@ public class ExpenseItemController {
         PageResult<ExpenseItemRespVO> voPageResult = BeanUtils.toBean(pageResult, ExpenseItemRespVO.class);
         List<ExpenseItemRespVO> list = voPageResult.getList();
         if (CollectionUtil.isNotEmpty(list)) {
-            List<Long> userIdList = list.stream().map(ExpenseItemRespVO::getCreator).collect(Collectors.toList());
-            List<EmployeeRespDTO> employeeRespDTOList = employeeApi.getEmployeeListByUserIds(userIdList);
-            Map<Long, EmployeeRespDTO> longEmployeeRespDTOMap = CollectionUtils.convertMap(employeeRespDTOList, EmployeeRespDTO::getUserId);
+            List<Long> employeeIdList = list.stream().map(ExpenseItemRespVO::getCreator).collect(Collectors.toList());
+            List<EmployeeRespDTO> employeeRespDTOList = employeeApi.getEmployeeListByIds(employeeIdList);
+            Map<Long, EmployeeRespDTO> longEmployeeRespDTOMap = CollectionUtils.convertMap(employeeRespDTOList, EmployeeRespDTO::getId);
             for (ExpenseItemRespVO expenseItemRespVO : list) {
                 EmployeeRespDTO employeeRespDTO = longEmployeeRespDTOMap.get(expenseItemRespVO.getCreator());
                 if (Objects.nonNull(employeeRespDTO)) {

+ 3 - 3
yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/controller/admin/expensetype/ExpenseTypeController.java

@@ -87,9 +87,9 @@ public class ExpenseTypeController {
         PageResult<ExpenseTypeRespVO> voPageResult = BeanUtils.toBean(pageResult, ExpenseTypeRespVO.class);
         List<ExpenseTypeRespVO> list = voPageResult.getList();
         if (CollectionUtil.isNotEmpty(list)) {
-            List<Long> userIdList = list.stream().map(ExpenseTypeRespVO::getCreator).collect(Collectors.toList());
-            List<EmployeeRespDTO> employeeRespDTOList = employeeApi.getEmployeeListByUserIds(userIdList);
-            Map<Long, EmployeeRespDTO> longEmployeeRespDTOMap = CollectionUtils.convertMap(employeeRespDTOList, EmployeeRespDTO::getUserId);
+            List<Long> employeeIdList = list.stream().map(ExpenseTypeRespVO::getCreator).collect(Collectors.toList());
+            List<EmployeeRespDTO> employeeRespDTOList = employeeApi.getEmployeeListByIds(employeeIdList);
+            Map<Long, EmployeeRespDTO> longEmployeeRespDTOMap = CollectionUtils.convertMap(employeeRespDTOList, EmployeeRespDTO::getId);
             for (ExpenseTypeRespVO expenseTypeRespVO : list) {
                 EmployeeRespDTO employeeRespDTO = longEmployeeRespDTOMap.get(expenseTypeRespVO.getCreator());
                 if (Objects.nonNull(employeeRespDTO)) {

+ 9 - 0
yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/service/expenseinfo/ExpenseInfoService.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.expense.service.expenseinfo;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.expense.api.expenseinfo.dto.ExpenseInfoCreateReqDTO;
 import cn.iocoder.yudao.module.expense.controller.admin.expenseinfo.vo.ExpenseInfoPageReqVO;
 import cn.iocoder.yudao.module.expense.controller.admin.expenseinfo.vo.ExpenseInfoRespVO;
 import cn.iocoder.yudao.module.expense.controller.admin.expenseinfo.vo.ExpenseInfoSaveReqVO;
@@ -55,6 +56,14 @@ public interface ExpenseInfoService {
      */
     PageResult<ExpenseInfoRespVO> getInfoPage(ExpenseInfoPageReqVO pageReqVO);
 
+    /**
+     * 创建费用信息
+     *
+     * @param createReqDTO 费用信息创建请求对象,包含创建费用信息所需的各项数据
+     * @return 返回新创建的费用信息的唯一标识
+     */
+    Long createExpenseInfo(ExpenseInfoCreateReqDTO createReqDTO);
+
     // ==================== 子表(报销信息子) ====================
 
     /**

+ 25 - 0
yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/service/expenseinfo/ExpenseInfoServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.expense.service.expenseinfo;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
@@ -9,6 +10,8 @@ import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.employee.api.EmployeeApi;
 import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
 import cn.iocoder.yudao.module.employee.enums.ErrorCodeConstants;
+import cn.iocoder.yudao.module.expense.api.expenseinfo.dto.ExpenseInfoCreateReqDTO;
+import cn.iocoder.yudao.module.expense.api.expenseinfo.dto.ExpenseInfoObjCreateReqDTO;
 import cn.iocoder.yudao.module.expense.controller.admin.expenseinfo.vo.ExpenseInfoPageReqVO;
 import cn.iocoder.yudao.module.expense.controller.admin.expenseinfo.vo.ExpenseInfoRespVO;
 import cn.iocoder.yudao.module.expense.controller.admin.expenseinfo.vo.ExpenseInfoSaveReqVO;
@@ -250,6 +253,28 @@ public class ExpenseInfoServiceImpl implements ExpenseInfoService {
         return new PageResult<>(pageList, pageCount);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createExpenseInfo(ExpenseInfoCreateReqDTO createReqDTO) {
+        // 将创建请求DTO转换为ExpenseInfoDO对象
+        ExpenseInfoDO expenseInfoDO = BeanUtils.toBean(createReqDTO, ExpenseInfoDO.class);
+        // 插入ExpenseInfoDO对象到数据库
+        infoMapper.insert(expenseInfoDO);
+
+        // 获取与当前报销相关的报销信息对象列表
+        List<ExpenseInfoObjCreateReqDTO> expenseInfoObjs = createReqDTO.getExpenseInfoObjs();
+        // 如果报销信息对象列表不为空
+        if (CollUtil.isNotEmpty(expenseInfoObjs)) {
+            // 将报销信息对象列表转换为ExpenseInfoObjDO列表
+            List<ExpenseInfoObjDO> expenseInfoObjDOList = BeanUtils.toBean(expenseInfoObjs, ExpenseInfoObjDO.class);
+            // 创建报销信息对象列表与当前报销的关联
+            createExpenseInfoObjList(expenseInfoDO.getId(), expenseInfoObjDOList);
+        }
+
+        // 返回新创建的报销ID
+        return expenseInfoDO.getId();
+    }
+
     // ==================== 子表(报销信息子) ====================
 
     @Override

+ 16 - 2
yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/service/expenseitem/ExpenseItemServiceImpl.java

@@ -4,6 +4,9 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.module.employee.api.EmployeeApi;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
 import cn.iocoder.yudao.module.expense.controller.admin.expenseitem.vo.ExpenseItemPageReqVO;
 import cn.iocoder.yudao.module.expense.controller.admin.expenseitem.vo.ExpenseItemSaveReqVO;
 import cn.iocoder.yudao.module.expense.dal.dataobject.expenseitem.ExpenseItemDO;
@@ -12,14 +15,15 @@ import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
-
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.iocoder.yudao.module.expense.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.employee.enums.ErrorCodeConstants.EMPLOYEE_INFO_NOT_EXISTS;
+import static cn.iocoder.yudao.module.expense.enums.ErrorCodeConstants.EXPENSE_ITEM_NOT_EXISTS;
+import static cn.iocoder.yudao.module.expense.enums.ErrorCodeConstants.EXPENSE_TYPE_ID_NULL;
 
 /**
  * 报销费用项目信息 Service 实现类
@@ -33,8 +37,17 @@ public class ExpenseItemServiceImpl implements ExpenseItemService {
     @Resource
     private ExpenseItemMapper itemMapper;
 
+    @Resource
+    private EmployeeApi employeeApi;
+
     @Override
     public Long createItem(ExpenseItemSaveReqVO createReqVO) {
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        EmployeeRespDTO loginEmp = employeeApi.getEmployeeByUserId(loginUserId);
+        if (Objects.isNull(loginEmp)) {
+            throw exception(EMPLOYEE_INFO_NOT_EXISTS);
+        }
+
         Long expenseTypeId = createReqVO.getExpenseTypeId();
         if (Objects.isNull(expenseTypeId)) {
             throw exception(EXPENSE_TYPE_ID_NULL);
@@ -42,6 +55,7 @@ public class ExpenseItemServiceImpl implements ExpenseItemService {
         // 插入
         ExpenseItemDO item = BeanUtils.toBean(createReqVO, ExpenseItemDO.class);
         item.setExpenseItemUuid(IdUtil.fastSimpleUUID());
+        item.setCreator(String.valueOf(loginEmp.getId()));
         itemMapper.insert(item);
         // 返回
         return item.getId();

+ 14 - 4
yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/service/expensetype/ExpenseTypeServiceImpl.java

@@ -4,6 +4,9 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.module.employee.api.EmployeeApi;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
 import cn.iocoder.yudao.module.expense.controller.admin.expensetype.vo.ExpenseTypePageReqVO;
 import cn.iocoder.yudao.module.expense.controller.admin.expensetype.vo.ExpenseTypeSaveReqVO;
 import cn.iocoder.yudao.module.expense.dal.dataobject.expenseitem.ExpenseItemDO;
@@ -16,12 +19,10 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.employee.enums.ErrorCodeConstants.EMPLOYEE_INFO_NOT_EXISTS;
 import static cn.iocoder.yudao.module.expense.enums.ErrorCodeConstants.EXPENSE_ITEM_EXISTS;
 import static cn.iocoder.yudao.module.expense.enums.ErrorCodeConstants.EXPENSE_TYPE_NOT_EXISTS;
 
@@ -39,12 +40,21 @@ public class ExpenseTypeServiceImpl implements ExpenseTypeService {
     @Resource
     private ExpenseItemMapper itemMapper;
 
+    @Resource
+    private EmployeeApi employeeApi;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createType(ExpenseTypeSaveReqVO createReqVO) {
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        EmployeeRespDTO loginEmp = employeeApi.getEmployeeByUserId(loginUserId);
+        if (Objects.isNull(loginEmp)) {
+            throw exception(EMPLOYEE_INFO_NOT_EXISTS);
+        }
         // 插入
         ExpenseTypeDO type = BeanUtils.toBean(createReqVO, ExpenseTypeDO.class);
         type.setExpenseTypeUuid(IdUtil.fastSimpleUUID());
+        type.setCreator(String.valueOf(loginEmp.getId()));
         typeMapper.insert(type);
 
         // // 插入子表