using AlibabaSDK.Api; using AlibabaSDK.Domain; using AlibabaSDK.Request; using CommonUtil; using CommonUtil.RabbitMQ; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Operater.DAL; using Operater.DbModel; using Operater.DTO.System; using Operater.Service; using SqlSugar; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Threading.Tasks; using YouZanSDKStandard.Api; using YouZanSDKStandard.Api.Domain; using YouZanSDKStandard.Api.Request; namespace Api.Operater.Controllers { [Route(TopConstants.API_ROUTE)] public class ProductManageController : BaseController { public IItemDistributionService _itemDistributionService; public ILoginUserInfoService _iloginUserInfoService; public ProductManageController(IItemDistributionService itemDistributionService, ILoginUserInfoService loginUserInfoService) { _itemDistributionService = itemDistributionService; _iloginUserInfoService = loginUserInfoService; } /// /// 一键铺货/重新铺货 /// /// /// [HttpPost] public IActionResult ProductDistribution([FromBody] ProductDistributionRequest request) { bool res = _itemDistributionService.AddDistributionTask(request).Result; return Success(res); } /// /// 查看铺货日志 /// /// /// [HttpPost] public IActionResult GetDistributionHistory([FromBody] GetDistributionHistoryRequest request) { var expression = Expressionable.Create().And(t => t.IsDel == 0) .AndIF(!request.StartCreateTime.IsNull(), t => t.CreateTime >= request.StartCreateTime) .AndIF(!request.DisType.IsNull(), t => t.DisStatus == request.DisType) .AndIF(!request.ProductName.IsNullOrEmpty(), t => t.ProTitle.Contains(request.ProductName)) .AndIF(!request.EndCreateTime.IsNull(), t => t.CreateTime <= request.EndCreateTime) .ToExpression(); int totalCount = 0; var history = new DistributionHistoryDAL().ListPageGet(expression, t => t.CreateTime, DbEnum.OrderType.Desc, request.PageNo, request.PageSize, ref totalCount); return Success(history, request.PageNo, request.PageSize, totalCount); } /// /// 重新铺货 /// /// /// [HttpPost] public IActionResult ReAddItem([FromBody] ReAddItemRequest request) { var userInfo = _iloginUserInfoService.GetUserInfo(); var history = new DistributionHistoryDAL().ListGet(t => request.ProductId.Contains(t.ProductId) && t.IsDel == 0); foreach (var his in history) { bool removeRes = true; if (his.DisStatus == 2) { //先解除铺货关系 removeRes = _itemDistributionService.RemoveRelatProduct(his.ProductId, userInfo.AlibabaToken, userInfo.YzToken, his, userInfo.YzShopId); } if (removeRes) { DistributionHistory distributionHistory = new DistributionHistory() { IsDel = 1, DeleteTime = DateTime.Now }; new DistributionHistoryDAL().Update(distributionHistory, t => new { t.IsDel, t.DeleteTime }, t => t.Id == his.Id && t.DisStatus != 1); } else { return Error("删除失败!"); } } bool res = _itemDistributionService.AddDistributionTask(request).Result; return Success(res); } /// /// 删除记录 /// /// /// [HttpPost] public IActionResult DeleteDistributionHistory([FromBody] DeleteDistributionHistoryRequest request) { var userInfo = _iloginUserInfoService.GetUserInfo(); var history = new DistributionHistoryDAL().ListGet(t => request.Ids.Contains(t.Id)); foreach (var his in history) { bool removeRes = true; if (his.DisStatus == 2) { //先解除铺货关系 removeRes = _itemDistributionService.RemoveRelatProduct(his.ProductId, userInfo.AlibabaToken, userInfo.YzToken, his, userInfo.YzShopId); } if (removeRes) { DistributionHistory distributionHistory = new DistributionHistory() { IsDel = 1, DeleteTime = DateTime.Now }; new DistributionHistoryDAL().Update(distributionHistory, t => new { t.IsDel, t.DeleteTime }, t => t.Id == his.Id && t.DisStatus != 1); } } return Success(true); } /// /// 分页获取商品消息记录 /// /// /// [HttpPost] public IActionResult GetProductUpdateLog([FromBody] GetProductUpdateLogRequest request) { var userInfo = _iloginUserInfoService.GetUserInfo(); var expression = Expressionable.Create().AndIF(!request.ProcessingStatus.IsNull(), t => t.ProcessingStatus == request.ProcessingStatus) .AndIF(!request.ProductName.IsNullOrEmpty(), t => t.ProductTitle.Contains(request.ProductName)) .And(t => t.IsDel == 0) .ToExpression(); int totalCount = 0; var upLog = new ProductUpdateLogDAL().ListPageGet(expression, t => t.CreateTime, DbEnum.OrderType.Desc, request.PageNo, request.PageSize, ref totalCount); if (totalCount > 0) { List logAliPro = upLog.Select(t => t.ProductId).ToList(); var dist = new DistributionRelationDAL().ListGet(t => logAliPro.Contains(t.SourceProduct)); List skuNoList = new List(); foreach (var log in upLog) { var yzItem = dist.Where(t => t.SourceProduct == log.ProductId).ToList(); if (yzItem.IsNull() || yzItem.Count == 0) { continue; } List yzSkuList = JSONUtil.JsonToObject>(yzItem[0].YzskuInfo); skuNoList.Add(yzSkuList[0].sku_no); } //获取有赞商品上下架状态 YouZanItemCommonSearchRequest yzSearchReq = new YouZanItemCommonSearchRequest() { page_no = 1, page_size = 50 }; if (skuNoList.Count > 0) { yzSearchReq.sku_nos = skuNoList; var yzSearchRsp = YouZanClient.Execute(yzSearchReq, userInfo.YzToken); if (!yzSearchRsp.IsNull() && !yzSearchRsp.data.IsNull() && !yzSearchRsp.data.items.IsNull()) { foreach (var item in upLog) { if (item.YzProductId.IsNullOrEmpty()) { continue; } var disPlayItem = yzSearchRsp.data.items.Where(t => t.item_id == long.Parse(item.YzProductId)).ToList(); if (!disPlayItem.IsNull() && disPlayItem.Count > 0) { item.MsgId = disPlayItem[0].is_display.ToString(); } } } } } return Success(upLog, request.PageNo, request.PageSize, totalCount); } /// /// 处理商品消息 /// /// /// [HttpPost] public IActionResult EditProductUpdateLog([FromBody] EditProductUpdateLogRequest request) { ProductUpdateLog productUpdateLog = new ProductUpdateLog() { ProcessingStatus = request.ProcessingStatus, ProcessingTime = DateTime.Now, Memo = request.Memo }; var res = new ProductUpdateLogDAL().Update(productUpdateLog, t => new { t.ProcessingStatus, t.ProcessingTime, t.Memo }, t => request.RecordIds.Contains(t.Id)); return Success(res > 0); } /// /// 解除铺货 /// /// /// [HttpPost] public IActionResult UnRelationProduct([FromBody] UnRelationProductRequest request) { LoginUserInfo userInfo = _iloginUserInfoService.GetUserInfo(); DistributionRelation distributionRelation = new DistributionRelation() { ReStatus = 0 }; int res = new DistributionRelationDAL().Update(distributionRelation, i => new { i.ReStatus }, t => t.SourceProduct == request.AliProductId && t.YzProduct == request.YzProductId); if (res == 0) { return Error("没有可解除的商品!"); } //取消关注1688商品 AlibabaProductUnFollowRequest aliReq = new AlibabaProductUnFollowRequest() { productId = long.Parse(request.AliProductId) }; var aliRsp = AliabaClient.Execute(aliReq, userInfo.AlibabaToken); if (!aliRsp.IsNull() || !aliRsp.Success) { return Error("取消关注商品失败:" + (aliRsp.IsNull() ? "nul;" : aliRsp.message)); } return Success(true); } /// /// 获取有赞商品地址 /// /// /// [HttpPost] public IActionResult GetYzItemUrl([FromBody] GetYzItemUrlRequest request) { var userInfo = _iloginUserInfoService.GetUserInfo(); if (!request.Alias.IsNullOrEmpty()) { return Success($"https://shop{userInfo.YzShopId}.m.youzan.com/wscgoods/detail/{request.Alias}"); } var rela = new DistributionRelationDAL().ListGet(t => t.YzProduct == request.ProductId); if (!rela.IsNull() && rela.Count > 0) { return Success($"https://shop{userInfo.YzShopId}.m.youzan.com/wscgoods/detail/{rela[0].YzAlias}"); } return Error("未找到关联关系"); } /// /// 增量修改有赞商品信息 /// /// /// [HttpPost] public IActionResult UpdateYzProduct([FromBody] UpdateYzProductRequest request) { var userInfo = _iloginUserInfoService.GetUserInfo(); if (request.UpdateType == 1 && (request.Price.IsNull())) { return Error("价格必传"); } if (request.UpdateType == 0 && (request.SkuInfo.IsNull() || request.SkuInfo.Count == 0)) { return Error("无需要修改的sku信息"); } string beforeSku = ""; YouZanProductUpdateReqDomain upDomain = new YouZanProductUpdateReqDomain() { item_id = long.Parse(request.ItemId) }; List skuList = new List(); if (request.UpdateType == 0) { foreach (var sku in request.SkuInfo) { YouZanProductUpdateReqSkuList skuItem = new YouZanProductUpdateReqSkuList(); skuItem.price = long.Parse((sku.Price * 100).ToString("0.#")); skuItem.sku_id = long.Parse(sku.SkuId); skuList.Add(skuItem); } } else { ////获取有赞商品详情 YouZanProductDetailGetRequest udetailReq = new YouZanProductDetailGetRequest() { item_id = long.Parse(request.ItemId) }; var udetailRs = YouZanClient.Execute(udetailReq, userInfo.YzToken); if (udetailRs.IsNull() || !udetailRs.success) { return Error("获取有赞商品详情失败:" + udetailRs.message); } foreach (var sku in udetailRs.data.sku_list) { YouZanProductUpdateReqSkuList skuItem = new YouZanProductUpdateReqSkuList(); skuItem.price = long.Parse(((decimal)request.Price * 100).ToString("0.#")); skuItem.sku_id = long.Parse(sku.sku_id); skuList.Add(skuItem); } beforeSku = JSONUtil.ObjectToJson(udetailRs.data.sku_list); } upDomain.sku_list = skuList; YouZanProductUpdateRequest yzReq = new YouZanProductUpdateRequest() { param = upDomain }; var yzRsp = YouZanClient.Execute(yzReq, userInfo.YzToken); if (yzRsp.IsNull() || !yzRsp.success) { return Error("有赞接口修改失败:" + yzRsp.message); } //获取有赞商品信息,更新最新sku ////获取有赞商品详情 YouZanProductDetailGetRequest detailReq = new YouZanProductDetailGetRequest() { item_id = long.Parse(request.ItemId) }; var detailRs = YouZanClient.Execute(detailReq, userInfo.YzToken); if (detailRs.IsNull() || !detailRs.success) { LogUtil.Info("获取有赞商品详情失败:" + detailRs.message, "商品错误"); } else { //记录有赞最新sku信息 DistributionRelation distributionRelation = new DistributionRelation() { YzskuInfo = JSONUtil.ObjectToJson(detailRs.data.sku_list) }; new DistributionRelationDAL().Update(distributionRelation, i => new { i.YzskuInfo }, t => t.YzProduct == request.ItemId); if (request.UpdateType == 1) { //记录修改 BatchUpdatepriceHistory batchUpdatepriceHistory = new BatchUpdatepriceHistory() { Id = Guid.NewGuid().ToString(), YzProductId = request.ItemId, UpdateTime = DateTime.Now, UpdateStatus = 1, TaskId = "10000", YzTxt = JSONUtil.ObjectToJson(detailRs.data.sku_list), YzBeforeTxt = beforeSku }; new BatchUpdatepriceHistoryDAL().Insert(batchUpdatepriceHistory); } } return Success(true); } /// /// 获取铺货数据 /// /// /// [HttpPost] public IActionResult ListGetDistributionHistory([FromBody] ListGetDistributionHistoryRequest request) { var userInfo = _iloginUserInfoService.GetUserInfo(); string where = " where a.is_del=0 "; if (!request.Title.IsNullOrEmpty()) { where += $" and a.pro_title like'%{request.Title}%' "; } if ((!request.TagIds.IsNull() && request.TagIds.Count > 0) || !request.IsDisplay.IsNull()) {//根据商品分组查询 List itemIds = _itemDistributionService.GetYzItemIdByTag(request, userInfo.YzToken); if (!itemIds.IsNull() && itemIds.Count > 0) { string yzItemStr = string.Join(',', itemIds); yzItemStr = "'" + yzItemStr.Replace(",", "','") + "'"; where += $" and a.yz_item_id in ({yzItemStr}) "; } } List response = new List(); //先查总数 string countSql = $"select count(1) as count from distribution_history a {where}"; DataTable countDt = new DistributionHistoryDAL().GetDataBySql(countSql); int totalCount = 0; if (countDt.IsNull() || countDt.Rows.Count == 0) { return Success(response, request.PageNo, request.PageSize, 0); } totalCount = int.Parse(countDt.Rows[0]["count"].ToString()); string searchSql = $"SELECT a.*,b.alisku_info,b.yzsku_info from distribution_history a left JOIN distribution_relation b on a.yz_item_id=b.yz_product {where} order by a.create_time desc limit {request.PageSize} offset {(request.PageNo - 1) * request.PageSize}"; DataTable dt = new DistributionHistoryDAL().GetDataBySql(searchSql); if (dt.IsNull() || dt.Rows.Count == 0) { return Success(response, request.PageNo, request.PageSize, 0); } List skuNoList = new List(); foreach (DataRow dr in dt.Rows) { ListGetDistributionHistoryResponse rsp = new ListGetDistributionHistoryResponse() { Id = dr["id"].ToString(), ProductId = dr["product_id"].ToString(), CreateTime = Convert.ToDateTime(dr["create_time"].ToString()), DisStatus = int.Parse(dr["dis_status"].ToString()), Memo = dr["memo"].ToString(), YzItemId = dr["yz_item_id"].ToString(), TaskId = dr["task_id"].ToString(), ProTitle = dr["pro_title"].ToString(), ProImg = dr["pro_img"].ToString(), YzAlias = dr["yz_alias"].ToString(), ProSource = int.Parse(dr["pro_source"].ToString()), IsFreeShipping = int.Parse(dr["is_free_shipping"].ToString()) }; List skuList = new List(); if (dr["yzsku_info"].IsNull() || dr["yzsku_info"].ToString().IsNullOrEmpty()) { rsp.SkuList = skuList; response.Add(rsp); continue; } List yzSkuList = JSONUtil.JsonToObject>(dr["yzsku_info"].ToString()); skuNoList.Add(yzSkuList[0].sku_no); List aliSkuList = JSONUtil.JsonToObject>(dr["alisku_info"].ToString()); foreach (var sitem in yzSkuList) { var aliSku = aliSkuList.Where(t => t.skuId == long.Parse(sitem.sku_no)).ToList(); if (aliSku.IsNull() || aliSku.Count == 0) { continue; } List propsList = new List(); foreach (var pro in sitem.sku_props) { ProSkuItemProps pr = new ProSkuItemProps() { Name = pro.prop_name, Value = pro.prop_value_name }; propsList.Add(pr); } string aliSkuPrice = dr["pro_source"].ToString() == "1" ? aliSku[0].consignPrice.ToString("0.00##") : aliSku[0].retailPrice.ToString("0.00##"); ProSkuItem proSkuItem = new ProSkuItem() { YzSkuId = sitem.sku_id, YzSkuPrice = (decimal.Parse(sitem.price.ToString()) / 100).ToString("0.00##"), Props = propsList, AliSkuId = aliSku[0].skuId.ToString(), AliSkuPrice = aliSkuPrice, RowCount = yzSkuList.Count, YzItemId = dr["yz_item_id"].ToString() }; skuList.Add(proSkuItem); } rsp.SkuList = skuList; response.Add(rsp); } //获取有赞商品上下架状态 YouZanItemCommonSearchRequest yzSearchReq = new YouZanItemCommonSearchRequest() { page_no = 1, page_size = 50 }; if (skuNoList.Count > 0) { yzSearchReq.sku_nos = skuNoList; var yzSearchRsp = YouZanClient.Execute(yzSearchReq, userInfo.YzToken); if (!yzSearchRsp.IsNull() && !yzSearchRsp.data.IsNull() && !yzSearchRsp.data.items.IsNull()) { foreach (var item in response) { if (item.YzItemId.IsNullOrEmpty()) { continue; } var disPlayItem = yzSearchRsp.data.items.Where(t => t.item_id == long.Parse(item.YzItemId)).ToList(); if (!disPlayItem.IsNull() && disPlayItem.Count > 0) { item.IsDisplay = disPlayItem[0].is_display == 1 ? 1 : 2; item.ProTagIds = disPlayItem[0].tag_ids; } } } } return Success(response, request.PageNo, request.PageSize, totalCount); } /// /// 提交拉取分销单任务 /// /// [HttpPost] public IActionResult AddDistributebillTask() { var task = new DaifaTaskDAL().ListGet(t => t.TaskStatus != 2); if (!task.IsNull() && task.Count > 0) { return Error("当前有任务执行,请稍后提交任务!"); } string taskId = Guid.NewGuid().ToString(); DaifaTask daifaTask = new DaifaTask() { Id = taskId, CreateTime = DateTime.Now, TaskStatus = 0, TaskType = 1 }; new DaifaTaskDAL().Insert(daifaTask); //发执行mq ProductDistributionMq productDistributionMq = new ProductDistributionMq() { TaskId = taskId, TaskType = 1 }; string ret = MQClientFullChannel.SendMessageStatic(0, "product_distribution", JSONUtil.ObjectToJson(productDistributionMq)); if (ret != "ok") { return Error("mq发送失败"); } return Success(true); } /// /// 有赞下架 /// /// /// [HttpPost] public IActionResult DelingYz([FromBody] DelingYzRequset request) { var userInfo = _iloginUserInfoService.GetUserInfo(); //下架有赞商品 YouZanItemDelistingRequest delistingReq = new YouZanItemDelistingRequest() { item_id = long.Parse(request.YzProductId) }; var delistingRsp = YouZanClient.Execute(delistingReq, userInfo.YzToken); if (delistingRsp.IsNull() || !delistingRsp.success) { return Error("下架有赞商品失败:" + (delistingRsp.IsNull() ? "null" : delistingRsp.message)); } //修改消息记录里的有赞状态 ProductUpdateLog productUpdateLog = new ProductUpdateLog() { Memo = "人工下架", IsSystemDown = 0 }; new ProductUpdateLogDAL().Update(productUpdateLog, i => new { i.Memo, i.IsSystemDown }, t => t.YzProductId == request.YzProductId); return Success(true); } /// /// 有赞上架 /// /// /// [HttpPost] public IActionResult UpdateListingYz([FromBody] UpdateListingYzRequest request) { var userInfo = _iloginUserInfoService.GetUserInfo(); //获取有赞对应的铺货关系 var relat = new DistributionRelationDAL().ListGet(t => t.YzProduct == request.YzProductId); if (relat.IsNull() || relat.Count == 0) { return Error("获取有赞对应1688的商品关系失败!"); } //获取商品详情 if (relat[0].ProSource == 0) {//精选 List ls = new List(); ls.Add(relat[0].SourceProduct); PFTProductDetailRequest pftrequest = new PFTProductDetailRequest() { offerIds = ls }; var pftresponse = AliabaClient.Execute(pftrequest, userInfo.AlibabaToken); if (pftresponse.IsNull() || !pftresponse.result.success || pftresponse.result.result.Count == 0) {//获取商品详情失败 return Error("获取精选商品详情失败:" + pftresponse.result.message); } if (pftresponse.result.result[0].productInfo.status != "published" || !pftresponse.result.result[0].productInfo.saleInfo.supportOnlineTrade) {//不可上架 return Error("该精选商品状态异常,不可上架"); } } else {//代发 FenXiaoProductInfoGetRequest fxrequest = new FenXiaoProductInfoGetRequest() { offerId = long.Parse(relat[0].SourceProduct) }; var fxresponse = AliabaClient.Execute(fxrequest, userInfo.AlibabaToken); if (fxresponse.IsNull() || !fxresponse.Success) { return Error("获取代发商品详情失败:" + fxresponse.ErrorMsg); } if (fxresponse.productInfo.status != "published" || !fxresponse.productInfo.productSaleInfo.supportOnlineTrade) { return Error("该精选商品状态异常,不可上架"); } } //有赞上架 YouZanUpdateListingRequest yzReq = new YouZanUpdateListingRequest() { item_id = long.Parse(request.YzProductId) }; var yzRsp = YouZanClient.Execute(yzReq, userInfo.YzToken); if (yzRsp.IsNull() || !yzRsp.success) { return Error("有赞上架失败:" + yzRsp.message); } //修改消息记录里的有赞状态 ProductUpdateLog productUpdateLog = new ProductUpdateLog() { Memo = "人工上架", IsSystemDown = 0 }; new ProductUpdateLogDAL().Update(productUpdateLog, i => new { i.Memo, i.IsSystemDown }, t => t.YzProductId == request.YzProductId); return Success(true); } /// /// 删除商品变更日志 /// /// /// [HttpPost] public IActionResult BatchDeleteProductLog([FromBody] BatchDeleteProductLogRequest request) { var userInfo = _iloginUserInfoService.GetUserInfo(); ProductUpdateLog productUpdateLog = new ProductUpdateLog() { IsDel = 1 }; var res = new ProductUpdateLogDAL().Update(productUpdateLog, i => new { i.IsDel }, t => request.LogIds.Contains(t.Id)); if (request.IsDelItem) { var logInfo = new ProductUpdateLogDAL().ListGet(t => request.LogIds.Contains(t.Id)); if (!logInfo.IsNull() && logInfo.Count > 0) { var aliIds = logInfo.Select(t => t.ProductId).ToList(); var history = new DistributionHistoryDAL().ListGet(t => aliIds.Contains(t.ProductId) && t.IsDel == 0); foreach (var his in history) { bool removeRes = true; if (his.DisStatus == 2) { //先解除铺货关系 removeRes = _itemDistributionService.RemoveRelatProduct(his.ProductId, userInfo.AlibabaToken, userInfo.YzToken, his, userInfo.YzShopId); } if (removeRes) { DistributionHistory distributionHistory = new DistributionHistory() { IsDel = 1, DeleteTime = DateTime.Now }; new DistributionHistoryDAL().Update(distributionHistory, t => new { t.IsDel, t.DeleteTime }, t => t.Id == his.Id && t.DisStatus != 1); } } } } return Success(true); } /// /// 更新商品sku信息 /// /// /// [HttpPost] public IActionResult UpdateYzSkuListInfo([FromBody] UpdateYzSkuListInfoRequest request) { return Success(true); ; } } }