username@email.com
2024-09-09 626943b5ba84ce44bc19f4c3b8e8e94638bec733
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
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
/***********************************************************************
 *            Project: baifenBinfa
 *        ProjectName: 百分兵法管理系统                               
 *                Web: http://chuanyin.com                     
 *             Author:                                        
 *              Email:                               
 *         CreateTime: 202403/02   
 *        Description: 暂无
 ***********************************************************************/
 
using System;
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 Newtonsoft.Json;
using Newtonsoft.Json.Linq;
 
 
namespace CoreCms.Net.Services
{
    /// <summary>
    /// 促销结果表 接口实现
    /// </summary>
    public class CoreCmsPromotionResultServices : BaseServices<CoreCmsPromotionResult>, ICoreCmsPromotionResultServices
    {
        private readonly ICoreCmsPromotionResultRepository _dal;
 
        private ICoreCmsPromotionConditionServices _promotionConditionServices;
 
 
        private readonly IUnitOfWork _unitOfWork;
        public CoreCmsPromotionResultServices(IUnitOfWork unitOfWork, ICoreCmsPromotionResultRepository dal, ICoreCmsPromotionConditionServices promotionConditionServices)
        {
            this._dal = dal;
            base.BaseDal = dal;
            _unitOfWork = unitOfWork;
            _promotionConditionServices = promotionConditionServices;
        }
 
 
 
        //去计算结果
        public async Task<bool> toResult(CoreCmsPromotionResult resultInfo, CartDto cart,
            CoreCmsPromotion promotionInfo)
        {
            if (string.IsNullOrEmpty(resultInfo.parameters)) return false;
 
            var resultType = SystemSettingDictionary.GetPromotionResultType();
            var resultModel = resultType.Find(p => p.sKey == resultInfo.code);
            if (resultModel != null)
            {
                JObject parameters = (JObject)JsonConvert.DeserializeObject(resultInfo.parameters);
                //如果是订单促销就直接去判断促销条件,如果是商品促销,就循环订单明细
                if (resultModel.sValue == "goods")
                {
                    var isUsed = false;
                    foreach (var item in cart.list)
                    {
                        var type = await _promotionConditionServices.goods_check(promotionInfo.id, (int)item.products.goodsId, item.nums);
                        if (type == 2)
                        {
                            //到这里就说明此商品信息满足促销商品促销信息的条件,去计算结果
                            //注意,在明细上面,就不细分促销的种类了,都放到一个上面,在订单上面才细分
                            decimal promotionModel = 0;
                            if (isUsed == false)
                            {
                                switch (resultInfo.code)
                                {
                                    //指定商品减固定金额
                                    case "GOODS_REDUCE":
                                        promotionModel = result_GOODS_REDUCE(parameters, item, promotionInfo);
                                        break;
                                    //指定商品打X折
                                    case "GOODS_DISCOUNT":
                                        promotionModel = result_GOODS_DISCOUNT(parameters, item, promotionInfo);
                                        break;
                                    //指定商品一口价
                                    case "GOODS_ONE_PRICE":
                                        promotionModel = result_GOODS_ONE_PRICE(parameters, item, promotionInfo);
                                        break;
                                    //指定商品每第几件减指定金额
                                    case "GOODS_HALF_PRICE": //todo 指定商品每第几件减指定金额
                                        promotionModel = result_GOODS_HALF_PRICE(parameters, item, promotionInfo);
                                        break;
                                    default:
                                        promotionModel = 0;
                                        break;
                                }
                            }
 
                            if (item.isSelect)
                            {
                                switch (promotionInfo.type)
                                {
                                    case (int)GlobalEnumVars.PromotionType.Promotion:
                                        //设置总的商品促销金额
                                        cart.goodsPromotionMoney = Math.Round(cart.goodsPromotionMoney + promotionModel, 2);
                                        //设置总的价格
                                        cart.amount = Math.Round(cart.amount - promotionModel, 2);
                                        break;
                                    case (int)GlobalEnumVars.PromotionType.Coupon:
                                        if (isUsed)
                                        {
                                            item.products.promotionList.Remove(promotionInfo.id);
                                        }
                                        else
                                        {
                                            //优惠券促销金额
                                            cart.couponPromotionMoney = Math.Round(cart.couponPromotionMoney + promotionModel, 2);
                                            //设置总的价格
                                            cart.amount = Math.Round(cart.amount - promotionModel, 2);
                                            //跳出下级处理
                                            isUsed = true;
                                        }
                                        break;
                                    case (int)GlobalEnumVars.PromotionType.Group:
                                        //团购
                                        cart.goodsPromotionMoney = Math.Round(cart.goodsPromotionMoney + promotionModel, 2);
                                        //设置总的价格
                                        cart.amount = Math.Round(cart.amount - promotionModel, 2);
                                        break;
                                    case (int)GlobalEnumVars.PromotionType.Seckill:
                                        //秒杀
                                        cart.goodsPromotionMoney = Math.Round(cart.goodsPromotionMoney + promotionModel, 2);
                                        //设置总的价格
                                        cart.amount = Math.Round(cart.amount - promotionModel, 2);
                                        break;
                                }
                            }
 
                        }
                    }
                    //商品促销可能做的比较狠,导致订单价格为负数了,这里判断一下,如果订单价格小于0了,就是0了
                    cart.amount = cart.amount > 0 ? cart.amount : 0;
                }
                else
                {
                    //订单打X折
                    if (resultInfo.code == "ORDER_DISCOUNT")
                    {
                        result_ORDER_DISCOUNT(parameters, cart, promotionInfo);
                    }
                    //订单减指定金额
                    else if (resultInfo.code == "ORDER_REDUCE")
                    {
                        result_ORDER_REDUCE(parameters, cart, promotionInfo);
                    }
                }
            }
            return true;
        }
 
        /// <summary>
        /// 订单减固定金额
        /// </summary>
        /// <param name="parameters"></param>
        /// <param name="cart"></param>
        /// <param name="promotionInfo"></param>
        /// <returns></returns>
        public bool result_ORDER_REDUCE(JObject parameters, CartDto cart, CoreCmsPromotion promotionInfo)
        {
            if (!parameters.ContainsKey("money")) return true;
 
            //判断极端情况,减的太多,超过购物车的总金额了,那么就最多减到0
            if (cart.amount < (decimal)parameters["money"])
            {
                parameters["money"] = cart.amount;
            }
            //总价格修改
            cart.amount -= (decimal)parameters["money"];
            switch (promotionInfo.type)
            {
                case (int)GlobalEnumVars.PromotionType.Promotion:
                    //总促销修改
                    cart.orderPromotionMoney += (decimal)parameters["money"];
                    //设置促销列表
                    if (cart.promotionList.ContainsKey(promotionInfo.id))
                    {
                        cart.promotionList[promotionInfo.id].name = promotionInfo.name;
                        cart.promotionList[promotionInfo.id].type = 2;
                    }
                    else
                    {
                        cart.promotionList.Add(promotionInfo.id, new WxNameTypeDto() { name = promotionInfo.name, type = 2 });
                    }
                    break;
 
                case (int)GlobalEnumVars.PromotionType.Coupon:
                    //优惠券促销金额
                    cart.couponPromotionMoney += (decimal)parameters["money"];
                    break;
            }
            return true;
        }
 
        /// <summary>
        /// 订单打X折
        /// </summary>
        /// <param name="parameters"></param>
        /// <param name="cart"></param>
        /// <param name="promotionInfo"></param>
        /// <returns></returns>
        public bool result_ORDER_DISCOUNT(JObject parameters, CartDto cart, CoreCmsPromotion promotionInfo)
        {
            //if (parameters.Property("discount") == null) return true;
            //var objDiscount = Convert.ToInt32(parameters["discount"]);
 
            if (!parameters.ContainsKey("discount")) return true;
            var objDiscount = parameters["discount"].ObjectToDecimal(0);
 
            //判断参数是否设置的正确
            if (objDiscount >= 10 || objDiscount <= 0)
            {
                return true;
            }
            var orderAmount = cart.amount;
            //总价格修改
            cart.amount = Math.Round(Math.Round(Math.Round(cart.amount * objDiscount, 3) * 10, 2) / 100, 2);
            switch (promotionInfo.type)
            {
                case (int)GlobalEnumVars.PromotionType.Promotion:
                    //总促销修改
                    cart.orderPromotionMoney = Math.Round(cart.orderPromotionMoney + Math.Round(orderAmount - cart.amount, 2), 2);
                    //设置促销列表
                    if (cart.promotionList.ContainsKey(promotionInfo.id))
                    {
                        cart.promotionList[promotionInfo.id].name = promotionInfo.name;
                        cart.promotionList[promotionInfo.id].type = 2;
 
                    }
                    else
                    {
                        cart.promotionList.Add(promotionInfo.id, new WxNameTypeDto() { name = promotionInfo.name, type = 2 });
                    }
                    break;
 
                case (int)GlobalEnumVars.PromotionType.Coupon:
                    //优惠券促销金额
                    cart.couponPromotionMoney = Math.Round(cart.couponPromotionMoney + Math.Round(orderAmount - cart.amount, 2), 2);
                    break;
            }
            return true;
        }
 
        /// <summary>
        /// 指定商品减固定金额
        /// </summary>
        /// <param name="parameters"></param>
        /// <param name="cartProducts"></param>
        /// <param name="promotionInfo"></param>
        /// <returns></returns>
        public decimal result_GOODS_REDUCE(JObject parameters, CartProducts cartProducts, CoreCmsPromotion promotionInfo)
        {
            if (!parameters.ContainsKey("money")) return 0;
            var objMoney = parameters["money"].ObjectToDecimal(0);
            var isApplyToNum = parameters["isApplyToNum"].ObjectToInt(1);
 
            decimal promotionMoney = 0;
            //判断极端情况,减的太多,超过商品单价了,那么就最多减到0
            if (cartProducts.products.price < objMoney)
            {
                objMoney = cartProducts.products.price;
            }
            //此处不存储优惠后单价,防止出现针对单个产品,多个数量情况下,单一优惠券无法针对每个数量的商品进行计算售价。
            //cartProducts.products.price = Math.Round(cartProducts.products.price - objMoney, 2);
            //此次商品促销一共优惠了多少钱
            if (promotionInfo.type is (int)GlobalEnumVars.PromotionType.Coupon or (int)GlobalEnumVars.PromotionType.Seckill or (int)GlobalEnumVars.PromotionType.Group or (int)GlobalEnumVars.PromotionType.Promotion)
            {
                promotionMoney = isApplyToNum == 1 ? objMoney : Math.Round(cartProducts.nums * objMoney, 2);
            }
            else
            {
                promotionMoney = Math.Round(cartProducts.nums * objMoney, 2);
            }
            //promotionMoney = promotionInfo.type == (int)GlobalEnumVars.PromotionType.Coupon ? isApplyToNum == 1 ? objMoney : Math.Round(cartProducts.nums * objMoney, 2) : Math.Round(cartProducts.nums * objMoney, 2);
            //设置商品优惠总金额
            cartProducts.products.promotionAmount = Math.Round(cartProducts.products.promotionAmount + promotionMoney, 2);
            //设置商品的实际销售金额(单品)
            cartProducts.products.amount = Math.Round(cartProducts.products.amount - promotionMoney, 2);
            return promotionMoney;
        }
 
        /// <summary>
        /// 指定商品打X折
        /// </summary>
        /// <param name="parameters"></param>
        /// <param name="cartProducts"></param>
        /// <param name="promotionInfo"></param>
        /// <returns></returns>
        public decimal result_GOODS_DISCOUNT(JObject parameters, CartProducts cartProducts, CoreCmsPromotion promotionInfo)
        {
            if (!parameters.ContainsKey("discount")) return 0;
            var objDiscount = parameters["discount"].ObjectToDecimal(0);
            var isApplyToNum = parameters["isApplyToNum"].ObjectToInt(1);
 
            //判断参数是否设置的正确
            if (objDiscount >= 10 || objDiscount <= 0)
            {
                return 0;
            }
 
            decimal goodsPrice = cartProducts.products.price;
            //此处不存储优惠后单价,防止出现针对单个产品,多个数量情况下,单一优惠券无法针对每个数量的商品进行计算售价。
            //cartProducts.products.price = Math.Round(Math.Round(Math.Round(cartProducts.products.price * objDiscount, 3) * 10, 2) / 100, 2);
            var productsPrice = Math.Round(Math.Round(Math.Round(cartProducts.products.price * objDiscount, 3) * 10, 2) / 100, 2);
 
            //单品优惠的金额
            var pmoney = Math.Round(goodsPrice - productsPrice, 2);
            decimal promotionMoney = 0;
            if (promotionInfo.type is (int)GlobalEnumVars.PromotionType.Coupon or (int)GlobalEnumVars.PromotionType.Seckill or (int)GlobalEnumVars.PromotionType.Group or (int)GlobalEnumVars.PromotionType.Promotion)
            {
                promotionMoney = isApplyToNum == 1 ? pmoney : Math.Round(cartProducts.nums * pmoney, 2);
            }
            else
            {
                promotionMoney = Math.Round(cartProducts.nums * pmoney, 2);
            }
            //var promotionMoney = promotionInfo.type == (int)GlobalEnumVars.PromotionType.Coupon ? isApplyToNum == 1 ? pmoney : Math.Round(cartProducts.nums * pmoney, 2) : Math.Round(cartProducts.nums * pmoney, 2);
            //设置商品优惠总金额
            cartProducts.products.promotionAmount = Math.Round(cartProducts.products.promotionAmount + promotionMoney, 2);
            //设置商品的实际销售总金额
            cartProducts.products.amount = Math.Round(cartProducts.products.amount - promotionMoney, 2);
 
            return promotionMoney;
        }
 
        //商品一口价
        public decimal result_GOODS_ONE_PRICE(JObject parameters, CartProducts cartProducts, CoreCmsPromotion promotionInfo)
        {
            if (!parameters.ContainsKey("money")) return 0;
            var objMoney = parameters["money"].ObjectToDecimal(0);
            var isApplyToNum = parameters["isApplyToNum"].ObjectToInt(1);
 
            //如果一口价比商品价格高,那么就不执行了
            decimal promotionMoney = 0;
            if (cartProducts.products.price <= objMoney)
            {
                return promotionMoney;
            }
            var goodsPrice = (decimal)cartProducts.products.price;
            //此处不存储优惠后单价,防止出现针对单个产品,多个数量情况下,单一优惠券无法针对每个数量的商品进行计算售价。
            //cartProducts.products.price = Math.Round(objMoney, 2);
            var productsPrice = Math.Round(objMoney, 2);
            //单品优惠的金额
            var pmoney = Math.Round(goodsPrice - productsPrice, 2);
            if (promotionInfo.type is (int)GlobalEnumVars.PromotionType.Coupon or (int)GlobalEnumVars.PromotionType.Seckill or (int)GlobalEnumVars.PromotionType.Group or (int)GlobalEnumVars.PromotionType.Promotion)
            {
                promotionMoney = isApplyToNum == 1 ? pmoney : Math.Round(cartProducts.nums * pmoney, 2);
            }
            else
            {
                promotionMoney = Math.Round(cartProducts.nums * pmoney, 2);
            }
            //promotionMoney = promotionInfo.type == (int)GlobalEnumVars.PromotionType.Coupon ? isApplyToNum == 1 ? pmoney : Math.Round(cartProducts.nums * pmoney, 2) : Math.Round(cartProducts.nums * pmoney, 2);
            //设置商品优惠总金额
            cartProducts.products.promotionAmount = Math.Round(cartProducts.products.promotionAmount + promotionMoney, 2);
            //设置商品的实际销售总金额
            cartProducts.products.amount = Math.Round(cartProducts.products.amount - promotionMoney, 2);
            return promotionMoney;
        }
 
        //指定商品每第几件减指定金额
        public decimal result_GOODS_HALF_PRICE(JObject parameters, CartProducts cartProducts, CoreCmsPromotion promotionInfo)
        {
            if (!parameters.ContainsKey("money")) return 0;
            var objMoney = parameters["money"].ObjectToDecimal(0);
 
            //如果一口价比商品价格高,那么就不执行了
            decimal promotionMoney = 0;
            if (cartProducts.products.price <= objMoney)
            {
                return promotionMoney;
            }
            //第几个优惠
            var num = parameters["num"].ObjectToInt(0);
            //购买的数量
            var buyNum = cartProducts.nums;
 
            if (cartProducts.nums >= num)
            {
                var promotionNum = buyNum / num;
                //var pmoney = Math.Round(objMoney / buyNum, 2);  //单品优惠的金额 
                //var goodsPrice = (decimal)cartProducts.products.price;
                //此处不存储优惠后单价,防止出现针对单个产品,多个数量情况下,单一优惠券无法针对每个数量的商品进行计算售价。
                //cartProducts.products.price = goodsPrice - pmoney; //优惠后的平均价格 
                promotionMoney = Math.Round(promotionNum * objMoney, 2);//优惠金额  
 
                //设置商品优惠总金额
                cartProducts.products.promotionAmount = Math.Round(cartProducts.products.promotionAmount + promotionMoney, 2);
                //设置商品的实际销售总金额
                cartProducts.products.amount = Math.Round(cartProducts.products.amount - promotionMoney, 2);
            }
 
            return promotionMoney;
        }
 
 
    }
}