24282 3 months ago
parent
commit
67ba8b0cae

+ 2 - 2
jy-business/src/main/java/com/jy/business/contract/controller/ContractInfoController.java

@@ -33,8 +33,8 @@ public class ContractInfoController {
     private ContractInfoService contractInfoService;
 
     @GetMapping("/statistics")
-    public List<ContractStatisticsVo> getStatistics() {
-        return contractInfoService.getStatistics();
+    public List<ContractStatisticsVo> getStatistics(ContractInfoSelectDto dto) {
+        return contractInfoService.getStatistics(dto);
     }
 
     /**

+ 48 - 4
jy-business/src/main/java/com/jy/business/contract/dao/ContractInfoDao.java

@@ -11,6 +11,7 @@ import com.jy.business.contract.model.table.ContractInfoTable;
 import com.jy.business.contract.model.vo.ContractInfoVo;
 import com.jy.business.contract.model.vo.ContractStatisticsVo;
 import com.jy.business.contract.model.vo.TransactionVo;
+import com.jy.business.payment.model.entity.PaymentRequestsDetail;
 import com.jy.business.payment.model.table.PaymentRemitTable;
 import com.jy.business.payment.model.table.PaymentRequestsDetailTable;
 import com.jy.business.payment.model.table.PaymentRequestsTable;
@@ -23,9 +24,12 @@ import java.util.List;
 @Service
 public class ContractInfoDao extends BaseDao<ContractInfoMapper, ContractInfo> {
 
-    public List<ContractStatisticsVo> getStatistics() {
+    public List<ContractStatisticsVo> getStatistics(ContractInfoSelectDto dto) {
         ContractInfoTable ci = ContractInfoTable.ci;
         CapitalTransactionsTable ct = CapitalTransactionsTable.ct;
+        PaymentRequestsDetailTable prd = PaymentRequestsDetailTable.prd;
+        PaymentRequestsTable pr = PaymentRequestsTable.pr;
+        PaymentRemitTable pre = PaymentRemitTable.payment_remit;
 
         TempTable t = sql().select(
                         _ifNull(_sum(ct.amount), 0).as(ContractStatisticsVo::getFundReceivedAmount),
@@ -36,15 +40,33 @@ public class ContractInfoDao extends BaseDao<ContractInfoMapper, ContractInfo> {
                 .groupBy(ci.sellerCompany)
                 .toTable("t");
 
+        TempTable t2 = sql().select(
+                        _ifNull(_sum(prd.amount), 0).as("amount"),
+                        ci.sellerCompany
+                )
+                .from(prd)
+                .innerJoin(ci).on(ci.id.eq(prd.contractId))
+                .innerJoin(pr).on(prd.paymentRequestsId.eq(pr.id))
+                .innerJoin(pre).on(pre.paymentRequestsId.eq(pr.id))
+                .groupBy(ci.sellerCompany)
+                .toTable("t2");
+
         return sql(ContractStatisticsVo.class)
                 .select(
                         ci.sellerCompany,
                         _count(0).as(ContractStatisticsVo::getContractQuantity),
                         _sum(ci.amount).as(ContractStatisticsVo::getContractAmount),
-                        t.field(ContractStatisticsVo::getFundReceivedAmount)
+                        t.field(ContractStatisticsVo::getFundReceivedAmount),
+                        column("t.fund_received_amount - t2.amount").as(ContractStatisticsVo::getProfit)
                 )
                 .from(ci)
                 .leftJoin(t).on(ci.sellerCompany.eq(t.field(ContractInfo::getSellerCompany)))
+                .leftJoin(t2).on(ci.sellerCompany.eq(t2.field(ContractInfo::getSellerCompany)))
+                .where(
+                        ci.contractNo.like(dto.getContractNo()),
+                        ci.status.eq(dto.getStatus()),
+                        ci.signingDate.between(dto.getStartDate(), dto.getEndDate())
+                )
                 .groupBy(ci.sellerCompany)
                 .list();
     }
@@ -86,7 +108,9 @@ public class ContractInfoDao extends BaseDao<ContractInfoMapper, ContractInfo> {
                 )
                 .from(ci)
                 .where(
-                        ci.contractNo.like(dto.getContractNo())
+                        ci.contractNo.like(dto.getContractNo()),
+                        ci.status.eq(dto.getStatus()),
+                        ci.signingDate.between(dto.getStartDate(), dto.getEndDate())
                 )
                 .orderBy(
                         ci.id.desc()
@@ -118,7 +142,6 @@ public class ContractInfoDao extends BaseDao<ContractInfoMapper, ContractInfo> {
         PaymentRequestsTable pr = PaymentRequestsTable.pr;
         PaymentRemitTable pre = PaymentRemitTable.payment_remit;
 
-
         // 请款
         TempTable t = sql()
                 .select(
@@ -170,4 +193,25 @@ public class ContractInfoDao extends BaseDao<ContractInfoMapper, ContractInfo> {
                 .list();
     }
 
+    public List<PaymentRequestsDetail> getPaymentList(List<Long> idList) {
+        PaymentRequestsDetailTable prd = PaymentRequestsDetailTable.prd;
+        PaymentRequestsTable pr = PaymentRequestsTable.pr;
+        PaymentRemitTable pre = PaymentRemitTable.payment_remit;
+
+        return sql(PaymentRequestsDetail.class).select(
+                        prd.contractId,
+                        _ifNull(_sum(prd.amount), 0).as(PaymentRequestsDetail::getAmount)
+                )
+                .from(prd)
+                .innerJoin(pr).on(prd.paymentRequestsId.eq(pr.id))
+                .innerJoin(pre).on(pre.paymentRequestsId.eq(pr.id))
+                .where(
+                        prd.contractId.in(idList)
+                )
+                .groupBy(
+                        prd.contractId
+                )
+                .list();
+    }
+
 }

+ 12 - 0
jy-business/src/main/java/com/jy/business/contract/model/dto/ContractInfoSelectDto.java

@@ -1,8 +1,12 @@
 package com.jy.business.contract.model.dto;
 
+import cn.hutool.core.date.DatePattern;
 import com.jy.framework.model.base.BaseSelectDto;
 import lombok.Getter;
 import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
 
 /**
  * 合同列表查询入参实体
@@ -16,4 +20,12 @@ public class ContractInfoSelectDto extends BaseSelectDto {
 
     private String contractNo;
 
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    private Date startDate;
+
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    private Date endDate;
+
+    private Integer status;
+
 }

+ 5 - 0
jy-business/src/main/java/com/jy/business/contract/model/vo/ContractInfoVo.java

@@ -29,6 +29,11 @@ public class ContractInfoVo extends ContractInfo {
      */
     private BigDecimal receivedAmount;
 
+    /**
+     * 利润
+     */
+    private BigDecimal profit;
+
     private List<CapitalTransactionsVo> capitalTransactionsList;
 
     private List<ContractDetail> list;

+ 5 - 0
jy-business/src/main/java/com/jy/business/contract/model/vo/ContractStatisticsVo.java

@@ -29,4 +29,9 @@ public class ContractStatisticsVo {
      */
     private BigDecimal fundReceivedAmount;
 
+    /**
+     * 利润
+     */
+    private BigDecimal profit;
+
 }

+ 1 - 1
jy-business/src/main/java/com/jy/business/contract/service/ContractInfoService.java

@@ -19,7 +19,7 @@ import java.util.List;
  */
 public interface ContractInfoService {
 
-    List<ContractStatisticsVo> getStatistics();
+    List<ContractStatisticsVo> getStatistics(ContractInfoSelectDto dto);
 
     /**
      * 合同列表

+ 23 - 5
jy-business/src/main/java/com/jy/business/contract/service/impl/ContractInfoServiceImpl.java

@@ -14,6 +14,7 @@ import com.jy.business.contract.model.vo.ContractInfoVo;
 import com.jy.business.contract.model.vo.ContractStatisticsVo;
 import com.jy.business.contract.model.vo.TransactionVo;
 import com.jy.business.contract.service.ContractInfoService;
+import com.jy.business.payment.model.entity.PaymentRequestsDetail;
 import com.jy.framework.model.base.BaseIdPo;
 import com.jy.framework.utils.AssertUtil;
 import jakarta.annotation.Resource;
@@ -47,23 +48,26 @@ public class ContractInfoServiceImpl implements ContractInfoService {
     private CapitalTransactionsDao capitalTransactionsDao;
 
     @Override
-    public List<ContractStatisticsVo> getStatistics() {
-        List<ContractStatisticsVo> list = contractInfoDao.getStatistics();
+    public List<ContractStatisticsVo> getStatistics(ContractInfoSelectDto dto) {
+        List<ContractStatisticsVo> list = contractInfoDao.getStatistics(dto);
 
         int contractQuantity = 0;
         BigDecimal contractAmount = BigDecimal.ZERO;
         BigDecimal fundReceivedAmount = BigDecimal.ZERO;
+        BigDecimal profit = BigDecimal.ZERO;
 
         ContractStatisticsVo contractStatisticsVo = new ContractStatisticsVo();
         for (ContractStatisticsVo item : list) {
             contractQuantity = contractQuantity + item.getContractQuantity();
             contractAmount = contractAmount.add(item.getContractAmount());
             fundReceivedAmount = fundReceivedAmount.add(item.getFundReceivedAmount());
+            profit = profit.add(item.getProfit());
         }
 
         contractStatisticsVo.setContractQuantity(contractQuantity);
         contractStatisticsVo.setContractAmount(contractAmount);
         contractStatisticsVo.setFundReceivedAmount(fundReceivedAmount);
+        contractStatisticsVo.setProfit(profit);
         contractStatisticsVo.setSellerCompany("合计");
 
         list.add(0, contractStatisticsVo);
@@ -86,10 +90,15 @@ public class ContractInfoServiceImpl implements ContractInfoService {
 
         // 合同id
         List<Long> idList = records.stream().map(BaseIdPo::getId).toList();
-        Map<Long, List<CapitalTransactionsVo>> map = capitalTransactionsDao.getByContract(idList)
-                .stream()
+
+        // 到账金额
+        Map<Long, List<CapitalTransactionsVo>> map = capitalTransactionsDao.getByContract(idList).stream()
                 .collect(Collectors.groupingBy(CapitalTransactions::getContractId));
 
+        // 请款金额
+        Map<Long, List<PaymentRequestsDetail>> collect = contractInfoDao.getPaymentList(idList).stream()
+                .collect(Collectors.groupingBy(PaymentRequestsDetail::getContractId));
+
         for (ContractInfoVo record : records) {
             List<CapitalTransactionsVo> capitalTransactionsList = map.get(record.getId());
 
@@ -102,9 +111,18 @@ public class ContractInfoServiceImpl implements ContractInfoService {
                                 .map(CapitalTransactions::getAmount)
                                 .reduce(BigDecimal.ZERO, BigDecimal::add)
                 );
-
                 record.setCapitalTransactionsList(capitalTransactionsList);
             }
+
+            List<PaymentRequestsDetail> paymentRequestsDetails = collect.get(record.getId());
+            if (ObjectUtil.isEmpty(paymentRequestsDetails)) {
+                record.setProfit(record.getReceivedAmount());
+            } else {
+                record.setProfit(record.getReceivedAmount()
+                        .subtract(paymentRequestsDetails.stream().map(PaymentRequestsDetail::getAmount)
+                                .reduce(BigDecimal.ZERO, BigDecimal::add))
+                );
+            }
         }
 
         return page;

+ 54 - 14
jy-ui/src/views/business/contract/info/index.vue

@@ -37,6 +37,28 @@ const queryConfig: FormConfigType[] = [
     type: 'input',
     prop: 'contractNo',
     label: '合同编号'
+  },
+  {
+    type: 'select',
+    prop: 'status',
+    label: '合同状态',
+    option: [
+      {
+        key: 10,
+        label: '进行中'
+      },
+      {
+        key: 20,
+        label: '已完成'
+      },
+    ]
+  },
+  {
+    type: 'datePicker',
+    prop: 'createTime',
+    label: '签订日期',
+    datePickerType: 'daterange',
+    defaultTime: [new Date(0, 0, 0, 0, 0, 0), new Date(0, 0, 0, 23, 59, 59)]
   }
 ]
 
@@ -67,6 +89,14 @@ const columnConfig: ColumnConfigType[] = [
     label: '签订日期'
   },
   {
+    prop: 'startDate',
+    label: '开始日期'
+  },
+  {
+    prop: 'endDate',
+    label: '结束日期'
+  },
+  {
     prop: 'sellerCompany',
     label: '归属公司'
   },
@@ -74,14 +104,6 @@ const columnConfig: ColumnConfigType[] = [
     prop: 'customerName',
     label: '客户'
   },
-  // {
-  //   prop: 'startDate',
-  //   label: '开始日期'
-  // },
-  // {
-  //   prop: 'endDate',
-  //   label: '结束日期'
-  // },
   {
     prop: 'currency',
     label: '币种'
@@ -117,6 +139,17 @@ const columnConfig: ColumnConfigType[] = [
     }
   },
   {
+    prop: 'profit',
+    label: '实际收益'
+  },
+  {
+    prop: 'status',
+    label: '合同状态',
+    formatter: (row) => {
+      return row.status == 10 ? '进行中' : '已完成'
+    }
+  },
+  {
     width: 120,
     handleConfig: [
       {
@@ -424,6 +457,11 @@ onMounted(() => {
 })
 
 function getPage() {
+  if (queryData.value.createTime && queryData.value.createTime.length > 0) {
+    queryData.value.startDate = queryData.value.createTime[0]
+    queryData.value.endDate = queryData.value.createTime[1]
+  }
+
   getPageApi(queryData.value).then((resp: StrAnyObjArr) => {
     tableData.value = resp.records
     pageTotal.value = resp.total
@@ -491,14 +529,16 @@ function handleRemove(idList: string[]) {
             {{ item.sellerCompany }}
           </div>
           <div style="display: flex; color: #ce00ff; font-weight: bold; padding-top: 6px">
-            <div style="width: 33%">{{ item.contractQuantity }}</div>
-            <div style="width: 33%">{{ item.contractAmount }}</div>
-            <div style="width: 34%">{{ item.fundReceivedAmount }}</div>
+            <div style="width: 25%">{{ item.contractQuantity }}</div>
+            <div style="width: 25%">{{ item.contractAmount }}</div>
+            <div style="width: 25%">{{ item.fundReceivedAmount }}</div>
+            <div style="width: 25%">{{ item.profit }}</div>
           </div>
           <div style="display: flex; padding-top: 6px">
-            <div style="width: 33%">合同数量</div>
-            <div style="width: 33%">合同金额</div>
-            <div style="width: 34%">到账金额</div>
+            <div style="width: 25%">合同数量</div>
+            <div style="width: 25%">合同金额</div>
+            <div style="width: 25%">到账金额</div>
+            <div style="width: 25%">实际收益</div>
           </div>
         </div>
       </div>