陈昶聿
12 小时以前 6ca5681ce55056d2a298ea9917d3ffedb97a50e7
【丽水】collectUser\collectDept 同步调整
已修改5个文件
134 ■■■■■ 文件已修改
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/CollectHISController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ICollectHISService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
@@ -258,6 +258,18 @@
    @ApiModelProperty("满意度分类(问卷/语音)")
    private Map<String, Object> satisfactionCategories = new HashMap<>();
    /**
     * HIS增量同步开始时间(对应 healthy_user.last_Update_Time)
     */
    @ApiModelProperty("同步开始时间,格式:yyyy-MM-dd HH:mm:ss")
    private String lastStartTime;
    /**
     * HIS增量同步结束时间(对应 healthy_user.last_Update_Time)
     */
    @ApiModelProperty("同步结束时间,格式:yyyy-MM-dd HH:mm:ss")
    private String lastEndTime;
    public SysUser() {
ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/CollectHISController.java
@@ -51,13 +51,16 @@
    }
    /**
     * 用户信息集合信息数据采集
     * 用户信息集合信息数据采集(异步执行,接口立即返回)
     */
    @PostMapping("/collectUser")
    @ApiOperation("同步用户信息")
    public AjaxResult selectUserList(@RequestBody SysUser sysUser) {
        Integer integer = ichService.selectUserList(sysUser);
        return AjaxResult.success(integer);
        boolean submitted = ichService.selectUserListAsync(sysUser);
        if (!submitted) {
            return AjaxResult.warn("用户信息同步任务正在执行中,请勿重复提交");
        }
        return AjaxResult.success("用户信息同步任务已提交,后台执行中,请通过日志查看进度");
    }
    /**
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ICollectHISService.java
@@ -66,6 +66,14 @@
    public Integer selectUserList(SysUser sysUser);
    /**
     * 异步同步用户信息(提交后立即返回,由后台线程执行)
     *
     * @param sysUser 用户信息
     * @return true=已提交;false=已有同步任务在执行
     */
    public boolean selectUserListAsync(SysUser sysUser);
    /**
     * 查询部门管理数据
     *
     * @param dept 部门信息
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java
@@ -26,6 +26,7 @@
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -76,6 +77,11 @@
    @Autowired
    private RedisCache redisCache;
    /**
     * 用户同步任务运行标记,避免重复点击/重复调用并发跑全量同步
     */
    private final AtomicBoolean userSyncRunning = new AtomicBoolean(false);
    private static final long SHARDING_THRESHOLD = 5_000_000L;
    private static final String PAT_ARCHIVE_TABLE = "pat_archive";
@@ -703,6 +709,39 @@
        return size;
    }
    /**
     * 异步同步用户信息:接口立即返回,实际同步交给线程池后台执行。
     * 使用 AtomicBoolean 防止重复提交导致多个全量同步任务并发执行。
     */
    @Override
    public boolean selectUserListAsync(SysUser sysUser) {
        if (!userSyncRunning.compareAndSet(false, true)) {
            log.warn("用户信息同步任务正在执行中,忽略本次提交");
            return false;
        }
        try {
            taskExecutor.execute(() -> {
                long start = System.currentTimeMillis();
                log.info("用户信息异步同步任务开始执行");
                try {
                    Integer count = selectUserList(sysUser);
                    log.info("用户信息异步同步任务执行完成,处理数量:{},耗时:{}ms",
                            count, System.currentTimeMillis() - start);
                } catch (Throwable e) {
                    log.error("用户信息异步同步任务执行失败,耗时:{}ms",
                            System.currentTimeMillis() - start, e);
                } finally {
                    userSyncRunning.set(false);
                }
            });
            return true;
        } catch (RuntimeException e) {
            userSyncRunning.set(false);
            log.error("用户信息异步同步任务提交失败", e);
            return false;
        }
    }
    @Override
    public Integer selectUserList(SysUser sysUser) {
        List<SysUser> sysUserList = chMapper.selectUserList(sysUser);
ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml
@@ -488,27 +488,41 @@
    </select>
    <select id="yhyksxx" parameterType="com.ruoyi.common.core.domain.entity.SysUser" resultMap="SysUserDeptResult">
        select user_id , user_code , dept_type ,dept_code,dept_name,deptparent,del_flag,orgid
        FROM healthy_user_dept
        select ud.user_id , ud.user_code , ud.dept_type ,ud.dept_code,ud.dept_name,ud.deptparent,ud.del_flag,ud.orgid
        FROM healthy_user_dept ud
        where 1=1
        and user_id != 'admin'
        and dept_type = '1'
        and ud.user_id != 'admin'
        and ud.dept_type = '1'
        <if test="orgid != null and orgid != ''">
            AND orgid = #{orgid}
            AND ud.orgid = #{orgid}
        </if>
        <if test="hisUserId != null ">and user_id = #{hisUserId}</if>
        <if test="hisUserId != null ">and ud.user_id = #{hisUserId}</if>
        <if test="campusid != null and campusid != ''">
            AND EXISTS (
                SELECT 1 FROM healthy_dept d
                WHERE d.his_dept_id = ud.dept_code
                  AND d.orgid = #{campusid}
            )
        </if>
    </select>
    <select id="yhybfxx" parameterType="com.ruoyi.common.core.domain.entity.SysUser" resultMap="SysUserDeptResult">
        select user_id , user_code , dept_type ,dept_code,dept_name,deptparent,del_flag,orgid
        FROM healthy_user_dept
        select ud.user_id , ud.user_code , ud.dept_type ,ud.dept_code,ud.dept_name,ud.deptparent,ud.del_flag,ud.orgid
        FROM healthy_user_dept ud
        where 1=1
        and user_id != 'admin'
        and dept_type = '2'
        and ud.user_id != 'admin'
        and ud.dept_type = '2'
        <if test="orgid != null and orgid != ''">
            AND orgid = #{orgid}
            AND ud.orgid = #{orgid}
        </if>
        <if test="hisUserId != null ">and user_id = #{hisUserId}</if>
        <if test="hisUserId != null ">and ud.user_id = #{hisUserId}</if>
        <if test="campusid != null and campusid != ''">
            AND EXISTS (
                SELECT 1 FROM healthy_dept d
                WHERE d.his_dept_id = ud.dept_code
                  AND d.orgid = #{campusid}
            )
        </if>
    </select>
    <select id="yhyyqxx" parameterType="com.ruoyi.common.core.domain.entity.SysUser" resultMap="SysUserOrgResult">
@@ -526,7 +540,7 @@
        <if test="hisUserId != null ">
            AND ud.user_id = #{hisUserId}
        </if>
        <if test="campusid != null">
        <if test="campusid != null and campusid != ''">
            AND d.orgid = #{campusid}
        </if>
        union all
@@ -544,7 +558,7 @@
        <if test="hisUserId != null ">
            AND udb.user_id = #{hisUserId}
        </if>
        <if test="campusid != null">
        <if test="campusid != null and campusid != ''">
            AND d.orgid = #{campusid}
        </if>
    </select>
@@ -769,6 +783,30 @@
            <if test="orgid != null and orgid != ''">
                AND u.orgid = #{orgid}
            </if>
            <if test="lastStartTime != null and lastStartTime != ''">
                AND u.last_Update_Time &gt;= to_date(#{lastStartTime}, 'YYYY-MM-DD HH24:MI:SS')
            </if>
            <if test="lastEndTime != null and lastEndTime != ''">
                AND u.last_Update_Time &lt;= to_date(#{lastEndTime}, 'YYYY-MM-DD HH24:MI:SS')
            </if>
            <if test="campusid != null and campusid != ''">
                AND (
                    EXISTS (
                        SELECT 1
                        FROM healthy_user_dept ud
                        JOIN healthy_dept d ON d.his_dept_id = ud.dept_code
                        WHERE ud.user_id = u.his_user_id
                          AND d.orgid = #{campusid}
                    )
                    OR EXISTS (
                        SELECT 1
                        FROM healthy_user_dept_bf udb
                        JOIN healthy_dept d2 ON d2.his_dept_id = udb.dept_code
                        WHERE udb.user_id = u.his_user_id
                          AND d2.orgid = #{campusid}
                    )
                )
            </if>
            <if test="userId != null and userId != 0">
                AND u.user_id = #{userId}
            </if>