private List <CommodityStockDTO> getComStocks(OrderScoreCheckDTO paramDto) { List <CommodityStockDTO> result = new List <CommodityStockDTO>(); Dictionary <Guid, Tuple <string, string> > dict = new Dictionary <Guid, Tuple <string, string> >(); List <Guid> comIds = new List <Guid>(); if (paramDto == null || paramDto.Coms == null || !paramDto.Coms.Any()) { return(result); } foreach (var comScoreCheckDTO in paramDto.Coms) { if (string.IsNullOrEmpty(comScoreCheckDTO.ColorAndSize)) { continue; } comScoreCheckDTO.ColorAndSize = comScoreCheckDTO.ColorAndSize.Replace("null", "").Replace("nil", "").Replace("undefined", "").Replace("(null)", "").Replace(",", ","); var arr = comScoreCheckDTO.ColorAndSize.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries); if (arr.Length == 2) { comIds.Add(comScoreCheckDTO.CommodityId); if (!dict.ContainsKey(comScoreCheckDTO.ItemId)) { dict.Add(comScoreCheckDTO.ItemId, new Tuple <string, string>(arr[0], arr[1])); } } } comIds = comIds.Distinct().ToList(); List <CommodityStockDTO> temp = CommodityStock.ObjectSet().Where(c => comIds.Contains(c.CommodityId)).Select(m => new CommodityStockDTO { Id = m.Id, Price = m.Price, Stock = m.Stock, CommodityId = m.CommodityId, ComAttribute = m.ComAttribute }).ToList(); foreach (var comScoreCheckDTO in paramDto.Coms) { if (comIds.All(c => c != comScoreCheckDTO.CommodityId)) { comScoreCheckDTO.CommodityStockId = Guid.Empty; continue; } var comStockDto = getComStock(temp, comScoreCheckDTO.CommodityId, dict[comScoreCheckDTO.ItemId].Item1, dict[comScoreCheckDTO.ItemId].Item2); if (comStockDto != null) { comScoreCheckDTO.CommodityStockId = comStockDto.Id; result.Add(comStockDto); } } return(result); }
public ResultDTO <OrderScoreCheckResultDTO> OrderScoreCheck(OrderScoreCheckDTO paramDto) { //定义返回值 Jinher.AMP.BTP.Deploy.CustomDTO.ResultDTO <Jinher.AMP.BTP.Deploy.CustomDTO.OrderScoreCheckResultDTO> result; try { //调用代理方法 result = base.Channel.OrderScoreCheck(paramDto); } catch { //抛异常 throw; } finally { //关链接 ChannelClose(); } //返回结果 return(result); }
public ResultDTO <OrderScoreCheckResultDTO> OrderScoreCheckExt(OrderScoreCheckDTO paramDto) { ResultDTO <OrderScoreCheckResultDTO> result = new ResultDTO <OrderScoreCheckResultDTO>() { Message = "Success", Data = new OrderScoreCheckResultDTO() }; //OrderScoreCheckResultDTO resultData = new OrderScoreCheckResultDTO(); //resultData.IsCashForScore = true; //resultData.Score = 120000; //resultData.ScoreCost = 100; //resultData.ScoreType = ScoreTypeEnum.Self; //var price = (paramDto.Coms[0].RealPrice * paramDto.Coms[0].Num / 10.0m).ToMoney(); //resultData.Money = price; //resultData.List = new List<AppScoreDTO>(){new AppScoreDTO() // { // AppId = paramDto.EsAppId, // Money = price // }}; //result.Data = resultData; //return result; DateTime now = DateTime.Now; if (paramDto == null || paramDto.EsAppId == Guid.Empty || paramDto.Coms == null || !paramDto.Coms.Any()) { return new ResultDTO <OrderScoreCheckResultDTO>() { ResultCode = 1, Message = "参数有误" } } ; var comIds = paramDto.Coms.Select(c => c.CommodityId).Distinct().ToList(); var coms = Commodity.ObjectSet().Where(c => comIds.Contains(c.Id)).Select(m => new CommodityDTO { Id = m.Id, Price = m.Price, AppId = m.AppId, ScorePercent = m.ScorePercent }).ToList(); var appIds = coms.Select(c => c.AppId).ToList(); appIds.Add(paramDto.EsAppId); appIds = appIds.Distinct().ToList(); var appExts = AppExtension.ObjectSet() .Where(c => appIds.Contains(c.Id) && c.IsCashForScore && c.IsScoreAll != null) .Select(c => new Deploy.AppExtensionDTO() { Id = c.Id, IsCashForScore = c.IsCashForScore, IsScoreAll = c.IsScoreAll, ScorePercent = c.ScorePercent }) .ToList(); Dictionary <Guid, Deploy.AppExtensionDTO> appExtDict = appExts.ToDictionary(x => x.Id, y => y); //获取支持积分抵现所有app,(不支持积分抵现、未设置积分抵现比例均视为不支持积分抵现) var cashForScoreAppIds = appExts.Select(c => c.Id).ToList(); //如果所有的app都没有启用积分抵现,直接返回 if (!cashForScoreAppIds.Any()) { return(result); } List <Deploy.CommodityStockDTO> comStocks = getComStocks(paramDto); #region 获取可参加积分抵现商品 List <ComScoreCheckReDTO> canScoreComList = new List <ComScoreCheckReDTO>(); foreach (var requestCom in paramDto.Coms) { var com = coms.First(c => c.Id == requestCom.CommodityId); if (cashForScoreAppIds.All(c => c != com.AppId)) { continue; } Deploy.CommodityStockDTO comStock = null; if (requestCom.CommodityStockId != null && requestCom.CommodityStockId != Guid.Empty) { comStock = comStocks.FirstOrDefault(c => c.Id == requestCom.CommodityStockId); } if (getOriPrice(com, comStock) == requestCom.RealPrice) { var scorePercent = appExtDict[com.AppId].IsScoreAll == true ? (decimal?)appExtDict[com.AppId].ScorePercent : com.ScorePercent; if (!scorePercent.HasValue || scorePercent <= 0) { continue; } var item = ComScoreCheckReDTO.FromRequest(requestCom, com.AppId); item.CanScoreMoney = (requestCom.RealPrice * requestCom.Num * scorePercent.Value).ToMoney(); if (item.CanScoreMoney <= 0) { continue; } canScoreComList.Add(item); } } //只有不参加活动的商品才可以使用积分抵现 if (!canScoreComList.Any()) { return(result); } #endregion var checkResult = SignSV.Instance.QueryAllScores(appIds, paramDto.UserId); if (checkResult == null || checkResult.ScoreDetailList == null || !checkResult.ScoreDetailList.Any()) { return new ResultDTO <OrderScoreCheckResultDTO>() { ResultCode = 1, Message = "积分校验失败" } } ; //校验是否在本应用下单(非通用积分商城中下单不允许使用) bool isInSelfApp = coms.All(c => c.AppId == paramDto.EsAppId); int cost; //积分汇率 int scoreCount; //积分数量 //是否都是通用积分 bool isAllCurrency = checkResult.ScoreDetailList.All(returnUnitiveScoreDTO => returnUnitiveScoreDTO.IsUnitive); if (isAllCurrency) { //汇率无效 if (checkResult.ExchangeRate <= 0) { return(result); } cost = checkResult.ExchangeRate; scoreCount = checkResult.UnitiveScore; } //非通用积分只有在本app下才可以使用 else if (isInSelfApp) { var scoreSetting = (from ss in ScoreSetting.ObjectSet() where ss.AppId == paramDto.EsAppId && ss.SubTime <= now orderby ss.SubTime descending select new { ss.ScoreCost }).FirstOrDefault(); if (scoreSetting == null) { return(result); } cost = scoreSetting.ScoreCost.Value; var appInfo = checkResult.ScoreDetailList.FirstOrDefault(c => c.AppId == paramDto.EsAppId); if (appInfo == null) { return(result); } scoreCount = appInfo.AvailableScore; } else { return(result); } result.Data.IsCashForScore = true; result.Data.Score = scoreCount; result.Data.ScoreType = isAllCurrency ? ScoreTypeEnum.Currency : ScoreTypeEnum.Self; result.Data.ScoreCost = cost; //用户积分折现金额, decimal userScoreMoney = (scoreCount * 1.0m / cost).ToMoney(); //总可参与积分抵现的总金额 decimal canScoreMoney = canScoreComList.Sum(c => c.CanScoreMoney); if (userScoreMoney > canScoreMoney) { userScoreMoney = canScoreMoney; } var dict = canScoreComList.GroupBy(c => c.AppId).ToDictionary(x => x.Key, y => y.ToList()); foreach (var kv in dict) { var appExt = appExts.FirstOrDefault(c => c.Id == kv.Key); if (appExt == null) { continue; } AppScoreDTO appScoreDTO = new AppScoreDTO() { AppId = kv.Key }; foreach (var com in kv.Value) { com.Money = getScoreMoney(userScoreMoney * com.CanScoreMoney / canScoreMoney, cost); if (com.Money <= 0) { continue; } appScoreDTO.Money += com.Money; appScoreDTO.Coms.Add(com); } if (appScoreDTO.Money <= 0) { continue; } result.Data.List.Add(appScoreDTO); result.Data.Money += appScoreDTO.Money; } #region 订单减免->订单减免后余额小于积分抵现金额 decimal money = 0.0m; foreach (var appScoreDTO in result.Data.List) { var reducation = paramDto.Reductions.FirstOrDefault(c => c.AppId == appScoreDTO.AppId); if (reducation == null || reducation.Reduction <= 0) //不存在订单减免,不需要处理 { money += appScoreDTO.Money; continue; } var appComIds = coms.Where(c => c.AppId == appScoreDTO.AppId).Select(c => c.Id).ToList(); var appTotalPrice = paramDto.Coms.Where(c => appComIds.Contains(c.CommodityId)).Sum(c => c.RealPrice * c.Num); var appPrice = appTotalPrice - reducation.Reduction; if (appPrice > appScoreDTO.Money) //订单订单减免后金额足够支付,不需要处理 { money += appScoreDTO.Money; continue; } var percent = appPrice / appTotalPrice; appScoreDTO.Money = 0; for (int i = 0; i < appScoreDTO.Coms.Count - 1; i++) { appScoreDTO.Coms[i].Money = (appScoreDTO.Coms[i].Money * percent).ToMoney(); appScoreDTO.Money += appScoreDTO.Coms[i].Money; } //处理由于四舍五入造成除不尽的问题,剩余数据都给最后一条订单项 appScoreDTO.Coms[appScoreDTO.Coms.Count - 1].Money = appPrice - appScoreDTO.Money; appScoreDTO.Money += appScoreDTO.Coms[appScoreDTO.Coms.Count - 1].Money; money += appScoreDTO.Money; } result.Data.Money = money; #endregion return(result); }
public ResultDTO <OrderScoreCheckResultDTO> OrderScoreCheck(OrderScoreCheckDTO paramDto) { base.Do(false); return(this.OrderScoreCheckExt(paramDto)); }