Преглед на файлове

Merge branch 'dev' of wujunjie/patient-co-management into dev

chenweida преди 7 години
родител
ревизия
a0e8f39b83
променени са 20 файла, в които са добавени 1570 реда и са изтрити 775 реда
  1. 118 0
      common/common-entity/src/main/java/com/yihu/wlyy/entity/charge/WlyyCharge.java
  2. 47 0
      common/common-entity/src/main/java/com/yihu/wlyy/entity/patient/prescription/PrescriptionPay.java
  3. 17 1
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/event/ApplicationEvent.java
  4. 55 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/job/OnePayQueryJob.java
  5. 57 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/job/PrescriptionPayQueryJob.java
  6. 5 1
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/repository/charge/ChargeDao.java
  7. 8 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/repository/prescription/PrescriptionPayDao.java
  8. 12 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/repository/ylz/PayLogDao.java
  9. 251 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/service/app/charge/OnePayService.java
  10. 231 134
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/service/app/prescription/PatientPrescriptionPayService.java
  11. 58 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/service/third/ylz/PayLogService.java
  12. 0 129
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/service/weixin/wxpay/common/Configure.java
  13. 17 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/web/quota/JobController.java
  14. 3 0
      patient-co/patient-co-wlyy-job/src/main/resources/system.properties
  15. 266 210
      patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/service/app/prescription/PatientPrescriptionPayService.java
  16. 2 1
      patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/service/template/DoctorFeldsherTemplateService.java
  17. 0 129
      patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/service/weixin/wxpay/common/Configure.java
  18. 191 64
      patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/service/weixin/wxpay/service/OnePayService.java
  19. 6 3
      patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/web/patient/prescription/PatientPrescriptionPayController.java
  20. 226 103
      patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/web/wx/OnePayController.java

+ 118 - 0
common/common-entity/src/main/java/com/yihu/wlyy/entity/charge/WlyyCharge.java

@ -22,6 +22,7 @@ public class WlyyCharge extends IdEntity {
	private String patient;   //  用户
	private String openid;   //  用戶微信openid
	private String ssc;   // 医保卡号
	private String principalSsc;   // 实际签约卡号
	private String name;   //  姓名
	private String idType;   //  证件类型
	private String idNo;   //  证件号码
@ -45,6 +46,123 @@ public class WlyyCharge extends IdEntity {
	private String billNo;   //  待结算费用单据号
	private Date updateTime;//修改时间
	private String miCollectDate;//收费日期
	private String miCollectTime;//收费时间
	private String miSettleNo;//医保收费单据号 (医保签约号)
	private String miCollectStatus;//扣费状态
	private String miRegisterStatus;//登记状态
	private String cadresPay;//公务员补助
	private String miTotalFee;//本次报销总额
	private String healthCarePay;//保健基金支付
	private String heathPay;//健康账户支付
	private String accountPay;//个人账户支付
	private String selfPay;//个人现金支付
	private String civilPay;//民政补助金额
	public String getPrincipalSsc() {
		return principalSsc;
	}
	public void setPrincipalSsc(String principalSsc) {
		this.principalSsc = principalSsc;
	}
	public String getMiCollectDate() {
		return miCollectDate;
	}
	public void setMiCollectDate(String miCollectDate) {
		this.miCollectDate = miCollectDate;
	}
	public String getMiCollectTime() {
		return miCollectTime;
	}
	public void setMiCollectTime(String miCollectTime) {
		this.miCollectTime = miCollectTime;
	}
	public String getMiSettleNo() {
		return miSettleNo;
	}
	public void setMiSettleNo(String miSettleNo) {
		this.miSettleNo = miSettleNo;
	}
	public String getMiCollectStatus() {
		return miCollectStatus;
	}
	public void setMiCollectStatus(String miCollectStatus) {
		this.miCollectStatus = miCollectStatus;
	}
	public String getMiRegisterStatus() {
		return miRegisterStatus;
	}
	public void setMiRegisterStatus(String miRegisterStatus) {
		this.miRegisterStatus = miRegisterStatus;
	}
	public String getCadresPay() {
		return cadresPay;
	}
	public void setCadresPay(String cadresPay) {
		this.cadresPay = cadresPay;
	}
	public String getMiTotalFee() {
		return miTotalFee;
	}
	public void setMiTotalFee(String miTotalFee) {
		this.miTotalFee = miTotalFee;
	}
	public String getHealthCarePay() {
		return healthCarePay;
	}
	public void setHealthCarePay(String healthCarePay) {
		this.healthCarePay = healthCarePay;
	}
	public String getHeathPay() {
		return heathPay;
	}
	public void setHeathPay(String heathPay) {
		this.heathPay = heathPay;
	}
	public String getAccountPay() {
		return accountPay;
	}
	public void setAccountPay(String accountPay) {
		this.accountPay = accountPay;
	}
	public String getSelfPay() {
		return selfPay;
	}
	public void setSelfPay(String selfPay) {
		this.selfPay = selfPay;
	}
	public String getCivilPay() {
		return civilPay;
	}
	public void setCivilPay(String civilPay) {
		this.civilPay = civilPay;
	}
	public String getChargeType() {
		return chargeType;
	}

+ 47 - 0
common/common-entity/src/main/java/com/yihu/wlyy/entity/patient/prescription/PrescriptionPay.java

@ -58,6 +58,53 @@ public class PrescriptionPay extends IdEntity {
    private String mxlist;//处方明细
    private Date createTime;//续方确认支付时间
    private Date czrq;//续方记录最后操作时间
    //    易联众新增查询返回字段v1.3.7
    private String medOrgNo;//医疗机构编号
    private String medOrgName;//医疗机构名称
    private Date traceTime;//交易成功时间
    private String traceNo;//支付平台跟踪号
    private String principalCardNo;//实际签约卡号
    public String getPrincipalCardNo() {
        return principalCardNo;
    }
    public void setPrincipalCardNo(String principalCardNo) {
        this.principalCardNo = principalCardNo;
    }
    public Date getTraceTime() {
        return traceTime;
    }
    public void setTraceTime(Date traceTime) {
        this.traceTime = traceTime;
    }
    public String getTraceNo() {
        return traceNo;
    }
    public void setTraceNo(String traceNo) {
        this.traceNo = traceNo;
    }
    public String getMedOrgNo() {
        return medOrgNo;
    }
    public void setMedOrgNo(String medOrgNo) {
        this.medOrgNo = medOrgNo;
    }
    public String getMedOrgName() {
        return medOrgName;
    }
    public void setMedOrgName(String medOrgName) {
        this.medOrgName = medOrgName;
    }
    public Integer getAccountBalance() {
        return accountBalance;

+ 17 - 1
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/event/ApplicationEvent.java

@ -99,6 +99,14 @@ public class ApplicationEvent implements ApplicationListener<ContextRefreshedEve
                logger.info("zy_execute_sick_settle_job reorder job job exist");
            }
            //处理当天支付,页面回调及异步回调失败的支付,每3分钟一次去主动查询并保存
            if (!quartzHelper.isExistJob("prescription_pay_query_job")) {
                String trigger = SystemConf.getInstance().getSystemProperties().getProperty("prescription_pay_query_job");
                quartzHelper.addJob(PrescriptionPayQueryJob.class, trigger, "prescription_pay_query_job", new HashMap<String, Object>());
                logger.info("prescription_pay_query_job reorder job job success");
            } else {
                logger.info("prescription_pay_query_job reorder job job exist");
            }
            //居民24小时未回复的咨询自动关闭 每小时59分开始执行一次
            if (!quartzHelper.isExistJob("finish_consult_job")) {
                String trigger = SystemConf.getInstance().getSystemProperties().getProperty("finish_consult_job");
@ -125,7 +133,7 @@ public class ApplicationEvent implements ApplicationListener<ContextRefreshedEve
            } else {
                logger.info("patient_disease_contion_syn_job  job exist");
            }
    
            //查询家庭签约支付结果,补更新医保签约号,3分钟跑一次
            if (!quartzHelper.isExistJob("sign_family_pay_result_migisterno_job")) {
                String trigger = SystemConf.getInstance().getSystemProperties().getProperty("sign_family_pay_result_migisterno_job");
@ -134,6 +142,14 @@ public class ApplicationEvent implements ApplicationListener<ContextRefreshedEve
            } else {
                logger.info("sign_family_pay_result_migisterno_job  job exist");
            }
            //处理家庭签约当天支付,页面回调及异步回调失败的支付,每3分钟一次去主动查询并保存
            if (!quartzHelper.isExistJob("onepay_query_job")) {
                String trigger = SystemConf.getInstance().getSystemProperties().getProperty("onepay_query_job");
                quartzHelper.addJob(OnePayQueryJob.class, trigger, "onepay_query_job", new HashMap<String, Object>());
                logger.info("onepay_query_job  job success");
            } else {
                logger.info("onepay_query_job  job exist");
            }

+ 55 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/job/OnePayQueryJob.java

@ -0,0 +1,55 @@
package com.yihu.wlyy.job;
import com.yihu.wlyy.repository.charge.ChargeDao;
import com.yihu.wlyy.service.app.charge.OnePayService;
import com.yihu.wlyy.wechat.util.WeiXinAccessTokenUtils;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
 * 处理家庭签约当天支付,页面回调及异步回调失败的支付,每3分钟一次去主动查询并保存
 * Created by Reece on 2017/9/26/029.
 */
public class OnePayQueryJob implements Job {
    private static final Logger logger = LoggerFactory.getLogger(OnePayQueryJob.class);
    @Autowired
    private ChargeDao chargeDao;
    @Autowired
    private OnePayService payService;
    @Autowired
    WeiXinAccessTokenUtils weiXinAccessTokenUtils;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        logger.info("OnePayQueryJob start ..........");
        try {
            String accesstoken =  weiXinAccessTokenUtils.getAccessToken();
            //获取支付成功,回调失败的支付记录
            List<String> codeList = chargeDao.findTodayUnpay();
            if (!codeList.isEmpty()) {
                for (String code : codeList) {
                    try {
                        payService.chargeQuery(code,accesstoken);
                    } catch (Exception e) {
                        logger.info("OnePayQueryJob error ..........continue this JOB,CODE:" + code + ",message:" + e.getMessage());
                        continue;
                    }
                }
            }
            logger.info("OnePayQueryJob end ..........");
        } catch (Exception e) {
            e.printStackTrace();
            logger.info("OnePayQueryJob error ..........,message:" + e.getMessage());
        }
    }
}

+ 57 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/job/PrescriptionPayQueryJob.java

@ -0,0 +1,57 @@
package com.yihu.wlyy.job;
import com.yihu.wlyy.repository.prescription.PrescriptionPayDao;
import com.yihu.wlyy.service.app.prescription.PatientPrescriptionPayService;
import com.yihu.wlyy.service.app.prescription.PrescriptionService;
import com.yihu.wlyy.service.third.jw.JwPrescriptionService;
import com.yihu.wlyy.wechat.util.WeiXinAccessTokenUtils;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
 * 处理当天支付,页面回调及异步回调失败的支付,每3分钟一次去主动查询并保存
 * Created by Reece on 2017/8/29/029.
 */
public class PrescriptionPayQueryJob implements Job {
    private static final Logger logger = LoggerFactory.getLogger(PrescriptionPayQueryJob.class);
    @Autowired
    private PrescriptionPayDao prescriptionPayDao;
    @Autowired
    private PatientPrescriptionPayService payService;
    @Autowired
    WeiXinAccessTokenUtils weiXinAccessTokenUtils;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        logger.info("PrescriptionPayQueryJob start ..........");
        try {
            String accesstoken =  weiXinAccessTokenUtils.getAccessToken();
            //获取支付完成,院内结算失败的 处方CODE 集合
            List<String> prescriptionCodeList = prescriptionPayDao.findTodayUnpay();
            if (!prescriptionCodeList.isEmpty()) {
                for (String code : prescriptionCodeList) {
                    try {
                        payService.chargeQuery(code,accesstoken);
                    } catch (Exception e) {
                        logger.info("PrescriptionPayQueryJob error ..........continue this JOB,CODE:" + code + ",message:" + e.getMessage());
                        continue;
                    }
                }
            }
            logger.info("PrescriptionPayQueryJob end ..........");
        } catch (Exception e) {
            e.printStackTrace();
            logger.info("PrescriptionPayQueryJob error ..........,message:" + e.getMessage());
        }
    }
}

+ 5 - 1
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/repository/charge/ChargeDao.java

@ -59,7 +59,11 @@ public interface ChargeDao extends PagingAndSortingRepository<WlyyCharge, Long>,
    int updateByChargeCode(String chargeCode, String chargeTime, Date updateTime, Integer totalAmount, Integer insuranceAmount, Integer selfPayAmount, String billNo, String miRegisterNo,String tradeStatus);
    List<WlyyCharge> findByPatient(String patient, Pageable pageRequest);
    
    @Query(value = "select * from wlyy_charge where trade_status = ?1 AND (mi_register_no IS null OR mi_register_no = '') AND update_time BETWEEN ?2  and ?3",nativeQuery = true)
    List<WlyyCharge> findByTradeStatusAndMiRegisterNoAndUpdateTime(int tradestatus, Date enddate, Date startdate);
    //   查询当天支付,页面回调及异步回调均失败的支付 tradeStatus为空
    @Query(value = "SELECT t.`code` FROM wlyy_charge t WHERE t.trade_status is null AND t.create_time >= date(now()) AND t.create_time < DATE_ADD(date(now()), INTERVAL 1 DAY)", nativeQuery = true)
    List<String> findTodayUnpay();
}

+ 8 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/repository/prescription/PrescriptionPayDao.java

@ -13,4 +13,12 @@ import java.util.List;
public interface PrescriptionPayDao extends PagingAndSortingRepository<PrescriptionPay, Long>, JpaSpecificationExecutor<PrescriptionPay> {
    @Query("from PrescriptionPay p where p.prescriptionCode=?1 ")
    PrescriptionPay findByPrescriptionPay(String prescriptionCode);
    //查询支付记录
    @Query("from PrescriptionPay p where p.code=?1 ")
    PrescriptionPay findByCode(String code);
    //   查询当天支付,页面回调及异步回调均失败的支付 tradeStatus为空
    @Query(value = "SELECT t.`code` FROM wlyy_prescription_pay t WHERE t.trade_status is null AND t.create_time >= date(now()) AND t.create_time < DATE_ADD(date(now()), INTERVAL 1 DAY)", nativeQuery = true)
    List<String> findTodayUnpay();
}

+ 12 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/repository/ylz/PayLogDao.java

@ -0,0 +1,12 @@
package com.yihu.wlyy.repository.ylz;
import com.yihu.wlyy.entity.ylz.PayLog;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * Created by Reece on 2017/9/20.
 */
public interface PayLogDao extends PagingAndSortingRepository<PayLog, Long>,JpaSpecificationExecutor<PayLog> {
}

+ 251 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/service/app/charge/OnePayService.java

@ -0,0 +1,251 @@
package com.yihu.wlyy.service.app.charge;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.wlyy.entity.charge.WlyyCharge;
import com.yihu.wlyy.entity.organization.HospitalMapping;
import com.yihu.wlyy.entity.ylz.PayConfigura;
import com.yihu.wlyy.repository.charge.ChargeDao;
import com.yihu.wlyy.repository.doctor.DoctorDao;
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.ylz.PayConfiguraDao;
import com.yihu.wlyy.service.third.ylz.PayLogService;
import com.yihu.wlyy.util.SystemConf;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * 易联众统一支付服务类
 * add by hzp at 20170523
 */
@Service
@Transactional
public class OnePayService {
    @Autowired
    private PayConfiguraDao configuraDao;
    private String signType = "MD5";
    private String encryptType = "AES";
    @Autowired
    private HospitalMappingDao hospitalMappingDao;
    @Autowired
    ObjectMapper objectMapper;
    @Autowired
    ChargeDao chargeDao;
    @Autowired
    PatientDao patientDao;
    @Autowired
    SignFamilyDao signFamilyDao;
    @Autowired
    DoctorDao doctorDao;
    @Value("${server.server_url}")
    private String serverUrl;
    @Value("${wechat.accId}")
    private String accId;
    Properties systemConf = SystemConf.getInstance().getSystemProperties();
    private static final Logger LOGGER = LoggerFactory.getLogger(OnePayService.class);
    /**
     * 家庭医生签约支付查询
     */
    public String chargeQuery(String code, String accessToken) throws Exception {
        Boolean isSuccess = true;
        String msgBody = "";
        String response = "";
        String error = "";
        String result = null;
        PayConfigura config = configuraDao.findWorkConfigura();
        try {
            WlyyCharge charge = chargeDao.findByCode(code);
            HospitalMapping hospitalMapping = hospitalMappingDao.findByCode(charge.getHospital());
            OnepayDefaultClient onepayClient = new OnepayDefaultClient(config.getOnepayApi(), hospitalMapping.getAppId(), hospitalMapping.getAppSecret(), signType, encryptType);
            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.toJSONString(res.getParam());
//                 新增保存数据
                JSONObject request = JSON.parseObject(result);
                String chargeStatus = request.getString("chargeStatus");//交易状态
                String chargeNo = request.getString("chargeNo");//支付平台流水号
                String chargeTime = request.getString("chargeTime");//支付平台交易成功时间
                String outChargeNo = request.getString("outChargeNo");//接入应用业务流水号
                String outChargeTime = request.getString("outChargeTime");//接入应用时间
                String medOrgNo = request.getString("medOrgNo");//医疗机构编号
                String medOrgName = request.getString("medOrgName");//医疗机构名称
                String billNo = request.getString("billNo");//待结算费用单据号
                String cardNo = request.getString("cardNo");//医保卡号
                String totalAmount = request.getString("totalAmount");//交易总金额
                String insuranceAmount = request.getString("insuranceAmount");//医保支付金额
                String selfPayAmount = request.getString("selfPayAmount");//自付金额
                String userId = request.getString("userId");//用户openID
                String userName = request.getString("userName");//用户名字
                String idType = request.getString("idType");//证件类型
                String idNo = request.getString("idNo");//证件号码
//                String appId = request.getString("appId");
//                String channel = request.getString("channel");//支付方式
//                String sign = request.getString("sign");
//                String signType = request.getString("signType");
//                String timestamp = request.getString("timestamp");
                JSONObject responseContents = request.getJSONObject("responseContent");//医保结构体
                WlyyCharge chargePay = chargeDao.findByCode(outChargeNo);
                if (responseContents != null) {
                    String miRegisterNo = null;//医保挂号
                    String miCollectDate = null;//收费日期
                    String miCollectTime = null;//收费时间
                    String miSettleNo = null;//医保收费单据号 (医保签约号)
                    String miCollectStatus = null;//扣费状态
                    String miRegisterStatus = null;//登记状态
                    String cadresPay = "0";//公务员补助
                    String miTotalFee = "0";//本次报销总额
                    String healthCarePay = "0";//保健基金支付
                    String heathPay = "0";//健康账户支付
                    String accountPay = "0";//个人账户支付
                    String selfPay = "0";//个人现金支付
                    String civilPay = "0";//民政补助金额
                    if (responseContents.containsKey(miRegisterNo)) {
                        miRegisterNo = responseContents.getString("miRegisterNo");
                    }
                    if (responseContents.containsKey(miCollectDate)) {
                        miCollectDate = responseContents.getString("miCollectDate");
                    }
                    if (responseContents.containsKey(miCollectTime)) {
                        miCollectTime = responseContents.getString("miCollectTime");
                    }
                    if (responseContents.containsKey(miSettleNo)) {
                        miSettleNo = responseContents.getString("miSettleNo");
                    }
                    if (responseContents.containsKey(miCollectStatus)) {
                        miCollectStatus = responseContents.getString("miCollectStatus");
                    }
                    if (responseContents.containsKey(miRegisterStatus)) {
                        miRegisterStatus = responseContents.getString("miRegisterStatus");
                    }
                    if (responseContents.containsKey(cadresPay)) {
                        cadresPay = responseContents.getString("cadresPay");
                    }
                    if (responseContents.containsKey(miTotalFee)) {
                        miTotalFee = responseContents.getString("miTotalFee");
                    }
                    if (responseContents.containsKey(healthCarePay)) {
                        healthCarePay = responseContents.getString("healthCarePay");
                    }
                    if (responseContents.containsKey(heathPay)) {
                        heathPay = responseContents.getString("heathPay");
                    }
                    if (responseContents.containsKey(accountPay)) {
                        accountPay = responseContents.getString("accountPay");
                    }
                    if (responseContents.containsKey(selfPay)) {
                        selfPay = responseContents.getString("selfPay");
                    }
                    if (responseContents.containsKey(civilPay)) {
                        civilPay = responseContents.getString("civilPay");
                    }
                    chargePay.setMiRegisterNo(miRegisterNo);//医保挂号
                    chargePay.setMiCollectDate(miCollectDate);
                    chargePay.setMiCollectTime(miCollectTime);
                    chargePay.setMiSettleNo(miSettleNo);
                    chargePay.setMiCollectStatus(miCollectStatus);
                    chargePay.setMiRegisterStatus(miRegisterStatus);
                    chargePay.setCadresPay(cadresPay);
                    chargePay.setMiTotalFee(miTotalFee);
                    chargePay.setHealthCarePay(healthCarePay);
                    chargePay.setHeathPay(heathPay);
                    chargePay.setAccountPay(accountPay);
                    chargePay.setSelfPay(selfPay);
                    chargePay.setCivilPay(civilPay);
                }
                if ("0".equals(chargeStatus) || "SUCCESS".equals(chargeStatus)) {
                    chargePay.setTradeStatus("1");//交易状态 成功1 失败0
                } else {
                    chargePay.setTradeStatus("0");//交易状态 成功1 失败0
                }
                chargePay.setChargeNo(chargeNo);//支付流水号
                SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMddHHmmss");
                chargePay.setChargeTime(chargeTime);//支付平台交易成功时间
                chargePay.setCreateTime(formatDate.parse(outChargeTime));//接入应用内业务时间
                chargePay.setMedOrgNo(medOrgNo);//医疗机构编号
                chargePay.setMedOrgName(medOrgName);//医疗机构名称
                chargePay.setBillNo(billNo);//待结算费用单据号
                chargePay.setSsc(cardNo);//医保卡号
                chargePay.setTotalAmount(Integer.parseInt(totalAmount));//交易总金额
                chargePay.setInsuranceAmount(Integer.parseInt(insuranceAmount));//医保支付金额
                chargePay.setSelfpayAmount(Integer.parseInt(selfPayAmount));//自付金额
                chargePay.setOpenid(userId);
                chargePay.setName(userName);
                chargePay.setIdType(idType);//证件类型
                chargePay.setIdNo(idNo);//证件号码
                //        保存数据库更改记录
                chargeDao.save(chargePay);
                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();
        }
        if (!isSuccess) {
            throw new Exception(error);
        }
        return result;
    }
}

+ 231 - 134
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/service/app/prescription/PatientPrescriptionPayService.java

@ -1,17 +1,35 @@
package com.yihu.wlyy.service.app.prescription;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.wlyy.entity.charge.WlyyCharge;
import com.yihu.wlyy.entity.message.Message;
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.*;
import com.yihu.wlyy.entity.security.AccessToken;
import com.yihu.wlyy.entity.ylz.PayConfigura;
import com.yihu.wlyy.entity.zydict.ZyPushLog;
import com.yihu.wlyy.repository.charge.ChargeDao;
import com.yihu.wlyy.repository.doctor.DoctorDao;
import com.yihu.wlyy.repository.message.MessageDao;
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.PrescriptionDao;
import com.yihu.wlyy.repository.prescription.PrescriptionExpressageDao;
import com.yihu.wlyy.repository.prescription.PrescriptionInfoDao;
import com.yihu.wlyy.repository.prescription.PrescriptionPayDao;
import com.yihu.wlyy.repository.ylz.PayConfiguraDao;
import com.yihu.wlyy.service.BaseService;
import com.yihu.wlyy.service.common.account.AccessTokenService;
import com.yihu.wlyy.service.weixin.wxpay.common.Configure;
import com.yihu.wlyy.util.SystemConf;
import com.ylzinfo.onepay.sdk.OnepayDefaultClient;
import com.ylzinfo.onepay.sdk.domain.RequestParams;
@ -22,9 +40,18 @@ 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.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.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.*;
/**
@ -34,69 +61,80 @@ import java.util.*;
@Service
public class PatientPrescriptionPayService extends BaseService {
    private Logger logger = LoggerFactory.getLogger(PatientPrescriptionPayService.class);
    private Logger logger=LoggerFactory.getLogger(PatientPrescriptionPayService.class);
    //公共配置文件
    Properties systemConf = SystemConf.getInstance().getSystemProperties();
    //    各环境对应配置
    @Value("${server.server_url}")
    private String serverUrl;
    
    //    Java配置文件 后续删除
    private String signType = "MD5";
    private String encryptType = "AES";
    
    @Value("${wechat.accId}")
    private String accId;
    @Value("${wechat.appId}")
    private String appId;
    @Value("${wechat.appSecret}")
    private String appSecret;
    @Value("${wechat.accId}")
    private String accId;
    
    //    Java配置文件 后续删除
    private String signType = "MD5";
    private String encryptType = "AES";
    //    引入实例
    @Autowired
    private Configure config;
    
    private PayConfiguraDao configuraDao;
    @Autowired
    private PrescriptionPayDao payDao;
    @Autowired
    private HospitalMappingDao mappingDao;
    @Autowired
    private PrescriptionDao prescriptionDao;
    @Autowired
    private ChargeDao chargeDao;
    
    @Autowired
    private SignFamilyDao signFamilyDao;
    
    @Autowired
    private HospitalMappingDao hospitalMappingDao;
    
    @Autowired
    private AccessTokenService accessTokenService;
    
    @Autowired
    private com.yihu.wlyy.util.HttpUtil HttpUtil;
    
    
    public String getSignFamilyPayResult(String outChargeNo, String accessToken, String appId, String appSecret) throws Exception {
    /**
     * 家庭医生签约支付查询
     */
    public String chargeQuery(String code, String accessToken) throws Exception {
        PayConfigura config = configuraDao.findWorkConfigura();
        int flag = 0;
        Boolean isSuccess = true;
        String msgBody = "";
        String response = "";
        String error = "";
        String result = null;
//      ***************************  测通流程 ***************************************
        OnepayDefaultClient onepayClient = new OnepayDefaultClient(config.getOnepayApi(), appId, appSecret, signType, encryptType);
    
        PrescriptionPay charge = payDao.findByCode(code);
        String prescriptionCode = charge.getPrescriptionCode();
        Prescription prescription = prescriptionDao.findByCode(prescriptionCode);
        HospitalMapping hospitalMapping = mappingDao.findByCode(prescription.getHospital());
//          ***************************  测通流程 ***************************************
        OnepayDefaultClient onepayClient = new OnepayDefaultClient(config.getOnepayApi(), hospitalMapping.getAppId(), hospitalMapping.getAppSecret(), signType, encryptType);
        try {
            RequestParams requestParams = new RequestParams();
            requestParams.setAppId(appId);
//            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", outChargeNo);  //接入应用结算业务流水号
            params.put("outChargeNo", code);  //接入应用结算业务流水号
            params.put("wxToken", accessToken);
        
            requestParams.setParam(params);
            msgBody = JSON.toJSONString(requestParams);
@ -104,13 +142,172 @@ public class PatientPrescriptionPayService extends BaseService {
            //执行支付 返回原生返回值
            ResponseParams<JSONObject> res = onepayClient.execute(requestParams);
            response = JSON.toJSONString(res);
        
            if (OnepayDefaultClient.isSuccessful(res)) {
                //业务处理*******************
//                只返回业务出参
                result = JSON.toJSONString(res.getParam());
            
//                logger.info("请求成功,返回参数: " + result);
//                新增保存数据
                JSONObject request = JSON.parseObject(result);
//                String tradeStatus = request.getString("tradeStatus");//交易状态
                String chargeStatus = request.getString("chargeStatus");//交易状态
                String chargeNo = request.getString("chargeNo");//支付平台流水号
                String chargeTime = request.getString("chargeTime");//支付平台交易成功时间
                String outChargeNo = request.getString("outChargeNo");//接入应用业务流水号
                String outChargeTime = request.getString("outChargeTime");//接入应用时间
                String medOrgNo = request.getString("medOrgNo");//医疗机构编号
                String medOrgName = request.getString("medOrgName");//医疗机构名称
                String billNo = request.getString("billNo");//待结算费用单据号
                String cardNo = request.getString("cardNo");//医保卡号
                String totalAmount = request.getString("totalAmount");//交易总金额
                String insuranceAmount = request.getString("insuranceAmount");//医保支付金额
                String selfPayAmount = request.getString("selfPayAmount");//自付金额
                String userId = request.getString("userId");//用户openID
                String userName = request.getString("userName");//用户名字
                String idNo = request.getString("idNo");//证件号码
                String idType = request.getString("idType");//证件类型
//                String appId = request.getString("appId");
//                String channel = request.getString("channel");//支付方式
//                String sign = request.getString("sign");
//                String signType = request.getString("signType");
//                String timestamp = request.getString("timestamp");
                JSONObject responseContents = request.getJSONObject("responseContent");//医保结构体
                PrescriptionPay prescriptionPay = payDao.findByCode(outChargeNo);
                if (responseContents != null) {
                    String miSettleNo = null;//医保收费单据号 (医保签约号)
                    String miRegisterNo = null;//医保挂号
                    String miCollectDate = null;//收费日期
                    String miCollectTime = null;//收费时间
                    String miCollectorName = null;//收费人姓名
                    String miTotalFee ="0";//本次报销总额
                    String selfPay = "0";//个人现金支付
                    String accountPay = "0";//个人账户支付
                    String heathPay = "0";//健康账户支付
                    String cadresPay = "0";//公务员补助
                    String fundPay = "0";//基金支付
                    String healthCarePay = "0";//保健基金支付
                    String commercePay = "0";//商业保险支付
                    String familyPay = "0";//共济账户支付
                    String civilPay = "0";//民政补助金额
                    String civilZone = null;//民政行政区号
                    String bdrugPay = "0";//乙类支付金额
                    String unlessAmount = "0";//非医保费用
                    String exceedAmount = "0";//超封顶线金额
                    String accountBalance = "0";//个人账户余额
                    String healthBalance = "0";//健康账户余额
                    if (responseContents.containsKey("miSettleNo")) {
                        miSettleNo = responseContents.getString("miSettleNo");
                    }
                    if (responseContents.containsKey("miRegisterNo")) {
                        miRegisterNo = responseContents.getString("miRegisterNo");
                    }
                    if (responseContents.containsKey("miCollectDate")) {
                        miCollectDate = responseContents.getString("miCollectDate");
                    }
                    if (responseContents.containsKey("miCollectTime")) {
                        miCollectTime = responseContents.getString("miCollectTime");
                    }
                    if (responseContents.containsKey("miCollectorName")) {
                        miCollectorName = responseContents.getString("miCollectorName");
                    }
                    if (responseContents.containsKey("miTotalFee")) {
                        miTotalFee = responseContents.getString("miTotalFee");
                    }
                    if (responseContents.containsKey("selfPay")) {
                        selfPay = responseContents.getString("selfPay");
                    }
                    if (responseContents.containsKey("accountPay")) {
                        accountPay = responseContents.getString("accountPay");
                    }
                    if (responseContents.containsKey("heathPay")) {
                        heathPay = responseContents.getString("heathPay");
                    }
                    if (responseContents.containsKey("cadresPay")) {
                        cadresPay = responseContents.getString("cadresPay");
                    }
                    if (responseContents.containsKey("fundPay")) {
                        fundPay = responseContents.getString("fundPay");
                    }
                    if (responseContents.containsKey("healthCarePay")) {
                        healthCarePay = responseContents.getString("healthCarePay");
                    }
                    if (responseContents.containsKey("commercePay")) {
                        commercePay = responseContents.getString("commercePay");
                    }
                    if (responseContents.containsKey("familyPay")) {
                        familyPay = responseContents.getString("familyPay");
                    }
                    if (responseContents.containsKey("civilPay")) {
                        civilPay = responseContents.getString("civilPay");
                    }
                    if (responseContents.containsKey("civilZone")) {
                        civilZone = responseContents.getString("civilZone");
                    }
                    if (responseContents.containsKey("bdrugPay")) {
                        bdrugPay = responseContents.getString("bdrugPay");
                    }
                    if (responseContents.containsKey("unlessAmount")) {
                        unlessAmount = responseContents.getString("unlessAmount");
                    }
                    if (responseContents.containsKey("exceedAmount")) {
                        exceedAmount = responseContents.getString("exceedAmount");
                    }
                    if (responseContents.containsKey("accountBalance")) {
                        accountBalance = responseContents.getString("accountBalance");
                    }
                    if (responseContents.containsKey("healthBalance")) {
                        healthBalance = responseContents.getString("healthBalance");
                    }
                    prescriptionPay.setMiSettleNo(miSettleNo);//医保收费单据号
                    prescriptionPay.setMiRegisterNo(miRegisterNo);//医保挂号
                    SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMdd");
                    prescriptionPay.setMiCollectDate(formatDate.parse(miCollectDate));//收费日期
                    SimpleDateFormat formatTime = new SimpleDateFormat("HHmm");
                    prescriptionPay.setMiCollectTime(formatTime.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));//健康账户余额
                }
                if ("0".equals(chargeStatus) || "SUCCESS".equals(chargeStatus)) {
                    prescriptionPay.setTradeStatus("1");//交易状态 成功1 失败0
                }else {
                    prescriptionPay.setTradeStatus("0");//交易状态 成功1 失败0
                }
                prescriptionPay.setChargeNo(chargeNo);//支付流水号
                SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMddHHmmss");
                prescriptionPay.setChargeTime(formatDate.parse(chargeTime));//支付平台交易成功时间
                prescriptionPay.setOutChargeTime(formatDate.parse(outChargeTime));//接入应用内业务时间
                prescriptionPay.setMedOrgNo(medOrgNo);//医疗机构编号
                prescriptionPay.setMedOrgName(medOrgName);//医疗机构名称
                prescriptionPay.setBillNo(billNo);//待结算费用单据号
                prescriptionPay.setCardNo(cardNo);//医保卡号
                prescriptionPay.setTotalAmount(Integer.parseInt(totalAmount));//交易总金额
                prescriptionPay.setInsuranceAmount(Integer.parseInt(insuranceAmount));//医保支付金额
                prescriptionPay.setSelfPayAmount(Integer.parseInt(selfPayAmount));//自付金额
                prescriptionPay.setOpenid(userId);
                prescriptionPay.setUserName(userName);
                prescriptionPay.setIdType(idType);//证件类型
                prescriptionPay.setIdNo(idNo);//证件号码
                //        保存数据库更改记录
                payDao.save(prescriptionPay);
                logger.info("请求成功,返回参数: " + result);
            } else {
                isSuccess = false;
                error = "请求失败,返回结果:" + res.getRespCode() + "," + res.getRespMsg();
@ -122,113 +319,13 @@ public class PatientPrescriptionPayService extends BaseService {
            ex.printStackTrace(pw);
            error = sw.toString();
        }
    
        //type = 3易联众接口保存http日志
//        logger.info("api - " + config.getChargeQueryType());
//        logger.info("request - " + msgBody);
//        logger.info("responses - " + response);
//        logger.info("error - " + error);
        if (!isSuccess) {
            throw new Exception(error);
        }
    
        return result;
    }
    
    /**
     * 1.根据时间范围遍历没有医保签约号的家庭签约支付记录
     * 2.询家庭签约支付结果,补更新医保签约号
     * @param startdate
     * @param enddate
     */
    public void getSignFamilyPayResultJob(Date startdate, Date enddate) throws Exception {
    
        //根据时间范围遍历没有医保签约号的家庭签约支付记录
        List<WlyyCharge> charges = chargeDao.findByTradeStatusAndMiRegisterNoAndUpdateTime(0,enddate,startdate);
        
        if(!charges.isEmpty()){
    
            logger.info("根据时间范围遍历没有医保签约号的家庭签约支付记录:"+charges.size()+"条");
            String accessToken = this.getAccessToken();
            for (WlyyCharge charge:charges) {
                try {
                    
                    //1.根据签约ID获取家庭签约记录,判断是否有效
                    SignFamily signFamily = signFamilyDao.findByCode(charge.getChargeRelation());
                    
                    if(1 == signFamily.getStatus()){
                        HospitalMapping hospitalMapping = hospitalMappingDao.findByCode(charge.getHospital());
                        String appid = hospitalMapping.getAppId();
                        String appsecert =  hospitalMapping.getAppSecret();
                        String signFamilyPayResultJson = this.getSignFamilyPayResult(charge.getCode(),"",appid,appsecert);
                        
                        if(StringUtils.isNotBlank(signFamilyPayResultJson)){
                            JSONObject reobj =  JSON.parseObject(signFamilyPayResultJson);
                            if(reobj.containsKey("responseContent")){
                                JSONObject responseContent = reobj.getJSONObject("responseContent");
                                
                                if(responseContent.containsKey("miRegisterNo") && StringUtils.isNotBlank(responseContent.getString("miRegisterNo"))){
                                        String miRegisterNo = responseContent.getString("miRegisterNo");
                                    charge.setMiRegisterNo(miRegisterNo);
                                    charge.setNeedUpload("1");
                                    charge.setUpdateTime(new Date());
                                    chargeDao.save(charge);
                                }else{
                                    logger.info("ERROR======获取家庭签约支付医保签约号JOB,CODE:"+charge.getCode()+",message:miRegisterNo不存在");
                                }
                            
                            }else{
                                logger.info("ERROR======获取家庭签约支付医保签约号JOB,CODE:"+charge.getCode()+",message:responseContent不存在");
                            }
                        }else{
                            logger.info("ERROR======获取家庭签约支付医保签约号JOB,CODE:"+charge.getCode()+",message:接口无返回值");
                        }
                        
                    }else{
                        logger.info("ERROR======获取家庭签约支付医保签约号JOB,CODE:"+charge.getCode()+",message:对应的签约记录无效");
                    }
                    
                }catch (Exception e){
                    logger.info("ERROR======获取家庭签约支付医保签约号JOB,CODE:"+charge.getCode()+",message:" +e.getMessage());
                    continue;
                }
            }
        }
    }
    /**
     * 获取微信的access_token
     *
     * @return
     */
    public String getAccessToken() throws Exception{
        Iterable<AccessToken> accessTokens = accessTokenService.findAccessToken();
        if (accessTokens != null) {
            for (AccessToken accessToken : accessTokens) {
                if ((System.currentTimeMillis() - accessToken.getAdd_timestamp()) < (accessToken.getExpires_in() * 1000)) {
                    return accessToken.getAccess_token();
                } else {
                    accessTokenService.delAccessToken(accessToken);
                    break;
                }
            }
        }
        String token_url = "https://api.weixin.qq.com/cgi-bin/token";
        String params = "grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
        String result = HttpUtil.sendGet(token_url, params);
        org.json.JSONObject json = new org.json.JSONObject(result);
        if (json.has("access_token")) {
            String token = json.get("access_token").toString();
            String expires_in = json.get("expires_in").toString();
            AccessToken newaccessToken = new AccessToken();
            newaccessToken.setAccess_token(token);
            newaccessToken.setExpires_in(Long.parseLong(expires_in));
            newaccessToken.setAcc_id(accId);
            accessTokenService.addAccessToken(newaccessToken);
            return token;
        } else {
            return null;
        }
    }
}

+ 58 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/service/third/ylz/PayLogService.java

@ -0,0 +1,58 @@
package com.yihu.wlyy.service.third.ylz;
import com.yihu.wlyy.entity.ylz.PayLog;
import com.yihu.wlyy.repository.ylz.PayLogDao;
import com.yihu.wlyy.service.system.SystemDictService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
 * Created by Reece on 2017/9/20.
 * 日志服务
 */
@Service
public class PayLogService {
    @Autowired
    private PayLogDao payLogDao;
    @Autowired
    private SystemDictService systemDictService;
    public String onepayType = "0"; //0家庭签约支付
    public String onepayRecipeType = "1";     //1续方支付
    /**
     * 保存http调用日志  type 0家庭签约支付 1续方支付
     */
    public void saveHttpLog(Boolean isSuccess,String url,String content,String method,String header,String params,String response,String error,String type)
    {
        try {
            //成功日志是否保存
            Boolean saveSuccessLog = systemDictService.getSaveSuccessLog();
            if(!isSuccess || saveSuccessLog) {
                //新增日志
                PayLog log = new PayLog();
                log.setType(type);
                log.setApi(url);
                log.setContent(content);
                log.setMethod(method);
                log.setHeader(header);
                log.setParams(params);
                log.setCreateTime(new Date());
                log.setResponse(response);
                log.setError(error);
                log.setStatus(isSuccess?"1":"0");
                payLogDao.save(log);
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

+ 0 - 129
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/service/weixin/wxpay/common/Configure.java

@ -1,129 +0,0 @@
package com.yihu.wlyy.service.weixin.wxpay.common;
import org.springframework.context.annotation.Configuration;
/**
 * User: hzp
 * Date: 20170518
 * 这里放置各种配置数据
 */
@Configuration
public class Configure {
	/******************************* 易联众统一支付平台 ***********************************************************/
//	private String onepayApi = "http://120.42.37.94:1301/onepay-web/";
//	private String onepayAppId = "1BGKM1UHM03P7B2CA8C000005626EB0E";
//	private String onepayAppSecret = "1BGKM1UHM03I7B2CA8C00000AB682E9A";
//			开发环境应用信息
//	private String onepayApi = "https://xmhealth.ylzpay.com:8080/";
	private String onepayApi = "http://xmhealth.ylzpay.com:8070/";
	private String onepayAppId = "1BLF5SEGN00087165F0A000027362BE5";
	private String onepayAppSecret = "1BLF5SCBO01V3E78A8C00000F3A0FFE7";
	private String bindCardType = "onepay.sicard.bind.info";
	private String chargeType = "onepay.trade.medical.charge";
	private String chargeQueryType = "onepay.trade.medical.charge.query";
	private String createSicardType = "onepay.sicard.createurl";
//	易联众异步回调
	private String receiveNotify = "wlyy.onepay.receiveNotify";
	private String returnUrl = "wlyy.onepay.returnUrl";
//  长处方系列
	private String recipeChargeType = "onepay.trade.long.recipe.charge";
	private String recipeReturnUrl = "wlyy.patient.prescription.pay.recipeReturnUrl";
	private String receiveRecipeNotify = "wlyy.patient.prescription.pay.receiveRecipeNotify";
	public String getRecipeChargeType() {
		return recipeChargeType;
	}
	public void setRecipeChargeType(String recipeChargeType) {
		this.recipeChargeType = recipeChargeType;
	}
	public String getRecipeReturnUrl() {
		return recipeReturnUrl;
	}
	public void setRecipeReturnUrl(String recipeReturnUrl) {
		this.recipeReturnUrl = recipeReturnUrl;
	}
	public String getReceiveRecipeNotify() {
		return receiveRecipeNotify;
	}
	public void setReceiveRecipeNotify(String receiveRecipeNotify) {
		this.receiveRecipeNotify = receiveRecipeNotify;
	}
	public String getReturnUrl() {
		return returnUrl;
	}
	public void setReturnUrl(String returnUrl) {
		this.returnUrl = returnUrl;
	}
	public String getReceiveNotify() {
		return receiveNotify;
	}
	public void setReceiveNotify(String receiveNotify) {
		this.receiveNotify = receiveNotify;
	}
	public String getOnepayApi() {
		return onepayApi;
	}
	public String getOnepayAppId() {
		return onepayAppId;
	}
	public String getOnepayAppSecret() {
		return onepayAppSecret;
	}
	public String getBindCardType() {
		return bindCardType;
	}
	public String getChargeType() {
		return chargeType;
	}
	public String getChargeQueryType() {
		return chargeQueryType;
	}
	public String getCreateSicardType() {
		return createSicardType;
	}
	/******************* 微信社保支付配置 ******************************************/
	//这个就是自己要保管好的私有Key了(切记只能放在自己的后台代码里,不能放在任何可能被看到源代码的客户端程序中)
	// 每次自己Post数据给API的时候都要用这个key来对所有字段进行签名,生成的签名会放在Sign这个字段,API收到Post数据的时候也会用同样的签名算法对Post过来的数据进行签名和验证
	// 收到API的返回的时候也要用这个key来对返回的数据算下签名,跟API的Sign数据进行比较,如果值不一致,有可能数据被第三方给篡改
	private String key = "2935b54b53a957d9516c920a544f2537";
	//微信分配的公众号ID(开通公众号之后可以获取到)
	private String appID = "wxd03f859efdf0873d";
	public String getKey(){
		return key;
	}
	public String getAppid(){
		return appID;
	}
	//获取token地址
	public String TOKEN_API = "https://api.weixin.qq.com/payinsurance/gettoken";
	//挂号/诊间支付统一下单 API 接口
	public String ORDER_API = "https://api.weixin.qq.com/payinsurance/unifiedorder?access_token ACCESS_TOKEN";
}

+ 17 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/web/quota/JobController.java

@ -451,6 +451,23 @@ public class JobController extends BaseController {
        }
    }
    /**
     * 遍历长处方支付但回调都失败的记录,主动查询易联众支付记录并保存
     *
     * @author wujunjie
     * @date 2017/8/30 14:16
     */
    @RequestMapping(value = "/prescriptionPayQueryJob", method = RequestMethod.POST)
    @ApiOperation("遍历长处方支付但回调都失败的记录,主动查询易联众支付记录并保存")
    public String PrescriptionPayQueryJob() {
        try {
            quartzHelper.startNow(PrescriptionPayQueryJob.class, "PRESCRIPTION-PAY_QUERY", null);
            return write(200, "启动成功");
        } catch (Exception e) {
            error(e);
            return error(-1, e.getMessage());
        }
    }
    //******************************长处方 end********************************
    /**
     * 居民监测方案提醒通知

+ 3 - 0
patient-co/patient-co-wlyy-job/src/main/resources/system.properties

@ -104,6 +104,9 @@ patient_disease_contion_syn_job=0 0 2 * * ?
#查询家庭签约支付结果,补更新医保签约号,3分钟跑一次
sign_family_pay_result_migisterno_job=0 0/3 * * * ?
# 家庭签约支付回调失败,每3分钟一次去主动查询并保存
onepay_query_job=0 0/3 * * * ?
#统一支付平台支付成功后页面跳转地址
return_url={server}/wx/html/qygl/html/pay_result.html

Файловите разлики са ограничени, защото са твърде много
+ 266 - 210
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/service/app/prescription/PatientPrescriptionPayService.java


+ 2 - 1
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/service/template/DoctorFeldsherTemplateService.java

@ -260,7 +260,8 @@ public class DoctorFeldsherTemplateService extends BaseService {
            Doctor doctor = doctorDao.findByCode(doctorCode);
            String doctorName = doctor.getName();
            String doctorOpenId = doctor.getOpenid();
//            String doctorOpenId = doctor.getOpenid();
            String doctorOpenId = "o7NFZw1QM4YR1O19mLjwfX1Hh11A";
            String first = businessType;
            sendJson.put("keyword1", content);

+ 0 - 129
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/service/weixin/wxpay/common/Configure.java

@ -1,129 +0,0 @@
package com.yihu.wlyy.service.weixin.wxpay.common;
import org.springframework.context.annotation.Configuration;
/**
 * User: hzp
 * Date: 20170518
 * 这里放置各种配置数据
 */
@Configuration
public class Configure {
	/******************************* 易联众统一支付平台 ***********************************************************/
//	private String onepayApi = "http://120.42.37.94:1301/onepay-web/";
//	private String onepayAppId = "1BGKM1UHM03P7B2CA8C000005626EB0E";
//	private String onepayAppSecret = "1BGKM1UHM03I7B2CA8C00000AB682E9A";
//			开发环境应用信息
//	private String onepayApi = "https://xmhealth.ylzpay.com:8080/";
	private String onepayApi = "http://xmhealth.ylzpay.com:8070/";
	private String onepayAppId = "1BLF5SEGN00087165F0A000027362BE5";
	private String onepayAppSecret = "1BLF5SCBO01V3E78A8C00000F3A0FFE7";
	private String bindCardType = "onepay.sicard.bind.info";
	private String chargeType = "onepay.trade.medical.charge";
	private String chargeQueryType = "onepay.trade.medical.charge.query";
	private String createSicardType = "onepay.sicard.createurl";
//	易联众异步回调
	private String receiveNotify = "wlyy.onepay.receiveNotify";
	private String returnUrl = "wlyy.onepay.returnUrl";
//  长处方系列
	private String recipeChargeType = "onepay.trade.long.recipe.charge";
	private String recipeReturnUrl = "wlyy.patient.prescription.pay.recipeReturnUrl";
	private String receiveRecipeNotify = "wlyy.patient.prescription.pay.receiveRecipeNotify";
	public String getRecipeChargeType() {
		return recipeChargeType;
	}
	public void setRecipeChargeType(String recipeChargeType) {
		this.recipeChargeType = recipeChargeType;
	}
	public String getRecipeReturnUrl() {
		return recipeReturnUrl;
	}
	public void setRecipeReturnUrl(String recipeReturnUrl) {
		this.recipeReturnUrl = recipeReturnUrl;
	}
	public String getReceiveRecipeNotify() {
		return receiveRecipeNotify;
	}
	public void setReceiveRecipeNotify(String receiveRecipeNotify) {
		this.receiveRecipeNotify = receiveRecipeNotify;
	}
	public String getReturnUrl() {
		return returnUrl;
	}
	public void setReturnUrl(String returnUrl) {
		this.returnUrl = returnUrl;
	}
	public String getReceiveNotify() {
		return receiveNotify;
	}
	public void setReceiveNotify(String receiveNotify) {
		this.receiveNotify = receiveNotify;
	}
	public String getOnepayApi() {
		return onepayApi;
	}
	public String getOnepayAppId() {
		return onepayAppId;
	}
	public String getOnepayAppSecret() {
		return onepayAppSecret;
	}
	public String getBindCardType() {
		return bindCardType;
	}
	public String getChargeType() {
		return chargeType;
	}
	public String getChargeQueryType() {
		return chargeQueryType;
	}
	public String getCreateSicardType() {
		return createSicardType;
	}
	/******************* 微信社保支付配置 ******************************************/
	//这个就是自己要保管好的私有Key了(切记只能放在自己的后台代码里,不能放在任何可能被看到源代码的客户端程序中)
	// 每次自己Post数据给API的时候都要用这个key来对所有字段进行签名,生成的签名会放在Sign这个字段,API收到Post数据的时候也会用同样的签名算法对Post过来的数据进行签名和验证
	// 收到API的返回的时候也要用这个key来对返回的数据算下签名,跟API的Sign数据进行比较,如果值不一致,有可能数据被第三方给篡改
	private String key = "2935b54b53a957d9516c920a544f2537";
	//微信分配的公众号ID(开通公众号之后可以获取到)
	private String appID = "wxd03f859efdf0873d";
	public String getKey(){
		return key;
	}
	public String getAppid(){
		return appID;
	}
	//获取token地址
	public String TOKEN_API = "https://api.weixin.qq.com/payinsurance/gettoken";
	//挂号/诊间支付统一下单 API 接口
	public String ORDER_API = "https://api.weixin.qq.com/payinsurance/unifiedorder?access_token ACCESS_TOKEN";
}

+ 191 - 64
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/service/weixin/wxpay/service/OnePayService.java

@ -9,14 +9,14 @@ import com.yihu.wlyy.entity.doctor.profile.Doctor;
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.ylz.PayConfigura;
import com.yihu.wlyy.repository.charge.ChargeDao;
import com.yihu.wlyy.repository.doctor.DoctorDao;
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.service.third.httplog.LogService;
import com.yihu.wlyy.repository.ylz.PayConfiguraDao;
import com.yihu.wlyy.service.third.ylz.PayLogService;
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.util.SystemConf;
@ -25,7 +25,6 @@ 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 io.swagger.models.auth.In;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -48,7 +47,7 @@ import java.util.*;
public class OnePayService {
    @Autowired
    private Configure config;
    private PayConfiguraDao configuraDao;
    @Autowired
    private PayLogService logService;
@ -137,12 +136,14 @@ public class OnePayService {
        String response = "";
        String error = "";
        List<BindCard> result = new ArrayList<BindCard>();
        String appId = config.getOnepayAppId();
        String appSecret = config.getOnepayAppSecret();
        OnepayDefaultClient onepayClient = new OnepayDefaultClient(config.getOnepayApi(), appId, appSecret, signType, encryptType);
        PayConfigura config = configuraDao.findWorkConfigura();
        try {
            String appId = config.getOnepayAppId();
            String appSecret = config.getOnepayAppSecret();
            OnepayDefaultClient onepayClient = new OnepayDefaultClient(config.getOnepayApi(), appId, appSecret, signType, encryptType);
            RequestParams requestParams = new RequestParams();
//            requestParams.setTransType();
//            requestParams.setVersion();
@ -196,22 +197,19 @@ public class OnePayService {
    /**
     * 家庭医生签约支付
     */
    public String charge(String orgCode, String chargeType, String chargeRelation, String totalAmount, String patient, String openid, String accessToken) throws Exception {
    public String charge(String orgCode, String chargeType, String chargeRelation, String totalAmount, String patient, String repUid, String openid, String accessToken) throws Exception {
        //获取机构映射
        HospitalMapping hos = hospitalMappingDao.findByCode(orgCode);
        if (hos == null) {
            throw new Exception("no hospital mapping!");
        }
        return charge(orgCode, hos.getName(), hos.getAppId(), hos.getAppSecret(),hos.getSbCode(), chargeType, chargeRelation, totalAmount,patient, openid,accessToken);
//        对应机构的APPID和appsecret
//        return charge(orgCode, hos.getName(), "54BBAF5148521AC9E053F000660AC502", "54BBAF5148531AC9E053F000660AC502",hos.getSbCode(), chargeType, chargeRelation, totalAmount,patient, openid,accessToken);
//        return charge(orgCode, hos.getName(), "54BBAF5148521AC9E053F000660AC502", "54BBAF5148531AC9E053F000660AC502", "0380", chargeType, chargeRelation, totalAmount, patient, openid, accessToken);
        return charge(orgCode, hos.getName(), hos.getAppId(), hos.getAppSecret(), hos.getSbCode(), chargeType, chargeRelation, totalAmount, patient, repUid, openid, accessToken);
    }
    /**
     * 家庭医生签约支付,成功则返回支付路径
     */
    private String charge(String orgCode, String orgName, String appId, String appSecret, String sbCode, String chargeType, String chargeRelation, String totalAmount, String patient, String openid, String accessToken) throws Exception {
    private String charge(String orgCode, String orgName, String appId, String appSecret, String sbCode, String chargeType, String chargeRelation, String totalAmount, String patient, String repUid, String openid, String accessToken) throws Exception {
        Boolean isSuccess = true;
        String msgBody = "";
        String response = "";
@ -219,20 +217,22 @@ public class OnePayService {
        String result = "";
        String channel = "WX_MMP";   //  医保支付渠道
        String subject = "家庭医生签约支付";   //  订单名称
        OnepayDefaultClient onepayClient = new OnepayDefaultClient(config.getOnepayApi(), appId, appSecret, signType, encryptType);
//     未真正完成支付以前预存储支付信息到wlyy_charge表
        WlyyCharge charge = new WlyyCharge();
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        charge.setChargeType(chargeType);   //交易类型
        charge.setChargeRelation(chargeRelation);  //交易关联代码 wlyy_sign_family字段code
        charge.setCode(uuid);  //  接入应用支付业务流水号
        Date now = new Date();
        charge.setCreateTime(now);
        charge.setPatient(patient);     //  用户
        charge.setOpenid(openid);     //  用戶微信openid
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        PayConfigura config = configuraDao.findWorkConfigura();
        try {
            OnepayDefaultClient onepayClient = new OnepayDefaultClient(config.getOnepayApi(), appId, appSecret, signType, encryptType);
            String uuid = format.format(new Date()) + UUID.randomUUID().toString().replaceAll("-", "").substring(0, 4);
            charge.setChargeType(chargeType);   //交易类型
            charge.setChargeRelation(chargeRelation);  //交易关联代码 wlyy_sign_family字段code
            charge.setCode(uuid);  //  接入应用支付业务流水号
            Date now = new Date();
            charge.setCreateTime(now);
            charge.setPatient(patient);     //  用户
            charge.setOpenid(openid);     //  用戶微信openid
            charge.setHospital(orgCode);
            charge.setHospitalName(orgName);
            charge.setChannel(channel);
@ -250,8 +250,7 @@ public class OnePayService {
            charge.setIdNo(idNo);
            charge.setSsc(ssc);
            SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
            String currentDateTime = formatter.format(now);
            String currentDateTime = format.format(now);
            RequestParams requestParams = new RequestParams();
//            requestParams.setVersion();
//            requestParams.setSign();
@ -284,9 +283,6 @@ public class OnePayService {
            params.put("subject", subject);  //订单名称
            params.put("wxToken", accessToken);
            //extendParams 扩展入参
            //家庭医生签约信息
            //      根据签约code查询签约信息
            SignFamily signFamily = signFamilyDao.findByCode(chargeRelation);
            if (signFamily != null) {
@ -296,37 +292,44 @@ public class OnePayService {
                Doctor doctor = doctorDao.findByCode(signDoctorCode);
                Patient user = patientDao.findByCode(people);
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
                Map<String, String> familyContent = new HashMap<>();
//                familyContent.put("moRegNo", chargeRelation);//医院签约号限长20  signFamily code
                String moregNo = sdf.format(new Date())+ uuid.substring(0,6);
                String moregNo = format.format(new Date()) + uuid.substring(0, 6);
                familyContent.put("moRegNo", moregNo);//医院签约号限长20  signFamily code
                familyContent.put("moRegName",signFamily.getName()); //签约人姓名
//                familyContent.put("moRegName", "沈在鑫"); //签约人姓名
                familyContent.put("moRegName", signFamily.getName()); //签约人姓名
                familyContent.put("moRegAddr", user.getAddress()); //签约人地址
                familyContent.put("moRegTelephone", signFamily.getMobile());//签约人联系电话
                familyContent.put("moRegOrgNo", sbCode); //签约机构 限长4
                familyContent.put("moRegDocNo", doctor.getIdcard());//签约医生编号 限长18 身份证号
                familyContent.put("moRegDocName", signFamily.getSignDoctorName()); //签约医生姓名
                familyContent.put("moRegTime", sdf.format(signFamily.getBegin())); //签约时间
                familyContent.put("moRegEndTime", sdf.format(signFamily.getEnd())); //签约截止时间
//            familyContent.put("moRegYear", "04");//签约年度
                familyContent.put("moRegTime", format.format(signFamily.getBegin())); //签约时间
                familyContent.put("moRegEndTime", format.format(signFamily.getEnd())); //签约截止时间
                familyContent.put("moRegTear", signFamily.getSignYear());//签约年度
                familyContent.put("moRegSource", signFamily.getSignSource()); //签约来源
                familyContent.put("moCollectOrgNo", sbCode); //扣费机构 签约机构
                familyContent.put("moCollectorNo", signFamily.getSignDoctorName());//扣费人 签约医生姓名
                familyContent.put("benefitType", signFamily.getExpensesType()); //补贴类型
//                familyContent.put("benefitType", "01"); //补贴类型
                familyContent.put("moBookOrgNo", sbCode);//登记机构 签约机构
                familyContent.put("moBookerNo", signFamily.getSignDoctorName()); //登记人 签约医生姓名
                familyContent.put("moBookTime", sdf.format(signFamily.getBegin())); //登记时间 签约时间
                familyContent.put("moBookTime", format.format(signFamily.getBegin())); //登记时间 签约时间
                params.put("familyContent", objectMapper.writeValueAsString(familyContent));// 家庭医生签约信息
            }
            //请求结构体
            Map<String, String> map = new HashMap<>();
            map.put("feeType", "04");//家庭医生签约
            map.put("settleType", "03"); //健康账户支付
            //易联众新增字段v1.3.7
            map.put("principalCardNo", ssc); //实际签约卡号( 默认为绑卡主体卡号)
            charge.setPrincipalSsc(ssc);
            if (!patient.equals(repUid)) {
                Patient people = patientDao.findByCode(repUid);
                String repOpenId = people.getOpenid();
                BindCard repCard = ownerCard(repOpenId);
                String repSsc = repCard.getAttachCardNo();
                map.put("principalCardNo", repSsc); //实际签约卡号( 默认为绑卡主体卡号)
                charge.setPrincipalSsc(repSsc);
            }
            params.put("requestContent", objectMapper.writeValueAsString(map));// 请求结构体
            requestParams.setParam(params);
            msgBody = JSON.toJSONString(requestParams);
@ -356,7 +359,6 @@ public class OnePayService {
        chargeDao.save(charge);
        //保存http日志
//        logService.saveHttpLog(isSuccess, config.getChargeType(), "家庭医生签约支付", "POST", null, msgBody, response, error, logService.onepayType);
        logService.saveHttpLog(isSuccess, config.getChargeType(), "家庭医生签约支付", "POST", null, msgBody, response, error, logService.onepayType);
        if (!isSuccess) {
@ -375,19 +377,19 @@ public class OnePayService {
        String response = "";
        String error = "";
        String result = null;
        PayConfigura config = configuraDao.findWorkConfigura();
        WlyyCharge charge = chargeDao.findByCode(code);
        HospitalMapping hospitalMapping = hospitalMappingDao.findByCode(charge.getHospital());
        OnepayDefaultClient onepayClient = new OnepayDefaultClient(config.getOnepayApi(), hospitalMapping.getAppId(), hospitalMapping.getAppSecret(), signType, encryptType);
//        OnepayDefaultClient onepayClient = new OnepayDefaultClient(config.getOnepayApi(), "54BBAF5148521AC9E053F000660AC501", "54BBAF5148531AC9E053F000660AC501", signType, encryptType);
        try {
            WlyyCharge charge = chargeDao.findByCode(code);
            HospitalMapping hospitalMapping = hospitalMappingDao.findByCode(charge.getHospital());
            OnepayDefaultClient onepayClient = new OnepayDefaultClient(config.getOnepayApi(), hospitalMapping.getAppId(), hospitalMapping.getAppSecret(), signType, encryptType);
            RequestParams requestParams = new RequestParams();
//            requestParams.setVersion();
//            requestParams.setSign();
//            requestParams.setEncryptData();
//            requestParams.setAppId(appId);
            requestParams.setAppId(hospitalMapping.getAppId());
//            requestParams.setAppId("54BBAF5148521AC9E053F000660AC501");
            requestParams.setTimestamp(DateUtil.getCurrentDateTime());
            requestParams.setSignType(signType);
            requestParams.setEncryptType(encryptType);
@ -410,10 +412,132 @@ public class OnePayService {
//                result = JSON.toJavaObject(res.getParam(), Charge.class);
                result = JSON.toJSONString(res.getParam());
//                 返回医保机构体
//                 新增保存数据
                JSONObject request = JSON.parseObject(result);
                String chargeStatus = request.getString("chargeStatus");//交易状态
                String chargeNo = request.getString("chargeNo");//支付平台流水号
                String chargeTime = request.getString("chargeTime");//支付平台交易成功时间
                String outChargeNo = request.getString("outChargeNo");//接入应用业务流水号
                String outChargeTime = request.getString("outChargeTime");//接入应用时间
                String medOrgNo = request.getString("medOrgNo");//医疗机构编号
                String medOrgName = request.getString("medOrgName");//医疗机构名称
                String billNo = request.getString("billNo");//待结算费用单据号
                String cardNo = request.getString("cardNo");//医保卡号
                String totalAmount = request.getString("totalAmount");//交易总金额
                String insuranceAmount = request.getString("insuranceAmount");//医保支付金额
                String selfPayAmount = request.getString("selfPayAmount");//自付金额
                String userId = request.getString("userId");//用户openID
                String userName = request.getString("userName");//用户名字
                String idType = request.getString("idType");//证件类型
                String idNo = request.getString("idNo");//证件号码
//                String appId = request.getString("appId");
//                String channel = request.getString("channel");//支付方式
//                String sign = request.getString("sign");
//                String signType = request.getString("signType");
//                String timestamp = request.getString("timestamp");
                WlyyCharge chargePay = chargeDao.findByCode(outChargeNo);
                if (request.containsKey("responseContent")){
                    JSONObject responseContents = request.getJSONObject("responseContent");//医保结构体
                    if (responseContents != null) {
                        String miRegisterNo = null;//医保挂号
                        String miCollectDate = null;//收费日期
                        String miCollectTime = null;//收费时间
                        String miSettleNo = null;//医保收费单据号 (医保签约号)
                        String miCollectStatus = null;//扣费状态
                        String miRegisterStatus = null;//登记状态
                        String cadresPay = "0";//公务员补助
                        String miTotalFee = "0";//本次报销总额
                        String healthCarePay = "0";//保健基金支付
                        String heathPay = "0";//健康账户支付
                        String accountPay = "0";//个人账户支付
                        String selfPay = "0";//个人现金支付
                        String civilPay = "0";//民政补助金额
                        if (responseContents.containsKey(miRegisterNo)) {
                            miRegisterNo = responseContents.getString("miRegisterNo");
                        }
                        if (responseContents.containsKey(miCollectDate)) {
                            miCollectDate = responseContents.getString("miCollectDate");
                        }
                        if (responseContents.containsKey(miCollectTime)) {
                            miCollectTime = responseContents.getString("miCollectTime");
                        }
                        if (responseContents.containsKey(miSettleNo)) {
                            miSettleNo = responseContents.getString("miSettleNo");
                        }
                        if (responseContents.containsKey(miCollectStatus)) {
                            miCollectStatus = responseContents.getString("miCollectStatus");
                        }
                        if (responseContents.containsKey(miRegisterStatus)) {
                            miRegisterStatus = responseContents.getString("miRegisterStatus");
                        }
                        if (responseContents.containsKey(cadresPay)) {
                            cadresPay = responseContents.getString("cadresPay");
                        }
                        if (responseContents.containsKey(miTotalFee)) {
                            miTotalFee = responseContents.getString("miTotalFee");
                        }
                        if (responseContents.containsKey(healthCarePay)) {
                            healthCarePay = responseContents.getString("healthCarePay");
                        }
                        if (responseContents.containsKey(heathPay)) {
                            heathPay = responseContents.getString("heathPay");
                        }
                        if (responseContents.containsKey(accountPay)) {
                            accountPay = responseContents.getString("accountPay");
                        }
                        if (responseContents.containsKey(selfPay)) {
                            selfPay = responseContents.getString("selfPay");
                        }
                        if (responseContents.containsKey(civilPay)) {
                            civilPay = responseContents.getString("civilPay");
                        }
                        chargePay.setMiRegisterNo(miRegisterNo);//医保挂号
                        chargePay.setMiCollectDate(miCollectDate);
                        chargePay.setMiCollectTime(miCollectTime);
                        chargePay.setMiSettleNo(miSettleNo);
                        chargePay.setMiCollectStatus(miCollectStatus);
                        chargePay.setMiRegisterStatus(miRegisterStatus);
                        chargePay.setCadresPay(cadresPay);
                        chargePay.setMiTotalFee(miTotalFee);
                        chargePay.setHealthCarePay(healthCarePay);
                        chargePay.setHeathPay(heathPay);
                        chargePay.setAccountPay(accountPay);
                        chargePay.setSelfPay(selfPay);
                        chargePay.setCivilPay(civilPay);
                }
//                System.out.println("请求成功,返回参数:" + result.getTradeStatus() + "  " + result.getUserName());
                LOGGER.info("请求成功,返回参数: "+result);
                }
                if ("0".equals(chargeStatus) || "SUCCESS".equals(chargeStatus)) {
                    chargePay.setTradeStatus("1");//交易状态 成功1 失败0
                } else {
                    chargePay.setTradeStatus("0");//交易状态 成功1 失败0
                }
                chargePay.setChargeNo(chargeNo);//支付流水号
                SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMddHHmmss");
                chargePay.setChargeTime(chargeTime);//支付平台交易成功时间
                chargePay.setCreateTime(formatDate.parse(outChargeTime));//接入应用内业务时间
                chargePay.setMedOrgNo(medOrgNo);//医疗机构编号
                chargePay.setMedOrgName(medOrgName);//医疗机构名称
                chargePay.setBillNo(billNo);//待结算费用单据号
                chargePay.setSsc(cardNo);//医保卡号
                chargePay.setTotalAmount(Integer.parseInt(totalAmount));//交易总金额
                chargePay.setInsuranceAmount(Integer.parseInt(insuranceAmount));//医保支付金额
                chargePay.setSelfpayAmount(Integer.parseInt(selfPayAmount));//自付金额
                chargePay.setOpenid(userId);
                chargePay.setName(userName);
                chargePay.setIdType(idType);//证件类型
                chargePay.setIdNo(idNo);//证件号码
                //        保存数据库更改记录
                chargeDao.save(chargePay);
                LOGGER.info("请求成功,返回参数: " + result);
            } else {
                isSuccess = false;
                error = "请求失败,返回结果:" + res.getRespCode() + "," + res.getRespMsg();
@ -439,18 +563,22 @@ public class OnePayService {
    /**
     * 生成电子社保卡
     */
    public String createSicard(String patient, String openid) throws Exception {
    public String createSicard(String patient, String openid, String createType) throws Exception {
        Boolean isSuccess = true;
        String msgBody = "";
        String response = "";
        String error = "";
        String result = "";
        String appId = config.getOnepayAppId();
        String appSecret = config.getOnepayAppSecret();
        OnepayDefaultClient onepayClient = new OnepayDefaultClient(config.getOnepayApi(), appId, appSecret, signType, encryptType);
        PayConfigura config = null;
        try {
            config = configuraDao.findWorkConfigura();
            String appId = config.getOnepayAppId();
            String appSecret = config.getOnepayAppSecret();
            OnepayDefaultClient onepayClient = new OnepayDefaultClient(config.getOnepayApi(), appId, appSecret, signType, encryptType);
            RequestParams requestParams = new RequestParams();
            requestParams.setAppId(appId);
            requestParams.setTimestamp(DateUtil.getCurrentDateTime());
@ -463,6 +591,8 @@ public class OnePayService {
            JSONObject params = new JSONObject();
            params.put("openId", openid);
            params.put("accId", accId);  //微信公众号开发者ID
//           易联众新增字段代支付v1.3.7
            params.put("createType", createType);  //生成类型 sicard 个人电子社保卡 OR family 家庭成员绑卡 ( 默认 sicard)
            requestParams.setParam(params);
            requestParams.setTransType(config.getCreateSicardType());
@ -558,15 +688,12 @@ public class OnePayService {
    /**
     * 更改数据 wlyy_sign_family wlyy_charge
     */
    public void updateData(String chargeCode, String chargeNo, String chargeTime, String totalAmount, String insuranceAmount, String selfPayAmount, String billNo, String miRegisterNo) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        Date chargeSuccess = sdf.parse(chargeTime);
        Date updateTime = new Date();
        chargeDao.updateByChargeCode(chargeCode, chargeTime, updateTime, Integer.parseInt(totalAmount), Integer.parseInt(insuranceAmount), Integer.parseInt(selfPayAmount),
                billNo, miRegisterNo, "0");
//        根据wlyy_charge的code 去查找关联代码signCode在更新签约表
        WlyyCharge charge = chargeDao.findByCode(chargeCode);
        signFamilyDao.updatePatientBegin(charge.getChargeRelation(), chargeSuccess, chargeNo, "1",2);
    public void updateData(String chargeStatus, Date chargeTime, String chargeNo, WlyyCharge charge) throws Exception {
        chargeDao.save(charge);
//        成功支付根据wlyy_charge的code 去查找关联代码signCode在更新签约表
        if ("0".equals(chargeStatus)) {
            signFamilyDao.updatePatientBegin(charge.getChargeRelation(), chargeTime, chargeNo, "1", 2);
        }
    }
}

+ 6 - 3
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/web/patient/prescription/PatientPrescriptionPayController.java

@ -84,11 +84,14 @@ public class PatientPrescriptionPayController extends WeixinBaseController {
        try {
            String accessToken = getAccessToken();
            String patient = getUID();
            Map result = payService.charge(type, addressJson, orgCode, prescriptionCode, totalAmount, patient, accessToken, returnUrl,deliveryTime);
            String repUid = getRepUID();
            Map result = payService.charge(type, addressJson, orgCode, prescriptionCode, totalAmount, patient, repUid, accessToken, returnUrl, deliveryTime);
            if ("-1".equals(result.get("status").toString())) {
                return error(-1, "续方居民信息与微信支付身份信息不一致!");
            } else if ("-2".equals(result.get("status").toString())) {
                return error(-1, "续方居民信息挂号号或处方号不存在!");
            } else if ("-3".equals(result.get("status").toString())) {
                return error(-1, "您没有需要待结算的信息!");
            } else {
                return write(200, "支付成功!", "data", result);
            }
@ -165,9 +168,9 @@ public class PatientPrescriptionPayController extends WeixinBaseController {
            @ApiParam(name = "visitNo", value = "挂号号", defaultValue = "3277865")
            @RequestParam(value = "visitNo", required = true) String visitNo,
            @ApiParam(name = "recipeNo", value = "基卫处方号", defaultValue = "3277865")
            @RequestParam(value = "recipeNo", required = true) String recipeNo){
            @RequestParam(value = "recipeNo", required = true) String recipeNo) {
        try {
            com.alibaba.fastjson.JSONObject jsonParams = prescriptionService.getPayInfo(cardNo, visitNo,recipeNo);
            com.alibaba.fastjson.JSONObject jsonParams = prescriptionService.getPayInfo(cardNo, visitNo, recipeNo);
            return write(200, "获取成功!", "data", jsonParams);
        } catch (Exception e) {
            return error(-1, "获取失败!");

+ 226 - 103
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/web/wx/OnePayController.java

@ -4,13 +4,15 @@ import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.wlyy.entity.charge.WlyyCharge;
import com.yihu.wlyy.entity.organization.HospitalMapping;
import com.yihu.wlyy.entity.patient.Patient;
import com.yihu.wlyy.entity.ylz.PayConfigura;
import com.yihu.wlyy.repository.charge.ChargeDao;
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.ylz.PayConfiguraDao;
import com.yihu.wlyy.service.third.httplog.LogService;
import com.yihu.wlyy.service.third.ylz.PayLogService;
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;
@ -25,6 +27,7 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -45,6 +48,8 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -70,38 +75,31 @@ public class OnePayController extends WeixinBaseController {
    @Autowired
    PayLogService logService;
    @Autowired
    private Configure config;
    private PayConfiguraDao configuraDao;
    @Autowired
    private HospitalMappingDao mappingDao;
    @Autowired
    ObjectMapper objectMapper;
    @RequestMapping(value = "createSicard", method = RequestMethod.POST)
    @ApiOperation("生成电子社保卡")
    @ResponseBody
    public String createSicard() throws Exception {
        try {
            String sicardUrl = pay.createSicard("0cc6e4562de2437ab2dbbf51a9fc3b49", "oULM4xAj9sOsHJ95ttKYd_Fjh6Hc");//getUID(), getOpenid());
            return write(200, "生成电子社保卡成功!", "data", sicardUrl);
        } catch (Exception e) {
            error(e);
            return write(-1, "生成电子社保卡失败!");
        }
    }
    @RequestMapping(value = "bindCard", method = RequestMethod.POST)
    @ApiOperation("查询绑卡信息")
    @ResponseBody
    public String bindCard() throws Exception {
        try {
            String patient = getUID();
            String openid = getOpenid();
//            在鑫
//            String patient = "0cc6e4562de2437ab2dbbf51a9fc3b49";
//            String openid = "o7NFZw7FlRW-Hlp0VjM71FR_1otw";
            BindCard bindCard = pay.bindCard(patient, openid);//getUID(), getOpenid());      oULM4xAj9sOsHJ95ttKYd_Fjh6Hc
            String sicardUrl = pay.createSicard(patient, openid);//getUID(), getOpenid());
            String repUid = getRepUID();
            String uid = getUID();
            String patient = uid;
            String createType = "sicard";
            if (!repUid.equals(uid)) {
                patient = repUid;
                createType = "family";
            }
            Patient people = patientDao.findByCode(patient);
            String openid = people.getOpenid();
            BindCard bindCard = pay.bindCard(patient, openid);
            String sicardUrl = pay.createSicard(patient, openid, createType);
            if (bindCard != null) {
                JSONObject json = new JSONObject(bindCard);
                json.put("bindStatus", "000000");
@ -137,11 +135,10 @@ public class OnePayController extends WeixinBaseController {
            totalAmount = "9000";
            String patient = getUID();
            String openId = getOpenid();
//            在鑫
//            String patient = "0cc6e4562de2437ab2dbbf51a9fc3b49";
//            String openId = "o7NFZw7FlRW-Hlp0VjM71FR_1otw";
            String repUid = getRepUID();
            if (StringUtils.isNotEmpty(openId)) {
                String settleNo = pay.charge(orgCode, chargeType, chargeRelation, totalAmount, patient, openId, getAccessToken());  //ohNH9sh4uwuJCxIwcLJtGTX-BaSk    getUID(),getOpenid()
                String settleNo = pay.charge(orgCode, chargeType, chargeRelation, totalAmount, patient, repUid, openId, getAccessToken());
                return write(200, "家庭医生签约支付成功!", "data", settleNo);
            } else {
                return write(-1, "openId为空!");
@ -263,6 +260,8 @@ public class OnePayController extends WeixinBaseController {
     */
    @RequestMapping(value = "/returnUrl")
    public void returnUrl(HttpServletRequest request, HttpServletResponse response) throws IOException, PayException {
        SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMddHHmmss");
        PayConfigura config = configuraDao.findWorkConfigura();
        Boolean isSuccess = false;
        String error = "";
        String responses = "";
@ -273,63 +272,117 @@ public class OnePayController extends WeixinBaseController {
            isSuccess = true;
            String appId = request.getParameter("appId");
            String billNo = request.getParameter("billNo");//待结算费用单据号
            String cardNo = request.getParameter("cardNo");//医保卡号
            String channel = request.getParameter("channel");//支付方式
            String timestamp = request.getParameter("timestamp");
            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 channel = request.getParameter("channel");//支付方式
            String billNo = request.getParameter("billNo");//待结算费用单据号
            String cardNo = request.getParameter("cardNo");//医保卡号
            String totalAmount = request.getParameter("totalAmount");//交易总金额
            String tradeStatus = request.getParameter("tradeStatus");//交易状态
            String insuranceAmount = request.getParameter("insuranceAmount");//医保支付金额
            String selfPayAmount = request.getParameter("selfPayAmount");//自付金额
            String userId = request.getParameter("userId");//用户openID
            String userName = request.getParameter("userName");//用户名字
            String idType = request.getParameter("idType");//证件类型
            String idNo = request.getParameter("idNo");//证件号码
            String chargeStatus = request.getParameter("chargeStatus");//交易状态
            String sign = request.getParameter("sign");
            String signType = request.getParameter("signType");
            WlyyCharge charge = chargeDao.getUploadStatus(outChargeNo);
            String result = pay.chargeQuery(outChargeNo, getAccessToken());//业务出参
            JSONObject param = new JSONObject(result);
            String requestParam = param.getString("responseContent");
            JSONObject responseContents = new JSONObject(requestParam);//医保结构体
            String miRegisterNo = "";
            String miCollectDate = "";
            String miCollectTime = "";
            String miSettleNo = "";
            String miCollectStatus = "";
            String miRegisterStatus = "";
            String cadresPay = "";
            String miTotalFee = "";
            String healthCarePay = "";
            String heathPay = "";
            String accountPay = "";
            String selfPay = "";
            if (responseContents != null) {
               miRegisterNo = responseContents.getString("miRegisterNo");//医保签约号
                 miCollectDate = responseContents.getString("miCollectDate");//扣费日期
                 miCollectTime = responseContents.getString("miCollectTime");//扣费时间
                 miSettleNo = responseContents.getString("miSettleNo");//扣费单据号
                 miCollectStatus = responseContents.getString("miCollectStatus");//扣费状态
                 miRegisterStatus = responseContents.getString("miRegisterStatus");//登记状态
                 cadresPay = responseContents.getString("cadresPay");//政府补贴支付
                 miTotalFee = responseContents.getString("miTotalFee");//扣费总额
                 healthCarePay = responseContents.getString("healthCarePay");//医保统筹支付
                 heathPay = responseContents.getString("heathPay");//健康账户支付
                 accountPay = responseContents.getString("accountPay");//医保账户支付
                 selfPay = responseContents.getString("selfPay");//个人现金支付
            }
            charge.setChargeNo(chargeNo);
            charge.setChargeTime(chargeTime);
            charge.setCreateTime(formatDate.parse(outChargeTime));
            charge.setChannel(channel);
            charge.setBillNo(billNo);
            charge.setPrincipalSsc(cardNo);
            charge.setTotalAmount(Integer.parseInt(totalAmount));
            charge.setInsuranceAmount(Integer.parseInt(insuranceAmount));
            charge.setSelfpayAmount(Integer.parseInt(selfPayAmount));
            charge.setOpenid(userId);
            charge.setName(userName);
            charge.setIdType(idType);
            charge.setIdNo(idNo);
            charge.setTradeStatus(chargeStatus);
            if (param.has("responseContent") && (param.getJSONObject("responseContent") != null)) {
                String requestParam = param.getString("responseContent");
                JSONObject responseContents = new JSONObject(requestParam);//医保结构体
                String miRegisterNo = "";
                String miCollectDate = "";
                String miCollectTime = "";
                String miSettleNo = "";
                String miCollectStatus = "";
                String miRegisterStatus = "";
                String cadresPay = "";
                String miTotalFee = "";
                String healthCarePay = "";
                String heathPay = "";
                String accountPay = "";
                String selfPay = "";
                String civilPay = "";
                if (responseContents != null) {
                    if (responseContents.has("miRegisterNo")) {
                        miRegisterNo = responseContents.getString("miRegisterNo");//医保签约号
                    }
                    if (responseContents.has("miCollectDate")) {
                        miCollectDate = responseContents.getString("miCollectDate");//扣费日期
                    }
                    if (responseContents.has("miCollectTime")) {
                        miCollectTime = responseContents.getString("miCollectTime");//扣费时间
                    }
                    if (responseContents.has("miSettleNo")) {
                        miSettleNo = responseContents.getString("miSettleNo");//扣费单据号
                    }
                    if (responseContents.has("miCollectStatus")) {
                        miCollectStatus = responseContents.getString("miCollectStatus");//扣费状态
                    }
                    if (responseContents.has("miRegisterStatus")) {
                        miRegisterStatus = responseContents.getString("miRegisterStatus");//登记状态
                    }
                    if (responseContents.has("cadresPay")) {
                        cadresPay = responseContents.getString("cadresPay");//政府补贴支付
                    }
                    if (responseContents.has("miTotalFee")) {
                        miTotalFee = responseContents.getString("miTotalFee");//扣费总额
                    }
                    if (responseContents.has("healthCarePay")) {
                        healthCarePay = responseContents.getString("healthCarePay");//医保统筹支付
                    }
                    if (responseContents.has("accountPay")) {
                        accountPay = responseContents.getString("accountPay");//医保账户支付
                    }
                    if (responseContents.has("selfPay")) {
                        selfPay = responseContents.getString("selfPay");//个人现金支付
                    }
                    if (responseContents.has("civilPay")) {
                        civilPay = responseContents.getString("civilPay");//基本卫生服务支付
                    }
                    charge.setMiRegisterNo(miRegisterNo);
                    charge.setMiCollectDate(miCollectDate);
                    charge.setMiCollectTime(miCollectTime);
                    charge.setMiSettleNo(miSettleNo);
                    charge.setMiCollectStatus(miCollectStatus);
                    charge.setMiRegisterStatus(miRegisterStatus);
                    charge.setCadresPay(cadresPay);
                    charge.setMiTotalFee(miTotalFee);
                    charge.setHealthCarePay(healthCarePay);
                    charge.setHeathPay(heathPay);
                    charge.setAccountPay(accountPay);
                    charge.setSelfPay(selfPay);
                    charge.setCivilPay(civilPay);
                }
            }
//                判断是否需要更新数据 needUpload为0不需要更新
            WlyyCharge charge = chargeDao.getUploadStatus(outChargeNo);
            LOGGER.info("before  goto "+charge.getNeedUpload()+" == "+ outChargeNo);
            LOGGER.info("before  goto " + charge.getNeedUpload() + " == " + outChargeNo);
            if (charge != null && !("0".equals(charge.getNeedUpload()))) {
                pay.updateData(outChargeNo, chargeNo, chargeTime, totalAmount, insuranceAmount, selfPayAmount, billNo, miRegisterNo);
                LOGGER.info("after  goto "+charge.getNeedUpload()+" == "+ outChargeNo);
                pay.updateData(chargeStatus, formatDate.parse(chargeTime), chargeNo, charge);
                LOGGER.info("after  goto " + charge.getNeedUpload() + " == " + outChargeNo);
            }
        } catch (Exception e) {
@ -350,29 +403,31 @@ public class OnePayController extends WeixinBaseController {
     */
    @RequestMapping(value = "/receiveNotify")
    public void receiveNotify(HttpServletRequest request, HttpServletResponse response) throws IOException, PayException {
        SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMddHHmmss");
        PayConfigura config = configuraDao.findWorkConfigura();
        Boolean isSuccess = false;
        String error = "";
        String responses = "";
        response.setContentType("text/html;charset=utf-8");
        InputStream inputStream = request.getInputStream();
        String params = StreamUtils.copyToString(inputStream, Charset.forName("UTF-8"));
        JSONObject json = new JSONObject(params);
        String appId = json.getString("appId");
        HospitalMapping hospital = mappingDao.findByAppId(appId);
        String appSecret = hospital.getAppSecret();
        try {
            JSONObject json = new JSONObject(params);
            String appId = json.getString("appId");
            HospitalMapping hospital = mappingDao.findByAppId(appId);
            String appSecret = hospital.getAppSecret();
//        String appSecret = json.getString("appId");
        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());
            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));
@ -406,33 +461,101 @@ public class OnePayController extends WeixinBaseController {
                    String userName = requestParam.getString("userName");//用户名字
                    String idType = requestParam.getString("idType");//证件类型
                    String idNo = requestParam.getString("idNo");//证件号码
                    String tradeStatus = requestParam.getString("tradeStatus");//交易状态
                    String chargeStatus = requestParam.getString("chargeStatus");//交易状态
                    WlyyCharge charge = chargeDao.getUploadStatus(outChargeNo);
                    charge.setChargeNo(chargeNo);
                    charge.setChargeTime(chargeTime);
                    charge.setCreateTime(formatDate.parse(outChargeTime));
                    charge.setChannel(channel);
                    charge.setBillNo(billNo);
                    charge.setPrincipalSsc(cardNo);
                    charge.setTotalAmount(Integer.parseInt(totalAmount));
                    charge.setInsuranceAmount(Integer.parseInt(insuranceAmount));
                    charge.setSelfpayAmount(Integer.parseInt(selfPayAmount));
                    charge.setOpenid(userId);
                    charge.setName(userName);
                    charge.setIdType(idType);
                    charge.setIdNo(idNo);
                    charge.setTradeStatus(chargeStatus);
                    String miRegisterNo = "";//医保签约号
                    if (requestParams.has("responseContent") && (requestParams.getJSONObject("responseContent") != null)) {
                        JSONObject responseContents = requestParams.getJSONObject("responseContent");//医保结构体
                        miRegisterNo = responseContents.getString("miRegisterNo");//医保签约号
                        String miCollectDate = responseContents.getString("miCollectDate");//扣费日期
                        String miCollectTime = responseContents.getString("miCollectTime");//扣费时间
                        String miSettleNo = responseContents.getString("miSettleNo");//扣费单据号
                        String miCollectStatus = responseContents.getString("miCollectStatus");//扣费状态
                        String miRegisterStatus = responseContents.getString("miRegisterStatus");//登记状态
                        String cadresPay = responseContents.getString("cadresPay");//政府补贴支付
                        String miTotalFee = responseContents.getString("miTotalFee");//扣费总额
                        String healthCarePay = responseContents.getString("healthCarePay");//医保统筹支付
//                responseContents.getString("healthPay");
                        String heathPay = responseContents.getString("heathPay");//健康账户支付
                        String accountPay = responseContents.getString("accountPay");//医保账户支付
                        String selfPay = responseContents.getString("selfPay");//个人现金支付
                        String miCollectDate = null;//扣费日期
                        String miCollectTime = null;//扣费时间
                        String miSettleNo = null;//扣费单据号
                        String miCollectStatus = null;//扣费状态
                        String miRegisterStatus = null;//登记状态
                        String cadresPay = "0";//政府补贴支付
                        String miTotalFee = "0";//扣费总额
                        String healthCarePay = "0";//医保统筹支付
                        String heathPay = "0";//健康账户支付
                        String accountPay = "0";//医保账户支付
                        String selfPay = "0";//个人现金支付
                        String civilPay = "0";//基本卫生服务支付
                        if (responseContents.has("miRegisterNo")) {
                            miRegisterNo = responseContents.getString("miRegisterNo");//医保签约号
                        }
                        if (responseContents.has("miCollectDate")) {
                            miCollectDate = responseContents.getString("miCollectDate");
                        }
                        if (responseContents.has("miCollectTime")) {
                            miCollectTime = responseContents.getString("miCollectTime");
                        }
                        if (responseContents.has("miSettleNo")) {
                            miSettleNo = responseContents.getString("miSettleNo");
                        }
                        if (responseContents.has("miCollectStatus")) {
                            miCollectStatus = responseContents.getString("miCollectStatus");
                        }
                        if (responseContents.has("miRegisterStatus")) {
                            miRegisterStatus = responseContents.getString("miRegisterStatus");
                        }
                        if (responseContents.has("cadresPay")) {
                            cadresPay = responseContents.getString("cadresPay");
                        }
                        if (responseContents.has("miTotalFee")) {
                            miTotalFee = responseContents.getString("miTotalFee");
                        }
                        if (responseContents.has("healthCarePay")) {
                            healthCarePay = responseContents.getString("healthCarePay");
                        }
                        if (responseContents.has("heathPay")) {
                            heathPay = responseContents.getString("heathPay");
                        }
                        if (responseContents.has("accountPay")) {
                            accountPay = responseContents.getString("accountPay");
                        }
                        if (responseContents.has("selfPay")) {
                            selfPay = responseContents.getString("selfPay");
                        }
                        if (responseContents.has("civilPay")) {
                            civilPay = responseContents.getString("civilPay");
                        }
                        charge.setMiRegisterNo(miRegisterNo);
                        charge.setMiCollectDate(miCollectDate);
                        charge.setMiCollectTime(miCollectTime);
                        charge.setMiSettleNo(miSettleNo);
                        charge.setMiCollectStatus(miCollectStatus);
                        charge.setMiRegisterStatus(miRegisterStatus);
                        charge.setCadresPay(cadresPay);
                        charge.setMiTotalFee(miTotalFee);
                        charge.setHealthCarePay(healthCarePay);
                        charge.setHeathPay(heathPay);
                        charge.setAccountPay(accountPay);
                        charge.setSelfPay(selfPay);
                        charge.setCivilPay(civilPay);
                    }
//                判断是否需要更新数据 needUpload为0不需要更新
                    WlyyCharge charge = chargeDao.getUploadStatus(outChargeNo);
                    LOGGER.info("before  goto "+charge.getNeedUpload()+" == "+ outChargeNo);
                    LOGGER.info("before  goto " + charge.getNeedUpload() + " == " + outChargeNo);
                    if (charge != null && !("0".equals(charge.getNeedUpload()))) {
                        pay.updateData(outChargeNo, chargeNo, chargeTime, totalAmount, insuranceAmount, selfPayAmount, billNo, miRegisterNo);
                        LOGGER.info("after  goto "+charge.getNeedUpload()+" == "+ outChargeNo);
                        pay.updateData(chargeStatus, formatDate.parse(chargeTime), chargeNo, charge);
                        LOGGER.info("after  goto " + charge.getNeedUpload() + " == " + outChargeNo);
                    }
                    response.getWriter().write("SUCCESS");