using POSV.Card; using POSV.Entity; using POSV.Helper; using POSV.HttpApi; using POSV.HttpResponse; using POSV.MessageEvent; using POSV.MsgCenter; using POSV.Proxy.Base; using POSV.ServiceCenter; using POSV.ShoppingCart; using POSV.ThirdPartyOrderData; using POSV.Utils; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace POSV.Proxy.ThirdPartyOrder { public class JuWeiAppOrderProxy : ProxyBase { public JuWeiAppOrderProxy() { if (LOGGET == null) { LOGGET = NLog.LogManager.GetLogger(GetType().FullName); } } #region API /// /// 加载小程序门店商品信息 /// zhangy 2020-03-03 Add /// /// /// public Tuple> GetProduct(string programId, string storeId) { Tuple> result = null; try { OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business); SortedList parameters = OpenApiUtils.Instance.NewParameters(api); parameters.Add("method", "program.product"); parameters.Add("programId", programId); parameters.Add("storeId", storeId); var ignoreParameters = new List(); ignoreParameters.Add("programId"); ignoreParameters.Add("storeId"); parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); LOGGET.Info("小程序门店商品资料:" + response); //获取成功 if (Constant.IsSuccessful(response)) { var data = JsonUtils.Deserialize>(response); if (data.Status == 1) { result = new Tuple>(true, data.Message, data); } else { result = new Tuple>(false, data.ErrMessage, null); } } else { var _errorMessage = PaserErrors(response); result = new Tuple>(false, _errorMessage, null); } } catch (Exception ex) { LOGGET.Error(ex, "小程序门店商品资料异常"); result = new Tuple>(false, ex.Message, null); } return result; } /// /// 小程序商品开卖 /// /// /// public Tuple> ProductSalein(ProgramProductSaleinRequest request) { Tuple> result = null; try { OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business); SortedList parameters = OpenApiUtils.Instance.NewParameters(api); parameters.Add("method", "program.product.salein"); parameters.Add("storeId", request.StoreId); parameters.Add("productTypeIds", request.ProductTypeIds); parameters.Add("specIds", request.SpecIds); var ignoreParameters = new List(); ignoreParameters.Add("productTypeIds"); ignoreParameters.Add("specIds"); parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); //获取成功 if (Constant.IsSuccessful(response)) { var data = JsonUtils.Deserialize>(response); if (data.Status == 1) { result = new Tuple>(true, data.Message, data); } else { result = new Tuple>(false, data.ErrMessage, null); } } else { var errorMessage = PaserErrors(response); result = new Tuple>(false, errorMessage, null); } } catch (Exception ex) { LOGGET.Error(ex, "小程序商品开卖异常"); result = new Tuple>(false, "小程序商品开卖异常,本次操作无效", null); } return result; } /// /// 小程序商品停售 /// /// /// public Tuple> ProductSaleout(ProgramProductSaleoutRequest request) { Tuple> result = null; try { OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business); SortedList parameters = OpenApiUtils.Instance.NewParameters(api); parameters.Add("method", "program.product.saleout"); parameters.Add("storeId", request.StoreId); parameters.Add("productTypeIds", request.ProductTypeIds); parameters.Add("specIds", request.SpecIds); var ignoreParameters = new List(); ignoreParameters.Add("productTypeIds"); ignoreParameters.Add("specIds"); parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); //获取成功 if (Constant.IsSuccessful(response)) { var data = JsonUtils.Deserialize>(response); if (data.Status == 1) { result = new Tuple>(true, data.Message, data); } else { result = new Tuple>(false, data.ErrMessage, null); } } else { var errorMessage = PaserErrors(response); result = new Tuple>(false, errorMessage, null); } } catch (Exception ex) { LOGGET.Error(ex, "小程序商品开卖异常"); result = new Tuple>(false, "小程序商品开卖异常,本次操作无效", null); } return result; } /// /// 门店信息 /// private Tuple> Program_Store_Detail(string request) { Tuple> result = null; try { OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business); SortedList parameters = OpenApiUtils.Instance.NewParameters(api); parameters.Add("method", "program.store.detail"); parameters.Add("storeId", request); var ignoreParameters = new List(); parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); LOGGET.Info("小程序点餐_门店信息请求:" + JsonUtils.Serialize(parameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); //LOGGET.Info("小程序点餐_门店信息接收:" + response); //获取成功 if (Constant.IsSuccessful(response)) { var data = JsonUtils.Deserialize>(response); if (data.Status == 1) { result = new Tuple>(true, data.Message, data); } else { result = new Tuple>(false, data.ErrMessage, data); } } else { var _errorMessage = PaserErrors(response); result = new Tuple>(false, _errorMessage, null); } } catch (Exception ex) { LOGGET.Error(ex, "小程序点餐_门店信息"); result = new Tuple>(false, "小程序点餐_门店信息,请检测网络连接", null); } return result; } /// /// 门店停业 \ 开业 /// /// private Tuple> Program_Store_Stop_Open(bool _isopen, string request) { Tuple> result = null; try { OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business); SortedList parameters = OpenApiUtils.Instance.NewParameters(api); if (_isopen) { parameters.Add("method", "program.store.open"); } else { parameters.Add("method", "program.store.stop"); } parameters.Add("storeId", request); var ignoreParameters = new List(); parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); //LOGGET.Info("小程序点餐_门店开停业_请求:" + _isopen + JsonUtils.Serialize(parameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); //LOGGET.Info("小程序点餐_门店开停业_接收:" + _isopen + response); //获取成功 if (Constant.IsSuccessful(response)) { var data = JsonUtils.Deserialize>(response); if (data.Status == 1) { result = new Tuple>(true, data.Message, data); } else { result = new Tuple>(false, data.ErrMessage, data); } } else { var _errorMessage = PaserErrors(response); result = new Tuple>(false, _errorMessage, null); } } catch (Exception ex) { LOGGET.Error(ex, "小程序点餐_门店开停业"); result = new Tuple>(false, "小程序点餐_门店开停业,请检测网络连接", null); } return result; } /// /// 门店开业 /// [Obsolete("冗余接口")] private Tuple> Program_Store_Open(string request) { Tuple> result = null; try { OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business); SortedList parameters = OpenApiUtils.Instance.NewParameters(api); parameters.Add("method", "program.store.open"); parameters.Add("storeId", request); var ignoreParameters = new List(); parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); LOGGET.Info("小程序点餐_门店开业_请求:" + JsonUtils.Serialize(parameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); //LOGGET.Info("小程序点餐_门店开业_接收:" + response); //获取成功 if (Constant.IsSuccessful(response)) { var data = JsonUtils.Deserialize>(response); if (data.Status == 1) { result = new Tuple>(true, data.Message, data); } else { result = new Tuple>(false, data.ErrMessage, data); } } else { var _errorMessage = PaserErrors(response); result = new Tuple>(false, _errorMessage, null); } } catch (Exception ex) { LOGGET.Error(ex, "小程序点餐_门店开业"); result = new Tuple>(false, "小程序点餐_门店开业,请检测网络连接", null); } return result; } /// /// 配送同步信息 /// /// /// public Tuple> Program_Order_Dispatch_Sync(string storeId, string busNo) { Tuple> result = null; try { OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business); SortedList parameters = OpenApiUtils.Instance.NewParameters(api); parameters.Add("method", "program.order.dispatch.sync"); parameters.Add("storeId", storeId); parameters.Add("busNo", busNo); var ignoreParameters = new List(); parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); //获取成功 if (Constant.IsSuccessful(response)) { var data = JsonUtils.Deserialize>(response); if (data.Status == 1) { result = new Tuple>(true, data.Message, data); } else { result = new Tuple>(false, string.IsNullOrEmpty(data.ErrMessage) ? data.Message : data.ErrMessage, null); } } else { var errorMessage = PaserErrors(response); result = new Tuple>(false, errorMessage, null); } } catch (Exception ex) { LOGGET.Error(ex, "物流同步订单异常"); result = new Tuple>(false, "物流同步订单异常,本次操作无效", null); } return result; } /// /// 配送信息 /// public Tuple> Program_Order_Delivery_Query(string storeId, string busNo) { Tuple> result = null; try { OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business); SortedList parameters = OpenApiUtils.Instance.NewParameters(api); parameters.Add("method", "program.order.delivery.query"); parameters.Add("storeId", storeId); parameters.Add("busNo", busNo); var ignoreParameters = new List(); parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); LOGGET.Info("小程序点餐_配送信息请求:" + JsonUtils.Serialize(parameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); //LOGGET.Info("小程序点餐_配送信息接收:" + response); //获取成功 if (Constant.IsSuccessful(response)) { var data = JsonUtils.Deserialize>(response); if (data.Status == 1) { result = new Tuple>(true, data.Message, data); } else { result = new Tuple>(false, data.ErrMessage, null); } } else { var _errorMessage = PaserErrors(response); result = new Tuple>(false, _errorMessage, null); } } catch (Exception ex) { LOGGET.Error(ex, "小程序点餐_配送信息"); result = new Tuple>(false, ",请检测门店网络连接", null); } return result; } /// /// 订单详情 /// private Tuple> Program_Order_Query_Bybusno(string storeId, string busNo) { Tuple> result = null; try { OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business); SortedList parameters = OpenApiUtils.Instance.NewParameters(api); parameters.Add("method", "program.order.query.bybusno"); parameters.Add("storeId", storeId); parameters.Add("busNo", busNo); var ignoreParameters = new List(); parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); LOGGET.Info("小程序点餐_请求内容:" + JsonUtils.Serialize(parameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); //LOGGET.Info("小程序点餐_订单内容:" + response); //获取成功 if (Constant.IsSuccessful(response)) { var data = JsonUtils.Deserialize>(response); if (data.Status == 1) { result = new Tuple>(true, data.Message, data); } else { result = new Tuple>(false, data.ErrMessage, null); //zhangy 2020-03-01 Edit 注释以下代码 //result = new Tuple>(false, data.ErrMessage, data); } } else { var _errorMessage = PaserErrors(response); result = new Tuple>(false, _errorMessage, null); } } catch (Exception ex) { LOGGET.Error(ex, "小程序点餐_订单详情_异常"); result = new Tuple>(false, "小程序点餐_订单详情,请检测网络连接", null); } return result; } /// /// 订单接单\拒单\同意退款\拒绝退款 /// private Tuple> Program_Order_Confirm(ProgramOrderOperationType orderOperationType, string storeId, string busNo) { Tuple> result = null; try { OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business); SortedList parameters = OpenApiUtils.Instance.NewParameters(api); switch (orderOperationType) { case ProgramOrderOperationType.Confirm: parameters.Add("method", "program.order.confirm"); break; case ProgramOrderOperationType.Refuse: parameters.Add("method", "program.order.cancel"); break; case ProgramOrderOperationType.Refund: parameters.Add("method", "program.order.refundagree"); break; case ProgramOrderOperationType.NotRefund: parameters.Add("method", "program.order.refundreject"); break; default: parameters.Add("method", "program.order.confirm"); break; } parameters.Add("storeId", storeId); parameters.Add("busNo", busNo); var ignoreParameters = new List(); parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); LOGGET.Info("小程序点餐_订单" + orderOperationType + "_请求:" + JsonUtils.Serialize(parameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); //LOGGET.Info("小程序点餐_订单" + orderOperationType + "_接收:" + response); //获取成功 if (Constant.IsSuccessful(response)) { var data = JsonUtils.Deserialize>(response); if (data.Status == 1) { result = new Tuple>(true, data.Message, data); } else { result = new Tuple>(false, data.Message, null); } } else { var _errorMessage = PaserErrors(response); result = new Tuple>(false, _errorMessage, null); } } catch (Exception ex) { LOGGET.Error(ex, "小程序点餐_订单接单"); result = new Tuple>(false, "小程序点餐_订单接单,请检测网络连接", null); } return result; } /// /// 订单列表 /// private Tuple> Program_Handle_Order(bool _isHandle, ProgramHandleOrderRequestData request) { Tuple> result = null; try { OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business); SortedList parameters = OpenApiUtils.Instance.NewParameters(api); if (_isHandle) { parameters.Add("method", "program.handle.order"); parameters.Add("storeId", request.Storeid); var ignoreParameters = new List(); parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); } else { parameters.Add("method", "program.list.order"); parameters.Add("storeId", request.Storeid); var ignoreParameters = new List(); parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); parameters.Add("status", request.Status.ToString()); parameters.Add("startTime", request.Starttime); parameters.Add("endTime", request.Endtime); parameters.Add("pageNumber", request.Pagenumber.ToString()); parameters.Add("pageSize", request.Pagesize.ToString()); } LOGGET.Info("小程序点餐_订单列表 是否待处理" + _isHandle + "请求:" + JsonUtils.Serialize(parameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); //LOGGET.Info("小程序点餐_订单列表 是否待处理" + _isHandle + "接收:" + response); //获取成功 if (Constant.IsSuccessful(response)) { var data = JsonUtils.Deserialize>(response); if (data.Status == 1) { result = new Tuple>(true, data.Message, data); } else { result = new Tuple>(false, data.ErrMessage, null); } } else { var _errorMessage = PaserErrors(response); result = new Tuple>(false, _errorMessage, null); } } catch (Exception ex) { LOGGET.Error(ex, "小程序点餐_订单列表"); result = new Tuple>(false, "小程序点餐_订单列表 , 请检测网络连接", null); } return result; } #endregion /// /// 门店信息 /// public Tuple GetShopInfo() { Tuple tuple = new Tuple(false, "", null); try { var _data = this.Program_Store_Detail(Global.Instance.Authc.StoreId); if (_data != null && _data.Item1) { return new Tuple(_data.Item1, _data.Item2, _data.Item3.Data); } else { return new Tuple(false, _data.Item2, null); } } catch (Exception ex) { LOGGET.Error(ex, "获取小程序门店信息异常"); return new Tuple(false, ex.Message, null); } } /// /// 开业\歇业 /// /// 是否开业 /// public Tuple SetStoreStopAndOpen(bool _open) { try { var _data = this.Program_Store_Stop_Open(_open, Global.Instance.Authc.StoreId); if (_data != null && _data.Item1) { return new Tuple(_data.Item1, _data.Item2, _data.Item3.Data); } else { return new Tuple(_data.Item1, _data.Item2, null); } } catch (Exception ex) { LOGGET.Error(ex, "小程序门店开业歇业状态异常"); return new Tuple(false, ex.Message, null); } } /// /// 根据单号查询订单 /// /// 订单号 /// public Tuple GetOrder(string busNo) { try { var _data = this.Program_Order_Query_Bybusno(Global.Instance.Authc.StoreId, busNo); if (_data != null && _data.Item1 == false) { if (_data.Item2.Equals("小程序点餐_订单详情,请检测网络连接")) { LOGGET.Info($"第二次小程序订单查询<{busNo}>"); _data = this.Program_Order_Query_Bybusno(Global.Instance.Authc.StoreId, busNo); if (_data != null && _data.Item1 == false) { if (_data.Item2.Equals("小程序点餐_订单详情,请检测网络连接")) { LOGGET.Info($"第三次小程序订单查询<{busNo}>"); _data = this.Program_Order_Query_Bybusno(Global.Instance.Authc.StoreId, busNo); } } } } if (_data != null && _data.Item1) { return new Tuple(_data.Item1, _data.Item2, _data.Item3.Data); } else { return new Tuple(_data.Item1, _data.Item2, null); } } catch (Exception ex) { LOGGET.Error(ex, "小程序订单查询异常"); return new Tuple(false, "小程序订单查询出错", null); } } /// /// 查询订单 /// /// 是否待处理状态订单 public Tuple> GetOrders(bool _isHandle, ProgramHandleOrderRequestData requestData = null) { try { if (requestData == null) { requestData = new ProgramHandleOrderRequestData(); requestData.Storeid = Global.Instance.Authc.StoreId; } var _data = this.Program_Handle_Order(_isHandle, requestData); return new Tuple>(_data.Item1, _data.Item2, _data.Item3); } catch (Exception ex) { LOGGET.Error(ex, "查询小程序订单异常"); return new Tuple>(false, ex.Message, null); } } /// /// 修改订单状态 /// public Tuple SetOrderStatus(ProgramOrderOperationType orderOperationType, string busNo) { try { LOGGET.Info("开始修改订单状态:<{0},{1}>", busNo, orderOperationType.ToString()); var _data = this.Program_Order_Confirm(orderOperationType, Global.Instance.Authc.StoreId, busNo); LOGGET.Info("订单状态结果:<{0},{1}>", (_data != null && _data.Item1), _data.Item3 != null && _data.Item3.Data != null); if (_data != null && _data.Item1 == false) { if (_data.Item2.Equals("小程序点餐_订单接单,请检测网络连接")) { LOGGET.Info("第二次修改订单状态:<{0},{1}>", busNo, orderOperationType.ToString()); _data = this.Program_Order_Confirm(orderOperationType, Global.Instance.Authc.StoreId, busNo); if (_data != null && _data.Item1 == false) { if (_data.Item2.Equals("小程序点餐_订单接单,请检测网络连接")) { LOGGET.Info("第三次修改订单状态:<{0},{1}>", busNo, orderOperationType.ToString()); _data = this.Program_Order_Confirm(orderOperationType, Global.Instance.Authc.StoreId, busNo); } } } } if (_data != null && _data.Item1) { return new Tuple(_data.Item1, _data.Item2, _data.Item3.Data); } else { return new Tuple(_data.Item1, _data.Item2, null); } } catch (Exception ex) { LOGGET.Info(ex, "修改订单状态异常"); return new Tuple(false, ex.Message, null); } } /// /// 补单 /// public Tuple ReplacementOrder(List program) { //zhangy 2020-02-18 Add 订单保存数据库后,要修改isHaveUpLoadTicket=true bool isException = false; try { if (program == null) { return new Tuple(false, "补单传入的对象未空", "已成功补入 0 单"); } string _mess = @"已成功补入 {0} 单"; int count = 0; foreach (var item in program) { //判断完全订单进行补录 if (item.Status == 1 || item.Status == 2 || item.Status == 4) { using (var _db = Global.Instance.OpenDataBase) { var _sql = string.Format("select * from pos_order where orderNo = '{0}'", item.Seqno); var _data = _db.FirstOrDefault(_sql); if (_data == null) { var _JuWeiOrder = this.GetOrder(item.No); if (_JuWeiOrder.Item1) { var _order = getOrderLocalJuWeiOrder(_JuWeiOrder.Item3); if (_order != null) { using (var _tran = _db.GetTransaction()) { _db.Insert(_order); if (_order.Items != null) foreach (var Orderitem in _order.Items) { _db.Insert(Orderitem); foreach (var _Flavor in Orderitem.Flavors) { _db.Insert(_Flavor); } if (Orderitem.Promotions != null) foreach (var Promotions in Orderitem.Promotions) { _db.Insert(Promotions); } } if (_order.Pays != null) foreach (var orderPay in _order.Pays) { orderPay.FinishDate = _order.FinishDate; #region subin 20231003 注释修改 //注释 //zhangy 2020-02-18 Add 档口结算信息赋默认值 //orderPay.Ext1 = "0"; //orderPay.Ext2 = "0"; //修改 orderPay.Ext1 = string.IsNullOrEmpty(orderPay.Ext1) ? "0" : orderPay.Ext1; orderPay.Ext2 = string.IsNullOrEmpty(orderPay.Ext2) ? "0" : orderPay.Ext2; #endregion //zhangy 2020-02-18 Add 添加结算参数计算 var payMode = OrderUtils.GetPayMode(orderPay.No); if (payMode == null) { orderPay.IncomeFlag = 1; orderPay.OtherRateType = 0; orderPay.OtherRateValue = 0.00M; } else { orderPay.IncomeFlag = payMode.IncomeFlag; orderPay.OtherRateType = payMode.OtherRateType; orderPay.OtherRateValue = payMode.OtherRateValue; OrderUtils.SetPayModeDiscount(orderPay, payMode); } _db.Insert(orderPay); } if (_order.Promotions != null) _db.Insert(_order.Promotions); if (_order.Delivery != null) _db.Insert(_order.Delivery); _tran.Complete(); count++; #region subin 20230916 小程序分账.补单的同时将分账信息保存 LOGGET.Info("补单,小程序分账。"); //DoSplitOrderBefore(_order); //Task.Factory.StartNew(() => //{ // SplitPayUtils.Instance.SaveSplitPayInfo(_order); //}); #endregion } } } } } } } return new Tuple(true, " ", string.Format(_mess, count)); } catch (Exception ex) { //有异常发生 isException = true; LOGGET.Info(ex); return new Tuple(false, ex.Message, "已成功补入 0 单"); } finally { //没有异常发生 if (!isException) { //更新是否有订单需要上传的状态 Global.isHaveUpLoadTicket = true; Global.isHaveBurdenTicket = true; Global.isHaveCenterTicket = true; } } } public Tuple InsertOrder(OrderObject orderObject) { //zhangy 2020-02-18 Add 订单保存数据库后,要修改isHaveUpLoadTicket=true bool isException = false; try { if (orderObject == null) { LOGGET.Error("补单传入的对象未空....."); return new Tuple(false, "补单传入的对象未空", "已成功补入 0 单"); } //subin 20230717 start add lock lock (Global.Instance.SyncLock) { using (var _db = Global.Instance.OpenDataBase) { var _sql = string.Format("select * from pos_order where tradeNo = '{0}'", orderObject.TradeNo); var _data = _db.FirstOrDefault(_sql); //订单本地不存在 if (_data == null) { LOGGET.Info("================================巨为小程序订单插入数据库================================"); var _JuWeiOrder = this.GetOrder(orderObject.TradeNo); if (_JuWeiOrder.Item1) { var _order = getOrderLocalJuWeiOrder(_JuWeiOrder.Item3); if (_order != null) { using (var _tran = _db.GetTransaction()) { _db.Insert(_order); if (_order.Items != null) foreach (var Orderitem in _order.Items) { _db.Insert(Orderitem); foreach (var _Flavor in Orderitem.Flavors) { _db.Insert(_Flavor); } if (Orderitem.Promotions != null) foreach (var Promotions in Orderitem.Promotions) { _db.Insert(Promotions); } } if (_order.Pays != null) foreach (var orderPay in _order.Pays) { orderPay.FinishDate = _order.FinishDate; #region subin 20230916 新增,用于本地小程序订单退款。 orderPay.OpenId = _order.OpenId; #endregion #region subin 20231003 注释修改 //注释 //zhangy 2020-02-18 Add 档口结算信息赋默认值 //orderPay.Ext1 = "0"; //orderPay.Ext2 = "0"; //修改 orderPay.Ext1 = string.IsNullOrEmpty(orderPay.Ext1) ? "0" : orderPay.Ext1; orderPay.Ext2 = string.IsNullOrEmpty(orderPay.Ext2) ? "0" : orderPay.Ext2; #endregion //zhangy 2020-02-18 Add 添加结算参数计算 var payMode = OrderUtils.GetPayMode(orderPay.No); if (payMode == null) { orderPay.IncomeFlag = 1; orderPay.OtherRateType = 0; orderPay.OtherRateValue = 0.00M; } else { orderPay.IncomeFlag = payMode.IncomeFlag; orderPay.OtherRateType = payMode.OtherRateType; orderPay.OtherRateValue = payMode.OtherRateValue; OrderUtils.SetPayModeDiscount(orderPay, payMode); } _db.Insert(orderPay); } if (_order.Promotions != null) _db.Insert(_order.Promotions); if (_order.Delivery != null) _db.Insert(_order.Delivery); _tran.Complete(); } LOGGET.Info("================================" + orderObject.TradeNo + "插入成功!================================"); //subin 20231025 注释,分账由实时改为交班时分账 //Task.Factory.StartNew(() => //{ // SplitPayUtils.Instance.SaveSplitPayInfo(_order); //}); //subin 20231025 注释 end return new Tuple(true, "订单保存成功", ""); } else { return new Tuple(false, "本地转单发生错误", "已成功补入 0 单"); } } else { return new Tuple(false, _JuWeiOrder.Item2, "已成功补入 0 单"); } } else { //LOGGET.Error("订单保存或者补单操作失败,原因:本地单号<" + orderObject.TradeNo + ">重复!,订单内容:" + JsonUtils.Serialize(orderObject)); LOGGET.Error("订单保存或者补单操作失败,原因:本地单号<" + orderObject.TradeNo + ">重复!"); return new Tuple(false, "订单保存失败", "已成功补入 0 单"); } } } //subin 20230717 end } catch (Exception ex) { //有异常发生 isException = true; LOGGET.Error(ex, "巨为小程序订单插入数据库异常"); return new Tuple(false, ex.Message, "已成功补入 0 单"); } finally { //没有异常发生 if (!isException) { //更新是否有订单需要上传的状态 Global.isHaveUpLoadTicket = true; Global.isHaveBurdenTicket = true; Global.isHaveCenterTicket = true; } } } /// /// 数据转换 /// public static OrderObject getOrderLocalJuWeiOrder(ProgramOrderQueryBybusnoData response) { try { //当前订单对象 OrderObject _orderObject = new OrderObject(); #region subin 20230916 新增,用于本地小程序订单退款。 _orderObject.OpenId = response.Openid; #endregion _orderObject.Id = IdWorkerUtils.Instance.NextId(); _orderObject.AddPoint = 0.00M;//本地积分 _orderObject.CardPayResult = null;//会员卡支付清单 _orderObject.ChangeAmount = 0.00M;//找零金额 _orderObject.CreateDate = response.Saledate;//创建时间 _orderObject.CreateUser = "program";//创建人 _orderObject.DeviceName = DeviceUtils.Instance.ComputerName;//设备名称 _orderObject.FinishDate = response.Saledate;//完成时间 _orderObject.InvoicedAmount = 0.00M; _orderObject.IpAddress = DeviceUtils.Instance.IPAddress;//本地IP地址 _orderObject.BoxFee = response.Packagefee;//餐盒费 _orderObject.DeliverFee = response.Deliverfee;//配送费 _orderObject.Amount = response.Amount + _orderObject.BoxFee + _orderObject.DeliverFee;//消费金额(订单应付金额+餐盒费 + 配送费) _orderObject.DiscountAmount = response.Discounttotal;//优惠总额(活动总额) _orderObject.PaidAmount = response.Receivable + _orderObject.BoxFee + _orderObject.DeliverFee;//实收金额 //MAC地址,zhangy 2020-02-19 Edit string macAddress = DeviceUtils.Instance.MacAddress; _orderObject.MacAddress = (!string.IsNullOrEmpty(macAddress) && macAddress.Length < 32) ? macAddress : macAddress.Substring(0, 25); _orderObject.MalingAmount = 0.00M; _orderObject.ReserveTime = response.Reservetime;//到店、预约、取餐时间 _orderObject.People = 1;//人数 _orderObject.PosNo = Global.Instance.Authc.PosNo;//POS号 _orderObject.PrintStatus = OrderPrintStatus.打印完成;//打印状态 _orderObject.PrintTimes = 1; //打印时间 _orderObject.SaleDate = response.Saledate;//销售时间 _orderObject.SalesCode = Global.Instance.Worker.No;//营业员编码 _orderObject.SalesName = Global.Instance.Worker.Name;//营业员名称 _orderObject.ShiftName = Global.Instance.BusinessPlanLog.Name;//班次编号 _orderObject.ShiftNo = Global.Instance.BusinessPlanLog.No;//班次名称 _orderObject.StoreId = Global.Instance.Authc.StoreId; //门店ID _orderObject.StoreName = Global.Instance.Worker.StoreInfo.Name;//门店名称 _orderObject.StoreNo = Global.Instance.Authc.StoreNo;//门店编号 _orderObject.WorkerName = Global.Instance.Worker.Name;//员工姓名 _orderObject.WorkerNo = Global.Instance.Worker.No;//员工工号 _orderObject.SyncStatus = 0;//同步状态 _orderObject.TableNo = response.Tableno;//桌号 _orderObject.TableName = response.Tablename;//餐桌名称 _orderObject.TenantId = Global.Instance.Authc.TenantId;//租户ID _orderObject.TradeNo = response.No; _orderObject.Weather = string.Empty; _orderObject.Weeker = response.Weeker; _orderObject.Ext1 = response.Ext2;//单注 //zhangy 2020-05-09 Add 堂食和外卖订单厨打支持打印手机号和订餐人 string memberName = string.IsNullOrEmpty(response.Membername) ? "" : response.Membername; string memberMobile = string.IsNullOrEmpty(response.Mobile) ? "" : response.Mobile; _orderObject.Ext2 = string.Format("{0} {1}", memberName, memberMobile); _orderObject.Phone = memberMobile; _orderObject.Recipients = memberName; _orderObject.OrderCount = response.OrderProduct.Count; _orderObject.TicketId = response.Id; _orderObject.ObjectId = ObjectId.GenerateNewStringId();//订单ID _orderObject.OrderNo = string.Format("{0}", response.Seqno); switch (response.Status)//(-1待支付0待接单1已确认2已配送3已取消4已完成) { case -1: _orderObject.OrderStatus = OrderStatus.等待付款;//订单状态 break; case 0: _orderObject.OrderStatus = OrderStatus.已支付;//订单状态 break; case 1: _orderObject.OrderStatus = OrderStatus.已完成;//订单状态 break; case 2: _orderObject.OrderStatus = OrderStatus.已完成;//订单状态 break; case 3: _orderObject.OrderStatus = OrderStatus.已取消;//订单状态 break; case 4: _orderObject.OrderStatus = OrderStatus.已完成;//订单状态 break; default: break; } switch (response.Busmode) { case 0: _orderObject.BusMode = "堂食"; break; case 1: _orderObject.BusMode = "外带"; break; case 2: _orderObject.BusMode = "预定"; break; case 3: _orderObject.BusMode = "外卖"; break; default: break; } _orderObject.OrderType = OrderType.微信点餐; _orderObject.PaymentStatus = OrderPaymentStatus.已付款;//支付装 //订单明细 _orderObject.Items = new List(); var map = new ObservableCollection(); var i = 0; #region 商品明细 foreach (var _ordertime in response.OrderProduct) { OrderItem order = new OrderItem(); order.Id = IdWorkerUtils.Instance.NextId(); order.clientId = _ordertime.Clientid; #region ItemInfo using (var db = Global.Instance.OpenDataBase) { string template1 = SqlConstant.ProductExt + " where p.id = '{0}' and s.id = '{1}'"; string sql1 = string.Format(template1, _ordertime.Productid, _ordertime.Specid); List productList = db.Fetch(sql1); ProductExt product = new ProductExt(); //商品资料 if (productList == null || productList.Count == 0) { product = new ProductExt(); product.Chuda = "";//厨打ID product.ChudaFlag = "1";//是否厨打 product.Chupin = "";//出品ID product.ChuDaLabel = string.Empty;//厨打标签ID product.ChuDaLabelFlag = "1";//是否厨打标签 product.ChupinFlag = "1";//是否出品 product.Chuxian = "";//厨显ID product.ChuxianFlag = "1";//是否厨显 product.ChuxianTime = 0;//厨显超时时间 product.CurrentFlag = 0;//是否可以议价 product.DiscountFlag = 0;//是否可折扣 product.GiveFlag = 0;//允许赠送 product.KdsChupin = "";//厨显出品ID product.KdsChupinFlag = "0";//厨显是否出品 product.KdsChupinTime = 0;//厨显出品超时时间 product.LabelPrintFlag = 1;//标签打印 product.MebDiscountFlag = 0;//会员折上折 product.MinPrice = 0.00M;//最低售价 product.Name = _ordertime.Productname;//商品名称 product.Id = _ordertime.Productid;//商品ID product.No = _ordertime.Productno;//商品编号 product.UnitId = _ordertime.Productunitid;//商品单位ID product.UnitName = _ordertime.Productunitname;//商品单位名称 product.PromotionFlag = 0;//是否允许促销 product.ShortName = _ordertime.Productname;//简称 product.SpecId = _ordertime.Specid;//规格ID product.SpecName = _ordertime.Specname;//规格名称 product.StockFlag = 0;//是否管理库存 product.TapleFlag = 0;//是否主食 product.TypeId = _ordertime.Typeid;//商品类别ID product.TypeName = _ordertime.Typename;//商品类别名称 product.WeighFlag = 0;//是否称重 } else { product = productList[0]; } //销售商品明细 order.Price = _ordertime.Price;//单价 order.Quantity = _ordertime.Count;//数量 order.Amount = _ordertime.Amount; //单品金额 = 数量*单价 order.Discount = _ordertime.Discounttotal;//折扣金额 order.DiscountFlag = product.DiscountFlag;//是否可折扣 order.DiscountPrice = _ordertime.Discountprice;//折后单价 order.Chuda = product.Chuda;//厨打ID order.ChudaFlag = product.ChudaFlag;//是否厨打 order.ChudaQty = 0;//厨打次数 order.Chupin = product.Chupin;//出品ID order.ChupinFlag = product.ChupinFlag;//是否出品 order.ChupinQty = 0;//出品次数 order.ChuDaLabel = product.ChuDaLabel;//厨打标签 order.ChuDaLabelFlag = product.ChuDaLabelFlag;//是否厨打标签 order.ChuDaLabelQty = 0;//厨打标签数量 order.Chuxian = product.Chuxian;//厨显ID order.ChuxianFlag = product.ChuxianFlag;//是否厨显 order.ChuxianQty = 0;//厨显次数 order.ChuxianTime = product.ChuxianTime;//厨显超时时间 order.CreateDate = response.Saledate;//创建时间 order.CreateUser = Constant.DEFAULT_SYNC_USER;//创建人 order.CurrentFlag = product.CurrentFlag;//是否可以议价 order.DispatchPrice = product.DispatchPrice;//批发价 order.Flavor = response.MakeInfo.Count > 0 ? 1 : 0;//是否包含做法 #region 单品优惠 var _product = response.OrderProductInfo.Where(f => f.Orderitemid == _ordertime.Clientid); if (_product != null && _product.Count() > 0) { //var _itemid = 0; foreach (var _prductitem in _product) { PromotionItem orderInfo = new PromotionItem(); orderInfo.Id = IdWorkerUtils.Instance.NextId(); orderInfo.ItemId = order.Id; orderInfo.Amount = _ordertime.Amount; orderInfo.CreateDate = response.Saledate;//创建时间 orderInfo.CreateUser = "JuWeiWeiXin";//创建人 orderInfo.DiscountAmount = _prductitem.Discountmoney; orderInfo.OrderId = _orderObject.Id;//订单ID orderInfo.CouponId = string.Empty; orderInfo.Enabled = true; orderInfo.PromotionType = (PromotionType)_prductitem.Type; orderInfo.TenantId = Global.Instance.Authc.TenantId;//租户ID orderInfo.TradeNo = _orderObject.TradeNo; orderInfo.ReceivableAmount = orderInfo.Amount - orderInfo.DiscountAmount; orderInfo.DiscountRate = orderInfo.Amount <= 0 ? 0 : OrderUtils.ToRound(orderInfo.DiscountAmount / orderInfo.Amount); orderInfo.FinishDate = _orderObject.FinishDate; if (order.Promotions == null) { order.Promotions = new List(); } order.Discount = _ordertime.Discount; order.Promotions.Add(orderInfo); } } order.DiscountPrice = _ordertime.Discountprice;//折后价 #endregion ///zhangy 2020-03-11 Edit 整单优惠暂时不处理 //var _ticketInfo = response.TicketInfo; //if (_ticketInfo != null && _ticketInfo.Count() > 0) //{ // if (_orderObject.Promotions == null) // { // _orderObject.Promotions = new List(); // } // //var _itemid = 0; // decimal _total = 0.0M; // foreach (var _ticket in _ticketInfo) // { // PromotionOrder orderInfo = new PromotionOrder(); // orderInfo.Id = IdWorkerUtils.Instance.NextId(); // orderInfo.ItemId = _ticket.Id; // orderInfo.Amount = _orderObject.Amount - _total; // orderInfo.DiscountAmount = _ticket.Discountmoney; // orderInfo.ReceivableAmount = orderInfo.Amount - orderInfo.DiscountAmount; // orderInfo.DiscountRate = OrderUtils.ToRound(orderInfo.DiscountAmount / orderInfo.Amount); // orderInfo.CreateDate = response.Saledate;//创建时间 // orderInfo.CreateUser = "JuWeiWeiXin";//创建人 // orderInfo.OrderId = _orderObject.Id;//订单ID // orderInfo.CouponId = _ticket.Ticketid; // orderInfo.Enabled = true; // orderInfo.PromotionType = (PromotionType)_ticket.Type; // orderInfo.TenantId = Global.Instance.Authc.TenantId;//租户ID // orderInfo.TradeNo = _orderObject.TradeNo; // orderInfo.Ext1 = _ticket.Info; // orderInfo.FinishDate = _orderObject.FinishDate; // _total += _ticket.Discountmoney; // _orderObject.Promotions.Add(orderInfo); // } // _orderObject.PromotionCount = _ticketInfo.Count(); //} #region 做法 var _Flavor = response.MakeInfo.Where(f => f.Orderitemid == _ordertime.Clientid).ToList(); if (_Flavor != null) { order.FlavorAmount = (decimal)_Flavor.Sum(f => f.Addtotal);//加价金额 order.FlavorCount = _Flavor.Count;//(int)_Flavor.Sum(f => f.Addprice); order.FlavorDiscountAmount = _Flavor.Sum(f => f.Discountaddtotal);//做法优惠金额 order.FlavorReceivableAmount = _Flavor.Sum(f => f.Discountaddtotal);//餐盒应收金额 List flavors = new List(); foreach (var item in _Flavor) { FlavorItem flavor = new FlavorItem(); flavor.Quantity = item.Count; flavor.Price = item.Addprice; flavor.Amount = item.Addtotal; flavor.BaseQuantity = flavor.Quantity; flavor.Code = "000"; flavor.CreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:dd"); flavor.CreateUser = Global.Instance.Worker.StoreInfo.CreateUser; flavor.Description = ""; flavor.DiscountAmount = item.Addtotal - item.Discountaddtotal; flavor.DiscountPrice = item.Addprice - item.Discountprice; flavor.FinishDate = _orderObject.FinishDate; flavor.Group = ""; flavor.Color = "黄色"; flavor.Hand = 0; flavor.Id = IdWorkerUtils.Instance.NextId(); flavor.ItemId = order.Id; flavor.MakeId = item.Makeid; flavor.Name = item.Makename; flavor.OrderId = _orderObject.Id; flavor.OrderItemQuantity = _ordertime.Count; flavor.TenantId = _orderObject.TenantId; flavor.TradeNo = _orderObject.TradeNo; flavor.Type = 1; flavor.RefundQuantity = item.Rcount; flavors.Add(flavor); } order.Flavors = flavors; } #endregion #region 餐盒费 if (_ordertime.Packagefee > 0 && _ordertime.Issuit != 2) { if (_ordertime != null) { if (order.Flavors == null || order.Flavors.Count == 0) { order.Flavors = new List(); } FlavorItem flavorItem = new FlavorItem(); //zhangy 2020-02-18 Edit,修复餐盒费作为做法情况的计算错误 flavorItem.Quantity = _ordertime.Count; flavorItem.Price = DecimalUtils.ToRound(_ordertime.Packagefee / (_ordertime.Count <= 0 ? 1 : _ordertime.Count), 2); flavorItem.BaseQuantity = 1; flavorItem.Code = "000"; flavorItem.CreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:dd"); flavorItem.CreateUser = Global.Instance.Worker.StoreInfo.CreateUser; flavorItem.Description = ""; flavorItem.DiscountAmount = 0; flavorItem.DiscountPrice = 0; flavorItem.FinishDate = _orderObject.FinishDate; flavorItem.Group = ""; flavorItem.Color = "黄色"; flavorItem.Hand = 0; flavorItem.Id = IdWorkerUtils.Instance.NextId(); flavorItem.ItemId = order.Id; flavorItem.MakeId = "0"; flavorItem.Name = "餐盒费"; flavorItem.OrderId = _orderObject.Id; flavorItem.OrderItemQuantity = _ordertime.Count; flavorItem.TenantId = _orderObject.TenantId; flavorItem.TradeNo = _orderObject.TradeNo; flavorItem.Type = 0; order.Flavors.Add(flavorItem); } } #endregion order.GiveFlag = product.GiveFlag;//允许赠送 order.Group = "";//分组 order.KdsChupin = product.KdsChupin;//厨显出品ID order.KdsChupinFlag = product.KdsChupinFlag;//厨显是否出品 order.KdsChupinQty = 0; order.KdsChupinTime = product.KdsChupinTime;//厨显出品超时时间 order.LabelPrintFlag = product.LabelPrintFlag;//标签打印 order.MebDiscountFlag = product.MebDiscountFlag;//会员折上折 order.MemberPrice = _ordertime.Price;//会员价 order.MinPrice = product.MinPrice;//最低售价 order.Name = product.Name;//商品名称 order.OrderId = _orderObject.Id;//订单ID order.OrderNo = i++; order.OtherPrice = _ordertime.Price;//第三方价 order.Price = _ordertime.Price;//售价 order.ProductExt = product;//商品信息 order.ProductId = product.Id;//商品ID order.ProductNo = product.No;//商品编号 order.ProductUnitId = product.UnitId;//商品单位ID order.ProductUnitName = product.UnitName;//商品单位名称 order.PromotionFlag = product.PromotionFlag;//是否允许促销 order.Quantity = _ordertime.Count;//商品数量 order.RefundQuantity = _ordertime.Rcount;//退菜数量 order.Remark = "小程序单品"; //是否套菜(1普通菜 2 主菜 3 明细菜) switch (_ordertime.Issuit) { case 1: order.RowState = OrderRowState.普通; break; case 2: order.RowState = OrderRowState.套餐主; break; case 3: order.RowState = OrderRowState.套餐明; break; default: break; } order.SuitId = _ordertime.Suitid; order.ParentId = _ordertime.Parentid; order.SuitQuantity = 1; order.SaleDate = _ordertime.Saledate;//创建时间 order.SalePrice = _ordertime.Price;//售价 order.ShortName = product.ShortName;//简称 order.SpecId = product.SpecId;//规格ID order.SpecName = product.SpecName;//规格名称 order.StockFlag = product.StockFlag;//是否管理库存 order.TapleFlag = product.TapleFlag;//是否主食 order.TenantId = Global.Instance.Authc.TenantId;//租户ID order.TotalAmonut = _ordertime.Receivable;//总计金额 order.TradeNo = _orderObject.TradeNo;//订单编号 order.TypeId = product.TypeId;//商品类别ID order.TypeName = product.TypeName;//商品类别名称 order.WeighFlag = product.WeighFlag;//是否称重 order.OtherWaimaiPrintMake = ""; order.SaleDate = _orderObject.SaleDate; //order.OtherWaimaiPrintName = item.Name; //order.Promotions = promotionsList; map.Add(order); _orderObject.Items.Add(order); } #endregion _orderObject.Maps = map; //商品Map明细 } #endregion foreach (OrderItem order in _orderObject.Items) { if (order.RowState == OrderRowState.套餐主) { List itemDetail = _orderObject.Items.FindAll(x => x.RowState == OrderRowState.套餐明 && x.ParentId == order.ParentId); foreach (OrderItem item in itemDetail) { order.FlavorAmount += item.Flavors.Sum(f => f.Amount); order.FlavorReceivableAmount += item.Flavors.Sum(f => f.ReceivableAmount); order.FlavorDiscountAmount += item.Flavors.Sum(f => f.DiscountAmount); } } } #region PatInfo _orderObject.Pays = new List(); foreach (var _pay in response.PayInfo) { PayItem _payitem = new PayItem(); _payitem.TenantId = Global.Instance.Worker.TenantId; _payitem.Amount = _pay.Money - response.Deliverfee; _payitem.CardAftAmount = 0.00M; _payitem.CardBeforeBalance = 0.00M; _payitem.CardBeforePoint = 0.00M; _payitem.CardFaceNo = ""; _payitem.CardNo = _pay.Cardno; _payitem.ChangeAmount = 0.00M; _payitem.CreateDate = _pay.Paydate; _payitem.CreateUser = ""; _payitem.FinishDate = _pay.Paydate; _payitem.Id = IdWorkerUtils.Instance.NextId(); _payitem.IncomeFlag = 1; _payitem.MemberMobileNo = ""; _payitem.Memo = _payitem.Memo; _payitem.Name = _pay.Paytype; _payitem.No = _pay.Paytypeno; _payitem.Order = 1; _payitem.OrderId = _orderObject.Id; _payitem.TradeNo = _orderObject.TradeNo; _payitem.OutTradeNo = _pay.Voucherno; _payitem.PaidAmount = _pay.Money - response.Deliverfee; _payitem.PayNo = _pay.Payno; _payitem.PayTime = _pay.Paydate; _payitem.ShiftName = Global.Instance.BusinessPlanLog.Name; _payitem.ShiftNo = Global.Instance.BusinessPlanLog.No; _payitem.Ext2 = _pay.ChargeBack.ToString(); _orderObject.Pays.Add(_payitem); } #endregion #region 外送信息 foreach (var ticket in response.TicketDeliver) { _orderObject.Address = ticket.Address; _orderObject.Recipients = ticket.Name; _orderObject.Phone = ticket.Ordertel; } //if (_orderObject.OrderType == OrderType.微信_外送) //{ // foreach (var item in response.TicketDeliver) // { // OrderDelivery delivery = new OrderDelivery(); // } //} #endregion return _orderObject; } catch (Exception ex) { LOGGET.Error(ex, "巨为小程序订单本地转单异常"); return null; } } /// /// 小票打印 /// public static Tuple PrintOrder(OrderObject _orderdata, bool isRprint = false) { try { if (isRprint) { _orderdata.RPrint = true; } //20240330 subin 收银小票,打印外带和自提的小票,不打印堂食票 if (_orderdata.BusMode == "堂食" || _orderdata.OrderType == OrderType.堂食) { LOGGET.Info($"订单类型<{_orderdata.OrderType}>,不打印收银小票"); //return new Tuple(true, "", "堂食不打印收银小票"); } else { LOGGET.Info("开始打印小程序订单.....<{0}>", _orderdata.TradeNo); //打印入库 //构建收银小票模版参数打印 var vars = WaiMaiHelper.BuilderWeiXinVariable(_orderdata, isRprint); //自动切纸 bool cutPager = Global.Instance.GlobalConfigBoolValue(ConfigConstant.PERIPHERAL_CASHIER_ALLOW_CUT_PAGER, false); //是否允许打开钱箱 补打单、退单不开钱箱 bool openCashbox = false; //票头空白行 int headerLine = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_HEADER_EMPTY, 0); //票尾空白行 int footerLine = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_FOOTER_EMPTY, 0); //打印机 var pobject = WaiMaiHelper.GetTicketPrinterObject("收银台打印机", cutPager, false); var printResult = WaiMaiHelper.PrinterTicket(pobject, "巨为小程序", vars, cutPager, openCashbox, headerLine, footerLine); LOGGET.Info("小程序订单打印结果.....<{0}>", printResult.Item2); //打印标签 LabelPrintHelper.PrintOrderLabel(_orderdata); //执行厨打 ChuDaHelper.KitchenPrinter(_orderdata); //执行厨打标签 ChuDaHelper.KitchenLabelPrinter(_orderdata); //执行出品 ChuDaHelper.MadePrinter(_orderdata); } //通知厨显 UploadSCNewOrder.UploadNewOrder2SC4KDS(_orderdata); } catch (Exception ex) { LOGGET.Info(ex, "巨为小程序订单打印异常"); } return new Tuple(true, "", ""); } /// /// 巨为微信小程序接单 /// public static void sendJwWeixinMessage(string message) { if (LOGGET == null) { LOGGET = NLog.LogManager.GetLogger("JuWeiAppOrderProxy"); } try { LOGGET.Info("巨为微信小程序接单开始"); //微信小程序订单是否开启自动接单 bool openConfirm = Global.Instance.GlobalConfigBoolValue(ConfigConstant.WEIXIN_CONFIRM_PARAMETER, false); var _data = JsonUtils.Deserialize>(message); if (_data == null) { LOGGET.Info("订单推送数据解析可能出现问题"); return; } JuWeiAppOrderProxy _juWeiAppOrderProxy = new JuWeiAppOrderProxy(); if (_data.ContainsKey("program") && _data.ContainsKey("date") && !"".Equals(_data["program"])) { //如果发送的时间和本机相差15分钟,证明是无效消息 if (DateTimeUtils.ExecDateDiff(DateTime.Now, DateTime.Parse(_data["date"])) < 15) { string[] orderIds = _data["program"].Split(','); //有美团外卖订单 MsgEvent.Send(Constant.MSGCENTER_NOTIFY, new MsgEntity() { Subject = Constant.MENU_TITLE_CHANGED_NOTIFY, SubSubject = ModuleKeyCode.微信订单.ToString(), Operate = MsgEntityOperate.发布, Data = new Tuple(ModuleKeyCode.微信订单, MenuTileNotifyType.数量, string.Format("{0}", orderIds.Length)) }); //手动接单,发送界面更新通知 if (!openConfirm) { // 播放声音 SoundUtils.PlaySound("weixin"); LOGGET.Info("巨为小程序订单播放声音,通知手动接单"); MsgEvent.Send(Constant.JW_WEIXIN_UI_UPDATA, null); return; } LOGGET.Info("巨为小程序订单进入自动接单....."); //自动接单处理 if (orderIds.Length > 0) { LOGGET.Info("巨为小程序订单Length>0"); } //20240129 subin 改为只处理服务端返回为一条订单的小程序订单 if (orderIds.Length == 1) { LOGGET.Info($"巨为小程序订单Length={orderIds.Length}"); var _len = orderIds.Length; foreach (var item in orderIds) { LOGGET.Info($"巨为小程序订单进入自动接单<{item}>开始"); if (string.IsNullOrEmpty(item)) { LOGGET.Info("订单编号为空,忽略"); continue; } // 播放声音 #region 播放声音 //SoundUtils.PlaySound("weixin"); //LOGGET.Info($"巨为小程序订单<{item}>播放声音,通知自动接单"); //20240129 subin 改为异步播放 Task.Factory.StartNew(() => { SoundUtils.PlaySound("weixin"); LOGGET.Info($"巨为小程序订单<{item}>播放声音,通知自动接单"); }); #endregion //请求接口查询订单 LOGGET.Info($"巨为小程序请求接口查询订单<{item}>"); var _order = _juWeiAppOrderProxy.GetOrder(item); LOGGET.Info($"巨为小程序请求接口查询订单<{item}>,返回结果:{JsonUtils.Serialize(_order)}"); if (_order == null) { LOGGET.Info("推送的巨为小程序订单号<{0}>在服务器中查询不到!", item); //return; continue; } //zhangy 2020-03-01 Add 添加以下代码,替换原来的处理方式 if (_order.Item1) { LOGGET.Info("获取到服务端小程序订单ID:{0},检测本地是否存在订单:{1}", _order.Item3.Id, _order.Item3.No); bool isExists = false; using (var _db = Global.Instance.OpenDataBase) { var _sql = string.Format("select * from pos_order where tradeNo = '{0}'", _order.Item3.No); var _oo = _db.Query(_sql); if (_oo != null && _oo.Count() > 0) { isExists = true; } } if (isExists) { LOGGET.Info("本地已经存在订单:{0}", _order.Item3.No); //return; continue; } //zhangy 2020-02-19 Add //订单已确认后申请退款,刷新订单显示在待处理订单中 if (_order.Item3.Status == 1 && _order.Item3.Refundstatus == 1) { MsgEvent.Send(Constant.JW_WEIXIN_UI_UPDATA, null); } //非待接单 if (_order.Item3.Status != 0) { //return; continue; } //请求接口修改订单状态 var _status = _juWeiAppOrderProxy.SetOrderStatus(ProgramOrderOperationType.Confirm, item); _len--; //接单成功刷新页面 MsgEvent.Send(Constant.MSGCENTER_NOTIFY, new MsgEntity() { Subject = Constant.MENU_TITLE_CHANGED_NOTIFY, SubSubject = ModuleKeyCode.微信订单.ToString(), Operate = MsgEntityOperate.发布, Data = new Tuple(ModuleKeyCode.微信订单, MenuTileNotifyType.数量, string.Format("{0}", _len)) }); if (!_status.Item1) { LOGGET.Info("巨为小程序自动接单失败,订单号:<{0}>", item); //return; continue; } LOGGET.Info("巨为小程序自动接单,开始组装数据....."); var _orderdata = getOrderLocalJuWeiOrder(_order.Item3); LOGGET.Info($"巨为小程序自动接单,开始组装数据<{item}>,返回结果:{JsonUtils.Serialize(_orderdata)}"); if (_orderdata != null) { LOGGET.Info("巨为小程序自动接单,开始保存数据...."); var _intder = _juWeiAppOrderProxy.InsertOrder(_orderdata); if (_intder.Item1) { #region 打印小票 LOGGET.Info($"巨为小程序自动接单<{item}>,数据保存成功,开始打印小票...."); //JuWeiAppOrderProxy.PrintOrder(_orderdata); //20240129 subin 改为异步打印 Task.Factory.StartNew(() => { JuWeiAppOrderProxy.PrintOrder(_orderdata); }); #endregion #region subin 20230916 订单保存成功后处理分账明细 //LOGGET.Info("巨为小程序自动接单,数据保存成功,开始保存分账明细...."); //JuWeiAppOrderProxy.DoSplitOrder(_orderdata); //Task.Factory.StartNew(() => //{ // SplitPayUtils.Instance.SaveSplitPayInfo(_orderdata); //}); #endregion #region subin 20240322 沽清 //处理参与沽清的业务 var rows = _orderdata.Items; if (rows.Count > 0) { foreach (var row in rows) { //套餐明细不处理沽清业务 if (row.RowState == OrderRowState.套餐明) { continue; } //添加沽清业务规则 SaleClear saleClear = null; if (SaleClearUtils.Instance.Maps.ContainsKey(row.ProductId)) { saleClear = SaleClearUtils.Instance.Maps[row.ProductId]; } //是否参与沽清 bool isSaleClear = SaleClearUtils.Instance.CheckSaleClear(saleClear); if (isSaleClear && saleClear.Quantity > 0) { saleClear.SaleQuantity += row.Quantity; SaleClearUtils.Instance.Maps[row.ProductId] = saleClear; LOGGET.Info($"小程序沽清:{JsonUtils.Serialize(saleClear)}"); } //参与沽清,已经售完 else if (isSaleClear && saleClear.Quantity <= 0) { LOGGET.Info($"小程序沽清,沽清售完了:{JsonUtils.Serialize(saleClear)}"); } } } else { LOGGET.Info("小程序沽清:没有明细"); } #endregion } else { LOGGET.Error("巨为小程序自动接单,数据保存失败,订单号:<{0}>", item); } } else { LOGGET.Info("巨为小程序自动接单,数据转单失败...."); } } else { LOGGET.Error("获取订单操作失败:[" + _order.Item2 + "]"); } Thread.Sleep(100); LOGGET.Info($"巨为小程序订单进入自动接单<{item}>结束"); } } } else { LOGGET.Error("巨为小程序订单已经超过15分钟,视为无效!推送信息:" + message); } } } catch (Exception ex) { LOGGET.Error(ex, "巨为小程序自动接单发生异常"); } LOGGET.Info("巨为微信小程序接单结束"); } public static Tuple DoRefund(string tradeNo) { try { OrderObject _OrderObject = OrderUtils.getOrderObjectByTranNo(tradeNo); if (_OrderObject != null) { if (_OrderObject.OrgTradeNo != null && !"".Equals(_OrderObject.OrgTradeNo)) { return new Tuple(false, "订单已完全退单"); } //生成新单 OrderObject _BackOrderObject = ObjectUtils.Copy(_OrderObject); string finishDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //=========更新原单内容 //录入原单号 _BackOrderObject.Id = IdWorkerUtils.Instance.NextId(); //操作员工号 _BackOrderObject.WorkerNo = Global.Instance.Worker.No; //操作员名称 _BackOrderObject.WorkerName = Global.Instance.Worker.Name; _BackOrderObject.SaleDate = finishDate; //班次名称 _BackOrderObject.ShiftName = Global.Instance.BusinessPlanLog.Name; //班次编号 _BackOrderObject.ShiftNo = Global.Instance.BusinessPlanLog.No; //订单标识为 新建状态 _BackOrderObject.OrderStatus = OrderStatus.已退单; //订单创建时间 _BackOrderObject.CreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //订单创建人 _BackOrderObject.CreateUser = Global.Instance.Worker.Name; string[] day = new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; string weeker = day[Convert.ToInt32(DateTime.Now.DayOfWeek.ToString("d"))].ToString(); //星期 _BackOrderObject.Weeker = weeker; //天气 _BackOrderObject.Weather = string.Empty; _BackOrderObject.ObjectId = ObjectId.GenerateNewStringId(); _BackOrderObject.TradeNo = OrderUtils.Instance.GenerateTicketNo(); _BackOrderObject.FinishDate = finishDate; _BackOrderObject.Amount = 0 - _OrderObject.Amount; _BackOrderObject.DiscountAmount = 0 - _OrderObject.DiscountAmount; _BackOrderObject.ReceivableAmount = 0 - _OrderObject.ReceivableAmount; _BackOrderObject.PaidAmount = 0 - _OrderObject.PaidAmount; _BackOrderObject.ReceivedAmount = 0 - _OrderObject.ReceivedAmount; _BackOrderObject.MalingAmount = 0 - _OrderObject.MalingAmount; _BackOrderObject.ChangeAmount = 0 - _OrderObject.ChangeAmount; _BackOrderObject.InvoicedAmount = 0 - _OrderObject.InvoicedAmount; _BackOrderObject.SyncStatus = 0; _BackOrderObject.PrintStatus = 0; _BackOrderObject.AddPoint = 0 - _OrderObject.AddPoint; _BackOrderObject.UploadStatus = 0; _BackOrderObject.UploadMessage = ""; _BackOrderObject.TicketId = ""; _BackOrderObject.OrgTradeNo = _OrderObject.TradeNo; _BackOrderObject.RefundCause = "用户申请退款"; //整单优惠 foreach (PromotionOrder promotion in _BackOrderObject.Promotions) { promotion.Id = IdWorkerUtils.Instance.NextId(); promotion.OrderId = _BackOrderObject.Id; promotion.TradeNo = _BackOrderObject.TradeNo; promotion.Amount = 0 - promotion.Amount; promotion.DiscountAmount = 0 - promotion.DiscountAmount; promotion.ReceivableAmount = 0 - promotion.ReceivableAmount; promotion.FinishDate = finishDate; } //====== 更新明细内容 foreach (OrderItem item in _BackOrderObject.Items) { item.Id = IdWorkerUtils.Instance.NextId(); item.OrderId = _BackOrderObject.Id; item.TradeNo = _BackOrderObject.TradeNo; //单品优惠 foreach (PromotionItem promotion in item.Promotions) { promotion.Id = IdWorkerUtils.Instance.NextId(); promotion.OrderId = _BackOrderObject.Id; promotion.ItemId = item.Id; promotion.TradeNo = _BackOrderObject.TradeNo; promotion.Amount = 0 - promotion.Amount; promotion.DiscountAmount = 0 - promotion.DiscountAmount; promotion.ReceivableAmount = 0 - promotion.ReceivableAmount; promotion.FinishDate = finishDate; } //做法信息 foreach (FlavorItem flavor in item.Flavors) { flavor.Id = IdWorkerUtils.Instance.NextId(); flavor.OrderId = _BackOrderObject.Id; flavor.ItemId = item.Id; flavor.TradeNo = _BackOrderObject.TradeNo; flavor.RefundQuantity = flavor.Quantity; flavor.Amount = 0 - flavor.Amount; flavor.Quantity = 0; flavor.DiscountAmount = 0 - flavor.DiscountAmount; flavor.FinishDate = finishDate; flavor.isBackTicket = true; } item.RefundQuantity = item.Quantity; item.Quantity = 0; item.Amount = 0 - item.Amount; item.FlavorAmount = 0 - item.FlavorAmount; item.FlavorDiscountAmount = 0 - item.FlavorDiscountAmount; item.FlavorReceivableAmount = 0 - item.FlavorReceivableAmount; item.TotalAmonut = 0 - item.TotalAmonut; item.SuitAddPrice = 0 - item.SuitAddPrice; item.SuitAmount = 0 - item.SuitAmount; item.SaleDate = finishDate; item.ChudaQty = 0; item.ChupinQty = 0; item.ChuxianQty = 0; item.KdsChupinQty = 0; item.FinishDate = finishDate; } //支付方式遍历 foreach (PayItem pay in _BackOrderObject.Pays) { pay.Id = IdWorkerUtils.Instance.NextId(); pay.TradeNo = _BackOrderObject.TradeNo; pay.PayNo = OrderUtils.Instance.GeneratePayNo(); pay.OrderId = _BackOrderObject.Id; pay.Amount = 0 - pay.Amount; pay.PaidAmount = 0 - pay.PaidAmount; pay.ChangeAmount = 0 - pay.ChangeAmount; pay.PayTime = finishDate; pay.FinishDate = finishDate; pay.OverAmount = 0 - pay.OverAmount; pay.ShiftName = _BackOrderObject.ShiftName; pay.ShiftNo = _BackOrderObject.ShiftNo; #region subin 20231003 注释修改 //注释 //zhangy 2020-02-18 Add 档口结算信息赋默认值 //pay.Ext1 = "0"; //pay.Ext2 = "0"; //修改 pay.Ext1 = string.IsNullOrEmpty(pay.Ext1) ? "0" : pay.Ext1; pay.Ext2 = string.IsNullOrEmpty(pay.Ext2) ? "0" : pay.Ext2; #endregion var payMode = OrderUtils.GetPayMode(pay.No); if (payMode == null) { pay.IncomeFlag = 1; pay.OtherRateType = 0; pay.OtherRateValue = 0.00M; } else { pay.IncomeFlag = payMode.IncomeFlag; pay.OtherRateType = payMode.OtherRateType; pay.OtherRateValue = 0 - payMode.OtherRateValue; //zhangy 2020-02-20 Add,退单,扣率金额也退 pay.Ext2 = string.IsNullOrEmpty(pay.Ext2) ? "0" : ("-" + pay.Ext2); } } var isException = OrderUtils.Instance.SaveOrderObject(_BackOrderObject); if (!isException) { _OrderObject.OrgTradeNo = _BackOrderObject.TradeNo; using (var db = Global.Instance.OpenDataBase) { using (var trans = db.GetTransaction()) { db.Update(_OrderObject); WxWaimaiOrder wxWaimaiOrder = db.FirstOrDefault("where ticketNo =@0;", tradeNo); //如果是外卖模式 //如果是外卖订单,存储配送信息 if (wxWaimaiOrder != null) { WxWaimaiOrder wxBackWaimaiOrder = new WxWaimaiOrder(); wxWaimaiOrder.Id = IdWorkerUtils.Instance.NextId(); wxWaimaiOrder.TenantId = wxWaimaiOrder.TenantId; wxWaimaiOrder.TicketNo = _OrderObject.TradeNo; wxWaimaiOrder.StoreId = _OrderObject.StoreId; wxWaimaiOrder.StoreNo = _OrderObject.StoreNo; wxWaimaiOrder.StoreName = _OrderObject.StoreName; wxWaimaiOrder.WorkerNo = _OrderObject.WorkerNo; wxWaimaiOrder.ShiftId = Global.Instance.BusinessPlanLog.PlanId; wxWaimaiOrder.ShiftNo = Global.Instance.BusinessPlanLog.No; wxWaimaiOrder.ReceiveName = wxWaimaiOrder.ReceiveName; wxWaimaiOrder.ReceiveMobile = wxWaimaiOrder.ReceiveMobile; wxWaimaiOrder.ReceiveAddress = wxWaimaiOrder.ReceiveAddress; wxWaimaiOrder.DistributionFee = wxWaimaiOrder.DistributionFee; wxWaimaiOrder.Type = 1; wxWaimaiOrder.IsIncome = 1; wxWaimaiOrder.Status = 1; wxWaimaiOrder.CreateDate = _OrderObject.FinishDate; wxWaimaiOrder.CreateUser = _OrderObject.CreateUser; db.Insert(wxWaimaiOrder); } trans.Complete(); } } return new Tuple(true, "退单完成"); } else { return new Tuple(false, "退单保存失败!"); } } else { return new Tuple(false, "获取订单信息异常"); } } catch (Exception ex) { LOGGET.Error(ex, "退单发生异常"); return new Tuple(false, "退单发生异常"); } } #region subin 20230916 新增小程序订单保存分账明细 public static Tuple DoSplitOrderBefore(OrderObject _orderdata) { using (var db = Global.Instance.OpenDataBase) { try { var splitPayLst = db.Query($"where busNo='{_orderdata.TradeNo}'"); if (splitPayLst.Count() > 0) { LOGGET.Info("分账信息已存在,不需要分账"); } else { return DoSplitOrder(_orderdata); } } catch (Exception ex) { new Tuple(false, $"订单补打保存分账明细错误:{ex.Message}"); } } return new Tuple(true, ""); } public static Tuple DoSplitOrder(OrderObject _orderdata) { LOGGET.Info("开始保存订单的分账信息"); var productIds = ""; var splitStorePayLst = new List(); using (var db = Global.Instance.OpenDataBase) { var _orderObject = OrderUtils.getOrderObjectByTranNo(_orderdata.TradeNo); if (_orderObject != null) { try { var splitShopList = db.Fetch(); var splitFoodList = new List(); var productIdList = _orderObject.Items.Select(item => item.ProductId.Trim()).Distinct(); if (productIdList != null && productIdList.Count() > 0) { productIds = string.Join(",", productIdList); splitFoodList = db.Query($"where goodId in ('{productIds.Replace(",", "','")}');").ToList(); } int i = 0; foreach (var pay in _orderObject.Pays) { foreach (var item in _orderObject.Items) { var s = splitFoodList.FirstOrDefault(m => m.ProductId == item.ProductId); if (s != null) { var _fromBizUser = splitShopList.FirstOrDefault(m => m.Id == s.ShopId.Trim()); var _fromBizUserId = _fromBizUser != null ? _fromBizUser.BizUserId : ""; var ssp = new SplitStorePay { Id = IdWorkerUtils.Instance.NextId(), ClientId = "", ProgramId = "", TenantId = item.TenantId, StoreId = _orderObject.StoreId, SplitStoreId = s.ShopId, StoreNo = _orderObject.StoreNo, PayNo = pay.PayNo, TicketId = "", BusNo = pay.TradeNo, PayTypeNo = pay.No, PayType = pay.Name, Paid = item.TotalReceivableAmount, Rchange = 0, Money = item.TotalReceivableAmount, OverAmount = 0, VoucherNo = pay.TradeVoucherNo, PayDate = pay.PayTime, CardNo = pay.CardNo, IncomeFlag = pay.IncomeFlag, OtherRateType = pay.OtherRateType, OtherRateValue = pay.OtherRateValue, OtherRate = pay.OtherRate, PayClientType = -1, PayChannel = (int)pay.PayChannel, DeductionRate = 0, ChargeBack = 0, Memo = _orderObject.Ext1, IsInvalid = "0", OrderId = _orderObject.Id, PayId = pay.Id, SyncStatus = 0, UploadErrors = 0, UploadStatus = 0, UploadMessage = "", ProductId = item.ProductId, OrderItemId = item.Id, PayItemId = "", RefundAmount = 0, //FromBizUserld = JsonUtils.Deserialize(Global.Instance.Worker.StoreInfo.Ext1).BizUserId, FromBizUserld = _fromBizUserId, OrderType = (int)_orderObject.OrderType, IsRefund = 0, RefundQuantity = 0, fee = 0 }; if (i == 0) { ssp.fee = string.IsNullOrEmpty(pay.Ext2) ? 0 : Convert.ToDecimal(pay.Ext2); } splitStorePayLst.Add(ssp); } i++; } } if (splitStorePayLst.Count() > 0) { db.InsertBatch(splitStorePayLst); //LOGGET.Info($"保存订单的分账信息:{JsonUtils.Serialize(splitStorePayLst)}"); LOGGET.Info("有需要上传的营业分账数据,isHaveUpLoadSplitPay = true"); Global.isHaveUpLoadSplitPay = true; } else { LOGGET.Info($"订单[{_orderObject.TradeNo}],没有要分账的菜品信息,将不保存分账信息。"); } } catch (Exception ex) { LOGGET.Error(ex, $"保存订单的分账信息异常,单号ID:{_orderObject.Id}"); return new Tuple(false, "退单保存失败!"); } } else { return new Tuple(false, "未查询到订单信息"); } } LOGGET.Info("结束保存订单的分账信息"); return new Tuple(true, ""); } #endregion } public enum ProgramOrderOperationType { /// /// 接单 /// Confirm = 0, /// /// 拒单 /// Refuse = 1, /// /// 同意退款 /// Refund = 2, /// /// 拒绝退款 /// NotRefund = 3 } }