package com.yihu.wlyy.statistics.task; import com.yihu.wlyy.statistics.Application; import com.yihu.wlyy.statistics.dao.*; import com.yihu.wlyy.statistics.model.doctor.DoctorPatientGroupInfo; import com.yihu.wlyy.statistics.model.label.SignPatientLabelInfo; import com.yihu.wlyy.statistics.model.signfamily.SignFamily; import com.yihu.wlyy.statistics.model.team.DoctorTeam; import com.yihu.wlyy.statistics.model.team.DoctorTeamMember; import com.yihu.wlyy.statistics.util.IdCardUtil; import com.yihu.wlyy.statistics.util.SpringUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; import org.springframework.web.context.support.SpringBeanAutowiringSupport; import java.text.SimpleDateFormat; import java.util.*; /** * Created by lyr-pc on 2016/10/11. */ public class SignTeamAndGroupRunnable implements Runnable { long start = 0; long end = 0; SignFamilyDao signFamilyDao; DoctorTeamDao teamDao; DoctorTeamMemberDao teamMemberDao; JpaTransactionManager transactionManager; SignPatientLabelInfoDao labelInfoDao; public SignTeamAndGroupRunnable(Long start, Long end){ this.start = start; this.end = end; this.signFamilyDao = SpringUtil.getApplicationContext().getBean(SignFamilyDao.class); this.teamDao = SpringUtil.getApplicationContext().getBean(DoctorTeamDao.class); this.teamMemberDao = SpringUtil.getApplicationContext().getBean(DoctorTeamMemberDao.class); this.transactionManager = SpringUtil.getApplicationContext().getBean(JpaTransactionManager.class); this.labelInfoDao = SpringUtil.getApplicationContext().getBean(SignPatientLabelInfoDao.class); } public String getCode() { return UUID.randomUUID().toString().replaceAll("-", ""); } @Override public void run() { boolean flag = true; while (flag) { PageRequest pageRequest = new PageRequest(0, 100); Page signs = signFamilyDao.findByTypeAndSignSourceAndId(2, "1",start, end,pageRequest); if (signs != null && signs.getContent().size() < 100) { flag = false; } start = signs.getContent().get(signs.getContent().size() - 1).getId() + 1; DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔离级别,开启新事务 TransactionStatus status = transactionManager.getTransaction(def); // 获得事务状态 try { transform(signs); //事物提交 transactionManager.commit(status); } catch (Exception e) { transactionManager.rollback(status); } } } public void transform(Page signs){ System.out.println("sign-patient-group-team:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); List teams = new ArrayList<>(); List teamMembers = new ArrayList<>(); List groupList = new ArrayList<>(); Map labels = new HashMap<>(); List signList = signs.getContent(); for (SignFamily sign : signList) { try { if (StringUtils.isNotEmpty(sign.getTeamCode())) { continue; } //建立团队 DoctorTeam doctorTeam = new DoctorTeam(); String doctorTeamCode = getCode(); doctorTeam.setCode(doctorTeamCode); doctorTeam.setCzrq(new Date()); doctorTeam.setName("团队名称:" + sign.getName()); doctorTeam.setSignType("2");//家庭签约 doctorTeam.setDel("1"); teams.add(doctorTeam); //添加团队成员 if (StringUtils.isNotEmpty(sign.getDoctor())) { //添加全科 DoctorTeamMember wlyyDoctorTeamDoctor = new DoctorTeamMember(); wlyyDoctorTeamDoctor.setTeam(doctorTeamCode); wlyyDoctorTeamDoctor.setMemberCode(sign.getDoctor()); wlyyDoctorTeamDoctor.setName(sign.getDoctorName()); wlyyDoctorTeamDoctor.setDel("1"); wlyyDoctorTeamDoctor.setType(2); wlyyDoctorTeamDoctor.setSignType("2");//家庭签约 wlyyDoctorTeamDoctor.setCode(getCode()); wlyyDoctorTeamDoctor.setCzrq(new Date()); teamMembers.add(wlyyDoctorTeamDoctor); } if (StringUtils.isNotEmpty(sign.getDoctorHealth())) { //添加健康管理师 DoctorTeamMember wlyyDoctorTeamDoctor = new DoctorTeamMember(); wlyyDoctorTeamDoctor.setTeam(doctorTeamCode); wlyyDoctorTeamDoctor.setMemberCode(sign.getDoctorHealth()); wlyyDoctorTeamDoctor.setName(sign.getDoctorHealthName()); wlyyDoctorTeamDoctor.setDel("1"); wlyyDoctorTeamDoctor.setType(3); wlyyDoctorTeamDoctor.setSignType("2");//家庭签约 wlyyDoctorTeamDoctor.setCode(getCode()); wlyyDoctorTeamDoctor.setCzrq(new Date()); teamMembers.add(wlyyDoctorTeamDoctor); } //添加患者和团队的关系 DoctorTeamMember wlyyDoctorTeamPatient = new DoctorTeamMember(); wlyyDoctorTeamPatient.setTeam(doctorTeamCode); wlyyDoctorTeamPatient.setMemberCode(sign.getPatient()); wlyyDoctorTeamPatient.setName(sign.getName()); wlyyDoctorTeamPatient.setDel("1"); wlyyDoctorTeamPatient.setSignType("2");//家庭签约 wlyyDoctorTeamPatient.setType(5); wlyyDoctorTeamPatient.setCode(getCode()); wlyyDoctorTeamPatient.setCzrq(new Date()); teamMembers.add(wlyyDoctorTeamPatient); if (StringUtils.isEmpty(sign.getIdcard())) { System.out.println("error:sign-family-set-group:no-idcard:" + sign.getId()); continue; } int age = IdCardUtil.getAgeForIdcard(sign.getIdcard()); String groupCode = "1"; String groupName = "普通人群"; if (age >= 65) { groupCode = "3"; groupName = "65岁以上人群"; } SignPatientLabelInfo label = new SignPatientLabelInfo(); SignPatientLabelInfo exLabelInfo = labelInfoDao.findByPatientAndLabelAndLabelTypeAndStatus( sign.getPatient(), groupCode, "1", 1); if (exLabelInfo != null) { continue; } label.setPatient(sign.getPatient()); label.setPatient(sign.getName()); label.setLabel(groupCode); label.setLabelName(groupName); label.setLabelType("1"); label.setStatus(1); label.setCzrq(new Date()); labels.put(sign.getPatient(),label); sign.setTeamCode(doctorTeamCode); } catch (Exception e) { e.printStackTrace(); } } teamDao.save(teams); teamMemberDao.save(teamMembers); labelInfoDao.save(labels.values()); signFamilyDao.save(signList); System.out.println("sign-patient-group-team:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); } }