Commit bc476f3c authored by 马超's avatar 马超

Merge branch 'develop-mc' into 'master'

develop-mc合并

See merge request !1
parents 012639fb 2dc0b392
package com.cftech.cdfortis.constants;
public class CdfortisConstant {
/**
* 返回结果returnCode结构
* {"returnCode":{"content":"成功","key":"C00010000","value":"success"}}
* 解析returnCode
*/
public static String RETURN_CODE = "returnCode";
public static String RETURN_CODE_KEY = "key";
public static String RETURN_CODE_CONTENT = "content";
public static String RETURN_CODE_VALUE = "value";
/**
* 成功的返回值
*/
public static String RESULT_SUCC_CODE = "C00010000";
/**
* http请求状态码
*/
public static int HTTP_SUCC = 200;
/**
* post请求类型
*/
public static String METHOD_POST = "post";
/**
* get请求类型
*/
public static String METHOD_GET = "get";
}
package com.cftech.cdfortis.model;
import lombok.Data;
import java.io.Serializable;
@Data
public class CdfortisDrugInfo implements Serializable {
/**
* 国药准字
*/
private String apprNumber;
/**
* 规格
*/
private String spec;
/**
* 价格
*/
private String price;
/**
* ERP编号
*/
private String ErpId;
/**
* 药品名称
*/
private String drugName;
/**
* 生产厂家
*/
private String factoryName;
}
package com.cftech.cdfortis.service;
import com.alibaba.fastjson.JSONObject;
import com.cftech.predrugs.model.PreDrugs;
import java.util.List;
/**
* 获取微问诊token Service
*
* @author :machao
* @date :Created in 2021/08/19 9:30
*/
public interface CdfortisService {
/**
* 获取微问诊token
*
* @return
*/
JSONObject getTokenResult();
/**
* 药品清单上传
*
* @param preDrugsList
* @return
*/
JSONObject uploadDrugInfo(List<PreDrugs> preDrugsList);
/**
* 获取图文处方列表
*
* @param page
* @param rows
* @param startTime
* @param endTime
* @return
*/
JSONObject getFbusiList(int page, int rows, String startTime, String endTime);
/**
* 获取图文处方详情
*
* @param presId
* @return
*/
JSONObject getFbusiDetail(String presId);
/**
* 获取图文处方图片
*
* @param presId
* @return
*/
JSONObject getFbusiPicture(String presId);
}
package com.cftech.cdfortis.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.cftech.cdfortis.constants.CdfortisConstant;
import com.cftech.cdfortis.model.CdfortisDrugInfo;
import com.cftech.cdfortis.service.CdfortisService;
import com.cftech.cdfortis.util.CdfortisResponseUtil;
import com.cftech.cdfortis.util.CdfortisTokenUtil;
import com.cftech.core.util.SystemConfig;
import com.cftech.predrugs.model.PreDrugs;
import lombok.extern.slf4j.Slf4j;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 微问诊Service
*
* @author :machao
* @date :Created in 2021/08/19 9:30
*/
@Slf4j
@Service
public class CdfortisServiceImpl implements CdfortisService {
@Autowired
CdfortisTokenUtil cdfortisTokenUtil;
private static final MediaType MEDIA_TYPE_JSON
= MediaType.parse("application/json; charset=utf-8");
private static String appid = SystemConfig.p.getProperty("cdfortis.appid");
/**
* 获取token
*
* @return
*/
@Override
public JSONObject getTokenResult() {
JSONObject rtnJson = new JSONObject();
try {
String token = cdfortisTokenUtil.getToken();
rtnJson.put("errorNo", "0");
rtnJson.put("data", token);
} catch (Exception e) {
handleException(rtnJson, e);
}
return rtnJson;
}
/**
* 上传药品清单
*
* @param preDrugsList
* @return
*/
@Override
public JSONObject uploadDrugInfo(List<PreDrugs> preDrugsList) {
JSONObject rtnJson = new JSONObject();
String uploadUrl = SystemConfig.p.getProperty("cdfortis.drug_upload_url");
try {
// 构建参数
JSONObject param = new JSONObject();
param.put("appid", appid);
param.put("token", cdfortisTokenUtil.getToken());
// 转换药品类型为微问诊需要的结构
List<CdfortisDrugInfo> cdfortisDrugList = preDrugsList.stream().map(this::fromPreDrugs).collect(Collectors.toList());
param.put("drugInfo", cdfortisDrugList);
RequestBody body = RequestBody.create(MEDIA_TYPE_JSON, param.toJSONString());
// 请求获取数据
JSONObject data = CdfortisResponseUtil.request(uploadUrl, CdfortisConstant.METHOD_POST,
null, null, body, rtnJson);
if (data == null) {
return rtnJson;
}
boolean isAllSuccess = data.getBooleanValue("isAllSuccess");
if (!isAllSuccess) {
JSONArray failedDataArr = data.getJSONArray("failedData");
//TODO 更新药物上传状态
rtnJson.put("errorNo", "0");
rtnJson.put("data", failedDataArr);
return rtnJson;
}
rtnJson.put("errorNo", "0");
rtnJson.put("data", "");
} catch (Exception e) {
handleException(rtnJson, e);
}
return rtnJson;
}
/**
* 获取图文处方列表
*
* @param page
* @param rows
* @param startTime
* @param endTime
* @return
*/
@Override
public JSONObject getFbusiList(int page, int rows, String startTime, String endTime) {
JSONObject rtnJson = new JSONObject();
String getFbusiListUrl = SystemConfig.p.getProperty("cdfortis.get_fbusi_list_url");
try {
// 构建URL参数
Map<String, String> urlParam = new HashMap<>(6);
urlParam.put("appid", appid);
urlParam.put("token", cdfortisTokenUtil.getToken());
urlParam.put("page", page + "");
urlParam.put("rows", rows + "");
urlParam.put("startTime", startTime);
urlParam.put("endTime", endTime);
// 请求获取数据
JSONObject data = CdfortisResponseUtil.request(getFbusiListUrl, CdfortisConstant.METHOD_GET, urlParam,
null, null, rtnJson);
if (data == null) {
return rtnJson;
}
rtnJson.put("errorNo", "0");
rtnJson.put("data", data);
} catch (Exception e) {
handleException(rtnJson, e);
}
return rtnJson;
}
/**
* 获取图文处方详情
*
* @param presId
* @return
*/
@Override
public JSONObject getFbusiDetail(String presId) {
JSONObject rtnJson = new JSONObject();
String getFbusiInfoUrl = SystemConfig.p.getProperty("cdfortis.get_fbusi_info_url");
try {
// 构建URL参数
Map<String, String> urlParam = new HashMap<>(3);
urlParam.put("appid", appid);
urlParam.put("token", cdfortisTokenUtil.getToken());
urlParam.put("presId", presId);
// 请求获取数据
JSONObject data = CdfortisResponseUtil.request(getFbusiInfoUrl, CdfortisConstant.METHOD_GET, urlParam,
null, null, rtnJson);
if (data == null) {
return rtnJson;
}
rtnJson.put("errorNo", "0");
rtnJson.put("data", data);
} catch (Exception e) {
handleException(rtnJson, e);
}
return rtnJson;
}
/**
* 获取图文处方图片
*
* @param presId
* @return
*/
@Override
public JSONObject getFbusiPicture(String presId) {
JSONObject rtnJson = new JSONObject();
String getFbusiPicUrl = SystemConfig.p.getProperty("cdfortis.get_fbusi_pic_url");
try {
// 构建URL参数
Map<String, String> urlParam = new HashMap<>(3);
urlParam.put("appid", appid);
urlParam.put("token", cdfortisTokenUtil.getToken());
urlParam.put("presId", presId);
// 请求获取数据
JSONObject data = CdfortisResponseUtil.request(getFbusiPicUrl, CdfortisConstant.METHOD_GET, urlParam,
null, null, rtnJson);
if (data == null) {
return rtnJson;
}
rtnJson.put("errorNo", "0");
rtnJson.put("data", data);
} catch (Exception e) {
handleException(rtnJson, e);
}
return rtnJson;
}
/**
* 转换药品信息
*
* @return
* @para preDrugs
*/
private CdfortisDrugInfo fromPreDrugs(PreDrugs preDrugs) {
CdfortisDrugInfo cdfortisDrug = new CdfortisDrugInfo();
cdfortisDrug.setApprNumber(preDrugs.getApprNumber());
cdfortisDrug.setSpec(preDrugs.getSpec());
cdfortisDrug.setPrice(preDrugs.getPrice());
cdfortisDrug.setErpId(preDrugs.getDrugErpNo());
cdfortisDrug.setDrugName(preDrugs.getName());
cdfortisDrug.setFactoryName(preDrugs.getDrugCompay());
return cdfortisDrug;
}
/**
* 处理异常
*
* @param rtnJson
* @param e
*/
private void handleException(JSONObject rtnJson, Exception e) {
log.error(e.getMessage(), e);
rtnJson.put("errorNo", "1");
rtnJson.put("errorMsg", e.getMessage());
rtnJson.put("errorEnMsg", e.getMessage());
}
}
package com.cftech.cdfortis.util;
import com.alibaba.fastjson.JSONObject;
import com.cftech.cdfortis.constants.CdfortisConstant;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import java.util.Map;
@Slf4j
public class CdfortisResponseUtil {
private static OkHttpClient client;
/**
* 获取请求client
*
* @return
*/
public static OkHttpClient getClient() {
if (client == null) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(100);
dispatcher.setMaxRequestsPerHost(50);
builder.dispatcher(dispatcher);
client = builder.build();
}
return client;
}
/**
* 检查结果是否失败
*
* @param retObj
* @throws Exception
*/
public static void checkResponse(JSONObject retObj) throws Exception {
JSONObject returnCode = retObj.getJSONObject(CdfortisConstant.RETURN_CODE);
if (!CdfortisConstant.RESULT_SUCC_CODE.equals(returnCode.getString(CdfortisConstant.RETURN_CODE_KEY))) {
log.error(returnCode.toJSONString());
throw new Exception(returnCode.getString(CdfortisConstant.RETURN_CODE_CONTENT));
}
}
/**
* 发送请求
*
* @param url
* @param method
* @param queryParams
* @param headers
* @param body
* @param rtnJson
* @return
* @throws Exception
*/
public static JSONObject request(String url, String method, Map<String, String> queryParams, Map<String, String> headers, RequestBody body, JSONObject rtnJson) throws Exception {
HttpUrl.Builder urlBuild = HttpUrl.parse(url).newBuilder();
// 处理query参数
if (queryParams != null) {
queryParams.forEach(urlBuild::addQueryParameter);
}
HttpUrl httpUrl = urlBuild.build();
log.debug("request url: {} ", httpUrl.toString());
Request.Builder builder = new Request.Builder();
builder.url(httpUrl);
// 处理请求头
if (headers != null) {
builder.headers(Headers.of(headers));
}
// 处理body
if (CdfortisConstant.METHOD_POST.equals(method)) {
builder.post(body);
}
OkHttpClient client = getClient();
try {
Response response = client.newCall(builder.build()).execute();
// 判断http状态值
if (CdfortisConstant.HTTP_SUCC != response.code()) {
log.error(response.message());
rtnJson.put("errorNo", "1");
rtnJson.put("errorMsg", "微问诊请求失败");
rtnJson.put("errorEnMsg", "request failure");
return null;
}
ResponseBody responseBody = response.body();
String retStr = responseBody.string();
log.debug("request result: {}", retStr);
// 转换结果
JSONObject retObj = JSONObject.parseObject(retStr);
// 插件结果
checkResponse(retObj);
return retObj.getJSONObject("data");
} catch (Exception e) {
throw new Exception(e.getMessage());
}
}
}
package com.cftech.cdfortis.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.cftech.core.util.OKHttpUtils;
import com.cftech.core.util.SystemConfig;
import com.qcloud.cos.utils.Md5Utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
/**
* 获取微问诊token Service
*
* @author :machao
* @date :Created in 2021/08/19 15:30
*/
@Slf4j
@Component
public class CdfortisTokenUtil {
/**
* 获取token的Url
*/
private static String tokenUrl = SystemConfig.p.getProperty("cdfortis.token_url");
/**
* appkey
*/
private static String appid = SystemConfig.p.getProperty("cdfortis.appid");
/**
* appSecrt
*/
private static String appSecret = SystemConfig.p.getProperty("cdfortis.secret");
/**
* flag
*/
private static String flag = SystemConfig.p.getProperty("cdfortis.flag");
/**
* redis存储key
*/
private static String CDFORTIS_TOKEN_KEY = "cdfortis_token" + ":" + appid;
@Autowired
private RedisTemplate<String, String> redisTemplate;
private RedisTemplate<String, String> getConfig() {
StringRedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
return redisTemplate;
}
/**
* 获取token
*
* @return
*/
public String getToken() throws Exception {
// 检查redis中是否存在
if (getConfig().hasKey(CDFORTIS_TOKEN_KEY)) {
return redisTemplate.opsForValue().get(CDFORTIS_TOKEN_KEY);
}
long timestamp = System.currentTimeMillis();
// 获取签名
String sign = sign(appid, appSecret, flag, timestamp);
// 获取tokenUrl
String url = tokenUrl.replace("{appid}", appid).replace("{flag}", flag)
.replace("{timestamp}", timestamp + "").replace("{sign}", sign);
log.debug("微问诊token请求地址:{}", url);
try {
// 解析结果
String retStr = OKHttpUtils.getJSON(url);
log.debug("微问诊token请求结果:{}", retStr);
JSONObject retObj = JSON.parseObject(retStr);
CdfortisResponseUtil.checkResponse(retObj);
JSONObject data = retObj.getJSONObject("data");
String token = data.getString("token");
Long expire = data.getLongValue("expire");
//存到redis
redisTemplate.opsForValue().set(CDFORTIS_TOKEN_KEY, token, expire, TimeUnit.SECONDS);
return token;
} catch (IOException e) {
log.error(e.getMessage(), e);
throw new Exception(e.getMessage());
}
}
/**
* 获取签名
*
* @param appId
* @param secret
* @param flag
* @param timestamp
* @return
*/
private String sign(String appId, String secret, String flag, long timestamp) {
String signStr = String.format("appid=%s&flag=%s&secret=%s&timestamp=%s", appId, flag, secret, timestamp);
String sign = Md5Utils.md5Hex(signStr.getBytes());
return sign;
}
}
package com.cftech.cdfortis.web;
import com.alibaba.fastjson.JSONObject;
import com.cftech.cdfortis.service.CdfortisService;
import com.cftech.predrugs.model.PreDrugs;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 微问诊相关接口调用Controller
*
* @author :machao
* @date :Created in 2021/08/19 9:30
*/
@Slf4j
@RestController
@CrossOrigin
@RequestMapping("/mobile/auth/cdfortis")
public class CdfortisController {
@Autowired
CdfortisService cdfortisService;
/**
* 获取微问诊token
*
* @return
*/
@GetMapping("/get/token")
public JSONObject getToken() {
return cdfortisService.getTokenResult();
}
/**
* 微问诊药品清单上传
*
* @param preDrugsList
* @return
*/
@PostMapping("/upload/druginfo")
public JSONObject uploadDrugInfo(@RequestBody List<PreDrugs> preDrugsList) {
return cdfortisService.uploadDrugInfo(preDrugsList);
}
/**
* 微问诊图文处方列表
*
* @param iDisplayStart 查询的页数
* @param iDisplayLength 一次查询几条(最大50)
* @param startTime 开始时间
* @param endTime 结束时间
* @return
*/
@GetMapping("/get/fbusi/list")
public JSONObject getFbusiList(int iDisplayStart, int iDisplayLength, @RequestParam String startTime, @RequestParam String endTime) {
return cdfortisService.getFbusiList(iDisplayStart, iDisplayLength, startTime, endTime);
}
/**
* 获取图文处方详情
*
* @param presId 处方编号
* @return
*/
@GetMapping("/get/fbusi/detail")
public JSONObject getFbusiDetail(@RequestParam String presId) {
return cdfortisService.getFbusiDetail(presId);
}
/**
* 获取图文处方图片
*
* @param presId 处方编号
* @return
*/
@GetMapping("/get/fbusi/picture")
public JSONObject getFbusiPicture(@RequestParam String presId) {
return cdfortisService.getFbusiPicture(presId);
}
}
### 获取token
GET http://localhost:8080/aidea/mobile/auth/cdfortis/get/token
### 药品清单上传
POST http://localhost:8080/aidea/mobile/auth/cdfortis/upload/druginfo
Content-Type: application/json
[{
"apprNumber": "test_appr_001",
"spec": "test",
"price": "14",
"drugErpNo": "test_erp_001",
"name": "666感冒灵",
"drugCompay": "xx药业"
}]
### 获取图文处方列表接口
GET http://localhost:8080/aidea/mobile/auth/cdfortis/get/fbusi/list?iDisplayStart=1&iDisplayLength=10&startTime=2020-09-07 00:00:00&endTime=2020-09-14 23:59:59
### 获取图文处方图片
GET http://localhost:8080/aidea/mobile/auth/cdfortis/get/fbusi/picture?presId=123456
### 获取单条图文处方详情
GET http://localhost:8080/aidea/mobile/auth/cdfortis/get/fbusi/detail?presId=123456
###
\ No newline at end of file
GET http://localhost:8080/aidea/mobile/auth/cdfortis/get/token
###
\ No newline at end of file
...@@ -142,3 +142,23 @@ map.ads_resolve=https://apis.map.qq.com/ws/geocoder/v1/?address=${address} ...@@ -142,3 +142,23 @@ map.ads_resolve=https://apis.map.qq.com/ws/geocoder/v1/?address=${address}
map.key=OPIBZ-VYIW2-CK7UO-CM4WN-ELY2K-EUFYP map.key=OPIBZ-VYIW2-CK7UO-CM4WN-ELY2K-EUFYP
#\u7B7E\u540D\u5BC6\u94A5 #\u7B7E\u540D\u5BC6\u94A5
map.secret_key=W1je0RfMuDsfxCy73M0b3iEfZRF5cAcU map.secret_key=W1je0RfMuDsfxCy73M0b3iEfZRF5cAcU
#\u5fae\u95ee\u8bca\u914d\u7f6e\u53c2\u6570
#\u83b7\u53d6\u0074\u006f\u006b\u0065\u006e\u5730\u5740
#cdfortis.token_url=https://171.cdfortis.com/api/verify/token?appid={appid}&flag={flag}&timestamp={timestamp}&sign={sign}
cdfortis.token_url=https://api.cdfortis.com/api/verify/token?appid={appid}&flag={flag}&timestamp={timestamp}&sign={sign}
#\u5fae\u95ee\u8bca\u0061\u0070\u0070\u0069\u0064
cdfortis.appid=74523ca670a6ceab8095a7476805c649
#\u5fae\u95ee\u8bca\u0073\u0065\u0063\u0072\u0065\u0074
cdfortis.secret=c2cf8d3e9a6c715a8046541bf397ccc6
#\u5fae\u95ee\u8bca\u0066\u006c\u0061\u0067
cdfortis.flag=aidea888
#\u5fae\u95ee\u8bca\u836f\u54c1\u6e05\u5355\u4e0a\u4f20\u63a5\u53e3\u5730\u5740
cdfortis.drug_upload_url=https://api.cdfortis.com/api/drug/chain
#\u5fae\u95ee\u8bca\u83b7\u53d6\u56fe\u6587\u5904\u65b9\u5217\u8868\u63a5\u53e3
cdfortis.get_fbusi_list_url=https://api.cdfortis.com/api/fbusi/getFbusiList
#\u5fae\u95ee\u8bca\u83b7\u53d6\u56fe\u6587\u5904\u65b9\u56fe\u7247\u63a5\u53e3
cdfortis.get_fbusi_pic_url=https://api.cdfortis.com/api/fbusi/getFbusiPicture
#\u5fae\u95ee\u8bca\u83b7\u53d6\u5355\u6761\u56fe\u6587\u5904\u65b9\u8be6\u60c5\u63a5\u53e3
cdfortis.get_fbusi_info_url=https://api.cdfortis.com/api/fbusi/getFbusiInfo
\ No newline at end of file
...@@ -143,3 +143,21 @@ map.ads_resolve=https://apis.map.qq.com/ws/geocoder/v1/?address=${address} ...@@ -143,3 +143,21 @@ map.ads_resolve=https://apis.map.qq.com/ws/geocoder/v1/?address=${address}
map.key=OPIBZ-VYIW2-CK7UO-CM4WN-ELY2K-EUFYP map.key=OPIBZ-VYIW2-CK7UO-CM4WN-ELY2K-EUFYP
#\u7B7E\u540D\u5BC6\u94A5 #\u7B7E\u540D\u5BC6\u94A5
map.secret_key=W1je0RfMuDsfxCy73M0b3iEfZRF5cAcU map.secret_key=W1je0RfMuDsfxCy73M0b3iEfZRF5cAcU
#\u5fae\u95ee\u8bca\u914d\u7f6e\u53c2\u6570
#\u83b7\u53d6\u0074\u006f\u006b\u0065\u006e\u5730\u5740
cdfortis.token_url=https://api.cdfortis.com/api/verify/token?appid={appid}&flag={flag}&timestamp={timestamp}&sign={sign}
#\u5fae\u95ee\u8bca\u0061\u0070\u0070\u0069\u0064
cdfortis.appid=74523ca670a6ceab8095a7476805c649
#\u5fae\u95ee\u8bca\u0073\u0065\u0063\u0072\u0065\u0074
cdfortis.secret=c2cf8d3e9a6c715a8046541bf397ccc6
#\u5fae\u95ee\u8bca\u0066\u006c\u0061\u0067
cdfortis.flag=aidea888
#\u5fae\u95ee\u8bca\u836f\u54c1\u6e05\u5355\u4e0a\u4f20\u63a5\u53e3\u5730\u5740
cdfortis.drug_upload_url=https://api.cdfortis.com/api/drug/chain
#\u5fae\u95ee\u8bca\u83b7\u53d6\u56fe\u6587\u5904\u65b9\u5217\u8868\u63a5\u53e3
cdfortis.get_fbusi_list_url=https://api.cdfortis.com/api/fbusi/getFbusiList
#\u5fae\u95ee\u8bca\u83b7\u53d6\u56fe\u6587\u5904\u65b9\u56fe\u7247\u63a5\u53e3
cdfortis.get_fbusi_pic_url=https://api.cdfortis.com/api/fbusi/getFbusiPicture
#\u5fae\u95ee\u8bca\u83b7\u53d6\u5355\u6761\u56fe\u6587\u5904\u65b9\u8be6\u60c5\u63a5\u53e3
cdfortis.get_fbusi_info_url=https://api.cdfortis.com/api/fbusi/getFbusiInfo
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment