Beispiel #1
0
        /// <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 });
            }
        }
Beispiel #2
0
        /// <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
            });
        }
Beispiel #3
0
        //更新到收款表
        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);
        }
Beispiel #4
0
        /// <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);
        }