浏览代码

财务-发票

lizhenhao 2 年之前
父节点
当前提交
3fc13db141
共有 28 个文件被更改,包括 2166 次插入0 次删除
  1. 254 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/controller/CwFinanceInvoiceController.java
  2. 179 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/domain/CwFinanceInvoice.java
  3. 52 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/domain/CwFinanceInvoiceBase.java
  4. 66 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/domain/CwFinanceInvoiceDetail.java
  5. 46 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/domain/CwFinanceInvoiceInvalid.java
  6. 51 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/domain/CwFinanceInvoiceReceivables.java
  7. 14 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/CwFinanceInvoiceBaseMapper.java
  8. 14 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/CwFinanceInvoiceDetailMapper.java
  9. 14 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/CwFinanceInvoiceInvalidMapper.java
  10. 23 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/CwFinanceInvoiceMapper.java
  11. 14 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/CwFinanceInvoiceReceivablesMapper.java
  12. 36 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/xml/CwFinanceInvoiceBaseMapper.xml
  13. 42 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/xml/CwFinanceInvoiceDetailMapper.xml
  14. 34 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/xml/CwFinanceInvoiceInvalidMapper.xml
  15. 239 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/xml/CwFinanceInvoiceMapper.xml
  16. 36 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/xml/CwFinanceInvoiceReceivablesMapper.xml
  17. 488 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/CwFinanceInvoiceService.java
  18. 9 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/dto/CwFinanceDTO.java
  19. 47 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/dto/CwFinanceInvoiceBaseDTO.java
  20. 265 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/dto/CwFinanceInvoiceDTO.java
  21. 73 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/dto/CwFinanceInvoiceDetailDTO.java
  22. 42 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/dto/CwFinanceInvoiceInvalidDTO.java
  23. 53 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/dto/CwFinanceInvoiceReceivablesDTO.java
  24. 15 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/mapstruct/CwFinanceInvoiceBaseWrapper.java
  25. 15 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/mapstruct/CwFinanceInvoiceDetailWrapper.java
  26. 15 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/mapstruct/CwFinanceInvoiceInvalidWrapper.java
  27. 15 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/mapstruct/CwFinanceInvoiceReceivablesWrapper.java
  28. 15 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/mapstruct/CwFinanceInvoiceWrapper.java

+ 254 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/controller/CwFinanceInvoiceController.java

@@ -0,0 +1,254 @@
+package com.jeeplus.test.cw.invoice.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.aop.demo.annotation.DemoMode;
+import com.jeeplus.aop.logging.annotation.ApiLog;
+import com.jeeplus.common.utils.ResponseUtil;
+import com.jeeplus.core.excel.utils.EasyPoiUtil;
+import com.jeeplus.sys.constant.enums.LogTypeEnum;
+import com.jeeplus.sys.utils.StringUtils;
+import com.jeeplus.test.cw.invoice.service.CwFinanceInvoiceService;
+import com.jeeplus.test.cw.invoice.service.dto.CwFinanceDTO;
+import com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceDTO;
+import com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceDetailDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import static com.jeeplus.test.jobPosion.utils.BeanUtils.objectCheckIsNull;
+
+@Api("财务管理-发票")
+@RestController
+@RequestMapping(value = "/cw_finance/invoice")
+public class CwFinanceInvoiceController {
+
+    @Resource
+    private CwFinanceInvoiceService cwFinanceInvoiceService;
+
+    /**
+     * 查询发票列表
+     * @param cwFinanceInvoiceDTO
+     * @param page
+     * @return
+     * @throws Exception
+     */
+    @ApiLog("查询发票列表")
+    @PreAuthorize("hasAuthority('cw_finance:invoice:list')")
+    @GetMapping("list")
+    public ResponseEntity<IPage<CwFinanceInvoiceDTO>> data(CwFinanceInvoiceDTO cwFinanceInvoiceDTO, Page<CwFinanceInvoiceDTO> page) throws Exception {
+        IPage<CwFinanceInvoiceDTO> result = new Page<CwFinanceInvoiceDTO>();
+        result = cwFinanceInvoiceService.findList (page, cwFinanceInvoiceDTO);
+        return ResponseEntity.ok (result);
+    }
+
+    /**
+     * 查询发票数据
+     * @param id
+     * @return
+     */
+    @ApiLog("查询发票数据")
+    @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 );
+        return ResponseEntity.ok (cwFinanceInvoiceDTO);
+    }
+
+    /**
+     * 查询发票号是否存在
+     * @param number
+     * @return
+     */
+    @ApiLog("查询发票号是否存在")
+    @GetMapping("queryByNumber")
+    public ResponseEntity queryByNumber(@RequestParam("number") String number, @RequestParam(value="id", required = false) String id) {
+        Boolean bool = cwFinanceInvoiceService.queryByNumber ( number, id );
+        return ResponseEntity.ok (bool);
+    }
+
+    /**
+     * 保存发票数据
+     * @param cwFinanceInvoiceDTO
+     * @return
+     */
+    @ApiLog(value = "修改/新增发票数据", type = LogTypeEnum.SAVE)
+    @PreAuthorize("hasAnyAuthority('cw_finance:invoice:add','cw_finance:invoice:edit')")
+    @PostMapping("save")
+    public ResponseEntity save(@Valid @RequestBody CwFinanceInvoiceDTO cwFinanceInvoiceDTO) throws Exception {
+        cwFinanceInvoiceService.saveInvoice(cwFinanceInvoiceDTO);
+        return ResponseEntity.ok ("操作成功");
+    }
+
+    /**
+     * 保存发票数据-流程
+     * @param cwFinanceInvoiceDTO
+     * @return
+     */
+    @ApiLog(value = "保存发票数据-流程", type = LogTypeEnum.SAVE)
+    @PreAuthorize("hasAnyAuthority('cw_finance:invoice:add','cw_finance:invoice:edit')")
+    @PostMapping("saveForm")
+    public ResponseEntity saveForm(@Valid @RequestBody CwFinanceInvoiceDTO cwFinanceInvoiceDTO) throws Exception {
+        String id = cwFinanceInvoiceService.saveForm(cwFinanceInvoiceDTO);
+        return ResponseUtil.newInstance().add("businessTable", "cw_finance_invoice").add("businessId", id).ok ("操作成功");
+    }
+
+    /**
+     * 作废发票数据-流程
+     * @param cwFinanceInvoiceDTO
+     * @return
+     */
+    @ApiLog(value = "作废发票数据-流程", type = LogTypeEnum.SAVE)
+    @PreAuthorize("hasAnyAuthority('cw_finance:invoice:add','cw_finance:invoice:edit')")
+    @PostMapping("saveFormInvalid")
+    public ResponseEntity saveFormInvalid(@Valid @RequestBody CwFinanceInvoiceDTO cwFinanceInvoiceDTO) throws Exception {
+        String id = cwFinanceInvoiceService.saveFormInvalid(cwFinanceInvoiceDTO);
+        return ResponseUtil.newInstance().add("businessTable", "cw_finance_invoice_invalid").add("businessId", id).ok ("操作成功");
+    }
+
+    /**
+     * 根据发票作废数据的id查询发票id
+     * @param id
+     * @return
+     */
+    @GetMapping("queryIdByInvalidId")
+    @ApiOperation(value = "查询发票号是否存在")
+    public ResponseEntity<CwFinanceDTO> queryIdByInvalidId(@RequestParam String id) {
+        String businessId = cwFinanceInvoiceService.queryIdByInvalidId ( id );
+        CwFinanceDTO cwFinanceDTO = new CwFinanceDTO();
+        cwFinanceDTO.setBusinessId(businessId);
+        return ResponseEntity.ok(cwFinanceDTO);
+    }
+
+    /**
+     * 删除附件类型
+     * @param ids
+     * @return
+     */
+    @ApiLog(value = "删除附件类型", type = LogTypeEnum.SAVE)
+    @PreAuthorize ("hasAuthority('cw_finance:invoice:del')")
+    @DeleteMapping("delete")
+    public ResponseEntity delete(String ids) {
+        return cwFinanceInvoiceService.deleteByIds(ids);
+    }
+
+    /**
+     * 根据id修改状态值status
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "根据id修改状态值status")
+    @PostMapping(value = "/updateStatusById")
+    public ResponseEntity<String> updateStatusById(@RequestBody CwFinanceInvoiceDTO dto) {
+        String s = cwFinanceInvoiceService.updateStatusById(dto);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 确认收款
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "确认收款")
+    @PostMapping(value = "/isReceivables")
+    public ResponseEntity<String> isReceivables(@RequestBody CwFinanceInvoiceDTO dto) {
+        String s = cwFinanceInvoiceService.isReceivables(dto);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 下载发票明细导入模板
+     *
+     * @param response
+     * @return
+     */
+    @GetMapping("/importDetail/template")
+    @ApiOperation(value = "下载模板")
+    public void importFileTemplate(HttpServletResponse response, HttpServletRequest request) {
+        try {
+            InputStream inputStream = this.getClass().getResourceAsStream("/dot/发票明细导入模板.xlsx");
+            //强制下载不打开
+            response.setContentType("application/force-download");
+            OutputStream out = response.getOutputStream();
+            //使用URLEncoder来防止文件名乱码或者读取错误
+            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("finance_invoice_detail_template.xlsx", "UTF-8"));
+            int b = 0;
+            byte[] buffer = new byte[1000000];
+            while (b != -1) {
+                b = inputStream.read(buffer);
+                if (b != -1) out.write(buffer, 0, b);
+            }
+            inputStream.close();
+            out.close();
+            out.flush();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 导入发票明细数据
+     *
+     * @return
+     */
+    @DemoMode
+    @PostMapping("/importDetail")
+    @ApiLog(value = "导入发票明细数据excel", type = LogTypeEnum.IMPORT)
+    public ResponseEntity importDetail(MultipartFile file, HttpServletRequest request) throws IOException {
+
+        ArrayList<CwFinanceInvoiceDetailDTO> arrayList = new ArrayList<>();
+        HashMap<String,String> hashMap = new HashMap<>();
+
+        List<CwFinanceInvoiceDetailDTO> listA = new ArrayList<>();
+        //获取sheet
+        listA = EasyPoiUtil.importExcel(file, 0, 1, CwFinanceInvoiceDetailDTO.class);
+        //去除excel中的空行
+        listA = getExcelList(listA);
+        //导入前检测数据
+        String resultA = cwFinanceInvoiceService.importDecide(listA, arrayList, hashMap);
+        if(StringUtils.isNotBlank(resultA)){
+            //有返回值,说明导入的数据不正确。向用户抛提示
+            return ResponseEntity.badRequest().body  (resultA);
+        }
+        //判断文件中是否有重复的发票号
+        if(hashMap.size() != listA.size()){
+            return ResponseEntity.badRequest().body  ("文件中存在重复的发票号");
+        }
+
+        return ResponseEntity.ok(arrayList);
+    }
+
+    /**
+     * 去除excel中的空行
+     * @param list
+     * @return
+     */
+    public ArrayList<CwFinanceInvoiceDetailDTO> getExcelList(List<CwFinanceInvoiceDetailDTO> list){
+
+        ArrayList<CwFinanceInvoiceDetailDTO> cwFinanceInvoiceDetailDTOS = new ArrayList<>();
+
+        list.stream().forEach(item->{
+            if(objectCheckIsNull(item)){
+                cwFinanceInvoiceDetailDTOS.add(item);
+            }
+        });
+
+        return cwFinanceInvoiceDetailDTOS;
+    }
+
+}

+ 179 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/domain/CwFinanceInvoice.java

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

+ 52 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/domain/CwFinanceInvoiceBase.java

@@ -0,0 +1,52 @@
+package com.jeeplus.test.cw.invoice.domain;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 财务管理-发票基本信息
+ * @TableName cw_finance_invoice_base
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("cw_finance_invoice_base")
+public class CwFinanceInvoiceBase extends BaseEntity {
+
+    /**
+     * 发票id
+     */
+    private String invoiceId;
+
+    /**
+     * 项目id
+     */
+    private String programId;
+
+    /**
+     * 项目名称
+     */
+    private String programName;
+
+    /**
+     * 合同名称
+     */
+    private String contractName;
+
+    /**
+     * 项目编号
+     */
+    private String programNo;
+
+    /**
+     * 合同id
+     */
+    private String contractId;
+
+
+    private static final long serialVersionUID = 1L;
+}

+ 66 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/domain/CwFinanceInvoiceDetail.java

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

+ 46 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/domain/CwFinanceInvoiceInvalid.java

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

+ 51 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/domain/CwFinanceInvoiceReceivables.java

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

+ 14 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/CwFinanceInvoiceBaseMapper.java

@@ -0,0 +1,14 @@
+package com.jeeplus.test.cw.invoice.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.test.cw.invoice.domain.CwFinanceInvoiceBase;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface CwFinanceInvoiceBaseMapper extends BaseMapper<CwFinanceInvoiceBase> {
+
+}
+
+
+
+

+ 14 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/CwFinanceInvoiceDetailMapper.java

@@ -0,0 +1,14 @@
+package com.jeeplus.test.cw.invoice.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.test.cw.invoice.domain.CwFinanceInvoiceDetail;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface CwFinanceInvoiceDetailMapper extends BaseMapper<CwFinanceInvoiceDetail> {
+
+}
+
+
+
+

+ 14 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/CwFinanceInvoiceInvalidMapper.java

@@ -0,0 +1,14 @@
+package com.jeeplus.test.cw.invoice.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.test.cw.invoice.domain.CwFinanceInvoiceInvalid;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface CwFinanceInvoiceInvalidMapper extends BaseMapper<CwFinanceInvoiceInvalid> {
+
+}
+
+
+
+

+ 23 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/CwFinanceInvoiceMapper.java

@@ -0,0 +1,23 @@
+package com.jeeplus.test.cw.invoice.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.test.cw.invoice.domain.CwFinanceInvoice;
+import com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceDTO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface CwFinanceInvoiceMapper extends BaseMapper<CwFinanceInvoice> {
+
+    public IPage<CwFinanceInvoiceDTO> findList(Page<CwFinanceInvoiceDTO> page, @Param(Constants.WRAPPER) QueryWrapper<CwFinanceInvoice> queryWrapper);
+
+    public CwFinanceInvoiceDTO queryById(@Param("id") String id);
+}
+
+
+
+

+ 14 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/CwFinanceInvoiceReceivablesMapper.java

@@ -0,0 +1,14 @@
+package com.jeeplus.test.cw.invoice.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.test.cw.invoice.domain.CwFinanceInvoiceReceivables;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface CwFinanceInvoiceReceivablesMapper extends BaseMapper<CwFinanceInvoiceReceivables> {
+
+}
+
+
+
+

+ 36 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/xml/CwFinanceInvoiceBaseMapper.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.test.cw.invoice.mapper.CwFinanceInvoiceBaseMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceBaseDTO">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by" jdbcType="VARCHAR"/>
+            <result property="createDate" column="create_date" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by" jdbcType="VARCHAR"/>
+            <result property="updateDate" column="update_date" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="invoiceId" column="invoice_id" jdbcType="VARCHAR"/>
+            <result property="programId" column="program_id" jdbcType="VARCHAR"/>
+            <result property="programName" column="program_name" jdbcType="VARCHAR"/>
+            <result property="contractName" column="contract_name" jdbcType="VARCHAR"/>
+            <result property="programNo" column="program_no" jdbcType="VARCHAR"/>
+            <result property="contractId" column="contract_id" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        fib.id,
+        fib.create_by,
+        fib.create_date,
+        fib.update_by,
+        fib.update_date,
+        fib.del_flag,
+        fib.invoice_id,
+        fib.program_id,
+        fib.program_name,
+        fib.contract_name,
+        fib.program_no,
+        fib.contract_id
+    </sql>
+</mapper>

+ 42 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/xml/CwFinanceInvoiceDetailMapper.xml

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.test.cw.invoice.mapper.CwFinanceInvoiceDetailMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceDetailDTO">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by" jdbcType="VARCHAR"/>
+            <result property="createDate" column="create_date" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by" jdbcType="VARCHAR"/>
+            <result property="updateDate" column="update_date" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="invoiceId" column="invoice_id" jdbcType="VARCHAR"/>
+            <result property="code" column="code" jdbcType="VARCHAR"/>
+            <result property="number" column="number" jdbcType="VARCHAR"/>
+            <result property="account" column="account" jdbcType="VARCHAR"/>
+            <result property="rate" column="rate" jdbcType="VARCHAR"/>
+            <result property="amount" column="amount" jdbcType="VARCHAR"/>
+            <result property="tax" column="tax" jdbcType="VARCHAR"/>
+            <result property="allAmount" column="all_amount" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        fid.id,
+        fid.create_by,
+        fid.create_date,
+        fid.update_by,
+        fid.update_date,
+        fid.del_flag,
+        fid.remarks,
+        fid.invoice_id,
+        fid.code,
+        fid.number,
+        fid.account,
+        fid.rate,
+        fid.amount,
+        fid.tax,
+        fid.all_amount
+    </sql>
+</mapper>

+ 34 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/xml/CwFinanceInvoiceInvalidMapper.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.test.cw.invoice.mapper.CwFinanceInvoiceInvalidMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceInvalidDTO">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by" jdbcType="VARCHAR"/>
+            <result property="createDate" column="create_date" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by" jdbcType="VARCHAR"/>
+            <result property="updateDate" column="update_date" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="invoiceId" column="invoice_id" jdbcType="VARCHAR"/>
+            <result property="invalidStatus" column="invalid_status" jdbcType="VARCHAR"/>
+            <result property="procInsId" column="proc_ins_id" jdbcType="VARCHAR"/>
+            <result property="processDefinitionId" column="process_definition_id" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        fii.id,
+        fii.create_by,
+        fii.create_date,
+        fii.update_by,
+        fii.update_date,
+        fii.del_flag,
+        fii.remarks,
+        fii.invoice_id,
+        fii.invalid_status,
+        fii.proc_ins_id,
+        fii.process_definition_id
+    </sql>
+</mapper>

+ 239 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/xml/CwFinanceInvoiceMapper.xml

@@ -0,0 +1,239 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.test.cw.invoice.mapper.CwFinanceInvoiceMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceDTO">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by" jdbcType="VARCHAR"/>
+            <result property="createDate" column="create_date" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by" jdbcType="VARCHAR"/>
+            <result property="updateDate" column="update_date" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="type" column="type" jdbcType="VARCHAR"/>
+            <result property="no" column="no" jdbcType="VARCHAR"/>
+            <result property="billingType" column="billing_type" jdbcType="VARCHAR"/>
+            <result property="billingWorkplaceReal" column="billing_workplace_real" jdbcType="VARCHAR"/>
+            <result property="taxpayerIdentificationNo" column="taxpayer_identification_no" jdbcType="VARCHAR"/>
+            <result property="address" column="address" jdbcType="VARCHAR"/>
+            <result property="telPhone" column="tel_phone" jdbcType="VARCHAR"/>
+            <result property="openBank" column="open_bank" jdbcType="VARCHAR"/>
+            <result property="bankAccount" column="bank_account" jdbcType="VARCHAR"/>
+            <result property="name" column="name" jdbcType="VARCHAR"/>
+            <result property="receivablesType" column="receivables_type" jdbcType="VARCHAR"/>
+            <result property="billingContent" column="billing_content" jdbcType="VARCHAR"/>
+            <result property="account" column="account" jdbcType="VARCHAR"/>
+            <result property="billingContentTerms" column="billing_content_terms" jdbcType="VARCHAR"/>
+            <result property="billingPeople" column="billing_people" jdbcType="VARCHAR"/>
+            <result property="billingDate" column="billing_date" jdbcType="TIMESTAMP"/>
+            <result property="collectDate" column="collect_date" jdbcType="TIMESTAMP"/>
+            <result property="billingPeopleReal" column="billing_people_real" jdbcType="VARCHAR"/>
+            <result property="reconciliationPeople" column="reconciliation_people" jdbcType="VARCHAR"/>
+            <result property="reconciliationArea" column="reconciliation_area" jdbcType="VARCHAR"/>
+            <result property="billingWorkplaceRealId" column="billing_workplace_real_id" jdbcType="VARCHAR"/>
+            <result property="billingPeopleId" column="billing_people_id" jdbcType="VARCHAR"/>
+            <result property="status" column="status" jdbcType="VARCHAR"/>
+            <result property="procInsId" column="proc_ins_id" jdbcType="VARCHAR"/>
+            <result property="processDefinitionId" column="process_definition_id" jdbcType="VARCHAR"/>
+            <result property="receivablesStatus" column="receivables_status" jdbcType="VARCHAR"/>
+            <result property="invalidStatus" column="invalid_status" jdbcType="VARCHAR"/>
+            <result property="receivablesDate" column="receivables_date" jdbcType="TIMESTAMP"/>
+            <result property="operator" column="operator" jdbcType="VARCHAR"/>
+            <result property="operatorOffice" column="operator_office" jdbcType="VARCHAR"/>
+            <association property="financeInvoiceInvalidDTO" column="id" select="getFii" javaType="com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceInvalidDTO"></association>
+            <collection property="financeInvoiceReceivablesDTOList" column="id" select="getFirList" ofType="com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceReceivablesDTO"></collection>
+            <collection property="financeInvoiceBaseDTOList" column="id" select="getBaseList" ofType="com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceBaseDTO"></collection>
+            <collection property="financeInvoiceDetailDTOList" column="id" select="getFidList" ofType="com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceDetailDTO"></collection>
+            <collection property="workAttachmentDtoList" ofType="com.jeeplus.test.workContract.service.dto.WorkAttachmentDto" column="id" select="getFileList"></collection>
+    </resultMap>
+
+    <resultMap id="AttachmentMap" type="com.jeeplus.test.workContract.service.dto.WorkAttachmentDto">
+        <id property="id" column="id" jdbcType="VARCHAR"/>
+        <result property="createBy.id" column="create_by" jdbcType="VARCHAR"/>
+        <result property="createDate" column="create_date" jdbcType="TIMESTAMP"/>
+        <result property="updateBy.id" column="update_by" jdbcType="VARCHAR"/>
+        <result property="createBy.name" column="create_name" jdbcType="VARCHAR"/>
+        <result property="updateDate" column="update_date" jdbcType="TIMESTAMP"/>
+        <result property="delFlag" column="del_flag" jdbcType="VARCHAR"/>
+        <result property="url" column="url" jdbcType="VARCHAR"/>
+        <result property="name" column="attachment_name" jdbcType="VARCHAR"/>
+        <result property="size" column="file_size" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="FIR_Column_List">
+        fir.id,
+        fir.create_by,
+        fir.create_date,
+        fir.update_by,
+        fir.update_date,
+        fir.del_flag,
+        fir.remarks,
+        fir.invoice_id,
+        fir.remittance_unit,
+        fir.remittance_amount,
+        fir.remittance_date,
+        fir.status
+    </sql>
+
+    <sql id="FII_Column_List">
+        fii.id,
+        fii.create_by,
+        fii.create_date,
+        fii.update_by,
+        fii.update_date,
+        fii.del_flag,
+        fii.remarks,
+        fii.invoice_id,
+        fii.invalid_status,
+        fii.proc_ins_id,
+        fii.process_definition_id
+    </sql>
+
+    <sql id="FID_Column_List">
+        fid.id,
+        fid.create_by,
+        fid.create_date,
+        fid.update_by,
+        fid.update_date,
+        fid.del_flag,
+        fid.remarks,
+        fid.invoice_id,
+        fid.code,
+        fid.number,
+        fid.account,
+        fid.rate,
+        fid.amount,
+        fid.tax,
+        fid.all_amount
+    </sql>
+
+    <sql id="Base_Column_List">
+        fi.id,
+        fi.create_by,
+        fi.create_date,
+        fi.update_by,
+        fi.update_date,
+        fi.del_flag,
+        fi.remarks,
+        fi.type,
+        fi.no,
+        fi.billing_type,
+        fi.billing_workplace_real,
+        fi.taxpayer_identification_no,
+        fi.address,
+        fi.tel_phone,
+        fi.open_bank,
+        fi.bank_account,
+        fi.name,
+        fi.receivables_type,
+        fi.billing_content,
+        fi.account,
+        fi.billing_content_terms,
+        fi.billing_people,
+        fi.billing_date,
+        fi.collect_date,
+        fi.billing_people_real,
+        fi.reconciliation_people,
+        fi.reconciliation_area,
+        fi.billing_workplace_real_id,
+        fi.billing_people_id,
+        fi.status,
+        fi.proc_ins_id,
+        fi.process_definition_id,
+        fi.receivables_status,
+        fi.invalid_status,
+        fi.receivables_date
+    </sql>
+
+    <sql id="File_Column_List">
+        wa.id,
+        wa.create_by,
+        wa.create_date,
+        wa.update_by,
+        wa.update_date,
+        wa.remarks,
+        wa.del_flag,
+        wa.url,
+        wa.type,
+        wa.attachment_id,
+        wa.attachment_name,
+        wa.attachment_flag,
+        wa.module_type,
+        wa.attachment_type,
+        wa.file_size,
+        wa.sort,
+        wa.description
+    </sql>
+
+    <sql id="FIB_Column_List">
+        fib.id,
+        fib.create_by,
+        fib.create_date,
+        fib.update_by,
+        fib.update_date,
+        fib.del_flag,
+        fib.invoice_id,
+        fib.program_id,
+        fib.program_name,
+        fib.contract_name,
+        fib.program_no,
+        fib.contract_id
+    </sql>
+
+    <select id="getFileList" resultMap="AttachmentMap">
+        select
+        <include refid="File_Column_List"></include>,
+        su.name as create_name
+        from work_attachment wa
+        left join sys_user su on su.id = wa.create_by and su.del_flag = '0'
+        where wa.del_flag = '0' and wa.attachment_id = #{id}
+    </select>
+
+    <select id="getFii" resultType="com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceInvalidDTO">
+        select
+        <include refid="FII_Column_List"></include>
+        from cw_finance_invoice_invalid fii
+        where fii.del_flag = '0' and fii.invoice_id = ${id}
+    </select>
+
+    <select id="getFirList" resultType="com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceReceivablesDTO">
+        select
+        <include refid="FIR_Column_List"></include>
+        from cw_finance_invoice_receivables fir
+        where fir.del_flag = '0' and fir.invoice_id = ${id}
+    </select>
+
+    <select id="getFidList" resultType="com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceDetailDTO">
+        select
+        <include refid="FID_Column_List"></include>
+        from cw_finance_invoice_detail fid
+        where fid.del_flag = '0' and fid.invoice_id = ${id}
+    </select>
+
+    <select id="getBaseList" resultType="com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceBaseDTO">
+        select
+        <include refid="FIB_Column_List"></include>
+        from cw_finance_invoice_base fib
+
+        where fib.del_flag = '0' and fib.invoice_id = ${id}
+    </select>
+    <select id="findList" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"></include>,
+        su.name as operator,
+        so.name as operator_office
+        from cw_finance_invoice fi
+        left join sys_user su on fi.create_by = su.id and su.del_flag = '0'
+        left join sys_office so on su.office_id = so.id and so.del_flag = '0'
+        ${ew.customSqlSegment}
+    </select>
+
+    <select id="queryById" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"></include>
+        from cw_finance_invoice fi
+        where fi.del_flag = '0' and fi.id = ${id}
+    </select>
+</mapper>

+ 36 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/mapper/xml/CwFinanceInvoiceReceivablesMapper.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.test.cw.invoice.mapper.CwFinanceInvoiceReceivablesMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceReceivablesDTO">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by" jdbcType="VARCHAR"/>
+            <result property="createDate" column="create_date" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by" jdbcType="VARCHAR"/>
+            <result property="updateDate" column="update_date" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="invoiceId" column="invoice_id" jdbcType="VARCHAR"/>
+            <result property="remittanceUnit" column="remittance_unit" jdbcType="VARCHAR"/>
+            <result property="remittanceAmount" column="remittance_amount" jdbcType="VARCHAR"/>
+            <result property="remittanceDate" column="remittance_date" jdbcType="TIMESTAMP"/>
+            <result property="status" column="status" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        fir.id,
+        fir.create_by,
+        fir.create_date,
+        fir.update_by,
+        fir.update_date,
+        fir.del_flag,
+        fir.remarks,
+        fir.invoice_id,
+        fir.remittance_unit,
+        fir.remittance_amount,
+        fir.remittance_date,
+        fir.status
+    </sql>
+</mapper>

+ 488 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/CwFinanceInvoiceService.java

@@ -0,0 +1,488 @@
+package com.jeeplus.test.cw.invoice.service;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.sys.domain.User;
+import com.jeeplus.sys.service.UserService;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.utils.StringUtils;
+import com.jeeplus.sys.utils.UserUtils;
+import com.jeeplus.test.cw.invoice.domain.*;
+import com.jeeplus.test.cw.invoice.mapper.*;
+import com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceBaseDTO;
+import com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceDTO;
+import com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceDetailDTO;
+import com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceReceivablesDTO;
+import com.jeeplus.test.cw.invoice.service.mapstruct.*;
+import com.jeeplus.test.mould.service.SerialnumTplService;
+import com.jeeplus.test.oss.mapper.OssServiceMapper;
+import com.jeeplus.test.oss.service.OssService;
+import com.jeeplus.test.workContract.mapper.WorkContractInfoMapper;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+@Service
+@Transactional
+public class CwFinanceInvoiceService extends ServiceImpl<CwFinanceInvoiceMapper, CwFinanceInvoice> {
+
+    @Resource
+    private CwFinanceInvoiceMapper cwFinanceInvoiceMapper;
+    @Resource
+    private CwFinanceInvoiceBaseMapper cwFinanceInvoiceBaseMapper;
+    @Resource
+    private CwFinanceInvoiceDetailMapper cwFinanceInvoiceDetailMapper;
+    @Resource
+    private CwFinanceInvoiceReceivablesMapper cwFinanceInvoiceReceivablesMapper;
+    @Resource
+    private CwFinanceInvoiceInvalidMapper cwFinanceInvoiceInvalidMapper;
+    @Resource
+    private SerialnumTplService serialnumTplService;
+    @Resource
+    private OssServiceMapper ossServiceMapper;
+    @Resource
+    private WorkContractInfoMapper workContractInfoMapper;
+    @Resource
+    private UserService userService;
+    @Resource
+    private OssService ossService;
+
+    public List<String> getSearchList(ArrayList<String> searchIdList, List<String> ids) {
+        List<String> newSearchIdList = searchIdList.stream().filter(item -> {
+            AtomicInteger num = new AtomicInteger();
+            ids.stream().forEach(id -> {
+                if (item.equals(id)) {
+                    num.getAndIncrement();
+                }
+            });
+            if (num.get() > 0) {
+                return true;
+            }
+            return false;
+        }).collect(Collectors.toList());
+        return newSearchIdList;
+    }
+
+    public IPage<CwFinanceInvoiceDTO> findList(Page<CwFinanceInvoiceDTO> page, CwFinanceInvoiceDTO cwFinanceInvoiceDTO) throws Exception{
+        QueryWrapper<CwFinanceInvoice> queryWrapper = QueryWrapperGenerator.buildQueryCondition ( CwFinanceInvoiceWrapper.INSTANCE.toEntity(cwFinanceInvoiceDTO), CwFinanceInvoice.class );
+        queryWrapper.eq("fi.del_flag","0");
+        queryWrapper.orderByDesc("fi.create_date");
+        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.name", cwFinanceInvoiceDTO.getOperator());
+            }
+            // 对账人
+            if (StringUtils.isNotBlank(cwFinanceInvoiceDTO.getReconciliationPeopleName())) {
+                List<User> users = userService.list(new QueryWrapper<User>().lambda().like(User::getName, cwFinanceInvoiceDTO.getReconciliationPeopleName()));
+                List<String> userIdList = users.stream().distinct().map(User::getId).collect(Collectors.toList());
+                if (CollectionUtil.isNotEmpty(userIdList)) {
+                    queryWrapper.in("fi.reconciliation_people",userIdList);
+                } else {
+                    return new Page<CwFinanceInvoiceDTO>();
+                }
+            }
+            // 经办人部门
+            if (StringUtils.isNotBlank(cwFinanceInvoiceDTO.getOperatorOffice())){
+                List<User> userList = userService.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",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>();
+            }
+        }
+        return cwFinanceInvoiceMapper.findList(page,queryWrapper);
+    }
+
+    public CwFinanceInvoiceDTO queryById(String id) {
+
+        CwFinanceInvoiceDTO cwFinanceInvoiceDTO = cwFinanceInvoiceMapper.queryById(id);
+
+        return cwFinanceInvoiceDTO;
+    }
+
+    public String saveForm(CwFinanceInvoiceDTO cwFinanceInvoiceDTO) throws Exception{
+        CwFinanceInvoice cwFinanceInvoice = CwFinanceInvoiceWrapper.INSTANCE.toEntity(cwFinanceInvoiceDTO);
+        if (ObjectUtil.isNotEmpty(cwFinanceInvoice)) {
+            if(StringUtils.isBlank(cwFinanceInvoice.getId())){
+                //获取当前登录人信息
+                UserDTO userDTO = UserUtils.getCurrentUserDTO();
+                //发票编号生成
+                String serialNum = serialnumTplService.genSerialNum(userDTO.getCompanyDTO().getId(), CwFinanceInvoiceDTO.BIZ_CODE);
+                cwFinanceInvoice.setNo(serialNum);
+                if (StringUtils.isBlank(cwFinanceInvoice.getInvalidStatus())){
+                    cwFinanceInvoice.setInvalidStatus("0");
+                }
+                if (StringUtils.isBlank(cwFinanceInvoice.getReceivablesStatus())){
+                    cwFinanceInvoice.setReceivablesStatus("0");
+                }
+            }
+        }
+        this.saveOrUpdate(cwFinanceInvoice);
+
+        if (ObjectUtil.isNotEmpty(cwFinanceInvoiceDTO)) {
+            // 基本信息保存
+            if(CollectionUtil.isNotEmpty(cwFinanceInvoiceDTO.getFinanceInvoiceBaseDTOList())){
+                List<String> delIds = cwFinanceInvoiceDTO.getFinanceInvoiceBaseDTOList().stream().distinct().filter(item->{
+                    if(StringUtils.isNotBlank(item.getId())){
+                        return true;
+                    }
+                    return false;
+                }).map(CwFinanceInvoiceBaseDTO::getId).collect(Collectors.toList());
+                if(CollectionUtil.isNotEmpty(delIds)){
+                    cwFinanceInvoiceBaseMapper.delete(new QueryWrapper<CwFinanceInvoiceBase>().lambda()
+                            .eq(CwFinanceInvoiceBase::getInvoiceId, cwFinanceInvoice.getId()).notIn(CwFinanceInvoiceBase::getId,delIds));
+                }else{
+                    cwFinanceInvoiceBaseMapper.delete(new QueryWrapper<CwFinanceInvoiceBase>().lambda()
+                            .eq(CwFinanceInvoiceBase::getInvoiceId, cwFinanceInvoice.getId()));
+                }
+                cwFinanceInvoiceDTO.getFinanceInvoiceBaseDTOList().stream().forEach(item->{
+                    CwFinanceInvoiceBase cwFinanceInvoiceBase = CwFinanceInvoiceBaseWrapper.INSTANCE.toEntity(item);
+                    if(StringUtils.isNotBlank(cwFinanceInvoiceBase.getId())){
+                        cwFinanceInvoiceBaseMapper.updateById(cwFinanceInvoiceBase);
+                    }else{
+                        cwFinanceInvoiceBase.setInvoiceId(cwFinanceInvoice.getId());
+                        cwFinanceInvoiceBaseMapper.insert(cwFinanceInvoiceBase);
+                    }
+                });
+            }else{
+                cwFinanceInvoiceBaseMapper.delete(new QueryWrapper<CwFinanceInvoiceBase>().lambda()
+                        .eq(CwFinanceInvoiceBase::getInvoiceId, cwFinanceInvoice.getId()));
+            }
+            // 附件
+            ossService.saveOrUpdateFileList(cwFinanceInvoiceDTO.getWorkAttachmentDtoList(), cwFinanceInvoice.getId(),"cw_invoice");
+            // 发票明细保存
+            if(CollectionUtil.isNotEmpty(cwFinanceInvoiceDTO.getFinanceInvoiceDetailDTOList())){
+                List<String> delIds = cwFinanceInvoiceDTO.getFinanceInvoiceDetailDTOList().stream().distinct().filter(item -> {
+                    if (StringUtils.isNotBlank(item.getId())) {
+                        return true;
+                    }
+                    return false;
+                }).map(CwFinanceInvoiceDetailDTO::getId).collect(Collectors.toList());
+                if(CollectionUtil.isNotEmpty(delIds)){
+                    cwFinanceInvoiceDetailMapper.delete(new QueryWrapper<CwFinanceInvoiceDetail>().lambda()
+                            .eq(CwFinanceInvoiceDetail::getInvoiceId, cwFinanceInvoice.getId())
+                            .notIn(CwFinanceInvoiceDetail::getId,delIds));
+                }else{
+                    cwFinanceInvoiceDetailMapper.delete(new QueryWrapper<CwFinanceInvoiceDetail>().lambda().eq(CwFinanceInvoiceDetail::getInvoiceId, cwFinanceInvoice.getId()));
+                }
+                cwFinanceInvoiceDTO.getFinanceInvoiceDetailDTOList().stream().forEach(item->{
+                    CwFinanceInvoiceDetail cwFinanceInvoiceDetail = CwFinanceInvoiceDetailWrapper.INSTANCE.toEntity(item);
+                    if(StringUtils.isNotBlank(cwFinanceInvoiceDetail.getId())){
+                        cwFinanceInvoiceDetailMapper.updateById(cwFinanceInvoiceDetail);
+                    }else{
+                        cwFinanceInvoiceDetail.setInvoiceId(cwFinanceInvoice.getId());
+                        cwFinanceInvoiceDetailMapper.insert(cwFinanceInvoiceDetail);
+                    }
+                });
+            }else{
+                cwFinanceInvoiceDetailMapper.delete(new QueryWrapper<CwFinanceInvoiceDetail>().lambda().eq(CwFinanceInvoiceDetail::getInvoiceId, cwFinanceInvoice.getId()));
+            }
+            // 收款明细保存
+            if(CollectionUtil.isNotEmpty(cwFinanceInvoiceDTO.getFinanceInvoiceReceivablesDTOList())){
+                List<String> delIds = cwFinanceInvoiceDTO.getFinanceInvoiceReceivablesDTOList().stream().distinct().filter(item -> {
+                    if (StringUtils.isNotBlank(item.getId())) {
+                        return true;
+                    }
+                    return false;
+                }).map(CwFinanceInvoiceReceivablesDTO::getId).collect(Collectors.toList());
+                if(CollectionUtil.isNotEmpty(delIds)){
+                    cwFinanceInvoiceReceivablesMapper.delete(new QueryWrapper<CwFinanceInvoiceReceivables>().lambda()
+                            .eq(CwFinanceInvoiceReceivables::getInvoiceId, cwFinanceInvoice.getId())
+                            .notIn(CwFinanceInvoiceReceivables::getId,delIds));
+                }else{
+                    cwFinanceInvoiceReceivablesMapper.delete(new QueryWrapper<CwFinanceInvoiceReceivables>().lambda().eq(CwFinanceInvoiceReceivables::getInvoiceId, cwFinanceInvoice.getId()));
+                }
+                cwFinanceInvoiceDTO.getFinanceInvoiceReceivablesDTOList().stream().forEach(item->{
+                    CwFinanceInvoiceReceivables cwFinanceInvoiceReceivables = CwFinanceInvoiceReceivablesWrapper.INSTANCE.toEntity(item);
+                    if(StringUtils.isNotBlank(cwFinanceInvoiceReceivables.getId())){
+                        cwFinanceInvoiceReceivablesMapper.updateById(cwFinanceInvoiceReceivables);
+                    }else{
+                        cwFinanceInvoiceReceivables.setInvoiceId(cwFinanceInvoice.getId());
+                        cwFinanceInvoiceReceivablesMapper.insert(cwFinanceInvoiceReceivables);
+                    }
+                });
+            }else{
+                cwFinanceInvoiceReceivablesMapper.delete(new QueryWrapper<CwFinanceInvoiceReceivables>().lambda().eq(CwFinanceInvoiceReceivables::getInvoiceId, cwFinanceInvoice.getId()));
+            }
+            // 作废信息保存
+            if(ObjectUtil.isNotEmpty(cwFinanceInvoiceDTO.getFinanceInvoiceInvalidDTO())){
+                CwFinanceInvoiceInvalid cwFinanceInvoiceInvalid = CwFinanceInvoiceInvalidWrapper.INSTANCE.toEntity(cwFinanceInvoiceDTO.getFinanceInvoiceInvalidDTO());
+                if(StringUtils.isNotBlank(cwFinanceInvoiceInvalid.getId())){
+                    cwFinanceInvoiceInvalidMapper.update(cwFinanceInvoiceInvalid,
+                            new QueryWrapper<CwFinanceInvoiceInvalid>().lambda().eq(CwFinanceInvoiceInvalid::getId, cwFinanceInvoiceInvalid.getId()));
+                }else{
+                    cwFinanceInvoiceInvalid.setInvalidStatus("0");
+                    cwFinanceInvoiceInvalid.setInvoiceId(cwFinanceInvoice.getId());
+                    cwFinanceInvoiceInvalidMapper.insert(cwFinanceInvoiceInvalid);
+                }
+            }else{
+                cwFinanceInvoiceInvalidMapper.delete(new QueryWrapper<CwFinanceInvoiceInvalid>().lambda().eq(CwFinanceInvoiceInvalid::getInvoiceId, cwFinanceInvoice.getId()));
+                CwFinanceInvoiceInvalid cwFinanceInvoiceInvalid = new CwFinanceInvoiceInvalid();
+                cwFinanceInvoiceInvalid.setInvalidStatus("0");
+                cwFinanceInvoiceInvalid.setInvoiceId(cwFinanceInvoice.getId());
+                cwFinanceInvoiceInvalidMapper.insert(cwFinanceInvoiceInvalid);
+            }
+        }
+        return cwFinanceInvoice.getId();
+    }
+
+    public ResponseEntity saveInvoice(CwFinanceInvoiceDTO cwFinanceInvoiceDTO) throws Exception{
+        this.saveForm(cwFinanceInvoiceDTO);
+        return ResponseEntity.ok("保存成功");
+    }
+
+    public String saveFormInvalid(CwFinanceInvoiceDTO cwFinanceInvoiceDTO) throws Exception{
+        String invoiceId = this.saveForm(cwFinanceInvoiceDTO);
+        List<CwFinanceInvoiceInvalid> cwFinanceInvoiceInvalids = cwFinanceInvoiceInvalidMapper.selectList(
+                new QueryWrapper<CwFinanceInvoiceInvalid>().lambda().eq(CwFinanceInvoiceInvalid::getInvoiceId, invoiceId));
+        return cwFinanceInvoiceInvalids.get(0).getId();
+    }
+
+    public ResponseEntity deleteByIds(String ids) {
+        String idArray[] =ids.split(",");
+        this.removeByIds (Lists.newArrayList (idArray));
+        return ResponseEntity.ok ("删除成功");
+    }
+
+    public Boolean queryByNumber(String number, String id) {
+        List<CwFinanceInvoiceDetail> cwFinanceInvoiceDetails = cwFinanceInvoiceDetailMapper.selectList(new QueryWrapper<CwFinanceInvoiceDetail>().lambda()
+                .eq(CwFinanceInvoiceDetail::getNumber, number)
+                .eq(CwFinanceInvoiceDetail::getDelFlag, '0')
+                .ne(StringUtils.isNotBlank(id), CwFinanceInvoiceDetail::getId,id));
+        if (CollectionUtil.isNotEmpty(cwFinanceInvoiceDetails)) {
+            return true;
+        }
+        return false;
+    }
+
+    public String queryIdByInvalidId(String id) {
+        CwFinanceInvoiceInvalid cwFinanceInvoiceInvalid = cwFinanceInvoiceInvalidMapper.selectById(id);
+        return cwFinanceInvoiceInvalid.getInvoiceId();
+    }
+
+    public String updateStatusById(CwFinanceInvoiceDTO cwFinanceInvoiceDTO) {
+        CwFinanceInvoice cwFinanceInvoice = CwFinanceInvoiceWrapper.INSTANCE.toEntity(cwFinanceInvoiceDTO);
+        cwFinanceInvoiceMapper.update(cwFinanceInvoice, new QueryWrapper<CwFinanceInvoice>().lambda().eq(CwFinanceInvoice::getId, cwFinanceInvoice.getId()));
+        return "操作成功";
+    }
+
+    public String isReceivables(CwFinanceInvoiceDTO cwFinanceInvoiceDTO) {
+        CwFinanceInvoice cwFinanceInvoice = CwFinanceInvoiceWrapper.INSTANCE.toEntity(cwFinanceInvoiceDTO);
+        cwFinanceInvoiceMapper.update(cwFinanceInvoice, new QueryWrapper<CwFinanceInvoice>().lambda().eq(CwFinanceInvoice::getId, cwFinanceInvoice.getId()));
+        return "操作成功";
+    }
+
+    public String importDecide(List<CwFinanceInvoiceDetailDTO> list, ArrayList<CwFinanceInvoiceDetailDTO> arrayList, HashMap<String,String> hashMap){
+        for (CwFinanceInvoiceDetailDTO cwFinanceInvoiceDetailDTO : list) {
+            if(ObjectUtil.isEmpty(cwFinanceInvoiceDetailDTO)){
+                continue;
+            }
+
+            if(StringUtils.isBlank(cwFinanceInvoiceDetailDTO.getNumber())){
+                return "文件中有发票号为空,请重新填写";
+            }
+            if(StringUtils.isNotBlank(cwFinanceInvoiceDetailDTO.getNumber())){
+                try {
+                    Integer integer = new Integer(cwFinanceInvoiceDetailDTO.getNumber());
+                    if (integer < 0) {
+                        return "文件中有发票号填写不正确,请重新填写";
+                    }
+                }catch (Exception e){
+                    return "文件中有发票号填写不正确,请重新填写";
+                }
+                List<CwFinanceInvoiceDetail> cwFinanceInvoiceDetailList = cwFinanceInvoiceDetailMapper.selectList(new QueryWrapper<CwFinanceInvoiceDetail>().eq("number", cwFinanceInvoiceDetailDTO.getNumber()));
+                if(CollectionUtil.isNotEmpty(cwFinanceInvoiceDetailList)){
+                    return "文件中有发票号已在系统中存在,请重新填写";
+                }
+            }
+//            if (StringUtils.isBlank(financeInvoiceDetailDTO.getRate())) {
+//                return "文件中有税率为空,请重新填写";
+//            }
+            if (StringUtils.isNotBlank(cwFinanceInvoiceDetailDTO.getRate())) {
+                try {
+                    if ((new BigDecimal(cwFinanceInvoiceDetailDTO.getRate())).compareTo(new BigDecimal(1)) == -1
+                            || (new BigDecimal(cwFinanceInvoiceDetailDTO.getRate())).compareTo(new BigDecimal(100)) == 1) {
+                        return "文件中有税率填写不正确,请重新填写";
+                    }
+                }catch (Exception e){
+                    return "文件中有税率填写不正确,请重新填写";
+                }
+            }
+            if (StringUtils.isBlank(cwFinanceInvoiceDetailDTO.getAccount())) {
+                return "文件中有开票金额为空,请重新填写";
+            } else {
+                try {
+                    cwFinanceInvoiceDetailDTO.setAccount(new BigDecimal(cwFinanceInvoiceDetailDTO.getAccount()).toString());
+                }catch (Exception e){
+                    return "文件中有开票金额填写不正确,请重新填写";
+                }
+            }
+
+            hashMap.put(cwFinanceInvoiceDetailDTO.getNumber(),null);
+
+            arrayList.add(cwFinanceInvoiceDetailDTO);
+        }
+        return null;
+    }
+}

+ 9 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/dto/CwFinanceDTO.java

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

+ 47 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/dto/CwFinanceInvoiceBaseDTO.java

@@ -0,0 +1,47 @@
+package com.jeeplus.test.cw.invoice.service.dto;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 财务管理-发票基本信息
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class CwFinanceInvoiceBaseDTO extends BaseDTO {
+
+    /**
+     * 发票id
+     */
+    private String invoiceId;
+
+    /**
+     * 项目id
+     */
+    private String programId;
+
+    /**
+     * 项目名称
+     */
+    private String programName;
+
+    /**
+     * 合同名称
+     */
+    private String contractName;
+
+    /**
+     * 项目编号
+     */
+    private String programNo;
+
+    /**
+     * 合同id
+     */
+    private String contractId;
+
+    private static final long serialVersionUID = 1L;
+}

+ 265 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/dto/CwFinanceInvoiceDTO.java

@@ -0,0 +1,265 @@
+package com.jeeplus.test.cw.invoice.service.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.service.dto.BaseDTO;
+import com.jeeplus.test.workContract.service.dto.WorkAttachmentDto;
+import com.jeeplus.test.cw.projectRecords.service.dto.CwProjectRecordsDTO;
+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 CwFinanceInvoiceDTO extends BaseDTO {
+
+    public static final String BIZ_CODE = "4";
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 发票类型
+     */
+    private String type;
+
+    /**
+     * 发票申请编号
+     */
+    private String no;
+
+    /**
+     * 开票类型
+     */
+    private String billingType;
+
+    /**
+     * 实际开票单位
+     */
+    private String billingWorkplaceReal;
+
+    /**
+     * 纳税人识别号
+     */
+    private String taxpayerIdentificationNo;
+
+    /**
+     * 地址
+     */
+    private String address;
+
+    /**
+     * 电话
+     */
+    private String telPhone;
+
+    /**
+     * 开户银行
+     */
+    private String openBank;
+
+    /**
+     * 银行账号
+     */
+    private String bankAccount;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 收款类型
+     */
+    private String receivablesType;
+
+    /**
+     * 开票内容
+     */
+    private String billingContent;
+
+    /**
+     * 发票金额(元)
+     */
+    private String account;
+
+    /**
+     * 开票内容要求
+     */
+    private String billingContentTerms;
+
+    /**
+     * 开票人
+     */
+    private String billingPeople;
+
+    /**
+     * 开票时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date billingDate;
+
+    /**
+     * 领票时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date collectDate;
+
+    /**
+     * 实际开票人
+     */
+    private String billingPeopleReal;
+
+    /**
+     * 对账人id
+     */
+    private String reconciliationPeople;
+
+    /**
+     * 对账人姓名
+     */
+    private String reconciliationPeopleName;
+
+    /**
+     * 对账地区
+     */
+    private String reconciliationArea;
+
+    /**
+     * 实际开票单位id
+     */
+    private String billingWorkplaceRealId;
+
+    /**
+     * 开票人id
+     */
+    private String billingPeopleId;
+
+    /**
+     * 状态
+     */
+    private String status;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     * 流程信息
+     */
+    private String processDefinitionId;
+
+    /**
+     * 是否确认收款
+     */
+    private String receivablesStatus;
+
+    /**
+     * 是否作废
+     */
+    private String invalidStatus;
+
+    /**
+     * 收款日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date receivablesDate;
+
+    /**
+     * 基础项目信息
+     */
+    private List<CwProjectRecordsDTO> projectRecordsDTOList;
+
+    /**
+     * 基础信息
+     */
+    private List<CwFinanceInvoiceBaseDTO> financeInvoiceBaseDTOList;
+
+    /**
+     * 附件信息
+     */
+    private List<WorkAttachmentDto> workAttachmentDtoList;
+
+    /**
+     * 发票明细
+     */
+    private List<CwFinanceInvoiceDetailDTO> financeInvoiceDetailDTOList;
+
+    /**
+     * 收款明细
+     */
+    private List<CwFinanceInvoiceReceivablesDTO> financeInvoiceReceivablesDTOList;
+
+    /**
+     * 作废信息
+     */
+    private CwFinanceInvoiceInvalidDTO financeInvoiceInvalidDTO;
+
+    /**
+     * 发票号
+     */
+    private String number;
+
+    /**
+     * 开票总金额 Begin
+     */
+    private String accountBegin;
+
+    /**
+     * 开票总金额 End
+     */
+    private String accountEnd;
+
+    /**
+     * 开票日期 Begin
+     */
+    private String billingDateBegin;
+
+    /**
+     * 开票日期 End
+     */
+    private String billingDateEnd;
+
+    /**
+     * 收款日期Begin
+     */
+    private String remittanceDateBegin;
+
+    /**
+     * 收款日期End
+     */
+    private String remittanceDateEnd;
+
+    /**
+     * 项目名称
+     */
+    private String programName;
+
+    /**
+     * 项目id
+     */
+    private String programId;
+
+    /**
+     * 经办人
+     */
+    private String operator;
+
+    /**
+     * 经办人部门
+     */
+    private String operatorOffice;
+
+    private static final long serialVersionUID = 1L;
+}

+ 73 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/dto/CwFinanceInvoiceDetailDTO.java

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

+ 42 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/dto/CwFinanceInvoiceInvalidDTO.java

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

+ 53 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/dto/CwFinanceInvoiceReceivablesDTO.java

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

+ 15 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/mapstruct/CwFinanceInvoiceBaseWrapper.java

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

+ 15 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/mapstruct/CwFinanceInvoiceDetailWrapper.java

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

+ 15 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/mapstruct/CwFinanceInvoiceInvalidWrapper.java

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

+ 15 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/mapstruct/CwFinanceInvoiceReceivablesWrapper.java

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

+ 15 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/invoice/service/mapstruct/CwFinanceInvoiceWrapper.java

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