wangxianzhang 3 years ago
parent
commit
3233d9798c
  1. 7
      epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcNatCompareRecordDTO.java
  2. 27
      epmet-user/epmet-user-client/src/main/java/com/epmet/dto/YTVaccineListDTO.java
  3. 6
      epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DataSyncTaskParam.java
  4. 2
      epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/NatUserInfoResultDTO.java
  5. 3
      epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java
  6. 5
      epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java
  7. 8
      epmet-user/epmet-user-server/src/main/java/com/epmet/constant/EpidemicConstant.java
  8. 12
      epmet-user/epmet-user-server/src/main/java/com/epmet/controller/DataSyncConfigController.java
  9. 9
      epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcVaccineDao.java
  10. 49
      epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcNatCompareRecordEntity.java
  11. 8
      epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcVaccineEntity.java
  12. 1
      epmet-user/epmet-user-server/src/main/java/com/epmet/enums/DataSyncEnum.java
  13. 14
      epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/IcNatCompareRecordExcelImportListener.java
  14. 112
      epmet-user/epmet-user-server/src/main/java/com/epmet/processor/YanTaiVaccineSyncProcessor.java
  15. 11
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/DataSyncConfigService.java
  16. 215
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/DataSyncConfigServiceImpl.java
  17. 18
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcNatCompareRecordServiceImpl.java
  18. 3
      epmet-user/epmet-user-server/src/main/resources/mapper/DataSyncConfigDao.xml
  19. 3
      epmet-user/epmet-user-server/src/main/resources/mapper/IcNatCompareRecordDao.xml
  20. 14
      epmet-user/epmet-user-server/src/main/resources/mapper/IcVaccineDao.xml

7
epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcNatCompareRecordDTO.java

@ -94,7 +94,7 @@ public class IcNatCompareRecordDTO implements Serializable {
* 最近一次核酸时间:接口填入
*/
@ColumnWidth(30)
@ExcelProperty("最近一次核酸时间")
@ExcelProperty("最近一次检测时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date latestNatTime;
@ -129,4 +129,9 @@ public class IcNatCompareRecordDTO implements Serializable {
@ColumnWidth(30)
@ExcelProperty("导入组织")
private String agencyName;
/**
*
*/
private String internalRemark;
}

27
epmet-user/epmet-user-client/src/main/java/com/epmet/dto/YTVaccineListDTO.java

@ -0,0 +1,27 @@
package com.epmet.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @Author zxc
* @DateTime 2022/11/11 15:05
*/
@Data
public class YTVaccineListDTO implements Serializable {
private static final long serialVersionUID = -5583350277850076659L;
private String idCard;
/**
* 接种时间
*/
private String inoculateDate;
/**
* 接种地点
*/
private String lastStationName;
}

6
epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DataSyncTaskParam.java

@ -49,4 +49,10 @@ public class DataSyncTaskParam implements Serializable {
private String dataCode;
private String staffId;
/**
* nat核酸检测
* vaccine疫苗接种
*/
private String jobType;
}

2
epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/NatUserInfoResultDTO.java

@ -29,6 +29,8 @@ public class NatUserInfoResultDTO implements Serializable {
private String name;
private String mobile;
/**
* 18大类 某一类的 是否值用于比较 同步数据结果确定是否要插入到表中
*/

3
epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java

@ -952,4 +952,7 @@ public interface EpmetUserOpenFeignClient {
@PostMapping("/epmetuser/dataSyncConfig/disabilityInfoScanTask")
Result disabilityInfoScanTask(@RequestBody DataSyncTaskParam formDTO);
@PostMapping("/epmetuser/dataSyncConfig/vaccineInfoScanTask")
Result vaccineInfoScanTask(@RequestBody DataSyncTaskParam formDTO);
}

5
epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java

@ -741,4 +741,9 @@ public class EpmetUserOpenFeignClientFallback implements EpmetUserOpenFeignClien
public Result disabilityInfoScanTask(DataSyncTaskParam formDTO) {
return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "disabilityInfoScanTask", formDTO);
}
@Override
public Result vaccineInfoScanTask(DataSyncTaskParam formDTO) {
return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "vaccineInfoScanTask", formDTO);
}
}

8
epmet-user/epmet-user-server/src/main/java/com/epmet/constant/EpidemicConstant.java

@ -7,12 +7,20 @@ public interface EpidemicConstant {
* 核酸检测
* 残疾人
* 死亡
* 疫苗接种
*/
String DATA_CODE_NAT = "hesuan";
String DATA_CODE_DISABILITY = "canji";
String DATA_CODE_DEATH = "siwang";
String DATA_CODE_VACCINE = "yimiaojiezhong";
/**
* ic_sync_job 任务类型
* 核酸检测
* 疫苗接种
*/
String JOB_TYPE_NAT = "nat";
String JOB_TYPE_VACCINE = "vaccine";
String OPERATION_STATUS_WAITING = "waiting";
String OPERATION_STATUS_PROCESSING = "processing";

12
epmet-user/epmet-user-server/src/main/java/com/epmet/controller/DataSyncConfigController.java

@ -156,4 +156,16 @@ public class DataSyncConfigController {
return new Result();
}
/**
* @Description 疫苗接种信息定时拉取
* @param formDTO
* @Author zxc
* @Date 2022/11/11 16:56
*/
@PostMapping("vaccineInfoScanTask")
public Result vaccineInfoScanTask(@RequestBody DataSyncTaskParam formDTO){
dataSyncConfigService.vaccineInfoScanTask(formDTO);
return new Result();
}
}

9
epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcVaccineDao.java

@ -3,6 +3,7 @@ package com.epmet.dao;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.dto.IcNatDTO;
import com.epmet.dto.IcVaccineDTO;
import com.epmet.dto.YTVaccineListDTO;
import com.epmet.dto.form.MyNatListFormDTO;
import com.epmet.dto.form.VaccineListFormDTO;
import com.epmet.dto.result.IcVaccineListResultDTO;
@ -78,4 +79,12 @@ public interface IcVaccineDao extends BaseDao<IcVaccineEntity> {
void updateRelation(List<RelationAndNatResultDTO> list);
void updateRelationOther(@Param("isLocalResiUser") String isLocalResiUser);
/**
* @Description 根据 身份证 + 疫苗接种时间 查询库里存在的
* @param list
* @Author zxc
* @Date 2022/11/11 15:11
*/
List<YTVaccineListDTO> getExistVaccine(@Param("list")List<YTVaccineListDTO> list);
}

49
epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcNatCompareRecordEntity.java

@ -8,6 +8,7 @@ import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 核酸比对记录
*
@ -21,47 +22,47 @@ public class IcNatCompareRecordEntity extends BaseEpmetEntity {
private static final long serialVersionUID = 1L;
private String customerId;
/**
* 姓名
*/
/**
* 姓名
*/
private String name;
/**
* 身份证
*/
/**
* 身份证
*/
private String idCard;
/**
* 手机号
*/
/**
* 手机号
*/
private String mobile;
/**
* 是否客户下居民(0: 1:)
*/
/**
* 是否客户下居民(0: 1:)
*/
private String isResiUser;
/**
* 是否客户下居民ic_resi_user.id
*/
/**
* 是否客户下居民ic_resi_user.id
*/
private String icResiUserId;
/**
* 最近一次采样时间:接口填入
*/
private Date latestCyTime;
/**
* 最近一次核酸时间:接口填入
*/
/**
* 最近一次核酸时间:接口填入
*/
private Date latestNatTime;
/**
* 检测结果(0:阴性 1:阳性):接口填入
*/
/**
* 检测结果(0:阴性 1:阳性):接口填入
*/
private String natResult;
/**
* 检测地点:接口填入
*/
/**
* 检测地点:接口填入
*/
private String natAddress;
/**
* 联系地址接口填入

8
epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcVaccineEntity.java

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.epmet.commons.mybatis.entity.BaseEpmetEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -61,6 +62,7 @@ public class IcVaccineEntity extends BaseEpmetEntity {
/**
* 接种时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
private Date inoculateTime;
/**
@ -93,4 +95,10 @@ public class IcVaccineEntity extends BaseEpmetEntity {
*/
private String remark;
@TableField(exist = false)
private String agencyId;
@TableField(exist = false)
private String pids;
}

1
epmet-user/epmet-user-server/src/main/java/com/epmet/enums/DataSyncEnum.java

@ -12,6 +12,7 @@ public enum DataSyncEnum {
HE_SUAN("hesuan", "核酸检测数据"),
CAN_JI("canji", "残疾数据"),
SI_WANG("siwang", "死亡数据"),
VACCINE("yimiaojiezhong", "疫苗接种"),
OTHER("qita","其他"),
;

14
epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/IcNatCompareRecordExcelImportListener.java

@ -171,6 +171,7 @@ public class IcNatCompareRecordExcelImportListener implements ReadListener<IcNat
ObjectUtil.objectToTrim(data);
IcNatCompareRecordEntity compareRecordEntity = ConvertUtils.sourceToTarget(data, IcNatCompareRecordEntity.class);
compareRecordEntity.setCustomerId(customerId);
compareRecordEntity.setLatestCyTime(null);
compareRecordEntity.setLatestNatTime(null);
compareRecordEntity.setNatAddress(StrConstant.EPMETY_STR);
compareRecordEntity.setNatResult(StrConstant.EPMETY_STR);
@ -228,17 +229,24 @@ public class IcNatCompareRecordExcelImportListener implements ReadListener<IcNat
compareRecordEntity.setNatResult(NumConstant.ZERO_STR);
}
compareRecordEntity.setContactAddress(StringUtils.isNotBlank(address) ? address : StrConstant.EPMETY_STR);
compareRecordEntity.setInternalRemark(String.format("%s查询匹配成功,采样时间一致,采样视图最近一次采样时间:%s,检测结果视图的最近一次采样时间:%s",
DateUtils.format(importTime,DateUtils.DATE_TIME_PATTERN),
DateUtils.format(compareRecordEntity.getLatestCyTime(),DateUtils.DATE_TIME_PATTERN),
DateUtils.format(sample_time,DateUtils.DATE_TIME_PATTERN)));
} else {
// 采样时间不一致,说明未出结果
compareRecordEntity.setInternalRemark(String.format("采样时间不一致,采样视图最近一次采样时间:%s,检测结果视图的最近一次采样时间:%s", compareRecordEntity.getLatestCyTime(), DateUtils.format(sample_time)));
compareRecordEntity.setInternalRemark(String.format("%s查询未出结果,采样时间不一致,采样视图最近一次采样时间:%s,检测结果视图的最近一次采样时间:%s",
DateUtils.format(importTime,DateUtils.DATE_TIME_PATTERN),
DateUtils.format(compareRecordEntity.getLatestCyTime(),DateUtils.DATE_TIME_PATTERN),
DateUtils.format(sample_time,DateUtils.DATE_TIME_PATTERN)));
}
} else {
compareRecordEntity.setInternalRemark("最近一次检测结果为空");
compareRecordEntity.setInternalRemark(String.format("%s查询最近一次检测结果为空", DateUtils.format(importTime,DateUtils.DATE_TIME_PATTERN)));
}
}
} else {
// 没有核酸采样记录
compareRecordEntity.setInternalRemark("最近一次采样结果为空");
compareRecordEntity.setInternalRemark(String.format("%s查询最近一次采样结果为空", DateUtils.format(importTime, DateUtils.DATE_TIME_PATTERN)));
}
}
datas.add(compareRecordEntity);

112
epmet-user/epmet-user-server/src/main/java/com/epmet/processor/YanTaiVaccineSyncProcessor.java

@ -0,0 +1,112 @@
package com.epmet.processor;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.epmet.commons.tools.distributedlock.DistributedLock;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.constant.EpidemicConstant;
import com.epmet.dao.IcSyncJobDao;
import com.epmet.entity.IcSyncJobEntity;
import com.epmet.service.DataSyncConfigService;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import static com.epmet.constant.EpidemicConstant.JOB_TYPE_NAT;
import static com.epmet.constant.EpidemicConstant.JOB_TYPE_VACCINE;
// 烟台核酸检测数据同步处理器
@Component
@Slf4j
public class YanTaiVaccineSyncProcessor {
public static final int MAX_EXECUTING_COUNT = 3;
@Autowired
private ExecutorService executorService;
@Autowired
private IcSyncJobDao icSyncJobDao;
@Autowired
private DataSyncConfigService dataSyncConfigService;
@Autowired
private DistributedLock distributedLock;
@Autowired
RedisUtils redisUtils;
/**
* @Description 定时扫描和执行同步任务疫苗接种
* @Author zxc
* @Date 2022/11/11 10:32
*/
@Scheduled(cron = "0/10 * * * * ? ")
public void scanJobs() {
LambdaQueryWrapper<IcSyncJobEntity> executingListQuery = new LambdaQueryWrapper<>();
executingListQuery.eq(IcSyncJobEntity::getOperationStatus, EpidemicConstant.OPERATION_STATUS_PROCESSING);
List<IcSyncJobEntity> executingJobList = icSyncJobDao.selectList(executingListQuery);
if (!CollectionUtils.isEmpty(executingJobList) && executingJobList.size() >= MAX_EXECUTING_COUNT) {
// 最多只允许同时3条线程运行
return;
}
int executingCount = executingJobList.size();
// 还可以运行几条线程
int leftCount = MAX_EXECUTING_COUNT - executingCount;
RLock lock = null;
try {
lock = distributedLock.getLock("data:sync:" + JOB_TYPE_VACCINE, 60L, 60L, TimeUnit.SECONDS);
// 查询可执行的任务列表,并且异步执行
List<IcSyncJobEntity> icSyncJobToExec = icSyncJobDao.selectExecutableJobList(
EpidemicConstant.JOB_TYPE_VACCINE,
leftCount);
if (!CollectionUtils.isEmpty(icSyncJobToExec)) {
// 异步提交任务
for (IcSyncJobEntity jobEntity : icSyncJobToExec) {
updateJobStatus(jobEntity.getId(), EpidemicConstant.OPERATION_STATUS_PROCESSING);
executorService.submit(() -> {
// 将此任务状态修改为执行中
try {
dataSyncConfigService.execSyncByJobProcessor(jobEntity);
} finally {
// 更新任务状态为结束
updateJobStatus(jobEntity.getId(), EpidemicConstant.OPERATION_STATUS_FINISH);
}
});
}
}
} catch (Exception e) {
log.error("【异步数据更新】出错:{}", ExceptionUtils.getErrorStackTrace(e));
} finally {
if (lock != null) {
lock.unlock();
}
}
}
/**
* 更新任务状态
* @author wxz
* @date 2022/11/8 下午8:25
* @param id
* @param status
*/
private void updateJobStatus(String id, String status) {
LambdaQueryWrapper<IcSyncJobEntity> query = new LambdaQueryWrapper<>();
query.eq(IcSyncJobEntity::getId, id);
IcSyncJobEntity updateEntity = new IcSyncJobEntity();
updateEntity.setOperationStatus(status);
icSyncJobDao.update(updateEntity, query);
}
}

11
epmet-user/epmet-user-server/src/main/java/com/epmet/service/DataSyncConfigService.java

@ -121,8 +121,9 @@ public interface DataSyncConfigService extends BaseService<DataSyncConfigEntity>
* @param resiInfos
* @param customerId
* @param isSync
* @param jobType
*/
void yantaiHsjcByDbView(List<NatUserInfoResultDTO> resiInfos, String customerId, String isSync);
void yanTaiDbViewByType(List<NatUserInfoResultDTO> resiInfos, String customerId, String isSync, String jobType);
/**
* 更新居民核酸检测信息(通过任务处理器)
@ -133,4 +134,12 @@ public interface DataSyncConfigService extends BaseService<DataSyncConfigEntity>
*/
void execSyncByJobProcessor(IcSyncJobEntity jobEntity);
/**
* @Description 疫苗接种信息定时拉取
* @param formDTO
* @Author zxc
* @Date 2022/11/11 16:56
*/
void vaccineInfoScanTask(DataSyncTaskParam formDTO);
}

215
epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/DataSyncConfigServiceImpl.java

@ -11,7 +11,6 @@ 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;
@ -21,7 +20,6 @@ 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;
@ -32,9 +30,11 @@ import com.epmet.constant.EpidemicConstant;
import com.epmet.dao.DataSyncConfigDao;
import com.epmet.dao.IcNatDao;
import com.epmet.dao.IcSyncJobDao;
import com.epmet.dao.IcVaccineDao;
import com.epmet.dto.DataSyncConfigDTO;
import com.epmet.dto.DataSyncRecordDeathDTO;
import com.epmet.dto.DataSyncRecordDisabilityDTO;
import com.epmet.dto.YTVaccineListDTO;
import com.epmet.dto.form.ConfigSwitchFormDTO;
import com.epmet.dto.form.DataSyncTaskParam;
import com.epmet.dto.form.ScopeSaveFormDTO;
@ -48,7 +48,6 @@ 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;
@ -59,7 +58,6 @@ 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;
@ -95,6 +93,12 @@ public class DataSyncConfigServiceImpl extends BaseServiceImpl<DataSyncConfigDao
private IcSyncJobDao icSyncJobDao;
@Autowired
private DistributedLock distributedLock;
@Autowired
private IcVaccineService icVaccineService;
@Autowired
private IcVaccineRelationService icVaccineRelationService;
@Autowired
private IcVaccineDao icVaccineDao;
@Resource(name = "yantaiNamedParamLantuJdbcTemplate")
private NamedParameterJdbcTemplate yantaiNamedParamLantuJdbcTemplate;
@ -378,7 +382,7 @@ public class DataSyncConfigServiceImpl extends BaseServiceImpl<DataSyncConfigDao
case HE_SUAN:
try {
//查询正常状态的居民
yantaiHsjcByDbView(dbResiList, config.getCustomerId(), formDTO.getIsSync());
yanTaiDbViewByType(dbResiList, config.getCustomerId(), formDTO.getIsSync(), JOB_TYPE_NAT);
log.info("======核酸检测信息拉取结束======");
} catch (Exception e) {
log.error("nat thread execute exception", e);
@ -393,7 +397,7 @@ public class DataSyncConfigServiceImpl extends BaseServiceImpl<DataSyncConfigDao
if (CollectionUtils.isEmpty(dbResiList)){
return;
}
yantaiHsjcByDbView(dbResiList, dbResiList.get(NumConstant.ZERO).getCustomerId(), formDTO.getIsSync());
yanTaiDbViewByType(dbResiList, dbResiList.get(NumConstant.ZERO).getCustomerId(), formDTO.getIsSync(),JOB_TYPE_NAT);
}
pageNo++;
} while (dbResiList != null && dbResiList.size() == pageSize);
@ -408,10 +412,6 @@ public class DataSyncConfigServiceImpl extends BaseServiceImpl<DataSyncConfigDao
*/
@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());
@ -420,6 +420,7 @@ public class DataSyncConfigServiceImpl extends BaseServiceImpl<DataSyncConfigDao
// 查询该组织是否存在等待中或者进行中的任务
LambdaQueryWrapper<IcSyncJobEntity> qw = new LambdaQueryWrapper<>();
qw.eq(IcSyncJobEntity::getOrgId,formDTO.getAgencyId())
.eq(IcSyncJobEntity::getJobType,formDTO.getJobType())
.in(IcSyncJobEntity::getOperationStatus,OPERATION_STATUS_WAITING,OPERATION_STATUS_PROCESSING);
List<IcSyncJobEntity> icSyncJobEntities = icSyncJobDao.selectList(qw);
// 当前组织下存在同步任务
@ -433,43 +434,10 @@ public class DataSyncConfigServiceImpl extends BaseServiceImpl<DataSyncConfigDao
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.setJobType(formDTO.getJobType());
e.setOperatorId(formDTO.getStaffId());
e.setOperationStatus(OPERATION_STATUS_WAITING);
insertSync(e);
//List<IcSyncJobEntity> waitList;
//do {
// LambdaQueryWrapper<IcSyncJobEntity> 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)
@ -532,7 +500,7 @@ public class DataSyncConfigServiceImpl extends BaseServiceImpl<DataSyncConfigDao
try {
//查询正常状态的居民
//hsjc(finalDbResiList, config.getCustomerId(), formDTO.getIsSync());
yantaiHsjcByDbView(finalDbResiList, config.getCustomerId(), formDTO.getIsSync());
yanTaiDbViewByType(finalDbResiList, config.getCustomerId(), formDTO.getIsSync(), JOB_TYPE_NAT);
log.info("======核酸检测信息拉取结束======");
} catch (Exception e) {
log.error("hsjc thread execute exception", e);
@ -1062,15 +1030,110 @@ public class DataSyncConfigServiceImpl extends BaseServiceImpl<DataSyncConfigDao
* @param customerId
* @param isSync
*/
public void yantaiHsjcByDbView(List<NatUserInfoResultDTO> resiInfos, String customerId, String isSync) {
List<List<NatUserInfoResultDTO>> resiInfobatchs = ListUtils.partition(resiInfos, 50);
for (List<NatUserInfoResultDTO> resibatch : resiInfobatchs) {
public void yanTaiDbViewByType(List<NatUserInfoResultDTO> resiInfos, String customerId, String isSync, String jobType) {
List<List<NatUserInfoResultDTO>> resiInfoBatchs = ListUtils.partition(resiInfos, 50);
for (List<NatUserInfoResultDTO> resiBatch : resiInfoBatchs) {
// n个一批,来处理他们的核酸信息,太多怕给数据库查崩了。
try {
yantaiHsjcByDbViewPartition(resibatch, customerId, isSync);
switch (jobType){
// 核酸检测
case JOB_TYPE_NAT:
yantaiHsjcByDbViewPartition(resiBatch, customerId, isSync);
break;
// 疫苗接种
case JOB_TYPE_VACCINE:
yanTaiVaccineByDbViewPartition(resiBatch, customerId, isSync);
break;
default:
break;
}
} catch (Exception e) {
String errorMsg = ExceptionUtils.getErrorStackTrace(e);
log.error("【更新核酸检测信息(from 兰图)】失败,信息:{}", errorMsg);
log.error("【更新{}信息(from 兰图)】失败,信息:{}", jobType, errorMsg);
}
}
}
/**
* @Description 疫苗接种信息处理
* @param resiInfos
* @param customerId
* @param isSync
* @Author zxc
* @Date 2022/11/11 11:07
*/
public void yanTaiVaccineByDbViewPartition(List<NatUserInfoResultDTO> resiInfos, String customerId, String isSync){
// 将居民信息转化为<idCard,resiInfo>的map
Map<String, NatUserInfoResultDTO> idCardAndResiInfoMap = resiInfos.stream().collect(Collectors.toMap(resi -> resi.getIdCard(), Function.identity()));
List<String> idCards = new ArrayList<>(idCardAndResiInfoMap.keySet());
// 1.获取核酸采样信息
Map<String, Object> args = new HashMap<>();
args.put("idcards", idCards);
// todo 疫苗接种视图
String json = "[\n" +
"{\n" +
"\t\"idCard\":\"370785195001012558\",\n" +
"\t\"inoculateDate\":\"2023-01-01 10:01\",\n" +
"\t\"lastStationName\":\"北京\"\n" +
"},\n" +
"{\n" +
"\t\"idCard\":\"370785195001012558\",\n" +
"\t\"inoculateDate\":\"2022-01-01 10:01\",\n" +
"\t\"lastStationName\":\"南京\"\n" +
"}\n" +
"]";
List<Map<String, Object>> vaccineList = new ArrayList<>();/*yantaiNamedParamLantuJdbcTemplate.queryForList(
"select id, name,card_no, create_time from hscyxxb where card_no in (:idcards)", args);*/
Map<String, Object> m = new HashMap<>();
vaccineList.add(m);
if (CollectionUtils.isNotEmpty(vaccineList)) {
List<IcVaccineEntity> entities = new ArrayList<>();
// List<YTVaccineListDTO> ytVaccineListDTOS = ConvertUtils.sourceToTarget(vaccineList, YTVaccineListDTO.class);
List<YTVaccineListDTO> ytVaccineListDTOS = JSON.parseArray(json,YTVaccineListDTO.class);
List<YTVaccineListDTO> existVaccine = icVaccineDao.getExistVaccine(ytVaccineListDTOS);
if (CollectionUtils.isNotEmpty(existVaccine)){
for (YTVaccineListDTO e : existVaccine) {
for (int i = 0; i < ytVaccineListDTOS.size(); i++) {
if (ytVaccineListDTOS.get(i).getIdCard().equals(e.getIdCard()) && ytVaccineListDTOS.get(i).getInoculateDate().equals(e.getInoculateDate())){
ytVaccineListDTOS.remove(i);
}
}
}
}
if (CollectionUtils.isNotEmpty(ytVaccineListDTOS)){
ytVaccineListDTOS.forEach(v -> {
resiInfos.forEach(u -> {
if (v.getIdCard().equals(u.getIdCard())){
IcVaccineEntity e = new IcVaccineEntity();
e.setCustomerId(customerId);
e.setName(u.getName());
e.setMobile(u.getMobile());
e.setIdCard(u.getIdCard());
e.setIsResiUser(StringUtils.isBlank(u.getUserId()) ? NumConstant.ZERO_STR : NumConstant.ONE_STR);
e.setUserId(StringUtils.isBlank(u.getUserId()) ? "" : u.getUserId());
e.setUserType("ytPull");
e.setInoculateTime(DateUtils.parseDate(v.getInoculateDate(),DateUtils.DATE_TIME_PATTERN_END_WITH_MINUTE));
e.setInoculateAddress(v.getLastStationName());
e.setAgencyId(u.getAgencyId());
e.setPids(u.getPids());
entities.add(e);
}
});
});
icVaccineService.insertBatch(entities,NumConstant.ONE_HUNDRED);
List<IcVaccineRelationEntity> relationEntities = new ArrayList<>();
entities.forEach(e -> {
IcVaccineRelationEntity re = new IcVaccineRelationEntity();
re.setIcVaccineId(e.getAgencyId());
re.setPids(e.getPids());
re.setCustomerId(customerId);
re.setUserType("ytPull");
re.setAgencyId(e.getAgencyId());
// 拉取居民的疫苗接种信;因为查询的就是组织下的居民,所以都是本地居民。
re.setIsLocalResiUser(NumConstant.ONE_STR);
relationEntities.add(re);
});
icVaccineRelationService.insertBatch(relationEntities,NumConstant.ONE_HUNDRED);
}
}
}
@ -1197,14 +1260,62 @@ public class DataSyncConfigServiceImpl extends BaseServiceImpl<DataSyncConfigDao
int updatedResiCount = 0;
log.info("【任务处理器同步数据】组织Id:{},开始同步数据,同步类型:{}", jobEntity.getOrgId(), jobEntity.getJobType());
do {
// 分页,一次查询1000居民,循环更新他们的核酸检测信息
// 分页,一次查询 1000 居民,循环更新他们的核酸检测信息
resis = getNatUserInfoFromDb(p, pageNo, pageSize);
if (CollectionUtils.isNotEmpty(resis)) {
yantaiHsjcByDbView(resis, jobEntity.getCustomerId(), NumConstant.ONE_STR);
yanTaiDbViewByType(resis, jobEntity.getCustomerId(), NumConstant.ONE_STR, jobEntity.getJobType());
pageNo++;
updatedResiCount += resis.size();
}
} while (CollectionUtils.isNotEmpty(resis));
log.info("【任务处理器同步数据】组织Id:{},同步类型:{},已完成居民数:{}", jobEntity.getOrgId(), jobEntity.getJobType(), updatedResiCount);
}
/**
* @Description 疫苗接种信息定时拉取
* @param formDTO
* @Author zxc
* @Date 2022/11/11 16:56
*/
@Override
public void vaccineInfoScanTask(DataSyncTaskParam formDTO) {
List<DataSyncConfigDTO> configData = getConfigData(null, EpidemicConstant.DATA_CODE_VACCINE);
if (CollectionUtils.isEmpty(configData)){
log.warn("vaccineInfoScanTask not exists config data ");
return;
}
long count = configData.stream().filter(o -> CollectionUtils.isNotEmpty(o.getScopeList())).count();
if (count < 1) {
log.warn("vaccineInfoScanTask scopeList is null");
return;
}
int pageNo = NumConstant.ONE;
int pageSize = NumConstant.ONE_THOUSAND;
List<NatUserInfoResultDTO> 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 VACCINE:
try {
//查询正常状态的居民
yanTaiVaccineByDbViewPartition(dbResiList,config.getCustomerId(),NumConstant.ZERO_STR);
log.info("======vaccine信息拉取结束======");
} catch (Exception e) {
log.error("vaccine thread execute exception", e);
}
break;
default:
log.warn("没有要处理的数据");
}
}
pageNo++;
} while (dbResiList != null && dbResiList.size() == pageSize);
}
}

18
epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcNatCompareRecordServiceImpl.java

@ -1,6 +1,7 @@
package com.epmet.service.impl;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.constant.StrConstant;
@ -227,7 +228,7 @@ public class IcNatCompareRecordServiceImpl extends BaseServiceImpl<IcNatCompareR
*/
@Transactional(rollbackFor = Exception.class)
public void persisNat(IcNatCompareRecordEntity data, CustomerStaffInfoCacheResult staffInfo, String importDate, Date importTime) {
// 查询是否本辖区居民
// 查询是否本辖区居民 没有限制status='0'
IcResiUserDTO icResiUserDTO = SpringContextUtils.getBean(IcResiUserService.class).getByIdCard(data.getCustomerId(), data.getIdCard(), null);
AgencyInfoCache agencyInfoCache = CustomerOrgRedis.getAgencyInfo(staffInfo.getAgencyId());
//根据身份证号判断是否存在基础信息
@ -270,7 +271,20 @@ public class IcNatCompareRecordServiceImpl extends BaseServiceImpl<IcNatCompareR
// 是否客户下居民(0:否 1:是)
origin.setIsResiUser(StringUtils.isNotBlank(origin.getIcResiUserId()) ? NumConstant.ONE_STR : NumConstant.ZERO_STR);
origin.setLatestImportTime(importTime);
baseDao.updateById(origin);
LambdaUpdateWrapper<IcNatCompareRecordEntity> updateWrapper=new LambdaUpdateWrapper<>();
updateWrapper.eq(IcNatCompareRecordEntity::getId,origin.getId());
updateWrapper.set(IcNatCompareRecordEntity::getName, origin.getName())
.set(IcNatCompareRecordEntity::getMobile, origin.getMobile())
.set(IcNatCompareRecordEntity::getIsResiUser, origin.getIsResiUser())
.set(IcNatCompareRecordEntity::getIcResiUserId, origin.getIcResiUserId())
.set(IcNatCompareRecordEntity::getLatestCyTime, origin.getLatestCyTime())
.set(IcNatCompareRecordEntity::getLatestNatTime, origin.getLatestNatTime())
.set(IcNatCompareRecordEntity::getNatResult, origin.getNatResult())
.set(IcNatCompareRecordEntity::getNatAddress, origin.getNatAddress())
.set(IcNatCompareRecordEntity::getContactAddress, origin.getContactAddress())
.set(IcNatCompareRecordEntity::getLatestImportTime, origin.getLatestImportTime())
.set(IcNatCompareRecordEntity::getInternalRemark, origin.getInternalRemark());
baseDao.update(null,updateWrapper);
IcNatCompareRecRelationEntity existRelationEntity=icNatCompareRecRelationDao.selectExist(data.getCustomerId(),origin.getId(),staffInfo.getAgencyId(),importDate);
if(null!=existRelationEntity){
// 是否本社区(agency_id)下居民(0:否 1:是)

3
epmet-user/epmet-user-server/src/main/resources/mapper/DataSyncConfigDao.xml

@ -70,7 +70,8 @@
<if test="categoryColumn != null and categoryColumn != ''">
${categoryColumn} AS categoryColumn,
</if>
pids
pids,
mobile
FROM ic_resi_user
WHERE DEL_FLAG = '0'

3
epmet-user/epmet-user-server/src/main/resources/mapper/IcNatCompareRecordDao.xml

@ -32,7 +32,8 @@
c.IC_RESI_USER_ID,
r.CUSTOMER_ID,
r.IMPORT_DATE,
r.IMPORT_TIME as importTime
r.IMPORT_TIME as importTime,
c.INTERNAL_REMARK as internalRemark
FROM ic_nat_compare_rec_relation r
left join ic_nat_compare_record c on (r.COMPARE_REC_ID=c.ID AND c.del_flag='0')
WHERE

14
epmet-user/epmet-user-server/src/main/resources/mapper/IcVaccineDao.xml

@ -226,4 +226,18 @@
and (b.USER_ID is null or b.USER_ID ='')
</if>
</update>
<!-- 根据 身份证 + 疫苗接种时间 查询库里存在的 -->
<select id="getExistVaccine" resultType="com.epmet.dto.YTVaccineListDTO">
SELECT
ID_CARD,
DATE_FORMAT(INOCULATE_TIME, '%Y-%m-%d %H:%i') AS inoculateDate
FROM ic_vaccine
WHERE DEL_FLAG = '0'
AND (
<foreach collection="list" item="l" separator=" OR ">
(ID_CARD = #{l.idCard} AND DATE_FORMAT(INOCULATE_TIME, '%Y-%m-%d %H:%i') = #{l.inoculateDate})
</foreach>
)
</select>
</mapper>

Loading…
Cancel
Save