From db5240c1ad2a2926297c9febb6383384abea1082 Mon Sep 17 00:00:00 2001
From: czt <czt18638530771@163.com>
Date: 星期三, 28 一月 2026 19:08:32 +0800
Subject: [PATCH] 质押合同还款金额提醒功能

---
 fzzy-igdss-core/src/main/java/com/fzzy/igds/timer/JobWarnService.java          |  134 +++++++++++++++++++
 fzzy-igdss-core/src/main/java/com/fzzy/work/data/WorkBizType.java              |    1 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/service/PledgeContractService.java |   17 ++
 fzzy-igdss-core/src/main/java/com/fzzy/igds/timer/SystemScheduled.java         |    2 
 fzzy-igdss-view/src/main/java/com/fzzy/igds/PledgeContractPR.java              |   12 +
 fzzy-igdss-view/src/main/java/com/fzzy/igds/PledgeContract-Detail.view.xml     |  142 ++++++++++++++++++++
 fzzy-igdss-core/src/main/java/com/fzzy/work/service/BizWorkService.java        |   47 ++++++
 fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FoodPriceService.java      |   20 ++
 8 files changed, 372 insertions(+), 3 deletions(-)

diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FoodPriceService.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FoodPriceService.java
index d4e02e3..3497ad2 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FoodPriceService.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FoodPriceService.java
@@ -44,6 +44,26 @@
     }
 
     /**
+     * 鏍规嵁閾惰鍙婂搧绉嶏紝鏌ヨ鍗曚环淇℃伅
+     * @param bankId
+     * @param foodVariety
+     * @return
+     */
+    public FoodPrice getDataByBankAndFood(String bankId, String foodVariety) {
+        SysUser user = ContextUtil.getLoginUser();
+
+        QueryWrapper<FoodPrice> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("bank_id", bankId);
+        queryWrapper.eq("food_variety", foodVariety);
+
+        List<FoodPrice> foodPrices = foodPriceMapper.selectList(queryWrapper);
+        if(null == foodPrices){
+            return null;
+        }
+        return foodPrices.get(0);
+    }
+
+    /**
      * 鏇存柊鎴栦繚瀛樹俊鎭�
      * @param data
      * @return
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/PledgeContractService.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/PledgeContractService.java
index b69c986..5ee2e2d 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/PledgeContractService.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/PledgeContractService.java
@@ -4,6 +4,7 @@
 import com.fzzy.igds.constant.Constant;
 import com.fzzy.igds.data.BaseResp;
 import com.fzzy.igds.data.IgdsBaseParam;
+import com.fzzy.igds.domain.InoutNoticeIn;
 import com.fzzy.igds.domain.PledgeContract;
 import com.fzzy.igds.mapper.PledgeContractMapper;
 import com.fzzy.igds.utils.ContextUtil;
@@ -50,6 +51,18 @@
         queryWrapper.orderByDesc("update_time");
 
         return pledgeContractMapper.selectList(queryWrapper);
+    }
+
+    /**
+     * 鏍规嵁鏉′欢鏌ヨ
+     * @param id
+     * @return
+     */
+    public PledgeContract getOne(String id) {
+
+        QueryWrapper<PledgeContract> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("id", id);
+        return pledgeContractMapper.selectOne(queryWrapper);
     }
 
 
@@ -104,8 +117,8 @@
         queryWrapper.like("status", Constant.YN_N);
 
         //璐ㄦ娂鏈熼棿
-        queryWrapper.ge("pledge_start", curTime);
-        queryWrapper.le("pledge_end", curTime);
+        queryWrapper.le("pledge_start", curTime);
+        queryWrapper.ge("pledge_end", curTime);
 
         queryWrapper.orderByDesc("update_time");
 
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/timer/JobWarnService.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/timer/JobWarnService.java
new file mode 100644
index 0000000..4b94471
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/timer/JobWarnService.java
@@ -0,0 +1,134 @@
+package com.fzzy.igds.timer;
+
+import com.fzzy.igds.constant.Constant;
+import com.fzzy.igds.data.BaseResp;
+import com.fzzy.igds.domain.Depot;
+import com.fzzy.igds.domain.FoodPrice;
+import com.fzzy.igds.domain.PledgeContract;
+import com.fzzy.igds.service.DepotService;
+import com.fzzy.igds.service.FoodPriceService;
+import com.fzzy.igds.service.PledgeContractService;
+import com.fzzy.work.data.WorkBizType;
+import com.fzzy.work.domain.WorkOrderConf;
+import com.fzzy.work.service.BizWorkService;
+import com.ruoyi.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description 璀﹀憡淇℃伅瀹氭椂缁熻锛氳繕娆炬彁閱�
+ * @Author CZT
+ * @Date 2026/1/23 9:14
+ */
+@Slf4j
+
+@Service
+public class JobWarnService {
+
+    @Resource
+    private PledgeContractService contractService;
+    @Resource
+    private DepotService depotService;
+    @Resource
+    private FoodPriceService foodPriceService;
+    @Resource
+    private BizWorkService workService;
+
+    /**
+     * 姣忓ぉ涓ょ偣鎵ц锛氳繕娆炬彁閱�
+     */
+//    @Scheduled(cron = "0 0 2 * * ?")
+    @Scheduled(cron = "0 7 19 * * ?")
+    public void timer() {
+        doExe();
+    }
+
+    /**
+     * 寮�濮嬭川鎶煎悎鍚屾牳绠�
+     */
+    public void doExe() {
+
+        List<PledgeContract> contractList = contractService.getContractByPledge(new Date());
+        if(null == contractList || contractList.isEmpty()){
+            log.error("-----褰撳墠娌℃湁鏈夋晥鏈熺殑璐ㄦ娂鍚堝悓锛屼笉鎵ц鎻愰啋鏍哥畻-----");
+            return;
+        }
+
+        Depot depot;
+        FoodPrice foodPrice;
+        WorkOrderConf conf;
+        double sumMoney = 0.0;
+        double per = 0.0;
+        double backMoney = 0.0;
+        for (PledgeContract pledgeContract : contractList) {
+            log.info("-----寮�濮嬪鐞嗚川鎶煎悎鍚岋細{}-----", pledgeContract.getContractName());
+
+            //璁$畻寰呰繕娆鹃噾棰�
+            backMoney = pledgeContract.getContractAmount() - pledgeContract.getRepaidAmount();
+            if(backMoney <= 0.0){
+                //鑻ュ緟杩橀噾棰濅负0锛屽垯涓嶇粺璁℃鍚堝悓
+                log.error("-----褰撳墠鍚堝悓={}娌℃湁寰呰繕閲戦涓簕}锛屼笉鎵ц鎻愰啋鏍哥畻-----", pledgeContract.getContractName(), backMoney);
+                continue;
+            }
+
+            if(StringUtils.isBlank(pledgeContract.getPledgeBank())){
+                //鑻ヨ川鎶奸摱琛屾湭绌猴紝鍒欒烦杩囧綋鍓嶅悎鍚�
+                log.error("-----褰撳墠鍚堝悓={}娌℃湁璁剧疆璐ㄦ娂閾惰锛屼笉鎵ц鎻愰啋鏍哥畻-----", pledgeContract.getContractName());
+                continue;
+            }
+
+            if(StringUtils.isBlank(pledgeContract.getDepotIds())){
+                //鑻ヨ川鎶间粨搴撲负绌猴紝鍒欒烦杩囧綋鍓嶅悎鍚�
+                log.error("-----褰撳墠鍚堝悓={}娌℃湁璁剧疆璐ㄦ娂浠撳簱锛屼笉鎵ц鎻愰啋鏍哥畻-----", pledgeContract.getContractName());
+                continue;
+            }
+
+            String[] depotIds = pledgeContract.getDepotIds().split(",");
+            if(depotIds.length < 1){
+                //鑻ヨ川鎶间粨搴撲负绌猴紝鍒欒烦杩囧綋鍓嶅悎鍚�
+                log.error("-----褰撳墠鍚堝悓={}娌℃湁璁剧疆璐ㄦ娂浠撳簱锛屼笉鎵ц鎻愰啋鏍哥畻-----", pledgeContract.getContractName());
+                continue;
+            }
+            sumMoney = 0.0;
+            for (String depotId : depotIds) {
+                //鏌ヨ浠撳簱淇℃伅
+                depot = depotService.getCacheDepot(pledgeContract.getCompanyId(), depotId);
+                if(null == depot){
+                    log.error("-----褰撳墠鍚堝悓={}涓嬩粨搴�={}涓嶅瓨鍦紝涓嶇粺璁℃浠撳簱-----", pledgeContract.getContractName(), depotId);
+                    continue;
+                }
+                if(null == depot.getStorageReal()){
+                    depot.setStorageReal(0.0);
+                }
+
+                foodPrice = foodPriceService.getDataByBankAndFood(pledgeContract.getPledgeBank(), depot.getFoodVariety());
+                if(null == foodPrice || null == foodPrice.getPrice()){
+                    log.error("-----褰撳墠鍚堝悓={}涓嬩粨搴�={}瀵瑰簲鐨勫搧绉�={}鏈厤缃环鏍硷紝涓嶇粺璁℃浠撳簱-----", pledgeContract.getContractName(),depot.getName(), depot.getFoodVariety());
+                    continue;
+                }
+
+                sumMoney += depot.getStorageReal() * foodPrice.getPrice();
+            }
+
+            per = sumMoney/backMoney;
+
+            if(per <= 1.2){
+                //鎵ц娴佺▼
+                conf = workService.getConfByDeptId(pledgeContract.getPledgeDept(), WorkBizType.TYPE_50);
+                //娴佺▼涓嶅惎鐢�
+                if (null == conf || Constant.YN_N.equals(conf.getValTag())) {
+                    log.error("-----褰撳墠鍚堝悓={}璐ㄦ娂搴撳尯={}鏈厤缃繕娆炬彁閱掑鎵规祦绋嬶紝鏃犳硶鐢熸垚宸ュ崟鎻愰啋-----", pledgeContract.getContractName(),pledgeContract.getPledgeDept());
+                    continue;
+                }
+
+                BaseResp resp = workService.startByBackMoney(pledgeContract, conf);
+                log.info("---------褰撳墠鍚堝悓={}鍚姩杩樻鎻愰啋宸ュ崟娴佺▼------{}",pledgeContract.getContractName(), resp);
+            }
+        }
+    }
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/timer/SystemScheduled.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/timer/SystemScheduled.java
index dac4b06..928c3fe 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/igds/timer/SystemScheduled.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/timer/SystemScheduled.java
@@ -70,7 +70,7 @@
         //璁剧疆鍒犻櫎鍙傛暟
         SysOperLog deleteOperLog = new SysOperLog();
         //璁剧疆鍒犻櫎鎴鏃堕棿
-        String endTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtil.getNewByDay(new Date(), -30));
+        String endTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtil.getNewByDay(new Date(), -90));
         Map<String, Object> params = new HashMap<>();
         params.put("endTime", endTime);
         deleteOperLog.setParams(params);
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/work/data/WorkBizType.java b/fzzy-igdss-core/src/main/java/com/fzzy/work/data/WorkBizType.java
index bd43fd1..c739507 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/work/data/WorkBizType.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/work/data/WorkBizType.java
@@ -11,6 +11,7 @@
     TYPE_20("20", "鍑哄簱閫氱煡鍗曟祦绋�"),
     TYPE_30("30", "AI浜嬩欢"),
     TYPE_40("40", "棰勮/璀﹀憡"),
+    TYPE_50("50", "杩樻鎻愰啋"),
     TYPE_99("99", "鍏朵粬");
 
     private String code;
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/work/service/BizWorkService.java b/fzzy-igdss-core/src/main/java/com/fzzy/work/service/BizWorkService.java
index cd9dea8..6cc150e 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/work/service/BizWorkService.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/work/service/BizWorkService.java
@@ -4,6 +4,7 @@
 import com.fzzy.igds.data.BaseResp;
 import com.fzzy.igds.domain.InoutNoticeIn;
 import com.fzzy.igds.domain.InoutNoticeOut;
+import com.fzzy.igds.domain.PledgeContract;
 import com.fzzy.igds.utils.ContextUtil;
 import com.fzzy.work.data.WorkStatus;
 import com.fzzy.work.data.WorkBizType;
@@ -165,6 +166,52 @@
     }
 
     /**
+     *
+     * 鏍规嵁鍑哄叆搴撻�氱煡鍗曞惎鍔ㄥ鎵瑰伐鍗�
+     * @param data 鍑哄叆搴撳伐鍗曟暟鎹�
+     * @return 鍝嶅簲缁撴灉
+     */
+    public BaseResp startByBackMoney(PledgeContract data, WorkOrderConf conf) {
+
+        if (null == conf) conf = confService.getByDeptId(data.getPledgeDept(), WorkBizType.TYPE_10);
+
+        if (Constant.YN_N.equals(conf.getValTag())) return BaseResp.error("娴佺▼鏈惎鐢�");
+
+        //鍒涘缓宸ュ崟
+        WorkOrder work = new WorkOrder();
+        work.setId(ContextUtil.generateOrderId("WARN"));
+        work.setBizType(WorkBizType.TYPE_50.getCode());
+        work.setBusinessId(data.getId());
+        work.setBankId(data.getPledgeBank());
+        work.setBusinessUrl("com.fzzy.igds.PledgeContract-Detail.d");
+        work.setCreateTime(new Date());
+        work.setDeptId(data.getPledgeDept());
+        work.setCompanyId(data.getCompanyId());
+        work.setUpdateTime(new Date());
+        work.setTitle("璐ㄦ娂鍚堝悓杩樻鎻愰啋");
+        work.setConfId(conf.getId());
+        work.setStatus(WorkStatus.STATUS_30.getCode());
+        work.setReceiveTime(new Date());
+
+        String nextNode = this.getNextNode(WorkNode.NODE_START.getCode(), conf).getCode();
+        work.setNode(nextNode);
+        orderService.addData(work);
+
+        //娣诲姞璁板綍
+        WorkOrderProcess process = new WorkOrderProcess();
+        process.setId(ContextUtil.UUID());
+        process.setAction("鎻愪氦");
+        process.setCreateTime(new Date());
+        process.setOrderId(work.getId());
+        process.setAssigneeName(work.getCreateBy());
+        process.setAssigneeId(work.getCreateById());
+        process.setNode(WorkNode.NODE_START.getCode());
+        orderProcessService.addData(process, false);
+
+        return BaseResp.success();
+    }
+
+    /**
      * 鑾峰彇寰呭鐞嗗伐鍗�
      * @return 澶勭悊缁撴灉
      */
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/igds/PledgeContract-Detail.view.xml b/fzzy-igdss-view/src/main/java/com/fzzy/igds/PledgeContract-Detail.view.xml
new file mode 100644
index 0000000..c7fd8f7
--- /dev/null
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/igds/PledgeContract-Detail.view.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ViewConfig>
+  <Arguments/>
+  <Context/>
+  <Model/>
+  <View layout="padding:10">
+    <Property name="packages">font-awesome,css-common</Property>
+    <DataSet id="dsMain">
+      <Property name="dataType">dtMain</Property>
+      <Property name="dataProvider">pledgeContractPR#getOne</Property>
+      <Property name="loadMode">lazy</Property>
+      <Property name="parameter">${request.getParameter('businessId')}</Property>
+      <Property name="readOnly">true</Property>
+    </DataSet>
+    <Container>
+      <Property name="className">c-data</Property>
+      <AutoForm layoutConstraint="top ">
+        <Property name="dataSet">dsMain</Property>
+        <Property name="showHint">false</Property>
+        <Property name="cols">210,*,210</Property>
+        <Control/>
+        <AutoFormElement>
+          <Property name="name">name</Property>
+          <Property name="property">name</Property>
+          <Property name="editorType">Label</Property>
+          <Property name="showLabel">false</Property>
+          <Property name="showHint">false</Property>
+          <Property name="className">f-title</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">id</Property>
+          <Property name="property">id</Property>
+          <Property name="editorType">Label</Property>
+          <Property name="showHint">false</Property>
+          <Property name="labelAlign">right</Property>
+          <Property name="showLabel">false</Property>
+          <Editor/>
+        </AutoFormElement>
+      </AutoForm>
+      <AutoForm>
+        <Property name="dataSet">dsMain</Property>
+        <Property name="cols">*,*,*</Property>
+        <Property name="labelAlign">right</Property>
+        <Property name="labelSeparator">锛�</Property>
+        <Property name="labelWidth">120</Property>
+        <AutoFormElement layoutConstraint="colSpan:2">
+          <Property name="name">name</Property>
+          <Property name="property">name</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">pledgeBank</Property>
+          <Property name="property">pledgeBank</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">pledgeCompany</Property>
+          <Property name="property">pledgeCompany</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">pledgeDept</Property>
+          <Property name="property">pledgeDept</Property>
+          <Property name="trigger">dsDeptDropDown</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">depotNames</Property>
+          <Property name="property">depotNames</Property>
+          <Property name="trigger">CDDDept</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">signTime</Property>
+          <Property name="property">signTime</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">pledgeStart</Property>
+          <Property name="property">pledgeStart</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">pledgeEnd</Property>
+          <Property name="property">pledgeEnd</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement layoutConstraint="colSpan:2">
+          <Property name="name">contractName</Property>
+          <Property name="property">contractName</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">contractNo</Property>
+          <Property name="property">contractNo</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">contractAmount</Property>
+          <Property name="property">contractAmount</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">repaidAmount</Property>
+          <Property name="property">repaidAmount</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">status</Property>
+          <Property name="property">status</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement layoutConstraint="colSpan:3">
+          <Property name="name">remark</Property>
+          <Property name="property">remark</Property>
+          <Property name="editorType">TextArea</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">createBy</Property>
+          <Property name="property">createBy</Property>
+          <Property name="readOnly">true</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">createTime</Property>
+          <Property name="property">createTime</Property>
+          <Property name="readOnly">true</Property>
+          <Editor/>
+        </AutoFormElement>
+        <HtmlContainer layoutConstraint="colSpan:3">
+          <Property name="content">1.褰撳墠鍗曟嵁浠呬綔涓哄綋鍓嶇郴缁熶笟鍔′俊鎭櫥璁颁娇鐢紝涓嶄綔涓哄疄闄呭弻鏂瑰悎绾︾害鏉熴��&lt;br>&#xD;
+            2.褰撳墠鍗曟嵁榛樿鏀寔涓�1涓悎绾﹀搴�1涓簱鍖猴紝濡傛灉鍚屾椂瀵瑰簲澶氫釜搴撳尯璇锋暟鎹櫥璁般��&lt;br>&#xD;
+            3.璐ㄦ娂鐘舵�佸鏋�=瑙f娂锛岀郴缁熷搴斿偓鍔炴彁閱掔瓑鍔熻兘鑷姩瀹屾垚銆�&lt;br></Property>
+          <Property name="exClassName">h-tip</Property>
+          <Property name="contentOverflow">hidden</Property>
+        </HtmlContainer>
+      </AutoForm>
+    </Container>
+  </View>
+</ViewConfig>
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/igds/PledgeContractPR.java b/fzzy-igdss-view/src/main/java/com/fzzy/igds/PledgeContractPR.java
index 35f46ea..4f3f36a 100644
--- a/fzzy-igdss-view/src/main/java/com/fzzy/igds/PledgeContractPR.java
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/igds/PledgeContractPR.java
@@ -7,6 +7,7 @@
 import com.fzzy.igds.constant.Constant;
 import com.fzzy.igds.data.BaseResp;
 import com.fzzy.igds.data.IgdsBaseParam;
+import com.fzzy.igds.domain.InoutNoticeIn;
 import com.fzzy.igds.domain.PledgeContract;
 import com.fzzy.igds.service.PledgeContractService;
 import com.fzzy.igds.utils.ContextUtil;
@@ -53,6 +54,17 @@
     }
 
     /**
+     * pledgeContractPR#getOne
+     *
+     * @param businessId
+     * @return
+     */
+    @DataProvider
+    public PledgeContract getOne(String businessId) {
+        return pledgeContractService.getOne(businessId);
+    }
+
+    /**
      * 淇濆瓨/鏇存柊
      *
      * @param pledgeContract

--
Gitblit v1.9.3