Explorar o código

苏州分公司调整及发票新增红字发票

sangwenwei hai 5 meses
pai
achega
5f86df8544
Modificáronse 20 ficheiros con 1173 adicións e 59 borrados
  1. 39 42
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/ccpm/controller/CcpmList.java
  2. 135 2
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/ccpm/controller/Transport.java
  3. 27 2
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/controller/CwFinanceInvoiceController.java
  4. 7 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/domain/CwFinanceInvoice.java
  5. 9 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/CwFinanceInvoiceMapper.java
  6. 2 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/CwFinanceInvoiceReceivablesMapper.java
  7. 49 10
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/CwFinanceInvoiceMapper.xml
  8. 4 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/CwFinanceInvoiceReceivablesMapper.xml
  9. 247 2
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/CwFinanceInvoiceService.java
  10. 6 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/CwFinanceInvoiceDTO.java
  11. 3 1
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/xml/CwFillingbatchInfoMapper.xml
  12. 2 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/xml/CwProjectRecordsMapper.xml
  13. 20 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/CwFillingbatchService.java
  14. 1 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/dto/CwProjectRecordsDTO.java
  15. 5 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursement/reimbursementInfo/service/ReimbursementInfoService.java
  16. 23 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/controller/OfficeController.java
  17. 173 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/controller/UserController.java
  18. 325 0
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/jeeplus/domain/CwFinanceInvoiceList.java
  19. 7 0
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/feign/FinanceFeignApi.java
  20. 89 0
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java

+ 39 - 42
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/ccpm/controller/CcpmList.java

@@ -216,56 +216,51 @@ public class CcpmList  {
 
                                 if (CollectionUtils.isNotEmpty(reportData.getConsultants())) {
                                     for (RuralReportConsultant consultant : reportData.getConsultants()) {
-                                        try {
-                                            if (consultant != null) {
-                                                CwProjectReviewNewTeam reviewNewTeam = new CwProjectReviewNewTeam();
-                                                UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByLoginNameNotTenantId(recordsVo.getCreateName());
-                                                if (userDTO != null) {
-                                                    reviewNewTeam.setCreateById(userDTO.getId());
-                                                    reviewNewTeam.setUpdateById(userDTO.getId());
+                                        if (consultant != null) {
+                                            CwProjectReviewNewTeam reviewNewTeam = new CwProjectReviewNewTeam();
+                                            UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByLoginNameNotTenantId(recordsVo.getCreateName());
+                                            if (userDTO != null) {
+                                                reviewNewTeam.setCreateById(userDTO.getId());
+                                                reviewNewTeam.setUpdateById(userDTO.getId());
+                                            }
+                                            reviewNewTeam.setCreateTime(recordsVo.getCreateDate());
+                                            reviewNewTeam.setUpdateTime(recordsVo.getUpdateTime());
+                                            reviewNewTeam.setReportId(reportInfo.getId());
+                                            if (StringUtils.isNotBlank(consultant.getRole())) {
+                                                reviewNewTeam.setUserRole(consultant.getRole());
+                                                // 根据角色处理
+                                                if (consultant.getRole().equals("负责人")) {
+                                                    reviewNewTeam.setDetailNumber("1");
+                                                    UserDTO userDTO2 = SpringUtil.getBean(IUserApi.class).getByLoginNameNotTenantId(consultant.getZixunyuanName());
+                                                    if (userDTO2 != null) {
+                                                        reviewNewTeam.setUserId(userDTO2.getId());
+                                                    }
                                                 }
-                                                reviewNewTeam.setCreateTime(recordsVo.getCreateDate());
-                                                reviewNewTeam.setUpdateTime(recordsVo.getUpdateTime());
-                                                reviewNewTeam.setReportId(reportInfo.getId());
-                                                if (StringUtils.isNotBlank(consultant.getRole())) {
-                                                    reviewNewTeam.setUserRole(consultant.getRole());
-                                                    // 根据角色处理
-                                                    if (consultant.getRole().equals("负责人")) {
-                                                        reviewNewTeam.setDetailNumber("1");
-                                                        UserDTO userDTO2 = SpringUtil.getBean(IUserApi.class).getByLoginNameNotTenantId(consultant.getZixunyuanName());
+                                                // 其他角色处理
+                                                if (consultant.getRole().equals("技术负责人")) {
+                                                    reviewNewTeam.setDetailNumber("2");
+                                                    if (StringUtils.isNotBlank(consultant.getZixunyuanName())) {
+                                                        String substring = consultant.getZixunyuanName().substring(consultant.getZixunyuanName().indexOf("(")+1, consultant.getZixunyuanName().lastIndexOf("代"));
+                                                        UserDTO userDTO2 = SpringUtil.getBean(IUserApi.class).getByLoginNameNotTenantId(substring);
                                                         if (userDTO2 != null) {
                                                             reviewNewTeam.setUserId(userDTO2.getId());
                                                         }
                                                     }
-                                                    // 其他角色处理
-                                                    if (consultant.getRole().equals("技术负责人")) {
-                                                        reviewNewTeam.setDetailNumber("2");
-                                                        if (StringUtils.isNotBlank(consultant.getZixunyuanName())) {
-                                                            String substring = consultant.getZixunyuanName().substring(consultant.getZixunyuanName().indexOf("(")+1, consultant.getZixunyuanName().lastIndexOf("代"));
-                                                            UserDTO userDTO2 = SpringUtil.getBean(IUserApi.class).getByLoginNameNotTenantId(substring);
-                                                            if (userDTO2 != null) {
-                                                                reviewNewTeam.setUserId(userDTO2.getId());
-                                                            }
-                                                        }
-                                                    }
-                                                    if (consultant.getRole().equals("咨询员")) {
-                                                        reviewNewTeam.setDetailNumber("3");
-                                                        UserDTO userDTO2 = SpringUtil.getBean(IUserApi.class).getByLoginNameNotTenantId(consultant.getZixunyuanName());
-                                                        if (userDTO2 != null) {
-                                                            reviewNewTeam.setUserId(userDTO2.getId());
-                                                        }
+                                                }
+                                                if (consultant.getRole().equals("咨询员")) {
+                                                    reviewNewTeam.setDetailNumber("3");
+                                                    UserDTO userDTO2 = SpringUtil.getBean(IUserApi.class).getByLoginNameNotTenantId(consultant.getZixunyuanName());
+                                                    if (userDTO2 != null) {
+                                                        reviewNewTeam.setUserId(userDTO2.getId());
                                                     }
                                                 }
-                                                reviewNewTeam.setId(consultant.getId());
-                                                reviewNewTeam.setContent(consultant.getWordnr());
-                                                reviewNewTeam.setOpinion(consultant.getAuditOpinion());
-                                                reviewNewTeam.setTenantId("ccpm");
-
-                                                newTeamMapper.insert(reviewNewTeam);
                                             }
-                                        } catch (Exception e) {
-                                            System.out.println("新增错误: " + e);
-                                            // 在这里捕获异常后记录日志,避免单个错误导致方法中止
+                                            reviewNewTeam.setId(consultant.getId());
+                                            reviewNewTeam.setContent(consultant.getWordnr());
+                                            reviewNewTeam.setOpinion(consultant.getAuditOpinion());
+                                            reviewNewTeam.setTenantId("ccpm");
+
+                                            newTeamMapper.insert(reviewNewTeam);
                                         }
                                     }
                                 }
@@ -973,6 +968,8 @@ public class CcpmList  {
             i.setAttachmentFlag("ccpmWorkClient");
             if (StringUtils.isNotBlank(dto.getFileSize())){
                 i.setFileSize(dto.getFileSize());
+            }else {
+                i.setFileSize("0");
             }
             i.setSort(j);
             Map<String,String> map = new HashMap<>();

+ 135 - 2
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/ccpm/controller/Transport.java

@@ -1,14 +1,32 @@
 package com.jeeplus.finance.ccpm.controller;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.jeeplus.finance.ccpm.service.TranspondService;
 import com.jeeplus.finance.ccpm.vo.TranspondDTO;
+import com.jeeplus.finance.invoice.domain.CwFinanceInvoice;
+import com.jeeplus.finance.invoice.domain.CwFinanceInvoiceReceivables;
+import com.jeeplus.finance.invoice.mapper.CwFinanceInvoiceMapper;
+import com.jeeplus.finance.invoice.mapper.CwFinanceInvoiceReceivablesMapper;
 import com.jeeplus.finance.invoice.service.CwFinanceInvoiceService;
+import com.jeeplus.finance.invoice.service.dto.CwFinanceInvoiceDTO;
+import com.jeeplus.finance.invoice.service.dto.CwFinanceInvoiceReceivablesDTO;
+import com.jeeplus.finance.invoice.service.mapstruct.CwFinanceInvoiceReceivablesWrapper;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.UserDTO;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.HashMap;
-import java.util.Map;
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping(value = "/transpond")
@@ -20,6 +38,12 @@ public class Transport {
     @Autowired
     private TranspondService transpondService;
 
+    @Resource
+    private CwFinanceInvoiceMapper cwFinanceInvoiceMapper;
+
+    @Resource
+    private CwFinanceInvoiceReceivablesMapper cwFinanceInvoiceReceivablesMapper;
+
 
     @RequestMapping(value = "detailFinance", method = RequestMethod.GET)
     public Object detailDistribute(@RequestParam String id, @RequestParam String processDefKey) {
@@ -45,6 +69,115 @@ public class Transport {
     }
 
     /**
+     * 修改收款状态
+     */
+    @Transactional(readOnly = false)
+    @RequestMapping(value = "saveReceivable", method = RequestMethod.POST)
+    public void saveReceivable(@RequestBody String json) throws Exception {
+        CwFinanceInvoice workInvoice = new CwFinanceInvoice();
+        if (null != json){
+            Map<String, Object> invoice = JSONObject.parseObject(json);
+            if (Objects.nonNull(invoice)){
+                if (Objects.nonNull(invoice.get("id"))){
+                    workInvoice.setId(invoice.get("id").toString());
+                }
+                if (Objects.nonNull(invoice.get("receiptMoneyDate"))){
+                    String billingDate = invoice.get("receiptMoneyDate").toString();
+                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                    Date date = sdf.parse(billingDate);
+                    workInvoice.setReceivablesDate(date);
+                }
+                if (Objects.nonNull(invoice.get("receiptMoney"))){
+                    workInvoice.setReceivablesStatus(invoice.get("receiptMoney").toString());
+                }
+            }
+            if (workInvoice != null){
+                cwFinanceInvoiceMapper.update(workInvoice, new QueryWrapper<CwFinanceInvoice>().lambda().eq(CwFinanceInvoice::getId, workInvoice.getId()));
+            }
+        }
+
+
+    }
+
+    /**
+     * 保存收款明细
+     */
+    @Transactional(readOnly = false)
+    @RequestMapping(value = "saveReceipt", method = RequestMethod.POST)
+    public void saveReceipt(@RequestBody String json) throws Exception {
+        CwFinanceInvoiceDTO workInvoice = new CwFinanceInvoiceDTO();
+        String invoiceId = "";
+        if (null != json){
+
+            Map<String, Object> resp = JSONObject.parseObject(json);
+            if (Objects.nonNull(resp)){
+                if (Objects.nonNull(resp.get("workReceiptList"))){
+                    String data = JSON.toJSONString(resp.get("workReceiptList"));
+                    List<Object> baseList = JSON.parseArray(data,Object.class);
+                    ArrayList<CwFinanceInvoiceReceivablesDTO> workInvoiceReceipts = new ArrayList<>();
+                    if (Objects.nonNull(baseList)) {
+                        for (Object base : baseList) {
+                            CwFinanceInvoiceReceivablesDTO receipt = new CwFinanceInvoiceReceivablesDTO();
+                            Map<String, Object> baseMap = JSONObject.parseObject(JSON.toJSONString(base));
+                            if (Objects.nonNull(baseMap.get("invoiceId"))){
+                                receipt.setInvoiceId(baseMap.get("invoiceId").toString());
+                                invoiceId = baseMap.get("invoiceId").toString();
+                            }
+                            if (Objects.nonNull(baseMap.get("companyName"))){
+                                receipt.setRemittanceUnit(baseMap.get("companyName").toString());
+                            }
+                            if (Objects.nonNull(baseMap.get("money"))){
+                                receipt.setRemittanceAmount(baseMap.get("money").toString());
+                            }
+                            if (Objects.nonNull(baseMap.get("receiptDate"))){
+                                String billingDate = baseMap.get("receiptDate").toString();
+                                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                                Date date = sdf.parse(billingDate);
+                                receipt.setRemittanceDate(date);
+                            }
+                            if (Objects.nonNull(baseMap.get("createDate"))){
+                                String billingDate = baseMap.get("createDate").toString();
+                                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                                Date date = sdf.parse(billingDate);
+                                receipt.setCreateTime(date);
+                            }
+                            if (Objects.nonNull(baseMap.get("updateDate"))){
+                                String billingDate = baseMap.get("updateDate").toString();
+                                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                                Date date = sdf.parse(billingDate);
+                                receipt.setUpdateTime(date);
+                            }
+                            if (Objects.nonNull(baseMap.get("createName"))){
+                                UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByLoginNameNotTenantId(baseMap.get("createName").toString());
+                                receipt.setCreateBy(userDTO);
+                            }
+                            if (Objects.nonNull(baseMap.get("updateName"))){
+                                UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByLoginNameNotTenantId(baseMap.get("updateName").toString());
+                                receipt.setUpdateBy(userDTO);
+                            }
+                            receipt.setId(baseMap.get("id").toString());
+
+                            workInvoiceReceipts.add(receipt);
+                        }
+                    }
+                    workInvoice.setFinanceInvoiceReceivablesDTOList(workInvoiceReceipts);
+                }
+            }
+
+        }
+        if (workInvoice != null && CollectionUtil.isNotEmpty(workInvoice.getFinanceInvoiceReceivablesDTOList())){
+            cwFinanceInvoiceReceivablesMapper.deleteByInvoiceId(invoiceId);
+            workInvoice.getFinanceInvoiceReceivablesDTOList().stream().forEach(item->{
+                CwFinanceInvoiceReceivables cwFinanceInvoiceReceivables = CwFinanceInvoiceReceivablesWrapper.INSTANCE.toEntity(item);
+                cwFinanceInvoiceReceivablesMapper.insert(cwFinanceInvoiceReceivables);
+
+            });
+        }
+
+
+    }
+
+    /**
      * 检测服务是否启动
      */
     @GetMapping("checkConnect")

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

@@ -1,7 +1,9 @@
 package com.jeeplus.finance.invoice.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.jeeplus.aop.demo.annotation.DemoMode;
 import com.jeeplus.common.excel.ExcelOptions;
 import com.jeeplus.common.excel.annotation.ExportMode;
@@ -205,7 +207,7 @@ public class CwFinanceInvoiceController {
      */
     @ApiOperation(value = "确认收款")
     @PostMapping(value = "/isReceivables")
-    public ResponseEntity<String> isReceivables(@RequestBody CwFinanceInvoiceDTO dto) {
+    public ResponseEntity<String> isReceivables(@RequestBody CwFinanceInvoiceDTO dto) throws JsonProcessingException {
         String s = cwFinanceInvoiceService.isReceivables(dto);
         return ResponseEntity.ok(s);
     }
@@ -390,8 +392,31 @@ public class CwFinanceInvoiceController {
     }
 
 
+    /**
+     * 查询发票列表
+     * @param cwFinanceInvoiceDTO
+     * @param page
+     * @return
+     * @throws Exception
+     */
+    @ApiLog("查询发票列表")
+    @PreAuthorize("hasAuthority('cw_finance:invoice:list')")
+    @GetMapping("redList")
+    public ResponseEntity<IPage<CwFinanceInvoiceDTO>> redList(CwFinanceInvoiceDTO cwFinanceInvoiceDTO, Page<CwFinanceInvoiceDTO> page) throws Exception {
+        IPage<CwFinanceInvoiceDTO> result = new Page<CwFinanceInvoiceDTO>();
+        result = cwFinanceInvoiceService.findRedList (page, cwFinanceInvoiceDTO,"");
+        return ResponseEntity.ok (result);
+    }
 
-
+    /**
+     * 查询开票时间距今超过1个月的开票数据
+     */
+    @ApiLog("查询开票时间距今超过1个月的开票数据")
+    @GetMapping("getExceedCwFinance")
+    public String getExceedCwFinance(){
+        List<CwFinanceInvoiceDTO> invoiceList = cwFinanceInvoiceService.getExceedCwFinance();
+        return JSON.toJSONString(invoiceList);
+    }
 
 
 

+ 7 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/domain/CwFinanceInvoice.java

@@ -201,6 +201,13 @@ public class CwFinanceInvoice extends BaseEntity {
      */
     private String actualDrawerEmailAddress;
 
+    @Query(tableColumn = "fi.red_invoice_flag",type = QueryType.EQ)
+    private Integer redInvoiceFlag; //是否红字发票
+    @Query(tableColumn = "fi.red_invoice_relevancy_id",type = QueryType.EQ)
+    private String redInvoiceRelevancyId;	//红字发票关联其他发票id
+    @Query(tableColumn = "fi.red_invoice_relevancy_number",type = QueryType.EQ)
+    private String redInvoiceRelevancyNumber;	//红字发票关联其他发票编号
+
 
     private static final long serialVersionUID = 1L;
 }

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

@@ -47,6 +47,15 @@ public interface CwFinanceInvoiceMapper extends BaseMapper<CwFinanceInvoice> {
     CwFinanceInvoiceDTO queryByProcId(@Param("id")String id);
     @InterceptorIgnore(tenantLine = "true")
     List<CwFinanceInvoiceDTO> findListNew();
+
+    /**
+     * 根据id查询发票号
+     * @param invoiceId
+     * @return
+     */
+    String getInvoiceNumberStr(String invoiceId);
+
+    List<CwFinanceInvoiceDTO> getExceedCwFinance();
 }
 
 

+ 2 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/CwFinanceInvoiceReceivablesMapper.java

@@ -3,10 +3,12 @@ package com.jeeplus.finance.invoice.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.jeeplus.finance.invoice.domain.CwFinanceInvoiceReceivables;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 @Mapper
 public interface CwFinanceInvoiceReceivablesMapper extends BaseMapper<CwFinanceInvoiceReceivables> {
 
+    void deleteByInvoiceId(@Param("invoiceId") String invoiceId);
 }
 
 

+ 49 - 10
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/CwFinanceInvoiceMapper.xml

@@ -47,7 +47,11 @@
             <result property="isMultiple" column="is_multiple" jdbcType="VARCHAR"/>
             <result property="billingId" column="billing_id" jdbcType="VARCHAR"/>
             <result property="reportType" column="report_type" jdbcType="VARCHAR"/>
-            <association property="financeInvoiceInvalidDTO" column="id" select="getFii" javaType="com.jeeplus.finance.invoice.service.dto.CwFinanceInvoiceInvalidDTO"></association>
+            <result property="redInvoiceFlag" column="red_invoice_flag" jdbcType="VARCHAR"/>
+            <result property="redInvoiceRelevancyId" column="red_invoice_relevancy_id" jdbcType="VARCHAR"/>
+            <result property="redInvoiceRelevancyNumber" column="red_invoice_relevancy_number" jdbcType="VARCHAR"/>
+
+        <association property="financeInvoiceInvalidDTO" column="id" select="getFii" javaType="com.jeeplus.finance.invoice.service.dto.CwFinanceInvoiceInvalidDTO"></association>
             <collection property="financeInvoiceReceivablesDTOList" column="id" select="getFirList" ofType="com.jeeplus.finance.invoice.service.dto.CwFinanceInvoiceReceivablesDTO"></collection>
             <collection property="financeInvoiceBaseDTOList" column="id" select="getBaseList" ofType="com.jeeplus.finance.invoice.service.dto.CwFinanceInvoiceBaseDTO"></collection>
             <collection property="financeInvoiceDetailDTOList" column="id" select="getFidList" ofType="com.jeeplus.finance.invoice.service.dto.CwFinanceInvoiceDetailDTO"></collection>
@@ -153,7 +157,10 @@
         fi.is_multiple,
         fi.billing_id,
         fi.report_type,
-        fi.actual_drawer_email_address
+        fi.actual_drawer_email_address,
+        fi.red_invoice_flag,
+        fi.red_invoice_relevancy_id,
+        fi.red_invoice_relevancy_number
     </sql>
 
     <sql id="File_Column_List">
@@ -317,13 +324,13 @@
         sa.name as reconciliationAreaName,
         sua.name as createByName
         from cw_finance_invoice fi
-        left join cw_finance_invoice_base fib on fib.invoice_id = fi.id
-        left join cw_project_report_new_line rpl on fib.program_id=rpl.report_id
-        left join sys_user su on fi.reconciliation_people = su.id
-        left join sys_user sua on fi.create_by_id = sua.id
-        left join sys_user su1 on fi.billing_people_real = su1.id
-        left join cw_project_records pr on fib.program_id=pr.id
-        left join sys_area sa on fi.reconciliation_area = sa.id
+        left join cw_finance_invoice_base fib on fib.invoice_id = fi.id and fib.del_flag = '0'
+        left join cw_project_report_new_line rpl on fib.program_id=rpl.report_id and rpl.del_flag = '0'
+        left join sys_user su on fi.reconciliation_people = su.id and su.del_flag = '0'
+        left join sys_user sua on fi.create_by_id = sua.id and sua.del_flag = '0'
+        left join sys_user su1 on fi.billing_people_real = su1.id and su1.del_flag = '0'
+        left join cw_project_records pr on fib.program_id=pr.id and pr.del_flag = '0'
+        left join sys_area sa on fi.reconciliation_area = sa.id and sa.del_flag = '0'
         where fi.del_flag = '0'
         ORDER BY
         fi.create_time DESC
@@ -490,8 +497,40 @@
         <if test="null != actualDrawerEmailAddress and actualDrawerEmailAddress != ''">
             actual_drawer_email_address = #{actualDrawerEmailAddress},
         </if>
-
+        red_invoice_flag = #{redInvoiceFlag},
+        red_invoice_relevancy_id = #{redInvoiceRelevancyId},
+        red_invoice_relevancy_number = #{redInvoiceRelevancyNumber},
         remarks = #{remarks}
         where id = #{id}
     </update>
+
+    <select id="getInvoiceNumberStr" resultType="java.lang.String">
+		select group_concat(number) from cw_finance_invoice_detail where invoice_id = #{invoiceId}
+	</select>
+
+    <select id="getExceedCwFinance" resultType="com.jeeplus.finance.invoice.service.dto.CwFinanceInvoiceDTO">
+        SELECT
+        DISTINCT
+        <include refid="Base_Column_List"></include>,
+        (
+        case
+        when a.type = '0' then (concat('其他:',a.program_name))
+        when a.type = '1' then (select rpr.project_name from cw_project_records rpr where id = a.program_id)
+        when a.type = '2' then (select rpr.project_name from cw_project_records rpr where id = (select project_id from cw_project_report where id = a.program_id))
+        else '' end
+        ) as programName,
+        fi.create_by_id as 'createBy.id'
+        FROM
+        cw_finance_invoice_base a
+        left join cw_finance_invoice fi on a.invoice_id = fi.id
+        LEFT JOIN cw_project_records pr on a.program_id=pr.id
+        WHERE
+        ( fi.receivables_date IS NULL and fi.receivables_status = '0' )
+        and fi.status != 1 and fi.status != 2 and fi.status != 3 and fi.status != 4 and fi.status != 7
+        AND DATE( fi.billing_date ) &lt;= DATE(
+        DATE_SUB( CURDATE(), INTERVAL 1 MONTH ))
+        ORDER BY
+        fi.billing_date DESC
+    </select>
+
 </mapper>

+ 4 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/CwFinanceInvoiceReceivablesMapper.xml

@@ -33,4 +33,8 @@
         fir.remittance_date,
         fir.status
     </sql>
+
+    <delete id="deleteByInvoiceId">
+        delete from cw_finance_invoice_receivables where invoice_id = #{invoiceId}
+    </delete>
 </mapper>

+ 247 - 2
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/CwFinanceInvoiceService.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -341,7 +342,12 @@ public class CwFinanceInvoiceService extends ServiceImpl<CwFinanceInvoiceMapper,
     public CwFinanceInvoiceDTO queryById(String id) {
 
         CwFinanceInvoiceDTO cwFinanceInvoiceDTO = cwFinanceInvoiceMapper.queryById(id);
-
+        if(ObjectUtil.isNotEmpty(cwFinanceInvoiceDTO) && ObjectUtil.isNotEmpty(cwFinanceInvoiceDTO.getRedInvoiceFlag()) && 1 == cwFinanceInvoiceDTO.getRedInvoiceFlag()){
+            //此处为红冲数据 需要获取发票号
+            CwFinanceInvoiceDTO redCwFinanceInvoiceDTO = cwFinanceInvoiceMapper.queryById(cwFinanceInvoiceDTO.getRedInvoiceRelevancyId());
+            String invoiceNumberStr = cwFinanceInvoiceMapper.getInvoiceNumberStr(redCwFinanceInvoiceDTO.getId());
+            cwFinanceInvoiceDTO.setInvoiceNumberStr(invoiceNumberStr);
+        }
         // 电话号获取
         if (ObjectUtil.isNotEmpty(cwFinanceInvoiceDTO) && StringUtils.isNotBlank(cwFinanceInvoiceDTO.getBillingId())) {
             CwWorkClientBilling cwWorkClientBilling = cwWorkClientBillingService.getById(cwFinanceInvoiceDTO.getBillingId());
@@ -393,6 +399,9 @@ public class CwFinanceInvoiceService extends ServiceImpl<CwFinanceInvoiceMapper,
                     cwFinanceInvoice.setReportType(cwFinanceInvoiceDTO.getReportType());
                 }
             }
+            cwFinanceInvoice.setRedInvoiceFlag(cwFinanceInvoiceDTO.getRedInvoiceFlag());
+            cwFinanceInvoice.setRedInvoiceRelevancyId(cwFinanceInvoiceDTO.getRedInvoiceRelevancyId());
+            cwFinanceInvoice.setRedInvoiceRelevancyNumber(cwFinanceInvoiceDTO.getRedInvoiceRelevancyNumber());
         }
         if(StringUtils.isNotEmpty(cwFinanceInvoiceDTO.getActualDrawerEmailAddress())){
             cwFinanceInvoice.setActualDrawerEmailAddress(cwFinanceInvoiceDTO.getActualDrawerEmailAddress());
@@ -569,7 +578,16 @@ public class CwFinanceInvoiceService extends ServiceImpl<CwFinanceInvoiceMapper,
             dto.setFinanceInvoiceDetailDTOList(cwFinanceInvoiceDTO.getFinanceInvoiceDetailDTOList());
             dto.setFinanceInvoiceBaseDTOList(cwFinanceInvoiceDTO.getFinanceInvoiceBaseDTOList());
             dto.setWorkAttachmentDtoList(cwFinanceInvoiceDTO.getWorkAttachmentDtoList());
+            dto.setFinanceInvoiceReceivablesDTOList(cwFinanceInvoiceDTO.getFinanceInvoiceReceivablesDTOList());
+            dto.setReceivablesStatus(cwFinanceInvoiceDTO.getReceivablesStatus());
+            dto.setReceivablesDate(cwFinanceInvoiceDTO.getReceivablesDate());
             dto.setCollectDate(cwFinanceInvoiceDTO.getCollectDate());
+            if(ObjectUtil.isNotEmpty(cwFinanceInvoiceDTO) && ObjectUtil.isNotEmpty(cwFinanceInvoiceDTO.getRedInvoiceFlag()) && 1 == cwFinanceInvoiceDTO.getRedInvoiceFlag()){
+                //此处为红冲数据 需要获取发票号
+                CwFinanceInvoiceDTO redCwFinanceInvoiceDTO = cwFinanceInvoiceMapper.queryById(cwFinanceInvoiceDTO.getRedInvoiceRelevancyId());
+                String invoiceNumberStr = cwFinanceInvoiceMapper.getInvoiceNumberStr(redCwFinanceInvoiceDTO.getId());
+                dto.setInvoiceNumberStr(invoiceNumberStr);
+            }
             String label = SpringUtil.getBean(IDictApi.class).getDictLabel(cwFinanceInvoiceDTO.getReceivablesType(), "invoice_receivables_type", "");
             dto.setReceivablesTypeLabel(label);
             String contentLabel = SpringUtil.getBean(IDictApi.class).getDictLabel(cwFinanceInvoiceDTO.getBillingContent(), "invoice_billing_content", "");
@@ -676,9 +694,26 @@ public class CwFinanceInvoiceService extends ServiceImpl<CwFinanceInvoiceMapper,
         return "操作成功";
     }
 
-    public String isReceivables(CwFinanceInvoiceDTO cwFinanceInvoiceDTO) {
+    public String isReceivables(CwFinanceInvoiceDTO cwFinanceInvoiceDTO) throws JsonProcessingException {
         CwFinanceInvoice cwFinanceInvoice = CwFinanceInvoiceWrapper.INSTANCE.toEntity(cwFinanceInvoiceDTO);
+        if (cwFinanceInvoice.getReceivablesStatus().equals("1")){
+            cwFinanceInvoice.setReceivablesDate(new Date());
+        }
         cwFinanceInvoiceMapper.update(cwFinanceInvoice, new QueryWrapper<CwFinanceInvoice>().lambda().eq(CwFinanceInvoice::getId, cwFinanceInvoice.getId()));
+        //将收款数据同步到ccpm系统中对应的发票信息
+        String json = objectMapper.writeValueAsString(cwFinanceInvoice);
+        String path = Global.getConfig("CCPM_PATH");
+        String url = path+"/a/cpa_finance/saveReceivable";
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        HttpEntity<String> httpEntity = new HttpEntity<>(json, headers);
+        try {
+            restTemplate.exchange(url, HttpMethod.POST,httpEntity,String.class);
+        } catch (Exception e) {
+            // 记录错误日志或进行其他处理
+            System.err.println("Error sending project info to cloud: " + e.getMessage());
+        }
+
         return "操作成功";
     }
 
@@ -794,6 +829,12 @@ public class CwFinanceInvoiceService extends ServiceImpl<CwFinanceInvoiceMapper,
         // 发票
         if (TaskAliasEnum.REIMBURSEMENT.getCpaTaskAlias().equals(taskAliasEnum.getCpaTaskAlias())) {
             CwFinanceInvoiceDTO cwFinanceInvoiceDTO = cwFinanceInvoiceMapper.queryByProcId(id);
+            if(ObjectUtil.isNotEmpty(cwFinanceInvoiceDTO) && ObjectUtil.isNotEmpty(cwFinanceInvoiceDTO.getRedInvoiceFlag()) && 1 == cwFinanceInvoiceDTO.getRedInvoiceFlag()){
+                //此处为红冲数据 需要获取发票号
+                CwFinanceInvoiceDTO redCwFinanceInvoiceDTO = cwFinanceInvoiceMapper.queryById(cwFinanceInvoiceDTO.getRedInvoiceRelevancyId());
+                String invoiceNumberStr = cwFinanceInvoiceMapper.getInvoiceNumberStr(redCwFinanceInvoiceDTO.getId());
+                cwFinanceInvoiceDTO.setInvoiceNumberStr(invoiceNumberStr);
+            }
             String label = SpringUtil.getBean(IDictApi.class).getDictLabel(cwFinanceInvoiceDTO.getReceivablesType(), "invoice_receivables_type", "");
             cwFinanceInvoiceDTO.setReceivablesTypeLabel(label);
             String contentLabel = SpringUtil.getBean(IDictApi.class).getDictLabel(cwFinanceInvoiceDTO.getBillingContent(), "invoice_billing_content", "");
@@ -866,4 +907,208 @@ public class CwFinanceInvoiceService extends ServiceImpl<CwFinanceInvoiceMapper,
         }
         return null;
     }
+
+
+    public IPage<CwFinanceInvoiceDTO> findRedList(Page<CwFinanceInvoiceDTO> page, CwFinanceInvoiceDTO cwFinanceInvoiceDTO,String export) throws Exception{
+        QueryWrapper<CwFinanceInvoice> queryWrapper = QueryWrapperGenerator.buildQueryCondition ( CwFinanceInvoiceWrapper.INSTANCE.toEntity(cwFinanceInvoiceDTO), CwFinanceInvoice.class );
+        queryWrapper.eq("fi.del_flag","0");
+        queryWrapper.eq("a.del_flag","0");
+        //判定开票金额大于等于0 的发票信息
+        queryWrapper.ge("fi.account","0");
+        ArrayList<String> searchIdList = new ArrayList<>();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        AtomicInteger checkNum = new AtomicInteger();
+        if (ObjectUtil.isNotEmpty(cwFinanceInvoiceDTO)) {
+            // 发票号查询
+            if (StringUtils.isNotBlank(cwFinanceInvoiceDTO.getNumber())) {
+                List<CwFinanceInvoiceDetail> cwFinanceInvoiceDetails = cwFinanceInvoiceDetailMapper.selectList(new LambdaQueryWrapper<CwFinanceInvoiceDetail>().like(CwFinanceInvoiceDetail::getNumber, cwFinanceInvoiceDTO.getNumber()));
+                List<String> ids = cwFinanceInvoiceDetails.stream().distinct().map(CwFinanceInvoiceDetail::getInvoiceId).collect(Collectors.toList());
+                if(CollectionUtil.isEmpty(ids)) {
+                    return new Page<CwFinanceInvoiceDTO>();
+                }else{
+                    if (CollectionUtil.isNotEmpty(searchIdList)){
+                        List<String> newSearchIdList = getSearchList(searchIdList,ids);
+                        searchIdList = new ArrayList<String>();
+                        for (String item : newSearchIdList) {
+                            searchIdList.add(item);
+                        }
+                    }else{
+                        if (checkNum.get() > 0){
+                            return new Page<CwFinanceInvoiceDTO>();
+                        }else{
+                            for (String item : ids) {
+                                searchIdList.add(item);
+                            }
+                        }
+                    }
+                    checkNum.getAndIncrement();
+                }
+            }
+            // 开票总金额
+            if (StringUtils.isNotBlank(cwFinanceInvoiceDTO.getAccountBegin())&&StringUtils.isNotBlank(cwFinanceInvoiceDTO.getAccountEnd())) {
+                List<CwFinanceInvoice> cwFinanceInvoices = cwFinanceInvoiceMapper.selectList(new LambdaQueryWrapper<CwFinanceInvoice>()
+                        .between(CwFinanceInvoice::getAccount, new BigDecimal(cwFinanceInvoiceDTO.getAccountBegin()), new BigDecimal(cwFinanceInvoiceDTO.getAccountEnd())));
+                List<String> ids = cwFinanceInvoices.stream().distinct().map(CwFinanceInvoice::getId).collect(Collectors.toList());
+                if(CollectionUtil.isEmpty(ids)) {
+                    return new Page<CwFinanceInvoiceDTO>();
+                }else{
+                    if (CollectionUtil.isNotEmpty(searchIdList)){
+                        List<String> newSearchIdList = getSearchList(searchIdList,ids);
+                        searchIdList = new ArrayList<String>();
+                        for (String item : newSearchIdList) {
+                            searchIdList.add(item);
+                        }
+                    }else{
+                        if (checkNum.get() > 0){
+                            return new Page<CwFinanceInvoiceDTO>();
+                        }else{
+                            for (String item : ids) {
+                                searchIdList.add(item);
+                            }
+                        }
+                    }
+                    checkNum.getAndIncrement();
+                }
+            }
+            // 开票日期
+            if (StringUtils.isNotBlank(cwFinanceInvoiceDTO.getBillingDateBegin())&&StringUtils.isNotBlank(cwFinanceInvoiceDTO.getBillingDateEnd())) {
+                List<CwFinanceInvoice> cwFinanceInvoices = cwFinanceInvoiceMapper.selectList(new LambdaQueryWrapper<CwFinanceInvoice>()
+                        .between(CwFinanceInvoice::getBillingDate, sdf.parse(cwFinanceInvoiceDTO.getBillingDateBegin()), sdf.parse(cwFinanceInvoiceDTO.getBillingDateEnd())));
+                List<String> ids = cwFinanceInvoices.stream().distinct().map(CwFinanceInvoice::getId).collect(Collectors.toList());
+                if(CollectionUtil.isEmpty(ids)) {
+                    return new Page<CwFinanceInvoiceDTO>();
+                }else{
+                    if (CollectionUtil.isNotEmpty(searchIdList)){
+                        List<String> newSearchIdList = getSearchList(searchIdList,ids);
+                        searchIdList = new ArrayList<String>();
+                        for (String item : newSearchIdList) {
+                            searchIdList.add(item);
+                        }
+                    }else{
+                        if (checkNum.get() > 0){
+                            return new Page<CwFinanceInvoiceDTO>();
+                        }else{
+                            for (String item : ids) {
+                                searchIdList.add(item);
+                            }
+                        }
+                    }
+                    checkNum.getAndIncrement();
+                }
+            }
+            // 收款日期
+            if (StringUtils.isNotBlank(cwFinanceInvoiceDTO.getRemittanceDateBegin())&&StringUtils.isNotBlank(cwFinanceInvoiceDTO.getRemittanceDateEnd())) {
+                List<CwFinanceInvoice> cwFinanceInvoices = cwFinanceInvoiceMapper.selectList(new LambdaQueryWrapper<CwFinanceInvoice>()
+                        .between(CwFinanceInvoice::getReceivablesDate, sdf.parse(cwFinanceInvoiceDTO.getRemittanceDateBegin()), sdf.parse(cwFinanceInvoiceDTO.getRemittanceDateEnd())));
+                List<String> ids = cwFinanceInvoices.stream().distinct().map(CwFinanceInvoice::getId).collect(Collectors.toList());
+                if(CollectionUtil.isEmpty(ids)) {
+                    return new Page<CwFinanceInvoiceDTO>();
+                }else{
+                    if (CollectionUtil.isNotEmpty(searchIdList)){
+                        List<String> newSearchIdList = getSearchList(searchIdList,ids);
+                        searchIdList = new ArrayList<String>();
+                        for (String item : newSearchIdList) {
+                            searchIdList.add(item);
+                        }
+                    }else{
+                        if (checkNum.get() > 0){
+                            return new Page<CwFinanceInvoiceDTO>();
+                        }else{
+                            for (String item : ids) {
+                                searchIdList.add(item);
+                            }
+                        }
+                    }
+                    checkNum.getAndIncrement();
+                }
+            }
+            // 项目名称
+            if (StringUtils.isNotBlank(cwFinanceInvoiceDTO.getProgramId())){
+                List<CwFinanceInvoiceBase> cwFinanceInvoiceBaseList = cwFinanceInvoiceBaseMapper.selectList(new LambdaQueryWrapper<CwFinanceInvoiceBase>()
+                        .eq(CwFinanceInvoiceBase::getProgramId, cwFinanceInvoiceDTO.getProgramId()));
+                List<String> ids = cwFinanceInvoiceBaseList.stream().distinct().map(CwFinanceInvoiceBase::getInvoiceId).collect(Collectors.toList());
+                if(CollectionUtil.isEmpty(ids)) {
+                    return new Page<CwFinanceInvoiceDTO>();
+                }else{
+                    if (CollectionUtil.isNotEmpty(searchIdList)){
+                        List<String> newSearchIdList = getSearchList(searchIdList,ids);
+                        searchIdList = new ArrayList<String>();
+                        for (String item : newSearchIdList) {
+                            searchIdList.add(item);
+                        }
+                    }else{
+                        if (checkNum.get() > 0){
+                            return new Page<CwFinanceInvoiceDTO>();
+                        }else{
+                            for (String item : ids) {
+                                searchIdList.add(item);
+                            }
+                        }
+                    }
+                    checkNum.getAndIncrement();
+
+                }
+            }
+            // 经办人
+            if (StringUtils.isNotBlank(cwFinanceInvoiceDTO.getOperator())){
+                queryWrapper.like("su.id", cwFinanceInvoiceDTO.getOperator()).or().like("su.name", cwFinanceInvoiceDTO.getOperator());
+            }
+            //报备类型
+            if (StringUtils.isNotBlank(cwFinanceInvoiceDTO.getReportType())){
+                queryWrapper.eq("fi.report_type",cwFinanceInvoiceDTO.getReportType()).or(i->i.eq("pr.report_type",cwFinanceInvoiceDTO.getReportType()));
+            }
+            if (StringUtils.isNotBlank(cwFinanceInvoiceDTO.getReconciliationPeopleName())) {
+                queryWrapper.eq("fi.reconciliation_people",cwFinanceInvoiceDTO.getReconciliationPeopleName()).or().like("su1.name",cwFinanceInvoiceDTO.getReconciliationPeopleName());
+            }
+            // 经办人部门
+            if (StringUtils.isNotBlank(cwFinanceInvoiceDTO.getOperatorOffice())){
+                List<User> userList = SpringUtil.getBean ( IUserApi.class ).getUserByOfficeAll(cwFinanceInvoiceDTO.getOperatorOffice());
+                if (CollectionUtil.isNotEmpty(userList)) {
+                    List<String> userIdList = userList.stream().distinct().map(User::getId).collect(Collectors.toList());
+                    if (CollectionUtil.isNotEmpty(userIdList)) {
+                        queryWrapper.in("fi.create_by_id",userIdList);
+                    } else {
+                        return new Page<CwFinanceInvoiceDTO>();
+                    }
+                } else {
+                    return new Page<CwFinanceInvoiceDTO>();
+                }
+            }
+        }
+        if (CollectionUtil.isNotEmpty(searchIdList)){
+            List<String> ids = searchIdList.stream().distinct().collect(Collectors.toList());
+            queryWrapper.in("fi.id",ids);
+        } else{
+            if (checkNum.get() > 0) {
+                return new Page<CwFinanceInvoiceDTO>();
+            }
+        }
+        IPage<CwFinanceInvoiceDTO> list = null;
+        list = cwFinanceInvoiceMapper.findList(page, queryWrapper);
+
+        return list;
+    }
+
+    /*
+    查询开票时间距今超过1个月的开票数据
+     */
+    public List<CwFinanceInvoiceDTO> getExceedCwFinance() {
+
+        //查询开票时间为空的,或者是否开票为否的  开票时间距今超过1个月的开票数据
+        List<CwFinanceInvoiceDTO> list=cwFinanceInvoiceMapper.getExceedCwFinance();
+        //将红字发票及红字发票关联的发票进行剔除
+        ArrayList<String> redReveId = new ArrayList<>();
+        for (CwFinanceInvoiceDTO cwFinanceInvoiceDTO : list) {
+            if (ObjectUtils.isNotEmpty(cwFinanceInvoiceDTO.getRedInvoiceFlag()) && 1 == cwFinanceInvoiceDTO.getRedInvoiceFlag()){
+                redReveId.add(cwFinanceInvoiceDTO.getId());
+                redReveId.add(cwFinanceInvoiceDTO.getRedInvoiceRelevancyId());
+            }
+        }
+        //将redReveId中存放的id从list中进行去除
+        List<CwFinanceInvoiceDTO> filteredList = list.stream()
+                .filter(dto -> !redReveId.contains(dto.getId()))
+                .collect(Collectors.toList());
+
+        return filteredList;
+    }
 }

+ 6 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/dto/CwFinanceInvoiceDTO.java

@@ -353,6 +353,12 @@ public class CwFinanceInvoiceDTO extends BaseDTO {
 
     private String createByName;
 
+    private Integer redInvoiceFlag; //是否红字发票
+    private String redInvoiceRelevancyId;	//红字发票关联其他发票id
+    private String redInvoiceRelevancyNumber;	//红字发票关联其他发票编号
+    private String invoiceNumberStr;	//红字发票关联其他发票号
+    private List<String> redNotStatusList;
+
 
 
     private static final long serialVersionUID = 1L;

+ 3 - 1
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/xml/CwFillingbatchInfoMapper.xml

@@ -123,7 +123,9 @@
         left join sys_user su1 on a.create_by_id = su1.id and su1.del_flag = '0'
         left join cw_project_report_review_new cprn on a.id = cprn.project_id
         ${ew.customSqlSegment}
-        and a.project_level= '2' and a.del_flag = '0' and cprn.review_status  = '5' order by a.create_time DESC
+        and a.project_level= '2' and a.del_flag = '0' and cprn.review_status  = '5'
+        and a.id not in (select cpr.project_id from cw_project_report cpr left join cw_fillingbatch_project cfp on cpr.id = cfp.report_id where cfp.status in (2,3,5))
+         order by a.create_time DESC
     </select>
 
     <select id="getIdList" resultType="string">

+ 2 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/xml/CwProjectRecordsMapper.xml

@@ -401,6 +401,7 @@
         su.name as user_name,
         su2.name as project_master_name,
         su3.name as real_header_name,
+        su4.name as project_leader_name,
         cw_wci.contract_name,
         cw_wci.contract_amount,
         cw_wci.contract_num,
@@ -413,6 +414,7 @@
         left join sys_user su on su.id = a.create_by_id and su.del_flag = '0'
         left join sys_user su2 on su2.id = a.project_master_id and su2.del_flag = '0'
         left join sys_user su3 on su3.id = a.real_header and su3.del_flag = '0'
+        left join sys_user su4 on su4.id = a.project_leader_id and su4.del_flag = '0'
         left join cw_work_contract_info cw_wci on cw_wci.id = a.contract_id and cw_wci.del_flag = '0'
         left join cw_work_client_base cw_wcb on cw_wci.client_contacts = cw_wcb.id and cw_wcb.del_flag = '0'
         left join cw_project_business_type cw_pbt on cw_pbt.id = a.business_type and cw_pbt.del_flag = '0'

+ 20 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/CwFillingbatchService.java

@@ -21,7 +21,9 @@ import com.jeeplus.finance.projectRecords.service.dto.CwFillingbatchInfoDTO;
 import com.jeeplus.finance.projectRecords.service.dto.CwFillingbatchProjectDTO;
 import com.jeeplus.finance.projectRecords.service.dto.CwProjectRecordsDTO;
 import com.jeeplus.finance.projectReport.domain.CwProjectReport;
+import com.jeeplus.finance.projectReport.domain.CwProjectReportPaperArchiving;
 import com.jeeplus.finance.projectReport.mapper.CwProjectReportMapper;
+import com.jeeplus.finance.projectReport.mapper.CwProjectReportPaperArchivingMapper;
 import com.jeeplus.sys.feign.IUserApi;
 import com.jeeplus.sys.feign.IWorkAttachmentApi;
 import com.jeeplus.sys.service.dto.UserDTO;
@@ -57,6 +59,9 @@ public class CwFillingbatchService {
     @Resource
     private CwProjectRecordsMapper cwProjectRecordsMapper;
 
+    @Resource
+    private CwProjectReportPaperArchivingMapper cwProjectReportPaperArchivingMapper;
+
     public IPage<CwFillingbatchInfoDTO> list(CwFillingbatchInfoDTO info, Page<CwFillingbatchInfoDTO> page) {
         QueryWrapper<CwFillingbatchInfoDTO> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("a.del_flag", 0);
@@ -348,7 +353,22 @@ public class CwFillingbatchService {
                         project1.setAchiveNo(cwFillingbatchProject.getAchiveNo());
                         project1.setStatus(cwFillingbatchProject.getProjectStatus());
                         cwFillingbatchProjectMapper.updateById(project1);
+                        //对纸质归档数据做处理
+                        if (StringUtils.isNotBlank(cwFillingbatchProject.getProjectStatus())){
+                            if (cwFillingbatchProject.getProjectStatus().equals("5")){
+                                CwProjectReportPaperArchiving cwProjectReportPaperArchiving = cwProjectReportPaperArchivingMapper.selectOne(new QueryWrapper<CwProjectReportPaperArchiving>().eq("report_id", cwFillingbatchProject.getReportId()).eq("del_flag", "0"));
+                                if (cwProjectReportPaperArchiving != null && StringUtils.isNotBlank(cwProjectReportPaperArchiving.getId())){
+                                    cwProjectReportPaperArchivingMapper.updateStatusById(cwProjectReportPaperArchiving.getId(),"5");
+                                }else {
+                                    CwProjectReportPaperArchiving archiving = new CwProjectReportPaperArchiving();
+                                    archiving.setStatus("5");
+                                    archiving.setReportId(cwFillingbatchProject.getReportId());
+                                    cwProjectReportPaperArchivingMapper.insert(archiving);
+                                }
+                            }
+                        }
                     }
+
                 }
             }
             cwFillingbatchInfo.setAuditAgreeTime(new Date());

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

@@ -117,6 +117,7 @@ public class CwProjectRecordsDTO extends BaseDTO {
      * 现场负责人
      */
     private String projectLeaderId;
+    private String projectLeaderName;
 
     /**
      * 流程id

+ 5 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/reimbursement/reimbursementInfo/service/ReimbursementInfoService.java

@@ -653,6 +653,7 @@ public class ReimbursementInfoService {
         List<TreeUserDto> officeList = infoMapper.findOfficeListByCompanyId(userDTO.getCompanyDTO().getId());
         List<TreeUserDto> filterList = new ArrayList<>();
         filterList = officeList;
+        filterList.removeIf(item -> item.getOfficeName() != null && item.getOfficeName().contains("工程三部"));
         /*if (userDTO.isAdmin ()) {
             filterList = officeList;
         } else {
@@ -740,6 +741,8 @@ public class ReimbursementInfoService {
 
         // 查询用户
         List<TreeUserDto> userList = infoMapper.findUserList(name);
+        userList.removeIf(item -> item.getOfficeName() != null && item.getOfficeName().contains("工程三部"));
+
         /*if (CollectionUtils.isNotEmpty(userList)) {
             list.addAll(userList);
         }*/
@@ -767,9 +770,11 @@ public class ReimbursementInfoService {
         }
         List<TreeUserDto> filterList = new ArrayList<>();
         filterList = officeList;
+        filterList.removeIf(item -> item.getOfficeName() != null && item.getOfficeName().contains("工程三部"));
 
         // 查询用户
         List<TreeUserDto> userList = infoMapper.findUserListNew(name);
+        userList.removeIf(item -> item.getOfficeName() != null && item.getOfficeName().contains("工程三部"));
         list = disposeUserTree(userList, filterList);
         for (TreeUserDto officeDto : officeList) {
             if("0".equals(officeDto.getParentId())){

+ 23 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/controller/OfficeController.java

@@ -146,6 +146,29 @@ public class OfficeController {
      * @return
      */
     @ApiLog("获取部门数据")
+    @GetMapping("treeDataNoThree")
+    public ResponseEntity <List <OfficeDTO>> treeDataNoThree(@RequestParam(required = false) String tenantId,
+                                                      @RequestParam(required = false) String parentId,
+                                                      @RequestParam(required = false) String extId,
+                                                      @RequestParam(required = false) String type,
+                                                      @RequestParam(required = false, defaultValue = CommonConstants.NO) String showAll) {
+        List <OfficeDTO> list = officeService.findList ( tenantId, parentId );
+        //将工程三部剔除掉
+        list.removeIf(office -> office.getName().contains("工程三部"));
+        //List <OfficeDTO> rootTree = officeService.getRootTree (list, extId, type, showAll,"1" );
+        List <OfficeDTO> rootTree = officeService.getOldRootTree (parentId,list, extId, type, showAll );
+        return ResponseEntity.ok ( rootTree );
+    }
+
+    /**
+     * 获取机构JSON数据。
+     *
+     * @param extId   排除的ID
+     * @param type    类型(1:公司;2:部门)
+     * @param showAll 是否显示不可用数据 1 显示 0 隐藏
+     * @return
+     */
+    @ApiLog("获取部门数据")
     @GetMapping("treeDataNew")
     public ResponseEntity <List <OfficeDTO>> treeDataNew(@RequestParam(required = false) String tenantId,
                                                       @RequestParam(required = false) String parentId,

+ 173 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/controller/UserController.java

@@ -455,6 +455,149 @@ public class UserController {
      * @param page
      * @return
      */
+    @ApiLog("用户数据列表")
+    @ApiOperation(value = "用户数据列表")
+    //@PreAuthorize("hasAuthority('sys:user:list')")
+    @GetMapping("listNoThree")
+    public ResponseEntity listNoThree(UserDTO userDTO, Page <UserDTO> page) throws Exception {
+//        QueryWrapper <UserDTO> queryWrapper = QueryWrapperGenerator.buildQueryCondition ( userDTO, UserDTO.class );
+//        if ( userDTO.getTenantDTO ( ) != null && StrUtil.isNotBlank ( userDTO.getTenantDTO ( ).getId ( ) ) ) {
+//            queryWrapper.eq ( "a.tenant_id", userDTO.getTenantDTO ( ).getId ( ) );
+//        }
+//        IPage <UserDTO> result = userService.findPage ( page, queryWrapper );
+//        return ResponseEntity.ok ( result );
+
+        QueryWrapper <UserDTO> queryWrapper = QueryWrapperGenerator.buildQueryCondition ( userDTO, UserDTO.class );
+        // 管理员查询不限制
+        if (!UserUtils.getCurrentUserDTO().isAdmin()) {
+            queryWrapper.isNull("a.is_admin");
+            if (ObjectUtil.isNotEmpty(userDTO)){
+                if (ObjectUtil.isNotEmpty(userDTO.getCompanyDTO()) && ObjectUtil.isNotEmpty(userDTO.getOfficeDTO())) {
+                    String id = UserUtils.getCurrentUserDTO().getCompanyDTO().getId();
+                    if (StringUtils.isNotBlank(userDTO.getCertType())) {
+                        //获取当前登陆人是否事中审公司人员
+                        /*if(officeDTO.getParentIds().contains("1615171302381182978")){
+
+                        }*/
+                    }else{
+                        // 当不是精确的部门查询时,再添加下面的筛选条件
+                        if ((StringUtils.isNotBlank(userDTO.getCompanyDTO().getId()) && StringUtils.isBlank(userDTO.getOfficeDTO().getId()))
+                                || "true".equals(userDTO.getSelectAll())) {
+                            // officeDTO.id是空,companyDTO.id不是空的话,说明前端组件点击的集团来进行查询
+                            // selectAll为‘true’的话,说明前端没有选择集团或者部门查询,这个时候要展示全部人员
+                            // 根据当前用户的部门id找到此部门的ids
+                            String ids = officeService.getById(UserUtils.getCurrentUserDTO().getOfficeDTO().getId()).getParentIds();
+                            // 根据ids分隔后的index[2],找到当前用户的所属公司id
+                            String companyId = null;
+                            String[] split = ids.split(",");
+                            // split.length大于2,说明当前登录人所属部门是普通部门,展示部分人员信息
+                            // 否则,当前登录人所属公共类部门(忘了叫什么类部门了,就是总经办那种部门),展示全部人员信息
+                            if(split.length>2){
+                                companyId = split[2];
+                                // 根据公司id,找到此公司下的所有部门
+                                List<Office> officeList = officeService.list(new QueryWrapper<Office>().lambda().eq(Office::getParentId, companyId));
+                                Set officeIdSet = new HashSet();
+                                for (Office office : officeList) {
+                                    if(StringUtils.isNotBlank(office.getId())){
+                                        officeIdSet.add(office.getId());
+                                    }
+                                }
+                                List<String> officeIdList = Lists.newArrayList(officeIdSet);
+                                // 拿到这些部门的id
+                                //List<String> officeIdList = officeList.stream().distinct().map(Office::getId).collect(Collectors.toList());
+                                // 拿到所有公有部门的id
+                                List<String> officePublicIdList = officeService.list(new LambdaQueryWrapper<Office>().eq(Office::getIsPublic,"1")).stream().map(Office::getId).collect(Collectors.toList());
+                                // 拿到直属公司的id
+                                officeIdList.add(companyId);
+                                // 最后得到的所有部门的id
+                                officeIdList.addAll(officePublicIdList);
+                                List<String> lastIds = officeIdList.stream().distinct().collect(Collectors.toList());
+                                // 添加筛选条件为这些部门的id
+                                queryWrapper.in("a.office_id",lastIds);
+                            }
+                        } else if(StringUtils.isBlank(userDTO.getCompanyDTO().getId()) && StringUtils.isNotBlank(userDTO.getOfficeDTO().getId())) {
+                            // officeDTO.id不是空,companyDTO.id是空的话,说明前端组件点击的部门查询
+                            queryWrapper.eq("a.office_id",userDTO.getOfficeDTO().getId());
+                        }
+                    }
+                }
+            }
+        }
+        if (ObjectUtil.isNotEmpty(userDTO)) {
+            // 当certType传值时,获取拥有此资格证类型的人员
+            if (StringUtils.isNotBlank(userDTO.getCertType())) {
+
+                //获取当前登录人信息
+                UserDTO loginUserDTO = UserUtils.getCurrentUserDTO();
+                //如果当前登录人是中审的管理咨询部人员,则注会列表中添加该部门选择项
+                if(null != loginUserDTO && null != loginUserDTO.getOfficeDTO()){
+                    OfficeDTO officeDTO = loginUserDTO.getOfficeDTO();
+                    if(StringUtils.isNotBlank(officeDTO.getId())){
+                        if("1602840084816138241".equals(officeDTO.getId())){
+                            queryWrapper.and(
+                                    wrapper -> wrapper.eq("sc.type",userDTO.getCertType()).or().eq("a.office_id","1602840084816138241")
+                            );
+                            //queryWrapper.eq("sc.type",userDTO.getCertType()).or().eq("a.office_id","1602840084816138241");
+                        }else{
+                            queryWrapper.eq("sc.type",userDTO.getCertType());
+                        }
+                    }else{
+                        queryWrapper.eq("sc.type",userDTO.getCertType());
+                    }
+                }else{
+                    queryWrapper.eq("sc.type",userDTO.getCertType());
+                }
+
+            }
+            if ( userDTO.getTenantDTO ( ) != null && StrUtil.isNotBlank ( userDTO.getTenantDTO ( ).getId ( ) ) ) {
+                queryWrapper.eq ( "a.tenant_id", userDTO.getTenantDTO ( ).getId ( ) );
+            }
+        }
+        IPage <UserDTO> result = userService.findPage ( page, queryWrapper );
+        IPage<UserDTO> result2 = userService.findPage3(userDTO);
+        //判断 如果是签字注师筛选,则获取签字注师的被选择次数
+        if(StringUtils.isNotBlank(userDTO.getCertType()) && "6".equals(userDTO.getCertType())){
+            List<UserDTO> userList = result.getRecords();
+            List<UserDTO> user2List = result2.getRecords();
+            List<String> idList = Lists.newArrayList();
+            for (UserDTO dto : user2List) {
+                idList.add(dto.getId());
+            }
+            for (UserDTO info : userList) {
+                if(idList.size()>0){
+                    if(idList.contains(info.getId())){
+                        info.setAccountantUserFlag(0);
+                    }else{
+                        info.setAccountantUserFlag(1);
+                    }
+                }else{
+                    if("潘中".equals(info.getName())){
+                        info.setAccountantUserFlag(0);
+                    }else{
+                        info.setAccountantUserFlag(1);
+                    }
+                }
+                /*if("潘中".equals(info.getName())){
+                    info.setAccountantUserFlag(0);
+                }else{
+                    info.setAccountantUserFlag(1);
+                }*/
+                Integer accountantUserCount = userService.getAccountantUserCount(info.getId());
+                info.setAccountantUserCount(accountantUserCount);
+            }
+        }
+        List<UserDTO> records = result.getRecords();
+        records.removeIf(item -> item.getOfficeDTO().getName().contains("工程三部"));
+        return ResponseEntity.ok ( result );
+    }
+
+    /**
+     * 查询列表
+     *
+     * @param userDTO
+     * @param page
+     * @return
+     */
     @ApiLog("用户数据列表(新)")
     @ApiOperation(value = "用户数据列表(新)")
     @GetMapping("listNew")
@@ -1144,6 +1287,36 @@ public class UserController {
         return ResponseEntity.ok (rootTree);
     }
 
+
+    /**
+     * 获取机构JSON数据(除工程三部)。
+     *
+     * @param officeName 部门名称
+     * @param extId 排除的ID
+     * @param type  类型(1:公司;2:部门)
+     * @param showAll 是否显示不可用数据 1 显示 0 隐藏
+     * @return
+     */
+    @ApiLog("获取部门用户数据")
+    @GetMapping("treeUserDataOfficeNoThree")
+    public ResponseEntity treeUserDataOfficeNoThree(@RequestParam(required = false) String officeName,@RequestParam(required = false) String extId, @RequestParam(required = false) String type, @RequestParam(required = false, defaultValue = CommonConstants.NO) String showAll) {
+        List<OfficeDTO> list = officeService.getOfficeAllByOfficeName (officeName);
+        //将工程三部剔除掉
+        list.removeIf(office -> office.getName().contains("工程三部"));
+        if(list.size()>0){
+            List<String> officeIds = Lists.newArrayList();
+            for (OfficeDTO info : list) {
+                info.setTypeFlag(true);
+                officeIds.add(info.getId());
+            }
+            //根据部门查询对应部门下的所有数据
+            List<OfficeDTO> officeDTOList = userService.getUserByOffice(officeIds,type);
+            list.addAll(officeDTOList);
+        }
+        List rootTree = officeService.getRootTree (list, extId, type, showAll, "1");
+        return ResponseEntity.ok (rootTree);
+    }
+
     /**
      * 获取机构JSON数据。
      *

+ 325 - 0
jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/jeeplus/domain/CwFinanceInvoiceList.java

@@ -0,0 +1,325 @@
+package com.jeeplus.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.sys.service.dto.UserDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 财务管理-发票
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class CwFinanceInvoiceList {
+
+    public static final String BIZ_CODE = "4";
+
+    private UserDTO createBy;
+    private String id;
+    /**
+     * 发票申请编号
+     */
+    private String no;
+
+    /**
+     * 项目名称
+     */
+    private String programName;
+
+    private String reportNos;
+
+    /**
+     * 实际开票单位
+     */
+    private String billingWorkplaceReal;
+
+    /**
+     * 经办人
+     */
+    private String operator;
+
+    /**
+     * 经办人部门
+     */
+    private String operatorOffice;
+
+    /**
+     * 发票号
+     */
+    private String number;
+
+    /**
+     * 开票金额(元)
+     */
+    private String account;
+
+    private String baseAccount;
+
+    /**
+     * 发票金额(元)
+     */
+    private String accountDetail;
+
+    private String reportType;
+
+    private String projectClassification;
+
+    /**
+     * 开票内容
+     */
+    private String billingContent;
+
+    /**
+     * 发票类型
+     */
+    private String type;
+
+    /**
+     * 开票时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date billingDate;
+
+    /**
+     * 状态
+     */
+    private String status;
+
+    /**
+     * 收款日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date receivablesDate;
+
+    /**
+     * 是否确认收款
+     */
+    private String receivablesStatus;
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 开票类型
+     */
+    private String billingType;
+
+
+    /**
+     * 纳税人识别号
+     */
+    private String taxpayerIdentificationNo;
+
+    /**
+     * 地址
+     */
+    private String address;
+
+    /**
+     * 电话
+     */
+    private String telPhone;
+
+    /**
+     * 开户银行
+     */
+    private String openBank;
+
+    /**
+     * 银行账号
+     */
+    private String bankAccount;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 收款类型
+     */
+    private String receivablesType;
+
+    /**
+     * 开票内容要求
+     */
+    private String billingContentTerms;
+
+    /**
+     * 开票人
+     */
+    private String billingPeople;
+
+
+    /**
+     * 领票时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date collectDate;
+
+    /**
+     * 实际开票人
+     */
+    private String billingPeopleReal;
+    /**
+     * 实际开票人姓名
+     */
+    private String billingPeopleRealName;
+
+    /**
+     * 对账人id
+     */
+    private String reconciliationPeople;
+
+    /**
+     * 对账人姓名
+     */
+    private String reconciliationPeopleName;
+
+    /**
+     * 对账地区
+     */
+    private String reconciliationArea;
+
+    /**
+     * 实际开票单位id
+     */
+    private String billingWorkplaceRealId;
+
+    /**
+     * 开票人id
+     */
+    private String billingPeopleId;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     * 流程信息
+     */
+    private String processDefinitionId;
+
+    /**
+     * 是否作废
+     */
+    private String invalidStatus;
+
+    /**
+     * 开票总金额 Begin
+     */
+    private String accountBegin;
+
+    /**
+     * 开票总金额 End
+     */
+    private String accountEnd;
+
+    /**
+     * 开票日期 Begin
+     */
+    private String billingDateBegin;
+
+    /**
+     * 开票日期 End
+     */
+    private String billingDateEnd;
+
+    /**
+     * 收款日期Begin
+     */
+    private String remittanceDateBegin;
+
+    /**
+     * 收款日期End
+     */
+    private String remittanceDateEnd;
+
+    /**
+     * 项目id
+     */
+    private String programId;
+
+    /**
+     * 数据审核人  发票申请
+     */
+    private List<String> auditUserIds;
+
+    /**
+     * 发票作废  taskId
+     */
+    private String invalidTaskId;
+
+    private String taskId;
+
+    /**
+     * 数据审核人  发票作废
+     */
+    private List<String> auditUserIdsInvalid;
+
+    /**
+     * 是否为收款页面   0否  1是
+     */
+    private String isReceivables;
+
+    /**
+     * 是否多张开票  1是  0否
+     */
+    private String isMultiple;
+
+    /**
+     * 实际开票单位的开票信息id
+     */
+    private String billingId;
+
+
+    /**
+     * 基本信息表id
+     */
+    private String baseId;
+
+    /**
+     * 基本信息中的类型(项目:1;报告:2;其他:0)
+     */
+    private String recordType;
+
+    /**
+     * 报告文号
+     */
+    private String reportNo;
+
+    /**
+     * 邮箱账号
+     */
+    private String actualDrawerEmailAddress;
+
+    /**
+     * 单选类型确认
+     */
+    private String checkType;
+    /**
+     * 是否预开票
+     */
+    private String isPreInvoice;
+
+    private String createName;
+
+    /*8
+    预开票已关联
+     */
+    private String isCompleteInvoice;
+
+
+
+    private static final long serialVersionUID = 1L;
+}

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

@@ -3,6 +3,7 @@ package com.xxl.job.executor.feign;
 import com.jeeplus.common.constant.AppNameConstants;
 import com.jeeplus.flowable.feign.IFinanceApi;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
 
 /**
  * @author: 王强
@@ -10,4 +11,10 @@ import org.springframework.cloud.openfeign.FeignClient;
  **/
 @FeignClient(contextId = "financeFeignApi", name = AppNameConstants.APP_FINANCE_MODULES)
 public interface FinanceFeignApi extends IFinanceApi {
+
+    /**
+     * 查询开票时间距今超过1个月的开票数据
+     */
+    @GetMapping(value = "/cw_finance/invoice/getExceedCwFinance")
+    String getExceedCwFinance();
 }

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

@@ -457,6 +457,95 @@ public class SampleXxlJob {
         }
     }
 
+    /**
+     * 苏州-超期收款发票通知
+     */
+//    @XxlJob("exceedSzFinance")
+//    public void exceedCwFinance(){
+//        String exceedCwFinance = SpringUtil.getBean(FinanceFeignApi.class).getExceedCwFinance();
+//        List<CwFinanceInvoiceList> invoiceList = JSON.parseObject(exceedCwFinance, new TypeReference<List<CwFinanceInvoiceList>>() {});
+//        for (CwFinanceInvoiceList invoice : invoiceList) {
+//            //对数据进行发送通知
+//            String taskName = null;
+//            String titleStr = null;
+//            String title = null; //查询是否已经通知时使用的title
+//
+//            int interval = Integer.parseInt(this.getInterval(invoice.getBillingDate(), new Date()));
+//
+//            taskName = "超期收款发票";
+//            if (StringUtils.isNotBlank(invoice.getProgramName())){
+//                titleStr = "发票编号为"+ invoice.getNo()+"的项目["+invoice.getProgramName()+"],开票金额为:"+invoice.getAccount() +"元,已超期"+interval+"天,请尽快收款";
+//                title = "发票编号为"+ invoice.getNo()+"的项目["+invoice.getProgramName()+"],开票金额为:"+invoice.getAccount() +"元";
+//            }else {
+//                titleStr = "发票编号为"+ invoice.getNo()+",开票金额为:"+invoice.getAccount() +"元,已超期"+interval+"天,请尽快收款";
+//                title = "发票编号为"+ invoice.getNo()+",开票金额为:"+invoice.getAccount() +"元";
+//            }
+//            Set<String> noticeUserSet = new HashSet<String>();
+//
+//            //获取人员信息
+//            String byIdForXXL = SpringUtil.getBean(IUserApi.class).getByIdForXXL(invoice.getCreateBy().getId());
+//            UserDTO createUser = JSON.parseObject(byIdForXXL, new TypeReference<UserDTO>() {});
+//
+//            if(null != createUser && StringUtils.isNotBlank(createUser.getId())){
+//                noticeUserSet.add(createUser.getId());
+//            }
+//            List<String> noticeUserList = new ArrayList<String>(noticeUserSet);
+//            if(noticeUserList.size()>0){
+//                MyNoticeList myNotice = new MyNoticeList();
+//                myNotice.setCreateById("1");
+//                myNotice.setCreateTime(new Date());
+//                myNotice.setUpdateById("1");
+//                myNotice.setUpdateTime(new Date());
+//                myNotice.setDelFlag(0);
+//                //根据procInsId获取taskId
+////                String currentTask = SpringUtil.getBean(IFlowableApi.class).getTaskIdByprocInstId(info.getProcInsId());
+//                myNotice.setTaskId("");
+//                myNotice.setDefId(invoice.getId());
+//                myNotice.setTitle(titleStr);
+//                myNotice.setTaskName(taskName);
+//                myNotice.setLink("结束");
+//                myNotice.setType("0");
+//                myNotice.setCreateUser("管理员");
+//                myNotice.setCreateTime(new Date());
+//
+//                for (String noticeUserId : noticeUserList) {
+//                    myNotice.setNoticeId(noticeUserId);
+//                    myNotice.setNoticeName(createUser.getName());
+//                    myNotice.setTitle(title);
+//                    //根据taskName和通知人 查询重复数量
+//                    String myNoticeInfo = JSON.toJSONString(myNotice);
+//                    Map<String,String> map = new HashMap();
+//                    map.put("myNoticeInfo", myNoticeInfo);
+//                    String jsonInfo = SpringUtil.getBean(IFlowableApi.class).getRepetitionCountBymyNoticeTitle(map);
+//                    MyNoticeList repetitionCountBymyNotice = JSON.parseObject(jsonInfo, new TypeReference<MyNoticeList>() {});
+//
+//                    if(null == repetitionCountBymyNotice){
+//                        // 生成id
+//                        String id = UUID.randomUUID().toString().replace("-", "");
+//                        myNotice.setId(id);
+//                        myNotice.setRepetitionCount(0);
+//                        myNotice.setTitle(titleStr);
+//
+//                        myNoticeInfo = JSON.toJSONString(myNotice);
+//                        map.put("myNoticeInfo", myNoticeInfo);
+//                        SpringUtil.getBean ( IFlowableApi.class ).insertMyNotice(map);
+//                    }else{
+//                        if(null != repetitionCountBymyNotice.getRepetitionCount() && "0".equals(repetitionCountBymyNotice.getType())){
+//                            myNotice.setRepetitionCount(repetitionCountBymyNotice.getRepetitionCount() + 1);
+//                        }else{
+//                            myNotice.setRepetitionCount(0);
+//                        }
+//                        myNotice.setId(repetitionCountBymyNotice.getId());
+//                        myNotice.setTitle(titleStr);
+//                        myNoticeInfo = JSON.toJSONString(myNotice);
+//                        map.put("myNoticeInfo", myNoticeInfo);
+//                        SpringUtil.getBean ( IFlowableApi.class ).updateMyNotice(map);
+//                    }
+//                }
+//            }
+//        }
+//    }
+
     public static String dateToString(Date date) {
         SimpleDateFormat sformat = new SimpleDateFormat("yyyy-MM-dd");//日期格式
         return sformat.format(date);