sangwenwei 10 mesi fa
parent
commit
d14229be5a
41 ha cambiato i file con 1804 aggiunte e 9 eliminazioni
  1. 38 0
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/controller/ReimbursementInfoController.java
  2. 32 0
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/domain/ReimbursementFileSupplement.java
  3. 13 0
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/mapper/ReimbursementFileSupplementMapper.java
  4. 22 0
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/mapper/xml/ReimbursementFileSupplementMapper.xml
  5. 220 0
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/service/ReimbursementInfoService.java
  6. 12 0
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/service/dto/RetureListDto.java
  7. 15 0
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/service/dto/SaveInfoDto.java
  8. 44 0
      jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalInfo/controller/CcpmReimbursementInfoController.java
  9. 32 0
      jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalInfo/domain/CcpmReimbursementFileSupplement.java
  10. 13 0
      jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalInfo/mapper/CcpmReimbursementFileSupplementMapper.java
  11. 22 0
      jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalInfo/mapper/xml/CcpmReimbursementFileSupplementMapper.xml
  12. 205 2
      jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalInfo/service/CcpmReimbursementInfoService.java
  13. 12 0
      jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalInfo/service/dto/CcpmRetureListDto.java
  14. 15 0
      jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalInfo/service/dto/CcpmSaveInfoDto.java
  15. 7 0
      jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalType/mapper/CcpmReimbursementTypeMapper.java
  16. 3 0
      jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalType/mapper/xml/CcpmReimbursementTypeMapper.xml
  17. 1 1
      jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalType/service/CcpmReimbursementTypeService.java
  18. 45 0
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/controller/ZsReimbursementInfoController.java
  19. 32 0
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/domain/ZsReimbursementFileSupplement.java
  20. 13 0
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/mapper/ZsReimbursementFileSupplementMapper.java
  21. 22 0
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/mapper/xml/ZsReimbursementFileSupplementMapper.xml
  22. 211 2
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/service/ZsReimbursementInfoService.java
  23. 12 0
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/service/dto/ZsRetureListDto.java
  24. 15 0
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/service/dto/ZsSaveInfoDto.java
  25. 44 0
      jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalInfo/controller/ConsultancyReimbursementInfoController.java
  26. 32 0
      jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalInfo/domain/ConsultancyReimbursementFileSupplement.java
  27. 13 0
      jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalInfo/mapper/ConsultancyReimbursementFileSupplementMapper.java
  28. 22 0
      jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalInfo/mapper/xml/ConcultancyReimbursementFileSupplementMapper.xml
  29. 212 2
      jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalInfo/service/ConsultancyReimbursementInfoService.java
  30. 12 0
      jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalInfo/service/dto/ConsultancyRetureListDto.java
  31. 15 0
      jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalInfo/service/dto/ConsultancySaveInfoDto.java
  32. 8 0
      jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalType/mapper/ConsultancyReimbursementTypeMapper.java
  33. 3 0
      jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalType/mapper/xml/ConsultancyReimbursementTypeMapper.xml
  34. 1 1
      jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalType/service/ConsultancyReimbursementTypeService.java
  35. 49 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/controller/CwReimbursementInfoController.java
  36. 32 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/domain/CwReimbursementFileSupplement.java
  37. 13 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/mapper/CwReimbursementFileSupplementMapper.java
  38. 22 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/mapper/xml/CwReimbursementFileSupplementMapper.xml
  39. 242 1
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/service/CwReimbursementInfoService.java
  40. 12 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/service/dto/RetureListDto.java
  41. 16 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/service/dto/SaveInfoDto.java

+ 38 - 0
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/controller/ReimbursementInfoController.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
 import com.jeeplus.assess.projectRecords.Utils.EasyPoiUtil;
+import com.jeeplus.assess.reimbursement.reimbursementInfo.domain.ReimbursementFileSupplement;
 import com.jeeplus.assess.reimbursement.reimbursementInfo.domain.ReimbursementInfoUpHi;
 import com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto.*;
 import com.jeeplus.common.excel.ExcelOptions;
@@ -335,4 +336,41 @@ public class ReimbursementInfoController {
         String data=service.updatePaymentStatus(dto.getId(),dto.getPaymentStatus());
         return data;
     }
+
+    /**
+     * 查询文件补充
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "查询文件补充")
+    @GetMapping("/findFileById")
+    public ResponseEntity<SaveInfoDto> findFileById(@RequestParam String id) throws Exception{
+        SaveInfoDto dto = service.findFileById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 新增/修改 文件补充
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "新增、修改 文件补充")
+    @PostMapping("/saveFile")
+    public ResponseEntity<String> saveFile(@RequestBody SaveInfoDto dto) throws Exception{
+        ReimbursementFileSupplement s = service.saveFile(dto);
+        return ResponseUtil.newInstance().add("businessTable", "reimbursement_file_supplement")
+                .add("businessId", s.getId())
+                .add("no", s.getNo())
+                .ok ("操作成功");
+    }
+
+    /**
+     * 根据id修改文件补充状态status
+     */
+    @ApiOperation(value = "根据id修改文件补充状态status")
+    @PostMapping(value = "updateFileStatusById")
+    public void updateFileStatusById(@RequestBody RetureListDto dto) {
+        service.updateFileStatusById(dto);
+    }
+
 }

+ 32 - 0
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/domain/ReimbursementFileSupplement.java

@@ -0,0 +1,32 @@
+package com.jeeplus.assess.reimbursement.reimbursementInfo.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 报销文件补充
+ */
+@Data
+@TableName("reimbursement_file_supplement")
+public class ReimbursementFileSupplement extends BaseEntity {
+
+    private String reimbursementId; //报销id
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     *
+     */
+    private String processDefinitionId;
+
+    private String status;
+    @TableField(exist = false)
+    private String no; //报销编号
+    @TableField(exist = false)
+    private String taskIdFile;
+
+}

+ 13 - 0
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/mapper/ReimbursementFileSupplementMapper.java

@@ -0,0 +1,13 @@
+package com.jeeplus.assess.reimbursement.reimbursementInfo.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.assess.reimbursement.reimbursementInfo.domain.ReimbursementFileSupplement;
+import org.apache.ibatis.annotations.Param;
+
+public interface ReimbursementFileSupplementMapper extends BaseMapper<ReimbursementFileSupplement> {
+    //根据报销id查询文件补充信息
+    ReimbursementFileSupplement getByReimId(@Param("id") String id);
+
+    //修改文件补充状态
+    void updateFileStatusById(@Param("fileSuppleId") String fileSuppleId, @Param("fileStatus") String fileStatus);
+}

+ 22 - 0
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/mapper/xml/ReimbursementFileSupplementMapper.xml

@@ -0,0 +1,22 @@
+<?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="com.jeeplus.assess.reimbursement.reimbursementInfo.mapper.ReimbursementFileSupplementMapper">
+    <select id="getByReimId" resultType="com.jeeplus.assess.reimbursement.reimbursementInfo.domain.ReimbursementFileSupplement">
+        select
+            crsf.id,
+            crsf.create_by_id,
+            crsf.status,
+            crsf.proc_ins_id,
+            crsf.process_definition_id,
+            fsact.ID_ as taskIdFile
+        from reimbursement_file_supplement crsf
+        LEFT JOIN act_ru_task fsact ON crsf.proc_ins_id = fsact.PROC_INST_ID_
+        where crsf.reimbursement_id = #{id}
+        order by crsf.create_time DESC limit 1
+    </select>
+
+    <update id="updateFileStatusById">
+        update reimbursement_file_supplement set status = #{fileStatus} where id = #{fileSuppleId}
+    </update>
+
+</mapper>

+ 220 - 0
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/service/ReimbursementInfoService.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -92,6 +93,9 @@ public class ReimbursementInfoService {
 
     @Resource
     private ReimbursementInfoUpHiMapper reimbursementInfoUpHiMapper;
+
+    @Resource
+    private ReimbursementFileSupplementMapper reimbursementFileSupplementMapper;
     /**
      * 列表查询
      */
@@ -215,6 +219,7 @@ public class ReimbursementInfoService {
                     item.setAuditUserIds(flowTaskService.getTaskAuditUsers(item.getTaskId()));  // 获取数据审核人
                 }
             }
+
             if (StringUtils.isNotBlank(item.getSourceType()) && "1".equals(item.getSourceType())) { //项目报销
                 if (StringUtils.isNotBlank(item.getProjectId())) {
                     String proName = selectProjectByIds(item.getProjectId());
@@ -223,6 +228,21 @@ public class ReimbursementInfoService {
                     item.setReportNumber(reportNo);
                 }
             }
+            //文件补充
+            ReimbursementFileSupplement reimbursementFileSupplement = reimbursementFileSupplementMapper.getByReimId(item.getId());
+            if (ObjectUtils.isNotEmpty(reimbursementFileSupplement)){
+                item.setFileStatus(reimbursementFileSupplement.getStatus());
+                item.setFileSuppleId(reimbursementFileSupplement.getId());
+                item.setProcInsIdFile(reimbursementFileSupplement.getProcInsId());
+                item.setTaskIdFile(reimbursementFileSupplement.getTaskIdFile());
+            }
+            //文件补充
+            if (StringUtils.isNotBlank(item.getTaskIdFile()) && StringUtils.isNotBlank(item.getFileStatus())) {
+                if ("2".equals(item.getFileStatus())) { // “审核中”的数据要获取数据审核人
+                    item.setAuditFileUserIds(flowTaskService.getTaskAuditUsers(item.getTaskIdFile()));  // 获取数据审核人
+                }
+            }
+
         });
         return pageList;
     }
@@ -1352,4 +1372,204 @@ public class ReimbursementInfoService {
         }
     }
 
+
+    /**
+     * 根据id查询文件补充信息
+     * @param id
+     * @return
+     */
+    public SaveInfoDto findFileById(String id) {
+        SaveInfoDto dto = new SaveInfoDto();
+        String reimId = "";
+        //查询文件补充信息
+        ReimbursementFileSupplement supplement = reimbursementFileSupplementMapper.selectById(id);
+        //获取报销id
+        if (ObjectUtils.isNotEmpty(supplement)){
+            dto.setFileSuppleId(supplement.getId());
+            dto.setFileStatus(supplement.getStatus());
+            dto.setProcInsIdFile(supplement.getProcInsId());
+            reimId = supplement.getReimbursementId();
+        }else {
+            dto.setFileSuppleId("");
+            dto.setFileStatus("0");
+            dto.setProcInsIdFile("");
+            reimId = id;
+        }
+        // 查询基础信息表
+        ReimbursementInfo info = infoMapper.selectById(reimId);
+        if (ObjectUtil.isNotEmpty(info)){
+            BeanUtils.copyProperties(info, dto);
+            if(StringUtils.isNotBlank(info.getDepartment())) {
+                OfficeDTO byId = SpringUtil.getBean ( IOfficeApi.class ).getOfficeById(info.getDepartment());
+                if (ObjectUtil.isNotEmpty(byId)) {
+                    dto.setDepartmentName(byId.getName());
+                }
+            }
+            // 项目报销详情
+            List<ReimbursementDetailInfo> detailList = infoMapper.getDetailList(reimId);
+            detailList.stream().forEach(projectDetail -> {
+                if (StringUtils.isNotBlank(projectDetail.getProjectId())) {
+                    String proName = selectProjectByIds(projectDetail.getProjectId());
+                    projectDetail.setProjectName(proName);
+                    String reportNo = selectReportNoByIds(projectDetail.getProjectId());
+                    projectDetail.setReportNumber(reportNo);
+                } else {
+                    projectDetail.setProjectName("");
+                    projectDetail.setReportNumber("");
+                }
+            });
+            dto.setDetailInfos(detailList);
+            // 合同报销详情
+            dto.setDetailInfoContracts(infoMapper.getContractDetailList(reimId));
+            // 其他报销
+            dto.setDetailInfoOthers(infoMapper.getOtherDetailList(reimId));
+            // 采购报销
+            dto.setDetailInfoProcured(infoMapper.getProcuredDetailList(reimId));
+            // 查询专用发票信息列表
+            LambdaQueryWrapper<ReimbursementAmountInfo> amountInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            amountInfoLambdaQueryWrapper.eq(ReimbursementAmountInfo::getInfoId, reimId);
+            amountInfoLambdaQueryWrapper.eq(ReimbursementAmountInfo::getReimbursementType, "0");
+            List<ReimbursementAmountInfo> amountInfos = amountInfoMapper.selectList(amountInfoLambdaQueryWrapper);
+            dto.setAmountInfos(amountInfos);
+            LambdaQueryWrapper<ReimbursementAmountInfo> invoiceReimbursementsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            invoiceReimbursementsLambdaQueryWrapper.eq(ReimbursementAmountInfo::getInfoId, reimId);
+            invoiceReimbursementsLambdaQueryWrapper.eq(ReimbursementAmountInfo::getReimbursementType, "1");
+            List<ReimbursementAmountInfo> invoiceReimbursements = amountInfoMapper.selectList(invoiceReimbursementsLambdaQueryWrapper);
+            dto.setInvoiceReimbursements(invoiceReimbursements);
+            // 查询附件信息
+            List<WorkAttachmentInfo> fileList = infoMapper.findFiles(reimId);
+            List<WorkAttachmentInfo> files = Lists.newArrayList();
+            List<WorkAttachmentInfo> invoiceReimbursementFiles = Lists.newArrayList();
+
+            if (CollectionUtils.isNotEmpty(fileList)) {
+                for (WorkAttachmentInfo i : fileList) {
+                    i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+                    if("invoiceReimbursement".equals(i.getAttachmentFlag())){
+                        invoiceReimbursementFiles.add(i);
+                    }else{
+                        files.add(i);
+                    }
+                }
+            }
+            dto.setFiles(files);
+            dto.setInvoiceReimbursementFiles(invoiceReimbursementFiles);
+        }
+        return dto;
+    }
+
+
+    /**
+     * 新增/修改  文件补充
+     * @param dto
+     * @return
+     * @throws Exception
+     */
+    public ReimbursementFileSupplement saveFile(SaveInfoDto dto) throws Exception{
+        // 获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken());
+        ReimbursementInfo info = infoMapper.selectById(dto.getId());
+        if (StringUtils.isNotEmpty(dto.getFileSuppleId())) {
+            // 修改专用发票信息列表
+            // 删除原有数据
+            LambdaQueryWrapper<ReimbursementAmountInfo> amountWrapper = new LambdaQueryWrapper<>();
+            amountWrapper.eq(ReimbursementAmountInfo::getInfoId, dto.getId());
+            amountInfoMapper.delete(amountWrapper);
+            if(StringUtils.isNotBlank(dto.getReimbursementType())){
+                if("0".equals(dto.getReimbursementType())){
+                    // 保存专用发票列表信息
+                    if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
+                        for (ReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
+                            //普通报销 发票信息
+                            amountInfo.setReimbursementType("0");
+                            // 生成id
+                            String amountId = UUID.randomUUID().toString().replace("-", "");
+                            amountInfo.setId(amountId);
+                            amountInfo.setCreateById(userDTO.getId());
+                            amountInfo.setCreateTime(new Date());
+                            amountInfo.setUpdateById(userDTO.getId());
+                            amountInfo.setUpdateTime(new Date());
+                            amountInfo.setDelFlag(0);
+                            // 保存基础表信息主键值
+                            amountInfo.setInfoId(dto.getId());
+                            amountInfoMapper.insert(amountInfo);
+                        }
+                    }
+                    //清除电子发票信息
+                    // 删除合同列表
+                    LambdaQueryWrapper<ReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                    deleteInfo.eq(ReimbursementAmountInfo::getInfoId, dto.getId());
+                    deleteInfo.ne(ReimbursementAmountInfo::getReimbursementType, "0");
+                    amountInfoMapper.delete(deleteInfo);
+                }else if("1".equals(dto.getReimbursementType())){
+                    // 保存电子发票列表信息
+                    if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursements())) {
+                        for (ReimbursementAmountInfo amountInfo : dto.getInvoiceReimbursements()) {
+                            //电子发票报销 发票信息
+                            amountInfo.setReimbursementType("1");
+                            // 生成id
+                            String amountId = UUID.randomUUID().toString().replace("-", "");
+                            amountInfo.setId(amountId);
+                            amountInfo.setCreateById(userDTO.getId());
+                            amountInfo.setCreateTime(new Date());
+                            amountInfo.setUpdateById(userDTO.getId());
+                            amountInfo.setUpdateTime(new Date());
+                            amountInfo.setDelFlag(0);
+                            // 保存基础表信息主键值
+                            amountInfo.setInfoId(dto.getId());
+                            amountInfoMapper.insert(amountInfo);
+                        }
+                    }
+                    //清除专用发票信息
+                    LambdaQueryWrapper<ReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                    deleteInfo.eq(ReimbursementAmountInfo::getInfoId, dto.getId());
+                    deleteInfo.ne(ReimbursementAmountInfo::getReimbursementType, "1");
+                    amountInfoMapper.delete(deleteInfo);
+
+
+                    // 保存电子发票附件列表信息
+                    if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursementFiles())) {
+                        workContractService.updateFiles(dto.getInvoiceReimbursementFiles(), userDTO, dto.getId(),"invoiceReimbursement");
+                    }
+                }
+            }
+            // 修改附件信息列表
+            if (CollectionUtils.isNotEmpty(dto.getFiles())) {
+                workContractService.updateFiles(dto.getFiles(), userDTO, dto.getId(),"workcontract");
+            }
+            //修改文件补充信息
+            ReimbursementFileSupplement fileSupplement = new ReimbursementFileSupplement();
+            fileSupplement.setId(dto.getFileSuppleId());
+            fileSupplement.setUpdateById(userDTO.getId());
+            fileSupplement.setUpdateTime(new Date());
+            fileSupplement.setStatus(dto.getFileStatus());
+            reimbursementFileSupplementMapper.updateById(fileSupplement);
+
+            fileSupplement.setNo(info.getNo());
+            return fileSupplement;
+        } else {
+            // 生成id
+            String id = UUID.randomUUID().toString().replace("-", "");
+            ReimbursementFileSupplement fileSupplement = new ReimbursementFileSupplement();
+            fileSupplement.setId(id);
+            fileSupplement.setCreateById(userDTO.getId());
+            fileSupplement.setCreateTime(new Date());
+            fileSupplement.setUpdateById(userDTO.getId());
+            fileSupplement.setUpdateTime(new Date());
+            fileSupplement.setDelFlag(0);
+            fileSupplement.setStatus(dto.getFileStatus());
+            fileSupplement.setReimbursementId(dto.getId());
+            reimbursementFileSupplementMapper.insert(fileSupplement);
+            fileSupplement.setNo(info.getNo());
+            return fileSupplement;
+        }
+    }
+
+    /**
+     * 修改文件补充状态
+     * @param dto
+     */
+    public void updateFileStatusById(RetureListDto dto) {
+        reimbursementFileSupplementMapper.updateFileStatusById(dto.getFileSuppleId(),dto.getFileStatus());
+    }
+
 }

+ 12 - 0
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/service/dto/RetureListDto.java

@@ -143,4 +143,16 @@ public class RetureListDto {
      */
     @Excel(name = "付款状态", width = 30, orderNum = "13")
     private String paymentStatus;
+
+    /**
+     * 文件补充
+     */
+    private String fileSuppleId; //文件补充id
+    private String fileStatus;
+    /**
+     * 流程id
+     */
+    private String procInsIdFile;
+    private String taskIdFile;
+    private List<String> auditFileUserIds;
 }

+ 15 - 0
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/service/dto/SaveInfoDto.java

@@ -105,4 +105,19 @@ public class SaveInfoDto extends BaseEntity {
      */
     private String paymentStatus;
 
+    /**
+     * 文件补充
+     */
+    private String fileSuppleId; //文件补充id
+    private String fileStatus;
+    /**
+     * 流程id
+     */
+    private String procInsIdFile;
+
+    /**
+     *
+     */
+    private String processInstanceIdFile;
+
 }

+ 44 - 0
jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalInfo/controller/CcpmReimbursementInfoController.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
 import com.jeeplus.ccpm.approvalInfo.domain.CcpmProgramProjectListInfo;
+import com.jeeplus.ccpm.approvalInfo.domain.CcpmReimbursementFileSupplement;
 import com.jeeplus.ccpm.approvalInfo.domain.CcpmReimbursementInfo;
 import com.jeeplus.ccpm.approvalInfo.domain.CcpmReimbursementInfoUpHi;
 import com.jeeplus.ccpm.approvalInfo.service.CcpmReimbursementInfoService;
@@ -73,6 +74,12 @@ public class CcpmReimbursementInfoController {
             if (StringUtils.isNotBlank(i.getProcInsId()) && StringUtils.isNotBlank(i.getTaskId())) {
                 i.setAuditUserIds(flowTaskService.getTaskAuditUsers(i.getTaskId()));  // 获取数据审核人
             }
+            //文件补充
+            if (org.apache.commons.lang3.StringUtils.isNotBlank(i.getTaskIdFile()) && org.apache.commons.lang3.StringUtils.isNotBlank(i.getFileStatus())) {
+                if ("2".equals(i.getFileStatus())) { // “审核中”的数据要获取数据审核人
+                    i.setAuditFileUserIds(flowTaskService.getTaskAuditUsers(i.getTaskIdFile()));  // 获取数据审核人
+                }
+            }
         });
         return ResponseEntity.ok(iPage);
     }
@@ -350,4 +357,41 @@ public class CcpmReimbursementInfoController {
         return data;
     }
 
+    /**
+     * 查询文件补充
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "查询文件补充")
+    @GetMapping("/findFileById")
+    public ResponseEntity<CcpmSaveInfoDto> findFileById(@RequestParam String id) throws Exception{
+        CcpmSaveInfoDto dto = service.findFileById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 新增/修改 文件补充
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "新增、修改 文件补充")
+    @PostMapping("/saveFile")
+    public ResponseEntity<String> saveFile(@RequestBody CcpmSaveInfoDto dto) throws Exception{
+        CcpmReimbursementFileSupplement s = service.saveFile(dto);
+        return ResponseUtil.newInstance().add("businessTable", "ccpm_reimbursement_file_supplement")
+                .add("businessId", s.getId())
+                .add("no", s.getNo())
+                .ok ("操作成功");
+    }
+
+    /**
+     * 根据id修改文件补充状态status
+     */
+    @ApiOperation(value = "根据id修改文件补充状态status")
+    @PostMapping(value = "updateFileStatusById")
+    public void updateFileStatusById(@RequestBody CcpmRetureListDto dto) {
+        service.updateFileStatusById(dto);
+    }
+
+
 }

+ 32 - 0
jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalInfo/domain/CcpmReimbursementFileSupplement.java

@@ -0,0 +1,32 @@
+package com.jeeplus.ccpm.approvalInfo.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 报销文件补充
+ */
+@Data
+@TableName(value = "ccpm_reimbursement_file_supplement")
+public class CcpmReimbursementFileSupplement extends BaseEntity {
+
+    private String reimbursementId; //报销id
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     *
+     */
+    private String processDefinitionId;
+
+    private String status;
+    @TableField(exist = false)
+    private String no; //报销编号
+    @TableField(exist = false)
+    private String taskIdFile;
+
+}

+ 13 - 0
jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalInfo/mapper/CcpmReimbursementFileSupplementMapper.java

@@ -0,0 +1,13 @@
+package com.jeeplus.ccpm.approvalInfo.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.ccpm.approvalInfo.domain.CcpmReimbursementFileSupplement;
+import org.apache.ibatis.annotations.Param;
+
+public interface CcpmReimbursementFileSupplementMapper extends BaseMapper<CcpmReimbursementFileSupplement> {
+    //根据报销id查询文件补充信息
+    CcpmReimbursementFileSupplement getByReimId(@Param("id") String id);
+
+    //修改文件补充状态
+    void updateFileStatusById(@Param("fileSuppleId") String fileSuppleId, @Param("fileStatus") String fileStatus);
+}

+ 22 - 0
jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalInfo/mapper/xml/CcpmReimbursementFileSupplementMapper.xml

@@ -0,0 +1,22 @@
+<?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="com.jeeplus.ccpm.approvalInfo.mapper.CcpmReimbursementFileSupplementMapper">
+    <select id="getByReimId" resultType="com.jeeplus.ccpm.approvalInfo.domain.CcpmReimbursementFileSupplement">
+        select
+            crsf.id,
+            crsf.create_by_id,
+            crsf.status,
+            crsf.proc_ins_id,
+            crsf.process_definition_id,
+            fsact.ID_ as taskIdFile
+        from ccpm_reimbursement_file_supplement crsf
+        LEFT JOIN act_ru_task fsact ON crsf.proc_ins_id = fsact.PROC_INST_ID_
+        where crsf.reimbursement_id = #{id}
+        order by crsf.create_time DESC limit 1
+    </select>
+
+    <update id="updateFileStatusById">
+        update ccpm_reimbursement_file_supplement set status = #{fileStatus} where id = #{fileSuppleId}
+    </update>
+
+</mapper>

+ 205 - 2
jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalInfo/service/CcpmReimbursementInfoService.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jeeplus.ccpm.approvalInfo.domain.*;
 import com.jeeplus.ccpm.approvalInfo.mapper.*;
@@ -84,6 +85,9 @@ public class CcpmReimbursementInfoService {
     @Resource
     private CcpmReimbursementTypeService typeService;
 
+    @Resource
+    private CcpmReimbursementFileSupplementMapper ccpmReimbursementFileSupplementMapper;
+
     /**
      * 报告号查询
      */
@@ -220,8 +224,18 @@ public class CcpmReimbursementInfoService {
                 break;
             }
         }*/
-
-        return infoMapper.findList(page, queryWrapper);
+        IPage<CcpmRetureListDto> list = infoMapper.findList(page, queryWrapper);
+        list.getRecords().stream().forEach(item ->{
+            //文件补充
+            CcpmReimbursementFileSupplement reimbursementFileSupplement = ccpmReimbursementFileSupplementMapper.getByReimId(item.getId());
+            if (ObjectUtils.isNotEmpty(reimbursementFileSupplement)){
+                item.setFileStatus(reimbursementFileSupplement.getStatus());
+                item.setFileSuppleId(reimbursementFileSupplement.getId());
+                item.setProcInsIdFile(reimbursementFileSupplement.getProcInsId());
+                item.setTaskIdFile(reimbursementFileSupplement.getTaskIdFile());
+            }
+        } );
+        return list;
     }
 
     public IPage<CcpmProgramProjectListInfo> projectList(Page<CcpmProgramProjectListInfo> page, CcpmProgramProjectListInfo info, String tabType) throws Exception{
@@ -892,4 +906,193 @@ public class CcpmReimbursementInfoService {
         }
     }
 
+    /**
+     * 根据id查询文件补充信息
+     * @param id
+     * @return
+     */
+    public CcpmSaveInfoDto findFileById(String id) {
+        CcpmSaveInfoDto dto = new CcpmSaveInfoDto();
+        String reimId = "";
+        //查询文件补充信息
+        CcpmReimbursementFileSupplement supplement = ccpmReimbursementFileSupplementMapper.selectById(id);
+        //获取报销id
+        if (ObjectUtils.isNotEmpty(supplement)){
+            dto.setFileSuppleId(supplement.getId());
+            dto.setFileStatus(supplement.getStatus());
+            dto.setProcInsIdFile(supplement.getProcInsId());
+            reimId = supplement.getReimbursementId();
+        }else {
+            dto.setFileSuppleId("");
+            dto.setFileStatus("0");
+            dto.setProcInsIdFile("");
+            reimId = id;
+        }
+        // 查询基础信息表
+        CcpmReimbursementInfo info = infoMapper.selectById(reimId);
+        if (ObjectUtil.isNotEmpty(info)){
+            BeanUtils.copyProperties(info, dto);
+            if(StringUtils.isNotBlank(info.getDepartment())) {
+                OfficeDTO byId = SpringUtil.getBean ( IOfficeApi.class ).getOfficeById(info.getDepartment());
+                if (ObjectUtil.isNotEmpty(byId)) {
+                    dto.setDepartmentName(byId.getName());
+                }
+            }
+
+            // 项目报销详情
+            dto.setDetailInfos(infoMapper.getDetailList(reimId));
+            // 合同报销详情
+            dto.setDetailInfoContracts(infoMapper.getContractDetailList(reimId));
+            // 报告报销详情
+            dto.setDetailInfoReports(infoMapper.getReportDetailList(reimId));
+            // 其他报销
+            dto.setDetailInfoOthers(infoMapper.getOtherDetailList(reimId));
+            // 采购报销
+            dto.setDetailInfoProcured(infoMapper.getProcuredDetailList(reimId));
+            // 查询专用发票信息列表
+            LambdaQueryWrapper<CcpmReimbursementAmountInfo> amountInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            amountInfoLambdaQueryWrapper.eq(CcpmReimbursementAmountInfo::getInfoId, reimId);
+            amountInfoLambdaQueryWrapper.eq(CcpmReimbursementAmountInfo::getReimbursementType, "0");
+            List<CcpmReimbursementAmountInfo> amountInfos = amountInfoMapper.selectList(amountInfoLambdaQueryWrapper);
+            dto.setAmountInfos(amountInfos);
+            LambdaQueryWrapper<CcpmReimbursementAmountInfo> invoiceReimbursementsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            invoiceReimbursementsLambdaQueryWrapper.eq(CcpmReimbursementAmountInfo::getInfoId, reimId);
+            invoiceReimbursementsLambdaQueryWrapper.eq(CcpmReimbursementAmountInfo::getReimbursementType, "1");
+            List<CcpmReimbursementAmountInfo> invoiceReimbursements = amountInfoMapper.selectList(invoiceReimbursementsLambdaQueryWrapper);
+            dto.setInvoiceReimbursements(invoiceReimbursements);
+            // 查询附件信息
+            List<WorkAttachmentInfo> fileList = infoMapper.findFiles(reimId);
+            List<WorkAttachmentInfo> files = com.google.common.collect.Lists.newArrayList();
+            List<WorkAttachmentInfo> invoiceReimbursementFiles = com.google.common.collect.Lists.newArrayList();
+
+            if (CollectionUtils.isNotEmpty(fileList)) {
+                for (WorkAttachmentInfo i : fileList) {
+                    i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+                    if("invoiceReimbursement".equals(i.getAttachmentFlag())){
+                        invoiceReimbursementFiles.add(i);
+                    }else{
+                        files.add(i);
+                    }
+                }
+            }
+            dto.setFiles(files);
+            dto.setInvoiceReimbursementFiles(invoiceReimbursementFiles);
+        }
+        return dto;
+    }
+
+
+    /**
+     * 新增/修改  文件补充
+     * @param dto
+     * @return
+     * @throws Exception
+     */
+    public CcpmReimbursementFileSupplement saveFile(CcpmSaveInfoDto dto) throws Exception{
+        // 获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken());
+        CcpmReimbursementInfo info = infoMapper.selectById(dto.getId());
+        if (StringUtils.isNotEmpty(dto.getFileSuppleId())) {
+            // 修改专用发票信息列表
+            // 删除原有数据
+            LambdaQueryWrapper<CcpmReimbursementAmountInfo> amountWrapper = new LambdaQueryWrapper<>();
+            amountWrapper.eq(CcpmReimbursementAmountInfo::getInfoId, dto.getId());
+            amountInfoMapper.delete(amountWrapper);
+            if(StringUtils.isNotBlank(dto.getReimbursementType())){
+                if("0".equals(dto.getReimbursementType())){
+                    // 保存专用发票列表信息
+                    if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
+                        for (CcpmReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
+                            //普通报销 发票信息
+                            amountInfo.setReimbursementType("0");
+                            // 生成id
+                            String amountId = UUID.randomUUID().toString().replace("-", "");
+                            amountInfo.setId(amountId);
+                            amountInfo.setCreateById(userDTO.getId());
+                            amountInfo.setCreateTime(new Date());
+                            amountInfo.setUpdateById(userDTO.getId());
+                            amountInfo.setUpdateTime(new Date());
+                            amountInfo.setDelFlag(0);
+                            // 保存基础表信息主键值
+                            amountInfo.setInfoId(dto.getId());
+                            amountInfoMapper.insert(amountInfo);
+                        }
+                    }
+                    //清除电子发票信息
+                    // 删除合同列表
+                    LambdaQueryWrapper<CcpmReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                    deleteInfo.eq(CcpmReimbursementAmountInfo::getInfoId, dto.getId());
+                    deleteInfo.ne(CcpmReimbursementAmountInfo::getReimbursementType, "0");
+                    amountInfoMapper.delete(deleteInfo);
+                }else if("1".equals(dto.getReimbursementType())){
+                    // 保存电子发票列表信息
+                    if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursements())) {
+                        for (CcpmReimbursementAmountInfo amountInfo : dto.getInvoiceReimbursements()) {
+                            //电子发票报销 发票信息
+                            amountInfo.setReimbursementType("1");
+                            // 生成id
+                            String amountId = UUID.randomUUID().toString().replace("-", "");
+                            amountInfo.setId(amountId);
+                            amountInfo.setCreateById(userDTO.getId());
+                            amountInfo.setCreateTime(new Date());
+                            amountInfo.setUpdateById(userDTO.getId());
+                            amountInfo.setUpdateTime(new Date());
+                            amountInfo.setDelFlag(0);
+                            // 保存基础表信息主键值
+                            amountInfo.setInfoId(dto.getId());
+                            amountInfoMapper.insert(amountInfo);
+                        }
+                    }
+                    //清除专用发票信息
+                    LambdaQueryWrapper<CcpmReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                    deleteInfo.eq(CcpmReimbursementAmountInfo::getInfoId, dto.getId());
+                    deleteInfo.ne(CcpmReimbursementAmountInfo::getReimbursementType, "1");
+                    amountInfoMapper.delete(deleteInfo);
+
+                    // 保存电子发票附件列表信息
+                    if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursementFiles())) {
+                        typeService.updateFiles(dto.getInvoiceReimbursementFiles(), userDTO, dto.getId(),"invoiceReimbursement");
+                    }
+                }
+            }
+            // 修改附件信息列表
+            if (CollectionUtils.isNotEmpty(dto.getFiles())) {
+                typeService.updateFiles(dto.getFiles(), userDTO, dto.getId(),"cwWorkContract");
+            }
+            //修改文件补充信息
+            CcpmReimbursementFileSupplement fileSupplement = new CcpmReimbursementFileSupplement();
+            fileSupplement.setId(dto.getFileSuppleId());
+            fileSupplement.setUpdateById(userDTO.getId());
+            fileSupplement.setUpdateTime(new Date());
+            fileSupplement.setStatus(dto.getFileStatus());
+            ccpmReimbursementFileSupplementMapper.updateById(fileSupplement);
+
+            fileSupplement.setNo(info.getNo());
+            return fileSupplement;
+        } else {
+            // 生成id
+            String id = UUID.randomUUID().toString().replace("-", "");
+            CcpmReimbursementFileSupplement fileSupplement = new CcpmReimbursementFileSupplement();
+            fileSupplement.setId(id);
+            fileSupplement.setCreateById(userDTO.getId());
+            fileSupplement.setCreateTime(new Date());
+            fileSupplement.setUpdateById(userDTO.getId());
+            fileSupplement.setUpdateTime(new Date());
+            fileSupplement.setDelFlag(0);
+            fileSupplement.setStatus(dto.getFileStatus());
+            fileSupplement.setReimbursementId(dto.getId());
+            ccpmReimbursementFileSupplementMapper.insert(fileSupplement);
+            fileSupplement.setNo(info.getNo());
+            return fileSupplement;
+        }
+    }
+
+    /**
+     * 修改文件补充状态
+     * @param dto
+     */
+    public void updateFileStatusById(CcpmRetureListDto dto) {
+        ccpmReimbursementFileSupplementMapper.updateFileStatusById(dto.getFileSuppleId(),dto.getFileStatus());
+    }
+
 }

+ 12 - 0
jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalInfo/service/dto/CcpmRetureListDto.java

@@ -143,4 +143,16 @@ public class CcpmRetureListDto {
      */
     @Excel(name = "付款状态", width = 30, orderNum = "13")
     private String paymentStatus;
+
+    /**
+     * 文件补充
+     */
+    private String fileSuppleId; //文件补充id
+    private String fileStatus;
+    /**
+     * 流程id
+     */
+    private String procInsIdFile;
+    private String taskIdFile;
+    private List<String> auditFileUserIds;
 }

+ 15 - 0
jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalInfo/service/dto/CcpmSaveInfoDto.java

@@ -103,4 +103,19 @@ public class CcpmSaveInfoDto extends BaseEntity {
      */
     private String paymentStatus;
 
+    /**
+     * 文件补充
+     */
+    private String fileSuppleId; //文件补充id
+    private String fileStatus;
+    /**
+     * 流程id
+     */
+    private String procInsIdFile;
+
+    /**
+     *
+     */
+    private String processInstanceIdFile;
+
 }

+ 7 - 0
jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalType/mapper/CcpmReimbursementTypeMapper.java

@@ -39,6 +39,13 @@ public interface CcpmReimbursementTypeMapper extends BaseMapper<CcpmReimbursemen
     List<CcpmReimbursementTypeInfo> getAllList(String type);
     @InterceptorIgnore(tenantLine = "true")
     List<WorkAttachmentInfo> findList(@Param("id") String id);
+    /**
+     * 根据AttachmentFla 和AttachmentId 查询附件信息
+     * @param id
+     * @param attachmentFlag
+     * @return
+     */
+    List<WorkAttachmentInfo> findListByIdAndAttachmentFlag(@Param("id") String id, @Param("attachmentFlag")String attachmentFlag);
     @InterceptorIgnore(tenantLine = "true")
     Integer findIsExit(@Param("id") String id, @Param("name")String name);
 }

+ 3 - 0
jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalType/mapper/xml/CcpmReimbursementTypeMapper.xml

@@ -39,6 +39,9 @@
     <select id="findList" resultType="com.jeeplus.sys.domain.WorkAttachmentInfo">
 		SELECT * FROM work_attachment WHERE del_flag = 0 AND attachment_id = #{id}
 	</select>
+	<select id="findListByIdAndAttachmentFlag" resultType="com.jeeplus.sys.domain.WorkAttachmentInfo">
+		SELECT * FROM work_attachment WHERE del_flag = 0 AND attachment_id = #{id} and attachment_flag = #{attachmentFlag}
+	</select>
 	<select id="findIsExit" resultType="java.lang.Integer">
 		SELECT
 			COUNT( 0 )

+ 1 - 1
jeeplus-modules/jeeplus-ccpm/src/main/java/com/jeeplus/ccpm/approvalType/service/CcpmReimbursementTypeService.java

@@ -252,7 +252,7 @@ public class CcpmReimbursementTypeService {
             names = names + "," +dto.getUrl();
         }
         //查询保存的附件信息
-        List<WorkAttachmentInfo> infoList = mapper.findList(id);
+        List<WorkAttachmentInfo> infoList = mapper.findListByIdAndAttachmentFlag(id,attachmentFlag);
         if (CollectionUtils.isNotEmpty(infoList)) {
             for (WorkAttachmentInfo i : infoList) {
                 if (!names.contains(i.getUrl())) {

+ 45 - 0
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/controller/ZsReimbursementInfoController.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
 import com.jeeplus.centrecareful.approvalInfo.domain.ZSProgramProjectListInfo;
+import com.jeeplus.centrecareful.approvalInfo.domain.ZsReimbursementFileSupplement;
 import com.jeeplus.centrecareful.approvalInfo.domain.ZsReimbursementInfo;
 import com.jeeplus.centrecareful.approvalInfo.domain.ZsReimbursementInfoUpHi;
 import com.jeeplus.centrecareful.approvalInfo.service.ZsReimbursementInfoService;
@@ -71,6 +72,13 @@ public class ZsReimbursementInfoController {
             if (StringUtils.isNotBlank(i.getProcInsId()) && StringUtils.isNotBlank(i.getTaskId())) {
                 i.setAuditUserIds(flowTaskService.getTaskAuditUsers(i.getTaskId()));  // 获取数据审核人
             }
+
+            //文件补充
+            if (org.apache.commons.lang3.StringUtils.isNotBlank(i.getTaskIdFile()) && org.apache.commons.lang3.StringUtils.isNotBlank(i.getFileStatus())) {
+                if ("2".equals(i.getFileStatus())) { // “审核中”的数据要获取数据审核人
+                    i.setAuditFileUserIds(flowTaskService.getTaskAuditUsers(i.getTaskIdFile()));  // 获取数据审核人
+                }
+            }
         });
         return ResponseEntity.ok(iPage);
     }
@@ -346,4 +354,41 @@ public class ZsReimbursementInfoController {
         return data;
     }
 
+    /**
+     * 查询文件补充
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "查询文件补充")
+    @GetMapping("/findFileById")
+    public ResponseEntity<ZsSaveInfoDto> findFileById(@RequestParam String id) throws Exception{
+        ZsSaveInfoDto dto = service.findFileById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 新增/修改 文件补充
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "新增、修改 文件补充")
+    @PostMapping("/saveFile")
+    public ResponseEntity<String> saveFile(@RequestBody ZsSaveInfoDto dto) throws Exception{
+        ZsReimbursementFileSupplement s = service.saveFile(dto);
+        return ResponseUtil.newInstance().add("businessTable", "zs_reimbursement_file_supplement")
+                .add("businessId", s.getId())
+                .add("no", s.getNo())
+                .ok ("操作成功");
+    }
+
+    /**
+     * 根据id修改文件补充状态status
+     */
+    @ApiOperation(value = "根据id修改文件补充状态status")
+    @PostMapping(value = "updateFileStatusById")
+    public void updateFileStatusById(@RequestBody ZsRetureListDto dto) {
+        service.updateFileStatusById(dto);
+    }
+
+
 }

+ 32 - 0
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/domain/ZsReimbursementFileSupplement.java

@@ -0,0 +1,32 @@
+package com.jeeplus.centrecareful.approvalInfo.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 报销文件补充
+ */
+@Data
+@TableName(value = "zs_reimbursement_file_supplement")
+public class ZsReimbursementFileSupplement extends BaseEntity {
+
+    private String reimbursementId; //报销id
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     *
+     */
+    private String processDefinitionId;
+
+    private String status;
+    @TableField(exist = false)
+    private String no; //报销编号
+    @TableField(exist = false)
+    private String taskIdFile;
+
+}

+ 13 - 0
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/mapper/ZsReimbursementFileSupplementMapper.java

@@ -0,0 +1,13 @@
+package com.jeeplus.centrecareful.approvalInfo.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.centrecareful.approvalInfo.domain.ZsReimbursementFileSupplement;
+import org.apache.ibatis.annotations.Param;
+
+public interface ZsReimbursementFileSupplementMapper extends BaseMapper<ZsReimbursementFileSupplement> {
+    //根据报销id查询文件补充信息
+    ZsReimbursementFileSupplement getByReimId(@Param("id") String id);
+
+    //修改文件补充状态
+    void updateFileStatusById(@Param("fileSuppleId") String fileSuppleId, @Param("fileStatus") String fileStatus);
+}

+ 22 - 0
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/mapper/xml/ZsReimbursementFileSupplementMapper.xml

@@ -0,0 +1,22 @@
+<?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="com.jeeplus.centrecareful.approvalInfo.mapper.ZsReimbursementFileSupplementMapper">
+    <select id="getByReimId" resultType="com.jeeplus.centrecareful.approvalInfo.domain.ZsReimbursementFileSupplement">
+        select
+            crsf.id,
+            crsf.create_by_id,
+            crsf.status,
+            crsf.proc_ins_id,
+            crsf.process_definition_id,
+            fsact.ID_ as taskIdFile
+        from zs_reimbursement_file_supplement crsf
+        LEFT JOIN act_ru_task fsact ON crsf.proc_ins_id = fsact.PROC_INST_ID_
+        where crsf.reimbursement_id = #{id}
+        order by crsf.create_time DESC limit 1
+    </select>
+
+    <update id="updateFileStatusById">
+        update zs_reimbursement_file_supplement set status = #{fileStatus} where id = #{fileSuppleId}
+    </update>
+
+</mapper>

+ 211 - 2
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/service/ZsReimbursementInfoService.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jeeplus.centrecareful.approvalType.service.ZsReimbursementTypeService;
 import com.jeeplus.common.TokenProvider;
@@ -80,6 +81,9 @@ public class ZsReimbursementInfoService {
     @Resource
     private ZsReimbursementInfoUpHiMapper reimbursementInfoUpHiMapper;
 
+    @Resource
+    private ZsReimbursementFileSupplementMapper zsReimbursementFileSupplementMapper;
+
     /**
      * 报告号查询
      */
@@ -215,8 +219,18 @@ public class ZsReimbursementInfoService {
                 break;
             }
         }*/
-
-        return infoMapper.findList(page, queryWrapper);
+        IPage<ZsRetureListDto> list = infoMapper.findList(page, queryWrapper);
+        list.getRecords().stream().forEach(item ->{
+            //文件补充
+            ZsReimbursementFileSupplement reimbursementFileSupplement = zsReimbursementFileSupplementMapper.getByReimId(item.getId());
+            if (ObjectUtils.isNotEmpty(reimbursementFileSupplement)){
+                item.setFileStatus(reimbursementFileSupplement.getStatus());
+                item.setFileSuppleId(reimbursementFileSupplement.getId());
+                item.setProcInsIdFile(reimbursementFileSupplement.getProcInsId());
+                item.setTaskIdFile(reimbursementFileSupplement.getTaskIdFile());
+            }
+        });
+        return list;
     }
 
     public IPage<ZSProgramProjectListInfo> projectList(Page<ZSProgramProjectListInfo> page, ZSProgramProjectListInfo info, String tabType) throws Exception{
@@ -887,4 +901,199 @@ public class ZsReimbursementInfoService {
         }
     }
 
+
+    /**
+     * 根据id查询文件补充信息
+     * @param id
+     * @return
+     */
+    public ZsSaveInfoDto findFileById(String id) {
+        ZsSaveInfoDto dto = new ZsSaveInfoDto();
+        String reimId = "";
+        //查询文件补充信息
+        ZsReimbursementFileSupplement supplement = zsReimbursementFileSupplementMapper.selectById(id);
+        //获取报销id
+        if (ObjectUtils.isNotEmpty(supplement)){
+            dto.setFileSuppleId(supplement.getId());
+            dto.setFileStatus(supplement.getStatus());
+            dto.setProcInsIdFile(supplement.getProcInsId());
+            reimId = supplement.getReimbursementId();
+        }else {
+            dto.setFileSuppleId("");
+            dto.setFileStatus("0");
+            dto.setProcInsIdFile("");
+            reimId = id;
+        }
+        // 查询基础信息表
+        ZsReimbursementInfo info = infoMapper.selectById(reimId);
+        if (ObjectUtil.isNotEmpty(info)){
+            BeanUtils.copyProperties(info, dto);
+            if(StringUtils.isNotBlank(info.getDepartment())) {
+                OfficeDTO byId = SpringUtil.getBean ( IOfficeApi.class ).getOfficeById(info.getDepartment());
+                if (ObjectUtil.isNotEmpty(byId)) {
+                    dto.setDepartmentName(byId.getName());
+                }
+            }
+
+            // 查询详情列表
+//        LambdaQueryWrapper<ZsReimbursementDetailInfo> detailInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
+//        detailInfoLambdaQueryWrapper.eq(ZsReimbursementDetailInfo::getInfoId, id);
+//        detailInfoLambdaQueryWrapper.orderByAsc(ZsReimbursementDetailInfo::getNumber);
+//        List<ZsReimbursementDetailInfo> detailInfos = detailInfoMapper.selectList(detailInfoLambdaQueryWrapper);
+            // 项目报销详情
+            dto.setDetailInfos(infoMapper.getDetailList(reimId));
+            // 合同报销详情
+            dto.setDetailInfoContracts(infoMapper.getContractDetailList(reimId));
+            // 报告报销详情
+            dto.setDetailInfoReports(infoMapper.getReportDetailList(reimId));
+            // 其他报销
+            dto.setDetailInfoOthers(infoMapper.getOtherDetailList(reimId));
+            // 采购报销
+            dto.setDetailInfoProcured(infoMapper.getProcuredDetailList(reimId));
+            // 查询专用发票信息列表
+            LambdaQueryWrapper<ZsReimbursementAmountInfo> amountInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            amountInfoLambdaQueryWrapper.eq(ZsReimbursementAmountInfo::getInfoId, reimId);
+            amountInfoLambdaQueryWrapper.eq(ZsReimbursementAmountInfo::getReimbursementType, "0");
+            List<ZsReimbursementAmountInfo> amountInfos = amountInfoMapper.selectList(amountInfoLambdaQueryWrapper);
+            dto.setAmountInfos(amountInfos);
+            LambdaQueryWrapper<ZsReimbursementAmountInfo> invoiceReimbursementsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            invoiceReimbursementsLambdaQueryWrapper.eq(ZsReimbursementAmountInfo::getInfoId, reimId);
+            invoiceReimbursementsLambdaQueryWrapper.eq(ZsReimbursementAmountInfo::getReimbursementType, "1");
+            List<ZsReimbursementAmountInfo> invoiceReimbursements = amountInfoMapper.selectList(invoiceReimbursementsLambdaQueryWrapper);
+            dto.setInvoiceReimbursements(invoiceReimbursements);
+            // 查询附件信息
+            List<WorkAttachmentInfo> fileList = infoMapper.findFiles(reimId);
+            List<WorkAttachmentInfo> files = com.google.common.collect.Lists.newArrayList();
+            List<WorkAttachmentInfo> invoiceReimbursementFiles = com.google.common.collect.Lists.newArrayList();
+
+            if (CollectionUtils.isNotEmpty(fileList)) {
+                for (WorkAttachmentInfo i : fileList) {
+                    i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+                    if("invoiceReimbursement".equals(i.getAttachmentFlag())){
+                        invoiceReimbursementFiles.add(i);
+                    }else{
+                        files.add(i);
+                    }
+                }
+            }
+            dto.setFiles(files);
+            dto.setInvoiceReimbursementFiles(invoiceReimbursementFiles);
+        }
+        return dto;
+    }
+
+
+    /**
+     * 新增/修改  文件补充
+     * @param dto
+     * @return
+     * @throws Exception
+     */
+    public ZsReimbursementFileSupplement saveFile(ZsSaveInfoDto dto) throws Exception{
+        // 获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken());
+        ZsReimbursementInfo info = infoMapper.selectById(dto.getId());
+        if (StringUtils.isNotEmpty(dto.getFileSuppleId())) {
+            // 修改专用发票信息列表
+            // 删除原有数据
+            LambdaQueryWrapper<ZsReimbursementAmountInfo> amountWrapper = new LambdaQueryWrapper<>();
+            amountWrapper.eq(ZsReimbursementAmountInfo::getInfoId, dto.getId());
+            amountInfoMapper.delete(amountWrapper);
+            if(StringUtils.isNotBlank(dto.getReimbursementType())){
+                if("0".equals(dto.getReimbursementType())){
+                    // 保存专用发票列表信息
+                    if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
+                        for (ZsReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
+                            //普通报销 发票信息
+                            amountInfo.setReimbursementType("0");
+                            // 生成id
+                            String amountId = UUID.randomUUID().toString().replace("-", "");
+                            amountInfo.setId(amountId);
+                            amountInfo.setCreateById(userDTO.getId());
+                            amountInfo.setCreateTime(new Date());
+                            amountInfo.setUpdateById(userDTO.getId());
+                            amountInfo.setUpdateTime(new Date());
+                            amountInfo.setDelFlag(0);
+                            // 保存基础表信息主键值
+                            amountInfo.setInfoId(dto.getId());
+                            amountInfoMapper.insert(amountInfo);
+                        }
+                    }
+                    //清除电子发票信息
+                    // 删除合同列表
+                    LambdaQueryWrapper<ZsReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                    deleteInfo.eq(ZsReimbursementAmountInfo::getInfoId, dto.getId());
+                    deleteInfo.ne(ZsReimbursementAmountInfo::getReimbursementType, "0");
+                    amountInfoMapper.delete(deleteInfo);
+                }else if("1".equals(dto.getReimbursementType())){
+                    // 保存电子发票列表信息
+                    if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursements())) {
+                        for (ZsReimbursementAmountInfo amountInfo : dto.getInvoiceReimbursements()) {
+                            //电子发票报销 发票信息
+                            amountInfo.setReimbursementType("1");
+                            // 生成id
+                            String amountId = UUID.randomUUID().toString().replace("-", "");
+                            amountInfo.setId(amountId);
+                            amountInfo.setCreateById(userDTO.getId());
+                            amountInfo.setCreateTime(new Date());
+                            amountInfo.setUpdateById(userDTO.getId());
+                            amountInfo.setUpdateTime(new Date());
+                            amountInfo.setDelFlag(0);
+                            // 保存基础表信息主键值
+                            amountInfo.setInfoId(dto.getId());
+                            amountInfoMapper.insert(amountInfo);
+                        }
+                    }
+                    //清除专用发票信息
+                    LambdaQueryWrapper<ZsReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                    deleteInfo.eq(ZsReimbursementAmountInfo::getInfoId, dto.getId());
+                    deleteInfo.ne(ZsReimbursementAmountInfo::getReimbursementType, "1");
+                    amountInfoMapper.delete(deleteInfo);
+
+                    // 保存电子发票附件列表信息
+                    if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursementFiles())) {
+                        typeService.updateFiles(dto.getInvoiceReimbursementFiles(), userDTO, dto.getId(),"invoiceReimbursement");
+                    }
+                }
+            }
+            // 修改附件信息列表
+            if (CollectionUtils.isNotEmpty(dto.getFiles())) {
+                typeService.updateFiles(dto.getFiles(), userDTO, dto.getId(),"cwWorkContract");
+            }
+            //修改文件补充信息
+            ZsReimbursementFileSupplement fileSupplement = new ZsReimbursementFileSupplement();
+            fileSupplement.setId(dto.getFileSuppleId());
+            fileSupplement.setUpdateById(userDTO.getId());
+            fileSupplement.setUpdateTime(new Date());
+            fileSupplement.setStatus(dto.getFileStatus());
+            zsReimbursementFileSupplementMapper.updateById(fileSupplement);
+
+            fileSupplement.setNo(info.getNo());
+            return fileSupplement;
+        } else {
+            // 生成id
+            String id = UUID.randomUUID().toString().replace("-", "");
+            ZsReimbursementFileSupplement fileSupplement = new ZsReimbursementFileSupplement();
+            fileSupplement.setId(id);
+            fileSupplement.setCreateById(userDTO.getId());
+            fileSupplement.setCreateTime(new Date());
+            fileSupplement.setUpdateById(userDTO.getId());
+            fileSupplement.setUpdateTime(new Date());
+            fileSupplement.setDelFlag(0);
+            fileSupplement.setStatus(dto.getFileStatus());
+            fileSupplement.setReimbursementId(dto.getId());
+            zsReimbursementFileSupplementMapper.insert(fileSupplement);
+            fileSupplement.setNo(info.getNo());
+            return fileSupplement;
+        }
+    }
+
+    /**
+     * 修改文件补充状态
+     * @param dto
+     */
+    public void updateFileStatusById(ZsRetureListDto dto) {
+        zsReimbursementFileSupplementMapper.updateFileStatusById(dto.getFileSuppleId(),dto.getFileStatus());
+    }
+
 }

+ 12 - 0
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/service/dto/ZsRetureListDto.java

@@ -145,4 +145,16 @@ public class ZsRetureListDto {
      */
     @Excel(name = "付款状态", width = 30, orderNum = "13")
     private String paymentStatus;
+
+    /**
+     * 文件补充
+     */
+    private String fileSuppleId; //文件补充id
+    private String fileStatus;
+    /**
+     * 流程id
+     */
+    private String procInsIdFile;
+    private String taskIdFile;
+    private List<String> auditFileUserIds;
 }

+ 15 - 0
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/service/dto/ZsSaveInfoDto.java

@@ -103,4 +103,19 @@ public class ZsSaveInfoDto extends BaseEntity {
      */
     private String paymentStatus;
 
+    /**
+     * 文件补充
+     */
+    private String fileSuppleId; //文件补充id
+    private String fileStatus;
+    /**
+     * 流程id
+     */
+    private String procInsIdFile;
+
+    /**
+     *
+     */
+    private String processInstanceIdFile;
+
 }

+ 44 - 0
jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalInfo/controller/ConsultancyReimbursementInfoController.java

@@ -10,6 +10,7 @@ import com.jeeplus.common.excel.ExcelOptions;
 import com.jeeplus.common.excel.ExportMode;
 import com.jeeplus.common.utils.ResponseUtil;
 import com.jeeplus.consultancy.approvalInfo.domain.ConsultancyProgramProjectListInfo;
+import com.jeeplus.consultancy.approvalInfo.domain.ConsultancyReimbursementFileSupplement;
 import com.jeeplus.consultancy.approvalInfo.domain.ConsultancyReimbursementInfo;
 import com.jeeplus.consultancy.approvalInfo.domain.ConsultancyReimbursementInfoUpHi;
 import com.jeeplus.consultancy.approvalInfo.service.ConsultancyReimbursementInfoService;
@@ -73,6 +74,12 @@ public class ConsultancyReimbursementInfoController {
             if (StringUtils.isNotBlank(i.getProcInsId()) && StringUtils.isNotBlank(i.getTaskId())) {
                 i.setAuditUserIds(flowTaskService.getTaskAuditUsers(i.getTaskId()));  // 获取数据审核人
             }
+            //文件补充
+            if (StringUtils.isNotBlank(i.getTaskIdFile()) && org.apache.commons.lang3.StringUtils.isNotBlank(i.getFileStatus())) {
+                if ("2".equals(i.getFileStatus())) { // “审核中”的数据要获取数据审核人
+                    i.setAuditFileUserIds(flowTaskService.getTaskAuditUsers(i.getTaskIdFile()));  // 获取数据审核人
+                }
+            }
         });
         return ResponseEntity.ok(iPage);
     }
@@ -348,4 +355,41 @@ public class ConsultancyReimbursementInfoController {
         String data=service.updatePaymentStatus(dto.getId(),dto.getPaymentStatus());
         return data;
     }
+
+    /**
+     * 查询文件补充
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "查询文件补充")
+    @GetMapping("/findFileById")
+    public ResponseEntity<ConsultancySaveInfoDto> findFileById(@RequestParam String id) throws Exception{
+        ConsultancySaveInfoDto dto = service.findFileById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 新增/修改 文件补充
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "新增、修改 文件补充")
+    @PostMapping("/saveFile")
+    public ResponseEntity<String> saveFile(@RequestBody ConsultancySaveInfoDto dto) throws Exception{
+        ConsultancyReimbursementFileSupplement s = service.saveFile(dto);
+        return ResponseUtil.newInstance().add("businessTable", "consultancy_reimbursement_file_supplement")
+                .add("businessId", s.getId())
+                .add("no", s.getNo())
+                .ok ("操作成功");
+    }
+
+    /**
+     * 根据id修改文件补充状态status
+     */
+    @ApiOperation(value = "根据id修改文件补充状态status")
+    @PostMapping(value = "updateFileStatusById")
+    public void updateFileStatusById(@RequestBody ConsultancyRetureListDto dto) {
+        service.updateFileStatusById(dto);
+    }
+
 }

+ 32 - 0
jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalInfo/domain/ConsultancyReimbursementFileSupplement.java

@@ -0,0 +1,32 @@
+package com.jeeplus.consultancy.approvalInfo.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 报销文件补充
+ */
+@Data
+@TableName(value = "consultancy_reimbursement_file_supplement")
+public class ConsultancyReimbursementFileSupplement extends BaseEntity {
+
+    private String reimbursementId; //报销id
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     *
+     */
+    private String processDefinitionId;
+
+    private String status;
+    @TableField(exist = false)
+    private String no; //报销编号
+    @TableField(exist = false)
+    private String taskIdFile;
+
+}

+ 13 - 0
jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalInfo/mapper/ConsultancyReimbursementFileSupplementMapper.java

@@ -0,0 +1,13 @@
+package com.jeeplus.consultancy.approvalInfo.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.consultancy.approvalInfo.domain.ConsultancyReimbursementFileSupplement;
+import org.apache.ibatis.annotations.Param;
+
+public interface ConsultancyReimbursementFileSupplementMapper extends BaseMapper<ConsultancyReimbursementFileSupplement> {
+    //根据报销id查询文件补充信息
+    ConsultancyReimbursementFileSupplement getByReimId(@Param("id") String id);
+
+    //修改文件补充状态
+    void updateFileStatusById(@Param("fileSuppleId") String fileSuppleId, @Param("fileStatus") String fileStatus);
+}

+ 22 - 0
jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalInfo/mapper/xml/ConcultancyReimbursementFileSupplementMapper.xml

@@ -0,0 +1,22 @@
+<?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="com.jeeplus.consultancy.approvalInfo.mapper.ConsultancyReimbursementFileSupplementMapper">
+    <select id="getByReimId" resultType="com.jeeplus.consultancy.approvalInfo.domain.ConsultancyReimbursementFileSupplement">
+        select
+            crsf.id,
+            crsf.create_by_id,
+            crsf.status,
+            crsf.proc_ins_id,
+            crsf.process_definition_id,
+            fsact.ID_ as taskIdFile
+        from consultancy_reimbursement_file_supplement crsf
+        LEFT JOIN act_ru_task fsact ON crsf.proc_ins_id = fsact.PROC_INST_ID_
+        where crsf.reimbursement_id = #{id}
+        order by crsf.create_time DESC limit 1
+    </select>
+
+    <update id="updateFileStatusById">
+        update consultancy_reimbursement_file_supplement set status = #{fileStatus} where id = #{fileSuppleId}
+    </update>
+
+</mapper>

+ 212 - 2
jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalInfo/service/ConsultancyReimbursementInfoService.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jeeplus.common.TokenProvider;
 import com.jeeplus.consultancy.approvalInfo.domain.*;
@@ -84,6 +85,9 @@ public class ConsultancyReimbursementInfoService {
     @Resource
     private ConsultancyReimbursementInfoUpHiMapper reimbursementInfoUpHiMapper;
 
+    @Resource
+    private ConsultancyReimbursementFileSupplementMapper consultancyReimbursementFileSupplementMapper;
+
     /**
      * 报告号查询
      */
@@ -221,7 +225,18 @@ public class ConsultancyReimbursementInfoService {
             }
         }*/
 
-        return infoMapper.findList(page, queryWrapper);
+        IPage<ConsultancyRetureListDto> list = infoMapper.findList(page, queryWrapper);
+        list.getRecords().stream().forEach(item ->{
+            //文件补充
+            ConsultancyReimbursementFileSupplement reimbursementFileSupplement = consultancyReimbursementFileSupplementMapper.getByReimId(item.getId());
+            if (ObjectUtils.isNotEmpty(reimbursementFileSupplement)){
+                item.setFileStatus(reimbursementFileSupplement.getStatus());
+                item.setFileSuppleId(reimbursementFileSupplement.getId());
+                item.setProcInsIdFile(reimbursementFileSupplement.getProcInsId());
+                item.setTaskIdFile(reimbursementFileSupplement.getTaskIdFile());
+            }
+        } );
+        return list;
     }
 
     public IPage<ConsultancyProgramProjectListInfo> projectList(Page<ConsultancyProgramProjectListInfo> page, ConsultancyProgramProjectListInfo info, String tabType) throws Exception{
@@ -559,7 +574,7 @@ public class ConsultancyReimbursementInfoService {
         }*/
         // 修改附件信息列表
         if (CollectionUtils.isNotEmpty(dto.getFiles())) {
-            typeService.updateFiles(dto.getFiles(), userDTO, dto.getId());
+            typeService.updateFiles(dto.getFiles(), userDTO, dto.getId(),"cwWorkContract");
         }
         return info;
     }
@@ -891,4 +906,199 @@ public class ConsultancyReimbursementInfoService {
             return "付款失败,请确认后付款";
         }
     }
+
+    /**
+     * 根据id查询文件补充信息
+     * @param id
+     * @return
+     */
+    public ConsultancySaveInfoDto findFileById(String id) {
+        ConsultancySaveInfoDto dto = new ConsultancySaveInfoDto();
+        String reimId = "";
+        //查询文件补充信息
+        ConsultancyReimbursementFileSupplement supplement = consultancyReimbursementFileSupplementMapper.selectById(id);
+        //获取报销id
+        if (ObjectUtils.isNotEmpty(supplement)){
+            dto.setFileSuppleId(supplement.getId());
+            dto.setFileStatus(supplement.getStatus());
+            dto.setProcInsIdFile(supplement.getProcInsId());
+            reimId = supplement.getReimbursementId();
+        }else {
+            dto.setFileSuppleId("");
+            dto.setFileStatus("0");
+            dto.setProcInsIdFile("");
+            reimId = id;
+        }
+        // 查询基础信息表
+        ConsultancyReimbursementInfo info = infoMapper.selectById(reimId);
+        if (ObjectUtil.isNotEmpty(info)){
+            BeanUtils.copyProperties(info, dto);
+            if(StringUtils.isNotBlank(info.getDepartment())) {
+                OfficeDTO byId = SpringUtil.getBean ( IOfficeApi.class ).getOfficeById(info.getDepartment());
+                if (ObjectUtil.isNotEmpty(byId)) {
+                    dto.setDepartmentName(byId.getName());
+                }
+            }
+
+            // 查询详情列表
+//        LambdaQueryWrapper<ZsReimbursementDetailInfo> detailInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
+//        detailInfoLambdaQueryWrapper.eq(ZsReimbursementDetailInfo::getInfoId, id);
+//        detailInfoLambdaQueryWrapper.orderByAsc(ZsReimbursementDetailInfo::getNumber);
+//        List<ZsReimbursementDetailInfo> detailInfos = detailInfoMapper.selectList(detailInfoLambdaQueryWrapper);
+            // 项目报销详情
+            dto.setDetailInfos(infoMapper.getDetailList(reimId));
+            // 合同报销详情
+            dto.setDetailInfoContracts(infoMapper.getContractDetailList(reimId));
+            // 报告报销详情
+            dto.setDetailInfoReports(infoMapper.getReportDetailList(reimId));
+            // 其他报销
+            dto.setDetailInfoOthers(infoMapper.getOtherDetailList(reimId));
+            // 采购报销
+            dto.setDetailInfoProcured(infoMapper.getProcuredDetailList(reimId));
+            // 查询专用发票信息列表
+            LambdaQueryWrapper<ConsultancyReimbursementAmountInfo> amountInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            amountInfoLambdaQueryWrapper.eq(ConsultancyReimbursementAmountInfo::getInfoId, reimId);
+            amountInfoLambdaQueryWrapper.eq(ConsultancyReimbursementAmountInfo::getReimbursementType, "0");
+            List<ConsultancyReimbursementAmountInfo> amountInfos = amountInfoMapper.selectList(amountInfoLambdaQueryWrapper);
+            dto.setAmountInfos(amountInfos);
+            LambdaQueryWrapper<ConsultancyReimbursementAmountInfo> invoiceReimbursementsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            invoiceReimbursementsLambdaQueryWrapper.eq(ConsultancyReimbursementAmountInfo::getInfoId, reimId);
+            invoiceReimbursementsLambdaQueryWrapper.eq(ConsultancyReimbursementAmountInfo::getReimbursementType, "1");
+            List<ConsultancyReimbursementAmountInfo> invoiceReimbursements = amountInfoMapper.selectList(invoiceReimbursementsLambdaQueryWrapper);
+            dto.setInvoiceReimbursements(invoiceReimbursements);
+            // 查询附件信息
+            List<WorkAttachmentInfo> fileList = infoMapper.findFiles(reimId);
+            List<WorkAttachmentInfo> files = com.google.common.collect.Lists.newArrayList();
+            List<WorkAttachmentInfo> invoiceReimbursementFiles = com.google.common.collect.Lists.newArrayList();
+
+            if (CollectionUtils.isNotEmpty(fileList)) {
+                for (WorkAttachmentInfo i : fileList) {
+                    i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+                    if("invoiceReimbursement".equals(i.getAttachmentFlag())){
+                        invoiceReimbursementFiles.add(i);
+                    }else{
+                        files.add(i);
+                    }
+                }
+            }
+            dto.setFiles(files);
+            dto.setInvoiceReimbursementFiles(invoiceReimbursementFiles);
+        }
+        return dto;
+    }
+
+
+    /**
+     * 新增/修改  文件补充
+     * @param dto
+     * @return
+     * @throws Exception
+     */
+    public ConsultancyReimbursementFileSupplement saveFile(ConsultancySaveInfoDto dto) throws Exception{
+        // 获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken());
+        ConsultancyReimbursementInfo info = infoMapper.selectById(dto.getId());
+        if (StringUtils.isNotEmpty(dto.getFileSuppleId())) {
+            // 修改专用发票信息列表
+            // 删除原有数据
+            LambdaQueryWrapper<ConsultancyReimbursementAmountInfo> amountWrapper = new LambdaQueryWrapper<>();
+            amountWrapper.eq(ConsultancyReimbursementAmountInfo::getInfoId, dto.getId());
+            amountInfoMapper.delete(amountWrapper);
+            if(StringUtils.isNotBlank(dto.getReimbursementType())){
+                if("0".equals(dto.getReimbursementType())){
+                    // 保存专用发票列表信息
+                    if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
+                        for (ConsultancyReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
+                            //普通报销 发票信息
+                            amountInfo.setReimbursementType("0");
+                            // 生成id
+                            String amountId = UUID.randomUUID().toString().replace("-", "");
+                            amountInfo.setId(amountId);
+                            amountInfo.setCreateById(userDTO.getId());
+                            amountInfo.setCreateTime(new Date());
+                            amountInfo.setUpdateById(userDTO.getId());
+                            amountInfo.setUpdateTime(new Date());
+                            amountInfo.setDelFlag(0);
+                            // 保存基础表信息主键值
+                            amountInfo.setInfoId(dto.getId());
+                            amountInfoMapper.insert(amountInfo);
+                        }
+                    }
+                    //清除电子发票信息
+                    // 删除合同列表
+                    LambdaQueryWrapper<ConsultancyReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                    deleteInfo.eq(ConsultancyReimbursementAmountInfo::getInfoId, dto.getId());
+                    deleteInfo.ne(ConsultancyReimbursementAmountInfo::getReimbursementType, "0");
+                    amountInfoMapper.delete(deleteInfo);
+                }else if("1".equals(dto.getReimbursementType())){
+                    // 保存电子发票列表信息
+                    if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursements())) {
+                        for (ConsultancyReimbursementAmountInfo amountInfo : dto.getInvoiceReimbursements()) {
+                            //电子发票报销 发票信息
+                            amountInfo.setReimbursementType("1");
+                            // 生成id
+                            String amountId = UUID.randomUUID().toString().replace("-", "");
+                            amountInfo.setId(amountId);
+                            amountInfo.setCreateById(userDTO.getId());
+                            amountInfo.setCreateTime(new Date());
+                            amountInfo.setUpdateById(userDTO.getId());
+                            amountInfo.setUpdateTime(new Date());
+                            amountInfo.setDelFlag(0);
+                            // 保存基础表信息主键值
+                            amountInfo.setInfoId(dto.getId());
+                            amountInfoMapper.insert(amountInfo);
+                        }
+                    }
+                    //清除专用发票信息
+                    LambdaQueryWrapper<ConsultancyReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                    deleteInfo.eq(ConsultancyReimbursementAmountInfo::getInfoId, dto.getId());
+                    deleteInfo.ne(ConsultancyReimbursementAmountInfo::getReimbursementType, "1");
+                    amountInfoMapper.delete(deleteInfo);
+
+                    // 保存电子发票附件列表信息
+                    if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursementFiles())) {
+                        typeService.updateFiles(dto.getInvoiceReimbursementFiles(), userDTO, dto.getId(),"invoiceReimbursement");
+                    }
+                }
+            }
+            // 修改附件信息列表
+            if (CollectionUtils.isNotEmpty(dto.getFiles())) {
+                typeService.updateFiles(dto.getFiles(), userDTO, dto.getId(),"cwWorkContract");
+            }
+            //修改文件补充信息
+            ConsultancyReimbursementFileSupplement fileSupplement = new ConsultancyReimbursementFileSupplement();
+            fileSupplement.setId(dto.getFileSuppleId());
+            fileSupplement.setUpdateById(userDTO.getId());
+            fileSupplement.setUpdateTime(new Date());
+            fileSupplement.setStatus(dto.getFileStatus());
+            consultancyReimbursementFileSupplementMapper.updateById(fileSupplement);
+
+            fileSupplement.setNo(info.getNo());
+            return fileSupplement;
+        } else {
+            // 生成id
+            String id = UUID.randomUUID().toString().replace("-", "");
+            ConsultancyReimbursementFileSupplement fileSupplement = new ConsultancyReimbursementFileSupplement();
+            fileSupplement.setId(id);
+            fileSupplement.setCreateById(userDTO.getId());
+            fileSupplement.setCreateTime(new Date());
+            fileSupplement.setUpdateById(userDTO.getId());
+            fileSupplement.setUpdateTime(new Date());
+            fileSupplement.setDelFlag(0);
+            fileSupplement.setStatus(dto.getFileStatus());
+            fileSupplement.setReimbursementId(dto.getId());
+            consultancyReimbursementFileSupplementMapper.insert(fileSupplement);
+            fileSupplement.setNo(info.getNo());
+            return fileSupplement;
+        }
+    }
+
+    /**
+     * 修改文件补充状态
+     * @param dto
+     */
+    public void updateFileStatusById(ConsultancyRetureListDto dto) {
+        consultancyReimbursementFileSupplementMapper.updateFileStatusById(dto.getFileSuppleId(),dto.getFileStatus());
+    }
+
 }

+ 12 - 0
jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalInfo/service/dto/ConsultancyRetureListDto.java

@@ -144,4 +144,16 @@ public class ConsultancyRetureListDto {
      */
     @Excel(name = "付款状态", width = 30, orderNum = "13")
     private String paymentStatus;
+
+    /**
+     * 文件补充
+     */
+    private String fileSuppleId; //文件补充id
+    private String fileStatus;
+    /**
+     * 流程id
+     */
+    private String procInsIdFile;
+    private String taskIdFile;
+    private List<String> auditFileUserIds;
 }

+ 15 - 0
jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalInfo/service/dto/ConsultancySaveInfoDto.java

@@ -104,4 +104,19 @@ public class ConsultancySaveInfoDto extends BaseEntity {
      */
     private String paymentStatus;
 
+    /**
+     * 文件补充
+     */
+    private String fileSuppleId; //文件补充id
+    private String fileStatus;
+    /**
+     * 流程id
+     */
+    private String procInsIdFile;
+
+    /**
+     *
+     */
+    private String processInstanceIdFile;
+
 }

+ 8 - 0
jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalType/mapper/ConsultancyReimbursementTypeMapper.java

@@ -40,4 +40,12 @@ public interface ConsultancyReimbursementTypeMapper extends BaseMapper<Consultan
     List<WorkAttachmentInfo> findList(@Param("id") String id);
     @InterceptorIgnore(tenantLine = "true")
     Integer findIsExit(@Param("id") String id, @Param("name")String name);
+    /**
+     * 根据AttachmentFla 和AttachmentId 查询附件信息
+     * @param id
+     * @param attachmentFlag
+     * @return
+     */
+    List<WorkAttachmentInfo> findListByIdAndAttachmentFlag(@Param("id") String id, @Param("attachmentFlag")String attachmentFlag);
+
 }

+ 3 - 0
jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalType/mapper/xml/ConsultancyReimbursementTypeMapper.xml

@@ -39,6 +39,9 @@
     <select id="findList" resultType="com.jeeplus.sys.domain.WorkAttachmentInfo">
 		SELECT * FROM work_attachment WHERE del_flag = 0 AND attachment_id = #{id}
 	</select>
+	<select id="findListByIdAndAttachmentFlag" resultType="com.jeeplus.sys.domain.WorkAttachmentInfo">
+		SELECT * FROM work_attachment WHERE del_flag = 0 AND attachment_id = #{id} and attachment_flag = #{attachmentFlag}
+	</select>
 	<select id="findIsExit" resultType="java.lang.Integer">
 		SELECT
 			COUNT( 0 )

+ 1 - 1
jeeplus-modules/jeeplus-consult/src/main/java/com/jeeplus/consultancy/approvalType/service/ConsultancyReimbursementTypeService.java

@@ -252,7 +252,7 @@ public class ConsultancyReimbursementTypeService {
             names = names + "," +dto.getUrl();
         }
         //查询保存的附件信息
-        List<WorkAttachmentInfo> infoList = mapper.findList(id);
+        List<WorkAttachmentInfo> infoList = mapper.findListByIdAndAttachmentFlag(id,attachmentFlag);
         if (CollectionUtils.isNotEmpty(infoList)) {
             for (WorkAttachmentInfo i : infoList) {
                 if (!names.contains(i.getUrl())) {

+ 49 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/controller/CwReimbursementInfoController.java

@@ -11,6 +11,7 @@ import com.jeeplus.common.excel.annotation.ExportMode;
 import com.jeeplus.common.utils.ResponseUtil;
 import com.jeeplus.finance.invoice.util.EasyPoiUtil;
 import com.jeeplus.finance.projectRecords.domain.CwProjectRecords;
+import com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.CwReimbursementFileSupplement;
 import com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.CwReimbursementInfo;
 import com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.CwReimbursementInfoUpHi;
 import com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo;
@@ -77,6 +78,12 @@ public class CwReimbursementInfoController {
                     i.setAuditUserIds(flowTaskService.getTaskAuditUsers(i.getTaskId()));  // 获取数据审核人
                 }
             }
+            //文件补充
+            if (StringUtils.isNotBlank(i.getTaskIdFile()) && StringUtils.isNotBlank(i.getFileStatus())) {
+                if ("2".equals(i.getFileStatus())) { // “审核中”的数据要获取数据审核人
+                    i.setAuditFileUserIds(flowTaskService.getTaskAuditUsers(i.getTaskIdFile()));  // 获取数据审核人
+                }
+            }
         });
         return ResponseEntity.ok(iPage);
     }
@@ -464,4 +471,46 @@ public class CwReimbursementInfoController {
     public void disposeElectronicEngineeringInvoice(){
         service.disposeElectronicEngineeringInvoice();
     }
+
+    /**
+     * 查询文件补充
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "查询文件补充")
+    @GetMapping("/findFileById")
+    public ResponseEntity<SaveInfoDto> findFileById(@RequestParam String id) throws Exception{
+        SaveInfoDto dto = service.findFileById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 新增/修改 文件补充
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "新增、修改 文件补充")
+    @PostMapping("/saveFile")
+    public ResponseEntity<String> saveFile(@RequestBody SaveInfoDto dto) throws Exception{
+        CwReimbursementFileSupplement s = service.saveFile(dto);
+        return ResponseUtil.newInstance().add("businessTable", "cw_reimbursement_file_supplement")
+                .add("businessId", s.getId())
+                .add("no", s.getNo())
+                .ok ("操作成功");
+    }
+
+    /**
+     * 根据id修改文件补充状态status
+     */
+    @ApiOperation(value = "根据id修改文件补充状态status")
+    @PostMapping(value = "updateFileStatusById")
+    public void updateFileStatusById(@RequestBody RetureListDto dto) {
+        service.updateFileStatusById(dto);
+    }
+
+
+
+
+
+
 }

+ 32 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/domain/CwReimbursementFileSupplement.java

@@ -0,0 +1,32 @@
+package com.jeeplus.finance.reimbursementApproval.approvalInfo.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 财务-报销文件补充
+ */
+@Data
+@TableName(value = "cw_reimbursement_file_supplement")
+public class CwReimbursementFileSupplement extends BaseEntity {
+
+    private String reimbursementId; //报销id
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     *
+     */
+    private String processDefinitionId;
+
+    private String status;
+    @TableField(exist = false)
+    private String no; //报销编号
+    @TableField(exist = false)
+    private String taskIdFile;
+
+}

+ 13 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/mapper/CwReimbursementFileSupplementMapper.java

@@ -0,0 +1,13 @@
+package com.jeeplus.finance.reimbursementApproval.approvalInfo.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.CwReimbursementFileSupplement;
+import org.apache.ibatis.annotations.Param;
+
+public interface CwReimbursementFileSupplementMapper extends BaseMapper<CwReimbursementFileSupplement> {
+    //根据报销id查询文件补充信息
+    CwReimbursementFileSupplement getByReimId(@Param("id") String id);
+
+    //修改文件补充状态
+    void updateFileStatusById(@Param("fileSuppleId") String fileSuppleId, @Param("fileStatus") String fileStatus);
+}

+ 22 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/mapper/xml/CwReimbursementFileSupplementMapper.xml

@@ -0,0 +1,22 @@
+<?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="com.jeeplus.finance.reimbursementApproval.approvalInfo.mapper.CwReimbursementFileSupplementMapper">
+    <select id="getByReimId" resultType="com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.CwReimbursementFileSupplement">
+        select
+            crsf.id,
+            crsf.create_by_id,
+            crsf.status,
+            crsf.proc_ins_id,
+            crsf.process_definition_id,
+            fsact.ID_ as taskIdFile
+        from cw_reimbursement_file_supplement crsf
+        LEFT JOIN act_ru_task fsact ON crsf.proc_ins_id = fsact.PROC_INST_ID_
+        where crsf.reimbursement_id = #{id}
+        order by crsf.create_time DESC limit 1
+    </select>
+
+    <update id="updateFileStatusById">
+        update cw_reimbursement_file_supplement set status = #{fileStatus} where id = #{fileSuppleId}
+    </update>
+
+</mapper>

+ 242 - 1
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/service/CwReimbursementInfoService.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jeeplus.common.TokenProvider;
 import com.jeeplus.core.query.QueryWrapperGenerator;
@@ -88,6 +89,9 @@ public class CwReimbursementInfoService {
     @Resource
     private CwReimbursementInfoUpHiMapper cwReimbursementInfoUpHiMapper;
 
+    @Resource
+    private CwReimbursementFileSupplementMapper cwReimbursementFileSupplementMapper;
+
     /**
      * 报告号查询
      */
@@ -271,7 +275,14 @@ public class CwReimbursementInfoService {
                     item.setDeptName(office);
                 }
             }
-
+            //文件补充
+            CwReimbursementFileSupplement reimbursementFileSupplement = cwReimbursementFileSupplementMapper.getByReimId(item.getId());
+            if (ObjectUtils.isNotEmpty(reimbursementFileSupplement)){
+                item.setFileStatus(reimbursementFileSupplement.getStatus());
+                item.setFileSuppleId(reimbursementFileSupplement.getId());
+                item.setProcInsIdFile(reimbursementFileSupplement.getProcInsId());
+                item.setTaskIdFile(reimbursementFileSupplement.getTaskIdFile());
+            }
         });
         return list;
     }
@@ -1295,4 +1306,234 @@ public class CwReimbursementInfoService {
         }
         return map;
     }
+
+    /**
+     * 根据id查询文件补充信息
+     * @param id
+     * @return
+     */
+    public SaveInfoDto findFileById(String id) {
+        SaveInfoDto dto = new SaveInfoDto();
+        String reimId = "";
+        //查询文件补充信息
+        CwReimbursementFileSupplement supplement = cwReimbursementFileSupplementMapper.selectById(id);
+        //获取报销id
+        if (ObjectUtils.isNotEmpty(supplement)){
+            dto.setFileSuppleId(supplement.getId());
+            dto.setFileStatus(supplement.getStatus());
+            dto.setProcInsIdFile(supplement.getProcInsId());
+            reimId = supplement.getReimbursementId();
+        }else {
+            dto.setFileSuppleId("");
+            dto.setFileStatus("0");
+            dto.setProcInsIdFile("");
+            reimId = id;
+        }
+        // 查询基础信息表
+        CwReimbursementInfo info = infoMapper.selectById(reimId);
+        if (ObjectUtil.isNotEmpty(info)){
+            BeanUtils.copyProperties(info, dto);
+            if(StringUtils.isNotBlank(info.getDepartment())) {
+                OfficeDTO byId = SpringUtil.getBean ( IOfficeApi.class ).getOfficeById(info.getDepartment());
+                if (ObjectUtil.isNotEmpty(byId)) {
+                    dto.setDepartmentName(byId.getName());
+                }
+            }
+            // 查询详情列表
+//        LambdaQueryWrapper<CwReimbursementDetailInfo> detailInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
+//        detailInfoLambdaQueryWrapper.eq(CwReimbursementDetailInfo::getInfoId, id);
+//        detailInfoLambdaQueryWrapper.orderByAsc(CwReimbursementDetailInfo::getNumber);
+//        List<CwReimbursementDetailInfo> detailInfos = detailInfoMapper.selectList(detailInfoLambdaQueryWrapper);
+            // 项目报销详情
+            List<CwReimbursementDetailInfo> detailList = infoMapper.getDetailList(reimId);
+            detailList.stream().forEach(projectDetail -> {
+                if (StringUtils.isNotBlank(projectDetail.getProjectId())) {
+                    String proName = selectProjectByIds(projectDetail.getProjectId());
+                    projectDetail.setProjectName(proName);
+                } else {
+                    projectDetail.setProjectName("");
+                }
+                if (StringUtils.isBlank(projectDetail.getUserName())){
+                    String name = infoMapper.findUserById(projectDetail.getUserId());
+                    projectDetail.setUserName(name);
+                    String office = infoMapper.findOfficeById(projectDetail.getDeptId());
+                    projectDetail.setDeptName(office);
+                }
+
+            });
+            dto.setDetailInfos(detailList);
+            // 合同报销详情
+            dto.setDetailInfoContracts(infoMapper.getContractDetailList(reimId));
+            // 报告报销详情
+            List<CwReimbursementDetailInfoReport> detailInfoReports=infoMapper.getReportDetailList(reimId);
+            detailInfoReports.stream().forEach(detailInfoReport->{
+                if (StringUtils.isBlank(detailInfoReport.getUserName())){
+                    String name = infoMapper.findUserById(detailInfoReport.getUserId());
+                    detailInfoReport.setUserName(name);
+                    String office = infoMapper.findOfficeById(detailInfoReport.getDeptId());
+                    detailInfoReport.setDeptName(office);
+                }
+            });
+            dto.setDetailInfoReports(detailInfoReports);
+            // 其他报销
+            List<CwReimbursementDetailInfoOther> otherDetailList=infoMapper.getOtherDetailList(reimId);
+            otherDetailList.stream().forEach(other->{
+                if (StringUtils.isBlank(other.getUserName())){
+                    String name = infoMapper.findUserById(other.getUserId());
+                    other.setUserName(name);
+                    String office = infoMapper.findOfficeById(other.getDeptId());
+                    other.setDeptName(office);
+                }
+            });
+            dto.setDetailInfoOthers(otherDetailList);
+            // 采购报销
+            dto.setDetailInfoProcured(infoMapper.getProcuredDetailList(reimId));
+            dto.setHumanInfoProcured(infoMapper.getHumanProcuredDetailList(reimId));
+            // 查询专用发票信息列表
+            // 查询专用发票信息列表
+            LambdaQueryWrapper<CwReimbursementAmountInfo> amountInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            amountInfoLambdaQueryWrapper.eq(CwReimbursementAmountInfo::getInfoId, reimId);
+            amountInfoLambdaQueryWrapper.eq(CwReimbursementAmountInfo::getReimbursementType, "0");
+            List<CwReimbursementAmountInfo> amountInfos = amountInfoMapper.selectList(amountInfoLambdaQueryWrapper);
+            dto.setAmountInfos(amountInfos);
+            LambdaQueryWrapper<CwReimbursementAmountInfo> invoiceReimbursementsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            invoiceReimbursementsLambdaQueryWrapper.eq(CwReimbursementAmountInfo::getInfoId, reimId);
+            invoiceReimbursementsLambdaQueryWrapper.eq(CwReimbursementAmountInfo::getReimbursementType, "1");
+            List<CwReimbursementAmountInfo> invoiceReimbursements = amountInfoMapper.selectList(invoiceReimbursementsLambdaQueryWrapper);
+            dto.setInvoiceReimbursements(invoiceReimbursements);
+            // 查询附件信息
+            List<WorkAttachmentInfo> fileList = infoMapper.findFiles(reimId);
+            List<WorkAttachmentInfo> files = com.google.common.collect.Lists.newArrayList();
+            List<WorkAttachmentInfo> invoiceReimbursementFiles = com.google.common.collect.Lists.newArrayList();
+
+            if (CollectionUtils.isNotEmpty(fileList)) {
+                for (WorkAttachmentInfo i : fileList) {
+                    i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+                    if("invoiceReimbursement".equals(i.getAttachmentFlag())){
+                        invoiceReimbursementFiles.add(i);
+                    }else{
+                        files.add(i);
+                    }
+                }
+            }
+            dto.setFiles(files);
+            dto.setInvoiceReimbursementFiles(invoiceReimbursementFiles);
+        }
+        return dto;
+    }
+
+
+    /**
+     * 新增/修改  文件补充
+     * @param dto
+     * @return
+     * @throws Exception
+     */
+    public CwReimbursementFileSupplement saveFile(SaveInfoDto dto) throws Exception{
+        // 获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken());
+        CwReimbursementInfo info = infoMapper.getById(dto.getId());
+        if (StringUtils.isNotEmpty(dto.getFileSuppleId())) {
+            // 修改专用发票信息列表
+            // 删除原有数据
+            LambdaQueryWrapper<CwReimbursementAmountInfo> amountWrapper = new LambdaQueryWrapper<>();
+            amountWrapper.eq(CwReimbursementAmountInfo::getInfoId, dto.getId());
+            amountInfoMapper.delete(amountWrapper);
+            if(StringUtils.isNotBlank(dto.getReimbursementType())){
+                if("0".equals(dto.getReimbursementType())){
+                    // 保存专用发票列表信息
+                    if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
+                        for (CwReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
+                            //普通报销 发票信息
+                            amountInfo.setReimbursementType("0");
+                            // 生成id
+                            String amountId = UUID.randomUUID().toString().replace("-", "");
+                            amountInfo.setId(amountId);
+                            amountInfo.setCreateById(userDTO.getId());
+                            amountInfo.setCreateTime(new Date());
+                            amountInfo.setUpdateById(userDTO.getId());
+                            amountInfo.setUpdateTime(new Date());
+                            amountInfo.setDelFlag(0);
+                            // 保存基础表信息主键值
+                            amountInfo.setInfoId(dto.getId());
+                            amountInfoMapper.insert(amountInfo);
+                        }
+                    }
+                    //清除电子发票信息
+                    // 删除合同列表
+                    LambdaQueryWrapper<CwReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                    deleteInfo.eq(CwReimbursementAmountInfo::getInfoId, dto.getId());
+                    deleteInfo.ne(CwReimbursementAmountInfo::getReimbursementType, "0");
+                    amountInfoMapper.delete(deleteInfo);
+                }else if("1".equals(dto.getReimbursementType())){
+                    // 保存电子发票列表信息
+                    if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursements())) {
+                        for (CwReimbursementAmountInfo amountInfo : dto.getInvoiceReimbursements()) {
+                            //电子发票报销 发票信息
+                            amountInfo.setReimbursementType("1");
+                            // 生成id
+                            String amountId = UUID.randomUUID().toString().replace("-", "");
+                            amountInfo.setId(amountId);
+                            amountInfo.setCreateById(userDTO.getId());
+                            amountInfo.setCreateTime(new Date());
+                            amountInfo.setUpdateById(userDTO.getId());
+                            amountInfo.setUpdateTime(new Date());
+                            amountInfo.setDelFlag(0);
+                            // 保存基础表信息主键值
+                            amountInfo.setInfoId(dto.getId());
+                            amountInfoMapper.insert(amountInfo);
+                        }
+                    }
+                    //清除专用发票信息
+                    LambdaQueryWrapper<CwReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                    deleteInfo.eq(CwReimbursementAmountInfo::getInfoId, dto.getId());
+                    deleteInfo.ne(CwReimbursementAmountInfo::getReimbursementType, "1");
+                    amountInfoMapper.delete(deleteInfo);
+
+                    // 保存电子发票附件列表信息
+                    if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursementFiles())) {
+                        infoService.updateFiles(dto.getInvoiceReimbursementFiles(), userDTO, dto.getId(),"invoiceReimbursement");
+                    }
+                }
+            }
+            // 修改附件信息列表
+            if (CollectionUtils.isNotEmpty(dto.getFiles())) {
+                infoService.updateFiles(dto.getFiles(), userDTO, dto.getId(),"reimbursement");
+            }
+            //修改文件补充信息
+            CwReimbursementFileSupplement fileSupplement = new CwReimbursementFileSupplement();
+            fileSupplement.setId(dto.getFileSuppleId());
+            fileSupplement.setUpdateById(userDTO.getId());
+            fileSupplement.setUpdateTime(new Date());
+            fileSupplement.setStatus(dto.getFileStatus());
+            cwReimbursementFileSupplementMapper.updateById(fileSupplement);
+
+            fileSupplement.setNo(info.getNo());
+            return fileSupplement;
+        } else {
+            // 生成id
+            String id = UUID.randomUUID().toString().replace("-", "");
+            CwReimbursementFileSupplement fileSupplement = new CwReimbursementFileSupplement();
+            fileSupplement.setId(id);
+            fileSupplement.setCreateById(userDTO.getId());
+            fileSupplement.setCreateTime(new Date());
+            fileSupplement.setUpdateById(userDTO.getId());
+            fileSupplement.setUpdateTime(new Date());
+            fileSupplement.setDelFlag(0);
+            fileSupplement.setStatus(dto.getFileStatus());
+            fileSupplement.setReimbursementId(dto.getId());
+            cwReimbursementFileSupplementMapper.insert(fileSupplement);
+            fileSupplement.setNo(info.getNo());
+            return fileSupplement;
+        }
+    }
+
+    /**
+     * 修改文件补充状态
+     * @param dto
+     */
+    public void updateFileStatusById(RetureListDto dto) {
+        cwReimbursementFileSupplementMapper.updateFileStatusById(dto.getFileSuppleId(),dto.getFileStatus());
+    }
+
 }

+ 12 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/service/dto/RetureListDto.java

@@ -155,4 +155,16 @@ public class RetureListDto {
     @Excel(name = "付款状态", width = 30, orderNum = "13")
     private String paymentStatus;
 
+    /**
+     * 文件补充
+     */
+    private String fileSuppleId; //文件补充id
+    private String fileStatus;
+    /**
+     * 流程id
+     */
+    private String procInsIdFile;
+    private String taskIdFile;
+    private List<String> auditFileUserIds;
+
 }

+ 16 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/service/dto/SaveInfoDto.java

@@ -107,4 +107,20 @@ public class SaveInfoDto extends BaseEntity {
      */
     private String paymentStatus;
 
+    /**
+     * 文件补充
+     */
+    private String fileSuppleId; //文件补充id
+    private String fileStatus;
+    /**
+     * 流程id
+     */
+    private String procInsIdFile;
+
+    /**
+     *
+     */
+    private String processInstanceIdFile;
+
+
 }