/// <summary> /// 下发有免费券 /// </summary> /// <param name="carDerateIds"></param> /// <param name="qrCodeZipFilePath">压缩二维码的文件路径</param> /// <param name="qrCodeId"></param> /// <returns></returns> public static bool GrantCarDerate(List <string> carDerateIds, string qrCodeZipFilePath, string qrCodeId) { if (carDerateIds == null || carDerateIds.Count == 0) { throw new ArgumentNullException("carDerateIds"); } if (string.IsNullOrWhiteSpace(qrCodeZipFilePath)) { throw new ArgumentNullException("qrCodeFilePath"); } string absolutePath = System.Web.HttpContext.Current.Server.MapPath("~/"); string s = string.Format("{0}{1}", absolutePath, qrCodeZipFilePath); if (!File.Exists(s)) { throw new MyException("压缩二维码的文件不存在"); } IParkDerateQRcode factory = ParkDerateQRcodeFactory.GetFactory(); ParkDerateQRcode qrCode = factory.QueryByRecordId(qrCodeId); if (qrCode == null) { throw new MyException("优免券规则不存在"); } if (qrCode.EndTime < DateTime.Now) { throw new MyException("该优免券规则已过期"); } ParkDerate derate = ParkDerateServices.Query(qrCode.DerateID); if (derate == null) { throw new MyException("获取优免规则失败"); } decimal totalAmount = 0; if (derate.DerateType == DerateType.SpecialTimePeriodPayment) { string errorMsg = string.Empty; ParkSeller seller = ParkSellerServices.GetSeller(derate.SellerID, out errorMsg); if (derate == null) { throw new MyException("获取优免规则失败"); } totalAmount = qrCode.DerateValue * carDerateIds.Count; if ((seller.Creditline + seller.Balance) < totalAmount) { throw new MyException("商家余额不足"); } } List <ParkCarDerate> carDerates = new List <ParkCarDerate>(); foreach (var item in carDerateIds) { ParkCarDerate model = new ParkCarDerate(); model.CarDerateID = item; model.CarDerateNo = IdGenerator.Instance.GetId().ToString(); model.DerateID = qrCode.DerateID; model.PlateNumber = ""; model.AreaID = ""; model.PKID = qrCode.PKID; if (derate.DerateType != DerateType.ReliefTime && derate.DerateType != DerateType.VotePayment && derate.DerateType != DerateType.DayFree) { model.FreeMoney = qrCode.DerateValue; } else if (derate.DerateType == DerateType.DayFree) { model.FreeMoney = qrCode.DerateValue * derate.DerateMoney; } else { model.FreeTime = (int)qrCode.DerateValue; } model.Status = CarDerateStatus.Used; model.CreateTime = DateTime.Now; model.ExpiryTime = qrCode.EndTime; model.DerateQRCodeID = qrCode.RecordID; carDerates.Add(model); } IParkCarDerate factoryCarDerate = ParkCarDerateFactory.GetFactory(); using (DbOperator dbOperator = ConnectionManager.CreateConnection()) { try { dbOperator.BeginTransaction(); //添加券 foreach (var item in carDerates) { bool result = factoryCarDerate.Add(item, dbOperator); if (!result) { throw new MyException("发券失败"); } } //修改发放总张数据,修改最后压缩包路径 int totalNumbers = qrCode.CanUseTimes + carDerateIds.Count; bool updateResult = factory.Update(qrCodeId, qrCodeZipFilePath, totalNumbers, dbOperator); if (!updateResult) { throw new MyException("修改券总数失败"); } //商家扣款 if (totalAmount > 0) { IParkSeller factorySeller = ParkSellerFactory.GetFactory(); updateResult = factorySeller.SellerDebit(derate.SellerID, totalAmount, dbOperator); if (!updateResult) { throw new MyException("商家扣款失败"); } } dbOperator.CommitTransaction(); return(true); } catch { dbOperator.RollbackTransaction(); throw; } } }
public static bool Payment(string ioRecordId, string parkingId, ResultAgs billResult, string operatorId) { if (billResult == null) { throw new MyException("获取缴费信息失败"); } if (billResult.FeeRule == null) { throw new MyException("获取收费规则失败"); } if (billResult.Rate == null) { throw new MyException("获取缴费金额失败"); } using (DbOperator dbOperator = ConnectionManager.CreateConnection()) { try { dbOperator.BeginTransaction(); List <string> carderateIds = new List <string>(); Dictionary <string, decimal> sellers = new Dictionary <string, decimal>(); if (billResult.Carderates != null && billResult.Carderates.Count > 0) { carderateIds = billResult.Carderates.Select(p => p.CarDerateID).ToList(); foreach (var item in billResult.Carderates) { if (sellers.ContainsKey(item.Derate.SellerID)) { sellers[item.Derate.SellerID] = sellers[item.Derate.SellerID] + item.FreeMoney; continue; } sellers.Add(item.Derate.SellerID, item.FreeMoney); } } RateInfo rate = billResult.Rate; ParkOrder order = ParkOrderServices.AddCentralFeeOrder(parkingId, ioRecordId, rate.Amount, rate.UnPayAmount, rate.DiscountAmount, carderateIds, billResult.FeeRule.FeeRuleID, rate.CashTime, rate.CashMoney, operatorId, dbOperator); if (order == null) { throw new MyException("创建缴费订单失败"); } if (carderateIds.Count > 0) { IParkSeller factory = ParkSellerFactory.GetFactory(); factory.UpdateParkCarDerateStatus(carderateIds, 2, dbOperator); foreach (var item in sellers) { bool result = factory.SellerDebit(item.Key, item.Value, dbOperator); if (!result) { throw new MyException("商家扣款失败"); } } } dbOperator.CommitTransaction(); OperateLogServices.AddOperateLog(OperateType.Other, string.Format("中央收费,ioRecordId:{0},parkingId:{1},operatorId:{2},收费金额:{3},优惠金额:{4}", ioRecordId, parkingId, operatorId, rate.UnPayAmount, rate.DiscountAmount)); } catch { dbOperator.RollbackTransaction(); throw; } } return(true); }