Browse Source

Merge remote-tracking branch 'origin/master'

wucl 3 months ago
parent
commit
5d8cf266c3
24 changed files with 1570 additions and 0 deletions
  1. 85 0
      biz-base/src/main/java/com/dayou/controller/FinanceFineController.java
  2. 83 0
      biz-base/src/main/java/com/dayou/controller/FinanceFineRefundController.java
  3. 96 0
      biz-base/src/main/java/com/dayou/controller/ProductionReturnController.java
  4. 25 0
      biz-base/src/test/java/fine/FineTests.java
  5. 60 0
      dao/src/main/java/com/dayou/mapper/FinanceFineMapper.java
  6. 16 0
      dao/src/main/java/com/dayou/mapper/FinanceFineRefundMapper.java
  7. 16 0
      dao/src/main/java/com/dayou/mapper/ProductionReturnMapper.java
  8. 219 0
      dao/src/main/resources/mapper/FinanceFineMapper.xml
  9. 28 0
      dao/src/main/resources/mapper/FinanceFineRefundMapper.xml
  10. 35 0
      dao/src/main/resources/mapper/ProductionReturnMapper.xml
  11. 45 0
      domain/src/main/java/com/dayou/dto/FinanceFineSelectDTO.java
  12. 83 0
      domain/src/main/java/com/dayou/entity/FinanceFine.java
  13. 64 0
      domain/src/main/java/com/dayou/entity/FinanceFineRefund.java
  14. 109 0
      domain/src/main/java/com/dayou/entity/ProductionReturn.java
  15. 33 0
      domain/src/main/java/com/dayou/vo/CompileFineAssetsOrder.java
  16. 30 0
      domain/src/main/java/com/dayou/vo/CompileFineMajorOrder.java
  17. 130 0
      domain/src/main/java/com/dayou/vo/FinanceFineVO.java
  18. 28 0
      service/src/main/java/com/dayou/service/IFinanceFineRefundService.java
  19. 37 0
      service/src/main/java/com/dayou/service/IFinanceFineService.java
  20. 28 0
      service/src/main/java/com/dayou/service/IProductionReturnService.java
  21. 66 0
      service/src/main/java/com/dayou/service/impl/FinanceFineRefundServiceImpl.java
  22. 163 0
      service/src/main/java/com/dayou/service/impl/FinanceFineServiceImpl.java
  23. 66 0
      service/src/main/java/com/dayou/service/impl/ProductionReturnServiceImpl.java
  24. 25 0
      service/src/main/java/com/dayou/task/FinanceFineScheduled.java

+ 85 - 0
biz-base/src/main/java/com/dayou/controller/FinanceFineController.java

@@ -0,0 +1,85 @@
+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;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.web.bind.annotation.RestController;
+import com.dayou.controller.BaseController;
+import com.dayou.service.IFinanceFineService;
+import com.dayou.entity.FinanceFine;
+import com.dayou.common.RestResponse;
+import org.springframework.web.bind.annotation.*;
+import com.dayou.utils.ConvertUtil;
+import com.dayou.utils.HttpKit;
+import com.dayou.exception.ErrorCode;
+import java.util.Date;
+import java.util.List;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springframework.http.MediaType;
+import org.springframework.web.multipart.MultipartFile;
+/**
+ * 超期未收款罚款表
+ *
+ * @author GouGengquan
+ * @since 2025-04-07
+ */
+@RestController
+@RequestMapping("financeFine")
+@Slf4j
+public class FinanceFineController extends BaseController {
+    @Autowired
+    private IFinanceFineService financeFineService;
+
+    /**
+    * 超期未收款罚款表列表
+    */
+    @GetMapping("/page")
+    public RestResponse<Page<FinanceFineVO>> page(Page page, FinanceFineSelectDTO financeFineSelectDTO){
+        Page<FinanceFineVO> pages=financeFineService.selectPage(page,financeFineSelectDTO);
+        return RestResponse.data(pages);
+    }
+
+    /**
+     * 超期未收款罚款表详情
+     */
+    @GetMapping("/{id}")
+    public RestResponse<FinanceFine> detail(@PathVariable Long id){
+        FinanceFine xFinanceFine =financeFineService.detail(id);
+        return RestResponse.data(xFinanceFine);
+     }
+
+    /**
+     * 超期未收款罚款表新增
+     */
+    @PostMapping("")
+    public RestResponse<Boolean> save(@RequestBody FinanceFine financeFine) {
+        Boolean ret = financeFineService.add(financeFine);
+        return RestResponse.data(ret);
+    }
+
+    /**
+     * 超期未收款罚款表更新
+     */
+    @PutMapping("")
+    public RestResponse<Boolean> update(@RequestBody FinanceFine financeFine) {
+        Boolean ret = financeFineService.update(financeFine);
+        return RestResponse.data(ret);
+    }
+
+    /**
+     * 超期未收款罚款表删除
+     */
+    @DeleteMapping("/{id}")
+    public RestResponse<Boolean> delete(@PathVariable Long id) {
+        Boolean ret = financeFineService.delete(id);
+        return RestResponse.data(ret);
+    }
+
+
+}
+

+ 83 - 0
biz-base/src/main/java/com/dayou/controller/FinanceFineRefundController.java

@@ -0,0 +1,83 @@
+package com.dayou.controller;
+
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.web.bind.annotation.RestController;
+import com.dayou.controller.BaseController;
+import com.dayou.service.IFinanceFineRefundService;
+import com.dayou.entity.FinanceFineRefund;
+import com.dayou.common.RestResponse;
+import org.springframework.web.bind.annotation.*;
+import com.dayou.utils.ConvertUtil;
+import com.dayou.utils.HttpKit;
+import com.dayou.exception.ErrorCode;
+import java.util.Date;
+import java.util.List;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springframework.http.MediaType;
+import org.springframework.web.multipart.MultipartFile;
+/**
+ * 罚款退款表
+ *
+ * @author GouGengquan
+ * @since 2025-04-07
+ */
+@RestController
+@RequestMapping("financeFineRefund")
+@Slf4j
+public class FinanceFineRefundController extends BaseController {
+    @Autowired
+    private IFinanceFineRefundService financeFineRefundService;
+
+    /**
+    * 罚款退款表列表
+    */
+    @GetMapping("")
+    public RestResponse<Page<FinanceFineRefund>> page(FinanceFineRefund financeFineRefund, Page page){
+        Page<FinanceFineRefund> pages=financeFineRefundService.selectPage(page,financeFineRefund);
+        return RestResponse.data(pages);
+    }
+
+    /**
+     * 罚款退款表详情
+     */
+    @GetMapping("/{id}")
+    public RestResponse<FinanceFineRefund> detail(@PathVariable Long id){
+        FinanceFineRefund xFinanceFineRefund =financeFineRefundService.detail(id);
+        return RestResponse.data(xFinanceFineRefund);
+     }
+
+    /**
+     * 罚款退款表新增
+     */
+    @PostMapping("")
+    public RestResponse<Boolean> save(@RequestBody FinanceFineRefund financeFineRefund) {
+        Boolean ret = financeFineRefundService.add(financeFineRefund);
+        return RestResponse.data(ret);
+    }
+
+    /**
+     * 罚款退款表更新
+     */
+    @PutMapping("")
+    public RestResponse<Boolean> update(@RequestBody FinanceFineRefund financeFineRefund) {
+        Boolean ret = financeFineRefundService.update(financeFineRefund);
+        return RestResponse.data(ret);
+    }
+
+    /**
+     * 罚款退款表删除
+     */
+    @DeleteMapping("/{id}")
+    public RestResponse<Boolean> delete(@PathVariable Long id) {
+        Boolean ret = financeFineRefundService.delete(id);
+        return RestResponse.data(ret);
+    }
+
+
+}
+

+ 96 - 0
biz-base/src/main/java/com/dayou/controller/ProductionReturnController.java

@@ -0,0 +1,96 @@
+package com.dayou.controller;
+
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.web.bind.annotation.RestController;
+import com.dayou.controller.BaseController;
+import com.dayou.service.IProductionReturnService;
+import com.dayou.entity.ProductionReturn;
+import com.dayou.common.RestResponse;
+import org.springframework.web.bind.annotation.*;
+import com.dayou.common.PullDownModel;
+import com.dayou.utils.ConvertUtil;
+import com.dayou.utils.HttpKit;
+import com.dayou.exception.ErrorCode;
+import java.util.Date;
+import java.util.List;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springframework.http.MediaType;
+import org.springframework.web.multipart.MultipartFile;
+/**
+ * 产品退回申请表
+ *
+ * @author GouGengquan
+ * @since 2025-04-07
+ */
+@RestController
+@RequestMapping("productionReturn")
+@Slf4j
+public class ProductionReturnController extends BaseController {
+    @Autowired
+    private IProductionReturnService productionReturnService;
+
+    /**
+    * 产品退回申请表列表
+    */
+    @GetMapping("")
+    public RestResponse<Page<ProductionReturn>> page(ProductionReturn productionReturn, Page page){
+        Page<ProductionReturn> pages=productionReturnService.selectPage(page,productionReturn);
+        return RestResponse.data(pages);
+    }
+
+    /**
+     * 产品退回申请表详情
+     */
+    @GetMapping("/{id}")
+    public RestResponse<ProductionReturn> detail(@PathVariable Long id){
+        ProductionReturn xProductionReturn =productionReturnService.detail(id);
+        return RestResponse.data(xProductionReturn);
+     }
+
+    /**
+     * 产品退回申请表新增
+     */
+    @PostMapping("")
+    public RestResponse<Boolean> save(@RequestBody ProductionReturn productionReturn) {
+        Boolean ret = productionReturnService.add(productionReturn);
+        return RestResponse.data(ret);
+    }
+
+    /**
+     * 产品退回申请表更新
+     */
+    @PutMapping("")
+    public RestResponse<Boolean> update(@RequestBody ProductionReturn productionReturn) {
+        Boolean ret = productionReturnService.update(productionReturn);
+        return RestResponse.data(ret);
+    }
+
+    /**
+     * 产品退回申请表删除
+     */
+    @DeleteMapping("/{id}")
+    public RestResponse<Boolean> delete(@PathVariable Long id) {
+        Boolean ret = productionReturnService.delete(id);
+        return RestResponse.data(ret);
+    }
+
+
+    /**
+     * 产品退回申请表下拉列表
+     */
+    @GetMapping("/simpleAll")
+    public RestResponse<List<PullDownModel>> simpleAll(){
+        LambdaQueryWrapper<ProductionReturn> lambdaQueryWrapper = new LambdaQueryWrapper<ProductionReturn>()
+        .select(ProductionReturn::getId,ProductionReturn::getName)
+        .eq(ProductionReturn::getDeleted,false);
+        List<ProductionReturn> list= productionReturnService.list(lambdaQueryWrapper);
+        List<PullDownModel> ret=ConvertUtil.copyList(list, PullDownModel.class);
+        return RestResponse.data(ret);
+    }
+}
+

+ 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();
+    }
+
+}

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

@@ -0,0 +1,60 @@
+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;
+import java.util.List;
+
+/**
+ * <p>
+ * 超期未收款罚款表 Mapper 接口
+ * </p>
+ *
+ * @author GouGengquan
+ * @since 2025-04-07
+ */
+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>
+     */
+    List<CompileFineAssetsOrder> getAssetsOrder();
+
+    /**
+     * 获取逾期个贷产品款项信息(只查询结果报告)
+     * @return List<Long>
+     */
+    List<Long> getPersonalOrder();
+
+    /**
+     * 获取逾期大中型产品款项信息
+     * @return List<CompileFineAssetsOrder>
+     */
+    List<CompileFineMajorOrder> getMajorOrder();
+
+    /**
+     * 根据收款信息获取符合条件的实际开票金额的5%
+     * @param orderFundId 订单收款id
+     * @param productionFundId 产品收款id
+     * @return BigDecimal 返回开票金额
+     */
+    BigDecimal getInvoiceByFundInfo(@Param("orderFundId") Long orderFundId, @Param("productionFundId") Long productionFundId);
+
+}

+ 16 - 0
dao/src/main/java/com/dayou/mapper/FinanceFineRefundMapper.java

@@ -0,0 +1,16 @@
+package com.dayou.mapper;
+
+import com.dayou.entity.FinanceFineRefund;
+import com.dayou.dao.CustomBaseMapper;
+
+/**
+ * <p>
+ * 罚款退款表 Mapper 接口
+ * </p>
+ *
+ * @author GouGengquan
+ * @since 2025-04-07
+ */
+public interface FinanceFineRefundMapper extends CustomBaseMapper<FinanceFineRefund> {
+
+}

+ 16 - 0
dao/src/main/java/com/dayou/mapper/ProductionReturnMapper.java

@@ -0,0 +1,16 @@
+package com.dayou.mapper;
+
+import com.dayou.entity.ProductionReturn;
+import com.dayou.dao.CustomBaseMapper;
+
+/**
+ * <p>
+ * 产品退回申请表 Mapper 接口
+ * </p>
+ *
+ * @author GouGengquan
+ * @since 2025-04-07
+ */
+public interface ProductionReturnMapper extends CustomBaseMapper<ProductionReturn> {
+
+}

+ 219 - 0
dao/src/main/resources/mapper/FinanceFineMapper.xml

@@ -0,0 +1,219 @@
+<?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.dayou.mapper.FinanceFineMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.dayou.entity.FinanceFine">
+        <result column="id" property="id" />
+        <result column="deleted" property="deleted" />
+        <result column="created" property="created" />
+        <result column="modified" property="modified" />
+        <result column="order_fund_id" property="orderFundId" />
+        <result column="production_fund_id" property="productionFundId" />
+        <result column="fine_amount" property="fineAmount" />
+        <result column="real_fine_amount" property="realFineAmount" />
+        <result column="explain" property="explain" />
+        <result column="remark" property="remark" />
+        <result column="status" property="status" />
+        <result column="leader_id" property="leaderId" />
+        <result column="confirm_date" property="confirmDate" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id,
+        deleted,
+        created,
+        modified,
+        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 AS orderFundId,
+            pf.id AS productionFundId,
+            pf.production_should_amount,
+            pf.standard_amount
+        FROM
+            (
+                SELECT
+                    id,
+                    business_id,
+                    production_no,
+                    production_type,
+                    evaluate_amount,
+                    repertory_out_time
+                FROM
+                    assets_production AS ap
+                WHERE
+                    deleted = 0
+                  AND repertory_out_time IS NOT NULL
+                  AND production_type != 'STATEMENT'
+            ) AS ap
+                LEFT JOIN ( SELECT id, business_id, production_no, production_should_amount, real_amount, standard_amount FROM production_fund WHERE business_type = 'ASSET_BUSINESS' AND deleted = 0 ) AS pf ON ( ap.business_id = pf.business_id AND ap.production_no = pf.production_no )
+                LEFT JOIN ( SELECT id, business_id, should_amount FROM order_fund WHERE business_type = 'ASSET_BUSINESS' AND deleted = 0 ) AS `of` ON `of`.business_id = ap.business_id
+                LEFT JOIN assets AS a ON a.id = ap.business_id
+                LEFT JOIN finance_fine AS ff ON ff.deleted = 0 AND `of`.id = ff.order_fund_id AND pf.id = ff.production_fund_id
+        WHERE ( pf.production_no IS NULL OR pf.real_amount IS NULL )
+          AND ap.repertory_out_time > '2024-01-01 00:00:00'
+          AND DATEDIFF(CURDATE(), DATE( ap.repertory_out_time )) >= 90
+          AND ff.id IS NULL
+    </select>
+
+    <!--获取逾期个贷产品款项信息-->
+    <select id="getPersonalOrder" resultType="java.lang.Long">
+        SELECT
+            ofu.id
+        FROM
+                ( SELECT id, order_id FROM personal WHERE deleted = 0 ) AS p
+                    INNER JOIN personal_target pt ON pt.personal_id = p.id
+                    INNER JOIN ( SELECT id, business_id FROM order_fund WHERE business_type = 'PERSONAL_BUSINESS' AND deleted = 0 AND real_amount IS NULL ) AS ofu ON ofu.business_id = p.id
+                    INNER JOIN ( SELECT target_id,( repertory_out_time ) AS rot,production FROM personal_production WHERE repertory_out_time IS NOT NULL GROUP BY target_id ) AS pp ON pp.target_id = pt.id
+                    LEFT JOIN finance_fine AS ff ON ff.deleted = 0 AND ofu.id = ff.order_fund_id
+        WHERE pp.rot > '2024-01-01 00:00:00'
+          AND DATEDIFF(CURDATE(), DATE( pp.rot )) >= 90
+          AND ff.id IS NULL
+    </select>
+
+    <!--获取逾期大中型产品款项信息-->
+    <select id="getMajorOrder" resultType="com.dayou.vo.CompileFineMajorOrder">
+        SELECT
+            pf.id AS productionFundId,
+            pf.order_fund_id AS orderFundId,
+            pf.production_should_amount AS shouldAmount,
+            pf.standard_amount
+        FROM
+            (
+                SELECT
+                    id,
+                    business_id,
+                    production_no,
+                    production_type,
+                    production_should_amount,
+                    standard_amount,
+                    order_fund_id
+                FROM
+                    production_fund
+                WHERE
+                    business_type = 'MAJOR_BUSINESS'
+                  AND deleted = 0
+                  AND production_should_amount IS NOT NULL
+                  AND production_should_amount != 0
+                  AND real_amount IS NULL
+            ) AS pf
+                INNER JOIN (
+                SELECT
+                    id,
+                    major_id,
+                    report_no,
+                    production AS productionType,
+                    repertory_out_time
+                FROM
+                    major_production mp
+                WHERE
+                    deleted = 0
+                  AND repertory_out_time IS NOT NULL
+            ) AS mp ON ( mp.major_id = pf.business_id AND mp.report_no = pf.production_no AND mp.productionType = pf.production_type )
+                LEFT JOIN major AS m ON m.id = mp.major_id
+                LEFT JOIN finance_fine AS ff ON ff.deleted = 0 AND pf.order_fund_id = ff.order_fund_id AND pf.id = ff.production_fund_id
+        WHERE mp.repertory_out_time > '2024-01-01 00:00:00'
+          AND DATEDIFF(CURDATE(), DATE( mp.repertory_out_time )) >= 90
+          AND ff.id IS NULL
+    </select>
+
+    <!--根据收款信息获取符合条件的实际开票金额-->
+    <select id="getInvoiceByFundInfo" resultType="java.math.BigDecimal">
+        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}
+        </if>
+    </select>
+
+</mapper>

+ 28 - 0
dao/src/main/resources/mapper/FinanceFineRefundMapper.xml

@@ -0,0 +1,28 @@
+<?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.dayou.mapper.FinanceFineRefundMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.dayou.entity.FinanceFineRefund">
+        <result column="id" property="id" />
+        <result column="deleted" property="deleted" />
+        <result column="modified" property="modified" />
+        <result column="created" property="created" />
+        <result column="fine_id" property="fineId" />
+        <result column="refund_amount" property="refundAmount" />
+        <result column="refund_reason" property="refundReason" />
+        <result column="statue" property="statue" />
+        <result column="user_id" property="userId" />
+        <result column="refund_date" property="refundDate" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id,
+        deleted,
+        modified,
+        created,
+        fine_id, refund_amount, refund_reason, statue, user_id, refund_date
+    </sql>
+
+</mapper>

+ 35 - 0
dao/src/main/resources/mapper/ProductionReturnMapper.xml

@@ -0,0 +1,35 @@
+<?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.dayou.mapper.ProductionReturnMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.dayou.entity.ProductionReturn">
+        <result column="id" property="id" />
+        <result column="deleted" property="deleted" />
+        <result column="modified" property="modified" />
+        <result column="created" property="created" />
+        <result column="business_type" property="businessType" />
+        <result column="business_id" property="businessId" />
+        <result column="production_id" property="productionId" />
+        <result column="clinet_manager_id" property="clinetManagerId" />
+        <result column="name" property="name" />
+        <result column="order_id" property="orderId" />
+        <result column="production_no" property="productionNo" />
+        <result column="production_type" property="productionType" />
+        <result column="client_name" property="clientName" />
+        <result column="client_sub_name" property="clientSubName" />
+        <result column="bailor" property="bailor" />
+        <result column="return_reason" property="returnReason" />
+        <result column="status" property="status" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id,
+        deleted,
+        modified,
+        created,
+        business_type, business_id, production_id, clinet_manager_id, name, order_id, production_no, production_type, client_name, client_sub_name, bailor, return_reason, status
+    </sql>
+
+</mapper>

+ 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;
+
+}

+ 83 - 0
domain/src/main/java/com/dayou/entity/FinanceFine.java

@@ -0,0 +1,83 @@
+package com.dayou.entity;
+import java.math.BigDecimal;
+import com.dayou.common.BaseEntity;
+import java.time.LocalDateTime;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.dayou.annotation.ExcelSheet;
+import com.dayou.annotation.ExportCell;
+import com.dayou.annotation.ImportCell;
+/**
+ * <p>
+ * 超期未收款罚款表
+ * </p>
+ *
+ * @author GouGengquan
+ * @since 2025-04-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ExcelSheet(sheetName = "超期未收款罚款表")
+public class FinanceFine extends BaseEntity {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 订单收款id
+     */
+    private Long orderFundId;
+
+    /**
+     * 产品收款id
+     */
+    private Long productionFundId;
+
+    /**
+     * 处罚金额
+     */
+    @ImportCell
+    @ExportCell(columnName = "处罚金额")
+    private BigDecimal fineAmount;
+
+    /**
+     * 实际处罚金额
+     */
+    @ImportCell
+    @ExportCell(columnName = "实际处罚金额")
+    private BigDecimal realFineAmount;
+
+    /**
+     * 情况说明
+     */
+    @ImportCell
+    @ExportCell(columnName = "情况说明")
+    private String explain;
+
+    /**
+     * 领导备注
+     */
+    @ImportCell
+    @ExportCell(columnName = "领导备注")
+    private String remark;
+
+    /**
+     * 领导确认
+     */
+    @ImportCell
+    @ExportCell(columnName = "领导确认")
+    private Boolean status;
+
+    /**
+     * 领导id
+     */
+    private Long leaderId;
+
+    /**
+     * 确认期日
+     */
+    @ImportCell
+    @ExportCell(columnName = "确认期日")
+    private LocalDateTime confirmDate;
+
+
+}

+ 64 - 0
domain/src/main/java/com/dayou/entity/FinanceFineRefund.java

@@ -0,0 +1,64 @@
+package com.dayou.entity;
+import java.math.BigDecimal;
+import com.dayou.common.BaseEntity;
+import java.time.LocalDateTime;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.dayou.annotation.ExcelSheet;
+import com.dayou.annotation.ExportCell;
+import com.dayou.annotation.ImportCell;
+/**
+ * <p>
+ * 罚款退款表
+ * </p>
+ *
+ * @author GouGengquan
+ * @since 2025-04-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ExcelSheet(sheetName = "罚款退款表")
+public class FinanceFineRefund extends BaseEntity {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 罚款表id
+     */
+    private Long fineId;
+
+    /**
+     * 退款金额(罚款表实际罚款金额)
+     */
+    @ImportCell
+    @ExportCell(columnName = "退款金额(罚款表实际罚款金额)")
+    private BigDecimal refundAmount;
+
+    /**
+     * 退款原因
+     */
+    @ImportCell
+    @ExportCell(columnName = "退款原因")
+    private String refundReason;
+
+    /**
+     * RETURNED:已退 NOT_RETURNED:未退 IGNORE:不退
+     */
+    @ImportCell
+    @ExportCell(columnName = "RETURNED:已退 NOT_RETURNED:未退 IGNORE:不退")
+    private String statue;
+
+    /**
+     * 操作人id
+     */
+    private Long userId;
+
+    /**
+     * 退款操作日期
+     */
+    @ImportCell
+    @ExportCell(columnName = "退款操作日期")
+    private LocalDateTime refundDate;
+
+
+}

+ 109 - 0
domain/src/main/java/com/dayou/entity/ProductionReturn.java

@@ -0,0 +1,109 @@
+package com.dayou.entity;
+import com.dayou.common.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.dayou.annotation.ExcelSheet;
+import com.dayou.annotation.ExportCell;
+import com.dayou.annotation.ImportCell;
+/**
+ * <p>
+ * 产品退回申请表
+ * </p>
+ *
+ * @author GouGengquan
+ * @since 2025-04-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ExcelSheet(sheetName = "产品退回申请表")
+public class ProductionReturn extends BaseEntity {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 业务类型
+     */
+    @ImportCell
+    @ExportCell(columnName = "业务类型")
+    private String businessType;
+
+    /**
+     * 业务id
+     */
+    private Long businessId;
+
+    /**
+     * 产品id
+     */
+    private Long productionId;
+
+    /**
+     * 客户经理id
+     */
+    private Long clinetManagerId;
+
+    /**
+     * 项目名称
+     */
+    @ImportCell
+    @ExportCell(columnName = "项目名称")
+    private String name;
+
+    /**
+     * 项目编号
+     */
+    @ImportCell
+    @ExportCell(columnName = "项目编号")
+    private String orderId;
+
+    /**
+     * 产品编号
+     */
+    @ImportCell
+    @ExportCell(columnName = "产品编号")
+    private String productionNo;
+
+    /**
+     * 产品类型
+     */
+    @ImportCell
+    @ExportCell(columnName = "产品类型")
+    private String productionType;
+
+    /**
+     * 客户名称
+     */
+    @ImportCell
+    @ExportCell(columnName = "客户名称")
+    private String clientName;
+
+    /**
+     * 业务来源
+     */
+    @ImportCell
+    @ExportCell(columnName = "业务来源")
+    private String clientSubName;
+
+    /**
+     * 委托人
+     */
+    @ImportCell
+    @ExportCell(columnName = "委托人")
+    private String bailor;
+
+    /**
+     * 退产品原因
+     */
+    @ImportCell
+    @ExportCell(columnName = "退产品原因")
+    private String returnReason;
+
+    /**
+     * 审核中、审核通过、审核拒绝 (用代码中的枚举code)
+     */
+    @ImportCell
+    @ExportCell(columnName = "审核中、审核通过、审核拒绝 (用代码中的枚举code)")
+    private String status;
+
+
+}

+ 33 - 0
domain/src/main/java/com/dayou/vo/CompileFineAssetsOrder.java

@@ -0,0 +1,33 @@
+package com.dayou.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 逾期资产产品款项信息
+ */
+@Data
+public class CompileFineAssetsOrder {
+
+    /**
+     * 订单收款信息id
+     */
+    private Long orderFundId;
+
+    /**
+     * 产品收款信息id
+     */
+    private Long productionFundId;
+
+    /**
+     * 产品应收款
+     */
+    private BigDecimal productionShouldAmount;
+
+    /**
+     * 产品标准收费
+     */
+    private BigDecimal standardAmount;
+
+}

+ 30 - 0
domain/src/main/java/com/dayou/vo/CompileFineMajorOrder.java

@@ -0,0 +1,30 @@
+package com.dayou.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class CompileFineMajorOrder {
+
+    /**
+     * 订单收款信息id
+     */
+    private Long orderFundId;
+
+    /**
+     * 产品收款信息id
+     */
+    private Long productionFundId;
+
+    /**
+     * 产品应收款
+     */
+    private BigDecimal productionShouldAmount;
+
+    /**
+     * 产品标准收费
+     */
+    private BigDecimal standardAmount;
+
+}

+ 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;
+
+}

+ 28 - 0
service/src/main/java/com/dayou/service/IFinanceFineRefundService.java

@@ -0,0 +1,28 @@
+package com.dayou.service;
+import com.dayou.entity.FinanceFineRefund;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+/**
+ * <p>
+ * 罚款退款表 服务类
+ * </p>
+ *
+ * @author GouGengquan
+ * @since 2025-04-07
+ */
+public interface IFinanceFineRefundService extends IService<FinanceFineRefund> {
+
+        Page<FinanceFineRefund> selectPage(Page page,FinanceFineRefund financeFineRefund);
+
+        FinanceFineRefund detail(Long id);
+
+        Boolean add(FinanceFineRefund financeFineRefund);
+
+        Boolean update(FinanceFineRefund financeFineRefund);
+
+        Boolean delete(Long id);
+
+}

+ 37 - 0
service/src/main/java/com/dayou/service/IFinanceFineService.java

@@ -0,0 +1,37 @@
+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;
+
+/**
+ * <p>
+ * 超期未收款罚款表 服务类
+ * </p>
+ *
+ * @author GouGengquan
+ * @since 2025-04-07
+ */
+public interface IFinanceFineService extends IService<FinanceFine> {
+
+    Page<FinanceFineVO> selectPage(Page page, FinanceFineSelectDTO financeFineSelectDTO);
+
+    FinanceFine detail(Long id);
+
+    Boolean add(FinanceFine financeFine);
+
+    Boolean update(FinanceFine financeFine);
+
+    Boolean delete(Long id);
+
+    /**
+     * 统计财务收款预警中超过90天的订单或产品新增到罚款表
+     */
+    void compileFineOrder();
+
+}

+ 28 - 0
service/src/main/java/com/dayou/service/IProductionReturnService.java

@@ -0,0 +1,28 @@
+package com.dayou.service;
+import com.dayou.entity.ProductionReturn;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+/**
+ * <p>
+ * 产品退回申请表 服务类
+ * </p>
+ *
+ * @author GouGengquan
+ * @since 2025-04-07
+ */
+public interface IProductionReturnService extends IService<ProductionReturn> {
+
+        Page<ProductionReturn> selectPage(Page page,ProductionReturn productionReturn);
+
+        ProductionReturn detail(Long id);
+
+        Boolean add(ProductionReturn productionReturn);
+
+        Boolean update(ProductionReturn productionReturn);
+
+        Boolean delete(Long id);
+
+}

+ 66 - 0
service/src/main/java/com/dayou/service/impl/FinanceFineRefundServiceImpl.java

@@ -0,0 +1,66 @@
+package com.dayou.service.impl;
+
+import com.dayou.entity.FinanceFineRefund;
+import com.dayou.mapper.FinanceFineRefundMapper;
+import com.dayou.service.IFinanceFineRefundService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.dayou.utils.ExcelUtil;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+import java.util.List;
+import java.util.ArrayList;
+import org.springframework.transaction.annotation.Transactional;
+import com.dayou.enums.BatchTaskTypeEnum;
+
+/**
+ * <p>
+ * 罚款退款表 服务实现类
+ * </p>
+ *
+ * @author GouGengquan
+ * @since 2025-04-07
+ */
+@Service
+public class FinanceFineRefundServiceImpl extends ServiceImpl<FinanceFineRefundMapper, FinanceFineRefund> implements IFinanceFineRefundService {
+
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public Page<FinanceFineRefund> selectPage(Page page,FinanceFineRefund financeFineRefund){
+        return this.page(page, new QueryWrapper<FinanceFineRefund>(financeFineRefund));
+    }
+
+
+    @Override
+    public FinanceFineRefund detail(Long id){
+        return this.getById(id);
+    }
+
+    @Override
+    public Boolean add(FinanceFineRefund financeFineRefund){
+        return  this.save(financeFineRefund);
+    }
+
+    @Override
+    public Boolean update(FinanceFineRefund financeFineRefund){
+        return  this.updateById(financeFineRefund);
+    }
+
+    @Override
+    public Boolean delete(Long id){
+        //逻辑删除
+        return this.removeById(id);
+    }
+}

+ 163 - 0
service/src/main/java/com/dayou/service/impl/FinanceFineServiceImpl.java

@@ -0,0 +1,163 @@
+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;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * <p>
+ * 超期未收款罚款表 服务实现类
+ * </p>
+ *
+ * @author GouGengquan
+ * @since 2025-04-07
+ */
+@Service
+public class FinanceFineServiceImpl extends ServiceImpl<FinanceFineMapper, FinanceFine> implements IFinanceFineService {
+
+    @Autowired
+    private FinanceFineMapper financeFineMapper;
+
+    @Override
+    public Page<FinanceFineVO> selectPage(Page page, FinanceFineSelectDTO financeFineSelectDTO) {
+        return financeFineMapper.selectPage(page, financeFineSelectDTO);
+    }
+
+
+    @Override
+    public FinanceFine detail(Long id) {
+        return this.getById(id);
+    }
+
+    @Override
+    public Boolean add(FinanceFine financeFine) {
+        return this.save(financeFine);
+    }
+
+    @Override
+    public Boolean update(FinanceFine financeFine) {
+        return this.updateById(financeFine);
+    }
+
+    @Override
+    public Boolean delete(Long id) {
+        //逻辑删除
+        return this.removeById(id);
+    }
+
+    /**
+     * 统计财务收款预警中超过90天的订单或产品新增到罚款表
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void compileFineOrder() {
+        List<CompileFineAssetsOrder> compileFineAssetsOrderList = financeFineMapper.getAssetsOrder();
+        List<Long> compileFinePersonalOrderList = financeFineMapper.getPersonalOrder();
+        List<CompileFineMajorOrder> compileFineMajorOrderList = financeFineMapper.getMajorOrder();
+
+        List<FinanceFine> financeFineList = new ArrayList<>();
+
+        // 处理资产的信息以插入到罚款表
+        for (CompileFineAssetsOrder assetsOrder : compileFineAssetsOrderList) {
+            // 获取开票金额的5%作为罚款金额
+            BigDecimal fineAmount = financeFineMapper.getInvoiceByFundInfo(assetsOrder.getOrderFundId(), assetsOrder.getProductionFundId());
+            // 判断罚款金额是否为null(为null说明没开票,通过其他信息设置罚款金额)
+            if (ObjectUtil.isNull(fineAmount)) {
+                // 判断应收款是否不为null且不等于1(乱填)
+                if (ObjectUtil.isNotNull(assetsOrder.getProductionShouldAmount()) && !Objects.equals(assetsOrder.getProductionShouldAmount(), BigDecimal.valueOf(1))) {
+                    // 填了应收款,按应收款的5%
+                    fineAmount = assetsOrder.getProductionShouldAmount().multiply(BigDecimal.valueOf(0.05));
+                } else {
+                    // 没有应收款的话,罚款金额就是 standard_amount * 30% * 5%
+                    if (ObjectUtil.isNotNull(assetsOrder.getStandardAmount())) {
+                        fineAmount = assetsOrder.getStandardAmount().multiply(BigDecimal.valueOf(0.3)).multiply(BigDecimal.valueOf(0.05));
+                    }else {
+                        fineAmount = BigDecimal.valueOf(0);
+                    }
+                }
+            }
+
+            // 最低罚款:200元,不⾜200元,按200元罚款 最⾼罚款⾦额:5000元,超出5000元,按5000元罚款
+            // 判断罚款金额是否大于 200 小于5000
+            // 返回值大于0:第一个BigDecimal大于第二个
+            if (fineAmount.compareTo(BigDecimal.valueOf(200)) < 0) { // 金额小于200
+                fineAmount = BigDecimal.valueOf(200);
+            } else if (fineAmount.compareTo(BigDecimal.valueOf(5000)) > 0) { // 金额大于5000
+                fineAmount = BigDecimal.valueOf(5000);
+            }
+
+            // 设置罚款信息
+            FinanceFine financeFine = new FinanceFine();
+            financeFine.setOrderFundId(assetsOrder.getOrderFundId());
+            financeFine.setProductionFundId(assetsOrder.getProductionFundId());
+            financeFine.setFineAmount(fineAmount);
+            financeFineList.add(financeFine);
+        }
+
+        // 处理个贷的信息以插入到罚款表
+        for (Long orderFundId : compileFinePersonalOrderList) {
+            // 设置罚款信息
+            FinanceFine financeFine = new FinanceFine();
+            financeFine.setOrderFundId(orderFundId);
+            financeFine.setFineAmount(BigDecimal.valueOf(50));
+            financeFineList.add(financeFine);
+        }
+
+        // 处理大中型的信息以插入到罚款表
+        for (CompileFineMajorOrder majorOrder : compileFineMajorOrderList) {
+            // 获取开票金额的5%作为罚款金额
+            BigDecimal fineAmount = financeFineMapper.getInvoiceByFundInfo(majorOrder.getOrderFundId(), majorOrder.getProductionFundId());
+            // 判断罚款金额是否为null(为null说明没开票,通过其他信息设置罚款金额)
+            if (ObjectUtil.isNull(fineAmount)) {
+                // 判断应收款是否不为null且不等于1(乱填)
+                if (ObjectUtil.isNotNull(majorOrder.getProductionShouldAmount()) && !Objects.equals(majorOrder.getProductionShouldAmount(), BigDecimal.valueOf(1))) {
+                    // 填了应收款,按应收款的5%
+                    fineAmount = majorOrder.getProductionShouldAmount().multiply(BigDecimal.valueOf(0.05));
+                } else {
+                    // 没有应收款的话,罚款金额就是 standard_amount * 30% * 5%
+                    if (ObjectUtil.isNotNull(majorOrder.getStandardAmount())) {
+                        fineAmount = majorOrder.getStandardAmount().multiply(BigDecimal.valueOf(0.3)).multiply(BigDecimal.valueOf(0.05));
+                    }else {
+                        fineAmount = BigDecimal.valueOf(0);
+                    }
+                }
+            }
+
+            // 最低罚款:200元,不⾜200元,按200元罚款 最⾼罚款⾦额:5000元,超出5000元,按5000元罚款
+            // 判断罚款金额是否大于 200 小于5000
+            // 返回值大于0:第一个BigDecimal大于第二个
+            if (fineAmount.compareTo(BigDecimal.valueOf(200)) < 0) { // 金额小于200
+                fineAmount = BigDecimal.valueOf(200);
+            } else if (fineAmount.compareTo(BigDecimal.valueOf(5000)) > 0) { // 金额大于5000
+                fineAmount = BigDecimal.valueOf(5000);
+            }
+
+            // 设置罚款信息
+            FinanceFine financeFine = new FinanceFine();
+            financeFine.setOrderFundId(majorOrder.getOrderFundId());
+            financeFine.setProductionFundId(majorOrder.getProductionFundId());
+            financeFine.setFineAmount(fineAmount);
+            financeFineList.add(financeFine);
+        }
+
+        this.saveBatch(financeFineList);
+    }
+
+}

+ 66 - 0
service/src/main/java/com/dayou/service/impl/ProductionReturnServiceImpl.java

@@ -0,0 +1,66 @@
+package com.dayou.service.impl;
+
+import com.dayou.entity.ProductionReturn;
+import com.dayou.mapper.ProductionReturnMapper;
+import com.dayou.service.IProductionReturnService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.dayou.utils.ExcelUtil;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+import java.util.List;
+import java.util.ArrayList;
+import org.springframework.transaction.annotation.Transactional;
+import com.dayou.enums.BatchTaskTypeEnum;
+
+/**
+ * <p>
+ * 产品退回申请表 服务实现类
+ * </p>
+ *
+ * @author GouGengquan
+ * @since 2025-04-07
+ */
+@Service
+public class ProductionReturnServiceImpl extends ServiceImpl<ProductionReturnMapper, ProductionReturn> implements IProductionReturnService {
+
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public Page<ProductionReturn> selectPage(Page page,ProductionReturn productionReturn){
+        return this.page(page, new QueryWrapper<ProductionReturn>(productionReturn));
+    }
+
+
+    @Override
+    public ProductionReturn detail(Long id){
+        return this.getById(id);
+    }
+
+    @Override
+    public Boolean add(ProductionReturn productionReturn){
+        return  this.save(productionReturn);
+    }
+
+    @Override
+    public Boolean update(ProductionReturn productionReturn){
+        return  this.updateById(productionReturn);
+    }
+
+    @Override
+    public Boolean delete(Long id){
+        //逻辑删除
+        return this.removeById(id);
+    }
+}

+ 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("搜集逾期订单/产品信息并添加到罚款表完成");
+    }
+
+}