package com.example.service.xian; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.example.config.ConfigValue; import com.example.domain.TjCustomer; import com.example.dto.xian.meiji.CheXiaoMzFyDto; import com.example.dto.xian.meiji.CreateMenZhenFyDto; import com.example.service.HisService; import com.example.service.ISysConfigService; import com.example.utils.HttpClientUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.io.FileInputStream; import java.io.IOException; import java.time.Instant; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.TimeUnit; /** * @Company: 西安路泰科技有限公司 * @Author: zhaowenxuan * @Date: 2024/12/17 17:17 */ @Service("ShanXiXiAnMeiJi") public class MeiJiHisService implements HisService { // http://oapi.pbkwyy.com/OAPI/oauth/token // grant_type:client_credentials // client_id:XFZZQEfXTZ7exhhi // client_secret:05a192176c21edfcc9cf5fa26fc5a9e0c5b131ad // http://oapi.pbkwyy.com/OAPI @Autowired public MeiJiHisService(ApplicationContext applicationContext, ConfigValue configValue) { this.applicationContext = applicationContext; this.configValue = configValue; HIS_URL = configValue.getConfigValue("his_api_url") + ":" + configValue.getConfigValue("his_api_port") +"/OAPI/"; } @Autowired private ISysConfigService configService; @Autowired private RedisTemplate redisTemplate; private ConfigValue configValue; private final ApplicationContext applicationContext; private final String HIS_URL; //获取token private JSONObject getToken () { String GRANT_TYPE = "client_credentials"; String CLIENT_ID = "XFZZQEfXTZ7exhhi"; String CLIENT_SECRET = "05a192176c21edfcc9cf5fa26fc5a9e0c5b131ad"; Map map = new HashMap<>(); map.put("grant_type", GRANT_TYPE); map.put("client_id", CLIENT_ID); map.put("client_secret", CLIENT_SECRET); // map.put("scope",SCOP); String post = sendPost (HIS_URL+"/oauth/token", map); if (StrUtil.isBlank(post)) return null; return JSONUtil.parseObj(post); } //建档 public String jianDang (TjCustomer customer) { String czy = configService.selectConfigByKey("dfhisczybm"); Map map = new HashMap<> (); map.put ("jiuZhenKh", customer.getPationId ()); map.put ("kaiLeiXing","4"); map.put ("xingMing", customer.getCusName ()); Long cusSex = customer.getCusSex(); if(cusSex==0L){ map.put ("xingBie","男"); }else if(cusSex==1L){ map.put ("xingBie","女"); }else { map.put ("xingBie","未知"); } map.put ("shenFenZh", customer.getCusIdcard ()); map.put ("danWeiBh",""); map.put ("chuShengRq", DateUtil.format(customer.getCusBrithday(),"yyyy-MM-dd")); map.put ("lianXiDz", customer.getCusAddr()); map.put ("lianXiDh", customer.getCusPhone ()); map.put ("feiYongLb",""); map.put ("feiYongXz",""); map.put ("jiLuLy","3"); map.put ("caoZuoYuan",czy); map.put ("chongZhiJe",""); map.put ("yiBaoKh",""); map.put ("geRenBh",""); map.put ("yiBaoBrXx",""); map.put ("gongZuoDw",customer.getCompName()); map.put ("canBaoXzMc",""); map.put ("muLuBlLb",""); map.put ("kunNanJzDj",""); map.put ("yiLiaoLb",""); map.put ("minZuDm",""); map.put ("minZuMc",""); //职业编码 return sendPost (HIS_URL+"/menZhenJz/jianDang", map); } //验证身份证是否建过档 public String getBingRenXxByShengFenZheng (TjCustomer customer) { String czy = configService.selectConfigByKey("dfhisczybm"); Map map = new HashMap<> (); map.put ("caoZuoYuan",czy); map.put ("shenFenZh", customer.getCusIdcard ()); map.put ("danWeiBh",""); //职业编码 return sendPost (HIS_URL+"/menZhenJz/getBingRenXxByShengFenZheng", map); } //病人基本信息变更 public String saveBingRenXx (TjCustomer customer) { String czy = configService.selectConfigByKey("dfhisczybm"); Map map = new HashMap<> (); map.put ("jiuZhenKh", customer.getPationId ()); map.put ("kaiLeiXing","4"); map.put ("xingMing", customer.getCusName ()); Long cusSex = customer.getCusSex(); if(cusSex==0L){ map.put ("xingBie","男"); }else if(cusSex==1L){ map.put ("xingBie","女"); }else { map.put ("xingBie","未知"); } map.put ("shenFenZh", customer.getCusIdcard ()); map.put ("danWeiBh",""); map.put ("chuShengRq", DateUtil.format(customer.getCusBrithday(),"yyyy-MM-dd")); map.put ("lianXiDz", customer.getCusAddr()); map.put ("lianXiDh", customer.getCusPhone ()); map.put ("feiYongLb",""); map.put ("feiYongXz",""); map.put ("jiLuLy","3"); map.put ("caoZuoYuan",czy); //职业编码 return sendPost (HIS_URL+"/menZhenJz/saveBingRenXx", map); } //待收费费用查询 public String getListDaiShouFei (String bingRenId, String jiuZhenKh, String yuanQuId) { Map map = new HashMap<> (); map.put ("bingRenId",bingRenId); map.put ("jiuZhenKh",jiuZhenKh); map.put ("yuanQuId",yuanQuId); //职业编码 return sendPost (HIS_URL+"/shouFei/getListDaiShouFei", map); } //生成待收费/待退费 费用 public String createMenZhenFy (CreateMenZhenFyDto dto) { String czy = configService.selectConfigByKey("dfhisczybm"); Map map = new HashMap<> (); map.put ("bingRenId",dto.getBingRenId()); map.put ("jiuZhenKh",dto.getJiuZhenKh()); map.put ("caoZuoYuan",czy); map.put ("yuanQuId",dto.getYuanQuId()); map.put ("yingYongId",dto.getYingYongId()); map.put ("kaiDanKs",dto.getKaiDanKs()); map.put ("dengJiLsh",dto.getDengJiLsh()); map.put ("shouTuiBz",dto.getShouTuiBz()); map.put ("feiYongMxList",dto.getFeiYongMxList()); //职业编码 return sendPost (HIS_URL+"/shouFei/createMenZhenFy", map); } //门诊未收费费用撤销 public String cheXiaoMzFy (CheXiaoMzFyDto dto) { Map map = new HashMap<> (); map.put ("bingRenId",dto.getBingRenId()); map.put ("jiuZhenKh",dto.getJiuZhenKh()); map.put ("feiYongIdList",dto.getFeiYongIdList()); //职业编码 return sendPost (HIS_URL+"/shouFei/cheXiaoMzFy", map); } //收费/退费完成通知第三方 public String pushZhiFuMsg (String feiYongId, int yeWuLx ) { Map map = new HashMap<> (); map.put ("feiYongId",feiYongId); map.put ("yeWuLx",yeWuLx); //职业编码 return sendPost (HIS_URL+"/shouFei/pushZhiFuMsg", map); } //科室信息查询 public String getKeShi (String yuanQuId, String keShiMc, int pageIndex, int pageSize ) { Map map = new HashMap<> (); map.put ("yuanQuId",yuanQuId); map.put ("keShiMc",keShiMc); map.put ("pageIndex",pageIndex); map.put ("pageSize",pageSize); //职业编码 return sendPost (HIS_URL+"/zhuShuJu/getKeShi", map); } //医生信息查询 public String getListYiShengZd (String yuanQuId, String keShiMc, int pageIndex, int pageSize ) { Map map = new HashMap<> (); map.put ("yuanQuId",yuanQuId); map.put ("keShiMc",keShiMc); map.put ("bianGengSj",""); map.put ("pageIndex",pageIndex); map.put ("pageSize",pageSize); //职业编码 return sendPost (HIS_URL+"/zhuShuJu/getListYiShengZd", map); } //获取收费项目分页 public String getShouFeiXm (String queryString, String bianGengSj, int pageIndex, int pageSize ) { Map map = new HashMap<> (); map.put ("queryString",queryString); map.put ("bianGengSj",bianGengSj); map.put ("pageIndex",pageIndex); map.put ("pageSize",pageSize); //职业编码 return sendPost (HIS_URL+"/zhuShuJu/getShouFeiXm", map); } /** * 科室信息推送 * * @param xingZhiSx 组织属性 第一位1 表示 挂号 * 第二位 1表示临床 * 第三位 1表示检查 * 第四位 1 表示手术 * 第五位 1 表示治疗 * 第六位 1 表示护理 * @param queryString 模糊匹配输⼊码1、科室名称 * @param zuoFeiBz 作废标志:0 正常;1 作废 * @param yuanQuId 院区id * @param keShiIds 科室ID集合 * @param ifPlus 是否查询plus属性 * @return */ public String getKeShiByConditions (int xingZhiSx, String queryString, int zuoFeiBz, String yuanQuId, List keShiIds, int ifPlus) { Map map = new HashMap<> (); map.put ("xingZhiSx",xingZhiSx); map.put ("queryString",queryString); map.put ("zuoFeiBz",zuoFeiBz); map.put ("yuanQuId",yuanQuId); map.put ("keShiIds",keShiIds); map.put ("ifPlus",ifPlus); //职业编码 return sendPost (HIS_URL+"/zhuShuJu/getKeShiByConditions", map); } /** * 取样本字典 * * @param queryString 样本类型名称(样本名称/样本类型id) * @param pageIndex * @param pageSize 每⻚条数(最⼤不能超过100) * @return */ public String getYangBen (String queryString, int pageIndex, int pageSize ) { Map map = new HashMap<> (); map.put ("queryString",queryString); map.put ("pageIndex",pageIndex); map.put ("pageSize",pageSize); //职业编码 return sendPost (HIS_URL+"/zhuShuJu/getYangBen", map); } /** * 病区信息推送 * * @param yuanQuId 院区Id * @param keShiId 科室Id * @param pageIndex 当前⻚ * @param pageSize 每⻚条数(最⼤不能超过100) * @return */ public String getListBingQuZd (String yuanQuId, String keShiId, int pageIndex, int pageSize ) { Map map = new HashMap<> (); map.put ("yuanQuId",yuanQuId); map.put ("keShiId",keShiId); map.put ("pageIndex",pageIndex); map.put ("pageSize",pageSize); //职业编码 return sendPost (HIS_URL+"/zhuShuJu/getListBingQuZd", map); } /** * 职⼯信息 * * @param bianGengSj 变更时间 * @param pageIndex 当前⻚ * @param pageSize 每⻚条数(最⼤不能超过100) * @return */ public String getZhiGongPage (String bianGengSj, int pageIndex, int pageSize ) { Map map = new HashMap<> (); map.put ("bianGengSj",bianGengSj); map.put ("pageIndex",pageIndex); map.put ("pageSize",pageSize); //职业编码 return sendPost (HIS_URL+"/zhuShuJu/getZhiGongPage", map); } /** * 检查项目 * * @param queryString * @param bianGengSj * @param pageIndex * @param pageSize * @return */ public String getJianChaXm (String queryString, String bianGengSj, int pageIndex, int pageSize ) { Map map = new HashMap<> (); map.put ("queryString",queryString); map.put ("bianGengSj",bianGengSj); map.put ("pageIndex",pageIndex); map.put ("pageSize",pageSize); //职业编码 return sendPost (HIS_URL+"/zhuShuJu/getJianChaXm", map); } /** * 检验项⽬推送 * * @param queryCode 查询码(项⽬编码/拼⾳码 * @param page 当前⻚ * @param size 每⻚条数(最⼤不能超过100 * @return */ public String getJianYanXm(String queryCode, Integer page, Integer size){ HashMap hashMap = new HashMap<>(); hashMap.put("queryCode",queryCode); hashMap.put("page",page); hashMap.put("size",size); return sendPost (HIS_URL+"/zhuShuJu/getJianYanXm", hashMap); } /** * 检验项⽬收费推送 * * @param shouFeiXmId 收费项⽬id * @param jiaGeTx 价格体系 * @return */ public String getShouFeiXmJg(String shouFeiXmId, String jiaGeTx){ HashMap hashMap = new HashMap<>(); hashMap.put("shouFeiXmId",shouFeiXmId); hashMap.put("jiaGeTx",jiaGeTx); return sendPost (HIS_URL+"/zhuShuJu/getShouFeiXmJg", hashMap); } /** * 检验容器 * * @param queryString 容器名称(容器名称/输⼊码1) * @param pageIndex 当前⻚ * @param pageSize 每⻚条数(最⼤不能超过100) * @return */ public String getRongQi(String queryString, Integer pageIndex, Integer pageSize){ HashMap hashMap = new HashMap<>(); hashMap.put("queryString",queryString); hashMap.put("pageIndex",pageIndex); hashMap.put("pageSize",pageSize); return sendPost (HIS_URL+"/zhuShuJu/getRongQi", hashMap); } /** * 检验样本 * * @param queryString 样本类型名称(样本名称/样本类型id) * @param pageIndex 当前⻚ * @param pageSize 每⻚条数(最⼤不能超过100) * @return */ public String getJyYangBen(String queryString, Integer pageIndex, Integer pageSize){ HashMap hashMap = new HashMap<>(); hashMap.put("queryString",queryString); hashMap.put("pageIndex",pageIndex); hashMap.put("pageSize",pageSize); return sendPost (HIS_URL+"/zhuShuJu/getYangBen", hashMap); } private String sendPost(String url,Map hashMap){ Map entries = redisTemplate.opsForHash().entries("token:his:df"); if (entries != null && !entries.isEmpty()) { String timeStr = entries.get("time").toString(); String expiresInStr = entries.get("expires_in").toString(); long time = Long.parseLong(timeStr); long expiresIn = Long.parseLong(expiresInStr); Instant tokenExpirationTime = Instant.ofEpochSecond(time).plusSeconds(expiresIn); Instant now = Instant.now(); if (now.isAfter(tokenExpirationTime)){ return refreshToken(url,hashMap); }else { String accessToken = entries.get("access_token").toString(); String tokenType = entries.get("token_type").toString(); String string = HttpClientUtils.sendPostToken(url, hashMap, tokenType + " " + accessToken); return StrUtil.isNotBlank(string) ? string : JSONUtil.createObj().toString(); } }else { return refreshToken(url, hashMap); } } private String refreshToken(String url, Map hashMap) { JSONObject parseObj = getToken(); if (parseObj != null) { Integer expiresIn = parseObj.getInt("expires_in"); if (expiresIn != null) { parseObj.putOpt("time", Instant.now().getEpochSecond()); redisTemplate.opsForHash().putAll("token:his:df", parseObj); redisTemplate.expire("token:his:df", expiresIn - 10, TimeUnit.SECONDS); String accessToken = parseObj.getStr("access_token"); String tokenType = parseObj.getStr("token_type"); String string = HttpClientUtils.sendPostToken(url, hashMap, tokenType + " " + accessToken); return StrUtil.isNotBlank(string) ? string : JSONUtil.createObj().toString(); } } return JSONUtil.createObj().toString(); } }