123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- package thyyxxk.webserver.api.dpcc;
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONObject;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.http.HttpEntity;
- import org.springframework.http.HttpHeaders;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.bind.annotation.RestController;
- import org.springframework.web.client.RestTemplate;
- import thyyxxk.webserver.api.dpcc.model.MedicalCheckResult;
- import thyyxxk.webserver.api.dpcc.model.MedicalPrescription;
- import thyyxxk.webserver.api.dpcc.model.PatientInfo;
- import thyyxxk.webserver.api.medicallaboratory.model.Category;
- import thyyxxk.webserver.config.auth.PassToken;
- import thyyxxk.webserver.dao.his.api.DpccDao;
- import thyyxxk.webserver.entity.examinations.inspections.request.PatType;
- import thyyxxk.webserver.entity.examinations.inspections.request.ReportIndexInquiry;
- import thyyxxk.webserver.factory.examreport.ExamReportService;
- import thyyxxk.webserver.factory.examreport.model.*;
- import thyyxxk.webserver.service.TokenService;
- import thyyxxk.webserver.utils.DateUtil;
- import thyyxxk.webserver.utils.StringUtil;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import java.util.Map;
- @Slf4j
- @RestController
- @RequestMapping("/api/dpcc")
- public class DpccController {
- private static final String TOKEN_URL = "https://manage.national-dpcc.com/api/sino-auth/oauth/token";
- private static final String CHECK_URL = "https://manage.national-dpcc.com/api/sino-common/access-client/uploadHisCheckData";
- private static final String DRUG_URL = "https://manage.national-dpcc.com/api/sino-common/access-client/uploadHisDrugData";
- private final DpccDao dao;
- private final TokenService tokenService;
- @Autowired
- public DpccController(DpccDao dao, TokenService tokenService) {
- this.dao = dao;
- this.tokenService = tokenService;
- }
- @PassToken
- @GetMapping("/getToken")
- public String getToken() {
- String clientName = "sino-client-csthyy";
- String clientSecret = "sino-client-csthyy";
- HttpHeaders headers = new HttpHeaders();
- headers.setBasicAuth(clientName, clientSecret);
- String url = TOKEN_URL + "?grant_type=access_client&" +
- "username=sino-client-csthyy&" +
- "password=d60dc4bf4acfa8956cd6819dba6966d0dab1ddac";
- JSONObject response = new RestTemplate().postForObject(url,
- new HttpEntity<>(null, headers), JSONObject.class);
- log.info("DPCC获取TOKEN:{}", response);
- if (null == response) {
- return "ERROR:NETWORK_ERROR";
- }
- Integer code = response.getInteger("code");
- if (null == code) {
- return "ERROR:NETWORK_ERROR";
- }
- if (code != 200) {
- return "ERROR:" + response.getString("msg");
- }
- return response.getJSONObject("data").getString("access_token");
- }
- @PassToken
- @GetMapping("/uploadHisData")
- public String uploadHisData(@RequestParam("token") String token) throws Exception {
- log.info("DPCC上传请求:{}", token);
- List<PatientInfo> inpatientList = dao.getInpatientList();
- List<PatientInfo> outpatientList = dao.getOutpatientList();
- if (inpatientList.isEmpty() && outpatientList.isEmpty()) {
- return "没有需要上传的数据。";
- }
- ReportIndexInquiry inquiry = getReportIndexInquiry();
- uploadInpatientCheck(inpatientList, inquiry, token);
- uploadOutpatientCheck(outpatientList, inquiry, token);
- uploadInpatientDrug(inpatientList, token);
- uploadOutpatientDrug(outpatientList, token);
- return "OK";
- }
- @PassToken
- @GetMapping("/uploadMzDpcc")
- public String uploadMzYp(@RequestParam("pat") String pat,
- @RequestParam("day") Integer day) throws Exception {
- String token = tokenService.getDpccToken();
- ReportIndexInquiry inquiry = getReportIndexInquiry();
- log.info("DPCC上传请求:{}, {}", pat, day);
- List<PatientInfo> outpatientList;
- if (pat.contains("_")) {
- String[] patinfo = pat.split("_");
- String patientId = patinfo[0];
- int times = Integer.parseInt(patinfo[1]);
- String socialNo = dao.getSocialNo(patientId);
- PatientInfo pi = new PatientInfo();
- pi.setPatNo(patientId);
- pi.setTimes(times);
- pi.setSource("1");
- pi.setIdCard(socialNo);
- outpatientList = new ArrayList<>();
- outpatientList.add(pi);
- Map<String, String> map = dao.getStartAndEndDate(patientId, times);
- if (null != map) {
- inquiry.setReqStartTime(map.get("start"));
- inquiry.setReqEndTime(map.get("endd"));
- }
- } else {
- outpatientList = dao.getOutpatientList2(day);
- }
- if (outpatientList.isEmpty()) {
- return "没有需要上传的数据。";
- }
- uploadOutpatientCheck(outpatientList,inquiry,token);
- uploadOutpatientDrug(outpatientList, token);
- return "OK";
- }
- private ReportIndexInquiry getReportIndexInquiry() {
- String now = DateUtil.formatDate(new Date());
- String start = now + " 00:00:00";
- String end = now + " 23:59:59";
- ReportIndexInquiry inquiry = new ReportIndexInquiry();
- inquiry.setReqStartTime(start);
- inquiry.setReqEndTime(end);
- inquiry.setReportCategory(Category.JY);
- return inquiry;
- }
- private void uploadInpatientCheck(List<PatientInfo> inpatientList, ReportIndexInquiry inquiry, String token) throws Exception {
- inquiry.setPatType(PatType.InPatient);
- for (PatientInfo inpatient : inpatientList) {
- queryCheckAndUpload(inquiry, inpatient, token);
- }
- }
- private void uploadOutpatientCheck(List<PatientInfo> outpatientList, ReportIndexInquiry inquiry, String token) throws Exception {
- inquiry.setPatType(PatType.OutPatient);
- for (PatientInfo outpatient : outpatientList) {
- queryCheckAndUpload(inquiry, outpatient, token);
- }
- }
- private List<ExamIndexResponse> getExamIndex(ReportIndexInquiry inquiry) {
- ExamIndexRequest request = new ExamIndexRequest.Builder()
- .patientNumType(inquiry.getPatType()).patientNum(inquiry.getPatNo())
- .startDate(inquiry.getReqStartTime()).endDate(inquiry.getReqEndTime()).build();
- ExamReportService examReportService = new ExamReportService();
- return examReportService.queryExamIndex(request);
- }
- private ExamDetailResponse getExamDetail(String reportId) {
- ExamReportService examReportService = new ExamReportService();
- return examReportService.queryExamDetail(reportId);
- }
- private boolean reportTimeValid(ExamDetailOrder order) {
- Date auditTime = DateUtil.parse(order.getAudtTime());
- if (null == auditTime) {
- return false;
- }
- Date now = new Date();
- long diff = now.getTime() - auditTime.getTime();
- return diff / 1000 / 60 / 60 <= 72;
- }
- private void queryCheckAndUpload(ReportIndexInquiry inquiry, PatientInfo patient, String token) throws Exception {
- List<MedicalCheckResult> checkResultBatches = new ArrayList<>();
- inquiry.setPatNo(patient.getPatNo());
- List<ExamIndexResponse> indexList = getExamIndex(inquiry);
- for (ExamIndexResponse index : indexList) {
- ExamDetailResponse detail = getExamDetail(index.getReportId());
- if (reportTimeValid(detail.getOrder())) {
- patient.setReportId(index.getReportId());
- patient.setInspectTime(detail.getOrder().getInspectTime());
- if (StringUtil.isBlank(patient.getInspectTime())) {
- patient.setInspectTime(detail.getOrder().getAudtTime());
- }
- for (ExamDetailItem item : detail.getItems()) {
- if (StringUtil.isBlank(item.getItmUnit())) {
- continue;
- }
- if (StringUtil.isBlank(item.getItmValue()) && StringUtil.isBlank(item.getItmStrValue())) {
- continue;
- }
- checkResultBatches.add(getMedicalCheckResult(patient, item));
- if (checkResultBatches.size() == 100) {
- executeUploadChecks(checkResultBatches, token, patient.getPatNo(), patient.getTimes());
- }
- }
- }
- }
- if (!checkResultBatches.isEmpty()) {
- executeUploadChecks(checkResultBatches, token, patient.getPatNo(), patient.getTimes());
- }
- }
- private MedicalCheckResult getMedicalCheckResult(PatientInfo patient, ExamDetailItem item) {
- MedicalCheckResult checkResult = new MedicalCheckResult();
- checkResult.setSource(patient.getSource());
- checkResult.setIdCard(patient.getIdCard());
- checkResult.setPatientNo(patient.getPatNo());
- checkResult.setCheckNo(patient.getReportId());
- checkResult.setTestTime(patient.getInspectTime());
- checkResult.setHisItemCode(item.getItmCode());
- checkResult.setHisItemName(item.getItmName());
- checkResult.setHisItemResult(item.getItmValue());
- if (StringUtil.isBlank(checkResult.getHisItemResult())) {
- checkResult.setHisItemResult(item.getItmStrValue());
- }
- checkResult.setHisItemUnit(item.getItmUnit());
- checkResult.setUniqueIndex(patient.getReportId() + "_" + item.getItmId());
- return checkResult;
- }
- private void uploadInpatientDrug(List<PatientInfo> inpatientList, String token) throws Exception {
- List<MedicalPrescription> drugBatches = new ArrayList<>();
- for (PatientInfo inpatient : inpatientList) {
- String patNo = inpatient.getPatNo();
- List<MedicalPrescription> drugs = dao.getInpatientDrugs(inpatient);
- for (MedicalPrescription item : drugs) {
- item.setIdCard(inpatient.getIdCard());
- drugBatches.add(item);
- if (drugBatches.size() == 100) {
- executeUploadDrugs(drugBatches, token, patNo, -1);
- drugBatches.clear();
- }
- }
- if (!drugBatches.isEmpty()) {
- executeUploadDrugs(drugBatches, token, patNo, -1);
- }
- }
- }
- private void uploadOutpatientDrug(List<PatientInfo> outpatientList, String token) throws Exception {
- for (PatientInfo outpatient : outpatientList) {
- String patNo = outpatient.getPatNo();
- int times = outpatient.getTimes();
- List<MedicalPrescription> drugBatches = new ArrayList<>();
- List<MedicalPrescription> drugs = dao.getOutpatientDrugs(outpatient);
- for (MedicalPrescription item : drugs) {
- item.setIdCard(outpatient.getIdCard());
- drugBatches.add(item);
- if (drugBatches.size() == 100) {
- executeUploadDrugs(drugBatches, token, patNo, times);
- drugBatches.clear();
- }
- }
- if (!drugBatches.isEmpty()) {
- executeUploadDrugs(drugBatches, token, patNo, times);
- }
- }
- }
- private void executeUploadChecks(List<MedicalCheckResult> checkBatches,
- String token, String patNo, int times) throws Exception {
- String json = JSON.toJSONString(checkBatches);
- log.info("DPCC上传检验:{}, {}", patNo, times);
- uploadToSino(DpccEncryptUtil.encrypt(json), Type.CHECK, token);
- }
- private void executeUploadDrugs(List<MedicalPrescription> drugBatches,
- String token, String patNo, int times) throws Exception {
- String json = JSON.toJSONString(drugBatches);
- log.info("DPCC上传药品:{}, {}", patNo, times);
- int res = uploadToSino(DpccEncryptUtil.encrypt(json), Type.DRUG, token);
- if (res == 200 && times != -1) {
- dao.updateDpccFlag(patNo, times);
- }
- }
- private int uploadToSino(String encrypt, Type type, String token) {
- String url = type == Type.CHECK ? CHECK_URL : DRUG_URL;
- String label = type == Type.CHECK ? "检验" : "药品";
- HttpHeaders headers = new HttpHeaders();
- headers.add("Sino-auth", token);
- JSONObject data = new JSONObject();
- data.put("data", encrypt);
- HttpEntity<JSONObject> body = new HttpEntity<>(data, headers);
- String response = new RestTemplate().postForObject(url, body, String.class);
- log.info("DPCC上传{}返回:{}", label, response);
- if (StringUtil.notBlank(response)) {
- JSONObject json = JSON.parseObject(response);
- Integer code = json.getInteger("code");
- return null == code ? -1 : code;
- }
- return -1;
- }
- enum Type {
- CHECK,
- DRUG,
- }
- }
|