public ErrorCodes UpdateStatus(int orderId, OrderStatusEnum changeStatus, string reasonNote = "", string user = "", string cashierRefund = "", bool isCS = false) { ErrorCodes errorCodes = ErrorCodes.UnknowError; try { var result = 0; var order = _orderDal.GetById(orderId); if (order != null && order.order_id > 0) { var currentStatus = (OrderStatusEnum)order.status; // Nếu là đơn Take Away thì từ KitchenDone => Success luôn if (currentStatus == OrderStatusEnum.KitchenDone && changeStatus == OrderStatusEnum.Delivering && order.order_type == OrderTypeEnum.TakeAway.GetHashCode()) { changeStatus = OrderStatusEnum.Success; } if (!ValidateChangeStatus(currentStatus, changeStatus)) { return(ErrorCodes.StatusError); } // Nếu là CS hủy đơn thì đơn phải là trạng thái chờ xác nhận if (isCS && changeStatus == OrderStatusEnum.Destroy && currentStatus != OrderStatusEnum.Inactive) { return(ErrorCodes.StatusError); } var changeStatusShort = (short)changeStatus; var changeRequestType = (short)order.request_type; switch (changeStatus) { #region TH: Bếp báo done, service call để đẩy sang Ahamove. Sau khi Shipper đến nhận hàng giao tiền thì thu ngân click nhận tiền case OrderStatusEnum.Delivering: result = _orderDal.UpdateStatus(orderId, changeStatusShort, changeRequestType, user, reasonNote: order.reason_note, cashierReceive: user); break; #endregion #region TH: Quản lý hủy đơn mà do giao hàng không thanh công, phải refund tiền cho shipper. Phải ghi nhận thêm thu ngân hoàn tiền case OrderStatusEnum.Destroy: // TH currentt status là đang vận chuyển or giao hàng không thành công mới ghi nhận cashierRefund if (currentStatus != OrderStatusEnum.Delivering && currentStatus != OrderStatusEnum.Failure) { cashierRefund = string.Empty; } // TH Hủy đơn do bếp k adapt được khách => cần update thêm request cs báo lại khách if ((currentStatus == OrderStatusEnum.PushToPOS || currentStatus == OrderStatusEnum.KitchenAccept || currentStatus == OrderStatusEnum.KitchenDone || currentStatus == OrderStatusEnum.Delivering || currentStatus == OrderStatusEnum.Failure) && order.request_type != RequestTypeEnum.CSRequestDestroy.GetHashCode()) { changeRequestType = (short)RequestTypeEnum.KitchenDestroy; // Push notify _notifyService.PushNotifyToAccounts(orderId.ToString(), RequestTypeEnum.KitchenDestroy); } // TH Hủy đơn CS báo hủy => request type đổi sang Hủy đơn theo yêu cầu của CSKH và không cần note lý do nữa if (changeStatus == OrderStatusEnum.Destroy && order.request_type == RequestTypeEnum.CSRequestDestroy.GetHashCode()) { changeRequestType = (short)RequestTypeEnum.ConfirmDestroyForCS; reasonNote = order.reason_note; } result = _orderDal.UpdateStatus(orderId, changeStatusShort, changeRequestType, user, reasonNote: reasonNote, cashierReceive: order.cashier_receive, cashierRefund: cashierRefund); break; #endregion default: result = _orderDal.UpdateStatus(orderId, changeStatusShort, changeRequestType, user, reasonNote: order.reason_note, cashierReceive: order.cashier_receive, cashierRefund: order.cashier_refund); break; } if (result <= 0) { errorCodes = ErrorCodes.BusinessError; } else { // history khi thay đổi trạng thái sẽ full các trường _orderHistoryBo.Insert(new OrderHistory { change_log = reasonNote, created_by = user, order_id = orderId, status = changeStatusShort, request_type = changeRequestType, delivery_status = order.delivery_status }); errorCodes = ErrorCodes.Success; } } } catch (Exception ex) { Logger.Error(ex); errorCodes = ErrorCodes.Exception; } return(errorCodes); }