using Operater.DTO.System; using System; using System.Collections.Generic; using System.Text; using CommonUtil; using YouZanSDKStandard.Api; using YouZanSDKStandard.Api.Request; using AlibabaSDK.Request; using Operater.DAL; using Operater.DbModel; using YouZanSDKStandard.Api.Domain; using AlibabaSDK.Domain; using System.Linq; using AlibabaSDK.Api; namespace Operater.Service.System { public class TradeCreateService : ITradeCreateService { /// /// 创建1688订单 /// /// /// public TradeCreateResponse AliTradeCreate(AliTradeCreateRequest request) { string errMsg = ""; TradeCreateResponse response = new TradeCreateResponse(); try { //判断该有赞订单是否都已创建过1688订单 var hasOrderList = new YzOrderinfoDAL().ListGet(t => t.Tid == request.YzTradeId); if (!hasOrderList.IsNull() && hasOrderList.Count > 0) { var rela = new TradeCreateRelationDAL().ListGet(t => t.YzTid == request.YzTradeId && t.RunStatus == 2); if (!rela.IsNull() && rela.Count > 0 && rela.Count == hasOrderList.Count) { response.Success = false; response.ErrorMsg = "此有赞订单都已创建过1688订单"; return response; } } //调用有赞接口,获取订单详情 YouZanTradeDetailGetRequest yzTradereq = new YouZanTradeDetailGetRequest() { tid = request.YzTradeId }; var yzTradeRsp = YouZanClient.Execute(yzTradereq, request.YzToken); if (yzTradeRsp.IsNull() || !yzTradeRsp.success) { response.ErrorMsg = $"获取有赞订单详情失败:{(yzTradeRsp.IsNull() ? "null" : yzTradeRsp.message)}"; return response; } //批量解密 var decryptInfo = DecryptTrade(yzTradeRsp.data.full_order_info, request.YzToken); if (decryptInfo.IsNull() || decryptInfo.ReceiverName.IsNullOrEmpty()) { response.Success = false; response.ErrorMsg = "解密失败!"; return response; } int successCount = 0; //循环拆单信息创建订单 foreach (var order in yzTradeRsp.data.full_order_info.orders) { TradeCreateRelation recordRelation = new TradeCreateRelation() { RunTime = DateTime.Now }; //判断是否存在退款行为 var refundRelat = new YzRefundDAL().ListGet(t => t.YzOid == order.oid).ToList(); if (!refundRelat.IsNull() && refundRelat.Count > 0 && refundRelat[0].YzRefundStaus != "REFUND_CANCLE") {//有退款订单 recordRelation.RunStatus = 3; recordRelation.Memo = $"该子订单有退款,不需要创建1688订单,退款单号【{refundRelat[0].RefundId}】"; new TradeCreateRelationDAL().Update(recordRelation, i => new { i.RunStatus, i.Memo, i.RunTime }, t => t.YzOid == order.oid); response.Success = false; response.ErrorMsg = $"该子订单有退款,不需要创建1688订单,退款单号【{refundRelat[0].RefundId}】"; continue; } var relaHis = new TradeCreateRelationDAL().GetById(order.oid); if (!relaHis.IsNull() && relaHis.RunStatus != 0) {//已创建过跳过 LogUtil.Info($"yz子订单{order.oid},状态:{relaHis.RunStatus},跳过", "创建订单"); continue; } TradeCreateRelation tradeCreateRelation = new TradeCreateRelation() { RunStatus = 1 }; new TradeCreateRelationDAL().Update(tradeCreateRelation, i => new { i.RunStatus }, t => t.YzOid == order.oid); //是否有绑定关系 var relation = new DistributionRelationDAL().ListGet(t => t.YzProduct == order.item_id.ToString() && t.ReStatus == 1); if (relation.IsNull() || relation.Count == 0) { errMsg += "非1688商品订单;"; recordRelation.RunStatus = 4; recordRelation.Memo = "该商品与1688无绑定关系"; new TradeCreateRelationDAL().Update(recordRelation, i => new { i.RunStatus, i.Memo, i.RunTime }, t => t.YzOid == order.oid); //修改有赞子订单状态 YzOrderinfo yzOrderinfo = new YzOrderinfo() { AliTradeStatus = 2 }; new YzOrderinfoDAL().Update(yzOrderinfo, i => new { i.AliTradeStatus}, t => t.Oid == order.oid); continue; } AliCreateTradeResponse createRsp = new AliCreateTradeResponse(); CreateTradeReqGetResponse preResponse = new CreateTradeReqGetResponse(); if (relation[0].ProSource == 0) {//精选货源 createRsp = CreateTradeJx(decryptInfo, yzTradeRsp.data, order, relation, request, yzTradeRsp.data.full_order_info.pay_info.post_fee); } else {//代发 createRsp = CreateTradeDf(decryptInfo, yzTradeRsp.data, order, relation, request, yzTradeRsp.data.full_order_info.pay_info.post_fee); } if (!createRsp.Success) { recordRelation.RunStatus = 3; recordRelation.Memo = createRsp.ErrorMsg; new TradeCreateRelationDAL().Update(recordRelation, i => new { i.RunStatus, i.Memo, i.RunTime }, t => t.YzOid == order.oid); errMsg += createRsp.ErrorMsg; continue; } else { response.Success = true; successCount++; recordRelation.RunStatus = 2; recordRelation.AliTid = createRsp.AliTid; //获取1688订单信息 //AlibabaTradeDeatilGetRequest aliTradeReq = new AlibabaTradeDeatilGetRequest() //{ // orderId = aliTradeCreateRsp.Result.orderId, // webSite = "1688" //}; //var aliTradeRsp = AliabaClient.Execute(aliTradeReq, request.AliToken); //if (aliTradeRsp.IsNull() || !aliTradeRsp.Success || aliTradeRsp.result.IsNull()) //{//接口请求失败 // LogUtil.Info("接口获取1688订单详情error:" + (aliTradeRsp.IsNull() ? "null" : aliTradeRsp.ErrorMsg), "创建订单"); //} //else //{ // recordRelation.AliOid = aliTradeRsp.result.productItems[0].subItemID.ToString(); //} //子订单与主订单相同 recordRelation.AliOid = createRsp.AliTid; //修改有赞子订单状态 YzOrderinfo yzOrderinfo = new YzOrderinfo() { AliTradeStatus = 1, AliTid = createRsp.AliTid, AliOid = createRsp.AliTid }; new YzOrderinfoDAL().Update(yzOrderinfo, i => new { i.AliTradeStatus, i.AliTid, i.AliOid }, t => t.Oid == order.oid); //判断退款列表里是否有1688关联关系 if (!refundRelat.IsNull() && refundRelat.Count > 0 && refundRelat[0].AliTid.IsNullOrEmpty()) { YzRefund yzRefund = new YzRefund() { AliTid = createRsp.AliTid, AliOid = createRsp.AliTid }; new YzRefundDAL().Update(yzRefund, i => new { i.AliTid, i.AliOid }, t => t.RefundId == refundRelat[0].RefundId); } } new TradeCreateRelationDAL().Update(recordRelation, i => new { i.RunStatus, i.Memo, i.AliTid, i.AliOid, i.CreateInfo, i.RunTime }, t => t.YzOid == order.oid); } } catch (Exception e) { response.Success = false; response.ErrorMsg = e.ToString(); } response.ErrorMsg = errMsg; return response; } #region 精选商品创建订单 private AliCreateTradeResponse CreateTradeJx(YzDecryptInfo decryptInfo, TradeDetailResult yzResult, StructurizationTradeItemDetail yzOrder, List relation, AliTradeCreateRequest meReq,string postFee) { AliCreateTradeResponse response = new AliCreateTradeResponse(); CreateTradeReqGetResponse getReqResponse = CreateTradeReqGet(decryptInfo, yzResult, yzOrder, relation); if (!getReqResponse.Success) {//创建失败的操作 response.Success = false; response.ErrorMsg = getReqResponse.ErrorMsg; return response; } response.CreateInfo = JSONUtil.ObjectToJson(getReqResponse.request); //调用预览接口 var preRsp = AliCreatePreview(getReqResponse, yzOrder, 0, meReq.AliToken,postFee); if (!preRsp.Success) { response.Success = false; response.ErrorMsg = preRsp.ErrorMsg; return response; } //调用1688接口创建订单 var aliTradeCreateRsp = AliabaClient.Execute(getReqResponse.request, meReq.AliToken); if (aliTradeCreateRsp.IsNull() || !aliTradeCreateRsp.Success || aliTradeCreateRsp.Result.IsNull() || aliTradeCreateRsp.Result.orderId.IsNullOrEmpty()) {//整单创建失败 response.Success = false; response.ErrorMsg = aliTradeCreateRsp.IsNull() ? "接口返回null" : aliTradeCreateRsp.ErrorMsg; return response; } response.Success = true; response.AliTid = aliTradeCreateRsp.Result.orderId; return response; } /// /// 创建订单的request /// /// /// /// /// private CreateTradeReqGetResponse CreateTradeReqGet(YzDecryptInfo decryptInfo, TradeDetailResult yzResult, StructurizationTradeItemDetail yzOrder, List relation) { CreateTradeReqGetResponse response = new CreateTradeReqGetResponse(); var yzTrade = yzResult.full_order_info; //收货地址信息 AddressParamItem addressParamItem = new AddressParamItem() { fullName = decryptInfo.ReceiverName, mobile = decryptInfo.ReceiverTel, phone = decryptInfo.ReceiverTel, cityText = yzTrade.address_info.delivery_city, provinceText = yzTrade.address_info.delivery_province, areaText = yzTrade.address_info.delivery_district, townText = yzTrade.address_info.delivery_district, address = decryptInfo.DeliveryAddress }; var orderRe = new OrderRelationDAL().ListGet(t => t.YzTid == yzTrade.order_info.tid && t.CreateStatus == 1); //商品信息 List cargoParamList = new List(); List oids = new List(); //判断有赞子订单是否已创建过 if (!orderRe.IsNull() && orderRe.Count > 0 && orderRe.Any(t => t.YzSkuId == yzOrder.sku_id.ToString())) {//已经创建成功过 response.Success = false; response.ErrorMsg = "已经创建成功过,请勿重复创建!"; return response; } //判断是否有绑定关系 if (relation.IsNull() || relation.Count == 0) { response.Success = false; response.ErrorMsg = "该商品与1688无绑定关系"; return response; } List skuInfos = JSONUtil.JsonToObject>(relation[0].AliskuInfo); var aliSku = skuInfos.Where(t => t.skuId == long.Parse(yzOrder.outer_sku_id)).ToList(); if (aliSku.IsNull() || aliSku.Count == 0) { response.Success = false; response.ErrorMsg = "1688商品无该sku信息"; return response; } OrderRelation orderRelation = new OrderRelation(); CargoParamListItem carItem = new CargoParamListItem() { offerId = long.Parse(relation[0].SourceProduct), specId = aliSku[0].specId, quantity = yzOrder.num }; cargoParamList.Add(carItem); orderRelation.YzOid = yzOrder.oid; orderRelation.YzPayAmount = decimal.Parse(yzOrder.payment); orderRelation.YzItemTitle = yzOrder.title; orderRelation.AliProductId = relation[0].SourceProduct; orderRelation.YzProductId = yzOrder.item_id.ToString(); orderRelation.YzImg = yzOrder.pic_path; orderRelation.YzNum = yzOrder.num; orderRelation.AliSkuId = aliSku[0].skuId.ToString(); orderRelation.YzSkuId = yzOrder.sku_id.ToString(); orderRelation.AliSpecid = aliSku[0].specId; oids.Add(orderRelation); AlibabaTradeCreateRequest addReq = new AlibabaTradeCreateRequest() { flow = "ttpft", message = yzTrade.remark_info.buyer_message, isvBizTypeStr = "fenxiaoMedia", addressParam = addressParamItem, cargoParamList = cargoParamList, isvBizTypePD = false }; response.request = addReq; response.Oids = oids; response.Success = true; return response; } #endregion #region 代发创建订单 private AliCreateTradeResponse CreateTradeDf(YzDecryptInfo decryptInfo, TradeDetailResult yzResult, StructurizationTradeItemDetail yzOrder, List relation, AliTradeCreateRequest meReq,string postFee) { AliCreateTradeResponse response = new AliCreateTradeResponse(); CreateTradeReqGetResponse getReqResponse = CreateTradeDfReqGet(decryptInfo, yzResult, yzOrder, relation, meReq); if (!getReqResponse.Success) {//创建失败的操作 response.Success = false; response.ErrorMsg = getReqResponse.ErrorMsg; return response; } response.CreateInfo = JSONUtil.ObjectToJson(getReqResponse.fxRequest); //先调用预览接口 //调用预览接口 var preRsp = AliCreatePreview(getReqResponse, yzOrder, 1, meReq.AliToken, postFee); if (!preRsp.Success) { response.Success = false; response.ErrorMsg = preRsp.ErrorMsg; return response; } //调用1688接口创建订单 var aliTradeCreateRsp = AliabaClient.Execute(getReqResponse.fxRequest, meReq.AliToken); if (aliTradeCreateRsp.IsNull() || !aliTradeCreateRsp.Success || aliTradeCreateRsp.result.IsNull() || aliTradeCreateRsp.result.orderId.IsNullOrEmpty()) {//整单创建失败 response.Success = false; response.ErrorMsg = aliTradeCreateRsp.IsNull() ? "接口返回null" : aliTradeCreateRsp.ErrorMsg; return response; } response.Success = true; response.AliTid = aliTradeCreateRsp.result.orderId; return response; } /// /// 创建代发订单的request /// /// /// /// /// private CreateTradeReqGetResponse CreateTradeDfReqGet(YzDecryptInfo decryptInfo, TradeDetailResult yzResult, StructurizationTradeItemDetail yzOrder, List relation, AliTradeCreateRequest meReq) { CreateTradeReqGetResponse response = new CreateTradeReqGetResponse(); var yzTrade = yzResult.full_order_info; //收货地址信息 FXOrderAddressParam addressParamItem = new FXOrderAddressParam() { fullName = decryptInfo.ReceiverName, mobile = decryptInfo.ReceiverTel, phone = decryptInfo.ReceiverTel, cityText = yzTrade.address_info.delivery_city, provinceText = yzTrade.address_info.delivery_province, areaText = yzTrade.address_info.delivery_district, townText = yzTrade.address_info.delivery_district, address = decryptInfo.DeliveryAddress }; var orderRe = new OrderRelationDAL().ListGet(t => t.YzTid == yzTrade.order_info.tid && t.CreateStatus == 1); //商品信息 List cargoParamList = new List(); // List oids = new List(); //判断有赞子订单是否已创建过 if (!orderRe.IsNull() && orderRe.Count > 0 && orderRe.Any(t => t.YzSkuId == yzOrder.sku_id.ToString())) {//已经创建成功过 response.Success = false; response.ErrorMsg = "已经创建成功过,请勿重复创建!"; return response; } //判断是否有绑定关系 if (relation.IsNull() || relation.Count == 0) { response.Success = false; response.ErrorMsg = "该商品与1688无绑定关系"; return response; } List skuInfos = JSONUtil.JsonToObject>(relation[0].AliskuInfo); var aliSku = skuInfos.Where(t => t.skuId == long.Parse(yzOrder.outer_sku_id)).ToList(); if (aliSku.IsNull() || aliSku.Count == 0) { response.Success = false; response.ErrorMsg = "1688商品无该sku信息"; return response; } FXOrderCargoParamList carItem = new FXOrderCargoParamList() { offerId = long.Parse(relation[0].SourceProduct), specId = aliSku[0].specId, quantity = yzOrder.num, channel = "youzan", outShopCode = meReq.YzShopId, outItemCode = yzOrder.item_id.ToString() }; cargoParamList.Add(carItem); //OrderRelation orderRelation = new OrderRelation(); //orderRelation.YzOid = yzOrder.oid; //orderRelation.YzPayAmount = decimal.Parse(yzOrder.payment); //orderRelation.YzItemTitle = yzOrder.title; //orderRelation.AliProductId = relation[0].SourceProduct; //orderRelation.YzProductId = yzOrder.item_id.ToString(); //orderRelation.YzImg = yzOrder.pic_path; //orderRelation.YzNum = yzOrder.num; //orderRelation.AliSkuId = aliSku[0].skuId.ToString(); //orderRelation.YzSkuId = yzOrder.sku_id.ToString(); //orderRelation.AliSpecid = aliSku[0].specId; //oids.Add(orderRelation); FenXiaoOrderCreateRequest addReq = new FenXiaoOrderCreateRequest() { flow = "fenxiao", isvBizTypeStr = "fenxiaoMedia", addressParam = addressParamItem, cargoParamList = cargoParamList, isvBizTypePD = false }; response.fxRequest = addReq; // response.Oids = oids; response.Success = true; return response; } #endregion #region 创建订单前预览 private AliCreateTradeResponse AliCreatePreview(CreateTradeReqGetResponse tradePara, StructurizationTradeItemDetail yzOrder, int prSource, string aliToken,string postFee) { AliCreateTradeResponse response = new AliCreateTradeResponse(); try { if (!tradePara.Success) { return null; } decimal aliTradeAmount = 0; if (prSource == 0) {//精选 AlibabaTradeCreatePreviewRequest aliPreReq = new AlibabaTradeCreatePreviewRequest() { flow = "ttpft", addressParam = tradePara.request.addressParam, cargoParamList = tradePara.request.cargoParamList }; var aliPreRsp = AliabaClient.Execute(aliPreReq, aliToken); if (aliPreRsp.IsNull() || !aliPreRsp.Success) { response.Success = false; response.ErrorMsg = aliPreRsp.ErrorMsg; return response; } aliTradeAmount = aliPreRsp.orderPreviewResuslt.Sum(t => t.sumPayment); } else {//1688代发 FxTradeCreatePreviewRequest dfPreReq = new FxTradeCreatePreviewRequest() { flow = "saleproxy" }; dfPreReq.addressParam = JSONUtil.JsonToObject(JSONUtil.ObjectToJson(tradePara.fxRequest.addressParam)); dfPreReq.cargoParamList = JSONUtil.JsonToObject>(JSONUtil.ObjectToJson(tradePara.fxRequest.cargoParamList)); var dfPreRsp = AliabaClient.Execute(dfPreReq, aliToken); if (dfPreRsp.IsNull() || !dfPreRsp.modelResult.success) { response.Success = false; response.ErrorMsg = dfPreRsp.modelResult.errorMsg; return response; } aliTradeAmount = dfPreRsp.modelResult.orderPreviewResult.Sum(t => t.sumPayment); } decimal post = 0; if(!postFee.IsNullOrEmpty()&&decimal.TryParse(postFee, out post)) { } if (Math.Round(aliTradeAmount / 100, 2) >= (decimal.Parse(yzOrder.payment)+ post)) { response.Success = false; response.ErrorMsg = $"1688金额:{Math.Round(aliTradeAmount / 100, 2)},有赞订单金额:{yzOrder.payment},亏了"; return response; } } catch (Exception e) { response.Success = false; response.ErrorMsg = e.ToString(); return response; } response.Success = true; return response; } #endregion /// /// 调用预览接口 /// /// /// /// private AlibabaTradeCreatePreviewRequest CreatePre(YzDecryptInfo decryptInfo, TradeDetailResult yzResult) { var yzTrade = yzResult.full_order_info; //收货地址信息 AddressParamItem addressParamItem = new AddressParamItem() { fullName = decryptInfo.ReceiverName, mobile = decryptInfo.ReceiverTel, phone = decryptInfo.ReceiverTel, cityText = yzTrade.address_info.delivery_city, provinceText = yzTrade.address_info.delivery_province, areaText = yzTrade.address_info.delivery_district, townText = yzTrade.address_info.delivery_district, address = decryptInfo.DeliveryAddress }; //商品信息 List cargoParamList = new List(); foreach (var item in yzTrade.orders) { //判断是否有绑定关系 var relation = new DistributionRelationDAL().ListGet(t => t.YzProduct == item.item_id.ToString() && t.ReStatus == 1); if (relation.IsNull() || relation.Count == 0) { continue; } List skuInfos = JSONUtil.JsonToObject>(relation[0].AliskuInfo); var aliSku = skuInfos.Where(t => t.skuId == long.Parse(item.outer_sku_id)).ToList(); if (aliSku.IsNull() || aliSku.Count == 0) { continue; } CargoParamListItem carItem = new CargoParamListItem() { offerId = long.Parse(relation[0].SourceProduct), specId = aliSku[0].specId, quantity = item.num }; cargoParamList.Add(carItem); } AlibabaTradeCreatePreviewRequest aliPreReq = new AlibabaTradeCreatePreviewRequest() { flow = "ttpft", addressParam = addressParamItem, cargoParamList = cargoParamList }; return aliPreReq; } /// /// 有赞订单解密 /// /// /// public YzDecryptInfo DecryptTrade(StructurizationTradeOrderInfo yzOrderInfo, string yzToken) { Dictionary deData = new Dictionary(); deData.Add("delivery_address", yzOrderInfo.address_info.delivery_address); deData.Add("receiver_name", yzOrderInfo.address_info.receiver_name); deData.Add("receiver_tel", yzOrderInfo.address_info.receiver_tel); deData.Add("buyer_phone", yzOrderInfo.buyer_info.buyer_phone); GetDecryptDataRequest deRequest = new GetDecryptDataRequest() { KdtId = yzOrderInfo.order_info.node_kdt_id, Tid = yzOrderInfo.order_info.tid, TradeCreated = yzOrderInfo.order_info.created, YzOpenId = yzOrderInfo.buyer_info.yz_open_id, Data = deData }; return GetDecryptData(deRequest, yzToken); } /// /// 从数据库或接口获取解密信息 /// /// /// public YzDecryptInfo GetDecryptData(GetDecryptDataRequest request, string yzToken) { //先从表里查询 var decrRecord = new YzDecryptInfoDAL().GetById(request.Tid); if (!decrRecord.IsNull() && !decrRecord.Tid.IsNullOrEmpty()) { return decrRecord; } //从接口获取 List source = new List(); foreach (var it in request.Data) { source.Add(it.Value); } YouZanDecryptBatchRequest req = new YouZanDecryptBatchRequest() { sources = source }; var rsp = YouZanClient.Execute(req, yzToken); YzDecryptInfo yzDecryptInfo = new YzDecryptInfo(); yzDecryptInfo.DeliveryAddress = rsp.data[request.Data["delivery_address"]]; yzDecryptInfo.ReceiverName = rsp.data[request.Data["receiver_name"]]; yzDecryptInfo.ReceiverTel = rsp.data[request.Data["receiver_tel"]]; yzDecryptInfo.BuyerPhone = rsp.data[request.Data["buyer_phone"]]; yzDecryptInfo.Tid = request.Tid; yzDecryptInfo.TradeCreate = request.TradeCreated; yzDecryptInfo.YzOpenId = request.YzOpenId; yzDecryptInfo.ReceiverName = yzDecryptInfo.ReceiverName.Length < 2 ? (yzDecryptInfo.ReceiverName + "先生") : yzDecryptInfo.ReceiverName; new YzDecryptInfoDAL().Insert(yzDecryptInfo); return yzDecryptInfo; } public class CreateTradeReqGetResponse { public AlibabaTradeCreateRequest request { get; set; } public FenXiaoOrderCreateRequest fxRequest { get; set; } public List Oids { get; set; } public bool Success { get; set; } public string ErrorMsg { get; set; } } public class AliCreateTradeResponse { public bool Success { get; set; } public string ErrorMsg { get; set; } public string CreateInfo { get; set; } public string AliTid { get; set; } } } }