package com.example.service.xian;
|
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.json.JSON;
|
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONUtil;
|
import com.example.domain.TjCustomer;
|
import com.example.dto.xian.meiji.CheXiaoMzFyDto;
|
import com.example.dto.xian.meiji.CreateMenZhenFyDto;
|
import com.example.service.ISysConfigService;
|
import com.example.utils.HttpClientUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
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
|
*/
|
public class MeiJiService {
|
@Autowired
|
private ISysConfigService configService;
|
@Autowired
|
private RedisTemplate<String ,Object> redisTemplate;
|
|
private static String HIS_URL = "http://oapi.pbkwyy.com/OAPI";
|
|
private static String CONFIG_PATH;
|
|
private static String GRANT_TYPE = "client_credentials";
|
private static String CLIENT_ID = "XFZZQEfXTZ7exhhi";
|
private static String CLIENT_SECRET = "05a192176c21edfcc9cf5fa26fc5a9e0c5b131ad";
|
// private static String SCOP = "";
|
|
// http://oapi.pbkwyy.com/OAPI/oauth/token
|
// grant_type:client_credentials
|
// client_id:XFZZQEfXTZ7exhhi
|
// client_secret:05a192176c21edfcc9cf5fa26fc5a9e0c5b131ad
|
|
@Value("${config.properties}")
|
public void setConfigPath(String configPath) {
|
CONFIG_PATH = configPath;
|
try {
|
FileInputStream inputStream = new FileInputStream(CONFIG_PATH);
|
Properties props = new Properties();
|
props.load(inputStream);
|
String url = props.getProperty("df_his_api_url");
|
String port = props.getProperty("df_his_api_port");
|
GRANT_TYPE = props.getProperty("grant_type");
|
CLIENT_ID= props.getProperty("client_id");
|
CLIENT_SECRET = props.getProperty("client_secret");
|
// SCOP = props.getProperty("scope");
|
HIS_URL=url+":"+port+"/OAPI/";
|
} catch (IOException throwables) {
|
throwables.printStackTrace();
|
}
|
}
|
|
|
//获取token
|
private JSONObject getToken () {
|
Map<String, Object> 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;
|
JSONObject parseObj = JSONUtil.parseObj(post);
|
// 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);
|
// }
|
return parseObj;
|
}
|
|
//建档
|
public JSON jianDang (TjCustomer customer) {
|
String czy = configService.selectConfigByKey("dfhisczybm");
|
|
Map<String, Object> 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","");
|
//职业编码
|
String post = sendPost (HIS_URL+"/menZhenJz/jianDang", map);
|
return JSONUtil.parseObj(post);
|
}
|
|
//验证身份证是否建过档
|
public JSON getBingRenXxByShengFenZheng (TjCustomer customer) {
|
String czy = configService.selectConfigByKey("dfhisczybm");
|
Map<String, Object> map = new HashMap<> ();
|
map.put ("caoZuoYuan",czy);
|
map.put ("shenFenZh", customer.getCusIdcard ());
|
map.put ("danWeiBh","");
|
//职业编码
|
String post = sendPost (HIS_URL+"/menZhenJz/getBingRenXxByShengFenZheng", map);
|
return JSONUtil.parseObj(post);
|
}
|
|
//病人基本信息变更
|
public JSON saveBingRenXx (TjCustomer customer) {
|
String czy = configService.selectConfigByKey("dfhisczybm");
|
Map<String, Object> 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);
|
//职业编码
|
String post = sendPost (HIS_URL+"/menZhenJz/saveBingRenXx", map);
|
return JSONUtil.parseObj(post);
|
}
|
|
//待收费费用查询
|
public JSON getListDaiShouFei (String bingRenId,String jiuZhenKh,String yuanQuId) {
|
Map<String, Object> map = new HashMap<> ();
|
map.put ("bingRenId",bingRenId);
|
map.put ("jiuZhenKh",jiuZhenKh);
|
map.put ("yuanQuId",yuanQuId);
|
//职业编码
|
String post = sendPost (HIS_URL+"/shouFei/getListDaiShouFei", map);
|
return JSONUtil.parseObj(post);
|
}
|
|
|
//生成待收费/待退费 费用
|
public JSON createMenZhenFy (CreateMenZhenFyDto dto) {
|
String czy = configService.selectConfigByKey("dfhisczybm");
|
Map<String, Object> 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());
|
//职业编码
|
String post = sendPost (HIS_URL+"/shouFei/createMenZhenFy", map);
|
return JSONUtil.parseObj(post);
|
}
|
|
|
//门诊未收费费用撤销
|
public JSON cheXiaoMzFy (CheXiaoMzFyDto dto) {
|
Map<String, Object> map = new HashMap<> ();
|
map.put ("bingRenId",dto.getBingRenId());
|
map.put ("jiuZhenKh",dto.getJiuZhenKh());
|
map.put ("feiYongIdList",dto.getFeiYongIdList());
|
//职业编码
|
String post = sendPost (HIS_URL+"/shouFei/cheXiaoMzFy", map);
|
return JSONUtil.parseObj(post);
|
}
|
|
|
//收费/退费完成通知第三方
|
public JSON pushZhiFuMsg (String feiYongId,int yeWuLx ) {
|
Map<String, Object> map = new HashMap<> ();
|
map.put ("feiYongId",feiYongId);
|
map.put ("yeWuLx",yeWuLx);
|
//职业编码
|
String post = sendPost (HIS_URL+"/shouFei/pushZhiFuMsg", map);
|
return JSONUtil.parseObj(post);
|
}
|
|
|
//科室信息查询
|
public JSON getKeShi (String yuanQuId,String keShiMc,int pageIndex,int pageSize ) {
|
Map<String, Object> map = new HashMap<> ();
|
map.put ("yuanQuId",yuanQuId);
|
map.put ("keShiMc",keShiMc);
|
map.put ("pageIndex",pageIndex);
|
map.put ("pageSize",pageSize);
|
//职业编码
|
String post = sendPost (HIS_URL+"/zhuShuJu/getKeShi", map);
|
return JSONUtil.parseObj(post);
|
}
|
|
//医生信息查询
|
public JSON getListYiShengZd (String yuanQuId,String keShiMc,int pageIndex,int pageSize ) {
|
Map<String, Object> map = new HashMap<> ();
|
map.put ("yuanQuId",yuanQuId);
|
map.put ("keShiMc",keShiMc);
|
map.put ("bianGengSj","");
|
map.put ("pageIndex",pageIndex);
|
map.put ("pageSize",pageSize);
|
//职业编码
|
String post = sendPost (HIS_URL+"/zhuShuJu/getListYiShengZd", map);
|
return JSONUtil.parseObj(post);
|
}
|
|
|
//获取收费项目分页
|
public JSON getShouFeiXm (String queryString,String bianGengSj,int pageIndex,int pageSize ) {
|
Map<String, Object> map = new HashMap<> ();
|
map.put ("queryString",queryString);
|
map.put ("bianGengSj",bianGengSj);
|
map.put ("pageIndex",pageIndex);
|
map.put ("pageSize",pageSize);
|
//职业编码
|
String post = sendPost (HIS_URL+"/zhuShuJu/getShouFeiXm", map);
|
return JSONUtil.parseObj(post);
|
}
|
|
|
|
/**
|
*科室信息推送
|
* @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 JSON getKeShiByConditions (int xingZhiSx, String queryString, int zuoFeiBz, String yuanQuId, List<String> keShiIds, int ifPlus) {
|
Map<String, Object> 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);
|
//职业编码
|
String post = sendPost (HIS_URL+"/zhuShuJu/getKeShiByConditions", map);
|
return JSONUtil.parseObj(post);
|
}
|
|
|
|
/**
|
* 取样本字典
|
* @param queryString 样本类型名称(样本名称/样本类型id)
|
* @param pageIndex
|
* @param pageSize 每⻚条数(最⼤不能超过100)
|
* @return
|
*/
|
public JSON getYangBen (String queryString,int pageIndex,int pageSize ) {
|
Map<String, Object> map = new HashMap<> ();
|
map.put ("queryString",queryString);
|
map.put ("pageIndex",pageIndex);
|
map.put ("pageSize",pageSize);
|
//职业编码
|
String post = sendPost (HIS_URL+"/zhuShuJu/getYangBen", map);
|
return JSONUtil.parseObj(post);
|
}
|
|
|
/**
|
* 病区信息推送
|
* @param yuanQuId 院区Id
|
* @param keShiId 科室Id
|
* @param pageIndex 当前⻚
|
* @param pageSize 每⻚条数(最⼤不能超过100)
|
* @return
|
*/
|
public JSON getListBingQuZd (String yuanQuId,String keShiId,int pageIndex,int pageSize ) {
|
Map<String, Object> map = new HashMap<> ();
|
map.put ("yuanQuId",yuanQuId);
|
map.put ("keShiId",keShiId);
|
map.put ("pageIndex",pageIndex);
|
map.put ("pageSize",pageSize);
|
//职业编码
|
String post = sendPost (HIS_URL+"/zhuShuJu/getListBingQuZd", map);
|
return JSONUtil.parseObj(post);
|
}
|
|
/**
|
* 职⼯信息
|
* @param bianGengSj 变更时间
|
* @param pageIndex 当前⻚
|
* @param pageSize 每⻚条数(最⼤不能超过100)
|
* @return
|
*/
|
public JSON getZhiGongPage (String bianGengSj,int pageIndex,int pageSize ) {
|
Map<String, Object> map = new HashMap<> ();
|
map.put ("bianGengSj",bianGengSj);
|
map.put ("pageIndex",pageIndex);
|
map.put ("pageSize",pageSize);
|
//职业编码
|
String post = sendPost (HIS_URL+"/zhuShuJu/getZhiGongPage", map);
|
return JSONUtil.parseObj(post);
|
}
|
|
|
/**
|
* 检查项目
|
* @param queryString
|
* @param bianGengSj
|
* @param pageIndex
|
* @param pageSize
|
* @return
|
*/
|
public JSON getJianChaXm (String queryString,String bianGengSj,int pageIndex,int pageSize ) {
|
Map<String, Object> map = new HashMap<> ();
|
map.put ("queryString",queryString);
|
map.put ("bianGengSj",bianGengSj);
|
map.put ("pageIndex",pageIndex);
|
map.put ("pageSize",pageSize);
|
//职业编码
|
String post = sendPost (HIS_URL+"/zhuShuJu/getJianChaXm", map);
|
return JSONUtil.parseObj(post);
|
}
|
|
/**
|
* 检验项⽬推送
|
* @param queryCode 查询码(项⽬编码/拼⾳码
|
* @param page 当前⻚
|
* @param size 每⻚条数(最⼤不能超过100
|
* @return
|
*/
|
public JSON getJianYanXm(String queryCode,Integer page,Integer size){
|
HashMap<String, Object> hashMap = new HashMap<>();
|
hashMap.put("queryCode",queryCode);
|
hashMap.put("page",page);
|
hashMap.put("size",size);
|
String post = sendPost (HIS_URL+"/zhuShuJu/getJianYanXm", hashMap);
|
return JSONUtil.parse(post);
|
}
|
|
/**
|
* 检验项⽬收费推送
|
* @param shouFeiXmId 收费项⽬id
|
* @param jiaGeTx 价格体系
|
* @return
|
*/
|
public JSON getShouFeiXmJg(String shouFeiXmId,String jiaGeTx){
|
HashMap<String, Object> hashMap = new HashMap<>();
|
hashMap.put("shouFeiXmId",shouFeiXmId);
|
hashMap.put("jiaGeTx",jiaGeTx);
|
String post = sendPost (HIS_URL+"/zhuShuJu/getShouFeiXmJg", hashMap);
|
return JSONUtil.parse(post);
|
}
|
|
/**
|
* 检验容器
|
* @param queryString 容器名称(容器名称/输⼊码1)
|
* @param pageIndex 当前⻚
|
* @param pageSize 每⻚条数(最⼤不能超过100)
|
* @return
|
*/
|
public JSON getRongQi(String queryString,Integer pageIndex,Integer pageSize){
|
HashMap<String, Object> hashMap = new HashMap<>();
|
hashMap.put("queryString",queryString);
|
hashMap.put("pageIndex",pageIndex);
|
hashMap.put("pageSize",pageSize);
|
String post = sendPost (HIS_URL+"/zhuShuJu/getRongQi", hashMap);
|
return JSONUtil.parse(post);
|
}
|
|
/**
|
* 检验样本
|
* @param queryString 样本类型名称(样本名称/样本类型id)
|
* @param pageIndex 当前⻚
|
* @param pageSize 每⻚条数(最⼤不能超过100)
|
* @return
|
*/
|
public JSON getYangBen(String queryString,Integer pageIndex,Integer pageSize){
|
HashMap<String, Object> hashMap = new HashMap<>();
|
hashMap.put("queryString",queryString);
|
hashMap.put("pageIndex",pageIndex);
|
hashMap.put("pageSize",pageSize);
|
String post = sendPost (HIS_URL+"/zhuShuJu/getYangBen", hashMap);
|
return JSONUtil.parse(post);
|
}
|
|
private String sendPost(String url,Map<String, Object> hashMap){
|
Map<Object, Object> 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<String, Object> 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();
|
}
|
}
|