diff --git a/ARW.Model/Dto/Business/GoodsManager/Goodss/GoodsDto.cs b/ARW.Model/Dto/Business/GoodsManager/Goodss/GoodsDto.cs index 12330fc..4eb867d 100644 --- a/ARW.Model/Dto/Business/GoodsManager/Goodss/GoodsDto.cs +++ b/ARW.Model/Dto/Business/GoodsManager/Goodss/GoodsDto.cs @@ -20,11 +20,10 @@ namespace ARW.Model.Dto.Business.GoodsManager.Goodss public long GoodsGuid { get; set; } - [Required(ErrorMessage = "店铺guid不能为空")] public long ShopGuid { get; set; } [Required(ErrorMessage = "商品类目guid不能为空")] - public long GoodsCategoryGuid { get; set; } + public long ShopGoodsCategoryGuid { get; set; } public string GoodsSkuIds { get; set; } @@ -132,6 +131,7 @@ namespace ARW.Model.Dto.Business.GoodsManager.Goodss public string ShopName { get; set; } public long? GoodsCategoryGuid { get; set; } + public long? ShopGoodsCategoryGuid { get; set; } public string GoodsName { get; set; } diff --git a/ARW.Model/Models/Business/GoodsManager/Goodss/Goods.cs b/ARW.Model/Models/Business/GoodsManager/Goodss/Goods.cs index 3fb33e9..bb77dce 100644 --- a/ARW.Model/Models/Business/GoodsManager/Goodss/Goods.cs +++ b/ARW.Model/Models/Business/GoodsManager/Goodss/Goods.cs @@ -52,8 +52,8 @@ namespace ARW.Model.Models.Business.GoodsManager.Goodss /// [EpplusTableColumn(Header = "商品类目guid")] [JsonConverter(typeof(ValueToStringConverter))] - [SugarColumn(ColumnName = "goods_category_guid")] - public long GoodsCategoryGuid { get; set; } + [SugarColumn(ColumnName = "shop_goods_category_guid")] + public long ShopGoodsCategoryGuid { get; set; } /// diff --git a/ARW.Model/Vo/Business/GoodsManager/Goodss/GoodsVo.cs b/ARW.Model/Vo/Business/GoodsManager/Goodss/GoodsVo.cs index eeb5205..8a08b10 100644 --- a/ARW.Model/Vo/Business/GoodsManager/Goodss/GoodsVo.cs +++ b/ARW.Model/Vo/Business/GoodsManager/Goodss/GoodsVo.cs @@ -49,8 +49,15 @@ namespace ARW.Model.Vo.Business.GoodsManager.Goodss /// 描述 :商品类目guid /// [JsonConverter(typeof(ValueToStringConverter))] - [EpplusTableColumn(Header = "商品类目guid")] - public long GoodsCategoryGuid { get; set; } + [EpplusIgnore] + public long ShopGoodsCategoryGuid { get; set; } + + /// + /// 描述 :商品类目名称 + /// + [JsonConverter(typeof(ValueToStringConverter))] + [EpplusTableColumn(Header = "商品类目名称")] + public string GoodsCategoryName { get; set; } /// @@ -65,21 +72,21 @@ namespace ARW.Model.Vo.Business.GoodsManager.Goodss /// 描述 :配送模板guid /// [JsonConverter(typeof(ValueToStringConverter))] - [EpplusTableColumn(Header = "配送模板guid")] + [EpplusIgnore] public long DeliveryGuid { get; set; } /// /// 描述 :名称 /// - [EpplusTableColumn(Header = "名称")] + [EpplusTableColumn(Header = "商品名称")] public string GoodsName { get; set; } /// /// 描述 :编码 /// - [EpplusTableColumn(Header = "编码")] + [EpplusTableColumn(Header = "商品编码")] public string GoodsCoding { get; set; } @@ -99,47 +106,47 @@ namespace ARW.Model.Vo.Business.GoodsManager.Goodss /// /// 描述 :卖点 /// - [EpplusTableColumn(Header = "卖点")] + [EpplusTableColumn(Header = "商品卖点")] public string GoodsSellingPoint { get; set; } /// /// 描述 :商品规格(1单规格 2多规格) /// 空值 : false /// - [EpplusTableColumn(Header = "商品规格")] + [EpplusIgnore] public int GoodsSpecType { get; set; } /// /// 描述 :图片 /// - [EpplusTableColumn(Header = "图片")] + [EpplusTableColumn(Header = "商品图片")] public string GoodsPicture { get; set; } /// /// 描述 :价格(最低) /// - [EpplusTableColumn(Header = "价格(最低)")] + [EpplusTableColumn(Header = "商品价格")] public decimal GoodsPriceLowest { get; set; } /// /// 描述 :价格(最高) /// - [EpplusTableColumn(Header = "价格(最高)")] + [EpplusIgnore] public decimal GoodsPriceHighest { get; set; } /// /// 描述 :划线价格(最低) /// - [EpplusTableColumn(Header = "划线价格(最低)")] + [EpplusTableColumn(Header = "划线价格")] public decimal GoodsDashedPriceLowest { get; set; } /// /// 描述 :划线价格(最高) /// - [EpplusTableColumn(Header = "划线价格(最高)")] + [EpplusIgnore] public decimal GoodsDashedPriceHighest { get; set; } @@ -174,28 +181,28 @@ namespace ARW.Model.Vo.Business.GoodsManager.Goodss /// /// 描述 :库存计算方式(1下单立减库存 2付款立减库存) /// - [EpplusTableColumn(Header = "库存计算方式(1下单立减库存 2付款立减库存)")] + [EpplusIgnore] public int GoodsDeductStockType { get; set; } /// /// 描述 :是否赠送积分(1开启 0关闭) /// - [EpplusTableColumn(Header = "是否赠送积分(1开启 0关闭)")] + [EpplusIgnore] public int GoodsIsPointsGift { get; set; } /// /// 描述 :是否允许使用积分抵扣(1允许 0不允许) /// - [EpplusTableColumn(Header = "是否允许使用积分抵扣(1允许 0不允许)")] + [EpplusIgnore] public int GoodsIsPointsDiscount { get; set; } /// /// 描述 :积分抵扣设置(0默认抵扣 1单独设置抵扣) /// - [EpplusTableColumn(Header = "积分抵扣设置(0默认抵扣 1单独设置抵扣)")] + [EpplusIgnore] public int GoodsIsAlonePointsDiscount { get; set; } @@ -209,14 +216,14 @@ namespace ARW.Model.Vo.Business.GoodsManager.Goodss /// /// 描述 :是否开启会员折扣(1开启 0关闭) /// - [EpplusTableColumn(Header = "是否开启会员折扣(1开启 0关闭)")] + [EpplusIgnore] public int GoodsIsEnableGrade { get; set; } /// /// 描述 :会员折扣设置(0默认等级折扣 1单独设置折扣) /// - [EpplusTableColumn(Header = "会员折扣设置(0默认等级折扣 1单独设置折扣)")] + [EpplusIgnore] public int GoodsIsAloneGrade { get; set; } @@ -230,10 +237,14 @@ namespace ARW.Model.Vo.Business.GoodsManager.Goodss /// /// 描述 :上下架状态(1上架 2下架) /// - [EpplusTableColumn(Header = "上下架状态(1上架 2下架)")] + [EpplusIgnore] public int GoodsShelfStatus { get; set; } + [EpplusTableColumn(Header = "状态")] + public string GoodsShelfStatusName { get; set; } + + /// /// 描述 :排序 /// @@ -241,6 +252,13 @@ namespace ARW.Model.Vo.Business.GoodsManager.Goodss public int GoodsSort { get; set; } + /// + /// 描述 :添加时间 + /// + [EpplusTableColumn(Header = "添加时间")] + public string CreateTime { get; set; } + + [EpplusIgnore] public List GoodsServicesIds { get; set; } } diff --git a/ARW.Service/Api/BusinessService/ShopManager/Shops/ShopServiceApi.cs b/ARW.Service/Api/BusinessService/ShopManager/Shops/ShopServiceApi.cs index 3e56217..fc2625a 100644 --- a/ARW.Service/Api/BusinessService/ShopManager/Shops/ShopServiceApi.cs +++ b/ARW.Service/Api/BusinessService/ShopManager/Shops/ShopServiceApi.cs @@ -17,6 +17,13 @@ using ARW.Model.Vo.Business.GoodsManager.GoodsCategorys; using ARW.Repository.Business.GoodsManager.GoodsCategorys; using ARW.Repository.Business.Custom.Customers; using ARW.Model.Models.Business.Custom.Customers; +using ARW.Repository.Business.LogisticsManage.Deliverys; +using ARW.Service.Business.IBusinessService.LogisticsManage.Deliverys; +using ARW.Service.Business.IBusinessService.GoodsManager.Goodss; +using ARW.Model.Models.Business.LogisticsManage.Deliverys; +using ARW.Model.Models.Business.LogisticsManage.DeliveryRules; +using ARW.Service.Business.IBusinessService.GoodsManager.GoodsServicess; +using ARW.Model.Models.Business.GoodsManager.GoodsServicess; namespace ARW.Service.Api.BusinessService.ShopManager.Shops { @@ -33,6 +40,7 @@ namespace ARW.Service.Api.BusinessService.ShopManager.Shops private readonly GoodsCategoryRepository _GoodsCategoryRepository; private readonly CustomerRepository _CustomerRepository; + public ShopServiceImplApi(ShopRepository ShopRepository, GoodsCategoryRepository goodsCategoryRepository, CustomerRepository customerRepository) { this._ShopRepository = ShopRepository; @@ -159,13 +167,7 @@ namespace ARW.Service.Api.BusinessService.ShopManager.Shops model.ShopSort = 100; var response = await _ShopRepository.InsertReturnSnowflakeIdAsync(model); - // 修改客户类型为 商户(2) - await _CustomerRepository.UpdateAsync(f => new Customer - { - CustomerType = 2 - }, s => s.CustomerGuid == model.ShopCustomerGuid); - - return "添加成功!"; + return "申请成功!"; } } diff --git a/ARW.Service/Business/BusinessService/GoodsManager/GoodsServicess/GoodsServicesService.cs b/ARW.Service/Business/BusinessService/GoodsManager/GoodsServicess/GoodsServicesService.cs index ba23cd6..531db53 100644 --- a/ARW.Service/Business/BusinessService/GoodsManager/GoodsServicess/GoodsServicesService.cs +++ b/ARW.Service/Business/BusinessService/GoodsManager/GoodsServicess/GoodsServicesService.cs @@ -15,6 +15,7 @@ using ARW.Model.Dto.Business.GoodsManager.GoodsServicess; using ARW.Model.Models.Business.GoodsManager.GoodsServicess; using ARW.Model.Vo.Business.GoodsManager.GoodsServicess; using ARW.Model.Models.Business.ShopManager.Shops; +using ARW.Repository.Business.LogisticsManage.Deliverys; namespace ARW.Service.Business.BusinessService.GoodsManager.GoodsServicess { @@ -84,7 +85,8 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.GoodsServicess } else { - + var delivery = await _GoodsServicesRepository.GetFirstAsync(s => s.GoodsServicesName == model.GoodsServicesName && s.ShopGuid == model.ShopGuid); + if (delivery != null) { throw new CustomException($"{model.GoodsServicesName} 已存在!"); } var response = await _GoodsServicesRepository.InsertReturnSnowflakeIdAsync(model); return "添加成功!"; } diff --git a/ARW.Service/Business/BusinessService/GoodsManager/Goodss/GoodsService.cs b/ARW.Service/Business/BusinessService/GoodsManager/Goodss/GoodsService.cs index 4bb8c0a..b73f856 100644 --- a/ARW.Service/Business/BusinessService/GoodsManager/Goodss/GoodsService.cs +++ b/ARW.Service/Business/BusinessService/GoodsManager/Goodss/GoodsService.cs @@ -1,10 +1,8 @@ using Infrastructure.Attribute; -using Microsoft.AspNetCore.Http; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Threading.Tasks; using Infrastructure; using ARW.Model; @@ -15,22 +13,26 @@ using ARW.Model.Dto.Business.GoodsManager.Goodss; using ARW.Model.Models.Business.GoodsManager.Goodss; using ARW.Model.Vo.Business.GoodsManager.Goodss; using ARW.Model.Models.Business.ShopManager.Shops; -using ARW.Repository.Business.GoodsManager.GoodsServicess; -using ARW.Repository.Business.GoodsManager.GoodsServicess.GoodsServicesRels; using ARW.Service.Business.IBusinessService.GoodsManager.GoodsServicess.GoodsServicesRels; -using AngleSharp.Html; using ARW.Model.Models.Business.GoodsManager.GoodsServicess.GoodsServicesRels; using ARW.Service.Business.IBusinessService.GoodsManager.GoodsSpecs.Specs; using ARW.Service.Business.IBusinessService.GoodsManager.GoodsSpecs.SpecValues; using ARW.Service.Business.IBusinessService.GoodsManager.GoodsSpecs.GoodsSpecRels; -using Senparc.Weixin.MP.AdvancedAPIs.Semantic; using ARW.Model.Models.Business.GoodsManager.GoodsSpecs.Specs; using ARW.Model.Models.Business.GoodsManager.GoodsSpecs.SpecValues; using ARW.Model.Models.Business.GoodsManager.GoodsSpecs.GoodsSpecRels; using ARW.Model.Models.Business.GoodsManager.GoodsSpecs.GoodsSkus; -using ARW.Model.Vo.Business.GoodsManager.GoodsSpecs.SpecValues; -using Senparc.Weixin.MP.AdvancedAPIs.MerChant; using ARW.Service.Business.IBusinessService.GoodsManager.GoodsSpecs.GoodsSkus; +using ARW.Repository.Business.GoodsManager.ShopGoodsCategorys; +using ARW.Model.Models.Business.GoodsManager.ShopGoodsCategorys; +using ARW.Repository.Business.GoodsManager.GoodsCategorys; +using ARW.Model.Models.Business.GoodsManager.GoodsCategorys; +using ARW.Common; +using ARW.Model.System; +using ARW.Repository.Business.ShopManager.Shops; +using ARW.Repository.Business.LogisticsManage.Deliverys; +using ARW.Repository.Business.GoodsManager.GoodsServicess; +using Senparc.CO2NET.Extensions; namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss { @@ -44,6 +46,11 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss public class GoodsServiceImpl : BaseService, IGoodsService { private readonly GoodsRepository _GoodsRepository; + private readonly ShopGoodsCategoryRepository _ShopGoodsCategoryRepository; + private readonly GoodsCategoryRepository _GoodsCategoryRepository; + private readonly ShopRepository _ShopRepository; + private readonly DeliveryRepository _DeliveryRepository; + private readonly GoodsServicesRepository _GoodsServicesRepository; private readonly IGoodsServicesRelService _GoodsServicesRelIService; private readonly ISpecService _SepcIService; private readonly ISpecValueService _SpecValueIService; @@ -51,7 +58,7 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss private readonly IGoodsSkuService _GoodsSkuService; - public GoodsServiceImpl(GoodsRepository GoodsRepository, IGoodsServicesRelService goodsServicesRelIService, ISpecService sepcIService, ISpecValueService specValueIService, IGoodsSpecRelService goodsSpecRelService, IGoodsSkuService goodsSkuService) + public GoodsServiceImpl(GoodsRepository GoodsRepository, IGoodsServicesRelService goodsServicesRelIService, ISpecService sepcIService, ISpecValueService specValueIService, IGoodsSpecRelService goodsSpecRelService, IGoodsSkuService goodsSkuService, ShopGoodsCategoryRepository shopGoodsCategoryRepository, GoodsCategoryRepository goodsCategoryRepository, ShopRepository shopRepository, DeliveryRepository deliveryRepository, GoodsServicesRepository goodsServicesRepository) { this._GoodsRepository = GoodsRepository; _GoodsServicesRelIService = goodsServicesRelIService; @@ -59,6 +66,11 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss _SpecValueIService = specValueIService; _GoodsSpecRelService = goodsSpecRelService; _GoodsSkuService = goodsSkuService; + _ShopGoodsCategoryRepository = shopGoodsCategoryRepository; + _GoodsCategoryRepository = goodsCategoryRepository; + _ShopRepository = shopRepository; + _DeliveryRepository = deliveryRepository; + _GoodsServicesRepository = goodsServicesRepository; } #region 业务逻辑代码 @@ -72,9 +84,36 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss //开始拼装查询条件d var predicate = Expressionable.Create(); + string[] goodsCategoryArr = null; + + // 检索商品类目 + if (parm.ShopGoodsCategoryGuid != null) + { + var data = await _ShopGoodsCategoryRepository.GetListAsync(); + + var SewshopGoodsCategorys = data.FindAll(delegate (ShopGoodsCategory shopGoodsCategory) + { + string[] parentShopGoodsCategoryId = shopGoodsCategory.ShopGoodsCategoryAncestralGuid.Split(",", StringSplitOptions.RemoveEmptyEntries); + return parentShopGoodsCategoryId.Contains(parm.ShopGoodsCategoryGuid.ToString()); + }); + string[] shopGoodsCategoryArr = SewshopGoodsCategorys.Select(s => s.ShopGoodsCategoryGuid.ToString()).ToArray(); + predicate = predicate.AndIF(parm.ShopGoodsCategoryGuid != null, s => s.ShopGoodsCategoryGuid == parm.ShopGoodsCategoryGuid || shopGoodsCategoryArr.Contains(s.ShopGoodsCategoryGuid.ToString())); + } + + // 检索经营类目 + if (parm.GoodsCategoryGuid != null) + { + var data = await _GoodsCategoryRepository.GetListAsync(); + + var SewGoodsCategorys = data.FindAll(delegate (GoodsCategory goodsCategory) + { + string[] parentGoodsCategoryId = goodsCategory.GoodsCategoryAncestralGuid.Split(",", StringSplitOptions.RemoveEmptyEntries); + return parentGoodsCategoryId.Contains(parm.GoodsCategoryGuid.ToString()); + }); + goodsCategoryArr = SewGoodsCategorys.Select(s => s.GoodsCategoryGuid.ToString()).ToArray(); + } predicate = predicate.AndIF(parm.ShopGuid != 0, s => s.ShopGuid == parm.ShopGuid); - predicate = predicate.AndIF(parm.GoodsCategoryGuid != null, s => s.GoodsCategoryGuid == parm.GoodsCategoryGuid); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.GoodsName), s => s.GoodsName.Contains(parm.GoodsName)); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.GoodsCoding), s => s.GoodsCoding.Contains(parm.GoodsCoding)); var query = _GoodsRepository @@ -82,6 +121,7 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss .LeftJoin((s, c) => s.ShopGuid == c.ShopGuid) .Where(predicate.ToExpression()) .WhereIF(!string.IsNullOrEmpty(parm.ShopName), (s, c) => c.ShopName.Contains(parm.ShopName)) + .WhereIF(parm.GoodsCategoryGuid != null, (s, c) => c.ShopBusinessCategoryGuid == parm.GoodsCategoryGuid || goodsCategoryArr.Contains(c.ShopBusinessCategoryGuid.ToString())) .OrderBy(s => s.GoodsSort, OrderByType.Asc) .Select((s, c) => new GoodsVo { @@ -89,7 +129,7 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss GoodsGuid = s.GoodsGuid, ShopGuid = s.ShopGuid, ShopName = c.ShopName, - GoodsCategoryGuid = s.GoodsCategoryGuid, + ShopGoodsCategoryGuid = s.ShopGoodsCategoryGuid, GoodsSkuIds = s.GoodsSkuIds, DeliveryGuid = s.DeliveryGuid, GoodsName = s.GoodsName, @@ -116,11 +156,37 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss GoodsAloneGradeEquity = s.GoodsAloneGradeEquity, GoodsShelfStatus = s.GoodsShelfStatus, GoodsSort = s.GoodsSort, - + CreateTime = s.Create_time.ToString("yyyy-MM-dd HH:mm") }); - return await query.ToPageAsync(parm); + var res = await query.ToPageAsync(parm); + + var shopGoodsCategoryDict = (await _ShopGoodsCategoryRepository.GetListAsync()).ToDictionary(s => s.ShopGoodsCategoryGuid); + foreach (var item in res.Result) + { + if (!shopGoodsCategoryDict.TryGetValue(item.ShopGoodsCategoryGuid, out var category)) + { + throw new Exception("商品类目不存在"); + } + + var categoryNameList = new List(); + var ancestorGuidsArr = Tools.SpitLongArrary(category.ShopGoodsCategoryAncestralGuid); + foreach (var ancestorGuid in ancestorGuidsArr) + { + if (ancestorGuid == 0) continue; + if (shopGoodsCategoryDict.TryGetValue(ancestorGuid, out var ancestor)) + { + categoryNameList.Add(ancestor.ShopGoodsCategoryName); + } + } + + categoryNameList.Add(category.ShopGoodsCategoryName); + + item.GoodsCategoryName = string.Join("/", categoryNameList); + } + + return res; } @@ -167,8 +233,81 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss /// /// 数据导入处理 /// - public async Task HandleImportData(GoodsVo Goods) + public async Task HandleImportData(GoodsVo Goods, long userId, int index) { + // 非空判断 + if (string.IsNullOrEmpty(Goods.ShopName)) throw new CustomException("店铺名称不能为空"); + if (string.IsNullOrEmpty(Goods.GoodsCategoryName)) throw new CustomException("商品类目不能为空"); + if (string.IsNullOrEmpty(Goods.GoodsName)) throw new CustomException("商品名称不能为空"); + if (string.IsNullOrEmpty(Goods.GoodsPicture)) throw new CustomException("商品图片不能为空"); + if (Goods.GoodsPriceLowest == 0) throw new CustomException("商品价格不能为空"); + if (Goods.GoodsTotalInventory == 0) throw new CustomException("库存总量不能为空"); + if (string.IsNullOrEmpty(Goods.GoodsPicture)) throw new CustomException("商品图片不能为空"); + if (string.IsNullOrEmpty(Goods.GoodsPicture)) throw new CustomException("商品图片不能为空"); + + + // 店铺 + var shop = await _ShopRepository.GetFirstAsync(s => s.ShopName == Goods.ShopName); + if (shop == null) throw new CustomException($"店铺【{Goods.ShopName}】不存在"); + if (userId != 1) + { + if (shop.ShopUserId != userId) throw new CustomException($"店铺【{Goods.ShopName}】不是您的店铺"); + } + Goods.ShopGuid = shop.ShopGuid; + + + // 商品类目 + // 拆分上级类目和当前类目(手机/xxxx系列) + var nameArr = Goods.GoodsCategoryName.Split('/'); + if (nameArr.Length == 0 || nameArr.Length >= 3) throw new CustomException($"商品类目【{Goods.GoodsCategoryName}】格式不正确,参考(手机/xxxx系列)"); + + // 找出上级类目 + var parentGoodsCategory = await _ShopGoodsCategoryRepository.GetFirstAsync( + s => s.ShopGoodsCategoryName == nameArr.First() && + s.ShopGuid == Goods.ShopGuid + ); + if (parentGoodsCategory == null) throw new CustomException($"上级商品类目【{nameArr.First()}】不存在"); + + // 找出当前类目 + var currentGoodsCategory = await _ShopGoodsCategoryRepository.GetFirstAsync( + s => s.ShopGoodsCategoryName == nameArr.Last() && + s.ShopGuid == Goods.ShopGuid && + s.ShopGoodsCategoryParentGuid == parentGoodsCategory.ShopGoodsCategoryGuid + ); + if (currentGoodsCategory == null) throw new CustomException($"当前商品类目【{nameArr.First()}】不存在"); + Goods.ShopGoodsCategoryGuid = currentGoodsCategory.ShopGoodsCategoryGuid; + + + // 配送模板 + var delivery = await _DeliveryRepository.GetFirstAsync(s => s.DeliveryName == "全国配送" && s.ShopGuid == Goods.ShopGuid); + Goods.DeliveryGuid = delivery.DeliveryGuid; + + + // 服务与承诺 + var service = await _GoodsServicesRepository.GetFirstAsync(s => s.GoodsServicesName == "七天无理由退货" && s.ShopGuid == Goods.ShopGuid); + Goods.GoodsServicesIds = service.GoodsServicesId.ToString().Select(c => c.ToString()).ToList(); + + + // 状态 + if (!string.IsNullOrEmpty(Goods.GoodsShelfStatusName)) + { + if (Goods.GoodsShelfStatusName == "上架") Goods.GoodsShelfStatus = 1; + if (Goods.GoodsShelfStatusName == "下架") Goods.GoodsShelfStatus = 2; + } + else + { + Goods.GoodsShelfStatus = 1; + } + + Goods.GoodsSpecType = 1; + Goods.GoodsDeductStockType = 1; + Goods.GoodsIsPointsGift = 0; + Goods.GoodsIsPointsDiscount = 0; + Goods.GoodsIsAlonePointsDiscount = 0; + Goods.GoodsIsEnableGrade = 1; + Goods.GoodsSpecType = 0; + Goods.GoodsSort = 10; + return Goods; } @@ -176,17 +315,55 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss /// /// Excel导入 /// - public async Task ImportExcel(Goods Goods, int index, bool isUpdateSupport, string user) + public async Task ImportExcel(GoodsVo GoodsVo, int index, bool isUpdateSupport, LoginUser user) { try { + var goodsVo = await HandleImportData(GoodsVo, user.UserId, index); + var goodsData = new Goods + { + GoodsId = goodsVo.GoodsId, + GoodsGuid = goodsVo.GoodsGuid, + ShopGuid = goodsVo.ShopGuid, + ShopGoodsCategoryGuid = goodsVo.ShopGoodsCategoryGuid, + GoodsSkuIds = goodsVo.GoodsSkuIds, + DeliveryGuid = goodsVo.DeliveryGuid, + GoodsName = goodsVo.GoodsName, + GoodsCoding = goodsVo.GoodsCoding, + GoodsMainImageVideo = goodsVo.GoodsMainImageVideo, + GoodsVideoCover = goodsVo.GoodsVideoCover, + GoodsPicture = goodsVo.GoodsPicture, + GoodsSellingPoint = goodsVo.GoodsSellingPoint, + GoodsSpecType = goodsVo.GoodsSpecType, + GoodsPriceLowest = goodsVo.GoodsPriceLowest, + GoodsPriceHighest = goodsVo.GoodsPriceHighest, + GoodsDashedPriceLowest = goodsVo.GoodsDashedPriceLowest, + GoodsDashedPriceHighest = goodsVo.GoodsDashedPriceHighest, + GoodsTotalInventory = goodsVo.GoodsTotalInventory, + GoodsSalesInitial = goodsVo.GoodsSalesInitial, + GoodsSalesActual = goodsVo.GoodsSalesActual, + GoodsDetails = goodsVo.GoodsDetails, + GoodsDeductStockType = goodsVo.GoodsDeductStockType, + GoodsIsPointsGift = goodsVo.GoodsIsPointsGift, + GoodsIsPointsDiscount = goodsVo.GoodsIsPointsDiscount, + GoodsIsAlonePointsDiscount = goodsVo.GoodsIsAlonePointsDiscount, + GoodsPointsDiscountConfig = goodsVo.GoodsPointsDiscountConfig, + GoodsIsEnableGrade = goodsVo.GoodsIsEnableGrade, + GoodsIsAloneGrade = goodsVo.GoodsIsAloneGrade, + GoodsAloneGradeEquity = goodsVo.GoodsAloneGradeEquity, + GoodsShelfStatus = goodsVo.GoodsShelfStatus, + GoodsSort = goodsVo.GoodsSort, + GoodsServicesIds = string.Join(",", goodsVo.GoodsServicesIds) + }; + + // 空值判断 // if (Goods.GoodsId == null) throw new CustomException("商品不能为空"); if (isUpdateSupport) { // 判断唯一值 - var model = await GetFirstAsync(s => s.GoodsId == Goods.GoodsId); + var model = await GetFirstAsync(s => s.GoodsId == goodsData.GoodsId); // 如果为空就新增数据 if (model == null) @@ -194,9 +371,9 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss // 开启事务 var res = await UseTranAsync(async () => { - var addRes = await AddOrUpdateGoods(Goods); + var addRes = await AddOrUpdateGoods(goodsData); }); - var addStr = $"第 {index} 行 => 商品:【{Goods.GoodsId}】新增成功!
"; + var addStr = $"第 {index} 行 => 商品:【{goodsData.GoodsName}】新增成功!
"; return addStr; } else @@ -205,13 +382,13 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss // 开启事务 await UseTranAsync(async () => { - Goods.GoodsId = model.GoodsId; - Goods.GoodsGuid = model.GoodsGuid; - Goods.Update_by = user; - Goods.Update_time = DateTime.Now; - var editRes = await AddOrUpdateGoods(Goods); + goodsData.GoodsId = model.GoodsId; + goodsData.GoodsGuid = model.GoodsGuid; + goodsData.Update_by = user.UserName; + goodsData.Update_time = DateTime.Now; + var editRes = await AddOrUpdateGoods(goodsData); }); - var editStr = $"第 {index} 行 => 商品:【{Goods.GoodsId}】更新成功!
"; + var editStr = $"第 {index} 行 => 商品:【{goodsData.GoodsName}】更新成功!
"; return editStr; } } @@ -220,16 +397,16 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss // 开启事务 var res = await UseTranAsync(async () => { - var addRes = await AddOrUpdateGoods(Goods); + var addRes = await AddOrUpdateGoods(goodsData); }); //Console.WriteLine(res.IsSuccess); - var addStr = $"第 {index} 行 => 商品:【{Goods.GoodsId}】新增成功!
"; + var addStr = $"第 {index} 行 => 商品:【{goodsData.GoodsName}】新增成功!
"; return addStr; } } catch (Exception ex) { - var errorRes = $"第 {index} 行 => 商品:【{Goods.GoodsId}】导入失败!{ex.Message}
"; + var errorRes = $"第 {index} 行 => 商品:【{GoodsVo.GoodsName}】导入失败!{ex.Message}
"; return errorRes; throw; } @@ -242,6 +419,11 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss /// public async Task> HandleExportData(List data) { + foreach (var item in data) + { + if (item.GoodsShelfStatus == 1) item.GoodsShelfStatusName = "上架"; + if (item.GoodsShelfStatus == 2) item.GoodsShelfStatusName = "下架"; + } return data; } @@ -303,7 +485,6 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss var servicesList = new List(); foreach (var id in servicesIds) { - //var service = await _GoodsServicesRepository.GetFirstAsync(s => s.GoodsServicesId == Convert.ToInt32(id)); var service = new GoodsServicesRel { ShopGuid = model.ShopGuid, @@ -476,10 +657,10 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss if (model.GoodsSpecType == 1) { // 价格 - model.GoodsPriceLowest = model.GoodsPriceHighest; + model.GoodsPriceHighest = model.GoodsPriceLowest; // 划线价格 - model.GoodsDashedPriceLowest = model.GoodsDashedPriceHighest; + model.GoodsDashedPriceHighest = model.GoodsDashedPriceLowest; } return model; diff --git a/ARW.Service/Business/BusinessService/LogisticsManage/Deliverys/DeliveryService.cs b/ARW.Service/Business/BusinessService/LogisticsManage/Deliverys/DeliveryService.cs index 4d5bca8..53edf0b 100644 --- a/ARW.Service/Business/BusinessService/LogisticsManage/Deliverys/DeliveryService.cs +++ b/ARW.Service/Business/BusinessService/LogisticsManage/Deliverys/DeliveryService.cs @@ -79,6 +79,7 @@ namespace ARW.Service.Business.BusinessService.LogisticsManage.Deliverys /// public async Task AddOrUpdateDelivery(Delivery model) { + if (model.DeliveryId != 0) { if (model.DeliveryRuleDataList.Count != 0) @@ -90,6 +91,10 @@ namespace ARW.Service.Business.BusinessService.LogisticsManage.Deliverys } else { + // 添加前判断是否有相同的配送模板 + var delivery = await _DeliveryRepository.GetFirstAsync(s => s.DeliveryName == model.DeliveryName && s.ShopGuid == model.ShopGuid); + if (delivery != null) { throw new CustomException($"{model.DeliveryName} 已存在!"); } + var response = await _DeliveryRepository.InsertReturnSnowflakeIdAsync(model); if (model.DeliveryRuleDataList.Count != 0 && response > 0) { diff --git a/ARW.Service/Business/BusinessService/ShopManager/Shops/ShopService.cs b/ARW.Service/Business/BusinessService/ShopManager/Shops/ShopService.cs index a27bee4..19c64e3 100644 --- a/ARW.Service/Business/BusinessService/ShopManager/Shops/ShopService.cs +++ b/ARW.Service/Business/BusinessService/ShopManager/Shops/ShopService.cs @@ -27,6 +27,11 @@ using ARW.Service.System; using MimeKit.Encodings; using ARW.Model.Dto.Api.ShopManager.Shops; using ARW.Model.Vo.Api.ShopManager.Shops; +using ARW.Model.Models.Business.GoodsManager.GoodsServicess; +using ARW.Model.Models.Business.LogisticsManage.DeliveryRules; +using ARW.Model.Models.Business.LogisticsManage.Deliverys; +using ARW.Service.Business.IBusinessService.GoodsManager.GoodsServicess; +using ARW.Service.Business.IBusinessService.LogisticsManage.Deliverys; namespace ARW.Service.Business.BusinessService.ShopManager.Shops { @@ -46,9 +51,10 @@ namespace ARW.Service.Business.BusinessService.ShopManager.Shops private readonly ISysUserService UserService; private readonly ISysConfigService _SysConfigService; + private readonly IDeliveryService _DeliveryService; + private readonly IGoodsServicesService _GoodsServicesService; - - public ShopServiceImpl(ShopRepository ShopRepository, CustomerRepository customerRepository, SysUserRepository sysUserRepository, GoodsCategoryRepository goodsCategoryRepository, ISysUserService userService, ISysConfigService sysConfigService) + public ShopServiceImpl(ShopRepository ShopRepository, CustomerRepository customerRepository, SysUserRepository sysUserRepository, GoodsCategoryRepository goodsCategoryRepository, ISysUserService userService, ISysConfigService sysConfigService, IDeliveryService deliveryService, IGoodsServicesService goodsServicesService) { this._ShopRepository = ShopRepository; _CustomerRepository = customerRepository; @@ -56,6 +62,8 @@ namespace ARW.Service.Business.BusinessService.ShopManager.Shops _GoodsCategoryRepository = goodsCategoryRepository; UserService = userService; _SysConfigService = sysConfigService; + _DeliveryService = deliveryService; + _GoodsServicesService = goodsServicesService; } #region 业务逻辑代码 @@ -275,6 +283,19 @@ namespace ARW.Service.Business.BusinessService.ShopManager.Shops ShopUserId = (int?)userId, }, s => s.ShopId == id); + // 给该用户的店铺添加默认数据 + // 添加配送模板(全国包邮) + await HadnleAddDelivery(res.ShopGuid); + // 添加服务与承诺(七天无理由退货) + await HadnleAddGoodsService(res.ShopGuid); + + // 修改客户类型为 商户(2) + await _CustomerRepository.UpdateAsync(f => new Customer + { + CustomerType = 2 + }, s => s.CustomerGuid == res.ShopCustomerGuid); + + return addStr; } return ""; @@ -317,7 +338,58 @@ namespace ARW.Service.Business.BusinessService.ShopManager.Shops public async Task CheckRepeatShopName(string shopName) { var query = await _ShopRepository.GetFirstAsync(s => s.ShopName == shopName); - return query != null ; + return query != null; + } + + + /// + /// 添加配送模板(全国包邮) + /// + /// 店铺guid + /// + public async Task HadnleAddDelivery(long shopGuid) + { + var deliveryRuleList = new List(); + var deliveryRule = new DeliveryRule + { + DeliveryRuleRegion = "2,20,38,61,76,84,103,123,148,165,177,194,205,218,229,240,246,259,266,273,285,299,314,332,347,357,367,371,384,393,403,418,426,438,445,458,463,477,488,496,504,511,518,526,533,541,549,554,562,570,578,589,599,606,611,619,626,632,638,648,667,684,694,703,712,722,733,744,749,760,767,778,783,801,813,821,832,839,849,858,865,873,883,890,897,904,911,925,936,949,957,963,970,980,987,992,1002,1013,1023,1032,1040,1048,1055,1060,1065,1076,1084,1093,1102,1108,1116,1121,1126,1135,1149,1156,1162,1175,1188,1200,1211,1219,1230,1240,1245,1251,1265,1268,1272,1291,1305,1316,1328,1342,1355,1366,1375,1382,1388,1401,1414,1426,1433,1438,1443,1456,1468,1477,1485,1496,1509,1519,1535,1546,1556,1562,1575,1586,1593,1600,1606,1613,1627,1637,1648,1659,1672,1686,1693,1702,1716,1726,1730,1736,1744,1753,1764,1771,1775,1789,1799,1809,1815,1828,1841,1851,1861,1866,1873,1885,1897,1910,1916,1926,1938,1949,1959,1963,1971,1977,1985,1995,2001,2010,2016,2025,2030,2037,2042,2051,2052,2053,2057,2063,2070,2083,2094,2112,2120,2125,2130,2135,2141,2149,2162,2168,2180,2187,2196,2201,2206,2207,2224,2264,2285,2292,2298,2306,2313,2323,2331,2337,2343,2355,2365,2372,2383,2390,2398,2407,2413,2417,2431,2450,2469,2480,2485,2500,2507,2516,2527,2536,2553,2567,2582,2592,2602,2608,2620,2626,2637,2646,2657,2671,2680,2684,2697,2703,2708,2713,2722,2741,2753,2761,2774,2786,2795,2809,2814,2827,2842,2854,2868,2880,2893,2904,2913,2922,2923,2926,2932,2940,2945,2952,2960,2968,2977,2985,2995,3004,3014,3022,3029,3034,3039,3045,3052,3059,3067,3074,3078,3084,3090,3095,3104,3109,3113,3117,3125,3130,3140,3150,3155,3168,3177,3189,3197,3216,3229,3268,3306,3336,3350,3358,3362,3365,3395,3408,3422,3436,3455,3482,3501,3522,3556,3573,3587,3595,3615", + DeliveryRuleRegionText = "北京,天津,河北省,山西省,内蒙古自治区,辽宁省,吉林省,黑龙江省,上海,江苏省,浙江省,安徽省,福建省,江西省,山东省,河南省,湖北省,湖南省,广东省,广西壮族自治区,海南省,重庆,四川省,贵州省,云南省,西藏自治区,陕西省,甘肃省,青海省,宁夏回族自治区,新疆维吾尔自治区,台湾省,香港特别行政区,澳门特别行政区", + DeliveryRuleFirst = 0, + DeliveryRuleFirstFee = 0, + DeliveryRuleAdditional = 0, + DeliveryRuleAdditionalFee = 0, + }; + deliveryRuleList.Add(deliveryRule); + var delivery = new Delivery + { + ShopGuid = shopGuid, + DeliveryName = "全国包邮", + DeliveryBillingMethod = 1, + DeliverySort = 100, + DeliveryRuleDataList = deliveryRuleList + }; + await _DeliveryService.AddOrUpdateDelivery(delivery); + } + + + + /// + /// 添加服务与承诺(七天无理由退货) + /// + /// 店铺guid + /// + public async Task HadnleAddGoodsService(long shopGuid) + { + var goodsService = new GoodsServices + { + ShopGuid = shopGuid, + GoodsServicesName = "七天无理由退货", + GoodsServicesSummary = "请确保商品完好,包邮商品买家承担退货运费,非包邮商品买家承担来回运费。", + GoodsServicesIsDefault = 1, + GoodsServicesDisplayStatus = 1, + GoodsServicesSort = 100 + }; + await _GoodsServicesService.AddOrUpdateGoodsServices(goodsService); } diff --git a/ARW.Service/Business/IBusinessService/GoodsManager/Goodss/IGoodsService.cs b/ARW.Service/Business/IBusinessService/GoodsManager/Goodss/IGoodsService.cs index e9c56a2..50ad7a5 100644 --- a/ARW.Service/Business/IBusinessService/GoodsManager/Goodss/IGoodsService.cs +++ b/ARW.Service/Business/IBusinessService/GoodsManager/Goodss/IGoodsService.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using ARW.Model; using ARW.Model.Dto.Business.GoodsManager.Goodss; using ARW.Model.Models.Business.GoodsManager.Goodss; +using ARW.Model.System; using ARW.Model.Vo.Business.GoodsManager.Goodss; namespace ARW.Service.Business.IBusinessService.GoodsManager.Goodss @@ -39,15 +40,15 @@ namespace ARW.Service.Business.IBusinessService.GoodsManager.Goodss /// /// /// - Task HandleImportData(GoodsVo GoodsVo); + Task HandleImportData(GoodsVo Goods, long userId, int index); /// /// Excel导入 /// - /// + /// /// - Task ImportExcel(Goods Goods,int index,bool isUpdateSupport,string user); + Task ImportExcel(GoodsVo GoodsVo,int index,bool isUpdateSupport, LoginUser user); /// /// Excel导出 diff --git a/ARW.WebApi/Controllers/Business/GoodsManager/Goodss/GoodsController.cs b/ARW.WebApi/Controllers/Business/GoodsManager/Goodss/GoodsController.cs index 71ed916..c6c433c 100644 --- a/ARW.WebApi/Controllers/Business/GoodsManager/Goodss/GoodsController.cs +++ b/ARW.WebApi/Controllers/Business/GoodsManager/Goodss/GoodsController.cs @@ -22,6 +22,7 @@ using ARW.Model.Dto.Business.GoodsManager.GoodsServicess.GoodsServicesRels; using ARW.Service.Business.IBusinessService.GoodsManager.GoodsSpecs.GoodsSpecRels; using ARW.Service.Business.IBusinessService.GoodsManager.GoodsSpecs.Specs; using ARW.Service.Business.IBusinessService.GoodsManager.GoodsSpecs.SpecValues; +using ARW.Service.Business.IBusinessService.ShopManager.Shops; namespace ARW.WebApi.Controllers.Business.GoodsManager.Goodss { @@ -41,6 +42,7 @@ namespace ARW.WebApi.Controllers.Business.GoodsManager.Goodss private readonly ISpecService _SepcIService; private readonly ISpecValueService _SpecValueIService; private readonly IGoodsSpecRelService _GoodsSpecRelService; + private readonly IShopService _ShopService; /// @@ -52,7 +54,7 @@ namespace ARW.WebApi.Controllers.Business.GoodsManager.Goodss /// 规格组服务 /// 规格值服务 /// 商品规格关系服务 - public GoodsController(IGoodsService GoodsService, IGoodsSkuService goodsSkuService, IGoodsServicesRelService goodsServicesRelService, ISpecService sepcIService, ISpecValueService specValueIService, IGoodsSpecRelService goodsSpecRelService) + public GoodsController(IGoodsService GoodsService, IGoodsSkuService goodsSkuService, IGoodsServicesRelService goodsServicesRelService, ISpecService sepcIService, ISpecValueService specValueIService, IGoodsSpecRelService goodsSpecRelService, IShopService shopService) { _GoodsService = GoodsService; _GoodsSkuService = goodsSkuService; @@ -60,6 +62,7 @@ namespace ARW.WebApi.Controllers.Business.GoodsManager.Goodss _SepcIService = sepcIService; _SpecValueIService = specValueIService; _GoodsSpecRelService = goodsSpecRelService; + _ShopService = shopService; } @@ -72,6 +75,14 @@ namespace ARW.WebApi.Controllers.Business.GoodsManager.Goodss [ActionPermissionFilter(Permission = "business:goods:list")] public async Task GetGoodsList([FromQuery] GoodsQueryDto parm) { + var user = JwtUtil.GetLoginUser(App.HttpContext); + if (user.UserId != 1) + { + var shop = await _ShopService.GetFirstAsync(s => s.ShopUserId == user.UserId); + if (shop == null) throw new Exception("当前用户没有店铺"); + parm.ShopGuid = shop.ShopGuid; + } + var res = await _GoodsService.GetGoodsList(parm); return SUCCESS(res); } @@ -117,6 +128,14 @@ namespace ARW.WebApi.Controllers.Business.GoodsManager.Goodss if (parm.GoodsId != 0) modal = parm.Adapt().ToUpdate(HttpContext); else modal = parm.Adapt().ToCreate(HttpContext); + var user = JwtUtil.GetLoginUser(App.HttpContext); + if (user.UserId != 1) + { + var shop = await _ShopService.GetFirstAsync(s => s.ShopUserId == user.UserId); + if (shop == null) throw new Exception("当前用户没有店铺"); + modal.ShopGuid = shop.ShopGuid; + } + var res = await _GoodsService.AddOrUpdateGoods(modal); return SUCCESS(res); } @@ -171,10 +190,8 @@ namespace ARW.WebApi.Controllers.Business.GoodsManager.Goodss foreach (GoodsVo item in parm) { i++; - var Goods = await _GoodsService.HandleImportData(item); - var modal = Goods.Adapt().ToCreate(HttpContext); - var user = JwtUtil.GetLoginUser(App.HttpContext).UserName; - var msg = await _GoodsService.ImportExcel(modal, i, isUpdateSupport, user); + var user = JwtUtil.GetLoginUser(App.HttpContext); + var msg = await _GoodsService.ImportExcel(item, i, isUpdateSupport, user); msgList.Add(msg); } @@ -195,7 +212,22 @@ namespace ARW.WebApi.Controllers.Business.GoodsManager.Goodss MemoryStream stream = new MemoryStream(); // 示例数据 - var values = new List() { "111", "222", "333" }; + var values = new List() { + "三星官方旗舰店", + "手机/Galaxy S23系列", + "三星 Galaxy S21 5G(SM-G9910)双模5G 骁龙888 超高清专业摄像 120Hz护目屏 游戏手机 8G+128G", + "R301", + "此款商品美观大方 性价比较高 不容错过", + "http://localhost:8888/Uploads/Goods/20230627/67232B8C22C2A8DD.jpg,http://localhost:8888/Uploads/Goods/20230627/19693DB03E8D2355.jpg", + "4969.00", + "5000", + "100", + "0", + "0", + "

\"\"

", + "上架", + "100" + }; string sFileName = DownloadImportTemplate(Goods, stream, "商品导入模板", values); return File(stream.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"{sFileName}"); diff --git a/ARW.WebApi/Controllers/Business/GoodsManager/ShopGoodsCategorys/ShopGoodsCategoryController.cs b/ARW.WebApi/Controllers/Business/GoodsManager/ShopGoodsCategorys/ShopGoodsCategoryController.cs index 12cdbc0..e7be781 100644 --- a/ARW.WebApi/Controllers/Business/GoodsManager/ShopGoodsCategorys/ShopGoodsCategoryController.cs +++ b/ARW.WebApi/Controllers/Business/GoodsManager/ShopGoodsCategorys/ShopGoodsCategoryController.cs @@ -56,7 +56,6 @@ namespace ARW.WebApi.Controllers.Business.GoodsManager.ShopGoodsCategorys var user = JwtUtil.GetLoginUser(App.HttpContext); if (user.UserId != 1) { - var goodsCategoryList = _ShopService.GetFirstGoodsCategoryList(); var shop = await _ShopService.GetFirstAsync(s => s.ShopUserId == user.UserId); if (shop == null) throw new Exception("当前用户没有店铺"); parm.ShopGuid = shop.ShopGuid; diff --git a/ARW.WebApi/wwwroot/CodeGenTemplate/TplIService.txt b/ARW.WebApi/wwwroot/CodeGenTemplate/TplIService.txt index 9b3d3e8..acc1fe2 100644 --- a/ARW.WebApi/wwwroot/CodeGenTemplate/TplIService.txt +++ b/ARW.WebApi/wwwroot/CodeGenTemplate/TplIService.txt @@ -62,7 +62,7 @@ $if(replaceDto.ShowBtnImport) /// /// Excel导入 /// - /// + /// /// Task ImportExcel(${replaceDto.ModelTypeName} ${replaceDto.ModelTypeName},int index,bool isUpdateSupport,string user); $end