diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java index 0bf690a8ea..8bea28a618 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java @@ -217,6 +217,8 @@ public enum EpmetErrorCode { CUSTOMER_CATEGORY(9101,"分类已使用,不允许删除"), CATEGORY_NAME(9102,"分类名称已存在,不允许重复"), + EXIST_SYNC_JOB_ERROR(9103,"存在同步任务"), + OTHER_SYNC_JOB_ERROR(9104,"同步任务已提交,请稍后查看数据"), // open api异常 OPEN_API_UNAUTHENTICATED(10100, "请求未认证"), diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/NatInfoScanTask.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/NatInfoScanTask.java index f141cc818a..e50793f551 100644 --- a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/NatInfoScanTask.java +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/NatInfoScanTask.java @@ -30,11 +30,34 @@ public class NatInfoScanTask implements ITask { if (StringUtils.isNotBlank(params)) { formDTO = JSON.parseObject(params, DataSyncTaskParam.class); } - Result result = userOpenFeignClient.natInfoScanTask(formDTO); + /*Result result = userOpenFeignClient.dataSyncForYanTaiTask(formDTO); if (result.success()) { log.info("NatInfoScanTask定时任务执行成功"); } else { log.error("NatInfoScanTask定时任务执行失败:" + result.getMsg()); + }*/ + // 核酸检测 + Result natResult = userOpenFeignClient.natInfoScanTask(formDTO); + if (natResult.success()) { + log.info("NatInfoScanTask定时任务执行成功"); + } else { + log.error("NatInfoScanTask定时任务执行失败:" + natResult.getMsg()); + } + + // 死亡 + Result deathResult = userOpenFeignClient.deathInfoScanTask(formDTO); + if (deathResult.success()) { + log.info("deathInfoScanTask定时任务执行成功"); + } else { + log.error("deathInfoScanTask定时任务执行失败:" + deathResult.getMsg()); + } + + // 残疾 + Result disabilityResult = userOpenFeignClient.disabilityInfoScanTask(formDTO); + if (disabilityResult.success()) { + log.info("disabilityInfoScanTask定时任务执行成功"); + } else { + log.error("disabilityInfoScanTask定时任务执行失败:" + disabilityResult.getMsg()); } } } diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcSyncJobDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcSyncJobDTO.java new file mode 100644 index 0000000000..320acd13b9 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcSyncJobDTO.java @@ -0,0 +1,89 @@ +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 同步任务表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2022-11-08 + */ +@Data +public class IcSyncJobDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private String id; + + /** + * 客户ID + */ + private String customerId; + + /** + * 组织ID + */ + private String orgId; + + /** + * 组织ID的上级 + */ + private String pid; + + /** + * 组织ID的所有上级,包括org_id + */ + private String orgIdPath; + + /** + * 任务类型,残疾:disability;死亡:death;核酸:nat; + */ + private String jobType; + + /** + * 操作员ID【staffId】 + */ + private String operatorId; + + /** + * 操作状态,等待中:waiting;进行中:processing;结束:finish + */ + private String operationStatus; + + /** + * + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DataSyncTaskParam.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DataSyncTaskParam.java index 00134f6c45..215ffabf28 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DataSyncTaskParam.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DataSyncTaskParam.java @@ -47,4 +47,6 @@ public class DataSyncTaskParam implements Serializable { */ private String agencyId = null; private String dataCode; + + private String staffId; } diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java index 9abd3a1073..b24a4a9651 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java @@ -922,8 +922,8 @@ public interface EpmetUserOpenFeignClient { @PostMapping("/epmetuser/userbaseinfo/dingResiLogin") Result dingResiLogin(@RequestBody DingLoginResiFormDTO formDTO); - @PostMapping("/epmetuser/dataSyncConfig/natInfoScanTask") - Result natInfoScanTask(@RequestBody DataSyncTaskParam formDTO); + @PostMapping("/epmetuser/dataSyncConfig/dataSyncForYanTaiTask") + Result dataSyncForYanTaiTask(@RequestBody DataSyncTaskParam formDTO); /** * Desc: 客户下所有工作人员放缓存 @@ -943,4 +943,13 @@ public interface EpmetUserOpenFeignClient { */ @PostMapping("/epmetuser/registerrelation/getAllResiByGrid") Result getAllResiByGrid(@RequestBody AllResiByGridFormDTO formDTO); + + @PostMapping("/epmetuser/dataSyncConfig/natInfoScanTask") + Result natInfoScanTask(@RequestBody DataSyncTaskParam formDTO); + + @PostMapping("/epmetuser/dataSyncConfig/deathInfoScanTask") + Result deathInfoScanTask(@RequestBody DataSyncTaskParam formDTO); + + @PostMapping("/epmetuser/dataSyncConfig/disabilityInfoScanTask") + Result disabilityInfoScanTask(@RequestBody DataSyncTaskParam formDTO); } diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java index 2e198c04d9..b675a7626b 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java @@ -713,8 +713,8 @@ public class EpmetUserOpenFeignClientFallback implements EpmetUserOpenFeignClien } @Override - public Result natInfoScanTask(DataSyncTaskParam formDTO) { - return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "natInfoScanTask", formDTO); + public Result dataSyncForYanTaiTask(DataSyncTaskParam formDTO) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "dataSyncForYanTaiTask", formDTO); } @Override @@ -726,4 +726,19 @@ public class EpmetUserOpenFeignClientFallback implements EpmetUserOpenFeignClien public Result getAllResiByGrid(AllResiByGridFormDTO formDTO) { return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "getAllResiByGrid", formDTO); } + + @Override + public Result natInfoScanTask(DataSyncTaskParam formDTO) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "natInfoScanTaskV2", formDTO); + } + + @Override + public Result deathInfoScanTask(DataSyncTaskParam formDTO) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "deathInfoScanTask", formDTO); + } + + @Override + public Result disabilityInfoScanTask(DataSyncTaskParam formDTO) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "disabilityInfoScanTask", formDTO); + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/EpidemicConstant.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/EpidemicConstant.java new file mode 100644 index 0000000000..0ad814d722 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/EpidemicConstant.java @@ -0,0 +1,21 @@ +package com.epmet.constant; + +public interface EpidemicConstant { + + /** + * 数据配置的dataCode + * 核酸检测 + * 残疾人 + * 死亡 + */ + String DATA_CODE_NAT = "hesuan"; + String DATA_CODE_DISABILITY = "canji"; + String DATA_CODE_DEATH = "siwang"; + + String JOB_TYPE_NAT = "nat"; + + String OPERATION_STATUS_WAITING = "waiting"; + String OPERATION_STATUS_PROCESSING = "processing"; + String OPERATION_STATUS_FINISH = "finish"; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/DataSyncConfigController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/DataSyncConfigController.java index 2ea0a33db9..cbbc409d6b 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/DataSyncConfigController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/DataSyncConfigController.java @@ -106,9 +106,53 @@ public class DataSyncConfigController { return new Result(); } + @PostMapping("dataSyncForYanTaiTask") + public Result dataSyncForYanTaiTask(@RequestBody DataSyncTaskParam formDTO){ + dataSyncConfigService.dataSyncForYanTaiTask(formDTO); + return new Result(); + } + + /** + * @Description 核酸检测信息定时拉取 + * @param formDTO + * @Author zxc + * @Date 2022/11/8 10:37 + */ @PostMapping("natInfoScanTask") public Result natInfoScanTask(@RequestBody DataSyncTaskParam formDTO){ - dataSyncConfigService.dataSyncForYanTaiTask(formDTO); + dataSyncConfigService.natInfoScanTask(formDTO); + return new Result(); + } + + @PostMapping("natInfoSyncButton") + public Result natInfoSyncButton(@RequestBody DataSyncTaskParam formDTO, @LoginUser TokenDto tokenDto){ + formDTO.setCustomerId(tokenDto.getCustomerId()); + formDTO.setStaffId(tokenDto.getUserId()); + dataSyncConfigService.natInfoSyncButton(formDTO); + return new Result(); + } + + /** + * @Description 死亡信息定时拉取 + * @param formDTO + * @Author zxc + * @Date 2022/11/8 09:01 + */ + @PostMapping("deathInfoScanTask") + public Result deathInfoScanTask(@RequestBody DataSyncTaskParam formDTO){ + dataSyncConfigService.deathInfoScanTask(formDTO); + return new Result(); + } + + /** + * @Description 残疾信息定时拉取 + * @param formDTO + * @Author zxc + * @Date 2022/11/8 09:01 + */ + @PostMapping("disabilityInfoScanTask") + public Result disabilityInfoScanTask(@RequestBody DataSyncTaskParam formDTO){ + dataSyncConfigService.disabilityInfoScanTask(formDTO); return new Result(); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/DataSyncConfigDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/DataSyncConfigDao.java index 2963617263..35bbc6266d 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/DataSyncConfigDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/DataSyncConfigDao.java @@ -38,7 +38,7 @@ public interface DataSyncConfigDao extends BaseDao { * @author zxc * @date 2022/9/26 15:04 */ - List list(@Param("customerId") String customerId, @Param("switchStatus") String switchStatus); + List list(@Param("customerId") String customerId, @Param("switchStatus") String switchStatus, @Param("dataCode")String dataCode); List scopeList(@Param("id") String id); @@ -60,4 +60,6 @@ public interface DataSyncConfigDao extends BaseDao { */ List getIdCardsByScope(DataSyncTaskParam formDTO); + DataSyncConfigDTO getConfigInfoByType(@Param("customerId") String customerId, @Param("switchStatus") String switchStatus,@Param("dataCode")String dataCode); + } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcSyncJobDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcSyncJobDao.java new file mode 100644 index 0000000000..5b4ad6684e --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcSyncJobDao.java @@ -0,0 +1,16 @@ +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcSyncJobEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 同步任务表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2022-11-08 + */ +@Mapper +public interface IcSyncJobDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcSyncJobEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcSyncJobEntity.java new file mode 100644 index 0000000000..0a83b7aa56 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcSyncJobEntity.java @@ -0,0 +1,59 @@ +package com.epmet.entity; + +import com.baomidou.mybatisplus.annotation.TableName; + +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 同步任务表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2022-11-08 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_sync_job") +public class IcSyncJobEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户ID + */ + private String customerId; + + /** + * 组织ID + */ + private String orgId; + + /** + * 组织ID的上级 + */ + private String pid; + + /** + * 组织ID的所有上级,包括org_id + */ + private String orgIdPath; + + /** + * 任务类型,残疾:disability;死亡:death;核酸:nat; + */ + private String jobType; + + /** + * 操作员ID【staffId】 + */ + private String operatorId; + + /** + * 操作状态,等待中:waiting;进行中:processing;结束:finish + */ + private String operationStatus; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/DataSyncConfigService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/DataSyncConfigService.java index fe51881c46..dd1efb81b1 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/DataSyncConfigService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/DataSyncConfigService.java @@ -83,4 +83,31 @@ public interface DataSyncConfigService extends BaseService void scopeSave(ScopeSaveFormDTO formDTO); void dataSyncForYanTaiTask(DataSyncTaskParam formDTO); + + /** + * @Description 死亡信息定时拉取 + * @param formDTO + * @Author zxc + * @Date 2022/11/8 09:01 + */ + void deathInfoScanTask(DataSyncTaskParam formDTO); + + /** + * @Description 残疾信息定时拉取 + * @param formDTO + * @Author zxc + * @Date 2022/11/8 09:01 + */ + void disabilityInfoScanTask(DataSyncTaskParam formDTO); + + /** + * @Description 核酸检测信息定时拉取 + * @param formDTO + * @Author zxc + * @Date 2022/11/8 10:37 + */ + void natInfoScanTask(DataSyncTaskParam formDTO); + + void natInfoSyncButton(DataSyncTaskParam formDTO); + } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcSyncJobService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcSyncJobService.java new file mode 100644 index 0000000000..fab06ea871 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcSyncJobService.java @@ -0,0 +1,78 @@ +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcSyncJobDTO; +import com.epmet.entity.IcSyncJobEntity; + +import java.util.List; +import java.util.Map; + +/** + * 同步任务表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2022-11-08 + */ +public interface IcSyncJobService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2022-11-08 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2022-11-08 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcSyncJobDTO + * @author generator + * @date 2022-11-08 + */ + IcSyncJobDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2022-11-08 + */ + void save(IcSyncJobDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2022-11-08 + */ + void update(IcSyncJobDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2022-11-08 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/DataSyncConfigServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/DataSyncConfigServiceImpl.java index 815c36d9cf..88e30607ba 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/DataSyncConfigServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/DataSyncConfigServiceImpl.java @@ -1,28 +1,37 @@ package com.epmet.service.impl; +import java.util.Date; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.StrConstant; +import com.epmet.commons.tools.distributedlock.DistributedLock; import com.epmet.commons.tools.dto.form.PageFormDTO; +import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; import com.epmet.commons.tools.dto.result.YtDataSyncResDTO; import com.epmet.commons.tools.dto.result.YtHscyResDTO; import com.epmet.commons.tools.dto.result.YtHsjcResDTO; import com.epmet.commons.tools.enums.GenderEnum; +import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.EpmetException; import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.redis.common.CustomerOrgRedis; +import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.redis.common.bean.AgencyInfoCache; import com.epmet.commons.tools.redis.common.bean.GridInfoCache; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.DateUtils; import com.epmet.commons.tools.utils.YtHsResUtils; +import com.epmet.constant.EpidemicConstant; import com.epmet.dao.DataSyncConfigDao; import com.epmet.dao.IcNatDao; +import com.epmet.dao.IcSyncJobDao; import com.epmet.dto.DataSyncConfigDTO; import com.epmet.dto.DataSyncRecordDeathDTO; import com.epmet.dto.DataSyncRecordDisabilityDTO; @@ -39,6 +48,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; +import org.redisson.api.RLock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; @@ -49,9 +59,12 @@ import javax.annotation.Resource; import java.util.*; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; +import static com.epmet.constant.EpidemicConstant.*; + /** * 数据更新配置表 * @@ -76,6 +89,12 @@ public class DataSyncConfigServiceImpl extends BaseServiceImpl result = new PageData<>(new ArrayList<>(), NumConstant.ZERO_L); PageInfo pageInfo = PageHelper.startPage(formDTO.getPageNo(), formDTO.getPageSize()) - .doSelectPageInfo(() -> baseDao.list(tokenDto.getCustomerId(), null)); + .doSelectPageInfo(() -> baseDao.list(tokenDto.getCustomerId(), null,null)); if (CollectionUtils.isNotEmpty(pageInfo.getList())) { result.setList(pageInfo.getList()); result.setTotal(Integer.parseInt(String.valueOf(pageInfo.getTotal()))); @@ -189,7 +208,7 @@ public class DataSyncConfigServiceImpl extends BaseServiceImpl allConfigList = baseDao.list(formDTO.getCustomerId(), "open"); + List allConfigList = baseDao.list(formDTO.getCustomerId(), "open",null); if (CollectionUtils.isEmpty(allConfigList)) { return; } @@ -225,6 +244,256 @@ public class DataSyncConfigServiceImpl extends BaseServiceImpl configData = getConfigData(null, EpidemicConstant.DATA_CODE_DEATH); + if (CollectionUtils.isEmpty(configData)){ + log.warn("deathInfoScanTask not exists config data,customer is "+formDTO.getCustomerId()); + return; + } + long count = configData.stream().filter(o -> CollectionUtils.isNotEmpty(o.getScopeList())).count(); + if (count < 1) { + log.warn("deathInfoScanTask scopeList is null"); + return; + } + int pageNo = NumConstant.ONE; + int pageSize = NumConstant.ONE_THOUSAND; + List dbResiList = null; + do { + for (DataSyncConfigDTO config : configData) { + // 设置查询数据范围 + formDTO.setOrgList(config.getScopeList()); + DataSyncEnum anEnum = DataSyncEnum.getEnum(config.getDataCode()); + dbResiList = getNatUserInfoFromDb(formDTO, pageNo, pageSize); + if (CollectionUtils.isEmpty(dbResiList)) { + continue; + } + switch (anEnum) { + case SI_WANG: + try { + //查询正常状态的居民 + siWang(dbResiList); + log.info("======siWang信息拉取结束======"); + } catch (Exception e) { + log.error("death thread execute exception", e); + } + default: + log.warn("没有要处理的数据"); + } + } + pageNo++; + } while (dbResiList != null && dbResiList.size() == pageSize); + } + + /** + * @Description 残疾信息定时拉取 + * @param formDTO + * @Author zxc + * @Date 2022/11/8 09:01 + */ + @Override + public void disabilityInfoScanTask(DataSyncTaskParam formDTO) { + List configData = getConfigData(null, EpidemicConstant.DATA_CODE_DISABILITY); + if (CollectionUtils.isEmpty(configData)){ + log.warn("disabilityInfoScanTask not exists config data,customer is "+formDTO.getCustomerId()); + return; + } + long count = configData.stream().filter(o -> CollectionUtils.isNotEmpty(o.getScopeList())).count(); + if (count < 1) { + log.warn("disabilityInfoScanTask scopeList is null"); + return; + } + int pageNo = NumConstant.ONE; + int pageSize = NumConstant.ONE_THOUSAND; + List dbResiList = null; + do { + for (DataSyncConfigDTO config : configData) { + // 设置查询数据范围 + formDTO.setOrgList(config.getScopeList()); + formDTO.setCategoryColumn("IS_CJ"); + DataSyncEnum anEnum = DataSyncEnum.getEnum(config.getDataCode()); + dbResiList = getNatUserInfoFromDb(formDTO, pageNo, pageSize); + if (CollectionUtils.isEmpty(dbResiList)) { + continue; + } + switch (anEnum) { + case CAN_JI: + try { + //查询正常状态的居民 + canJi(dbResiList); + log.info("======canJi信息拉取结束======"); + } catch (Exception e) { + log.error("disability thread execute exception", e); + } + break; + default: + log.warn("没有要处理的数据"); + } + } + pageNo++; + } while (dbResiList != null && dbResiList.size() == pageSize); + } + + /** + * @Description 核酸检测信息定时拉取 + * @param formDTO + * @Author zxc + * @Date 2022/11/8 10:37 + */ + @Override + public void natInfoScanTask(DataSyncTaskParam formDTO) { + List configData = new ArrayList<>(); + if (StringUtils.isBlank(formDTO.getAgencyId())){ + configData = getConfigData(null, EpidemicConstant.DATA_CODE_NAT); + if (CollectionUtils.isEmpty(configData)){ + log.warn("natInfoScanTask not exists config data,customer is "+formDTO.getCustomerId()); + return; + } + long count = configData.stream().filter(o -> CollectionUtils.isNotEmpty(o.getScopeList())).count(); + if (count < 1) { + log.warn("natInfoScanTask scopeList is null"); + return; + } + } + int pageNo = NumConstant.ONE; + int pageSize = NumConstant.ONE_THOUSAND; + List dbResiList = null; + do { + if (StringUtils.isBlank(formDTO.getAgencyId())){ + for (DataSyncConfigDTO config : configData) { + // 设置查询数据范围 + formDTO.setOrgList(config.getScopeList()); + DataSyncEnum anEnum = DataSyncEnum.getEnum(config.getDataCode()); + dbResiList = getNatUserInfoFromDb(formDTO, pageNo, pageSize); + if (CollectionUtils.isEmpty(dbResiList)) { + continue; + } + switch (anEnum) { + case HE_SUAN: + try { + //查询正常状态的居民 + yantaiHsjcByDbView(dbResiList, config.getCustomerId(), formDTO.getIsSync()); + log.info("======核酸检测信息拉取结束======"); + } catch (Exception e) { + log.error("nat thread execute exception", e); + } + break; + default: + log.warn("没有要处理的数据"); + } + } + }else { + dbResiList = getNatUserInfoFromDb(formDTO, pageNo, pageSize); + if (CollectionUtils.isEmpty(dbResiList)){ + return; + } + yantaiHsjcByDbView(dbResiList, dbResiList.get(NumConstant.ZERO).getCustomerId(), formDTO.getIsSync()); + } + pageNo++; + } while (dbResiList != null && dbResiList.size() == pageSize); + } + + @Override + public void natInfoSyncButton(DataSyncTaskParam formDTO) { + CustomerStaffInfoCacheResult staffInfo = CustomerStaffRedis.getStaffInfo(formDTO.getCustomerId(), formDTO.getStaffId()); + if (null == staffInfo){ + throw new EpmetException("未查询到工作人员信息:"+formDTO.getStaffId()); + } + AgencyInfoCache agencyInfo = CustomerOrgRedis.getAgencyInfo(formDTO.getAgencyId()); + if (null == agencyInfo){ + throw new EpmetException("未查询到组织信息:"+formDTO.getAgencyId()); + } + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(IcSyncJobEntity::getOrgId,formDTO.getAgencyId()).in(IcSyncJobEntity::getOperationStatus,OPERATION_STATUS_WAITING,OPERATION_STATUS_PROCESSING); + List icSyncJobEntities = icSyncJobDao.selectList(qw); + // 当前组织下存在同步任务 + if (CollectionUtils.isNotEmpty(icSyncJobEntities)){ + throw new EpmetException(EpmetErrorCode.EXIST_SYNC_JOB_ERROR.getCode()); + } + // 不存在新增一条记录 + IcSyncJobEntity e = new IcSyncJobEntity(); + e.setCustomerId(formDTO.getCustomerId()); + e.setOrgId(formDTO.getAgencyId()); + e.setPid(agencyInfo.getPid()); + e.setOrgIdPath(StringUtils.isBlank(agencyInfo.getPids()) ? agencyInfo.getId() : agencyInfo.getPids()+":"+agencyInfo.getId()); + e.setJobType(JOB_TYPE_NAT); + e.setOperatorId(formDTO.getStaffId()); + e.setOperationStatus(OPERATION_STATUS_WAITING); + insertSync(e); + // 客户下,type=nat 存在两条正在进行中的同步任务 + LambdaQueryWrapper qw2 = new LambdaQueryWrapper<>(); + qw2.eq(IcSyncJobEntity::getCustomerId,formDTO.getCustomerId()) + .eq(IcSyncJobEntity::getOperationStatus,OPERATION_STATUS_PROCESSING) + .eq(IcSyncJobEntity::getJobType,JOB_TYPE_NAT); + List processingList = icSyncJobDao.selectList(qw2); + if (CollectionUtils.isNotEmpty(processingList) && processingList.size() >= NumConstant.TWO){ + throw new EpmetException(EpmetErrorCode.OTHER_SYNC_JOB_ERROR.getCode()); + } + List waitList; + do { + LambdaQueryWrapper qw3 = new LambdaQueryWrapper<>(); + qw3.eq(IcSyncJobEntity::getCustomerId,formDTO.getCustomerId()) + .eq(IcSyncJobEntity::getOperationStatus,OPERATION_STATUS_WAITING) + .eq(IcSyncJobEntity::getJobType,JOB_TYPE_NAT) + .orderByAsc(BaseEpmetEntity::getCreatedTime); + waitList = icSyncJobDao.selectList(qw3); + if (CollectionUtils.isNotEmpty(waitList)){ + for (IcSyncJobEntity entity : waitList) { + RLock lock = null; + try { + lock = distributedLock.getLock(entity.getOrgId() + JOB_TYPE_NAT, 60L, 60L, TimeUnit.SECONDS); + updateSync(entity.getId(),OPERATION_STATUS_PROCESSING); + }catch (Exception ex){ + log.error(ex.getMessage()); + throw new EpmetException(ex.getMessage()); + }finally { + lock.unlock(); + } + formDTO.setAgencyId(entity.getOrgId()); + try { + natInfoScanTask(formDTO); + }catch (Exception ee){ + log.error(ee.getMessage()); + throw new EpmetException(ee.getMessage()); + }finally { + updateSync(entity.getId(),OPERATION_STATUS_FINISH); + } + } + } + }while (CollectionUtils.isNotEmpty(waitList)); + } + + @Transactional(rollbackFor = Exception.class) + public void updateSync(String id,String status){ + LambdaUpdateWrapper qwUpdate = new LambdaUpdateWrapper<>(); + qwUpdate.eq(BaseEpmetEntity::getId,id) + .set(IcSyncJobEntity::getOperationStatus,status) + .set(BaseEpmetEntity::getUpdatedTime, new Date()); + icSyncJobDao.update(null,qwUpdate); + } + @Transactional(rollbackFor = Exception.class) + public void insertSync(IcSyncJobEntity e){ + icSyncJobService.insert(e); + } + + /** + * @Description 配置信息查询 + * @param customerId + * @param dataCode + * @Author zxc + * @Date 2022/11/8 10:41 + */ + public List getConfigData(String customerId, String dataCode){ + List allConfigList = baseDao.list(customerId, "open",dataCode); + return CollectionUtils.isEmpty(allConfigList) ? new ArrayList<>() : allConfigList; + } + private void dataSyncYanTaiParallel(List configList, DataSyncTaskParam formDTO) { if (CollectionUtils.isEmpty(configList)) { log.warn("dataSyncYanTaiParallel configList is null"); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcSyncJobServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcSyncJobServiceImpl.java new file mode 100644 index 0000000000..c9e415eead --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcSyncJobServiceImpl.java @@ -0,0 +1,83 @@ +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.dao.IcSyncJobDao; +import com.epmet.dto.IcSyncJobDTO; +import com.epmet.entity.IcSyncJobEntity; +import com.epmet.service.IcSyncJobService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 同步任务表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2022-11-08 + */ +@Service +public class IcSyncJobServiceImpl extends BaseServiceImpl implements IcSyncJobService { + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcSyncJobDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcSyncJobDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcSyncJobDTO get(String id) { + IcSyncJobEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcSyncJobDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcSyncJobDTO dto) { + IcSyncJobEntity entity = ConvertUtils.sourceToTarget(dto, IcSyncJobEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcSyncJobDTO dto) { + IcSyncJobEntity entity = ConvertUtils.sourceToTarget(dto, IcSyncJobEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/DataSyncConfigDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/DataSyncConfigDao.xml index cc4209f310..911b5102bd 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/DataSyncConfigDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/DataSyncConfigDao.xml @@ -47,6 +47,9 @@ AND CUSTOMER_ID = #{customerId} + + AND data_code = #{dataCode} + order by sort @@ -103,4 +106,12 @@ ORDER BY CREATED_TIME + + diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcSyncJobDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcSyncJobDao.xml new file mode 100644 index 0000000000..0b7ecc334d --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcSyncJobDao.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file