1.基础数据同步的目标和意义
预约挂号系统基于医院编号、科室编号、医生编号等基础数据,由于院方会不定期更新基础数据,为了避免好医基础数据滞后而导致用户无法预约挂号,且人工比对基础数据效率低、错误率高,故挂号核心提供基础数据自动同步、对比差异数据功能。
以此提高基础数据的有效率、提高挂号量、减少人工操作。
2.基础数据同步
2.1准备
HyEnumSyncBizType枚举类定义基础数据同步类型
SYNC_HOSPTIAL_INFO("sync_hospital_info","同步医院信息"),
SYNC_DEPT_INFO("sync_dept_info","同步科室信息"),
SYNC_DOCTOR_INFO("sync_doctor_info","同步医生信息");
2.2根据hyHospitalId获取当前同步计划
2.2.1若同步计划表中无该医院该类型的同步信息,新增一条版本号为v1的数据。
2.2.2若同步计划表中有该医院该类型的同步信息,则生成一条同步计划任务数据(版本号+1,状态位置为有效,记录上个版本号),将上一条任务计划数据的状态更改为失效。
2.3同步基础数据
(同步医生数据为例子)
根据接口获取医院所有医生信息,将接口获取的信息新增到医生信息表,如果当前同步计划数据里有前一个版本号,将医生信息里前一个版本的数据置为无效,新增完成后,跟新当前同步计划状态为 完成。
2.4注意:
使用@Transactional注解 保证同步方法事务一致性。
3.数据对比
3.1对比
(以医生数据为例)对比数据变化情况(新增、删除)
将当前版本与前一个版本数据对比:
前一个版本有的,当前版本没有的数据标记为删除;
当前版本有,前一个版本没有的数据标记为新增;
数据对比demo
public class MapTest {
public static void main(String[] args) {
List<DoctorInfo> list1 = new ArrayList<DoctorInfo>();
List<DoctorInfo> list2 = new ArrayList<DoctorInfo>();
for(int i = 0;i < 10;i++){
DoctorInfo doctor = new DoctorInfo();
doctor.setHospitalId("10001");
doctor.setDeptId("100" + i);
doctor.setDoctorId("200" + i);
list1.add(doctor);
}
DoctorInfo d1 = new DoctorInfo();
d1.setHospitalId("10001");
d1.setDeptId("222");
d1.setDoctorId("d101");
list1.add(d1);
DoctorInfo d2 = new DoctorInfo();
d1.setHospitalId("10001");
d1.setDeptId("222");
d1.setDoctorId("2001");
list1.add(d1);
for(int i = 0;i < 10;i++){
DoctorInfo doctor = new DoctorInfo();
doctor.setHospitalId("10001");
doctor.setDeptId("100" + i);
doctor.setDoctorId("200" + i);
list2.add(doctor);
}
MapTest tt = new MapTest();
Map<String, List<DoctorInfo>> map = tt.getComResulMap(list1,list2);
List<DoctorInfo> lllOver = map.get("list_over_1");// 卸载的软件
List<DoctorInfo> ggllistOver = map.get("list_over_2");// 安装的软件
System.out.println("lllOver:" + lllOver);
System.out.println("ggllistOver:" + ggllistOver);
}
public List<DoctorInfo> getDiffrentList(Map<String, DoctorInfo> target,
Map<String, DoctorInfo> comMap) {
List<DoctorInfo> list = new ArrayList<DoctorInfo>();
for (Map.Entry<String, DoctorInfo> entry : comMap.entrySet()) {
String key = entry.getKey();
if (!target.containsKey(key)) {
list.add(comMap.get(key));
}
}
return list;
}
/**
* 获取多出来的map
*
* @param list_1
* @param list_2
* @return list_over_1的map为list_1比list_2多出来的集合,list_over_1同样。
*/
public Map<String, List<DoctorInfo>> getComResulMap(List<DoctorInfo> list_1,
List<DoctorInfo> list_2) {
Map<String, List<DoctorInfo>> map = new HashMap<String, List<DoctorInfo>>();
// 1 转换成响应的map
Map<String, DoctorInfo> map_1 = this.createMap(list_1);
Map<String, DoctorInfo> map_2 = this.createMap(list_2);
List<DoctorInfo> list_over_1 = this.getDiffrentList(map_2, map_1);
List<DoctorInfo> list_over_2 = this.getDiffrentList(map_1, map_2);
map.put("list_over_1", list_over_1);
map.put("list_over_2", list_over_2);
return map;
}
// 生成map方法key为名称和版本
public Map<String, DoctorInfo> createMap(List<DoctorInfo> list) {
Map<String, DoctorInfo> map = new HashMap<String, DoctorInfo>();
for (DoctorInfo d : list) {
String key = d.getDeptId() + "|" + d.getDoctorId();//名称
map.put(key, d);
}
return map;
}
}
public class DoctorInfo {
private Integer id;
private String origin;
private String hospitalId;
private String deptId;
private String doctorId;
private String name;
private String sex;
private String des;
private String title;
private String specialty;
private String pic;
private String middlePic;
private String bigPc;
private String version;
private String dr;
private Date cdt;
private Date mdt;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getOrigin() {
return origin;
}
public void setOrigin(String origin) {
this.origin = origin == null ? null : origin.trim();
}
public String getHospitalId() {
return hospitalId;
}
public void setHospitalId(String hospitalId) {
this.hospitalId = hospitalId == null ? null : hospitalId.trim();
}
public String getDeptId() {
return deptId;
}
public void setDeptId(String deptId) {
this.deptId = deptId == null ? null : deptId.trim();
}
public String getDoctorId() {
return doctorId;
}
public void setDoctorId(String doctorId) {
this.doctorId = doctorId == null ? null : doctorId.trim();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex == null ? null : sex.trim();
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des == null ? null : des.trim();
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title == null ? null : title.trim();
}
public String getSpecialty() {
return specialty;
}
public void setSpecialty(String specialty) {
this.specialty = specialty == null ? null : specialty.trim();
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic == null ? null : pic.trim();
}
public String getMiddlePic() {
return middlePic;
}
public void setMiddlePic(String middlePic) {
this.middlePic = middlePic == null ? null : middlePic.trim();
}
public String getBigPc() {
return bigPc;
}
public void setBigPc(String bigPc) {
this.bigPc = bigPc == null ? null : bigPc.trim();
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version == null ? null : version.trim();
}
public String getDr() {
return dr;
}
public void setDr(String dr) {
this.dr = dr == null ? null : dr.trim();
}
public Date getCdt() {
return cdt;
}
public void setCdt(Date cdt) {
this.cdt = cdt;
}
public Date getMdt() {
return mdt;
}
public void setMdt(Date mdt) {
this.mdt = mdt;
}
}