diff --git a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/BookbuildingFacade.java b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/BookbuildingFacade.java index e9a0bc1..55c5c57 100644 --- a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/BookbuildingFacade.java +++ b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/BookbuildingFacade.java @@ -21,6 +21,8 @@ import com.lyms.platform.operate.web.request.*; import com.lyms.platform.operate.web.result.*; import com.lyms.platform.operate.web.service.ITrackDownService; import com.lyms.platform.operate.web.utils.JdbcUtil; +import com.lyms.platform.operate.web.worker.CorrectDataWorker; +import com.lyms.platform.operate.web.worker.CorrectDataWorker2; import com.lyms.platform.permission.dao.master.CouponMapper; import com.lyms.platform.permission.model.Organization; import com.lyms.platform.permission.model.OrganizationQuery; @@ -32,6 +34,8 @@ import com.lyms.platform.permission.service.UsersService; import com.lyms.platform.pojo.*; import com.lyms.platform.query.*; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -54,6 +58,7 @@ import java.io.OutputStream; import java.sql.*; import java.util.*; import java.util.Date; +import java.util.concurrent.atomic.AtomicLong; /** * @@ -171,6 +176,8 @@ public class BookbuildingFacade { @Autowired private CdfyHisService cdfyHisService; + @Autowired + private SaveByV2ThreadPoolFacade saveByV2ThreadPoolFacade; public static final String syncToV2Url = PropertiesUtils.getPropertyValue("sync_to_v2_url"); @@ -2362,33 +2369,42 @@ public class BookbuildingFacade { * @return BaseResponse */ public BaseResponse saveByV2(SyncV2HistoryRequest param) { - - - // TODO 2019/6/5 15:01 dongqing 数据的效验,整理 - RestTemplate restTemplate = new RestTemplate(); - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - String startTime = param.getStartTime(); - String endTime = param.getEndTime(); - // TODO 2019/6/5 15:39 dongqing 分批次请求保存 - + //获取2.0历史建档数据 + String startTime = param.getStartTime(); + String endTime = param.getEndTime(); Connection connection = null; try { connection = getConnection(); - String sql = ""; - PreparedStatement statement = connection.prepareStatement(sql); - ResultSet resultSet = statement.executeQuery(); - while (resultSet.next()) { - String id = resultSet.getString("id"); - String name = resultSet.getString("stu_name"); - String gender = resultSet.getString("gender"); - String age = resultSet.getString("age"); - String address = resultSet.getString("address"); + String sql = getSqlString(startTime, endTime); + QueryRunner queryRunner = new QueryRunner(true); + List lists = queryRunner.query(connection, sql, new BeanListHandler(SyncV2HistoryRequest.class)); + // TODO 2019/6/5 15:39 dongqing 分批次请求保存,明天加上 + + + if(CollectionUtils.isNotEmpty(lists)){ + int batchSize = 400; + int end = 0; + java.util.concurrent.atomic.AtomicLong counter=new AtomicLong(); + for (int i = 0; i < lists.size(); i += batchSize) { + end = (end + batchSize); + if (end > lists.size()) { + end = lists.size(); + } +// commonThreadPool.submit(new CorrectDataWorker2(lists.subList(i, end),postReviewService,patientsService,anExService,antExFacade,counter)); + } +// logger.info("hand hospitalId :" +hospitalId+", update count "+counter.get()); } - }catch (Exception e){ - }finally { - if (connection != null){ +// for (SyncV2HistoryRequest list : lists) { +// BaseObjectResponse p = addPregnantBookbuilding(list, null, false);//Integer.parseInt(list.getBookbuildingDoctor() +// System.out.println(p.getData()); +// } + + } catch (Exception e) { + logger.info(e.getMessage()); + return new BaseResponse().setErrorcode(ErrorCodeConstants.SYSTEM_ERROR).setErrormsg("系统异常"); + } finally { + if (connection != null) { try { connection.close(); } catch (SQLException e) { @@ -2396,95 +2412,58 @@ public class BookbuildingFacade { } } } + return new BaseResponse().setErrorcode(ErrorCodeConstants.SUCCESS).setErrormsg("成功"); - // 孕妇体验类型 - param.setExpType(-1); - // 服务信息 - param.setSerInfos(new ArrayList>()); - // 证件类型 - param.setPregnantCertificateTypeId(null); - // 居住地 - param.setPregnantCensusProvinceId(null); - param.setPregnantCensusCityId(null); - param.setPregnantCensusCityId(null); - param.setPregnantCensusStreetId(null); - - // 国籍 - param.setPregnantCountryId(null); - // 丈夫国籍 - param.setHusbandCountryId(null); - // 丈夫 证件类型 - param.setHusbandCertificateTypeId(null); - // 民族 - param.setPregnantNationId(null); - // 丈夫民族 - param.setHusbandNationId(null); - // 建档医生 - param.setBookbuildingDoctor(null); - // 孕妇证件号 - param.setPregnantCertificateNum(null); - // 孕妇民族 - param.setPregnantName(null); - // 孕妇手机号 - param.setPregnantPhone(null); - - param.setPregnantCensusAddr("这是居住地"); - - param.setPregnantLiveProvinceId(null); - param.setPregnantLiveCityId(null); - param.setPregnantLiveAreaId(null); - param.setPregnantLiveStreetId(null); - param.setPregnantLiveAddr("户籍地址"); - - param.setChildbirthProvinceId(null); - param.setChildbirthCityId(null); - param.setChildbirthAreaId(null); - param.setChildbirthStreetId(null); - param.setChildExtAddrs(new ArrayList()); - param.setChildbirthAddr("产后 休养地"); - - param.setHusbandName("产后大幅度"); - // 丈夫证件号 - param.setHusbandCertificateNum(null); - // 丈夫生日 - param.setHusbandBirth(null); - - // 丈夫户籍地址 - param.setHusbandProvinceRegisterId(null); - param.setHusbandCityRegisterId(null); - param.setHusbandAreaRegisterId(null); - param.setHusbandStreetRegisterId(null); - param.setHusbandAddressRegister(null); - - // 就诊卡号 - param.setVcCardNo(null); - // 乡镇卫生机构id - param.setTownOrgId(null); - // 孕妇生日 - param.setBirthday(null); - // 末次月经 - param.setLastMenstrualPeriod(null); - // 预产期 - param.setDueDate(null); - // 建档日期 - param.setBookbuildingDate(null); - // 医院Id - param.setHospitalId(null); - // 服务状态 - param.setServiceStatus(null); - param.setServiceType(null); - - - JSONObject jsonObject = new JSONObject(); - String result = restTemplate.postForObject(syncToV2Url + "/wx/babyMeasureInfo/saveOrUpdate", jsonObject, String.class); - - - - - return null; } - private static Connection getConnection() { + private String getSqlString(String startTime, String endTime) { + return "SELECT " + + "P_CARDTYPE as pregnantCertificateTypeId," +//证件类型 + "P_ADDRESSPROVINCE as pregnantCensusProvinceId," +//居住地-省 + "P_ADDRESSCITY as pregnantCensusCityId," +//居住地 -城市 + "P_ADDRESSCOUNTY as pregnantCensusAreaId," +//居住地区 + "P_ADDRESSSTREET as pregnantCensusStreetId," +//居住地 -街道 + "P_COUNTRY as pregnantCountryId," +//国籍 + "P_HUSBANDCOUNTRY as husbandCountryId," +//丈夫国籍 + "P_HUSBANDCARDTYPE as husbandCertificateTypeId," +//丈夫证件类型 + "P_NATION as pregnantNationId," +//民族 + "P_HUSBANDNATION as husbandNationId," +//丈夫民族 + "P_DOCID as bookbuildingDoctor," +//建档医生 + "P_CARDNO as pregnantCertificateNum," +//证件号 + "P_CARDNO as pregnantNationId," +// 孕妇民族 + "P_CARDNO as pregnantPhone," +// 孕妇手机号 + "P_RRPROVINCE as pregnantLiveProvinceId," +//户口——省 + "P_RRCITY as pregnantLiveCityId," +//户口——市 + "P_RRCOUNTY as pregnantLiveAreaId," +//户口——区县 + "P_RRSTREET as pregnantLiveStreetId," +//户口——街道 + "P_POSTPARTUMPROVINCE as childbirthProvinceId," +//产后——省 + "P_POSTPARTUMCITY as childbirthCityId," +//产后——市 + "P_POSTPARTUMCOUNTY as childbirthAreaId," +//产后——区县 + "P_POSTPARTUMSTREET as childbirthStreetId," +//产后——街道 + "P_HUSBANDNAME as husbandName," +//丈夫姓名 + "P_HUSBANDCARDNO as husbandCertificateNum," +//丈夫证件号码 + "P_HUSBANDBIRTHDAY as husbandBirth," +//丈夫出生日期 + "P_HUSBANDRRPROVINCE as husbandProvinceRegisterId," +//丈夫户口所在地 省 + "P_HUSBANDRRCITY as husbandCityRegisterId," +//丈夫户口所在地 市 + "P_HUSBANDRRCOUNTY as husbandAreaRegisterId," +//丈夫户口所在地 县 + "P_HUSBANDRRSTREET as husbandStreetRegisterId," +//丈夫户口所在地 街道 + "VC_CARDNO as vcCardNo, " +//就诊卡号 条码号 + "P_BIRTHDAY as birthday, " +//孕妇生日 + "P_LASTMENSTRUALPERIOD as lastMenstrualPeriod," +//末次月经 + "YCQ as dueDate," +//预产期 + "P_FILINGTIME as bookbuildingDate," +//建档日期 + "P_HOSPITALID as hospitalId " +//医院Id + " FROM V_SYNC_TO_V3_PATIENT T " + + "LEFT join v_sync_to_v3_pdr pdr on pdr.p_no = t.p_no "+ + "WHERE TRUNC(T.P_FILINGTIME) between TO_DATE('" + startTime + "','YYYY-MM-DD') AND TO_DATE('" + endTime + "','YYYY-MM-DD') " + + "and pdr.p_no is null " + + "and ( P_ADDRESSCOUNTY='160' " +//居住地区(桃城区) + "OR P_POSTPARTUMCOUNTY='160' " +//产后区县(桃城区) + "OR P_RRCOUNTY ='160')"; + } + + + public static Connection getConnection() { Connection connection; try { Class.forName("oracle.jdbc.OracleDriver"); diff --git a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/SaveByV2ThreadPoolFacade.java b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/SaveByV2ThreadPoolFacade.java new file mode 100644 index 0000000..6c9af4f --- /dev/null +++ b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/SaveByV2ThreadPoolFacade.java @@ -0,0 +1,129 @@ +package com.lyms.platform.operate.web.facade; + +import com.lyms.platform.common.result.BaseObjectResponse; +import com.lyms.platform.operate.web.request.SyncV2HistoryRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Component +public class SaveByV2ThreadPoolFacade { + + @Autowired + private BookbuildingFacade bookbuildingFacade; + + public void exec(List list) throws InterruptedException { + //初始化线程处理500条数据 + int count = 500; + int listSize = list.size(); + int runSize = (listSize / count) + 1; + //线程数最大设置10个 + if (runSize>10){ + runSize=10; + count= listSize/runSize; + } + List newlist = null; + //创建一个线程池,数量和开启线程的数量一样 + ExecutorService executor = Executors.newFixedThreadPool(runSize); + CountDownLatch begin = new CountDownLatch(1); + CountDownLatch end = new CountDownLatch(runSize); + for (int i = 0; i < runSize; i++) { + //计算每个线程执行的数据 + if ((i + 1) == runSize) { + int startIndex = (i * count); + int endIndex = list.size(); + newlist = list.subList(startIndex, endIndex); + } else { + int startIndex = (i * count); + int endIndex = (i + 1) * count; + newlist = list.subList(startIndex, endIndex); + } + MyThread mythead = new MyThread(newlist, begin, end,bookbuildingFacade); + MyThread2 mythead2 = new MyThread2(bookbuildingFacade, newlist, begin, end); + executor.execute(mythead2); +// executor.execute(mythead); + } + + begin.countDown(); + end.await(); + executor.shutdown(); + } + +} + +class MyThread implements Runnable { + private BookbuildingFacade bookbuildingFacade; + private List list; + private CountDownLatch begin; + private CountDownLatch end; + + public MyThread(List list, CountDownLatch begin, CountDownLatch end,BookbuildingFacade bookbuildingFacade) { + this.list = list; + this.begin = begin; + this.end = end; + this.bookbuildingFacade = bookbuildingFacade; + } + + @Override + public void run() { + try { + for (int i = 0; i < list.size(); i++) { + /* + 2: 具体插入实现在这里写 + */ + BaseObjectResponse p = bookbuildingFacade.addPregnantBookbuilding(list.get(i), null, false);//Integer.parseInt(list.getBookbuildingDoctor() + System.out.println(p.getData()); + System.out.println("当前线程名称:"+Thread.currentThread().getName()+"======存储的数据内容:"+p.getData() + ); + } + //执行完让线程直接进入等待 + begin.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + end.countDown(); + } + } + + +} +class MyThread2 implements Runnable { + private BookbuildingFacade bookbuildingFacade; + private List list; + private CountDownLatch begin; + private CountDownLatch end; + + public MyThread2(BookbuildingFacade bookbuildingFacade, List list, CountDownLatch begin, CountDownLatch end) { + this.bookbuildingFacade = bookbuildingFacade; + this.list = list; + this.begin = begin; + this.end = end; + } + + @Override + public void run() { + System.out.println("123456"); + + try { + for (int i = 0; i < list.size(); i++) { + /* + 2: 具体插入实现在这里写 + */ + BaseObjectResponse p = bookbuildingFacade.addPregnantBookbuilding(list.get(i), null, false);//Integer.parseInt(list.getBookbuildingDoctor() + System.out.println(p.getData()); + System.out.println("当前线程名称:"+Thread.currentThread().getName()+"======存储的数据内容:"+p.getData() + ); + } + //执行完让线程直接进入等待 + begin.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + end.countDown(); + } + } +} \ No newline at end of file diff --git a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/utils/FixedThreadPoolUtil.java b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/utils/FixedThreadPoolUtil.java new file mode 100644 index 0000000..ad8c203 --- /dev/null +++ b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/utils/FixedThreadPoolUtil.java @@ -0,0 +1,109 @@ +package com.lyms.platform.operate.web.utils; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class FixedThreadPoolUtil { + + public static void exec(List list) throws InterruptedException { + int count = 30000; //一个线程处理300条数据 + int listSize = list.size(); //数据集合大小 + int runSize = (listSize / count) + 1; //开启的线程数 + if (runSize>10){//线程数最大设置30个,自己定义的 + runSize=10; + count= listSize/runSize; + } + List newlist = null; //存放每个线程的执行数据 + ExecutorService executor = Executors.newFixedThreadPool(runSize); //创建一个线程池,数量和开启线程的数量一样 + //创建两个个计数器 + CountDownLatch begin = new CountDownLatch(1); + CountDownLatch end = new CountDownLatch(runSize); + //循环创建线程 + for (int i = 0; i < runSize; i++) { + //计算每个线程执行的数据 + if ((i + 1) == runSize) { + int startIndex = (i * count); + int endIndex = list.size(); + newlist = list.subList(startIndex, endIndex); + } else { + int startIndex = (i * count); + int endIndex = (i + 1) * count; + newlist = list.subList(startIndex, endIndex); + } + //线程类 + MyThread mythead = new MyThread(newlist, begin, end); + //这里执行线程的方式是调用线程池里的executor.execute(mythead)方法。 + executor.execute(mythead); + } + + begin.countDown(); + end.await(); + //执行完关闭线程池 + executor.shutdown(); + } + + //测试 +// public static void main(String[] args) { +// List list = new ArrayList(); +// long start=System.currentTimeMillis(); +// System.out.println("start==" + start); +// Strtest strtest=new Strtest("王明",1); +// //数据越大线程越多 +// for (int i = 0; i < 3000; i++) { +//// list.add("hello" + i); +// list.add(new Strtest(i+"王明",1+i)); +// } +// try { +// FixedThreadPoolUtil.exec(list); +// long end=System.currentTimeMillis(); +// System.out.println("end=="+end); +// System.out.println("end-start="+(end-start)); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// } +} + +class MyThread implements Runnable { + private List list; + private CountDownLatch begin; + private CountDownLatch end; + + //创建个构造函数初始化 list,和其他用到的参数 + public MyThread(List list, CountDownLatch begin, CountDownLatch end) { + this.list = list; + this.begin = begin; + this.end = end; + } + + @Override + public void run() { + try { + for (int i = 0; i < list.size(); i++) { + /* + 2: 具体插入实现在这里写 + */ + //这里还要说一下,,由于在实质项目中,当处理的数据存在等待超时和出错会使线程一直处于等待状态 + //这里只是处理简单的, + //分批 批量插入 +// Thread.sleep(3000); + System.out.println("当前线程名称:"+Thread.currentThread().getName()+"======存储的数据内容:"+i + ); + } + //执行完让线程直接进入等待 + begin.await(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + //这里要主要了,当一个线程执行完 了计数要减一不然这个线程会被一直挂起 + // ,end.countDown(),这个方法就是直接把计数器减一的 + end.countDown(); + } + } + + +} diff --git a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/worker/CorrectDataWorker2.java b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/worker/CorrectDataWorker2.java new file mode 100644 index 0000000..ef417f4 --- /dev/null +++ b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/worker/CorrectDataWorker2.java @@ -0,0 +1,110 @@ +package com.lyms.platform.operate.web.worker; + +import com.lyms.platform.biz.service.AntenatalExaminationService; +import com.lyms.platform.biz.service.PatientsService; +import com.lyms.platform.biz.service.PostReviewService; +import com.lyms.platform.common.enums.YnEnums; +import com.lyms.platform.common.utils.ExceptionUtils; +import com.lyms.platform.operate.web.facade.AntenatalExaminationFacade; +import com.lyms.platform.pojo.AntExChuModel; +import com.lyms.platform.pojo.AntenatalExaminationModel; +import com.lyms.platform.pojo.Patients; +import com.lyms.platform.query.AntExChuQuery; +import com.lyms.platform.query.AntExQuery; +import com.lyms.platform.query.PostReviewQuery; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.data.domain.Sort; + +import java.util.Date; +import java.util.List; +import java.util.concurrent.atomic.AtomicLong; + +/** + * 纠正数据线程 + *

+ * Created by Administrator on 2016/10/25 0025. + */ +public class CorrectDataWorker2 extends Thread { + + private PostReviewService postReviewService; + + private PatientsService patientsService; + + private AntenatalExaminationService antExService; + + private AntenatalExaminationFacade antExFacade; + + private List patientses; + + private AtomicLong counter; + + public CorrectDataWorker2(List patientses, + PostReviewService postReviewService, + PatientsService patientsService, + AntenatalExaminationService antExService, + AntenatalExaminationFacade antExFacade, + AtomicLong counter) { + this.patientses = patientses; + this.patientsService = patientsService; + this.postReviewService = postReviewService; + this.antExService = antExService; + this.antExFacade = antExFacade; + this.counter = counter; + } + + @Override + public void run() { + //最后一次高危时间 + // Date lastRhTime; + //本院最后一次产检时间 + //Date lastCTime; + //本院产后复查次数 + //Integer postViewTimes; + try { + for (Patients patients : patientses) { + Patients patients1 = new Patients(); + patients1.setId(patients.getId()); + //产后复查次数 + PostReviewQuery postReviewQuery = new PostReviewQuery(); + postReviewQuery.setHospitalId(patients.getHospitalId()); + postReviewQuery.setYn(YnEnums.YES.getId()); + postReviewQuery.setParentId(patients.getId()); + //产后复查次数 + patients1.setPostViewTimes(postReviewService.count(postReviewQuery)); + //最后产检时间 + patients1.setLastCTime(findLastCTime(patients.getId())); + + patientsService.updatePatient(patients1); + //修改最后一次定义高危时间 + antExFacade.updateLastRhTime(patients.getId(), patients.getHospitalId()); + //修改高危 + antExFacade.updateLastRisk(patients.getId()); + + counter.incrementAndGet(); + } + } catch (Exception e) { + ExceptionUtils.catchException(e, "CorrectDataWorker Error."); + } + } + + + private Date findLastCTime(String id) { + AntExQuery antExQuery = new AntExQuery(); + antExQuery.setParentId(id); + antExQuery.setYn(YnEnums.YES.getId()); + + List antEx = antExService.queryAntenatalExamination(antExQuery.convertToQuery().addOrder(Sort.Direction.DESC, "checkDate")); + if (CollectionUtils.isNotEmpty(antEx)) { + return antEx.get(0).getCheckDate(); + } else { + AntExChuQuery antExChuQuery = new AntExChuQuery(); + antExChuQuery.setParentId(id); + antExChuQuery.setYn(YnEnums.YES.getId()); + List antExChu = antExService.queryAntExChu(antExChuQuery); + if (CollectionUtils.isNotEmpty(antExChu)) { + return antExChu.get(0).getCheckTime(); + } + } + return null; + } +}