Procházet zdrojové kódy

1.新增逾期未收款订单/产品罚款记录查询接口

GouGengquan před 3 měsíci
rodič
revize
cd22c72ba6

+ 5 - 3
biz-base/src/main/java/com/dayou/controller/FinanceFineController.java

@@ -1,5 +1,7 @@
 package com.dayou.controller;
 
+import com.dayou.dto.FinanceFineSelectDTO;
+import com.dayou.vo.FinanceFineVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -36,9 +38,9 @@ public class FinanceFineController extends BaseController {
     /**
     * 超期未收款罚款表列表
     */
-    @GetMapping("")
-    public RestResponse<Page<FinanceFine>> page(FinanceFine financeFine, Page page){
-        Page<FinanceFine> pages=financeFineService.selectPage(page,financeFine);
+    @GetMapping("/page")
+    public RestResponse<Page<FinanceFineVO>> page(Page page, FinanceFineSelectDTO financeFineSelectDTO){
+        Page<FinanceFineVO> pages=financeFineService.selectPage(page,financeFineSelectDTO);
         return RestResponse.data(pages);
     }
 

+ 25 - 0
biz-base/src/test/java/fine/FineTests.java

@@ -0,0 +1,25 @@
+package fine;
+
+import com.dayou.BaseApplication;
+import com.dayou.service.IFinanceFineService;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@Slf4j
+@SpringBootTest(classes = BaseApplication.class)
+@RunWith(value = SpringJUnit4ClassRunner.class)
+public class FineTests {
+
+    @Autowired
+    private IFinanceFineService financeFineService;
+
+    @Test
+    public void testCompileFineOrder() {
+        financeFineService.compileFineOrder();
+    }
+
+}

+ 11 - 0
dao/src/main/java/com/dayou/mapper/FinanceFineMapper.java

@@ -1,10 +1,13 @@
 package com.dayou.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dayou.dto.FinanceFineSelectDTO;
 import com.dayou.entity.FinanceFine;
 import com.dayou.dao.CustomBaseMapper;
 import com.dayou.entity.FinanceInvoice;
 import com.dayou.vo.CompileFineAssetsOrder;
 import com.dayou.vo.CompileFineMajorOrder;
+import com.dayou.vo.FinanceFineVO;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
@@ -21,6 +24,14 @@ import java.util.List;
 public interface FinanceFineMapper extends CustomBaseMapper<FinanceFine> {
 
     /**
+     * 分页查询超期罚款
+     * @param page 分页
+     * @param financeFineSelectDTO 查询条件dto
+     * @return Page<FinanceFineVO>
+     */
+    Page<FinanceFineVO> selectPage(@Param("page") Page page, @Param("dto") FinanceFineSelectDTO financeFineSelectDTO);
+
+    /**
      * 获取逾期资产产品款项信息(不包含预评)
      * @return List<CompileFineAssetsOrder>
      */

+ 87 - 4
dao/src/main/resources/mapper/FinanceFineMapper.xml

@@ -28,11 +28,93 @@
         order_fund_id, production_fund_id, fine_amount, real_fine_amount, explain, remark, status, leader_id, confirm_date
     </sql>
 
+    <!--分页查询超期罚款-->
+    <select id="selectPage" resultType="com.dayou.vo.FinanceFineVO">
+        SELECT fine.id AS id,
+               oFund.business_type AS businessType,
+               oFund.order_id AS orderId,
+               oFund.order_name AS orderName,
+               (SELECT GROUP_CONCAT(ticket_no SEPARATOR ',')
+                FROM finance_invoice
+                WHERE finance_invoice.deleted = 0
+                  AND finance_invoice.order_fund_id = fine.order_fund_id
+                  AND IF(fine.production_fund_id IS NOT NULL, finance_invoice.production_fund_id = fine.production_fund_id, TRUE)
+               ) AS invoiceNo,
+               <if test="dto != null and dto.businessType == 'ASSET_BUSINESS' or dto.businessType == 'MAJOR_BUSINESS'">
+                   pFund.production_no AS productionNo,
+                   pFund.production_type AS productionType,
+                   pFund.production_should_amount AS shouldAmount,
+                   pFund.standard_amount AS standardAmount,
+                   `order`.bailor AS bailor,
+               </if>
+               <if test="dto != null and dto.businessType == 'PERSONAL_BUSINESS'">
+                   oFund.should_amount AS shouldAmount,
+                   CONCAT(`order`.bailorA, IF(`order`.bailorB IS NOT NULL AND `order`.bailorB != '', ',', ''), `order`.bailorB) AS bailor,
+               </if>
+               user.name AS clientManagerName,
+               DATEDIFF(CURDATE(), DATE( pro.repertory_out_time )) AS overdueDay,
+               customer.name AS customerName,
+               subCustomer.name AS customerSubName,
+               fine.fine_amount AS fineAmount,
+               fine.real_fine_amount AS realFineAmount,
+               fine.status AS status,
+               fine.created AS punishDate,
+               fine.`explain` AS `explain`
+        FROM finance_fine AS fine
+        LEFT JOIN order_fund AS oFund ON oFund.deleted = 0 AND fine.order_fund_id = oFund.id
+        <if test="dto != null and dto.businessType == 'ASSET_BUSINESS'">
+            LEFT JOIN production_fund AS pFund ON pFund.deleted = 0 AND fine.production_fund_id = pFund.id
+            LEFT JOIN ( SELECT business_id, production_no, repertory_out_time FROM assets_production WHERE deleted = 0 AND repertory_out_time IS NOT NULL AND production_type != 'STATEMENT') AS pro
+            ON pFund.business_id = pro.business_id AND pFund.production_no = pro.production_no
+            LEFT JOIN assets AS `order` ON `order`.deleted = 0 AND `order`.id = pFund.business_id
+        </if>
+        <if test="dto != null and dto.businessType == 'MAJOR_BUSINESS'">
+            LEFT JOIN production_fund AS pFund ON pFund.deleted = 0 AND fine.production_fund_id = pFund.id
+            LEFT JOIN ( SELECT major_id AS business_id, report_no AS production_no, repertory_out_time, production FROM major_production WHERE deleted = 0 AND repertory_out_time IS NOT NULL) AS pro
+            ON pFund.business_id = pro.business_id AND pFund.production_no = pro.production_no AND production = pFund.production_type
+            LEFT JOIN major AS `order` ON `order`.deleted = 0 AND `order`.id = pFund.business_id
+        </if>
+        <if test="dto != null and dto.businessType == 'PERSONAL_BUSINESS'">
+            LEFT JOIN personal_target pt ON pt.personal_id = oFund.business_id
+            LEFT JOIN ( SELECT target_id,repertory_out_time, production FROM personal_production WHERE repertory_out_time IS NOT NULL GROUP BY target_id ) AS pro ON pro.target_id = pt.id
+            LEFT JOIN personal AS `order` ON `order`.deleted = 0 AND `order`.id = oFund.business_id
+        </if>
+        LEFT JOIN customer_company AS customer ON customer.id = `order`.clientele_id
+        LEFT JOIN customer_company AS subCustomer ON subCustomer.id = `order`.clientele_sub_id
+        LEFT JOIN user ON `order`.client_manager_id = user.id AND user.deleted = 0
+        WHERE oFund.business_type = #{dto.businessType}
+        <if test="dto != null and dto.keyWord != null and dto.keyWord != ''">
+            AND (`order`.order_id LIKE CONCAT('%', #{dto.keyWord},'%')
+            <if test="dto != null and dto.businessType == 'ASSET_BUSINESS' or dto.businessType == 'MAJOR_BUSINESS'">
+                OR pFund.production_no LIKE CONCAT('%', #{dto.keyWord},'%')
+            </if>
+            )
+        </if>
+        <if test="dto != null and dto.invoiceNo != null and dto.invoiceNo != ''">
+            AND (SELECT GROUP_CONCAT(ticket_no SEPARATOR ',')
+            FROM finance_invoice
+            WHERE finance_invoice.deleted = 0
+            AND finance_invoice.order_fund_id = fine.order_fund_id
+            AND ticket_no LIKE CONCAT('%', #{dto.invoiceNo} ,'%')
+            AND IF(fine.production_fund_id IS NOT NULL, finance_invoice.production_fund_id = fine.production_fund_id, TRUE)
+            ) IS NOT NULL
+        </if>
+        <if test="dto != null and dto.clientManagerName != null and dto.clientManagerName != ''">
+            AND user.name = #{dto.clientManagerName}
+        </if>
+        <if test="dto != null and dto.status != null">
+            AND fine.status = #{dto.status}
+        </if>
+        <if test="dto != null and dto.startPunishDate != null and dto.endPunishDate!= null">
+            AND fine.created BETWEEN #{dto.startPunishDate} AND #{dto.endPunishDate}
+        </if>
+    </select>
+
     <!--获取逾期资产产品款项信息-->
     <select id="getAssetsOrder" resultType="com.dayou.vo.CompileFineAssetsOrder">
         SELECT
-            `of`.id,
-            pf.id,
+            `of`.id AS orderFundId,
+            pf.id AS productionFundId,
             pf.production_should_amount,
             pf.standard_amount
         FROM
@@ -79,8 +161,8 @@
     <!--获取逾期大中型产品款项信息-->
     <select id="getMajorOrder" resultType="com.dayou.vo.CompileFineMajorOrder">
         SELECT
-            pf.id,
-            pf.order_fund_id,
+            pf.id AS productionFundId,
+            pf.order_fund_id AS orderFundId,
             pf.production_should_amount AS shouldAmount,
             pf.standard_amount
         FROM
@@ -127,6 +209,7 @@
         SELECT SUM(real_amount) * 0.05
         FROM finance_invoice
         WHERE deleted = 0
+        AND state = '已开票'
         AND order_fund_id = #{orderFundId}
         <if test="productionFundId != null">
             AND production_fund_id = #{productionFundId}

+ 45 - 0
domain/src/main/java/com/dayou/dto/FinanceFineSelectDTO.java

@@ -0,0 +1,45 @@
+package com.dayou.dto;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class FinanceFineSelectDTO {
+
+    /**
+     * 业务类型
+     */
+    private String businessType;
+
+    /**
+     * 关键字(项⽬编号或产品号)
+     */
+    private String keyWord;
+
+    /**
+     * 发票号
+     */
+    private String invoiceNo;
+
+    /**
+     * 客户经理
+     */
+    private String clientManagerName;
+
+    /**
+     * 是否确认
+     */
+    private Boolean status;
+
+    /**
+     * 罚款⽇期-起始
+     */
+    private LocalDateTime startPunishDate;
+
+    /**
+     * 罚款⽇期-结束
+     */
+    private LocalDateTime endPunishDate;
+
+}

+ 130 - 0
domain/src/main/java/com/dayou/vo/FinanceFineVO.java

@@ -0,0 +1,130 @@
+package com.dayou.vo;
+
+import com.dayou.annotation.Excel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+public class FinanceFineVO {
+
+    /**
+     * 罚款记录id
+     */
+    private Long id;
+
+    /**
+     * 业务id
+     */
+    private Long businessId;
+
+    /**
+     * 业务类型
+     */
+    @Excel(name = "业务类型")
+    private String businessType;
+
+    /**
+     * 项⽬编号
+     */
+    @Excel(name = "项⽬编号")
+    private String orderId;
+
+    /**
+     * 项⽬名称
+     */
+    @Excel(name = "项⽬名称")
+    private String orderName;
+
+    /**
+     * 产品号
+     */
+    @Excel(name = "产品号")
+    private String productionNo;
+
+    /**
+     * 产品类型
+     */
+    @Excel(name = "产品类型")
+    private String productionType;
+
+    /**
+     * 发票号
+     */
+    @Excel(name = "发票号")
+    private String invoiceNo;
+
+    /**
+     * 应收⾦额
+     */
+    @Excel(name = "应收⾦额")
+    private BigDecimal shouldAmount;
+
+    /**
+     * 标准收费
+     */
+    @Excel(name = "标准收费")
+    private BigDecimal standardAmount;
+
+    /**
+     * 客户经理
+     */
+    @Excel(name = "客户经理")
+    private String clientManagerName;
+
+    /**
+     * 超期天数
+     */
+    @Excel(name = "超期天数")
+    private Integer overdueDay;
+
+    /**
+     * 客户名称
+     */
+    @Excel(name = "客户名称")
+    private String customerName;
+
+    /**
+     * 业务来源
+     */
+    @Excel(name = "业务来源")
+    private String customerSubName;
+
+    /**
+     * 委托方
+     */
+    @Excel(name = "委托方")
+    private String bailor;
+
+    /**
+     * 罚款⾦额
+     */
+    @Excel(name = "罚款⾦额")
+    private BigDecimal fineAmount;
+
+    /**
+     * 实际罚款⾦额
+     */
+    @Excel(name = "实际罚款⾦额")
+    private BigDecimal realFineAmount;
+
+    /**
+     * 是否确认
+     */
+    @Excel(name = "是否确认")
+    private Boolean status;
+
+    /**
+     * 罚款⽇期
+     */
+    @Excel(name = "罚款⽇期")
+    private LocalDate punishDate;
+
+    /**
+     * 客户经理情况说明
+     */
+    @Excel(name = "客户经理情况说明")
+    private String explain;
+
+}

+ 4 - 3
service/src/main/java/com/dayou/service/IFinanceFineService.java

@@ -1,9 +1,11 @@
 package com.dayou.service;
 
+import com.dayou.dto.FinanceFineSelectDTO;
 import com.dayou.entity.FinanceFine;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.dayou.vo.FinanceFineVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -17,7 +19,7 @@ import org.springframework.web.multipart.MultipartFile;
  */
 public interface IFinanceFineService extends IService<FinanceFine> {
 
-    Page<FinanceFine> selectPage(Page page, FinanceFine financeFine);
+    Page<FinanceFineVO> selectPage(Page page, FinanceFineSelectDTO financeFineSelectDTO);
 
     FinanceFine detail(Long id);
 
@@ -29,8 +31,7 @@ public interface IFinanceFineService extends IService<FinanceFine> {
 
     /**
      * 统计财务收款预警中超过90天的订单或产品新增到罚款表
-     * @return Boolean
      */
-    Boolean compileFineOrder();
+    void compileFineOrder();
 
 }

+ 16 - 9
service/src/main/java/com/dayou/service/impl/FinanceFineServiceImpl.java

@@ -1,12 +1,14 @@
 package com.dayou.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.dayou.dto.FinanceFineSelectDTO;
 import com.dayou.entity.FinanceFine;
 import com.dayou.mapper.FinanceFineMapper;
 import com.dayou.service.IFinanceFineService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dayou.vo.CompileFineAssetsOrder;
 import com.dayou.vo.CompileFineMajorOrder;
+import com.dayou.vo.FinanceFineVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -34,9 +36,8 @@ public class FinanceFineServiceImpl extends ServiceImpl<FinanceFineMapper, Finan
     private FinanceFineMapper financeFineMapper;
 
     @Override
-    @SuppressWarnings("unchecked")
-    public Page<FinanceFine> selectPage(Page page, FinanceFine financeFine) {
-        return this.page(page, new QueryWrapper<FinanceFine>(financeFine));
+    public Page<FinanceFineVO> selectPage(Page page, FinanceFineSelectDTO financeFineSelectDTO) {
+        return financeFineMapper.selectPage(page, financeFineSelectDTO);
     }
 
 
@@ -63,12 +64,10 @@ public class FinanceFineServiceImpl extends ServiceImpl<FinanceFineMapper, Finan
 
     /**
      * 统计财务收款预警中超过90天的订单或产品新增到罚款表
-     *
-     * @return Boolean
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean compileFineOrder() {
+    public void compileFineOrder() {
         List<CompileFineAssetsOrder> compileFineAssetsOrderList = financeFineMapper.getAssetsOrder();
         List<Long> compileFinePersonalOrderList = financeFineMapper.getPersonalOrder();
         List<CompileFineMajorOrder> compileFineMajorOrderList = financeFineMapper.getMajorOrder();
@@ -87,7 +86,11 @@ public class FinanceFineServiceImpl extends ServiceImpl<FinanceFineMapper, Finan
                     fineAmount = assetsOrder.getProductionShouldAmount().multiply(BigDecimal.valueOf(0.05));
                 } else {
                     // 没有应收款的话,罚款金额就是 standard_amount * 30% * 5%
-                    fineAmount = assetsOrder.getStandardAmount().multiply(BigDecimal.valueOf(0.3)).multiply(BigDecimal.valueOf(0.05));
+                    if (ObjectUtil.isNotNull(assetsOrder.getStandardAmount())) {
+                        fineAmount = assetsOrder.getStandardAmount().multiply(BigDecimal.valueOf(0.3)).multiply(BigDecimal.valueOf(0.05));
+                    }else {
+                        fineAmount = BigDecimal.valueOf(0);
+                    }
                 }
             }
 
@@ -129,7 +132,11 @@ public class FinanceFineServiceImpl extends ServiceImpl<FinanceFineMapper, Finan
                     fineAmount = majorOrder.getProductionShouldAmount().multiply(BigDecimal.valueOf(0.05));
                 } else {
                     // 没有应收款的话,罚款金额就是 standard_amount * 30% * 5%
-                    fineAmount = majorOrder.getStandardAmount().multiply(BigDecimal.valueOf(0.3)).multiply(BigDecimal.valueOf(0.05));
+                    if (ObjectUtil.isNotNull(majorOrder.getStandardAmount())) {
+                        fineAmount = majorOrder.getStandardAmount().multiply(BigDecimal.valueOf(0.3)).multiply(BigDecimal.valueOf(0.05));
+                    }else {
+                        fineAmount = BigDecimal.valueOf(0);
+                    }
                 }
             }
 
@@ -150,7 +157,7 @@ public class FinanceFineServiceImpl extends ServiceImpl<FinanceFineMapper, Finan
             financeFineList.add(financeFine);
         }
 
-        return this.saveBatch(financeFineList);
+        this.saveBatch(financeFineList);
     }
 
 }

+ 25 - 0
service/src/main/java/com/dayou/task/FinanceFineScheduled.java

@@ -0,0 +1,25 @@
+package com.dayou.task;
+
+import com.dayou.service.IFinanceFineService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class FinanceFineScheduled {
+
+    @Autowired
+    private IFinanceFineService financeFineService;
+
+    /**
+     * 每⽉23⽇凌晨0点 将逾期订单/产品信息新增到finance_fine表
+     */
+    @Scheduled(cron = "0 0 0 23 * ?")
+    public void compileFineOrderTask() {
+        financeFineService.compileFineOrder();
+        log.info("搜集逾期订单/产品信息并添加到罚款表完成");
+    }
+
+}