/*********************************************************************** * ProjectName: 百分兵法管理系统 * Web: http://chuanyin.com * Author: * Email: * CreateTime: 202403/02 * Description: 暂无 ***********************************************************************/ using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using AutoMapper; using CoreCms.Net.Auth.HttpContextUser; using CoreCms.Net.Configuration; using CoreCms.Net.DTO.ComponentsDTO; using CoreCms.Net.IServices; using CoreCms.Net.IServices.baifenbingfa; 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.Services.Basic; using CoreCms.Net.Utility.Extensions; using CoreCms.Net.Utility.Helper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using NPOI.SS.Formula.Functions; using SqlSugar; using static SKIT.FlurlHttpClient.Wechat.Api.Models.ChannelsECMerchantAddFreightTemplateRequest.Types.FreightTemplate.Types; using static SKIT.FlurlHttpClient.Wechat.Api.Models.ComponentTCBBatchCreateContainerServiceVersionRequest.Types; namespace CoreCms.Net.Web.WebApi.Controllers { /// /// 商品相关接口处理 /// [Route("api/[controller]/[action]")] [ApiController] public class GoodController : ControllerBase { private IMapper _mapper; private readonly IHttpContextUser _user; private ICoreCmsSettingServices _settingServices; private ICoreCmsGoodsCategoryServices _goodsCategoryServices; private ICoreCmsGoodsServices _goodsServices; private ICoreCmsProductsServices _productsServices; private ICoreCmsBrandServices _brandServices; private ICoreCmsOrderItemServices _orderItemServices; private ICoreCmsGoodsCommentServices _goodsCommentServices; private ICoreCmsGoodsParamsServices _goodsParamsServices; private ICoreCmsGoodsCollectionServices _goodsCollectionServices; private ICoreCmsUserServices _userServices; private ICoreCmsAgentServices _agentServices; private ICoreCmsAgentProductsServices _agentProductsServices; private ICoreCmsAgentGradeServices _agentGradeServices; private ICoreCmsGoodsCategoryExtendServices _goodsCategoryExtendServices; private readonly ICoreCmsAreaServices _coreCmsAreaServices; private readonly IBfbfComAPIService _bfbfComAPIService; /// /// 构造函数 /// public GoodController(IMapper mapper , IHttpContextUser user , ICoreCmsSettingServices settingServices , ICoreCmsGoodsCategoryServices goodsCategoryServices , ICoreCmsGoodsServices goodsServices , ICoreCmsProductsServices productsServices , ICoreCmsBrandServices brandServices , ICoreCmsOrderItemServices orderItemServices , ICoreCmsGoodsCommentServices goodsCommentServices , ICoreCmsGoodsParamsServices goodsParamsServices , ICoreCmsGoodsCollectionServices goodsCollectionServices , ICoreCmsUserServices userServices , ICoreCmsAgentServices agentServices, ICoreCmsAgentProductsServices agentProductsServices, ICoreCmsAgentGradeServices agentGradeServices, ICoreCmsGoodsCategoryExtendServices goodsCategoryExtendServices, ICoreCmsAreaServices areaServices, IBfbfComAPIService bfbfComAPIService ) { _mapper = mapper; _user = user; _settingServices = settingServices; _goodsCategoryServices = goodsCategoryServices; _goodsServices = goodsServices; _productsServices = productsServices; _brandServices = brandServices; _orderItemServices = orderItemServices; _goodsCommentServices = goodsCommentServices; _goodsParamsServices = goodsParamsServices; _goodsCollectionServices = goodsCollectionServices; _userServices = userServices; _agentServices = agentServices; _agentProductsServices = agentProductsServices; _agentGradeServices = agentGradeServices; _goodsCategoryExtendServices = goodsCategoryExtendServices; _coreCmsAreaServices = areaServices; _bfbfComAPIService = bfbfComAPIService; } //公共接口==================================================================================================== #region 获取所有商品分类栏目数据 /// /// 获取所有商品分类栏目数据 /// /// [HttpPost] public async Task GetAllCategories() { var jm = new WebApiCallBack() { status = true }; var data = await _goodsCategoryServices.QueryListByClauseAsync(p => p.isShow == true, p => p.sort, OrderByType.Asc, true, true); jm.status = true; jm.data = GetCategories(data, 0); return jm; } /// /// 迭代方法 /// /// /// /// private static List GetCategories(List oldCategories, int parentId) { List childTree = new List(); var model = oldCategories.Where(p => p.parentId == parentId).ToList(); foreach (var item in model) { var parentTree = new WxGoodCategoryDto(); parentTree.id = item.id; parentTree.imageUrl = !string.IsNullOrEmpty(item.imageUrl) ? item.imageUrl : "/static/images/common/empty.png"; parentTree.name = item.name; parentTree.sort = item.sort; parentTree.key=item.key; childTree.Add(parentTree); parentTree.child = GetCategories(oldCategories, item.id); } return childTree; } #endregion #region 根据查询条件获取分页数据============================================================ /// /// 根据查询条件获取分页数据 /// /// [HttpPost] public async Task GetGoodsPageList([FromBody] FMPageByWhereOrder entity) { var jm = new WebApiCallBack(); var where = PredicateBuilder.True(); //是否是经销商 bool isDic = false; if (_user.ID > 0) { isDic = await _bfbfComAPIService.IsDictionary(_user.ID); }; var className = string.Empty; if (!string.IsNullOrWhiteSpace(entity.where)) { var obj = JsonConvert.DeserializeAnonymousType(entity.where, new { priceFrom = "", priceTo = "", catId = "", brandId = "", labelId = "", searchName = "", areaCode="" }); if (!string.IsNullOrWhiteSpace(obj.priceFrom)) { var priceF = obj.priceFrom.ObjectToDouble(0); if (priceF >= 0) { var f = Convert.ToDecimal(priceF); where = where.And(p => p.price >= f); } } if (!string.IsNullOrWhiteSpace(obj.priceTo)) { var priceT = obj.priceTo.ObjectToDouble(0); if (priceT > 0) { var f = Convert.ToDecimal(priceT); where = where.And(p => p.price <= f); } } if (!string.IsNullOrWhiteSpace(obj.catId)) { var catId = obj.catId.ObjectToInt(0); if (catId > 0) { var category = await _goodsCategoryServices.QueryByIdAsync(catId, true, true); if (category != null) { className = category.name; } var categories = await _goodsCategoryServices.QueryAsync(true, true); var ids = GoodsHelper.GetChildIds(categories, catId); //扩展分类 var extends = await _goodsCategoryExtendServices.QueryListByClauseAsync(p => p.goodsCategroyId == catId); if (extends.Any()) { var extGoodIds = extends.Select(p => p.goodsId).ToList(); where = where.And(p => ids.Contains(p.goodsCategoryId) || extGoodIds.Contains(p.id)); } else { where = where.And(p => ids.Contains(p.goodsCategoryId)); } } } if (!string.IsNullOrWhiteSpace(obj.brandId)) { if (obj.brandId.Contains(",")) { var brandIdsIntArray = CommonHelper.StringToIntArray(obj.brandId); if (brandIdsIntArray.Any()) { where = where.And(p => brandIdsIntArray.Contains(p.brandId)); } } else { var brandId = obj.brandId.ObjectToInt(0); if (brandId > 0) { where = where.And(p => p.brandId == brandId); } } } if (!string.IsNullOrWhiteSpace(obj.labelId)) { where = where.And(p => (',' + p.labelIds.Trim(',') + ',').Contains(',' + obj.labelId.Trim(',') + ',')); } if (!string.IsNullOrWhiteSpace(obj.searchName)) { where = where.And(p => p.name.Contains(obj.searchName)); } if (!string.IsNullOrWhiteSpace(obj.areaCode)) { where = where.And(p => p.areaCode.Contains(obj.areaCode)); } } //获取数据 var list = await _goodsServices.QueryPageByDTOAsync(where, entity.page, entity.limit, true); //获取品牌 var brands = await _brandServices.QueryListByClauseAsync(p => p.isShow == true, p => p.sort, OrderByType.Desc, true, true); foreach (var item in list) { var codelist = item.areaCode?.Split(","); item.area = ""; if(codelist!=null) foreach (var code in codelist) { item.area+= (await _coreCmsAreaServices.GetAreaString(code)+""); } //调整经销商价格 百分兵法 if(isDic) { item.price = item.distributionPrice; } } //返回数据 jm.status = true; jm.data = new { list, className, entity.page, list.TotalCount, list.TotalPages, entity.limit, entity.where, brands }; jm.msg = "数据调用成功!"; return jm; } #endregion #region 获取商品详情====================================================================== /// /// 获取商品详情 /// /// /// [HttpPost] public async Task GetDetial([FromBody] FMIntId entity) { var jm = new WebApiCallBack(); CoreCmsGoods model = await _goodsServices.GetGoodsDetail(entity.id, 0, false, "goods", 0, entity.data.ObjectToBool()); if (model == null) { jm.msg = "商品获取失败"; return jm; } var codelist= model.areaCode.Split(","); model.area = ""; foreach (var item in codelist) { model.area += (await _coreCmsAreaServices.GetAreaString(item) + ""); } jm.status = true; jm.msg = "获取商品详情成功"; jm.data = model; jm.methodDescription = JsonConvert.SerializeObject(_user); return jm; } #endregion #region 获取单个货品信息====================================================================== /// /// 获取单个货品信息 /// /// /// [HttpPost] public async Task GetProductInfo([FromBody] FMGetProductInfo entity) { var jm = new WebApiCallBack(); var userId = 0; if (_user != null) { userId = _user.ID; } bool bl = entity.type == "pinTuan" || entity.type == "group"; var getProductInfo = await _productsServices.GetProductInfo(entity.id, bl, userId, entity.type, entity.groupId); if (getProductInfo == null) { jm.msg = "获取单个货品失败"; return jm; } jm.status = true; jm.msg = "获取单个货品成功"; jm.data = getProductInfo; return jm; } #endregion #region 获取商品评价列表分页数据====================================================================== /// /// 获取商品评价列表分页数据 /// /// /// [HttpPost] public async Task GetGoodsComment([FromBody] FMPageByIntId entity) { var jm = new WebApiCallBack(); //获取数据 var list = await _goodsCommentServices.QueryPageAsync(p => p.goodsId == entity.id && p.isDisplay == true, p => p.createTime, OrderByType.Desc, entity.page, entity.limit); if (list.Any()) { foreach (var item in list) { item.imagesArr = !string.IsNullOrEmpty(item.images) ? item.images.Split(",") : null; } } jm.status = true; jm.msg = "获取评论成功"; jm.data = new { list, commentsCount = list.TotalCount, totalPages = list.TotalPages }; return jm; } #endregion #region 获取商品参数====================================================================== /// /// 获取单个商品参数 /// /// /// [HttpPost] public async Task GetGoodsParams([FromBody] FMIntId entity) { var jm = new WebApiCallBack(); //获取数据 var goods = await _goodsServices.QueryByIdAsync(entity.id); if (goods == null) { jm.msg = GlobalConstVars.DataisNo; return jm; } var list = new List(); var goodsParams = await _goodsParamsServices.QueryAsync(true, true); if (!string.IsNullOrEmpty(goods.parameters)) { var arrItem = goods.parameters.Split("|"); foreach (var item in arrItem) { if (!item.Contains(":")) continue; var childArr = item.Split(":"); if (childArr.Length == 2) { var paramsId = Convert.ToInt32(childArr[0]); var paramsModel = goodsParams.Find(p => p.id == paramsId); if (paramsModel != null) { list.Add(new WxNameValueDto() { name = paramsModel.name, value = childArr[1] }); } } } } jm.status = true; jm.msg = "获取商品参数成功"; jm.data = list; return jm; } #endregion #region 获取随机推荐商品================================================== /// /// 获取随机推荐商品 /// /// [HttpPost] public async Task GetGoodsRecommendList([FromBody] FMIntId entity) { if (entity.id <= 0) { entity.id = 10; } var bl = entity.data.ObjectToBool(); var jm = new WebApiCallBack() { status = true, code = 0, msg = "获取成功", data = await _goodsServices.GetGoodsRecommendList(entity.id, bl) }; return jm; } #endregion #region 获取商品品牌================================================== /// /// 获取商品品牌 /// /// [HttpPost] public async Task GetAllBrands() { var jm = new WebApiCallBack() { status = true }; var brands = await _brandServices.QueryListByClauseAsync(p => p.isShow == true, p => p.sort, OrderByType.Desc, true, true); jm.data = brands; return jm; } #endregion #region 根据不同类型获取不同商品数据================================================== /// /// 根据不同类型获取不同商品数据 /// /// [HttpPost] public async Task GetGoodsByType([FromBody] FMGetGoodByType entity) { var list = new List(); var orderBy = entity.orderby switch { "asc" => OrderByType.Asc, "desc" => OrderByType.Desc, _ => OrderByType.Desc }; list = entity.type switch { //新品 (int)GlobalEnumVars.SearchGoodType.New => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.createTime, orderBy, true, true, 20), //评论数 (int)GlobalEnumVars.SearchGoodType.Comment => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.commentsCount, orderBy, true, true, 20), //销量 (int)GlobalEnumVars.SearchGoodType.Sales => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.buyCount, orderBy, true, true, 20), //价格 (int)GlobalEnumVars.SearchGoodType.Price => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.price, orderBy, true, true, 20), //是否推荐 (int)GlobalEnumVars.SearchGoodType.Recommend => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.isRecommend, orderBy, true, true, 20), //是否参与优惠 (int)GlobalEnumVars.SearchGoodType.Discounts => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.isInActivity, orderBy, true, true, 20), //综合销量 (int)GlobalEnumVars.SearchGoodType.CombinedSalesVolume => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.initialSales, orderBy, true, true, 20), _ => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.createTime, orderBy, true, true, 20) }; var jm = new WebApiCallBack() { status = true, code = 0, msg = "获取成功", data = list }; return jm; } #endregion #region 获取商品sku====================================================================== /// /// 获取商品sku /// /// /// [HttpPost] public async Task GetSku([FromBody] FMGetSku entity) { var jm = new WebApiCallBack(); var good = await _goodsServices.QueryByClauseAsync(p => p.id == entity.id, true); if (good == null) { jm.msg = "商品获取失败"; return jm; } //取所有货品 var products = await _productsServices.QueryListByClauseAsync(p => p.goodsId == good.id && p.isDel == false, p => p.id, OrderByType.Asc, true); if (products == null) { jm.msg = "商品sku列表获取失败"; return jm; } var skus = await _goodsServices.GetCoreCmsProductsView(good, products, 0, entity.isPromotion, entity.type, entity.groupId); if (skus == null) { jm.msg = "商品sku列表组合获取失败"; return jm; } jm.status = true; jm.msg = "获取商品详情成功"; jm.data = skus; return jm; } #endregion //验证接口==================================================================================================== #region 根据Token获取商品详情====================================================================== /// /// 根据Token获取商品详情 /// /// /// [HttpPost] [Authorize] public async Task GetDetialByToken([FromBody] FMIntId entity) { var jm = new WebApiCallBack(); var userId = 0; if (_user != null) { userId = _user.ID; } var user = await _userServices.QueryByClauseAsync(p => p.id == _user.ID); if (user == null) { jm.msg = "用户信息获取失败"; return jm; } var model = await _goodsServices.GetGoodsDetail(entity.id, userId, false, "goods", 0, entity.data.ObjectToBool()); if (model == null) { jm.msg = "商品获取失败"; return jm; } if (await _bfbfComAPIService.IsDictionary(user.id)) { //百分兵法经销商 model.product.price = model.product.distributionPrice; } var codelist = model.areaCode?.Split(","); model.area = ""; if(codelist!=null) foreach (var item in codelist) { model.area += (await _coreCmsAreaServices.GetAreaString(item) + ""); } var userAgent = await _agentServices.QueryByClauseAsync(p => p.userId == user.id); var agentProducts = new List(); var userAgentGrade = new CoreCmsAgentGrade(); if (userAgent != null) { agentProducts = await _agentProductsServices.QueryListByClauseAsync(p => p.goodId == model.id && p.isDel == false && p.agentGradeId == userAgent.gradeId); userAgentGrade = await _agentGradeServices.QueryByClauseAsync(p => p.id == userAgent.gradeId, true, true); } jm.otherData = new { userAgent, userAgentGrade, agentProducts }; await _goodsServices.UpdateAsync(p => new CoreCmsGoods() { viewCount = p.viewCount + 1 }, p => p.id == entity.id); jm.status = true; jm.msg = "获取商品详情成功"; jm.data = model; jm.methodDescription = JsonConvert.SerializeObject(_user); return jm; } #endregion #region 根据Token获取商品sku====================================================================== /// /// 根据Token获取商品sku /// /// /// [HttpPost] [Authorize] public async Task GetSkuByToken([FromBody] FMGetSku entity) { var jm = new WebApiCallBack(); var userId = 0; if (_user != null) { userId = _user.ID; } var good = await _goodsServices.QueryByClauseAsync(p => p.id == entity.id, true); if (good == null) { jm.msg = "商品获取失败"; return jm; } //取所有货品 var products = await _productsServices.QueryListByClauseAsync(p => p.goodsId == good.id && p.isDel == false, p => p.id, OrderByType.Asc, true); if (products == null) { jm.msg = "商品sku列表获取失败"; return jm; } var skus = await _goodsServices.GetCoreCmsProductsView(good, products, userId, entity.isPromotion, entity.type, entity.groupId); if (skus == null) { jm.msg = "商品sku列表组合获取失败"; return jm; } jm.status = true; jm.msg = "获取商品详情成功"; jm.data = skus; return jm; } #endregion } }