/// <summary> /// 创建微信收单 /// </summary> public async Task <dynamic> CreateWX2DCode(long treatId, string payRemark, CHIS_Charge_PayPre prepay = null, int opId = 0, string opMan = "") { bool hasPrepay = prepay != null; try { #if DEBUG payRemark += "[测试]"; #endif var cus = _db.vwCHIS_DoctorTreat.FirstOrDefault(m => m.TreatId == treatId); if (!hasPrepay) { prepay = await CreatePayPreAsync(treatId, payRemark, opId, opMan); } if (prepay.PayStatus == 1) { throw new Exception("该笔支付已经支付成功了。"); } //根据微信操作类获取微信的二维码 此处会抛错出来 var rlt = await new Codes.Utility.XPay.WXPay().Get2DCodeAsync( Guid.NewGuid().ToString("N"), $"微信支付-会员[{cus.CustomerId}]{cus.CustomerName}", prepay.PayOrderId, (int)(prepay.TotalAmount * 100), UrlRoot + "/Charge/WXQRPaySuccessCallBack"); if (rlt.rlt == true) { prepay.wx2DCodeUrl = rlt.code_url;//设置微信的二维码 if (!hasPrepay) { _db.CHIS_Charge_PayPre.Update(prepay); await _db.SaveChangesAsync(); } } _logger.WriteInfo($"发起微信二维码支付{prepay.PayOrderId}【¥{prepay.TotalAmount}】"); return(rlt); } catch (Exception ex) { if (ex is SuccessedException) { await UpdatePayedAsync(prepay.PayOrderId, FeeTypes.Cash, "追加成功", false, opId, opMan); throw ex;//如果是成功则传出 } if (ex is PayOrderSameException) { _db.CHIS_Charge_PayPre.Remove(prepay); await _db.SaveChangesAsync(); return(await CreateWX2DCode(treatId, payRemark));//继续创建 } return(new { rlt = false, msg = ex.Message }); } }
/// <summary> /// 创建现金收单 /// </summary> /// <param name="treatId"></param> /// <param name="payRemark"></param> /// <param name="isReorder"></param> /// <param name="opId"></param> /// <param name="opMan"></param> /// <returns></returns> public async Task <dynamic> CreateCashOrder(long treatId, string payRemark, bool isReorder, int opId, string opMan) { CHIS_Charge_PayPre prepay = null; var cus = _db.vwCHIS_DoctorTreat.FirstOrDefault(m => m.TreatId == treatId); #if DEBUG payRemark += "[测试]"; #endif prepay = await CreatePayPreAsync(treatId, payRemark, opId, opMan, isReorder); _logger.WriteInfo($"生成现金支付{prepay.PayOrderId}【¥{prepay.TotalAmount}】"); return(new { rlt = true, msg = "", payOrderId = prepay.PayOrderId, total_fee = prepay.TotalAmount * 100, isAllowedCashPay = prepay.IsAllowedCashPay, treatId = prepay.treatId, payPreId = prepay.Id, prepay = prepay }); }
//更新到收款表 private async Task <bool> UpdatePayAsync(CHIS_Charge_PayPre payPre, int opId, string opMan) { if (payPre.PayStatus == 0) { throw new Exception("该笔支付订单没有支付成功,请确认。"); } var db = _db; db.BeginTransaction(); try { var formed = db.CHIS_Charge_PayPre_Detail_Formed.AsNoTracking().Where(m => m.PayPreID == payPre.Id).ToList(); //成药 var herb = db.CHIS_Charge_PayPre_Detail_Herb.AsNoTracking().Where(m => m.PayPreID == payPre.Id).ToList(); //中药 var extras = db.CHIS_Charge_PayPre_Detail_ExtraFee.AsNoTracking().Where(m => m.PayPreId == payPre.Id).ToList(); //附加费 var find = db.CHIS_Charge_Pay.AsNoTracking().Where(m => m.PayOrderId == payPre.PayOrderId); if (find.Count() > 0) { throw new PayException(PayExceptionType.PayedFinishAndSuccess, "该支付订单已经存在,已经支付,无需重复。"); } //添加主表 #region 添加主表 var debuglog = _env.IsDevelopment() ? "[测试]" : ""; var pay = (await db.CHIS_Charge_Pay.AddAsync(new CHIS_Charge_Pay { TotalAmount = payPre.TotalAmount, TreatId = payPre.treatId, FeeTypeCode = payPre.FeeTypeCode, PayedTime = payPre.PayedSuccessTime ?? DateTime.Now, PayOrderId = payPre.PayOrderId, StationId = payPre.StationId, PayRemark = payPre.PayRemark + debuglog, sysOpId = opId, sysOpMan = opMan, sysOpTime = DateTime.Now })).Entity; await db.SaveChangesAsync(); #endregion //添加从表 #region 添加一般从表 //------------- 成药 ------------------------------ foreach (var mm in formed) { await db.CHIS_Charge_Pay_Detail_Formed.AddAsync(new CHIS_Charge_Pay_Detail_Formed { Amount = mm.Amount, PrescriptionNo = mm.PrescriptionNo, TreatId = mm.TreatId, UnitId = mm.UnitID, Quantity = mm.Quantity, Price = mm.Price, PayId = pay.PayId, DoctorAdviceId = mm.DoctorAdviceId }); //更新医嘱缴费状态 var ma = db.CHIS_DoctorAdvice_Formed.FirstOrDefault(m => m.PrescriptionNo == mm.PrescriptionNo); if (ma == null) { throw new Exception("没有发现医嘱信息"); } ma.ChargeStatus = (short)ChargeStatus.Payed;//设置为已经缴费 } // ------------ 中药 ------------------------------- foreach (var mm in herb) { await db.CHIS_Charge_Pay_Detail_Herb.AddAsync(new CHIS_Charge_Pay_Detail_Herb { Amount = mm.Amount, PrescriptionNo = mm.PrescriptionNo, TreatId = mm.TreatId, UnitID = mm.UnitID, Quantity = mm.Quantity, Price = mm.Price, PayId = pay.PayId, PayOrderId = pay.PayOrderId, DoctorAdviceId = mm.DoctorAdviceId }); //更新医嘱缴费状态 var ma = db.CHIS_DoctorAdvice_Herbs.FirstOrDefault(m => m.PrescriptionNo == mm.PrescriptionNo); if (ma == null) { throw new Exception("没有发现医嘱信息"); } ma.ChargeStatus = (short)ChargeStatus.Payed;//设置为已经缴费 } #endregion #region 添加附加费从表 foreach (var mm in extras) { await db.CHIS_Charge_Pay_Detail_ExtraFee.AddAsync(new CHIS_Charge_Pay_Detail_ExtraFee { DoctorExtraFeeId = mm.DoctorExtraFeeId, ExtraFeeAmount = mm.ExtraFeeAmount, ExtraFeeTypeId = mm.ExtraFeeTypeId, PayId = pay.PayId }); } await db.SaveChangesAsync(); #endregion var treat = _treatSvr.FindTreat(pay.TreatId); treat.NeedPayAmount = 0; await db.SaveChangesAsync(); db.CommitTran(); //操作成功则赠送积分信息 if (payPre.FeeTypeCode == FeeTypes.AliPay_QR || payPre.FeeTypeCode == FeeTypes.WeChat_H5 || payPre.FeeTypeCode == FeeTypes.WeChat_Pub || payPre.FeeTypeCode == FeeTypes.WeChat_QR) { _pointsService.ChangePoints(new Models.InputModel.PointsDetailInputModel { CustomerId = treat.CustomerId, Description = FeeTypes.ToName(payPre.FeeTypeCode) + $"支付赠送(消费{pay.TotalAmount})", Points = (int)(payPre.TotalAmount * 100) }); } _logger.WriteSUCCESS($"订单支付更新数据成功:{payPre.PayOrderId}", opId, opMan); } catch (Exception ex) { db.RollbackTran(); _logger.WriteError(ex, opId, opMan); throw ex; } return(true); }
/// <summary> /// 发起并生成一个预支付的清表 /// </summary> /// <param name="feeTypeCode">支付类型,请使用FeeTypes选择 </param> /// <returns>返回预支付的总情况</returns> public async Task <CHIS_Charge_PayPre> CreatePayPreAsync(long treatId, string payRemark, int opId, string opMan, bool bForceNew = false) { var payOrderId = ""; var db = _db; if (treatId == 0) { throw new Exception("没有接诊号"); } bool bNeedNew = false; //根据TreatID,StationID等条件,生成一个加密Code var treat = db.CHIS_DoctorTreat.AsNoTracking().FirstOrDefault(m => m.TreatId == treatId); var formed = db.CHIS_DoctorAdvice_Formed.AsNoTracking().Where(m => m.TreatId == treatId && m.ChargeStatus == 0).ToList(); //成药 var herb = db.CHIS_DoctorAdvice_Herbs.AsNoTracking().Where(m => m.TreatId == treatId && m.ChargeStatus == 0).ToList(); //中药 var extra = db.CHIS_Doctor_ExtraFee.AsNoTracking().Where(m => m.TreatId == treatId && m.ChargeStatus == 0).ToList(); //附加费 decimal totalAmount = formed.Sum(m => m.Amount) + herb.Sum(m => m.Amount) + extra.Sum(m => m.Amount); //总金额 if (totalAmount != treat.NeedPayAmount) { throw new Exception("总金额与需要支付金额核对不一致"); } var formedIds = formed.Select(m => m.PrescriptionNo).ToList(); var herbIds = herb.Select(m => m.PrescriptionNo).ToList(); var extraIds = extra.Select(m => m.ExtraFeeId).ToList(); string encodestring = _MD5Encode(treatId, treat.StationId, formedIds, herbIds, extraIds, Ass.P.PInt(totalAmount * 100)); int stationId = treat.StationId; //查找是否已经记录了该部分的数据,如果找到,则返回 CHIS_Charge_PayPre rtn = null; var find = await db.CHIS_Charge_PayPre.AsNoTracking().Where(m => m.treatId == treatId && m.StationId == treat.StationId && m.CheckMD5Code == encodestring && m.TotalAmount > 0).FirstOrDefaultAsync(); if (find != null && bForceNew) { db.Remove(find); await db.SaveChangesAsync(); find = null; } System.Threading.Thread.Sleep(10); if (find == null) { bNeedNew = true; } else if (find.PayStatus == 1) { throw new SuccessedException(); } else if (find.PayStatus > 1) { if (bForceNew) //强制删除必须是有错误的时候 { db.CHIS_Charge_PayPre.Remove(find); await db.SaveChangesAsync(); } throw new Exception("该订单支付错误!" + find.PayErrorMsg); } else { var payed = db.CHIS_Charge_Pay.AsNoTracking().FirstOrDefault(m => m.TreatId == treatId && m.StationId == treat.StationId && m.PayOrderId == find.PayOrderId); if (payed != null) { find.PayStatus = 1; find.PayRemark += "[追加付款成功]"; find.PayedSuccessTime = payed.PayedTime; db.Update(find); await db.SaveChangesAsync(); throw new SuccessedException(); } if (find.PayRemark == payRemark) { return(find); } else { find.PayRemark = payRemark; db.Update(find); await db.SaveChangesAsync(); return(find); } } bool isNotAllowedCashPay = false; if (bNeedNew) { db.BeginTransaction(); try { //生成一个临时付款单号 DateTime now = DateTime.Now; rtn = (await db.CHIS_Charge_PayPre.AddAsync(new CHIS_Charge_PayPre { CreateTime = now, StationId = treat.StationId, treatId = treatId, PayRemark = payRemark, PayStatus = 0, PayOrderId = string.Format("{0:yyyyMMddHHmm}-{1}-{2}-{3:000}", now, stationId, treat.DoctorId, Rand.Next(1, 999)) })).Entity; await db.SaveChangesAsync(); payOrderId = rtn.PayOrderId; //查找具体项目,并写入到预支付表 decimal checkTotalAmount = 0m; //-------------- 成药 ------------------------ } var formedItems = db.CHIS_DoctorAdvice_Formed_Detail.AsNoTracking().Where(m => formedIds.Contains(m.PrescriptionNo.Value)); foreach (var m in formedItems) { checkTotalAmount += m.Amount; await db.CHIS_Charge_PayPre_Detail_Formed.AddAsync(new CHIS_Charge_PayPre_Detail_Formed { TreatId = m.TreatId, PayPreID = rtn.Id, Amount = m.Amount, PrescriptionNo = m.PrescriptionNo.Value, Price = m.Price, Quantity = m.Qty, UnitID = m.UnitId, DoctorAdviceId = m.AdviceFormedId }); } //---------------- 中药 ------------------------------ var herbItems = db.vwCHIS_DoctorAdvice_Herbs_Detail.AsNoTracking().Where(m => herbIds.Contains(m.PrescriptionNo)).ToList(); foreach (var item in herb) { var num = item.Qty; foreach (var m in herbItems.Where(m => m.PrescriptionNo == item.PrescriptionNo)) { checkTotalAmount += (m.Amount) * num; //包含付数 await db.CHIS_Charge_PayPre_Detail_Herb.AddAsync(new CHIS_Charge_PayPre_Detail_Herb { TreatId = m.TreatId, PayPreID = rtn.Id, Amount = m.Amount *num,//包含付数 PrescriptionNo = m.PrescriptionNo, Price = m.Price, Quantity = (int)m.Qty *num,//包含付数 UnitID = m.UnitId, DoctorAdviceId = m.Id }); } } var herbdrugids = herbItems.Select(m => m.CnHerbId).ToList(); var formeddrugids = formedItems.Select(m => m.DrugId).ToList(); formeddrugids.AddRange(herbdrugids); var formeddrugs = db.CHIS_Code_Drug_Main.AsNoTracking().Where(m => formeddrugids.Contains(m.DrugId)); isNotAllowedCashPay = isNotAllowedCashPay || formeddrugs.Any(m => m.SourceFrom != (int)DrugSourceFrom.Local); // ----------------- 附加费 -------------------------------- var items = db.CHIS_Doctor_ExtraFee.AsNoTracking().Where(m => extraIds.Contains(m.ExtraFeeId)); foreach (var m in items) { checkTotalAmount += m.Amount; await db.CHIS_Charge_PayPre_Detail_ExtraFee.AddAsync(new CHIS_Charge_PayPre_Detail_ExtraFee { PayPreId = rtn.Id, ExtraFeeAmount = m.Amount, ExtraFeeTypeId = m.TreatFeeTypeId, DoctorExtraFeeId = m.ExtraFeeId }); } await db.SaveChangesAsync(); //重新设置总信息 rtn.PayOrderId = payOrderId; //订单号 rtn.TotalAmount = totalAmount; //总金额 rtn.CheckMD5Code = encodestring; //编码 rtn.IsAllowedCashPay = !isNotAllowedCashPay; //是否允许现金支付 await db.SaveChangesAsync(); //采用舍值法,舍去最后金额 var checkTotalVal = (int)(checkTotalAmount * 100); var totalAmountVal = (int)(totalAmount * 100); if (checkTotalVal != totalAmountVal) { throw new Exception($"总金额核对错误![核对值{checkTotalVal}]"); } db.CommitTran(); } catch (Exception ex) { db.RollbackTran(); if (ex is SuccessedException) { await this.UpdatePayedAsync(rtn.PayOrderId, FeeTypes.Cash, "追加成功", true, opId, opMan); } rtn = null; throw ex; } } return(rtn); }