Browse Source

代码提交

wangqiang 1 year ago
parent
commit
e5eb0c3fd9
100 changed files with 10997 additions and 0 deletions
  1. 332 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/controller/FinanceInvoiceController.java
  2. 188 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/domain/FinanceInvoice.java
  3. 63 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/domain/FinanceInvoiceBase.java
  4. 63 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/domain/FinanceInvoiceDetail.java
  5. 43 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/domain/FinanceInvoiceInvalid.java
  6. 50 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/domain/FinanceInvoiceReceivables.java
  7. 17 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/FinanceInvoiceBaseMapper.java
  8. 17 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/FinanceInvoiceDetailMapper.java
  9. 19 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/FinanceInvoiceInvalidMapper.java
  10. 34 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/FinanceInvoiceMapper.java
  11. 17 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/FinanceInvoiceReceivablesMapper.java
  12. 42 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/FinanceInvoiceBaseMapper.xml
  13. 42 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/FinanceInvoiceDetailMapper.xml
  14. 34 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/FinanceInvoiceInvalidMapper.xml
  15. 235 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/FinanceInvoiceMapper.xml
  16. 36 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/FinanceInvoiceReceivablesMapper.xml
  17. 664 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/FinanceInvoiceService.java
  18. 9 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/FinanceDTO.java
  19. 81 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/FinanceInvoiceBaseDTO.java
  20. 313 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/FinanceInvoiceDTO.java
  21. 72 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/FinanceInvoiceDetailDTO.java
  22. 41 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/FinanceInvoiceInvalidDTO.java
  23. 52 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/FinanceInvoiceReceivablesDTO.java
  24. 15 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/mapstruct/FinanceInvoiceBaseWrapper.java
  25. 15 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/mapstruct/FinanceInvoiceDetailWrapper.java
  26. 15 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/mapstruct/FinanceInvoiceInvalidWrapper.java
  27. 15 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/mapstruct/FinanceInvoiceReceivablesWrapper.java
  28. 15 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/mapstruct/FinanceInvoiceWrapper.java
  29. 653 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/controller/ProjectListController.java
  30. 183 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/domain/ProgramArchive.java
  31. 88 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/domain/ProgramAudit.java
  32. 30 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/domain/ProgramAuditAssessPeople.java
  33. 45 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/domain/ProgramMembers.java
  34. 30 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/domain/ProgramProjectListLink.java
  35. 23 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/domain/ProgramProjectListMember.java
  36. 31 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/domain/ProgramReportNo.java
  37. 27 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProgramArchiveMapper.java
  38. 17 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProgramAuditAssessPeopleMapper.java
  39. 33 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProgramAuditMapper.java
  40. 17 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProgramMembersMapper.java
  41. 26 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProgramReportNoMapper.java
  42. 15 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProjectLinkMapper.java
  43. 78 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProjectListMapper.java
  44. 13 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProjectMemberMapper.java
  45. 176 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProgramArchiveMapper.xml
  46. 30 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProgramAuditAssessPeopleMapper.xml
  47. 115 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProgramAuditMapper.xml
  48. 27 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProgramMembersMapper.xml
  49. 34 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProgramReportNoMapper.xml
  50. 9 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProjectLinkMapper.xml
  51. 859 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProjectListMapper.xml
  52. 9 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProjectMemberMapper.xml
  53. 14 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/ProgramMembersService.java
  54. 1614 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/ProjectListService.java
  55. 14 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ContractDto.java
  56. 177 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ExportFileDto.java
  57. 236 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ProgramArchiveDto.java
  58. 28 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ProgramAuditAssessPeopleDto.java
  59. 111 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ProgramAuditDto.java
  60. 45 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ProgramMembersDto.java
  61. 32 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ProgramReportNoDto.java
  62. 166 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ProjectListDto.java
  63. 15 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/mapstruct/ProgramArchiveWrapper.java
  64. 15 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/mapstruct/ProgramAuditAssessPeopleWrapper.java
  65. 15 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/mapstruct/ProgramAuditWrapper.java
  66. 15 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/mapstruct/ProgramMembersWrapper.java
  67. 141 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/typeDict/controller/ProgramTypeDictController.java
  68. 38 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/typeDict/domain/ProgramTypeDict.java
  69. 31 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/typeDict/mapper/ProgramTypeDictMapper.java
  70. 75 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/typeDict/mapper/xml/ProgramTypeDictMapper.xml
  71. 71 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/typeDict/service/ProgramTypeDictService.java
  72. 43 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/typeDict/service/dto/ProgramTypeDictDTO.java
  73. 15 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/typeDict/service/mapstruct/ProgramTypeDictWrapper.java
  74. 122 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/serviceType/controller/ProgramServiceTypeController.java
  75. 46 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/serviceType/domain/ProgramServiceType.java
  76. 30 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/serviceType/mapper/ProgramServiceTypeMapper.java
  77. 80 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/serviceType/mapper/xml/ProgramServiceTypeMapper.xml
  78. 80 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/serviceType/service/ProgramServiceTypeService.java
  79. 50 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/serviceType/service/dto/ProgramServiceTypeDTO.java
  80. 15 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/serviceType/service/mapstruct/ProgramServiceTypeWrapper.java
  81. 323 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/Utils/EasyPoiUtil.java
  82. 72 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/Utils/ExcelDiceAddressListHandlerImpl.java
  83. 42 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/constant/enums/ProjectStatusEnum.java
  84. 38 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/constant/enums/ProjectTypeEnum.java
  85. 38 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/constant/enums/YesOrNoEnum.java
  86. 927 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/controller/ProjectController.java
  87. 246 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/domain/Project.java
  88. 35 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/ProjectMapper.java
  89. 34 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/dto/FileUploadListDTO.java
  90. 281 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/dto/ProjectDTO.java
  91. 14 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/mapstruct/ProjectWrapper.java
  92. 57 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/controller/ProofreadInfoController.java
  93. 67 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/controller/ProofreadIssuedController.java
  94. 90 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/controller/ProofreadTypeController.java
  95. 54 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/domain/ProofreadDetail.java
  96. 43 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/domain/ProofreadInfo.java
  97. 137 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/domain/ProofreadIssued.java
  98. 41 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/domain/ProofreadType.java
  99. 17 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/mapper/ProofreadDetailMapper.java
  100. 0 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/mapper/ProofreadInfoMapper.java

+ 332 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/controller/FinanceInvoiceController.java

@@ -0,0 +1,332 @@
+package com.jeeplus.finance.invoice.controller;
+
+import cn.hutool.log.Log;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.aop.demo.annotation.DemoMode;
+import com.jeeplus.common.excel.ExcelOptions;
+import com.jeeplus.common.excel.ExportMode;
+import com.jeeplus.common.utils.ResponseUtil;
+import com.jeeplus.finance.invoice.service.FinanceInvoiceService;
+import com.jeeplus.finance.invoice.service.dto.FinanceDTO;
+import com.jeeplus.finance.invoice.service.dto.FinanceInvoiceDTO;
+import com.jeeplus.finance.invoice.service.dto.FinanceInvoiceDetailDTO;
+import com.jeeplus.finance.projectRecords.Utils.EasyPoiUtil;
+import com.jeeplus.logging.annotation.ApiLog;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.log4j.Log4j2;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Type;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Api("财务管理-发票")
+@RestController
+@RequestMapping(value = "/finance/invoice")
+@Log4j2
+public class FinanceInvoiceController {
+
+    @Resource
+    private FinanceInvoiceService financeInvoiceService;
+
+    /**
+     * 查询发票列表
+     * @param financeInvoiceDTO
+     * @param page
+     * @return
+     * @throws Exception
+     */
+    @ApiLog("查询发票列表")
+    @PreAuthorize("hasAuthority('finance:invoice:list')")
+    @GetMapping("list")
+    public ResponseEntity<IPage<FinanceInvoiceDTO>> data(FinanceInvoiceDTO financeInvoiceDTO, Page<FinanceInvoiceDTO> page) throws Exception {
+        IPage<FinanceInvoiceDTO> result = new Page<FinanceInvoiceDTO>();
+        result = financeInvoiceService.findList (page,financeInvoiceDTO);
+        return ResponseEntity.ok (result);
+    }
+
+    /**
+     * 查询发票数据
+     * @param id
+     * @return
+     */
+    @ApiLog("查询发票数据")
+    @PreAuthorize ("hasAnyAuthority('finance:invoice:view','finance:invoice:add','finance:invoice:edit')")
+    @GetMapping("queryById")
+    public ResponseEntity queryById(@RequestParam("id") String id) {
+        FinanceInvoiceDTO financeInvoiceDTO = financeInvoiceService.queryById ( id );
+        return ResponseEntity.ok (financeInvoiceDTO);
+    }
+
+    /**
+     * 查询发票号是否存在
+     * @param number
+     * @return
+     */
+    @ApiLog("查询发票号是否存在")
+    @GetMapping("queryByNumber")
+    public ResponseEntity queryByNumber(@RequestParam("number") String number, @RequestParam(value="id", required = false) String id) {
+        Boolean bool = financeInvoiceService.queryByNumber ( number, id );
+        return ResponseEntity.ok (bool);
+    }
+
+    /**
+     * 保存发票数据
+     * @param financeInvoiceDTO
+     * @return
+     */
+    @ApiLog(value = "修改/新增发票数据")
+    @PreAuthorize("hasAnyAuthority('finance:invoice:add','finance:invoice:edit')")
+    @PostMapping("save")
+    public ResponseEntity save(@Valid @RequestBody FinanceInvoiceDTO financeInvoiceDTO) throws Exception {
+        financeInvoiceService.saveInvoice(financeInvoiceDTO);
+        return ResponseEntity.ok ("操作成功");
+    }
+
+    /**
+     * 保存发票数据-流程
+     * @param financeInvoiceDTO
+     * @return
+     */
+    @ApiLog(value = "保存发票数据-流程")
+    @PreAuthorize("hasAnyAuthority('finance:invoice:add','finance:invoice:edit')")
+    @PostMapping("saveForm")
+    public ResponseEntity saveForm(@Valid @RequestBody FinanceInvoiceDTO financeInvoiceDTO) throws Exception {
+        String id = financeInvoiceService.saveForm(financeInvoiceDTO);
+        return ResponseUtil.newInstance().add("businessTable", "finance_invoice").add("businessId", id).ok ("操作成功");
+    }
+
+    /**
+     * 作废发票数据-流程
+     * @param financeInvoiceDTO
+     * @return
+     */
+    @ApiLog(value = "作废发票数据-流程")
+    @PreAuthorize("hasAnyAuthority('finance:invoice:add','finance:invoice:edit')")
+    @PostMapping("saveFormInvalid")
+    public ResponseEntity saveFormInvalid(@Valid @RequestBody FinanceInvoiceDTO financeInvoiceDTO) throws Exception {
+        String id = financeInvoiceService.saveFormInvalid(financeInvoiceDTO);
+        return ResponseUtil.newInstance().add("businessTable", "finance_invoice_invalid").add("businessId", id).ok ("操作成功");
+    }
+
+    /**
+     * 根据发票作废数据的id查询发票id
+     * @param id
+     * @return
+     */
+    @GetMapping("queryIdByInvalidId")
+    @ApiOperation(value = "查询发票号是否存在")
+    public ResponseEntity<FinanceDTO> queryIdByInvalidId(@RequestParam String id) {
+        String businessId = financeInvoiceService.queryIdByInvalidId ( id );
+        FinanceDTO financeDTO = new FinanceDTO();
+        financeDTO.setBusinessId(businessId);
+        return ResponseEntity.ok(financeDTO);
+    }
+
+    /**
+     * 删除附件类型
+     * @param ids
+     * @return
+     */
+    @ApiLog(value = "删除附件类型")
+    @PreAuthorize ("hasAuthority('finance:invoice:del')")
+    @DeleteMapping("delete")
+    public ResponseEntity delete(String ids) {
+        return financeInvoiceService.deleteByIds(ids);
+    }
+
+    /**
+     * 根据id修改状态值status
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "根据id修改状态值status")
+    @PostMapping(value = "/updateStatusById")
+    public ResponseEntity<String> updateStatusById(@RequestBody FinanceInvoiceDTO dto) {
+        String s = financeInvoiceService.updateStatusById(dto);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 确认收款
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "确认收款")
+    @PostMapping(value = "/isReceivables")
+    public ResponseEntity<String> isReceivables(@RequestBody FinanceInvoiceDTO dto) {
+        String s = financeInvoiceService.isReceivables(dto);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 下载发票明细导入模板
+     *
+     * @param response
+     * @return
+     */
+    @GetMapping("/importDetail/template")
+    @ApiOperation(value = "下载模板")
+    public void importFileTemplate(HttpServletResponse response, HttpServletRequest request) {
+        try {
+            InputStream inputStream = this.getClass().getResourceAsStream("/dot/发票明细导入模板.xlsx");
+            //强制下载不打开
+            response.setContentType("application/force-download");
+            OutputStream out = response.getOutputStream();
+            //使用URLEncoder来防止文件名乱码或者读取错误
+            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("finance_invoice_detail_template.xlsx", "UTF-8"));
+            int b = 0;
+            byte[] buffer = new byte[1000000];
+            while (b != -1) {
+                b = inputStream.read(buffer);
+                if (b != -1) out.write(buffer, 0, b);
+            }
+            inputStream.close();
+            out.close();
+            out.flush();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 导入发票明细数据
+     *
+     * @return
+     */
+    @DemoMode
+    @PostMapping("/importDetail")
+    @ApiLog(value = "导入发票明细数据excel")
+    public ResponseEntity importDetail(MultipartFile file, HttpServletRequest request) throws IOException {
+
+        ArrayList<FinanceInvoiceDetailDTO> arrayList = new ArrayList<>();
+        HashMap<String,String> hashMap = new HashMap<>();
+
+        List<FinanceInvoiceDetailDTO> listA = new ArrayList<>();
+        //获取sheet
+        listA = EasyPoiUtil.importExcel(file, 0, 1, FinanceInvoiceDetailDTO.class);
+        //去除excel中的空行
+        listA = getExcelList(listA);
+        //导入前检测数据
+        String resultA = financeInvoiceService.importDecide(listA, arrayList, hashMap);
+        if(StringUtils.isNotBlank(resultA)){
+            //有返回值,说明导入的数据不正确。向用户抛提示
+            return ResponseEntity.badRequest().body  (resultA);
+        }
+        //判断文件中是否有重复的发票号
+        if(hashMap.size() != listA.size()){
+            return ResponseEntity.badRequest().body  ("文件中存在重复的发票号");
+        }
+
+        return ResponseEntity.ok(arrayList);
+    }
+
+    /**
+     * 去除excel中的空行
+     * @param list
+     * @return
+     */
+    public ArrayList<FinanceInvoiceDetailDTO> getExcelList(List<FinanceInvoiceDetailDTO> list){
+
+        ArrayList<FinanceInvoiceDetailDTO> financeInvoiceDetailDTOS = new ArrayList<>();
+
+        list.stream().forEach(item->{
+            if(objectCheckIsNull(item)){
+                financeInvoiceDetailDTOS.add(item);
+            }
+        });
+
+        return financeInvoiceDetailDTOS;
+    }
+
+    public static boolean objectCheckIsNull(Object object) {
+        boolean flag = false; //定义返回结果,默认为true
+
+        if (Objects.isNull(object)) {
+            flag = false;
+        } else {
+            Class clazz = (Class) object.getClass(); // 得到类对象
+            Field fields[] = clazz.getDeclaredFields(); // 得到所有属性
+            for (Field field : fields) {
+                if("serialVersionUID".equals(field.getName()) || "BIZ_CODE".equalsIgnoreCase(field.getName())){
+                    continue;
+                }
+                field.setAccessible(true);
+                Object fieldValue = null;
+                try {
+                    fieldValue = field.get(object); //得到属性值
+                    Type fieldType = field.getGenericType();//得到属性类型
+                    String fieldName = field.getName(); // 得到属性名
+                    log.info("属性类型:" + fieldType + ",属性名:" + fieldName + ",属性值:" + fieldValue);
+                } catch (IllegalArgumentException e) {
+                    log.error(e.getMessage(), e);
+                } catch (IllegalAccessException e) {
+                    log.error(e.getMessage(), e);
+                }
+                if (fieldValue != null && fieldValue != "") {  //只要有一个属性值不为null 就返回false 表示对象不为null
+                    flag = true;
+                    break;
+                }
+            }
+        }
+
+        return flag;
+    }
+
+    /**
+     * 导出
+     *
+     * @param financeInvoiceDTO
+     * @param response
+     * @throws Exception
+     */
+//    @GetMapping("/exportFile")
+//    @ApiOperation(value = "导出")
+//    public void exportList(FinanceInvoiceDTO financeInvoiceDTO,Page<FinanceInvoiceDTO> page, HttpServletResponse response) throws Exception {
+//        List<FinanceInvoiceDTO> infos = financeInvoiceService.exportList(page,financeInvoiceDTO);
+//        EasyPoiUtil.exportExcel(infos, "发票列表数据",  "发票列表数据", FinanceInvoiceDTO.class, "发票数据导出", response );
+//    }
+
+
+
+    @ApiLog(value = "导出发票数据")
+    @GetMapping("export")
+    // @PreAuthorize ("hasAuthority('finance:invoice:export')")
+    @ApiOperation(value = "导出发票数据")
+    public void exportFile(FinanceInvoiceDTO financeInvoiceDTO, Page <FinanceInvoiceDTO> page, ExcelOptions options, HttpServletResponse response) throws Exception {
+        String fileName = options.getFilename();
+        String sheetName = options.getSheetName();
+        List<FinanceInvoiceDTO> result = new ArrayList<>();
+        if ( ExportMode.current.equals ( options.getMode() ) ) {
+            result = financeInvoiceService.findList (page,financeInvoiceDTO).getRecords();
+        } else if (ExportMode.selected.equals ( options.getMode() )) {
+            result = financeInvoiceService.findList (page,financeInvoiceDTO).getRecords().stream ( ).filter ( item ->
+                    options.getSelectIds ( ).contains ( item.getId ( ) )
+            ).collect ( Collectors.toList ( ) );
+        } else {
+            page.setSize (-1);
+            page.setCurrent (0);
+            result = financeInvoiceService.findList (page,financeInvoiceDTO).getRecords();
+        }
+        EasyPoiUtil.exportExcel ( result, sheetName,  sheetName, FinanceInvoiceDTO.class, fileName, response );
+
+    }
+}

+ 188 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/domain/FinanceInvoice.java

@@ -0,0 +1,188 @@
+package com.jeeplus.finance.invoice.domain;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.core.query.Query;
+import com.jeeplus.core.query.QueryType;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 财务管理-发票
+ * @TableName finance_invoice
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("finance_invoice")
+public class FinanceInvoice extends BaseEntity {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 发票类型
+     */
+    @Query(tableColumn = "fi.type",type = QueryType.EQ)
+    private String type;
+
+    /**
+     * 发票申请编号
+     */
+    @Query(tableColumn = "fi.no",type = QueryType.LIKE)
+    private String no;
+
+    /**
+     * 开票类型
+     */
+    private String billingType;
+
+    /**
+     * 实际开票单位
+     */
+    @Query(tableColumn = "fi.billing_workplace_real",type = QueryType.LIKE)
+    private String billingWorkplaceReal;
+
+    /**
+     * 纳税人识别号
+     */
+    private String taxpayerIdentificationNo;
+
+    /**
+     * 地址
+     */
+    private String address;
+
+    /**
+     * 电话
+     */
+    private String telPhone;
+
+    /**
+     * 开户银行
+     */
+    private String openBank;
+
+    /**
+     * 银行账号
+     */
+    private String bankAccount;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 收款类型
+     */
+    @Query(tableColumn = "fi.receivables_type",type = QueryType.EQ)
+    private String receivablesType;
+
+    /**
+     * 开票内容
+     */
+    @Query(tableColumn = "fi.billing_content",type = QueryType.EQ)
+    private String billingContent;
+
+    /**
+     * 发票金额(元)
+     */
+    private String account;
+
+    /**
+     * 开票内容要求
+     */
+    private String billingContentTerms;
+
+    /**
+     * 开票人
+     */
+    private String billingPeople;
+
+    /**
+     * 开票时间
+     */
+    private Date billingDate;
+
+    /**
+     * 领票时间
+     */
+    private Date collectDate;
+
+    /**
+     * 实际开票人
+     */
+    private String billingPeopleReal;
+
+    /**
+     * 对账人
+     */
+    @Query(tableColumn = "fi.reconciliation_people",type = QueryType.EQ)
+    private String reconciliationPeople;
+
+    /**
+     * 实际开票单位id
+     */
+    @Query(tableColumn = "fi.billing_workplace_real_id",type = QueryType.EQ)
+    private String billingWorkplaceRealId;
+
+    /**
+     * 开票人id
+     */
+    private String billingPeopleId;
+
+    /**
+     * 对账地区
+     */
+    @Query(tableColumn = "fi.reconciliation_area",type = QueryType.EQ)
+    private String reconciliationArea;
+
+    /**
+     * 状态
+     */
+    @Query(tableColumn = "fi.status",type = QueryType.EQ)
+    private String status;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     * 流程信息
+     */
+    private String processDefinitionId;
+
+    /**
+     * 是否确认收款
+     */
+    @Query(tableColumn = "fi.receivables_status",type = QueryType.EQ)
+    private String receivablesStatus;
+
+    /**
+     * 是否作废
+     */
+    @Query(tableColumn = "fi.invalid_status",type = QueryType.EQ)
+    private String invalidStatus;
+
+    /**
+     * 收款日期
+     */
+    private Date receivablesDate;
+
+    /**
+     * 是否多张开票  1是  0否
+     */
+    private String isMultiple;
+
+    /**
+     * 邮箱账号
+     */
+    private String actualDrawerEmailAddress;
+
+    private static final long serialVersionUID = 1L;
+}

+ 63 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/domain/FinanceInvoiceBase.java

@@ -0,0 +1,63 @@
+package com.jeeplus.finance.invoice.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 财务管理-发票基本信息
+ * @TableName finance_invoice_base
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("finance_invoice_base")
+public class FinanceInvoiceBase extends BaseEntity {
+
+    /**
+     * 发票id
+     */
+    private String invoiceId;
+
+    /**
+     * 项目名称
+     */
+    private String programName;
+
+    /**
+     * 项目id
+     */
+    private String programId;
+
+    /**
+     * 合同名称
+     */
+    private String contractName;
+
+    /**
+     * 项目所在地
+     */
+    private String location;
+
+    /**
+     * 项目编号
+     */
+    private String programNo;
+
+    /**
+     * 委托方
+     */
+    private String clientName;
+
+    /**
+     * 委托方id
+     */
+    private String clientId;
+
+    /**
+     * 报告号
+     */
+    private String reportNo;
+
+    private static final long serialVersionUID = 1L;
+}

+ 63 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/domain/FinanceInvoiceDetail.java

@@ -0,0 +1,63 @@
+package com.jeeplus.finance.invoice.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 财务管理-发票明细
+ * @TableName finance_invoice_detail
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("finance_invoice_detail")
+public class FinanceInvoiceDetail extends BaseEntity {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 发票id
+     */
+    private String invoiceId;
+
+    /**
+     * 发票代码
+     */
+    private String code;
+
+    /**
+     * 发票号
+     */
+    private String number;
+
+    /**
+     * 开票金额(元)
+     */
+    private String account;
+
+    /**
+     * 税率
+     */
+    private String rate;
+
+    /**
+     * 金额
+     */
+    private String amount;
+
+    /**
+     * 税额
+     */
+    private String tax;
+
+    /**
+     * 累计登记金额
+     */
+    private String allAmount;
+
+    private static final long serialVersionUID = 1L;
+}

+ 43 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/domain/FinanceInvoiceInvalid.java

@@ -0,0 +1,43 @@
+package com.jeeplus.finance.invoice.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 财务管理-发票-发票作废
+ * @TableName finance_invoice_invalid
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("finance_invoice_invalid")
+public class FinanceInvoiceInvalid extends BaseEntity {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 发票id
+     */
+    private String invoiceId;
+
+    /**
+     * 是否作废
+     */
+    private String invalidStatus;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     * 流程信息
+     */
+    private String processDefinitionId;
+
+    private static final long serialVersionUID = 1L;
+}

+ 50 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/domain/FinanceInvoiceReceivables.java

@@ -0,0 +1,50 @@
+package com.jeeplus.finance.invoice.domain;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 财务管理-发票-收款明细
+ * @TableName finance_invoice_receivables
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("finance_invoice_receivables")
+public class FinanceInvoiceReceivables extends BaseEntity {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 发票id
+     */
+    private String invoiceId;
+
+    /**
+     * 汇款单位
+     */
+    private String remittanceUnit;
+
+    /**
+     * 汇款金额
+     */
+    private String remittanceAmount;
+
+    /**
+     * 汇款时间
+     */
+    private Date remittanceDate;
+
+    /**
+     * 是否收款
+     */
+    private String status;
+
+    private static final long serialVersionUID = 1L;
+}

+ 17 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/FinanceInvoiceBaseMapper.java

@@ -0,0 +1,17 @@
+package com.jeeplus.finance.invoice.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.invoice.domain.FinanceInvoiceBase;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Entity com.jeeplus.test.finance.invoice.domain.FinanceInvoiceBase
+ */
+@Mapper
+public interface FinanceInvoiceBaseMapper extends BaseMapper<FinanceInvoiceBase> {
+
+}
+
+
+
+

+ 17 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/FinanceInvoiceDetailMapper.java

@@ -0,0 +1,17 @@
+package com.jeeplus.finance.invoice.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.invoice.domain.FinanceInvoiceDetail;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Entity generator.domain.FinanceInvoiceDetail
+ */
+@Mapper
+public interface FinanceInvoiceDetailMapper extends BaseMapper<FinanceInvoiceDetail> {
+
+}
+
+
+
+

+ 19 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/FinanceInvoiceInvalidMapper.java

@@ -0,0 +1,19 @@
+package com.jeeplus.finance.invoice.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.invoice.domain.FinanceInvoiceInvalid;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Entity com.jeeplus.test.finance.invoice.domain.FinanceInvoiceInvalid
+ */
+@Mapper
+//@InterceptorIgnore(tenantLine = "true")
+public interface FinanceInvoiceInvalidMapper extends BaseMapper<FinanceInvoiceInvalid> {
+
+}
+
+
+
+

+ 34 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/FinanceInvoiceMapper.java

@@ -0,0 +1,34 @@
+package com.jeeplus.finance.invoice.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.invoice.domain.FinanceInvoice;
+import com.jeeplus.finance.invoice.service.dto.FinanceInvoiceDTO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @Entity com.jeeplus.test.finance.invoice.domain.FinanceInvoice
+ */
+@Mapper
+//@InterceptorIgnore(tenantLine = "true")
+public interface FinanceInvoiceMapper extends BaseMapper<FinanceInvoice> {
+
+    IPage<FinanceInvoiceDTO> findList(Page<FinanceInvoiceDTO> page, @Param(Constants.WRAPPER) QueryWrapper<FinanceInvoice> queryWrapper);
+    //@InterceptorIgnore(tenantLine = "true")
+    FinanceInvoiceDTO queryById(@Param("id") String id);
+
+    /**
+     * 根据发票id清空发票的收款日期
+     * @param id
+     */
+    void setReceivablesDateNull(@Param("id") String id);
+}
+
+
+
+

+ 17 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/FinanceInvoiceReceivablesMapper.java

@@ -0,0 +1,17 @@
+package com.jeeplus.finance.invoice.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.invoice.domain.FinanceInvoiceReceivables;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Entity com.jeeplus.test.finance.invoice.domain.FinanceInvoiceReceivables
+ */
+@Mapper
+public interface FinanceInvoiceReceivablesMapper extends BaseMapper<FinanceInvoiceReceivables> {
+
+}
+
+
+
+

+ 42 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/FinanceInvoiceBaseMapper.xml

@@ -0,0 +1,42 @@
+<?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.invoice.mapper.FinanceInvoiceBaseMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.finance.invoice.service.dto.FinanceInvoiceBaseDTO">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by_id" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by_id" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="invoiceId" column="invoice_id" jdbcType="VARCHAR"/>
+            <result property="programName" column="program_name" jdbcType="VARCHAR"/>
+            <result property="programId" column="program_id" jdbcType="VARCHAR"/>
+            <result property="contractName" column="contract_name" jdbcType="VARCHAR"/>
+            <result property="location" column="location" jdbcType="VARCHAR"/>
+            <result property="programNo" column="program_no" jdbcType="VARCHAR"/>
+            <result property="clientName" column="client_name" jdbcType="VARCHAR"/>
+            <result property="clientId" column="client_id" jdbcType="VARCHAR"/>
+            <result property="reportNo" column="report_no" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        fib.id,
+        fib.create_by_id,
+        fib.create_time,
+        fib.update_by_id,
+        fib.update_time,
+        fib.del_flag,
+        fib.invoice_id,
+        fib.program_name,
+        fib.program_id,
+        fib.contract_name,
+        fib.location,
+        fib.program_no,
+        fib.client_name,
+        fib.client_id,
+        fib.report_no
+    </sql>
+</mapper>

+ 42 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/FinanceInvoiceDetailMapper.xml

@@ -0,0 +1,42 @@
+<?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.invoice.mapper.FinanceInvoiceDetailMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.finance.invoice.service.dto.FinanceInvoiceDetailDTO">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by_id" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by_id" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="invoiceId" column="invoice_id" jdbcType="VARCHAR"/>
+            <result property="code" column="code" jdbcType="VARCHAR"/>
+            <result property="number" column="number" jdbcType="VARCHAR"/>
+            <result property="account" column="account" jdbcType="VARCHAR"/>
+            <result property="rate" column="rate" jdbcType="VARCHAR"/>
+            <result property="amount" column="amount" jdbcType="VARCHAR"/>
+            <result property="tax" column="tax" jdbcType="VARCHAR"/>
+            <result property="allAmount" column="all_amount" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        fid.id,
+        fid.create_by_id,
+        fid.create_time,
+        fid.update_by_id,
+        fid.update_time,
+        fid.del_flag,
+        fid.remarks,
+        fid.invoice_id,
+        fid.code,
+        fid.number,
+        fid.account,
+        fid.rate,
+        fid.amount,
+        fid.tax,
+        fid.all_amount
+    </sql>
+</mapper>

+ 34 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/FinanceInvoiceInvalidMapper.xml

@@ -0,0 +1,34 @@
+<?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.invoice.mapper.FinanceInvoiceInvalidMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.finance.invoice.service.dto.FinanceInvoiceInvalidDTO">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by_id" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by_id" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="invoiceId" column="invoice_id" jdbcType="VARCHAR"/>
+            <result property="invalidStatus" column="invalid_status" jdbcType="VARCHAR"/>
+            <result property="procInsId" column="proc_ins_id" jdbcType="VARCHAR"/>
+            <result property="processDefinitionId" column="process_definition_id" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        fii.id,
+        fii.create_by_id,
+        fii.create_time,
+        fii.update_by_id,
+        fii.update_time,
+        fii.del_flag,
+        fii.remarks,
+        fii.invoice_id,
+        fii.invalid_status,
+        fii.proc_ins_id,
+        fii.process_definition_id
+    </sql>
+</mapper>

+ 235 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/FinanceInvoiceMapper.xml

@@ -0,0 +1,235 @@
+<?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.invoice.mapper.FinanceInvoiceMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.finance.invoice.service.dto.FinanceInvoiceDTO">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by_id" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by_id" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="type" column="type" jdbcType="VARCHAR"/>
+            <result property="no" column="no" jdbcType="VARCHAR"/>
+            <result property="billingType" column="billing_type" jdbcType="VARCHAR"/>
+            <result property="billingWorkplaceReal" column="billing_workplace_real" jdbcType="VARCHAR"/>
+            <result property="taxpayerIdentificationNo" column="taxpayer_identification_no" jdbcType="VARCHAR"/>
+            <result property="address" column="address" jdbcType="VARCHAR"/>
+            <result property="telPhone" column="tel_phone" jdbcType="VARCHAR"/>
+            <result property="openBank" column="open_bank" jdbcType="VARCHAR"/>
+            <result property="bankAccount" column="bank_account" jdbcType="VARCHAR"/>
+            <result property="name" column="name" jdbcType="VARCHAR"/>
+            <result property="receivablesType" column="receivables_type" jdbcType="VARCHAR"/>
+            <result property="billingContent" column="billing_content" jdbcType="VARCHAR"/>
+            <result property="account" column="account" jdbcType="VARCHAR"/>
+            <result property="billingContentTerms" column="billing_content_terms" jdbcType="VARCHAR"/>
+            <result property="billingPeople" column="billing_people" jdbcType="VARCHAR"/>
+            <result property="billingDate" column="billing_date" jdbcType="TIMESTAMP"/>
+            <result property="collectDate" column="collect_date" jdbcType="TIMESTAMP"/>
+            <result property="billingPeopleReal" column="billing_people_real" jdbcType="VARCHAR"/>
+            <result property="reconciliationPeople" column="reconciliation_people" jdbcType="VARCHAR"/>
+            <result property="reconciliationArea" column="reconciliation_area" jdbcType="VARCHAR"/>
+            <result property="billingWorkplaceRealId" column="billing_workplace_real_id" jdbcType="VARCHAR"/>
+            <result property="billingPeopleId" column="billing_people_id" jdbcType="VARCHAR"/>
+            <result property="status" column="status" jdbcType="VARCHAR"/>
+            <result property="procInsId" column="proc_ins_id" jdbcType="VARCHAR"/>
+            <result property="processDefinitionId" column="process_definition_id" jdbcType="VARCHAR"/>
+            <result property="receivablesStatus" column="receivables_status" jdbcType="VARCHAR"/>
+            <result property="invalidStatus" column="invalid_status" jdbcType="VARCHAR"/>
+            <result property="receivablesDate" column="receivables_date" jdbcType="TIMESTAMP"/>
+            <result property="operator" column="operator" jdbcType="VARCHAR"/>
+            <result property="operatorOffice" column="operator_office" jdbcType="VARCHAR"/>
+            <result property="taskId" column="task_id" jdbcType="VARCHAR"/>
+            <result property="taskIdInvalid" column="task_id_invalid" jdbcType="VARCHAR"/>
+            <result property="isMultiple" column="is_multiple" jdbcType="VARCHAR"/>
+            <result property="actualDrawerEmailAddress" column="actual_drawer_email_address" jdbcType="VARCHAR"/>
+            <association property="financeInvoiceInvalidDTO" column="id" select="getFii" javaType="com.jeeplus.finance.invoice.service.dto.FinanceInvoiceInvalidDTO"></association>
+            <collection property="financeInvoiceReceivablesDTOList" column="id" select="getFirList" ofType="com.jeeplus.finance.invoice.service.dto.FinanceInvoiceReceivablesDTO"></collection>
+            <collection property="financeInvoiceBaseDTOList" column="id" select="getBaseList" ofType="com.jeeplus.finance.invoice.service.dto.FinanceInvoiceBaseDTO"></collection>
+            <collection property="financeInvoiceDetailDTOList" column="id" select="getFidList" ofType="com.jeeplus.finance.invoice.service.dto.FinanceInvoiceDetailDTO"></collection>
+    </resultMap>
+
+    <sql id="FIR_Column_List">
+        fir.id,
+        fir.create_by_id,
+        fir.create_time,
+        fir.update_by_id,
+        fir.update_time,
+        fir.del_flag,
+        fir.remarks,
+        fir.invoice_id,
+        fir.remittance_unit,
+        fir.remittance_amount,
+        fir.remittance_date,
+        fir.status
+    </sql>
+
+    <sql id="FII_Column_List">
+        fii.id,
+        fii.create_by_id,
+        fii.create_time,
+        fii.update_by_id,
+        fii.update_time,
+        fii.del_flag,
+        fii.remarks,
+        fii.invoice_id,
+        fii.invalid_status,
+        fii.proc_ins_id,
+        fii.process_definition_id
+    </sql>
+
+    <sql id="FID_Column_List">
+        fid.id,
+        fid.create_by_id,
+        fid.create_time,
+        fid.update_by_id,
+        fid.update_time,
+        fid.del_flag,
+        fid.remarks,
+        fid.invoice_id,
+        fid.code,
+        fid.number,
+        fid.account,
+        fid.rate,
+        fid.amount,
+        fid.tax,
+        fid.all_amount
+    </sql>
+
+    <sql id="FIB_Column_List">
+        fib.id,
+        fib.create_by_id,
+        fib.create_time,
+        fib.update_by_id,
+        fib.update_time,
+        fib.del_flag,
+        fib.invoice_id,
+        fib.program_name,
+        fib.program_id,
+        fib.contract_name,
+        fib.location,
+        fib.program_no,
+        fib.client_name,
+        fib.client_id,
+        fib.report_no
+    </sql>
+
+    <sql id="Base_Column_List">
+        fi.id,
+        fi.create_by_id,
+        fi.create_time,
+        fi.update_by_id,
+        fi.update_time,
+        fi.del_flag,
+        fi.remarks,
+        fi.type,
+        fi.no,
+        fi.billing_type,
+        fi.billing_workplace_real,
+        fi.taxpayer_identification_no,
+        fi.address,
+        fi.tel_phone,
+        fi.open_bank,
+        fi.bank_account,
+        fi.name,
+        fi.receivables_type,
+        fi.billing_content,
+        fi.account,
+        fi.billing_content_terms,
+        fi.billing_people,
+        fi.billing_date,
+        fi.collect_date,
+        fi.billing_people_real,
+        fi.reconciliation_people,
+        fi.reconciliation_area,
+        fi.billing_workplace_real_id,
+        fi.billing_people_id,
+        fi.status,
+        fi.proc_ins_id,
+        fi.process_definition_id,
+        fi.receivables_status,
+        fi.invalid_status,
+        fi.receivables_date,
+        fi.is_multiple,
+        fi.actual_drawer_email_address
+    </sql>
+
+    <select id="getFii" resultType="com.jeeplus.finance.invoice.service.dto.FinanceInvoiceInvalidDTO">
+        select
+        <include refid="FII_Column_List"></include>
+        from finance_invoice_invalid fii
+        where fii.del_flag = '0' and fii.invoice_id = ${id}
+    </select>
+
+    <select id="getFirList" resultType="com.jeeplus.finance.invoice.service.dto.FinanceInvoiceReceivablesDTO">
+        select
+        <include refid="FIR_Column_List"></include>
+        from finance_invoice_receivables fir
+        where fir.del_flag = '0' and fir.invoice_id = ${id}
+    </select>
+
+    <select id="getFidList" resultType="com.jeeplus.finance.invoice.service.dto.FinanceInvoiceDetailDTO">
+        select
+        <include refid="FID_Column_List"></include>
+        from finance_invoice_detail fid
+        where fid.del_flag = '0' and fid.invoice_id = ${id}
+    </select>
+
+    <select id="getBaseList" resultType="com.jeeplus.finance.invoice.service.dto.FinanceInvoiceBaseDTO">
+        select
+        <include refid="FIB_Column_List"></include>,
+        pa1.id as auditId1,
+        pa2.id as auditId2,
+        pa3.id as auditId3,
+        pa.id as archive_id
+        from finance_invoice_base fib
+        LEFT JOIN program_audit pa1 ON pa1.program_id = fib.program_id and pa1.audit_level = '1' and pa1.del_flag = '0'
+        LEFT JOIN program_audit pa2 ON pa2.program_id = fib.program_id and pa2.audit_level = '2' and pa2.del_flag = '0'
+        LEFT JOIN program_audit pa3 ON pa3.program_id = fib.program_id and pa3.audit_level = '3' and pa3.del_flag = '0'
+        LEFT JOIN program_archive pa ON pa.program_id = fib.program_id and pa.del_flag = '0'
+        where fib.del_flag = '0' and fib.invoice_id = ${id}
+    </select>
+
+    <select id="findList" resultMap="BaseResultMap">
+        select
+        DISTINCT
+        <include refid="Base_Column_List"></include>,
+        su.name as operator,
+        so.name as operator_office,
+        (select
+        CASE
+        WHEN RIGHT( GROUP_CONCAT(case when program_id is null then 2 else 1 end),1) =2 THEN GROUP_CONCAT(concat('其他:',wipr1.program_name))
+        WHEN RIGHT( GROUP_CONCAT(case when program_id is null then 2 else 1 end),1) =1 THEN GROUP_CONCAT(rpr1.name)
+        ELSE '' END
+        FROM finance_invoice_base wipr1
+        LEFT JOIN program_project_list_info rpr1 ON wipr1.program_id = rpr1.id
+        WHERE wipr1.invoice_id = fi.id) as programName,
+        cfid.number as "number",
+        cfid.account as "accountDetail",
+        art.ID_ as task_id,
+        art_invalid.ID_ as task_id_invalid
+        from finance_invoice fi
+        left join finance_invoice_detail cfid on cfid.invoice_id = fi.id and cfid.del_flag = '0'
+        left join sys_user su on fi.create_by_id = su.id and su.del_flag = '0'
+--         left join sys_user_manage_office sumo on sumo.office_id = su.office_id
+        left join sys_office so on su.office_id = so.id and so.del_flag = '0'
+        left join act_ru_task art on fi.proc_ins_id = art.PROC_INST_ID_
+        left join finance_invoice_invalid invalid on invalid.invoice_id = fi.id and invalid.del_flag = '0'
+        left join act_ru_task art_invalid on invalid.proc_ins_id = art_invalid.PROC_INST_ID_
+        ${ew.customSqlSegment}
+    </select>
+
+    <select id="queryById" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"></include>
+        from finance_invoice fi
+        where fi.del_flag = '0' and fi.id = ${id}
+    </select>
+
+    <update id="setReceivablesDateNull" parameterType="string">
+        update finance_invoice set receivables_date = null where id = #{id}
+    </update>
+</mapper>

+ 36 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/FinanceInvoiceReceivablesMapper.xml

@@ -0,0 +1,36 @@
+<?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.invoice.mapper.FinanceInvoiceReceivablesMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.finance.invoice.service.dto.FinanceInvoiceReceivablesDTO">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by_id" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by_id" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="invoiceId" column="invoice_id" jdbcType="VARCHAR"/>
+            <result property="remittanceUnit" column="remittance_unit" jdbcType="VARCHAR"/>
+            <result property="remittanceAmount" column="remittance_amount" jdbcType="VARCHAR"/>
+            <result property="remittanceDate" column="remittance_date" jdbcType="TIMESTAMP"/>
+            <result property="status" column="status" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        fir.id,
+        fir.create_by_id,
+        fir.create_time,
+        fir.update_by_id,
+        fir.update_time,
+        fir.del_flag,
+        fir.remarks,
+        fir.invoice_id,
+        fir.remittance_unit,
+        fir.remittance_amount,
+        fir.remittance_date,
+        fir.status
+    </sql>
+</mapper>

+ 664 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/FinanceInvoiceService.java

@@ -0,0 +1,664 @@
+package com.jeeplus.finance.invoice.service;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.fastjson.JSON;
+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.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.finance.invoice.domain.*;
+import com.jeeplus.finance.invoice.mapper.*;
+import com.jeeplus.finance.invoice.service.dto.FinanceInvoiceBaseDTO;
+import com.jeeplus.finance.invoice.service.dto.FinanceInvoiceDTO;
+import com.jeeplus.finance.invoice.service.dto.FinanceInvoiceDetailDTO;
+import com.jeeplus.finance.invoice.service.dto.FinanceInvoiceReceivablesDTO;
+import com.jeeplus.finance.invoice.service.mapstruct.*;
+import com.jeeplus.finance.workContract.mapper.WorkContractInfoMapper;
+import com.jeeplus.flowable.feign.IFlowableApi;
+import com.jeeplus.sys.domain.User;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
+import com.jeeplus.sys.feign.IRoleApi;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.feign.IWorkAttachmentApi;
+//import com.jeeplus.sys.service.UserService;
+import com.jeeplus.sys.service.dto.RoleDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.service.dto.WorkAttachmentInfoDTO;
+//import com.jeeplus.sys.utils.UserUtils;
+//import com.jeeplus.pubmodules.serialNumTpl.service.SerialnumTplService;
+//import com.jeeplus.pubmodules.oss.mapper.OssServiceMapper;
+//import com.jeeplus.pubmodules.oss.service.dto.WorkAttachmentDto;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class FinanceInvoiceService extends ServiceImpl<FinanceInvoiceMapper, FinanceInvoice> {
+
+    @Resource
+    private FinanceInvoiceMapper financeInvoiceMapper;
+    @Resource
+    private FinanceInvoiceBaseMapper financeInvoiceBaseMapper;
+    @Resource
+    private FinanceInvoiceDetailMapper financeInvoiceDetailMapper;
+    @Resource
+    private FinanceInvoiceReceivablesMapper financeInvoiceReceivablesMapper;
+    @Resource
+    private FinanceInvoiceInvalidMapper financeInvoiceInvalidMapper;
+//    @Resource
+//    private SerialnumTplService serialnumTplService;
+//    @Resource
+//    private OssServiceMapper ossServiceMapper;
+    @Resource
+    private WorkContractInfoMapper workContractInfoMapper;
+//    @Resource
+//    private UserService userService;
+    @Resource
+    private IFlowableApi flowTaskService;
+
+    public List<String> getSearchList(ArrayList<String> searchIdList, List<String> ids) {
+        List<String> newSearchIdList = searchIdList.stream().filter(item -> {
+            AtomicInteger num = new AtomicInteger();
+            ids.stream().forEach(id -> {
+                if (item.equals(id)) {
+                    num.getAndIncrement();
+                }
+            });
+            if (num.get() > 0) {
+                return true;
+            }
+            return false;
+        }).collect(Collectors.toList());
+        return newSearchIdList;
+    }
+
+    public IPage<FinanceInvoiceDTO> findList(Page<FinanceInvoiceDTO> page, FinanceInvoiceDTO financeInvoiceDTO) throws Exception{
+        QueryWrapper<FinanceInvoice> queryWrapper = QueryWrapperGenerator.buildQueryCondition ( FinanceInvoiceWrapper.INSTANCE.toEntity(financeInvoiceDTO), FinanceInvoice.class );
+        queryWrapper.eq("fi.del_flag","0");
+        queryWrapper.orderByDesc("fi.create_time");
+        ArrayList<String> searchIdList = new ArrayList<>();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        AtomicInteger checkNum = new AtomicInteger();
+        if (ObjectUtil.isNotEmpty(financeInvoiceDTO)) {
+            if (StringUtils.isNotBlank(financeInvoiceDTO.getNumber())) {
+                List<FinanceInvoiceDetail> financeInvoiceDetails = financeInvoiceDetailMapper.selectList(new LambdaQueryWrapper<FinanceInvoiceDetail>().like(FinanceInvoiceDetail::getNumber, financeInvoiceDTO.getNumber()));
+                List<String> ids = financeInvoiceDetails.stream().distinct().map(FinanceInvoiceDetail::getInvoiceId).collect(Collectors.toList());
+                if(CollectionUtil.isEmpty(ids)) {
+                    return new Page<FinanceInvoiceDTO>();
+                }else{
+                    if (CollectionUtil.isNotEmpty(searchIdList)){
+                        List<String> newSearchIdList = getSearchList(searchIdList,ids);
+                        searchIdList = new ArrayList<String>();
+                        for (String item : newSearchIdList) {
+                            searchIdList.add(item);
+                        }
+                    }else{
+                        if (checkNum.get() > 0){
+                            return new Page<FinanceInvoiceDTO>();
+                        }else{
+                            for (String item : ids) {
+                                searchIdList.add(item);
+                            }
+                        }
+                    }
+                    checkNum.getAndIncrement();
+                }
+            }
+            if (StringUtils.isNotBlank(financeInvoiceDTO.getAccountBegin())&&StringUtils.isNotBlank(financeInvoiceDTO.getAccountEnd())) {
+                List<FinanceInvoice> financeInvoices = financeInvoiceMapper.selectList(new LambdaQueryWrapper<FinanceInvoice>()
+                        .between(FinanceInvoice::getAccount, new BigDecimal(financeInvoiceDTO.getAccountBegin()), new BigDecimal(financeInvoiceDTO.getAccountEnd())));
+                List<String> ids = financeInvoices.stream().distinct().map(FinanceInvoice::getId).collect(Collectors.toList());
+                if(CollectionUtil.isEmpty(ids)) {
+                    return new Page<FinanceInvoiceDTO>();
+                }else{
+                    if (CollectionUtil.isNotEmpty(searchIdList)){
+                        List<String> newSearchIdList = getSearchList(searchIdList,ids);
+                        searchIdList = new ArrayList<String>();
+                        for (String item : newSearchIdList) {
+                            searchIdList.add(item);
+                        }
+                    }else{
+                        if (checkNum.get() > 0){
+                            return new Page<FinanceInvoiceDTO>();
+                        }else{
+                            for (String item : ids) {
+                                searchIdList.add(item);
+                            }
+                        }
+                    }
+                    checkNum.getAndIncrement();
+                }
+            }
+            if (StringUtils.isNotBlank(financeInvoiceDTO.getBillingDateBegin())&&StringUtils.isNotBlank(financeInvoiceDTO.getBillingDateEnd())) {
+                List<FinanceInvoice> financeInvoices = financeInvoiceMapper.selectList(new LambdaQueryWrapper<FinanceInvoice>()
+                        .between(FinanceInvoice::getBillingDate, sdf.parse(financeInvoiceDTO.getBillingDateBegin()), sdf.parse(financeInvoiceDTO.getBillingDateEnd())));
+                List<String> ids = financeInvoices.stream().distinct().map(FinanceInvoice::getId).collect(Collectors.toList());
+                if(CollectionUtil.isEmpty(ids)) {
+                    return new Page<FinanceInvoiceDTO>();
+                }else{
+                    if (CollectionUtil.isNotEmpty(searchIdList)){
+                        List<String> newSearchIdList = getSearchList(searchIdList,ids);
+                        searchIdList = new ArrayList<String>();
+                        for (String item : newSearchIdList) {
+                            searchIdList.add(item);
+                        }
+                    }else{
+                        if (checkNum.get() > 0){
+                            return new Page<FinanceInvoiceDTO>();
+                        }else{
+                            for (String item : ids) {
+                                searchIdList.add(item);
+                            }
+                        }
+                    }
+                    checkNum.getAndIncrement();
+                }
+            }
+            if (StringUtils.isNotBlank(financeInvoiceDTO.getRemittanceDateBegin())&&StringUtils.isNotBlank(financeInvoiceDTO.getRemittanceDateEnd())) {
+                List<FinanceInvoice> financeInvoices = financeInvoiceMapper.selectList(new LambdaQueryWrapper<FinanceInvoice>()
+                        .between(FinanceInvoice::getReceivablesDate, sdf.parse(financeInvoiceDTO.getRemittanceDateBegin()), sdf.parse(financeInvoiceDTO.getRemittanceDateEnd())));
+                List<String> ids = financeInvoices.stream().distinct().map(FinanceInvoice::getId).collect(Collectors.toList());
+                if(CollectionUtil.isEmpty(ids)) {
+                    return new Page<FinanceInvoiceDTO>();
+                }else{
+                    if (CollectionUtil.isNotEmpty(searchIdList)){
+                        List<String> newSearchIdList = getSearchList(searchIdList,ids);
+                        searchIdList = new ArrayList<String>();
+                        for (String item : newSearchIdList) {
+                            searchIdList.add(item);
+                        }
+                    }else{
+                        if (checkNum.get() > 0){
+                            return new Page<FinanceInvoiceDTO>();
+                        }else{
+                            for (String item : ids) {
+                                searchIdList.add(item);
+                            }
+                        }
+                    }
+                    checkNum.getAndIncrement();
+                }
+            }
+            if (StringUtils.isNotBlank(financeInvoiceDTO.getProgramId())||StringUtils.isNotBlank(financeInvoiceDTO.getProgramName())) {
+                if (StringUtils.isNotBlank(financeInvoiceDTO.getProgramId())){
+                    List<FinanceInvoiceBase> financeInvoiceBaseList = financeInvoiceBaseMapper.selectList(new LambdaQueryWrapper<FinanceInvoiceBase>()
+                            .eq(FinanceInvoiceBase::getProgramId,financeInvoiceDTO.getProgramId()));
+                    List<String> ids = financeInvoiceBaseList.stream().distinct().map(FinanceInvoiceBase::getInvoiceId).collect(Collectors.toList());
+                    if(CollectionUtil.isEmpty(ids)) {
+                        return new Page<FinanceInvoiceDTO>();
+                    }else{
+                        if (CollectionUtil.isNotEmpty(searchIdList)){
+                            List<String> newSearchIdList = getSearchList(searchIdList,ids);
+                            searchIdList = new ArrayList<String>();
+                            for (String item : newSearchIdList) {
+                                searchIdList.add(item);
+                            }
+                        }else{
+                            if (checkNum.get() > 0){
+                                return new Page<FinanceInvoiceDTO>();
+                            }else{
+                                for (String item : ids) {
+                                    searchIdList.add(item);
+                                }
+                            }
+                        }
+                        checkNum.getAndIncrement();
+                    }
+                }else{
+                    List<FinanceInvoiceBase> financeInvoiceBaseList = financeInvoiceBaseMapper.selectList(new LambdaQueryWrapper<FinanceInvoiceBase>()
+                            .like(FinanceInvoiceBase::getProgramName,financeInvoiceDTO.getProgramName()));
+                    List<String> ids = financeInvoiceBaseList.stream().distinct().map(FinanceInvoiceBase::getInvoiceId).collect(Collectors.toList());
+                    if(CollectionUtil.isEmpty(ids)) {
+                        return new Page<FinanceInvoiceDTO>();
+                    }else{
+                        if (CollectionUtil.isNotEmpty(searchIdList)){
+                            List<String> newSearchIdList = getSearchList(searchIdList,ids);
+                            searchIdList = new ArrayList<String>();
+                            for (String item : newSearchIdList) {
+                                searchIdList.add(item);
+                            }
+                        }else{
+                            if (checkNum.get() > 0){
+                                return new Page<FinanceInvoiceDTO>();
+                            }else{
+                                for (String item : ids) {
+                                    searchIdList.add(item);
+                                }
+                            }
+                        }
+                        checkNum.getAndIncrement();
+                    }
+                }
+            }
+            if (StringUtils.isNotBlank(financeInvoiceDTO.getOperator())){
+                queryWrapper.eq("su.id",financeInvoiceDTO.getOperator());
+            }
+            if (StringUtils.isNotBlank(financeInvoiceDTO.getReconciliationPeopleName())) {
+                List<User> users = SpringUtil.getBean ( IUserApi.class ).selectListByName(financeInvoiceDTO.getReconciliationPeopleName());
+                List<String> userIdList = users.stream().distinct().map(User::getId).collect(Collectors.toList());
+                if (CollectionUtil.isNotEmpty(userIdList)) {
+                    queryWrapper.in("fi.reconciliation_people",userIdList);
+                } else {
+                    return new Page<FinanceInvoiceDTO>();
+                }
+            }
+            if (StringUtils.isNotBlank(financeInvoiceDTO.getOperatorOffice())){
+                List<User> userList = SpringUtil.getBean ( IUserApi.class ).getUserByOfficeAll(financeInvoiceDTO.getOperatorOffice());
+                if (CollectionUtil.isNotEmpty(userList)) {
+                    List<String> userIdList = userList.stream().distinct().map(User::getId).collect(Collectors.toList());
+                    if (CollectionUtil.isNotEmpty(userIdList)) {
+                        queryWrapper.in("fi.create_by_id",userIdList);
+                    } else {
+                        return new Page<FinanceInvoiceDTO>();
+                    }
+                } else {
+                    return new Page<FinanceInvoiceDTO>();
+                }
+            }
+        }
+        if (CollectionUtil.isNotEmpty(searchIdList)){
+            List<String> ids = searchIdList.stream().distinct().collect(Collectors.toList());
+            queryWrapper.in("fi.id",ids);
+        } else{
+            if (checkNum.get() > 0) {
+                return new Page<FinanceInvoiceDTO>();
+            }
+        }
+
+        IPage<FinanceInvoiceDTO> pageList = financeInvoiceMapper.findList(page, queryWrapper);
+        pageList.getRecords().stream().forEach(item ->{
+            // 发票申请
+            if (StringUtils.isNotBlank(item.getTaskId()) && StringUtils.isNotBlank(item.getStatus())) {
+                if ("2".equals(item.getStatus())) { // “审核中”的数据要获取数据审核人
+                    item.setAuditUserIds(flowTaskService.getTaskAuditUsers(item.getTaskId()));  // 获取数据审核人
+                }
+            }
+            // 发票作废
+            if (StringUtils.isNotBlank(item.getTaskIdInvalid()) && StringUtils.isNotBlank(item.getStatus())) {
+                if ("6".equals(item.getStatus())) { // “审核中”的数据要获取数据审核人
+                    item.setAuditUserIdsInvalid(flowTaskService.getTaskAuditUsers(item.getTaskIdInvalid()));  // 获取数据审核人
+                }
+            }
+        });
+        return pageList;
+    }
+
+//    public List<FinanceInvoiceDTO> exportList(Page<FinanceInvoiceDTO> page, FinanceInvoiceDTO financeInvoiceDTO) throws Exception{
+//        IPage<FinanceInvoiceDTO> FinanceInvoiceDTOIPage = this.findList(page, financeInvoiceDTO);
+//        List<FinanceInvoiceDTO> records = FinanceInvoiceDTOIPage.getRecords();
+//        if(CollectionUtil.isNotEmpty(records)){
+//            records.stream().forEach(record->{
+//                if(CollectionUtil.isNotEmpty(record.getFinanceInvoiceBaseDTOList())){
+//                    if(record.getFinanceInvoiceBaseDTOList().size() == 1 && StringUtils.isBlank(record.getFinanceInvoiceBaseDTOList().get(0).getProgramId())) {
+//                        record.setProgramName("其他: " + record.getFinanceInvoiceBaseDTOList().get(0).getProgramName());
+//                    } else {
+//                        AtomicReference<String> programName = new AtomicReference<>("");
+//                        AtomicInteger n = new AtomicInteger();
+//                        record.getFinanceInvoiceBaseDTOList().stream().forEach((item)->{
+//                            n.getAndIncrement();
+//                            if (n.get() == record.getFinanceInvoiceBaseDTOList().size()){
+//                                if(StringUtils.isNotBlank(item.getProgramName())){
+//                                    programName.set(programName.get() + item.getProgramName());
+//                                }
+//                            } else {
+//                                if(StringUtils.isNotBlank(item.getProgramName())){
+//                                    programName.set(programName.get() + item.getProgramName() + ",");
+//                                }
+//                            }
+//                        });
+//                        record.setProgramName(programName.get());
+//                    }
+//                }else{
+//                    record.setProgramName("");
+//                }
+//                if(CollectionUtil.isNotEmpty(record.getFinanceInvoiceDetailDTOList())){
+//                    AtomicReference<String> programName = new AtomicReference<>("");
+//                    AtomicInteger n = new AtomicInteger();
+//                    record.getFinanceInvoiceBaseDTOList().stream().forEach((item)->{
+//                        n.getAndIncrement();
+//                        if (n.get() == record.getFinanceInvoiceBaseDTOList().size()){
+//                            if(StringUtils.isNotBlank(item.getProgramName())){
+//                                programName.set(programName.get() + item.getProgramName());
+//                            }
+//                        } else {
+//                            if(StringUtils.isNotBlank(item.getProgramName())){
+//                                programName.set(programName.get() + item.getProgramName() + ",");
+//                            }
+//                        }
+//                    });
+//                    record.setProgramName(programName.get());
+//                }
+//            });
+//        }else{
+//            return records;
+//        }
+//    }
+
+    public FinanceInvoiceDTO queryById(String id) {
+
+        FinanceInvoiceDTO financeInvoiceDTO = financeInvoiceMapper.queryById(id);
+
+        // 查询附件信息
+        List<WorkAttachmentInfo> fileList = workContractInfoMapper.findDtos(id);
+        if (CollectionUtil.isNotEmpty(fileList)) {
+            for (WorkAttachmentInfo i : fileList) {
+                i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+            }
+        }
+        if(CollectionUtil.isNotEmpty(fileList)){
+            financeInvoiceDTO.setWorkAttachmentDtoList(fileList);
+        }
+
+        return financeInvoiceDTO;
+    }
+
+    public String saveForm(FinanceInvoiceDTO financeInvoiceDTO) throws Exception{
+        FinanceInvoice financeInvoice = FinanceInvoiceWrapper.INSTANCE.toEntity(financeInvoiceDTO);
+        if (ObjectUtil.isNotEmpty(financeInvoice)) {
+            if(StringUtils.isBlank(financeInvoice.getId())){
+                //获取当前登录人信息
+                UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken());
+                //发票编号生成
+                String serialNum = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNum(userDTO.getCompanyDTO().getId(), FinanceInvoiceDTO.BIZ_CODE, TokenProvider.getCurrentToken());
+                financeInvoice.setNo(serialNum);
+                if (StringUtils.isBlank(financeInvoice.getInvalidStatus())){
+                    financeInvoice.setInvalidStatus("0");
+                }
+                if (StringUtils.isBlank(financeInvoice.getReceivablesStatus())){
+                    financeInvoice.setReceivablesStatus("0");
+                }
+            }
+            if(StringUtils.isNotEmpty(financeInvoiceDTO.getActualDrawerEmailAddress())){
+                financeInvoice.setActualDrawerEmailAddress(financeInvoiceDTO.getActualDrawerEmailAddress());
+            }
+        }
+        this.saveOrUpdate(financeInvoice);
+        if (ObjectUtil.isNotEmpty(financeInvoiceDTO)) {
+            // 如果当前是执行的是收款页面的保存方法
+            if ("1".equals(financeInvoiceDTO.getIsReceivables())) {
+                // 如果传过来的收款日期为空,则将本条发票的收款日期置空
+                if (ObjectUtil.isEmpty(financeInvoiceDTO.getReceivablesDate())) {
+                    // 根据发票id,置空发票的收款日期
+                    financeInvoiceMapper.setReceivablesDateNull(financeInvoice.getId());
+                }
+            }
+            // 基本信息保存
+            if(CollectionUtil.isNotEmpty(financeInvoiceDTO.getFinanceInvoiceBaseDTOList())){
+                List<String> delIds = financeInvoiceDTO.getFinanceInvoiceBaseDTOList().stream().distinct().filter(item->{
+                    if(StringUtils.isNotBlank(item.getId())){
+                        return true;
+                    }
+                    return false;
+                }).map(FinanceInvoiceBaseDTO::getId).collect(Collectors.toList());
+                if(CollectionUtil.isNotEmpty(delIds)){
+                    financeInvoiceBaseMapper.delete(new QueryWrapper<FinanceInvoiceBase>().lambda()
+                            .eq(FinanceInvoiceBase::getInvoiceId,financeInvoice.getId()).notIn(FinanceInvoiceBase::getId,delIds));
+                }else{
+                    financeInvoiceBaseMapper.delete(new QueryWrapper<FinanceInvoiceBase>().lambda()
+                            .eq(FinanceInvoiceBase::getInvoiceId,financeInvoice.getId()));
+                }
+                financeInvoiceDTO.getFinanceInvoiceBaseDTOList().stream().forEach(item->{
+                    FinanceInvoiceBase financeInvoiceBase = FinanceInvoiceBaseWrapper.INSTANCE.toEntity(item);
+                    if(StringUtils.isNotBlank(financeInvoiceBase.getId())){
+                        financeInvoiceBaseMapper.updateById(financeInvoiceBase);
+                    }else{
+                        financeInvoiceBase.setInvoiceId(financeInvoice.getId());
+                        financeInvoiceBaseMapper.insert(financeInvoiceBase);
+                    }
+                });
+            }else{
+                financeInvoiceBaseMapper.delete(new QueryWrapper<FinanceInvoiceBase>().lambda()
+                        .eq(FinanceInvoiceBase::getInvoiceId,financeInvoice.getId()));
+            }
+            // 附件保存
+            if(CollectionUtil.isNotEmpty(financeInvoiceDTO.getWorkAttachmentDtoList())){
+                List<String> delIds = financeInvoiceDTO.getWorkAttachmentDtoList().stream().distinct().filter(item -> {
+                    if (StringUtils.isNotBlank(item.getId())) {
+                        return true;
+                    }
+                    return false;
+                }).map(WorkAttachmentInfo::getId).collect(Collectors.toList());
+                if(CollectionUtil.isNotEmpty(delIds)){
+                    SpringUtil.getBean ( IWorkAttachmentApi.class ).deleteByAttachmentIdNotInIds(financeInvoice.getId(),delIds);
+                }else{
+                    SpringUtil.getBean ( IWorkAttachmentApi.class ).deleteByAttachmentId(financeInvoice.getId());
+                }
+                //获取当前登录人信息
+                UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken());
+                AtomicInteger j = new AtomicInteger(1);
+                List<WorkAttachmentInfo> collect = financeInvoiceDTO.getWorkAttachmentDtoList().stream().filter(item -> {
+                    if (StringUtils.isNotBlank(item.getId())) {
+                        return false;
+                    }
+                    return true;
+                }).collect(Collectors.toList());
+                collect.forEach(item->{
+                    this.saveFiles(item,financeInvoice.getId(),userDTO,j);
+                    j.getAndIncrement();
+                });
+            }else{
+                SpringUtil.getBean ( IWorkAttachmentApi.class ).deleteByAttachmentId(financeInvoice.getId());
+            }
+            // 发票明细保存
+            if(CollectionUtil.isNotEmpty(financeInvoiceDTO.getFinanceInvoiceDetailDTOList())){
+                List<String> delIds = financeInvoiceDTO.getFinanceInvoiceDetailDTOList().stream().distinct().filter(item -> {
+                    if (StringUtils.isNotBlank(item.getId())) {
+                        return true;
+                    }
+                    return false;
+                }).map(FinanceInvoiceDetailDTO::getId).collect(Collectors.toList());
+                if(CollectionUtil.isNotEmpty(delIds)){
+                    financeInvoiceDetailMapper.delete(new QueryWrapper<FinanceInvoiceDetail>().lambda()
+                            .eq(FinanceInvoiceDetail::getInvoiceId,financeInvoice.getId())
+                            .notIn(FinanceInvoiceDetail::getId,delIds));
+                }else{
+                    financeInvoiceDetailMapper.delete(new QueryWrapper<FinanceInvoiceDetail>().lambda().eq(FinanceInvoiceDetail::getInvoiceId,financeInvoice.getId()));
+                }
+                financeInvoiceDTO.getFinanceInvoiceDetailDTOList().stream().forEach(item->{
+                    FinanceInvoiceDetail financeInvoiceDetail = FinanceInvoiceDetailWrapper.INSTANCE.toEntity(item);
+                    if(StringUtils.isNotBlank(financeInvoiceDetail.getId())){
+                        financeInvoiceDetailMapper.updateById(financeInvoiceDetail);
+                    }else{
+                        financeInvoiceDetail.setInvoiceId(financeInvoice.getId());
+                        financeInvoiceDetailMapper.insert(financeInvoiceDetail);
+                    }
+                });
+            }else{
+                financeInvoiceDetailMapper.delete(new QueryWrapper<FinanceInvoiceDetail>().lambda().eq(FinanceInvoiceDetail::getInvoiceId,financeInvoice.getId()));
+            }
+            // 收款明细保存
+            if(CollectionUtil.isNotEmpty(financeInvoiceDTO.getFinanceInvoiceReceivablesDTOList())){
+                List<String> delIds = financeInvoiceDTO.getFinanceInvoiceReceivablesDTOList().stream().distinct().filter(item -> {
+                    if (StringUtils.isNotBlank(item.getId())) {
+                        return true;
+                    }
+                    return false;
+                }).map(FinanceInvoiceReceivablesDTO::getId).collect(Collectors.toList());
+                if(CollectionUtil.isNotEmpty(delIds)){
+                    financeInvoiceReceivablesMapper.delete(new QueryWrapper<FinanceInvoiceReceivables>().lambda()
+                            .eq(FinanceInvoiceReceivables::getInvoiceId,financeInvoice.getId())
+                            .notIn(FinanceInvoiceReceivables::getId,delIds));
+                }else{
+                    financeInvoiceReceivablesMapper.delete(new QueryWrapper<FinanceInvoiceReceivables>().lambda().eq(FinanceInvoiceReceivables::getInvoiceId,financeInvoice.getId()));
+                }
+                financeInvoiceDTO.getFinanceInvoiceReceivablesDTOList().stream().forEach(item->{
+                    FinanceInvoiceReceivables financeInvoiceReceivables = FinanceInvoiceReceivablesWrapper.INSTANCE.toEntity(item);
+                    if(StringUtils.isNotBlank(financeInvoiceReceivables.getId())){
+                        financeInvoiceReceivablesMapper.updateById(financeInvoiceReceivables);
+                    }else{
+                        financeInvoiceReceivables.setInvoiceId(financeInvoice.getId());
+                        financeInvoiceReceivablesMapper.insert(financeInvoiceReceivables);
+                    }
+                });
+            }else{
+                financeInvoiceReceivablesMapper.delete(new QueryWrapper<FinanceInvoiceReceivables>().lambda().eq(FinanceInvoiceReceivables::getInvoiceId,financeInvoice.getId()));
+            }
+            // 作废信息保存
+            if(ObjectUtil.isNotEmpty(financeInvoiceDTO.getFinanceInvoiceInvalidDTO())){
+                FinanceInvoiceInvalid financeInvoiceInvalid = FinanceInvoiceInvalidWrapper.INSTANCE.toEntity(financeInvoiceDTO.getFinanceInvoiceInvalidDTO());
+                if(StringUtils.isNotBlank(financeInvoiceInvalid.getId())){
+                    financeInvoiceInvalidMapper.update(financeInvoiceInvalid,
+                            new QueryWrapper<FinanceInvoiceInvalid>().lambda().eq(FinanceInvoiceInvalid::getId,financeInvoiceInvalid.getId()));
+                }else{
+                    financeInvoiceInvalid.setInvalidStatus("0");
+                    financeInvoiceInvalid.setInvoiceId(financeInvoice.getId());
+                    financeInvoiceInvalidMapper.insert(financeInvoiceInvalid);
+                }
+            }else{
+                financeInvoiceInvalidMapper.delete(new QueryWrapper<FinanceInvoiceInvalid>().lambda().eq(FinanceInvoiceInvalid::getInvoiceId,financeInvoice.getId()));
+                FinanceInvoiceInvalid financeInvoiceInvalid = new FinanceInvoiceInvalid();
+                financeInvoiceInvalid.setInvalidStatus("0");
+                financeInvoiceInvalid.setInvoiceId(financeInvoice.getId());
+                financeInvoiceInvalidMapper.insert(financeInvoiceInvalid);
+            }
+        }
+        return financeInvoice.getId();
+    }
+
+    public ResponseEntity saveInvoice(FinanceInvoiceDTO financeInvoiceDTO) throws Exception{
+        this.saveForm(financeInvoiceDTO);
+        return ResponseEntity.ok("保存成功");
+    }
+
+    public String saveFormInvalid(FinanceInvoiceDTO financeInvoiceDTO) throws Exception{
+        String invoiceId = this.saveForm(financeInvoiceDTO);
+        List<FinanceInvoiceInvalid> financeInvoiceInvalids = financeInvoiceInvalidMapper.selectList(
+                new QueryWrapper<FinanceInvoiceInvalid>().lambda().eq(FinanceInvoiceInvalid::getInvoiceId, invoiceId));
+        return financeInvoiceInvalids.get(0).getId();
+    }
+
+    /**
+     * 添加附件
+     * @param item 要添加的附件信息
+     * @param id 附件id: attachmentId
+     * @param userDTO 当前登录人信息
+     * @param j 排序序号
+     */
+    public void saveFiles(WorkAttachmentInfo item,String id,UserDTO userDTO,AtomicInteger j){
+        WorkAttachmentInfo i = new WorkAttachmentInfo();
+        //包含了url、size、name
+        i.setId(UUID.randomUUID().toString().replace("-", ""));
+        i.setCreateTime(new Date());
+        i.setUpdateTime(new Date());
+        i.setDelFlag(0);
+        i.setUrl(item.getUrl());
+        //文件类型处理
+        List<String> strings = Arrays.asList(item.getName().split("\\."));
+        if (CollectionUtil.isNotEmpty(strings)) {
+            i.setType(strings.get(1));
+        }
+        i.setAttachmentId(id);
+        i.setAttachmentName(item.getName());
+        i.setAttachmentFlag("invoice");
+        i.setFileSize(item.getSize());
+        i.setSort(j.get());
+        Map<String,String> map = new HashMap<>();
+        String workAttachment = JSON.toJSONString((i));
+        String userDTOInfo = JSON.toJSONString((userDTO));
+        map.put("workAttachment",workAttachment);
+        map.put("userDTO",userDTOInfo);
+        SpringUtil.getBean ( IWorkAttachmentApi.class ).insertWorkAttachment(map);
+    }
+
+    public ResponseEntity deleteByIds(String ids) {
+        String idArray[] =ids.split(",");
+        this.removeByIds (Lists.newArrayList (idArray));
+        return ResponseEntity.ok ("删除成功");
+    }
+
+    public Boolean queryByNumber(String number, String id) {
+        List<FinanceInvoiceDetail> financeInvoiceDetails = financeInvoiceDetailMapper.selectList(new QueryWrapper<FinanceInvoiceDetail>().lambda()
+                .eq(FinanceInvoiceDetail::getNumber, number)
+                .eq(FinanceInvoiceDetail::getDelFlag, '0')
+                .ne(StringUtils.isNotBlank(id),FinanceInvoiceDetail::getId,id));
+        if (CollectionUtil.isNotEmpty(financeInvoiceDetails)) {
+            return true;
+        }
+        return false;
+    }
+
+    public String queryIdByInvalidId(String id) {
+        FinanceInvoiceInvalid financeInvoiceInvalid = financeInvoiceInvalidMapper.selectById(id);
+        return financeInvoiceInvalid.getInvoiceId();
+    }
+
+    public String updateStatusById(FinanceInvoiceDTO financeInvoiceDTO) {
+        FinanceInvoice financeInvoice = FinanceInvoiceWrapper.INSTANCE.toEntity(financeInvoiceDTO);
+        financeInvoiceMapper.update(financeInvoice, new QueryWrapper<FinanceInvoice>().lambda().eq(FinanceInvoice::getId, financeInvoice.getId()));
+        return "操作成功";
+    }
+
+    public String isReceivables(FinanceInvoiceDTO financeInvoiceDTO) {
+        FinanceInvoice financeInvoice = FinanceInvoiceWrapper.INSTANCE.toEntity(financeInvoiceDTO);
+        financeInvoiceMapper.update(financeInvoice, new QueryWrapper<FinanceInvoice>().lambda().eq(FinanceInvoice::getId, financeInvoice.getId()));
+        return "操作成功";
+    }
+
+    public String importDecide(List<FinanceInvoiceDetailDTO> list, ArrayList<FinanceInvoiceDetailDTO> arrayList, HashMap<String,String> hashMap){
+        for (FinanceInvoiceDetailDTO financeInvoiceDetailDTO : list) {
+            if(ObjectUtil.isEmpty(financeInvoiceDetailDTO)){
+                continue;
+            }
+
+            if(StringUtils.isBlank(financeInvoiceDetailDTO.getNumber())){
+                return "文件中有发票号为空,请重新填写";
+            }
+            if(StringUtils.isNotBlank(financeInvoiceDetailDTO.getNumber())){
+                try {
+                    Integer integer = new Integer(financeInvoiceDetailDTO.getNumber());
+                    if (integer < 0) {
+                        return "文件中有发票号填写不正确,请重新填写";
+                    }
+                }catch (Exception e){
+                    return "文件中有发票号填写不正确,请重新填写";
+                }
+                List<FinanceInvoiceDetail> financeInvoiceDetailList = financeInvoiceDetailMapper.selectList(new QueryWrapper<FinanceInvoiceDetail>().eq("number", financeInvoiceDetailDTO.getNumber()));
+                if(CollectionUtil.isNotEmpty(financeInvoiceDetailList)){
+                    return "文件中有发票号已在系统中存在,请重新填写";
+                }
+            }
+//            if (StringUtils.isBlank(financeInvoiceDetailDTO.getRate())) {
+//                return "文件中有税率为空,请重新填写";
+//            }
+            if (StringUtils.isNotBlank(financeInvoiceDetailDTO.getRate())) {
+                try {
+                    if ((new BigDecimal(financeInvoiceDetailDTO.getRate())).compareTo(new BigDecimal(1)) == -1
+                            || (new BigDecimal(financeInvoiceDetailDTO.getRate())).compareTo(new BigDecimal(100)) == 1) {
+                        return "文件中有税率填写不正确,请重新填写";
+                    }
+                }catch (Exception e){
+                    return "文件中有税率填写不正确,请重新填写";
+                }
+            }
+            if (StringUtils.isBlank(financeInvoiceDetailDTO.getAccount())) {
+                return "文件中有开票金额为空,请重新填写";
+            } else {
+                try {
+                    financeInvoiceDetailDTO.setAccount(new BigDecimal(financeInvoiceDetailDTO.getAccount()).toString());
+                }catch (Exception e){
+                    return "文件中有开票金额填写不正确,请重新填写";
+                }
+            }
+
+            hashMap.put(financeInvoiceDetailDTO.getNumber(),null);
+
+            arrayList.add(financeInvoiceDetailDTO);
+        }
+        return null;
+    }
+}

+ 9 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/FinanceDTO.java

@@ -0,0 +1,9 @@
+package com.jeeplus.finance.invoice.service.dto;
+
+import lombok.Data;
+
+@Data
+public class FinanceDTO {
+
+    private String businessId;
+}

+ 81 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/FinanceInvoiceBaseDTO.java

@@ -0,0 +1,81 @@
+package com.jeeplus.finance.invoice.service.dto;
+
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 财务管理-发票基本信息
+ * @TableName finance_invoice_base
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class FinanceInvoiceBaseDTO extends BaseDTO {
+
+    /**
+     * 发票id
+     */
+    private String invoiceId;
+
+    /**
+     * 项目名称
+     */
+    private String programName;
+
+    /**
+     * 项目id
+     */
+    private String programId;
+
+    /**
+     * 合同名称
+     */
+    private String contractName;
+
+    /**
+     * 项目所在地
+     */
+    private String location;
+
+    /**
+     * 项目编号
+     */
+    private String programNo;
+
+    /**
+     * 委托方
+     */
+    private String clientName;
+
+    /**
+     * 委托方id
+     */
+    private String clientId;
+
+    /**
+     * 报告号
+     */
+    private String reportNo;
+
+    /**
+     * 一级校审id
+     */
+    private String auditId1;
+
+    /**
+     * 二级校审id
+     */
+    private String auditId2;
+
+    /**
+     * 三级校审id
+     */
+    private String auditId3;
+
+    /**
+     * 归档id
+     */
+    private String archiveId;
+
+    private static final long serialVersionUID = 1L;
+}

+ 313 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/FinanceInvoiceDTO.java

@@ -0,0 +1,313 @@
+package com.jeeplus.finance.invoice.service.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.service.dto.BaseDTO;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
+import com.jeeplus.sys.service.dto.WorkAttachmentInfoDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 财务管理-发票
+ * @TableName finance_invoice
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class FinanceInvoiceDTO extends BaseDTO {
+
+    public static final String BIZ_CODE = "4";
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 发票申请编号
+     */
+    @Excel(name = "发票申请编号", orderNum = "0", width = 30)
+    private String no;
+
+    /**
+     * 项目名称
+     */
+    @Excel(name = "项目名称",width = 25)
+    private String programName;
+
+    /**
+     * 实际开票单位
+     */
+    @Excel(name = "实际开票单位",width = 25)
+    private String billingWorkplaceReal;
+
+    /**
+     * 经办人
+     */
+    @Excel(name = "经办人",width = 16)
+    private String operator;
+
+    /**
+     * 经办人部门
+     */
+    @Excel(name = "经办人部门",width = 16)
+    private String operatorOffice;
+
+    /**
+     * 发票号
+     */
+    @Excel(name = "发票号",width = 16)
+    private String number;
+
+    /**
+     * 开票金额(元)
+     */
+    @Excel(name = "开票金额(元)",width = 16,type = 10)
+    private String account;
+
+    /**
+     * 发票金额(元)
+     */
+    @Excel(name = "发票金额(元)",width = 16,type = 10)
+    private String accountDetail;
+
+    /**
+     * 开票内容
+     */
+    @Excel(name = "开票内容",width = 30,dict = "invoice_billing_content")
+    private String billingContent;
+
+    /**
+     * 发票类型
+     */
+    @Excel(name = "发票类型",width = 20,dict = "invoice_type")
+    private String type;
+
+    /**
+     * 开票时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @Excel(name = "开票日期",width = 20,exportFormat = "yyyy-MM-dd")
+    private Date billingDate;
+
+    /**
+     * 状态
+     */
+    @Excel(name = "开票状态",width = 20,dict = "invoice_status")
+    private String status;
+
+    /**
+     * 收款日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @Excel(name = "收款日期",width = 20,exportFormat = "yyyy-MM-dd")
+    private Date receivablesDate;
+
+    /**
+     * 是否确认收款
+     */
+    @Excel(name = "是否确认收款",width = 14, replace = {"是_1", "否_0"})
+    private String receivablesStatus;
+
+    /**
+     * 领票时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date collectDate;
+
+    /**
+     * 开票类型
+     */
+    private String billingType;
+
+    /**
+     * 纳税人识别号
+     */
+    private String taxpayerIdentificationNo;
+
+    /**
+     * 地址
+     */
+    private String address;
+
+    /**
+     * 电话
+     */
+    private String telPhone;
+
+    /**
+     * 开户银行
+     */
+    private String openBank;
+
+    /**
+     * 银行账号
+     */
+    private String bankAccount;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 收款类型
+     */
+    private String receivablesType;
+
+
+    /**
+     * 开票内容要求
+     */
+    private String billingContentTerms;
+
+    /**
+     * 开票人
+     */
+    private String billingPeople;
+
+    /**
+     * 实际开票人
+     */
+    private String billingPeopleReal;
+
+    /**
+     * 对账人id
+     */
+    private String reconciliationPeople;
+
+    /**
+     * 对账人姓名
+     */
+    private String reconciliationPeopleName;
+
+    /**
+     * 对账地区
+     */
+    private String reconciliationArea;
+
+    /**
+     * 实际开票单位id
+     */
+    private String billingWorkplaceRealId;
+
+    /**
+     * 开票人id
+     */
+    private String billingPeopleId;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     * 流程信息
+     */
+    private String processDefinitionId;
+
+    /**
+     * 是否作废
+     */
+    private String invalidStatus;
+
+    /**
+     * 基础信息
+     */
+    private List<FinanceInvoiceBaseDTO> financeInvoiceBaseDTOList;
+
+    /**
+     * 附件信息
+     */
+    private List<WorkAttachmentInfo> workAttachmentDtoList;
+
+    /**
+     * 发票明细
+     */
+    private List<FinanceInvoiceDetailDTO> financeInvoiceDetailDTOList;
+
+    /**
+     * 收款明细
+     */
+    private List<FinanceInvoiceReceivablesDTO> financeInvoiceReceivablesDTOList;
+
+    /**
+     * 作废信息
+     */
+    private FinanceInvoiceInvalidDTO financeInvoiceInvalidDTO;
+
+    /**
+     * 开票总金额 Begin
+     */
+    private String accountBegin;
+
+    /**
+     * 开票总金额 End
+     */
+    private String accountEnd;
+
+    /**
+     * 开票日期 Begin
+     */
+    private String billingDateBegin;
+
+    /**
+     * 开票日期 End
+     */
+    private String billingDateEnd;
+
+    /**
+     * 收款日期Begin
+     */
+    private String remittanceDateBegin;
+
+    /**
+     * 收款日期End
+     */
+    private String remittanceDateEnd;
+
+    /**
+     * 项目id
+     */
+    private String programId;
+
+    /**
+     * 是否为收款页面   0否  1是
+     */
+    private String isReceivables;
+
+    /**
+     * 数据审核人  发票申请
+     */
+    private List<String> auditUserIds;
+
+    /**
+     * 发票作废  taskId
+     */
+    private String taskIdInvalid;
+
+    /**
+     * 数据审核人  发票作废
+     */
+    private List<String> auditUserIdsInvalid;
+
+    /**
+     * 是否多张开票  1是  0否
+     */
+    private String isMultiple;
+
+    /**
+     * 邮箱账号
+     */
+    private String actualDrawerEmailAddress;
+
+
+    private static final long serialVersionUID = 1L;
+}

+ 72 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/FinanceInvoiceDetailDTO.java

@@ -0,0 +1,72 @@
+package com.jeeplus.finance.invoice.service.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 财务管理-发票明细
+ * @TableName finance_invoice_detail
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class FinanceInvoiceDetailDTO extends BaseDTO {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 发票id
+     */
+    private String invoiceId;
+
+    /**
+     * 发票代码
+     */
+    @Excel(name = "发票代码",width = 25)
+    private String code;
+
+    /**
+     * 发票号
+     */
+    @Excel(name = "发票号",width = 25)
+    private String number;
+
+    /**
+     * 开票金额(元)
+     */
+    @Excel(name = "开票金额(元)",width = 25)
+    private String account;
+
+    /**
+     * 税率
+     */
+    @Excel(name = "税率(%)",width = 25)
+    private String rate;
+
+    /**
+     * 金额
+     */
+    private String amount;
+
+    /**
+     * 税额
+     */
+    private String tax;
+
+    /**
+     * 累计登记金额
+     */
+    private String allAmount;
+
+    /**
+     * 纳税人识别号
+     */
+    @Excel(name = "纳税人识别号",width = 25)
+    private String taxpayerIdentificationNo;
+
+    private static final long serialVersionUID = 1L;
+}

+ 41 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/FinanceInvoiceInvalidDTO.java

@@ -0,0 +1,41 @@
+package com.jeeplus.finance.invoice.service.dto;
+
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 财务管理-发票-发票作废
+ * @TableName finance_invoice_invalid
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class FinanceInvoiceInvalidDTO extends BaseDTO {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 发票id
+     */
+    private String invoiceId;
+
+    /**
+     * 是否作废
+     */
+    private String invalidStatus;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     * 流程信息
+     */
+    private String processDefinitionId;
+
+    private static final long serialVersionUID = 1L;
+}

+ 52 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/FinanceInvoiceReceivablesDTO.java

@@ -0,0 +1,52 @@
+package com.jeeplus.finance.invoice.service.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 财务管理-发票-收款明细
+ * @TableName finance_invoice_receivables
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class FinanceInvoiceReceivablesDTO extends BaseDTO {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 发票id
+     */
+    private String invoiceId;
+
+    /**
+     * 汇款单位
+     */
+    private String remittanceUnit;
+
+    /**
+     * 汇款金额
+     */
+    private String remittanceAmount;
+
+    /**
+     * 汇款时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date remittanceDate;
+
+    /**
+     * 是否收款
+     */
+    private String status;
+
+    private static final long serialVersionUID = 1L;
+}

+ 15 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/mapstruct/FinanceInvoiceBaseWrapper.java

@@ -0,0 +1,15 @@
+package com.jeeplus.finance.invoice.service.mapstruct;
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.finance.invoice.domain.FinanceInvoiceBase;
+import com.jeeplus.finance.invoice.service.dto.FinanceInvoiceBaseDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {})
+public interface FinanceInvoiceBaseWrapper extends EntityWrapper<FinanceInvoiceBaseDTO, FinanceInvoiceBase>{
+
+        FinanceInvoiceBaseWrapper INSTANCE = Mappers.getMapper(FinanceInvoiceBaseWrapper.class);
+
+}

+ 15 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/mapstruct/FinanceInvoiceDetailWrapper.java

@@ -0,0 +1,15 @@
+package com.jeeplus.finance.invoice.service.mapstruct;
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.finance.invoice.domain.FinanceInvoiceDetail;
+import com.jeeplus.finance.invoice.service.dto.FinanceInvoiceDetailDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {})
+public interface FinanceInvoiceDetailWrapper extends EntityWrapper<FinanceInvoiceDetailDTO, FinanceInvoiceDetail>{
+
+        FinanceInvoiceDetailWrapper INSTANCE = Mappers.getMapper(FinanceInvoiceDetailWrapper.class);
+
+}

+ 15 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/mapstruct/FinanceInvoiceInvalidWrapper.java

@@ -0,0 +1,15 @@
+package com.jeeplus.finance.invoice.service.mapstruct;
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.finance.invoice.domain.FinanceInvoiceInvalid;
+import com.jeeplus.finance.invoice.service.dto.FinanceInvoiceInvalidDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {})
+public interface FinanceInvoiceInvalidWrapper extends EntityWrapper<FinanceInvoiceInvalidDTO, FinanceInvoiceInvalid>{
+
+        FinanceInvoiceInvalidWrapper INSTANCE = Mappers.getMapper(FinanceInvoiceInvalidWrapper.class);
+
+}

+ 15 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/mapstruct/FinanceInvoiceReceivablesWrapper.java

@@ -0,0 +1,15 @@
+package com.jeeplus.finance.invoice.service.mapstruct;
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.finance.invoice.domain.FinanceInvoiceReceivables;
+import com.jeeplus.finance.invoice.service.dto.FinanceInvoiceReceivablesDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {})
+public interface FinanceInvoiceReceivablesWrapper extends EntityWrapper<FinanceInvoiceReceivablesDTO, FinanceInvoiceReceivables>{
+
+        FinanceInvoiceReceivablesWrapper INSTANCE = Mappers.getMapper(FinanceInvoiceReceivablesWrapper.class);
+
+}

+ 15 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/mapstruct/FinanceInvoiceWrapper.java

@@ -0,0 +1,15 @@
+package com.jeeplus.finance.invoice.service.mapstruct;
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.finance.invoice.domain.FinanceInvoice;
+import com.jeeplus.finance.invoice.service.dto.FinanceInvoiceDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {})
+public interface FinanceInvoiceWrapper extends EntityWrapper<FinanceInvoiceDTO, FinanceInvoice>{
+
+        FinanceInvoiceWrapper INSTANCE = Mappers.getMapper(FinanceInvoiceWrapper.class);
+
+}

+ 653 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/controller/ProjectListController.java

@@ -0,0 +1,653 @@
+package com.jeeplus.finance.program.configuration.projectList.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.aop.demo.annotation.DemoMode;
+import com.jeeplus.common.excel.ExcelOptions;
+import com.jeeplus.common.excel.annotation.ExportMode;
+import com.jeeplus.common.utils.ResponseUtil;
+import com.jeeplus.finance.program.configuration.projectList.service.ProjectListService;
+import com.jeeplus.finance.program.configuration.projectList.service.dto.*;
+import com.jeeplus.finance.projectRecords.Utils.EasyPoiUtil;
+import com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo;
+import com.jeeplus.finance.utils.FreemarkerUtil;
+import com.jeeplus.finance.workContract.domain.WorkContractInfo;
+import com.jeeplus.logging.annotation.ApiLog;
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Api(tags ="项目列表管理")
+@RestController
+@RequestMapping(value = "/program/projectList")
+public class ProjectListController {
+
+    @Resource
+    private ProjectListService projectListService;
+
+    /**
+     * 查询当前登录人所属项目组的项目
+     * @return
+     */
+    @ApiOperation(value = "查询当前登录人所属项目组的项目")
+    @GetMapping(value = "/getOverArchiveFlag")
+    public ResponseEntity<String> getOverArchiveFlag() {
+        return projectListService.getOverArchiveFlag();
+    }
+
+    /**
+     * 查询项目签发单完成后3天未归档项目信息
+     * @return
+     */
+    @GetMapping("getOverdueFilingProjectList")
+    public String getOverdueFilingProjectList(){
+        List<ProgramProjectListInfo> listInfos = projectListService.getOverdueFilingProjectList();
+        return JSON.toJSONString(listInfos);
+    }
+
+    /**
+     * 修改报告归档 归档状态信息
+     * @param id
+     * @param archiveStatus
+     * @param overArchiveStatus
+     */
+    @GetMapping("updateArchiveStatus")
+    public void updateArchiveStatus(@RequestParam(value = "id")String id,
+                                    @RequestParam(value = "archiveStatus")String archiveStatus,
+                                    @RequestParam(value = "overArchiveStatus")String overArchiveStatus){
+        projectListService.updateArchiveStatus(id, archiveStatus, overArchiveStatus);
+    }
+
+    /**
+     * 新增/修改
+     */
+    @ApiOperation(value = "新增/修改")
+    @PostMapping(value = "/save")
+    public ResponseEntity<String> save(@RequestBody ProjectListDto projectListDto) throws Exception{
+        String id = projectListService.save(projectListDto,"1");
+        return ResponseEntity.ok("操作成功");
+    }
+
+    /**
+     * 2022项目-新增/修改
+     */
+    @ApiOperation(value = "新增/修改")
+    @PostMapping(value = "/save2022")
+    public ResponseEntity<String> save2022(@RequestBody ProjectListDto projectListDto) throws Exception{
+        String id = projectListService.save(projectListDto,"2022");
+        return ResponseEntity.ok("操作成功");
+    }
+
+    /**
+     * 新增/修改项目归档
+     */
+    @ApiOperation(value = "新增/修改项目归档")
+    @PostMapping(value = "/saveFormArchive")
+    public ResponseEntity saveFormArchive(@RequestBody ProgramArchiveDto programArchiveDto) throws Exception{
+        String id = projectListService.saveFormArchive(programArchiveDto);
+        return ResponseUtil.newInstance().add("businessTable", "program_archive").add("businessId", id).ok ("操作成功");
+    }
+
+    /**
+     * 新增/修改三级校审
+     */
+    @ApiOperation(value = "新增/修改三级校审")
+    @PostMapping(value = "/saveFormThree")
+    public ResponseEntity saveFormThree(@RequestBody ProgramAuditDto programAuditDto) throws Exception{
+        String id = projectListService.saveFormThree(programAuditDto);
+        return ResponseUtil.newInstance().add("businessTable", "program_audit").add("businessId", id).ok ("操作成功");
+    }
+
+    /**
+     * 流程保存
+     */
+    @ApiOperation(value = "流程保存")
+    @PostMapping(value = "/saveForm")
+    public ResponseEntity saveForm(@RequestBody ProjectListDto projectListDto) throws Exception{
+        String id = projectListService.save(projectListDto,"1");
+        return ResponseUtil.newInstance().add("businessTable", "program_project_list_info").add("businessId", id).ok ("操作成功");
+    }
+
+    /**
+     * 根据id查询
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据id查询")
+    @GetMapping(value = "/findById")
+    public ResponseEntity<ProjectListDto> save(@RequestParam String id){
+        ProjectListDto dto = projectListService.findById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 根据id查询三级校审
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据id查询三级校审")
+    @GetMapping(value = "/findByIdAudit")
+    public ResponseEntity<ProgramAuditDto> findByIdAudit(@RequestParam String id){
+        ProgramAuditDto dto = projectListService.findByIdAudit(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 根据id查询项目归档
+     * @return
+     */
+    @ApiOperation(value = "根据id查询项目归档")
+    @GetMapping(value = "/findByIdArchive")
+    public ResponseEntity<ProgramArchiveDto> findByIdArchive(@RequestParam String id){
+        ProgramArchiveDto dto = projectListService.findByIdArchive(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 根据id删除
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据id删除")
+    @GetMapping(value = "/deleteById")
+    public ResponseEntity<String> deleteById(@RequestParam String id){
+        String s = projectListService.deleteById(id);
+        return ResponseEntity.ok(s);
+    }
+
+
+    /**
+     * 批量删除字典
+     */
+    @DemoMode
+    @ApiLog("批量删除项目信息")
+    @PreAuthorize("hasAuthority('program:registered:del')")
+    @DeleteMapping("delete")
+    public ResponseEntity delete(String ids) {
+        String idArray[] = ids.split ( "," );
+        for(String id: idArray){
+            projectListService.deleteById ( id );
+        }
+        return ResponseEntity.ok ( "删除信息成功!" );
+    }
+
+    /**
+     * 合同信息列表查询
+     * @param dto
+     * @param page
+     * @return
+     */
+    @ApiOperation(value = "合同信息列表查询")
+    @GetMapping(value = "/findContractPageList")
+    public ResponseEntity<IPage<WorkContractInfo>> findContractPageList(ContractDto dto, Page<WorkContractInfo> page) {
+        IPage<WorkContractInfo> pageList = projectListService.findContractPageList(dto, page);
+        return ResponseEntity.ok(pageList);
+    }
+
+    /**
+     * 根据id修改状态值status
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "根据id修改状态值status")
+    @PostMapping(value = "/updateStatusById")
+    public ResponseEntity<String> updateStatusById(@RequestBody ProjectListDto dto) {
+        String s = projectListService.updateStatusById(dto);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 根据id修改三级校审状态值status
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "根据id修改三级校审状态值status")
+    @PostMapping(value = "/updateStatusByAuditId")
+    public ResponseEntity<String> updateStatusByAuditId(@RequestBody ProjectListDto dto) {
+        String s = projectListService.updateStatusByAuditId(dto);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 根据id修改项目归档状态值status
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "根据id修改项目归档状态值status")
+    @PostMapping(value = "/updateStatusByArchiveId")
+    public ResponseEntity<String> updateStatusByArchiveId(@RequestBody ProjectListDto dto) {
+        String s = projectListService.updateStatusByArchiveId(dto);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 项目登记列表
+     * @param info
+     * @param page
+     * @return
+     * @throws Exception
+     */
+    @ApiOperation(value = "项目登记列表")
+    @GetMapping(value = "/list")
+    public ResponseEntity<IPage<ProgramProjectListInfo>> list(ProgramProjectListInfo info, Page<ProgramProjectListInfo> page) throws Exception {
+        IPage<ProgramProjectListInfo> list = projectListService.list(page, info, "1");
+        return ResponseEntity.ok (list);
+    }
+
+    /**
+     * 项目登记列表,和上面list接口是一样的,目的时跳过list mapper接口的数据规则(比如仅部门可见、仅自己可见之类的)
+     */
+    @GetMapping(value = "/list2")
+    public ResponseEntity<IPage<ProgramProjectListInfo>> list2(ProgramProjectListInfo info, Page<ProgramProjectListInfo> page) throws Exception {
+        IPage<ProgramProjectListInfo> list = projectListService.list2(page, info, "1");
+        return ResponseEntity.ok (list);
+    }
+
+    /**
+     * 2022项目-项目登记列表
+     * @param info
+     * @param page
+     * @return
+     * @throws Exception
+     */
+    @ApiOperation(value = "2022项目-项目登记列表")
+    @GetMapping(value = "/list2022")
+    public ResponseEntity<IPage<ProgramProjectListInfo>> list2022(ProgramProjectListInfo info, Page<ProgramProjectListInfo> page) throws Exception {
+        IPage<ProgramProjectListInfo> list = projectListService.list(page, info, "2022");
+        return ResponseEntity.ok (list);
+    }
+
+
+    @ApiLog(value = "导出项目信息")
+    @GetMapping("exportFile")
+    @ApiOperation(value = "导出项目信息")
+    public void exportFile(ProgramProjectListInfo info, Page <ProgramProjectListInfo> page, ExcelOptions options, HttpServletResponse response) throws Exception {
+        String fileName = options.getFilename();
+        String sheetName = options.getSheetName();
+        List<ProgramProjectListInfo> result = new ArrayList<>();
+        if ( ExportMode.current.equals ( options.getMode() ) ) {
+            result = projectListService.list (page,info,"1").getRecords();
+        } else if (ExportMode.selected.equals ( options.getMode() )) {
+            result = projectListService.list (page,info,"1").getRecords().stream ( ).filter ( item ->
+                    options.getSelectIds ( ).contains ( item.getId ( ) )
+            ).collect ( Collectors.toList ( ) );
+        } else {
+            page.setSize (-1);
+            page.setCurrent (0);
+            result = projectListService.list (page,info,"1").getRecords();
+        }
+        List<ExportFileDto> exportFileDtos = projectListService.exportList(result);
+        EasyPoiUtil.exportExcel ( exportFileDtos, sheetName,  sheetName, ExportFileDto.class, fileName, response );
+
+    }
+
+
+
+
+    /**
+     * 根据项目id生成报告号
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据项目id生成报告号")
+    @GetMapping(value = "/saveReportNo")
+    public ResponseEntity<String> saveReportNo(@RequestParam("id") String id) throws Exception {
+        String s = projectListService.saveReportNo(id);
+        if (StringUtils.isNotBlank(s)) {
+            return ResponseEntity.ok("已生成报告号:"+s);
+        }else{
+            return ResponseEntity.badRequest().body("报告号生成失败");
+        }
+    }
+
+    /**
+     * 下载评估报告装订后浏览审核记录表
+     * 下载一级校审表
+     * @param response
+     * @param info
+     */
+    @RequestMapping(value="downloadFirstAuditTpl")
+    @ResponseBody
+    public void downloadFirstAuditTpl(HttpServletResponse response, ProgramProjectListInfo info)  {
+        Map data = projectListService.getAuditInfoMap(info);
+
+
+        //模板对象
+        Template template=null;
+        //下载文件地址
+        String filePath = null;
+        if(System.getProperty("os.name").toLowerCase().contains("win")){
+            filePath = this.getClass().getResource("/").getPath()+"/freemarker";
+        }else{
+            filePath = "/mnt/project/cloud/freemarker";
+        }
+        //freemaker模板路径
+        File path = new File(filePath);
+
+        Configuration cfg = new Configuration();
+        try {
+            cfg.setDirectoryForTemplateLoading(path);
+            //选择对应的ftl文件
+            template = cfg.getTemplate("firstAudit.ftl","UTF-8");
+
+            File docFile = new File("一级校审.doc");
+            FreemarkerUtil.generateFile(data,template,docFile);
+            com.jeeplus.finance.utils.ResponseUtil.docResponse("一级校审.doc",docFile,response);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+
+            if(System.getProperty("os.name").toLowerCase().contains("win")){
+                //获取tomcat的路径
+                String tomcatFilePath=System.getProperty("catalina.home");
+                //删除tomcat目录下的处理后的文件信息
+                File tomcatFile = new File(tomcatFilePath+"/bin/"+"一级校审.doc");
+                if (tomcatFile.isFile()) {
+                    tomcatFile.delete();
+                }
+            }else{
+                //删除目录下的处理后的文件信息
+                File tomcatFile = new File("/mnt/project/cloud/"+"一级校审.doc");
+                if (tomcatFile.isFile()) {
+                    tomcatFile.delete();
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 下载二级校审表
+     * @param response
+     * @param info
+     */
+    @RequestMapping(value="downloadSecondAuditTpl")
+    @ResponseBody
+    public void downloadSecondAuditTpl(HttpServletResponse response, ProgramProjectListInfo info)  {
+        Map data = projectListService.getAuditInfoMap(info);
+
+
+        //模板对象
+        Template template=null;
+        //下载文件地址
+        String filePath = null;
+        if(System.getProperty("os.name").toLowerCase().contains("win")){
+            filePath = this.getClass().getResource("/").getPath()+"/freemarker";
+        }else{
+            filePath = "/mnt/project/cloud/freemarker";
+        }
+        //freemaker模板路径
+        File path = new File(filePath);
+        Configuration cfg = new Configuration();
+        try {
+            cfg.setDirectoryForTemplateLoading(path);
+            //选择对应的ftl文件
+            template = cfg.getTemplate("secondAuditFtl.ftl","UTF-8");
+
+            File docFile = new File("二级校审.doc");
+            FreemarkerUtil.generateFile(data,template,docFile);
+            com.jeeplus.finance.utils.ResponseUtil.docResponse("二级校审.doc",docFile,response);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            if(System.getProperty("os.name").toLowerCase().contains("win")){
+                //获取tomcat的路径
+                String tomcatFilePath=System.getProperty("catalina.home");
+                //删除tomcat目录下的处理后的文件信息
+                File tomcatFile = new File(tomcatFilePath+"/bin/"+"二级校审.doc");
+                if (tomcatFile.isFile()) {
+                    tomcatFile.delete();
+                }
+            }else{
+                //删除目录下的处理后的文件信息
+                File tomcatFile = new File("/mnt/project/cloud/"+"二级校审.doc");
+                if (tomcatFile.isFile()) {
+                    tomcatFile.delete();
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 下载三级校审表
+     * @param response
+     * @param info
+     */
+    @RequestMapping(value="downloadThirdlyAuditTpl")
+    @ResponseBody
+    public void downloadThirdlyAuditTpl(HttpServletResponse response, ProgramProjectListInfo info)  {
+        Map data = projectListService.getAuditInfoMap(info);
+
+
+        //模板对象
+        Template template=null;
+        //下载文件地址
+        String filePath = null;
+        if(System.getProperty("os.name").toLowerCase().contains("win")){
+            filePath = this.getClass().getResource("/").getPath()+"/freemarker";
+        }else{
+            filePath = "/mnt/project/cloud/freemarker";
+        }
+        //freemaker模板路径
+        File path = new File(filePath);
+        Configuration cfg = new Configuration();
+        try {
+            cfg.setDirectoryForTemplateLoading(path);
+            //选择对应的ftl文件
+            template = cfg.getTemplate("thirdlyAudit.ftl","UTF-8");
+
+            File docFile = new File("三级校审.doc");
+            FreemarkerUtil.generateFile(data,template,docFile);
+            com.jeeplus.finance.utils.ResponseUtil.docResponse("三级校审.doc",docFile,response);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            if(System.getProperty("os.name").toLowerCase().contains("win")){
+                //获取tomcat的路径
+                String tomcatFilePath=System.getProperty("catalina.home");
+                //删除tomcat目录下的处理后的文件信息
+                File tomcatFile = new File(tomcatFilePath+"/bin/"+"三级校审.doc");
+                if (tomcatFile.isFile()) {
+                    tomcatFile.delete();
+                }
+            }else{
+                //删除目录下的处理后的文件信息
+                File tomcatFile = new File("/mnt/project/cloud/"+"三级校审.doc");
+                if (tomcatFile.isFile()) {
+                    tomcatFile.delete();
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 下载资产评估项目(校对)审核记录表
+     * @param response
+     * @param info
+     */
+    @RequestMapping(value="downloadProofreadAuditTpl")
+    @ResponseBody
+    public void downloadProofreadAuditTpl(HttpServletResponse response, ProgramProjectListInfo info)  {
+        Map data = projectListService.getProofreadAuditMap(info);
+
+
+        //模板对象
+        Template template=null;
+        //下载文件地址
+        String filePath = null;
+        if(System.getProperty("os.name").toLowerCase().contains("win")){
+            filePath = this.getClass().getResource("/").getPath()+"/freemarker";
+        }else{
+            filePath = "/mnt/project/cloud/freemarker";
+        }
+        //freemaker模板路径
+        File path = new File(filePath);
+        Configuration cfg = new Configuration();
+        try {
+            cfg.setDirectoryForTemplateLoading(path);
+            //选择对应的ftl文件
+            template = cfg.getTemplate("proofreadAudit.ftl","UTF-8");
+
+            File docFile = new File("资产评估项目(校对)审核记录表.xls");
+            FreemarkerUtil.generateFile(data,template,docFile);
+            com.jeeplus.finance.utils.ResponseUtil.docResponse("资产评估项目(校对)审核记录表.xls",docFile,response);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            if(System.getProperty("os.name").toLowerCase().contains("win")){
+                //获取tomcat的路径
+                String tomcatFilePath=System.getProperty("catalina.home");
+                //删除tomcat目录下的处理后的文件信息
+                File tomcatFile = new File(tomcatFilePath+"/bin/"+"资产评估项目(校对)审核记录表.xls");
+                if (tomcatFile.isFile()) {
+                    tomcatFile.delete();
+                }
+            }else{
+                //删除目录下的处理后的文件信息
+                File tomcatFile = new File("/mnt/project/cloud/"+"资产评估项目(校对)审核记录表.xls");
+                if (tomcatFile.isFile()) {
+                    tomcatFile.delete();
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 下载评估报告装订后浏览审核记录表
+     * @param response
+     * @param info
+     */
+    @RequestMapping(value="downloadAuditRecordFormAfterBindingTpl")
+    @ResponseBody
+    public void downloadAuditRecordFormAfterBindingTpl(HttpServletResponse response, ProgramProjectListInfo info)  {
+        Map data = projectListService.getAuditRecordFormAfterBindingMap(info);
+
+
+        //模板对象
+        Template template=null;
+        //下载文件地址
+        String filePath = null;
+        if(System.getProperty("os.name").toLowerCase().contains("win")){
+            filePath = this.getClass().getResource("/").getPath()+"/freemarker";
+        }else{
+            filePath = "/mnt/project/cloud/freemarker";
+        }
+        //freemaker模板路径
+        File path = new File(filePath);
+        Configuration cfg = new Configuration();
+        try {
+            cfg.setDirectoryForTemplateLoading(path);
+            //选择对应的ftl文件
+            template = cfg.getTemplate("auditRecordFormAfterBinding.ftl","UTF-8");
+
+            File docFile = new File("评估报告装订后浏览审核记录表.xls");
+            FreemarkerUtil.generateFile(data,template,docFile);
+            com.jeeplus.finance.utils.ResponseUtil.docResponse("评估报告装订后浏览审核记录表.xls",docFile,response);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            if(System.getProperty("os.name").toLowerCase().contains("win")){
+                //获取tomcat的路径
+                String tomcatFilePath=System.getProperty("catalina.home");
+                //删除tomcat目录下的处理后的文件信息
+                File tomcatFile = new File(tomcatFilePath+"/bin/"+"评估报告装订后浏览审核记录表.xls");
+                if (tomcatFile.isFile()) {
+                    tomcatFile.delete();
+                }
+            }else{
+                //删除目录下的处理后的文件信息
+                File tomcatFile = new File("/mnt/project/cloud/"+"评估报告装订后浏览审核记录表.xls");
+                if (tomcatFile.isFile()) {
+                    tomcatFile.delete();
+                }
+            }
+        }
+    }
+
+    /**
+     * 下载报告签发表
+     * @param response
+     * @param info
+     */
+    @RequestMapping(value="downloadReportAusstellungTpl")
+    @ResponseBody
+    public void downloadReportAusstellungTpl(HttpServletResponse response, ProgramProjectListInfo info)  {
+        Map data = projectListService.downloadReportAusstellungTpl(info);
+
+
+        //模板对象
+        Template template=null;
+        //下载文件地址
+        String filePath = null;
+        if(System.getProperty("os.name").toLowerCase().contains("win")){
+            filePath = this.getClass().getResource("/").getPath()+"/freemarker";
+        }else{
+            filePath = "/mnt/project/cloud/freemarker";
+        }
+        //freemaker模板路径
+        File path = new File(filePath);
+        Configuration cfg = new Configuration();
+        try {
+            cfg.setDirectoryForTemplateLoading(path);
+            //选择对应的ftl文件
+            template = cfg.getTemplate("reportAusstellung.ftl","UTF-8");
+
+            File docFile = new File("报告签发单.doc");
+            FreemarkerUtil.generateFile(data,template,docFile);
+            com.jeeplus.finance.utils.ResponseUtil.docResponse("报告签发单.doc",docFile,response);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            if(System.getProperty("os.name").toLowerCase().contains("win")){
+                //获取tomcat的路径
+                String tomcatFilePath=System.getProperty("catalina.home");
+                //删除tomcat目录下的处理后的文件信息
+                File tomcatFile = new File(tomcatFilePath+"/bin/"+"报告签发单.doc");
+                if (tomcatFile.isFile()) {
+                    tomcatFile.delete();
+                }
+            }else{
+                //删除目录下的处理后的文件信息
+                File tomcatFile = new File("/mnt/project/cloud/"+"报告签发单.doc");
+                if (tomcatFile.isFile()) {
+                    tomcatFile.delete();
+                }
+            }
+        }
+    }
+
+
+    /**
+     * 查询当前登录人所属项目组的项目
+     * @return
+     */
+    @ApiOperation(value = "查询当前登录人所属项目组的项目")
+    @GetMapping(value = "/getHaveProjectIds")
+    public ResponseEntity<List<String>> getHaveProjectIds() {
+        return projectListService.getHaveProjectIds();
+    }
+
+    @ApiOperation(value = "根据项目id以及校审等级查询三级校审详情")
+    @GetMapping(value = "/findByProIdAndLevel")
+    public ResponseEntity<ProgramAuditDto> findByProIdAndLevel(String programId, String auditLevel) {
+        return projectListService.findByProIdAndLevel(programId, auditLevel);
+    }
+}

+ 183 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/domain/ProgramArchive.java

@@ -0,0 +1,183 @@
+package com.jeeplus.finance.program.configuration.projectList.domain;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 新项目管理-项目登记-项目归档
+ * @TableName program_archive
+ */
+@Data
+@TableName(value = "program_archive")
+public class ProgramArchive extends BaseEntity {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 项目id
+     */
+    private String programId;
+
+    /**
+     * 年份
+     */
+    private String year;
+
+    /**
+     * 项目类型
+     */
+    private String programType;
+
+    /**
+     * 评估报告日
+     */
+    private Date evaluationReportDate;
+
+    /**
+     * 协议号
+     */
+    private String protocolNum;
+
+    /**
+     * 废旧物资评估(万元)
+     */
+    private String waystEvaluation;
+
+    /**
+     * 固定资产评估(万元)
+     */
+    private String fixedAssetsEvaluation;
+
+    /**
+     * 净资产评估
+     */
+    private String netAssetsEvaluation;
+
+    /**
+     * 租金评估(万/年)
+     */
+    private String rentEvaluation;
+
+    /**
+     * 司法鉴定
+     */
+    private String forensics;
+
+    /**
+     * 报告收费(元)
+     */
+    private String reportCharges;
+
+    /**
+     * 租金类型
+     */
+    private String rentType;
+
+    /**
+     * 当前处理人
+     */
+    private String currentDisposePerson;
+
+    /**
+     * 是否开票
+     */
+    private String isInvoice;
+
+    /**
+     * 开票日期
+     */
+    private Date invoiceDate;
+
+    /**
+     * 预估/实际收费(万元)
+     */
+    private String actualCharges;
+
+    /**
+     * 合同是否存档
+     */
+    private String isContractArchive;
+
+    /**
+     * 底稿是否完好
+     */
+    private String isPapersIntact;
+
+    /**
+     * 底稿是否归档
+     */
+    private String isPapersArchive;
+
+    /**
+     * 报销外勤天数
+     */
+    private String opsAmount;
+
+    /**
+     * 外勤是否已经报销
+     */
+    private String isOpsReimbursement;
+
+    /**
+     * 已报销金额
+     */
+    private String reimbursementAmount;
+
+    /**
+     * 未报销金额
+     */
+    private String unreimbursedAmount;
+
+    /**
+     * 报销单号
+     */
+    private String reimbursementNum;
+
+    /**
+     * 报销日期
+     */
+    private Date reimbursementDate;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     * 流程信息
+     */
+    private String processDefinitionId;
+
+    /**
+     * 状态
+     */
+    private String status;
+
+    /**
+     * 审核通过时间
+     */
+    private String auditDate;
+
+    /**
+     * 审核通过审批人id
+     */
+    private String auditUserId;
+
+    /**
+     * 签字评估师1
+     */
+    private String signatureEvaluatorFirst;
+
+    /**
+     * 签字评估师2
+     */
+    private String signatureEvaluatorSecond;
+
+    private static final long serialVersionUID = 1L;
+}

+ 88 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/domain/ProgramAudit.java

@@ -0,0 +1,88 @@
+package com.jeeplus.finance.program.configuration.projectList.domain;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 新项目管理-项目登记-三级校审
+ * @TableName program_audit
+ */
+@Data
+@TableName(value = "program_audit")
+public class ProgramAudit extends BaseEntity {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 项目id
+     */
+    private String programId;
+
+    /**
+     * 校审级别
+     */
+    private String auditLevel;
+
+    /**
+     * 审核人
+     */
+    private String auditPeople;
+
+    /**
+     * 审核通过时间
+     */
+    private Date auditDate;
+
+    /**
+     * 执行人员保留意见
+     */
+    private String retainOpinion;
+
+    /**
+     * 审核人员审核未修改意见
+     */
+    private String changeOpinion;
+
+    /**
+     * 审核意见及回复/明细表
+     */
+    private String detailOpinion;
+
+    /**
+     * 审核意见及回复/评估报告
+     */
+    private String reportOpinion;
+
+    /**
+     * 审核意见及回复/技术说明
+     */
+    private String remarksOpinion;
+
+    /**
+     * 审核意见及回复/工作底稿
+     */
+    private String workOpinion;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     * 流程信息
+     */
+    private String processDefinitionId;
+
+    /**
+     * 状态
+     */
+    private String status;
+
+    private static final long serialVersionUID = 1L;
+}

+ 30 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/domain/ProgramAuditAssessPeople.java

@@ -0,0 +1,30 @@
+package com.jeeplus.finance.program.configuration.projectList.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 新项目管理-项目登记-三级校审-评估人员
+ * @TableName program_audit_assess_people
+ */
+@Data
+@TableName(value = "program_audit_assess_people")
+public class ProgramAuditAssessPeople extends BaseEntity {
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 校审id
+     */
+    private String auditId;
+
+    /**
+     * 评估人员
+     */
+    private String assessPeople;
+
+    private static final long serialVersionUID = 1L;
+}

+ 45 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/domain/ProgramMembers.java

@@ -0,0 +1,45 @@
+package com.jeeplus.finance.program.configuration.projectList.domain;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 评估-项目管理-项目组成员
+ * @TableName program_members
+ */
+@TableName(value ="program_members")
+@Data
+public class ProgramMembers extends BaseEntity implements Serializable {
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    /**
+     * 项目id
+     */
+    private String projectId;
+
+    /**
+     * 人员id
+     */
+    private String userId;
+
+    /**
+     * 状态  0为正常  1为移除
+     */
+    private String status;
+
+    /**
+     * 项目主要成员  1为主要成员 
+     */
+    private String isImportant;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 30 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/domain/ProgramProjectListLink.java

@@ -0,0 +1,30 @@
+package com.jeeplus.finance.program.configuration.projectList.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+@Data
+@TableName(value = "program_project_list_link")
+public class ProgramProjectListLink extends BaseEntity {
+
+    private String type;
+
+    private String infoId;
+
+    private String contacts;
+
+    private String linkMobilePhoneFirst;
+
+    private String linkMobilePhoneSecoed;
+
+    private String job;
+
+    private String remarks;
+
+    /**
+     * 人员类型
+     */
+    private String clientType;
+
+}

+ 23 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/domain/ProgramProjectListMember.java

@@ -0,0 +1,23 @@
+package com.jeeplus.finance.program.configuration.projectList.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+@Data
+@TableName(value = "program_project_list_member")
+public class ProgramProjectListMember extends BaseEntity {
+
+    private String infoId;
+
+    private String name;
+
+    private String workHours;
+
+    private String type;
+
+    private String job;
+
+    private String userId;
+
+}

+ 31 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/domain/ProgramReportNo.java

@@ -0,0 +1,31 @@
+package com.jeeplus.finance.program.configuration.projectList.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 新项目管理-项目登记-项目报告号表
+ * @TableName program_report_no
+ */
+@Data
+@TableName(value = "program_report_no")
+public class ProgramReportNo extends BaseEntity {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 项目id
+     */
+    private String programId;
+
+    /**
+     * 项目报告号
+     */
+    private String reportNo;
+
+    private static final long serialVersionUID = 1L;
+}

+ 27 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProgramArchiveMapper.java

@@ -0,0 +1,27 @@
+package com.jeeplus.finance.program.configuration.projectList.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.program.configuration.projectList.domain.ProgramArchive;
+import com.jeeplus.finance.program.configuration.projectList.service.dto.ProgramArchiveDto;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Entity com.jeeplus.test.program.configuration.projectList.domain.ProgramArchive
+ */
+@Mapper
+public interface ProgramArchiveMapper extends BaseMapper<ProgramArchive> {
+    @InterceptorIgnore(tenantLine = "true")
+    ProgramArchiveDto findByIdArchive(String id);
+
+    /**
+     * 根据项目id查询信息
+     * @param id
+     * @return
+     */
+    ProgramArchiveDto findByProgramIdArchive(String id);
+}
+
+
+
+

+ 17 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProgramAuditAssessPeopleMapper.java

@@ -0,0 +1,17 @@
+package com.jeeplus.finance.program.configuration.projectList.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.program.configuration.projectList.domain.ProgramAuditAssessPeople;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Entity com.jeeplus.test.program.configuration.projectList.domain.ProgramAuditAssessPeople
+ */
+@Mapper
+public interface ProgramAuditAssessPeopleMapper extends BaseMapper<ProgramAuditAssessPeople> {
+
+}
+
+
+
+

+ 33 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProgramAuditMapper.java

@@ -0,0 +1,33 @@
+package com.jeeplus.finance.program.configuration.projectList.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.program.configuration.projectList.domain.ProgramAudit;
+import com.jeeplus.finance.program.configuration.projectList.service.dto.ProgramAuditDto;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @Entity com.jeeplus.test.program.configuration.projectList.domain.ProgramAudit
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface ProgramAuditMapper extends BaseMapper<ProgramAudit> {
+    @InterceptorIgnore(tenantLine = "true")
+    ProgramAuditDto findByIdAudit(String id);
+
+    String findIdByProIdAndLevel(@Param("programId") String programId, @Param("auditLevel") String auditLevel);
+
+    /**
+     * 根据项目id去查询校审的id(一、二、三)
+     * @param programId
+     * @return
+     */
+    List<String> getIDsByProId(@Param("programId")String programId);
+}
+
+
+
+

+ 17 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProgramMembersMapper.java

@@ -0,0 +1,17 @@
+package com.jeeplus.finance.program.configuration.projectList.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.program.configuration.projectList.domain.ProgramMembers;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Entity com.jeeplus.test.program.configuration.projectList.domain.ProgramMembers
+ */
+@Mapper
+public interface ProgramMembersMapper extends BaseMapper<ProgramMembers> {
+
+}
+
+
+
+

+ 26 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProgramReportNoMapper.java

@@ -0,0 +1,26 @@
+package com.jeeplus.finance.program.configuration.projectList.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.program.configuration.projectList.domain.ProgramReportNo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Entity com.jeeplus.test.program.configuration.projectList.domain.ProgramReportNo
+ */
+@Mapper
+public interface ProgramReportNoMapper extends BaseMapper<ProgramReportNo> {
+
+    /**
+     * 根据项目id查报告号信息
+     * 过滤限制保留
+     * @param id
+     * @return
+     */
+    @InterceptorIgnore(tenantLine = "true")
+    ProgramReportNo selectByProgramId(String id);
+}
+
+
+
+

+ 15 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProjectLinkMapper.java

@@ -0,0 +1,15 @@
+package com.jeeplus.finance.program.configuration.projectList.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.program.configuration.projectList.domain.ProgramProjectListLink;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+//@InterceptorIgnore(tenantLine = "true")
+public interface ProjectLinkMapper extends BaseMapper<ProgramProjectListLink> {
+
+    void deleteByInfoId(@Param("id") String id);
+
+}

+ 78 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProjectListMapper.java

@@ -0,0 +1,78 @@
+package com.jeeplus.finance.program.configuration.projectList.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.finance.program.configuration.projectList.service.dto.ContractDto;
+import com.jeeplus.finance.program.configuration.projectList.service.dto.ExportFileDto;
+import com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo;
+import com.jeeplus.finance.workContract.domain.WorkContractInfo;
+import com.jeeplus.sys.service.dto.UserDTO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+
+@Mapper
+public interface ProjectListMapper extends BaseMapper<ProgramProjectListInfo> {
+
+    /**
+     * 根据人员查询该人员是否存在超期未归档或超期归档中的项目信息
+     * @param currentUser
+     * @return
+     */
+    Integer getOverArchiveFlag(@Param("currentUser") UserDTO currentUser);
+
+    IPage<WorkContractInfo> findContractPageList(Page<WorkContractInfo> page, @Param("dto") ContractDto dto);
+
+    void updateStatusById(@Param("id")String id, @Param("status")String status);
+
+    //@InterceptorIgnore(tenantLine = "true")
+    IPage<ProgramProjectListInfo> findPageList(Page<ProgramProjectListInfo> page, @Param(Constants.WRAPPER) QueryWrapper<ProgramProjectListInfo> wrapper);
+    /**
+     * 项目登记列表,和上面findPageList接口是一样的,目的时跳过findPageList mapper接口的数据规则(比如仅部门可见、仅自己可见之类的)
+     */
+    IPage<ProgramProjectListInfo> findPageList2(Page<ProgramProjectListInfo> page, @Param(Constants.WRAPPER) QueryWrapper<ProgramProjectListInfo> wrapper);
+
+    List<ProgramProjectListInfo> findInfoList(@Param(Constants.WRAPPER) QueryWrapper<ProgramProjectListInfo> wrapper);
+
+    List<ExportFileDto> findList(@Param("infoList")List<ProgramProjectListInfo> infoList);
+
+    IPage<ProgramProjectListInfo> findPage(Page<ProgramProjectListInfo> page, @Param(Constants.WRAPPER) QueryWrapper<ProgramProjectListInfo> wrapper);
+
+    String selectInvoiceFlag(@Param("id") String id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    ProgramProjectListInfo getById(@Param("id")String id);
+
+    List<String> getHaveProjectIds(@Param("currentUser") UserDTO currentUser);
+
+    /**
+     * 根据id集合查询项目信息
+     * 过滤限制保留
+     * @param idList
+     * @return
+     */
+    @InterceptorIgnore(tenantLine = "true")
+    List<ProgramProjectListInfo> getListByidList(@Param("idList") List<String> idList);
+
+    /**
+     * 修改报告归档 归档状态信息
+     * @param id
+     * @param archiveStatus 归档状态
+     * @param overArchiveStatus 超期归档状态值(over_archive_status:0:未超期;1:已超期)
+     */
+    void updateArchiveStatus(@Param("id")String id, @Param("archiveStatus")String archiveStatus, @Param("overArchiveStatus")String overArchiveStatus);
+
+    /**
+     * 查询项目签发单完成后3天未归档项目信息
+     * @param threeDayAgo 签发单完成时间
+     * @return
+     */
+    @InterceptorIgnore(tenantLine = "true")
+    List<ProgramProjectListInfo> getOverdueFilingProjectList(@Param("threeDayAgo") String threeDayAgo);
+}

+ 13 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/ProjectMemberMapper.java

@@ -0,0 +1,13 @@
+package com.jeeplus.finance.program.configuration.projectList.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.program.configuration.projectList.domain.ProgramProjectListMember;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface ProjectMemberMapper extends BaseMapper<ProgramProjectListMember> {
+
+    void deleteByInfoId(@Param("id") String id);
+
+}

+ 176 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProgramArchiveMapper.xml

@@ -0,0 +1,176 @@
+<?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.program.configuration.projectList.mapper.ProgramArchiveMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.finance.program.configuration.projectList.service.dto.ProgramArchiveDto">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_date" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_date" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="programId" column="program_id" jdbcType="VARCHAR"/>
+            <result property="year" column="year" jdbcType="VARCHAR"/>
+            <result property="programType" column="program_type" jdbcType="VARCHAR"/>
+            <result property="evaluationReportDate" column="evaluation_report_date" jdbcType="TIMESTAMP"/>
+            <result property="protocolNum" column="protocol_num" jdbcType="VARCHAR"/>
+            <result property="waystEvaluation" column="wayst_evaluation" jdbcType="VARCHAR"/>
+            <result property="fixedAssetsEvaluation" column="fixed_assets_evaluation" jdbcType="VARCHAR"/>
+            <result property="netAssetsEvaluation" column="net_assets_evaluation" jdbcType="VARCHAR"/>
+            <result property="rentEvaluation" column="rent_evaluation" jdbcType="VARCHAR"/>
+            <result property="forensics" column="forensics" jdbcType="VARCHAR"/>
+            <result property="reportCharges" column="report_charges" jdbcType="VARCHAR"/>
+            <result property="currentDisposePerson" column="current_dispose_person" jdbcType="VARCHAR"/>
+            <result property="isInvoice" column="is_invoice" jdbcType="VARCHAR"/>
+            <result property="invoiceDate" column="invoice_date" jdbcType="TIMESTAMP"/>
+            <result property="actualCharges" column="actual_charges" jdbcType="VARCHAR"/>
+            <result property="isContractArchive" column="is_contract_archive" jdbcType="VARCHAR"/>
+            <result property="isPapersIntact" column="is_papers_intact" jdbcType="VARCHAR"/>
+            <result property="isPapersArchive" column="is_papers_archive" jdbcType="VARCHAR"/>
+            <result property="opsAmount" column="ops_amount" jdbcType="VARCHAR"/>
+            <result property="isOpsReimbursement" column="is_ops_reimbursement" jdbcType="VARCHAR"/>
+            <result property="reimbursementAmount" column="reimbursement_amount" jdbcType="VARCHAR"/>
+            <result property="unreimbursedAmount" column="unreimbursed_amount" jdbcType="VARCHAR"/>
+            <result property="reimbursementNum" column="reimbursement_num" jdbcType="VARCHAR"/>
+            <result property="reimbursementDate" column="reimbursement_date" jdbcType="TIMESTAMP"/>
+            <result property="auditDate" column="audit_date" jdbcType="TIMESTAMP"/>
+            <result property="procInsId" column="proc_ins_id" jdbcType="VARCHAR"/>
+            <result property="processDefinitionId" column="process_definition_id" jdbcType="VARCHAR"/>
+            <result property="status" column="status" jdbcType="VARCHAR"/>
+            <result property="overArchiveStatus" column="over_archive_status" jdbcType="VARCHAR"/>
+            <result property="reportNo" column="report_no" jdbcType="VARCHAR"/>
+            <result property="auditUserId" column="audit_user_id" jdbcType="VARCHAR"/>
+            <result property="signatureEvaluatorFirst" column="signature_evaluator_first" jdbcType="VARCHAR"/>
+            <result property="signatureEvaluatorSecond" column="signature_evaluator_second" jdbcType="VARCHAR"/>
+            <association property="programProjectListInfo" select="getProgram" javaType="com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo" column="program_id"></association>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        pa.id,
+        pa.create_by_id,
+        pa.create_time,
+        pa.update_by_id,
+        pa.update_time,
+        pa.del_flag,
+        pa.remarks,
+        pa.program_id,
+        pa.year,
+        pa.program_type,
+        pa.evaluation_report_date,
+        pa.protocol_num,
+        pa.wayst_evaluation,
+        pa.fixed_assets_evaluation,
+        pa.net_assets_evaluation,
+        pa.rent_evaluation,
+        pa.forensics,
+        pa.report_charges,
+        pa.rent_type,
+        pa.current_dispose_person,
+        pa.is_invoice,
+        pa.invoice_date,
+        pa.actual_charges,
+        pa.is_contract_archive,
+        pa.is_papers_intact,
+        pa.is_papers_archive,
+        pa.ops_amount,
+        pa.is_ops_reimbursement,
+        pa.reimbursement_amount,
+        pa.unreimbursed_amount,
+        pa.reimbursement_num,
+        pa.reimbursement_date,
+        pa.proc_ins_id,
+        pa.process_definition_id,
+        pa.status,
+        pa.over_archive_status,
+        pa.audit_date,
+        pa.audit_date as "auditDateDate",
+        pa.audit_user_id,
+        pa.signature_evaluator_first,
+        pa.signature_evaluator_second
+    </sql>
+    <sql id="Program_Column_List">
+        ppli.id,
+        ppli.create_by_id,
+        ppli.create_time,
+        ppli.update_by_id,
+        ppli.update_time,
+        ppli.del_flag,
+        ppli.contract_id,
+        ppli.contract_name,
+        ppli.client,
+        ppli.client_name,
+        ppli.amount,
+        ppli.contract_type,
+        ppli.name,
+        ppli.no,
+        ppli.project_type,
+        ppli.approval_no,
+        ppli.company,
+        ppli.project_mould,
+        ppli.property_holder,
+        ppli.property_holder_name,
+        ppli.location,
+        ppli.is_first,
+        ppli.year_num,
+        ppli.check_year,
+        ppli.project_manager,
+        ppli.project_manager_name,
+        ppli.report_type,
+        ppli.industry,
+        ppli.enterprise_type,
+        ppli.risk_level,
+        ppli.project_source,
+        ppli.estimate,
+        ppli.plan_end_time,
+        ppli.use_num,
+        ppli.appointment,
+        ppli.work_hours,
+        ppli.remarks,
+        ppli.assessment_enterprise,
+        ppli.assessment_enterprise_name,
+        ppli.link_num,
+        ppli.relationship,
+        ppli.assessment_way,
+        ppli.assessment_objective,
+        ppli.assessment_date,
+        ppli.num,
+        ppli.project_development,
+        ppli.delegate_project_type,
+        ppli.assessment_object,
+        ppli.work_begin_date,
+        ppli.work_end_date,
+        ppli.reporting_date,
+        ppli.is_have,
+        ppli.is_influence,mode,
+        ppli.status,
+        ppli.proc_ins_id,
+        ppli.process_definition_id
+    </sql>
+    <select id="getProgram" resultType="com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo">
+        select
+        <include refid="Program_Column_List"></include>,
+        wci.no AS contract_no
+        from program_project_list_info ppli
+        left join work_contract_info wci on wci.id = ppli.contract_id and wci.del_flag = '0'
+        where ppli.del_flag = '0' and ppli.id = #{program_id}
+    </select>
+    <select id="findByIdArchive" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"></include>,
+        prn.report_no as report_no
+        from program_archive pa
+        left join program_report_no prn on prn.program_id = pa.program_id and prn.del_flag = '0'
+        where pa.del_flag = '0' and pa.id = #{id}
+    </select>
+    <select id="findByProgramIdArchive" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"></include>,
+        prn.report_no as report_no
+        from program_archive pa
+        left join program_report_no prn on prn.program_id = pa.program_id and prn.del_flag = '0'
+        where pa.del_flag = '0' and pa.program_id = #{id}
+    </select>
+</mapper>

+ 30 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProgramAuditAssessPeopleMapper.xml

@@ -0,0 +1,30 @@
+<?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.program.configuration.projectList.mapper.ProgramAuditAssessPeopleMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.finance.program.configuration.projectList.service.dto.ProgramAuditAssessPeopleDto">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_date" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_date" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="auditId" column="audit_id" jdbcType="VARCHAR"/>
+            <result property="assessPeople" column="assess_people" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        paap.id,
+        paap.create_by_id,
+        paap.create_time,
+        paap.update_by_id,
+        paap.update_time,
+        paap.del_flag,
+        paap.remarks,
+        paap.audit_id,
+        paap.assess_people
+    </sql>
+</mapper>

+ 115 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProgramAuditMapper.xml

@@ -0,0 +1,115 @@
+<?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.program.configuration.projectList.mapper.ProgramAuditMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.finance.program.configuration.projectList.service.dto.ProgramAuditDto">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by_id" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by_id" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="programId" column="program_id" jdbcType="VARCHAR"/>
+            <result property="auditLevel" column="audit_level" jdbcType="VARCHAR"/>
+            <result property="auditPeople" column="audit_people" jdbcType="VARCHAR"/>
+            <result property="auditDate" column="audit_date" jdbcType="TIMESTAMP"/>
+            <result property="retainOpinion" column="retain_opinion" jdbcType="VARCHAR"/>
+            <result property="changeOpinion" column="change_opinion" jdbcType="VARCHAR"/>
+            <result property="detailOpinion" column="detail_opinion" jdbcType="VARCHAR"/>
+            <result property="reportOpinion" column="report_opinion" jdbcType="VARCHAR"/>
+            <result property="remarksOpinion" column="remarks_opinion" jdbcType="VARCHAR"/>
+            <result property="workOpinion" column="work_opinion" jdbcType="VARCHAR"/>
+            <result property="procInsId" column="proc_ins_id" jdbcType="VARCHAR"/>
+            <result property="processDefinitionId" column="process_definition_id" jdbcType="VARCHAR"/>
+            <result property="status" column="status" jdbcType="VARCHAR"/>
+            <association property="programProjectListInfo" select="getProgram" javaType="com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo" column="program_id"></association>
+            <collection property="programAuditAssessPeopleDtoList" select="getAssess" ofType="com.jeeplus.finance.program.configuration.projectList.service.dto.ProgramAuditAssessPeopleDto" column="id"></collection>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        pa.id,
+        pa.create_by_id,
+        pa.create_time,
+        pa.update_by_id,
+        pa.update_time,
+        pa.del_flag,
+        pa.remarks,
+        pa.program_id,
+        pa.audit_level,
+        pa.audit_people,
+        pa.audit_date,
+        pa.retain_opinion,
+        pa.change_opinion,
+        pa.detail_opinion,
+        pa.report_opinion,
+        pa.remarks_opinion,
+        pa.work_opinion,
+        pa.proc_ins_id,
+        pa.process_definition_id,
+        pa.status
+    </sql>
+    <sql id="Program_Column_List">
+        id,create_by_id,create_time,
+        update_by_id,update_time,del_flag,
+        contract_id,contract_name,client,
+        client_name,amount,contract_type,
+        name,no,project_type,
+        approval_no,company,project_mould,
+        property_holder,property_holder_name,location,
+        is_first,year_num,check_year,
+        project_manager,project_manager_name,report_type,
+        industry,enterprise_type,risk_level,
+        project_source,estimate,plan_end_time,
+        use_num,appointment,work_hours,
+        remarks,assessment_enterprise,assessment_enterprise_name,
+        link_num,relationship,assessment_way,
+        assessment_objective,assessment_date,num,
+        project_development,delegate_project_type,assessment_object,
+        work_begin_date,work_end_date,reporting_date,
+        is_have,is_influence,mode,
+        status,proc_ins_id,process_definition_id
+    </sql>
+    <sql id="Assess_Column_List">
+        paap.id,
+        paap.create_by_id,
+        paap.create_time,
+        paap.update_by_id,
+        paap.update_time,
+        paap.del_flag,
+        paap.remarks,
+        paap.audit_id,
+        paap.assess_people
+    </sql>
+    <select id="getAssess" resultType="com.jeeplus.finance.program.configuration.projectList.service.dto.ProgramAuditAssessPeopleDto">
+        select
+        <include refid="Assess_Column_List"></include>
+        from program_audit_assess_people paap
+        where paap.del_flag = '0' and paap.audit_id = #{id}
+    </select>
+    <select id="getProgram" resultType="com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo">
+        select
+        <include refid="Program_Column_List"></include>
+        from program_project_list_info ppli
+        where ppli.del_flag = '0' and id = #{program_id}
+    </select>
+    <select id="findByIdAudit" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"></include>
+        from program_audit pa
+        where pa.del_flag = '0' and pa.id = #{id}
+    </select>
+    <select id="findIdByProIdAndLevel" resultType="string">
+        select id from program_audit where del_flag = '0' and program_id = #{programId} and audit_level = #{auditLevel}
+    </select>
+    <select id="getIDsByProId" resultType="string">
+        SELECT id
+        FROM program_audit
+        WHERE program_id = #{programId} and del_flag = '0'
+        ORDER BY
+        CASE WHEN audit_date IS NULL THEN 1 ELSE 0 END,
+        audit_date ASC
+    </select>
+</mapper>

+ 27 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProgramMembersMapper.xml

@@ -0,0 +1,27 @@
+<?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.program.configuration.projectList.mapper.ProgramMembersMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.finance.program.configuration.projectList.service.dto.ProgramMembersDto">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_date" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_date" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="projectId" column="project_id" jdbcType="VARCHAR"/>
+            <result property="userId" column="user_id" jdbcType="VARCHAR"/>
+            <result property="status" column="status" jdbcType="VARCHAR"/>
+            <result property="isImportant" column="is_important" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,create_by_id,create_time,
+        update_by_id,update_time,del_flag,
+        remarks,project_id,user_id,
+        status,is_important
+    </sql>
+</mapper>

+ 34 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProgramReportNoMapper.xml

@@ -0,0 +1,34 @@
+<?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.program.configuration.projectList.mapper.ProgramReportNoMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.finance.program.configuration.projectList.service.dto.ProgramReportNoDto">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_date" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_date" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="programId" column="program_id" jdbcType="VARCHAR"/>
+            <result property="reportNo" column="report_no" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        prn.id,
+        prn.create_by_id,
+        prn.create_time,
+        prn.update_by_id,
+        prn.update_time,
+        prn.del_flag,
+        prn.remarks,
+        prn.program_id,
+        prn.report_no
+    </sql>
+    <select id="selectByProgramId"
+            resultType="com.jeeplus.finance.program.configuration.projectList.domain.ProgramReportNo">
+        select * from program_report_no where program_id = #{id} and del_flag = 0
+    </select>
+</mapper>

+ 9 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProjectLinkMapper.xml

@@ -0,0 +1,9 @@
+<?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.program.configuration.projectList.mapper.ProjectLinkMapper">
+
+   <delete id="deleteByInfoId">
+       UPDATE program_project_list_link SET del_flag = 1 WHERE del_flag = 0 AND info_id = #{id}
+   </delete>
+
+</mapper>

+ 859 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProjectListMapper.xml

@@ -0,0 +1,859 @@
+<?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.program.configuration.projectList.mapper.ProjectListMapper">
+
+   <select id="findContractPageList" resultType="com.jeeplus.finance.workContract.domain.WorkContractInfo">
+       SELECT
+           a.id,
+           a.create_time,
+           a.update_by_id,
+           a.update_time,
+           a.del_flag,
+           a.client_id,
+           a.client_name,
+           a.no,
+           a.name,
+           a.contract_date,
+           a.effective_date,
+           a.closing_date,
+           a.contract_type,
+           a.contract_amount_type,
+           a.contract_amount,
+           a.contract_opposite,
+           a.contract_fee,
+           a.fees,
+           a.describes,
+           a.contract_special,
+           a.remarks,
+           a.filed_by,
+           a.filed_date,
+           a.filed_no,
+           a.confirm_filed_no,
+           a.filed_remarks,
+           a.proc_ins_id,
+           a.process_definition_id,
+           a.status,
+           a.filed_type,
+           a.borrow_type,
+           b.NAME AS create_by_id
+        FROM
+            work_contract_info a
+            LEFT JOIN sys_user b ON a.create_by_id = b.id
+        WHERE
+            a.del_flag = 0
+            and a.status != 1
+            <if test="dto.createBy != null and dto.createBy != ''">
+                AND b.id = #{dto.createBy}
+            </if>
+           <if test="dto.name != null and dto.name != ''">
+               AND a.name LIKE CONCAT ('%', #{dto.name}, '%')
+           </if>
+           <if test="dto.clientName != null and dto.clientName != ''">
+               AND a.client_name LIKE CONCAT ('%', #{dto.clientName}, '%')
+           </if>
+            ORDER BY a.create_time DESC
+   </select>
+
+    <update id="updateStatusById">
+        UPDATE program_project_list_info SET `status` = #{status} WHERE id = #{id}
+    </update>
+    <update id="updateArchiveStatus">
+        update program_archive set
+                status = #{archiveStatus},
+                over_archive_status = #{overArchiveStatus}
+                where id = #{id}
+    </update>
+
+    <select id="findPageList" resultType="com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo">
+        SELECT
+        distinct
+           a.id,
+           b.name AS create_by_id,
+           a.create_by_id as create_by,
+           a.create_time,
+           a.update_by_id,
+           a.update_time,
+           a.del_flag,
+           a.contract_id,
+           a.contract_name,
+           a.client,
+           a.client_name,
+           a.amount,
+           a.contract_type,
+           a.name,
+           a.no,
+           a.project_type,
+           a.approval_no,
+           a.company,
+           a.project_mould,
+           a.property_holder,
+           a.property_holder_name,
+           a.location,
+           a.is_first,
+           a.year_num,
+           a.check_year,
+           a.project_manager,
+           c.name AS project_manager_name,
+           a.report_type,
+           a.industry,
+           a.enterprise_type,
+           a.risk_level,
+           a.project_source,
+           a.estimate,
+           a.plan_end_time,
+           a.use_num,
+           a.appointment,
+           a.work_hours,
+           a.remarks,
+           a.assessment_enterprise,
+           a.assessment_enterprise_name,
+           a.link_num,
+           a.relationship,
+           a.assessment_way,
+           a.assessment_objective,
+           a.assessment_date,
+           a.num,
+           a.project_development,
+           a.delegate_project_type,
+           a.assessment_object,
+           a.work_begin_date,
+           a.work_end_date,
+           a.reporting_date,
+           a.is_have,
+           a.is_influence,
+           a.mode,
+           a.status,
+           a.proc_ins_id,
+           a.process_definition_id,
+           prn.report_no,
+           pa1.status as status1,
+           pa1.id as auditId1,
+           pa1.proc_ins_id as procInsId1,
+           pa2.status as status2,
+           pa2.id as auditId2,
+           pa2.proc_ins_id as procInsId2,
+           pa3.status as status3,
+           pa3.id as auditId3,
+           pa3.proc_ins_id as procInsId3,
+           pa.status as archive_status,
+           pa.id as archive_id,
+           pa.proc_ins_id as procInsIdArchive,
+           d.id AS issued_id,
+           d.proc_ins_id AS procInsId4,
+           ifnull(d.status,"0") as issued_status,
+           wci.no AS contract_no,
+           art.ID_ as task_id,
+           art1.ID_ as task_id_audit1,
+           art2.ID_ as task_id_audit2,
+           art3.ID_ as task_id_audit3,
+           artd.ID_ as task_id_issued,
+           art_archive.ID_ as task_id_archive
+        FROM
+            program_project_list_info a
+            LEFT JOIN sys_user b ON a.create_by_id = b.id
+            LEFT JOIN sys_user c ON a.project_manager = c.id
+            LEFT JOIN work_contract_info wci ON wci.id = a.contract_id and wci.del_flag = '0'
+            LEFT JOIN program_report_no prn ON prn.program_id = a.id and prn.del_flag = '0'
+            LEFT JOIN program_audit pa1 ON pa1.program_id = a.id and pa1.audit_level = '1' and pa1.del_flag = '0'
+            LEFT JOIN program_audit pa2 ON pa2.program_id = a.id and pa2.audit_level = '2' and pa2.del_flag = '0'
+            LEFT JOIN program_audit pa3 ON pa3.program_id = a.id and pa3.audit_level = '3' and pa3.del_flag = '0'
+            LEFT JOIN program_archive pa ON pa.program_id = a.id and pa.del_flag = '0'
+            left join program_members pm on a.id = pm.project_id
+            LEFT JOIN proofread_issued d ON a.id = d.project_id
+            LEFT JOIN act_ru_task art ON a.proc_ins_id = art.PROC_INST_ID_
+            LEFT JOIN act_ru_task art1 ON pa1.proc_ins_id = art1.PROC_INST_ID_
+            LEFT JOIN act_ru_task art2 ON pa2.proc_ins_id = art2.PROC_INST_ID_
+            LEFT JOIN act_ru_task art3 ON pa3.proc_ins_id = art3.PROC_INST_ID_
+            LEFT JOIN act_ru_task artd ON d.proc_ins_id = artd.PROC_INST_ID_
+            LEFT JOIN act_ru_task art_archive ON pa.proc_ins_id = art_archive.PROC_INST_ID_
+            ${ew.customSqlSegment}
+            ORDER BY a.create_time DESC
+    </select>
+    <select id="findPageList2" resultType="com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo">
+        SELECT
+        distinct
+           a.id,
+           b.name AS create_by_id,
+           a.create_by_id as create_by,
+           a.create_time,
+           a.update_by_id,
+           a.update_time,
+           a.del_flag,
+           a.contract_id,
+           a.contract_name,
+           a.client,
+           a.client_name,
+           a.amount,
+           a.contract_type,
+           a.name,
+           a.no,
+           a.project_type,
+           a.approval_no,
+           a.company,
+           a.project_mould,
+           a.property_holder,
+           a.property_holder_name,
+           a.location,
+           a.is_first,
+           a.year_num,
+           a.check_year,
+           a.project_manager,
+           c.name AS project_manager_name,
+           a.report_type,
+           a.industry,
+           a.enterprise_type,
+           a.risk_level,
+           a.project_source,
+           a.estimate,
+           a.plan_end_time,
+           a.use_num,
+           a.appointment,
+           a.work_hours,
+           a.remarks,
+           a.assessment_enterprise,
+           a.assessment_enterprise_name,
+           a.link_num,
+           a.relationship,
+           a.assessment_way,
+           a.assessment_objective,
+           a.assessment_date,
+           a.num,
+           a.project_development,
+           a.delegate_project_type,
+           a.assessment_object,
+           a.work_begin_date,
+           a.work_end_date,
+           a.reporting_date,
+           a.is_have,
+           a.is_influence,
+           a.mode,
+           a.status,
+           a.proc_ins_id,
+           a.process_definition_id,
+           prn.report_no,
+           pa1.status as status1,
+           pa1.id as auditId1,
+           pa1.proc_ins_id as procInsId1,
+           pa2.status as status2,
+           pa2.id as auditId2,
+           pa2.proc_ins_id as procInsId2,
+           pa3.status as status3,
+           pa3.id as auditId3,
+           pa3.proc_ins_id as procInsId3,
+           pa.status as archive_status,
+           pa.id as archive_id,
+           pa.proc_ins_id as procInsIdArchive,
+           d.id AS issued_id,
+           d.proc_ins_id AS procInsId4,
+           d.status AS issued_status,
+           wci.no AS contract_no
+        FROM
+            program_project_list_info a
+            LEFT JOIN sys_user b ON a.create_by_id = b.id
+            LEFT JOIN sys_user c ON a.project_manager = c.id
+            LEFT JOIN work_contract_info wci ON wci.id = a.contract_id and wci.del_flag = '0'
+            LEFT JOIN program_report_no prn ON prn.program_id = a.id and prn.del_flag = '0'
+            LEFT JOIN program_audit pa1 ON pa1.program_id = a.id and pa1.audit_level = '1' and pa1.del_flag = '0'
+            LEFT JOIN program_audit pa2 ON pa2.program_id = a.id and pa2.audit_level = '2' and pa2.del_flag = '0'
+            LEFT JOIN program_audit pa3 ON pa3.program_id = a.id and pa3.audit_level = '3' and pa3.del_flag = '0'
+            LEFT JOIN program_archive pa ON pa.program_id = a.id and pa.del_flag = '0'
+            left join program_members pm on a.id = pm.project_id
+            LEFT JOIN proofread_issued d ON a.id = d.project_id
+            ${ew.customSqlSegment}
+            ORDER BY a.create_time DESC
+    </select>
+
+    <select id="findInfoList" resultType="com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo">
+        SELECT
+           a.id,
+           b.name AS create_by_id,
+           a.create_by_id as create_by,
+           a.create_time,
+           a.update_by_id,
+           a.update_time,
+           a.del_flag,
+           a.contract_id,
+           a.contract_name,
+           a.client,
+           a.client_name,
+           a.amount,
+           a.contract_type,
+           a.name,
+           a.no,
+           a.project_type,
+           a.approval_no,
+           a.company,
+           a.project_mould,
+           a.property_holder,
+           a.property_holder_name,
+           a.location,
+           a.is_first,
+           a.year_num,
+           a.check_year,
+           a.project_manager,
+           c.name AS project_manager_name,
+           a.report_type,
+           a.industry,
+           a.enterprise_type,
+           a.risk_level,
+           a.project_source,
+           a.estimate,
+           a.plan_end_time,
+           a.use_num,
+           a.appointment,
+           a.work_hours,
+           a.remarks,
+           a.assessment_enterprise,
+           a.assessment_enterprise_name,
+           a.link_num,
+           a.relationship,
+           a.assessment_way,
+           a.assessment_objective,
+           a.assessment_date,
+           a.num,
+           a.project_development,
+           a.delegate_project_type,
+           a.assessment_object,
+           a.assessment_range,
+           a.work_begin_date,
+           a.work_end_date,
+           a.reporting_date,
+           a.is_have,
+           a.is_influence,
+           a.mode,
+           a.status,
+           a.proc_ins_id,
+           a.process_definition_id,
+           prn.report_no,
+           pa1.status as status1,
+           pa1.id as auditId1,
+           pa1.proc_ins_id as procInsId1,
+           pa2.status as status2,
+           pa2.id as auditId2,
+           pa2.proc_ins_id as procInsId2,
+           pa3.status as status3,
+           pa3.id as auditId3,
+           pa3.proc_ins_id as procInsId3,
+           pa.status as archive_status,
+           pa.id as archive_id,
+           pa.proc_ins_id as procInsIdArchive,
+           d.id AS issued_id,
+           d.proc_ins_id AS procInsId4,
+           d.status AS issued_status
+        FROM
+            program_project_list_info a
+            LEFT JOIN sys_user b ON a.create_by_id = b.id
+            LEFT JOIN sys_user c ON a.project_manager = c.id
+            LEFT JOIN program_report_no prn ON prn.program_id = a.id
+            LEFT JOIN program_audit pa1 ON pa1.program_id = a.id and pa1.audit_level = '1' and pa1.del_flag = '0'
+            LEFT JOIN program_audit pa2 ON pa2.program_id = a.id and pa2.audit_level = '2' and pa2.del_flag = '0'
+            LEFT JOIN program_audit pa3 ON pa3.program_id = a.id and pa3.audit_level = '3' and pa3.del_flag = '0'
+            LEFT JOIN program_archive pa ON pa.program_id = a.id and pa.del_flag = '0'
+            LEFT JOIN proofread_issued d ON a.id = d.project_id
+            ${ew.customSqlSegment}
+            ORDER BY a.create_time DESC
+    </select>
+
+    <select id="getById" resultType="com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo">
+        SELECT
+           a.id,
+           b.name AS create_by_id,
+           a.create_time,
+           a.update_by_id,
+           a.update_time,
+           a.del_flag,
+           a.contract_id,
+           a.contract_name,
+           a.client,
+           a.client_name,
+           a.amount,
+           a.contract_type,
+           a.name,
+           a.no,
+           a.project_type,
+           a.approval_no,
+           a.company,
+           a.project_mould,
+           a.property_holder,
+           a.property_holder_name,
+           a.location,
+           a.is_first,
+           a.year_num,
+           a.check_year,
+           a.project_manager,
+           c.name AS project_manager_name,
+           a.report_type,
+           a.industry,
+           a.enterprise_type,
+           a.risk_level,
+           a.project_source,
+           a.estimate,
+           a.plan_end_time,
+           a.use_num,
+           a.appointment,
+           a.work_hours,
+           a.remarks,
+           a.assessment_enterprise,
+           a.assessment_enterprise_name,
+           a.link_num,
+           a.relationship,
+           a.assessment_way,
+           a.assessment_objective,
+           a.assessment_date,
+           a.num,
+           a.project_development,
+           a.delegate_project_type,
+           a.assessment_object,
+           a.work_begin_date,
+           a.work_end_date,
+           a.reporting_date,
+           a.is_have,
+           a.is_influence,
+           a.mode,
+           a.status,
+           a.proc_ins_id,
+           a.assessment_range,
+           a.process_definition_id,
+           a.generate_report_number,
+           prn.report_no,
+           pa1.status as status1,
+           pa1.id as auditId1,
+           pa1.proc_ins_id as procInsId1,
+           pa2.status as status2,
+           pa2.id as auditId2,
+           pa2.proc_ins_id as procInsId2,
+           pa3.status as status3,
+           pa3.id as auditId3,
+           pa3.proc_ins_id as procInsId3,
+           pa.status as archive_status,
+           pa.id as archive_id,
+           pa.proc_ins_id as procInsIdArchive,
+           d.id AS issued_id,
+           d.proc_ins_id AS procInsId4,
+           d.status AS issued_status
+        FROM
+            program_project_list_info a
+            LEFT JOIN sys_user b ON a.create_by_id = b.id
+            LEFT JOIN sys_user c ON a.project_manager = c.id
+            LEFT JOIN program_report_no prn ON prn.program_id = a.id
+            LEFT JOIN program_audit pa1 ON pa1.program_id = a.id and pa1.audit_level = '1' and pa1.del_flag = '0'
+            LEFT JOIN program_audit pa2 ON pa2.program_id = a.id and pa2.audit_level = '2' and pa2.del_flag = '0'
+            LEFT JOIN program_audit pa3 ON pa3.program_id = a.id and pa3.audit_level = '3' and pa3.del_flag = '0'
+            LEFT JOIN program_archive pa ON pa.program_id = a.id and pa.del_flag = '0'
+            LEFT JOIN proofread_issued d ON a.id = d.project_id
+        where a.id = #{id}
+    </select>
+
+    <select id="findList" resultType="com.jeeplus.finance.program.configuration.projectList.service.dto.ExportFileDto">
+        SELECT
+            (@i:=@i+1) AS `no`,
+            tab.*
+        FROM
+            (SELECT
+                b.`year`,
+                d.`name` AS client_name,
+                a.`name`,
+                a.assessment_objective,
+                a.assessment_object,
+                a.assessment_range,
+                a.project_mould as program_type,
+                DATE_FORMAT(a.assessment_date,'%Y-%m-%d') AS assessment_date,
+                DATE_FORMAT(b.evaluation_report_date, '%Y-%m-%d') as "evaluation_report_date",
+                b.protocol_num,
+                c.no as contract_num,
+                e.report_no,
+                f.`name` AS project_manager_name,
+                g.`name` AS signature_evaluator_first,
+                h.`name` AS signature_evaluator_second,
+                b.wayst_evaluation,
+                b.fixed_assets_evaluation,
+                b.net_assets_evaluation,
+                b.rent_evaluation,
+                b.forensics,
+                b.report_charges,
+                i.name as current_dispose_person,
+                (CASE b.is_invoice WHEN 0 THEN "否" WHEN 1 THEN "是" ELSE "" END) AS is_invoice,
+                DATE_FORMAT(b.invoice_date,'%Y-%m-%d') AS invoice_date,
+                (CASE b.is_contract_archive WHEN 0 THEN "否" WHEN 1 THEN "是" ELSE "" END) AS is_contract_archive,
+                (CASE b.is_papers_intact WHEN 0 THEN "否" WHEN 1 THEN "是" ELSE "" END) AS is_papers_intact,
+                (CASE b.is_papers_archive WHEN 0 THEN "否" WHEN 1 THEN "是" ELSE "" END) AS is_papers_archive
+            FROM
+                program_project_list_info a
+                LEFT JOIN program_archive b ON a.id = b.program_id
+                LEFT JOIN work_contract_info c ON a.contract_id = c.id
+                LEFT JOIN work_client_info d ON c.client_id = d.id
+                LEFT JOIN program_report_no e ON a.id = e.program_id
+                LEFT JOIN sys_user f ON a.project_manager = f.id
+                LEFT JOIN sys_user i ON b.current_dispose_person = i.id
+                LEFT JOIN sys_user g ON b.signature_evaluator_first = g.id
+                LEFT JOIN sys_user h ON b.signature_evaluator_second = h.id
+            WHERE a.del_flag = 0
+            <if test="infoList != null">
+                AND a.id IN
+                <foreach collection="infoList" item="item" index="index" open="(" close=")" separator=",">
+                    #{item.id}
+                </foreach>
+            </if>
+            ORDER BY a.create_time DESC) AS tab
+            ,(SELECT @i:=0) AS itable
+    </select>
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo">
+        <id property="id" column="id" jdbcType="VARCHAR"/>
+        <result property="createById" column="create_by_id" jdbcType="VARCHAR"/>
+        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+        <result property="updateById" column="update_by_id" jdbcType="VARCHAR"/>
+        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+        <result property="delFlag" column="del_flag" jdbcType="VARCHAR"/>
+        <result property="contractId" column="contract_id" jdbcType="VARCHAR"/>
+        <result property="contractName" column="contract_name" jdbcType="VARCHAR"/>
+        <result property="client" column="client" jdbcType="VARCHAR"/>
+        <result property="clientName" column="client_name" jdbcType="VARCHAR"/>
+        <result property="amount" column="amount" jdbcType="VARCHAR"/>
+        <result property="contractType" column="contract_type" jdbcType="VARCHAR"/>
+        <result property="name" column="name" jdbcType="VARCHAR"/>
+        <result property="no" column="no" jdbcType="VARCHAR"/>
+        <result property="projectType" column="project_type" jdbcType="VARCHAR"/>
+        <result property="approvalNo" column="approval_no" jdbcType="VARCHAR"/>
+        <result property="company" column="company" jdbcType="VARCHAR"/>
+        <result property="projectMould" column="project_mould" jdbcType="VARCHAR"/>
+        <result property="propertyHolder" column="property_holder" jdbcType="VARCHAR"/>
+        <result property="propertyHolderName" column="property_holder_name" jdbcType="VARCHAR"/>
+        <result property="location" column="location" jdbcType="VARCHAR"/>
+        <result property="isFirst" column="is_first" jdbcType="VARCHAR"/>
+        <result property="yearNum" column="year_num" jdbcType="VARCHAR"/>
+        <result property="checkYear" column="check_year" jdbcType="VARCHAR"/>
+        <result property="projectManager" column="project_manager" jdbcType="VARCHAR"/>
+        <result property="projectManagerName" column="project_manager_name" jdbcType="VARCHAR"/>
+        <result property="reportType" column="report_type" jdbcType="VARCHAR"/>
+        <result property="industry" column="industry" jdbcType="VARCHAR"/>
+        <result property="enterpriseType" column="enterprise_type" jdbcType="VARCHAR"/>
+        <result property="riskLevel" column="risk_level" jdbcType="VARCHAR"/>
+        <result property="projectSource" column="project_source" jdbcType="VARCHAR"/>
+        <result property="estimate" column="estimate" jdbcType="DECIMAL"/>
+        <result property="planEndTime" column="plan_end_time" jdbcType="TIMESTAMP"/>
+        <result property="useNum" column="use_num" jdbcType="INTEGER"/>
+        <result property="appointment" column="appointment" jdbcType="INTEGER"/>
+        <result property="workHours" column="work_hours" jdbcType="DOUBLE"/>
+        <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+        <result property="assessmentEnterprise" column="assessment_enterprise" jdbcType="VARCHAR"/>
+        <result property="assessmentEnterpriseName" column="assessment_enterprise_name" jdbcType="VARCHAR"/>
+        <result property="linkNum" column="link_num" jdbcType="VARCHAR"/>
+        <result property="relationship" column="relationship" jdbcType="VARCHAR"/>
+        <result property="assessmentWay" column="assessment_way" jdbcType="VARCHAR"/>
+        <result property="assessmentObjective" column="assessment_objective" jdbcType="VARCHAR"/>
+        <result property="assessmentDate" column="assessment_date" jdbcType="TIMESTAMP"/>
+        <result property="num" column="num" jdbcType="DECIMAL"/>
+        <result property="projectDevelopment" column="project_development" jdbcType="VARCHAR"/>
+        <result property="delegateProjectType" column="delegate_project_type" jdbcType="VARCHAR"/>
+        <result property="assessmentObject" column="assessment_object" jdbcType="VARCHAR"/>
+        <result property="workBeginDate" column="work_begin_date" jdbcType="TIMESTAMP"/>
+        <result property="workEndDate" column="work_end_date" jdbcType="TIMESTAMP"/>
+        <result property="reportingDate" column="reporting_date" jdbcType="TIMESTAMP"/>
+        <result property="isHave" column="is_have" jdbcType="VARCHAR"/>
+        <result property="isInfluence" column="is_influence" jdbcType="VARCHAR"/>
+        <result property="mode" column="mode" jdbcType="VARCHAR"/>
+        <result property="status" column="status" jdbcType="VARCHAR"/>
+        <result property="procInsId" column="proc_ins_id" jdbcType="VARCHAR"/>
+        <result property="processDefinitionId" column="process_definition_id" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        ppli.id,
+        ppli.create_by_id,
+        ppli.create_time,
+        ppli.update_by_id,
+        ppli.update_time,
+        ppli.del_flag,
+        ppli.contract_id,
+        ppli.contract_name,
+        ppli.client,
+        ppli.client_name,
+        ppli.amount,
+        ppli.contract_type,
+        ppli.name,
+        ppli.no,
+        ppli.project_type,
+        ppli.approval_no,
+        ppli.company,
+        ppli.project_mould,
+        ppli.property_holder,
+        ppli.property_holder_name,
+        ppli.location,
+        ppli.is_first,
+        ppli.year_num,
+        ppli.check_year,
+        ppli.project_manager,
+        ppli.project_manager_name,
+        ppli.report_type,
+        ppli.industry,
+        ppli.enterprise_type,
+        ppli.risk_level,
+        ppli.project_source,
+        ppli.estimate,
+        ppli.plan_end_time,
+        ppli.use_num,
+        ppli.appointment,
+        ppli.work_hours,
+        ppli.remarks,
+        ppli.assessment_enterprise,
+        ppli.assessment_enterprise_name,
+        ppli.link_num,
+        ppli.relationship,
+        ppli.assessment_way,
+        ppli.assessment_objective,
+        ppli.assessment_date,
+        ppli.num,
+        ppli.project_development,
+        ppli.delegate_project_type,
+        ppli.assessment_object,
+        ppli.work_begin_date,
+        ppli.work_end_date,
+        ppli.reporting_date,
+        ppli.is_have,
+        ppli.is_influence,
+        ppli.mode,
+        ppli.status,
+        ppli.proc_ins_id,
+        ppli.process_definition_id
+    </sql>
+    <select id="findPage" resultType="com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo">
+        SELECT
+        <include refid="Base_Column_List"></include>,
+        su.name AS create_by_id,
+        sup.name as project_manager_name,
+        ppli.create_by_id as create_by
+        FROM
+            program_project_list_info ppli
+            LEFT JOIN sys_user su ON ppli.create_by_id = su.id
+            LEFT JOIN sys_user sup ON ppli.project_manager = su.id
+            LEFT JOIN
+            ${ew.customSqlSegment}
+            ORDER BY ppli.create_time DESC
+    </select>
+
+    <select id="selectInvoiceFlag" resultType="string">
+        select
+            case
+                 when fi.status = '1' then '开票中'
+                 when fi.status = '2' then '开票中'
+                 when fi.status = '3' then '开票中'
+                 when fi.status = '4' then '开票中'
+                 when fi.status = '5' then '已开票'
+                 when fi.status = '6' then '已开票'
+                 when fi.status = '7' then '已开票'
+                 when fi.status = '8' then '已开票'
+            else '' end
+        from finance_invoice_base fib
+        inner join finance_invoice fi on fi.id = fib.invoice_id and fi.del_flag = '0'
+        where fib.del_flag = '0' and fi.status != '9' and fib.program_id = #{id}
+        order by fi.create_time desc
+        limit 1
+    </select>
+
+    <select id="getHaveProjectIds" resultType="string">
+        select
+            pm.project_id
+        from program_members pm
+        where pm.user_id = #{currentUser.id} and pm.del_flag = '0'
+    </select>
+
+    <select id="getListByidList" resultType="com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo">
+        SELECT
+        a.id,
+        a.contract_id,
+        a.contract_name,
+        a.client,
+        a.client_name,
+        a.amount,
+        a.contract_type,
+        a.NAME,
+        a.NO,
+        a.project_type,
+        a.approval_no,
+        a.company,
+        a.project_mould,
+        a.property_holder,
+        a. property_holder_name,
+        a.location,
+        a.is_first,
+        a.year_num,
+        a.check_year,
+        a.project_manager,
+        a.project_manager_name,
+        a.report_type,
+        a.industry,
+        a.enterprise_type,
+        a.risk_level,
+        a.project_source,
+        a.estimate,
+        a.plan_end_time,
+        a.use_num,
+        a.appointment,
+        a. work_hours,
+        a.remarks,
+        a.assessment_enterprise,
+        a.assessment_enterprise_name,
+        a.link_num,
+        a.relationship,
+        a.assessment_way,
+        a.assessment_objective,
+        a.assessment_date,
+        a.num,
+        a.project_development,
+        a.delegate_project_type,
+        a.assessment_object,
+        a.assessment_range,
+        a.generate_report_number,
+        a.work_begin_date,
+        a.work_end_date,
+        a.reporting_date,
+        a.is_have,
+        a.is_influence,
+        a.MODE,
+        a.STATUS,
+        a.proc_ins_id,
+        a.process_definition_id,
+        a.agree_time,
+        a.agree_user_id,
+        a.tab_type,
+        a.create_time,
+        a.create_by_id,
+        a.update_time,
+        a.update_by_id,
+        a.del_flag,
+        a.tenant_id,
+        pa1.id as auditId1,
+        pa2.id as auditId2,
+        pa3.id as auditId3,
+        pa.id as archive_id
+        from
+            program_project_list_info a
+        LEFT JOIN program_report_no prn ON prn.program_id = a.id and prn.del_flag = '0'
+        LEFT JOIN program_audit pa1 ON pa1.program_id = a.id and pa1.audit_level = '1' and pa1.del_flag = '0'
+        LEFT JOIN program_audit pa2 ON pa2.program_id = a.id and pa2.audit_level = '2' and pa2.del_flag = '0'
+        LEFT JOIN program_audit pa3 ON pa3.program_id = a.id and pa3.audit_level = '3' and pa3.del_flag = '0'
+        LEFT JOIN program_archive pa ON pa.program_id = a.id and pa.del_flag = '0'
+        <where>
+            a.del_flag = 0
+            and a.id in
+            <foreach collection="idList" item="id" index="index" open="(" close=")" separator=",">
+                #{id}
+            </foreach>
+        </where>
+    </select>
+    <select id="getOverdueFilingProjectList"
+            resultType="com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo">
+        SELECT
+        distinct
+        a.id,
+        a.create_by_id AS create_by,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.contract_id,
+        a.contract_name,
+        a.client,
+        a.client_name,
+        a.amount,
+        a.contract_type,
+        a.name,
+        a.no,
+        a.project_type,
+        a.approval_no,
+        a.company,
+        a.project_mould,
+        a.property_holder,
+        a.property_holder_name,
+        a.location,
+        a.is_first,
+        a.year_num,
+        a.check_year,
+        a.project_manager,
+        c.name AS project_manager_name,
+        a.report_type,
+        a.industry,
+        a.enterprise_type,
+        a.risk_level,
+        a.project_source,
+        a.estimate,
+        a.plan_end_time,
+        a.use_num,
+        a.appointment,
+        a.work_hours,
+        a.remarks,
+        a.assessment_enterprise,
+        a.assessment_enterprise_name,
+        a.link_num,
+        a.relationship,
+        a.assessment_way,
+        a.assessment_objective,
+        a.assessment_date,
+        a.num,
+        a.project_development,
+        a.delegate_project_type,
+        a.assessment_object,
+        a.work_begin_date,
+        a.work_end_date,
+        a.reporting_date,
+        a.is_have,
+        a.is_influence,
+        a.mode,
+        a.status,
+        a.proc_ins_id,
+        a.process_definition_id,
+        prn.report_no,
+        pa1.status as status1,
+        pa1.id as auditId1,
+        pa1.proc_ins_id as procInsId1,
+        pa2.status as status2,
+        pa2.id as auditId2,
+        pa2.proc_ins_id as procInsId2,
+        pa3.status as status3,
+        pa3.id as auditId3,
+        pa3.proc_ins_id as procInsId3,
+        pa.status as archive_status,
+        pa.id as archive_id,
+        pa.proc_ins_id as procInsIdArchive,
+        d.id AS issued_id,
+        d.proc_ins_id AS procInsId4,
+        d.status AS issued_status,
+        d.agree_time AS agree_time,
+        wci.no AS contract_no,
+        art.ID_ as task_id,
+        art1.ID_ as task_id_audit1,
+        art2.ID_ as task_id_audit2,
+        art3.ID_ as task_id_audit3,
+        artd.ID_ as task_id_issued,
+        art_archive.ID_ as task_id_archive
+        FROM
+        program_project_list_info a
+        LEFT JOIN sys_user b ON a.create_by_id = b.id
+        LEFT JOIN sys_user c ON a.project_manager = c.id
+        LEFT JOIN work_contract_info wci ON wci.id = a.contract_id and wci.del_flag = '0'
+        LEFT JOIN program_report_no prn ON prn.program_id = a.id and prn.del_flag = '0'
+        LEFT JOIN program_audit pa1 ON pa1.program_id = a.id and pa1.audit_level = '1' and pa1.del_flag = '0'
+        LEFT JOIN program_audit pa2 ON pa2.program_id = a.id and pa2.audit_level = '2' and pa2.del_flag = '0'
+        LEFT JOIN program_audit pa3 ON pa3.program_id = a.id and pa3.audit_level = '3' and pa3.del_flag = '0'
+        LEFT JOIN program_archive pa ON pa.program_id = a.id and pa.del_flag = '0'
+        left join program_members pm on a.id = pm.project_id
+        LEFT JOIN proofread_issued d ON a.id = d.project_id
+        LEFT JOIN act_ru_task art ON a.proc_ins_id = art.PROC_INST_ID_
+        LEFT JOIN act_ru_task art1 ON pa1.proc_ins_id = art1.PROC_INST_ID_
+        LEFT JOIN act_ru_task art2 ON pa2.proc_ins_id = art2.PROC_INST_ID_
+        LEFT JOIN act_ru_task art3 ON pa3.proc_ins_id = art3.PROC_INST_ID_
+        LEFT JOIN act_ru_task artd ON d.proc_ins_id = artd.PROC_INST_ID_
+        LEFT JOIN act_ru_task art_archive ON pa.proc_ins_id = art_archive.PROC_INST_ID_
+        <where>
+            a.del_flag = 0
+            and (pa.status is null or (pa.status != 5 and pa.status != 7))
+            and d.status = 5 and d.agree_time &lt;= #{threeDayAgo}
+        </where>
+        ORDER BY a.update_time DESC
+    </select>
+    <select id="getOverArchiveFlag" resultType="java.lang.Integer">
+        select count(id) from program_archive
+        where over_archive_status =1 and status != 7 and create_by_id = #{currentUser.id}
+    </select>
+</mapper>

+ 9 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/mapper/xml/ProjectMemberMapper.xml

@@ -0,0 +1,9 @@
+<?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.program.configuration.projectList.mapper.ProjectMemberMapper">
+
+   <delete id="deleteByInfoId">
+       UPDATE program_project_list_member SET del_flag = 1 WHERE del_flag = 0 AND info_id = #{id}
+   </delete>
+
+</mapper>

+ 14 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/ProgramMembersService.java

@@ -0,0 +1,14 @@
+package com.jeeplus.finance.program.configuration.projectList.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.finance.program.configuration.projectList.domain.ProgramMembers;
+import com.jeeplus.finance.program.configuration.projectList.mapper.ProgramMembersMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ProgramMembersService extends ServiceImpl<ProgramMembersMapper, ProgramMembers> {
+
+    @Autowired
+    private ProgramMembersMapper programMembersMapper;
+}

File diff suppressed because it is too large
+ 1614 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/ProjectListService.java


+ 14 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ContractDto.java

@@ -0,0 +1,14 @@
+package com.jeeplus.finance.program.configuration.projectList.service.dto;
+
+import lombok.Data;
+
+@Data
+public class ContractDto {
+
+    private String createBy;
+
+    private String name;
+
+    private String clientName;
+
+}

+ 177 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ExportFileDto.java

@@ -0,0 +1,177 @@
+package com.jeeplus.finance.program.configuration.projectList.service.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class ExportFileDto {
+
+    /**
+     * 序号(自动生成)
+     */
+    @Excel(name = "序号", width = 10, orderNum = "1")
+    private Integer no;
+
+    /**
+     * 年份(归档表)
+     */
+    @Excel(name = "年份", width = 10, orderNum = "2")
+    private String year;
+
+    /**
+     * 客户名称(关联查询)
+     */
+    @Excel(name = "客户名称", width = 30, orderNum = "3")
+    private String clientName;
+
+    /**
+     * 项目名称(项目表)
+     */
+    @Excel(name = "项目名称", width = 30, orderNum = "4")
+    private String name;
+
+    /**
+     * 评估目的(项目表)
+     */
+    @Excel(name = "评估目的", width = 30, orderNum = "5")
+    private String assessmentObjective;
+
+    /**
+     * 评估对象(项目表)
+     */
+    @Excel(name = "评估对象", width = 30, orderNum = "6")
+    private String assessmentObject;
+
+    /**
+     * 评估范围(项目表)
+     */
+    @Excel(name = "评估范围", width = 30, orderNum = "7")
+    private String assessmentRange;
+
+    /**
+     * 项目类型(归档表)
+     */
+    @Excel(name = "项目类型", width = 20, orderNum = "8",dict = "program_registered_type")
+    private String programType;
+
+    /**
+     * 评估基准日(项目表)
+     */
+    @Excel(name = "评估基准日", width = 20, orderNum = "9")
+    private String assessmentDate;
+
+    /**
+     * 评估报告日(归档表)
+     */
+    @Excel(name = "评估报告日", width = 20, orderNum = "10")
+    private String evaluationReportDate;
+
+    /**
+     * 协议号(归档表)
+     */
+    //@Excel(name = "协议号", width = 20, orderNum = "9")
+    private String protocolNum;
+
+    /**
+     * 合同编号(合同表)
+     */
+    @Excel(name = "合同编号", width = 20, orderNum = "11")
+    private String contractNum;
+
+    /**
+     * 文号(报告号表)
+     */
+    @Excel(name = "文号", width = 20, orderNum = "12")
+    private String reportNo;
+
+    /**
+     * 项目负责人(项目表)
+     */
+    @Excel(name = "项目负责人", width = 20, orderNum = "13")
+    private String projectManagerName;
+
+    /**
+     * 签字评估师1(归档表)
+     */
+    @Excel(name = "签字评估师1", width = 20, orderNum = "14")
+    private String signatureEvaluatorFirst;
+
+    /**
+     * 签字评估师2(归档表)
+     */
+    @Excel(name = "签字评估师2", width = 20, orderNum = "15")
+    private String signatureEvaluatorSecond;
+
+    /**
+     * 废旧物资评估(万元)(归档表)
+     */
+    @Excel(name = "废旧物资评估(万元)", width = 20, orderNum = "16")
+    private String waystEvaluation;
+
+    /**
+     * 固定资产评估(万元)(归档表)
+     */
+    @Excel(name = "固定资产评估(万元)", width = 20, orderNum = "17")
+    private String fixedAssetsEvaluation;
+
+    /**
+     * 净资产评估(归档表)
+     */
+    @Excel(name = "净资产评估", width = 20, orderNum = "18")
+    private String netAssetsEvaluation;
+
+    /**
+     * 租金评估(万/年)(归档表)
+     */
+    @Excel(name = "租金评估(万/年)", width = 20, orderNum = "19")
+    private String rentEvaluation;
+
+    /**
+     * 其他(归档表)
+     */
+    @Excel(name = "其他", width = 20, orderNum = "20")
+    private String forensics;
+
+    /**
+     * 报告收费(元)(归档表)
+     */
+    @Excel(name = "报告收费(元)", width = 20, orderNum = "21")
+    private String reportCharges;
+
+    /**
+     * 当前处理人(归档表)
+     */
+    @Excel(name = "当前处理人", width = 20, orderNum = "22")
+    private String currentDisposePerson;
+
+    /**
+     * 是否开票(归档表)
+     */
+    @Excel(name = "是否开票", width = 20, orderNum = "23")
+    private String isInvoice;
+
+    /**
+     * 开票日期(归档表)
+     */
+    @Excel(name = "开票日期", width = 20, orderNum = "24")
+    private String invoiceDate;
+
+    /**
+     * 合同是否存档(归档表)
+     */
+    @Excel(name = "合同是否存档", width = 20, orderNum = "25")
+    private String isContractArchive;
+
+    /**
+     * 底稿是否完好(归档表)
+     */
+//    @Excel(name = "底稿是否完好", width = 20, orderNum = "24")
+//    private String isPapersIntact;
+
+    /**
+     * 底稿是否归档(归档表)
+     */
+    @Excel(name = "底稿是否归档", width = 20, orderNum = "26")
+    private String isPapersArchive;
+
+}

+ 236 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ProgramArchiveDto.java

@@ -0,0 +1,236 @@
+package com.jeeplus.finance.program.configuration.projectList.service.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.service.dto.BaseDTO;
+import com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo;
+import com.jeeplus.sys.service.dto.WorkAttachmentInfoDTO;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 新项目管理-项目登记-项目归档
+ * @TableName program_archive
+ */
+@Data
+public class ProgramArchiveDto extends BaseDTO {
+
+    /**
+     * 超期状态(0:未超期,1:超期)
+     */
+    private String overArchiveStatus;
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 项目id
+     */
+    private String programId;
+
+    /**
+     * 年份
+     */
+    private String year;
+
+    /**
+     * 项目类型
+     */
+    private String programType;
+
+    /**
+     * 评估报告日
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date evaluationReportDate;
+
+    /**
+     * 协议号
+     */
+    private String protocolNum;
+
+    /**
+     * 废旧物资评估(万元)
+     */
+    private String waystEvaluation;
+
+    /**
+     * 固定资产评估(万元)
+     */
+    private String fixedAssetsEvaluation;
+
+    /**
+     * 净资产评估
+     */
+    private String netAssetsEvaluation;
+
+    /**
+     * 租金评估(万/年)
+     */
+    private String rentEvaluation;
+
+    /**
+     * 司法鉴定
+     */
+    private String forensics;
+
+    /**
+     * 报告收费(元)
+     */
+    private String reportCharges;
+
+    /**
+     * 租金类型
+     */
+    private String rentType;
+
+    /**
+     * 当前处理人
+     */
+    private String currentDisposePerson;
+
+    /**
+     * 是否开票
+     */
+    private String isInvoice;
+
+    /**
+     * 开票日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date invoiceDate;
+
+    /**
+     * 预估/实际收费(万元)
+     */
+    private String actualCharges;
+
+    /**
+     * 合同是否存档
+     */
+    private String isContractArchive;
+
+    /**
+     * 底稿是否完好
+     */
+    private String isPapersIntact;
+
+    /**
+     * 底稿是否归档
+     */
+    private String isPapersArchive;
+
+    /**
+     * 报销外勤天数
+     */
+    private String opsAmount;
+
+    /**
+     * 外勤是否已经报销
+     */
+    private String isOpsReimbursement;
+
+    /**
+     * 已报销金额
+     */
+    private String reimbursementAmount;
+
+    /**
+     * 未报销金额
+     */
+    private String unreimbursedAmount;
+
+    /**
+     * 报销单号
+     */
+    private String reimbursementNum;
+
+    /**
+     * 报销日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date reimbursementDate;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     * 流程信息
+     */
+    private String processDefinitionId;
+
+    /**
+     * 状态
+     */
+    private String status;
+
+    /**
+     * 审核通过时间
+     */
+    private String auditDate;
+
+    /**
+     * 项目信息
+     */
+    private ProgramProjectListInfo programProjectListInfo;
+
+    /**
+     * 附件 - 评估报告
+     */
+    private List<WorkAttachmentInfoDTO> reportFileList;
+
+    /**
+     * 附件 - 评估说明
+     */
+    private List<WorkAttachmentInfoDTO> explainFileList;
+
+    /**
+     * 附件 - 评估明细表
+     */
+    private List<WorkAttachmentInfoDTO> detailFileList;
+
+    /**
+     * 附件 - 评估操作计算底稿
+     */
+    private List<WorkAttachmentInfoDTO> papersFileList;
+
+    /**
+     * 附件 - 其他
+     */
+    private List<WorkAttachmentInfoDTO> otherFileList;
+
+    /**
+     * 项目报告号
+     */
+    private String reportNo;
+    /**
+     * 审核通过时间
+     */
+    private Date auditDateDate;
+
+    /**
+     * 审核通过审批人id
+     */
+    private String auditUserId;
+
+    /**
+     * 签字评估师1
+     */
+    private String signatureEvaluatorFirst;
+
+    /**
+     * 签字评估师2
+     */
+    private String signatureEvaluatorSecond;
+
+    private static final long serialVersionUID = 1L;
+}

+ 28 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ProgramAuditAssessPeopleDto.java

@@ -0,0 +1,28 @@
+package com.jeeplus.finance.program.configuration.projectList.service.dto;
+
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+
+/**
+ * 新项目管理-项目登记-三级校审-评估人员
+ * @TableName program_audit_assess_people
+ */
+@Data
+public class ProgramAuditAssessPeopleDto extends BaseDTO {
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 校审id
+     */
+    private String auditId;
+
+    /**
+     * 评估人员
+     */
+    private String assessPeople;
+
+    private static final long serialVersionUID = 1L;
+}

+ 111 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ProgramAuditDto.java

@@ -0,0 +1,111 @@
+package com.jeeplus.finance.program.configuration.projectList.service.dto;
+
+import com.jeeplus.core.service.dto.BaseDTO;
+import com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.ProgramProjectListInfo;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 新项目管理-项目登记-三级校审
+ * @TableName program_audit
+ */
+@Data
+public class ProgramAuditDto extends BaseDTO {
+
+    //校审id1
+    private String id1;
+    //校审id2
+    private String id2;
+    //校审id3
+    private String id3;
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 项目id
+     */
+    private String programId;
+
+    /**
+     * 校审级别
+     */
+    private String auditLevel;
+
+    /**
+     * 审核人
+     */
+    private String auditPeople;
+
+    /**
+     * 审核通过时间
+     */
+    private Date auditDate;
+
+    /**
+     * 执行人员保留意见
+     */
+    private String retainOpinion;
+
+    /**
+     * 审核人员审核未修改意见
+     */
+    private String changeOpinion;
+
+    /**
+     * 审核意见及回复/明细表
+     */
+    private String detailOpinion;
+
+    /**
+     * 审核意见及回复/评估报告
+     */
+    private String reportOpinion;
+
+    /**
+     * 审核意见及回复/技术说明
+     */
+    private String remarksOpinion;
+
+    /**
+     * 审核意见及回复/工作底稿
+     */
+    private String workOpinion;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     * 流程信息
+     */
+    private String processDefinitionId;
+
+    /**
+     * 状态
+     */
+    private String status;
+
+    /**
+     * 项目信息
+     */
+    private ProgramProjectListInfo programProjectListInfo;
+
+    /**
+     * 专业评估人员
+     */
+    private List<ProgramAuditAssessPeopleDto> programAuditAssessPeopleDtoList;
+
+    /**
+     * 附件信息
+     */
+    private List<WorkAttachmentInfo> workAttachmentDtoList;
+
+    private static final long serialVersionUID = 1L;
+}

+ 45 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ProgramMembersDto.java

@@ -0,0 +1,45 @@
+package com.jeeplus.finance.program.configuration.projectList.service.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 评估-项目管理-项目组成员
+ * @TableName program_members
+ */
+@TableName(value ="program_members")
+@Data
+public class ProgramMembersDto extends BaseDTO implements Serializable {
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    /**
+     * 项目id
+     */
+    private String projectId;
+
+    /**
+     * 人员id
+     */
+    private String userId;
+
+    /**
+     * 状态  0为正常  1为移除
+     */
+    private String status;
+
+    /**
+     * 项目主要成员  1为主要成员 
+     */
+    private String isImportant;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 32 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ProgramReportNoDto.java

@@ -0,0 +1,32 @@
+package com.jeeplus.finance.program.configuration.projectList.service.dto;
+
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+
+/**
+ * 新项目管理-项目登记-项目报告号表
+ * @TableName program_report_no
+ */
+@Data
+public class ProgramReportNoDto extends BaseDTO {
+
+    public static final String BIZ_CODE = "7";
+    public static final String BIZ_CODE_ = "8";
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 项目id
+     */
+    private String programId;
+
+    /**
+     * 项目报告号
+     */
+    private String reportNo;
+
+    private static final long serialVersionUID = 1L;
+}

+ 166 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/dto/ProjectListDto.java

@@ -0,0 +1,166 @@
+package com.jeeplus.finance.program.configuration.projectList.service.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.finance.program.configuration.projectList.domain.ProgramProjectListLink;
+import com.jeeplus.finance.program.configuration.projectList.domain.ProgramProjectListMember;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
+import com.jeeplus.sys.service.dto.WorkAttachmentInfoDTO;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class ProjectListDto extends BaseEntity {
+
+    public static final String BIZ_CODE = "xmlb";
+    public static final String BIY_CODE = "6";
+
+    private String contractId;
+
+    private String contractName;
+
+    private String client;
+
+    private String clientName;
+
+    private String amount;
+
+    private String contractType;
+
+    private String name;
+
+    private String no;
+
+    private String projectType;
+
+    private String approvalNo;
+
+    private String company;
+
+    private String projectMould;
+
+    private String propertyHolder;
+
+    private String propertyHolderName;
+
+    private String location;
+
+    private String isFirst;
+
+    private String yearNum;
+
+    private String checkYear;
+
+    private String projectManager;
+
+    private String projectManagerName;
+
+    private String reportType;
+
+    private String industry;
+
+    private String enterpriseType;
+
+    private String riskLevel;
+
+    private String projectSource;
+
+    private BigDecimal estimate;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private Date planEndTime;
+
+    private Integer useNum;
+
+    private Integer appointment;
+
+    private Double workHours;
+
+    private String remarks;
+
+    private String assessmentEnterprise;
+
+    private String assessmentEnterpriseName;
+
+    private String linkNum;
+
+    private String relationship;
+
+    private String assessmentWay;
+
+    private String assessmentObjective;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private Date assessmentDate;
+
+    private BigDecimal num;
+
+    private String projectDevelopment;
+
+    private String delegateProjectType;
+
+    private String assessmentObject;
+
+    /**
+     * 评估范围
+     */
+    private String assessmentRange;
+
+    /**
+     * 是否生成报告号
+     */
+    private String generateReportNumber;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private Date workBeginDate;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private Date workEndDate;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private Date reportingDate;
+
+    private String isHave;
+
+    private String isInfluence;
+
+    private String mode;
+
+    private String status;
+
+    /**
+     * 联系人
+     */
+    private List<ProgramProjectListLink> links;
+
+    private List<ProgramProjectListMember> members;
+
+    private List<WorkAttachmentInfo> files;
+
+    /**
+     * 审批通过时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date agreeTime;
+
+    /**
+     * 审批人
+     */
+    private String agreeUserId;
+
+    /**
+     * 生成合同编号,前端传值为 “ 1 ” 的时候,进行生成
+     */
+    private String createContractNo;
+
+}

+ 15 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/mapstruct/ProgramArchiveWrapper.java

@@ -0,0 +1,15 @@
+package com.jeeplus.finance.program.configuration.projectList.service.mapstruct;
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.finance.program.configuration.projectList.domain.ProgramArchive;
+import com.jeeplus.finance.program.configuration.projectList.service.dto.ProgramArchiveDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {})
+public interface ProgramArchiveWrapper extends EntityWrapper<ProgramArchiveDto, ProgramArchive>{
+
+        ProgramArchiveWrapper INSTANCE = Mappers.getMapper(ProgramArchiveWrapper.class);
+
+}

+ 15 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/mapstruct/ProgramAuditAssessPeopleWrapper.java

@@ -0,0 +1,15 @@
+package com.jeeplus.finance.program.configuration.projectList.service.mapstruct;
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.finance.program.configuration.projectList.domain.ProgramAuditAssessPeople;
+import com.jeeplus.finance.program.configuration.projectList.service.dto.ProgramAuditAssessPeopleDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {})
+public interface ProgramAuditAssessPeopleWrapper extends EntityWrapper<ProgramAuditAssessPeopleDto, ProgramAuditAssessPeople>{
+
+        ProgramAuditAssessPeopleWrapper INSTANCE = Mappers.getMapper(ProgramAuditAssessPeopleWrapper.class);
+
+}

+ 15 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/mapstruct/ProgramAuditWrapper.java

@@ -0,0 +1,15 @@
+package com.jeeplus.finance.program.configuration.projectList.service.mapstruct;
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.finance.program.configuration.projectList.domain.ProgramAudit;
+import com.jeeplus.finance.program.configuration.projectList.service.dto.ProgramAuditDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {})
+public interface ProgramAuditWrapper extends EntityWrapper<ProgramAuditDto, ProgramAudit>{
+
+        ProgramAuditWrapper INSTANCE = Mappers.getMapper(ProgramAuditWrapper.class);
+
+}

+ 15 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/projectList/service/mapstruct/ProgramMembersWrapper.java

@@ -0,0 +1,15 @@
+package com.jeeplus.finance.program.configuration.projectList.service.mapstruct;
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.finance.program.configuration.projectList.domain.ProgramMembers;
+import com.jeeplus.finance.program.configuration.projectList.service.dto.ProgramMembersDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {})
+public interface ProgramMembersWrapper extends EntityWrapper<ProgramMembersDto, ProgramMembers>{
+
+        ProgramMembersWrapper INSTANCE = Mappers.getMapper(ProgramMembersWrapper.class);
+
+}

+ 141 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/typeDict/controller/ProgramTypeDictController.java

@@ -0,0 +1,141 @@
+package com.jeeplus.finance.program.configuration.typeDict.controller;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
+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.extension.plugins.pagination.Page;
+import com.jeeplus.finance.program.configuration.typeDict.domain.ProgramTypeDict;
+import com.jeeplus.finance.program.configuration.typeDict.service.ProgramTypeDictService;
+import com.jeeplus.finance.program.configuration.typeDict.service.dto.ProgramTypeDictDTO;
+import com.jeeplus.logging.annotation.ApiLog;
+import io.swagger.annotations.Api;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+@Api("项目配置管理-项目类型管理")
+@RestController
+@RequestMapping(value = "/program/configuration/type")
+public class ProgramTypeDictController {
+
+    @Resource
+    private ProgramTypeDictService programTypeDictService;
+
+    /**
+     * 查询项目类型管理列表
+     * @param programTypeDictDTO
+     * @param page
+     * @return
+     * @throws Exception
+     */
+    @ApiLog("查询项目类型管理列表")
+    @PreAuthorize("hasAuthority('program:configuration:type:list')")
+    @GetMapping("list")
+    public ResponseEntity<IPage<ProgramTypeDictDTO>> data(ProgramTypeDictDTO programTypeDictDTO, Page<ProgramTypeDictDTO> page) throws Exception {
+        page.setSize(-1);
+        IPage<ProgramTypeDictDTO> result = new Page<ProgramTypeDictDTO>();
+        if(ObjectUtil.isNotEmpty(programTypeDictDTO)){
+            if(StringUtils.isNotBlank(programTypeDictDTO.getType())){
+                //根据type模糊查询
+                List<ProgramTypeDict> programTypeDictList = programTypeDictService.list(new QueryWrapper<ProgramTypeDict>().lambda()
+                        .like(StringUtils.isNotBlank(programTypeDictDTO.getType()), ProgramTypeDict::getType, programTypeDictDTO.getType())
+                );
+                //获取到其中不是一级项目类型的数据
+                List<ProgramTypeDict> childList = programTypeDictList.stream().distinct().filter(item -> {
+                    if (!"0".equals(item.getParentId())) {
+                        return true;
+                    }
+                    return false;
+                }).collect(Collectors.toList());
+                //childList的id全部获取
+                List<String> cIdList = childList.stream().distinct().map(ProgramTypeDict::getId).collect(Collectors.toList());
+                //childList的父级id全部获取
+                List<String> cupIdList = childList.stream().distinct().map(ProgramTypeDict::getParentId).collect(Collectors.toList());
+                //获取到其中一级项目类型的数据的id
+                List<String> pIdList = programTypeDictList.stream().distinct().filter(item -> {
+                    if ("0".equals(item.getParentId())) {
+                        return true;
+                    }
+                    return false;
+                }).map(ProgramTypeDict::getId).collect(Collectors.toList());
+                //获取pIdList下的所有子项目类型的id
+                if(CollectionUtil.isNotEmpty(pIdList)){
+                    pIdList.addAll(programTypeDictService.list(new QueryWrapper<ProgramTypeDict>().lambda()
+                            .in(ProgramTypeDict::getParentId,pIdList)).stream().map(ProgramTypeDict::getId).collect(Collectors.toList()));
+                }
+                //将获取到的这几个id集合融合到一起并去重,然后根据id查询,即可得到结果
+                cIdList.addAll(cupIdList);
+                cIdList.addAll(pIdList);
+                List<String> idList = cIdList.stream().distinct().collect(Collectors.toList());
+                if(CollectionUtil.isNotEmpty(idList)){
+                    QueryWrapper<ProgramTypeDict> wrapper = new QueryWrapper<ProgramTypeDict>()
+                            .in("ptd.id",idList);
+                    result = programTypeDictService.findList (page,wrapper);
+                }
+            }else{
+                result = programTypeDictService.findList (page,new QueryWrapper<ProgramTypeDict>());
+            }
+        }
+        return ResponseEntity.ok (result);
+    }
+
+    /**
+     * 查询项目类型管理数据
+     * @param id
+     * @return
+     */
+    @ApiLog("查询项目类型管理详情")
+    @PreAuthorize ("hasAnyAuthority('program:configuration:type:view','program:configuration:type:add','program:configuration:type:edit')")
+    @GetMapping("queryById")
+    public ResponseEntity queryById(@RequestParam("id") String id) {
+        ProgramTypeDictDTO programTypeDictDTO = programTypeDictService.queryById ( id );
+        return ResponseEntity.ok (programTypeDictDTO);
+    }
+
+    /**
+     * 查询全部一级项目类型
+     * @return
+     */
+    @ApiLog("查询全部一级项目类型")
+    @GetMapping("getList")
+    public ResponseEntity<List<ProgramTypeDictDTO>> getList() {
+        List<ProgramTypeDictDTO> list = programTypeDictService.getList();
+        return ResponseEntity.ok (list);
+    }
+
+    /**
+     * 保存项目类型
+     * @param programTypeDictDTO
+     * @return
+     */
+    @ApiLog(value = "修改/新增项目类型")
+    @PreAuthorize("hasAnyAuthority('program:configuration:type:save','program:configuration:type:edit')")
+    @PostMapping("save")
+    public ResponseEntity save(@Valid @RequestBody ProgramTypeDictDTO programTypeDictDTO) {
+        programTypeDictService.saveType(programTypeDictDTO);
+        return ResponseEntity.ok ("操作成功");
+    }
+
+    /**
+     * 删除项目类型
+     * @param ids
+     * @return
+     */
+    @ApiLog(value = "删除项目类型")
+    @PreAuthorize ("hasAuthority('program:configuration:type:del')")
+    @DeleteMapping("delete")
+    public ResponseEntity delete(String ids) {
+        return programTypeDictService.deleteByIds(ids);
+    }
+
+}

+ 38 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/typeDict/domain/ProgramTypeDict.java

@@ -0,0 +1,38 @@
+package com.jeeplus.finance.program.configuration.typeDict.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 
+ * @TableName program_type_dict
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("program_type_dict")
+public class ProgramTypeDict extends BaseEntity {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 项目类型名称
+     */
+    private String type;
+
+    /**
+     * 父类型id
+     */
+    private String parentId;
+
+    /**
+     * 序号
+     */
+    private String sort;
+
+    private static final long serialVersionUID = 1L;
+}

+ 31 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/typeDict/mapper/ProgramTypeDictMapper.java

@@ -0,0 +1,31 @@
+package com.jeeplus.finance.program.configuration.typeDict.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.program.configuration.typeDict.domain.ProgramTypeDict;
+import com.jeeplus.finance.program.configuration.typeDict.service.dto.ProgramTypeDictDTO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @Entity com.jeeplus.test.program.configuration.typeDict.domain.ProgramTypeDict
+ */
+@Mapper
+public interface ProgramTypeDictMapper extends BaseMapper<ProgramTypeDict> {
+
+    public IPage<ProgramTypeDictDTO> findList(Page<ProgramTypeDictDTO> page, @Param(Constants.WRAPPER) QueryWrapper<ProgramTypeDict> queryWrapper);
+
+    public ProgramTypeDictDTO queryById(@Param("id") String id);
+    @InterceptorIgnore(tenantLine = "true")
+    public List<ProgramTypeDictDTO> getList();
+}
+
+
+
+

+ 75 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/typeDict/mapper/xml/ProgramTypeDictMapper.xml

@@ -0,0 +1,75 @@
+<?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.program.configuration.typeDict.mapper.ProgramTypeDictMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.finance.program.configuration.typeDict.service.dto.ProgramTypeDictDTO">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_date" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_date" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="type" column="type" jdbcType="VARCHAR"/>
+            <result property="parentId" column="parent_id" jdbcType="VARCHAR"/>
+            <result property="sort" column="sort" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        ptd.id,
+        ptd.create_by_id,
+        ptd.create_time,
+        ptd.update_by_id,
+        ptd.update_time,
+        ptd.del_flag,
+        ptd.remarks,
+        ptd.type,
+        ptd.parent_id,
+        ptd.sort
+    </sql>
+
+    <select id="findList" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"></include>
+        from program_type_dict ptd
+        ${ew.customSqlSegment}
+    </select>
+
+    <select id="queryById" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"></include>
+        from program_type_dict ptd
+        where ptd.del_flag = '0' and ptd.id = ${id}
+    </select>
+
+    <select id="getList" resultMap="Map">
+        select
+        <include refid="Base_Column_List"></include>
+        from program_type_dict ptd
+        where ptd.del_flag = '0' and ptd.parent_id = '0'
+    </select>
+
+    <resultMap id="Map" type="com.jeeplus.finance.program.configuration.typeDict.service.dto.ProgramTypeDictDTO">
+        <id property="id" column="id" jdbcType="VARCHAR"/>
+        <result property="createBy.id" column="create_by" jdbcType="VARCHAR"/>
+        <result property="createTime" column="create_date" jdbcType="TIMESTAMP"/>
+        <result property="updateBy.id" column="update_by" jdbcType="VARCHAR"/>
+        <result property="updateTime" column="update_date" jdbcType="TIMESTAMP"/>
+        <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+        <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+        <result property="type" column="type" jdbcType="VARCHAR"/>
+        <result property="parentId" column="parent_id" jdbcType="VARCHAR"/>
+        <result property="sort" column="sort" jdbcType="VARCHAR"/>
+        <collection property="childrenList" column="id" select="getChildList" ofType="com.jeeplus.finance.program.configuration.typeDict.service.dto.ProgramTypeDictDTO"/>
+    </resultMap>
+
+    <select id="getChildList" resultType="com.jeeplus.finance.program.configuration.typeDict.service.dto.ProgramTypeDictDTO">
+        select
+        <include refid="Base_Column_List"></include>
+        from program_type_dict ptd
+        where ptd.del_flag = '0' and ptd.parent_id = ${id}
+    </select>
+
+</mapper>

+ 71 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/typeDict/service/ProgramTypeDictService.java

@@ -0,0 +1,71 @@
+package com.jeeplus.finance.program.configuration.typeDict.service;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.jeeplus.core.service.TreeService;
+//import com.jeeplus.sys.domain.Menu;
+import com.jeeplus.finance.program.configuration.typeDict.domain.ProgramTypeDict;
+import com.jeeplus.finance.program.configuration.typeDict.mapper.ProgramTypeDictMapper;
+import com.jeeplus.finance.program.configuration.typeDict.service.dto.ProgramTypeDictDTO;
+import com.jeeplus.finance.program.configuration.typeDict.service.mapstruct.ProgramTypeDictWrapper;
+import com.jeeplus.sys.service.dto.MenuDTO;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+@Transactional
+public class ProgramTypeDictService extends ServiceImpl<ProgramTypeDictMapper, ProgramTypeDict> {
+
+    @Resource
+    private ProgramTypeDictMapper programTypeDictMapper;
+
+    public IPage<ProgramTypeDictDTO> findList(Page<ProgramTypeDictDTO> page, QueryWrapper<ProgramTypeDict> queryWrapper){
+        queryWrapper.eq("ptd.del_flag","0").orderByAsc("ptd.sort");
+        return programTypeDictMapper.findList(page,queryWrapper);
+    }
+
+    public ProgramTypeDictDTO queryById(String id) {
+
+        ProgramTypeDictDTO programTypeDictDTO = programTypeDictMapper.queryById(id);
+
+        return programTypeDictDTO;
+    }
+
+    public List<ProgramTypeDictDTO> getList() {
+        List<ProgramTypeDictDTO> list = programTypeDictMapper.getList();
+        return list;
+    }
+
+    public ResponseEntity saveType(ProgramTypeDictDTO programTypeDictDTO) {
+        ProgramTypeDict programTypeDict = ProgramTypeDictWrapper.INSTANCE.toEntity(programTypeDictDTO);
+        this.saveOrUpdate(programTypeDict);
+        return ResponseEntity.ok("保存成功");
+    }
+
+    public ResponseEntity deleteByIds(String ids) {
+        String idArray[] =ids.split(",");
+        if(CollectionUtil.isNotEmpty(Lists.newArrayList (idArray))){
+            List<String> list = this.list(new QueryWrapper<ProgramTypeDict>().lambda().in(ProgramTypeDict::getParentId, Lists.newArrayList(idArray))).stream().distinct().map(ProgramTypeDict::getId).collect(Collectors.toList());
+            this.removeByIds (list);
+        }
+        this.removeByIds (Lists.newArrayList (idArray));
+        return ResponseEntity.ok ("删除成功");
+    }
+}

+ 43 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/typeDict/service/dto/ProgramTypeDictDTO.java

@@ -0,0 +1,43 @@
+package com.jeeplus.finance.program.configuration.typeDict.service.dto;
+
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * 
+ * @TableName program_type_dict
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ProgramTypeDictDTO extends BaseDTO {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 项目类型名称
+     */
+    private String type;
+
+    /**
+     * 父类型id
+     */
+    private String parentId;
+
+    /**
+     * 序号
+     */
+    private String sort;
+
+    /**
+     * 子类型集合
+     */
+    List<ProgramTypeDictDTO> childrenList;
+
+    private static final long serialVersionUID = 1L;
+}

+ 15 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/configuration/typeDict/service/mapstruct/ProgramTypeDictWrapper.java

@@ -0,0 +1,15 @@
+package com.jeeplus.finance.program.configuration.typeDict.service.mapstruct;
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.finance.program.configuration.typeDict.domain.ProgramTypeDict;
+import com.jeeplus.finance.program.configuration.typeDict.service.dto.ProgramTypeDictDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {})
+public interface ProgramTypeDictWrapper extends EntityWrapper<ProgramTypeDictDTO, ProgramTypeDict>{
+
+        ProgramTypeDictWrapper INSTANCE = Mappers.getMapper(ProgramTypeDictWrapper.class);
+
+}

+ 122 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/serviceType/controller/ProgramServiceTypeController.java

@@ -0,0 +1,122 @@
+package com.jeeplus.finance.program.serviceType.controller;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.finance.program.serviceType.domain.ProgramServiceType;
+import com.jeeplus.finance.program.serviceType.service.ProgramServiceTypeService;
+import com.jeeplus.finance.program.serviceType.service.dto.ProgramServiceTypeDTO;
+import io.swagger.annotations.Api;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Api("项目管理-业务类型管理")
+@RestController
+@RequestMapping(value = "/program/service_type")
+public class ProgramServiceTypeController {
+
+    @Resource
+    private ProgramServiceTypeService programServiceTypeService;
+
+    /**
+     * 查询业务类型列表
+     * @param programServiceTypeDTO
+     * @param page
+     * @return
+     * @throws Exception
+     */
+    @GetMapping("list")
+    public ResponseEntity<IPage<ProgramServiceTypeDTO>> data(ProgramServiceTypeDTO programServiceTypeDTO, Page<ProgramServiceTypeDTO> page) throws Exception {
+        page.setSize(-1);
+        IPage<ProgramServiceTypeDTO> result = new Page<ProgramServiceTypeDTO>();
+        if(ObjectUtil.isNotEmpty(programServiceTypeDTO)){
+            if(StringUtils.isNotBlank(programServiceTypeDTO.getName())){
+                //根据type模糊查询
+                List<ProgramServiceType> programServiceTypeList = programServiceTypeService.list(new QueryWrapper<ProgramServiceType>().lambda()
+                        .like(StringUtils.isNotBlank(programServiceTypeDTO.getName()), ProgramServiceType::getName, programServiceTypeDTO.getName())
+                );
+                List<String> idList = new ArrayList<>();
+                programServiceTypeList.stream().forEach(item->{
+                    if (StringUtils.isNotBlank(item.getParentIds())){
+                        String[] split = item.getParentIds().split(",");
+                        for (String s : split) {
+                            idList.add(s);
+                        }
+                    }
+                    List<ProgramServiceType> list = programServiceTypeService.list(new QueryWrapper<ProgramServiceType>().lambda().like(ProgramServiceType::getParentIds, "," + item.getId() + ","));
+                    idList.addAll(list.stream().map(ProgramServiceType::getId).collect(Collectors.toList()));
+                    idList.add(item.getId());
+                });
+                List<String> ids = idList.stream().distinct().filter(item->{
+                    if (!"0".equals(item)){
+                        return true;
+                    }
+                    return false;
+                }).collect(Collectors.toList());
+                if(CollectionUtil.isNotEmpty(ids)){
+                    QueryWrapper<ProgramServiceType> wrapper = new QueryWrapper<ProgramServiceType>()
+                            .in("pst.id",idList);
+                    result = programServiceTypeService.findList (page,wrapper);
+                }
+            }else{
+                result = programServiceTypeService.findList (page,new QueryWrapper<ProgramServiceType>());
+            }
+        }
+        return ResponseEntity.ok (result);
+    }
+
+    /**
+     * 查询业务类型数据
+     * @param id
+     * @return
+     */
+    @PreAuthorize ("hasAnyAuthority('program_service_type:view','program_service_type:add','program_service_type:edit')")
+    @GetMapping("queryById")
+    public ResponseEntity queryById(@RequestParam("id") String id) {
+        ProgramServiceTypeDTO programServiceTypeDTO = programServiceTypeService.queryById ( id );
+        return ResponseEntity.ok (programServiceTypeDTO);
+    }
+
+    /**
+     * 保存业务类型
+     * @param programServiceTypeDTO
+     * @return
+     */
+    @PreAuthorize("hasAnyAuthority('program_service_type:add','program_service_type:edit')")
+    @PostMapping("save")
+    public ResponseEntity save(@Valid @RequestBody ProgramServiceTypeDTO programServiceTypeDTO) {
+        programServiceTypeService.saveType(programServiceTypeDTO);
+        return ResponseEntity.ok ("操作成功");
+    }
+
+    /**
+     * 删除业务类型
+     * @param ids
+     * @return
+     */
+    @PreAuthorize ("hasAuthority('program_service_type:del')")
+    @DeleteMapping("delete")
+    public ResponseEntity delete(String ids) {
+        return programServiceTypeService.deleteByIds(ids);
+    }
+
+    /**
+     * 查询全部一级业务类型
+     * @return
+     */
+    @GetMapping("getList")
+    public ResponseEntity<List<ProgramServiceTypeDTO>> getList() {
+        List<ProgramServiceTypeDTO> list = programServiceTypeService.getList();
+        return ResponseEntity.ok (list);
+    }
+}

+ 46 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/serviceType/domain/ProgramServiceType.java

@@ -0,0 +1,46 @@
+package com.jeeplus.finance.program.serviceType.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 评估-项目管理-业务类型管理
+ * @TableName program_service_type
+ */
+@Data
+@TableName("program_service_type")
+public class ProgramServiceType extends BaseEntity {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 分类名称
+     */
+    private String name;
+
+    /**
+     * 父id
+     */
+    private String parentId;
+
+    /**
+     * 等级
+     */
+    private Integer level;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 父ids
+     */
+    private String parentIds;
+
+    private static final long serialVersionUID = 1L;
+}

+ 30 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/serviceType/mapper/ProgramServiceTypeMapper.java

@@ -0,0 +1,30 @@
+package com.jeeplus.finance.program.serviceType.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.program.serviceType.domain.ProgramServiceType;
+import com.jeeplus.finance.program.serviceType.service.dto.ProgramServiceTypeDTO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+//@InterceptorIgnore(tenantLine = "true")
+public interface ProgramServiceTypeMapper extends BaseMapper<ProgramServiceType> {
+
+    IPage<ProgramServiceTypeDTO> findList(Page<ProgramServiceTypeDTO> page, @Param(Constants.WRAPPER) QueryWrapper<ProgramServiceType> queryWrapper);
+
+    ProgramServiceTypeDTO queryById(@Param("id") String id);
+
+    public List<ProgramServiceTypeDTO> getList();
+
+}
+
+
+
+

+ 80 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/serviceType/mapper/xml/ProgramServiceTypeMapper.xml

@@ -0,0 +1,80 @@
+<?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.program.serviceType.mapper.ProgramServiceTypeMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.finance.program.serviceType.service.dto.ProgramServiceTypeDTO">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_date" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_date" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="name" column="name" jdbcType="VARCHAR"/>
+            <result property="parentId" column="parent_id" jdbcType="VARCHAR"/>
+            <result property="level" column="level" jdbcType="INTEGER"/>
+            <result property="sort" column="sort" jdbcType="INTEGER"/>
+            <result property="parentIds" column="parent_ids" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        pst.id,
+        pst.create_by_id,
+        pst.create_time,
+        pst.update_by_id,
+        pst.update_time,
+        pst.del_flag,
+        pst.remarks,
+        pst.name,
+        pst.parent_id,
+        pst.level,
+        pst.sort
+    </sql>
+
+    <select id="findList" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"></include>
+        from program_service_type pst
+        ${ew.customSqlSegment}
+    </select>
+
+    <select id="queryById" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"></include>
+        from program_service_type pst
+        where pst.del_flag = '0' and pst.id = #{id}
+    </select>
+
+    <select id="getList" resultMap="map">
+        select
+        <include refid="Base_Column_List"></include>
+        from program_service_type pst
+        where pst.del_flag = '0' and pst.parent_id = '0'
+    </select>
+
+    <resultMap id="map" type="com.jeeplus.finance.program.serviceType.service.dto.ProgramServiceTypeDTO">
+        <id property="id" column="id" jdbcType="VARCHAR"/>
+        <result property="createBy.id" column="create_by" jdbcType="VARCHAR"/>
+        <result property="createTime" column="create_date" jdbcType="TIMESTAMP"/>
+        <result property="updateBy.id" column="update_by" jdbcType="VARCHAR"/>
+        <result property="updateTime" column="update_date" jdbcType="TIMESTAMP"/>
+        <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+        <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+        <result property="name" column="name" jdbcType="VARCHAR"/>
+        <result property="parentId" column="parent_id" jdbcType="VARCHAR"/>
+        <result property="level" column="level" jdbcType="INTEGER"/>
+        <result property="sort" column="sort" jdbcType="INTEGER"/>
+        <result property="parentIds" column="parent_ids" jdbcType="VARCHAR"/>
+        <collection property="childrenList" column="id" select="getChildList" ofType="com.jeeplus.finance.program.serviceType.service.dto.ProgramServiceTypeDTO"/>
+    </resultMap>
+
+    <select id="getChildList" resultType="com.jeeplus.finance.program.serviceType.service.dto.ProgramServiceTypeDTO">
+        select
+        <include refid="Base_Column_List"></include>
+        from program_service_type pst
+        where pst.del_flag = '0' and pst.parent_id = ${id}
+    </select>
+
+</mapper>

+ 80 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/serviceType/service/ProgramServiceTypeService.java

@@ -0,0 +1,80 @@
+package com.jeeplus.finance.program.serviceType.service;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.jeeplus.finance.program.serviceType.domain.ProgramServiceType;
+import com.jeeplus.finance.program.serviceType.mapper.ProgramServiceTypeMapper;
+import com.jeeplus.finance.program.serviceType.service.dto.ProgramServiceTypeDTO;
+import com.jeeplus.finance.program.serviceType.service.mapstruct.ProgramServiceTypeWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ProgramServiceTypeService extends ServiceImpl<ProgramServiceTypeMapper, ProgramServiceType> {
+
+    @Resource
+    private ProgramServiceTypeMapper programServiceTypeMapper;
+
+    public IPage<ProgramServiceTypeDTO> findList(Page<ProgramServiceTypeDTO> page, QueryWrapper<ProgramServiceType> queryWrapper){
+        queryWrapper.eq("pst.del_flag","0").orderByAsc("pst.sort");
+        return programServiceTypeMapper.findList(page,queryWrapper);
+    }
+
+    public ProgramServiceTypeDTO queryById(String id) {
+
+        ProgramServiceTypeDTO programServiceTypeDTO = programServiceTypeMapper.queryById(id);
+
+        return programServiceTypeDTO;
+    }
+
+    public ResponseEntity saveType(ProgramServiceTypeDTO programServiceTypeDTO) {
+        ProgramServiceType programServiceType = ProgramServiceTypeWrapper.INSTANCE.toEntity(programServiceTypeDTO);
+        if (ObjectUtil.isNotEmpty(programServiceTypeDTO)) {
+            if (StringUtils.isBlank(programServiceTypeDTO.getId())) {
+                if (StringUtils.isNotBlank(programServiceTypeDTO.getParentId())){
+                    if ("0".equals(programServiceTypeDTO.getParentId())){
+                        programServiceType.setLevel(1);
+                        programServiceType.setParentIds("0,");
+                    }else{
+                        ProgramServiceType byId = this.getById(programServiceTypeDTO.getParentId());
+                        ProgramServiceTypeDTO pbt = ProgramServiceTypeWrapper.INSTANCE.toDTO(byId);
+                        if(ObjectUtil.isNotEmpty(pbt)){
+                            programServiceType.setLevel(pbt.getLevel()+1);
+                            programServiceType.setParentIds(pbt.getParentIds()+pbt.getId()+",");
+                        }
+                    }
+                }
+            }
+        }
+        this.saveOrUpdate(programServiceType);
+        return ResponseEntity.ok("保存成功");
+    }
+
+    public ResponseEntity deleteByIds(String ids) {
+        String idArray[] =ids.split(",");
+        if(CollectionUtil.isNotEmpty(Lists.newArrayList (idArray))){
+            List<String> list = this.list(new QueryWrapper<ProgramServiceType>().lambda().in(ProgramServiceType::getParentId, Lists.newArrayList(idArray))).stream().distinct().map(ProgramServiceType::getId).collect(Collectors.toList());
+            this.removeByIds (list);
+        }
+        this.removeByIds (Lists.newArrayList (idArray));
+        return ResponseEntity.ok ("删除成功");
+    }
+
+    public List<ProgramServiceTypeDTO> getList() {
+        List<ProgramServiceTypeDTO> list = programServiceTypeMapper.getList();
+        return list;
+    }
+
+}

+ 50 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/serviceType/service/dto/ProgramServiceTypeDTO.java

@@ -0,0 +1,50 @@
+package com.jeeplus.finance.program.serviceType.service.dto;
+
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 评估-项目管理-业务类型管理
+ */
+@Data
+public class ProgramServiceTypeDTO extends BaseDTO {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 分类名称
+     */
+    private String name;
+
+    /**
+     * 父id
+     */
+    private String parentId;
+
+    /**
+     * 等级
+     */
+    private Integer level;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 父ids
+     */
+    private String parentIds;
+
+    /**
+     * 子集合
+     */
+    private List<ProgramServiceTypeDTO> childrenList;
+
+    private static final long serialVersionUID = 1L;
+}

+ 15 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/program/serviceType/service/mapstruct/ProgramServiceTypeWrapper.java

@@ -0,0 +1,15 @@
+package com.jeeplus.finance.program.serviceType.service.mapstruct;
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.finance.program.serviceType.domain.ProgramServiceType;
+import com.jeeplus.finance.program.serviceType.service.dto.ProgramServiceTypeDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {})
+public interface ProgramServiceTypeWrapper extends EntityWrapper<ProgramServiceTypeDTO, ProgramServiceType>{
+
+        ProgramServiceTypeWrapper INSTANCE = Mappers.getMapper(ProgramServiceTypeWrapper.class);
+
+}

+ 323 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/Utils/EasyPoiUtil.java

@@ -0,0 +1,323 @@
+package com.jeeplus.finance.projectRecords.Utils;
+
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
+import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+/**
+ * @Author Steel.D
+ * @Description easypoi导入导出通用工具类
+ * @Date 2019-7-31 9:29
+ * @Param
+ * @return
+ **/
+
+public class EasyPoiUtil {
+
+    /**
+     * 功能描述:复杂导出Excel,包括文件名以及表名。创建表头
+     *
+     * @param list           导出的实体类
+     * @param title          表头名称
+     * @param sheetName      sheet表名
+     * @param pojoClass      映射的实体类
+     * @param isCreateHeader 是否创建表头
+     * @param fileName
+     * @param response
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 9:30
+     */
+
+    public static void exportExcel(List <?> list, String title, String sheetName, Class <?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) {
+
+        ExportParams exportParams = new ExportParams ( title, sheetName );
+
+        exportParams.setCreateHeadRows ( isCreateHeader );
+
+        defaultExport ( list, pojoClass, fileName, response, exportParams );
+
+    }
+
+
+    /**
+     * 功能描述:复杂导出Excel,包括文件名以及表名,不创建表头
+     *
+     * @param list      导出的实体类
+     * @param title     表头名称
+     * @param sheetName sheet表名
+     * @param pojoClass 映射的实体类
+     * @param fileName  文件名
+     * @param response
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 9:35
+     */
+
+    public static void exportExcel(List <?> list, String title, String sheetName, Class <?> pojoClass, String fileName, HttpServletResponse response) {
+        ExportParams exportParams = new ExportParams(title, sheetName);
+        exportParams.setDictHandler(new ExcelDiceAddressListHandlerImpl());
+        defaultExport ( list, pojoClass, fileName, response, exportParams );
+
+    }
+
+
+    /**
+     * 功能描述:Map 集合导出
+     *
+     * @param list     实体集合
+     * @param fileName 导出的文件名称
+     * @param response
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 9:45
+     */
+
+    public static void exportExcel(List <Map <String, Object>> list, String fileName, HttpServletResponse response) {
+
+        defaultExport ( list, fileName, response );
+
+    }
+
+
+    /**
+     * 功能描述:默认导出方法
+     *
+     * @param list         导出的实体集合
+     * @param fileName     导出的文件名
+     * @param pojoClass    pojo实体
+     * @param exportParams ExportParams封装实体
+     * @param response
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 9:50
+     */
+
+    private static void defaultExport(List <?> list, Class <?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {
+
+        Workbook workbook = ExcelExportUtil.exportExcel ( exportParams, pojoClass, list );
+
+        if ( workbook != null ) {
+
+            downLoadExcel ( fileName, response, workbook );
+
+        }
+
+    }
+
+    /**
+     * 功能描述:Excel导出
+     *
+     * @param fileName 文件名称
+     * @param response
+     * @param workbook Excel对象
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 10:35
+     */
+
+    private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
+
+        try {
+
+            response.setCharacterEncoding ( "UTF-8" );
+
+            response.setHeader ( "content-Type", "application/vnd.ms-excel" );
+
+            response.setHeader ( "Content-Disposition", "attachment;filename=" + URLEncoder.encode ( fileName, "UTF-8" ) );
+
+            workbook.write ( response.getOutputStream ( ) );
+
+        } catch (IOException e) {
+
+            throw new RuntimeException ( e );
+
+        }
+
+    }
+
+
+    /**
+     * 功能描述:默认导出方法
+     *
+     * @param list     导出的实体集合
+     * @param fileName 导出的文件名
+     * @param response
+     * @return
+     * @author SteeL.D
+     * @Date 2019-7-31 10:45
+     */
+
+    private static void defaultExport(List <Map <String, Object>> list, String fileName, HttpServletResponse response) {
+
+        Workbook workbook = ExcelExportUtil.exportExcel ( list, ExcelType.HSSF );
+
+        if ( workbook != null ) ;
+
+        downLoadExcel ( fileName, response, workbook );
+
+    }
+
+
+    /**
+     * 功能描述:根据文件路径来导入Excel
+     *
+     * @param filePath   文件路径
+     * @param titleRows  表标题的行数
+     * @param headerRows 表头行数
+     * @param pojoClass  Excel实体类
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 11:05
+     */
+
+    public static <T> List <T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class <T> pojoClass) {
+
+        //判断文件是否存在
+
+        if ( StringUtils.isBlank ( filePath ) ) {
+
+            return null;
+
+        }
+
+        ImportParams params = new ImportParams ( );
+
+        params.setTitleRows ( titleRows );
+
+        params.setHeadRows ( headerRows );
+
+        List <T> list = null;
+
+        try {
+
+            list = ExcelImportUtil.importExcel ( new File ( filePath ), pojoClass, params );
+
+        } catch (NoSuchElementException e) {
+
+            throw new RuntimeException ( "模板不能为空" );
+
+        } catch (Exception e) {
+
+            e.printStackTrace ( );
+
+
+        }
+
+        return list;
+
+    }
+
+
+    /**
+     * 功能描述:根据接收的Excel文件来导入Excel,并封装成实体类
+     *
+     * @param file       上传的文件
+     * @param titleRows  表标题的行数
+     * @param headerRows 表头行数
+     * @param pojoClass  Excel实体类
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 11:30
+     */
+
+    public static <T> List <T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class <T> pojoClass) {
+
+        if ( file == null ) {
+
+            return null;
+
+        }
+
+        ImportParams params = new ImportParams ( );
+
+        params.setTitleRows ( titleRows );
+
+        params.setHeadRows ( headerRows );
+
+        List <T> list = null;
+
+        try {
+
+            list = ExcelImportUtil.importExcel ( file.getInputStream ( ), pojoClass, params );
+
+        } catch (NoSuchElementException e) {
+
+            throw new RuntimeException ( "excel文件不能为空" );
+
+        } catch (Exception e) {
+            e.printStackTrace ();
+            throw new RuntimeException ( e.getMessage ( ) );
+
+        }
+
+        return list;
+
+    }
+
+    /**
+     * 功能描述:根据接收的Excel文件来导入Excel,并封装成实体类
+     *
+     * @param file       上传的文件
+     * @param titleRows  表标题的行数
+     * @param headerRows 表头行数
+     * @param sheetNum   开始sheet页
+     * @param sheetNum   sheet页数
+     * @param pojoClass  Excel实体类
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 11:30
+     */
+    public static <T> List <T> importSheetExcel(MultipartFile file, Integer titleRows, Integer headerRows, Integer startSheetIndex, Integer sheetNum, Class <T> pojoClass) {
+
+        if ( file == null ) {
+
+            return null;
+
+        }
+
+        ImportParams params = new ImportParams ( );
+
+        params.setTitleRows ( titleRows );
+
+        params.setHeadRows ( headerRows );
+
+        params.setStartSheetIndex(startSheetIndex);
+
+        params.setSheetNum(sheetNum);
+
+        List <T> list = null;
+
+        try {
+
+            list = ExcelImportUtil.importExcel ( file.getInputStream ( ), pojoClass, params );
+
+        } catch (NoSuchElementException e) {
+
+            throw new RuntimeException ( "excel文件不能为空" );
+
+        } catch (Exception e) {
+            e.printStackTrace ();
+            throw new RuntimeException ( e.getMessage ( ) );
+
+        }
+
+        return list;
+
+    }
+
+
+}

+ 72 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/Utils/ExcelDiceAddressListHandlerImpl.java

@@ -0,0 +1,72 @@
+package com.jeeplus.finance.projectRecords.Utils;
+
+import cn.afterturn.easypoi.handler.inter.IExcelDictHandler;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+import com.jeeplus.sys.feign.IDictApi;
+import com.jeeplus.sys.service.dto.DictValueInfoDTO;
+//import com.jeeplus.sys.utils.DictUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 模拟使用,生产请用真实字典
+ *
+ */
+public class ExcelDiceAddressListHandlerImpl implements IExcelDictHandler {
+
+    /**
+     * 返回字典所有值
+     * key: dictKey
+     *
+     * @param dict 字典Key
+     * @return
+     */
+    @Override
+    public List<Map> getList(String dict) {
+        List<Map> list = new ArrayList<> ();
+//        Map<String, String> dictMap = new HashMap<>();
+//        dictMap.put("dictKey", "0");
+//        dictMap.put("dictValue", "严重瞌睡");
+//        list.add(dictMap);
+//        dictMap = new HashMap<>();
+//        dictMap.put("dictKey", "1");
+//        dictMap.put("dictValue", "小B");
+//        list.add(dictMap);
+//        dictMap = new HashMap<>();
+//        dictMap.put("dictKey", "1");
+//        dictMap.put("dictValue", "深度富有");
+//        list.add(dictMap);
+//        List<DictValueDTO> dictValueDTOs = DictUtils.getDictMap ().get (dict);
+        String datas = SpringUtil.getBean ( IDictApi.class ).getDictMap (dict);
+        List<DictValueInfoDTO> dictValueDTOs = JSON.parseObject(datas, new TypeReference<List<DictValueInfoDTO>>() {});
+        dictValueDTOs.forEach (dictValueDTO -> {
+            Map<String, String> dictMap = new HashMap<> ();
+            dictMap.put ("dictKey", dictValueDTO.getValue ());
+            dictMap.put ("dictValue", dictValueDTO.getLabel ());
+            list.add (dictMap);
+        });
+        return list;
+    }
+
+    @Override
+    public String toName(String dict, Object obj, String name, Object value) {
+        if (ObjectUtil.isNotEmpty(value)) {
+            return SpringUtil.getBean ( IDictApi.class ).getDictLabel (value.toString (), dict, null);
+        }
+        return "";
+    }
+
+    @Override
+    public String toValue(String dict, Object obj, String name, Object value) {
+        if (ObjectUtil.isNotEmpty(value)) {
+            return SpringUtil.getBean ( IDictApi.class ).getDictLabel (value.toString (), dict, null);
+        }
+        return "";
+    }
+}

+ 42 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/constant/enums/ProjectStatusEnum.java

@@ -0,0 +1,42 @@
+package com.jeeplus.finance.projectRecords.constant.enums;
+
+/**
+ * 项目状态
+ */
+public enum ProjectStatusEnum {
+    STAGING ("1", "暂存"),
+    TOTRIAL ("2", "送审"),
+    RETRACT ("3", "撤回"),
+    OVERRULE ("4", "驳回"),
+    FINISH ("5", "完成"),
+    INVALID ("6", "作废"),
+    DELETE ("7", "删除");
+
+    /**
+     *  项目状态值
+     */
+    private String value;
+
+    /**
+     * 项目状态标签
+     */
+    private String label;
+
+    private ProjectStatusEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    @Override
+    public String toString() {
+        return this.value;
+    }
+}

+ 38 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/constant/enums/ProjectTypeEnum.java

@@ -0,0 +1,38 @@
+package com.jeeplus.finance.projectRecords.constant.enums;
+
+/**
+ * 项目类型
+ */
+public enum ProjectTypeEnum {
+
+    ASSESS ("1", "评估项目"),
+    CONSULTATION ("2", "咨询项目");
+
+    /**
+     *  项目类型值
+     */
+    private String value;
+
+    /**
+     * 项目类型标签
+     */
+    private String label;
+
+    private ProjectTypeEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    @Override
+    public String toString() {
+        return this.value;
+    }
+}

+ 38 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/constant/enums/YesOrNoEnum.java

@@ -0,0 +1,38 @@
+package com.jeeplus.finance.projectRecords.constant.enums;
+
+/**
+ * 是否枚举
+ */
+public enum YesOrNoEnum {
+
+    YES ("1", "是"),
+    NO ("0", "否");
+
+    /**
+     *  枚举值
+     */
+    private String value;
+
+    /**
+     * 枚举标签
+     */
+    private String label;
+
+    private YesOrNoEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    @Override
+    public String toString() {
+        return this.value;
+    }
+}

+ 927 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/controller/ProjectController.java

@@ -0,0 +1,927 @@
+package com.jeeplus.finance.projectRecords.controller;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.common.collect.Lists;
+import com.jeeplus.aop.demo.annotation.DemoMode;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.common.excel.ExcelOptions;
+import com.jeeplus.common.excel.ExportMode;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.finance.projectRecords.Utils.EasyPoiUtil;
+import com.jeeplus.finance.projectRecords.constant.enums.ProjectStatusEnum;
+import com.jeeplus.finance.projectRecords.constant.enums.ProjectTypeEnum;
+import com.jeeplus.finance.projectRecords.constant.enums.YesOrNoEnum;
+import com.jeeplus.finance.projectRecords.domain.Project;
+import com.jeeplus.finance.projectRecords.service.ProjectService;
+import com.jeeplus.finance.projectRecords.service.dto.FileUploadListDTO;
+import com.jeeplus.finance.projectRecords.service.dto.ProjectDTO;
+import com.jeeplus.finance.projectRecords.service.mapstruct.ProjectWrapper;
+import com.jeeplus.logging.annotation.ApiLog;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.feign.IWorkAttachmentApi;
+import com.jeeplus.sys.service.dto.RoleDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.service.dto.WorkAttachmentInfoDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Type;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
+
+/**
+ * 项目Controller
+ *
+ * @author lizhenhao
+ * @version 2022-08-02
+ */
+@Api("项目管理")
+@RestController
+@RequestMapping(value = "/sys/project")
+public class ProjectController {
+
+    @Autowired
+    private ProjectService projectService;
+
+//    @Autowired
+//    private UserService userService;
+
+//    @Resource
+//    private OssService ossService;
+
+    private int successNum;
+
+    @ApiLog("查询项目列表")
+    @PreAuthorize("hasAuthority('sys:project:list')")
+    @GetMapping("list")
+    public ResponseEntity<IPage<Project>> data(Project project, Page<Project> page) throws Exception {
+        QueryWrapper<Project> queryWrapper = QueryWrapperGenerator.buildQueryCondition ( project, Project.class );
+        IPage<Project> result = projectService.selectPage (page,queryWrapper);
+        UserDTO currentUserDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken());
+        Boolean bmzrRoleFlag = false;
+        if(null != currentUserDTO.getRoleDTOList() && currentUserDTO.getRoleDTOList().size()>0){
+            for (RoleDTO roleDTO : currentUserDTO.getRoleDTOList()) {
+                if("bmzr".equals(roleDTO.getEnName())){
+                    bmzrRoleFlag = true;
+                    break;
+                }
+            }
+        }
+        List<Project> list = result.getRecords();
+        for (Project info: list) {
+            info = changeBigDecimalEntity(info);
+            if((StringUtils.isNotBlank(info.getProjectHeadId()) && info.getProjectHeadId().equals(currentUserDTO.getId()))
+                    || bmzrRoleFlag){
+                info.setPermissionFlag(true);
+            }else{
+                info.setPermissionFlag(false);
+            }
+        }
+        return ResponseEntity.ok (result);
+    }
+
+    /**
+     * 查询项目数据
+     * @param id
+     * @return
+     */
+    @ApiLog("查询项目详情")
+    @PreAuthorize ("hasAnyAuthority('sys:project:view','sys:project:add','sys:project:edit')")
+    @GetMapping("queryById")
+    public ResponseEntity queryById(@RequestParam("id") String id) {
+        Project userProject = projectService.selectByProjectId ( id );
+        userProject = changeBigDecimalEntity(userProject);
+        return ResponseEntity.ok (userProject);
+    }
+
+    /**
+     * 保存项目信息
+     * @param projectDTO
+     * @return
+     */
+    @ApiLog("保存项目")
+    @PreAuthorize ("hasAnyAuthority('sys:project:add','sys:project:edit')")
+    @PostMapping("save")
+    public ResponseEntity save(@Valid @RequestBody ProjectDTO projectDTO){
+        //新增或编辑表单保存
+        Project project = ProjectWrapper.INSTANCE.toEntity (projectDTO);
+        Project pro = projectService.projectDtoToDate(project,projectDTO);
+        pro.setItemType(projectDTO.getItemType());
+        if(StringUtils.isNotBlank(projectDTO.getProjectHead())){
+            UserDTO projectHead = SpringUtil.getBean ( IUserApi.class ).getById(projectDTO.getProjectHead());
+            if(null == projectHead || StringUtils.isBlank(projectHead.getId())){
+                return ResponseEntity.badRequest().body("项目负责人不存在,请重新输入");
+            }
+            pro.setProjectHead(projectHead.getId());
+        }
+
+        /*if(StringUtils.isNotBlank(projectDTO.getEvaluationPersonOne())){
+
+            UserDTO evaluationPersonOne = userService.get(projectDTO.getEvaluationPersonOne());
+            if(null == evaluationPersonOne || StringUtils.isBlank(evaluationPersonOne.getId())){
+                return ResponseEntity.badRequest().body("签字评估师1不存在,请重新输入");
+            }
+            pro.setEvaluationPersonOne(evaluationPersonOne.getId());
+        }*/
+
+        /*if(StringUtils.isNotBlank(projectDTO.getEvaluationPersonTwo())){
+
+            UserDTO evaluationPersonTwo = userService.get(projectDTO.getEvaluationPersonTwo());
+            if(null == evaluationPersonTwo || StringUtils.isBlank(evaluationPersonTwo.getId())){
+                return ResponseEntity.badRequest().body("签字评估师2不存在,请重新输入");
+            }
+            pro.setEvaluationPersonTwo(evaluationPersonTwo.getId());
+        }*/
+
+        if(StringUtils.isBlank(projectDTO.getId())){
+
+            //判断一下文号是否存在
+            if(StringUtils.isNotBlank(projectDTO.getDocumentNum())){
+                if(ObjectUtil.isNotEmpty(projectService.selectByDocumentNum(projectDTO))){
+                    return ResponseEntity.badRequest().body("不可使用已存在的文号");
+                }
+            }
+            //文件状态
+            if (CollectionUtil.isNotEmpty(projectDTO.getWorkAttachments())) {
+                pro.setFileUploadType("1");
+            } else {
+                pro.setFileUploadType("0");
+            }
+
+            projectService.save(pro);//新增
+        }else{
+
+            //判断一下文号是否存在
+            if(StringUtils.isNotBlank(projectDTO.getDocumentNum())){
+                Project userProjects = projectService.selectByDocumentNum(projectDTO);
+                if(ObjectUtil.isNotEmpty(userProjects)){
+                    if(!projectDTO.getId().equals(userProjects.getId())){
+                        return ResponseEntity.badRequest().body("不可使用已存在的文号");
+                    }
+                }
+            }
+            LambdaUpdateWrapper<Project> wrapper = projectService.getLambdaUpdateWrapper(projectDTO);
+            if (CollectionUtil.isNotEmpty(projectDTO.getWorkAttachments())) {
+                wrapper.set(Project::getFileUploadType, "1");
+            } else {
+                wrapper.set(Project::getFileUploadType, "0");
+            }
+            projectService.update (pro,wrapper);//修改
+        }
+        //项目id处理
+        List<WorkAttachmentInfoDTO> workAttachmentDtos = new ArrayList<>();
+        List<WorkAttachmentInfo> workAttachments = projectDTO.getWorkAttachments();
+        workAttachments.stream().forEach(ite -> {
+            WorkAttachmentInfoDTO w = new WorkAttachmentInfoDTO();
+            w.setBy(ite.getCreateById());
+            w.setName(ite.getAttachmentName());
+            String fileSize = ite.getFileSize();
+            String[] split = fileSize.split("\\.");
+            w.setSize(split[0]);
+            w.setUrl(ite.getUrl());
+            workAttachmentDtos.add(w);
+        });
+        Map<String,String> map = new HashMap<>();
+        String fileList = JSON.toJSONString((workAttachmentDtos));
+        String attachmentId = pro.getId();
+        String attachmentFlag = "projectRecords";
+        map.put("fileList",fileList);
+        map.put("attachmentId",attachmentId);
+        map.put("attachmentFlag",attachmentFlag);
+        map.put("currentToken", TokenProvider.getCurrentToken ( ));
+        SpringUtil.getBean ( IWorkAttachmentApi.class ).saveOrUpdateFileList(map);
+        return ResponseEntity.ok ("保存项目成功");
+    }
+
+    /**
+     * 删除项目
+     * @param ids
+     * @return
+     */
+    @ApiLog("删除项目")
+    @PreAuthorize ("hasAuthority('sys:project:del')")
+    @DeleteMapping("delete")
+    public ResponseEntity delete(String ids) {
+        String idArray[] =ids.split(",");
+        projectService.removeByIds (Lists.newArrayList (idArray));
+        return ResponseEntity.ok ("删除项目成功");
+    }
+
+    /**
+     * 导入项目数据
+     *
+     * @return
+     */
+    @DemoMode
+    @PreAuthorize("hasAnyAuthority('sys:project:import')")
+    @PostMapping("import")
+    @ApiOperation(value = "导入项目数据excel")
+    public ResponseEntity importFile(MultipartFile file) throws IOException{
+        //用来计数的,计算导入了多少条数据
+        this.successNum = 0;
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        ArrayList<Project> arrayList = new ArrayList<>();
+        HashMap<String,String> hashMap = new HashMap<>();
+
+        //这里通过WorkbookFactory.create的方式来创建workBook,并没有用HSSFWorkbook和XSSFWorkbook,因为这两个局限性太大了,只能通过后缀来进行判断excel的版本
+        //workBook在这里我主要用来判断是否存在“项目明细表”或“咨询报告”的sheet页,不存在会向用户抛提示
+        Workbook workBook = WorkbookFactory.create(file.getInputStream());
+
+        List<ProjectDTO> listA = new ArrayList<>();
+        List<ProjectDTO> listB = new ArrayList<>();
+        //判断是否存在“项目明细表”sheet页
+        int sheetIndexAs = workBook.getSheetIndex("项目明细表");
+        if(sheetIndexAs != -1){
+            //获取评估项目sheet
+            listA = EasyPoiUtil.importSheetExcel(file, 1, 1, sheetIndexAs,1, ProjectDTO.class);
+            //去除excel中的空行
+            listA = getExcelList(listA);
+            //导入前检测数据
+            String resultA = importDecide(listA, sdf, arrayList, hashMap, successNum, ProjectTypeEnum.ASSESS.getValue());
+            if(StringUtils.isNotBlank(resultA)){
+                //有返回值,说明导入的数据不正确。向用户抛提示
+                return ResponseEntity.badRequest().body  (resultA);
+            }
+        }
+        //判断是否存在“咨询报告”sheet页
+        int sheetIndexCo = workBook.getSheetIndex("咨询报告");
+        if(sheetIndexCo != -1){
+            //咨询项目sheet
+            listB = EasyPoiUtil.importSheetExcel(file, 1, 1, sheetIndexCo,1, ProjectDTO.class);
+            //去除excel中的空行
+            listB = getExcelList(listB);
+            //导入前检测数据
+            String resultB = importDecide(listB, sdf, arrayList, hashMap, successNum, ProjectTypeEnum.CONSULTATION.getValue());
+            if(StringUtils.isNotBlank(resultB)){
+                //有返回值,说明导入的数据不正确。向用户抛提示
+                return ResponseEntity.badRequest().body  (resultB);
+            }
+        }
+        //如果两个sheet页都不存在,说明这个导入的文件不符合要求
+        if(sheetIndexAs == -1 && sheetIndexCo == -1){
+            return ResponseEntity.badRequest().body  ("导入文件格式不正确,建议根据模板来进行数据的导入");
+        }
+        //判断文件中是否有重复的文号
+        /*if(hashMap.size() != listA.size() + listB.size()){
+            return ResponseEntity.badRequest().body  ("文件中存在重复的文号或者多个空文号");
+        }*/
+        //导入数据
+        projectService.saveBatch(arrayList);
+
+        return ResponseEntity.ok("已成功导入 " + successNum + " 条数据");
+    }
+    public String importDecide(List<ProjectDTO> list, SimpleDateFormat sdf, ArrayList<Project> arrayList, HashMap<String,String> hashMap, int successNum, String itemType){
+
+        for (ProjectDTO project : list) {
+            if(ObjectUtil.isEmpty(project)){
+                continue;
+            }
+            try {
+                if(StringUtils.isNotBlank(project.getEvaluationReportDateUi())){
+                    //EvaluationReportDateUi字段接到的数据符合"yyyy/MM/dd"时间格式的话,正常执行。
+                    //不符合的话,就会有异常,进到catch
+                    String format = sdf.format(DateUtils.parseDate(project.getEvaluationReportDateUi(), new String[]{"yyyy/MM/dd"}));
+                    //符合要求的时间格式,则会将数据转换为时间格式存到EvaluationReportDate字段中,并且将项目状态设置为”已完成“
+                    project.setEvaluationReportDate(sdf.parse(format));
+                    project.setStatus(ProjectStatusEnum.FINISH.getValue());
+                }
+            }catch (Exception e){
+                if(StringUtils.isNotBlank(project.getEvaluationReportDateUi())){
+                    if(project.getEvaluationReportDateUi().contains("报告已作废")){
+                        //当EvaluationReportDateUi字段接收到的值包含”报告已作废“时,项目状态为”作废“,并且将值放到AssessReportMessage字段中
+                        project.setStatus(ProjectStatusEnum.INVALID.getValue());
+                        project.setAssessReportMessage(project.getEvaluationReportDateUi());
+                    }else{
+                        //当EvaluationReportDateUi字段接收到的值不包含”报告已作废“时,项目状态为”暂存“,并且将值放到AssessReportMessage字段中
+                        project.setStatus(ProjectStatusEnum.STAGING.getValue());
+                        project.setAssessReportMessage(project.getEvaluationReportDateUi());
+                    }
+                }else{
+                    //当EvaluationReportDateUi字段接收到的值为空时,项目状态为”暂存“
+                    project.setStatus(ProjectStatusEnum.STAGING.getValue());
+                }
+            }
+
+            try {
+                if(StringUtils.isNotBlank(project.getEvaluationBaseDateUi())){
+                    String format = sdf.format(DateUtils.parseDate(project.getEvaluationBaseDateUi(), new String[]{"yyyy/MM/dd"}));
+                    project.setEvaluationBaseDate(sdf.parse(format));
+                }
+            }catch (Exception e){
+                if(StringUtils.isNotBlank(project.getEvaluationBaseDateUi())){
+                    project.setAssessBaseMessage(project.getEvaluationBaseDateUi());
+                }
+
+            }
+
+            try {
+                if(StringUtils.isNotBlank(project.getInvoiceDateUi())){
+                    String format = sdf.format(DateUtils.parseDate(project.getInvoiceDateUi(), new String[]{"yyyy/MM/dd"}));
+                    project.setInvoiceDate(sdf.parse(format));
+                }
+            }catch (Exception e){
+                if(StringUtils.isNotBlank(project.getInvoiceDateUi())){
+                    project.setInvoiceMessage(project.getInvoiceDateUi());
+                }
+
+            }
+
+            try {
+                if(StringUtils.isNotBlank(project.getReimbursementDateUi())){
+                    String format = sdf.format(DateUtils.parseDate(project.getReimbursementDateUi(), new String[]{"yyyy/MM/dd"}));
+                    project.setReimbursementDate(sdf.parse(format));
+                }
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+
+            //项目负责人、签字评估师1、签字评估师2 关联user表的id
+            if(StringUtils.isNotBlank(project.getProjectHead())){
+                String id = SpringUtil.getBean ( IUserApi.class ).getUserIdByName(project.getProjectHead());
+                if(StringUtils.isNotBlank(id)){
+                    project.setProjectHead(id);
+                }else{
+                    return "文件中有项目负责人无法找到,请修改为在档人员,或者不填写";
+                }
+            }else{
+                return "文件中有项目负责人为空,请重新填写";
+            }
+
+            /*if(StringUtils.isNotBlank(project.getEvaluationPersonOne())){
+                String id = userService.getUserIdByName(project.getEvaluationPersonOne());
+                if(ObjectUtil.isNotEmpty(id)){
+                    project.setEvaluationPersonOne(id);
+                }else{
+                    return "文件中有签字评估师无法找到,请修改为在档人员,或者不填写";
+                }
+            }*/
+
+            /*if(StringUtils.isNotBlank(project.getEvaluationPersonTwo())){
+                String id = userService.getUserIdByName(project.getEvaluationPersonTwo());
+                if(ObjectUtil.isNotEmpty(id)){
+                    project.setEvaluationPersonTwo(id);
+                }else{
+                    return "文件中有签字评估师无法找到,请修改为在档人员,或者不填写";
+                }
+            }*/
+
+            //文号的问题
+            if(StringUtils.isNotBlank(project.getDocumentNum())) {
+                Project userProject = projectService.selectByDocumentNum(project);
+                if(ObjectUtil.isNotEmpty(userProject)){
+                    return "文件中存在已在档的文号";
+                }
+            }/*else{
+                return "文件中存在空的文号,文号不允许为空";
+            }*/
+
+            //当前处理人
+            if(StringUtils.isNotBlank(project.getCurrentDisposePerson())){
+                String id = SpringUtil.getBean ( IUserApi.class ).getUserIdByName(project.getCurrentDisposePerson());
+                if(StringUtils.isNotBlank(id)){
+                    project.setCurrentDisposePerson(id);
+                }else{
+                    return "文件中有当前处理人无法找到,请修改为在档人员,或者不填写";
+                }
+            }
+
+            //年份的问题
+            if(StringUtils.isBlank(project.getYear())) {
+                return "文件中存在空年份,请填写年份信息";
+            }
+
+            //是否开票
+            if(YesOrNoEnum.YES.getLabel().equals(project.getIsInvoice())){
+                project.setIsInvoice(YesOrNoEnum.YES.getValue());
+            }else if(YesOrNoEnum.NO.getLabel().equals(project.getIsInvoice())){
+                project.setIsInvoice(YesOrNoEnum.NO.getValue());
+            }
+
+            //合同是否存档
+            if(YesOrNoEnum.YES.getLabel().equals(project.getIsContractArchive())){
+                project.setIsContractArchive(YesOrNoEnum.YES.getValue());
+            }else if(YesOrNoEnum.NO.getLabel().equals(project.getIsContractArchive())){
+                project.setIsContractArchive(YesOrNoEnum.NO.getValue());
+            }
+
+            //底稿是否完好
+            if(YesOrNoEnum.YES.getLabel().equals(project.getIsPapersIntact())){
+                project.setIsPapersIntact(YesOrNoEnum.YES.getValue());
+            }else if(YesOrNoEnum.NO.getLabel().equals(project.getIsPapersIntact())){
+                project.setIsPapersIntact(YesOrNoEnum.NO.getValue());
+            }
+
+            //底稿是否归档
+            if(YesOrNoEnum.YES.getLabel().equals(project.getIsPapersArchive())){
+                project.setIsPapersArchive(YesOrNoEnum.YES.getValue());
+            }else if(YesOrNoEnum.NO.getLabel().equals(project.getIsPapersArchive())){
+                project.setIsPapersArchive(YesOrNoEnum.NO.getValue());
+            }
+
+            //外勤是否已经报销
+            if(YesOrNoEnum.YES.getLabel().equals(project.getIsOpsReimbursement())){
+                project.setIsOpsReimbursement(YesOrNoEnum.YES.getValue());
+            }else if(YesOrNoEnum.NO.getLabel().equals(project.getIsOpsReimbursement())){
+                project.setIsOpsReimbursement(YesOrNoEnum.NO.getValue());
+            }
+
+            //是否已经报销提成
+            if(YesOrNoEnum.YES.getLabel().equals(project.getIsCommissionReimbursement())){
+                project.setIsCommissionReimbursement(YesOrNoEnum.YES.getValue());
+            }else if(YesOrNoEnum.NO.getLabel().equals(project.getIsCommissionReimbursement())){
+                project.setIsCommissionReimbursement(YesOrNoEnum.NO.getValue());
+            }
+
+            hashMap.put(project.getDocumentNum(),null);
+
+            //金额字段保留两位小数  四舍五入
+            project = changeBigDecimal(project);
+
+            Project userProject = ProjectWrapper.INSTANCE.toEntity(project);
+            //项目类型 1.评估项目  2.咨询项目
+            userProject.setItemType(itemType);
+            arrayList.add(userProject);
+            this.successNum++;
+        }
+
+        return null;
+    }
+
+    /**
+     * 金额字段保留两位小数  四舍五入
+     * @param project
+     * @return
+     */
+    public ProjectDTO changeBigDecimal(ProjectDTO project) {
+        //未报销金额
+        if(StringUtils.isNotBlank(project.getUnreimbursedAmount())){
+            try{
+            BigDecimal b = new BigDecimal(project.getUnreimbursedAmount()).setScale(2, BigDecimal.ROUND_HALF_UP);
+            project.setUnreimbursedAmount(b.toString());
+            }catch (Exception e) {
+                project.setUnreimbursedAmount("");
+            }
+        }
+        //已报销金额
+        if(StringUtils.isNotBlank(project.getReimbursementAmount())){
+            try{
+            BigDecimal b = new BigDecimal(project.getReimbursementAmount()).setScale(2, BigDecimal.ROUND_HALF_UP);
+            project.setReimbursementAmount(b.toString());
+            }catch (Exception e) {
+                project.setReimbursementAmount("");
+            }
+        }
+        //预估/实际收费(万元)
+        if(StringUtils.isNotBlank(project.getActualCharges())){
+            try{
+            BigDecimal b = new BigDecimal(project.getActualCharges()).setScale(2, BigDecimal.ROUND_HALF_UP);
+            project.setActualCharges(b.toString());
+            }catch (Exception e) {
+                project.setActualCharges("");
+            }
+        }
+        //报告收费(元)
+        if(StringUtils.isNotBlank(project.getReportCharges())){
+            try{
+            BigDecimal b = new BigDecimal(project.getReportCharges()).setScale(2, BigDecimal.ROUND_HALF_UP);
+            project.setReportCharges(b.toString());
+            }catch (Exception e) {
+                project.setReportCharges("");
+            }
+        }
+        //租金评估(万/年)
+        if(StringUtils.isNotBlank(project.getRentEvaluation())){
+            try{
+            BigDecimal b = new BigDecimal(project.getRentEvaluation()).setScale(2, BigDecimal.ROUND_HALF_UP);
+            project.setRentEvaluation(b.toString());
+            }catch (Exception e) {
+                project.setRentEvaluation("");
+            }
+        }
+        //净资产评估
+        if(StringUtils.isNotBlank(project.getNetAssetsEvaluation())){
+            try{
+            BigDecimal b = new BigDecimal(project.getNetAssetsEvaluation()).setScale(2, BigDecimal.ROUND_HALF_UP);
+            project.setNetAssetsEvaluation(b.toString());
+            }catch (Exception e) {
+                project.setNetAssetsEvaluation("");
+            }
+        }
+        //固定资产评估(万元)
+        if(StringUtils.isNotBlank(project.getFixedAssetsEvaluation())){
+            try{
+                BigDecimal b = new BigDecimal(project.getFixedAssetsEvaluation()).setScale(2, BigDecimal.ROUND_HALF_UP);
+                project.setFixedAssetsEvaluation(b.toString());
+            }catch (Exception e) {
+                project.setFixedAssetsEvaluation("");
+            }
+        }
+        //废旧物资评估(万元)
+        if(StringUtils.isNotBlank(project.getWaystEvaluation())){
+            try{
+            BigDecimal b = new BigDecimal(project.getWaystEvaluation()).setScale(2, BigDecimal.ROUND_HALF_UP);
+            project.setWaystEvaluation(b.toString());
+            }catch (Exception e) {
+                project.setWaystEvaluation("");
+            }
+        }
+        return project;
+    }
+
+    /**
+     * 金额字段保留两位小数  四舍五入
+     * 实体类domain用
+     * @param project
+     * @return
+     */
+    public Project changeBigDecimalEntity(Project project) {
+        //未报销金额
+        try{
+            if(StringUtils.isNotBlank(project.getUnreimbursedAmount())){
+                BigDecimal b = new BigDecimal(project.getUnreimbursedAmount()).setScale(2, BigDecimal.ROUND_HALF_UP);
+                project.setUnreimbursedAmount(b.toString());
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        //已报销金额
+        try{
+            if(StringUtils.isNotBlank(project.getReimbursementAmount())){
+                BigDecimal b = new BigDecimal(project.getReimbursementAmount()).setScale(2, BigDecimal.ROUND_HALF_UP);
+                project.setReimbursementAmount(b.toString());
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+        //预估/实际收费(万元)
+        try{
+            if(StringUtils.isNotBlank(project.getActualCharges())){
+                BigDecimal b = new BigDecimal(project.getActualCharges()).setScale(2, BigDecimal.ROUND_HALF_UP);
+                project.setActualCharges(b.toString());
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+        //报告收费(元)
+        try{
+            if(StringUtils.isNotBlank(project.getReportCharges())){
+                BigDecimal b = new BigDecimal(project.getReportCharges()).setScale(2, BigDecimal.ROUND_HALF_UP);
+                project.setReportCharges(b.toString());
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+        //租金评估(万/年)
+        try{
+            if(StringUtils.isNotBlank(project.getRentEvaluation())){
+                BigDecimal b = new BigDecimal(project.getRentEvaluation()).setScale(2, BigDecimal.ROUND_HALF_UP);
+                project.setRentEvaluation(b.toString());
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+        //净资产评估
+        try{
+            if(StringUtils.isNotBlank(project.getNetAssetsEvaluation())){
+                BigDecimal b = new BigDecimal(project.getNetAssetsEvaluation()).setScale(2, BigDecimal.ROUND_HALF_UP);
+                project.setNetAssetsEvaluation(b.toString());
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+        //固定资产评估(万元)
+        try{
+            if(StringUtils.isNotBlank(project.getFixedAssetsEvaluation())){
+                BigDecimal b = new BigDecimal(project.getFixedAssetsEvaluation()).setScale(2, BigDecimal.ROUND_HALF_UP);
+                project.setFixedAssetsEvaluation(b.toString());
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+        //废旧物资评估(万元)
+        try{
+            if(StringUtils.isNotBlank(project.getWaystEvaluation())){
+                BigDecimal b = new BigDecimal(project.getWaystEvaluation()).setScale(2, BigDecimal.ROUND_HALF_UP);
+                project.setWaystEvaluation(b.toString());
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+        return project;
+    }
+
+    /**
+     * 下载项目导入模板
+     *
+     * @param response
+     * @return
+     */
+    @GetMapping("import/template")
+    @PreAuthorize("hasAnyAuthority('sys:project:export')")
+    @ApiOperation(value = "下载模板")
+    public void importFileTemplate(HttpServletResponse response, HttpServletRequest request) {
+        try {
+            InputStream inputStream = this.getClass().getResourceAsStream("/dot/项目导入模板.xlsx");
+            //强制下载不打开
+            response.setContentType("application/force-download");
+            OutputStream out = response.getOutputStream();
+            //使用URLEncoder来防止文件名乱码或者读取错误
+            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("project_template.xlsx", "UTF-8"));
+            int b = 0;
+            byte[] buffer = new byte[1000000];
+            while (b != -1) {
+                b = inputStream.read(buffer);
+                if (b != -1) out.write(buffer, 0, b);
+            }
+            inputStream.close();
+            out.close();
+            out.flush();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 导出项目数据
+     *
+     * @param userProjectDTO
+     * @param page
+     * @param response
+     * @throws Exception
+     */
+    @ApiLog("导出项目数据")
+    @PreAuthorize("hasAnyAuthority('sys:project:export')")
+    @GetMapping("export")
+    @ApiOperation(value = "导出项目excel")
+    public void exportFile(ProjectDTO userProjectDTO, Page <ProjectDTO> page, ExcelOptions options, HttpServletResponse response) throws Exception {
+        String fileName = options.getFilename ( );
+        Project project = ProjectWrapper.INSTANCE.toEntity (userProjectDTO);
+        QueryWrapper<Project> queryWrapper = QueryWrapperGenerator.buildQueryCondition ( project, Project.class );
+        Page <Project> userProjectPage = pageAToPageB(page);
+        List <Project> result = new ArrayList<>();
+        List <ProjectDTO> userProjectDTOList = new ArrayList<>();
+        if ( ExportMode.current.equals ( options.getMode ( ) ) ) {
+            result = projectService.selectPage ( userProjectPage, queryWrapper ).getRecords ( );
+        } else if ( ExportMode.selected.equals ( options.getMode ( ) ) ) {
+            result = projectService.selectPage ( userProjectPage, queryWrapper ).getRecords().stream ( ).filter ( reimbursement ->
+                    options.getSelectIds ( ).contains ( reimbursement.getId ( ) )
+            ).collect ( Collectors.toList ( ) );
+        } else {
+            userProjectPage.setSize ( -1 );
+            userProjectPage.setCurrent ( 0 );
+            result = projectService.selectPage ( userProjectPage, queryWrapper ).getRecords ( );
+        }
+        result.stream().forEach(item->{
+            ProjectDTO projectDTO = ProjectWrapper.INSTANCE.toDTO(item);
+            userProjectDTOList.add(projectDTO);
+        });
+
+        SimpleDateFormat formatter=new SimpleDateFormat("yyyy/MM/dd");
+        List <ProjectDTO> collect = userProjectDTOList.stream().map(item -> {
+            return isChange(item,formatter);
+        }).collect(Collectors.toList());
+        if(ProjectTypeEnum.ASSESS.getValue().equals(userProjectDTO.getItemType())){
+            EasyPoiUtil.exportExcel ( collect, "2021年资产评估项目备查登记表",  "项目明细表", ProjectDTO.class, fileName, response );
+        }
+        if(ProjectTypeEnum.CONSULTATION.getValue().equals(userProjectDTO.getItemType())){
+            EasyPoiUtil.exportExcel ( collect, "2021年资产评估项目备查登记表",  "咨询报告", ProjectDTO.class, fileName, response );
+        }
+    }
+
+    public Page<Project> pageAToPageB(Page<ProjectDTO> page){
+
+        Page<Project> pageB = new Page<>();
+        pageB.setCurrent(page.getCurrent());
+        pageB.setSize(page.getSize());
+        pageB.setOrders(page.getOrders());
+
+        return pageB;
+    }
+
+    public ProjectDTO isChange(ProjectDTO userProjectDTO, SimpleDateFormat formatter){
+
+        if(StringUtils.isNotBlank(userProjectDTO.getIsInvoice())){
+            //是否开票
+            if(YesOrNoEnum.YES.getValue().equals(userProjectDTO.getIsInvoice())){
+                userProjectDTO.setIsInvoice(YesOrNoEnum.YES.getLabel());
+            }else if(YesOrNoEnum.NO.getValue().equals(userProjectDTO.getIsInvoice())){
+                userProjectDTO.setIsInvoice(YesOrNoEnum.NO.getLabel());
+            }
+        }
+
+
+        if(StringUtils.isNotBlank(userProjectDTO.getIsContractArchive())) {
+            //合同是否存档
+            if (YesOrNoEnum.YES.getValue().equals(userProjectDTO.getIsContractArchive())) {
+                userProjectDTO.setIsContractArchive(YesOrNoEnum.YES.getLabel());
+            } else if (YesOrNoEnum.NO.getValue().equals(userProjectDTO.getIsContractArchive())) {
+                userProjectDTO.setIsContractArchive(YesOrNoEnum.NO.getLabel());
+            }
+        }
+
+        if(StringUtils.isNotBlank(userProjectDTO.getIsPapersIntact())) {
+            //底稿是否完好
+            if (YesOrNoEnum.YES.getValue().equals(userProjectDTO.getIsPapersIntact())) {
+                userProjectDTO.setIsPapersIntact(YesOrNoEnum.YES.getLabel());
+            } else if (YesOrNoEnum.NO.getValue().equals(userProjectDTO.getIsPapersIntact())) {
+                userProjectDTO.setIsPapersIntact(YesOrNoEnum.NO.getLabel());
+            }
+        }
+
+        if(StringUtils.isNotBlank(userProjectDTO.getIsPapersArchive())) {
+            //底稿是否归档
+            if (YesOrNoEnum.YES.getValue().equals(userProjectDTO.getIsPapersArchive())) {
+                userProjectDTO.setIsPapersArchive(YesOrNoEnum.YES.getLabel());
+            } else if (YesOrNoEnum.NO.getValue().equals(userProjectDTO.getIsPapersArchive())) {
+                userProjectDTO.setIsPapersArchive(YesOrNoEnum.NO.getLabel());
+            }
+        }
+
+        if(StringUtils.isNotBlank(userProjectDTO.getIsOpsReimbursement())) {
+            //外勤是否已经报销
+            if (YesOrNoEnum.YES.getValue().equals(userProjectDTO.getIsOpsReimbursement())) {
+                userProjectDTO.setIsOpsReimbursement(YesOrNoEnum.YES.getLabel());
+            } else if (YesOrNoEnum.NO.getValue().equals(userProjectDTO.getIsOpsReimbursement())) {
+                userProjectDTO.setIsOpsReimbursement(YesOrNoEnum.NO.getLabel());
+            }
+        }
+
+        if(StringUtils.isNotBlank(userProjectDTO.getIsCommissionReimbursement())) {
+            //是否已经报销提成
+            if (YesOrNoEnum.YES.getValue().equals(userProjectDTO.getIsCommissionReimbursement())) {
+                userProjectDTO.setIsCommissionReimbursement(YesOrNoEnum.YES.getLabel());
+            } else if (YesOrNoEnum.NO.getValue().equals(userProjectDTO.getIsCommissionReimbursement())) {
+                userProjectDTO.setIsCommissionReimbursement(YesOrNoEnum.NO.getLabel());
+            }
+        }
+
+
+        //评估报告日
+        if(ObjectUtil.isNotEmpty(userProjectDTO.getEvaluationReportDate())){
+            String time=formatter.format(userProjectDTO.getEvaluationReportDate());
+            userProjectDTO.setEvaluationReportDateUi(time);
+        }else{
+            if(StringUtils.isNotBlank(userProjectDTO.getAssessReportMessage())){
+                userProjectDTO.setEvaluationReportDateUi(userProjectDTO.getAssessReportMessage());
+            }
+        }
+        //评估基准日
+        if(ObjectUtil.isNotEmpty(userProjectDTO.getEvaluationBaseDate())){
+            String time=formatter.format(userProjectDTO.getEvaluationBaseDate());
+            userProjectDTO.setEvaluationBaseDateUi(time);
+        }else{
+            if(StringUtils.isNotBlank(userProjectDTO.getAssessBaseMessage())){
+                userProjectDTO.setEvaluationBaseDateUi(userProjectDTO.getAssessBaseMessage());
+            }
+        }
+        //开票日期
+        if(ObjectUtil.isNotEmpty(userProjectDTO.getInvoiceDate())){
+            String time=formatter.format(userProjectDTO.getInvoiceDate());
+            userProjectDTO.setInvoiceDateUi(time);
+        }else{
+            if(StringUtils.isNotBlank(userProjectDTO.getInvoiceMessage())){
+                userProjectDTO.setInvoiceDateUi(userProjectDTO.getInvoiceMessage());
+            }
+        }
+        //报销日期
+        if(ObjectUtil.isNotEmpty(userProjectDTO.getReimbursementDate())){
+            String time=formatter.format(userProjectDTO.getReimbursementDate());
+            userProjectDTO.setReimbursementDateUi(time);
+        }
+        return userProjectDTO;
+    }
+
+    public ArrayList<ProjectDTO> getExcelList(List<ProjectDTO> list){
+
+        ArrayList<ProjectDTO> projectDTOS = new ArrayList<>();
+
+        list.stream().forEach(item->{
+            if(!objectCheckIsNull(item)){
+                projectDTOS.add(item);
+            }
+        });
+
+        return projectDTOS;
+    }
+
+    /**
+     * 检查一个对象的所有属性值是否都是null
+     * @param object
+     * @return
+     */
+    public boolean objectCheckIsNull(Object object) {
+        boolean flag = true; //定义返回结果,默认为true
+
+        if (Objects.isNull(object)) {
+            flag = true;
+        } else {
+            Class clazz = (Class) object.getClass(); // 得到类对象
+            Field fields[] = clazz.getDeclaredFields(); // 得到所有属性
+            for (Field field : fields) {
+                if("serialVersionUID".equals(field.getName())){
+                    continue;
+                }
+                field.setAccessible(true);
+                Object fieldValue = null;
+                try {
+                    fieldValue = field.get(object); //得到属性值
+                    Type fieldType = field.getGenericType();//得到属性类型
+                    String fieldName = field.getName(); // 得到属性名
+                } catch (Exception e){}
+                if (fieldValue != null) {  //只要有一个属性值不为null 就返回false 表示对象不为null
+                    flag = false;
+                    break;
+                }
+            }
+        }
+
+        return flag;
+    }
+
+    @GetMapping("proportion")
+    @ApiOperation(value = "项目完成比例")
+    public String proportion(Project project) throws Exception{
+        QueryWrapper<Project> queryWrapper = QueryWrapperGenerator.buildQueryCondition(project, Project.class);
+        return projectService.proportion(queryWrapper);
+    }
+
+    /**
+     * 导出项目数据
+     *
+     * @param projectDTO
+     * @param response
+     * @throws Exception
+     */
+    @GetMapping("exportFileUploadList")
+    @ApiOperation(value = "导出项目文件上传比例excel")
+    public void exportFileUploadList(ProjectDTO projectDTO, HttpServletResponse response) throws Exception {
+        Project project = ProjectWrapper.INSTANCE.toEntity (projectDTO);
+        QueryWrapper<Project> queryWrapper = QueryWrapperGenerator.buildQueryCondition( project, Project.class );
+        List<FileUploadListDTO> list = projectService.exportFileUploadList(projectDTO);
+        //完成比例导出文档添加汇总列
+        AtomicReference<Integer> totalNum = new AtomicReference<>(0);
+        AtomicReference<Integer> endNum = new AtomicReference<>(0);
+        list.stream().forEach(item->{
+            totalNum.updateAndGet(v -> v + item.getAllNum());
+            endNum.updateAndGet(v -> v + item.getNum());
+        });
+        DecimalFormat df = new DecimalFormat("0.00");
+        String s = df.format((float) endNum.get() * 100 / (float) totalNum.get());
+        FileUploadListDTO fileUploadListDTO = new FileUploadListDTO();
+        fileUploadListDTO.setName("汇总");
+        fileUploadListDTO.setAllNum(totalNum.get());
+        fileUploadListDTO.setNum(endNum.get());
+        fileUploadListDTO.setProportion(s+"%");
+        list.add(fileUploadListDTO);
+
+        if(ProjectTypeEnum.ASSESS.getValue().equals(projectDTO.getItemType())){
+            if(StringUtils.isNotBlank(projectDTO.getYear())){
+                EasyPoiUtil.exportExcel(list, projectDTO.getYear() + "年评估项目上传比例报告",  "评估项目上传比例报告", FileUploadListDTO.class, "", response );
+            }else{
+                EasyPoiUtil.exportExcel(list, "评估项目上传比例报告",  "评估项目上传比例报告", FileUploadListDTO.class, "", response );
+            }
+        }
+        if(ProjectTypeEnum.CONSULTATION.getValue().equals(projectDTO.getItemType())){
+            if(StringUtils.isNotBlank(projectDTO.getYear())){
+                EasyPoiUtil.exportExcel(list, projectDTO.getYear() + "年咨询项目上传比例报告",  "咨询项目上传比例报告", FileUploadListDTO.class, "", response );
+            }else{
+                EasyPoiUtil.exportExcel(list, "咨询项目上传比例报告",  "咨询项目上传比例报告", FileUploadListDTO.class, "", response );
+            }
+        }
+    }
+}

+ 246 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/domain/Project.java

@@ -0,0 +1,246 @@
+package com.jeeplus.finance.projectRecords.domain;
+
+import cn.afterturn.easypoi.excel.annotation.ExcelEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.core.query.Query;
+import com.jeeplus.core.query.QueryType;
+import com.jeeplus.sys.service.dto.OfficeDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * sys_user_project
+ * @author 
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("project_records")
+public class Project extends BaseEntity {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 客户名称
+     */
+    @Query
+    private String customerName;
+
+    /**
+     * 年份
+     */
+    @Query
+    private String year;
+
+    /**
+     * 项目名称
+     */
+    @Query
+    private String projectName;
+
+    /**
+     * 评估目的
+     */
+    private String evaluationObjective;
+
+    /**
+     * 项目类型
+     */
+    private String projectType;
+
+    /**
+     * 评估基准日
+     */
+    private Date evaluationBaseDate;
+
+    /**
+     * 评估报告日
+     */
+    private Date evaluationReportDate;
+
+    /**
+     * 协议号
+     */
+    @Query
+    private String protocolNum;
+
+    /**
+     * 文号
+     */
+    @Query
+    private String documentNum;
+
+    /**
+     * 项目负责人
+     */
+    @Query
+    private String projectHead;
+    private String projectHeadId;
+
+    /**
+     * 废旧物资评估(万元)
+     */
+    private String waystEvaluation;
+
+    /**
+     * 固定资产评估(万元)
+     */
+    private String fixedAssetsEvaluation;
+
+    /**
+     * 净资产评估
+     */
+    private String netAssetsEvaluation;
+
+    /**
+     * 租金评估(万/年)
+     */
+    private String rentEvaluation;
+
+    /**
+     * 司法鉴定
+     */
+    private String forensics;
+
+    /**
+     * 报告收费(元)
+     */
+    private String reportCharges;
+
+    /**
+     * 当前处理人
+     */
+    private String currentDisposePerson;
+
+    /**
+     * 是否开票
+     */
+    private String isInvoice;
+
+    /**
+     * 开票日期
+     */
+    private Date invoiceDate;
+
+    /**
+     * 预估/实际收费(元)
+     */
+    private String actualCharges;
+
+    /**
+     * 合同是否存档
+     */
+    private String isContractArchive;
+
+    /**
+     * 底稿是否完好
+     */
+    private String isPapersIntact;
+
+    /**
+     * 底稿是否归档
+     */
+    private String isPapersArchive;
+
+    /**
+     * 报销外勤天数
+     */
+    private String opsAmount;
+
+    /**
+     * 外勤是否已经报销
+     */
+    private String isOpsReimbursement;
+
+    /**
+     * 已报销金额
+     */
+    private String reimbursementAmount;
+
+    /**
+     * 未报销金额
+     */
+    private String unreimbursedAmount;
+
+    /**
+     * 报销单号
+     */
+    private String reimbursementNum;
+
+    /**
+     * 报销日期
+     */
+    private Date reimbursementDate;
+
+    /**
+     * 签字评估师1
+     */
+    private String evaluationPersonOne;
+
+    /**
+     * 签字评估师2
+     */
+    private String evaluationPersonTwo;
+
+    /**
+     * 项目状态
+     */
+    private String status;
+
+    /**
+     * 评估报告日message
+     */
+    private String assessReportMessage;
+
+    /**
+     * 评估基准日message
+     */
+    private String assessBaseMessage;
+
+    /**
+     * 开票日期message
+     */
+    private String invoiceMessage;
+
+    /**
+     * 是否已经报销提成
+     */
+    private String isCommissionReimbursement;
+
+    /**
+     * 1、评估项目 2、咨询项目
+     */
+    @Query(type = QueryType.EQ)
+    private String itemType;
+
+    /**
+     * 文件上传状态(0未完成1已完成)
+     */
+    @Query
+    private String fileUploadType;
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 归属公司
+     * tableColumn 数据库中sql查询使用到的值
+     * javaField 实体类中对应的字段
+     */
+    @Query(type = QueryType.EQ, tableColumn = "su.company_id", javaField = "companyDTO.id")
+    private OfficeDTO companyDTO;
+
+    /**
+     * 归属部门
+     */
+    @Query(type = QueryType.EQ, tableColumn = "su.office.id", javaField = "officeDTO.id")
+    private OfficeDTO officeDTO;
+
+    private Boolean permissionFlag; //登陆人修改权限
+}

+ 35 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/ProjectMapper.java

@@ -0,0 +1,35 @@
+package com.jeeplus.finance.projectRecords.mapper;
+
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.finance.projectRecords.domain.Project;
+import com.jeeplus.finance.projectRecords.service.dto.FileUploadListDTO;
+import com.jeeplus.finance.projectRecords.service.dto.ProjectDTO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+//@InterceptorIgnore(tenantLine = "true")
+public interface ProjectMapper extends BaseMapper<Project> {
+
+    public Project selectByDocumentNum(ProjectDTO projectDTO);
+
+    public Project selectByProjectId(@Param("projectId") String projectId);
+
+    public IPage<Project> selectPage(Page<Project> page, @Param("project") Project project);
+
+    public IPage<Project> findList(Page<Project> page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper);
+
+    public Integer proportion(@Param(Constants.WRAPPER) QueryWrapper queryWrapper);
+
+    public List<FileUploadListDTO> projectAllList(ProjectDTO projectDTO);
+
+    public List<FileUploadListDTO> projectList(ProjectDTO projectDTO);
+}

+ 34 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/dto/FileUploadListDTO.java

@@ -0,0 +1,34 @@
+package com.jeeplus.finance.projectRecords.service.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+
+@Data
+public class FileUploadListDTO extends BaseDTO {
+
+    /**
+     *姓名
+     */
+    @Excel(name = "姓名", width = 30)
+    private String name;
+
+    /**
+     * 项目总量
+     */
+    @Excel(name = "项目总量", width = 20)
+    private Integer allNum;
+
+    /**
+     * 完成数量
+     */
+    @Excel(name = "完成数量", width = 20)
+    private Integer num;
+
+    /**
+     * 完成比例
+     */
+    @Excel(name = "完成比例", width = 20)
+    private String proportion;
+
+}

+ 281 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/dto/ProjectDTO.java

@@ -0,0 +1,281 @@
+package com.jeeplus.finance.projectRecords.service.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.jeeplus.core.service.dto.BaseDTO;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
+import com.jeeplus.sys.service.dto.OfficeDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ProjectDTO extends BaseDTO {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 客户名称
+     */
+    @Excel(name = "客户名称")
+    private String customerName;
+
+    /**
+     * 项目名称
+     */
+    @Excel(name = "年份")
+    private String year;
+
+    /**
+     * 项目名称
+     */
+    @Excel(name = "项目名称")
+    private String projectName;
+
+    /**
+     * 评估目的
+     */
+    @Excel(name = "评估目的")
+    private String evaluationObjective;
+
+    /**
+     * 项目类型
+     */
+    @Excel(name = "项目类型")
+    private String projectType;
+
+    /**
+     * 评估基准日ui
+     */
+    @Excel(name = "评估基准日",importFormat = "yyyy/MM/dd")
+    private String evaluationBaseDateUi;
+
+    /**
+     * 评估基准日
+     */
+    private Date evaluationBaseDate;
+
+
+    /**
+     * 评估报告日ui
+     */
+    @Excel(name = "评估报告日",importFormat = "yyyy/MM/dd")
+    private String evaluationReportDateUi;
+
+    /**
+     * 评估报告日
+     */
+    private Date evaluationReportDate;
+
+
+    /**
+     * 协议号
+     */
+    @Excel(name = "协议号")
+    private String protocolNum;
+
+    /**
+     * 文号
+     */
+    @Excel(name = "文号")
+    private String documentNum;
+
+    /**
+     * 项目负责人
+     */
+    @Excel(name = "项目负责人")
+    private String projectHead;
+
+    /**
+     * 废旧物资评估(万元)
+     */
+    @Excel(name = "废旧物资评估(万元)")
+    private String waystEvaluation;
+
+    /**
+     * 固定资产评估(万元)
+     */
+    @Excel(name = "固定资产评估(万元)")
+    private String fixedAssetsEvaluation;
+
+    /**
+     * 净资产评估
+     */
+    @Excel(name = "净资产评估")
+    private String netAssetsEvaluation;
+
+    /**
+     * 租金评估(万/年)
+     */
+    @Excel(name = "租金评估(万/年)")
+    private String rentEvaluation;
+
+    /**
+     * 司法鉴定
+     */
+    @Excel(name = "司法鉴定")
+    private String forensics;
+
+    /**
+     * 报告收费(元)
+     */
+    @Excel(name = "报告收费(元)")
+    private String reportCharges;
+
+    /**
+     * 当前处理人
+     */
+    @Excel(name = "当前处理人")
+    private String currentDisposePerson;
+
+    /**
+     * 是否开票
+     */
+    @Excel(name = "是否开票")
+    private String isInvoice;
+
+    /**
+     * 开票日期ui
+     */
+    @Excel(name = "开票日期",importFormat = "yyyy/MM/dd")
+    private String invoiceDateUi;
+
+    /**
+     * 开票日期
+     */
+    private Date invoiceDate;
+
+
+    /**
+     * 预估/实际收费(万元)
+     */
+    @Excel(name = "预估/实际收费(万元)")
+    private String actualCharges;
+
+    /**
+     * 合同是否存档
+     */
+    @Excel(name = "合同是否存档")
+    private String isContractArchive;
+
+    /**
+     * 底稿是否完好
+     */
+    @Excel(name = "底稿是否完好")
+    private String isPapersIntact;
+
+    /**
+     * 底稿是否归档
+     */
+    @Excel(name = "底稿是否归档")
+    private String isPapersArchive;
+
+    /**
+     * 报销外勤天数
+     */
+    @Excel(name = "报销外勤天数")
+    private String opsAmount;
+
+    /**
+     * 外勤是否已经报销
+     */
+    @Excel(name = "外勤是否已经报销")
+    private String isOpsReimbursement;
+
+    /**
+     * 已报销金额
+     */
+    @Excel(name = "已报销金额")
+    private String reimbursementAmount;
+
+    /**
+     * 未报销金额
+     */
+    @Excel(name = "未报销金额")
+    private String unreimbursedAmount;
+
+    /**
+     * 报销单号
+     */
+    @Excel(name = "报销单号")
+    private String reimbursementNum;
+
+    /**
+     * 报销日期ui
+     */
+    @Excel(name = "报销日期",importFormat = "yyyy/MM/dd")
+    private String reimbursementDateUi;
+
+    /**
+     * 报销日期
+     */
+    private Date reimbursementDate;
+
+
+    /**
+     * 签字评估师1
+     */
+    @Excel(name = "签字评估师1")
+    private String evaluationPersonOne;
+
+    /**
+     * 签字评估师2
+     */
+    @Excel(name = "签字评估师2")
+    private String evaluationPersonTwo;
+
+    /**
+     * 项目状态
+     */
+    private String status;
+
+    /**
+     * 评估报告日message
+     */
+    private String assessReportMessage;
+
+    /**
+     * 评估基准日message
+     */
+    private String assessBaseMessage;
+
+    /**
+     * 开票日期message
+     */
+    private String invoiceMessage;
+
+    /**
+     * 是否已经报销提成
+     */
+    @Excel(name = "是否已经报销提成")
+    private String isCommissionReimbursement;
+
+    /**
+     * 1、评估项目 2、咨询项目
+     */
+    private String itemType;
+
+    private static final long serialVersionUID = 1L;
+
+    public ProjectDTO(){
+        super();
+    }
+
+    public ProjectDTO(String id){
+        super(id);
+    }
+
+    /**
+     * oss上传文件相关数据
+     */
+    public List<WorkAttachmentInfo> workAttachments;
+
+    private OfficeDTO officeDTO;
+
+
+}

+ 14 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/mapstruct/ProjectWrapper.java

@@ -0,0 +1,14 @@
+package com.jeeplus.finance.projectRecords.service.mapstruct;
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.finance.projectRecords.domain.Project;
+import com.jeeplus.finance.projectRecords.service.dto.ProjectDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {})
+public interface ProjectWrapper extends EntityWrapper<ProjectDTO, Project> {
+
+    ProjectWrapper INSTANCE = Mappers.getMapper(ProjectWrapper.class);
+}

+ 57 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/controller/ProofreadInfoController.java

@@ -0,0 +1,57 @@
+package com.jeeplus.finance.proofread.controller;
+
+import com.jeeplus.finance.proofread.domain.ProofreadDetail;
+import com.jeeplus.finance.proofread.service.ProofreadInfoService;
+import com.jeeplus.finance.proofread.service.dto.ProofreadInfoDto;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@Api(tags ="项目登记校对")
+@RequestMapping(value = "/proofread/info")
+public class ProofreadInfoController {
+
+    @Resource
+    private ProofreadInfoService service;
+
+    /**
+     * 新增/修改
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "新增/修改")
+    @PostMapping("/save")
+    public ResponseEntity<String> save(@RequestBody ProofreadInfoDto dto) {
+        String s = service.save(dto);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 根据项目id查询
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据项目id查询")
+    @GetMapping("/findById")
+    public ResponseEntity<ProofreadInfoDto> findById(String id, String type) {
+        ProofreadInfoDto info = service.findById(id, type);
+        return ResponseEntity.ok(info);
+    }
+
+    /**
+     * 初始化类型列表查询
+     * @return
+     */
+    @ApiOperation(value = "初始化类型列表查询")
+    @GetMapping("/list")
+    public ResponseEntity<List<ProofreadDetail>> list(String type) {
+        List<ProofreadDetail> list = service.list(type);
+        return ResponseEntity.ok(list);
+    }
+
+}

+ 67 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/controller/ProofreadIssuedController.java

@@ -0,0 +1,67 @@
+package com.jeeplus.finance.proofread.controller;
+
+import com.jeeplus.common.utils.ResponseUtil;
+import com.jeeplus.finance.proofread.domain.ProofreadIssued;
+import com.jeeplus.finance.proofread.service.ProofreadIssuedService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@Api(tags ="报告签发单")
+@RequestMapping(value = "/proofread/issued")
+public class ProofreadIssuedController {
+
+    @Resource
+    private ProofreadIssuedService service;
+
+    /**
+     * 新增/修改
+     * @param issued
+     * @return
+     */
+    @ApiOperation(value = "新增/修改")
+    @PostMapping("/save")
+    public ResponseEntity<String> save(@RequestBody ProofreadIssued issued) {
+        String s = service.save(issued);
+        return ResponseUtil.newInstance().add("businessTable", "proofread_issued").add("businessId", s).ok ("操作成功");
+    }
+
+    /**
+     * 根据项目id查询
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据项目id查询")
+    @GetMapping("/findById")
+    public ResponseEntity<ProofreadIssued> findById(String id) {
+        ProofreadIssued info = service.findById(id);
+        return ResponseEntity.ok(info);
+    }
+
+    /**
+     * 根据项目id查询初始化信息
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据项目id查询初始化信息")
+    @GetMapping("/findProjectInfoById")
+    public ResponseEntity<ProofreadIssued> findProjectInfoById(String id) {
+        ProofreadIssued info = service.findProjectInfoById(id);
+        return ResponseEntity.ok(info);
+    }
+
+    /**
+     * 根据项目id修改状态值
+     * @param issued
+     * @return
+     */
+    @ApiOperation(value = "根据项目id修改状态值")
+    @PostMapping("/updateStatusById")
+    public void updateStatusById(@RequestBody ProofreadIssued issued) {
+        service.updateStatusById(issued);
+    }
+}

+ 90 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/controller/ProofreadTypeController.java

@@ -0,0 +1,90 @@
+package com.jeeplus.finance.proofread.controller;
+
+import com.jeeplus.core.service.TreeService;
+import com.jeeplus.finance.proofread.domain.ProofreadType;
+import com.jeeplus.finance.proofread.mapper.ProofreadTypeMapper;
+import com.jeeplus.finance.proofread.service.ProofreadTypeForTreeDataService;
+import com.jeeplus.finance.proofread.service.ProofreadTypeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@Api(tags ="项目登记校对")
+@RequestMapping(value = "/proofread/type")
+public class ProofreadTypeController {
+
+    @Resource
+    private ProofreadTypeService service;
+
+    @Resource
+    private ProofreadTypeMapper mapper;
+
+    @Resource
+    private ProofreadTypeForTreeDataService treeDataService;
+
+    /**
+     * 列表查询
+     * @param type
+     * @return
+     */
+    @ApiOperation(value = "列表查询")
+    @GetMapping("/list")
+    public ResponseEntity<List<ProofreadType>> list(ProofreadType type) {
+        List<ProofreadType> list = service.list(type);
+        return ResponseEntity.ok(list);
+    }
+
+    /**
+     * 新增/修改
+     * @param info
+     * @return
+     */
+    @ApiOperation(value = "新增/修改")
+    @PostMapping("/save")
+    public ResponseEntity<String> save(@RequestBody ProofreadType info) {
+        String s = service.saveType(info);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 根据id查询
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据id查询")
+    @GetMapping("/findById")
+    public ResponseEntity<ProofreadType> findById(String id) {
+        ProofreadType info = mapper.selectById(id);
+        return ResponseEntity.ok(info);
+    }
+
+    /**
+     * 根据id删除
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据id删除")
+    @GetMapping("/deleteById")
+    public ResponseEntity<String> deleteById(String id) {
+        mapper.deleteById(id);
+        return ResponseEntity.ok("操作完成");
+    }
+
+    /**
+     * 查询树形
+     * @param extId 排除的ID
+     * @return
+     */
+    @ApiOperation(value = "查询树形")
+    @GetMapping("/treeData")
+    public ResponseEntity<List<ProofreadType>> treeData(@RequestParam(required = false) String extId, @RequestParam(required = false) String type) throws Exception{
+        List<ProofreadType> infos = treeDataService.treeDataForType(extId, type);
+        return ResponseEntity.ok(infos);
+    }
+
+}

+ 54 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/domain/ProofreadDetail.java

@@ -0,0 +1,54 @@
+package com.jeeplus.finance.proofread.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 = "proofread_detail")
+public class ProofreadDetail extends BaseEntity {
+
+    /**
+     * 序号
+     */
+    private Integer serialNumber;
+
+    /**
+     * 基本信息
+     */
+    private String infoId;
+
+    /**
+     * 类型id
+     */
+    private String typeId;
+
+    /**
+     * 类型名称
+     */
+    @TableField(exist = false)
+    private String typeName;
+
+    /**
+     * 审核意见
+     */
+    private String reviewComments;
+
+    /**
+     * 是否适用
+     */
+    private String isApply;
+
+    /**
+     * 回复意见
+     */
+    private String replyComments;
+
+    /**
+     * 序号
+     */
+    @TableField(exist = false)
+    private String sort;
+
+}

+ 43 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/domain/ProofreadInfo.java

@@ -0,0 +1,43 @@
+package com.jeeplus.finance.proofread.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@TableName(value = "proofread_info")
+public class ProofreadInfo extends BaseEntity {
+
+    /**
+     * 类型
+     */
+    private String type;
+
+    /**
+     * 项目id
+     */
+    private String projectId;
+
+    /**
+     * 项目审批人
+     */
+    private String processUserId;
+
+    /**
+     * 审核日期
+     */
+    private Date processDate;
+
+    /**
+     * 保留意见
+     */
+    private String reservations;
+
+    /**
+     * 未修改意见
+     */
+    private String unmodifiedComments;
+    
+}

+ 137 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/domain/ProofreadIssued.java

@@ -0,0 +1,137 @@
+package com.jeeplus.finance.proofread.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+@TableName(value = "proofread_issued")
+public class ProofreadIssued extends BaseEntity {
+
+    /**
+     * 项目id
+     */
+    private String projectId;
+
+    /**
+     * 项目名称
+     */
+    @TableField(exist = false)
+    private String projectName;
+
+    /**
+     * 评估基准日
+     */
+    @TableField(exist = false)
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date assessmentDate;
+
+    /**
+     * 报告文号
+     */
+    @TableField(exist = false)
+    private String reportNo;
+
+    /**
+     * 项目负责人id
+     */
+    @TableField(exist = false)
+    private String projectManager;
+
+    /**
+     * 项目负责人
+     */
+    @TableField(exist = false)
+    private String projectManagerName;
+
+    /**
+     * 所属部门
+     */
+    @TableField(exist = false)
+    private String department;
+
+    /**
+     * 是否填写台账
+     */
+    private String isTxtz;
+
+    /**
+     * 报告电子档是否归档
+     */
+    private String isBgdzdgd;
+
+    /**
+     * 是否需要备案
+     */
+    private String isXyba;
+
+    /**
+     * 是否完成备案
+     */
+    private String isWcba;
+
+    /**
+     * 用印类型
+     */
+    private String sealType;
+
+    /**
+     * 评估报告(份)
+     */
+    private String assessmentReport;
+
+    /**
+     * 评估说明(份)
+     */
+    private String assessmentExplain;
+
+    /**
+     * 评估明细表(份)
+     */
+    private String assessmentDetail;
+
+    /**
+     * 咨询报告(份)
+     */
+    private String consultingReport;
+
+    /**
+     * 审批状态
+     */
+    private String status;
+
+    /**
+     * 审批通过时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date agreeTime;
+
+    /**
+     * 审批人id
+     */
+    private String agreeUserId;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     * 流程类型
+     */
+    private String processDefinitionId;
+
+    /**
+     * 项目-报告类型
+     */
+    @TableField(exist = false)
+    private String reportType;
+
+    private String serviceType;
+}

+ 41 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/domain/ProofreadType.java

@@ -0,0 +1,41 @@
+package com.jeeplus.finance.proofread.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.TreeEntity;
+import lombok.Data;
+
+@Data
+@TableName(value = "proofread_type")
+public class ProofreadType extends TreeEntity<ProofreadType> {
+
+    /**
+     * 类型1自检2浏览审核记录
+     */
+    private String type;
+
+    /**
+     * 父节点id
+     */
+    private String parentId;
+
+    /**
+     * 父节点id集合
+     */
+    private String parentIds;
+
+    /**
+     * 层级
+     */
+    private String level;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+}

+ 17 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/mapper/ProofreadDetailMapper.java

@@ -0,0 +1,17 @@
+package com.jeeplus.finance.proofread.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.proofread.domain.ProofreadDetail;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface ProofreadDetailMapper extends BaseMapper<ProofreadDetail> {
+
+    List<ProofreadDetail> findByInfoId(@Param("id") String id);
+
+    List<ProofreadDetail> findList(@Param("type")String type);
+
+}

+ 0 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/proofread/mapper/ProofreadInfoMapper.java


Some files were not shown because too many files changed in this diff