浏览代码

报销等相关调整

user5 1 年之前
父节点
当前提交
9a6dbe5f8a
共有 63 个文件被更改,包括 2433 次插入140 次删除
  1. 30 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/factory/FinanceApiFallbackFactory.java
  2. 22 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/feign/IFinanceApi.java
  3. 5 1
      jeeplus-common/jeeplus-common-core/src/main/java/com/jeeplus/common/constant/AppNameConstants.java
  4. 63 6
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/controller/ReimbursementInfoController.java
  5. 31 0
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/domain/ReimbursementAmountInfo.java
  6. 2 0
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/domain/ReimbursementInfo.java
  7. 11 0
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/mapper/ReimbursementInfoMapper.java
  8. 58 1
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/mapper/xml/ReimbursementInfoMapper.xml
  9. 156 23
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/service/ReimbursementInfoService.java
  10. 2 0
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/service/dto/QueryListDto.java
  11. 114 0
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/service/dto/ReimbursementAmountInfoDTO.java
  12. 4 0
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/service/dto/RetureListDto.java
  13. 4 0
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/service/dto/SaveInfoDto.java
  14. 97 0
      jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/workContract/service/WorkContractService.java
  15. 66 3
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/controller/ZsReimbursementInfoController.java
  16. 31 0
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/domain/ZsReimbursementAmountInfo.java
  17. 5 0
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/domain/ZsReimbursementInfo.java
  18. 11 0
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/mapper/ZsReimbursementInfoMapper.java
  19. 58 0
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/mapper/xml/ZsReimbursementInfoMapper.xml
  20. 157 24
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/service/ZsReimbursementInfoService.java
  21. 5 0
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/service/dto/ZsQueryListDto.java
  22. 114 0
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/service/dto/ZsReimbursementAmountInfoDTO.java
  23. 5 0
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/service/dto/ZsRetureListDto.java
  24. 6 0
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/service/dto/ZsSaveInfoDto.java
  25. 100 0
      jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalType/service/ZsReimbursementTypeService.java
  26. 100 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/contractRegistration/service/ContractInfoService.java
  27. 1 1
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/controller/CwFinanceInvoiceController.java
  28. 6 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/CwFinanceInvoiceMapper.xml
  29. 4 2
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/CwFinanceInvoiceDTO.java
  30. 2 2
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/controller/CwProjectRecordsController.java
  31. 1 1
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/CwProjectRecordsMapper.java
  32. 19 13
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/xml/CwProjectRecordsMapper.xml
  33. 2 2
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/CwProjectRecordsService.java
  34. 1 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/dto/CwProjectRecordsDTO.java
  35. 42 21
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReport/service/CwProjectReportReviewService.java
  36. 11 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReportArchive/controller/CwProjectReportArchiveController.java
  37. 9 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReportArchive/domain/CwProjectReportArchive.java
  38. 9 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReportArchive/mapper/CwProjectReportArchiveMapper.java
  39. 50 3
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReportArchive/mapper/xml/CwProjectReportArchiveMapper.xml
  40. 57 4
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReportArchive/service/CwProjectReportArchiveService.java
  41. 44 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReportArchive/service/dto/CwProjectReportArchiveDTO.java
  42. 59 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/controller/CwReimbursementInfoController.java
  43. 30 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/domain/CwReimbursementAmountInfo.java
  44. 4 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/domain/CwReimbursementInfo.java
  45. 11 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/mapper/CwReimbursementInfoMapper.java
  46. 57 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/mapper/xml/CwReimbursementInfoMapper.xml
  47. 155 19
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/service/CwReimbursementInfoService.java
  48. 114 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/service/dto/CwReimbursementAmountInfoDTO.java
  49. 2 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/service/dto/QueryListDto.java
  50. 4 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/service/dto/RetureListDto.java
  51. 5 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/service/dto/SaveInfoDto.java
  52. 10 0
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/controller/FlowableTaskController.java
  53. 2 2
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/controller/MyNoticeController.java
  54. 5 1
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/MyNoticeService.java
  55. 12 1
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/modules/flowable/listener/MyExecutionListener.java
  56. 3 1
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/modules/flowable/listener/SZSignatureInformExecutionListener.java
  57. 1 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/service/HandoverService.java
  58. 183 4
      jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/oss/controller/OssFileController.java
  59. 53 0
      jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/oss/utils/FileUtil.java
  60. 8 2
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/UserService.java
  61. 13 0
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/feign/FinanceFeignApi.java
  62. 13 3
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java
  63. 174 0
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/resources/META-INF/MANIFEST.MF

+ 30 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/factory/FinanceApiFallbackFactory.java

@@ -0,0 +1,30 @@
+package com.jeeplus.flowable.factory;
+
+import com.jeeplus.flowable.feign.IAssessApi;
+import com.jeeplus.flowable.feign.IFinanceApi;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 会计服务降级处理
+ * @author: 徐滕
+ * @create: 2023-10-16 16:21
+ **/
+@Slf4j
+@Component
+public class FinanceApiFallbackFactory implements FallbackFactory<IFinanceApi> {
+
+    @Override
+    public IFinanceApi create(Throwable cause) {
+        log.error ( "会计服务调用失败:{}", cause.getMessage ( ) );
+        return new IFinanceApi() {
+
+            @Override
+            public String getNotFiledYetList() {
+                return null;
+            }
+
+        };
+    }
+}

+ 22 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/feign/IFinanceApi.java

@@ -0,0 +1,22 @@
+package com.jeeplus.flowable.feign;
+
+import com.jeeplus.common.constant.AppNameConstants;
+import com.jeeplus.flowable.factory.AssessApiFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * @author: 徐滕
+ * @create: 2023-10-16 16:21
+ **/
+@FeignClient(contextId = "financeApi", name = AppNameConstants.APP_FINANCE_MODULES, fallbackFactory = AssessApiFallbackFactory.class)
+public interface IFinanceApi {
+
+    /**
+     * 查询暂时未归档报告归档数据
+     * @return
+     */
+    @GetMapping(value = "/cwProjectReportArchive/getNotFiledYetList")
+    String getNotFiledYetList();
+}

+ 5 - 1
jeeplus-common/jeeplus-common-core/src/main/java/com/jeeplus/common/constant/AppNameConstants.java

@@ -26,7 +26,11 @@ public interface AppNameConstants {
      */
     String APP_ASSESS_MODULES = "jeeplus-assess";
     /**
-     * 评估模块
+     * 会计模块
+     */
+    String APP_FINANCE_MODULES = "jeeplus-finance";
+    /**
+     * 人力资源
      */
     String APP_HUMAN_MODULES = "jeeplus-human";
 }

+ 63 - 6
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/controller/ReimbursementInfoController.java

@@ -2,19 +2,17 @@ package com.jeeplus.assess.reimbursement.reimbursementInfo.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.common.collect.Lists;
 import com.jeeplus.assess.projectRecords.Utils.EasyPoiUtil;
+import com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto.*;
 import com.jeeplus.common.excel.ExcelOptions;
 import com.jeeplus.common.excel.ExportMode;
 import com.jeeplus.common.utils.ResponseUtil;
 import com.jeeplus.assess.program.configuration.projectList.domain.ProgramProjectListInfo;
-import com.jeeplus.assess.program.configuration.projectList.service.dto.ExportFileDto;
 import com.jeeplus.assess.reimbursement.reimbursementInfo.domain.ReimbursementInfo;
 import com.jeeplus.assess.reimbursement.reimbursementInfo.service.ReimbursementInfoService;
-import com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto.QueryListDto;
-import com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto.RetureListDto;
-import com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto.SaveInfoDto;
-import com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto.TreeUserDto;
 import com.jeeplus.logging.annotation.ApiLog;
+import com.jeeplus.utils.StringUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.http.ResponseEntity;
@@ -23,6 +21,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -88,7 +87,7 @@ public class ReimbursementInfoController {
 
     @ApiOperation(value = "发票号判断")
     @GetMapping("/checkNumber")
-    public ResponseEntity<Boolean> checkNumber(@RequestParam String number) {
+    public ResponseEntity<Boolean> checkNumber(@RequestParam("number") String number) {
         Boolean is = service.checkNumber(number);
         return ResponseEntity.ok(is);
     }
@@ -132,6 +131,45 @@ public class ReimbursementInfoController {
 
     }
 
+
+    @ApiLog(value = "评估电子发票报销数据")
+    @GetMapping("exportInvoiceReimbursementFile")
+    @ApiOperation(value = "评估电子发票报销数据")
+    public void exportInvoiceReimbursementFile(QueryListDto cwDTO, Page <RetureListDto> page, ExcelOptions options, HttpServletResponse response) throws Exception {
+        String fileName = "评估电子发票报销数据表";
+        String sheetName = "评估电子发票报销列表";
+        List<RetureListDto> result = new ArrayList<>();
+        if ( ExportMode.current.equals ( options.getMode() ) ) {
+            result = service.list (page,cwDTO).getRecords();
+        } else if (ExportMode.selected.equals ( options.getMode() )) {
+            result = service.list (page,cwDTO).getRecords().stream ( ).filter ( item ->
+                    options.getSelectIds ( ).contains ( item.getId ( ) )
+            ).collect ( Collectors.toList ( ) );
+        } else {
+            page.setSize (-1);
+            page.setCurrent (0);
+            if(StringUtils.isBlank(cwDTO.getReimbursementType())){
+                cwDTO.setReimbursementType("1");
+            }
+            result = service.list (page,cwDTO).getRecords();
+        }
+        List<String> idList = Lists.newArrayList();
+        for (RetureListDto listDto : result) {
+            idList.add(listDto.getId());
+        }
+        List<ReimbursementAmountInfoDTO> invoiceReimbursementAmountList = Lists.newArrayList();
+        if(idList.size()>0){
+            invoiceReimbursementAmountList = service.getInvoiceReimbursementAmountList(idList);
+        }
+        for (int i = 1;i <=invoiceReimbursementAmountList.size();i ++){
+            ReimbursementAmountInfoDTO reimbursementAmountInfoDTO = invoiceReimbursementAmountList.get(i - 1);
+            reimbursementAmountInfoDTO.setSerialNumber(i);
+        }
+
+        EasyPoiUtil.exportExcel ( invoiceReimbursementAmountList, sheetName,  sheetName, ReimbursementAmountInfoDTO.class, fileName, response );
+
+    }
+
     @ApiOperation(value = "关联报销")
     @GetMapping(value = "/relationReimbursementList")
     public ResponseEntity<IPage<RetureListDto>> relationReimbursementList(Page<RetureListDto> page, @RequestParam("id") String id) {
@@ -152,4 +190,23 @@ public class ReimbursementInfoController {
         List<ProgramProjectListInfo> cwProjectRecords = service.queryByProIds(ids);
         return ResponseEntity.ok(cwProjectRecords);
     }
+
+    /**
+     * 根据发票号查询是否已经或正在报销
+     * @return
+     */
+    @ApiLog(value = "根据发票号查询是否已经或正在报销")
+    @GetMapping("getEffectiveDataByInvoiceNumber")
+    @ApiOperation(value = "根据发票号查询是否已经或正在报销")
+    public Map<String,Object> getEffectiveDataByInvoiceNumber(String invoiceNumber,String id){
+        Map map = new HashMap();
+        Integer count = service.getEffectiveDataByInvoiceNumber(invoiceNumber,id);
+        if(count>0){
+            map.put("success",false);
+            map.put("message","发票号:" + invoiceNumber + " 已发起或完成报销,请勿重复报销");
+        }else{
+            map.put("success",true);
+        }
+        return map;
+    }
 }

+ 31 - 0
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/domain/ReimbursementAmountInfo.java

@@ -3,6 +3,7 @@ package com.jeeplus.assess.reimbursement.reimbursementInfo.domain;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.jeeplus.core.domain.BaseEntity;
 import lombok.Data;
+import org.apache.poi.hpsf.Date;
 import org.apache.poi.hpsf.Decimal;
 
 import java.math.BigDecimal;
@@ -41,4 +42,34 @@ public class ReimbursementAmountInfo extends BaseEntity {
      */
     private String count;
 
+    /**
+     * 报销类型(0:普通报销;1:电子发票报销)
+     */
+    private String reimbursementType;
+
+    /**
+     * 发票类型(01:增值税发票;02:普通发票)
+     */
+    private String invoiceType;
+
+    /**
+     * 发票项目名
+     */
+    private String invoiceProjectName;
+
+    /**
+     * 开票时间
+     */
+    private String invoiceDate;
+
+    /**
+     * 开票单位
+     */
+    private String invoiceUnit;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
 }

+ 2 - 0
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/domain/ReimbursementInfo.java

@@ -65,4 +65,6 @@ public class ReimbursementInfo extends BaseEntity {
     private String sourceType;
 
     private String purchaseId;
+
+    private String reimbursementType; // 报销类型(0:普通报销;1:电子发票报销)
 }

+ 11 - 0
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/mapper/ReimbursementInfoMapper.java

@@ -7,6 +7,7 @@ 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.assess.reimbursement.reimbursementInfo.domain.*;
+import com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto.ReimbursementAmountInfoDTO;
 import com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto.RetureListDto;
 import com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto.TreeUserDto;
 import com.jeeplus.sys.domain.WorkAttachmentInfo;
@@ -61,4 +62,14 @@ public interface ReimbursementInfoMapper extends BaseMapper<ReimbursementInfo> {
      * @return
      */
     String getNumberById(String id);
+
+    /**
+     * 根据发票号查询是否已经或正在报销
+     * @param invoiceNumber
+     * @return
+     */
+    Integer getEffectiveDataByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber, @Param("id") String id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ReimbursementAmountInfoDTO> getInvoiceReimbursementAmountList(@Param("idList") List<String> idList);
 }

+ 58 - 1
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/mapper/xml/ReimbursementInfoMapper.xml

@@ -54,7 +54,8 @@
 			d.ID_ AS task_id,
 			a.create_by_id as create_id,
 			a.source_type,
-			a.purchase_id
+			a.purchase_id,
+			a.reimbursement_type
 -- 			pru.purchase_no
 		FROM
 			reimbursement_info a
@@ -99,6 +100,7 @@
 			url,
 			attachment_name AS `name`,
 			create_by_id AS `by`,
+			attachment_flag AS `attachmentFlag`,
 			create_time
 		FROM
 			work_attachment
@@ -321,4 +323,59 @@
 		select no from reimbursement_info where id = #{id}
 	</select>
 
+
+	<select id="getEffectiveDataByInvoiceNumber" resultType="java.lang.Integer">
+		select count(a.id) as count from reimbursement_amount_info a
+		left join reimbursement_info ri on ri.id = a.info_id
+		<where>
+			a.number = #{invoiceNumber} and a.del_flag = 0
+			<if test="id != null and id != ''">
+				and a.info_id != #{id}
+			</if>
+			and ri.del_flag = 0
+		</where>
+	</select>
+
+	<select id="getInvoiceReimbursementAmountList" resultType="com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto.ReimbursementAmountInfoDTO">
+		select
+		a.id,
+		a.create_by_id,
+		a.create_time,
+		a.update_by_id,
+		a.update_time,
+		a.del_flag,
+		a.info_id,
+		a.code,
+		a.number,
+		a.amount,
+		a.tax_amount,
+		a.count,
+		a.tenant_id,
+		a.reimbursement_type,
+		a.invoice_type,
+		a.invoice_project_name,
+		date_format(a.invoice_date,'%Y-%m-%d %h:%i:%s') as 'invoiceDate',
+		a.invoice_date,
+		a.invoice_unit,
+		a.remarks,
+		ri.type as "status",
+		date_format(ri.reim_date,'%Y-%m-%d') as 'reimDate',
+		su.name as "reimbursementApplicantName",
+		so.name as "officeName",
+		sdv.label as "invoiceTypeStr"
+		from
+		reimbursement_amount_info a
+		left join reimbursement_info ri on ri.id = a.info_id
+		left join sys_user su on su.id = ri.create_by_id
+		left join sys_office so on so.id = su.office_id
+		left join sys_dict_value sdv on sdv.value = a.invoice_type
+		left join sys_dict_type sdt on sdt.id = sdv.dict_type_id and sdt.type = 'invoice_reimbursement_type'
+		<where>
+			a.del_flag = 0
+			and a.info_id in
+			<foreach collection="idList" item="id" index="index" open="(" close=")" separator=",">
+				#{id}
+			</foreach>
+		</where>
+	</select>
 </mapper>

+ 156 - 23
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/reimbursement/reimbursementInfo/service/ReimbursementInfoService.java

@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto.*;
 import com.jeeplus.common.TokenProvider;
 import com.jeeplus.core.query.QueryWrapperGenerator;
 import com.jeeplus.flowable.feign.IFlowableApi;
@@ -32,10 +33,6 @@ import com.jeeplus.assess.program.configuration.projectList.mapper.ProgramReport
 import com.jeeplus.assess.program.configuration.projectList.mapper.ProjectListMapper;
 import com.jeeplus.assess.reimbursement.reimbursementInfo.domain.*;
 import com.jeeplus.assess.reimbursement.reimbursementInfo.mapper.*;
-import com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto.QueryListDto;
-import com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto.RetureListDto;
-import com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto.SaveInfoDto;
-import com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto.TreeUserDto;
 import com.jeeplus.assess.workContract.service.WorkContractService;
 import com.jeeplus.assess.workContract.service.dto.WorkContractInfoDto;
 import org.apache.commons.lang3.StringUtils;
@@ -130,6 +127,10 @@ public class ReimbursementInfoService {
         if (StringUtils.isNotEmpty(dto.getType())) {
             queryWrapper.eq("a.type", dto.getType());
         }
+        // 报销项状态
+        if (StringUtils.isNotEmpty(dto.getReimbursementType())) {
+            queryWrapper.eq("a.reimbursement_type", dto.getReimbursementType());
+        }
         // 报销部门
         if (StringUtils.isNotEmpty(dto.getDepartment())) {
             queryWrapper.apply("(( b.dept_id = {0} OR so.name LIKE {1} )", dto.getDepartment(), "%" + dto.getDepartment() + "%");
@@ -322,20 +323,61 @@ public class ReimbursementInfoService {
                 reimbursementDetailInfoProcuredMapper.insert(detailInfo);
             }
         }
-        // 保存专用发票列表信息
-        if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
-            for (ReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
-                // 生成id
-                String amountId = UUID.randomUUID().toString().replace("-", "");
-                amountInfo.setId(amountId);
-                amountInfo.setCreateById(userDTO.getId());
-                amountInfo.setCreateTime(new Date());
-                amountInfo.setUpdateById(userDTO.getId());
-                amountInfo.setUpdateTime(new Date());
-                amountInfo.setDelFlag(0);
-                // 保存基础表信息主键值
-                amountInfo.setInfoId(id);
-                amountInfoMapper.insert(amountInfo);
+        if(StringUtils.isNotBlank(dto.getReimbursementType())){
+            if("0".equals(dto.getReimbursementType())){
+                // 保存专用发票列表信息
+                if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
+                    for (ReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
+                        //普通报销 发票信息
+                        amountInfo.setReimbursementType("0");
+                        // 生成id
+                        String amountId = UUID.randomUUID().toString().replace("-", "");
+                        amountInfo.setId(amountId);
+                        amountInfo.setCreateById(userDTO.getId());
+                        amountInfo.setCreateTime(new Date());
+                        amountInfo.setUpdateById(userDTO.getId());
+                        amountInfo.setUpdateTime(new Date());
+                        amountInfo.setDelFlag(0);
+                        // 保存基础表信息主键值
+                        amountInfo.setInfoId(id);
+                        amountInfoMapper.insert(amountInfo);
+                    }
+                }
+                //清除电子发票信息
+                // 删除合同列表
+                LambdaQueryWrapper<ReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                deleteInfo.eq(ReimbursementAmountInfo::getInfoId, dto.getId());
+                deleteInfo.ne(ReimbursementAmountInfo::getReimbursementType, "0");
+                amountInfoMapper.delete(deleteInfo);
+            }else if("1".equals(dto.getReimbursementType())){
+                // 保存电子发票列表信息
+                if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursements())) {
+                    for (ReimbursementAmountInfo amountInfo : dto.getInvoiceReimbursements()) {
+                        //电子发票报销 发票信息
+                        amountInfo.setReimbursementType("1");
+                        // 生成id
+                        String amountId = UUID.randomUUID().toString().replace("-", "");
+                        amountInfo.setId(amountId);
+                        amountInfo.setCreateById(userDTO.getId());
+                        amountInfo.setCreateTime(new Date());
+                        amountInfo.setUpdateById(userDTO.getId());
+                        amountInfo.setUpdateTime(new Date());
+                        amountInfo.setDelFlag(0);
+                        // 保存基础表信息主键值
+                        amountInfo.setInfoId(id);
+                        amountInfoMapper.insert(amountInfo);
+                    }
+                }
+                //清除专用发票信息
+                LambdaQueryWrapper<ReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                deleteInfo.eq(ReimbursementAmountInfo::getInfoId, dto.getId());
+                deleteInfo.ne(ReimbursementAmountInfo::getReimbursementType, "1");
+                amountInfoMapper.delete(deleteInfo);
+
+                // 保存电子发票附件列表信息
+                if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursementFiles())) {
+                    workContractService.saveFiles(dto.getInvoiceReimbursementFiles(), userDTO, id,"invoiceReimbursement");
+                }
             }
         }
         // 保存附件列表信息
@@ -426,7 +468,66 @@ public class ReimbursementInfoService {
         LambdaQueryWrapper<ReimbursementAmountInfo> amountWrapper = new LambdaQueryWrapper<>();
         amountWrapper.eq(ReimbursementAmountInfo::getInfoId, dto.getId());
         amountInfoMapper.delete(amountWrapper);
-        if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
+        if(StringUtils.isNotBlank(dto.getReimbursementType())){
+            if("0".equals(dto.getReimbursementType())){
+                // 保存专用发票列表信息
+                if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
+                    for (ReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
+                        //普通报销 发票信息
+                        amountInfo.setReimbursementType("0");
+                        // 生成id
+                        String amountId = UUID.randomUUID().toString().replace("-", "");
+                        amountInfo.setId(amountId);
+                        amountInfo.setCreateById(userDTO.getId());
+                        amountInfo.setCreateTime(new Date());
+                        amountInfo.setUpdateById(userDTO.getId());
+                        amountInfo.setUpdateTime(new Date());
+                        amountInfo.setDelFlag(0);
+                        // 保存基础表信息主键值
+                        amountInfo.setInfoId(dto.getId());
+                        amountInfoMapper.insert(amountInfo);
+                    }
+                }
+                //清除电子发票信息
+                // 删除合同列表
+                LambdaQueryWrapper<ReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                deleteInfo.eq(ReimbursementAmountInfo::getInfoId, dto.getId());
+                deleteInfo.ne(ReimbursementAmountInfo::getReimbursementType, "0");
+                amountInfoMapper.delete(deleteInfo);
+            }else if("1".equals(dto.getReimbursementType())){
+                // 保存电子发票列表信息
+                if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursements())) {
+                    for (ReimbursementAmountInfo amountInfo : dto.getInvoiceReimbursements()) {
+                        //电子发票报销 发票信息
+                        amountInfo.setReimbursementType("1");
+                        // 生成id
+                        String amountId = UUID.randomUUID().toString().replace("-", "");
+                        amountInfo.setId(amountId);
+                        amountInfo.setCreateById(userDTO.getId());
+                        amountInfo.setCreateTime(new Date());
+                        amountInfo.setUpdateById(userDTO.getId());
+                        amountInfo.setUpdateTime(new Date());
+                        amountInfo.setDelFlag(0);
+                        // 保存基础表信息主键值
+                        amountInfo.setInfoId(dto.getId());
+                        amountInfoMapper.insert(amountInfo);
+                    }
+                }
+                //清除专用发票信息
+                LambdaQueryWrapper<ReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                deleteInfo.eq(ReimbursementAmountInfo::getInfoId, dto.getId());
+                deleteInfo.ne(ReimbursementAmountInfo::getReimbursementType, "1");
+                amountInfoMapper.delete(deleteInfo);
+
+
+                // 保存电子发票附件列表信息
+                if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursementFiles())) {
+                    workContractService.updateFiles(dto.getInvoiceReimbursementFiles(), userDTO, dto.getId(),"invoiceReimbursement");
+                }
+            }
+        }
+
+        /*if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
             for (ReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
                 // 生成id
                 String amountId = UUID.randomUUID().toString().replace("-", "");
@@ -440,7 +541,7 @@ public class ReimbursementInfoService {
                 amountInfo.setInfoId(dto.getId());
                 amountInfoMapper.insert(amountInfo);
             }
-        }
+        }*/
         // 修改附件信息列表
         if (CollectionUtils.isNotEmpty(dto.getFiles())) {
             workContractService.updateFiles(dto.getFiles(), userDTO, dto.getId());
@@ -513,16 +614,31 @@ public class ReimbursementInfoService {
             // 查询专用发票信息列表
             LambdaQueryWrapper<ReimbursementAmountInfo> amountInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
             amountInfoLambdaQueryWrapper.eq(ReimbursementAmountInfo::getInfoId, id);
+            amountInfoLambdaQueryWrapper.eq(ReimbursementAmountInfo::getReimbursementType, "0");
             List<ReimbursementAmountInfo> amountInfos = amountInfoMapper.selectList(amountInfoLambdaQueryWrapper);
             dto.setAmountInfos(amountInfos);
+            LambdaQueryWrapper<ReimbursementAmountInfo> invoiceReimbursementsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            invoiceReimbursementsLambdaQueryWrapper.eq(ReimbursementAmountInfo::getInfoId, id);
+            invoiceReimbursementsLambdaQueryWrapper.eq(ReimbursementAmountInfo::getReimbursementType, "1");
+            List<ReimbursementAmountInfo> invoiceReimbursements = amountInfoMapper.selectList(invoiceReimbursementsLambdaQueryWrapper);
+            dto.setInvoiceReimbursements(invoiceReimbursements);
             // 查询附件信息
-            List<WorkAttachmentInfo> files = infoMapper.findFiles(id);
-            if (CollectionUtils.isNotEmpty(files)) {
-                for (WorkAttachmentInfo i : files) {
+            List<WorkAttachmentInfo> fileList = infoMapper.findFiles(id);
+            List<WorkAttachmentInfo> files = Lists.newArrayList();
+            List<WorkAttachmentInfo> invoiceReimbursementFiles = Lists.newArrayList();
+
+            if (CollectionUtils.isNotEmpty(fileList)) {
+                for (WorkAttachmentInfo i : fileList) {
                     i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+                    if("invoiceReimbursement".equals(i.getAttachmentFlag())){
+                        invoiceReimbursementFiles.add(i);
+                    }else{
+                        files.add(i);
+                    }
                 }
             }
             dto.setFiles(files);
+            dto.setInvoiceReimbursementFiles(invoiceReimbursementFiles);
         }
         return dto;
     }
@@ -877,4 +993,21 @@ public class ReimbursementInfoService {
 
         return list;
     }
+
+    /**
+     * 根据发票号查询是否已经或正在报销
+     * @param invoiceNumber
+     * @return
+     */
+    public Integer getEffectiveDataByInvoiceNumber(String invoiceNumber,String id){
+        return infoMapper.getEffectiveDataByInvoiceNumber(invoiceNumber,id);
+    }
+
+    public List<ReimbursementAmountInfoDTO> getInvoiceReimbursementAmountList(List<String> idList) {
+        List<ReimbursementAmountInfoDTO> list = infoMapper.getInvoiceReimbursementAmountList(idList);
+
+
+        return list;
+    }
+
 }

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

@@ -55,4 +55,6 @@ public class QueryListDto extends BaseEntity {
      * 报销类型
      */
     private String sourceType;
+
+    private String reimbursementType;
 }

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

@@ -0,0 +1,114 @@
+package com.jeeplus.assess.reimbursement.reimbursementInfo.service.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author: 徐滕
+ * @version: 2023-11-03 15:26
+ */
+@Data
+public class ReimbursementAmountInfoDTO extends BaseEntity {
+    /**
+     * 序号
+     */
+    @Excel(name = "序号", width = 6, orderNum = "1")
+    private Integer serialNumber;
+    /**
+     * 关联id
+     */
+    private String infoId;
+
+    /**
+     * 发票代码
+     */
+    private String code;
+
+    /**
+     * 发票编号
+     */
+    @Excel(name = "发票号号", width = 22, orderNum = "3")
+    private String number;
+
+    /**
+     * 金额
+     */
+    @Excel(name = "金额", width = 16, orderNum = "7")
+    private Double amount;
+
+    /**
+     * 税额
+     */
+    @Excel(name = "税额", width = 16, orderNum = "8")
+    private Double taxAmount;
+
+    /**
+     * 价税合计
+     */
+    @Excel(name = "合计", width = 16, orderNum = "9")
+    private Double count;
+
+    /**
+     * 报销类型(0:普通报销;1:电子发票报销)
+     */
+    private String reimbursementType;
+
+    /**
+     * 发票类型(01:增值税发票;02:普通发票)
+     */
+    private String invoiceType;
+
+    /**
+     * 发票项目名
+     */
+    @Excel(name = "项目名称", width = 30, orderNum = "6")
+    private String invoiceProjectName;
+
+    /**
+     * 开票时间
+     */
+    @Excel(name = "开票日期", width = 20, orderNum = "4")
+    private String invoiceDate;
+
+    /**
+     * 开票单位
+     */
+    @Excel(name = "开票单位", width = 30, orderNum = "5")
+    private String invoiceUnit;
+
+    /**
+     * 备注
+     */
+    @Excel(name = "备注", width = 30, orderNum = "12")
+    private String remarks;
+
+    /**
+     * 发票类型Str
+     */
+    @Excel(name = "发票类型", width = 20, orderNum = "2")
+    private String invoiceTypeStr;
+    private String officeName;
+
+    /**
+     * 报销人
+     */
+    @Excel(name = "报销人", width = 10, orderNum = "10")
+    private String reimbursementApplicantName;
+
+    /**
+     * 报销日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "报销日期", exportFormat="yyyy-MM-dd", width = 12, orderNum = "11")
+    private Date reimDate;
+
+    /**
+     * 报销状态
+     */
+    //@Excel(name = "报销状态", width = 30, orderNum = "12",dict = "status")
+    private String status;
+}

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

@@ -116,6 +116,10 @@ public class RetureListDto {
     private String purchaseNo;
 
     private String purchaseId;
+    /**
+     * 报销类型
+     */
+    private String reimbursementType;
 
     /**
      * 数据审核人  报销

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

@@ -70,8 +70,10 @@ public class SaveInfoDto extends BaseEntity {
     private List<ReimbursementDetailInfoProcured> detailInfoProcured;
 
     private List<ReimbursementAmountInfo> amountInfos;
+    private List<ReimbursementAmountInfo> invoiceReimbursements;
 
     private List<WorkAttachmentInfo> files;
+    private List<WorkAttachmentInfo> invoiceReimbursementFiles; //电子发票报销
     /**
      * 报销类型
      */
@@ -90,4 +92,6 @@ public class SaveInfoDto extends BaseEntity {
 
     private String comment; // 审核意见
 
+    private String reimbursementType; // 报销类型(0:普通报销;1:电子发票报销)
+
 }

+ 97 - 0
jeeplus-modules/jeeplus-assess/src/main/java/com/jeeplus/assess/workContract/service/WorkContractService.java

@@ -241,6 +241,45 @@ public class WorkContractService {
      * @param id 关联id
      */
     @Transactional(rollbackFor = Exception.class)
+    public void saveFiles(List<WorkAttachmentInfo> list, UserDTO userDTO, String id,String attachmentFlag) {
+        int j = 1;
+        for (WorkAttachmentInfo dto : list) {
+            WorkAttachmentInfo i = new WorkAttachmentInfo();
+            //包含了url、size、name
+            i.setId(UUID.randomUUID().toString().replace("-", ""));
+//            i.getCreateBy().setId(userDTO.getId());
+            i.setCreateTime(new Date());
+//            i.getUpdateBy().setId(userDTO.getId());
+            i.setUpdateTime(new Date());
+            i.setDelFlag(0);
+            i.setUrl(dto.getUrl());
+            //文件类型处理
+            List<String> strings = Arrays.asList(dto.getName().split("\\."));
+            if (CollectionUtil.isNotEmpty(strings)) {
+                i.setType(strings.get(1));
+            }
+            i.setAttachmentId(id);
+            i.setAttachmentName(dto.getName());
+            i.setAttachmentFlag(attachmentFlag);
+            i.setFileSize(dto.getSize());
+            i.setSort(j);
+            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);
+            j++;
+        }
+    }
+
+    /**
+     * 保存附件信息
+     * @param list 待保存的附件列表
+     * @param userDTO 当前登录用户
+     * @param id 关联id
+     */
+    @Transactional(rollbackFor = Exception.class)
     public void saveFilesNew(List<WorkAttachmentInfoDTO> list, UserDTO userDTO, String id,String attachmentFlag) {
         int j = 1;
         for (WorkAttachmentInfoDTO dto : list) {
@@ -332,6 +371,64 @@ public class WorkContractService {
     }
 
     /**
+     * 修改附件信息
+     * @param list 待修改的附件列表
+     * @param userDTO 当前登录用户
+     * @param id 关联id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void updateFiles(List<WorkAttachmentInfo> list, UserDTO userDTO, String id,String attachmentFlag) {
+        int j = 1;
+        String names = new String();
+        //表中存在,但是传过来不存在,说明已删除,表中数据也要删除
+        for (WorkAttachmentInfo dto : list) {
+            names = names + "," +dto.getUrl();
+        }
+        //查询保存的附件信息
+        List<WorkAttachmentInfo> infoList = workContractInfoMapper.findList(id);
+        if (CollectionUtil.isNotEmpty(infoList)) {
+            for (WorkAttachmentInfo i : infoList) {
+                if (!names.contains(i.getUrl())) {
+                    SpringUtil.getBean ( IWorkAttachmentApi.class ).deleteById(i.getId());
+                }
+            }
+        }
+        //保存信息
+        for (WorkAttachmentInfo dto : list) {
+            //判断是否存在
+            Integer isExit = workContractInfoMapper.findIsExit(id, dto.getName());
+            if (isExit == 0) {
+                WorkAttachmentInfo i = new WorkAttachmentInfo();
+                //包含了url、size、name
+                i.setId(UUID.randomUUID().toString().replace("-", ""));
+//                i.getCreateBy().setId(userDTO.getId());
+                i.setCreateTime(new Date());
+//                i.getUpdateBy().setId(userDTO.getId());
+                i.setUpdateTime(new Date());
+                i.setDelFlag(0);
+                i.setUrl(dto.getUrl());
+                //文件类型处理
+                List<String> strings = Arrays.asList(dto.getName().split("\\."));
+                if (CollectionUtil.isNotEmpty(strings)) {
+                    i.setType(strings.get(1));
+                }
+                i.setAttachmentId(id);
+                i.setAttachmentName(dto.getName());
+                i.setAttachmentFlag(attachmentFlag);
+                i.setFileSize(dto.getSize());
+                i.setSort(j);
+                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);
+                j++;
+            }
+        }
+    }
+
+    /**
      * 关联项目
      * @param id
      * @return

+ 66 - 3
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/controller/ZsReimbursementInfoController.java

@@ -1,7 +1,9 @@
 package com.jeeplus.centrecareful.approvalInfo.controller;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.common.collect.Lists;
 import com.jeeplus.centrecareful.approvalInfo.domain.ZSProgramProjectListInfo;
+import com.jeeplus.centrecareful.approvalInfo.domain.ZsReimbursementInfo;
 import com.jeeplus.centrecareful.approvalInfo.service.ZsReimbursementInfoService;
 import com.jeeplus.centrecareful.approvalInfo.service.dto.*;
 import com.jeeplus.centrecareful.approvalInfo.util.ZSEasyPoiUtil;
@@ -14,13 +16,14 @@ import com.jeeplus.logging.constant.enums.LogTypeEnum;
 import com.jeeplus.utils.StringUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.http.ResponseEntity;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -89,8 +92,11 @@ public class ZsReimbursementInfoController {
     @ApiOperation(value = "新增、修改")
     @PostMapping("/save")
     public ResponseEntity<String> save(@RequestBody ZsSaveInfoDto dto) throws Exception{
-        String s = service.save(dto);
-        return ResponseUtil.newInstance().add("businessTable", "zs_reimbursement_info").add("businessId", s).ok ("操作成功");
+        ZsReimbursementInfo s = service.save(dto);
+        return ResponseUtil.newInstance().add("businessTable", "zs_reimbursement_info")
+                .add("businessId", s.getId())
+                .add("no", s.getNo())
+                .ok ("操作成功");
     }
 
     /**
@@ -164,6 +170,44 @@ public class ZsReimbursementInfoController {
 
     }
 
+    @ApiLog(value = "中审电子发票报销数据")
+    @GetMapping("exportInvoiceReimbursementFile")
+    @ApiOperation(value = "中审电子发票报销数据")
+    public void exportInvoiceReimbursementFile(ZsQueryListDto cwDTO, Page <ZsRetureListDto> page, ExcelOptions options, HttpServletResponse response) throws Exception {
+        String fileName = "中审电子发票报销数据表";
+        String sheetName = "中审电子发票报销列表";
+        List<ZsRetureListDto> result = new ArrayList<>();
+        if (ExportMode.current.equals ( options.getMode() ) ) {
+            result = service.list (page,cwDTO).getRecords();
+        } else if (com.jeeplus.common.excel.ExportMode.selected.equals ( options.getMode() )) {
+            result = service.list (page,cwDTO).getRecords().stream ( ).filter ( item ->
+                    options.getSelectIds ( ).contains ( item.getId ( ) )
+            ).collect ( Collectors.toList ( ) );
+        } else {
+            page.setSize (-1);
+            page.setCurrent (0);
+            if(com.jeeplus.utils.StringUtils.isBlank(cwDTO.getReimbursementType())){
+                cwDTO.setReimbursementType("1");
+            }
+            result = service.list (page,cwDTO).getRecords();
+        }
+        List<String> idList = Lists.newArrayList();
+        for (ZsRetureListDto listDto : result) {
+            idList.add(listDto.getId());
+        }
+        List<ZsReimbursementAmountInfoDTO> invoiceReimbursementAmountList = Lists.newArrayList();
+        if(idList.size()>0){
+            invoiceReimbursementAmountList = service.getInvoiceReimbursementAmountList(idList);
+        }
+        for (int i = 1;i <=invoiceReimbursementAmountList.size();i ++){
+            ZsReimbursementAmountInfoDTO reimbursementAmountInfoDTO = invoiceReimbursementAmountList.get(i - 1);
+            reimbursementAmountInfoDTO.setSerialNumber(i);
+        }
+
+        ZSEasyPoiUtil.exportExcel ( invoiceReimbursementAmountList, sheetName,  sheetName, ZsReimbursementAmountInfoDTO.class, fileName, response );
+
+    }
+
 
 
     @ApiOperation(value = "关联报销")
@@ -173,4 +217,23 @@ public class ZsReimbursementInfoController {
         return ResponseEntity.ok(listDtoIPage);
     }
 
+    /**
+     * 根据发票号查询是否已经或正在报销
+     * @return
+     */
+    @ApiLog(value = "根据发票号查询是否已经或正在报销")
+    @GetMapping("getEffectiveDataByInvoiceNumber")
+    @ApiOperation(value = "根据发票号查询是否已经或正在报销")
+    public Map<String,Object> getEffectiveDataByInvoiceNumber(String invoiceNumber, String id){
+        Map map = new HashMap();
+        Integer count = service.getEffectiveDataByInvoiceNumber(invoiceNumber, id);
+        if(count>0){
+            map.put("success",false);
+            map.put("message","发票号:" + invoiceNumber + " 已发起或完成报销,请勿重复报销");
+        }else{
+            map.put("success",true);
+        }
+        return map;
+    }
+
 }

+ 31 - 0
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/domain/ZsReimbursementAmountInfo.java

@@ -42,4 +42,35 @@ public class ZsReimbursementAmountInfo extends BaseEntity {
      * 价税合计
      */
     private String count;
+
+    /**
+     * 报销类型(0:普通报销;1:电子发票报销)
+     */
+    private String reimbursementType;
+
+    /**
+     * 发票类型(01:增值税发票;02:普通发票)
+     */
+    private String invoiceType;
+
+    /**
+     * 发票项目名
+     */
+    private String invoiceProjectName;
+
+    /**
+     * 开票时间
+     */
+    private String invoiceDate;
+
+    /**
+     * 开票单位
+     */
+    private String invoiceUnit;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
 }

+ 5 - 0
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/domain/ZsReimbursementInfo.java

@@ -71,4 +71,9 @@ public class ZsReimbursementInfo extends BaseEntity {
 
     private String purchaseId;
 
+    /**
+     * 报销类型(0:普通报销;1:电子发票报销)
+     */
+    private String reimbursementType;
+
 }

+ 11 - 0
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/mapper/ZsReimbursementInfoMapper.java

@@ -7,6 +7,7 @@ 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.centrecareful.approvalInfo.domain.*;
+import com.jeeplus.centrecareful.approvalInfo.service.dto.ZsReimbursementAmountInfoDTO;
 import com.jeeplus.centrecareful.approvalInfo.service.dto.ZsReportNoDto;
 import com.jeeplus.centrecareful.approvalInfo.service.dto.ZsRetureListDto;
 import com.jeeplus.centrecareful.approvalInfo.service.dto.ZsTreeUserDto;
@@ -53,4 +54,14 @@ public interface ZsReimbursementInfoMapper extends BaseMapper<ZsReimbursementInf
     List<ZsReimbursementDetailInfoProcured> getProcuredDetailList(@Param("id") String id);
     @InterceptorIgnore(tenantLine = "true")
     List<ZsReimbursementDetailInfo> getDetailList(@Param("id") String id);
+
+    /**
+     * 根据发票号查询是否已经或正在报销
+     * @param invoiceNumber
+     * @return
+     */
+    Integer getEffectiveDataByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber, @Param("id") String id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ZsReimbursementAmountInfoDTO> getInvoiceReimbursementAmountList(@Param("idList") List<String> idList);
 }

+ 58 - 0
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/mapper/xml/ZsReimbursementInfoMapper.xml

@@ -119,6 +119,7 @@
 			a.create_by_id AS create_id,
 			a.source_type,
 			a.purchase_id,
+			a.reimbursement_type,
 			pru.purchase_no,
                          a.update_time
 		FROM
@@ -176,6 +177,7 @@
 			url,
 			attachment_name AS `name`,
 			create_by_id AS `by`,
+			attachment_flag AS `attachmentFlag`,
 			create_time
 		FROM
 			work_attachment
@@ -595,4 +597,60 @@
 		where a.del_flag = '0' and a.info_id = #{id}
 		order by a.number asc
 	</select>
+
+	<select id="getEffectiveDataByInvoiceNumber" resultType="java.lang.Integer">
+		select count(a.id) as count from zs_reimbursement_amount_info a
+		left join zs_reimbursement_info ri on ri.id = a.info_id
+		<where>
+			a.number = #{invoiceNumber} and a.del_flag = 0
+			<if test="id != null and id != ''">
+				and a.info_id != #{id}
+			</if>
+			and ri.del_flag = 0
+		</where>
+	</select>
+
+
+	<select id="getInvoiceReimbursementAmountList" resultType="com.jeeplus.centrecareful.approvalInfo.service.dto.ZsReimbursementAmountInfoDTO">
+		select
+		a.id,
+		a.create_by_id,
+		a.create_time,
+		a.update_by_id,
+		a.update_time,
+		a.del_flag,
+		a.info_id,
+		a.code,
+		a.number,
+		a.amount,
+		a.tax_amount,
+		a.count,
+		a.tenant_id,
+		a.reimbursement_type,
+		a.invoice_type,
+		a.invoice_project_name,
+		date_format(a.invoice_date,'%Y-%m-%d %h:%i:%s') as 'invoiceDate',
+		a.invoice_date,
+		a.invoice_unit,
+		a.remarks,
+		ri.type as "status",
+		date_format(ri.reim_date,'%Y-%m-%d') as 'reimDate',
+		su.name as "reimbursementApplicantName",
+		so.name as "officeName",
+		sdv.label as "invoiceTypeStr"
+		from
+		zs_reimbursement_amount_info a
+		left join zs_reimbursement_info ri on ri.id = a.info_id
+		left join sys_user su on su.id = ri.create_by_id
+		left join sys_office so on so.id = su.office_id
+		left join sys_dict_value sdv on sdv.value = a.invoice_type
+		left join sys_dict_type sdt on sdt.id = sdv.dict_type_id and sdt.type = 'invoice_reimbursement_type'
+		<where>
+			a.del_flag = 0
+			and a.info_id in
+			<foreach collection="idList" item="id" index="index" open="(" close=")" separator=",">
+				#{id}
+			</foreach>
+		</where>
+	</select>
 </mapper>

+ 157 - 24
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/service/ZsReimbursementInfoService.java

@@ -182,6 +182,10 @@ public class ZsReimbursementInfoService {
         if (StringUtils.isNotBlank(dto.getSourceType())) {
             queryWrapper.eq("a.source_type", dto.getSourceType());
         }
+        // 报销项状态
+        if (StringUtils.isNotEmpty(dto.getReimbursementType())) {
+            queryWrapper.eq("a.reimbursement_type", dto.getReimbursementType());
+        }
 
         /*//获取当前登录人信息
         UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
@@ -225,7 +229,7 @@ public class ZsReimbursementInfoService {
         return pageList;
     }
 
-    public String save(ZsSaveInfoDto dto) throws Exception{
+    public ZsReimbursementInfo save(ZsSaveInfoDto dto) throws Exception{
         // 获取当前登录人信息
       UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken());
         if (StringUtils.isNotEmpty(dto.getId())) {
@@ -235,7 +239,7 @@ public class ZsReimbursementInfoService {
         }
     }
 
-    public String add(ZsSaveInfoDto dto, UserDTO userDTO) throws Exception{
+    public ZsReimbursementInfo add(ZsSaveInfoDto dto, UserDTO userDTO) throws Exception{
         // 生成id
         String id = UUID.randomUUID().toString().replace("-", "");
         // 生成编号
@@ -291,30 +295,71 @@ public class ZsReimbursementInfoService {
                 zsReimbursementDetailInfoProcuredMapper.insert(detailInfo);
             }
         }
-        // 保存专用发票列表信息
-        if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
-            for (ZsReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
-                // 生成id
-                String amountId = UUID.randomUUID().toString().replace("-", "");
-                amountInfo.setId(amountId);
-                amountInfo.setCreateById(userDTO.getId());
-                amountInfo.setCreateTime(new Date());
-                amountInfo.setUpdateById(userDTO.getId());
-                amountInfo.setUpdateTime(new Date());
-                amountInfo.setDelFlag(0);
-                // 保存基础表信息主键值
-                amountInfo.setInfoId(id);
-                amountInfoMapper.insert(amountInfo);
+        if(StringUtils.isNotBlank(dto.getReimbursementType())){
+            if("0".equals(dto.getReimbursementType())){
+                // 保存专用发票列表信息
+                if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
+                    for (ZsReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
+                        //普通报销 发票信息
+                        amountInfo.setReimbursementType("0");
+                        // 生成id
+                        String amountId = UUID.randomUUID().toString().replace("-", "");
+                        amountInfo.setId(amountId);
+                        amountInfo.setCreateById(userDTO.getId());
+                        amountInfo.setCreateTime(new Date());
+                        amountInfo.setUpdateById(userDTO.getId());
+                        amountInfo.setUpdateTime(new Date());
+                        amountInfo.setDelFlag(0);
+                        // 保存基础表信息主键值
+                        amountInfo.setInfoId(id);
+                        amountInfoMapper.insert(amountInfo);
+                    }
+                }
+                //清除电子发票信息
+                // 删除合同列表
+                LambdaQueryWrapper<ZsReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                deleteInfo.eq(ZsReimbursementAmountInfo::getInfoId, dto.getId());
+                deleteInfo.ne(ZsReimbursementAmountInfo::getReimbursementType, "0");
+                amountInfoMapper.delete(deleteInfo);
+            }else if("1".equals(dto.getReimbursementType())){
+                // 保存电子发票列表信息
+                if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursements())) {
+                    for (ZsReimbursementAmountInfo amountInfo : dto.getInvoiceReimbursements()) {
+                        //电子发票报销 发票信息
+                        amountInfo.setReimbursementType("1");
+                        // 生成id
+                        String amountId = UUID.randomUUID().toString().replace("-", "");
+                        amountInfo.setId(amountId);
+                        amountInfo.setCreateById(userDTO.getId());
+                        amountInfo.setCreateTime(new Date());
+                        amountInfo.setUpdateById(userDTO.getId());
+                        amountInfo.setUpdateTime(new Date());
+                        amountInfo.setDelFlag(0);
+                        // 保存基础表信息主键值
+                        amountInfo.setInfoId(id);
+                        amountInfoMapper.insert(amountInfo);
+                    }
+                }
+                //清除专用发票信息
+                LambdaQueryWrapper<ZsReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                deleteInfo.eq(ZsReimbursementAmountInfo::getInfoId, dto.getId());
+                deleteInfo.ne(ZsReimbursementAmountInfo::getReimbursementType, "1");
+                amountInfoMapper.delete(deleteInfo);
+
+                // 保存电子发票附件列表信息
+                if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursementFiles())) {
+                    typeService.saveFiles(dto.getInvoiceReimbursementFiles(), userDTO, id,"invoiceReimbursement");
+                }
             }
         }
         // 保存附件列表信息
         if (CollectionUtils.isNotEmpty(dto.getFiles())) {
             typeService.saveFiles(dto.getFiles(), userDTO, id);
         }
-        return id;
+        return info;
     }
 
-    public String update(ZsSaveInfoDto dto, UserDTO userDTO) {
+    public ZsReimbursementInfo update(ZsSaveInfoDto dto, UserDTO userDTO) {
         // 修改基础信息
         ZsReimbursementInfo info = new ZsReimbursementInfo();
         BeanUtils.copyProperties(dto, info);
@@ -393,7 +438,64 @@ public class ZsReimbursementInfoService {
         LambdaQueryWrapper<ZsReimbursementAmountInfo> amountWrapper = new LambdaQueryWrapper<>();
         amountWrapper.eq(ZsReimbursementAmountInfo::getInfoId, dto.getId());
         amountInfoMapper.delete(amountWrapper);
-        if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
+        if(StringUtils.isNotBlank(dto.getReimbursementType())){
+            if("0".equals(dto.getReimbursementType())){
+                // 保存专用发票列表信息
+                if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
+                    for (ZsReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
+                        //普通报销 发票信息
+                        amountInfo.setReimbursementType("0");
+                        // 生成id
+                        String amountId = UUID.randomUUID().toString().replace("-", "");
+                        amountInfo.setId(amountId);
+                        amountInfo.setCreateById(userDTO.getId());
+                        amountInfo.setCreateTime(new Date());
+                        amountInfo.setUpdateById(userDTO.getId());
+                        amountInfo.setUpdateTime(new Date());
+                        amountInfo.setDelFlag(0);
+                        // 保存基础表信息主键值
+                        amountInfo.setInfoId(dto.getId());
+                        amountInfoMapper.insert(amountInfo);
+                    }
+                }
+                //清除电子发票信息
+                // 删除合同列表
+                LambdaQueryWrapper<ZsReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                deleteInfo.eq(ZsReimbursementAmountInfo::getInfoId, dto.getId());
+                deleteInfo.ne(ZsReimbursementAmountInfo::getReimbursementType, "0");
+                amountInfoMapper.delete(deleteInfo);
+            }else if("1".equals(dto.getReimbursementType())){
+                // 保存电子发票列表信息
+                if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursements())) {
+                    for (ZsReimbursementAmountInfo amountInfo : dto.getInvoiceReimbursements()) {
+                        //电子发票报销 发票信息
+                        amountInfo.setReimbursementType("1");
+                        // 生成id
+                        String amountId = UUID.randomUUID().toString().replace("-", "");
+                        amountInfo.setId(amountId);
+                        amountInfo.setCreateById(userDTO.getId());
+                        amountInfo.setCreateTime(new Date());
+                        amountInfo.setUpdateById(userDTO.getId());
+                        amountInfo.setUpdateTime(new Date());
+                        amountInfo.setDelFlag(0);
+                        // 保存基础表信息主键值
+                        amountInfo.setInfoId(dto.getId());
+                        amountInfoMapper.insert(amountInfo);
+                    }
+                }
+                //清除专用发票信息
+                LambdaQueryWrapper<ZsReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                deleteInfo.eq(ZsReimbursementAmountInfo::getInfoId, dto.getId());
+                deleteInfo.ne(ZsReimbursementAmountInfo::getReimbursementType, "1");
+                amountInfoMapper.delete(deleteInfo);
+
+                // 保存电子发票附件列表信息
+                if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursementFiles())) {
+                    typeService.updateFiles(dto.getInvoiceReimbursementFiles(), userDTO, dto.getId(),"invoiceReimbursement");
+                }
+            }
+        }
+        /*if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
             for (ZsReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
                 // 生成id
                 String amountId = UUID.randomUUID().toString().replace("-", "");
@@ -407,12 +509,12 @@ public class ZsReimbursementInfoService {
                 amountInfo.setInfoId(dto.getId());
                 amountInfoMapper.insert(amountInfo);
             }
-        }
+        }*/
         // 修改附件信息列表
         if (CollectionUtils.isNotEmpty(dto.getFiles())) {
             typeService.updateFiles(dto.getFiles(), userDTO, dto.getId());
         }
-        return dto.getId();
+        return info;
     }
 
     public String remove(String id) {
@@ -480,16 +582,31 @@ public class ZsReimbursementInfoService {
             // 查询专用发票信息列表
             LambdaQueryWrapper<ZsReimbursementAmountInfo> amountInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
             amountInfoLambdaQueryWrapper.eq(ZsReimbursementAmountInfo::getInfoId, id);
+            amountInfoLambdaQueryWrapper.eq(ZsReimbursementAmountInfo::getReimbursementType, "0");
             List<ZsReimbursementAmountInfo> amountInfos = amountInfoMapper.selectList(amountInfoLambdaQueryWrapper);
             dto.setAmountInfos(amountInfos);
+            LambdaQueryWrapper<ZsReimbursementAmountInfo> invoiceReimbursementsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            invoiceReimbursementsLambdaQueryWrapper.eq(ZsReimbursementAmountInfo::getInfoId, id);
+            invoiceReimbursementsLambdaQueryWrapper.eq(ZsReimbursementAmountInfo::getReimbursementType, "1");
+            List<ZsReimbursementAmountInfo> invoiceReimbursements = amountInfoMapper.selectList(invoiceReimbursementsLambdaQueryWrapper);
+            dto.setInvoiceReimbursements(invoiceReimbursements);
             // 查询附件信息
-            List<WorkAttachmentInfo> files = infoMapper.findFiles(id);
-            if (CollectionUtils.isNotEmpty(files)) {
-                for (WorkAttachmentInfo i : files) {
+            List<WorkAttachmentInfo> fileList = infoMapper.findFiles(id);
+            List<WorkAttachmentInfo> files = com.google.common.collect.Lists.newArrayList();
+            List<WorkAttachmentInfo> invoiceReimbursementFiles = com.google.common.collect.Lists.newArrayList();
+
+            if (CollectionUtils.isNotEmpty(fileList)) {
+                for (WorkAttachmentInfo i : fileList) {
                     i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+                    if("invoiceReimbursement".equals(i.getAttachmentFlag())){
+                        invoiceReimbursementFiles.add(i);
+                    }else{
+                        files.add(i);
+                    }
                 }
             }
             dto.setFiles(files);
+            dto.setInvoiceReimbursementFiles(invoiceReimbursementFiles);
         }
         return dto;
     }
@@ -654,4 +771,20 @@ public class ZsReimbursementInfoService {
         return iPage;
     }
 
+    /**
+     * 根据发票号查询是否已经或正在报销
+     * @param invoiceNumber
+     * @return
+     */
+    public Integer getEffectiveDataByInvoiceNumber(String invoiceNumber, String id){
+        return infoMapper.getEffectiveDataByInvoiceNumber(invoiceNumber, id);
+    }
+
+    public List<ZsReimbursementAmountInfoDTO> getInvoiceReimbursementAmountList(List<String> idList) {
+        List<ZsReimbursementAmountInfoDTO> list = infoMapper.getInvoiceReimbursementAmountList(idList);
+
+
+        return list;
+    }
+
 }

+ 5 - 0
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/service/dto/ZsQueryListDto.java

@@ -55,4 +55,9 @@ public class ZsQueryListDto extends BaseEntity {
      * 报销类型
      */
     private String sourceType;
+
+    /**
+     * 报销类型(0:普通报销;1:电子发票报销)
+     */
+    private String reimbursementType;
 }

+ 114 - 0
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalInfo/service/dto/ZsReimbursementAmountInfoDTO.java

@@ -0,0 +1,114 @@
+package com.jeeplus.centrecareful.approvalInfo.service.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author: 徐滕
+ * @version: 2023-11-03 16:26
+ */
+@Data
+public class ZsReimbursementAmountInfoDTO extends BaseEntity {
+    /**
+     * 序号
+     */
+    @Excel(name = "序号", width = 6, orderNum = "1")
+    private Integer serialNumber;
+    /**
+     * 关联id
+     */
+    private String infoId;
+
+    /**
+     * 发票代码
+     */
+    private String code;
+
+    /**
+     * 发票编号
+     */
+    @Excel(name = "发票号号", width = 22, orderNum = "3")
+    private String number;
+
+    /**
+     * 金额
+     */
+    @Excel(name = "金额", width = 16, orderNum = "7")
+    private Double amount;
+
+    /**
+     * 税额
+     */
+    @Excel(name = "税额", width = 16, orderNum = "8")
+    private Double taxAmount;
+
+    /**
+     * 价税合计
+     */
+    @Excel(name = "合计", width = 16, orderNum = "9")
+    private Double count;
+
+    /**
+     * 报销类型(0:普通报销;1:电子发票报销)
+     */
+    private String reimbursementType;
+
+    /**
+     * 发票类型(01:增值税发票;02:普通发票)
+     */
+    private String invoiceType;
+
+    /**
+     * 发票项目名
+     */
+    @Excel(name = "项目名称", width = 30, orderNum = "6")
+    private String invoiceProjectName;
+
+    /**
+     * 开票时间
+     */
+    @Excel(name = "开票日期", width = 20, orderNum = "4")
+    private String invoiceDate;
+
+    /**
+     * 开票单位
+     */
+    @Excel(name = "开票单位", width = 30, orderNum = "5")
+    private String invoiceUnit;
+
+    /**
+     * 备注
+     */
+    @Excel(name = "备注", width = 30, orderNum = "12")
+    private String remarks;
+
+    /**
+     * 发票类型Str
+     */
+    @Excel(name = "发票类型", width = 20, orderNum = "2")
+    private String invoiceTypeStr;
+    private String officeName;
+
+    /**
+     * 报销人
+     */
+    @Excel(name = "报销人", width = 10, orderNum = "10")
+    private String reimbursementApplicantName;
+
+    /**
+     * 报销日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "报销日期", exportFormat="yyyy-MM-dd", width = 12, orderNum = "11")
+    private Date reimDate;
+
+    /**
+     * 报销状态
+     */
+    //@Excel(name = "报销状态", width = 30, orderNum = "12",dict = "status")
+    private String status;
+}

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

@@ -121,4 +121,9 @@ public class ZsRetureListDto {
      * 数据审核人
      */
     private List<String> auditUserIds;
+
+    /**
+     * 报销类型(0:普通报销;1:电子发票报销)
+     */
+    private String reimbursementType;
 }

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

@@ -70,8 +70,10 @@ public class ZsSaveInfoDto extends BaseEntity {
     private List<ZsReimbursementDetailInfoProcured> detailInfoProcured;
 
     private List<ZsReimbursementAmountInfo> amountInfos;
+    private List<ZsReimbursementAmountInfo> invoiceReimbursements;
 
     private List<WorkAttachmentInfo> files;
+    private List<WorkAttachmentInfo> invoiceReimbursementFiles;
 
     /**
      * 报销类型
@@ -86,5 +88,9 @@ public class ZsSaveInfoDto extends BaseEntity {
     private String purchaseId;
 
     private String departmentName;
+    /**
+     * 报销类型
+     */
+    private String reimbursementType;
 
 }

+ 100 - 0
jeeplus-modules/jeeplus-centrecareful/src/main/java/com/jeeplus/centrecareful/approvalType/service/ZsReimbursementTypeService.java

@@ -237,6 +237,66 @@ public class ZsReimbursementTypeService {
     }
 
     /**
+     * 修改附件信息
+     * @param list 待修改的附件列表
+     * @param userDTO 当前登录用户
+     * @param id 关联id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void updateFiles(List<WorkAttachmentInfo> list, UserDTO userDTO, String id, String attachmentFlag) {
+        int j = 1;
+        String names = new String();
+        //表中存在,但是传过来不存在,说明已删除,表中数据也要删除
+        for (WorkAttachmentInfo dto : list) {
+            names = names + "," +dto.getUrl();
+        }
+        //查询保存的附件信息
+        List<WorkAttachmentInfo> infoList = mapper.findList(id);
+        if (CollectionUtils.isNotEmpty(infoList)) {
+            for (WorkAttachmentInfo i : infoList) {
+                if (!names.contains(i.getUrl())) {
+//                    ossServiceMapper.deleteById(i.getId());
+                    SpringUtil.getBean ( IWorkAttachmentApi.class ).deleteById(i.getId());
+                }
+            }
+        }
+        //保存信息
+        for (WorkAttachmentInfo dto : list) {
+            //判断是否存在
+            Integer isExit = mapper.findIsExit(id, dto.getName());
+            if (isExit == 0) {
+                WorkAttachmentInfo i = new WorkAttachmentInfo();
+                //包含了url、size、name
+                i.setId(UUID.randomUUID().toString().replace("-", ""));
+//                i.getCreateBy().setId(userDTO.getId());
+                i.setCreateTime(new Date());
+//                i.getUpdateBy().setId(userDTO.getId());
+                i.setUpdateTime(new Date());
+                i.setDelFlag(0);
+                i.setUrl(dto.getUrl());
+                //文件类型处理
+                List<String> strings = Arrays.asList(dto.getName().split("\\."));
+                if (CollectionUtils.isNotEmpty(strings)) {
+                    i.setType(strings.get(1));
+                }
+                i.setAttachmentId(id);
+                i.setAttachmentName(dto.getName());
+                i.setAttachmentFlag(attachmentFlag);
+                i.setFileSize(dto.getSize());
+                i.setSort(j);
+                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);
+//                ossServiceMapper.insertWorkAttachment(i, userDTO);
+                j++;
+            }
+        }
+    }
+
+    /**
      * 保存附件信息
      * @param list 待保存的附件列表
      * @param userDTO 当前登录用户
@@ -275,4 +335,44 @@ public class ZsReimbursementTypeService {
             j++;
         }
     }
+
+    /**
+     * 保存附件信息
+     * @param list 待保存的附件列表
+     * @param userDTO 当前登录用户
+     * @param id 关联id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveFiles(List<WorkAttachmentInfo> list, UserDTO userDTO, String id, String attachmentFlag) {
+        int j = 1;
+        for (WorkAttachmentInfo dto : list) {
+            WorkAttachmentInfo i = new WorkAttachmentInfo();
+            //包含了url、size、name
+            i.setId(UUID.randomUUID().toString().replace("-", ""));
+//            i.getCreateBy().setId(userDTO.getId());
+            i.setCreateTime(new Date());
+//            i.getUpdateBy().setId(userDTO.getId());
+            i.setUpdateTime(new Date());
+            i.setDelFlag(0);
+            i.setUrl(dto.getUrl());
+            //文件类型处理
+            List<String> strings = Arrays.asList(dto.getName().split("\\."));
+            if (CollectionUtils.isNotEmpty(strings)) {
+                i.setType(strings.get(1));
+            }
+            i.setAttachmentId(id);
+            i.setAttachmentName(dto.getName());
+            i.setAttachmentFlag(attachmentFlag);
+            i.setFileSize(dto.getSize());
+            i.setSort(j);
+//            ossServiceMapper.insertWorkAttachment(i, userDTO);
+            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);
+            j++;
+        }
+    }
 }

+ 100 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/contractRegistration/service/ContractInfoService.java

@@ -685,6 +685,46 @@ public class ContractInfoService {
     }
 
     /**
+     * 保存附件信息
+     * @param list 待保存的附件列表
+     * @param userDTO 当前登录用户
+     * @param id 关联id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveFiles(List<WorkAttachmentInfo> list, UserDTO userDTO, String id, String attachmentFlag) {
+        int j = 1;
+        for (WorkAttachmentInfo dto : list) {
+            WorkAttachmentInfo i = new WorkAttachmentInfo();
+            //包含了url、size、name
+            i.setId(UUID.randomUUID().toString().replace("-", ""));
+//            i.getCreateBy().setId(userDTO.getId());
+            i.setCreateTime(new Date());
+//            i.getUpdateBy().setId(userDTO.getId());
+            i.setUpdateTime(new Date());
+            i.setDelFlag(0);
+            i.setUrl(dto.getUrl());
+            //文件类型处理
+            List<String> strings = Arrays.asList(dto.getName().split("\\."));
+            if (CollectionUtils.isNotEmpty(strings)) {
+                i.setType(strings.get(1));
+            }
+            i.setAttachmentId(id);
+            i.setAttachmentName(dto.getName());
+            i.setAttachmentFlag(attachmentFlag);
+            i.setFileSize(dto.getSize());
+            i.setSort(j);
+//            ossServiceMapper.insertWorkAttachment(i, userDTO);
+            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);
+            j++;
+        }
+    }
+
+    /**
      * 修改附件信息
      * @param list 待修改的附件列表
      * @param userDTO 当前登录用户
@@ -744,6 +784,66 @@ public class ContractInfoService {
         }
     }
 
+    /**
+     * 修改附件信息
+     * @param list 待修改的附件列表
+     * @param userDTO 当前登录用户
+     * @param id 关联id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void updateFiles(List<WorkAttachmentInfo> list, UserDTO userDTO, String id, String attachmentFlag) {
+        int j = 1;
+        String names = new String();
+        //表中存在,但是传过来不存在,说明已删除,表中数据也要删除
+        for (WorkAttachmentInfo dto : list) {
+            names = names + "," +dto.getUrl();
+        }
+        //查询保存的附件信息
+        List<WorkAttachmentInfo> infoList = mapper.findList(id);
+        if (CollectionUtils.isNotEmpty(infoList)) {
+            for (WorkAttachmentInfo i : infoList) {
+                if (!names.contains(i.getUrl())) {
+//                    ossServiceMapper.deleteById(i.getId());
+                    SpringUtil.getBean ( IWorkAttachmentApi.class ).deleteById(i.getId());
+                }
+            }
+        }
+        //保存信息
+        for (WorkAttachmentInfo dto : list) {
+            //判断是否存在
+            Integer isExit = mapper.findIsExit(id, dto.getName());
+            if (isExit == 0) {
+                WorkAttachmentInfo i = new WorkAttachmentInfo();
+                //包含了url、size、name
+                i.setId(UUID.randomUUID().toString().replace("-", ""));
+//                i.getCreateBy().setId(userDTO.getId());
+                i.setCreateTime(new Date());
+//                i.getUpdateBy().setId(userDTO.getId());
+                i.setUpdateTime(new Date());
+                i.setDelFlag(0);
+                i.setUrl(dto.getUrl());
+                //文件类型处理
+                List<String> strings = Arrays.asList(dto.getName().split("\\."));
+                if (CollectionUtils.isNotEmpty(strings)) {
+                    i.setType(strings.get(1));
+                }
+                i.setAttachmentId(id);
+                i.setAttachmentName(dto.getName());
+                i.setAttachmentFlag(attachmentFlag);
+                i.setFileSize(dto.getSize());
+                i.setSort(j);
+                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);
+//                ossServiceMapper.insertWorkAttachment(i, userDTO);
+                j++;
+            }
+        }
+    }
+
     public List<ContractInfo> getByClientId(String contractId, ContractInfo contractInfo){
         if (StringUtils.isNotBlank(contractId)) {
             CwWorkClientBase cwWorkClientBase = cwWorkClientService.getById(contractId);

+ 1 - 1
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/controller/CwFinanceInvoiceController.java

@@ -96,7 +96,7 @@ public class CwFinanceInvoiceController {
      * @return
      */
     @ApiLog("查询发票数据")
-    @PreAuthorize ("hasAnyAuthority('cw_finance:invoice:view','cw_finance:invoice:add','cw_finance:invoice:edit')")
+    //@PreAuthorize ("hasAnyAuthority('cw_finance:invoice:view','cw_finance:invoice:add','cw_finance:invoice:edit')")
     @GetMapping("queryById")
     public ResponseEntity queryById(@RequestParam("id") String id) {
         CwFinanceInvoiceDTO cwFinanceInvoiceDTO = cwFinanceInvoiceService.queryById ( id );

+ 6 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/CwFinanceInvoiceMapper.xml

@@ -419,6 +419,12 @@
         <if test="null != billingId and billingId != ''">
             billing_id = #{billingId},
         </if>
+        <if test="null != reportType and reportType != ''">
+            report_type = #{reportType},
+        </if>
+        <if test="null != actualDrawerEmailAddress and actualDrawerEmailAddress != ''">
+            actual_drawer_email_address = #{actualDrawerEmailAddress},
+        </if>
 
         remarks = #{remarks}
         where id = #{id}

+ 4 - 2
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/CwFinanceInvoiceDTO.java

@@ -342,8 +342,10 @@ public class CwFinanceInvoiceDTO extends BaseDTO {
      */
     private String actualDrawerEmailAddress;
 
-
-
+    /**
+     * 单选类型确认
+     */
+    private String checkType;
 
 
 

+ 2 - 2
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/controller/CwProjectRecordsController.java

@@ -228,8 +228,8 @@ public class CwProjectRecordsController {
      */
     @ApiOperation(value = "该项目下审计收费不为0的报告信息")
     @GetMapping(value = "/getReportByProjectId")
-    public ResponseEntity<List<CwProjectRecordsDTO>> getReportByProjectId(String id) throws Exception {
-        List<CwProjectRecordsDTO> reportList=  cwProjectRecordsService.getReportByProjectId(id);
+    public ResponseEntity<List<CwProjectRecordsDTO>> getReportByProjectId(String id,String projectId) throws Exception {
+        List<CwProjectRecordsDTO> reportList=  cwProjectRecordsService.getReportByProjectId(id,projectId);
         return ResponseEntity.ok(reportList);
     }
 

+ 1 - 1
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/CwProjectRecordsMapper.java

@@ -79,5 +79,5 @@ public interface CwProjectRecordsMapper extends BaseMapper<CwProjectRecords> {
 
     List<CwProjectRecordsDTO> getReportById(@Param("id") String id, @Param("cwProjectRecordsDTO") CwProjectRecordsDTO cwProjectRecordsDTO);
 
-    List<CwProjectRecordsDTO> getReportByProjectId(@Param("id") String id);
+    List<CwProjectRecordsDTO> getReportByProjectId(@Param("id") String id,@Param("projectId")String projectId);
 }

+ 19 - 13
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/xml/CwProjectRecordsMapper.xml

@@ -365,8 +365,9 @@
     </delete>
 
     <insert id="insertProjectClientInfoList">
-        <foreach collection="cwProjectClientInfoList" item="item" separator=";">
-            insert into cw_project_client_info(project_id,client_id) values(#{item.projectId},#{item.clientId})
+        INSERT INTO cw_project_client_info (project_id, client_id) VALUES
+        <foreach collection="cwProjectClientInfoList" item="item" separator=",">
+            (#{item.projectId}, #{item.clientId})
         </foreach>
     </insert>
 
@@ -506,17 +507,22 @@
     </select>
 
     <select id="getReportByProjectId" resultType="com.jeeplus.finance.projectRecords.service.dto.CwProjectRecordsDTO">
-        SELECT
-			  cpr.project_name,
-				prnl.report_no,
-				pr.audit_fees,
-				su.login_name,
-				pr.create_time
-        from cw_project_report pr
-        LEFT JOIN cw_project_report_new_line prnl on pr.id=prnl.report_id
-        LEFT JOIN cw_project_records cpr on pr.project_id=cpr.id
-        LEFT JOIN sys_user su on pr.create_by_id = su.id
-        WHERE pr.audit_fees >'0' and pr.project_id=#{id}
+        select
+        cpr.project_name,
+        prnl.report_no,
+        su.login_name,
+        pr.create_time,
+        pr.audit_money as "auditFees",
+        pr.report_id
+        from cw_project_report_archive pr
+        left join cw_project_report_new_line prnl on pr.report_id=prnl.report_id
+        left join cw_project_records cpr on pr.project_id=cpr.id
+        left join sys_user su on pr.create_by_id = su.id
+        <where>
+            pr.audit_money >'0'
+            and pr.project_id=#{projectId}
+            and pr.id != #{id}
+        </where>
     </select>
 
 

+ 2 - 2
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/CwProjectRecordsService.java

@@ -652,8 +652,8 @@ public class CwProjectRecordsService extends ServiceImpl<CwProjectRecordsMapper,
 
     }
 
-    public List<CwProjectRecordsDTO> getReportByProjectId(String id) {
-        List<CwProjectRecordsDTO> projectList=cwProjectRecordsMapper.getReportByProjectId(id);
+    public List<CwProjectRecordsDTO> getReportByProjectId(String id,String projectId) {
+        List<CwProjectRecordsDTO> projectList=cwProjectRecordsMapper.getReportByProjectId(id, projectId);
         return projectList;
     }
 }

+ 1 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/dto/CwProjectRecordsDTO.java

@@ -248,6 +248,7 @@ public class CwProjectRecordsDTO extends BaseDTO {
      */
     private String auditFees;
     private String loginName;
+    private String reportId;
 
 
 

+ 42 - 21
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReport/service/CwProjectReportReviewService.java

@@ -439,28 +439,49 @@ public class CwProjectReportReviewService extends ServiceImpl<CwProjectReportRev
         String documentNo = "";
         try {
             // 根据reportId查询 new_line数据
-            CwProjectInfoData byReportId = infoMapper.getByReportId(reportId);
+            CwProjectInfoData reportData = infoMapper.getByReportId(reportId);
             // 生成报告文号
-            documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( )).getCompanyDTO().getId(), CwProjectInfoData.BIZ_CODE,TokenProvider.getCurrentToken());
-            if(documentNo.contains("{replacement}")){
-                if(StringUtils.isNotBlank(byReportId.getReportType())){
-                    switch (byReportId.getReportType()){
-                        case "1":
-                            documentNo = documentNo.replace("{replacement}","基");
-                            break;
-                        case "2":
-                            documentNo = documentNo.replace("{replacement}","咨");
-                            break;
-                        case "3":
-                            documentNo = documentNo.replace("{replacement}","审");
-                            break;
-                        case "4":
-                            documentNo = documentNo.replace("{replacement}","验");
-                            break;
-                        case "5":
-                            documentNo = documentNo.replace("{replacement}","特");
-                            break;
-                    }
+            //获取当前登录人信息
+            UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+            String currentToken = TokenProvider.getCurrentToken();
+            if(StringUtils.isNotBlank(reportData.getReportType())) {
+                ReportNoDto projectReportByNumber = new ReportNoDto();
+                switch (reportData.getReportType()) {
+                    case "1":   //基字
+                        do{
+                            documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(userDTO.getCompanyDTO().getId(), CwProjectInfoData.BIZ_CODE,currentToken);
+                            //根据报告号查询诗剧苦中是否存在
+                            projectReportByNumber = mapper.getProjectReportByNumber(documentNo);
+                        }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
+                        break;
+                    case "2":   //咨字
+                        do{
+                            documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(userDTO.getCompanyDTO().getId(), CwProjectInfoData.CONSULT_BIZ_CODE,currentToken);
+                            //根据报告号查询诗剧苦中是否存在
+                            projectReportByNumber = mapper.getProjectReportByNumber(documentNo);
+                        }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
+                        break;
+                    case "3":   //审字
+                        do{
+                            documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(userDTO.getCompanyDTO().getId(), CwProjectInfoData.EXAMINE_BIZ_CODE,currentToken);
+                            //根据报告号查询诗剧苦中是否存在
+                            projectReportByNumber = mapper.getProjectReportByNumber(documentNo);
+                        }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
+                        break;
+                    case "4":   //验字
+                        do{
+                            documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(userDTO.getCompanyDTO().getId(), CwProjectInfoData.CHECK_BIZ_CODE,currentToken);
+                            //根据报告号查询诗剧苦中是否存在
+                            projectReportByNumber = mapper.getProjectReportByNumber(documentNo);
+                        }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
+                        break;
+                    case "5":   //特字
+                        do{
+                            documentNo = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNumNoSort(userDTO.getCompanyDTO().getId(), CwProjectInfoData.SPECIAL_BIZ_CODE,currentToken);
+                            //根据报告号查询诗剧苦中是否存在
+                            projectReportByNumber = mapper.getProjectReportByNumber(documentNo);
+                        }while (null != projectReportByNumber && StringUtils.isNotBlank(projectReportByNumber.getReportNo()));
+                        break;
                 }
             }
         } catch (Exception e) {

+ 11 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReportArchive/controller/CwProjectReportArchiveController.java

@@ -178,4 +178,15 @@ public class CwProjectReportArchiveController {
 
     }
 
+    /**
+     * 查询暂时未归档报告归档数据
+     */
+    @ApiLog(value = "查询暂时未归档报告归档数据")
+    @GetMapping("getNotFiledYetList")
+    @ApiOperation(value = "查询暂时未归档报告归档数据")
+    public void getNotFiledYetList(){
+        CwProjectReportArchiveDTO cwProjectReportArchiveDTO = new CwProjectReportArchiveDTO();
+        cwProjectReportArchiveService.getNotFiledYetList(cwProjectReportArchiveDTO);
+    }
+
 }

+ 9 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReportArchive/domain/CwProjectReportArchive.java

@@ -106,6 +106,15 @@ public class CwProjectReportArchive extends BaseEntity {
      */
     private String auditMoney;
 
+    /**
+     * 关联报告号id
+     */
+    private String connectReportId;
+    /**
+     * 借用状态
+     */
+    private String borrowType;
+
 
     private static final long serialVersionUID = 1L;
 }

+ 9 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReportArchive/mapper/CwProjectReportArchiveMapper.java

@@ -49,6 +49,15 @@ public interface CwProjectReportArchiveMapper extends BaseMapper<CwProjectReport
     void updateInfoById(CwProjectReportArchive cwProjectReportArchive);
 
     void updateAuditMoneyByReportId(CwProjectReportArchive cwProjectReportArchive);
+
+    /**
+     * 查询暂时未归档报告归档数据
+     * @param queryWrapper
+     * @return
+     */
+    @InterceptorIgnore(tenantLine = "true")
+    List<CwProjectReportArchiveDTO> getNotFiledYetList (@Param(Constants.WRAPPER) QueryWrapper<CwProjectReportArchive> queryWrapper);
+
 }
 
 

+ 50 - 3
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReportArchive/mapper/xml/CwProjectReportArchiveMapper.xml

@@ -111,7 +111,9 @@
         cw_pa.file_number,
         cw_pa.report_id,
         cw_pa.report_remarks,
-        cw_pa.audit_money
+        cw_pa.audit_money,
+        cw_pa.connect_report_id,
+        cw_pa.borrow_type
     </sql>
     <sql id="Archive_File_Column_List">
         cw_paf.id,
@@ -237,7 +239,6 @@
         cw_prnl.report_no,
         date_format(cw_prnl.report_date,'%Y-%m-%d') as report_date,
         art.ID_ as task_id,
-        crb.borrow_type,
         crb.create_by_id as borrowUserId,
         crb.proc_ins_id as procInsId2,
         (case when cw_pa.audit_date is null then timestampdiff(day,cw_prnl.report_date,now()) when cw_pa.audit_date is not null then timestampdiff(day,cw_prnl.report_date,cw_pa.audit_date) end) as archiveDay
@@ -294,8 +295,10 @@
         b.report_create_name,
         b.signature_annotator1_name,
         b.signature_annotator2_name,
-        b.report_no
+        b.report_no,
+        prnl.report_no as "connectReport"
         from cw_project_report_archive cw_pa
+        left join cw_project_report_new_line prnl on cw_pa.connect_report_id=prnl.report_id
         left join cw_work_client_base cw_wcb on cw_pa.audited_units = cw_wcb.id and cw_wcb.del_flag = '0'
         left join sys_user su on su.id = cw_pa.create_by_id and su.del_flag = '0'
         left join(
@@ -431,6 +434,12 @@
         <if test="auditMoney != null and auditMoney != ''">
             audit_money = #{auditMoney},
         </if>
+        <if test="connectReportId != null and connectReportId != ''">
+            connect_report_id = #{connectReportId},
+        </if>
+        <if test="borrowType != null and borrowType != ''">
+            borrowType = #{borrowType},
+        </if>
         update_by_id = #{updateById},
         update_time = #{updateTime}
         where id = #{id} ;
@@ -442,4 +451,42 @@
     <update id="updateAuditMoneyByReportId">
         UPDATE cw_project_report_archive SET `audit_money` = #{auditMoney} WHERE del_flag = 0 AND report_id = #{reportId}
     </update>
+
+    <select id="getNotFiledYetList" resultMap="BaseResultMap">
+        select
+        DISTINCT
+        <include refid="Base_Column_List"></include>,
+        cw_wcb.name as audited_units_name,
+        su.name as user_name,
+        su1.name as project_master_name,
+        cw_pr.project_name as project_name,
+        cw_prnl.report_no,
+        date_format(cw_prnl.report_date,'%Y-%m-%d') as report_date,
+        art.ID_ as task_id,
+        crb.borrow_type,
+        crb.create_by_id as borrowUserId,
+        crb.proc_ins_id as procInsId2,
+        cprr.proc_ins_id as cprrProcInsId,
+        cprr.process_definition_id as cprrProcDefId,
+        (case when cw_pa.audit_date is null then timestampdiff(day,cw_prnl.report_date,now()) when cw_pa.audit_date is not null then timestampdiff(day,cw_prnl.report_date,cw_pa.audit_date) end) as archiveDay
+        from cw_project_report_archive cw_pa
+        left join cw_project_report_borrow crb on crb.archive_id = cw_pa.id and crb.del_flag = '0'
+        left join cw_work_client_base cw_wcb on cw_pa.audited_units = cw_wcb.id and cw_wcb.del_flag = '0'
+        left join sys_user su on su.id = cw_pa.create_by_id and su.del_flag = '0'
+        left join sys_office so on so.id = su.office_id and so.del_flag ='0'
+        left join cw_project_records cw_pr on cw_pr.id = cw_pa.project_id and cw_pr.del_flag = '0'
+        left join sys_user su1 on cw_pr.project_master_id = su1.id and su1.del_flag = '0'
+        left join cw_project_report_new_line cw_prnl on cw_prnl.report_id = cw_pa.report_id and cw_prnl.del_flag = '0'
+        left join cw_project_report_review cprr on cprr.report_id = cw_prnl.report_id
+        left join cw_project_members cpm on cw_pr.id = cpm.project_id
+        left join sys_user sub on cpm.user_id = sub.id
+        left join sys_user_manage_office sumo on sumo.office_id = sub.office_id
+
+        left join act_ru_task art ON cw_pa.proc_ins_id = art.PROC_INST_ID_
+
+        ${ew.customSqlSegment}
+        and cw_prnl.report_number is not null and cw_prnl.report_date is not null
+        and cw_pa.audit_date is null and timestampdiff(day,cw_prnl.report_date,now()) &lt;= 60
+        ORDER BY cw_pa.create_time DESC
+    </select>
 </mapper>

+ 57 - 4
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReportArchive/service/CwProjectReportArchiveService.java

@@ -49,10 +49,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.text.SimpleDateFormat;
+import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
@@ -372,6 +370,9 @@ public class CwProjectReportArchiveService extends ServiceImpl<CwProjectReportAr
             }
             cwProjectReportArchive.setAuditMoney(cwProjectReportArchiveDTO.getAuditMoney());
         }
+        if(StringUtils.isNotBlank(cwProjectReportArchiveDTO.getConnectReportId())){
+            cwProjectReportArchive.setConnectReportId(cwProjectReportArchiveDTO.getConnectReportId());
+        }
         if(StringUtils.isNotBlank(cwProjectReportArchive.getId())){ //修改
             cwProjectReportArchiveMapper.updateInfoById(cwProjectReportArchive);
         }else{  //新增
@@ -446,4 +447,56 @@ public class CwProjectReportArchiveService extends ServiceImpl<CwProjectReportAr
         this.update(cwProjectReportArchive, new QueryWrapper<CwProjectReportArchive>().lambda().eq(CwProjectReportArchive::getId, cwProjectReportArchive.getId()));
         return "操作成功";
     }
+
+    /**
+     * 查询暂时未归档报告归档数据
+     * @param cwProjectReportArchiveDTO
+     * @return
+     * @throws Exception
+     */
+    public void getNotFiledYetList(CwProjectReportArchiveDTO cwProjectReportArchiveDTO) {
+        try {
+            QueryWrapper<CwProjectReportArchive> queryWrapper = QueryWrapperGenerator.buildQueryCondition ( CwProjectReportArchiveWrapper.INSTANCE.toEntity(cwProjectReportArchiveDTO), CwProjectReportArchive.class );
+            queryWrapper.eq("cw_pa.del_flag","0");
+
+            List<CwProjectReportArchiveDTO> list = cwProjectReportArchiveMapper.getNotFiledYetList(queryWrapper);
+            //循环查询出来的数据
+            for (CwProjectReportArchiveDTO info : list) {
+                //如果归档日期为空,则表示该报告还未归档
+                if(null == info.getAuditDate()){
+                    //如果归档日期差大于60天,表示超期未归档
+                    if(info.getArchiveDay()<=60){
+                        int restultDay = 60 - info.getArchiveDay();
+
+                        switch (restultDay){
+                            case 7:
+                            case 14:
+                                //获取报告创建人信息(根据id)
+                                UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getById(info.getCreateBy().getId());
+
+                                String titleName =userDTO.getName() +  " 的报告文号 " + info.getReportNo() + " 还有" + restultDay + "天归档超期,请及时归档";
+                                String actName = "报告归档超期提醒";
+                                Map<String,String> map = new HashMap<String,String>();
+                                map.put("taskId",info.getCprrProcInsId());
+                                map.put("title",titleName);
+                                map.put("defId",info.getCprrProcDefId());
+                                map.put("taskName",actName);
+                                map.put("createUser","管理员");
+
+                                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                                String nowStr = format.format(new Date());
+                                map.put("createTime",nowStr);
+                                map.put("noticeName",userDTO.getName());
+                                map.put("noticeId",userDTO.getId());
+                                map.put("createById",userDTO.getId());
+                                SpringUtil.getBean(IFlowableApi.class).add(map);
+                                break;
+                        }
+                    }
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
 }

+ 44 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectReportArchive/service/dto/CwProjectReportArchiveDTO.java

@@ -251,6 +251,26 @@ public class CwProjectReportArchiveDTO extends BaseDTO {
      */
     private String auditMoney;
 
+    /**
+     * 关联的报告号
+     */
+    private String connectReport;
+    /**
+     * 关联的报告号id
+     */
+    private String connectReportId;
+
+
+    /**
+     * 报告复核流程id
+     */
+    private String cprrProcInsId;
+
+    /**
+     * 报告复核流程id
+     */
+    private String cprrProcDefId;
+
 
     private static final long serialVersionUID = 1L;
 
@@ -597,4 +617,28 @@ public class CwProjectReportArchiveDTO extends BaseDTO {
     public List<String> getAuditUserIds() {
         return auditUserIds;
     }
+
+    public String getCprrProcInsId() {
+        return cprrProcInsId;
+    }
+
+    public void setCprrProcInsId(String cprrProcInsId) {
+        this.cprrProcInsId = cprrProcInsId;
+    }
+
+    public String getCprrProcDefId() {
+        return cprrProcDefId;
+    }
+
+    public void setCprrProcDefId(String cprrProcDefId) {
+        this.cprrProcDefId = cprrProcDefId;
+    }
+
+    public String getConnectReport() {
+        return connectReport;
+    }
+
+    public void setConnectReport(String connectReport) {
+        this.connectReport = connectReport;
+    }
 }

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

@@ -2,6 +2,7 @@ package com.jeeplus.finance.reimbursementApproval.approvalInfo.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.common.collect.Lists;
 import com.jeeplus.common.excel.ExcelOptions;
 import com.jeeplus.common.excel.annotation.ExportMode;
 import com.jeeplus.common.utils.ResponseUtil;
@@ -23,7 +24,9 @@ import org.springframework.http.ResponseEntity;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -172,6 +175,44 @@ public class CwReimbursementInfoController {
 
     }
 
+    @ApiLog(value = "财务电子发票报销数据")
+    @GetMapping("exportInvoiceReimbursementFile")
+    @ApiOperation(value = "财务电子发票报销数据")
+    public void exportInvoiceReimbursementFile(QueryListDto cwDTO, Page <RetureListDto> page, ExcelOptions options, HttpServletResponse response) throws Exception {
+        String fileName = "财务电子发票报销数据表";
+        String sheetName = "财务电子发票报销列表";
+        List<RetureListDto> result = new ArrayList<>();
+        if ( com.jeeplus.common.excel.ExportMode.current.equals ( options.getMode() ) ) {
+            result = service.list (page,cwDTO).getRecords();
+        } else if (com.jeeplus.common.excel.ExportMode.selected.equals ( options.getMode() )) {
+            result = service.list (page,cwDTO).getRecords().stream ( ).filter ( item ->
+                    options.getSelectIds ( ).contains ( item.getId ( ) )
+            ).collect ( Collectors.toList ( ) );
+        } else {
+            page.setSize (-1);
+            page.setCurrent (0);
+            if(com.jeeplus.utils.StringUtils.isBlank(cwDTO.getReimbursementType())){
+                cwDTO.setReimbursementType("1");
+            }
+            result = service.list (page,cwDTO).getRecords();
+        }
+        List<String> idList = Lists.newArrayList();
+        for (RetureListDto listDto : result) {
+            idList.add(listDto.getId());
+        }
+        List<CwReimbursementAmountInfoDTO> invoiceReimbursementAmountList = Lists.newArrayList();
+        if(idList.size()>0){
+            invoiceReimbursementAmountList = service.getInvoiceReimbursementAmountList(idList);
+        }
+        for (int i = 1;i <=invoiceReimbursementAmountList.size();i ++){
+            CwReimbursementAmountInfoDTO reimbursementAmountInfoDTO = invoiceReimbursementAmountList.get(i - 1);
+            reimbursementAmountInfoDTO.setSerialNumber(i);
+        }
+
+        EasyPoiUtil.exportExcel ( invoiceReimbursementAmountList, sheetName,  sheetName, CwReimbursementAmountInfoDTO.class, fileName, response );
+
+    }
+
     @ApiOperation(value = "关联报销")
     @GetMapping(value = "/relationReimbursementList")
     public ResponseEntity<IPage<RetureListDto>> relationReimbursementList(Page<RetureListDto> page, @RequestParam("id") String id) {
@@ -186,4 +227,22 @@ public class CwReimbursementInfoController {
         return ResponseEntity.ok(cwProjectRecords);
     }
 
+    /**
+     * 根据发票号查询是否已经或正在报销
+     * @return
+     */
+    @ApiLog(value = "根据发票号查询是否已经或正在报销")
+    @GetMapping("getEffectiveDataByInvoiceNumber")
+    @ApiOperation(value = "根据发票号查询是否已经或正在报销")
+    public Map<String,Object> getEffectiveDataByInvoiceNumber(String invoiceNumber,String id){
+        Map map = new HashMap();
+        Integer count = service.getEffectiveDataByInvoiceNumber(invoiceNumber,id);
+        if(count>0){
+            map.put("success",false);
+            map.put("message","发票号:" + invoiceNumber + " 已发起或完成报销,请勿重复报销");
+        }else{
+            map.put("success",true);
+        }
+        return map;
+    }
 }

+ 30 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/domain/CwReimbursementAmountInfo.java

@@ -42,4 +42,34 @@ public class CwReimbursementAmountInfo extends BaseEntity {
      * 价税合计
      */
     private String count;
+
+    /**
+     * 报销类型(0:普通报销;1:电子发票报销)
+     */
+    private String reimbursementType;
+
+    /**
+     * 发票类型(01:增值税发票;02:普通发票)
+     */
+    private String invoiceType;
+
+    /**
+     * 发票项目名
+     */
+    private String invoiceProjectName;
+
+    /**
+     * 开票时间
+     */
+    private String invoiceDate;
+
+    /**
+     * 开票单位
+     */
+    private String invoiceUnit;
+
+    /**
+     * 备注
+     */
+    private String remarks;
 }

+ 4 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/domain/CwReimbursementInfo.java

@@ -70,5 +70,9 @@ public class CwReimbursementInfo extends BaseEntity {
     private String sourceType;
 
     private String purchaseId;
+    /**
+     * 报销类型
+     */
+    private String reimbursementType;
 
 }

+ 11 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/mapper/CwReimbursementInfoMapper.java

@@ -7,6 +7,7 @@ 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.reimbursementApproval.approvalInfo.domain.*;
+import com.jeeplus.finance.reimbursementApproval.approvalInfo.service.dto.CwReimbursementAmountInfoDTO;
 import com.jeeplus.finance.reimbursementApproval.approvalInfo.service.dto.ReportNoDto;
 import com.jeeplus.finance.reimbursementApproval.approvalInfo.service.dto.RetureListDto;
 import com.jeeplus.finance.reimbursementApproval.approvalInfo.service.dto.TreeUserDto;
@@ -52,4 +53,14 @@ public interface CwReimbursementInfoMapper extends BaseMapper<CwReimbursementInf
     List<CwReimbursementDetailInfoProcured> getProcuredDetailList(@Param("id") String id);
 
     List<CwReimbursementDetailInfo> getDetailList(@Param("id") String id);
+
+    /**
+     * 根据发票号查询是否已经或正在报销
+     * @param invoiceNumber
+     * @return
+     */
+    Integer getEffectiveDataByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber, @Param("id") String id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<CwReimbursementAmountInfoDTO> getInvoiceReimbursementAmountList(@Param("idList") List<String> idList);
 }

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

@@ -69,6 +69,7 @@
 			a.create_by_id as create_id,
 			a.source_type,
 			a.purchase_id,
+			a.reimbursement_type,
 			pru.purchase_no
 		FROM
 			cw_reimbursement_info a
@@ -115,6 +116,7 @@
 			url,
 			attachment_name AS `name`,
 			create_by_id AS `by`,
+			attachment_flag AS `attachmentFlag`,
 			create_time
 		FROM
 			work_attachment
@@ -544,4 +546,59 @@
 		where a.del_flag = '0' and a.info_id = #{id}
 		order by a.number asc
 	</select>
+
+	<select id="getEffectiveDataByInvoiceNumber" resultType="java.lang.Integer">
+		select count(a.id) as count from cw_reimbursement_amount_info a
+		left join cw_reimbursement_info ri on ri.id = a.info_id
+		<where>
+			a.number = #{invoiceNumber} and a.del_flag = 0
+			<if test="id != null and id != ''">
+				and a.info_id != #{id}
+			</if>
+			and ri.del_flag = 0
+		</where>
+	</select>
+
+	<select id="getInvoiceReimbursementAmountList" resultType="com.jeeplus.finance.reimbursementApproval.approvalInfo.service.dto.CwReimbursementAmountInfoDTO">
+		select
+		a.id,
+		a.create_by_id,
+		a.create_time,
+		a.update_by_id,
+		a.update_time,
+		a.del_flag,
+		a.info_id,
+		a.code,
+		a.number,
+		a.amount,
+		a.tax_amount,
+		a.count,
+		a.tenant_id,
+		a.reimbursement_type,
+		a.invoice_type,
+		a.invoice_project_name,
+		date_format(a.invoice_date,'%Y-%m-%d %h:%i:%s') as 'invoiceDate',
+		a.invoice_date,
+		a.invoice_unit,
+		a.remarks,
+		ri.type as "status",
+		date_format(ri.reim_date,'%Y-%m-%d') as 'reimDate',
+		su.name as "reimbursementApplicantName",
+		so.name as "officeName",
+		sdv.label as "invoiceTypeStr"
+		from
+		cw_reimbursement_amount_info a
+		left join cw_reimbursement_info ri on ri.id = a.info_id
+		left join sys_user su on su.id = ri.create_by_id
+		left join sys_office so on so.id = su.office_id
+		left join sys_dict_value sdv on sdv.value = a.invoice_type
+		left join sys_dict_type sdt on sdt.id = sdv.dict_type_id and sdt.type = 'invoice_reimbursement_type'
+		<where>
+			a.del_flag = 0
+			and a.info_id in
+			<foreach collection="idList" item="id" index="index" open="(" close=")" separator=",">
+				#{id}
+			</foreach>
+		</where>
+	</select>
 </mapper>

+ 155 - 19
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursementApproval/approvalInfo/service/CwReimbursementInfoService.java

@@ -187,6 +187,11 @@ public class CwReimbursementInfoService {
             queryWrapper.eq("a.source_type", dto.getSourceType());
         }
 
+        // 报销项状态
+        if (com.jeeplus.utils.StringUtils.isNotEmpty(dto.getReimbursementType())) {
+            queryWrapper.eq("a.reimbursement_type", dto.getReimbursementType());
+        }
+
         // 如果当前用户是部门主任,则可以查看部门所有的项目、自己创建的项目以及所属项目组的项目
         // 如果当前用户是员工,则可以查看自己创建的项目以及所属项目组的项目
         StringBuilder officeIds = new StringBuilder();
@@ -326,20 +331,61 @@ public class CwReimbursementInfoService {
                 cwReimbursementDetailInfoProcuredMapper.insert(detailInfo);
             }
         }
-        // 保存专用发票列表信息
-        if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
-            for (CwReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
-                // 生成id
-                String amountId = UUID.randomUUID().toString().replace("-", "");
-                amountInfo.setId(amountId);
-                amountInfo.setCreateById(userDTO.getId());
-                amountInfo.setCreateTime(new Date());
-                amountInfo.setUpdateById(userDTO.getId());
-                amountInfo.setUpdateTime(new Date());
-                amountInfo.setDelFlag(0);
-                // 保存基础表信息主键值
-                amountInfo.setInfoId(id);
-                amountInfoMapper.insert(amountInfo);
+        if(StringUtils.isNotBlank(dto.getReimbursementType())){
+            if("0".equals(dto.getReimbursementType())){
+                // 保存专用发票列表信息
+                if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
+                    for (CwReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
+                        //普通报销 发票信息
+                        amountInfo.setReimbursementType("0");
+                        // 生成id
+                        String amountId = UUID.randomUUID().toString().replace("-", "");
+                        amountInfo.setId(amountId);
+                        amountInfo.setCreateById(userDTO.getId());
+                        amountInfo.setCreateTime(new Date());
+                        amountInfo.setUpdateById(userDTO.getId());
+                        amountInfo.setUpdateTime(new Date());
+                        amountInfo.setDelFlag(0);
+                        // 保存基础表信息主键值
+                        amountInfo.setInfoId(id);
+                        amountInfoMapper.insert(amountInfo);
+                    }
+                }
+                //清除电子发票信息
+                // 删除合同列表
+                LambdaQueryWrapper<CwReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                deleteInfo.eq(CwReimbursementAmountInfo::getInfoId, dto.getId());
+                deleteInfo.ne(CwReimbursementAmountInfo::getReimbursementType, "0");
+                amountInfoMapper.delete(deleteInfo);
+            }else if("1".equals(dto.getReimbursementType())){
+                // 保存电子发票列表信息
+                if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursements())) {
+                    for (CwReimbursementAmountInfo amountInfo : dto.getInvoiceReimbursements()) {
+                        //电子发票报销 发票信息
+                        amountInfo.setReimbursementType("1");
+                        // 生成id
+                        String amountId = UUID.randomUUID().toString().replace("-", "");
+                        amountInfo.setId(amountId);
+                        amountInfo.setCreateById(userDTO.getId());
+                        amountInfo.setCreateTime(new Date());
+                        amountInfo.setUpdateById(userDTO.getId());
+                        amountInfo.setUpdateTime(new Date());
+                        amountInfo.setDelFlag(0);
+                        // 保存基础表信息主键值
+                        amountInfo.setInfoId(id);
+                        amountInfoMapper.insert(amountInfo);
+                    }
+                }
+                //清除专用发票信息
+                LambdaQueryWrapper<CwReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                deleteInfo.eq(CwReimbursementAmountInfo::getInfoId, dto.getId());
+                deleteInfo.ne(CwReimbursementAmountInfo::getReimbursementType, "1");
+                amountInfoMapper.delete(deleteInfo);
+
+                // 保存电子发票附件列表信息
+                if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursementFiles())) {
+                    infoService.saveFiles(dto.getInvoiceReimbursementFiles(), userDTO, id,"invoiceReimbursement");
+                }
             }
         }
         // 保存附件列表信息
@@ -428,7 +474,65 @@ public class CwReimbursementInfoService {
         LambdaQueryWrapper<CwReimbursementAmountInfo> amountWrapper = new LambdaQueryWrapper<>();
         amountWrapper.eq(CwReimbursementAmountInfo::getInfoId, dto.getId());
         amountInfoMapper.delete(amountWrapper);
-        if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
+        if(StringUtils.isNotBlank(dto.getReimbursementType())){
+            if("0".equals(dto.getReimbursementType())){
+                // 保存专用发票列表信息
+                if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
+                    for (CwReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
+                        //普通报销 发票信息
+                        amountInfo.setReimbursementType("0");
+                        // 生成id
+                        String amountId = UUID.randomUUID().toString().replace("-", "");
+                        amountInfo.setId(amountId);
+                        amountInfo.setCreateById(userDTO.getId());
+                        amountInfo.setCreateTime(new Date());
+                        amountInfo.setUpdateById(userDTO.getId());
+                        amountInfo.setUpdateTime(new Date());
+                        amountInfo.setDelFlag(0);
+                        // 保存基础表信息主键值
+                        amountInfo.setInfoId(dto.getId());
+                        amountInfoMapper.insert(amountInfo);
+                    }
+                }
+                //清除电子发票信息
+                // 删除合同列表
+                LambdaQueryWrapper<CwReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                deleteInfo.eq(CwReimbursementAmountInfo::getInfoId, dto.getId());
+                deleteInfo.ne(CwReimbursementAmountInfo::getReimbursementType, "0");
+                amountInfoMapper.delete(deleteInfo);
+            }else if("1".equals(dto.getReimbursementType())){
+                // 保存电子发票列表信息
+                if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursements())) {
+                    for (CwReimbursementAmountInfo amountInfo : dto.getInvoiceReimbursements()) {
+                        //电子发票报销 发票信息
+                        amountInfo.setReimbursementType("1");
+                        // 生成id
+                        String amountId = UUID.randomUUID().toString().replace("-", "");
+                        amountInfo.setId(amountId);
+                        amountInfo.setCreateById(userDTO.getId());
+                        amountInfo.setCreateTime(new Date());
+                        amountInfo.setUpdateById(userDTO.getId());
+                        amountInfo.setUpdateTime(new Date());
+                        amountInfo.setDelFlag(0);
+                        // 保存基础表信息主键值
+                        amountInfo.setInfoId(dto.getId());
+                        amountInfoMapper.insert(amountInfo);
+                    }
+                }
+                //清除专用发票信息
+                LambdaQueryWrapper<CwReimbursementAmountInfo> deleteInfo = new LambdaQueryWrapper<>();
+                deleteInfo.eq(CwReimbursementAmountInfo::getInfoId, dto.getId());
+                deleteInfo.ne(CwReimbursementAmountInfo::getReimbursementType, "1");
+                amountInfoMapper.delete(deleteInfo);
+
+                // 保存电子发票附件列表信息
+                if (CollectionUtils.isNotEmpty(dto.getInvoiceReimbursementFiles())) {
+                    infoService.updateFiles(dto.getInvoiceReimbursementFiles(), userDTO, dto.getId(),"invoiceReimbursement");
+                }
+            }
+        }
+
+        /*if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
             for (CwReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
                 // 生成id
                 String amountId = UUID.randomUUID().toString().replace("-", "");
@@ -442,7 +546,7 @@ public class CwReimbursementInfoService {
                 amountInfo.setInfoId(dto.getId());
                 amountInfoMapper.insert(amountInfo);
             }
-        }
+        }*/
         // 修改附件信息列表
         if (CollectionUtils.isNotEmpty(dto.getFiles())) {
             infoService.updateFiles(dto.getFiles(), userDTO, dto.getId());
@@ -523,18 +627,34 @@ public class CwReimbursementInfoService {
             // 采购报销
             dto.setDetailInfoProcured(infoMapper.getProcuredDetailList(id));
             // 查询专用发票信息列表
+            // 查询专用发票信息列表
             LambdaQueryWrapper<CwReimbursementAmountInfo> amountInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
             amountInfoLambdaQueryWrapper.eq(CwReimbursementAmountInfo::getInfoId, id);
+            amountInfoLambdaQueryWrapper.eq(CwReimbursementAmountInfo::getReimbursementType, "0");
             List<CwReimbursementAmountInfo> amountInfos = amountInfoMapper.selectList(amountInfoLambdaQueryWrapper);
             dto.setAmountInfos(amountInfos);
+            LambdaQueryWrapper<CwReimbursementAmountInfo> invoiceReimbursementsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            invoiceReimbursementsLambdaQueryWrapper.eq(CwReimbursementAmountInfo::getInfoId, id);
+            invoiceReimbursementsLambdaQueryWrapper.eq(CwReimbursementAmountInfo::getReimbursementType, "1");
+            List<CwReimbursementAmountInfo> invoiceReimbursements = amountInfoMapper.selectList(invoiceReimbursementsLambdaQueryWrapper);
+            dto.setInvoiceReimbursements(invoiceReimbursements);
             // 查询附件信息
-            List<WorkAttachmentInfo> files = infoMapper.findFiles(id);
-            if (CollectionUtils.isNotEmpty(files)) {
-                for (WorkAttachmentInfo i : files) {
+            List<WorkAttachmentInfo> fileList = infoMapper.findFiles(id);
+            List<WorkAttachmentInfo> files = com.google.common.collect.Lists.newArrayList();
+            List<WorkAttachmentInfo> invoiceReimbursementFiles = com.google.common.collect.Lists.newArrayList();
+
+            if (CollectionUtils.isNotEmpty(fileList)) {
+                for (WorkAttachmentInfo i : fileList) {
                     i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+                    if("invoiceReimbursement".equals(i.getAttachmentFlag())){
+                        invoiceReimbursementFiles.add(i);
+                    }else{
+                        files.add(i);
+                    }
                 }
             }
             dto.setFiles(files);
+            dto.setInvoiceReimbursementFiles(invoiceReimbursementFiles);
         }
         return dto;
     }
@@ -721,4 +841,20 @@ public class CwReimbursementInfoService {
         return list;
     }
 
+    /**
+     * 根据发票号查询是否已经或正在报销
+     * @param invoiceNumber
+     * @return
+     */
+    public Integer getEffectiveDataByInvoiceNumber(String invoiceNumber,String id){
+        return infoMapper.getEffectiveDataByInvoiceNumber(invoiceNumber,id);
+    }
+
+    public List<CwReimbursementAmountInfoDTO> getInvoiceReimbursementAmountList(List<String> idList) {
+        List<CwReimbursementAmountInfoDTO> list = infoMapper.getInvoiceReimbursementAmountList(idList);
+
+
+        return list;
+    }
+
 }

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

@@ -0,0 +1,114 @@
+package com.jeeplus.finance.reimbursementApproval.approvalInfo.service.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author: 徐滕
+ * @version: 2023-11-03 16:18
+ */
+@Data
+public class CwReimbursementAmountInfoDTO extends BaseEntity {
+    /**
+     * 序号
+     */
+    @Excel(name = "序号", width = 6, orderNum = "1")
+    private Integer serialNumber;
+    /**
+     * 关联id
+     */
+    private String infoId;
+
+    /**
+     * 发票代码
+     */
+    private String code;
+
+    /**
+     * 发票编号
+     */
+    @Excel(name = "发票号号", width = 22, orderNum = "3")
+    private String number;
+
+    /**
+     * 金额
+     */
+    @Excel(name = "金额", width = 16, orderNum = "7")
+    private Double amount;
+
+    /**
+     * 税额
+     */
+    @Excel(name = "税额", width = 16, orderNum = "8")
+    private Double taxAmount;
+
+    /**
+     * 价税合计
+     */
+    @Excel(name = "合计", width = 16, orderNum = "9")
+    private Double count;
+
+    /**
+     * 报销类型(0:普通报销;1:电子发票报销)
+     */
+    private String reimbursementType;
+
+    /**
+     * 发票类型(01:增值税发票;02:普通发票)
+     */
+    private String invoiceType;
+
+    /**
+     * 发票项目名
+     */
+    @Excel(name = "项目名称", width = 30, orderNum = "6")
+    private String invoiceProjectName;
+
+    /**
+     * 开票时间
+     */
+    @Excel(name = "开票日期", width = 20, orderNum = "4")
+    private String invoiceDate;
+
+    /**
+     * 开票单位
+     */
+    @Excel(name = "开票单位", width = 30, orderNum = "5")
+    private String invoiceUnit;
+
+    /**
+     * 备注
+     */
+    @Excel(name = "备注", width = 30, orderNum = "12")
+    private String remarks;
+
+    /**
+     * 发票类型Str
+     */
+    @Excel(name = "发票类型", width = 20, orderNum = "2")
+    private String invoiceTypeStr;
+    private String officeName;
+
+    /**
+     * 报销人
+     */
+    @Excel(name = "报销人", width = 10, orderNum = "10")
+    private String reimbursementApplicantName;
+
+    /**
+     * 报销日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "报销日期", exportFormat="yyyy-MM-dd", width = 12, orderNum = "11")
+    private Date reimDate;
+
+    /**
+     * 报销状态
+     */
+    //@Excel(name = "报销状态", width = 30, orderNum = "12",dict = "status")
+    private String status;
+}

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

@@ -55,4 +55,6 @@ public class QueryListDto extends BaseEntity {
      * 报销类型
      */
     private String sourceType;
+
+    private String reimbursementType;
 }

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

@@ -116,6 +116,10 @@ public class RetureListDto {
     private String purchaseNo;
 
     private String purchaseId;
+    /**
+     * 报销类型
+     */
+    private String reimbursementType;
 
     /**
      * 数据审核人  报销

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

@@ -70,8 +70,10 @@ public class SaveInfoDto extends BaseEntity {
     private List<CwReimbursementDetailInfoProcured> detailInfoProcured;
 
     private List<CwReimbursementAmountInfo> amountInfos;
+    private List<CwReimbursementAmountInfo> invoiceReimbursements;
 
     private List<WorkAttachmentInfo> files;
+    private List<WorkAttachmentInfo> invoiceReimbursementFiles; //电子发票报销
 
     /**
      * 报销类型
@@ -87,4 +89,7 @@ public class SaveInfoDto extends BaseEntity {
 
     private String departmentName;
 
+    // 报销类型(0:普通报销;1:电子发票报销)
+    private String reimbursementType;
+
 }

+ 10 - 0
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/controller/FlowableTaskController.java

@@ -715,17 +715,27 @@ public class FlowableTaskController {
 
     }
 
+
     @ApiOperation(value = "新增")
     @RequestMapping(value = "/add", method = RequestMethod.POST)
     public String add(@RequestBody Map<String ,String > map) throws Exception{
+        //taskId
         String taskId = map.get("taskId");
+        //标题
         String title = map.get("title");
+        //流程id
         String defId = map.get("defId");
+        //流程名称
         String taskName = map.get("taskName");
+        //创建人
         String createUser = map.get("createUser");
+        //创建时间
         String createTime = map.get("createTime");
+        //通知人名称
         String noticeName = map.get("noticeName");
+        //通知人id
         String noticeId = map.get("noticeId");
+        //创建人id
         String createById = map.get("createById");
         return noticeServicel.add(taskId, title, defId, taskName, createUser, createTime, noticeName, noticeId,createById);
     }

+ 2 - 2
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/controller/MyNoticeController.java

@@ -44,8 +44,8 @@ public class MyNoticeController {
 
     @ApiOperation(value = "修改已读状态")
     @GetMapping("/update")
-    public String update(String taskId, String noticeId) {
-        return service.update(taskId, noticeId);
+    public String update(String taskId, String noticeId,String taskName ) {
+        return service.update(taskId, noticeId,taskName);
     }
 
     @ApiOperation(value = "库存提醒修改已读状态")

+ 5 - 1
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/MyNoticeService.java

@@ -157,9 +157,13 @@ public class MyNoticeService {
         return "操作成功";
     }
 
-    public String update(String taskId, String noticeId) {
+    public String update(String taskId, String noticeId,String taskName) {
         LambdaQueryWrapper<MyNoticeList> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(BaseEntity::getDelFlag, 0).eq(MyNoticeList::getTaskId, taskId).eq(MyNoticeList::getNoticeName, noticeId).eq(MyNoticeList::getType, 0);
+        //如果流程名称不为空,则添加流程名称筛选项
+        if(StringUtils.isNotBlank(taskName)){
+            wrapper.eq(MyNoticeList::getTaskName,taskName);
+        }
         MyNoticeList one = mapper.selectInfo(wrapper);
         if (one != null) {
             one.setType("1");

+ 12 - 1
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/modules/flowable/listener/MyExecutionListener.java

@@ -6,6 +6,7 @@ import com.jeeplus.flowable.model.ActRuTaskInfo;
 import com.jeeplus.flowable.model.Flow;
 import com.jeeplus.flowable.service.FlowTaskService;
 import com.jeeplus.flowable.service.MyNoticeService;
+import com.jeeplus.flowable.utils.StringUtils;
 import com.jeeplus.sys.feign.IOfficeApi;
 import com.jeeplus.sys.feign.IUserApi;
 import com.jeeplus.sys.service.dto.OfficeDTO;
@@ -53,9 +54,19 @@ public class MyExecutionListener implements ExecutionListener {
 
                     // 查询流程实例的标题变量
                     Object title = SpringUtil.getBean(RuntimeService.class).getVariable(processInstance.getId(), titleVariableName);
+                    // 获取流程实例标题变量名(假设标题存储在名为"title"的变量中)
+                    String formTitleName = "formTitle";
+
+                    // 查询流程实例的标题变量
+                    Object formTitleNames = SpringUtil.getBean(RuntimeService.class).getVariable(processInstance.getId(), formTitleName);
+                    System.out.println(formTitleNames);
 
                     if (title != null) {
-                        titleName = title.toString();
+                        if(StringUtils.isBlank(title.toString())){
+                            titleName = actName;
+                        }else{
+                            titleName = title.toString();
+                        }
                     } else {
                         // 如果标题变量不存在或者没有值,可以返回默认标题
                         titleName = "";

+ 3 - 1
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/modules/flowable/listener/SZSignatureInformExecutionListener.java

@@ -73,7 +73,9 @@ public class SZSignatureInformExecutionListener implements ExecutionListener {
                 OfficeDTO officeDTO = userDTO.getOfficeDTO();
                 //如果是苏州分部发送的签章申请,则会给徐珊发送通知
                 if(null != officeDTO){
-                    OfficeDTO parentOffice = SpringUtil.getBean(IOfficeApi.class).getOfficeById(officeDTO.getParentId());
+                    //根据officeId获取office信息
+                    OfficeDTO officeById = SpringUtil.getBean(IOfficeApi.class).getOfficeById(officeDTO.getId());
+                    OfficeDTO parentOffice = SpringUtil.getBean(IOfficeApi.class).getOfficeById(officeById.getParentId());
                     //如果是苏州分部发送的签章申请,则会给徐珊发送通知
                     if(null != parentOffice && "苏州分公司".equals(parentOffice.getName())){
                         //获取角色为“苏州报告签字盖章代办”的角色对应人员信息

+ 1 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/service/HandoverService.java

@@ -323,6 +323,7 @@ public class HandoverService extends ServiceImpl<HandoverMapper, Handover> {
         report.setXmlFilePath(xmlFilePath);
 
 //        String pdfFilePath = convertToPDF(report);
+        //xml转word文档(不可复用)
         String wordPath = convertToWord(report);
 //        report.setPdfFilePath(pdfFilePath);
         report.setWordFilePath(wordPath);

+ 183 - 4
jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/oss/controller/OssFileController.java

@@ -5,7 +5,9 @@ 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.aop.demo.annotation.DemoMode;
 import com.jeeplus.common.TokenProvider;
+import com.jeeplus.flowable.feign.IFinanceApi;
 import com.jeeplus.logging.annotation.ApiLog;
 import com.jeeplus.pubmodules.oss.domain.WorkAttachment;
 import com.jeeplus.pubmodules.oss.service.OSSClientService;
@@ -14,6 +16,7 @@ import com.jeeplus.pubmodules.oss.service.dto.AttachmentDTO;
 import com.jeeplus.pubmodules.oss.service.dto.FileDetailDTO;
 import com.jeeplus.pubmodules.oss.service.dto.FileUrlDto;
 import com.jeeplus.pubmodules.oss.service.dto.WorkAttachmentDto;
+import com.jeeplus.pubmodules.oss.utils.FileUtil;
 import com.jeeplus.pubmodules.serialNumTpl.service.SerialnumTplService;
 import com.jeeplus.sys.domain.WorkAttachmentInfo;
 import com.jeeplus.sys.feign.IOfficeApi;
@@ -34,16 +37,19 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Slf4j
 @Api(tags ="oss")
@@ -430,4 +436,177 @@ public class OssFileController {
         List<WorkAttachment> list = JSON.parseObject(attachmentInfo, new TypeReference<List<WorkAttachment>>() {});
         ossService.saveMsg(list,currentToken);
     }
+
+
+    /**
+     * 解析xml文件附件信息(发票报销)
+     * @param file
+     * @return
+     */
+    @DemoMode
+    @PostMapping("/disposeXmlFile")
+    @ApiOperation(value = "解析xml文件附件信息(发票报销)")
+    public Map<String,Object> disposeXmlFile( MultipartFile file) {
+        Map<String,Object> map = new HashMap();
+        //创建DOM4J解析器对象
+        File newFile = null;
+        try {
+            //MultipartFile转File
+            newFile = FileUtil.transformMultipartFile(file);
+            // 创建一个 DocumentBuilderFactory
+            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+            // 使用工厂创建一个 DocumentBuilder
+            DocumentBuilder builder = factory.newDocumentBuilder();
+            // 使用 DocumentBuilder 解析 XML 文件
+            Document document = builder.parse(newFile);
+            // 获取所有header节点的集合
+            NodeList headerList = document.getElementsByTagName("Header");
+            // 获取所有eInvoiceDataList节点的集合
+            NodeList eInvoiceDataList = document.getElementsByTagName("EInvoiceData");
+            // 获取所有taxSupervisionInfo节点的集合
+            NodeList taxSupervisionInfoList = document.getElementsByTagName("TaxSupervisionInfo");
+
+            Map<String,String> map1 = xmlNodeListDataDispose(headerList, document);
+            Map<String,String> map2 = xmlNodeListDataDispose(eInvoiceDataList, document);
+            Map<String,String> map3 = xmlNodeListDataDispose(taxSupervisionInfoList, document);
+            map.putAll(map1);
+            map.putAll(map2);
+            map.putAll(map3);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }finally {
+            newFile.delete();
+        }
+        return map;
+    }
+
+    /**
+     * 下载附件
+     */
+    @PostMapping("/downLoadFileDisposeXmlFile")
+    @ApiOperation(value = "下载附件")
+    public Map<String,Object> downLoadFileDisposeXmlFile(@RequestParam String file) {
+        file = "http://oss.gangwaninfo.com" + file;
+        file = file.replace("amp;", "");
+        String fileName = file.substring(file.lastIndexOf("/") + 1, file.length());
+        String cons = "";
+        if (file.contains(aliyunUrl)) {
+            cons = aliyunUrl;
+        } else if (file.contains("http://gangwan-app.oss-cn-hangzhou.aliyuncs.com")) {
+            cons = "http://gangwan-app.oss-cn-hangzhou.aliyuncs.com";
+        } else {
+            cons = aliyunDownloadUrl;
+        }
+        String key = file.split(cons + "/")[1];
+        log.info("-----------------------------------------");
+        log.info("fileName=" + fileName);
+        log.info("key=" + key);
+        log.info("-----------------------------------------");
+
+        String path = null;
+        if(System.getProperty("os.name").toLowerCase().contains("win")){
+            path = "D:/attachment-file/";
+        }else{
+            path = "/attachment-file/";
+        }
+        ossClientService.downByStreamSaveLocal(key, fileName, path+fileName);
+
+        Map<String,Object> map = new HashMap();
+        //创建DOM4J解析器对象
+        File newFile = new File(path + fileName);
+        try {
+            //MultipartFile转File
+            //newFile = FileUtil.transformMultipartFile(file);
+            // 创建一个 DocumentBuilderFactory
+            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+            // 使用工厂创建一个 DocumentBuilder
+            DocumentBuilder builder = factory.newDocumentBuilder();
+            // 使用 DocumentBuilder 解析 XML 文件
+            Document document = builder.parse(newFile);
+            // 获取所有header节点的集合
+            NodeList headerList = document.getElementsByTagName("Header");
+            // 获取所有eInvoiceDataList节点的集合
+            NodeList eInvoiceDataList = document.getElementsByTagName("EInvoiceData");
+            // 获取所有taxSupervisionInfo节点的集合
+            NodeList taxSupervisionInfoList = document.getElementsByTagName("TaxSupervisionInfo");
+
+            Map<String,String> map1 = xmlNodeListDataDispose(headerList, document);
+            Map<String,String> map2 = xmlNodeListDataDispose(eInvoiceDataList, document);
+            Map<String,String> map3 = xmlNodeListDataDispose(taxSupervisionInfoList, document);
+            map.putAll(map1);
+            map.putAll(map2);
+            map.putAll(map3);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }finally {
+            newFile.delete();
+        }
+        return map;
+    }
+
+    /**
+     * 对节点集合进行遍历,并获取每个节点下的参数信息
+     * @param nodeList
+     * @param document
+     * @return
+     */
+    public Map<String,String> xmlNodeListDataDispose(NodeList nodeList,Document document){
+        Map<String,String> map = new HashMap<>();
+        if(null != nodeList && nodeList.getLength()>0){
+            //遍历每一个header节点
+            for (int i = 0; i < nodeList.getLength(); i++) {
+                //通过 item(i)方法 获取一个header节点,nodelist的索引值从0开始
+                Node header = nodeList.item(i);
+                //解析定义节点的子节点
+                NodeList childNodes = header.getChildNodes();
+                //节点数据处理
+                Map<String,String> map1 = xmlDataDispose(childNodes, document);
+                map.putAll(map1);
+            }
+        }
+        return map;
+    }
+
+    /**
+     * 子节点遍历获取参数,若其下还有子节点,则循环调用 xmlNodeListDataDispose 方法
+     * @param childNodes
+     * @param document
+     * @return
+     */
+    public Map<String,String> xmlDataDispose(NodeList childNodes,Document document){
+        Map<String,String> map = new HashMap<>();
+        for (int k = 0; k < childNodes.getLength(); k++) {
+            // 区分出text类型的node以及element类型的node
+            if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
+                Node firstChild = childNodes.item(k).getFirstChild();
+                if(null != firstChild){
+                    if(StringUtils.isBlank(childNodes.item(k).getFirstChild().getNodeValue())){
+                        // 获取所有header节点的集合
+                        NodeList childList = document.getElementsByTagName(childNodes.item(k).getNodeName());
+
+                        String parentName = childNodes.item(k).getNodeName();
+                        //循环调用,获取最低级节点数据信息
+                        Map<String,String> map1 = xmlNodeListDataDispose(childList, document);
+                        Map<String,String> map2 = new HashMap<>();
+                        if(map1.size()>0){
+                            //将获取到的数据进行遍历,添加父节点的参数信息,防止子节点key键相同,导致数据被覆盖
+                            for (String key : map1.keySet()) {
+                                map2.put(parentName + key,map1.get(key));
+                            }
+                        }
+                        map.putAll(map2);
+                    }
+                    //判定key 和value 值均存在,则进行储存,否则不进行储存
+                    if(StringUtils.isNotBlank(childNodes.item(k).getNodeName()) && StringUtils.isNotBlank(childNodes.item(k).getFirstChild().getNodeValue())){
+                        map.put(childNodes.item(k).getNodeName(),childNodes.item(k).getFirstChild().getNodeValue());
+                    }
+                }
+            }
+        }
+        return map;
+    }
+
+
 }

+ 53 - 0
jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/oss/utils/FileUtil.java

@@ -0,0 +1,53 @@
+package com.jeeplus.pubmodules.oss.utils;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+
+/**
+ * @author: 徐滕
+ * @version: 2023-10-30 10:43
+ */
+public class FileUtil {
+
+    /**
+     * MultipartFile转File
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    public static File transformMultipartFile(MultipartFile file) throws IOException {
+        File srcFile = null;
+        //MultipartFile转File
+        if (file.equals("") || file.getSize() <= 0) {
+            file = null;
+        } else {
+            InputStream ins = null;
+            ins = file.getInputStream();
+            srcFile = new File(file.getOriginalFilename());
+            inputStreamToFile(ins, srcFile);
+            ins.close();
+        }
+        return srcFile;
+    }
+
+    /**
+     * 获取流文件
+     * @param ins
+     * @param file
+     */
+    public static void inputStreamToFile(InputStream ins, File file) {
+        try {
+            OutputStream os = new FileOutputStream(file);
+            int bytesRead = 0;
+            byte[] buffer = new byte[8192];
+            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
+                os.write(buffer, 0, bytesRead);
+            }
+            os.close();
+            ins.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 8 - 2
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/UserService.java

@@ -11,6 +11,7 @@ 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.SecurityUtils;
 import com.jeeplus.common.TokenProvider;
 import com.jeeplus.common.constant.CacheNames;
@@ -485,8 +486,13 @@ public class UserService extends ServiceImpl <UserMapper, User> {
      */
     public IPage<UserDTO> findPage3(UserDTO userDTO) {
         Page<UserDTO> page = new Page<>();
-        List <UserDTO> list1 = baseMapper.findList3(userDTO.getOfficeDTO().getId(),userDTO.getLoginName());
-        page.setRecords(list1);
+        if(null != userDTO && null != userDTO.getOfficeDTO() && StringUtils.isNotBlank(userDTO.getOfficeDTO().getId())){
+            List <UserDTO> list1 = baseMapper.findList3(userDTO.getOfficeDTO().getId(),userDTO.getLoginName());
+            page.setRecords(list1);
+        }else{
+            List <UserDTO> list1 = Lists.newArrayList();
+            page.setRecords(list1);
+        }
         return page;
     }
 

+ 13 - 0
jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/feign/FinanceFeignApi.java

@@ -0,0 +1,13 @@
+package com.xxl.job.executor.feign;
+
+import com.jeeplus.common.constant.AppNameConstants;
+import com.jeeplus.flowable.feign.IFinanceApi;
+import org.springframework.cloud.openfeign.FeignClient;
+
+/**
+ * @author: 王强
+ * @create: 2023-07-27 08:48
+ **/
+@FeignClient(contextId = "financeFeignApi", name = AppNameConstants.APP_FINANCE_MODULES)
+public interface FinanceFeignApi extends IFinanceApi {
+}

+ 13 - 3
jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java

@@ -15,6 +15,7 @@ import com.jeeplus.sys.service.dto.UserDTO;
 import com.xxl.job.core.context.XxlJobHelper;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import com.xxl.job.executor.feign.AssessFeignApi;
+import com.xxl.job.executor.feign.FinanceFeignApi;
 import com.xxl.job.executor.feign.HumanFeignApi;
 import com.xxl.job.executor.feign.UserFeignApi;
 import org.apache.commons.lang3.StringUtils;
@@ -177,11 +178,10 @@ public class SampleXxlJob {
     }
 
     /**
-     * 1、简单任务示例(Bean模式)
+     * 1、评估项目超期定时任务
      */
     @XxlJob("projectArchiveTask")
-    public void projectArchiveTask() throws Exception {
-        System.out.println("进来了---");
+    public void projectArchiveTask() {
         String json = SpringUtil.getBean ( AssessFeignApi.class ).getOverdueFilingProjectList();
         List<ProgramProjectListInfo> projectList = JSON.parseObject(json, new TypeReference<List<ProgramProjectListInfo>>() {});
 
@@ -518,4 +518,14 @@ public class SampleXxlJob {
     }
 
 
+
+
+    /**
+     * 6、会计暂时未归档提醒定时任务
+     * 提前两周、一周分别进行一次提醒
+     */
+    @XxlJob("notFiledYetReportArchiveListTask")
+    public void notFiledYetReportArchiveListTask() {
+        SpringUtil.getBean ( FinanceFeignApi.class ).getNotFiledYetList();
+    }
 }

+ 174 - 0
jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/resources/META-INF/MANIFEST.MF

@@ -0,0 +1,174 @@
+Manifest-Version: 1.0
+Main-Class: 
+Class-Path: spring-cloud-alibaba-commons-2021.1.jar kotlin-stdlib-common
+ -1.4.31.jar flowable-entitylink-service-api-6.7.2.jar sentinel-reactor-
+ adapter-1.8.0.jar flowable-dmn-model-6.7.2.jar flowable-cmmn-converter-
+ 6.7.2.jar spring-data-commons-2.4.6.jar swagger-annotations-2.1.2.jar c
+ oncurrentlinkedhashmap-lru-1.4.2.jar flowable-engine-6.7.2.jar antlr4-r
+ untime-4.5.jar flowable-identitylink-service-api-6.7.2.jar flowable-job
+ -service-6.7.2.jar kotlin-stdlib-1.4.31.jar springfox-swagger2-3.0.0.ja
+ r netty-resolver-dns-native-macos-4.1.60.Final-osx-x86_64.jar joda-time
+ -2.10.10.jar ureport-spring-boot-starter-2.2.9.jar ooxml-schemas-1.3.ja
+ r spring-jdbc-5.3.5.jar spring-websocket-5.3.5.jar spring-cloud-loadbal
+ ancer-3.0.2.jar java-jwt-3.4.0.jar mapstruct-1.4.2.Final.jar snakeyaml-
+ 1.27.jar p6spy-3.9.1.jar spring-cloud-starter-alibaba-nacos-config-2021
+ .1.jar groovy-2.5.14.jar spring-boot-admin-starter-server-2.5.1.jar jee
+ plus-devtools-cloud-9.13.jar sentinel-api-gateway-adapter-common-1.8.0.
+ jar jcommander-1.72.jar slf4j-api-1.7.30.jar sentinel-spring-cloud-gate
+ way-adapter-1.8.0.jar spring-boot-starter-aop-2.4.4.jar bcprov-jdk15on-
+ 1.64.jar flowable-batch-service-api-6.7.2.jar flowable-task-service-6.7
+ .2.jar jboss-logging-3.4.1.Final.jar easyexcel-3.1.1.jar animal-sniffer
+ -annotations-1.14.jar swagger-models-1.6.2.jar flowable-cmmn-json-conve
+ rter-6.7.2.jar failureaccess-1.0.1.jar poi-4.1.1.jar spring-cloud-start
+ er-alibaba-nacos-discovery-2021.1.jar spring-plugin-core-2.0.0.RELEASE.
+ jar okio-2.8.0.jar commons-beanutils-1.7.0.jar spring-boot-admin-client
+ -2.5.1.jar core-3.3.3.jar activation-1.1.jar javassist-3.20.0-GA.jar mi
+ crometer-core-1.6.5.jar jul-to-slf4j-1.7.30.jar spring-boot-starter-web
+ -2.4.4.jar spring-boot-actuator-2.4.4.jar ant-launcher-1.9.4.jar spring
+ -cloud-openfeign-core-3.0.2.jar commons-fileupload-1.3.2.jar spring-boo
+ t-starter-json-2.4.4.jar easyexcel-core-3.1.1.jar tomcat-embed-websocke
+ t-9.0.44.jar checker-qual-3.5.0.jar spring-boot-starter-mail-2.4.4.jar 
+ springfox-spring-web-3.0.0.jar flowable-form-model-6.7.2.jar jakarta.an
+ notation-api-1.3.5.jar netty-handler-4.1.60.Final.jar LatencyUtils-2.0.
+ 3.jar lombok-1.18.18.jar HikariCP-3.4.5.jar commons-math3-3.6.1.jar ali
+ yun-java-sdk-core-4.5.25.jar spring-security-crypto-5.4.5.jar validatio
+ n-api-2.0.1.Final.jar flowable-app-engine-api-6.7.2.jar spring-data-key
+ value-2.4.6.jar commons-lang-2.1.jar zipkin-2.23.0.jar feign-core-10.10
+ .1.jar mybatis-3.5.6.jar flowable-job-spring-service-6.7.2.jar sentinel
+ -spring-webmvc-adapter-1.8.0.jar flowable-bpmn-converter-6.7.2.jar flow
+ able-event-registry-json-converter-6.7.2.jar ini4j-0.5.4.jar error_pron
+ e_annotations-2.1.3.jar mybatis-plus-3.4.2.jar springfox-schema-3.0.0.j
+ ar spring-boot-starter-cache-2.4.4.jar oshi-core-5.3.7.jar jackson-data
+ type-jdk8-2.11.4.jar flowable-form-api-6.7.2.jar flowable-ui-modeler-lo
+ gic-6.7.2.jar javase-3.3.3.jar commons-email-1.5.jar thymeleaf-3.0.12.R
+ ELEASE.jar txw2-2.3.3.jar spring-boot-2.4.4.jar aliyun-sdk-oss-3.13.1.j
+ ar spring-cloud-starter-alibaba-sentinel-2021.1.jar byte-buddy-1.10.22.
+ jar springfox-spi-3.0.0.jar netty-resolver-4.1.60.Final.jar ehcache-3.9
+ .2.jar commons-pool-1.6.jar commons-logging-1.0.4.jar spring-boot-start
+ er-logging-2.4.4.jar spring-boot-starter-actuator-2.4.4.jar spring-mess
+ aging-5.3.5.jar xxl-job-core-2.3.1.jar j2objc-annotations-1.3.jar flowa
+ ble-job-service-api-6.7.2.jar ognl-3.2.6.jar flowable-common-rest-6.7.2
+ .jar flowable-identitylink-service-6.7.2.jar okhttp-4.9.0.jar flowable-
+ idm-engine-configurator-6.7.2.jar ureport2-font-2.0.1.jar thymeleaf-ext
+ ras-java8time-3.0.4.RELEASE.jar bcpkix-jdk15on-1.64.jar easypoi-web-4.3
+ .0.jar jackson-core-2.11.4.jar ant-1.9.4.jar jackson-module-parameter-n
+ ames-2.11.4.jar jgraphx-1.10.4.1.jar spring-aop-5.3.5.jar feign-slf4j-1
+ 0.10.1.jar sentinel-parameter-flow-control-1.8.0.jar commons-lang3-3.11
+ .jar flowable-dmn-json-converter-6.7.2.jar gson-2.8.6.jar nacos-common-
+ 1.4.1.jar commons-collections4-4.4.jar flowable-bpmn-layout-6.7.2.jar n
+ etty-transport-native-unix-common-4.1.60.Final.jar flowable-dmn-xml-con
+ verter-6.7.2.jar minio-8.0.3.jar dynamic-datasource-spring-boot-starter
+ -3.5.1.jar jai-imageio-core-1.4.0.jar sentinel-transport-common-1.8.0.j
+ ar springfox-swagger-common-3.0.0.jar spring-context-support-1.0.10.jar
+  spring-oxm-5.3.5.jar poi-ooxml-schemas-4.1.1.jar spring-cloud-alibaba-
+ sentinel-gateway-2021.1.jar xml-apis-1.0.b2.jar netty-codec-4.1.60.Fina
+ l.jar jsr305-3.0.2.jar ureport2-core-2.2.9.jar flowable-engine-common-a
+ pi-6.7.2.jar spring-boot-starter-websocket-2.4.4.jar commons-collection
+ s-3.1.jar javax.mail-1.5.6.jar postgresql-42.2.19.jar httpasyncclient-4
+ .1.4.jar nacos-client-1.4.1.jar sentinel-spring-webflux-adapter-1.8.0.j
+ ar flowable-spring-boot-starter-process-rest-6.7.2.jar json-lib-2.4-jdk
+ 15.jar commons-lang-2.6.jar evictor-1.0.0.jar flowable-event-registry-s
+ pring-configurator-6.7.2.jar mybatis-plus-boot-starter-3.4.2.jar sentin
+ el-cluster-server-default-1.8.0.jar spring-boot-admin-starter-client-2.
+ 5.1.jar httpclient-4.5.13.jar swagger-annotations-1.6.2.jar druid-1.2.8
+ .jar jna-platform-5.10.0.jar annotations-13.0.jar flowable-http-common-
+ 6.7.2.jar spring-context-support-5.3.5.jar easypoi-base-4.3.0.jar flowa
+ ble-spring-6.7.2.jar sentinel-cluster-client-default-1.8.0.jar spring-b
+ oot-autoconfigure-2.4.4.jar easypoi-annotation-4.3.0.jar commons-io-2.1
+ 1.0.jar poi-4.1.2.jar attoparser-2.0.5.RELEASE.jar spring-cloud-starter
+ -openfeign-3.0.2.jar listenablefuture-9999.0-empty-to-avoid-conflict-wi
+ th-guava.jar liquibase-core-4.3.5.jar spring-test-5.3.5.jar spring-boot
+ -starter-data-redis-2.4.4.jar spring-cloud-context-3.0.2.jar jackson-ma
+ pper-asl-1.9.11.jar mybatis-spring-boot-starter-2.1.4.jar ddlutils-1.3.
+ jar spring-web-5.3.5.jar spring-boot-starter-webflux-2.4.4.jar spring-c
+ loud-starter-gateway-3.0.2.jar zipkin-reporter-brave-2.16.1.jar javax.a
+ nnotation-api-1.3.2.jar flowable-event-registry-configurator-6.7.2.jar 
+ tomcat-embed-core-9.0.44.jar opentracing-util-0.33.0.jar hibernate-vali
+ dator-6.1.7.Final.jar guava-29.0-jre.jar flowable-rest-6.7.2.jar org.ja
+ coco.agent-0.8.7-runtime.jar fastjson-1.2.71.jar springfox-bean-validat
+ ors-3.0.0.jar freemarker-2.3.31.jar filters-2.0.235-1.jar brave-5.13.2.
+ jar spring-beans-5.3.5.jar spring-orm-5.3.5.jar ureport2-console-2.2.9.
+ jar mssql-jdbc-8.4.1.jre8.jar jakarta.activation-1.2.2.jar httpcore-4.4
+ .14.jar sentinel-core-1.8.0.jar netty-codec-socks-4.1.60.Final.jar reac
+ tor-netty-1.0.5.jar springfox-spring-webmvc-3.0.0.jar log4j-to-slf4j-2.
+ 13.3.jar flowable-form-json-converter-6.7.2.jar mybatis-plus-extension-
+ 3.4.2.jar spring-boot-starter-jdbc-2.4.4.jar brave-instrumentation-http
+ -5.13.2.jar flowable-spring-common-6.7.2.jar guava-24.1.1-jre.jar commo
+ ns-logging-api-1.0.4.jar opentracing-noop-0.33.0.jar mybatis-spring-2.0
+ .6.jar spring-cloud-alibaba-sentinel-datasource-2021.1.jar spring-cloud
+ -gateway-server-3.0.2.jar aliyun-java-sdk-dysmsapi-2.1.0.jar checker-co
+ mpat-qual-2.0.0.jar unbescape-1.1.6.RELEASE.jar springfox-swagger-ui-3.
+ 0.0.jar reactor-netty-core-1.0.5.jar springfox-data-rest-3.0.0.jar core
+ -3.3.1.jar flowable-dmn-api-6.7.2.jar spring-boot-actuator-autoconfigur
+ e-2.4.4.jar easypoi-spring-boot-starter-4.3.0.jar jsr250-api-1.0.jar po
+ i-ooxml-schemas-4.1.2.jar classmate-1.5.1.jar commons-fileupload-1.4.ja
+ r sentinel-annotation-aspectj-1.8.0.jar jcl-over-slf4j-1.7.30.jar flowa
+ ble-batch-service-6.7.2.jar spring-cloud-starter-bootstrap-3.0.2.jar jt
+ ds-1.3.1.jar spring-cloud-starter-loadbalancer-3.0.2.jar dom4j-1.6.1.ja
+ r poi-ooxml-4.1.1.jar curvesapi-1.06.jar flowable-external-job-rest-6.7
+ .2.jar spring-security-rsa-1.0.9.RELEASE.jar reactor-netty-http-brave-1
+ .0.5.jar swagger-models-1.5.20.jar logback-core-1.2.3.jar flowable-idm-
+ api-6.7.2.jar flowable-task-service-api-6.7.2.jar cas-client-core-3.5.1
+ .jar jsr305-1.3.9.jar commons-beanutils-core-1.8.3.jar mybatis-spring-2
+ .0.5.jar java-uuid-generator-3.3.0.jar springfox-core-3.0.0.jar json-20
+ 160810.jar spring-boot-admin-server-cloud-2.5.1.jar jakarta.validation-
+ api-2.0.2.jar jackson-datatype-joda-2.11.4.jar commons-compress-1.19.ja
+ r javax.servlet-api-3.1.0.jar lombok-1.18.24.jar flowable-spring-boot-s
+ tarter-process-6.7.2.jar jackson-annotations-2.11.4.jar kaptcha-2.3.2.j
+ ar spring-context-5.3.5.jar log4j-api-2.13.3.jar spring-security-core-5
+ .4.5.jar flowable-event-registry-6.7.2.jar flowable-eventsubscription-s
+ ervice-api-6.7.2.jar jakarta.el-3.0.3.jar commons-codec-1.15.jar flowab
+ le-idm-engine-6.7.2.jar springfox-boot-starter-3.0.0.jar classgraph-4.8
+ .83.jar logback-classic-1.2.3.jar flowable-entitylink-service-6.7.2.jar
+  aspectjrt-1.9.6.jar mybatis-plus-annotation-3.4.2.jar flowable-ui-mode
+ ler-rest-6.7.2.jar flowable-cmmn-api-6.7.2.jar netty-codec-http2-4.1.60
+ .Final.jar flowable-event-registry-api-6.7.2.jar ezmorph-1.0.6.jar spri
+ ng-cloud-starter-3.0.2.jar reactor-netty-http-1.0.5.jar flowable-idm-re
+ st-6.7.2.jar mysql-connector-java-8.0.24.jar aliyun-java-sdk-ram-3.1.0.
+ jar flowable-cmmn-model-6.7.2.jar spring-core-5.3.5.jar netty-common-4.
+ 1.60.Final.jar mybatis-plus-core-3.4.2.jar netty-all-4.1.60.Final.jar j
+ 2objc-annotations-1.1.jar flowable-process-validation-6.7.2.jar netty-r
+ esolver-dns-4.1.60.Final.jar spring-cloud-circuitbreaker-sentinel-2021.
+ 1.jar netty-buffer-4.1.60.Final.jar SparseBitSet-1.2.jar flowable-sprin
+ g-boot-autoconfigure-6.7.2.jar easyexcel-support-3.1.1.jar jsqlparser-4
+ .0.jar flowable-spring-security-6.7.2.jar spring-boot-admin-server-2.5.
+ 1.jar spring-security-config-5.4.5.jar istack-commons-runtime-3.0.11.ja
+ r mybatis-spring-boot-autoconfigure-2.1.4.jar lettuce-core-6.0.3.RELEAS
+ E.jar velocity-1.7.jar poi-scratchpad-3.16.jar httpcore-nio-4.4.14.jar 
+ spring-boot-starter-freemarker-2.4.4.jar netty-codec-http-4.1.60.Final.
+ jar jaxb-api-2.3.1.jar flowable-variable-service-api-6.7.2.jar HdrHisto
+ gram-2.1.12.jar flowable-event-registry-spring-6.7.2.jar flowable-json-
+ converter-6.7.2.jar xmlbeans-3.1.0.jar flowable-image-generator-6.7.2.j
+ ar flowable-bpmn-model-6.7.2.jar aliyun-java-sdk-kms-2.11.0.jar itextpd
+ f-5.5.13.jar spring-security-web-5.4.5.jar opentracing-api-0.33.0.jar s
+ pringfox-spring-webflux-3.0.0.jar jackson-datatype-jsr310-2.11.4.jar st
+ ax-api-1.0.1.jar zipkin-reporter-2.16.1.jar flowable-cmmn-image-generat
+ or-6.7.2.jar commons-dbcp-1.4.jar spring-boot-starter-thymeleaf-2.4.4.j
+ ar javax.activation-api-1.2.0.jar jackson-core-asl-1.9.11.jar org.abego
+ .treelayout.core-1.0.1.jar spring-expression-5.3.5.jar spring-boot-star
+ ter-security-2.4.4.jar flowable-ui-common-6.7.2.jar netty-codec-dns-4.1
+ .60.Final.jar commons-lang3-3.12.0.jar simpleclient-0.5.0.jar reactor-e
+ xtra-3.4.2.jar jdom2-2.0.6.jar spring-jcl-5.3.5.jar simple-xml-safe-2.7
+ .1.jar swagger-annotations-1.5.20.jar springfox-oas-3.0.0.jar flowable-
+ variable-service-6.7.2.jar spring-boot-starter-validation-2.4.4.jar net
+ ty-transport-4.1.60.Final.jar feign-form-spring-3.8.0.jar spring-boot-s
+ tarter-reactor-netty-2.4.4.jar swagger-models-2.1.2.jar spring-boot-sta
+ rter-2.4.4.jar nacos-api-1.4.1.jar jackson-databind-2.11.3.jar javax.se
+ rvlet-api-4.0.1.jar netty-transport-native-epoll-4.1.60.Final-linux-x86
+ _64.jar commons-io-2.2.jar reactor-core-3.4.4.jar spring-webmvc-5.3.5.j
+ ar spring-boot-starter-tomcat-2.4.4.jar sentinel-datasource-extension-1
+ .8.0.jar error_prone_annotations-2.3.4.jar jakarta.xml.bind-api-2.3.3.j
+ ar spring-data-redis-2.4.6.jar sentinel-transport-simple-http-1.8.0.jar
+  spring-webflux-5.3.5.jar poi-ooxml-4.1.2.jar mybatis-3.5.7.jar druid-s
+ pring-boot-starter-1.2.8.jar spring-cloud-commons-3.0.2.jar feign-form-
+ 3.8.0.jar hutool-all-5.7.13.jar spring-boot-admin-server-ui-2.5.1.jar j
+ na-5.10.0.jar jakarta.activation-api-1.2.2.jar flowable-content-api-6.7
+ .2.jar jackson-databind-2.11.4.jar flowable-eventsubscription-service-6
+ .7.2.jar spring-tx-5.3.5.jar flowable-dmn-image-generator-6.7.2.jar net
+ ty-handler-proxy-4.1.60.Final.jar mysql-connector-java-8.0.23.jar jakar
+ ta.mail-1.6.6.jar sentinel-cluster-common-default-1.8.0.jar aspectjweav
+ er-1.9.6.jar flowable-event-registry-model-6.7.2.jar commons-fileupload
+ -1.3.3.jar flowable-engine-common-6.7.2.jar reactive-streams-1.0.3.jar 
+ commons-csv-1.8.jar jettison-1.1.jar jaxb-runtime-2.3.3.jar thymeleaf-s
+ pring5-3.0.12.RELEASE.jar spring-plugin-metadata-2.0.0.RELEASE.jar
+