/*********************************************************************** * Project: CoreCms * ProjectName: 核心内容管理系统 * Web: https://www.corecms.net * Author: 大灰灰 * Email: jianweie@163.com * CreateTime: 2021/1/31 21:45:10 * 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.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 Newtonsoft.Json; using Newtonsoft.Json.Linq; using SqlSugar; 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 ICoreCmsPromotionConditionServices _promotionConditionServices; private readonly ICoreCmsPinTuanRuleServices _pinTuanRuleServices; private readonly ICoreCmsServicesServices _servicesServices; 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) { this._dal = dal; _pagesItemsRepository = pagesItemsRepository; _promotionServices = promotionServices; _noticeServices = noticeServices; _goodsCategoryServices = goodsCategoryServices; _settingServices = settingServices; _goodsServices = goodsServices; _articleServices = articleServices; _promotionConditionServices = promotionConditionServices; _pinTuanRuleServices = pinTuanRuleServices; _servicesServices = servicesServices; base.BaseDal = dal; _unitOfWork = unitOfWork; } /// /// 重写异步插入方法 /// /// 实体数据 /// public new async Task InsertAsync(CoreCmsPages entity) { return await _dal.InsertAsync(entity); } /// /// 重写异步更新方法方法 /// /// /// public new 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 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); if (model == null) { return jm; } jm.status = true; var items = await _pagesItemsRepository.QueryListByClauseAsync(p => p.pageCode == model.code, p => p.sort, OrderByType.Asc); 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"); if (item.widgetCode == "search") //搜索 { dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); } else if (item.widgetCode == "tabBar") { dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); } else if (item.widgetCode == "notice") { JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); if (parameters != null && parameters.ContainsKey("type") && parameters["type"].ToString() == "auto") { var list = await _noticeServices.QueryListAsync(p => p.isDel == false, p => p.createTime, OrderByType.Desc, 1, 20); if (list != null && list.Any()) { JArray 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")) { JArray result = JArray.Parse(parameters["list"].ToString()); var noticeIds = new List(); foreach (var ss in result) //查找某个字段与值 { var noticeId = ((JObject)ss)["id"].ObjectToInt(0); if (noticeId > 0) { noticeIds.Add(noticeId); } } 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, orderBy); if (notices != null && notices.Any()) { JArray result = JArray.FromObject(notices); parameters.Remove("list"); parameters.Add("list", result); } else { parameters.Remove("list"); parameters.Add("list", new JArray()); } } dto.parameters = parameters; } else if (item.widgetCode == "imgSlide") { dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); } else if (item.widgetCode == "coupon") { JObject 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()) { JArray result = JArray.FromObject(list); parameters.Remove("list"); parameters.Add("list", result); } } dto.parameters = parameters; } else if (item.widgetCode == "blank") { dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); } else if (item.widgetCode == "textarea") { JObject parameters = new JObject(); parameters["value"] = item.parameters; dto.parameters = parameters; } else if (item.widgetCode == "video") { dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); } else if (item.widgetCode == "imgWindow") { dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); } else if (item.widgetCode == "imgSingle") { dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); } else if (item.widgetCode == "goodTabBar") { JObject 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(); where = where.And(p => p.isDel == false); where = where.And(p => p.isMarketable == 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 childCats = await _goodsCategoryServices.QueryListByClauseAsync(p => p.parentId == classifyId); 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.QueryListByClauseAsync(where, limit, p => p.createTime, OrderByType.Desc, true); if (goods != null && goods.Any()) { JArray 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; if (child != null && child.ContainsKey("list")) { JArray result = JArray.Parse(child["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 + "') "; } } } var goods = await _goodsServices.QueryListByClauseAsync(where, orderBy); if (goods != null && goods.Any()) { JArray 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; } else if (item.widgetCode == "goods") { JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); var where = PredicateBuilder.True(); where = where.And(p => p.isDel == false); where = where.And(p => p.isMarketable == 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 childCats = await _goodsCategoryServices.QueryListByClauseAsync(p => p.parentId == classifyId); 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 (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.QueryPageAsync(where, " sort desc,id desc ", 1, limit, true); if (goods != null && goods.Any()) { JArray 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; var goodidsStr = string.Empty; if (parameters != null && parameters.ContainsKey("list")) { JArray 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 + "') "; } } } var goods = await _goodsServices.QueryListByClauseAsync(where, orderBy); if (goods != null && goods.Any()) { JArray result = JArray.FromObject(goods); parameters.Remove("list"); parameters.Add("list", result); } else { parameters.Remove("list"); parameters.Add("list", new JArray()); } } dto.parameters = parameters; } else if (item.widgetCode == "article") { dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); } else if (item.widgetCode == "articleClassify") { JObject 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 list = await _articleServices.QueryPageAsync(p => p.typeId == articleClassifyId && p.isPub == true, p => p.createTime, OrderByType.Desc, 1, limit); if (list != null && list.Any()) { JArray result = JArray.FromObject(list); parameters.Remove("list"); parameters.Add("list", result); } } } dto.parameters = parameters; } else if (item.widgetCode == "navBar") { dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); } else if (item.widgetCode == "groupPurchase") { JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); if (parameters != null && parameters.ContainsKey("list")) { JArray result = JArray.Parse(parameters["list"].ToString()); var newReslut = new JArray(); foreach (var jToken in result) { var ss = (JObject)jToken; if (ss.ContainsKey("id")) { //判断拼团状态 var dt = DateTime.Now; var promotionId = ((JObject)ss)["id"].ObjectToInt(0); if (promotionId > 0) { var promotionModel = await _promotionServices.QueryByClauseAsync(p => p.id == promotionId && p.isEnable == true && p.startTime <= dt && p.endTime > dt); if (promotionModel != null) { var condition = await _promotionConditionServices.QueryByClauseAsync(p => p.promotionId == promotionId); if (condition != null) { var obj = (JObject)JsonConvert.DeserializeObject(condition.parameters); if (obj.ContainsKey("goodsId") && obj["goodsId"].ObjectToInt(0) > 0) { var goodsId = obj["goodsId"].ObjectToInt(0); var goods = await _promotionServices.GetGroupDetail(goodsId, 0, "group", promotionId); if (goods.status) { var goodJson = JsonConvert.SerializeObject(goods.data); ((JObject)ss).Add("goods", JToken.Parse(goodJson)); } } } var startStatus = 1; int lastTime = 0; bool isOverdue = false; if (promotionModel.startTime > dt) { startStatus = (int)GlobalEnumVars.PinTuanRuleStatus.notBegun; TimeSpan ts = promotionModel.startTime.Subtract(dt); lastTime = (int)ts.TotalSeconds; isOverdue = lastTime > 0; } else if (promotionModel.startTime <= dt && promotionModel.endTime > dt) { startStatus = (int)GlobalEnumVars.PinTuanRuleStatus.begin; TimeSpan ts = promotionModel.endTime.Subtract(dt); lastTime = (int)ts.TotalSeconds; isOverdue = lastTime > 0; } else { startStatus = (int)GlobalEnumVars.PinTuanRuleStatus.haveExpired; } ((JObject)ss).Add("startStatus", startStatus); ((JObject)ss).Add("lastTime", lastTime); ((JObject)ss).Add("isOverdue", isOverdue); newReslut.Add(ss); } } } } parameters.Remove("list"); parameters.Add("list", newReslut); } dto.parameters = parameters; } else if (item.widgetCode == "record") { dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); } else if (item.widgetCode == "pinTuan") { JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); if (parameters != null && parameters.ContainsKey("list")) { JArray result = JArray.Parse(parameters["list"].ToString()); var newReslut = new JArray(); foreach (JObject ss in result) { if (ss.ContainsKey("goodsId")) { var goodsId = ((JObject)ss)["goodsId"].ObjectToInt(0); if (goodsId > 0) { var goodsInfo = await _pinTuanRuleServices.GetPinTuanInfo(goodsId); if (goodsInfo != null) { var pinTuanStartStatus = 1; int lastTime = 0; bool isOverdue = false; //判断拼团状态 var dt = DateTime.Now; if (goodsInfo.startTime > dt) { pinTuanStartStatus = (int)GlobalEnumVars.PinTuanRuleStatus.notBegun; TimeSpan ts = goodsInfo.startTime.Subtract(dt); lastTime = (int)ts.TotalSeconds; isOverdue = lastTime > 0; } else if (goodsInfo.startTime <= dt && goodsInfo.endTime > dt) { pinTuanStartStatus = (int)GlobalEnumVars.PinTuanRuleStatus.begin; TimeSpan ts = goodsInfo.endTime.Subtract(dt); lastTime = (int)ts.TotalSeconds; isOverdue = lastTime > 0; } else { pinTuanStartStatus = (int)GlobalEnumVars.PinTuanRuleStatus.haveExpired; } decimal pinTuanPrice = goodsInfo.goodsPrice - goodsInfo.discountAmount; if (pinTuanPrice < 0) pinTuanPrice = 0; var obj = new JObject(); ((JObject)obj).Add("pinTuanStartStatus", pinTuanStartStatus); ((JObject)obj).Add("lastTime", lastTime); ((JObject)obj).Add("isOverdue", isOverdue); ((JObject)obj).Add("pinTuanPrice", pinTuanPrice); ((JObject)obj).Add("createTime", goodsInfo.createTime); ((JObject)obj).Add("discountAmount", goodsInfo.discountAmount); ((JObject)obj).Add("endTime", goodsInfo.endTime); ((JObject)obj).Add("goodsId", goodsInfo.goodsId); ((JObject)obj).Add("goodsImage", goodsInfo.goodsImage); ((JObject)obj).Add("goodsName", goodsInfo.goodsName); ((JObject)obj).Add("goodsPrice", goodsInfo.goodsPrice); ((JObject)obj).Add("id", goodsInfo.id); ((JObject)obj).Add("isStatusOpen", goodsInfo.isStatusOpen); ((JObject)obj).Add("maxGoodsNums", goodsInfo.maxGoodsNums); ((JObject)obj).Add("maxNums", goodsInfo.maxNums); ((JObject)obj).Add("name", goodsInfo.name); ((JObject)obj).Add("peopleNumber", goodsInfo.peopleNumber); ((JObject)obj).Add("significantInterval", goodsInfo.significantInterval); ((JObject)obj).Add("sort", goodsInfo.sort); ((JObject)obj).Add("startTime", goodsInfo.startTime); ((JObject)obj).Add("updateTime", goodsInfo.updateTime); //((JObject)ss).Add("goodsInfo", JToken.FromObject(goodsInfo)); newReslut.Add(obj); } } } } parameters.Remove("list"); parameters.Add("list", newReslut); } dto.parameters = parameters; } else if (item.widgetCode == "service") { JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); if (parameters != null && parameters.ContainsKey("list")) { JArray result = JArray.Parse(parameters["list"].ToString()); foreach (JObject ss in result) { if (ss.ContainsKey("id")) { var id = ((JObject)ss)["id"].ObjectToInt(0); if (id > 0) { var serviceInfo = await _servicesServices.QueryByIdAsync(id); if (serviceInfo != null) { var pinTuanStartStatus = 1; int lastTime = 0; bool isOverdue = false; //判断拼团状态 var dt = DateTime.Now; if (serviceInfo.startTime > dt) { pinTuanStartStatus = (int)GlobalEnumVars.ServicesOpenStatus.notBegun; TimeSpan ts = serviceInfo.startTime.Subtract(dt); lastTime = (int)ts.TotalSeconds; isOverdue = lastTime > 0; } else if (serviceInfo.startTime <= dt && serviceInfo.endTime > dt) { pinTuanStartStatus = (int)GlobalEnumVars.ServicesOpenStatus.begin; TimeSpan ts = serviceInfo.endTime.Subtract(dt); lastTime = (int)ts.TotalSeconds; isOverdue = lastTime > 0; } else { pinTuanStartStatus = (int)GlobalEnumVars.ServicesOpenStatus.haveExpired; } ((JObject)ss).Add("pinTuanStartStatus", pinTuanStartStatus); ((JObject)ss).Add("lastTime", lastTime); ((JObject)ss).Add("isOverdue", isOverdue); } } } } parameters.Remove("list"); parameters.Add("list", result); } dto.parameters = parameters; } else if (item.widgetCode == "adpop") { dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); } else if (item.widgetCode == "topImgSlide") { dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); } else { dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters); } itemsDto.Add(dto); } jm.data = new { model.code, desc = model.description, model.id, model.layout, model.name, model.type, items = itemsDto }; return jm; } #endregion } }