示例#1
0
        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public async Task <bool> UpdateAsync(MealOrderModel model)
        {
            using (var conn = MySqlHelper.GetConnection())
            {
                model.LastUpdatedDate = DateTime.Now;
                var result = await conn.UpdateAsync(model);

                return(result > 0);
            }
        }
示例#2
0
 /// <summary>
 /// 取消点餐订单
 /// </summary>
 /// <param name="order">订单model</param>
 /// <param name="tradeDetails">下单时的</param>
 /// <returns></returns>
 public async Task <bool> CancelMealOrderAsync(MealOrderModel order, MealAccountTradeModel refundMealAccountTradeModel, List <MealAccountTradeDetailModel> tradeDetails, List <MealAccountDetailModel> accountDetailModels)
 {
     return(await MySqlHelper.TransactionAsync(async (conn, trans) =>
     {
         await conn.UpdateAsync(order);
         await conn.InsertAsync <string, MealAccountTradeModel>(refundMealAccountTradeModel);
         accountDetailModels.InsertBatch(conn);
         foreach (var item in tradeDetails)
         {
             var ieffec = await conn.ExecuteAsync("update t_meal_account set account_balance = account_balance + @AccountTradeFee where account_guid = @AccountGuid", new { item.AccountTradeFee, item.AccountGuid });
         }
         return true;
     }));
 }
示例#3
0
 /// <summary>
 /// 订单转让
 /// </summary>
 /// <param name="insertOrder"></param>
 /// <param name="updateOrder"></param>
 /// <param name="orderDetails"></param>
 /// <param name="accountDetails"></param>
 /// <param name="tradeModels"></param>
 /// <param name="tradeDetailsModels"></param>
 /// <returns></returns>
 public async Task <bool> AcceptTransferedMealOrderAsync(
     MealOrderModel insertOrder,
     MealOrderModel updateOrder,
     List <MealOrderDetailModel> orderDetails,
     List <MealAccountDetailModel> accountDetails,
     List <MealAccountTradeModel> tradeModels,
     List <MealAccountTradeDetailModel> tradeDetailsModels)
 {
     return(await MySqlHelper.TransactionAsync(async (conn, tran) =>
     {
         await conn.InsertAsync <string, MealOrderModel>(insertOrder);
         await conn.UpdateAsync(updateOrder);
         if (orderDetails.InsertBatch(conn) == 0)
         {
             return false;
         }
         if (accountDetails.InsertBatch(conn) == 0)
         {
             return false;
         }
         if (tradeModels.InsertBatch(conn) == 0)
         {
             return false;
         }
         if (tradeDetailsModels.InsertBatch(conn) == 0)
         {
             return false;
         }
         //账户余额:退款 / 消费
         foreach (var item in tradeDetailsModels)
         {
             var opFee = 1;
             var tradeType = tradeModels.FirstOrDefault(a => a.AccountTradeGuid == item.AccountTradeGuid).AccountTradeType;
             if (tradeType == 1)
             {
                 opFee = -1;
             }
             var ieffec = await conn.ExecuteAsync($"update t_meal_account set account_balance=account_balance-@Fee where account_guid=@AccountGuid ", new { Fee = opFee * item.AccountTradeFee, item.AccountGuid });
             if (ieffec == 0)
             {
                 return false;
             }
         }
         return true;
     }));
 }
        public async Task <IActionResult> AcceptTransferedMealOrderAsync([FromBody] AcceptTransferedMealOrderRequestDto requestDto)
        {
            var orderGuid      = requestDto.OrderGuid;
            var orderBiz       = new MealOrderBiz();
            var orderDetailBiz = new MealOrderDetailBiz();

            #region 检测待转让订单是否能被转让
            var orderModelOld = await orderBiz.GetModelAsync(orderGuid);

            if (orderModelOld == null)
            {
                return(Failed(ErrorCode.Empty, "无此订单数据"));
            }
            if (orderModelOld.OrderStatus != MealOrderStatusEnum.Paided.ToString())
            {
                var enumStatus = (MealOrderStatusEnum)Enum.Parse(typeof(MealOrderStatusEnum), orderModelOld.OrderStatus);
                return(Failed(ErrorCode.UserData, $"当店订单状态为[{enumStatus.GetDescription()}]不支持转让"));
            }
            else if (orderModelOld.MealEndTime < DateTime.Now)
            {
                return(Failed(ErrorCode.UserData, $"当店订单已过用餐时间,无法转让"));
            }
            else if (orderModelOld.UserGuid == UserID)
            {
                return(Failed(ErrorCode.UserData, $"不能接收来自自己的转让订单"));
            }
            #endregion

            //获取转让订单去向用户的钱包账户
            var accountModels = await new MealAccountBiz().GetModelsByUserIdAsync(UserID, orderModelOld.HospitalGuid);
            if (!accountModels.Any())
            {
                return(Failed(ErrorCode.UserData, "未检测到钱包账户,请先充值"));
            }

            //获取待转让订单的订单明细数据
            var orderDetailsOld = await orderDetailBiz.GetModelsByOrderGuidAsync(orderGuid);

            MealOrderModel orderInsert = new MealOrderModel();                                                //新增订单记录
            MealOrderModel orderUpdate = new MealOrderModel();                                                //更新订单记录
            List <MealOrderDetailModel>   orderDetails   = new List <MealOrderDetailModel>();                 //新增点餐订单明细列表
            List <MealAccountDetailModel> accountDetails = new List <MealAccountDetailModel>();               //新增点餐钱包流水列表
            var tradeModels = new List <MealAccountTradeModel>();                                             //点餐交易流水列表
            List <MealAccountTradeDetailModel> tradeDetailsModels = new List <MealAccountTradeDetailModel>(); //点餐订单交易流水明细列表

            //创建新订单
            var orderModelNew = orderModelOld.Clone() as MealOrderModel;
            orderModelNew.OrderGuid       = Guid.NewGuid().ToString("N");
            orderModelNew.UserGuid        = UserID;
            orderModelNew.CreatedBy       = UserID;
            orderModelNew.CreationDate    = DateTime.Now;
            orderModelNew.LastUpdatedBy   = UserID;
            orderModelNew.LastUpdatedDate = DateTime.Now;
            orderModelNew.TransferredFrom = orderModelOld.OrderGuid;

            //修改旧订单
            orderModelOld.TransferredTo   = orderModelNew.OrderGuid;
            orderModelOld.OrderStatus     = MealOrderStatusEnum.Transferred.ToString();
            orderModelOld.LastUpdatedBy   = UserID;
            orderModelOld.LastUpdatedDate = DateTime.Now;

            orderInsert = orderModelNew;
            orderUpdate = orderModelOld;

            //创建新的订单详情
            for (int i = 0; i < orderDetailsOld.Count; i++)
            {
                var od = orderDetailsOld[i];
                od.OrderDetailGuid = Guid.NewGuid().ToString("N");
                od.OrderGuid       = orderModelNew.OrderGuid;
                od.CreatedBy       = UserID;
                od.CreationDate    = DateTime.Now;
                od.LastUpdatedBy   = UserID;
                od.LastUpdatedDate = DateTime.Now;
            }
            orderDetails.AddRange(orderDetailsOld);

            #region 旧订单退款:创建钱包退款流水、订单退款交易流水

            //退款-订单交易记录
            var refundTradeModels = new MealAccountTradeModel
            {
                AccountTradeGuid        = Guid.NewGuid().ToString("N"),
                OrderGuid               = orderModelOld.OrderGuid,
                AccountTradeType        = (sbyte)MealAccountTradeTypeEnum.Refund,
                AccountTradeFee         = orderModelOld.TotalPrice,
                AccountTradeDescription = string.Empty,
                CreatedBy               = UserID,
                LastUpdatedBy           = UserID,
                OrgGuid = string.Empty
            };
            tradeModels.Add(refundTradeModels);
            //退款-订单交易明细
            var tradeDetal_TransferFrom = await new MealAccountTradeDetailBiz().GetModelsByOrderGuidAsync(orderModelOld.OrderGuid, 0);
            foreach (var td in tradeDetal_TransferFrom)
            {
                var item = td.Clone() as MealAccountTradeDetailModel;
                item.AccountTradeDetailGuid = Guid.NewGuid().ToString("N");
                item.AccountTradeGuid       = refundTradeModels.AccountTradeGuid;
                item.CreatedBy       = UserID;
                item.CreationDate    = DateTime.Now;
                item.LastUpdatedBy   = UserID;
                item.LastUpdatedDate = DateTime.Now;
                tradeDetailsModels.Add(item);
            }
            //退款-钱包账户流水
            var sourceUserAccountModels = await new MealAccountBiz().GetModelsByUserIdAsync(orderModelOld.UserGuid, orderModelOld.HospitalGuid);
            if (!sourceUserAccountModels.Any())
            {
                return(Failed(ErrorCode.UserData, "未检测到钱包账户"));
            }
            accountDetails.AddRange(tradeDetal_TransferFrom.Select(a => new MealAccountDetailModel
            {
                AccountDetailGuid        = Guid.NewGuid().ToString("N"),
                AccountGuid              = a.AccountGuid,
                AccountDetailType        = MealAccountDetailTypeEnum.Refund.ToString(),
                AccountDetailIncomeType  = (sbyte)MealAccountDetailIncomeTypeEnum.Income,
                AccountDetailBeforeFee   = (sourceUserAccountModels.FirstOrDefault(p => p.AccountGuid == a.AccountGuid)?.AccountBalance ?? 0M),
                AccountDetailFee         = a.AccountTradeFee,
                AccountDetailAfterFee    = (sourceUserAccountModels.FirstOrDefault(p => p.AccountGuid == a.AccountGuid)?.AccountBalance ?? 0M) + a.AccountTradeFee,
                AccountDetailDescription = $"订单转让退款:订单号[{orderModelOld.OrderNo}]",
                CreatedBy     = UserID,
                LastUpdatedBy = UserID,
                OrgGuid       = string.Empty
            }).ToList());

            #endregion

            #region 新订单扣款、创建钱包流水、创建订单交易流水
            var accountToal = accountModels.Sum(a => a.AccountBalance);
            var orderTotal  = orderModelNew.TotalPrice;
            if (accountToal < orderTotal)
            {
                return(Failed(ErrorCode.UserData, "余额不足,请先充值"));
            }
            var rechargeAccount = accountModels.FirstOrDefault(a => a.AccountType == MealAccountTypeEnum.Recharge.ToString());
            var grantAccount    = accountModels.FirstOrDefault(a => a.AccountType == MealAccountTypeEnum.Grant.ToString());

            var newOrderTradeModel = new MealAccountTradeModel
            {
                AccountTradeGuid        = Guid.NewGuid().ToString("N"),
                OrderGuid               = orderModelNew.OrderGuid,
                AccountTradeType        = (sbyte)MealAccountTradeTypeEnum.Consumer,
                AccountTradeFee         = orderModelNew.TotalPrice,
                AccountTradeDescription = string.Empty,
                CreatedBy               = UserID,
                LastUpdatedBy           = UserID,
                OrgGuid = string.Empty
            };
            tradeModels.Add(newOrderTradeModel);

            var paidMoney = orderTotal;
            //创建钱包流水记录
            if (grantAccount != null && grantAccount.AccountBalance > 0)
            {
                var grantPaid = grantAccount.AccountBalance > paidMoney ? paidMoney : grantAccount.AccountBalance;
                accountDetails.Add(new MealAccountDetailModel
                {
                    AccountDetailGuid        = Guid.NewGuid().ToString("N"),
                    AccountGuid              = grantAccount.AccountGuid,
                    AccountDetailType        = MealAccountDetailTypeEnum.Consume.ToString(),
                    AccountDetailIncomeType  = (sbyte)MealAccountDetailIncomeTypeEnum.Expenditure,
                    AccountDetailBeforeFee   = grantAccount.AccountBalance,
                    AccountDetailFee         = grantPaid,
                    AccountDetailAfterFee    = grantAccount.AccountBalance - grantPaid,
                    AccountDetailDescription = "订单消费",
                    CreatedBy     = UserID,
                    LastUpdatedBy = UserID,
                    OrgGuid       = string.Empty
                });
                var orderPaid = grantPaid > orderModelNew.TotalPrice ? orderModelNew.TotalPrice : grantPaid;
                tradeDetailsModels.Add(new MealAccountTradeDetailModel
                {
                    AccountTradeDetailGuid = Guid.NewGuid().ToString("N"),
                    AccountGuid            = grantAccount.AccountGuid,
                    AccountTradeGuid       = newOrderTradeModel.AccountTradeGuid,
                    AccountTradeFee        = orderPaid,
                    CreatedBy     = UserID,
                    LastUpdatedBy = UserID,
                    OrgGuid       = string.Empty
                });
                paidMoney -= grantPaid;
            }
            if (paidMoney > 0 && rechargeAccount != null && rechargeAccount.AccountBalance > 0)
            {
                accountDetails.Add(new MealAccountDetailModel
                {
                    AccountDetailGuid        = Guid.NewGuid().ToString("N"),
                    AccountGuid              = rechargeAccount.AccountGuid,
                    AccountDetailType        = MealAccountDetailTypeEnum.Consume.ToString(),
                    AccountDetailIncomeType  = (sbyte)MealAccountDetailIncomeTypeEnum.Expenditure,
                    AccountDetailBeforeFee   = rechargeAccount.AccountBalance,
                    AccountDetailFee         = paidMoney,
                    AccountDetailAfterFee    = rechargeAccount.AccountBalance - paidMoney,
                    AccountDetailDescription = "订单消费",
                    CreatedBy     = UserID,
                    LastUpdatedBy = UserID,
                    OrgGuid       = string.Empty
                });
                tradeDetailsModels.Add(new MealAccountTradeDetailModel
                {
                    AccountTradeDetailGuid = Guid.NewGuid().ToString("N"),
                    AccountGuid            = rechargeAccount.AccountGuid,
                    AccountTradeGuid       = newOrderTradeModel.AccountTradeGuid,
                    AccountTradeFee        = paidMoney,
                    CreatedBy     = UserID,
                    LastUpdatedBy = UserID,
                    OrgGuid       = string.Empty
                });
            }
            #endregion

            var result = await orderBiz.AcceptTransferedMealOrderAsync(orderInsert, orderUpdate, orderDetails, accountDetails, tradeModels, tradeDetailsModels);

            return(result ? Success() : Failed(ErrorCode.DataBaseError, "订单转让操作失败,请重试"));
        }
        public async Task <IActionResult> SubmitMealOrderAsync([FromBody] SubmitMealOrderRequestDto requestDto)
        {
            var dishesIds         = requestDto.DishesDetails.Select(a => a.DishesGuid).Distinct().ToList();
            var dishesCategoryIds = requestDto.DishesDetails.Select(a => a.CategoryGuid).Distinct().ToList();

            var accountModels = await new MealAccountBiz().GetModelsByUserIdAsync(UserID, requestDto.HospitalGuid);

            if (!accountModels.Any())
            {
                return(Failed(ErrorCode.Empty, "未检测到钱包账户,请先充值"));
            }
            var isInternal = accountModels.FirstOrDefault(a => a.UserType == MealUserTypeEnum.Internal.ToString()) != null;

            var dishesModels      = await new MealDishesBiz().GetModelsByIdsAsync(dishesIds);
            var checkDishesOnsale = dishesModels.FirstOrDefault(a => a.DishesOnsale == 0);

            if (checkDishesOnsale != null)
            {
                return(Failed(ErrorCode.UserData, "订单中存在下架的菜品"));
            }

            var codeBiz = new CodeBiz();
            var orderNo = codeBiz.GetMealOrderCode("M");
            //餐别基础数据
            var dishesCategoryModels = await new MealCategoryBiz().GetModelsByIdsAsync(dishesCategoryIds);
            var groupDishes          = requestDto.DishesDetails.GroupBy(a => new { a.MealDate, a.CategoryGuid });
            List <MealOrderModel>              orders             = new List <MealOrderModel>();              //点餐订单列表
            List <MealOrderDetailModel>        orderDetails       = new List <MealOrderDetailModel>();        //点餐订单明细列表
            List <MealAccountDetailModel>      accountDetails     = new List <MealAccountDetailModel>();      //点餐钱包流水列表
            List <MealAccountTradeModel>       tradeModels        = new List <MealAccountTradeModel>();       //点餐交易流水列表
            List <MealAccountTradeDetailModel> tradeDetailsModels = new List <MealAccountTradeDetailModel>(); //点餐交易流水明细列表
            var orderIndex = 1;

            foreach (var item in groupDishes)
            {
                var theDishesCategory = dishesCategoryModels.FirstOrDefault(a => a.CategoryGuid == item.Key.CategoryGuid);
                var order             = new MealOrderModel
                {
                    OrderGuid     = Guid.NewGuid().ToString("N"),
                    OrderNo       = $"{orderNo}-{orderIndex++}",
                    CategoryGuid  = item.Key.CategoryGuid,
                    CategoryName  = theDishesCategory?.CategoryName,
                    MealDate      = item.Key.MealDate,
                    MealStartTime = Convert.ToDateTime($"{item.Key.MealDate.ToString("yyyy-MM-dd")} {theDishesCategory.MealStartTime}"),
                    MealEndTime   = Convert.ToDateTime($"{item.Key.MealDate.ToString("yyyy-MM-dd")} {theDishesCategory.MealEndTime}"),
                    UserGuid      = UserID,
                    HospitalGuid  = requestDto.HospitalGuid,
                    OrderStatus   = MealOrderStatusEnum.Paided.ToString(),
                    Quantity      = item.Sum(a => a.Quantity),
                    TotalPrice    = 0,
                    CreatedBy     = UserID,
                    LastUpdatedBy = UserID,
                    OrgGuid       = string.Empty
                };
                var totalPrice = 0M;
                foreach (var dish in item)
                {
                    var theDishes     = dishesModels.FirstOrDefault(a => a.DishesGuid == dish.DishesGuid);
                    var internalPrice = theDishes.DishesInternalPrice;
                    var externalPrice = theDishes.DishesExternalPrice;
                    var orderDetail   = new MealOrderDetailModel
                    {
                        OrderDetailGuid = Guid.NewGuid().ToString("N"),
                        OrderGuid       = order.OrderGuid,
                        DishesGuid      = dish.DishesGuid,
                        DishesName      = theDishes.DishesName,
                        Quantity        = dish.Quantity,
                        UnitPrice       = isInternal ? internalPrice : externalPrice,
                        CreatedBy       = UserID,
                        LastUpdatedBy   = UserID,
                        OrgGuid         = string.Empty
                    };
                    totalPrice += orderDetail.Quantity * orderDetail.UnitPrice;
                    orderDetails.Add(orderDetail);
                }
                order.TotalPrice = totalPrice;
                orders.Add(order);



                #region 交易流水记录
                tradeModels.Add(new MealAccountTradeModel
                {
                    AccountTradeGuid        = Guid.NewGuid().ToString("N"),
                    OrderGuid               = order.OrderGuid,
                    AccountTradeType        = (sbyte)MealAccountTradeTypeEnum.Consumer,
                    AccountTradeFee         = order.TotalPrice,
                    AccountTradeDescription = string.Empty,
                    CreatedBy               = UserID,
                    LastUpdatedBy           = UserID,
                    OrgGuid = string.Empty
                });
                #endregion
            }
            var accountToal = accountModels.Sum(a => a.AccountBalance);
            var orderTotal  = orders.Sum(a => a.TotalPrice);
            if (accountToal < orderTotal)
            {
                return(Failed(ErrorCode.UserData, "余额不足,请先充值"));
            }
            var rechargeAccount = accountModels.FirstOrDefault(a => a.AccountType == MealAccountTypeEnum.Recharge.ToString());
            var grantAccount    = accountModels.FirstOrDefault(a => a.AccountType == MealAccountTypeEnum.Grant.ToString());
            var paidMoney       = orderTotal;

            var orderDic = orders.ToDictionary(a => a.OrderGuid, a => a.TotalPrice);
            //创建钱包流水记录
            if (grantAccount != null && grantAccount.AccountBalance > 0)
            {
                var grantPaid = grantAccount.AccountBalance > paidMoney ? paidMoney : grantAccount.AccountBalance;
                accountDetails.Add(new MealAccountDetailModel
                {
                    AccountDetailGuid        = Guid.NewGuid().ToString("N"),
                    AccountGuid              = grantAccount.AccountGuid,
                    AccountDetailType        = MealAccountDetailTypeEnum.Consume.ToString(),
                    AccountDetailIncomeType  = (sbyte)MealAccountDetailIncomeTypeEnum.Expenditure,
                    AccountDetailBeforeFee   = grantAccount.AccountBalance,
                    AccountDetailFee         = grantPaid,
                    AccountDetailAfterFee    = grantAccount.AccountBalance - grantPaid,
                    AccountDetailDescription = "订单消费",
                    Remark        = orderNo,
                    CreatedBy     = UserID,
                    LastUpdatedBy = UserID,
                    OrgGuid       = string.Empty
                });
                paidMoney -= grantPaid;

                for (int i = 0; i < orderDic.Count; i++)
                {
                    var item = orderDic.ElementAt(i);
                    if (item.Value > 0 && grantPaid > 0)
                    {
                        var orderPaid = grantPaid > item.Value ? item.Value : grantPaid;
                        tradeDetailsModels.Add(new MealAccountTradeDetailModel
                        {
                            AccountTradeDetailGuid = Guid.NewGuid().ToString("N"),
                            AccountGuid            = grantAccount.AccountGuid,
                            AccountTradeGuid       = tradeModels.FirstOrDefault(a => a.OrderGuid == item.Key)?.AccountTradeGuid,
                            AccountTradeFee        = orderPaid,
                            CreatedBy     = UserID,
                            LastUpdatedBy = UserID,
                            OrgGuid       = string.Empty
                        });
                        orderDic[item.Key] -= orderPaid;
                        grantPaid          -= orderPaid;
                    }
                }
            }
            if (paidMoney > 0 && rechargeAccount != null && rechargeAccount.AccountBalance > 0)
            {
                accountDetails.Add(new MealAccountDetailModel
                {
                    AccountDetailGuid        = Guid.NewGuid().ToString("N"),
                    AccountGuid              = rechargeAccount.AccountGuid,
                    AccountDetailType        = MealAccountDetailTypeEnum.Consume.ToString(),
                    AccountDetailIncomeType  = (sbyte)MealAccountDetailIncomeTypeEnum.Expenditure,
                    AccountDetailBeforeFee   = rechargeAccount.AccountBalance,
                    AccountDetailFee         = paidMoney,
                    AccountDetailAfterFee    = rechargeAccount.AccountBalance - paidMoney,
                    AccountDetailDescription = "订单消费",
                    Remark        = orderNo,
                    CreatedBy     = UserID,
                    LastUpdatedBy = UserID,
                    OrgGuid       = string.Empty
                });
                for (int i = 0; i < orderDic.Count; i++)
                {
                    var item = orderDic.ElementAt(i);
                    if (item.Value > 0)
                    {
                        tradeDetailsModels.Add(new MealAccountTradeDetailModel
                        {
                            AccountTradeDetailGuid = Guid.NewGuid().ToString("N"),
                            AccountGuid            = rechargeAccount.AccountGuid,
                            AccountTradeGuid       = tradeModels.FirstOrDefault(a => a.OrderGuid == item.Key)?.AccountTradeGuid,
                            AccountTradeFee        = item.Value,
                            CreatedBy     = UserID,
                            LastUpdatedBy = UserID,
                            OrgGuid       = string.Empty
                        });
                        orderDic[item.Key] -= item.Value;
                    }
                }
            }

            var res = await new MealOrderBiz().SubmitMealOrderAsync(orders, orderDetails, accountDetails, tradeModels, tradeDetailsModels);
            return(res ? Success() : Failed(ErrorCode.DataBaseError));
        }