You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2396 lines
116 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
/// <summary>
/// 加载小程序门店商品信息
/// zhangy 2020-03-03 Add
/// </summary>
/// <param name="programId"></param>
/// <param name="storeId"></param>
public Tuple<bool, string, EntityResponse<ProgramProductObject>> GetProduct(string programId, string storeId)
{
Tuple<bool, string, EntityResponse<ProgramProductObject>> result = null;
try
{
OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business);
SortedList<string, string> parameters = OpenApiUtils.Instance.NewParameters(api);
parameters.Add("method", "program.product");
parameters.Add("programId", programId);
parameters.Add("storeId", storeId);
var ignoreParameters = new List<string>();
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<EntityResponse<ProgramProductObject>>(response);
if (data.Status == 1)
{
result = new Tuple<bool, string, EntityResponse<ProgramProductObject>>(true, data.Message, data);
}
else
{
result = new Tuple<bool, string, EntityResponse<ProgramProductObject>>(false, data.ErrMessage, null);
}
}
else
{
var _errorMessage = PaserErrors(response);
result = new Tuple<bool, string, EntityResponse<ProgramProductObject>>(false, _errorMessage, null);
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "小程序门店商品资料异常");
result = new Tuple<bool, string, EntityResponse<ProgramProductObject>>(false, ex.Message, null);
}
return result;
}
/// <summary>
/// 小程序商品开卖
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public Tuple<bool, string, EntityResponse<string>> ProductSalein(ProgramProductSaleinRequest request)
{
Tuple<bool, string, EntityResponse<string>> result = null;
try
{
OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business);
SortedList<string, string> 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<string>();
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<EntityResponse<string>>(response);
if (data.Status == 1)
{
result = new Tuple<bool, string, EntityResponse<string>>(true, data.Message, data);
}
else
{
result = new Tuple<bool, string, EntityResponse<string>>(false, data.ErrMessage, null);
}
}
else
{
var errorMessage = PaserErrors(response);
result = new Tuple<bool, string, EntityResponse<string>>(false, errorMessage, null);
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "小程序商品开卖异常");
result = new Tuple<bool, string, EntityResponse<string>>(false, "小程序商品开卖异常,本次操作无效", null);
}
return result;
}
/// <summary>
/// 小程序商品停售
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public Tuple<bool, string, EntityResponse<string>> ProductSaleout(ProgramProductSaleoutRequest request)
{
Tuple<bool, string, EntityResponse<string>> result = null;
try
{
OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business);
SortedList<string, string> 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<string>();
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<EntityResponse<string>>(response);
if (data.Status == 1)
{
result = new Tuple<bool, string, EntityResponse<string>>(true, data.Message, data);
}
else
{
result = new Tuple<bool, string, EntityResponse<string>>(false, data.ErrMessage, null);
}
}
else
{
var errorMessage = PaserErrors(response);
result = new Tuple<bool, string, EntityResponse<string>>(false, errorMessage, null);
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "小程序商品开卖异常");
result = new Tuple<bool, string, EntityResponse<string>>(false, "小程序商品开卖异常,本次操作无效", null);
}
return result;
}
/// <summary>
/// 门店信息
/// </summary>
private Tuple<bool, string, StockEntityResponse<ProgramStoreDetailData>> Program_Store_Detail(string request)
{
Tuple<bool, string, StockEntityResponse<ProgramStoreDetailData>> result = null;
try
{
OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business);
SortedList<string, string> parameters = OpenApiUtils.Instance.NewParameters(api);
parameters.Add("method", "program.store.detail");
parameters.Add("storeId", request);
var ignoreParameters = new List<string>();
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<StockEntityResponse<ProgramStoreDetailData>>(response);
if (data.Status == 1)
{
result = new Tuple<bool, string, StockEntityResponse<ProgramStoreDetailData>>(true, data.Message, data);
}
else
{
result = new Tuple<bool, string, StockEntityResponse<ProgramStoreDetailData>>(false, data.ErrMessage, data);
}
}
else
{
var _errorMessage = PaserErrors(response);
result = new Tuple<bool, string, StockEntityResponse<ProgramStoreDetailData>>(false, _errorMessage, null);
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "小程序点餐_门店信息");
result = new Tuple<bool, string, StockEntityResponse<ProgramStoreDetailData>>(false, "小程序点餐_门店信息,请检测网络连接", null);
}
return result;
}
/// <summary>
/// 门店停业 \ 开业
/// </summary>
///
private Tuple<bool, string, StockEntityResponse<ProgramStoreStopData>> Program_Store_Stop_Open(bool _isopen, string request)
{
Tuple<bool, string, StockEntityResponse<ProgramStoreStopData>> result = null;
try
{
OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business);
SortedList<string, string> 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<string>();
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<StockEntityResponse<ProgramStoreStopData>>(response);
if (data.Status == 1)
{
result = new Tuple<bool, string, StockEntityResponse<ProgramStoreStopData>>(true, data.Message, data);
}
else
{
result = new Tuple<bool, string, StockEntityResponse<ProgramStoreStopData>>(false, data.ErrMessage, data);
}
}
else
{
var _errorMessage = PaserErrors(response);
result = new Tuple<bool, string, StockEntityResponse<ProgramStoreStopData>>(false, _errorMessage, null);
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "小程序点餐_门店开停业");
result = new Tuple<bool, string, StockEntityResponse<ProgramStoreStopData>>(false, "小程序点餐_门店开停业,请检测网络连接", null);
}
return result;
}
/// <summary>
/// 门店开业
/// </summary>
[Obsolete("冗余接口")]
private Tuple<bool, string, StockEntityResponse<ProgramStoreStopData>> Program_Store_Open(string request)
{
Tuple<bool, string, StockEntityResponse<ProgramStoreStopData>> result = null;
try
{
OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business);
SortedList<string, string> parameters = OpenApiUtils.Instance.NewParameters(api);
parameters.Add("method", "program.store.open");
parameters.Add("storeId", request);
var ignoreParameters = new List<string>();
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<StockEntityResponse<ProgramStoreStopData>>(response);
if (data.Status == 1)
{
result = new Tuple<bool, string, StockEntityResponse<ProgramStoreStopData>>(true, data.Message, data);
}
else
{
result = new Tuple<bool, string, StockEntityResponse<ProgramStoreStopData>>(false, data.ErrMessage, data);
}
}
else
{
var _errorMessage = PaserErrors(response);
result = new Tuple<bool, string, StockEntityResponse<ProgramStoreStopData>>(false, _errorMessage, null);
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "小程序点餐_门店开业");
result = new Tuple<bool, string, StockEntityResponse<ProgramStoreStopData>>(false, "小程序点餐_门店开业,请检测网络连接", null);
}
return result;
}
/// <summary>
/// 配送同步信息
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public Tuple<bool, string, EntityResponse<string>> Program_Order_Dispatch_Sync(string storeId, string busNo)
{
Tuple<bool, string, EntityResponse<string>> result = null;
try
{
OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business);
SortedList<string, string> parameters = OpenApiUtils.Instance.NewParameters(api);
parameters.Add("method", "program.order.dispatch.sync");
parameters.Add("storeId", storeId);
parameters.Add("busNo", busNo);
var ignoreParameters = new List<string>();
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<EntityResponse<string>>(response);
if (data.Status == 1)
{
result = new Tuple<bool, string, EntityResponse<string>>(true, data.Message, data);
}
else
{
result = new Tuple<bool, string, EntityResponse<string>>(false, string.IsNullOrEmpty(data.ErrMessage) ? data.Message : data.ErrMessage, null);
}
}
else
{
var errorMessage = PaserErrors(response);
result = new Tuple<bool, string, EntityResponse<string>>(false, errorMessage, null);
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "物流同步订单异常");
result = new Tuple<bool, string, EntityResponse<string>>(false, "物流同步订单异常,本次操作无效", null);
}
return result;
}
/// <summary>
/// 配送信息
/// </summary>
public Tuple<bool, string, StockEntityResponse<ProgramOrderDeliveryQueryData>> Program_Order_Delivery_Query(string storeId, string busNo)
{
Tuple<bool, string, StockEntityResponse<ProgramOrderDeliveryQueryData>> result = null;
try
{
OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business);
SortedList<string, string> parameters = OpenApiUtils.Instance.NewParameters(api);
parameters.Add("method", "program.order.delivery.query");
parameters.Add("storeId", storeId);
parameters.Add("busNo", busNo);
var ignoreParameters = new List<string>();
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<StockEntityResponse<ProgramOrderDeliveryQueryData>>(response);
if (data.Status == 1)
{
result = new Tuple<bool, string, StockEntityResponse<ProgramOrderDeliveryQueryData>>(true, data.Message, data);
}
else
{
result = new Tuple<bool, string, StockEntityResponse<ProgramOrderDeliveryQueryData>>(false, data.ErrMessage, null);
}
}
else
{
var _errorMessage = PaserErrors(response);
result = new Tuple<bool, string, StockEntityResponse<ProgramOrderDeliveryQueryData>>(false, _errorMessage, null);
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "小程序点餐_配送信息");
result = new Tuple<bool, string, StockEntityResponse<ProgramOrderDeliveryQueryData>>(false, ",请检测门店网络连接", null);
}
return result;
}
/// <summary>
/// 订单详情
/// </summary>
private Tuple<bool, string, StockEntityResponse<ProgramOrderQueryBybusnoData>> Program_Order_Query_Bybusno(string storeId, string busNo)
{
Tuple<bool, string, StockEntityResponse<ProgramOrderQueryBybusnoData>> result = null;
try
{
OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business);
SortedList<string, string> parameters = OpenApiUtils.Instance.NewParameters(api);
parameters.Add("method", "program.order.query.bybusno");
parameters.Add("storeId", storeId);
parameters.Add("busNo", busNo);
var ignoreParameters = new List<string>();
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<StockEntityResponse<ProgramOrderQueryBybusnoData>>(response);
if (data.Status == 1)
{
result = new Tuple<bool, string, StockEntityResponse<ProgramOrderQueryBybusnoData>>(true, data.Message, data);
}
else
{
result = new Tuple<bool, string, StockEntityResponse<ProgramOrderQueryBybusnoData>>(false, data.ErrMessage, null);
//zhangy 2020-03-01 Edit 注释以下代码
//result = new Tuple<bool, string, StockEntityResponse<ProgramOrderQueryBybusnoData>>(false, data.ErrMessage, data);
}
}
else
{
var _errorMessage = PaserErrors(response);
result = new Tuple<bool, string, StockEntityResponse<ProgramOrderQueryBybusnoData>>(false, _errorMessage, null);
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "小程序点餐_订单详情_异常");
result = new Tuple<bool, string, StockEntityResponse<ProgramOrderQueryBybusnoData>>(false, "小程序点餐_订单详情,请检测网络连接", null);
}
return result;
}
/// <summary>
/// 订单接单\拒单\同意退款\拒绝退款
/// </summary>
private Tuple<bool, string, StockEntityResponse<ProgramOrderConfirmData>> Program_Order_Confirm(ProgramOrderOperationType orderOperationType, string storeId, string busNo)
{
Tuple<bool, string, StockEntityResponse<ProgramOrderConfirmData>> result = null;
try
{
OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business);
SortedList<string, string> 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<string>();
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<StockEntityResponse<ProgramOrderConfirmData>>(response);
if (data.Status == 1)
{
result = new Tuple<bool, string, StockEntityResponse<ProgramOrderConfirmData>>(true, data.Message, data);
}
else
{
result = new Tuple<bool, string, StockEntityResponse<ProgramOrderConfirmData>>(false, data.Message, null);
}
}
else
{
var _errorMessage = PaserErrors(response);
result = new Tuple<bool, string, StockEntityResponse<ProgramOrderConfirmData>>(false, _errorMessage, null);
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "小程序点餐_订单接单");
result = new Tuple<bool, string, StockEntityResponse<ProgramOrderConfirmData>>(false, "小程序点餐_订单接单,请检测网络连接", null);
}
return result;
}
/// <summary>
/// 订单列表
/// </summary>
private Tuple<bool, string, StockPagerResponse<ProgramHandleOrderData>> Program_Handle_Order(bool _isHandle, ProgramHandleOrderRequestData request)
{
Tuple<bool, string, StockPagerResponse<ProgramHandleOrderData>> result = null;
try
{
OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business);
SortedList<string, string> parameters = OpenApiUtils.Instance.NewParameters(api);
if (_isHandle)
{
parameters.Add("method", "program.handle.order");
parameters.Add("storeId", request.Storeid);
var ignoreParameters = new List<string>();
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<string>();
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<StockPagerResponse<ProgramHandleOrderData>>(response);
if (data.Status == 1)
{
result = new Tuple<bool, string, StockPagerResponse<ProgramHandleOrderData>>(true, data.Message, data);
}
else
{
result = new Tuple<bool, string, StockPagerResponse<ProgramHandleOrderData>>(false, data.ErrMessage, null);
}
}
else
{
var _errorMessage = PaserErrors(response);
result = new Tuple<bool, string, StockPagerResponse<ProgramHandleOrderData>>(false, _errorMessage, null);
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "小程序点餐_订单列表");
result = new Tuple<bool, string, StockPagerResponse<ProgramHandleOrderData>>(false, "小程序点餐_订单列表 , 请检测网络连接", null);
}
return result;
}
#endregion
/// <summary>
/// 门店信息
/// </summary>
public Tuple<bool, string, ProgramStoreDetailData> GetShopInfo()
{
Tuple<bool, string, ProgramStoreDetailData> tuple = new Tuple<bool, string, ProgramStoreDetailData>(false, "", null);
try
{
var _data = this.Program_Store_Detail(Global.Instance.Authc.StoreId);
if (_data != null && _data.Item1)
{
return new Tuple<bool, string, ProgramStoreDetailData>(_data.Item1, _data.Item2, _data.Item3.Data);
}
else
{
return new Tuple<bool, string, ProgramStoreDetailData>(false, _data.Item2, null);
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "获取小程序门店信息异常");
return new Tuple<bool, string, ProgramStoreDetailData>(false, ex.Message, null);
}
}
/// <summary>
/// 开业\歇业
/// </summary>
/// <param name="_open">是否开业</param>
/// <returns></returns>
public Tuple<bool, string, ProgramStoreStopData> SetStoreStopAndOpen(bool _open)
{
try
{
var _data = this.Program_Store_Stop_Open(_open, Global.Instance.Authc.StoreId);
if (_data != null && _data.Item1)
{
return new Tuple<bool, string, ProgramStoreStopData>(_data.Item1, _data.Item2, _data.Item3.Data);
}
else
{
return new Tuple<bool, string, ProgramStoreStopData>(_data.Item1, _data.Item2, null);
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "小程序门店开业歇业状态异常");
return new Tuple<bool, string, ProgramStoreStopData>(false, ex.Message, null);
}
}
/// <summary>
/// 根据单号查询订单
/// </summary>
/// <param name="busNo">订单号</param>
/// <returns></returns>
public Tuple<bool, string, ProgramOrderQueryBybusnoData> 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<bool, string, ProgramOrderQueryBybusnoData>(_data.Item1, _data.Item2, _data.Item3.Data);
}
else
{
return new Tuple<bool, string, ProgramOrderQueryBybusnoData>(_data.Item1, _data.Item2, null);
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "小程序订单查询异常");
return new Tuple<bool, string, ProgramOrderQueryBybusnoData>(false, "小程序订单查询出错", null);
}
}
/// <summary>
/// 查询订单
/// </summary>
/// <param name="_isHandle">是否待处理状态订单</param>
public Tuple<bool, string, StockPagerResponse<ProgramHandleOrderData>> 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<bool, string, StockPagerResponse<ProgramHandleOrderData>>(_data.Item1, _data.Item2, _data.Item3);
}
catch (Exception ex)
{
LOGGET.Error(ex, "查询小程序订单异常");
return new Tuple<bool, string, StockPagerResponse<ProgramHandleOrderData>>(false, ex.Message, null);
}
}
/// <summary>
/// 修改订单状态
/// </summary>
public Tuple<bool, string, ProgramOrderConfirmData> 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<bool, string, ProgramOrderConfirmData>(_data.Item1, _data.Item2, _data.Item3.Data);
}
else
{
return new Tuple<bool, string, ProgramOrderConfirmData>(_data.Item1, _data.Item2, null);
}
}
catch (Exception ex)
{
LOGGET.Info(ex, "修改订单状态异常");
return new Tuple<bool, string, ProgramOrderConfirmData>(false, ex.Message, null);
}
}
/// <summary>
/// 补单
/// </summary>
public Tuple<bool, string, string> ReplacementOrder(List<ProgramHandleOrderData> program)
{
//zhangy 2020-02-18 Add 订单保存数据库后要修改isHaveUpLoadTicket=true
bool isException = false;
try
{
if (program == null)
{
return new Tuple<bool, string, string>(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<OrderObject>(_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<bool, string, string>(true, " ", string.Format(_mess, count));
}
catch (Exception ex)
{
//有异常发生
isException = true;
LOGGET.Info(ex);
return new Tuple<bool, string, string>(false, ex.Message, "已成功补入 0 单");
}
finally
{
//没有异常发生
if (!isException)
{
//更新是否有订单需要上传的状态
Global.isHaveUpLoadTicket = true;
Global.isHaveBurdenTicket = true;
Global.isHaveCenterTicket = true;
}
}
}
public Tuple<bool, string, string> InsertOrder(OrderObject orderObject)
{
//zhangy 2020-02-18 Add 订单保存数据库后要修改isHaveUpLoadTicket=true
bool isException = false;
try
{
if (orderObject == null)
{
LOGGET.Error("补单传入的对象未空.....");
return new Tuple<bool, string, string>(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<OrderObject>(_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<bool, string, string>(true, "订单保存成功", "");
}
else
{
return new Tuple<bool, string, string>(false, "本地转单发生错误", "已成功补入 0 单");
}
}
else
{
return new Tuple<bool, string, string>(false, _JuWeiOrder.Item2, "已成功补入 0 单");
}
}
else
{
//LOGGET.Error("订单保存或者补单操作失败,原因:本地单号<" + orderObject.TradeNo + ">重复!,订单内容:" + JsonUtils.Serialize(orderObject));
LOGGET.Error("订单保存或者补单操作失败,原因:本地单号<" + orderObject.TradeNo + ">重复!");
return new Tuple<bool, string, string>(false, "订单保存失败", "已成功补入 0 单");
}
}
}
//subin 20230717 end
}
catch (Exception ex)
{
//有异常发生
isException = true;
LOGGET.Error(ex, "巨为小程序订单插入数据库异常");
return new Tuple<bool, string, string>(false, ex.Message, "已成功补入 0 单");
}
finally
{
//没有异常发生
if (!isException)
{
//更新是否有订单需要上传的状态
Global.isHaveUpLoadTicket = true;
Global.isHaveBurdenTicket = true;
Global.isHaveCenterTicket = true;
}
}
}
/// <summary>
/// 数据转换
/// </summary>
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<OrderItem>();
var map = new ObservableCollection<OrderItem>();
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<ProductExt> productList = db.Fetch<ProductExt>(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<PromotionItem>();
}
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<PromotionOrder>();
// }
// //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<FlavorItem> flavors = new List<FlavorItem>();
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 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<OrderItem> 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<PayItem>();
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;
}
}
/// <summary>
/// 小票打印
/// </summary>
public static Tuple<bool, string, string> 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<bool, string, string>(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<bool, string, string>(true, "", "");
}
/// <summary>
/// 巨为微信小程序接单
/// </summary>
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<Dictionary<string, string>>(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>(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<OrderObject>(_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>(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<bool, string> DoRefund(string tradeNo)
{
try
{
OrderObject _OrderObject = OrderUtils.getOrderObjectByTranNo(tradeNo);
if (_OrderObject != null)
{
if (_OrderObject.OrgTradeNo != null && !"".Equals(_OrderObject.OrgTradeNo))
{
return new Tuple<bool, string>(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<WxWaimaiOrder>("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>(wxWaimaiOrder);
}
trans.Complete();
}
}
return new Tuple<bool, string>(true, "退单完成");
}
else
{
return new Tuple<bool, string>(false, "退单保存失败!");
}
}
else
{
return new Tuple<bool, string>(false, "获取订单信息异常");
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "退单发生异常");
return new Tuple<bool, string>(false, "退单发生异常");
}
}
#region subin 20230916 新增小程序订单保存分账明细
public static Tuple<bool, string> DoSplitOrderBefore(OrderObject _orderdata)
{
using (var db = Global.Instance.OpenDataBase)
{
try
{
var splitPayLst = db.Query<SplitStorePay>($"where busNo='{_orderdata.TradeNo}'");
if (splitPayLst.Count() > 0)
{
LOGGET.Info("分账信息已存在,不需要分账");
}
else
{
return DoSplitOrder(_orderdata);
}
}
catch (Exception ex)
{
new Tuple<bool, string>(false, $"订单补打保存分账明细错误:{ex.Message}");
}
}
return new Tuple<bool, string>(true, "");
}
public static Tuple<bool, string> DoSplitOrder(OrderObject _orderdata)
{
LOGGET.Info("开始保存订单的分账信息");
var productIds = "";
var splitStorePayLst = new List<SplitStorePay>();
using (var db = Global.Instance.OpenDataBase)
{
var _orderObject = OrderUtils.getOrderObjectByTranNo(_orderdata.TradeNo);
if (_orderObject != null)
{
try
{
var splitShopList = db.Fetch<SplitShopAccount>();
var splitFoodList = new List<SplitFoodAccount>();
var productIdList = _orderObject.Items.Select(item => item.ProductId.Trim()).Distinct();
if (productIdList != null && productIdList.Count() > 0)
{
productIds = string.Join(",", productIdList);
splitFoodList = db.Query<SplitFoodAccount>($"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<StoreAllinParams>(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<SplitStorePay>(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<bool, string>(false, "退单保存失败!");
}
}
else
{
return new Tuple<bool, string>(false, "未查询到订单信息");
}
}
LOGGET.Info("结束保存订单的分账信息");
return new Tuple<bool, string>(true, "");
}
#endregion
}
public enum ProgramOrderOperationType
{
/// <summary>
/// 接单
/// </summary>
Confirm = 0,
/// <summary>
/// 拒单
/// </summary>
Refuse = 1,
/// <summary>
/// 同意退款
/// </summary>
Refund = 2,
/// <summary>
/// 拒绝退款
/// </summary>
NotRefund = 3
}
}