陈昶聿
2026-05-15 c3117a0c5c7b2b69c56cfc50fe5c199c2c2276c1
Merge remote-tracking branch 'origin/master'
已修改2个文件
已添加6个文件
1039 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceTaskRuleController.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceTaskRule.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/ServiceTaskRuleMapper.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceTaskRuleService.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceTaskRuleServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceTaskRuleMapper.xml 263 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceTaskRuleController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,118 @@
package com.ruoyi.web.controller.smartor;
import java.util.List;
import com.ruoyi.common.annotation.AddOrgId;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.smartor.domain.ServiceTaskRule;
import com.smartor.service.IServiceTaskRuleService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
 * ä»»åŠ¡æ‰§è¡Œè§„åˆ™Controller
 *
 * @author lihu
 * @date 2026-05-15
 */
@Api("任务执行规则")
@RestController
@RequestMapping("/smartor/taskrule")
public class ServiceTaskRuleController extends BaseController
{
    @Autowired
    private IServiceTaskRuleService serviceTaskRuleService;
    /**
     * æŸ¥è¯¢ä»»åŠ¡æ‰§è¡Œè§„åˆ™åˆ—è¡¨
     */
    @ApiOperation("查询任务执行规则列表")
    //@PreAuthorize("@ss.hasPermi('smartor:rule:list')")
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/list")
    public TableDataInfo list(@RequestBody ServiceTaskRule serviceTaskRule)
    {
        startPage();
        List<ServiceTaskRule> list = serviceTaskRuleService.selectServiceTaskRuleList(serviceTaskRule);
        return getDataTable(list);
    }
    /**
     * å¯¼å‡ºä»»åŠ¡æ‰§è¡Œè§„åˆ™åˆ—è¡¨
     */
    @ApiOperation("导出任务执行规则列表")
    //@PreAuthorize("@ss.hasPermi('smartor:rule:export')")
    @Log(title = "任务执行规则", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, ServiceTaskRule serviceTaskRule)
    {
        List<ServiceTaskRule> list = serviceTaskRuleService.selectServiceTaskRuleList(serviceTaskRule);
        ExcelUtil<ServiceTaskRule> util = new ExcelUtil<ServiceTaskRule>(ServiceTaskRule.class);
        util.exportExcel(response, list, "任务执行规则数据");
    }
    /**
     * èŽ·å–ä»»åŠ¡æ‰§è¡Œè§„åˆ™è¯¦ç»†ä¿¡æ¯
     */
    @ApiOperation("获取任务执行规则详细信息")
    //@PreAuthorize("@ss.hasPermi('smartor:rule:query')")
    @GetMapping(value = "/getInfo/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id)
    {
        return success(serviceTaskRuleService.selectServiceTaskRuleById(id));
    }
    /**
     * æ–°å¢žä»»åŠ¡æ‰§è¡Œè§„åˆ™
     */
    @ApiOperation("新增任务执行规则")
    //@PreAuthorize("@ss.hasPermi('smartor:rule:add')")
    @Log(title = "任务执行规则", businessType = BusinessType.INSERT)
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/add")
    public AjaxResult add(@RequestBody ServiceTaskRule serviceTaskRule)
    {
        return toAjax(serviceTaskRuleService.insertServiceTaskRule(serviceTaskRule));
    }
    /**
     * ä¿®æ”¹ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     */
    @ApiOperation("修改任务执行规则")
    //@PreAuthorize("@ss.hasPermi('smartor:rule:edit')")
    @Log(title = "任务执行规则", businessType = BusinessType.UPDATE)
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/edit")
    public AjaxResult edit(@RequestBody ServiceTaskRule serviceTaskRule)
    {
        return toAjax(serviceTaskRuleService.updateServiceTaskRule(serviceTaskRule));
    }
    /**
     * åˆ é™¤ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     */
    @ApiOperation("删除任务执行规则")
    //@PreAuthorize("@ss.hasPermi('smartor:rule:remove')")
    @Log(title = "任务执行规则", businessType = BusinessType.DELETE)
    @GetMapping("/remove/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids)
    {
        return toAjax(serviceTaskRuleService.deleteServiceTaskRuleByIds(ids));
    }
}
ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
@@ -58,24 +58,25 @@
    </sql>
    <select id="selectGenTableList" parameterType="GenTable" resultMap="GenTableResult">
        <include refid="selectGenTableVo"/>
        where
        <if test="orgid != null and orgid != ''">
            AND orgid = #{orgid}
        </if>
        <if test="tableName != null and tableName != ''">
            AND lower(table_name) like lower(concat('%', #{tableName}, '%'))
        </if>
        <if test="tableComment != null and tableComment != ''">
            AND lower(table_comment) like lower(concat('%', #{tableComment}, '%'))
        </if>
        <if test="params.beginTime != null and params.beginTime != ''"><!-- å¼€å§‹æ—¶é—´æ£€ç´¢ -->
            AND date_format(create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
        </if>
        <if test="params.endTime != null and params.endTime != ''"><!-- ç»“束时间检索 -->
            AND date_format(create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
        </if>
    </select>
        <include refid="selectGenTableVo"/>
        <where>
            <if test="orgid != null and orgid != ''">
                AND orgid = #{orgid}
            </if>
            <if test="tableName != null and tableName != ''">
                AND lower(table_name) like lower(concat('%', #{tableName}, '%'))
            </if>
            <if test="tableComment != null and tableComment != ''">
                AND lower(table_comment) like lower(concat('%', #{tableComment}, '%'))
            </if>
            <if test="params.beginTime != null and params.beginTime != ''"><!-- å¼€å§‹æ—¶é—´æ£€ç´¢ -->
                AND date_format(create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
            </if>
            <if test="params.endTime != null and params.endTime != ''"><!-- ç»“束时间检索 -->
                AND date_format(create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
            </if>
        </where>
    </select>
    <select id="selectDbTableList" parameterType="GenTable" resultMap="GenTableResult">
        select table_name, table_comment, create_time, update_time from information_schema.tables
smartor/src/main/java/com/smartor/domain/ServiceTaskRule.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
package com.smartor.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * ä»»åŠ¡æ‰§è¡Œè§„åˆ™å¯¹è±¡ service_task_rule
 *
 * @author lihu
 * @date 2026-05-15
 */
@Data
@ApiModel("任务执行规则")
public class ServiceTaskRule extends BaseEntity
        {
private static final long serialVersionUID = 1L;
    /** ä»»åŠ¡ID */
    @ApiModelProperty("任务ID")
        //数据库自增改成@TableId(type = IdType.AUTO)
    private Long id;
    /** éƒ¨é—¨è§„则(1首先执行   2次要执行) */
    @ApiModelProperty("部门规则(1首先执行   2次要执行)")
     @Excel(name = "部门规则", readConverterExp = "1=首先执行,2=次要执行")
    private String deptRule;
    /** ç—…区规则(1首先执行   2次要执行) */
    @ApiModelProperty("病区规则(1首先执行   2次要执行)")
     @Excel(name = "病区规则", readConverterExp = "1=首先执行,2=次要执行")
    private String wradRule;
    /** ç–¾ç—…规则(1首先执行   2次要执行) */
    @ApiModelProperty("疾病规则(1首先执行   2次要执行)")
     @Excel(name = "疾病规则", readConverterExp = "1=首先执行,2=次要执行")
    private String diagRule;
    /** åˆ é™¤æ ‡å¿—(0:未删除 1:已删除) */
    @ApiModelProperty("删除标志(0:未删除 1:已删除)")
    private String delFlag;
    /** çˆ¶GUID */
    @ApiModelProperty("父GUID")
     @Excel(name = "父GUID")
    private String pguid;
    /** GUID */
    @ApiModelProperty("GUID")
     @Excel(name = "GUID")
    private String guid;
    /** çˆ¶ID */
    @ApiModelProperty("父ID")
     @Excel(name = "父ID")
    private Long pid;
    /** åŒ»é™¢æœºæž„ID */
    @ApiModelProperty("医院机构ID")
     @Excel(name = "医院机构ID")
    private String orgid;
    /** é™¢åŒº */
    @ApiModelProperty("院区")
     @Excel(name = "院区")
    private String campusid;
    /** ä¸Šä¼ æ—¶é—´ */
    @ApiModelProperty("上传时间")
            @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "上传时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date uploadTime;
    /** éƒ¨é—¨ç¼–码 */
    @ApiModelProperty("部门编码")
     @Excel(name = "部门编码")
    private String deptcode;
    /** éƒ¨é—¨ç¼–码名称 */
    @ApiModelProperty("部门编码名称")
     @Excel(name = "部门编码名称")
    private String deptname;
    /** ç—…区编码 */
    @ApiModelProperty("病区编码")
     @Excel(name = "病区编码")
    private String wardcode;
    /** ç—…区编码名称 */
    @ApiModelProperty("病区编码名称")
     @Excel(name = "病区编码名称")
    private String wardname;
        }
smartor/src/main/java/com/smartor/mapper/ServiceTaskRuleMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
package com.smartor.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.smartor.domain.ServiceTaskRule;
/**
 * ä»»åŠ¡æ‰§è¡Œè§„åˆ™Mapper接口
 *
 * @author lihu
 * @date 2026-05-15
 */
@Mapper
public interface ServiceTaskRuleMapper
{
    /**
     * æŸ¥è¯¢ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     *
     * @param id ä»»åŠ¡æ‰§è¡Œè§„åˆ™ä¸»é”®
     * @return ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     */
    public ServiceTaskRule selectServiceTaskRuleById(Long id);
    /**
     * æŸ¥è¯¢ä»»åŠ¡æ‰§è¡Œè§„åˆ™åˆ—è¡¨
     *
     * @param serviceTaskRule ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     * @return ä»»åŠ¡æ‰§è¡Œè§„åˆ™é›†åˆ
     */
    public List<ServiceTaskRule> selectServiceTaskRuleList(ServiceTaskRule serviceTaskRule);
    /**
     * æ–°å¢žä»»åŠ¡æ‰§è¡Œè§„åˆ™
     *
     * @param serviceTaskRule ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     * @return ç»“æžœ
     */
    public int insertServiceTaskRule(ServiceTaskRule serviceTaskRule);
    /**
     * ä¿®æ”¹ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     *
     * @param serviceTaskRule ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     * @return ç»“æžœ
     */
    public int updateServiceTaskRule(ServiceTaskRule serviceTaskRule);
    /**
     * åˆ é™¤ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     *
     * @param id ä»»åŠ¡æ‰§è¡Œè§„åˆ™ä¸»é”®
     * @return ç»“æžœ
     */
    public int deleteServiceTaskRuleById(Long id);
    /**
     * æ‰¹é‡åˆ é™¤ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ•°æ®ä¸»é”®é›†åˆ
     * @return ç»“æžœ
     */
    public int deleteServiceTaskRuleByIds(Long[] ids);
    /**
     * æ ¹æ®ç§‘室编码和病区编码查询任务执行规则
     *
     * @param serviceTaskRule æŸ¥è¯¢æ¡ä»¶ï¼ˆåŒ…含deptcode和wardcode字段)
     * @return ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     */
    public ServiceTaskRule selectServiceTaskRuleByDeptOrWard(ServiceTaskRule serviceTaskRule);
}
smartor/src/main/java/com/smartor/service/IServiceTaskRuleService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.smartor.service;
import java.util.List;
import com.smartor.domain.ServiceTaskRule;
/**
 * ä»»åŠ¡æ‰§è¡Œè§„åˆ™Service接口
 *
 * @author lihu
 * @date 2026-05-15
 */
public interface IServiceTaskRuleService
{
    /**
     * æŸ¥è¯¢ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     *
     * @param id ä»»åŠ¡æ‰§è¡Œè§„åˆ™ä¸»é”®
     * @return ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     */
    public ServiceTaskRule selectServiceTaskRuleById(Long id);
    /**
     * æŸ¥è¯¢ä»»åŠ¡æ‰§è¡Œè§„åˆ™åˆ—è¡¨
     *
     * @param serviceTaskRule ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     * @return ä»»åŠ¡æ‰§è¡Œè§„åˆ™é›†åˆ
     */
    public List<ServiceTaskRule> selectServiceTaskRuleList(ServiceTaskRule serviceTaskRule);
    /**
     * æ–°å¢žä»»åŠ¡æ‰§è¡Œè§„åˆ™
     *
     * @param serviceTaskRule ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     * @return ç»“æžœ
     */
    public int insertServiceTaskRule(ServiceTaskRule serviceTaskRule);
    /**
     * ä¿®æ”¹ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     *
     * @param serviceTaskRule ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     * @return ç»“æžœ
     */
    public int updateServiceTaskRule(ServiceTaskRule serviceTaskRule);
    /**
     * æ‰¹é‡åˆ é™¤ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     *
     * @param ids éœ€è¦åˆ é™¤çš„任务执行规则主键集合
     * @return ç»“æžœ
     */
    public int deleteServiceTaskRuleByIds(Long[] ids);
    /**
     * åˆ é™¤ä»»åŠ¡æ‰§è¡Œè§„åˆ™ä¿¡æ¯
     *
     * @param id ä»»åŠ¡æ‰§è¡Œè§„åˆ™ä¸»é”®
     * @return ç»“æžœ
     */
    public int deleteServiceTaskRuleById(Long id);
}
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -57,6 +57,8 @@
    private PatMedOperationMapper patMedOperationMapper;
    @Autowired
    private PatMedOperationItemMapper patMedOperationItemMapper;
    @Autowired
    private ServiceTaskRuleMapper serviceTaskRuleMapper;
    @Value("${spring.profiles.active}")
    private String active;
@@ -307,27 +309,13 @@
            }
        }
        //2.出院随访
        String generationRule = iSysConfigService.selectConfigByKey("multitask.generation.rule");
        //generationRule    0:所有服务都生成;    1:专病任务优先
        if ("0".equals(generationRule)) {
            //科室任务新增
            addDeptSubTask(config, generationRule);
            //根据患者所在病区,获取该病区的长期任务,新华医院可以先不用根据病区和疾病来做
            if (!active.equals("xh")) {
                addWardSubTask(config, generationRule);
                addIcd10SubTask(config, generationRule);
                addOperationSubTask(config, generationRule);
            }
        //2.出院随访 - åŸºäºŽè§„则的任务生成
        addSubTaskByRule(config);
        //根据患者所在病区,获取该病区的长期任务,新华医院可以先不用根据病区和疾病来做
        if (!active.equals("xh")) {
            addOperationSubTask(config);
        }
        //丽水的特殊要求(需要先执行疾病,如果疾病为空,则执行科室和病区)
        if ("1".equals(generationRule)) {
            addIcd10SubTask(config, generationRule);
            //科室任务新增
            addDeptSubTask(config, generationRule);
            addWardSubTask(config, generationRule);
        }
        //获取未处理在院的数据(如果刚刚出院的患者数据的出院时间,在下面查询出的入院时间之前,那之前的出院患者的数据,也得停掉,因为又入院了)
        PatMedInhosp patMedInhosp = new PatMedInhosp();
@@ -1178,7 +1166,7 @@
        }
    }
    private void addOperationSubTask(String config, String generationRule) {
    private void addOperationSubTask(String config) {
        //            æ‰‹æœ¯éšè®¿
        PatMedOperationItem pmoi = new PatMedOperationItem();
        //获取需要出院疾病随访,未处理的数据
@@ -1223,7 +1211,7 @@
        }
    }
    private void addIcd10SubTask(String config, String generationRule) {
    private void addIcd10SubTask(String config) {
        PatMedInhosp pmjb = new PatMedInhosp();
        //获取需要出院疾病随访,未处理的数据
        pmjb.setDiagcheckFlag("0");
@@ -1314,7 +1302,7 @@
        }
    }
    private void addWardSubTask(String config, String generationRule) {
    private void addWardSubTask(String config) {
        PatMedInhosp pmbq = new PatMedInhosp();
        //获取需要出院部门随访,未处理的数据
        pmbq.setWardcheckFlag("0");
@@ -1383,7 +1371,7 @@
        }
    }
    private void addDeptSubTask(String config, String generationRule) {
    private void addDeptSubTask(String config) {
        //获取需要出院部门随访,未处理的数据
        PatMedInhosp pmks = new PatMedInhosp();
        pmks.setDeptcheckFlag("0");
@@ -1443,5 +1431,264 @@
        }
    }
    /**
     * åŸºäºŽè§„则的任务生成方法
     * æ ¹æ®æ‚£è€…离院科室或病区查询service_task_rule,获取deptRule、wradRule、diagRule
     * æ ¹æ®è§„则值决定调用哪个方法生成随访任务
     */
    private void addSubTaskByRule(String config) {
        // èŽ·å–æ‰€æœ‰éœ€è¦å¤„ç†çš„å‡ºé™¢æ‚£è€…ï¼ˆç§‘å®¤ç»´åº¦æœªå¤„ç†ï¼‰
        PatMedInhosp pmks = new PatMedInhosp();
        pmks.setDeptcheckFlag("0");
        pmks.setInhospstate("1");
        pmks.setFuflag("1");
        List<PatMedInhosp> patMedInhosps = patMedInhospMapper.selectPatMedInhospList(pmks);
        log.info("【基于规则】需要处理的出院患者信息:{}", CollectionUtils.isNotEmpty(patMedInhosps) ? patMedInhosps.size() : null);
        for (PatMedInhosp patMedInhosp1 : patMedInhosps) {
            // èŽ·å–æ‚£è€…åŸºæœ¬ä¿¡æ¯
            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp1.getPatid());
            if (Objects.isNull(patArchive)) {
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("患者基本信息为空");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                continue;
            }
            try {
                // æŸ¥è¯¢è§„则:根据离院科室或病区
                ServiceTaskRule ruleQuery = new ServiceTaskRule();
                ruleQuery.setDeptcode(patMedInhosp1.getLeaveldeptcode());
                ruleQuery.setWardcode(patMedInhosp1.getLeavehospitaldistrictcode());
                ServiceTaskRule rule = serviceTaskRuleMapper.selectServiceTaskRuleByDeptOrWard(ruleQuery);
                if (rule == null) {
                    // è§„则为空,全部生成
                    log.info("【基于规则】患者{}未配置规则,执行全部生成逻辑", patMedInhosp1.getInhospid());
                    addDeptSubTaskForPatient(patMedInhosp1, patArchive, config);
                    if (!active.equals("xh")) {
                        addWardSubTaskForPatient(patMedInhosp1, patArchive, config);
                        addIcd10SubTaskForPatient(patMedInhosp1, patArchive, config);
                    }
                } else {
                    // æœ‰è§„则,按规则执行
                    log.info("【基于规则】患者{}查询到规则:deptRule={}, wradRule={}, diagRule={}", patMedInhosp1.getInhospid(), rule.getDeptRule(), rule.getWradRule(), rule.getDiagRule());
                    // åˆ¤æ–­æ˜¯å¦æœ‰è§„则为"1"(首先执行)
                    boolean hasPrimaryRule = "1".equals(rule.getDeptRule()) || "1".equals(rule.getWradRule()) || "1".equals(rule.getDiagRule());
                    if (hasPrimaryRule) {
                        // æœ‰é¦–要规则,只执行首要规则对应的方法
                        int generatedCount = 0;
                        // æŒ‰é¡ºåºï¼šç§‘室 -> ç—…区 -> ç–¾ç—…
                        if ("1".equals(rule.getDeptRule())) {
                            log.info("【基于规则】执行科室首要规则");
                            generatedCount += addDeptSubTaskForPatient(patMedInhosp1, patArchive, config);
                        }
                        if (!active.equals("xh")) {
                            if ("1".equals(rule.getWradRule())) {
                                log.info("【基于规则】执行病区首要规则");
                                generatedCount += addWardSubTaskForPatient(patMedInhosp1, patArchive, config);
                            }
                            if ("1".equals(rule.getDiagRule())) {
                                log.info("【基于规则】执行疾病首要规则");
                                generatedCount += addIcd10SubTaskForPatient(patMedInhosp1, patArchive, config);
                            }
                        }
                        // å¦‚果首要规则生成的子任务为空,则调用其他次要规则的方法
                        if (generatedCount == 0) {
                            log.info("【基于规则】首要规则未生成子任务,开始执行次要规则");
                            if (!"1".equals(rule.getDeptRule()) && StringUtils.isNotEmpty(rule.getDeptRule())) {
                                log.info("【基于规则】执行科室次要规则");
                                addDeptSubTaskForPatient(patMedInhosp1, patArchive, config);
                            }
                            if (!active.equals("xh")) {
                                if (!"1".equals(rule.getWradRule()) && StringUtils.isNotEmpty(rule.getWradRule())) {
                                    log.info("【基于规则】执行病区次要规则");
                                    addWardSubTaskForPatient(patMedInhosp1, patArchive, config);
                                }
                                if (!"1".equals(rule.getDiagRule()) && StringUtils.isNotEmpty(rule.getDiagRule())) {
                                    log.info("【基于规则】执行疾病次要规则");
                                    addIcd10SubTaskForPatient(patMedInhosp1, patArchive, config);
                                }
                            }
                        }
                    } else {
                        // æ²¡æœ‰é¦–要规则(都是"2"或其他),全部生成
                        log.info("【基于规则】无首要规则,执行全部生成逻辑");
                        addDeptSubTaskForPatient(patMedInhosp1, patArchive, config);
                        if (!active.equals("xh")) {
                            addWardSubTaskForPatient(patMedInhosp1, patArchive, config);
                            addIcd10SubTaskForPatient(patMedInhosp1, patArchive, config);
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("【基于规则】患者{}处理异常:{}", patMedInhosp1.getInhospid(), e.getMessage());
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("基于规则处理异常:" + e.getMessage());
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            }
        }
    }
    /**
     * ä¸ºå•个患者生成科室维度的子任务
     *
     * @return ç”Ÿæˆçš„子任务数量
     */
    private int addDeptSubTaskForPatient(PatMedInhosp patMedInhosp1, PatArchive patArchive, String config) {
        int generatedCount = 0;
        try {
            //根据患者所在科室,获取该科室的长期任务
            ServiceTaskdept serviceTaskdept = new ServiceTaskdept();
            serviceTaskdept.setLongtask(1L);
            serviceTaskdept.setDeptCode(patMedInhosp1.getLeaveldeptcode());
            serviceTaskdept.setDeptType("1");
            serviceTaskdept.setServiceType("2");
            serviceTaskdept.setOrgid(patMedInhosp1.getOrgid());
            List<ServiceTaskdept> serviceTaskdepts = serviceTaskdeptMapper.selectServiceTaskdeptList(serviceTaskdept);
            if (CollectionUtils.isEmpty(serviceTaskdepts)) {
                PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason(patMedInhosp.getLongTaskReason() + "该患者所在科室未配置离院长期任务;");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            } else {
                for (ServiceTaskdept serviceTaskdept1 : serviceTaskdepts) {
                    writeInSubTask(serviceTaskdept1.getTaskId(), true, patMedInhosp1, patArchive, 1, config);
                    generatedCount++;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("【科室任务】患者{}处理异常:{}", patMedInhosp1.getInhospid(), e.getMessage());
            patMedInhosp1.setDeptcheckFlag("2");
            patMedInhosp1.setLongTaskReason("科室任务处理异常:" + e.getMessage());
            patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
        }
        return generatedCount;
    }
    /**
     * ä¸ºå•个患者生成病区维度的子任务
     *
     * @return ç”Ÿæˆçš„子任务数量
     */
    private int addWardSubTaskForPatient(PatMedInhosp patMedInhosp1, PatArchive patArchive, String config) {
        int generatedCount = 0;
        try {
            String errorreason = null;
            List<ServiceTaskdept> serviceTaskdeptList = null;
            if (!StringUtils.isEmpty(patMedInhosp1.getLeavehospitaldistrictcode())) {
                ServiceTaskdept serviceTaskdept = new ServiceTaskdept();
                serviceTaskdept.setLongtask(1L);
                serviceTaskdept.setDeptCode(patMedInhosp1.getLeavehospitaldistrictcode());
                serviceTaskdept.setDeptType("2");
                serviceTaskdept.setServiceType("2");
                serviceTaskdept.setOrgid(patMedInhosp1.getOrgid());
                serviceTaskdeptList = serviceTaskdeptMapper.selectServiceTaskdeptList(serviceTaskdept);
                if (CollectionUtils.isEmpty(serviceTaskdeptList)) {
                    errorreason = "该患者所在病区未配置长期任务;";
                }
            } else {
                errorreason = "离院病区为空;";
            }
            if (StringUtils.isNotEmpty(errorreason)) {
                PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                patMedInhosp1.setWardcheckFlag("2");
                patMedInhosp1.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + errorreason : errorreason);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            } else {
                for (ServiceTaskdept serviceTaskdept1 : serviceTaskdeptList) {
                    writeInSubTask(serviceTaskdept1.getTaskId(), true, patMedInhosp1, patArchive, 2, config);
                    generatedCount++;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("【病区任务】患者{}处理异常:{}", patMedInhosp1.getInhospid(), e.getMessage());
            patMedInhosp1.setWardcheckFlag("2");
            patMedInhosp1.setLongTaskReason("病区任务处理异常:" + e.getMessage());
            patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
        }
        return generatedCount;
    }
    /**
     * ä¸ºå•个患者生成疾病维度的子任务
     *
     * @return ç”Ÿæˆçš„子任务数量
     */
    private int addIcd10SubTaskForPatient(PatMedInhosp patMedInhosp1, PatArchive patArchive, String config) {
        int generatedCount = 0;
        try {
            if (StringUtils.isEmpty(patMedInhosp1.getLeaveicd10code())) {
                return 0;
            }
            ServiceTaskdiag serviceTaskdiag = new ServiceTaskdiag();
            serviceTaskdiag.setLongtask(1L);
            serviceTaskdiag.setServiceType("2");
            if (active.equals("nhfy")) {
                serviceTaskdiag.setIcd10name(patMedInhosp1.getLeavediagname());
                if (StringUtils.isEmpty(patMedInhosp1.getLeavediagname())) {
                    PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                    patMedInhosp1.setDiagcheckFlag("2");
                    patMedInhosp1.setLongTaskReason("该患者主诊断名称为空;");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                    return 0;
                }
            } else {
                serviceTaskdiag.setIcd10code(patMedInhosp1.getLeaveicd10code());
            }
            serviceTaskdiag.setOrgid(patMedInhosp1.getOrgid());
            List<ServiceTaskdiag> serviceTaskdiags = serviceTaskdiagMapper.selectServiceTaskdiagListByIcdName(serviceTaskdiag);
            if (CollectionUtils.isEmpty(serviceTaskdiags)) {
                PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                patMedInhosp1.setDiagcheckFlag("2");
                patMedInhosp1.setLongTaskReason("该患者所患疾病未配置长期任务;");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            } else {
                int flag = 0;
                for (ServiceTaskdiag serviceTaskdiag1 : serviceTaskdiags) {
                    if (StringUtils.isNotEmpty(serviceTaskdiag1.getDeptCode()) && serviceTaskdiag1.getDeptCode().equals(patMedInhosp1.getLeaveldeptcode())) {
                        writeInSubTask(serviceTaskdiag1.getTaskId(), true, patMedInhosp1, patArchive, 3, config);
                        generatedCount++;
                        flag = 1;
                    } else if (StringUtils.isNotEmpty(serviceTaskdiag1.getWardCode()) && serviceTaskdiag1.getWardCode().equals(patMedInhosp1.getLeavehospitaldistrictcode())) {
                        writeInSubTask(serviceTaskdiag1.getTaskId(), true, patMedInhosp1, patArchive, 3, config);
                        generatedCount++;
                        flag = 1;
                    }
                }
                if (flag == 0) {
                    log.error("该科室或病区对于患者所患疾病未配置长期任务,患者:{}", patMedInhosp1.getInhospid());
                    PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                    patMedInhosp1.setDiagcheckFlag("2");
                    patMedInhosp1.setLongTaskReason("该科室或病区对于患者所患疾病未配置长期任务;");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("【疾病任务】患者{}处理异常:{}", patMedInhosp1.getInhospid(), e.getMessage());
            patMedInhosp1.setDiagcheckFlag("2");
            patMedInhosp1.setLongTaskReason("疾病任务处理异常:" + e.getMessage());
            patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
        }
        return generatedCount;
    }
}
smartor/src/main/java/com/smartor/service/impl/ServiceTaskRuleServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package com.smartor.service.impl;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.smartor.mapper.ServiceTaskRuleMapper;
import com.smartor.domain.ServiceTaskRule;
import com.smartor.service.IServiceTaskRuleService;
/**
 * ä»»åŠ¡æ‰§è¡Œè§„åˆ™Service业务层处理
 *
 * @author lihu
 * @date 2026-05-15
 */
@Service
public class ServiceTaskRuleServiceImpl implements IServiceTaskRuleService
{
    @Autowired
    private ServiceTaskRuleMapper serviceTaskRuleMapper;
    /**
     * æŸ¥è¯¢ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     *
     * @param id ä»»åŠ¡æ‰§è¡Œè§„åˆ™ä¸»é”®
     * @return ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     */
    @Override
    public ServiceTaskRule selectServiceTaskRuleById(Long id)
    {
        return serviceTaskRuleMapper.selectServiceTaskRuleById(id);
    }
    /**
     * æŸ¥è¯¢ä»»åŠ¡æ‰§è¡Œè§„åˆ™åˆ—è¡¨
     *
     * @param serviceTaskRule ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     * @return ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     */
    @Override
    public List<ServiceTaskRule> selectServiceTaskRuleList(ServiceTaskRule serviceTaskRule)
    {
        return serviceTaskRuleMapper.selectServiceTaskRuleList(serviceTaskRule);
    }
    /**
     * æ–°å¢žä»»åŠ¡æ‰§è¡Œè§„åˆ™
     *
     * @param serviceTaskRule ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     * @return ç»“æžœ
     */
    @Override
    public int insertServiceTaskRule(ServiceTaskRule serviceTaskRule)
    {
        serviceTaskRule.setCreateTime(DateUtils.getNowDate());
        return serviceTaskRuleMapper.insertServiceTaskRule(serviceTaskRule);
    }
    /**
     * ä¿®æ”¹ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     *
     * @param serviceTaskRule ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     * @return ç»“æžœ
     */
    @Override
    public int updateServiceTaskRule(ServiceTaskRule serviceTaskRule)
    {
        serviceTaskRule.setUpdateTime(DateUtils.getNowDate());
        return serviceTaskRuleMapper.updateServiceTaskRule(serviceTaskRule);
    }
    /**
     * æ‰¹é‡åˆ é™¤ä»»åŠ¡æ‰§è¡Œè§„åˆ™
     *
     * @param ids éœ€è¦åˆ é™¤çš„任务执行规则主键
     * @return ç»“æžœ
     */
    @Override
    public int deleteServiceTaskRuleByIds(Long[] ids)
    {
        return serviceTaskRuleMapper.deleteServiceTaskRuleByIds(ids);
    }
    /**
     * åˆ é™¤ä»»åŠ¡æ‰§è¡Œè§„åˆ™ä¿¡æ¯
     *
     * @param id ä»»åŠ¡æ‰§è¡Œè§„åˆ™ä¸»é”®
     * @return ç»“æžœ
     */
    @Override
    public int deleteServiceTaskRuleById(Long id)
    {
        return serviceTaskRuleMapper.deleteServiceTaskRuleById(id);
    }
}
smartor/src/main/resources/mapper/smartor/ServiceTaskRuleMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,263 @@
<?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.smartor.mapper.ServiceTaskRuleMapper">
    <resultMap type="com.smartor.domain.ServiceTaskRule" id="ServiceTaskRuleResult">
            <result property="id" column="id"/>
            <result property="deptRule" column="dept_rule"/>
            <result property="wradRule" column="wrad_rule"/>
            <result property="diagRule" column="diag_rule"/>
            <result property="delFlag" column="del_flag"/>
            <result property="pguid" column="pguid"/>
            <result property="guid" column="guid"/>
            <result property="pid" column="pid"/>
            <result property="orgid" column="orgid"/>
            <result property="campusid" column="campusid"/>
            <result property="uploadTime" column="upload_time"/>
            <result property="createBy" column="create_by"/>
            <result property="createTime" column="create_time"/>
            <result property="updateBy" column="update_by"/>
            <result property="updateTime" column="update_time"/>
            <result property="deptcode" column="deptcode"/>
            <result property="deptname" column="deptname"/>
            <result property="wardcode" column="wardcode"/>
            <result property="wardname" column="wardname"/>
    </resultMap>
    <sql id="selectServiceTaskRuleVo">
        select id, dept_rule, wrad_rule, diag_rule, del_flag, pguid, guid, pid, orgid, campusid, upload_time, create_by, create_time, update_by, update_time, deptcode, deptname, wardcode, wardname
        from service_task_rule
    </sql>
    <select id="selectServiceTaskRuleList" parameterType="com.smartor.domain.ServiceTaskRule"
            resultMap="ServiceTaskRuleResult">
        <include refid="selectServiceTaskRuleVo"/>
        where 1=1
            and del_flag=0
                        <if test="deptRule != null  and deptRule != ''">
                            and dept_rule = #{deptRule}
                        </if>
                        <if test="wradRule != null  and wradRule != ''">
                            and wrad_rule = #{wradRule}
                        </if>
                        <if test="diagRule != null  and diagRule != ''">
                            and diag_rule = #{diagRule}
                        </if>
                        <if test="pguid != null  and pguid != ''">
                            and pguid = #{pguid}
                        </if>
                        <if test="guid != null  and guid != ''">
                            and guid = #{guid}
                        </if>
                        <if test="pid != null ">
                            and pid = #{pid}
                        </if>
                        <if test="orgid != null  and orgid != ''">
                            and orgid = #{orgid}
                        </if>
                        <if test="campusid != null  and campusid != ''">
                            and campusid = #{campusid}
                        </if>
                        <if test="uploadTime != null ">
                            and upload_time = #{uploadTime}
                        </if>
                        <if test="deptcode != null  and deptcode != ''">
                            and deptcode = #{deptcode}
                        </if>
                        <if test="deptname != null  and deptname != ''">
                            and deptname like concat('%', #{deptname}, '%')
                        </if>
                        <if test="wardcode != null  and wardcode != ''">
                            and wardcode = #{wardcode}
                        </if>
                        <if test="wardname != null  and wardname != ''">
                            and wardname like concat('%', #{wardname}, '%')
                        </if>
    </select>
    <select id="selectServiceTaskRuleById" parameterType="Long"
            resultMap="ServiceTaskRuleResult">
            <include refid="selectServiceTaskRuleVo"/>
            where id = #{id}
    </select>
    <select id="selectServiceTaskRuleByDeptOrWard" parameterType="com.smartor.domain.ServiceTaskRule"
            resultMap="ServiceTaskRuleResult">
            <include refid="selectServiceTaskRuleVo"/>
            where del_flag = 0
            and (
                (deptcode = #{deptcode} and deptcode is not null and deptcode != '')
                or
                (wardcode = #{wardcode} and wardcode is not null and wardcode != '')
            )
            order by
                case when deptcode = #{deptcode} then 0 else 1 end
            limit 1
    </select>
    <insert id="insertServiceTaskRule" parameterType="com.smartor.domain.ServiceTaskRule"            useGeneratedKeys="true" keyProperty="id">
        insert into service_task_rule
        <trim prefix="(" suffix=")" suffixOverrides=",">
                    <if test="deptRule != null">dept_rule,
                    </if>
                    <if test="wradRule != null">wrad_rule,
                    </if>
                    <if test="diagRule != null">diag_rule,
                    </if>
                    <if test="delFlag != null">del_flag,
                    </if>
                    <if test="pguid != null">pguid,
                    </if>
                    <if test="guid != null">guid,
                    </if>
                    <if test="pid != null">pid,
                    </if>
                    <if test="orgid != null">orgid,
                    </if>
                    <if test="campusid != null">campusid,
                    </if>
                    <if test="uploadTime != null">upload_time,
                    </if>
                    <if test="createBy != null">create_by,
                    </if>
                    <if test="createTime != null">create_time,
                    </if>
                    <if test="updateBy != null">update_by,
                    </if>
                    <if test="updateTime != null">update_time,
                    </if>
                    <if test="deptcode != null">deptcode,
                    </if>
                    <if test="deptname != null">deptname,
                    </if>
                    <if test="wardcode != null">wardcode,
                    </if>
                    <if test="wardname != null">wardname,
                    </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
                    <if test="deptRule != null">#{deptRule},
                    </if>
                    <if test="wradRule != null">#{wradRule},
                    </if>
                    <if test="diagRule != null">#{diagRule},
                    </if>
                    <if test="delFlag != null">#{delFlag},
                    </if>
                    <if test="pguid != null">#{pguid},
                    </if>
                    <if test="guid != null">#{guid},
                    </if>
                    <if test="pid != null">#{pid},
                    </if>
                    <if test="orgid != null">#{orgid},
                    </if>
                    <if test="campusid != null">#{campusid},
                    </if>
                    <if test="uploadTime != null">#{uploadTime},
                    </if>
                    <if test="createBy != null">#{createBy},
                    </if>
                    <if test="createTime != null">#{createTime},
                    </if>
                    <if test="updateBy != null">#{updateBy},
                    </if>
                    <if test="updateTime != null">#{updateTime},
                    </if>
                    <if test="deptcode != null">#{deptcode},
                    </if>
                    <if test="deptname != null">#{deptname},
                    </if>
                    <if test="wardcode != null">#{wardcode},
                    </if>
                    <if test="wardname != null">#{wardname},
                    </if>
        </trim>
    </insert>
    <update id="updateServiceTaskRule" parameterType="com.smartor.domain.ServiceTaskRule">
        update service_task_rule
        <trim prefix="SET" suffixOverrides=",">
                    <if test="deptRule != null">dept_rule =
                        #{deptRule},
                    </if>
                    <if test="wradRule != null">wrad_rule =
                        #{wradRule},
                    </if>
                    <if test="diagRule != null">diag_rule =
                        #{diagRule},
                    </if>
                    <if test="delFlag != null">del_flag =
                        #{delFlag},
                    </if>
                    <if test="pguid != null">pguid =
                        #{pguid},
                    </if>
                    <if test="guid != null">guid =
                        #{guid},
                    </if>
                    <if test="pid != null">pid =
                        #{pid},
                    </if>
                    <if test="orgid != null">orgid =
                        #{orgid},
                    </if>
                    <if test="campusid != null">campusid =
                        #{campusid},
                    </if>
                    <if test="uploadTime != null">upload_time =
                        #{uploadTime},
                    </if>
                    <if test="createBy != null">create_by =
                        #{createBy},
                    </if>
                    <if test="createTime != null">create_time =
                        #{createTime},
                    </if>
                    <if test="updateBy != null">update_by =
                        #{updateBy},
                    </if>
                    <if test="updateTime != null">update_time =
                        #{updateTime},
                    </if>
                    <if test="deptcode != null">deptcode =
                        #{deptcode},
                    </if>
                    <if test="deptname != null">deptname =
                        #{deptname},
                    </if>
                    <if test="wardcode != null">wardcode =
                        #{wardcode},
                    </if>
                    <if test="wardname != null">wardname =
                        #{wardname},
                    </if>
        </trim>
        where id = #{id}
    </update>
                <update id="deleteServiceTaskRuleById" parameterType="Long">
        update service_task_rule
        <trim prefix="SET" suffixOverrides=",">
            del_flag =1
        </trim>
        where  id = #{id}
    </update>
                            <update id="deleteServiceTaskRuleByIds" parameterType="String">
        update  service_task_rule
        <trim prefix="SET" suffixOverrides=",">
            del_flag =1
        </trim>
        where id in
        <foreach item="id" collection="array" open="(" separator="," close=")">
            #{id}
        </foreach>
    </update>
</mapper>