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); } } }