czt
2026-01-28 db5240c1ad2a2926297c9febb6383384abea1082
质押合同还款金额提醒功能
已修改6个文件
已添加2个文件
375 ■■■■■ 文件已修改
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FoodPriceService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/PledgeContractService.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/timer/JobWarnService.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/timer/SystemScheduled.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/work/data/WorkBizType.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/work/service/BizWorkService.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/PledgeContract-Detail.view.xml 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/PledgeContractPR.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
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");
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);
            }
        }
    }
}
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);
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;
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 å¤„理结果
     */
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.质押状态如果=解押,系统对应催办提醒等功能自动完成。&lt;br></Property>
          <Property name="exClassName">h-tip</Property>
          <Property name="contentOverflow">hidden</Property>
        </HtmlContainer>
      </AutoForm>
    </Container>
  </View>
</ViewConfig>
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