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 >= to_date(#{lastStartTime}, 'YYYY-MM-DD HH24:MI:SS') </if> <if test="lastEndTime != null and lastEndTime != ''"> AND u.last_Update_Time <= 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>