Ver código fonte

合同发票功能

caozj 1 ano atrás
pai
commit
ab6af2d680
21 arquivos alterados com 857 adições e 0 exclusões
  1. 4 0
      hx-purchase/src/main/java/com/fjhx/purchase/service/invoice/impl/InvoiceServiceImpl.java
  2. 0 0
      hx-sale/src/main/java/com/fjhx/sale/a-json/ContractInvoiceApi.json
  3. 0 0
      hx-sale/src/main/java/com/fjhx/sale/a-json/ContractInvoiceDetailsApi.json
  4. 68 0
      hx-sale/src/main/java/com/fjhx/sale/controller/contract/ContractInvoiceController.java
  5. 68 0
      hx-sale/src/main/java/com/fjhx/sale/controller/contract/ContractInvoiceDetailsController.java
  6. 17 0
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/dto/ContractInvoiceDetailsDto.java
  7. 17 0
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/dto/ContractInvoiceDetailsSelectDto.java
  8. 25 0
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/dto/ContractInvoiceDto.java
  9. 22 0
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/dto/ContractInvoiceSelectDto.java
  10. 43 0
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/ContractInvoice.java
  11. 43 0
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/ContractInvoiceDetails.java
  12. 34 0
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/vo/ContractInvoiceDetailsVo.java
  13. 27 0
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/vo/ContractInvoiceVo.java
  14. 43 0
      hx-sale/src/main/java/com/fjhx/sale/mapper/contract/ContractInvoiceDetailsMapper.java
  15. 26 0
      hx-sale/src/main/java/com/fjhx/sale/mapper/contract/ContractInvoiceMapper.java
  16. 63 0
      hx-sale/src/main/java/com/fjhx/sale/service/contract/ContractInvoiceDetailsService.java
  17. 46 0
      hx-sale/src/main/java/com/fjhx/sale/service/contract/ContractInvoiceService.java
  18. 79 0
      hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractInvoiceDetailsServiceImpl.java
  19. 164 0
      hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractInvoiceServiceImpl.java
  20. 46 0
      hx-sale/src/main/resources/mapper/contract/ContractInvoiceDetailsMapper.xml
  21. 22 0
      hx-sale/src/main/resources/mapper/contract/ContractInvoiceMapper.xml

+ 4 - 0
hx-purchase/src/main/java/com/fjhx/purchase/service/invoice/impl/InvoiceServiceImpl.java

@@ -20,9 +20,12 @@ import com.fjhx.purchase.service.invoice.InvoiceDetailsService;
 import com.fjhx.purchase.service.invoice.InvoiceService;
 import com.fjhx.supply.entity.supplier.po.SupplierInfo;
 import com.fjhx.supply.service.supplier.SupplierInfoService;
+import com.ruoyi.common.annotation.LogicIgnore;
+import com.ruoyi.common.annotation.TenantIgnore;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
+import lombok.experimental.Delegate;
 import org.apache.commons.collections4.MapUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -137,6 +140,7 @@ public class InvoiceServiceImpl extends ServiceImpl<InvoiceMapper, Invoice> impl
      */
     @Override
     @DSTransactional
+    @LogicIgnore
     public void edit(Invoice invoice) {
         this.updateById(invoice);
         invoiceDetailsService.remove(Wrappers.<InvoiceDetails>query().lambda().eq(InvoiceDetails::getInvoiceId,invoice.getId()));

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
hx-sale/src/main/java/com/fjhx/sale/a-json/ContractInvoiceApi.json


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
hx-sale/src/main/java/com/fjhx/sale/a-json/ContractInvoiceDetailsApi.json


+ 68 - 0
hx-sale/src/main/java/com/fjhx/sale/controller/contract/ContractInvoiceController.java

@@ -0,0 +1,68 @@
+package com.fjhx.sale.controller.contract;
+
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.sale.entity.contract.vo.ContractInvoiceVo;
+import com.fjhx.sale.entity.contract.dto.ContractInvoiceSelectDto;
+import com.fjhx.sale.entity.contract.dto.ContractInvoiceDto;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.fjhx.sale.service.contract.ContractInvoiceService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+/**
+ * <p>
+ * 合同发票管理 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+@RestController
+@RequestMapping("/contractInvoice")
+public class ContractInvoiceController {
+
+    @Autowired
+    private ContractInvoiceService contractInvoiceService;
+
+    /**
+     * 合同发票管理分页
+     */
+    @PostMapping("/page")
+    public Page<ContractInvoiceVo> page(@RequestBody ContractInvoiceSelectDto dto) {
+        return contractInvoiceService.getPage(dto);
+    }
+
+    /**
+     * 合同发票管理明细
+     */
+    @PostMapping("/detail")
+    public ContractInvoiceVo detail(@RequestBody BaseSelectDto dto) {
+        return contractInvoiceService.detail(dto.getId());
+    }
+
+    /**
+     * 合同发票管理新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody ContractInvoiceDto contractInvoiceDto) {
+        contractInvoiceService.add(contractInvoiceDto);
+    }
+
+    /**
+     * 合同发票管理编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody ContractInvoiceDto contractInvoiceDto) {
+        contractInvoiceService.edit(contractInvoiceDto);
+    }
+
+    /**
+     * 合同发票管理删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        contractInvoiceService.delete(dto.getId());
+    }
+
+}

+ 68 - 0
hx-sale/src/main/java/com/fjhx/sale/controller/contract/ContractInvoiceDetailsController.java

@@ -0,0 +1,68 @@
+package com.fjhx.sale.controller.contract;
+
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.sale.entity.contract.vo.ContractInvoiceDetailsVo;
+import com.fjhx.sale.entity.contract.dto.ContractInvoiceDetailsSelectDto;
+import com.fjhx.sale.entity.contract.dto.ContractInvoiceDetailsDto;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.fjhx.sale.service.contract.ContractInvoiceDetailsService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+/**
+ * <p>
+ * 合同发票明细 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+@RestController
+@RequestMapping("/contractInvoiceDetails")
+public class ContractInvoiceDetailsController {
+
+    @Autowired
+    private ContractInvoiceDetailsService contractInvoiceDetailsService;
+
+    /**
+     * 合同发票明细分页
+     */
+    @PostMapping("/page")
+    public Page<ContractInvoiceDetailsVo> page(@RequestBody ContractInvoiceDetailsSelectDto dto) {
+        return contractInvoiceDetailsService.getPage(dto);
+    }
+
+    /**
+     * 合同发票明细明细
+     */
+    @PostMapping("/detail")
+    public ContractInvoiceDetailsVo detail(@RequestBody BaseSelectDto dto) {
+        return contractInvoiceDetailsService.detail(dto.getId());
+    }
+
+    /**
+     * 合同发票明细新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody ContractInvoiceDetailsDto contractInvoiceDetailsDto) {
+        contractInvoiceDetailsService.add(contractInvoiceDetailsDto);
+    }
+
+    /**
+     * 合同发票明细编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody ContractInvoiceDetailsDto contractInvoiceDetailsDto) {
+        contractInvoiceDetailsService.edit(contractInvoiceDetailsDto);
+    }
+
+    /**
+     * 合同发票明细删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        contractInvoiceDetailsService.delete(dto.getId());
+    }
+
+}

+ 17 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/dto/ContractInvoiceDetailsDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.sale.entity.contract.dto;
+
+import com.fjhx.sale.entity.contract.po.ContractInvoiceDetails;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 合同发票明细新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+@Getter
+@Setter
+public class ContractInvoiceDetailsDto extends ContractInvoiceDetails {
+
+}

+ 17 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/dto/ContractInvoiceDetailsSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.sale.entity.contract.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 合同发票明细列表查询入参实体
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+@Getter
+@Setter
+public class ContractInvoiceDetailsSelectDto extends BaseSelectDto {
+
+}

+ 25 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/dto/ContractInvoiceDto.java

@@ -0,0 +1,25 @@
+package com.fjhx.sale.entity.contract.dto;
+
+import com.fjhx.sale.entity.contract.po.ContractInvoice;
+import com.fjhx.sale.entity.contract.po.ContractInvoiceDetails;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 合同发票管理新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+@Getter
+@Setter
+public class ContractInvoiceDto extends ContractInvoice {
+
+    /**
+     * 发票列表
+     */
+    private List<ContractInvoiceDetails> invoiceDetailsList;
+
+}

+ 22 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/dto/ContractInvoiceSelectDto.java

@@ -0,0 +1,22 @@
+package com.fjhx.sale.entity.contract.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 合同发票管理列表查询入参实体
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+@Getter
+@Setter
+public class ContractInvoiceSelectDto extends BaseSelectDto {
+
+    /**
+     * 发票类型
+     */
+    private Integer invoiceType;
+
+}

+ 43 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/ContractInvoice.java

@@ -0,0 +1,43 @@
+package com.fjhx.sale.entity.contract.po;
+
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 合同发票管理
+ * </p>
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+@Getter
+@Setter
+@TableName("contract_invoice")
+public class ContractInvoice extends BasePo {
+
+    /**
+     * 供应商ID
+     */
+    private Long customerId;
+
+    /**
+     * 开票金额
+     */
+    private BigDecimal money;
+
+    /**
+     * 发票类型 字典invoice_type
+     */
+    private Integer type;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 43 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/ContractInvoiceDetails.java

@@ -0,0 +1,43 @@
+package com.fjhx.sale.entity.contract.po;
+
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 合同发票明细
+ * </p>
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+@Getter
+@Setter
+@TableName("contract_invoice_details")
+public class ContractInvoiceDetails extends BasePo {
+
+    /**
+     * 发票管理id
+     */
+    private Long invoiceId;
+
+    /**
+     * 采购合同id
+     */
+    private Long contractId;
+
+    /**
+     * 关联金额
+     */
+    private BigDecimal money;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 34 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/vo/ContractInvoiceDetailsVo.java

@@ -0,0 +1,34 @@
+package com.fjhx.sale.entity.contract.vo;
+
+import com.fjhx.sale.entity.contract.po.ContractInvoiceDetails;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 合同发票明细列表查询返回值实体
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+@Getter
+@Setter
+public class ContractInvoiceDetailsVo extends ContractInvoiceDetails {
+
+    /**
+     * 合同编码
+     */
+    private String contractCode;
+
+    /**
+     * 合同金额
+     */
+    private BigDecimal contractAmount;
+
+    /**
+     * 总金额
+     */
+    private BigDecimal sumMoney;
+
+}

+ 27 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/vo/ContractInvoiceVo.java

@@ -0,0 +1,27 @@
+package com.fjhx.sale.entity.contract.vo;
+
+import com.fjhx.sale.entity.contract.po.ContractInvoice;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 合同发票管理列表查询返回值实体
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+@Getter
+@Setter
+public class ContractInvoiceVo extends ContractInvoice {
+
+    private List<ContractInvoiceDetailsVo> contractInvoiceDetailsVoList;
+
+    private String customerName;
+
+    /**
+     * 合同号多个
+     */
+    private String contractCodes;
+}

+ 43 - 0
hx-sale/src/main/java/com/fjhx/sale/mapper/contract/ContractInvoiceDetailsMapper.java

@@ -0,0 +1,43 @@
+package com.fjhx.sale.mapper.contract;
+
+import com.fjhx.purchase.entity.invoice.vo.InvoiceDetailsVo;
+import com.fjhx.sale.entity.contract.po.ContractInvoiceDetails;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.sale.entity.contract.vo.ContractInvoiceDetailsVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * 合同发票明细 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+public interface ContractInvoiceDetailsMapper extends BaseMapper<ContractInvoiceDetails> {
+
+    /**
+     * 合同发票明细分页
+     */
+    Page<ContractInvoiceDetailsVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<ContractInvoiceDetails> wrapper);
+
+    /**
+     * 根据发票ID查询明细
+     * @param invoiceId
+     * @return
+     */
+    List<ContractInvoiceDetailsVo> getDetail(@Param("invoiceId")Long invoiceId);
+
+    /**
+     * 根据合同ids查询总发票金额
+     * @param contractIds
+     * @return
+     */
+    List<ContractInvoiceDetailsVo> getSumMoneyByContractIds(@Param("contractIds") List<Long> contractIds);
+
+}

+ 26 - 0
hx-sale/src/main/java/com/fjhx/sale/mapper/contract/ContractInvoiceMapper.java

@@ -0,0 +1,26 @@
+package com.fjhx.sale.mapper.contract;
+
+import com.fjhx.sale.entity.contract.po.ContractInvoice;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.sale.entity.contract.vo.ContractInvoiceVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+
+/**
+ * <p>
+ * 合同发票管理 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+public interface ContractInvoiceMapper extends BaseMapper<ContractInvoice> {
+
+    /**
+     * 合同发票管理分页
+     */
+    Page<ContractInvoiceVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<ContractInvoice> wrapper);
+
+}

+ 63 - 0
hx-sale/src/main/java/com/fjhx/sale/service/contract/ContractInvoiceDetailsService.java

@@ -0,0 +1,63 @@
+package com.fjhx.sale.service.contract;
+
+import com.fjhx.purchase.entity.invoice.vo.InvoiceDetailsVo;
+import com.fjhx.sale.entity.contract.po.ContractInvoiceDetails;
+import com.ruoyi.common.core.service.BaseService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.sale.entity.contract.vo.ContractInvoiceDetailsVo;
+import com.fjhx.sale.entity.contract.dto.ContractInvoiceDetailsSelectDto;
+import com.fjhx.sale.entity.contract.dto.ContractInvoiceDetailsDto;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * 合同发票明细 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+public interface ContractInvoiceDetailsService extends BaseService<ContractInvoiceDetails> {
+
+    /**
+     * 合同发票明细分页
+     */
+    Page<ContractInvoiceDetailsVo> getPage(ContractInvoiceDetailsSelectDto dto);
+
+    /**
+     * 合同发票明细明细
+     */
+    ContractInvoiceDetailsVo detail(Long id);
+
+    /**
+     * 合同发票明细新增
+     */
+    void add(ContractInvoiceDetailsDto contractInvoiceDetailsDto);
+
+    /**
+     * 合同发票明细编辑
+     */
+    void edit(ContractInvoiceDetailsDto contractInvoiceDetailsDto);
+
+    /**
+     * 合同发票明细删除
+     */
+    void delete(Long id);
+
+
+    /**
+     * 根据发票ID查询明细
+     * @param invoiceId
+     * @return
+     */
+    List<ContractInvoiceDetailsVo> getDetail(Long invoiceId);
+
+    /**
+     * 根据合同ids查询总发票金额
+     * @param contractIds
+     * @return
+     */
+    List<ContractInvoiceDetailsVo> getSumMoneyByContractIds(List<Long> contractIds);
+}

+ 46 - 0
hx-sale/src/main/java/com/fjhx/sale/service/contract/ContractInvoiceService.java

@@ -0,0 +1,46 @@
+package com.fjhx.sale.service.contract;
+
+import com.fjhx.sale.entity.contract.po.ContractInvoice;
+import com.ruoyi.common.core.service.BaseService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.sale.entity.contract.vo.ContractInvoiceVo;
+import com.fjhx.sale.entity.contract.dto.ContractInvoiceSelectDto;
+import com.fjhx.sale.entity.contract.dto.ContractInvoiceDto;
+
+
+/**
+ * <p>
+ * 合同发票管理 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+public interface ContractInvoiceService extends BaseService<ContractInvoice> {
+
+    /**
+     * 合同发票管理分页
+     */
+    Page<ContractInvoiceVo> getPage(ContractInvoiceSelectDto dto);
+
+    /**
+     * 合同发票管理明细
+     */
+    ContractInvoiceVo detail(Long id);
+
+    /**
+     * 合同发票管理新增
+     */
+    void add(ContractInvoiceDto contractInvoiceDto);
+
+    /**
+     * 合同发票管理编辑
+     */
+    void edit(ContractInvoiceDto contractInvoiceDto);
+
+    /**
+     * 合同发票管理删除
+     */
+    void delete(Long id);
+
+}

+ 79 - 0
hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractInvoiceDetailsServiceImpl.java

@@ -0,0 +1,79 @@
+package com.fjhx.sale.service.contract.impl;
+
+import com.fjhx.sale.entity.contract.po.ContractInvoiceDetails;
+import com.fjhx.sale.mapper.contract.ContractInvoiceDetailsMapper;
+import com.fjhx.sale.service.contract.ContractInvoiceDetailsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.sale.entity.contract.vo.ContractInvoiceDetailsVo;
+import com.fjhx.sale.entity.contract.dto.ContractInvoiceDetailsSelectDto;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.fjhx.sale.entity.contract.dto.ContractInvoiceDetailsDto;
+import cn.hutool.core.bean.BeanUtil;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * 合同发票明细 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+@Service
+public class ContractInvoiceDetailsServiceImpl extends ServiceImpl<ContractInvoiceDetailsMapper, ContractInvoiceDetails> implements ContractInvoiceDetailsService {
+
+    @Override
+    public Page<ContractInvoiceDetailsVo> getPage(ContractInvoiceDetailsSelectDto dto) {
+        IWrapper<ContractInvoiceDetails> wrapper = getWrapper();
+        wrapper.orderByDesc("cid", ContractInvoiceDetails::getId);
+        Page<ContractInvoiceDetailsVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        return page;
+    }
+
+    @Override
+    public ContractInvoiceDetailsVo detail(Long id) {
+        ContractInvoiceDetails ContractInvoiceDetails = this.getById(id);
+        ContractInvoiceDetailsVo result = BeanUtil.toBean(ContractInvoiceDetails, ContractInvoiceDetailsVo.class);
+        return result;
+    }
+
+    @Override
+    public void add(ContractInvoiceDetailsDto contractInvoiceDetailsDto) {
+        this.save(contractInvoiceDetailsDto);
+    }
+
+    @Override
+    public void edit(ContractInvoiceDetailsDto contractInvoiceDetailsDto) {
+        this.updateById(contractInvoiceDetailsDto);
+    }
+
+    @Override
+    public void delete(Long id) {
+        this.removeById(id);
+    }
+
+    /**
+     * 根据发票查询明细
+     * @param invoiceId
+     * @return
+     */
+    @Override
+    public List<ContractInvoiceDetailsVo> getDetail(Long invoiceId) {
+        return baseMapper.getDetail(invoiceId);
+    }
+
+    /**
+     * getSumMoneyByContractIds
+     * @param contractIds
+     * @return
+     */
+    @Override
+    public List<ContractInvoiceDetailsVo> getSumMoneyByContractIds(List<Long> contractIds) {
+        return baseMapper.getSumMoneyByContractIds(contractIds);
+    }
+
+}

+ 164 - 0
hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractInvoiceServiceImpl.java

@@ -0,0 +1,164 @@
+package com.fjhx.sale.service.contract.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fjhx.customer.entity.customer.po.Customer;
+import com.fjhx.customer.entity.customer.vo.CustomerFollowRecordsVo;
+import com.fjhx.customer.service.customer.CustomerService;
+import com.fjhx.purchase.entity.invoice.po.Invoice;
+import com.fjhx.purchase.entity.invoice.po.InvoiceDetails;
+import com.fjhx.purchase.entity.invoice.vo.InvoiceDetailsVo;
+import com.fjhx.purchase.entity.invoice.vo.InvoiceVo;
+import com.fjhx.sale.entity.contract.po.ContractInvoice;
+import com.fjhx.sale.entity.contract.po.ContractInvoiceDetails;
+import com.fjhx.sale.entity.contract.vo.ContractInvoiceDetailsVo;
+import com.fjhx.sale.mapper.contract.ContractInvoiceMapper;
+import com.fjhx.sale.service.contract.ContractInvoiceDetailsService;
+import com.fjhx.sale.service.contract.ContractInvoiceService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.annotation.LogicIgnore;
+import com.ruoyi.common.annotation.TenantIgnore;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.wrapper.SqlField;
+import lombok.experimental.Delegate;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.sale.entity.contract.vo.ContractInvoiceVo;
+import com.fjhx.sale.entity.contract.dto.ContractInvoiceSelectDto;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.fjhx.sale.entity.contract.dto.ContractInvoiceDto;
+import cn.hutool.core.bean.BeanUtil;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+/**
+ * <p>
+ * 合同发票管理 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-09-08
+ */
+@Service
+public class ContractInvoiceServiceImpl extends ServiceImpl<ContractInvoiceMapper, ContractInvoice> implements ContractInvoiceService {
+
+    @Autowired
+    private ContractInvoiceDetailsService contractInvoiceDetailsService;
+
+    @Autowired
+    private CustomerService customerService;
+    /**
+     * 分页
+     * @param dto
+     * @return
+     */
+    @Override
+    public Page<ContractInvoiceVo> getPage(ContractInvoiceSelectDto dto) {
+        IWrapper<ContractInvoice> wrapper = getWrapper();
+        wrapper.orderByDesc("t1", Invoice::getCreateTime);
+        if(ObjectUtils.isNotEmpty(dto.getInvoiceType())){
+            wrapper.eq("t1", Invoice::getType,dto.getInvoiceType());
+        }
+        if(StringUtils.isNotEmpty(dto.getKeyword())){
+            wrapper.keyword(dto.getKeyword(), new SqlField("t1.contractCodes"));
+        }
+        Page<ContractInvoiceVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        List<ContractInvoiceVo> list = page.getRecords();
+        if(CollectionUtils.isNotEmpty(list)){
+            //赋值客户名称
+            customerService.attributeAssign(list, ContractInvoiceVo::getCustomerId, (item, customer) -> {
+                item.setCustomerName(customer.getName());
+            });
+        }
+        return page;
+    }
+
+    /**
+     * 明细
+     * @param id
+     * @return
+     */
+    @Override
+    public ContractInvoiceVo detail(Long id) {
+        ContractInvoice ContractInvoice = this.getById(id);
+        ContractInvoiceVo result = BeanUtil.toBean(ContractInvoice, ContractInvoiceVo.class);
+        if(ObjectUtils.isEmpty(result)){
+            throw new ServiceException("发票不存在");
+        }
+        Customer customer = customerService.getById(result.getCustomerId());
+        result.setCustomerName(ObjectUtils.isEmpty(customer)?"":customer.getName());
+        List<ContractInvoiceDetailsVo> invoiceDetailsVos = contractInvoiceDetailsService.getDetail(id);
+        List<Long> ids = invoiceDetailsVos.stream().distinct().map(ContractInvoiceDetailsVo::getContractId).collect(Collectors.toList());
+        List<ContractInvoiceDetailsVo> invoiceDetailsList = contractInvoiceDetailsService.getSumMoneyByContractIds(ids);
+        Map<Long, BigDecimal> invoiceMap = invoiceDetailsList.stream().collect(Collectors.toMap(ContractInvoiceDetailsVo::getContractId,ContractInvoiceDetailsVo::getSumMoney));
+        for(ContractInvoiceDetailsVo p:invoiceDetailsVos){
+            if(MapUtils.isNotEmpty(invoiceMap)){
+                p.setSumMoney(invoiceMap.getOrDefault(p.getContractId(), BigDecimal.ZERO));
+            }else{
+                p.setSumMoney(BigDecimal.ZERO);
+            }
+        }
+        result.setContractInvoiceDetailsVoList(invoiceDetailsVos);
+        return result;
+    }
+
+    /**
+     * 添加
+     * @param contractInvoiceDto
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(ContractInvoiceDto contractInvoiceDto) {
+        this.save(contractInvoiceDto);
+        List<ContractInvoiceDetails> invoiceDetailsList = contractInvoiceDto.getInvoiceDetailsList();
+        if(CollectionUtils.isNotEmpty(invoiceDetailsList)){
+            invoiceDetailsList = invoiceDetailsList.stream()
+                    .peek(item -> item.setInvoiceId(contractInvoiceDto.getId()))
+                    .filter(item -> item.getMoney() != null && item.getMoney().compareTo(BigDecimal.ZERO) > 0)
+                    .collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(invoiceDetailsList)) {
+                contractInvoiceDetailsService.saveBatch(invoiceDetailsList);
+            }
+        }
+    }
+
+    /**
+     * 修改
+     * @param contractInvoiceDto
+     */
+    @Override
+    @LogicIgnore
+    @Transactional(rollbackFor = Exception.class)
+    public void edit(ContractInvoiceDto contractInvoiceDto) {
+        this.updateById(contractInvoiceDto);
+        contractInvoiceDetailsService.remove(Wrappers.<ContractInvoiceDetails>query().lambda().eq(ContractInvoiceDetails::getInvoiceId,contractInvoiceDto.getId()));
+        List<ContractInvoiceDetails> invoiceDetailsList = contractInvoiceDto.getInvoiceDetailsList();
+        if(CollectionUtils.isNotEmpty(invoiceDetailsList)){
+            for(ContractInvoiceDetails d:invoiceDetailsList){
+                d.setInvoiceId(contractInvoiceDto.getId());
+            }
+            contractInvoiceDetailsService.saveBatch(invoiceDetailsList);
+        }
+    }
+
+    /**
+     * 删除
+     * @param id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(Long id) {
+        this.removeById(id);
+        contractInvoiceDetailsService.remove(Wrappers.<ContractInvoiceDetails>query().lambda().eq(ContractInvoiceDetails::getInvoiceId,id));
+    }
+
+}

+ 46 - 0
hx-sale/src/main/resources/mapper/contract/ContractInvoiceDetailsMapper.xml

@@ -0,0 +1,46 @@
+<?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.fjhx.sale.mapper.contract.ContractInvoiceDetailsMapper">
+    <select id="getPage" resultType="com.fjhx.sale.entity.contract.vo.ContractInvoiceDetailsVo">
+        select
+            cid.id,
+            cid.invoice_id,
+            cid.contract_id,
+            cid.money,
+            cid.remark,
+            cid.create_user,
+            cid.create_time,
+            cid.update_user,
+            cid.update_time
+        from contract_invoice_details cid
+            ${ew.customSqlSegment}
+    </select>
+
+    <select id="getDetail" resultType="com.fjhx.sale.entity.contract.vo.ContractInvoiceDetailsVo">
+        SELECT
+            t1.*,
+            t2.`code` AS contractCode,
+            t2.amount AS contractAmount
+        FROM
+            contract_invoice_details t1
+                LEFT JOIN contract t2 ON t1.contract_id = t2.id
+        WHERE invoice_id = #{invoiceId}
+    </select>
+
+    <select id="getSumMoneyByContractIds" resultType="com.fjhx.sale.entity.contract.vo.ContractInvoiceDetailsVo">
+        SELECT
+            contract_id,
+            IFNULL(SUM(money),0) AS sumMoney
+        FROM
+        contract_invoice_details
+        <where>
+            <if test="contractIds neq null and contractIds.size() > 0">
+                <foreach collection="contractIds" item="contractId" open="contract_id IN (" separator="," close=")">
+                    #{contractId}
+                </foreach>
+            </if>
+        </where>
+        GROUP BY
+        contract_id
+    </select>
+</mapper>

+ 22 - 0
hx-sale/src/main/resources/mapper/contract/ContractInvoiceMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.sale.mapper.contract.ContractInvoiceMapper">
+    <select id="getPage" resultType="com.fjhx.sale.entity.contract.vo.ContractInvoiceVo">
+        SELECT
+            *
+        FROM
+            (
+                SELECT
+                    t1.*,
+                    GROUP_CONCAT( t3.`code` ) AS contractCodes
+                FROM
+                    contract_invoice t1
+                        LEFT JOIN contract_invoice_details t2 ON t1.id = t2.invoice_id
+                        LEFT JOIN contract t3 ON t2.contract_id = t3.id
+                GROUP BY
+                    t1.id
+            ) t1
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff