using System;
|
using System.Collections.Generic;
|
using System.Text;
|
using AlibabaSDK.Api;
|
using AlibabaSDK.Request;
|
using CommonUtil;
|
using DbAccess;
|
using Operater.DAL;
|
using Operater.DbModel;
|
using Operater.DTO.TopMessage;
|
using Operater.Service.System;
|
using YouZanSDKStandard.Api;
|
using YouZanSDKStandard.Api.Domain;
|
using YouZanSDKStandard.Api.Request;
|
|
namespace TradeInterflow.Handle
|
{
|
/// <summary>
|
/// 有赞订单处理
|
/// </summary>
|
///
|
public class YzTradeHandle
|
{
|
private static string _logName = "有赞订单处理error";
|
public static ISysSqlHelper dbMain = SysSqlHelper.CreateSqlHelper("db_main");
|
public static void HandleExecute(string message)
|
{
|
try
|
{
|
YouZanMsgModel yzMsgModel = JSONUtil.JsonToObject<YouZanMsgModel>(message);
|
string tradeBody = yzMsgModel.msg.ToUrlDecode();
|
switch (yzMsgModel.type)
|
{
|
case "trade_TradeCreate"://交易创建
|
Console.WriteLine("【有赞】订单创建");
|
TradeCreate(yzMsgModel.id);
|
break;
|
case "trade_TradeBuyerPay":
|
Console.WriteLine("【有赞】买家付款(即商家待发货)");
|
TradeDetailResult tradeInfo = JSONUtil.JsonToObject<TradeDetailResult>(tradeBody);
|
TradeStatusUp(yzMsgModel.id, "WAIT_SELLER_SEND_GOODS", "待发货", tradeInfo.full_order_info.order_info.update_time);
|
break;
|
case "trade_TradeSellerShip":
|
Console.WriteLine("【有赞】卖家发货");
|
TradeStatusUpMsg ship_msg = JSONUtil.JsonToObject<TradeStatusUpMsg>(tradeBody);
|
TradeStatusUp(yzMsgModel.id, "WAIT_BUYER_CONFIRM_GOODS", "已发货", ship_msg.update_time);
|
break;
|
case "trade_TradeSuccess":
|
Console.WriteLine("【有赞】交易成功");
|
TradeStatusUpMsg success_msg = JSONUtil.JsonToObject<TradeStatusUpMsg>(tradeBody);
|
TradeStatusUp(yzMsgModel.id, "TRADE_SUCCESS", "已完成", success_msg.update_time);
|
break;
|
case "trade_TradeClose":
|
Console.WriteLine("【有赞】交易关闭");
|
TradeColse(tradeBody);
|
break;
|
case "trade_refund_BuyerCreated":
|
Console.WriteLine("【有赞】买家发起退款");
|
UpdateRefundStatus(tradeBody, "REFUND_WAIT_SELLER_AGREE");
|
break;
|
case "trade_refund_RefundBuyerReturnGoods":
|
Console.WriteLine("【有赞】买家退货给卖家");
|
UpdateRefundStatus(tradeBody, "REFUND_WAIT_SELLER_CONFIRM_GOODS");
|
break;
|
case "trade_refund_RefundSuccess":
|
Console.WriteLine("【有赞】买家退货成功(终态)");
|
UpdateRefundStatus(tradeBody, "REFUND_SUCCESS");
|
break;
|
case "trade_refund_RefundSellerAgree":
|
Console.WriteLine("【有赞】卖家同意退款(终态)");
|
UpdateRefundStatus(tradeBody, "REFUND_SUCCESS");
|
break;
|
case "trade_refund_RefundSellerRefuse":
|
Console.WriteLine("【有赞】卖家拒绝退款");
|
UpdateRefundStatus(tradeBody, "REFUND_SELLER_REFUSE_BUYER");
|
break;
|
case "trade_refund_RefundClosed":
|
Console.WriteLine("【有赞】买家取消退款");
|
UpdateRefundStatus(tradeBody, "REFUND_CANCLE");
|
break;
|
case "trade_refund_RefundSellerRefuseBuyerReturnGoods":
|
Console.WriteLine("【有赞】卖家拒绝退货");
|
UpdateRefundStatus(tradeBody, "SELLER_REFUSE_BUYER_RETURN_GOODS");
|
break;
|
case "trade_refund_RefundSellerAgreeReturnGoods":
|
Console.WriteLine("【有赞】卖家同意退款退货");
|
UpdateRefundStatus(tradeBody, "WAIT_BUYER_RETURN_GOODS");
|
break;
|
case "trade_refund_YouzanInterApplied":
|
Console.WriteLine("【有赞】买家申请客服介入");
|
//UpdateRefundStatus(tradeBody, "WAIT_BUYER_RETURN_GOODS");
|
break;
|
case "trade_refund_SysRefund":
|
Console.WriteLine("【有赞】一键退款/系统退款");
|
//UpdateRefundStatus(tradeBody, "WAIT_BUYER_RETURN_GOODS");
|
break;
|
case "trade_refund_RefundAgain":
|
Console.WriteLine("【有赞】买家再次发起退款");
|
UpdateRefundStatus(tradeBody, "WAIT_SELLER_AGREE");
|
break;
|
}
|
|
}
|
catch (Exception e)
|
{
|
LogUtil.Info("主线程错误:" + e.ToString(), _logName);
|
}
|
}
|
|
#region 补有赞订单
|
public static void BuHandleExecute(string message)
|
{
|
BuYzTradeMoedel msg = JSONUtil.JsonToObject<BuYzTradeMoedel>(message);
|
if (TradeUpdate(msg.Tid))
|
{//修改订单状态
|
YzTradeinfo yzTradeinfo = new YzTradeinfo()
|
{
|
Status = msg.Status,
|
StatusStr = msg.StatusStr,
|
UpdateTime = msg.UpdateTime
|
};
|
|
new YzTradeinfoDAL().Update(yzTradeinfo, i => new { i.Status, i.StatusStr, i.UpdateTime }, t => t.Tid == msg.Tid);
|
YzOrderinfo yzOrderinfo = new YzOrderinfo()
|
{
|
TradeStatus = msg.Status
|
};
|
new YzOrderinfoDAL().Update(yzOrderinfo, i => new { i.TradeStatus }, t => t.Tid == msg.Tid);
|
}
|
}
|
#endregion
|
|
#region 更新退货状态
|
private static void UpdateRefundStatus(string message, string status)
|
{
|
try
|
{
|
RefundBuerCreateMsg refundMsg = JSONUtil.JsonToObject<RefundBuerCreateMsg>(message);
|
RefundInDb(refundMsg, status);
|
|
}
|
catch (Exception e)
|
{
|
LogUtil.Info("主线程错误:" + e.ToString(), "更新退货状态");
|
}
|
}
|
|
#endregion
|
|
#region yz退款消息入库
|
|
//yz退款消息入库
|
private static bool RefundInDb(RefundBuerCreateMsg msg, string refundStatus)
|
{
|
var refund = new YzRefundDAL().GetById(msg.refund_id);
|
YzRefund yzRefund = new YzRefund()
|
{
|
RefundId = msg.refund_id,
|
YzOid = msg.oids,
|
YzTid = msg.tid,
|
RefundedFee = decimal.Parse(msg.refunded_fee),
|
RefundReason = msg.refund_reason,
|
RefundReasonDesc = msg.refund_reason_desc,
|
RefundType = msg.refund_type,
|
UpdateTime = Convert.ToDateTime(msg.update_time),
|
Version = msg.version.ToString(),
|
YzRefundStaus = refundStatus
|
};
|
yzRefund.RelationYzRefund = refundStatus == "REFUND_WAIT_SELLER_AGREE" ? 0 : refund.RelationYzRefund;
|
|
if (refund.IsNull() || refund.YzOid.IsNullOrEmpty())
|
{//新增
|
//获取1688订单关系
|
var relation = new TradeCreateRelationDAL().GetById(msg.oids);
|
if (!relation.IsNull() && !relation.YzOid.IsNullOrEmpty())
|
{
|
yzRefund.AliTid = relation.AliTid;
|
yzRefund.AliOid = relation.AliOid;
|
}
|
new YzRefundDAL().Insert(yzRefund);
|
}
|
else
|
{//修改
|
yzRefund.RelationYzRefund = refundStatus == "REFUND_WAIT_SELLER_CONFIRM_GOODS" ? 3 : refund.RelationYzRefund;
|
new YzRefundDAL().Update(yzRefund, i => new { i.RefundedFee, i.RefundReason, i.RefundReasonDesc, i.RefundType, i.YzRefundStaus, i.RelationYzRefund, i.UpdateTime, i.Version }, t => t.YzOid == msg.oids);
|
}
|
return true;
|
}
|
|
#endregion
|
|
#region 交易关闭
|
private static void TradeColse(string message)
|
{
|
try
|
{
|
TradeColseMsg tradeColseMsg = JSONUtil.JsonToObject<TradeColseMsg>(message);
|
if (TradeUpdate(tradeColseMsg.tid))
|
{
|
YzTradeinfo yzTradeinfo = new YzTradeinfo()
|
{
|
Status = "TRADE_CLOSED",
|
StatusStr = "已关闭",
|
UpdateTime = tradeColseMsg.update_time,
|
CloseType = tradeColseMsg.close_type
|
};
|
new YzTradeinfoDAL().Update(yzTradeinfo, i => new { i.Status, i.StatusStr, i.UpdateTime, i.CloseType }, t => t.Tid == tradeColseMsg.tid);
|
YzOrderinfo yzOrderinfo = new YzOrderinfo()
|
{
|
TradeStatus = "TRADE_CLOSED"
|
};
|
new YzOrderinfoDAL().Update(yzOrderinfo, i => new { i.TradeStatus }, t => t.Tid == tradeColseMsg.tid);
|
//判断是否已创建1688订单
|
var rela = new TradeRelationDAL().ListGet(t => t.YzTid == tradeColseMsg.tid && t.CreateStatus != 0);
|
if (rela.IsNull() || rela.Count == 0)
|
{
|
return;
|
}
|
//需要取消1688订单
|
foreach (var reTid in rela)
|
{
|
AlibabaTradeCancelRequest req = new AlibabaTradeCancelRequest()
|
{
|
webSite = "1688",
|
tradeID = reTid.AliTid,
|
cancelReason = "buyerCancel"
|
};
|
var rsp = AliabaClient.Execute(req, CommonHandle.GetAliToken());
|
if (rsp.IsNull() || !rsp.Success)
|
{
|
MessageNotify errmessageNotify = new MessageNotify()
|
{
|
Msg = $"有赞订单[{tradeColseMsg.tid}]交易取消,取消1688订单[{reTid.AliTid}]失败:" + (rsp.IsNull() ? "null" : rsp.ErrorMsg),
|
Mark = tradeColseMsg.tid
|
};
|
CommonHandle.RecorderMessage(errmessageNotify);
|
return;
|
}
|
MessageNotify messageNotify = new MessageNotify()
|
{
|
Msg = $"有赞订单[{tradeColseMsg.tid}]交易取消,取消1688订单[{reTid.AliTid}]成功!",
|
Mark = tradeColseMsg.tid
|
};
|
CommonHandle.RecorderMessage(messageNotify);
|
}
|
}
|
}
|
catch (Exception e)
|
{
|
LogUtil.Info("message:" + message + "----" + e.ToString(), "交易关闭");
|
}
|
}
|
|
#endregion
|
|
#region 修改订单状态
|
public static void TradeStatusUp(string tid, string status, string statusStr, DateTime upDateTime)
|
{
|
if (TradeUpdate(tid))
|
{//修改订单状态
|
YzTradeinfo yzTradeinfo = new YzTradeinfo()
|
{
|
Status = status,
|
StatusStr = statusStr,
|
UpdateTime = upDateTime
|
};
|
|
new YzTradeinfoDAL().Update(yzTradeinfo, i => new { i.Status, i.StatusStr, i.UpdateTime }, t => t.Tid == tid);
|
YzOrderinfo yzOrderinfo = new YzOrderinfo()
|
{
|
TradeStatus = status
|
};
|
new YzOrderinfoDAL().Update(yzOrderinfo, i => new { i.TradeStatus }, t => t.Tid == tid);
|
}
|
}
|
#endregion
|
|
#region 订单创建
|
public static void TradeCreate(string tid)
|
{
|
TradeUpdate(tid);
|
}
|
#endregion
|
|
#region 订单更新入库
|
private static bool TradeUpdate(string tid)
|
{
|
//先判断表里是否有订单数据
|
bool isExit = new YzTradeinfoDAL().IsExist(t => t.Tid == tid);
|
if (isExit)
|
{
|
return true;
|
}
|
//订单不存在 从接口获取
|
YouZanTradeDetailGetRequest yzDetail = new YouZanTradeDetailGetRequest()
|
{
|
tid = tid
|
};
|
var yzRsp = YouZanClient.Execute(yzDetail, CommonHandle.GetYzToken());
|
if (yzRsp.IsNull() || !yzRsp.success)
|
{
|
LogUtil.Info("获取有赞订单详情失败:" + tid + "--" + (yzRsp.IsNull() ? "null" : JSONUtil.ObjectToJson(yzRsp)), "有赞处理错误");
|
return false;
|
}
|
//有赞订单解密
|
YzDecryptInfo yzDecryptInfo = new TradeCreateService().DecryptTrade(yzRsp.data.full_order_info, CommonHandle.GetYzToken());
|
var orderInfo = yzRsp.data.full_order_info.order_info;
|
var tradeInfo = yzRsp.data;
|
YzTradeinfo yzTradeinfo = new YzTradeinfo()
|
{
|
Tid = orderInfo.tid,
|
CreateTime = orderInfo.created,
|
YzOpenId = tradeInfo.full_order_info.buyer_info.yz_open_id,
|
OuterUserId = tradeInfo.full_order_info.buyer_info.outer_user_id,
|
PayTime = orderInfo.pay_time,
|
CloseType = orderInfo.close_type,
|
ConfirmTime = orderInfo.confirm_time,
|
ConsignTime = orderInfo.consign_time,
|
ExpiredTime = orderInfo.expired_time,
|
ExpressType = orderInfo.express_type,
|
PayType = orderInfo.pay_type,
|
RefundState = orderInfo.refund_state,
|
Status = orderInfo.status,
|
StatusStr = orderInfo.status_str,
|
SuccessTime = orderInfo.success_time,
|
Type = orderInfo.type,
|
UpdateTime = orderInfo.update_time,
|
BuyerMessage = tradeInfo.full_order_info.remark_info.buyer_message,
|
TradeMemo = tradeInfo.full_order_info.remark_info.trade_memo,
|
Star = tradeInfo.full_order_info.remark_info.star,
|
BuyerPhone = yzDecryptInfo.BuyerPhone,
|
FansNickname = tradeInfo.full_order_info.buyer_info.fans_nickname,
|
FansId = tradeInfo.full_order_info.buyer_info.fans_id.ToString(),
|
DeliveryAddress = yzDecryptInfo.DeliveryAddress,
|
DeliveryCity = tradeInfo.full_order_info.address_info.delivery_city,
|
DeliveryDistrict = tradeInfo.full_order_info.address_info.delivery_district,
|
DeliveryPostalCode = tradeInfo.full_order_info.address_info.delivery_postal_code,
|
DeliveryProvince = tradeInfo.full_order_info.address_info.delivery_province,
|
ReceiverName = yzDecryptInfo.ReceiverName,
|
ReceiverTel = yzDecryptInfo.ReceiverTel,
|
PayTypeStr = orderInfo.pay_type_str,
|
Payment = PriceTran(tradeInfo.full_order_info.pay_info.payment),
|
RealPay = PriceTran(tradeInfo.full_order_info.pay_info.real_payment),
|
PostFee = PriceTran(tradeInfo.full_order_info.pay_info.post_fee),
|
TotalFee = PriceTran(tradeInfo.full_order_info.pay_info.total_fee),
|
AdjustFee = PriceTran(tradeInfo.order_promotion.adjust_fee),
|
};
|
//子订单数据
|
List<YzOrderinfo> oidList = new List<YzOrderinfo>();
|
foreach (var oid in tradeInfo.full_order_info.orders)
|
{
|
decimal payment = oid.payment.IsNullOrEmpty() ? 0 : decimal.Parse(oid.payment);
|
YzOrderinfo yzOrderinfo = new YzOrderinfo()
|
{
|
Oid = oid.oid,
|
Tid = orderInfo.tid,
|
ItemId = oid.item_id.ToString(),
|
IsPreSale = oid.is_pre_sale,
|
Price = decimal.Parse(oid.price),
|
Title = oid.title,
|
SkuNo = oid.sku_no,
|
ItemNo = oid.item_no,
|
TariffRule = oid.tariff_rule,
|
Payment = PriceTran(oid.payment),
|
FenxiaoDiscountPrice = PriceTran(oid.fenxiao_discount_price),
|
ItemProps = oid.item_props,
|
IsPresent = oid.is_present ? 1 : 0,
|
ItemType = oid.item_type,
|
OuterItemId = oid.outer_item_id,
|
OuterSkuId = oid.outer_sku_id,
|
TotalFee = PriceTran(oid.total_fee),
|
SkuId = oid.sku_id.ToString(),
|
CreateTime = orderInfo.created,
|
Num = oid.num,
|
PicPath = oid.pic_path,
|
GoodsUrl = oid.goods_url,
|
DiscountPrice = PriceTran(oid.discount_price),
|
PointsPrice = oid.points_price.IsNullOrEmpty() ? 0 : int.Parse(oid.points_price),
|
SkuPropertiesName = oid.sku_properties_name,
|
Alias = oid.alias,
|
TradeStatus = orderInfo.status
|
};
|
oidList.Add(yzOrderinfo);
|
}
|
new YzTradeinfoDAL().UseTran(() =>
|
{
|
new YzTradeinfoDAL().Insert(yzTradeinfo);
|
new YzOrderinfoDAL().InsertRange(oidList);
|
});
|
return true;
|
}
|
#endregion
|
private static decimal PriceTran(string price)
|
{
|
return price.IsNullOrEmpty() ? 0 : decimal.Parse(price);
|
}
|
|
}
|
}
|