username@email.com
2024-09-09 e8fd9aa8a76c638991e60544ccab53e2e5bd5b6a
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
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
/***********************************************************************
 *            Project: baifenBinfa
 *        ProjectName: 百分兵法管理系统                               
 *                Web: http://chuanyin.com                     
 *             Author:                                        
 *              Email:                               
 *         CreateTime: 202403/02   
 *        Description: 暂无
 ***********************************************************************/
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.DTO;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
 
 
namespace CoreCms.Net.Services
{
    /// <summary>
    /// 促销条件表 接口实现
    /// </summary>
    public class CoreCmsPromotionConditionServices : BaseServices<CoreCmsPromotionCondition>, ICoreCmsPromotionConditionServices
    {
        private readonly ICoreCmsPromotionConditionRepository _dal;
        private readonly IUnitOfWork _unitOfWork;
        private readonly ICoreCmsGoodsCategoryServices _goodsCategoryServices;
 
        private readonly IServiceProvider _serviceProvider;
 
 
        public CoreCmsPromotionConditionServices(IUnitOfWork unitOfWork
            , ICoreCmsPromotionConditionRepository dal
            , ICoreCmsGoodsCategoryServices goodsCategoryServices
            , IServiceProvider serviceProvider
            )
        {
            this._dal = dal;
            base.BaseDal = dal;
            _unitOfWork = unitOfWork;
            _goodsCategoryServices = goodsCategoryServices;
            _serviceProvider = serviceProvider;
        }
 
 
        /// <summary>
        /// 检查是否满足条件
        /// </summary>
        /// <param name="conditionInfo"></param>
        /// <param name="cart"></param>
        /// <param name="promotionInfo"></param>
        /// <returns></returns>
        public async Task<bool> check(CoreCmsPromotionCondition conditionInfo, CartDto cart,
            CoreCmsPromotion promotionInfo)
        {
            if (string.IsNullOrEmpty(conditionInfo.parameters)) return false;
 
            var getPromotionConditionType = SystemSettingDictionary.GetPromotionConditionType();
            var codeModel = getPromotionConditionType.Find(p => p.sKey == conditionInfo.code);
            if (codeModel != null)
            {
                //如果是订单促销就直接去判断促销条件,如果是商品促销,就循环订单明细
                JObject parameters = (JObject)JsonConvert.DeserializeObject(conditionInfo.parameters);
 
                if (codeModel.sValue == "goods")
                {
                    var key = false;
                    foreach (var item in cart.list)
                    {
                        var type = 0;
                        //判断是哪个规则,并且确认是否符合
                        switch (conditionInfo.code)
                        {
                            case "GOODS_ALL":
                                type = condition_GOODS_ALL(parameters,
                                    (int)item.products.goodsId, item.nums);
                                break;
                            case "GOODS_IDS":
                                type = condition_GoodsIdS(parameters,
                                    (int)item.products.goodsId, item.nums);
                                break;
                            case "GOODS_CATS":
                                type = await condition_GOODS_CATS(parameters, (int)item.products.goodsId, item.nums);
                                break;
                            case "GOODS_BRANDS":
                                type = await condition_GOODS_BRANDS(parameters,
                                    (int)item.products.goodsId, item.nums);
                                break;
                            default:
                                type = 0;
                                break;
                        }
                        if (type > 0)
                        {
                            if (item.products.promotionList.ContainsKey(promotionInfo.id))
                            {
                                item.products.promotionList[promotionInfo.id].name = promotionInfo.name;
                                item.products.promotionList[promotionInfo.id].type = type;
                            }
                            else
                            {
                                item.products.promotionList.Add(promotionInfo.id, new WxNameTypeDto()
                                {
                                    name = promotionInfo.name,
                                    type = type
                                });
                            }
 
                        }
                        //只有选中的商品才算促销
                        if (item.isSelect)
                        {
                            if (!key)
                            {
                                if (type == 2)
                                {
                                    key = true;//针对某一条商品促销条件,循环购物车的所有商品,只要有一条满足要求就,算,就返回true
                                }
                            }
                        }
                    }
                    return key;
                }
                else if (codeModel.sValue == "order")
                {
                    var type = condition_ORDER_FULL(parameters, cart);
                    if (type > 0)
                    {
                        if (cart.promotionList.ContainsKey(promotionInfo.id))
                        {
                            cart.promotionList[promotionInfo.id].name = promotionInfo.name;
                            cart.promotionList[promotionInfo.id].type = type;
                        }
                        //else
                        //{
                        //    cart.promotionList.Add(type, new WxNameTypeDto()
                        //    {
                        //        name = promotionInfo.name,
                        //        type = type
                        //    });
                        //}
                    }
                    if (type == 2)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else if (codeModel.sValue == "user")
                {
                    var type = await condition_USER_GRADE(parameters, cart.userId);
                    if (type == 2)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
 
            }
            return false;
        }
 
 
        /// <summary>
        /// 在促销结果中,如果是商品促销结果,调用此方法,判断商品是否符合需求
        /// </summary>
        /// <param name="promotionId"></param>
        /// <param name="goodsId"></param>
        /// <param name="nums"></param>
        /// <returns></returns>
        public async Task<int> goods_check(int promotionId, int goodsId, int nums = 1)
        {
            var conditionInfos = await _dal.QueryListByClauseAsync(p => p.promotionId == promotionId);
            var getPromotionConditionType = SystemSettingDictionary.GetPromotionConditionType();
 
            foreach (var item in conditionInfos)
            {
                var codeModel = getPromotionConditionType.Find(p => p.sKey == item.code);
                if (codeModel != null && codeModel.sValue == "goods")
                {
                    JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
                    var type = 0;
                    //判断是哪个规则,并且确认是否符合
                    switch (item.code)
                    {
                        case "GOODS_ALL":
                            type = condition_GOODS_ALL(parameters, goodsId, nums);
                            break;
                        case "GOODS_IDS":
                            type = condition_GoodsIdS(parameters, goodsId, nums);
                            break;
                        case "GOODS_CATS":
                            type = await condition_GOODS_CATS(parameters, goodsId, nums);
                            break;
                        case "GOODS_BRANDS":
                            type = await condition_GOODS_BRANDS(parameters, goodsId, nums);
                            break;
                        default:
                            type = 0;
                            break;
                    }
                    if (type != 2)
                    {
                        return type;
                    }
                }
            }
            return 2;
        }
 
 
        /// <summary>
        /// 因为计算过促销条件后啊,前面有些是满足条件的,所以,他们的type是2,后面有不满足条件的时候呢,要把前面满足条件的回滚成不满足条件的
        /// </summary>
        /// <param name="cart"></param>
        /// <param name="promotionInfo"></param>
        /// <returns></returns>
        public CartDto PromotionFalse(CartDto cart, CoreCmsPromotion promotionInfo)
        {
            switch (promotionInfo.type)
            {
                case (int)GlobalEnumVars.PromotionType.Promotion:
                    //订单促销回滚
                    if (cart.promotionList.ContainsKey(promotionInfo.id))
                    {
                        cart.promotionList[promotionInfo.id].name = promotionInfo.name;
                        cart.promotionList[promotionInfo.id].type = 1;
                    }
                    //商品回滚
                    foreach (var item in cart.list.Where(item => item.products.promotionList.ContainsKey(promotionInfo.id)))
                    {
                        item.products.promotionList[promotionInfo.id].name = promotionInfo.name;
                        item.products.promotionList[promotionInfo.id].type = 1;
                    }
                    break;
            }
            return cart;
        }
 
        /// <summary>
        /// 订单满XX金额时满足条件
        /// </summary>
        /// <param name="parameters">参数对象</param>
        /// <param name="cart"></param>
        /// <returns></returns>
        public int condition_ORDER_FULL(JObject parameters, CartDto cart)
        {
            if (!parameters.ContainsKey("money")) return 1;
            var objMoney = Convert.ToDecimal(parameters["money"]);
            return cart.amount >= objMoney ? 2 : 1;
        }
 
        /// <summary>
        /// 所有商品满足条件
        /// </summary>
        /// <param name="parameters">参数对象</param>
        /// <param name="goodsId">商品序列</param>
        /// <param name="nums">数量</param>
        /// <returns></returns>
        public int condition_GOODS_ALL(JObject parameters, int goodsId, int nums)
        {
            return 2;
        }
 
        /// <summary>
        /// 指定某些商品满足条件
        /// </summary>
        /// <param name="parameters">参数对象</param>
        /// <param name="goodsId">商品序列</param>
        /// <param name="nums">数量</param>
        /// <returns></returns>
        public int condition_GoodsIdS(JObject parameters, int goodsId, int nums)
        {
            if (!parameters.ContainsKey("goodsId") || !parameters.ContainsKey("nums")) return 0;
 
            var objNums = Convert.ToInt32(parameters["nums"]);
 
            var goodsIds = CommonHelper.StringToIntArray(parameters["goodsId"].ObjectToString());
 
            return goodsIds.Any() && goodsIds.Contains(goodsId) ? nums >= objNums ? 2 : 1 : 0;
        }
 
 
        /// <summary>
        /// 指定商品分类满足条件
        /// </summary>
        /// <param name="parameters">参数对象</param>
        /// <param name="goodsId">商品序列</param>
        /// <param name="nums">数量</param>
        /// <returns></returns>
        public async Task<int> condition_GOODS_CATS(JObject parameters, int goodsId, int nums)
        {
 
            using (var container = _serviceProvider.CreateScope())
            {
                var goodsServices = container.ServiceProvider.GetService<ICoreCmsGoodsServices>();
 
                if (!parameters.ContainsKey("catId") || !parameters.ContainsKey("nums")) return 0;
                var objCatId = parameters["catId"].ObjectToInt();
                var objNums = parameters["nums"].ObjectToInt();
                var goodsModel = await goodsServices.QueryByIdAsync(goodsId);
 
                if (goodsModel == null)
                {
                    return 0;
                }
 
                return await _goodsCategoryServices.IsChild(objCatId, goodsModel.goodsCategoryId)
                    ? nums >= objNums ? 2 : 1
                    : 0;
            }
        }
 
        /// <summary>
        /// 指定商品品牌满足条件
        /// </summary>
        /// <param name="parameters">参数对象</param>
        /// <param name="goodsId">商品序列</param>
        /// <param name="nums">数量</param>
        /// <returns></returns>
        public async Task<int> condition_GOODS_BRANDS(JObject parameters, int goodsId, int nums)
        {
            using (var container = _serviceProvider.CreateScope())
            {
                var goodsServices = container.ServiceProvider.GetService<ICoreCmsGoodsServices>();
 
                if (!parameters.ContainsKey("brandId") || !parameters.ContainsKey("nums")) return 0;
                var objBrandId = parameters["brandId"].ObjectToInt(0);
                var objNums = parameters["nums"].ObjectToInt(0);
 
                var goodsModel = await goodsServices.QueryByIdAsync(goodsId);
                if (goodsModel == null)
                {
                    return 0;
                }
                return goodsModel.brandId == objBrandId ? nums >= objNums ? 2 : 1 : 0;
            }
        }
 
 
        /// <summary>
        /// 指定用户等级满足条件
        /// </summary>
        /// <param name="parameters">参数对象</param>
        /// <param name="userId">用户序列</param>
        /// <returns></returns>
        public async Task<int> condition_USER_GRADE(JObject parameters, int userId)
        {
            using (var container = _serviceProvider.CreateScope())
            {
                var userServices = container.ServiceProvider.GetService<ICoreCmsUserServices>();
 
                if (!parameters.ContainsKey("grades")) return 0;
                var userInfo = await userServices.QueryByIdAsync(userId);
                if (userInfo == null)
                {
                    return 0;
                }
                var arr = CommonHelper.StringToIntArray(parameters["grades"].ObjectToString());
                if (arr.Contains(userInfo.grade))
                {
                    return 2;
                }
                return 0;
            }
        }
    }
}