/// <summary> /// 作废定金 /// <para>作 者::Huang GaoLiang </para> /// <para>创建时间:2018-10-30 </para> /// </summary> /// <param name="orderId">订金编号</param> /// <param name="cancelUserId">作废人操作编号</param> /// <param name="cancelUserName">作废人名称</param> /// <param name="cancelRemark">作废原因</param> /// <exception cref="BussinessException"> /// 异常ID:5,数据异常 /// 异常ID:8,余额不足,不能作废 /// </exception> public override Task Cancel(long orderId, string cancelUserId, string cancelUserName, string cancelRemark) { lock (LocalThreadLock.GetLockKeyName(LockKeyNames.LOCK_DEPOSITORDERCANCEL, this._schoolId, orderId.ToString())) { // 根据订金编号查询订金信息 TblOdrDepositOrder odrDepositOrder = _odrDepositOrderRepository.Value.GetOdrDepositOrder(orderId); if (odrDepositOrder == null) { throw new BussinessException((byte)ModelType.Cash, 5); } // 1、数据校验 OdrDepositOrderCancelVerification(odrDepositOrder); // 2、准备数据 odrDepositOrder.OrderStatus = (int)OrderStatus.Cancel; odrDepositOrder.CancelDate = DateTime.Now; odrDepositOrder.CancelUserId = cancelUserId; odrDepositOrder.CancelUserName = cancelUserName; odrDepositOrder.CancelRemark = cancelRemark; // 3、作废之后,余额扣除掉相应的金额 bool isWalletSufficient = WalletService.IsWalletSufficient(_schoolId, odrDepositOrder.StudentId, odrDepositOrder.Amount); if (!isWalletSufficient) { throw new BussinessException((byte)ModelType.Cash, 8); } DepositOrderTrade orderTrade = new DepositOrderTrade(odrDepositOrder); using (UnitOfWork unitOfWork = new UnitOfWork()) { try { unitOfWork.BeginTransaction(); // 1、资金交易 TradeService tradeService = new TradeService(orderTrade, unitOfWork); tradeService.Invalid(); // 2、订金 unitOfWork.GetCustomRepository <TblOdrDepositOrderRepository, TblOdrDepositOrder>().UpdateTask(odrDepositOrder).Wait(); // 3、收款交接 new OrderHandoverService(_schoolId).DeleteHandleOver(orderId, OrderTradeType.DepositOrder, unitOfWork); unitOfWork.CommitTransaction(); } catch (Exception ex) { unitOfWork.RollbackTransaction(); throw ex; } } } return(Task.CompletedTask); }
/// <summary> /// 检查学生余额是否足够 /// </summary> /// <param name="schoolId">校区ID</param> /// <param name="studentId">学生ID</param> /// <param name="useBalanceAmount">将要使用的余额金额</param> /// <returns>true 足够 false 不足</returns> internal static bool IsWalletSufficient(string schoolId, long studentId, decimal useBalanceAmount) { if (useBalanceAmount <= 0) { return(true); } WalletService service = new WalletService(schoolId, studentId); return(service.IsWalletSufficient(useBalanceAmount)); }
/// <summary> /// 发起交易并使交易进入冻结 /// </summary> internal override void Trade() { TradeInfo tradeInfo = base._tradeInfo; // 1、添加一笔交易记录 this.AddTradeFroze(); //2、扣除余额并冻结 WalletService service = new WalletService(tradeInfo.SchoolId, Convert.ToInt64(tradeInfo.Buyer), base._unitOfWork); service.TradeFroze(_orderTrade.TradeType, tradeInfo.OrderId, tradeInfo.TradeBalanceAmount, tradeInfo.Remark); }
/// <summary> /// 作废交易,从已完成的订单产生一笔作废交易 /// caiyakang 2018-10-06 /// </summary> internal override void Invalid() { base.AddTradeInvalid();//写入交易表 TradeInfo tradeInfo = base._tradeInfo; //余额服务不关心订单新增或订单取消,应由交易服务业务来决定如何调余额服务 if (tradeInfo.TradeBalanceAmount != 0) { WalletService walltService = new WalletService(tradeInfo.SchoolId, Convert.ToInt64(tradeInfo.Buyer), base._unitOfWork); walltService.Trade(GetCancelTradeType(this._orderTrade.TradeType), tradeInfo.OrderId, -tradeInfo.TradeBalanceAmount, tradeInfo.Remark); } }
/// <summary> /// 发起交易并使交易完成 /// </summary> internal override void Trade() { base.AddTradeComplete();//写入交易表 TradeInfo tradeInfo = base._tradeInfo; //余额交易 if (tradeInfo.TradeBalanceAmount != 0) { WalletService walltService = new WalletService(tradeInfo.SchoolId, Convert.ToInt64(tradeInfo.Buyer), base._unitOfWork); walltService.Trade(this._orderTrade.TradeType, tradeInfo.OrderId, tradeInfo.TradeBalanceAmount, tradeInfo.Remark); } }
/// <summary> /// 取消交易,从交易中的订单取消 /// </summary> internal override void Cancel() { TradeInfo tradeInfo = base._tradeInfo; //1、处理交易单 base.UpdateTradeCancel(); //2、处理余额 //余额服务不关心订单新增或订单取消,应由交易服务业务来决定如何调余额服务 if (tradeInfo.TradeBalanceAmount != 0) { WalletService walltService = new WalletService(tradeInfo.SchoolId, Convert.ToInt64(tradeInfo.Buyer), base._unitOfWork); walltService.TradeFrozeCancel(base._orderTrade.TradeType, base.GetCancelTradeType(base._orderTrade.TradeType), tradeInfo.OrderId, tradeInfo.Remark); } }
/// <summary> /// 数据校验 /// <para>作 者:郭伟佳</para> /// <para>创建时间:2018-12-05</para> /// </summary> /// <param name="refundRequest">余额退费请求对象</param> /// <exception cref="AMS.Core.BussinessException"> /// 异常ID: /// 15. 转出余额不足 /// 23. 该学生已经没有余额可退 /// </exception> private void CheckBeforeTransact(BalanceRefundOrderRequest refundRequest) { //1、获取学生的余额信息 decimal balance = new WalletService(this._schoolId, this._studentId, null).Balance; //检查用户是否还有余额 if (balance == 0) { throw new BussinessException((byte)ModelType.Order, 23); } //检查用户余额是否足够转出 if (refundRequest.RefundAmount > balance) { throw new BussinessException((byte)ModelType.Order, 15); } }
/// <summary> /// 更新交易完成状态 /// </summary> internal void TradeComplete() { TradeInfo tradeInfo = base._tradeInfo; TblCashOrderTrade entity = _tradeRepository.Value.GetByOrderId(tradeInfo.SchoolId, tradeInfo.OrderId, tradeInfo.OrderNo); if (entity.TradeStatus == (int)TradeStatus.Trading) { entity.TradeStatus = (int)TradeStatus.Complete; entity.Remark = _tradeInfo.Remark; } //1、操作交易完成 _tradeRepository.Value.Update(entity); //2、操作余额冻结完成 WalletService service = new WalletService(tradeInfo.SchoolId, Convert.ToInt64(tradeInfo.Buyer), base._unitOfWork); service.TradeFrozeComplete(_orderTrade.TradeType, tradeInfo.OrderId); }