1、生成灌溉模型计算模块;
2、生成灌溉模型计算需要的数据库表与实体(作物、作物计算参数)。
2个文件已修改
15个文件已添加
786 ■■■■■ 已修改文件
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoMd/MdCropsMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoMd/MdParamMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoMd/MdCrops.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoMd/MdParam.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/MdCropsMapper.xml 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/MdParamMapper.xml 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/java/com/dy/pipIrrModel/config/WebFilterConfiguration.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/java/com/dy/pipIrrModel/config/WebListenerConfiguration.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/java/com/dy/pipIrrModel/modelCalculate/CalculateJob.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/java/com/dy/pipIrrModel/modelCalculate/ModelListener.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/resources/application(121服务器).yml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/resources/application(233服务器).yml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/resources/application-self.yml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/resources/application.yml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/resources/log4j2.yml 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pom.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoMd/MdCropsMapper.java
New file
@@ -0,0 +1,22 @@
package com.dy.pipIrrGlobal.daoMd;
import com.dy.pipIrrGlobal.pojoMd.MdCrops;
/**
 * @Author: liurunyu
 * @Date: 2025/8/6 10:51
 * @Description
 */
public interface MdCropsMapper {
    int deleteByPrimaryKey(Long id);
    int insert(MdCrops record);
    int insertSelective(MdCrops record);
    MdCrops selectByPrimaryKey(Long id);
    int updateByPrimaryKeySelective(MdCrops record);
    int updateByPrimaryKey(MdCrops record);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoMd/MdParamMapper.java
New file
@@ -0,0 +1,22 @@
package com.dy.pipIrrGlobal.daoMd;
import com.dy.pipIrrGlobal.pojoMd.MdParam;
/**
 * @Author: liurunyu
 * @Date: 2025/8/6 10:51
 * @Description
 */
public interface MdParamMapper {
    int deleteByPrimaryKey(Long id);
    int insert(MdParam record);
    int insertSelective(MdParam record);
    MdParam selectByPrimaryKey(Long id);
    int updateByPrimaryKeySelective(MdParam record);
    int updateByPrimaryKey(MdParam record);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoMd/MdCrops.java
New file
@@ -0,0 +1,114 @@
package com.dy.pipIrrGlobal.pojoMd;
import java.util.Date;
/**
 * @Author: liurunyu
 * @Date: 2025/8/6 10:51
 * @Description
 */
public class MdCrops {
    /**
    * ä¸»é”®
    */
    private Long id;
    /**
    * ä½œç‰©åç§°
    */
    private String name;
    /**
    * è®¡ç®—开始日期(一年生作物是种植时间或出芽时间),如果为空值则为长久计算,格式yyyy-mm-dd
    */
    private Date startDt;
    /**
    * è®¡ç®—截止日期(一年生作物是停止灌溉时间),如果为空值则为长久计算,格式yyyy-mm-dd
    */
    private Date endDt;
    /**
    * æ˜¯å¦åœæ­¢è®¡ç®—,1是,0否
    */
    private Byte stopped;
    /**
    * å¤‡æ³¨
    */
    private String remarks;
    /**
    * æ•°æ®è®°å½•创建日期,格式yyyy-mm-dd hh:mm:ss
    */
    private Date createDt;
    /**
    * æ˜¯å¦åˆ é™¤ï¼Œ1是,0否
    */
    private Byte deleted;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Date getStartDt() {
        return startDt;
    }
    public void setStartDt(Date startDt) {
        this.startDt = startDt;
    }
    public Date getEndDt() {
        return endDt;
    }
    public void setEndDt(Date endDt) {
        this.endDt = endDt;
    }
    public Byte getStopped() {
        return stopped;
    }
    public void setStopped(Byte stopped) {
        this.stopped = stopped;
    }
    public String getRemarks() {
        return remarks;
    }
    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }
    public Date getCreateDt() {
        return createDt;
    }
    public void setCreateDt(Date createDt) {
        this.createDt = createDt;
    }
    public Byte getDeleted() {
        return deleted;
    }
    public void setDeleted(Byte deleted) {
        this.deleted = deleted;
    }
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoMd/MdParam.java
New file
@@ -0,0 +1,70 @@
package com.dy.pipIrrGlobal.pojoMd;
/**
 * @Author: liurunyu
 * @Date: 2025/8/6 10:51
 * @Description
 */
public class MdParam {
    /**
    * ä¸»é”®
    */
    private Long id;
    private Long cropsId;
    /**
    * å‚数名称
    */
    private String name;
    /**
    * å‚数值
    */
    private Double value;
    /**
    * å‚数含义
    */
    private String sense;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public Long getCropsId() {
        return cropsId;
    }
    public void setCropsId(Long cropsId) {
        this.cropsId = cropsId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Double getValue() {
        return value;
    }
    public void setValue(Double value) {
        this.value = value;
    }
    public String getSense() {
        return sense;
    }
    public void setSense(String sense) {
        this.sense = sense;
    }
}
pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
@@ -118,10 +118,6 @@
        webPort: 8083
        actutorPort: 9083
        idSuffix: 5
    demo:
        webPort: 8000
        actutorPort: 9000
        idSuffix: 99
    sell:
        webPort: 8084
        actutorPort: 9084
@@ -150,11 +146,19 @@
        webPort: 8090
        actutorPort: 9090
        idSuffix: 12
    model:
        webPort: 8091
        actutorPort: 9091
        idSuffix: 13
    # 2023-10-24新增,用于执行临时任务,例如删除数据库中上些出错的数据
    temp:
        webPort: 8099
        actutorPort: 9099
        idSuffix: 98
    demo:
        webPort: 8000
        actutorPort: 9000
        idSuffix: 99
    # åˆ†å¸ƒå¼web文件系统
    file:
@@ -394,6 +398,11 @@
    startHour: 0 #开始小时,必须是0点或之后,取值范围是0~5,否StatisticsListener中自动设置成0
    startMinute: 5 #开始分钟 5
#模型计算配置,模型计算定时任务会每天定时进行
model-calculate:
    startHour: 0 #开始小时,必须是0点或之后,取值范围是0~5,否ModelListener中自动设置成0
    startMinute: 10 #开始分钟 10
#钉钉消息推送
dingtalk:
    ym:
pipIrr-platform/pipIrr-global/src/main/resources/mapper/MdCropsMapper.xml
New file
@@ -0,0 +1,137 @@
<?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.dy.pipIrrGlobal.daoMd.MdCropsMapper">
  <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoMd.MdCrops">
    <!--@mbg.generated-->
    <!--@Table md_crops-->
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="start_dt" jdbcType="DATE" property="startDt" />
    <result column="end_dt" jdbcType="DATE" property="endDt" />
    <result column="stopped" jdbcType="TINYINT" property="stopped" />
    <result column="remarks" jdbcType="VARCHAR" property="remarks" />
    <result column="create_dt" jdbcType="TIMESTAMP" property="createDt" />
    <result column="deleted" jdbcType="TINYINT" property="deleted" />
  </resultMap>
  <sql id="Base_Column_List">
    <!--@mbg.generated-->
    id, `name`, start_dt, end_dt, stopped, remarks, create_dt, deleted
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
    <!--@mbg.generated-->
    select
    <include refid="Base_Column_List" />
    from md_crops
    where id = #{id,jdbcType=BIGINT}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
    <!--@mbg.generated-->
    delete from md_crops
    where id = #{id,jdbcType=BIGINT}
  </delete>
  <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoMd.MdCrops">
    <!--@mbg.generated-->
    insert into md_crops (id, `name`, start_dt,
      end_dt, stopped, remarks,
      create_dt, deleted)
    values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{startDt,jdbcType=DATE},
      #{endDt,jdbcType=DATE}, #{stopped,jdbcType=TINYINT}, #{remarks,jdbcType=VARCHAR},
      #{createDt,jdbcType=TIMESTAMP}, #{deleted,jdbcType=TINYINT})
  </insert>
  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoMd.MdCrops">
    <!--@mbg.generated-->
    insert into md_crops
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="name != null">
        `name`,
      </if>
      <if test="startDt != null">
        start_dt,
      </if>
      <if test="endDt != null">
        end_dt,
      </if>
      <if test="stopped != null">
        stopped,
      </if>
      <if test="remarks != null">
        remarks,
      </if>
      <if test="createDt != null">
        create_dt,
      </if>
      <if test="deleted != null">
        deleted,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=BIGINT},
      </if>
      <if test="name != null">
        #{name,jdbcType=VARCHAR},
      </if>
      <if test="startDt != null">
        #{startDt,jdbcType=DATE},
      </if>
      <if test="endDt != null">
        #{endDt,jdbcType=DATE},
      </if>
      <if test="stopped != null">
        #{stopped,jdbcType=TINYINT},
      </if>
      <if test="remarks != null">
        #{remarks,jdbcType=VARCHAR},
      </if>
      <if test="createDt != null">
        #{createDt,jdbcType=TIMESTAMP},
      </if>
      <if test="deleted != null">
        #{deleted,jdbcType=TINYINT},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoMd.MdCrops">
    <!--@mbg.generated-->
    update md_crops
    <set>
      <if test="name != null">
        `name` = #{name,jdbcType=VARCHAR},
      </if>
      <if test="startDt != null">
        start_dt = #{startDt,jdbcType=DATE},
      </if>
      <if test="endDt != null">
        end_dt = #{endDt,jdbcType=DATE},
      </if>
      <if test="stopped != null">
        stopped = #{stopped,jdbcType=TINYINT},
      </if>
      <if test="remarks != null">
        remarks = #{remarks,jdbcType=VARCHAR},
      </if>
      <if test="createDt != null">
        create_dt = #{createDt,jdbcType=TIMESTAMP},
      </if>
      <if test="deleted != null">
        deleted = #{deleted,jdbcType=TINYINT},
      </if>
    </set>
    where id = #{id,jdbcType=BIGINT}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoMd.MdCrops">
    <!--@mbg.generated-->
    update md_crops
    set `name` = #{name,jdbcType=VARCHAR},
      start_dt = #{startDt,jdbcType=DATE},
      end_dt = #{endDt,jdbcType=DATE},
      stopped = #{stopped,jdbcType=TINYINT},
      remarks = #{remarks,jdbcType=VARCHAR},
      create_dt = #{createDt,jdbcType=TIMESTAMP},
      deleted = #{deleted,jdbcType=TINYINT}
    where id = #{id,jdbcType=BIGINT}
  </update>
</mapper>
pipIrr-platform/pipIrr-global/src/main/resources/mapper/MdParamMapper.xml
New file
@@ -0,0 +1,102 @@
<?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.dy.pipIrrGlobal.daoMd.MdParamMapper">
  <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoMd.MdParam">
    <!--@mbg.generated-->
    <!--@Table md_param-->
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="crops_id" jdbcType="BIGINT" property="cropsId" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="value" jdbcType="FLOAT" property="value" />
    <result column="sense" jdbcType="VARCHAR" property="sense" />
  </resultMap>
  <sql id="Base_Column_List">
    <!--@mbg.generated-->
    id, crops_id, `name`, `value`, sense
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
    <!--@mbg.generated-->
    select
    <include refid="Base_Column_List" />
    from md_param
    where id = #{id,jdbcType=BIGINT}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
    <!--@mbg.generated-->
    delete from md_param
    where id = #{id,jdbcType=BIGINT}
  </delete>
  <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoMd.MdParam">
    <!--@mbg.generated-->
    insert into md_param (id, crops_id, `name`,
      `value`, sense)
    values (#{id,jdbcType=BIGINT}, #{cropsId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR},
      #{value,jdbcType=FLOAT}, #{sense,jdbcType=VARCHAR})
  </insert>
  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoMd.MdParam">
    <!--@mbg.generated-->
    insert into md_param
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="cropsId != null">
        crops_id,
      </if>
      <if test="name != null">
        `name`,
      </if>
      <if test="value != null">
        `value`,
      </if>
      <if test="sense != null">
        sense,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=BIGINT},
      </if>
      <if test="cropsId != null">
        #{cropsId,jdbcType=BIGINT},
      </if>
      <if test="name != null">
        #{name,jdbcType=VARCHAR},
      </if>
      <if test="value != null">
        #{value,jdbcType=FLOAT},
      </if>
      <if test="sense != null">
        #{sense,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoMd.MdParam">
    <!--@mbg.generated-->
    update md_param
    <set>
      <if test="cropsId != null">
        crops_id = #{cropsId,jdbcType=BIGINT},
      </if>
      <if test="name != null">
        `name` = #{name,jdbcType=VARCHAR},
      </if>
      <if test="value != null">
        `value` = #{value,jdbcType=FLOAT},
      </if>
      <if test="sense != null">
        sense = #{sense,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=BIGINT}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoMd.MdParam">
    <!--@mbg.generated-->
    update md_param
    set crops_id = #{cropsId,jdbcType=BIGINT},
      `name` = #{name,jdbcType=VARCHAR},
      `value` = #{value,jdbcType=FLOAT},
      sense = #{sense,jdbcType=VARCHAR}
    where id = #{id,jdbcType=BIGINT}
  </update>
</mapper>
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/java/com/dy/pipIrrModel/config/WebFilterConfiguration.java
New file
@@ -0,0 +1,45 @@
package com.dy.pipIrrModel.config;
import com.dy.common.webFilter.DevOfDataSourceNameSetFilter;
import com.dy.common.webFilter.UserTokenFilter;
import jakarta.servlet.Filter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebFilterConfiguration {
    @Value("${pipIrr.global.dev}")
    public String isDevStage ;//是否为开发阶段
    @Value("${pipIrr.global.dsName}")
    public String dsName ;//开发阶段的数据源名称
    /**
     * DevOfDataSourceNameSetFilter与UserTokenFilter只能一个被配置上,
     * æ‰€ä»¥ä»–们的order都是1
     */
    private static final int order_UserTokenFilter = 1 ;//与下面
    private static final int order_DevOfDataSourceNameSetFilter = 1 ;
    @Bean
    public FilterRegistrationBean<? extends Filter> RegFilter() {
        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
        if(this.isDevStage != null && !this.isDevStage.trim().equals("") && this.isDevStage.trim().equalsIgnoreCase("true")){
            filterRegistrationBean.setFilter(new DevOfDataSourceNameSetFilter());
            filterRegistrationBean.addUrlPatterns("/*");//配置过滤规则
            filterRegistrationBean.addInitParameter("dataSourceName",dsName);//设置init参数
            filterRegistrationBean.setName("DevOfDataSourceNameSetFilter");//设置过滤器名称
            filterRegistrationBean.setOrder(order_DevOfDataSourceNameSetFilter);//执行次序
        }else{
            filterRegistrationBean.setFilter(new UserTokenFilter());
            filterRegistrationBean.addUrlPatterns("/*");//配置过滤规则
            filterRegistrationBean.setName("UserTokenFilter");//设置过滤器名称
            filterRegistrationBean.setOrder(order_UserTokenFilter);//执行次序
        }
        return filterRegistrationBean;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/java/com/dy/pipIrrModel/config/WebListenerConfiguration.java
New file
@@ -0,0 +1,29 @@
package com.dy.pipIrrModel.config;
import com.dy.common.webListener.GenerateIdSetSuffixListener;
import jakarta.servlet.ServletContextListener;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebListenerConfiguration {
    /**
     * å¯åŠ¨é¡ºåº
     */
    private static final int order_idSetSuffix = 1 ;
    /**
     * å†…部提供listener,该listener在系统启动时,根据配置 è®¾ç½®ID产生器的后缀
     * @return æ³¨å†ŒBean
     */
    @Bean
    public ServletListenerRegistrationBean<? extends ServletContextListener> regSsoListener() {
        ServletListenerRegistrationBean<GenerateIdSetSuffixListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>();
        listenerRegistrationBean.setListener(new GenerateIdSetSuffixListener());
        listenerRegistrationBean.setOrder(order_idSetSuffix);
        return listenerRegistrationBean;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/java/com/dy/pipIrrModel/modelCalculate/CalculateJob.java
New file
@@ -0,0 +1,33 @@
package com.dy.pipIrrModel.modelCalculate;
import com.dy.common.multiDataSource.DataSourceContext;
import com.dy.common.schedulerTask.TaskJob;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
 * @Author: liurunyu
 * @Date: 2025/8/6 9:32
 * @Description
 */
public class CalculateJob extends TaskJob {
    private static Logger log = LogManager.getLogger(CalculateJob.class.getName()) ;
    private String orgTag ;
    @Override
    public void execute(JobExecutionContext ctx) throws JobExecutionException {
        JobDataMap jobDataMap = ctx.getJobDetail().getJobDataMap() ;
        if(jobDataMap != null){
            orgTag = (String)jobDataMap.get(ModelListener.orgKey) ;
        }
        if(orgTag == null){
            return ;
        }
        DataSourceContext.set(orgTag);//设置数据源
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/java/com/dy/pipIrrModel/modelCalculate/ModelListener.java
New file
@@ -0,0 +1,85 @@
package com.dy.pipIrrModel.modelCalculate;
import com.dy.common.schedulerTask.SchedulerTaskSupport;
import com.dy.pipIrrGlobal.util.Org;
import com.dy.pipIrrGlobal.util.OrgListenerSupport;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.io.ResourceLoader;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
/**
 * @Author: liurunyu
 * @Date: 2025/8/6 9:32
 * @Description
 * ä½œç‰©è’¸è…¾è‡ªåŠ¨è®¡ç®—
 */
@Slf4j
@Component
public class ModelListener extends OrgListenerSupport implements ApplicationListener<ApplicationReadyEvent> {
    protected static final String orgKey = "tag" ;
    private static final String JobName = "modelCalculateJob" ;
    private static final String JobGroupName = "modelCalculateGroup" ;
    private static final Integer ThreadPoolMaxCount = 1 ;//线程池线程最大个数
    private static final Integer ThreadPoolPriority = 5 ;//线程优先级
    /**
     * è®¡ç®—开始小时,必须0点或之后,见autoCalculateJob中计算,所用数据是昨天的
     */
    @Value("${model-calculate.startHour: 0}")
    protected Integer startHour;//计算开始时刻--小时
    @Value("${model-calculate.startMinute: 10}")
    protected Integer startMinute;//计算开始时刻--分钟
    @Autowired
    protected ResourceLoader resourceLoader ;
    /**
     * SpringBoot容器已经准备好了,执行下面方法
     * @param event äº‹ä»¶
     */
    @Override
    public void onApplicationEvent(@NonNull ApplicationReadyEvent event) {
        try {
            //等1秒,等待com.alibaba.druid.pool.DruidDataSource初始化完成
            Thread.sleep(1000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            try{
                super.init(resourceLoader);
                this.start(event);
            }catch (Exception e){
                log.error("注册模型计算定时任务出错", e);
            }
        }
    }
    /**
     * åˆå§‹åŒ–
     */
    private void start(ApplicationReadyEvent event) throws Exception{
        if(startHour < 0 || startHour > 5){
            startHour = 0 ;
        }
        List<Org.OrgVo> orgList = Org.OrgList ;
        if(orgList != null && orgList.size() >0){
            SchedulerTaskSupport.setThreadPoolPro(ThreadPoolMaxCount * orgList.size(), ThreadPoolPriority);
            for(Org.OrgVo vo : orgList){
                HashMap<String , Object> jobDataMap    = new HashMap<String , Object>() ;
                jobDataMap.put(orgKey, vo.tag) ;
                SchedulerTaskSupport.addDailyJob(JobName + vo.tag, JobGroupName, CalculateJob.class, jobDataMap, startHour, startMinute ) ;
                //SchedulerTaskSupport.addSecondlyJob(JobName + vo.tag, JobGroupName, TestJob.class, jobDataMap, 10, 10000, 0 ) ;
            }
        }
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/resources/application(121·þÎñÆ÷).yml
New file
@@ -0,0 +1,3 @@
spring:
    profiles:
        include: common-web, global, database, database-mq, database-yq, database-hlj, database-gz, database-lz, database-jc, database-jyg, self
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/resources/application(233·þÎñÆ÷).yml
New file
@@ -0,0 +1,3 @@
spring:
    profiles:
        include: common-web, global, database, database-ym, database-sp, database-test,database-mj, self
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/resources/application-self.yml
New file
@@ -0,0 +1,18 @@
spring:
    devtools:
        livereload:
            enabled: false
        restart:
            enabled: false #禁用热部署
#actutor的web端口
management:
    server:
        port: ${pipIrr.model.actutorPort}
#web服务端口,tomcat默认是8080
server:
    port: ${pipIrr.model.webPort}
    servlet:
        context-path: /model #web访问上下文路径
        context-parameters:
            #GenerateIdSetSuffixListener中应用,取值范围是0-99
            idSuffix: ${pipIrr.model.idSuffix}
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/resources/application.yml
New file
@@ -0,0 +1,3 @@
spring:
    profiles:
        include: common-web, global, database, database-ym, database-sp, database-test,database-mj, self
pipIrr-platform/pipIrr-web/pipIrr-web-model/src/main/resources/log4j2.yml
New file
@@ -0,0 +1,80 @@
Configuration:
    #status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出;可以设置成Off(关闭)或Error(只输出错误信息)
    status: Error
    Properties: # å®šä¹‰å…¨å±€å˜é‡
        Property:
            #日志文件存储的目录
            - name: log.path
              value: ./logs
            #日志文件存储名称
            - name: project.name
              value: pipIrrModel
    #定义输出器,可以输出到控制台和文件.
    Appenders:
        #输出到控制台
        Console:
            #Appender命名
            name: CONSOLE
            target: SYSTEM_OUT
            ThresholdFilter:
                level: debug #输出日志级别,输出日志时,首先由Loggers.Root.level或Loggers.Logger.level判断是否输出,然后再由本level判断是否输出
                onMatch: ACCEPT #onMatch=ACCEPT å¤§äºŽç­‰äºŽ "level" é…ç½®çš„等级地日志输出
                onMismatch: DENY #onMismatch=DENY å°äºŽ "level" é…ç½®çš„等级地日志不输出
            #日志内容样式
            PatternLayout:
                #%n-换行
                #%m-日志内容,输出代码中指定的日志信息
                #%p-输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
                #%r-程序启动到现在的毫秒数
                #%%- è¾“出一个"%" å­—符
                #%t-当前线程名
                #%d-日期和时间, å¸¸ç”¨çš„æ ¼å¼æœ‰%d{DATE},%d{ABSOLUTE},%d{HH:mm:ss,SSS},%d{ddMMyyyyHH:mm:ss,SSS}
                #%l-同%F%L%C%M
                #%F-java源文件名
                #%L-java源码行数
                #%C-java类名,%C{1}输出最后一个元素
                #%M-java方法名
                pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%C.%M:%L) - %m%n"
        # è¾“出到文件,超过10MB归档
        RollingFile:
          - name: ROLLING_FILE
            ignoreExceptions: false
            fileName: ${log.path}/${project.name}.log
            filePattern: "${log.path}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
            ThresholdFilter:
              level: error #输出日志级别,输出日志时,首先由Loggers.Root.level或Loggers.Logger.level判断是否输出,然后再由本level判断是否输出
              onMatch: ACCEPT #onMatch=ACCEPT å¤§äºŽç­‰äºŽ "level" é…ç½®çš„等级地日志输出
              onMismatch: DENY #onMismatch=DENY å°äºŽ "level" é…ç½®çš„等级地日志不输出
            #日志内容样式
            PatternLayout:
              pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%C.%M:%L) - %m%n"
            Policies:
              # æ¯å¤©æ—¥å¿—文件按大小分子文件
              SizeBasedTriggeringPolicy:
                size: "1 MB"
            DefaultRolloverStrategy:
              max: 10  #一天内日志文件最大个数
              Delete:
                basePath: "${log.path}"
                maxDepth: 2 #删除日志文件的最大深度
                IfFileName:
                  glob: "${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
                IfLastModified:
                  age: "30d" #日志文件保留的最大天数
    Loggers:
        Root:
            level: info #日志输出级别,共有8个级别,按照从低到高为:all < trace < debug < info < warn < error < fatal < off
            AppenderRef: #Root的子节点,用来指定该日志输出到哪个Appender.
                - ref: CONSOLE #输出日志时,首先由本level判断是否输出,然后再由上面的Appenders.Console.ThresholdFilter.level判断是否输出
                - ref: ROLLING_FILE  #输出日志时,首先由本level判断是否输出,然后再由上面的Appenders.RollingFile.ThresholdFilter.level判断是否输出
        # ä¸ºåŒ…配置特殊的Log级别,方便调试,
        # ä¸å—Loggers.Root.level限制
        Logger:
          - name: org.apache.dubbo
            additivity: false #去除重复的log
            level: error #输出日志级别
            AppenderRef:
              - ref: CONSOLE #输出日志时,首先由本.level判断是否输出,然后再由上面的Appenders.Console.ThresholdFilter.level判断是否输出
              - ref: ROLLING_FILE #输出日志时,首先由本level判断是否输出,然后再由上面的Appenders.RollingFile.ThresholdFilter.level判断是否输出
pipIrr-platform/pipIrr-web/pom.xml
@@ -31,8 +31,9 @@
        <module>pipIrr-web-app</module>
        <module>pipIrr-web-operation</module>
        <module>pipIrr-web-file</module>
        <module>pipIrr-web-temp</module>
        <module>pipIrr-web-terminal</module>
        <module>pipIrr-web-model</module>
        <module>pipIrr-web-temp</module>
    </modules>
    <dependencies>