修改医疗模块
diff --git a/backend/build.gradle b/backend/build.gradle
index 468595c..30774d0 100644
--- a/backend/build.gradle
+++ b/backend/build.gradle
@@ -74,7 +74,7 @@
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.9.1'
compile group: 'log4j', name: 'log4j', version: '1.2.17'
- compile group: 'com.supwisdom', name: 'payapi-sdk', version: '1.0.28'
+ compile group: 'com.supwisdom', name: 'payapi-sdk', version: '1.0.28-10-g10b32b4'
implementation 'org.hamcrest:hamcrest:2.1'
}
diff --git a/backend/src/main/java/com/supwisdom/dlpay/medical/domain/TBMedicalDtl.java b/backend/src/main/java/com/supwisdom/dlpay/medical/domain/TBMedicalDtl.java
index 386cc9e..98d6b25 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/medical/domain/TBMedicalDtl.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/medical/domain/TBMedicalDtl.java
@@ -3,7 +3,11 @@
import javax.persistence.*;
@Entity
-@Table(name = "tb_medicaldtl",indexes = {@Index(name = "medicaldtl_idx",columnList = "admnumber,feeno,organizationid")})
+@Table(name = "th_medicaldtl", indexes = {
+ @Index(name = "medicaldtl_idx", columnList = "uid,emergency,feeno,organizationid"),
+ @Index(name = "medicaldtl_idx2", columnList = "uid,accdate,organizationid"),
+ @Index(name = "medicaldtl_idx3", columnList = "paystatus,resultid,organizationid"),
+ @Index(name = "medicaldtl_idx4", columnList = "patientid")})
public class TBMedicalDtl {
@Id
@Column(name = "billno", length = 32)
@@ -13,16 +17,16 @@
@Column(name = "uid", length = 32)
private String uid;
/**
- * 付款金额;付款金额 = 总金额 + 加收费用
- */
- @Column(name = "payamount", precision = 10, scale = 3)
- private Double payamount;
- /**
* 总金额
*/
@Column(name = "totalfee", precision = 10, scale = 3)
private Double totalfee;
/**
+ * 归并费用名称
+ */
+ @Column(name = "mergingname",length = 32)
+ private String mergingname;
+ /**
* 加收费用描述
*/
@Column(name = "extrafeedesc", length = 200)
@@ -33,10 +37,20 @@
@Column(name = "feeno", length = 32)
private String feeno;
/**
+ * 收费类型代码
+ */
+ @Column(name = "feetypecode", length = 32)
+ private String feetypecode;
+ /**
* 患者就诊序号
*/
- @Column(name = "admnumber", length = 64)
- private String admnumber;
+ @Column(name = "emergency", length = 64)
+ private String emergency;
+ /**
+ * 就诊日期
+ */
+ @Column(name = "medicaldate", length = 8)
+ private String medicaldate;
/**
* 医院code
*/
@@ -49,6 +63,11 @@
private String invoiceno;
@Column(name = "paystatus", length = 15)
private String paystatus;
+ /**
+ * 入账日期
+ */
+ @Column(name = "accdate", length = 8)
+ private String accdate;
@Column(name = "transdate", length = 14)
private String transdate;
@Column(name = "transtime", length = 6)
@@ -56,10 +75,20 @@
@Column(name = "citizencardno", length = 32)
private String citizencardno;
/**
+ * 患者id
+ */
+ @Column(name = "patientid", length = 64)
+ private String patientid;
+ /**
* HIS结算标识
*/
@Column(name = "resultid", length = 64)
private String resultid;
+ /**
+ * HIS结算日期
+ */
+ @Column(name = "resultdate", length = 8)
+ private String resultdate;
public String getBillno() {
return billno;
@@ -85,14 +114,6 @@
this.uid = uid;
}
- public Double getPayamount() {
- return payamount;
- }
-
- public void setPayamount(Double payamount) {
- this.payamount = payamount;
- }
-
public Double getTotalfee() {
return totalfee;
}
@@ -125,12 +146,12 @@
this.feeno = feeno;
}
- public String getAdmnumber() {
- return admnumber;
+ public String getEmergency() {
+ return emergency;
}
- public void setAdmnumber(String admnumber) {
- this.admnumber = admnumber;
+ public void setEmergency(String emergency) {
+ this.emergency = emergency;
}
public String getInvoiceno() {
@@ -180,4 +201,44 @@
public void setResultid(String resultid) {
this.resultid = resultid;
}
+
+ public String getAccdate() {
+ return accdate;
+ }
+
+ public void setAccdate(String accdate) {
+ this.accdate = accdate;
+ }
+
+ public String getPatientid() {
+ return patientid;
+ }
+
+ public void setPatientid(String patientid) {
+ this.patientid = patientid;
+ }
+
+ public String getFeetypecode() {
+ return feetypecode;
+ }
+
+ public void setFeetypecode(String feetypecode) {
+ this.feetypecode = feetypecode;
+ }
+
+ public String getResultdate() {
+ return resultdate;
+ }
+
+ public void setResultdate(String resultdate) {
+ this.resultdate = resultdate;
+ }
+
+ public String getMergingname() {
+ return mergingname;
+ }
+
+ public void setMergingname(String mergingname) {
+ this.mergingname = mergingname;
+ }
}
diff --git a/backend/src/main/java/com/supwisdom/dlpay/medical/util/MedicalClient.java b/backend/src/main/java/com/supwisdom/dlpay/medical/util/MedicalClient.java
index f3e7533..03b2825 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/medical/util/MedicalClient.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/medical/util/MedicalClient.java
@@ -12,6 +12,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
+import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
@@ -51,7 +52,7 @@
logger.error("调用医疗接口异常,code:" + result.getCode() + ";message:" + result.getMessage());
throw new MedicineException("请求医疗系统异常");
}
- List<PatientInfoResponse> list = result.getData();
+ List<PatientInfoResponse> list = result.getData().get(0);
if (list != null && list.size() > 0) {
return list.get(0);
}
@@ -70,7 +71,7 @@
logger.error("调用医疗接口异常,code:" + result.getCode() + ";message:" + result.getMessage());
throw new MedicineException("请求医疗系统异常");
}
- return result.getData();
+ return result.getData().get(0);
}
public List<ArrangeInfoResponse> getArrangeInfo(String organizationId, String date) {
@@ -84,7 +85,7 @@
logger.error("调用医疗接口异常,code:" + result.getCode() + ";message:" + result.getMessage());
throw new MedicineException("请求医疗系统异常");
}
- return result.getData();
+ return result.getData().get(0);
}
public AppointmentResponse confirmAppointment(ConfirmRequestBean bean) {
@@ -104,7 +105,7 @@
logger.error("调用医疗接口异常,code:" + result.getCode() + ";message:" + result.getMessage());
throw new MedicineException("请求医疗系统异常");
}
- return result.getData();
+ return result.getData().get(0);
}
public UnPayedResponse getUnPayedList(UnPayedRequest bean) {
@@ -112,15 +113,22 @@
Map<String, Object> param = new HashMap<>(4);
param.put("organizationId", bean.getOrganizationId());
param.put("queryType", bean.getQueryType());
- param.put("patientIdList", bean.getPatientIdList());
- String response = httpPost(url + "getUnpayedList", JSON.toJSONString(param));
+ param.put("patientIdentityCardList", bean.getPatientIdentityCardList());
+ String response;
+ try {
+ response = httpPost(url + "getUnpayedList", JSON.toJSONString(param));
+ } catch (HttpServerErrorException e) {
+ // 当前用户在HIS中没有档案时,会返回500 异常
+ logger.error("调用HIS异常",e);
+ return new UnPayedResponse();
+ }
MedicalResponse<UnPayedResponse> result = JSON.parseObject(response, new TypeReference<MedicalResponse<UnPayedResponse>>() {
});
if (result.getCode() != MedicalConstant.MEDICAL_RESPONSE_SUCCESS) {
- logger.error("调用医疗接口异常,code:" + result.getCode() + ";message:" + result.getMessage());
+ logger.error("调用医疗待支付列表接口异常,code:" + result.getCode() + ";message:" + result.getMessage());
throw new MedicineException("请求医疗系统异常");
}
- return result.getData();
+ return result.getData().get(0);
}
public PayedResponse getPayedList(PayedRequest bean) {
@@ -135,10 +143,10 @@
MedicalResponse<PayedResponse> result = JSON.parseObject(response, new TypeReference<MedicalResponse<PayedResponse>>() {
});
if (result.getCode() != MedicalConstant.MEDICAL_RESPONSE_SUCCESS) {
- logger.error("调用医疗接口异常,code:" + result.getCode() + ";message:" + result.getMessage());
+ logger.error("调用医疗获取支付列表接口异常,code:" + result.getCode() + ";message:" + result.getMessage());
throw new MedicineException("请求医疗系统异常");
}
- return result.getData();
+ return result.getData().get(0);
}
public PreFeeResponse getPreCalculatedFee(PreFeeRequest bean) {
@@ -147,16 +155,20 @@
param.put("organizationId", bean.getOrganizationId());
param.put("boilSign", bean.getBoilSign());
param.put("feeRecords", bean.getFeeRecords());
+ param.put("patientId", bean.getPatientId());
String response = httpPost(url + "getPrecalculatedFee", JSON.toJSONString(param));
MedicalResponse<PreFeeResponse> result = JSON.parseObject(response, new TypeReference<MedicalResponse<PreFeeResponse>>() {
});
if (result.getCode() != MedicalConstant.MEDICAL_RESPONSE_SUCCESS) {
- logger.error("调用医疗接口异常,code:" + result.getCode() + ";message:" + result.getMessage());
+ logger.error("调用医疗预结算接口异常,code:" + result.getCode() + ";message:" + result.getMessage());
throw new MedicineException("请求医疗系统异常");
}
- return result.getData();
+ return result.getData().get(0);
}
+ /**
+ * 费用结算处理确认
+ */
public NotifyPayedResponse notifyPayed(NotifyPayedRequest bean) {
String url = getMedicalUrl();
Map<String, Object> param = new HashMap<>(8);
@@ -172,14 +184,14 @@
param.put("totalFee ", bean.getTotalFee());
param.put("brid ", bean.getBrid());
param.put("feeRecords ", bean.getFeeRecords());
- String response = httpPost(url + "getPrecalculatedFee", JSON.toJSONString(param));
+ String response = httpPost(url + "notifyPayed", JSON.toJSONString(param));
MedicalResponse<NotifyPayedResponse> result = JSON.parseObject(response, new TypeReference<MedicalResponse<NotifyPayedResponse>>() {
});
if (result.getCode() != MedicalConstant.MEDICAL_RESPONSE_SUCCESS) {
- logger.error("调用医疗接口异常,code:" + result.getCode() + ";message:" + result.getMessage());
+ logger.error("调用医疗结算确认接口异常,code:" + result.getCode() + ";message:" + result.getMessage());
throw new MedicineException("请求医疗系统异常");
}
- return result.getData();
+ return result.getData().get(0);
}
private String getMedicalUrl() {
diff --git a/backend/src/main/java/com/supwisdom/dlpay/medical/util/MedicalConstant.java b/backend/src/main/java/com/supwisdom/dlpay/medical/util/MedicalConstant.java
index a24cb3b..541ba26 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/medical/util/MedicalConstant.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/medical/util/MedicalConstant.java
@@ -14,8 +14,17 @@
* 订单查询模式
*/
public final static int ORDER_QUERYTYPE_PATIENTID = 1;//按患者id查询
+ public final static int ORDER_QUERYTYPE_IDENTITYCARD = 2;//按证件查询
public final static int ORDER_QUERYTYPE_MEDICALCARD = 3;//按诊疗卡类型查询
/**
+ * 支付状态
+ */
+ public final static String PAY_STATE_PAYED = "1";
+ /**
+ * 支付方式
+ */
+ public final static String PAY_MODE_DLSMK = "6";
+ /**
* 支付列表执行标志
*/
public final static int PAYED_EXECUTEFLAG_INVALID = 0;//本参数无效
@@ -27,6 +36,9 @@
* 医疗系统响应状态码
*/
public final static int MEDICAL_RESPONSE_SUCCESS = 200;//成功
+
+
+
/**
* 本地流水状态
*/
@@ -42,5 +54,8 @@
* payapi响应代码
*/
public final static Integer PAYAPI_SUCCESS_RETCODE = 0;
+ public final static Integer PAYAPI_WAIT_QUERY = 55555;
+ public final static Integer PAYAPI_DEAL_ERROR = 30000;
+ public final static Integer PAYAPI_NOT_EXISTS = 10004;
}
diff --git a/backend/src/main/java/com/supwisdom/dlpay/medical/util/MedicalResponse.java b/backend/src/main/java/com/supwisdom/dlpay/medical/util/MedicalResponse.java
index bf4db4b..efef416 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/medical/util/MedicalResponse.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/medical/util/MedicalResponse.java
@@ -1,9 +1,11 @@
package com.supwisdom.dlpay.medical.util;
+import java.util.ArrayList;
+
public class MedicalResponse<T> {
private int code;
private String message;
- private T data;
+ private ArrayList<T> data;
public int getCode() {
return code;
@@ -21,11 +23,11 @@
this.message = message;
}
- public T getData() {
+ public ArrayList<T> getData() {
return data;
}
- public void setData(T data) {
+ public void setData(ArrayList<T> data) {
this.data = data;
}
}
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt
index 63591dc..39b93a8 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt
@@ -23,6 +23,15 @@
}
}
+ @Bean(value = ["notifyHIS"])
+ fun threadPoolExecutor(): Executor {
+ return ThreadPoolTaskExecutor().apply {
+ corePoolSize = 5
+ maxPoolSize = 10
+ setWaitForTasksToCompleteOnShutdown(true)
+ }
+ }
+
override fun getAsyncUncaughtExceptionHandler(): AsyncUncaughtExceptionHandler? {
return MyAsyncUncaughtExceptionHandler()
}
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt
index ee5c14c..8592797 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt
@@ -1,10 +1,14 @@
package com.supwisdom.dlpay.api
+import com.supwisdom.dlpay.medical.dao.MedicalDtlDao
+import com.supwisdom.dlpay.medical.task.NotifyHISAsyncTask
+import com.supwisdom.dlpay.medical.util.MedicalConstant
import com.supwisdom.dlpay.paysdk.ApiLoginHelper
import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy
import mu.KotlinLogging
import net.javacrumbs.shedlock.core.SchedulerLock
import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.data.domain.PageRequest
import org.springframework.scheduling.annotation.Scheduled
import org.springframework.stereotype.Component
@@ -22,4 +26,24 @@
val loginHelper = ApiLoginHelper(apiLoginProxy)
loginHelper.refresh()
}
+}
+
+@Component
+class NotifyHISPayedSchedulerTask {
+ @Autowired
+ private lateinit var medicalDtlDao: MedicalDtlDao
+ @Autowired
+ private lateinit var notifyHISAsyncTask: NotifyHISAsyncTask
+
+// @Scheduled(cron = "0 */1 * * * ?")
+// @SchedulerLock(name = "dealNotifyHISPayed", lockAtMostForString = "PT10M")
+// fun notifyHISPayed() {
+// val medicalDtlList = medicalDtlDao.findByPaystatusAndResultidIsNull(MedicalConstant.DTL_STATUS_SUCCESS, PageRequest.of(0, 10))
+// if (medicalDtlList.isNullOrEmpty()) {
+// return
+// }
+// medicalDtlList.forEach {
+// notifyHISAsyncTask.notifyHIS(it.billno)
+// }
+// }
}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/MedicalApi.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/MedicalApi.kt
index 09338d3..ee3e35e 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/MedicalApi.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/MedicalApi.kt
@@ -8,7 +8,9 @@
import com.supwisdom.dlpay.medical.bean.ConfirmRequestBean
import com.supwisdom.dlpay.medical.bean.PaymentRequestBean
import com.supwisdom.dlpay.medical.exception.MedicineException
-import com.supwisdom.dlpay.medical.service.MedicineService
+import com.supwisdom.dlpay.medical.service.MedicalService
+import com.supwisdom.dlpay.medical.task.NotifyHISAsyncTask
+import com.supwisdom.dlpay.medical.util.MedicalConstant
import com.supwisdom.dlpay.mobile.domain.TBMobileUser
import com.supwisdom.dlpay.mobile.service.MobileApiService
import com.supwisdom.dlpay.paysdk.proxy.UserProxy
@@ -19,14 +21,16 @@
import org.springframework.web.bind.annotation.*
@RestController
-@RequestMapping("/mobileapi/medicineapi")
+@RequestMapping("/mobileapi/medicalapi")
class MedicalApi {
@Autowired
- lateinit var medicineService: MedicineService
+ lateinit var medicalService: MedicalService
@Autowired
lateinit var mobileApiService: MobileApiService
@Autowired
lateinit var userProxy: UserProxy
+ @Autowired
+ lateinit var notifyHISAsyncTask: NotifyHISAsyncTask
val logger = KotlinLogging.logger { }
@@ -38,9 +42,9 @@
/**
* 查询医院列表
*/
- @GetMapping("/hospital/list")
+ /*@GetMapping("/hospital/list")
fun getHospitalList(pageno: Int, pagesize: Int, name: String?): JsonResult? {
- val data = medicineService.getHospitalList(pageno, pagesize, name)
+ val data = medicalService.getHospitalList(pageno, pagesize, name)
return JsonResult.ok().put("data", data)
}
@@ -52,7 +56,7 @@
val p = SecurityContextHolder.getContext().authentication
val user = mobileApiService.findUserById(p.name)
?: return JsonResult.error("用户不存在,请注册")
- val data = medicineService.getMedicalCardList(user.uid, hospitalcode)
+ val data = medicalService.getMedicalCardList(user.uid, hospitalcode)
return JsonResult.ok().put("data", data)
}
@@ -65,7 +69,7 @@
val p = SecurityContextHolder.getContext().authentication
val user = mobileApiService.findUserById(p.name)
?: return JsonResult.error("用户不存在,请注册")
- medicineService.deleteMedicalCard(user.uid, cardid)
+ medicalService.deleteMedicalCard(user.uid, cardid)
return JsonResult.ok()
} catch (e: MedicineException) {
logger.error(e.message)
@@ -84,10 +88,10 @@
?: return JsonResult.error("用户不存在,请注册")
bean.checkParam()
bean.uid = user.uid
- medicineService.addPatient(bean)
+ medicalService.addPatient(bean)
return JsonResult.ok()
} catch (e: Exception) {
- logger.error("系统异常",e)
+ logger.error("系统异常", e)
return JsonResult.error("系统异常,请稍后重试")
}
}
@@ -98,10 +102,10 @@
@GetMapping("/arrange/info/{hospitalcode}")
fun addPatient(date: String, @PathVariable hospitalcode: String): JsonResult? {
return try {
- val data = medicineService.getArrangeInfo(hospitalcode, date)
+ val data = medicalService.getArrangeInfo(hospitalcode, date)
JsonResult.ok().put("data", data)
} catch (e: Exception) {
- logger.error("系统异常",e)
+ logger.error("系统异常", e)
JsonResult.error("系统异常,请稍后重试")
}
}
@@ -116,10 +120,10 @@
val user = mobileApiService.findUserById(p.name)
?: return JsonResult.error("用户不存在,请注册")
bean.uid = user.uid
- medicineService.confirmAppointment(bean)
+ medicalService.confirmAppointment(bean)
return JsonResult.ok()
} catch (e: Exception) {
- logger.error("系统异常",e)
+ logger.error("系统异常", e)
return JsonResult.error("系统异常,请稍后重试")
}
}
@@ -132,7 +136,7 @@
val p = SecurityContextHolder.getContext().authentication
val user = mobileApiService.findUserById(p.name)
?: return JsonResult.error("用户不存在,请注册")
- val data = medicineService.getAppointmentList(pageno, pagesize, user.uid)
+ val data = medicalService.getAppointmentList(pageno, pagesize, user.uid)
return JsonResult.ok().put("data", data)
}
@@ -145,7 +149,7 @@
val p = SecurityContextHolder.getContext().authentication
val user = mobileApiService.findUserById(p.name)
?: return JsonResult.error("用户不存在,请注册")
- val data = medicineService.deleteAppointment(appointmentid, user.uid)
+ val data = medicalService.deleteAppointment(appointmentid, user.uid)
return JsonResult.ok().put("data", data)
} catch (e: MedicineException) {
logger.error(e.message)
@@ -156,16 +160,29 @@
/**
* 获取待支付列表
*/
- @GetMapping("/unpayed/list")
- fun getUnPayedList(hospitalcode: String, cardid: String): JsonResult? {
+ @PostMapping("/unpayed/list")
+ fun getUnPayedList(hospitalcode: String): JsonResult? {
try {
val p = SecurityContextHolder.getContext().authentication
val user = mobileApiService.findUserById(p.name)
?: return JsonResult.error("用户不存在,请注册")
- val data = medicineService.getUnPayedList(user.uid, hospitalcode, cardid)
+ if (user.userid.isNullOrEmpty()) {
+ return JsonResult.error("请绑定银行卡")
+ }
+ val userInfo = userProxy.querybycardno(QueryUserParam().apply {
+ this.userid = user.userid
+ })
+ if (userInfo.retcode != 0) {
+ logger.error { "获取userid为${user.userid}的用户信息失败,错误信息:${userInfo.retmsg}" }
+ return JsonResult.error("获取用户信息失败")
+ }
+ val data = medicalService.getUnPayedList(user.uid, userInfo.idno, hospitalcode)
return JsonResult.ok().put("data", data)
} catch (e: Exception) {
- logger.error("系统异常",e)
+ logger.error("系统异常", e)
+ if (e is MedicineException) {
+ return JsonResult.error(e.message)
+ }
return JsonResult.error("系统异常,请稍后重试")
}
}
@@ -173,16 +190,19 @@
/**
* 获取已支付列表
*/
- @GetMapping("/payed/list")
+ @PostMapping("/payed/list")
fun getPayedList(hospitalcode: String, cardid: String): JsonResult? {
try {
val p = SecurityContextHolder.getContext().authentication
val user = mobileApiService.findUserById(p.name)
?: return JsonResult.error("用户不存在,请注册")
- val data = medicineService.getPayedList(user.uid, hospitalcode, cardid)
+ val data = medicalService.getPayedList(user.uid, hospitalcode, cardid)
return JsonResult.ok().put("data", data)
} catch (e: Exception) {
- logger.error("系统异常",e)
+ logger.error("系统异常", e)
+ if (e is MedicineException) {
+ return JsonResult.error(e.message)
+ }
return JsonResult.error("系统异常,请稍后重试")
}
}
@@ -190,23 +210,70 @@
/**
* 支付接口
*/
- @PostMapping("/pay")
- fun medicalPayment(@RequestBody bean: PaymentRequestBean): JsonResult? {
- val p = SecurityContextHolder.getContext().authentication
- val user = mobileApiService.findUserById(p.name)
- ?: return JsonResult.error("用户不存在,请注册")
- val checkResult = checkUserConsume(user)
- if (checkResult?.get("code") != 200) {
- return checkResult
+ @PostMapping("/pay/{billno}")
+ fun medicalPayment(@PathVariable billno: String): JsonResult? {
+ try {
+ val p = SecurityContextHolder.getContext().authentication
+ val user = mobileApiService.findUserById(p.name)
+ ?: return JsonResult.error("用户不存在,请注册")
+ val bean = PaymentRequestBean()
+ bean.billno = billno
+ val checkResult = checkUserConsume(user, bean)
+ if (checkResult?.get("code") != 200) {
+ return checkResult
+ }
+ medicalService.medicalPayPreInit(user.uid, bean)
+ medicalService.medicalPayInit(billno)
+ val confirmResult = medicalService.medicalPayConfirm(billno)
+ return if (confirmResult!!["code"] == MedicalConstant.MEDICAL_RESPONSE_SUCCESS) {
+ if (confirmResult["msg"] == MedicalConstant.DTL_STATUS_SUCCESS) {
+ notifyHISAsyncTask.notifyHIS(billno)
+ JsonResult.ok().put("status", MedicalConstant.DTL_STATUS_SUCCESS)
+ } else {
+ JsonResult.ok().put("status", MedicalConstant.DTL_STATUS_WIP)
+ }
+ } else {
+ confirmResult
+ }
+ } catch (e: Exception) {
+ logger.error("系统异常", e)
+ if (e is MedicineException) {
+ return JsonResult.error(e.message)
+ }
+ return JsonResult.error("系统异常,请稍后重试")
}
- val cardNo = checkResult["data"] as String
- medicineService.medicalPayPreInit(user.uid, bean, cardNo)
-// medicineService.medicalPayInit()
-// medicineService.medicalPayConfirm()
- return JsonResult.ok()
}
- fun checkUserConsume(user: TBMobileUser): JsonResult? {
+ /**
+ * 查询订单支付是否成功
+ */
+ @PostMapping("/pay/query/{billno}")
+ fun queryPayStatus(@PathVariable billno: String): JsonResult? {
+ try {
+ val p = SecurityContextHolder.getContext().authentication
+ val user = mobileApiService.findUserById(p.name)
+ ?: return JsonResult.error("用户不存在,请注册")
+ val result = medicalService.queryMedicalPayResult(billno, user.uid)
+ return if (result!!["code"] == MedicalConstant.MEDICAL_RESPONSE_SUCCESS) {
+ if (result["msg"] == MedicalConstant.DTL_STATUS_SUCCESS) {
+ notifyHISAsyncTask.notifyHIS(billno)
+ JsonResult.ok().put("status", MedicalConstant.DTL_STATUS_SUCCESS)
+ } else {
+ JsonResult.ok().put("status", MedicalConstant.DTL_STATUS_WIP)
+ }
+ } else {
+ result
+ }
+ } catch (e: Exception) {
+ logger.error("系统异常", e)
+ if (e is MedicineException) {
+ return JsonResult.error(e.message)
+ }
+ return JsonResult.error("系统异常,请稍后重试")
+ }
+ }
+
+ fun checkUserConsume(user: TBMobileUser, bean: PaymentRequestBean): JsonResult? {
if (TradeDict.STATUS_NORMAL != user.status) {
return JsonResult.error("用户状态异常")
}
@@ -234,6 +301,8 @@
if (!cardResponse.card.signed) {
return JsonResult.error("请签约银行卡")
}
- return JsonResult.ok().put("data", userInfo.cardno)
- }
+ bean.cardNo = userInfo.cardno
+ bean.idno = userInfo.idno
+ return JsonResult.ok()
+ }*/
}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/NotifyPayedBean.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/NotifyPayedBean.kt
index da8b4a3..ec69a8e 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/NotifyPayedBean.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/NotifyPayedBean.kt
@@ -10,15 +10,15 @@
var payAmount = 0.0
var outOrderNumber = ""
var payer = ""
- var totalFee = 0.0
- var brid = ""
- var feeRecords = ArrayList<FeeRecordItem>()
+ var totalFee = 0.0
+ var brid = ""
+ var feeRecords = ArrayList<FeeRecordItem>()
}
class NotifyPayedResponse {
- var agtOrderNumber = ""
- var resultId = ""
- var invoiceNumber = ""
- var paymentBudgetNumber = ""
+ var agtOrderNumber: String? = ""
+ var resultId: String? = ""
+ var invoiceNumber: String? = ""
+ var paymentBudgetNumber: String? = ""
var feeRecords = ArrayList<FeeRecordItem>()
}
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/PayedBean.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/PayedBean.kt
index 3ec31f7..446980f 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/PayedBean.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/PayedBean.kt
@@ -9,34 +9,34 @@
}
class PayedResponse {
- var patientId = ""
- var patientMedicalCardType = 0
- var patientMedicalCardNumber = ""
+ var patientId: String? = ""
+ var patientMedicalCardType: Int? = 0
+ var patientMedicalCardNumber: String? = ""
var invoiceList = ArrayList<InvoiceItem>()
}
class InvoiceItem {
- var invoiceNumber = ""
- var medicalDate = ""
- var admNumber = ""
+ var invoiceNumber: String? = ""
+ var medicalDate: String? = ""
+ var admNumber: String? = ""
var costList = ArrayList<costItem>()
}
class costItem {
- var mergingCode = 0
- var mergingName = ""
- var executionStatus = 0 //执行判别: 0、已付款/未执行/待执行,1、表示已取药2、表示已执行3、标志已退费
- var execute = "" //执行科室
- var feeNo = ""
- var feeTypeCode = ""
- var totalFee = 0.0
+ var mergingCode: Int? = 0
+ var mergingName: String? = ""
+ var executionStatus: Int? = 0 //执行判别: 0、已付款/未执行/待执行,1、表示已取药2、表示已执行3、标志已退费
+ var execute: String? = "" //执行科室
+ var feeNo: String? = ""
+ var feeTypeCode: String? = ""
+ var totalFee: Double? = 0.0
}
class PayedDTO {
- var medicalDate = ""
- var mergingName = ""
- var executionStatus = 0
- var execute = ""
- var totalFee = 0.0
- var admNumber = ""
+ var medicalDate: String? = ""
+ var mergingName: String? = ""
+ var executionStatus: Int? = 0
+ var execute: String? = ""
+ var totalFee: Double? = 0.0
+ var admNumber: String? = ""
}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/PaymentRequestBean.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/PaymentRequestBean.kt
index 05b16e9..5131801 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/PaymentRequestBean.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/PaymentRequestBean.kt
@@ -1,8 +1,7 @@
package com.supwisdom.dlpay.medical.bean
class PaymentRequestBean {
- var hospitalcode = ""
- var cardid = ""
- var feeno = ""
- var admnumber = ""
+ var billno = ""
+ var cardNo = ""
+ var idno = ""
}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/PrecalculatedFeeBean.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/PrecalculatedFeeBean.kt
index b3238fb..4dfce60 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/PrecalculatedFeeBean.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/PrecalculatedFeeBean.kt
@@ -4,19 +4,20 @@
var organizationId = ""
var boilSign = 0
var feeRecords = ArrayList<FeeRecordItem>()
+ var patientId = ""
}
class FeeRecordItem {
- var feeNo = ""
- var feeTypeCode = ""
- var feeTypeName = ""
- var totalFee = 0.0
+ var feeNo: String? = ""
+ var feeTypeCode: String? = ""
+ var feeTypeName: String? = ""
+ var totalFee: Double? = 0.0
}
class PreFeeResponse {
- var payAmount = 0.0
- var invoiceNumber = ""
- var totalFee = 0.0
- var paymentBudgetNumber = "" //预结算标识
- var extraFeeDesc = "" //加收费费用描述
+ var payAmount: Double? = 0.0
+ var invoiceNumber: String? = ""
+ var totalFee: Double? = 0.0
+ var paymentBudgetNumber: String? = "" //预结算标识
+ var extraFeeDesc: String? = "" //加收费费用描述
}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/UnPayedBean.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/UnPayedBean.kt
index 27a2bcf..1b0bd14 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/UnPayedBean.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/bean/UnPayedBean.kt
@@ -5,48 +5,55 @@
class UnPayedRequest {
var organizationId = ""
var queryType = 0
- var patientIdList = ArrayList<String>()
+ var patientIdentityCardList = ArrayList<IdentityCardBean>()
+}
+
+class IdentityCardBean {
+ var cardType: String? = ""
+ var cardNumber: String? = ""
}
class UnPayedResponse {
- var patientId = ""
- var patientMedicalCardType = 0
- var patientMedicalCardNumber = ""
- var patientName = ""
- var patientSex = ""
- var patientAge = ""
+ var patientId: String? = ""
+ var patientMedicalCardType: Int? = 0
+ var patientMedicalCardNumber: String? = ""
+ var patientName: String? = ""
+ var patientSex: String? = ""
+ var patientAge: String? = ""
var medicalInformation = ArrayList<MedicalInformation>()
}
class MedicalInformation {
- var medicalDate = ""
- var doctorName = ""
- var doctorCode = ""
- var departmentName = ""
- var departmentCode = ""
- var totalFee = 0.0
- var admNumber = "" //就诊序号
+ var medicalDate: String? = ""
+ var doctorName: String? = ""
+ var doctorCode: String? = ""
+ var departmentName: String? = ""
+ var departmentCode: String? = ""
+ var totalFee: Double? = 0.0
+ var emergencyNumber: String? = "" //就诊序号
var mergingItems = ArrayList<MergingItems>()
}
class MergingItems {
- var mergingCode = 0
- var mergingName = ""
- var mergingSubtotal = 0.0
- var feeNo = ""
- var feeTypeCode = ""
- var feeTypeName = ""
- var feeDate = ""
- var boilSign = 0 //代煎标志,0-不代煎,1-代煎
+ var mergingCode: Int? = 0
+ var mergingName: String? = ""
+ var mergingSubtotal: Double? = 0.0
+ var feeNo: String? = ""
+ var feeTypeCode: String? = ""
+ var feeTypeName: String? = ""
+ var feeDate: String? = ""
+ var boilSign: Int? = 0 //代煎标志,0-不代煎,1-代煎
}
class UnPayedDTO {
- var billno = ""
- var medicalDate = ""
- var doctorName = ""
- var subjectName = ""
- var admNumber = ""
- var mergingSubtotal = 0.0
- var feeNo = ""
+ var billNo: String? = ""
+ var medicalDate: String? = ""
+ var doctorName: String? = ""
+ var subjectName: String? = ""
+ var emergencyNumber: String? = ""
+ var mergingSubtotal: Double? = 0.0
+ var feeNo: String? = ""
+ var status: String? = ""
+ var mergingName: String? = ""
}
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/dao/MedicalDtlDao.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/dao/MedicalDtlDao.kt
index 0b8081f..f535820 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/dao/MedicalDtlDao.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/dao/MedicalDtlDao.kt
@@ -1,6 +1,7 @@
package com.supwisdom.dlpay.medical.dao
import com.supwisdom.dlpay.medical.domain.TBMedicalDtl
+import org.springframework.data.domain.Pageable
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Lock
import org.springframework.data.jpa.repository.Query
@@ -14,7 +15,11 @@
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("select t from TBMedicalDtl t where t.billno=?1")
@QueryHints(QueryHint(name = "javax.persistence.lock.timeout", value = "0"))
- fun findByBillnoForUpdate(billno: String?): TBMedicalDtl
+ fun findByBillnoForUpdate(billno: String?): TBMedicalDtl?
- fun findByAdmnumberAndFeenoAndOrganizationidAndPaystatusNot(admNumber: String, organizationId: String, feeNo: String, payStatus: String): TBMedicalDtl?
+ fun findByPaystatusAndResultidIsNull(status: String, pageable: Pageable): List<TBMedicalDtl>?
+
+ fun findByUidAndEmergencyAndFeenoAndOrganizationidAndPaystatusNot(uid: String, emergency: String, feeNo: String, organizationId: String, payStatus: String): TBMedicalDtl?
+
+ fun findByUidAndOrganizationidAndPaystatus(uid: String, organizationId: String, payStatus: String, pageable: Pageable): List<TBMedicalDtl>?
}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/service/MedicineService.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/service/MedicalService.kt
similarity index 72%
rename from backend/src/main/kotlin/com/supwisdom/dlpay/medical/service/MedicineService.kt
rename to backend/src/main/kotlin/com/supwisdom/dlpay/medical/service/MedicalService.kt
index 5cd2410..1e5683c 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/service/MedicineService.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/service/MedicalService.kt
@@ -6,7 +6,7 @@
import com.supwisdom.dlpay.medical.domain.TBMedicalCard
import org.springframework.transaction.annotation.Transactional
-interface MedicineService {
+interface MedicalService {
@Transactional(readOnly = true)
fun getHospitalList(pageno: Int, pageSize: Int, name: String?): Pagination
@@ -32,20 +32,29 @@
fun deleteAppointment(appointmentId: String, uid: String)
@Transactional
- fun getUnPayedList(uid: String, organizationId: String, cardId: String): List<UnPayedDTO>
+ fun getUnPayedList(uid: String, idno: String, organizationId: String): List<UnPayedDTO>
+ /**
+ * 从HIS查询已支付列表
+ */
@Transactional
fun getPayedList(uid: String, organizationId: String, cardId: String): ArrayList<PayedDTO>
+ /**
+ * 从本地数据查询已支付列表
+ */
@Transactional
- fun medicalPayPreInit(uid: String, bean: PaymentRequestBean, cardNo: String): JsonResult?
+ fun getPayedList(uid: String, organizationId: String): ArrayList<PayedDTO>
@Transactional
- fun medicalPayInit(billNo: String): JsonResult?
+ fun medicalPayPreInit(uid: String, bean: PaymentRequestBean)
+
+ @Transactional
+ fun medicalPayInit(billNo: String)
@Transactional
fun medicalPayConfirm(billNo: String): JsonResult?
@Transactional
- fun notifyHISPayed()
+ fun queryMedicalPayResult(billNo: String, uid: String): JsonResult?
}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/service/impl/MedicalServiceImpl.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/service/impl/MedicalServiceImpl.kt
new file mode 100644
index 0000000..f2e38ec
--- /dev/null
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/service/impl/MedicalServiceImpl.kt
@@ -0,0 +1,468 @@
+package com.supwisdom.dlpay.medical.service.impl
+
+import com.supwisdom.dlpay.api.bean.CitizenCardPayfinishParam
+import com.supwisdom.dlpay.api.bean.CitizenCardPayinitParam
+import com.supwisdom.dlpay.api.bean.JsonResult
+import com.supwisdom.dlpay.api.bean.QueryDtlResultParam
+import com.supwisdom.dlpay.framework.jpa.page.Pagination
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.MoneyUtil
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.medical.bean.*
+import com.supwisdom.dlpay.medical.dao.AppointmentDtlDao
+import com.supwisdom.dlpay.medical.dao.HospitalDao
+import com.supwisdom.dlpay.medical.dao.MedicalCardDao
+import com.supwisdom.dlpay.medical.dao.MedicalDtlDao
+import com.supwisdom.dlpay.medical.domain.TBAppointmentDtl
+import com.supwisdom.dlpay.medical.domain.TBMedicalCard
+import com.supwisdom.dlpay.medical.domain.TBMedicalDtl
+import com.supwisdom.dlpay.medical.exception.MedicineException
+import com.supwisdom.dlpay.medical.service.MedicalService
+import com.supwisdom.dlpay.medical.util.MedicalClient
+import com.supwisdom.dlpay.medical.util.MedicalConstant
+import com.supwisdom.dlpay.paysdk.proxy.CitizenCardPayProxy
+import com.supwisdom.dlpay.paysdk.proxy.TransactionProxy
+import com.supwisdom.dlpay.portal.util.PortalConstant
+import mu.KotlinLogging
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.data.domain.PageRequest
+import org.springframework.stereotype.Service
+
+@Service
+class MedicalServiceImpl : MedicalService {
+ @Autowired
+ lateinit var hospitalDao: HospitalDao
+ @Autowired
+ lateinit var medicalCardDao: MedicalCardDao
+ @Autowired
+ lateinit var systemUtilService: SystemUtilService
+ @Autowired
+ lateinit var appointmentDtlDao: AppointmentDtlDao
+ @Autowired
+ lateinit var medicalClient: MedicalClient
+ @Autowired
+ lateinit var medicalDtlDao: MedicalDtlDao
+ @Autowired
+ lateinit var citizenCardPayProxy: CitizenCardPayProxy
+ @Autowired
+ lateinit var transactionProxy: TransactionProxy
+ val logger = KotlinLogging.logger { }
+
+ override fun getHospitalList(pageno: Int, pageSize: Int, name: String?): Pagination {
+ return hospitalDao.getHospitalList(pageno, pageSize, name)
+ }
+
+ override fun getMedicalCardList(uid: String, hospitalcode: String): List<TBMedicalCard>? {
+ return medicalCardDao.findByUidAndOrganizationid(uid, hospitalcode)
+ }
+
+ override fun deleteMedicalCard(uid: String, cardid: String) {
+ val medicalCard = medicalCardDao.findByCardidAndUid(cardid, uid)
+ ?: throw MedicineException("未找到该就诊卡")
+ medicalCardDao.delete(medicalCard)
+ }
+
+ override fun addPatient(bean: AddPatientBean) {
+ // 查询当前就诊人在该医院的就诊卡列表
+ val response = medicalClient.getPatientMedicalCardList(bean)
+ if (null != response && !response.listMedicalCard.isNullOrEmpty()) {
+ // 已有就诊卡:查询详情后本地保存
+ // 删除本地该患者原有就诊卡
+ val list = response.listMedicalCard
+ val localCard = medicalCardDao.findByUidAndOrganizationidAndCardnumberAndCardtype(
+ bean.uid, bean.hospitalcode, bean.cardno, MedicalConstant.CARD_TYPE_IDCAED)
+ if (!localCard.isNullOrEmpty()) {
+ medicalCardDao.deleteAll(localCard)
+ }
+ list.forEach {
+ val detailResponse = medicalClient.getMedicalCardDetail(bean.hospitalcode, it.patientId)
+ val medicalCard = TBMedicalCard().apply {
+ this.cardnumber = bean.cardno
+ this.cardtype = MedicalConstant.CARD_TYPE_IDCAED
+ this.medicalcardnumber = detailResponse.patientMedicalCardNumber
+ this.medicalcardtype = detailResponse.patientMedicalCardType
+ this.organizationid = bean.hospitalcode
+ this.patientbirthday = detailResponse.patientBirthday
+ this.patientid = detailResponse.patientId
+ this.patientname = detailResponse.patientName
+ this.patientsex = detailResponse.patientSex
+ this.uid = bean.uid
+ if (!StringUtil.isEmpty(detailResponse.patientMobile)) {
+ this.patientmobile = detailResponse.patientMobile
+ } else {
+ this.patientmobile = response.patientMobile
+ }
+ }
+ medicalCardDao.save(medicalCard)
+ }
+ } else {
+ // 无就诊卡,在HIS中新建,成功后本地保存
+ val addResponse = medicalClient.registerPatientInfo(bean)
+ if (null != addResponse && !addResponse.listMedicalCard.isNullOrEmpty()) {
+ // 删除本地该患者原有就诊卡
+ val addList = addResponse.listMedicalCard
+ val localCard = medicalCardDao.findByUidAndOrganizationidAndCardnumberAndCardtype(
+ bean.uid, bean.hospitalcode, bean.cardno, MedicalConstant.CARD_TYPE_IDCAED)
+ if (!localCard.isNullOrEmpty()) {
+ medicalCardDao.deleteAll(localCard)
+ }
+ addList.forEach {
+ val medicalCard = TBMedicalCard().apply {
+ this.cardnumber = bean.cardno
+ this.cardtype = MedicalConstant.CARD_TYPE_IDCAED
+ this.medicalcardnumber = it.patientMedicalCardNumber
+ this.medicalcardtype = it.patientMedicalCardType
+ this.organizationid = bean.hospitalcode
+ this.patientid = it.patientId
+ this.patientname = bean.name
+ this.patientsex = bean.sex
+ this.uid = bean.uid
+ this.patientmobile = addResponse.patientMobile
+ }
+ medicalCardDao.save(medicalCard)
+ }
+ } else {
+ throw MedicineException("新增就诊卡失败")
+ }
+ }
+ }
+
+ override fun getArrangeInfo(organizationid: String, date: String): List<ArrangeInfoResponse> {
+ return medicalClient.getArrangeInfo(organizationid, date)
+ }
+
+ override fun confirmAppointment(bean: ConfirmRequestBean) {
+ val medicalCard = medicalCardDao.findByCardidAndUid(bean.cardid, bean.uid)
+ ?: throw MedicineException("未找到该就诊卡")
+ bean.apply {
+ this.patientid = medicalCard.patientid
+ this.patientname = medicalCard.patientname
+ this.patientmobile = medicalCard.patientmobile
+ }
+ val appointmentResponse = medicalClient.confirmAppointment(bean)
+ val appointmentDtl = TBAppointmentDtl()
+ appointmentDtl.uid = bean.uid
+ appointmentDtl.organizationid = appointmentResponse.organizationId
+ appointmentDtl.departmentid = bean.departmentid
+ appointmentDtl.departmentname = bean.departmentname
+ appointmentDtl.ghrq = bean.ghrq
+ appointmentDtl.zblb = bean.zblb
+ appointmentDtl.patientid = bean.patientid
+ appointmentDtl.patientname = bean.patientname
+ appointmentDtl.patientmobile = bean.patientmobile
+ appointmentDtl.serialnumber = appointmentResponse.serialNumber
+ appointmentDtl.createdate = systemUtilService.sysdatetime.hostdatetime
+ appointmentDtl.delete = false
+ appointmentDtlDao.save(appointmentDtl)
+ }
+
+ override fun getAppointmentList(pageno: Int, pagesize: Int, uid: String): Pagination {
+ return appointmentDtlDao.getAppointmentList(pageno, pagesize, uid)
+ }
+
+ override fun deleteAppointment(appointmentId: String, uid: String) {
+ val appointmentDtl = appointmentDtlDao.findByIdAndUidAndDelete(appointmentId, uid, false)
+ ?: throw MedicineException("未找到该条就诊记录")
+ appointmentDtl.delete = true
+ appointmentDtlDao.save(appointmentDtl)
+ }
+
+ fun getUnPayedResponse(organizationId: String, idno: String): UnPayedResponse {
+ val unPayedIdentityCardList = ArrayList<IdentityCardBean>()
+ unPayedIdentityCardList.add(IdentityCardBean().apply {
+ this.cardType = MedicalConstant.CARD_TYPE_IDCAED
+ this.cardNumber = idno
+ })
+ val upPayedRequest = UnPayedRequest().apply {
+ this.organizationId = organizationId
+ this.queryType = MedicalConstant.ORDER_QUERYTYPE_IDENTITYCARD
+ this.patientIdentityCardList = unPayedIdentityCardList
+ }
+ //根据患者id查询未支付账单
+ return medicalClient.getUnPayedList(upPayedRequest)
+ }
+
+ override fun getUnPayedList(uid: String, idno: String, organizationId: String): List<UnPayedDTO> {
+ //根据患者id查询未支付账单
+ val unPayedResponse = getUnPayedResponse(organizationId, idno)
+ val unPayedDTOList = ArrayList<UnPayedDTO>()
+ //拆分每次就诊下的每个项目为一条展示数据
+ unPayedResponse.medicalInformation.forEach { medicalInformation ->
+ for (mergingItems in medicalInformation.mergingItems) {
+ // 因为异步通知HIS,HIS中数据延迟,所以本地扣费成功后的流水仍有可能拉到
+ val localDtl = medicalDtlDao.findByUidAndEmergencyAndFeenoAndOrganizationidAndPaystatusNot(
+ uid, medicalInformation.emergencyNumber!!, mergingItems.feeNo!!, organizationId, MedicalConstant.DTL_STATUS_FAIL)
+ var skip = false
+ if (localDtl != null) {
+ if (localDtl.paystatus == MedicalConstant.DTL_STATUS_SUCCESS) {
+ // 已扣费成功,等待通知HIS成功,此处无须额外处理
+ continue
+ } else {
+ // 当流水为init或wip时都跳过生成本地流水
+ skip = true
+ }
+ }
+ var medicalDtl: TBMedicalDtl
+ if (!skip) {
+ medicalDtl = TBMedicalDtl().apply {
+ this.billno = systemUtilService.refno
+ this.emergency = medicalInformation.emergencyNumber
+ this.feeno = mergingItems.feeNo
+ this.feetypecode = mergingItems.feeTypeCode
+ this.uid = uid
+ this.mergingname = mergingItems.mergingName
+ this.paystatus = MedicalConstant.DTL_STATUS_INIT
+ this.organizationid = organizationId
+ this.patientid = unPayedResponse.patientId
+ this.totalfee = mergingItems.mergingSubtotal
+ }
+ medicalDtlDao.save(medicalDtl)
+ } else {
+ medicalDtl = localDtl!!
+ }
+ val unPayedDTO = UnPayedDTO().apply {
+ this.billNo = medicalDtl.billno
+ this.medicalDate = medicalInformation.medicalDate
+ this.subjectName = medicalInformation.departmentName
+ this.doctorName = medicalInformation.doctorName
+ this.emergencyNumber = medicalInformation.emergencyNumber
+ this.feeNo = mergingItems.feeNo
+ this.mergingSubtotal = mergingItems.mergingSubtotal
+ this.status = medicalDtl.paystatus
+ this.mergingName = mergingItems.mergingName
+ }
+ unPayedDTOList.add(unPayedDTO)
+ }
+ }
+ return unPayedDTOList
+ }
+
+ override fun getPayedList(uid: String, organizationId: String, cardId: String): ArrayList<PayedDTO> {
+ val medicalCard = medicalCardDao.findByCardidAndUid(cardId, uid)
+ ?: throw MedicineException("未找到该就诊卡")
+ val payedPatientIdList = ArrayList<String>()
+ payedPatientIdList.add(medicalCard.patientid)
+ val payedRequest = PayedRequest()
+ payedRequest.organizationId = organizationId
+ payedRequest.queryType = MedicalConstant.ORDER_QUERYTYPE_PATIENTID
+ payedRequest.patientIdList = payedPatientIdList
+ payedRequest.executeFlag = MedicalConstant.PAYED_EXECUTEFLAG_INVALID
+ payedRequest.outpatientType = MedicalConstant.PAYED_OUTPATIENTTYPE_NORMAL
+ val payedResponse = medicalClient.getPayedList(payedRequest)
+ val payedDTOList = ArrayList<PayedDTO>()
+ //拆分每次就诊下的每个项目为一条展示数据
+ payedResponse.invoiceList.forEach { invoiceItem ->
+ invoiceItem.costList.forEach { costItem ->
+ val payedDTO = PayedDTO().apply {
+ this.totalFee = costItem.totalFee
+ this.medicalDate = invoiceItem.medicalDate
+ this.executionStatus = costItem.executionStatus
+ this.execute = costItem.execute
+ this.mergingName = costItem.mergingName
+ this.admNumber = invoiceItem.admNumber
+ }
+ payedDTOList.add(payedDTO)
+ }
+ }
+ return payedDTOList
+ }
+
+
+ override fun getPayedList(uid: String, organizationId: String): ArrayList<PayedDTO> {
+ val medicalDtlList = medicalDtlDao.findByUidAndOrganizationidAndPaystatus(uid, organizationId, MedicalConstant.DTL_STATUS_SUCCESS, PageRequest.of(0, 10))
+ val payedDTOList = ArrayList<PayedDTO>()
+ if (!medicalDtlList.isNullOrEmpty()) {
+ medicalDtlList.forEach {
+
+ }
+ }
+ return payedDTOList
+ }
+
+ override fun medicalPayPreInit(uid: String, bean: PaymentRequestBean) {
+ val medicalDtl = medicalDtlDao.findByBillnoForUpdate(bean.billno)
+ ?: throw MedicineException("未找到流水为[${bean.billno}]的流水")
+ if (medicalDtl.paystatus != null && medicalDtl.paystatus != MedicalConstant.DTL_STATUS_INIT) {
+ throw MedicineException("该流水状态异常,请查询后再试")
+ }
+ //1.从HIS中找到待支付流水
+ //1.1 根据患者id查询未支付账单
+ val unPayedResponse = getUnPayedResponse(medicalDtl.organizationid, bean.idno)
+ var mergingItems: MergingItems? = null
+ unPayedResponse.medicalInformation.forEach { medicalInformation ->
+ if (medicalInformation.emergencyNumber == medicalDtl.emergency) {
+ medicalInformation.mergingItems.forEach { queryMergingItems ->
+ if (queryMergingItems.feeNo == medicalDtl.feeno) {
+ mergingItems = queryMergingItems
+ }
+ }
+ }
+ }
+ if (mergingItems == null) {
+ throw MedicineException("未找到该条待缴费记录")
+ }
+ //2.向HIS预结算
+ val feeRecords = ArrayList<FeeRecordItem>()
+ feeRecords.add(FeeRecordItem().apply {
+ this.feeNo = mergingItems!!.feeNo
+ this.feeTypeCode = mergingItems!!.feeTypeCode
+ this.feeTypeName = mergingItems!!.feeTypeName
+ })
+
+ val preFeeRequest = PreFeeRequest().apply {
+ this.boilSign = mergingItems!!.boilSign!!
+ this.organizationId = medicalDtl.organizationid
+ this.feeRecords = feeRecords
+ this.patientId = unPayedResponse.patientId!!
+ }
+ val preFeeResponse = medicalClient.getPreCalculatedFee(preFeeRequest)
+ medicalDtl.apply {
+ this.citizencardno = bean.cardNo
+ this.extrafeedesc = preFeeResponse.extraFeeDesc
+ this.invoiceno = preFeeResponse.invoiceNumber
+ this.transdate = systemUtilService.sysdatetime.hostdate
+ this.transtime = systemUtilService.sysdatetime.hosttime
+ }
+ medicalDtlDao.save(medicalDtl)
+ }
+
+ override fun medicalPayInit(billNo: String) {
+ //4.本地向payapi扣费
+ //4.1 payapi扣费初始化
+ val medicalDtl = medicalDtlDao.findByBillnoForUpdate(billNo)
+ ?: throw MedicineException("未找到流水为[${billNo}]的流水")
+ if (medicalDtl.paystatus != null && medicalDtl.paystatus != MedicalConstant.DTL_STATUS_INIT) {
+ throw MedicineException("该流水状态异常,请查询后再试")
+ }
+ // 查询是否已初始化
+ val queryResult = transactionProxy.queryDtlResult(QueryDtlResultParam().apply {
+ this.billno = medicalDtl.billno
+ this.shopaccno = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_MEDICAL_SHOPACCNO)
+ })
+ if (MedicalConstant.PAYAPI_SUCCESS_RETCODE == queryResult.retcode) {
+ // 查询到该流水说明已初始化,可直接确认
+ medicalDtl.refno = queryResult.refno
+ } else if (MedicalConstant.PAYAPI_NOT_EXISTS == queryResult.retcode) {
+ // 未查到该流水,继续初始化步骤
+ val initParam = CitizenCardPayinitParam().apply {
+ this.billno = medicalDtl.billno
+ this.cardNo = medicalDtl.citizencardno
+ this.amount = MoneyUtil.YuanToFen(medicalDtl.totalfee)
+ this.dtltype = MedicalConstant.DTLTYPE_MEDICAL
+ this.transdate = medicalDtl.transdate
+ this.transtime = medicalDtl.transtime
+ this.shopaccno = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_MEDICAL_SHOPACCNO)
+ }
+ val payInit = citizenCardPayProxy.citizencardPayinit(initParam)
+ if (payInit.retcode != MedicalConstant.PAYAPI_SUCCESS_RETCODE) {
+ throw MedicineException(payInit.retmsg)
+ }
+ medicalDtl.refno = payInit.refno
+ }
+ medicalDtl.paystatus = MedicalConstant.DTL_STATUS_WIP
+ medicalDtlDao.save(medicalDtl)
+ }
+
+ override fun medicalPayConfirm(billNo: String): JsonResult? {
+ //4.2 paypai扣费确认
+ val medicalDtl = medicalDtlDao.findByBillnoForUpdate(billNo)
+ ?: throw MedicineException("未找到流水为[${billNo}]的流水")
+ val confirmParam = CitizenCardPayfinishParam().apply {
+ this.refno = medicalDtl.refno
+ }
+ val payConfirm = citizenCardPayProxy.citizencardPayFinish(confirmParam)
+ when (payConfirm.retcode) {
+ MedicalConstant.PAYAPI_SUCCESS_RETCODE -> {
+ medicalDtl.paystatus = MedicalConstant.DTL_STATUS_SUCCESS
+ medicalDtl.accdate = systemUtilService.sysdatetime.hostdate
+ medicalDtlDao.save(medicalDtl)
+ return JsonResult.ok(MedicalConstant.DTL_STATUS_SUCCESS)
+ }
+ // 确认返回结果为待查询
+ MedicalConstant.PAYAPI_WAIT_QUERY -> {
+ // 查询确认结果
+ val queryResult = transactionProxy.queryDtlResult(QueryDtlResultParam().apply {
+ this.refno = medicalDtl.refno
+ this.shopaccno = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_MEDICAL_SHOPACCNO)
+ })
+ if (queryResult.retcode == MedicalConstant.PAYAPI_SUCCESS_RETCODE) {
+ when (queryResult.status) {
+ MedicalConstant.DTL_STATUS_SUCCESS -> {
+ medicalDtl.paystatus = MedicalConstant.DTL_STATUS_SUCCESS
+ medicalDtl.accdate = systemUtilService.sysdatetime.hostdate
+ medicalDtlDao.save(medicalDtl)
+ return JsonResult.ok(MedicalConstant.DTL_STATUS_SUCCESS)
+ }
+ MedicalConstant.DTL_STATUS_FAIL -> {
+ medicalDtl.paystatus = MedicalConstant.DTL_STATUS_FAIL
+ medicalDtlDao.save(medicalDtl)
+ logger.error("向payapi扣费确认失败:[${queryResult.retmsg}]")
+ return JsonResult.error(queryResult.retmsg)
+ }
+ MedicalConstant.DTL_STATUS_INIT -> {
+ medicalDtl.paystatus = MedicalConstant.DTL_STATUS_WIP
+ medicalDtlDao.save(medicalDtl)
+ return JsonResult.ok(MedicalConstant.DTL_STATUS_WIP)
+ }
+ }
+ }
+ medicalDtl.paystatus = MedicalConstant.DTL_STATUS_WIP
+ medicalDtlDao.save(medicalDtl)
+ logger.error("查询确认结果失败:${queryResult.retcode},${queryResult.retmsg}")
+ return JsonResult.ok(MedicalConstant.DTL_STATUS_WIP)
+ }
+ MedicalConstant.PAYAPI_DEAL_ERROR -> {
+ medicalDtl.paystatus = MedicalConstant.DTL_STATUS_FAIL
+ medicalDtlDao.save(medicalDtl)
+ return JsonResult.error(payConfirm.retmsg)
+ }
+ else -> {
+ logger.error("未知的确认状态码:${payConfirm.retcode},${payConfirm.retmsg}")
+ medicalDtl.paystatus = MedicalConstant.DTL_STATUS_FAIL
+ medicalDtlDao.save(medicalDtl)
+ return JsonResult.error(payConfirm.retmsg)
+ }
+ }
+ }
+
+ override fun queryMedicalPayResult(billNo: String, uid: String): JsonResult? {
+ val medicalDtl = medicalDtlDao.findByBillnoForUpdate(billNo)
+ ?: throw MedicineException("未找到流水为[${billNo}]的流水")
+ if (uid != medicalDtl.uid) {
+ throw MedicineException("未在当前用户的账户下查询到该条流水")
+ }
+ if (medicalDtl.paystatus != MedicalConstant.DTL_STATUS_WIP) {
+ throw MedicineException("该流水状态异常,请查询后再试")
+ }
+ val queryResult = transactionProxy.queryDtlResult(QueryDtlResultParam().apply {
+ this.refno = medicalDtl.refno
+ this.shopaccno = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_MEDICAL_SHOPACCNO)
+ })
+ if (queryResult.retcode == MedicalConstant.PAYAPI_SUCCESS_RETCODE) {
+ when (queryResult.status) {
+ MedicalConstant.DTL_STATUS_SUCCESS -> {
+ medicalDtl.paystatus = MedicalConstant.DTL_STATUS_SUCCESS
+ medicalDtl.accdate = systemUtilService.sysdatetime.hostdate
+ medicalDtlDao.save(medicalDtl)
+ return JsonResult.ok(MedicalConstant.DTL_STATUS_SUCCESS)
+ }
+ MedicalConstant.DTL_STATUS_FAIL -> {
+ medicalDtl.paystatus = MedicalConstant.DTL_STATUS_FAIL
+ medicalDtlDao.save(medicalDtl)
+ return JsonResult.error(queryResult.retmsg)
+ }
+ MedicalConstant.DTL_STATUS_INIT -> {
+ medicalDtl.paystatus = MedicalConstant.DTL_STATUS_WIP
+ medicalDtlDao.save(medicalDtl)
+ return JsonResult.ok(MedicalConstant.DTL_STATUS_WIP)
+ }
+ }
+ logger.error("未知的查询状态码:${queryResult.status},${queryResult.retmsg}")
+ } else {
+ logger.error("查询支付结果失败:${queryResult.retcode},${queryResult.retmsg}")
+ }
+ medicalDtl.paystatus = MedicalConstant.DTL_STATUS_WIP
+ medicalDtlDao.save(medicalDtl)
+ return JsonResult.ok(MedicalConstant.DTL_STATUS_WIP)
+ }
+}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/service/impl/MedicineServiceImpl.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/service/impl/MedicineServiceImpl.kt
deleted file mode 100644
index d5cba58..0000000
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/service/impl/MedicineServiceImpl.kt
+++ /dev/null
@@ -1,367 +0,0 @@
-package com.supwisdom.dlpay.medical.service.impl
-
-import com.supwisdom.dlpay.api.bean.CitizenCardPayfinishParam
-import com.supwisdom.dlpay.api.bean.CitizenCardPayinitParam
-import com.supwisdom.dlpay.api.bean.JsonResult
-import com.supwisdom.dlpay.framework.jpa.page.Pagination
-import com.supwisdom.dlpay.framework.service.SystemUtilService
-import com.supwisdom.dlpay.framework.util.MoneyUtil
-import com.supwisdom.dlpay.framework.util.StringUtil
-import com.supwisdom.dlpay.medical.bean.*
-import com.supwisdom.dlpay.medical.dao.AppointmentDtlDao
-import com.supwisdom.dlpay.medical.dao.HospitalDao
-import com.supwisdom.dlpay.medical.dao.MedicalCardDao
-import com.supwisdom.dlpay.medical.dao.MedicalDtlDao
-import com.supwisdom.dlpay.medical.domain.TBAppointmentDtl
-import com.supwisdom.dlpay.medical.domain.TBMedicalCard
-import com.supwisdom.dlpay.medical.domain.TBMedicalDtl
-import com.supwisdom.dlpay.medical.exception.MedicineException
-import com.supwisdom.dlpay.medical.service.MedicineService
-import com.supwisdom.dlpay.medical.util.MedicalClient
-import com.supwisdom.dlpay.medical.util.MedicalConstant
-import com.supwisdom.dlpay.paysdk.proxy.CitizenCardPayProxy
-import com.supwisdom.dlpay.portal.util.PortalConstant
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.stereotype.Service
-
-@Service
-class MedicineServiceImpl : MedicineService {
- @Autowired
- lateinit var hospitalDao: HospitalDao
- @Autowired
- lateinit var medicalCardDao: MedicalCardDao
- @Autowired
- lateinit var systemUtilService: SystemUtilService
- @Autowired
- lateinit var appointmentDtlDao: AppointmentDtlDao
- @Autowired
- lateinit var medicalClient: MedicalClient
- @Autowired
- lateinit var medicalDtlDao: MedicalDtlDao
- @Autowired
- lateinit var citizenCardPayProxy: CitizenCardPayProxy
-
- override fun getHospitalList(pageno: Int, pageSize: Int, name: String?): Pagination {
- return hospitalDao.getHospitalList(pageno, pageSize, name)
- }
-
- override fun getMedicalCardList(uid: String, hospitalcode: String): List<TBMedicalCard>? {
- return medicalCardDao.findByUidAndOrganizationid(uid, hospitalcode)
- }
-
- override fun deleteMedicalCard(uid: String, cardid: String) {
- val medicalCard = medicalCardDao.findByCardidAndUid(cardid, uid)
- ?: throw MedicineException("未找到该就诊卡")
- medicalCardDao.delete(medicalCard)
- }
-
- override fun addPatient(bean: AddPatientBean) {
- // 查询当前就诊人在该医院的就诊卡列表
- val response = medicalClient.getPatientMedicalCardList(bean)
- if (null != response && !response.listMedicalCard.isNullOrEmpty()) {
- // 已有就诊卡:查询详情后本地保存
- // 删除本地该患者原有就诊卡
- val list = response.listMedicalCard
- val localCard = medicalCardDao.findByUidAndOrganizationidAndCardnumberAndCardtype(
- bean.uid, bean.hospitalcode, bean.cardno, MedicalConstant.CARD_TYPE_IDCAED)
- if (!localCard.isNullOrEmpty()) {
- medicalCardDao.deleteAll(localCard)
- }
- list.forEach {
- val detailResponse = medicalClient.getMedicalCardDetail(bean.hospitalcode, it.patientId)
- val medicalCard = TBMedicalCard().apply {
- this.cardnumber = bean.cardno
- this.cardtype = MedicalConstant.CARD_TYPE_IDCAED
- this.medicalcardnumber = detailResponse.patientMedicalCardNumber
- this.medicalcardtype = detailResponse.patientMedicalCardType
- this.organizationid = bean.hospitalcode
- this.patientbirthday = detailResponse.patientBirthday
- this.patientid = detailResponse.patientId
- this.patientname = detailResponse.patientName
- this.patientsex = detailResponse.patientSex
- this.uid = bean.uid
- if (!StringUtil.isEmpty(detailResponse.patientMobile)) {
- this.patientmobile = detailResponse.patientMobile
- } else {
- this.patientmobile = response.patientMobile
- }
- }
- medicalCardDao.save(medicalCard)
- }
- } else {
- // 无就诊卡,在HIS中新建,成功后本地保存
- val addResponse = medicalClient.registerPatientInfo(bean)
- if (null != addResponse && !addResponse.listMedicalCard.isNullOrEmpty()) {
- // 删除本地该患者原有就诊卡
- val addList = addResponse.listMedicalCard
- val localCard = medicalCardDao.findByUidAndOrganizationidAndCardnumberAndCardtype(
- bean.uid, bean.hospitalcode, bean.cardno, MedicalConstant.CARD_TYPE_IDCAED)
- if (!localCard.isNullOrEmpty()) {
- medicalCardDao.deleteAll(localCard)
- }
- addList.forEach {
- val medicalCard = TBMedicalCard().apply {
- this.cardnumber = bean.cardno
- this.cardtype = MedicalConstant.CARD_TYPE_IDCAED
- this.medicalcardnumber = it.patientMedicalCardNumber
- this.medicalcardtype = it.patientMedicalCardType
- this.organizationid = bean.hospitalcode
- this.patientid = it.patientId
- this.patientname = bean.name
- this.patientsex = bean.sex
- this.uid = bean.uid
- this.patientmobile = addResponse.patientMobile
- }
- medicalCardDao.save(medicalCard)
- }
- } else {
- throw MedicineException("新增就诊卡失败")
- }
- }
- }
-
- override fun getArrangeInfo(organizationid: String, date: String): List<ArrangeInfoResponse> {
- return medicalClient.getArrangeInfo(organizationid, date)
- }
-
- override fun confirmAppointment(bean: ConfirmRequestBean) {
- val medicalCard = medicalCardDao.findByCardidAndUid(bean.cardid, bean.uid)
- ?: throw MedicineException("未找到该就诊卡")
- bean.apply {
- this.patientid = medicalCard.patientid
- this.patientname = medicalCard.patientname
- this.patientmobile = medicalCard.patientmobile
- }
- val appointmentResponse = medicalClient.confirmAppointment(bean)
- val appointmentDtl = TBAppointmentDtl()
- appointmentDtl.uid = bean.uid
- appointmentDtl.organizationid = appointmentResponse.organizationId
- appointmentDtl.departmentid = bean.departmentid
- appointmentDtl.departmentname = bean.departmentname
- appointmentDtl.ghrq = bean.ghrq
- appointmentDtl.zblb = bean.zblb
- appointmentDtl.patientid = bean.patientid
- appointmentDtl.patientname = bean.patientname
- appointmentDtl.patientmobile = bean.patientmobile
- appointmentDtl.serialnumber = appointmentResponse.serialNumber
- appointmentDtl.createdate = systemUtilService.sysdatetime.hostdatetime
- appointmentDtl.delete = false
- appointmentDtlDao.save(appointmentDtl)
- }
-
- override fun getAppointmentList(pageno: Int, pagesize: Int, uid: String): Pagination {
- return appointmentDtlDao.getAppointmentList(pageno, pagesize, uid)
- }
-
- override fun deleteAppointment(appointmentId: String, uid: String) {
- val appointmentDtl = appointmentDtlDao.findByIdAndUidAndDelete(appointmentId, uid, false)
- ?: throw MedicineException("未找到该条就诊记录")
- appointmentDtl.delete = true
- appointmentDtlDao.save(appointmentDtl)
- }
-
- fun getUnPayedResponse(organizationId: String, petientId: String): UnPayedResponse {
- val unPayedPatientIdList = ArrayList<String>()
- unPayedPatientIdList.add(petientId)
- val upPayedRequest = UnPayedRequest()
- upPayedRequest.organizationId = organizationId
- upPayedRequest.queryType = MedicalConstant.ORDER_QUERYTYPE_PATIENTID
- upPayedRequest.patientIdList = unPayedPatientIdList
- //根据患者id查询未支付账单
- return medicalClient.getUnPayedList(upPayedRequest)
- }
-
- override fun getUnPayedList(uid: String, organizationId: String, cardId: String): List<UnPayedDTO> {
- val medicalCard = medicalCardDao.findByCardidAndUid(cardId, uid)
- ?: throw MedicineException("未找到该就诊卡")
- //根据患者id查询未支付账单
- val unPayedResponse = getUnPayedResponse(organizationId, medicalCard.patientid)
- val unPayedDTOList = ArrayList<UnPayedDTO>()
- //拆分每次就诊下的每个项目为一条展示数据
- unPayedResponse.medicalInformation.forEach { medicalInformation ->
- for (mergingItems in medicalInformation.mergingItems) {
- // 因为异步通知HIS,HIS中数据延迟,所以本地扣费成功后的流水任有可能拉到
- val localDtl = medicalDtlDao.findByAdmnumberAndFeenoAndOrganizationidAndPaystatusNot(
- medicalInformation.admNumber, organizationId, mergingItems.feeNo, MedicalConstant.DTL_STATUS_FAIL)
- if (localDtl != null) {
- //TODO:其余状态处理
- if (localDtl.paystatus == MedicalConstant.DTL_STATUS_SUCCESS) {
- continue
- }
- }
- val medicalDtl = TBMedicalDtl().apply {
- this.billno = systemUtilService.refno
- this.admnumber = medicalInformation.admNumber
- this.feeno = mergingItems.feeNo
- this.uid = uid
- this.paystatus = MedicalConstant.DTL_STATUS_INIT
- this.transdate = systemUtilService.sysdatetime.hostdate
- this.transtime = systemUtilService.sysdatetime.hosttime
- this.organizationid = organizationId
- }
- medicalDtlDao.save(medicalDtl)
-
- val unPayedDTO = UnPayedDTO().apply {
- this.billno = medicalDtl.billno
- this.medicalDate = medicalInformation.medicalDate
- this.subjectName = medicalInformation.departmentName
- this.doctorName = medicalInformation.doctorName
- this.admNumber = medicalInformation.admNumber
- this.feeNo = mergingItems.feeNo
- this.mergingSubtotal = mergingItems.mergingSubtotal
- }
- unPayedDTOList.add(unPayedDTO)
- }
- }
- return unPayedDTOList
- }
-
- override fun getPayedList(uid: String, organizationId: String, cardId: String): ArrayList<PayedDTO> {
- val medicalCard = medicalCardDao.findByCardidAndUid(cardId, uid)
- ?: throw MedicineException("未找到该就诊卡")
- val payedPatientIdList = ArrayList<String>()
- payedPatientIdList.add(medicalCard.patientid)
- val payedRequest = PayedRequest()
- payedRequest.organizationId = organizationId
- payedRequest.queryType = MedicalConstant.ORDER_QUERYTYPE_PATIENTID
- payedRequest.patientIdList = payedPatientIdList
- payedRequest.executeFlag = MedicalConstant.PAYED_EXECUTEFLAG_INVALID
- payedRequest.outpatientType = MedicalConstant.PAYED_OUTPATIENTTYPE_NORMAL
- val payedResponse = medicalClient.getPayedList(payedRequest)
- val payedDTOList = ArrayList<PayedDTO>()
- //拆分每次就诊下的每个项目为一条展示数据
- payedResponse.invoiceList.forEach { invoiceItem ->
- invoiceItem.costList.forEach { costItem ->
- val payedDTO = PayedDTO().apply {
- this.totalFee = costItem.totalFee
- this.medicalDate = invoiceItem.medicalDate
- this.executionStatus = costItem.executionStatus
- this.execute = costItem.execute
- this.mergingName = costItem.mergingName
- this.admNumber = invoiceItem.admNumber
- }
- payedDTOList.add(payedDTO)
- }
- }
- return payedDTOList
- }
-
- override fun medicalPayPreInit(uid: String, bean: PaymentRequestBean, cardNo: String): JsonResult? {
- val medicalCard = medicalCardDao.findByCardidAndUid(bean.cardid, uid)
- ?: throw MedicineException("未找到该就诊卡")
- //1.从HIS中找到待支付流水
- //1.1 根据患者id查询未支付账单
- val unPayedResponse = getUnPayedResponse(bean.hospitalcode, medicalCard.patientid)
- var mergingItems: MergingItems? = null
- unPayedResponse.medicalInformation.forEach { medicalInformation ->
- if (medicalInformation.admNumber == bean.admnumber) {
- medicalInformation.mergingItems.forEach { queryMergingItems ->
- if (queryMergingItems.feeNo == bean.feeno) {
- mergingItems = queryMergingItems
- }
- }
- }
- }
- if (mergingItems == null) {
- throw MedicineException("未找到该条待缴费记录")
- }
- //2.向HIS预结算
- val feeRecords = ArrayList<FeeRecordItem>()
- feeRecords.add(FeeRecordItem().apply {
- this.feeNo = mergingItems!!.feeNo
- this.feeTypeCode = mergingItems!!.feeTypeCode
- this.feeTypeName = mergingItems!!.mergingName
- })
-
- val preFeeRequest = PreFeeRequest().apply {
- this.boilSign = mergingItems!!.boilSign
- this.organizationId = bean.hospitalcode
- this.feeRecords = feeRecords
- }
- val preFeeResponse = medicalClient.getPreCalculatedFee(preFeeRequest)
- //查看本地是否有该条流水记录
- val localMedicalDtl = medicalDtlDao.findByAdmnumberAndFeenoAndOrganizationidAndPaystatusNot(
- bean.admnumber, bean.hospitalcode, mergingItems!!.feeNo, MedicalConstant.DTL_STATUS_FAIL)
- if (localMedicalDtl != null) {
- //锁住该条流水
- medicalDtlDao.findByBillnoForUpdate(localMedicalDtl.billno)
- when (localMedicalDtl.paystatus) {
- MedicalConstant.DTL_STATUS_SUCCESS -> {
- return JsonResult.ok("该缴费已成功支付")
- }
- MedicalConstant.DTL_STATUS_WIP -> {
- return JsonResult.ok("请求正在处理中,请稍后查询处理结果")
- }
- MedicalConstant.DTL_STATUS_INIT -> {
- //流水已生成,跳过生成本地流水步骤
- return JsonResult.ok("continue")
- }
- }
- }
- //3.本地新建一条支付流水
- val medicalDtl = TBMedicalDtl().apply {
- this.billno = systemUtilService.refno
- this.admnumber = bean.admnumber
- this.feeno = mergingItems!!.feeNo
- this.uid = uid
- this.paystatus = MedicalConstant.DTL_STATUS_INIT
- this.transdate = systemUtilService.sysdatetime.hostdate
- this.transtime = systemUtilService.sysdatetime.hosttime
- this.citizencardno = cardNo
- this.payamount = preFeeResponse.payAmount
- this.totalfee = preFeeResponse.totalFee
- this.extrafeedesc = preFeeResponse.extraFeeDesc
- this.invoiceno = preFeeResponse.invoiceNumber
- }
- medicalDtlDao.save(medicalDtl)
- return JsonResult.ok()
- }
-
- override fun medicalPayInit(billNo: String): JsonResult? {
- //4.本地向payapi扣费
- //4.1 payapi扣费初始化
- val medicalDtl = medicalDtlDao.findByBillnoForUpdate(billNo)
- val initParam = CitizenCardPayinitParam().apply {
- this.billno = medicalDtl.billno
- this.cardNo = medicalDtl.citizencardno
- this.amount = MoneyUtil.YuanToFen(medicalDtl.payamount)
- this.dtltype = MedicalConstant.DTLTYPE_MEDICAL
- this.transdate = medicalDtl.transdate
- this.transtime = medicalDtl.transtime
- this.shopaccno = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_MEDICAL_SHOPACCNO)
- }
- val payInit = citizenCardPayProxy.citizencardPayinit(initParam)
- if (payInit.retcode == 0) {
- throw MedicineException("向payapi请求异常:${payInit.retcode}-${payInit.retmsg}")
- }
- medicalDtl.refno = payInit.refno
- medicalDtl.paystatus = MedicalConstant.DTL_STATUS_WIP
- medicalDtlDao.save(medicalDtl)
- return JsonResult.ok()
- }
-
- override fun medicalPayConfirm(billNo: String): JsonResult? {
- //4.2 paypai扣费确认
- val medicalDtl = medicalDtlDao.findByBillnoForUpdate(billNo)
- val confirmParam = CitizenCardPayfinishParam().apply {
- this.refno = medicalDtl.refno
- }
- val payConfirm = citizenCardPayProxy.citizencardPayFinish(confirmParam)
- if (payConfirm.retcode != MedicalConstant.PAYAPI_SUCCESS_RETCODE) {
- throw MedicineException("向payapi请求异常:${payConfirm.retcode}-${payConfirm.retmsg}")
- }
-
- //6.修改本地流水状态
- medicalDtl.paystatus = MedicalConstant.DTL_STATUS_SUCCESS
- medicalDtlDao.save(medicalDtl)
- return JsonResult.ok()
-}
-
- override fun notifyHISPayed() {
- //5.向HIS支付确认
- val notifyPayedRequest = NotifyPayedRequest().apply {
-
- }
- val notifyPayedResponse = medicalClient.notifyPayed(notifyPayedRequest)
- }
-}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/medical/task/NotifyHISAsyncTask.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/task/NotifyHISAsyncTask.kt
new file mode 100644
index 0000000..abfafa2
--- /dev/null
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/medical/task/NotifyHISAsyncTask.kt
@@ -0,0 +1,80 @@
+package com.supwisdom.dlpay.medical.task
+
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.medical.bean.FeeRecordItem
+import com.supwisdom.dlpay.medical.bean.NotifyPayedRequest
+import com.supwisdom.dlpay.medical.dao.MedicalDtlDao
+import com.supwisdom.dlpay.medical.exception.MedicineException
+import com.supwisdom.dlpay.medical.util.MedicalClient
+import com.supwisdom.dlpay.medical.util.MedicalConstant
+import com.supwisdom.dlpay.mobile.service.MobileApiService
+import com.supwisdom.dlpay.paysdk.proxy.UserProxy
+import mu.KotlinLogging
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.scheduling.annotation.Async
+import org.springframework.stereotype.Component
+import org.springframework.transaction.annotation.Transactional
+
+@Component
+class NotifyHISAsyncTask {
+ @Autowired
+ private lateinit var medicalDtlDao: MedicalDtlDao
+ @Autowired
+ private lateinit var mobileApiService: MobileApiService
+ @Autowired
+ private lateinit var userProxy: UserProxy
+ @Autowired
+ private lateinit var medicalClient: MedicalClient
+ @Autowired
+ private lateinit var systemUtilService: SystemUtilService
+
+ private val logger = KotlinLogging.logger { }
+
+ @Async("notifyHIS")
+ @Transactional
+ fun notifyHIS(billNo: String) {
+ val medicalDtl = medicalDtlDao.findByBillnoForUpdate(billNo)
+ ?: throw MedicineException("未找到流水为[${billNo}]的流水")
+ if (medicalDtl.resultid != null || medicalDtl.paystatus != MedicalConstant.DTL_STATUS_SUCCESS) {
+ logger.error("待通知HIS流水billno[${billNo}]状态异常")
+ return
+ }
+ val mobileUser = mobileApiService.findUserById(medicalDtl.uid)
+ if (mobileUser == null) {
+ logger.error("未找到该uid为[${medicalDtl.uid}]的用户")
+ return
+ }
+ val personResponse = userProxy.queryPerson(mobileUser.userid)
+ if (personResponse.retcode != 0) {
+ logger.error { "查询用户[${mobileUser.userid}]信息失败:${personResponse.retmsg}" }
+ return
+ }
+ val notifyPayedRequest = NotifyPayedRequest().apply {
+ this.organizationId = medicalDtl.organizationid
+ this.patientId = medicalDtl.patientid
+ this.invoiceNumber = medicalDtl.invoiceno
+ this.payMode = MedicalConstant.PAY_MODE_DLSMK
+ this.payState = MedicalConstant.PAY_STATE_PAYED
+ this.agtOrderNumber = medicalDtl.refno
+ this.payAmount = medicalDtl.totalfee
+ this.outOrderNumber = medicalDtl.billno
+ this.payer = personResponse.person.name
+ this.totalFee = medicalDtl.totalfee
+ this.brid = medicalDtl.patientid
+ val feeRecords = ArrayList<FeeRecordItem>()
+ feeRecords.add(FeeRecordItem().apply {
+ this.feeNo = medicalDtl.feeno
+ this.feeTypeCode = medicalDtl.feetypecode
+ })
+ this.feeRecords = feeRecords
+ }
+ val notifyPayedResponse = medicalClient.notifyPayed(notifyPayedRequest)
+ if (notifyPayedResponse != null && !notifyPayedResponse.feeRecords.isNullOrEmpty()) {
+ medicalDtl.resultid = notifyPayedResponse.resultId
+ medicalDtl.resultdate = systemUtilService.sysdatetime.hostdate
+ medicalDtlDao.save(medicalDtl)
+ } else {
+ logger.error("向HIS结算确认失败")
+ }
+ }
+}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
index cb6a4fe..e13bbc9 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
@@ -557,6 +557,10 @@
this.idtype = idtype
this.idno = idno
this.phone = user.phone
+ this.uid = user.uid
+ this.rsaprivate = user.rsaprivate
+ this.rsapublic = user.rsapublic
+ this.secertkey = user.secertkey
})
if (bindCardResult["retcode"] != 0) {
logger.error { "绑卡失败,${bindCardResult["retmsg"]}" }
@@ -722,7 +726,15 @@
return JsonResult.error("用户不存在,请注册")
}
if (!user.userid.isNullOrEmpty()) {
- val response = userProxy.signbxy(user.userid, agree, user.phone)
+ val response = userProxy.signbxy(SignBxyParam().apply {
+ this.userid = user.userid
+ this.code = agree
+ this.phone = user.phone
+ this.uid = user.uid
+ this.rsaprivate = user.rsaprivate
+ this.rsapublic = user.rsapublic
+ this.secertkey = user.secertkey
+ })
if (response.retcode != 0) {
logger.error { "用户签约失败:${response.retmsg}" }
return JsonResult.error("签约失败,${response.retmsg}")
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
index 7ec41ec..31d16e6 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
@@ -9,7 +9,9 @@
import javax.validation.constraints.NotNull
@Entity
-@Table(name = "TB_MOBILE_USER", indexes = [Index(name = "mobile_user_loginid_idx", columnList = "loginid", unique = true)])
+@Table(name = "TB_MOBILE_USER", indexes = [
+ Index(name = "mobile_user_loginid_idx", columnList = "loginid", unique = true),
+ Index(name = "mobile_user_phone_idx", columnList = "phone")])
class TBMobileUser : UserDetails {
override fun getAuthorities(): Collection<GrantedAuthority>? {
return this.auths
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/security.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/security.kt
index cc591c3..f5c7c4b 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/security.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/security.kt
@@ -159,7 +159,7 @@
}
logger.info(url)
val authHeader:String? = request.getHeader(jwtConfig.header)
- if (url.startsWith("/mobileapi/v1")||url.startsWith("/mobileapi/medicineapi")) {
+ if (url.startsWith("/mobileapi/v1")||url.startsWith("/mobileapi/medicalapi")) {
if (!authHeader.isNullOrEmpty()) {
try {
val jwt = if (authHeader.startsWith(jwtConfig.tokenHeader)) {
diff --git a/backend/src/test/java/test.java b/backend/src/test/java/test.java
deleted file mode 100644
index e7b34d4..0000000
--- a/backend/src/test/java/test.java
+++ /dev/null
@@ -1,39 +0,0 @@
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class test {
- public static void main(String[] args) {
- String sqlFragment = "您的验证码为:${code},订单号:${billno},本次消费:${money}元,请勿泄漏于他人。";
- Map<String, String> map = new HashMap<>();
- map.put("code", "23423");
- map.put("billno", "6116c8e6e0c0464995f4e480473b6a1e");
- map.put("money", "12.34");
- Pattern pattern = Pattern.compile("\\$\\{[\\w]*}");
- Matcher matcher = pattern.matcher(sqlFragment);
- //循环,字符串中有多少个符合的,就循环多少次
- while(matcher.find()){
- //每一个符合正则的字符串
- String e = matcher.group();
- //截取出括号中的内容
- String substring = e.substring(2, e.length()-1);
- //字符串截取
- //进行替换
- String value = "init";
- if (map.containsKey(substring)) {
- value = map.get(substring);
- }
- sqlFragment = sqlFragment.replace(e, value);
-
- }
- System.out.println(sqlFragment);
- }
-
- @Test
- public void test() {
- System.out.println(String.format("%08d",2));
- }
-}
diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 67f03e9..2237bf3 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -5,8 +5,8 @@
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
# Postgresql settings
spring.datasource.platform=postgresql
-#spring.datasource.url=jdbc:postgresql://172.28.201.70:15432/portal
-spring.datasource.url=jdbc:postgresql://localhost:5432/portal
+spring.datasource.url=jdbc:postgresql://172.28.201.70:15432/portal
+#spring.datasource.url=jdbc:postgresql://localhost:5432/portal
spring.datasource.username=payapi
spring.datasource.password=123456
spring.datasource.continue-on-error=true