|
@ -1,60 +1,811 @@
|
|
|
package com.yihu.wlyy.service.app.prescription;
|
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.fasterxml.jackson.databind.JavaType;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import com.yihu.wlyy.entity.charge.WlyyCharge;
|
|
|
import com.yihu.wlyy.entity.doctor.profile.Doctor;
|
|
|
import com.yihu.wlyy.entity.organization.Hospital;
|
|
|
import com.yihu.wlyy.entity.organization.HospitalMapping;
|
|
|
import com.yihu.wlyy.entity.patient.Patient;
|
|
|
import com.yihu.wlyy.entity.patient.SignFamily;
|
|
|
import com.yihu.wlyy.entity.patient.prescription.Prescription;
|
|
|
import com.yihu.wlyy.entity.patient.prescription.PrescriptionExpressage;
|
|
|
import com.yihu.wlyy.entity.patient.prescription.PrescriptionInfo;
|
|
|
import com.yihu.wlyy.entity.patient.prescription.PrescriptionPay;
|
|
|
import com.yihu.wlyy.repository.charge.ChargeDao;
|
|
|
import com.yihu.wlyy.repository.doctor.DoctorDao;
|
|
|
import com.yihu.wlyy.repository.organization.HospitalDao;
|
|
|
import com.yihu.wlyy.repository.organization.HospitalMappingDao;
|
|
|
import com.yihu.wlyy.repository.patient.PatientDao;
|
|
|
import com.yihu.wlyy.repository.patient.SignFamilyDao;
|
|
|
import com.yihu.wlyy.repository.prescription.*;
|
|
|
import com.yihu.wlyy.service.BaseService;
|
|
|
import com.yihu.wlyy.service.third.httplog.LogService;
|
|
|
import com.yihu.wlyy.service.weixin.wxpay.common.Configure;
|
|
|
import com.yihu.wlyy.service.weixin.wxpay.model.BindCard;
|
|
|
import com.yihu.wlyy.service.weixin.wxpay.model.Charge;
|
|
|
import com.yihu.wlyy.service.weixin.wxpay.service.OnePayService;
|
|
|
import com.yihu.wlyy.util.SystemConf;
|
|
|
import com.yihu.wlyy.web.wx.OnePayController;
|
|
|
import com.ylzinfo.onepay.sdk.OnepayDefaultClient;
|
|
|
import com.ylzinfo.onepay.sdk.domain.RequestParams;
|
|
|
import com.ylzinfo.onepay.sdk.domain.ResponseParams;
|
|
|
import com.ylzinfo.onepay.sdk.utils.DateUtil;
|
|
|
import com.ylzinfo.onepay.sdk.utils.StringUtil;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
import org.springframework.security.access.method.P;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.util.StreamUtils;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
import javax.transaction.Transactional;
|
|
|
import java.io.InputStream;
|
|
|
import java.io.PrintWriter;
|
|
|
import java.io.StringWriter;
|
|
|
import java.lang.reflect.Method;
|
|
|
import java.nio.charset.Charset;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* Created by Reece on 2017/7/28/028.
|
|
|
* 患者支付
|
|
|
*
|
|
|
*/
|
|
|
@Service
|
|
|
public class PatientPrescriptionPayService extends BaseService {
|
|
|
|
|
|
//公共配置文件
|
|
|
Properties systemConf = SystemConf.getInstance().getSystemProperties();
|
|
|
private static final Logger LOGGER = LoggerFactory.getLogger(OnePayController.class);
|
|
|
// 各环境对应配置
|
|
|
@Value("${server.server_url}")
|
|
|
private String serverUrl;
|
|
|
@Value("${wechat.accId}")
|
|
|
private String accId;
|
|
|
// Java配置文件 后续删除
|
|
|
private String signType = "MD5";
|
|
|
private String encryptType = "AES";
|
|
|
|
|
|
// 引入实例
|
|
|
@Autowired
|
|
|
private Configure config;
|
|
|
@Autowired
|
|
|
private ObjectMapper objectMapper;
|
|
|
@Autowired
|
|
|
private LogService logService;
|
|
|
@Autowired
|
|
|
private PatientDao patientDao;
|
|
|
@Autowired
|
|
|
private DoctorDao doctorDao;
|
|
|
@Autowired
|
|
|
private OnePayService onePayService;
|
|
|
@Autowired
|
|
|
private SignFamilyDao signFamilyDao;
|
|
|
@Autowired
|
|
|
private PrescriptionPayDao payDao;
|
|
|
@Autowired
|
|
|
private ChargeDao chargeDao;
|
|
|
@Autowired
|
|
|
private HospitalMappingDao mappingDao;
|
|
|
@Autowired
|
|
|
private PrescriptionLogService payLogService;
|
|
|
@Autowired
|
|
|
private PrescriptionService prescriptionService;
|
|
|
@Autowired
|
|
|
private PrescriptionInfoDao infoDao;
|
|
|
@Autowired
|
|
|
private JdbcTemplate jdbcTemplate;
|
|
|
@Autowired
|
|
|
private HospitalDao hospitalDao;
|
|
|
@Autowired
|
|
|
private PrescriptionDao prescriptionDao;
|
|
|
@Autowired
|
|
|
private PrescriptionExpressageDao expressageDao;
|
|
|
|
|
|
/**
|
|
|
* 患者支付接口
|
|
|
* 长处方配送信息查询接口
|
|
|
*
|
|
|
* @param payInfo
|
|
|
* @param
|
|
|
* @return
|
|
|
*/
|
|
|
public JSONObject charge()throws Exception{
|
|
|
JSONObject jsonObject = new JSONObject();
|
|
|
return jsonObject;
|
|
|
public JSONObject dispatch(String prescriptionCode, String orgCode) throws Exception {
|
|
|
JSONObject result = new JSONObject();
|
|
|
List manage = new ArrayList();
|
|
|
Hospital hospital = hospitalDao.findByCode(orgCode);
|
|
|
|
|
|
String hostpitalName = hospital.getName();
|
|
|
String address = hospital.getAddress();
|
|
|
String streeCode = hospital.getRoadCode();
|
|
|
String townCode = hospital.getTown();
|
|
|
String townName = hospital.getTownName();
|
|
|
String cityCode = hospital.getCity();
|
|
|
String cityName = hospital.getCityName();
|
|
|
String provinceCode = hospital.getProvince();
|
|
|
String provinceName = hospital.getProvinceName();
|
|
|
|
|
|
|
|
|
List<PrescriptionInfo> prescriptionInfos = infoDao.findByPrescriptionCode(prescriptionCode);
|
|
|
for (PrescriptionInfo presInfo : prescriptionInfos) {
|
|
|
// 是否冷藏 1是 0否
|
|
|
int refrigerate = presInfo.getIsRefrigerate();
|
|
|
if (refrigerate == 1) {
|
|
|
// 只能自取返回签约社区信息
|
|
|
Map self = new HashMap();
|
|
|
self.put("code", orgCode);
|
|
|
self.put("name", hostpitalName);
|
|
|
self.put("provinceCode", provinceCode);
|
|
|
self.put("provinceName", provinceName);
|
|
|
self.put("cityCode", cityCode);
|
|
|
self.put("cityName", cityName);
|
|
|
self.put("townCode", townCode);
|
|
|
self.put("townName", townName);
|
|
|
self.put("streeCode", streeCode);
|
|
|
self.put("address", address);
|
|
|
self.put("type", 1);
|
|
|
result.put("self", self);
|
|
|
return result;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
String h = orgCode.substring(0, 8);
|
|
|
String sql = "SELECT h.`code`,h.`name`,h.`province` provinceCode,h.`province_name` provinceName,h.`city` cityCode ,h.`city_name` cityName," +
|
|
|
" h.`town` townCode,h.`town_name` townName,h.`road_code` streeCode,h.`address` " +
|
|
|
" FROM dm_hospital h " +
|
|
|
" WHERE h.`code` LIKE '%" + h + "%' AND RIGHT(h.code,2)<>'00' ";
|
|
|
List<Map<String, Object>> hs = jdbcTemplate.queryForList(sql);
|
|
|
for (Map<String, Object> hspital : hs) {
|
|
|
Map temp = new HashMap();
|
|
|
String code = (String) hspital.get("code");
|
|
|
String name = (String) hspital.get("name");
|
|
|
provinceCode = (String) hspital.get("provinceCode");
|
|
|
provinceName = (String) hspital.get("provinceName");
|
|
|
cityCode = (String) hspital.get("cityCode");
|
|
|
cityName = (String) hspital.get("cityName");
|
|
|
townCode = (String) hspital.get("townCode");
|
|
|
townName = (String) hspital.get("townName");
|
|
|
streeCode = (String) hspital.get("streeCode");
|
|
|
address = (String) hspital.get("address");
|
|
|
temp.put("code", code);
|
|
|
temp.put("name", name);
|
|
|
temp.put("provinceCode", provinceCode);
|
|
|
temp.put("provinceName", provinceName);
|
|
|
temp.put("cityCode", cityCode);
|
|
|
temp.put("cityName", cityName);
|
|
|
temp.put("townCode", townCode);
|
|
|
temp.put("townName", townName);
|
|
|
temp.put("streeCode", streeCode);
|
|
|
temp.put("address", address);
|
|
|
manage.add(temp);
|
|
|
}
|
|
|
// 社区下没有服务站只能自取或快递
|
|
|
if (hs == null) {
|
|
|
Map self = new HashMap();
|
|
|
self.put("code", orgCode);
|
|
|
self.put("name", hostpitalName);
|
|
|
self.put("provinceCode", provinceCode);
|
|
|
self.put("provinceName", provinceName);
|
|
|
self.put("cityCode", cityCode);
|
|
|
self.put("cityName", cityName);
|
|
|
self.put("townCode", townCode);
|
|
|
self.put("townName", townName);
|
|
|
self.put("streeCode", streeCode);
|
|
|
self.put("address", address);
|
|
|
self.put("type", 1);
|
|
|
Map express = new HashMap();
|
|
|
express.put("type", 2);
|
|
|
|
|
|
result.put("self", self);
|
|
|
result.put("express", express);
|
|
|
return result;
|
|
|
}
|
|
|
Map self = new HashMap();
|
|
|
self.put("code", orgCode);
|
|
|
self.put("name", hostpitalName);
|
|
|
self.put("provinceCode", provinceCode);
|
|
|
self.put("provinceName", provinceName);
|
|
|
self.put("cityCode", cityCode);
|
|
|
self.put("cityName", cityName);
|
|
|
self.put("townCode", townCode);
|
|
|
self.put("townName", townName);
|
|
|
self.put("streeCode", streeCode);
|
|
|
self.put("address", address);
|
|
|
self.put("type", 1);
|
|
|
Map express = new HashMap();
|
|
|
express.put("type", 2);
|
|
|
Map manager = new HashMap();
|
|
|
manager.put("codes", manage);
|
|
|
manager.put("type", 3);
|
|
|
|
|
|
result.put("self", self);
|
|
|
result.put("express", express);
|
|
|
result.put("manager", manager);
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 患者支付结果查询接口
|
|
|
* 长处方支付成功前端页面回调接口
|
|
|
*
|
|
|
* @param outChargeNo
|
|
|
* @param
|
|
|
* @return
|
|
|
*/
|
|
|
public JSONObject chargeQuery(String outChargeNo)throws Exception{
|
|
|
JSONObject jsonObject = new JSONObject();
|
|
|
return jsonObject;
|
|
|
public void recipeReturnUrl(HttpServletRequest request, HttpServletResponse response, String accessToken) throws Exception {
|
|
|
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
|
|
|
Prescription prescription = null;
|
|
|
int flag = 0;
|
|
|
Boolean isSuccess = false;
|
|
|
String error = "";
|
|
|
String responses = "";
|
|
|
response.setContentType("text/html;charset=utf-8");
|
|
|
|
|
|
try {
|
|
|
// 如:查询显示订单信息
|
|
|
isSuccess = true;
|
|
|
flag = 1;
|
|
|
|
|
|
String appId = request.getParameter("appId");
|
|
|
String billNo = request.getParameter("billNo");//待结算费用单据号
|
|
|
String cardNo = request.getParameter("cardNo");//医保卡号
|
|
|
String channel = request.getParameter("channel");//支付方式
|
|
|
String chargeNo = request.getParameter("chargeNo");//支付平台流水号
|
|
|
String chargeTime = request.getParameter("chargeTime");//支付平台交易成功时间
|
|
|
String idNo = request.getParameter("idNo");//证件号码
|
|
|
String idType = request.getParameter("idType");//证件类型
|
|
|
String insuranceAmount = request.getParameter("insuranceAmount");//医保支付金额
|
|
|
String outChargeNo = request.getParameter("outChargeNo");//接入应用业务流水号
|
|
|
String outChargeTime = request.getParameter("outChargeTime");//接入应用时间
|
|
|
String selfPayAmount = request.getParameter("selfPayAmount");//自付金额
|
|
|
String sign = request.getParameter("sign");
|
|
|
String signType = request.getParameter("signType");
|
|
|
String timestamp = request.getParameter("timestamp");
|
|
|
String totalAmount = request.getParameter("totalAmount");//交易总金额
|
|
|
String tradeStatus = request.getParameter("tradeStatus");//交易状态
|
|
|
String userId = request.getParameter("userId");//用户openID
|
|
|
String userName = request.getParameter("userName");//用户名字
|
|
|
|
|
|
String result = chargeQuery(outChargeNo, accessToken);//业务出参
|
|
|
org.json.JSONObject param = new org.json.JSONObject(result);
|
|
|
String requestParam = param.getString("responseContent");
|
|
|
org.json.JSONObject responseContents = new org.json.JSONObject(requestParam);//医保结构体
|
|
|
|
|
|
PrescriptionPay prescriptionPay = payDao.findByCode(outChargeNo);
|
|
|
if (responseContents != null) {
|
|
|
String miSettleNo = responseContents.getString("miSettleNo");//医保收费单据号 (医保签约号)
|
|
|
String miRegisterNo = responseContents.getString("miRegisterNo");//医保挂号
|
|
|
String miCollectDate = responseContents.getString("miCollectDate");//收费日期
|
|
|
String miCollectTime = responseContents.getString("miCollectTime");//收费时间
|
|
|
String miCollectorName = responseContents.getString("miCollectorName");//收费人姓名
|
|
|
String miTotalFee = responseContents.getString("miTotalFee");//本次报销总额
|
|
|
String selfPay = responseContents.getString("selfPay");//个人现金支付
|
|
|
String accountPay = responseContents.getString("accountPay");//个人账户支付
|
|
|
String heathPay = responseContents.getString("heathPay");//健康账户支付
|
|
|
String cadresPay = responseContents.getString("cadresPay");//公务员补助
|
|
|
String fundPay = responseContents.getString("fundPay");//基金支付
|
|
|
String healthCarePay = responseContents.getString("healthCarePay");//保健基金支付
|
|
|
String commercePay = responseContents.getString("commercePay");//商业保险支付
|
|
|
String familyPay = responseContents.getString("familyPay");//共济账户支付
|
|
|
String civilPay = responseContents.getString("civilPay");//民政补助金额
|
|
|
String civilZone = responseContents.getString("civilZone");//民政行政区号
|
|
|
String bdrugPay = responseContents.getString("bdrugPay");//乙类支付金额
|
|
|
String unlessAmount = responseContents.getString("unlessAmount");//非医保费用
|
|
|
String exceedAmount = responseContents.getString("exceedAmount");//超封顶线金额
|
|
|
String accountBalance = responseContents.getString("accountBalance");//个人账户余额
|
|
|
String healthBalance = responseContents.getString("healthBalance");//健康账户余额
|
|
|
|
|
|
prescriptionPay.setBillNo(billNo);//待结算费用单据号
|
|
|
prescriptionPay.setInsuranceAmount(Integer.parseInt(insuranceAmount));//医保支付金额
|
|
|
prescriptionPay.setSelfPayAmount(Integer.parseInt(selfPayAmount));//自付金额
|
|
|
prescriptionPay.setMiSettleNo(miSettleNo);//医保收费单据号
|
|
|
prescriptionPay.setMiRegisterNo(miRegisterNo);//医保挂号
|
|
|
prescriptionPay.setMiCollectDate(format.parse(miCollectDate));//收费日期
|
|
|
prescriptionPay.setMiCollectTime(format.parse(miCollectTime));//收费时间
|
|
|
prescriptionPay.setMiCollectorName(miCollectorName);//收费人姓名
|
|
|
prescriptionPay.setMiTotalFee(Integer.parseInt(miTotalFee));//本次报销总额
|
|
|
prescriptionPay.setSelfPay(Integer.parseInt(selfPay));//个人现金支付
|
|
|
prescriptionPay.setAccountPay(Integer.parseInt(accountPay));//个人账户支付
|
|
|
prescriptionPay.setHeathPay(Integer.parseInt(heathPay));//健康账户支付
|
|
|
prescriptionPay.setCadresPay(Integer.parseInt(cadresPay));//公务员补助
|
|
|
prescriptionPay.setFundPay(Integer.parseInt(fundPay));//基金支付
|
|
|
prescriptionPay.setHealthCarePay(Integer.parseInt(healthCarePay));//保健基金支付
|
|
|
prescriptionPay.setCommercePay(Integer.parseInt(commercePay));//商业保险支付
|
|
|
prescriptionPay.setFamilyPay(Integer.parseInt(familyPay));//共济账户支付
|
|
|
prescriptionPay.setCivilPay(Integer.parseInt(civilPay));//民政补助金额
|
|
|
prescriptionPay.setCivilZone(civilZone);//民政行政区号
|
|
|
prescriptionPay.setBdrugPay(Integer.parseInt(bdrugPay));//乙类支付金额
|
|
|
prescriptionPay.setUnlessAmount(Integer.parseInt(unlessAmount));//非医保费用
|
|
|
prescriptionPay.setExceedAmount(Integer.parseInt(exceedAmount));//超封顶线金额
|
|
|
prescriptionPay.setAccountBalance(Integer.parseInt(accountBalance));//个人账户余额
|
|
|
prescriptionPay.setHealthBalance(Integer.parseInt(healthBalance));//健康账户余额
|
|
|
|
|
|
// 保存数据库更改记录
|
|
|
payDao.save(prescriptionPay);
|
|
|
}
|
|
|
String prescriptionCode = prescriptionPay.getPrescriptionCode();
|
|
|
prescription = prescriptionDao.findByCode(prescriptionCode);
|
|
|
PrescriptionExpressage expressage = expressageDao.findByPrescriptionPay(prescriptionCode);
|
|
|
if ("0".equals(tradeStatus)) {
|
|
|
prescriptionPay.setTradeStatus("1");//交易状态 成功1 失败0
|
|
|
prescription.setStatus(30);//续费状态 30支付成功 21支付失败
|
|
|
expressage.setDel(1);//快递信息状态 1可用 0删除
|
|
|
expressageDao.save(expressage);
|
|
|
prescriptionDao.save(prescription);
|
|
|
} else if ("1".equals(tradeStatus)) {
|
|
|
prescriptionPay.setTradeStatus("0");//交易状态 成功1 失败0
|
|
|
prescription.setStatus(21);////续费状态 30支付成功 21支付失败
|
|
|
expressage.setDel(0);//快递信息状态 1可用 0删除
|
|
|
expressageDao.save(expressage);
|
|
|
prescriptionDao.save(prescription);
|
|
|
}
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
isSuccess = false;
|
|
|
response.getWriter().write(e.getMessage());
|
|
|
}
|
|
|
// 记录log日志到数据库
|
|
|
logService.saveHttpLog(isSuccess, config.getReturnUrl(), "长处方支付页面跳转", "POST", null, "", responses, error, logService.onepayType);
|
|
|
//记录支付log日志到数据库
|
|
|
payLogService.addLog(prescription, 2, flag, 1);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 支付成功前端页面回调接口
|
|
|
* 长处方对接方异步回调接口
|
|
|
*
|
|
|
* @param json
|
|
|
* @return
|
|
|
*/
|
|
|
public JSONObject returnUrl()throws Exception{
|
|
|
JSONObject jsonObject = new JSONObject();
|
|
|
return jsonObject;
|
|
|
public void receiveRecipeNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
|
|
|
|
|
|
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
|
|
|
Prescription prescription = null;
|
|
|
Boolean isSuccess = false;
|
|
|
int flag = 0;
|
|
|
String error = "";
|
|
|
String responses = "";
|
|
|
response.setContentType("text/html;charset=utf-8");
|
|
|
InputStream inputStream = request.getInputStream();
|
|
|
String params = StreamUtils.copyToString(inputStream, Charset.forName("UTF-8"));
|
|
|
|
|
|
org.json.JSONObject json = new org.json.JSONObject(params);
|
|
|
String appId = json.getString("appId");
|
|
|
HospitalMapping hospital = mappingDao.findByAppId(appId);
|
|
|
String appSecret = hospital.getAppSecret();
|
|
|
|
|
|
LOGGER.info("回调参数:{}", params);
|
|
|
if (StringUtil.isEmpty(params)) {
|
|
|
response.getWriter().write("empty");
|
|
|
return;
|
|
|
}
|
|
|
// 参数转换
|
|
|
ResponseParams<?> encryptRes = JSON.parseObject(params, ResponseParams.class);
|
|
|
OnepayDefaultClient client = new OnepayDefaultClient("", appId, appSecret, encryptRes.getSignType(), encryptRes.getEncryptType());
|
|
|
|
|
|
try {
|
|
|
LOGGER.info("解密前:{}", JSON.toJSONString(encryptRes));
|
|
|
ResponseParams<?> decryptRes = client.decryptNotifyResponse(encryptRes);
|
|
|
LOGGER.info("解密后:{}", JSON.toJSONString(decryptRes));
|
|
|
boolean isDecrypt = ("-1".equals(decryptRes.getRespCode()) ? false : true); // 是否解密失败
|
|
|
if (!isDecrypt) {
|
|
|
response.getWriter().write("DECRYPT FAILURE");
|
|
|
} else {
|
|
|
boolean isVerify = client.verifyResponseSign(decryptRes);
|
|
|
LOGGER.info("验签结果:{}", isVerify);
|
|
|
if (!isVerify) {
|
|
|
response.getWriter().write("FAILURE");
|
|
|
} else {
|
|
|
// 业务逻辑代码
|
|
|
flag = 1;
|
|
|
isSuccess = true;
|
|
|
responses = JSON.toJSONString(decryptRes);
|
|
|
org.json.JSONObject requestParams = new org.json.JSONObject(responses);
|
|
|
|
|
|
org.json.JSONObject requestParam = requestParams.getJSONObject("param");//业务出参
|
|
|
|
|
|
String outChargeNo = requestParam.getString("outChargeNo");//接入应用业务流水号
|
|
|
String chargeNo = requestParam.getString("chargeNo"); //支付平台流水号
|
|
|
String chargeTime = requestParam.getString("chargeTime");//支付平台交易成功时间
|
|
|
String outChargeTime = requestParam.getString("outChargeTime");//接入应用时间
|
|
|
String channel = requestParam.getString("channel");//支付方式
|
|
|
String billNo = requestParam.getString("billNo");//待结算费用单据号
|
|
|
String cardNo = requestParam.getString("cardNo");//医保卡号
|
|
|
String totalAmount = requestParam.getString("totalAmount");//交易总金额
|
|
|
String insuranceAmount = requestParam.getString("insuranceAmount");//医保支付金额
|
|
|
String selfPayAmount = requestParam.getString("selfPayAmount");//自付金额
|
|
|
String userId = requestParam.getString("userId");//用户openID
|
|
|
String userName = requestParam.getString("userName");//用户名字
|
|
|
String idType = requestParam.getString("idType");//证件类型
|
|
|
String idNo = requestParam.getString("idNo");//证件号码
|
|
|
String tradeStatus = requestParam.getString("tradeStatus");//交易状态
|
|
|
|
|
|
|
|
|
org.json.JSONObject responseContents = requestParams.getJSONObject("responseContent");//医保结构体
|
|
|
String miSettleNo = responseContents.getString("miSettleNo");//医保收费单据号 (医保签约号)
|
|
|
String miRegisterNo = responseContents.getString("miRegisterNo");//医保挂号
|
|
|
String miCollectDate = responseContents.getString("miCollectDate");//收费日期
|
|
|
String miCollectTime = responseContents.getString("miCollectTime");//收费时间
|
|
|
String miCollectorName = responseContents.getString("miCollectorName");//收费人姓名
|
|
|
String miTotalFee = responseContents.getString("miTotalFee");//本次报销总额
|
|
|
String selfPay = responseContents.getString("selfPay");//个人现金支付
|
|
|
String accountPay = responseContents.getString("accountPay");//个人账户支付
|
|
|
String heathPay = responseContents.getString("heathPay");//健康账户支付
|
|
|
String cadresPay = responseContents.getString("cadresPay");//公务员补助
|
|
|
String fundPay = responseContents.getString("fundPay");//基金支付
|
|
|
String healthCarePay = responseContents.getString("healthCarePay");//保健基金支付
|
|
|
String commercePay = responseContents.getString("commercePay");//商业保险支付
|
|
|
String familyPay = responseContents.getString("familyPay");//共济账户支付
|
|
|
String civilPay = responseContents.getString("civilPay");//民政补助金额
|
|
|
String civilZone = responseContents.getString("civilZone");//民政行政区号
|
|
|
String bdrugPay = responseContents.getString("bdrugPay");//乙类支付金额
|
|
|
String unlessAmount = responseContents.getString("unlessAmount");//非医保费用
|
|
|
String exceedAmount = responseContents.getString("exceedAmount");//超封顶线金额
|
|
|
String accountBalance = responseContents.getString("accountBalance");//个人账户余额
|
|
|
String healthBalance = responseContents.getString("healthBalance");//健康账户余额
|
|
|
|
|
|
|
|
|
//更新数据
|
|
|
PrescriptionPay prescriptionPay = payDao.findByCode(outChargeNo);
|
|
|
prescriptionPay.setBillNo(billNo);//待结算费用单据号
|
|
|
prescriptionPay.setInsuranceAmount(Integer.parseInt(insuranceAmount));//医保支付金额
|
|
|
prescriptionPay.setSelfPayAmount(Integer.parseInt(selfPayAmount));//自付金额
|
|
|
prescriptionPay.setMiSettleNo(miSettleNo);//医保收费单据号
|
|
|
prescriptionPay.setMiRegisterNo(miRegisterNo);//医保挂号
|
|
|
prescriptionPay.setMiCollectDate(format.parse(miCollectDate));//收费日期
|
|
|
prescriptionPay.setMiCollectTime(format.parse(miCollectTime));//收费时间
|
|
|
prescriptionPay.setMiCollectorName(miCollectorName);//收费人姓名
|
|
|
prescriptionPay.setMiTotalFee(Integer.parseInt(miTotalFee));//本次报销总额
|
|
|
prescriptionPay.setSelfPay(Integer.parseInt(selfPay));//个人现金支付
|
|
|
prescriptionPay.setAccountPay(Integer.parseInt(accountPay));//个人账户支付
|
|
|
prescriptionPay.setHeathPay(Integer.parseInt(heathPay));//健康账户支付
|
|
|
prescriptionPay.setCadresPay(Integer.parseInt(cadresPay));//公务员补助
|
|
|
prescriptionPay.setFundPay(Integer.parseInt(fundPay));//基金支付
|
|
|
prescriptionPay.setHealthCarePay(Integer.parseInt(healthCarePay));//保健基金支付
|
|
|
prescriptionPay.setCommercePay(Integer.parseInt(commercePay));//商业保险支付
|
|
|
prescriptionPay.setFamilyPay(Integer.parseInt(familyPay));//共济账户支付
|
|
|
prescriptionPay.setCivilPay(Integer.parseInt(civilPay));//民政补助金额
|
|
|
prescriptionPay.setCivilZone(civilZone);//民政行政区号
|
|
|
prescriptionPay.setBdrugPay(Integer.parseInt(bdrugPay));//乙类支付金额
|
|
|
prescriptionPay.setUnlessAmount(Integer.parseInt(unlessAmount));//非医保费用
|
|
|
prescriptionPay.setExceedAmount(Integer.parseInt(exceedAmount));//超封顶线金额
|
|
|
prescriptionPay.setAccountBalance(Integer.parseInt(accountBalance));//个人账户余额
|
|
|
prescriptionPay.setHealthBalance(Integer.parseInt(healthBalance));//健康账户余额
|
|
|
|
|
|
String prescriptionCode = prescriptionPay.getPrescriptionCode();
|
|
|
prescription = prescriptionDao.findByCode(prescriptionCode);
|
|
|
PrescriptionExpressage expressage = expressageDao.findByPrescriptionPay(prescriptionCode);
|
|
|
if ("0".equals(tradeStatus)) {
|
|
|
prescriptionPay.setTradeStatus("1");//交易状态 成功1 失败0
|
|
|
prescription.setStatus(30);//续费状态 30支付成功 21支付失败
|
|
|
expressage.setDel(1);//快递信息状态 1可用 0删除
|
|
|
expressageDao.save(expressage);
|
|
|
prescriptionDao.save(prescription);
|
|
|
} else if ("1".equals(tradeStatus)) {
|
|
|
prescriptionPay.setTradeStatus("0");//交易状态 成功1 失败0
|
|
|
prescription.setStatus(21);////续费状态 30支付成功 21支付失败
|
|
|
expressage.setDel(0);//快递信息状态 1可用 0删除
|
|
|
expressageDao.save(expressage);
|
|
|
prescriptionDao.save(prescription);
|
|
|
}
|
|
|
|
|
|
// 保存数据库更改记录
|
|
|
payDao.save(prescriptionPay);
|
|
|
response.getWriter().write("SUCCESS");
|
|
|
}
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
response.getWriter().write(e.getMessage());
|
|
|
}
|
|
|
|
|
|
// 记录log日志到数据库
|
|
|
logService.saveHttpLog(isSuccess, config.getReceiveNotify(), "异步支付通知", "POST", null, params, responses, error, logService.onepayType);
|
|
|
//记录支付log日志到数据库
|
|
|
payLogService.addLog(prescription, 2, flag, 1);
|
|
|
}
|
|
|
|
|
|
|
|
|
//****************************************** 反射获取私有属性基本工具方法 *******************************************************************************
|
|
|
public BindCard getBindCard(Object obj, String openId) throws Exception {
|
|
|
Class cls = obj.getClass();
|
|
|
//获得类的私有方法
|
|
|
Method method = cls.getDeclaredMethod("privateMethod", null);
|
|
|
method.setAccessible(true); //没有设置就会报错
|
|
|
//调用该方法
|
|
|
BindCard bindCard = (BindCard) method.invoke(obj, openId);
|
|
|
return bindCard;
|
|
|
}
|
|
|
|
|
|
//****************************************** 长处方支付基本工具方法 *******************************************************************************
|
|
|
|
|
|
/**
|
|
|
* 对接方异步回调接口
|
|
|
*
|
|
|
* @return
|
|
|
* 长处方支付,成功则返回支付路径
|
|
|
*/
|
|
|
@Transactional
|
|
|
public String charge(int type, String addressJson, String orgCode, String prescriptionCode, int totalAmount, String people, String accessToken) throws Exception {
|
|
|
//获取机构映射
|
|
|
HospitalMapping hos = mappingDao.findByCode(orgCode);
|
|
|
if (hos == null) {
|
|
|
throw new Exception("no hospital mapping!");
|
|
|
}
|
|
|
String orgName = hos.getName();
|
|
|
String appId = hos.getAppId();
|
|
|
String appSecret = hos.getAppSecret();
|
|
|
|
|
|
Patient patient = patientDao.findByCode(people);
|
|
|
String userName = patient.getName();
|
|
|
String openid = patient.getOpenid();
|
|
|
String userAddress = patient.getAddress();
|
|
|
|
|
|
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
|
|
|
Date now = new Date();
|
|
|
Boolean isSuccess = true;
|
|
|
int flag = 1;
|
|
|
String msgBody = "";
|
|
|
String response = "";
|
|
|
String error = "";
|
|
|
String result = "";
|
|
|
String channel = "WX_MMP"; // 医保支付渠道
|
|
|
String subject = "续方订单支付"; // 订单名称
|
|
|
|
|
|
OnepayDefaultClient onepayClient = new OnepayDefaultClient(config.getOnepayApi(), appId, appSecret, signType, encryptType);
|
|
|
// 未真正完成支付以前预存储支付信息到wlyy_prescription_pay表 更改wlyy_prescription表支付时间 wlyy_prescription_expressage 新增物流记录
|
|
|
PrescriptionExpressage expressage = new PrescriptionExpressage();
|
|
|
expressage.setCode(getCode());
|
|
|
expressage.setPrescriptionCode(prescriptionCode);
|
|
|
|
|
|
JSONObject addressInfo = JSON.parseObject(addressJson);
|
|
|
|
|
|
String phone = addressInfo.getString("phone");
|
|
|
expressage.setMobile(phone);//收货人手机号码
|
|
|
String proviceCode = addressInfo.getString("provinceCode");
|
|
|
expressage.setProvinceCode(proviceCode);//省代码
|
|
|
String proviceName = addressInfo.getString("provinceName");
|
|
|
expressage.setProvinceName(proviceName);//省名称
|
|
|
String cityCode = addressInfo.getString("cityCode");
|
|
|
expressage.setCityCode(cityCode);//市代码
|
|
|
String cityName = addressInfo.getString("cityName");
|
|
|
expressage.setCityName(cityName);//市名称
|
|
|
String townCode = addressInfo.getString("townCode");
|
|
|
expressage.setTownCode(townCode);//区code
|
|
|
String townName = addressInfo.getString("townName");
|
|
|
expressage.setTownName(townName);//区名称
|
|
|
String streeCode = addressInfo.getString("streeCode");
|
|
|
expressage.setStreetCode(streeCode);//街道code
|
|
|
String streeName = addressInfo.getString("streeName");
|
|
|
expressage.setStreetName(streeName);//街道名称
|
|
|
String address = addressInfo.getString("address");
|
|
|
expressage.setHospitalAddress(address);//取药地址
|
|
|
switch (type) {
|
|
|
case 1:
|
|
|
//自取保存居民信息
|
|
|
expressage.setName(userName);//居民姓名
|
|
|
expressage.setAddress(userAddress);//居民详细地址
|
|
|
expressage.setHospitalCode(orgCode);//机构code
|
|
|
expressage.setHospitalName(hos.getName());//取药点
|
|
|
expressage.setCreateTime(now);//创建时间
|
|
|
expressage.setOneselfPickupFlg(1);//是否自取 1是 0否
|
|
|
expressage.setDel(1);//有效
|
|
|
break;
|
|
|
case 2:
|
|
|
//快递保存信息
|
|
|
String name = addressInfo.getString("receiver");
|
|
|
expressage.setName(name);//居民姓名
|
|
|
expressage.setHospitalCode(orgCode);//机构code
|
|
|
expressage.setHospitalName("顺丰快递");//取药点
|
|
|
// expressage.setHospitalAddress("5");//取药地址
|
|
|
expressage.setCreateTime(now);//创建时间
|
|
|
expressage.setOneselfPickupFlg(0);//是否自取 1是 0否
|
|
|
expressage.setDel(1);//有效
|
|
|
break;
|
|
|
case 3:
|
|
|
//健管师配送
|
|
|
expressage.setName(userName);//收件人姓名
|
|
|
String orgCodess = addressInfo.getString("code");
|
|
|
expressage.setHospitalCode(orgCodess);//机构code
|
|
|
String orgNames = addressInfo.getString("name");
|
|
|
expressage.setHospitalName(orgNames);//取药点
|
|
|
expressage.setCreateTime(now);//创建时间
|
|
|
expressage.setOneselfPickupFlg(0);//是否自取 1是 0否
|
|
|
expressage.setDel(1);//有效
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
Prescription prescription = prescriptionDao.findByCode(prescriptionCode);
|
|
|
prescription.setPayTime(now);
|
|
|
|
|
|
PrescriptionPay prescriptionPay = new PrescriptionPay();
|
|
|
// 居民信息
|
|
|
prescriptionPay.setCode(uuid); // 接入应用支付业务流水号
|
|
|
prescriptionPay.setPrescriptionCode(prescriptionCode); //开处方的医生code 关联 wlyy_prescription
|
|
|
prescriptionPay.setType(1);//支付方式 1 医保支付
|
|
|
prescriptionPay.setOutChargeTime(new Date());//接入应用时间
|
|
|
prescriptionPay.setChannel(channel);//支付方式
|
|
|
prescriptionPay.setChargeTime(new Date());//预支付时间
|
|
|
prescriptionPay.setOpenid(openid); // 用戶微信openid
|
|
|
prescriptionPay.setTotalAmount(totalAmount);//交易总金额
|
|
|
|
|
|
prescriptionPay.setCreateTime(now);
|
|
|
prescriptionPay.setCzrq(now);
|
|
|
|
|
|
try {
|
|
|
BindCard card = getBindCard(onePayService, openid);
|
|
|
String name = card.getAttachName();
|
|
|
String ssc = card.getAttachCardNo();
|
|
|
String idType = card.getAttachIdType();
|
|
|
String idNo = card.getAttachIdNo();
|
|
|
prescriptionPay.setCardNo(ssc);//医保卡号
|
|
|
prescriptionPay.setUserName(name);//用户名字
|
|
|
prescriptionPay.setIdType(idType);//证件类型
|
|
|
prescriptionPay.setIdNo(idNo);//证件号码
|
|
|
|
|
|
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
|
|
|
String currentDateTime = formatter.format(now);
|
|
|
|
|
|
RequestParams requestParams = new RequestParams();
|
|
|
// 长处方结算入参
|
|
|
// requestParams.setVersion();
|
|
|
// requestParams.setSign();
|
|
|
// requestParams.setEncryptData();
|
|
|
requestParams.setAppId(appId);
|
|
|
requestParams.setTimestamp(currentDateTime);
|
|
|
requestParams.setSignType(signType);
|
|
|
requestParams.setEncryptType(encryptType);
|
|
|
requestParams.setTransType(config.getChargeType());
|
|
|
|
|
|
//业务参数
|
|
|
JSONObject params = new JSONObject();
|
|
|
|
|
|
params.put("outChargeNo", uuid); //接入应用结算业务流水号
|
|
|
params.put("outChargeTime", currentDateTime); //接入应用内结算时间
|
|
|
params.put("userId", openid); //用户 ID
|
|
|
params.put("cardNo", ssc); //医保卡号"D64775061"
|
|
|
|
|
|
//获取绑卡信息
|
|
|
params.put("userName", name);
|
|
|
params.put("idType", idType);
|
|
|
params.put("idNo", idNo);
|
|
|
params.put("totalAmount", Integer.toString(totalAmount)); //处方总金额
|
|
|
Properties systemConf = SystemConf.getInstance().getSystemProperties();
|
|
|
String returnUrl = systemConf.getProperty("return_url");
|
|
|
returnUrl = returnUrl.replace("{server}", serverUrl);
|
|
|
params.put("returnUrl", returnUrl); //长处方页面跳转地址
|
|
|
params.put("channel", channel); //微信医保支付
|
|
|
params.put("merchName", orgName); //收款单位名称
|
|
|
params.put("subject", subject); //订单名称
|
|
|
params.put("wxToken", accessToken);
|
|
|
|
|
|
JSONObject jsonParams = prescriptionService.getPayInfo(prescriptionCode);
|
|
|
JSONObject recipe = jsonParams.getJSONObject("recipeContent");
|
|
|
params.put("recipeContent", recipe);// 处方主信息
|
|
|
prescriptionPay.setRecipeContent(recipe.toJSONString());//处方主信息
|
|
|
JSONObject zdContent = jsonParams.getJSONObject("zdlist");
|
|
|
params.put("zdlist", zdContent);// 诊断明细
|
|
|
prescriptionPay.setZdlist(zdContent.toJSONString());//诊断明细
|
|
|
JSONObject mxContent = jsonParams.getJSONObject("mxlist");
|
|
|
params.put("mxlist", mxContent);//处方明细
|
|
|
prescriptionPay.setMxlist(mxContent.toJSONString());//处方明细
|
|
|
|
|
|
Map<String, String> map = new HashMap<>();//请求结构体
|
|
|
map.put("feeType", "06");//长处方结算
|
|
|
map.put("settleType", "01"); //诊间医保结算
|
|
|
params.put("requestContent", objectMapper.writeValueAsString(map));// 请求结构体
|
|
|
|
|
|
requestParams.setParam(params);
|
|
|
msgBody = JSON.toJSONString(requestParams);
|
|
|
//执行支付 获取预支付原生返回值
|
|
|
ResponseParams<JSONObject> res = onepayClient.execute(requestParams);
|
|
|
response = JSON.toJSONString(res);
|
|
|
|
|
|
if (OnepayDefaultClient.isSuccessful(res)) {
|
|
|
JSONObject json = res.getParam();
|
|
|
String chargeNo = String.valueOf(json.get("chargeNo")); //医保结算业务流水号
|
|
|
result = String.valueOf(json.get("payUrl"));
|
|
|
prescriptionPay.setChargeNo(chargeNo);//支付后返回的流水号
|
|
|
} else {
|
|
|
isSuccess = false;
|
|
|
flag = 0;
|
|
|
error = "请求失败,返回结果:" + res.getRespCode() + "," + res.getRespMsg();
|
|
|
}
|
|
|
} catch (Exception ex) {
|
|
|
isSuccess = false;
|
|
|
flag = 0;
|
|
|
StringWriter sw = new StringWriter();
|
|
|
PrintWriter pw = new PrintWriter(sw);
|
|
|
ex.printStackTrace(pw);
|
|
|
error = sw.toString();
|
|
|
}
|
|
|
|
|
|
//保存交易记录
|
|
|
payDao.save(prescriptionPay);
|
|
|
//保存续方更改消息
|
|
|
prescriptionDao.save(prescription);
|
|
|
//保存物流信息
|
|
|
expressageDao.save(expressage);
|
|
|
|
|
|
//保存http日志
|
|
|
logService.saveHttpLog(isSuccess, config.getRecipeChargeType(), "长处方结算", "POST", null, msgBody, response, error, logService.onepayType);
|
|
|
//保存长处方日志 type=2易联众对接 flag =1成功 flag=0 0失败 userType 1 患者 2医生
|
|
|
payLogService.addLog(prescription, 2, flag, 1);
|
|
|
if (!isSuccess) {
|
|
|
throw new Exception(error);
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
|
|
|
//****************************************** 支付查询基本工具方法 *******************************************************************************
|
|
|
|
|
|
/**
|
|
|
* 家庭医生签约支付查询
|
|
|
*/
|
|
|
public JSONObject receiveNotify() throws Exception{
|
|
|
JSONObject jsonObject = new JSONObject();
|
|
|
return jsonObject;
|
|
|
public String chargeQuery(String code, String accessToken) throws Exception {
|
|
|
int flag =0;
|
|
|
Boolean isSuccess = true;
|
|
|
String msgBody = "";
|
|
|
String response = "";
|
|
|
String error = "";
|
|
|
String result = null;
|
|
|
|
|
|
WlyyCharge charge = chargeDao.findByCode(code);
|
|
|
HospitalMapping hospitalMapping = mappingDao.findByCode(charge.getHospital());
|
|
|
OnepayDefaultClient onepayClient = new OnepayDefaultClient(config.getOnepayApi(), hospitalMapping.getAppId(), hospitalMapping.getAppSecret(), signType, encryptType);
|
|
|
try {
|
|
|
RequestParams requestParams = new RequestParams();
|
|
|
// requestParams.setVersion();
|
|
|
// requestParams.setSign();
|
|
|
// requestParams.setEncryptData();
|
|
|
// requestParams.setAppId(appId);
|
|
|
requestParams.setAppId(hospitalMapping.getAppId());
|
|
|
requestParams.setTimestamp(DateUtil.getCurrentDateTime());
|
|
|
requestParams.setSignType(signType);
|
|
|
requestParams.setEncryptType(encryptType);
|
|
|
requestParams.setTransType(config.getChargeQueryType());
|
|
|
|
|
|
//业务参数
|
|
|
JSONObject params = new JSONObject();
|
|
|
params.put("outChargeNo", code); //接入应用结算业务流水号
|
|
|
params.put("wxToken", accessToken);
|
|
|
|
|
|
requestParams.setParam(params);
|
|
|
msgBody = JSON.toJSONString(requestParams);
|
|
|
//执行支付 返回原生返回值
|
|
|
ResponseParams<JSONObject> res = onepayClient.execute(requestParams);
|
|
|
response = JSON.toJSONString(res);
|
|
|
|
|
|
if (OnepayDefaultClient.isSuccessful(res)) {
|
|
|
//业务处理*******************
|
|
|
// 只返回业务出参
|
|
|
|
|
|
// result = JSON.toJavaObject(res.getParam(), Charge.class);
|
|
|
flag = 1;
|
|
|
result = JSON.toJSONString(res.getParam());
|
|
|
// 返回医保机构体
|
|
|
LOGGER.info("请求成功,返回参数: " + result);
|
|
|
} else {
|
|
|
isSuccess = false;
|
|
|
error = "请求失败,返回结果:" + res.getRespCode() + "," + res.getRespMsg();
|
|
|
}
|
|
|
} catch (Exception ex) {
|
|
|
isSuccess = false;
|
|
|
StringWriter sw = new StringWriter();
|
|
|
PrintWriter pw = new PrintWriter(sw);
|
|
|
ex.printStackTrace(pw);
|
|
|
error = sw.toString();
|
|
|
}
|
|
|
|
|
|
//type = 3易联众接口保存http日志
|
|
|
logService.saveHttpLog(isSuccess, config.getRecipeChargeType(), "长处方支付查询", "POST", null, msgBody, response, error, logService.onepayType);
|
|
|
if (!isSuccess) {
|
|
|
throw new Exception(error);
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
//基卫接口
|
|
|
// 第三方快递接口
|
|
|
|
|
|
|
|
|
}
|
|
|
|