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
{
///
/// 有赞订单处理
///
///
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(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(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(tradeBody);
TradeStatusUp(yzMsgModel.id, "WAIT_BUYER_CONFIRM_GOODS", "已发货", ship_msg.update_time);
break;
case "trade_TradeSuccess":
Console.WriteLine("【有赞】交易成功");
TradeStatusUpMsg success_msg = JSONUtil.JsonToObject(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(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(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(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 oidList = new List();
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);
}
}
}