移动系统liao
2024-10-15 94da0698c01915b1e340415e080aa03050700d97
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Caching.AccressToken;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Loging;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using CoreCms.Net.WeChat.Service.HttpClients;
using InitQ.Abstractions;
using InitQ.Attributes;
using Newtonsoft.Json;
using SKIT.FlurlHttpClient.Wechat.Api;
using SKIT.FlurlHttpClient.Wechat.Api.Models;
 
namespace CoreCms.Net.RedisMQ
{
    /// <summary>
    /// 微信支付成功后推送到接口进行发货处理
    /// </summary>
    public class WeChatPayShippingSubscribe : IRedisSubscribe
    {
        private readonly IWeChatApiHttpClientFactory _weChatApiHttpClientFactory;
        private readonly ICoreCmsServicesServices _servicesServices;
        private readonly ICoreCmsBillPaymentsServices _billPaymentsServices;
        private readonly ICoreCmsBillDeliveryServices _billDeliveryServices;
        private readonly ICoreCmsOrderItemServices _orderItemServices;
        private readonly ICoreCmsUserServices _userServices;
        private readonly ICoreCmsUserWeChatInfoServices _weChatInfoServices;
        private readonly ICoreCmsOrderServices _orderServices;
        private readonly ICoreCmsSettingServices _settingServices;
 
 
 
        public WeChatPayShippingSubscribe(ICoreCmsBillPaymentsServices billPaymentsServices, IWeChatApiHttpClientFactory weChatApiHttpClientFactory, ICoreCmsServicesServices servicesServices, ICoreCmsBillDeliveryServices billDeliveryServices, ICoreCmsOrderItemServices orderItemServices, ICoreCmsUserServices userServices, ICoreCmsUserWeChatInfoServices weChatInfoServices, ICoreCmsOrderServices orderServices, ICoreCmsSettingServices settingServices)
        {
            _billPaymentsServices = billPaymentsServices;
            _weChatApiHttpClientFactory = weChatApiHttpClientFactory;
            _servicesServices = servicesServices;
            _billDeliveryServices = billDeliveryServices;
            _orderItemServices = orderItemServices;
            _userServices = userServices;
            _weChatInfoServices = weChatInfoServices;
            _orderServices = orderServices;
            _settingServices = settingServices;
        }
 
        /// <summary>
        /// 微信支付成功后推送到接口进行发货处理
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        [Subscribe(RedisMessageQueueKey.WeChatPayShipping)]
        private async Task WeChatPayNotice(string msg)
        {
            try
            {
                var paymentOrder = await _billPaymentsServices.QueryByClauseAsync(p => p.paymentId == msg);
                if (paymentOrder == null)
                {
                    NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":支付单不存在");
                    return;
                }
                else
                {
                    if (paymentOrder.paymentCode != GlobalEnumVars.PaymentsTypes.wechatpay.ToString())
                    {
                        NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":非微信支付方式不予处理");
                        return;
                    }
 
 
 
 
                    var client = _weChatApiHttpClientFactory.CreateWxOpenClient();
                    var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken();
 
                    var isTradeManagedRequest = new WxaSecOrderIsTradeManagedRequest()
                    {
                        AccessToken = accessToken
                    };
                    //商品名称
                    var orderTitle = string.Empty;
                    //检索是否开启了微信发货信息功能,才会进行后面的发货操作
                    var responseIsTradeManagedResponse = await client.ExecuteWxaSecOrderIsTradeManagedAsync(isTradeManagedRequest);
                    if (responseIsTradeManagedResponse.IsSuccessful() && responseIsTradeManagedResponse.IsTradeManaged)
                    {
                        //判断不同支付单类型下如何获取商品标题,目前只是简单标题,非商品订单如果需要详细到具体明细,建议扩展获取其他关联信息。
                        switch (paymentOrder.type)
                        {
                            case (int)GlobalEnumVars.BillPaymentsType.Recharge:
                                orderTitle = "用户充值" + paymentOrder.money + "元";
                                break;
                            case (int)GlobalEnumVars.BillPaymentsType.FormOrder:
                                orderTitle = "表单订单";
                                break;
                            case (int)GlobalEnumVars.BillPaymentsType.FormPay:
                                orderTitle = "表单付款码支付";
                                break;
                            case (int)GlobalEnumVars.BillPaymentsType.ServiceOrder:
                                {
                                    var id = Convert.ToInt32(paymentOrder.sourceId);
                                    var serviceModel = await _servicesServices.QueryByClauseAsync(p => p.id == id);
                                    if (serviceModel == null)
                                    {
                                        NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":服务项目获取失败");
                                        return;
                                    }
                                    orderTitle = serviceModel.title;
                                    break;
                                }
                            case (int)GlobalEnumVars.BillPaymentsType.Common:
                            case (int)GlobalEnumVars.BillPaymentsType.PinTuan:
                            case (int)GlobalEnumVars.BillPaymentsType.Group:
                            case (int)GlobalEnumVars.BillPaymentsType.Seckill:
                            case (int)GlobalEnumVars.BillPaymentsType.Solitaire:
                                {
                                    var orderItems = await _orderItemServices.QueryListByClauseAsync(p => p.orderId == paymentOrder.sourceId);
                                    if (!orderItems.Any())
                                    {
                                        NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":订单详情获取失败");
                                        return;
                                    }
 
                                    if (orderItems.Count == 1)
                                    {
                                        orderTitle = orderItems.FirstOrDefault()?.name;
                                    }
                                    else
                                    {
                                        orderItems.ForEach(p => { orderTitle += p.name + ";"; });
                                    }
 
                                    break;
                                }
                            case (int)GlobalEnumVars.BillPaymentsType.Bargain:
                                orderTitle = "砍价活动";
                                break;
                            case (int)GlobalEnumVars.BillPaymentsType.Giveaway:
                                orderTitle = "购物赠品";
                                break;
                            default:
                                NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":订单类型获取失败");
                                return;
                        }
 
 
                        //构建请求
                        var request = new WxaSecOrderUploadShippingInfoRequest
                        {
                            AccessToken = accessToken,
                            OrderKey = new WxaSecOrderUploadCombinedShippingInfoRequest.Types.OrderKey()
                            {
                                OrderNumberType = 2,
                                TransactionId = paymentOrder.tradeNo,
                            },
                            IsFinishAll = true
                        };
 
 
                        //组装参数
 
                        //获取openid
                        var user = await _userServices.QueryByClauseAsync(p => p.id == paymentOrder.userId);
                        if (user == null)
                        {
                            NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":用户信息获取失败");
                            return;
                        }
 
                        var weChatUserInfo = await _weChatInfoServices.QueryByClauseAsync(p => p.userId == user.id && p.type == (int)GlobalEnumVars.UserAccountTypes.微信小程序);
                        if (weChatUserInfo == null)
                        {
                            NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":用户信息openId获取失败");
                            return;
                        }
 
                        request.Payer = new WxaSecOrderUploadCombinedShippingInfoRequest.Types.Payer() { OpenId = weChatUserInfo.openid };
 
                        //设置发货信息
                        //如果是商品模式是,则去走快递或者自提及同城配送。
                        //两种情况:1支付单支付成功后,自动调用此模式处理充值,服务商品,用户自提的订单,2、如果是后台手动发货,处理发货的订单业务。
                        var shippingList = new List<WxaSecOrderUploadShippingInfoRequest.Types.Shipping>();
 
                        if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Common
                            || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.PinTuan
                            || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Group
                            || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Seckill
                            || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Solitaire)
                        {
                            //获取订单
                            var order = await _orderServices.QueryByClauseAsync(p => p.orderId == paymentOrder.sourceId);
                            if (order == null)
                            {
                                NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":订单获取失败");
                                return;
                            }
 
                            request.LogisticsType = order.receiptType switch
                            {
                                //设置物流的发货模式
                                (int)GlobalEnumVars.OrderReceiptType.SelfDelivery => (int)GlobalEnumVars.WeChatShippingLogisticsType.用户自提,
                                (int)GlobalEnumVars.OrderReceiptType.IntraCityService => (int)GlobalEnumVars.WeChatShippingLogisticsType.同城配送,
                                (int)GlobalEnumVars.OrderReceiptType.Logistics => (int)GlobalEnumVars.WeChatShippingLogisticsType.物流配送,
                                _ => request.LogisticsType
                            };
 
                            //判断订单是否发货
                            if (order.shipStatus is (int)GlobalEnumVars.OrderShipStatus.PartialYes or (int)GlobalEnumVars.OrderShipStatus.Yes)
                            {
                                //获取订单的发货信息
                                var orderBillDeliveries = await _billDeliveryServices.QueryListByClauseAsync(p => p.orderId == paymentOrder.sourceId);
                                if (orderBillDeliveries == null || !orderBillDeliveries.Any())
                                {
                                    NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":未获取到发货信息,自动发货停止操作");
                                    return;
                                }
                                shippingList.AddRange(orderBillDeliveries.Select(item => new WxaSecOrderUploadShippingInfoRequest.Types.Shipping { ItemDescription = orderTitle, ExpressCompany = item.thirdPartylogiCode, TrackingNumber = item.logiNo }));
 
                                request.DeliveryMode = orderBillDeliveries.Count > 1
                                    ? (int)GlobalEnumVars.WeChatShippingDeliveryMode.SPLIT_DELIVERY
                                    : (int)GlobalEnumVars.WeChatShippingDeliveryMode.UNIFIED_DELIVERY;
                            }
                            else
                            {
                                //判断是否门店订单自动发货
                                var allConfigs = await _settingServices.GetConfigDictionaries();
                                var storeOrderAutomaticDelivery = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.StoreOrderAutomaticDelivery).ObjectToInt(1);
                                if (storeOrderAutomaticDelivery == 1 || order.receiptType == (int)GlobalEnumVars.OrderReceiptType.SelfDelivery)
                                {
                                    shippingList.Add(new WxaSecOrderUploadShippingInfoRequest.Types.Shipping() { ItemDescription = orderTitle, ExpressCompany = "", TrackingNumber = "" });
                                }
                                else
                                {
                                    NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":未获取到发货信息,自动发货停止操作");
                                    return;
                                }
                            }
                        }
                        else
                        {
                            //非商品模式,直接走虚拟发货。
                            request.LogisticsType = (int)GlobalEnumVars.WeChatShippingLogisticsType.虚拟商品;
                            request.DeliveryMode = (int)GlobalEnumVars.WeChatShippingDeliveryMode.UNIFIED_DELIVERY;
                            shippingList.Add(new WxaSecOrderUploadShippingInfoRequest.Types.Shipping() { ItemDescription = orderTitle, ExpressCompany = "", TrackingNumber = "" });
                        }
 
                        request.ShippingList = shippingList;
 
                        var response = await client.ExecuteWxaSecOrderUploadShippingInfoAsync(request);
                        if (response.IsSuccessful())
                        {
                            NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":发货提交成功");
                        }
                        else
                        {
                            NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理-推送接口", JsonConvert.SerializeObject(response));
 
                        }
                    }
                    else
                    {
                        NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理-获取是否需要推送", JsonConvert.SerializeObject(responseIsTradeManagedResponse));
                    }
                }
            }
            catch (Exception ex)
            {
                NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg, ex);
                throw;
            }
            await Task.CompletedTask;
        }
 
    }
}