/*********************************************************************** * 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.Auth.HttpContextUser; using CoreCms.Net.Configuration; using CoreCms.Net.DTO.ComponentsDTO; using CoreCms.Net.IRepository; using CoreCms.Net.IRepository.UnitOfWork; using CoreCms.Net.IServices; using CoreCms.Net.IServices.baifenbingfa; using CoreCms.Net.Loging; using CoreCms.Net.Model.Entities; using CoreCms.Net.Model.Entities.Expression; using CoreCms.Net.Model.FromBody; using CoreCms.Net.Model.ViewModels.DTO; using CoreCms.Net.Model.ViewModels.UI; using CoreCms.Net.Utility.Extensions; using Essensoft.Paylink.Alipay.Domain; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NPOI.SS.Formula.Functions; using Org.BouncyCastle.Crypto; using SqlSugar; using static NPOI.HSSF.Util.HSSFColor; namespace CoreCms.Net.Services { /// /// 单页 接口实现 /// public class CoreCmsPagesServices : BaseServices, ICoreCmsPagesServices { private readonly ICoreCmsPagesRepository _dal; private readonly ICoreCmsPagesItemsRepository _pagesItemsRepository; private readonly ICoreCmsPromotionServices _promotionServices; private readonly ICoreCmsNoticeServices _noticeServices; private readonly ICoreCmsGoodsCategoryServices _goodsCategoryServices; private readonly ICoreCmsSettingServices _settingServices; private readonly ICoreCmsGoodsServices _goodsServices; private readonly ICoreCmsArticleServices _articleServices; private readonly ICoreCmsArticleTypeServices _articleTypeServices; private readonly ICoreCmsPromotionConditionServices _promotionConditionServices; private readonly ICoreCmsPinTuanRuleServices _pinTuanRuleServices; private readonly ICoreCmsServicesServices _servicesServices; private readonly ICoreCmsGoodsCategoryExtendServices _goodsCategoryExtendServices; private readonly IHttpContextUser _contextUser; private readonly IBfbfComAPIService _bfbfComAPIService; private readonly IUnitOfWork _unitOfWork; public CoreCmsPagesServices(IUnitOfWork unitOfWork , ICoreCmsPagesRepository dal , ICoreCmsPagesItemsRepository pagesItemsRepository, ICoreCmsPromotionServices promotionServices, ICoreCmsNoticeServices noticeServices, ICoreCmsGoodsCategoryServices goodsCategoryServices, ICoreCmsSettingServices settingServices, ICoreCmsGoodsServices goodsServices, ICoreCmsArticleServices articleServices, ICoreCmsPromotionConditionServices promotionConditionServices, ICoreCmsPinTuanRuleServices pinTuanRuleServices, ICoreCmsServicesServices servicesServices, ICoreCmsArticleTypeServices articleTypeServices, ICoreCmsGoodsCategoryExtendServices goodsCategoryExtendServices, IHttpContextUser httpContextUser, IBfbfComAPIService bfbfComAPIService) { this._dal = dal; _pagesItemsRepository = pagesItemsRepository; _promotionServices = promotionServices; _noticeServices = noticeServices; _goodsCategoryServices = goodsCategoryServices; _settingServices = settingServices; _goodsServices = goodsServices; _articleServices = articleServices; _promotionConditionServices = promotionConditionServices; _pinTuanRuleServices = pinTuanRuleServices; _servicesServices = servicesServices; _articleTypeServices = articleTypeServices; _goodsCategoryExtendServices = goodsCategoryExtendServices; base.BaseDal = dal; _unitOfWork = unitOfWork; _contextUser= httpContextUser; _bfbfComAPIService = bfbfComAPIService; } /// /// 重写异步插入方法 /// /// 实体数据 /// public async Task InsertAsync(CoreCmsPages entity) { return await _dal.InsertAsync(entity); } /// /// 重写异步更新方法方法 /// /// /// public async Task UpdateAsync(CoreCmsPages entity) { return await _dal.UpdateAsync(entity); } /// /// 重写删除指定ID的数据 /// /// /// public async Task DeleteByIdAsync(int id) { return await _dal.DeleteByIdAsync(id); } /// /// 更新设计 /// /// /// public async Task UpdateDesignAsync(FmPagesUpdate entity) { return await _dal.UpdateDesignAsync(entity); } /// /// 复制一个同样的数据 /// /// /// public async Task CopyByIdAsync(int id) { return await _dal.CopyByIdAsync(id); } #region 获取首页数据 /// /// 获取首页数据 /// /// /// public async Task GetPageConfig(string code) { var userID= _contextUser.ID; var jm = new WebApiCallBack(); var wherePage = PredicateBuilder.True(); wherePage = code == "mobile_home" ? wherePage.And(p => p.type == 1) : wherePage.And(p => p.code == code); var model = await _dal.QueryByClauseAsync(wherePage, true, true); if (model == null) { return jm; } jm.status = true; var items = await _pagesItemsRepository.QueryListByClauseAsync(p => p.pageCode == model.code, p => p.sort, OrderByType.Asc, true, true); var itemsDto = new List(); foreach (var item in items) { var dto = new PagesItemsDto(); dto.id = item.id; dto.widgetCode = item.widgetCode; dto.pageCode = item.pageCode; dto.positionId = item.positionId; dto.sort = item.sort; item.parameters = item.parameters.Replace("/images/empty-banner.png", "/static/images/common/empty-banner.png"); switch (item.widgetCode) { //搜索 case "search": case "tabBar": dto.parameters = JsonConvert.DeserializeObject(item.parameters); break; case "notice": { var parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); if (parameters != null && parameters.ContainsKey("type") && parameters["type"].ToString() == "auto") { var list = await _noticeServices.QueryComponentAsync(p => p.isDel == false); if (list != null && list.Any()) { var result = JArray.FromObject(list); parameters.Remove("list"); parameters.Add("list", result); } } else if (parameters != null && parameters.ContainsKey("type") && parameters["type"].ToString() == "choose") { var where = PredicateBuilder.True(); var orderBy = string.Empty; var noticeIdsStr = string.Empty; if (parameters != null && parameters.ContainsKey("list")) { var result = JArray.Parse(parameters["list"].ToString()); var noticeIds = result.Select(ss => ((JObject)ss)["id"].ObjectToInt(0)).Where(noticeId => noticeId > 0).ToList(); where = where.And(p => noticeIds.Contains(p.id)); //if (noticeIds.Any()) //{ // noticeIdsStr = string.Join(",", noticeIdsStr); // //按照固定的序列id进行排序 // if (AppSettingsConstVars.DbDbType == DbType.SqlServer.ToString()) // { // orderBy = " CHARINDEX(RTRIM(CAST(id as NCHAR)),'" + noticeIdsStr + "') "; // } // else if (AppSettingsConstVars.DbDbType == DbType.MySql.ToString()) // { // orderBy = " find_in_set(id,'" + noticeIdsStr + "') "; // } //} } var notices = await _noticeServices.QueryListByClauseAsync(where, p => p.createTime, OrderByType.Desc); if (notices != null && notices.Any()) { var result = JArray.FromObject(notices); parameters.Remove("list"); parameters.Add("list", result); } else { parameters.Remove("list"); parameters.Add("list", new JArray()); } } dto.parameters = parameters; break; } case "imgSlide": dto.parameters = JsonConvert.DeserializeObject(item.parameters); break; case "coupon": { var parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); if (parameters != null && parameters.ContainsKey("limit") && parameters["limit"].ObjectToInt(0) != 0) { var list = await _promotionServices.ReceiveCouponList(parameters["limit"].ObjectToInt(0)); if (list != null && list.Any()) { var result = JArray.FromObject(list); parameters.Remove("list"); parameters.Add("list", result); } } dto.parameters = parameters; break; } case "blank": dto.parameters = JsonConvert.DeserializeObject(item.parameters); break; case "textarea": { var parameters = new JObject(); parameters["value"] = item.parameters; dto.parameters = parameters; break; } case "video": case "imgWindow": case "imgSingle": dto.parameters = JsonConvert.DeserializeObject(item.parameters); break; case "goodTabBar": { bool isDic = await _bfbfComAPIService.IsDictionary(_contextUser.ID); var parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); if (parameters != null && parameters.ContainsKey("list")) { var list = JArray.Parse(parameters["list"].ToString()); var newList = new JArray(); foreach (var jToken in list) { var child = (JObject)jToken; var where = PredicateBuilder.True(); if (child != null && child.ContainsKey("type") && child["type"].ToString() == "auto") { //商品分类,同时取所有子分类 if (child.ContainsKey("classifyId") && child["classifyId"].ObjectToInt(0) > 0) { var classifyId = child["classifyId"].ObjectToInt(0); var gc = await _goodsCategoryServices.GetCaChe(); var childCats = gc.Where(p => p.parentId == classifyId).ToList(); var catIds = childCats != null && childCats.Any() ? childCats.Select(p => p.id).ToList() : new List(); catIds.Add(classifyId); where = where.And(p => catIds.Contains(p.goodsCategoryId)); //扩展分类 CoreCmsGoodsCategory } //品牌筛选 if (child.ContainsKey("brandId") && child["brandId"].ObjectToInt(0) > 0) { var brandId = child["brandId"].ObjectToInt(0); where = where.And(p => p.brandId == brandId); } var limit = 0; if (child.ContainsKey("limit") && child["limit"].ObjectToInt(0) > 0) { limit = child["limit"].ObjectToInt(0); } limit = limit > 0 ? limit : 10; var goods = await _goodsServices.QueryListByComponentsAsync(where, limit, p => p.createTime, OrderByType.Desc, true, true, 60); if(goods!=null) { //百分兵法经销商修改价格 if(isDic) { foreach (var gd in goods) { gd.price = gd.distributionPrice; } } } if (goods != null && goods.Any()) { var result = JArray.FromObject(goods); child.Remove("list"); child.Add("list", result); } else { child.Remove("list"); child.Add("list", new JArray()); } } else { var orderBy = string.Empty; string goodidsStr; var count = 0; if (child != null && child.ContainsKey("list")) { var result = JArray.Parse(child["list"].ToString()); var goodids = result.Select(ss => ((JObject)ss)["id"].ObjectToInt(0)).Where(goodid => goodid > 0).ToList(); where = where.And(p => goodids.Contains(p.id)); if (goodids.Any()) { goodidsStr = string.Join(",", goodids); //按照id序列打乱后的顺序排序 if (AppSettingsConstVars.DbDbType == DbType.SqlServer.ToString()) { orderBy = " CHARINDEX(RTRIM(CAST(id as NCHAR)),'" + goodidsStr + "') "; } else if (AppSettingsConstVars.DbDbType == DbType.MySql.ToString()) { orderBy = " find_in_set(id,'" + goodidsStr + "') "; } count = goodids.Count; } } var goods = await _goodsServices.QueryListByComponentsAsync(where, count, orderBy, true, true, 60); if (goods != null && goods.Any()) { var result = JArray.FromObject(goods); child.Remove("list"); child.Add("list", result); } else { child.Remove("list"); child.Add("list", new JArray()); } } newList.Add(child); } if (newList != null && newList.Any()) { parameters.Remove("list"); parameters.Add("list", newList); } } dto.parameters = parameters; break; } case "goods": { var parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); var where = PredicateBuilder.True(); if (parameters != null && parameters.ContainsKey("type") && parameters["type"].ToString() == "auto") { //商品分类,同时取所有子分类 if (parameters.ContainsKey("classifyId") && parameters["classifyId"].ObjectToInt(0) > 0) { var classifyId = parameters["classifyId"].ObjectToInt(0); var gc = await _goodsCategoryServices.GetCaChe(); var childCats = gc.Where(p => p.parentId == classifyId).ToList(); //获取当前配置的商品分类 var tgc = gc.Where(x => x.id == classifyId).FirstOrDefault(); //给返回参数增加key if(!string.IsNullOrEmpty(tgc?.key)) //增加商品分类的key parameters.Add("key",tgc?.key??"" ); var catIds = childCats != null && childCats.Any() ? childCats.Select(p => p.id).ToList() : new List(); catIds.Add(classifyId); //where = where.And(p => catIds.Contains(p.goodsCategoryId)); //扩展分类 var extends = await _goodsCategoryExtendServices.QueryListByClauseAsync(p => p.goodsCategroyId == classifyId); if (extends.Any()) { var extGoodIds = extends.Select(p => p.goodsId).ToList(); where = where.And(p => catIds.Contains(p.goodsCategoryId) || extGoodIds.Contains(p.id)); } else { where = where.And(p => catIds.Contains(p.goodsCategoryId)); } //扩展分类 CoreCmsGoodsCategory } //品牌筛选 if (parameters.ContainsKey("brandId") && parameters["brandId"].ObjectToInt(0) > 0) { var brandId = parameters["brandId"].ObjectToInt(0); where = where.And(p => p.brandId == brandId); } //数量 var limit = 0; if (parameters.ContainsKey("limit") && parameters["limit"].ObjectToInt(0) > 0) { limit = parameters["limit"].ObjectToInt(0); } limit = limit > 0 ? limit : 10; var goods = await _goodsServices.QueryListByComponentsAsync(where, limit, " sort asc,id asc ", true, true, 60); if (goods != null) { bool isDic = await _bfbfComAPIService.IsDictionary(_contextUser.ID); //百分兵法经销商修改价格 if (isDic) { foreach (var gd in goods) { gd.price = gd.distributionPrice; } } } if (goods != null && goods.Any()) { var result = JArray.FromObject(goods); parameters.Remove("list"); parameters.Add("list", result); } else { parameters.Remove("list"); parameters.Add("list", new JArray()); } } else { var orderBy = string.Empty; string goodidsStr; var count = 0; if (parameters != null && parameters.ContainsKey("list")) { var result = JArray.Parse(parameters["list"].ToString()); var goodids = new List(); foreach (var ss in result) //查找某个字段与值 { var goodid = ((JObject)ss)["id"].ObjectToInt(0); if (goodid > 0) { goodids.Add(goodid); } } where = where.And(p => goodids.Contains(p.id)); if (goodids.Any()) { goodidsStr = string.Join(",", goodids); //按照id序列打乱后的顺序排序 if (AppSettingsConstVars.DbDbType == DbType.SqlServer.ToString()) { orderBy = " CHARINDEX(RTRIM(CAST(id as NCHAR)),'" + goodidsStr + "') "; } else if (AppSettingsConstVars.DbDbType == DbType.MySql.ToString()) { orderBy = " find_in_set(id,'" + goodidsStr + "') "; } } count = goodids.Count; } var goods = await _goodsServices.QueryListByComponentsAsync(where, count, orderBy, true, true, 60); if (goods != null) { bool isDic = await _bfbfComAPIService.IsDictionary(_contextUser.ID); //百分兵法经销商修改价格 if (isDic) { foreach (var gd in goods) { gd.price = gd.distributionPrice; } } } if (goods != null && goods.Any()) { var result = JArray.FromObject(goods); parameters.Remove("list"); parameters.Add("list", result); } else { parameters.Remove("list"); parameters.Add("list", new JArray()); } } dto.parameters = parameters; break; } case "article": dto.parameters = JsonConvert.DeserializeObject(item.parameters); break; case "articleClassify": { var parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); if (parameters != null) { if (parameters.ContainsKey("articleClassifyId") && parameters["articleClassifyId"].ObjectToInt(0) > 0) { var articleClassifyId = parameters["articleClassifyId"].ObjectToInt(0); var limit = parameters["limit"].ObjectToInt(0); limit = limit > 0 ? limit : 20; var articleClassifyObj = await _articleTypeServices.QueryByClauseAsync(p => p.id == articleClassifyId, true, true); var articleClassifyObjJson = JsonConvert.SerializeObject(articleClassifyObj); parameters.Add("articleClassifyObj", JToken.Parse(articleClassifyObjJson)); var list = await _articleServices.QueryPageAsync(p => p.typeId == articleClassifyId && p.isPub == true, p => p.createTime, OrderByType.Desc, 1, limit, true, true); if (list != null && list.Any()) { var result = JArray.FromObject(list); parameters.Remove("list"); parameters.Add("list", result); } } } dto.parameters = parameters; break; } case "navBar": dto.parameters = JsonConvert.DeserializeObject(item.parameters); break; case "groupPurchase": { var parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); if (parameters != null && parameters.ContainsKey("list")) { var result = JArray.Parse(parameters["list"].ToString()); var ids = new List(); foreach (var jToken in result) { var ss = (JObject)jToken; if (ss.ContainsKey("id")) { //判断拼团状态 var dt = DateTime.Now; var promotionId = ss["id"].ObjectToInt(0); if (promotionId > 0) { ids.Add(promotionId); } } } if (ids.Any()) { var list = await _promotionServices.GetGroupListForPages(ids.ToArray()); parameters.Remove("list"); parameters.Add("list", JArray.FromObject(list)); } } dto.parameters = parameters; break; } case "seckill": { var parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); if (parameters != null && parameters.ContainsKey("list")) { var result = JArray.Parse(parameters["list"].ToString()); var ids = new List(); foreach (var jToken in result) { var ss = (JObject)jToken; if (ss.ContainsKey("id")) { //判断拼团状态 var dt = DateTime.Now; var promotionId = ss["id"].ObjectToInt(0); if (promotionId > 0) { ids.Add(promotionId); } } } if (ids.Any()) { var list = await _promotionServices.GetGroupListForPages(ids.ToArray()); parameters.Remove("list"); parameters.Add("list", JArray.FromObject(list)); } } dto.parameters = parameters; break; } case "record": dto.parameters = JsonConvert.DeserializeObject(item.parameters); break; case "pinTuan": { var parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); if (parameters != null && parameters.ContainsKey("list")) { var result = JArray.Parse(parameters["list"].ToString()); var newReslut = new JArray(); var ruleIdIds = (from JObject ss in result where ss.ContainsKey("goodsId") select ss["id"].ObjectToInt(0)).ToArray(); if (ruleIdIds.Any()) { var dtoData = await _pinTuanRuleServices.GetPinTuanInfos(ruleIdIds, p => p.sortId, OrderByType.Asc, 1, result.Count); foreach (var itemDto in dtoData) { //判断拼团状态 var dt = DateTime.Now; if (itemDto.startTime > dt) { itemDto.startStatus = (int)GlobalEnumVars.PinTuanRuleStatus.notBegun; itemDto.timestamp = (int)itemDto.startTime.Subtract(dt).TotalSeconds; } else if (itemDto.startTime <= dt && itemDto.endTime > dt) { itemDto.startStatus = (int)GlobalEnumVars.PinTuanRuleStatus.begin; itemDto.timestamp = (int)itemDto.endTime.Subtract(dt).TotalSeconds; } else { itemDto.startStatus = (int)GlobalEnumVars.PinTuanRuleStatus.haveExpired; } itemDto.pinTuanPrice -= itemDto.discountAmount; if (itemDto.pinTuanPrice < 0) itemDto.pinTuanPrice = 0; newReslut.Add(JObject.FromObject(itemDto)); } parameters.Remove("list"); parameters.Add("list", newReslut); } } dto.parameters = parameters; break; } case "service": { var parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); if (parameters != null && parameters.ContainsKey("list")) { var result = JArray.Parse(parameters["list"].ToString()); var ids = (from JObject ss in result where ss.ContainsKey("id") select ((JObject)ss)["id"].ObjectToInt(0) into id where id > 0 select id).ToList(); if (ids.Any()) { var serviceObj = await _servicesServices.QueryListByClauseAsync(p => ids.Contains(p.id), p => p.id, OrderByType.Asc, true, true); foreach (var jToken in result) { var ss = (JObject)jToken; var id = ss["id"].ObjectToInt(0); var serviceInfo = serviceObj.Find(p => p.id == id); if (serviceInfo != null) { ss["title"] = serviceInfo.title; ss["description"] = serviceInfo.description; ss["thumbnail"] = serviceInfo.thumbnail; int openStatus; int lastTime = 0; var dt = DateTime.Now; if (serviceInfo.startTime > dt) { openStatus = (int)GlobalEnumVars.ServicesOpenStatus.notBegun; var ts = serviceInfo.startTime.Subtract(dt); lastTime = (int)ts.TotalSeconds; } else if (serviceInfo.startTime <= dt && serviceInfo.endTime > dt) { openStatus = (int)GlobalEnumVars.ServicesOpenStatus.begin; var ts = serviceInfo.endTime.Subtract(dt); lastTime = (int)ts.TotalSeconds; } else { openStatus = (int)GlobalEnumVars.ServicesOpenStatus.haveExpired; } ss["openStatus"] = openStatus; //ss.Add("openStatus", openStatus); ss.Add("lastTime", lastTime); } } } parameters.Remove("list"); parameters.Add("list", result); } dto.parameters = parameters; break; } case "adpop": case "topImgSlide": dto.parameters = JsonConvert.DeserializeObject(item.parameters); break; default: dto.parameters = JsonConvert.DeserializeObject(item.parameters); break; } itemsDto.Add(dto); } jm.data = new { model.code, desc = model.description, model.id, model.layout, model.name, model.type, items = itemsDto }; return jm; } #endregion } }