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#

9 months ago
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);
}
9 months ago
}
#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);
9 months ago
//获取成功
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));
9 months ago
string response = HttpClientUtils.PostAsync(api, api.Url, parameters);
//LOGGET.Info("小程序点餐_门店开停业_接收:" + _isopen + response);
9 months ago
//获取成功
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);
9 months ago
//获取成功
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);
9 months ago
//获取成功
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);
9 months ago
//获取成功
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);
9 months ago
//获取成功
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);
9 months ago
//获取成功
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);
2 months ago
if (_data != null && _data.Item1 == false)
{
if (_data.Item2.Equals("小程序点餐_订单详情,请检测网络连接"))
{
LOGGET.Info($"第三次小程序订单查询<{busNo}>");
_data = this.Program_Order_Query_Bybusno(Global.Instance.Authc.StoreId, busNo);
}
}
}
}
9 months ago
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);
2 months ago
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);
}
}
}
}
9 months ago
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 + ">重复!");
9 months ago
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;
}
2 months ago
//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);
}
9 months ago
//通知厨显
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");
}
9 months ago
try
{
LOGGET.Info("巨为微信小程序接单开始");
9 months ago
//微信小程序订单是否开启自动接单
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}");
9 months ago
var _len = orderIds.Length;
foreach (var item in orderIds)
{
LOGGET.Info($"巨为小程序订单进入自动接单<{item}>开始");
9 months ago
if (string.IsNullOrEmpty(item))
{
LOGGET.Info("订单编号为空,忽略");
continue;
}
// 播放声音
#region 播放声音
//SoundUtils.PlaySound("weixin");
//LOGGET.Info($"巨为小程序订单<{item}>播放声音,通知自动接单");
9 months ago
//20240129 subin 改为异步播放
Task.Factory.StartNew(() =>
{
SoundUtils.PlaySound("weixin");
LOGGET.Info($"巨为小程序订单<{item}>播放声音,通知自动接单");
2 months ago
});
#endregion
9 months ago
//请求接口查询订单
LOGGET.Info($"巨为小程序请求接口查询订单<{item}>");
9 months ago
var _order = _juWeiAppOrderProxy.GetOrder(item);
2 months ago
LOGGET.Info($"巨为小程序请求接口查询订单<{item}>,返回结果:{JsonUtils.Serialize(_order)}");
9 months ago
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;
}
2 months ago
9 months ago
//请求接口修改订单状态
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);
2 months ago
LOGGET.Info($"巨为小程序自动接单,开始组装数据<{item}>,返回结果:{JsonUtils.Serialize(_orderdata)}");
9 months ago
if (_orderdata != null)
{
LOGGET.Info("巨为小程序自动接单,开始保存数据....");
var _intder = _juWeiAppOrderProxy.InsertOrder(_orderdata);
if (_intder.Item1)
{
#region 打印小票
LOGGET.Info($"巨为小程序自动接单<{item}>,数据保存成功,开始打印小票....");
//JuWeiAppOrderProxy.PrintOrder(_orderdata);
9 months ago
2 months ago
//20240129 subin 改为异步打印
Task.Factory.StartNew(() =>
{
JuWeiAppOrderProxy.PrintOrder(_orderdata);
2 months ago
});
#endregion
9 months ago
#region subin 20230916 订单保存成功后处理分账明细
//LOGGET.Info("巨为小程序自动接单,数据保存成功,开始保存分账明细....");
9 months ago
//JuWeiAppOrderProxy.DoSplitOrder(_orderdata);
//Task.Factory.StartNew(() =>
//{
// SplitPayUtils.Instance.SaveSplitPayInfo(_orderdata);
//});
#endregion
2 months ago
#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
9 months ago
}
else
{
LOGGET.Error("巨为小程序自动接单,数据保存失败,订单号:<{0}>", item);
}
}
else
{
LOGGET.Info("巨为小程序自动接单,数据转单失败....");
}
}
else
{
LOGGET.Error("获取订单操作失败:[" + _order.Item2 + "]");
}
Thread.Sleep(100);
LOGGET.Info($"巨为小程序订单进入自动接单<{item}>结束");
9 months ago
}
}
}
else
{
LOGGET.Error("巨为小程序订单已经超过15分钟视为无效推送信息:" + message);
}
}
}
catch (Exception ex)
{
LOGGET.Error(ex, "巨为小程序自动接单发生异常");
}
LOGGET.Info("巨为微信小程序接单结束");
9 months ago
}
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)}");
9 months ago
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
}
}