using AllBase; using AllBase.Helper; using AllBase.Model.Result; using NaiBa.Util.Extension; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using TemuKJD.Extension; using TemuKJD.BaseForms; using TemuKJD.KJDForms.ShopForms; using TemuKJD.BLL; namespace TemuKJD.KJDForms.ProductForms { /// /// 销售备货管理 /// public partial class SaleStockUpForm : BaseForm { public bool isNewService = false; private CheckBox chkSelectAll = null; //private CheckBox chkCheckAll = null; public CancellationTokenSource cancellationTokenSource { get; set; } = null; /// /// 取消待创建备货单列表 /// List lstStockInfo = new List(); /// /// 待备货商品列表 /// List lstSubOrderInfo = new List(); public SaleStockUpForm() { InitializeComponent(); } private void StockUpForm_Load(object sender, EventArgs e) { chkSelectAll = dgvShop.Columns["colSelect"].AddHeaderCheckBox(HorizontalAlignment.Center, 0, 0, null, null, false); dgvShop.Columns["colSelect"].HeaderText = ""; //chkSelectAll.Width = chkSelectAll.Height = 13; chkSelectAll.CheckedChanged += chkSelectAll_CheckedChanged; this.dgvStock.AddSelectorColumn("colCheck"); } private void chkSelectAll_CheckedChanged(object sender, EventArgs e) { if (!chkSelectAll.Checked) { foreach (DataGridViewRow row in dgvShop.Rows) { row.Cells["colSelect"].Value = false; } } else { var list = GlobalConfig.ShopLoginList.Where(s => s.LoginStatus == "登录成功").Select(ss => ss.ShopId); foreach (DataGridViewRow row in dgvShop.Rows) { if (list.Any(l => l == row.Cells["colShopId"]?.Value?.ToString())) row.Cells["colSelect"].Value = true; } } } private void StockUpForm_VisibleChanged(object sender, EventArgs e) { if (Visible == true) FiltShop(); } private void btnRefreshShop_Click(object sender, EventArgs e) { pbShopLoading.Visible = true; Task.Run(() => { ShopListForm.UpdateShop(); Invoke(new Action(() => { FiltShop(); pbShopLoading.Visible = false; })); }); } private void btnSearchShop_Click(object sender, EventArgs e) { FiltShop(); } private void FiltShop() { // 店铺Id var selectIds = dgvShop.Rows.Cast().Where(row => row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); var shopLst = GlobalConfig.ShopLoginList.ToList(); if (!string.IsNullOrWhiteSpace(txtShopId.Text.Trim())) { shopLst = shopLst.Where(s => ("," + txtShopId.Text.Trim() + ",").Contains("," + s.ShopId + ",") || s.ShopId.Contains(txtShopId.Text.Trim())).ToList(); } if (!string.IsNullOrWhiteSpace(txtShopName.Text.Trim())) { shopLst = shopLst.Where(s => ("," + txtShopName.Text.Trim() + ",").Contains("," + s.ShopAccount + ",") || s.ShopAccount.ToLower().Contains(txtShopName.Text.Trim().ToLower())).ToList(); } if (!string.IsNullOrWhiteSpace(txtNotes.Text.Trim())) { shopLst = shopLst.Where(s => ("," + txtNotes.Text.Trim() + ",").Contains("," + s.Notes + ",") || s.Notes.ToLower().Contains(txtNotes.Text.Trim().ToLower())).ToList(); } // 获取被删除的店铺 List dgvRowList = dgvShop.Rows.Cast().Where(row => !shopLst.Any(s => s.ShopId == row.Cells["colShopId"]?.Value?.ToString())).ToList(); // 更新被删除的店铺列表 foreach (var row in dgvRowList) { dgvShop.Rows.Remove(row); } // 绑定其他店铺(含新导入的店铺) foreach (ShopLoginInfo shopEntity in shopLst) { if (!string.IsNullOrEmpty(shopEntity.ShopId)) BindShop(shopEntity, selectIds); } } private void BindShop(ShopLoginInfo shopEntity, List selectShopId = null) { if (shopEntity == null) return; if (selectShopId == null) selectShopId = new List(); bool canUse = shopEntity.LoginStatus == "登录成功" && shopEntity.LoginStatus2 == "国际版在线"; var row = dgvShop.Rows.Cast().FirstOrDefault(p => p.Cells.GetCellValueFromColumnName("colShopId").ParseToString() == shopEntity.ShopId); if (row == null) { int id = this.dgvShop.Rows.Add( selectShopId.Contains(shopEntity.ShopId) && canUse, shopEntity.LoginName, shopEntity.ShopId, shopEntity.ShopAccount, shopEntity.Notes, canUse ? "在线" : "掉线", canUse, string.Empty ); row = dgvShop.Rows[id]; //row.Cells["colLoginStatus"].Style.ForeColor = canUse ? Color.Green : Color.Red; (row.Cells["colLoginStatus"] as DataGridViewLinkCell).Style.ForeColor = canUse ? Color.Green : Color.Red; (row.Cells["colLoginStatus"] as DataGridViewLinkCell).LinkColor = canUse ? Color.Green : Color.Red; (row.Cells["colLoginStatus"] as DataGridViewLinkCell).ActiveLinkColor = canUse ? Color.LightGreen : Color.OrangeRed; (row.Cells["colLoginStatus"] as DataGridViewLinkCell).VisitedLinkColor = canUse ? Color.DarkGreen : Color.DarkRed; } else { row.Cells["colSelect"].Value = selectShopId.Contains(shopEntity.ShopId) && canUse; row.Cells["colShopLoginName"].Value = shopEntity.LoginName; row.Cells["colShopName"].Value = shopEntity.ShopAccount; row.Cells["colShopNotes"].Value = shopEntity.Notes; row.Cells["colLoginStatus"].Value = canUse ? "在线" : "掉线"; //row.Cells["colLoginStatus"].Style.ForeColor = canUse ? Color.Green : Color.Red; (row.Cells["colLoginStatus"] as DataGridViewLinkCell).Style.ForeColor = canUse ? Color.Green : Color.Red; (row.Cells["colLoginStatus"] as DataGridViewLinkCell).LinkColor = canUse ? Color.Green : Color.Red; (row.Cells["colLoginStatus"] as DataGridViewLinkCell).ActiveLinkColor = canUse ? Color.LightGreen : Color.OrangeRed; (row.Cells["colLoginStatus"] as DataGridViewLinkCell).VisitedLinkColor = canUse ? Color.DarkGreen : Color.DarkRed; row.Cells["colCanUse"].Value = canUse; } } private void btnSearch_Click(object sender, EventArgs e) { var lstShopId = dgvShop.Rows.Cast().Where(row => row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); if (lstShopId.Count == 0) { BaseMsgForm.ShowInfo("请选择店铺!"); return; } var columns = this.dgvStock.Columns.Cast(); foreach (var col in columns) { if (col.Name == "colParentStockId" || col.Name == "colStockId") { col.Visible = true; } if (col.Name == "colTodaySaleVolume" || col.Name == "colLastSevenDaysSaleVolume" || col.Name == "colInCartNumber7d" || col.Name == "colSalesInventoryNum" || col.Name == "colWaitReceiveNum" || col.Name == "colNeedStockUp" || col.Name == "colQualityScore") { col.Visible = false; } } lstStockInfo.Clear(); dgvStock.Rows.Clear(); var dgvRows = this.dgvShop.Rows.Cast();//.Where(r => lstShopId.Contains(r.Cells["colShopId"].Value.ParseToString())); foreach (var row in dgvRows) { row.Cells["colMessage"].Value = ""; } string searchText = txtStockid.Text.Trim(); //ucGroupBoxEx2.Enabled = false; ucGroupBoxEx3.Enabled = false; ucGroupBoxEx4.Enabled = false; cancellationTokenSource = new CancellationTokenSource(); Task.Run(() => { var lstShopIdTemp = new List(); lstShopIdTemp.AddRange(lstShopId); int i = 0; foreach (var shopId in lstShopIdTemp) { this.Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "正在查询..."; this.statusBar.pgbTaskProgress.Maximum = lstShopIdTemp.Count; this.statusBar.UpdateProgressBar(i + 1); i++; })); if (cancellationTokenSource.IsCancellationRequested) break; var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == shopId); if (shop == null) continue; #region 检测登录 if (shop.LoginStatus != "登录成功") { continue; } if (ShopListForm.Instance == null) ShopListForm.Instance = new ShopListForm(); ShopListForm.Instance.CheckShopLogin(new string[] { shop.LoginName }, false); if (shop.LoginStatus != "登录成功") { Invoke(new Action(() => { var rows = this.dgvShop.Rows.Cast().Where(r => r.Cells["colShopLoginName"].Value.ToString() == shop.LoginName); foreach (var row in rows) { row.Cells["colMessage"].Value = "店铺掉线"; row.Cells["colLoginStatus"].Value = "未登录"; row.Cells["colCanUse"].Value = false; } })); continue; } #endregion Invoke(new Action(() => { var rows = this.dgvShop.Rows.Cast().Where(r => r.Cells["colShopId"].Value.ToString() == shop.ShopId); foreach (var row in rows) { row.Cells["colMessage"].Value = "正在查询"; } })); int page = 1; int totalPage = 1; bool isError = false; while (page <= totalPage) { if (cancellationTokenSource.IsCancellationRequested) break; Thread.Sleep(100 + Randomx.GetId(200)); string jsonStr = GetShopStockList(shop, page, chkHasCreate.Checked ? "已送货" : "待创建"); if (jsonStr.Contains("指定的值含有无效的控制字符")) { BaseMsgForm.ShowError("店铺" + shop.LoginName + " " + shop.ShopId + "已掉线"); isError = true; break; } if (!jsonStr.Contains("\"success\":true")) jsonStr = GetShopStockList(shop, page, chkHasCreate.Checked ? "已送货" : "待创建"); if (!jsonStr.Contains("\"success\":true")) { isError = true; } if (jsonStr.Contains("\"success\":true")) { var jArr = new JArray(); try { var jObj = JObject.Parse(jsonStr); jArr = jObj["result"]?["subOrderForSupplierList"] as JArray; if (jArr == null) jArr = new JArray(); } catch (Exception ex) { BaseMsgForm.ShowError(ex.Message); } foreach (var item in jArr) { string sItem = item.ToString(); TemuStockInfo sInfo = JsonHelper.DeserializeJsonToObject(sItem); // 反序列化得到类 if (sInfo != null) { lstStockInfo.Add(sInfo); //string url = sInfo.productSkcPicture.Replace("https", "http"); //var image = Image.FromStream(WebRequest.Create(url).GetResponse().GetResponseStream()); Invoke(new Action(() => { int rowId = this.dgvStock.Rows.Add( "", true, sInfo.supplierId, sInfo.supplierName, sInfo.subPurchaseOrderSn, sInfo.originalPurchaseOrderSn, sInfo.productSkcPicture.Replace("https", "http"), null,//image, sInfo.productId, sInfo.productSkcId, sInfo.productName, "", "", "", "", "", "", 0.0, "", "" ); dgvStock.Rows[rowId].Height = 60; })); } } Invoke(new Action(() => { ShowDgvImg(); })); int total = BaseRegex.GetStringJson(ref jsonStr, "total").ParseToInt(); totalPage = Math.Ceiling(total / 20.0).ParseToInt(); } page++; } Invoke(new Action(() => { var rows = this.dgvShop.Rows.Cast().Where(r => r.Cells["colShopId"].Value.ToString() == shop.ShopId); if (!isError) { foreach (var row in rows) { row.Cells["colMessage"].Value = "已查询"; } } else { foreach (var row in rows) { row.Cells["colMessage"].Value = "查询失败"; } } })); } Invoke(new Action(() => { //ucGroupBoxEx2.Enabled = true; ucGroupBoxEx3.Enabled = true; ucGroupBoxEx4.Enabled = true; string sRst = "查询结束!"; if (cancellationTokenSource.IsCancellationRequested) sRst = "已取消查询!"; BaseMsgForm.ShowInfo(sRst); this.statusBar.lblTaskStatus.Text = sRst; })); }, cancellationTokenSource.Token); } /// /// 根据店铺获取备货单列表 首页--备货单管理--我的备货单 /// /// /// /// private string GetShopStockList(ShopLoginInfo shop, int page = 1, string type = "待创建") { if (isNewService) return GetShopStockList2(shop, page, type); page = Math.Max(page, 1); string url = "https://seller.kuajingmaihuo.com/oms/bg/venom/api/supplier/purchase/manager/querySubOrderList"; string body; if (type == "已送货") body = @"{""pageNo"":" + page + @",""pageSize"":20,""urgencyType"":0,""isCustomGoods"":false,""statusList"":[2],""oneDimensionSort"":{""firstOrderByParam"":""realDeliverTime"",""firstOrderByDesc"":1}}"; //已送货 else body = @"{""pageNo"":" + page + @",""pageSize"":20,""urgencyType"":0,""isCustomGoods"":false,""statusList"":[0],""oneDimensionSort"":{""firstOrderByParam"":""expectLatestDeliverTime"",""firstOrderByDesc"":0}}"; //待创建 string refere = "https://seller.kuajingmaihuo.com/main/order-manage"; return HttpResponseBLL.PostResponse(shop, url, body,refere); } private string GetShopStockList2(ShopLoginInfo shop, int page = 1, string type = "待创建") { page = Math.Max(page, 1); string url = "https://agentseller.temu.com/mms/venom/api/supplier/purchase/manager/querySubOrderList"; string body; if (type == "已送货") body = @"{""pageNo"":" + page + @",""pageSize"":20,""urgencyType"":0,""isCustomGoods"":false,""statusList"":[2],""oneDimensionSort"":{""firstOrderByParam"":""realDeliverTime"",""firstOrderByDesc"":1}}"; //已送货 else body = @"{""pageNo"":" + page + @",""pageSize"":20,""urgencyType"":0,""isCustomGoods"":false,""statusList"":[0],""oneDimensionSort"":{""firstOrderByParam"":""expectLatestDeliverTime"",""firstOrderByDesc"":0}}"; //待创建 string refere = "https://agentseller.temu.com/stock/fully-mgt/order-manage-urgency"; return HttpResponseBLL.PostResponse2(shop, url, body, refere); } /// /// 取消待创建备货单 首页--备货单管理--我的备货单 /// /// /// /// private string CancelSubPurchaseOrder(ShopLoginInfo shop, string subPurchaseOrderSn) { if (isNewService) return CancelSubPurchaseOrder2(shop, subPurchaseOrderSn); string url = "https://seller.kuajingmaihuo.com/oms/bg/venom/api/supplier/purchase/manager/batchCancelSubPurchaseOrder"; string body = "{\"subPurchaseOrderSnList\":[\"" + subPurchaseOrderSn + "\"]}"; string refere = "https://seller.kuajingmaihuo.com/main/order-manage"; return HttpResponseBLL.PostResponse(shop, url, body, refere); } private string CancelSubPurchaseOrder2(ShopLoginInfo shop, string subPurchaseOrderSn) { string url = "https://agentseller.temu.com/mms/venom/api/supplier/purchase/manager/batchCancelSubPurchaseOrder"; string body = "{\"subPurchaseOrderSnList\":[\"" + subPurchaseOrderSn + "\"]}"; string refere = "https://agentseller.temu.com/stock/fully-mgt/order-manage"; return HttpResponseBLL.PostResponse2(shop, url, body, refere); } /// /// 查询销售列表 /// /// /// /// private string GetWarehouseList(ShopLoginInfo shop, int page = 1) { if (isNewService) return GetWarehouseList2(shop, page); page = Math.Max(page, 1); string url = "https://seller.kuajingmaihuo.com/marvel-mms/cn/api/kiana/venom/sales/management/listWarehouse"; string body = @"{""pageNo"":" + page + @",""pageSize"":40,""isLack"":0,""selectStatusList"":[12],""priceAdjustRecentDays"":7}"; string refere = "https://seller.kuajingmaihuo.com/main/sale-manage/main"; return HttpResponseBLL.PostResponse(shop, url, body, refere); } private string GetWarehouseList2(ShopLoginInfo shop, int page = 1) { page = Math.Max(page, 1); string url = "https://agentseller.temu.com/mms/venom/api/supplier/sales/management/listWarehouse"; string body = @"{""pageNo"":" + page + @",""pageSize"":10,""isLack"":0,""selectStatusList"":[12],""priceAdjustRecentDays"":7}"; string refere = "https://agentseller.temu.com/stock/fully-mgt/sale-manage/main"; return HttpResponseBLL.PostResponse2(shop, url, body, refere); } /// /// 查询单个商品申请备货条件 /// /// /// /// private string QueryStockBaseInfo(ShopLoginInfo shop, WarehouseProductSubOrderInfo subOrderInfo) { if (isNewService) return QueryStockBaseInfo2(shop, subOrderInfo); string url = "https://seller.kuajingmaihuo.com/oms/bg/venom/api/supplier/sales/management/queryStockBaseInfo"; string body = "{\"productSkcId\":" + subOrderInfo.productSkcId + ",\"warehouseGroupId\":" + subOrderInfo.warehouseGroupIdList.FirstOrDefault() + "}"; string refere = "https://seller.kuajingmaihuo.com/main/sale-manage/main"; return HttpResponseBLL.PostResponse(shop, url, body, refere); } private string QueryStockBaseInfo2(ShopLoginInfo shop, WarehouseProductSubOrderInfo subOrderInfo) { string url = "https://agentseller.temu.com/mms/venom/api/supplier/sales/management/queryStockBaseInfo"; string body = "{\"productSkcId\":" + subOrderInfo.productSkcId + ",\"warehouseGroupId\":" + subOrderInfo.warehouseGroupIdList.FirstOrDefault() + "}"; string refere = "https://agentseller.temu.com/stock/fully-mgt/sale-manage/main"; return HttpResponseBLL.PostResponse2(shop, url, body, refere); } /// /// 单个商品申请备货 /// /// /// /// private string CreateStockOrder(ShopLoginInfo shop, WarehouseProductSubOrderInfo subOrderInfo) { if (isNewService) return CreateStockOrder2(shop, subOrderInfo); string url = "https://seller.kuajingmaihuo.com/oms/bg/venom/api/supplier/sales/management/createStockOrder"; string body = "{\"productSkcId\":" + subOrderInfo.productSkcId + "," + "\"purchaseDetailList\":["; foreach(var sku in subOrderInfo.skuQuantityDetailList) { if (sku.wantStockUpBound>0) body += "{\"productSkuId\":" + sku.productSkuId + ",\"productSkuPurchaseQuantity\":\"" + sku.wantStockUpBound + "\"},"; } body = body.TrimEnd(','); body += "],\"warehouseGroupId\":" + subOrderInfo.warehouseGroupIdList.FirstOrDefault() + "}"; string refere = "https://seller.kuajingmaihuo.com/main/sale-manage/main"; return HttpResponseBLL.PostResponse(shop, url, body, refere); } private string CreateStockOrder2(ShopLoginInfo shop, WarehouseProductSubOrderInfo subOrderInfo) { string url = "https://agentseller.temu.com/mms/venom/api/supplier/sales/management/createStockOrder"; string body = "{\"productSkcId\":" + subOrderInfo.productSkcId + "," + "\"purchaseDetailList\":["; foreach (var sku in subOrderInfo.skuQuantityDetailList) { if (sku.wantStockUpBound > 0) body += "{\"productSkuId\":" + sku.productSkuId + ",\"productSkuPurchaseQuantity\":\"" + sku.wantStockUpBound + "\"},"; } body = body.TrimEnd(','); body += "],\"warehouseGroupId\":" + subOrderInfo.warehouseGroupIdList.FirstOrDefault() + "}"; string refere = "https://agentseller.temu.com/stock/fully-mgt/sale-manage/main"; return HttpResponseBLL.PostResponse2(shop, url, body, refere); } /// /// qualityScoreEnum = 1 小于60分商品 /// qualityScoreEnum = 2 60分到70分商品 /// qualityScoreEnum = 3 70分到90分商品 /// qualityScoreEnum = 4 90分以上 /// private string GetQualityInfo2(ShopLoginInfo shop, string productIds, int qualityScoreEnum = 4) { string url = "https://agentseller.temu.com/bg-luna-agent-seller/goods/quality/supplyChain/qualityMetrics/pageQuery"; string body = @"{""page"":1,""pageSize"":40,""qualityScoreEnum"":" + qualityScoreEnum + @",""productIds"":[" + productIds + "]}"; string refere = "https://agentseller.temu.com/main/quality/dashboard"; return HttpResponseBLL.PostResponse2(shop, url, body, refere); } private void dgvShop_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex < 0 || e.RowIndex < 0) return; string headerText = dgvShop.Columns[e.ColumnIndex].HeaderText; string columnName = dgvShop.Columns[e.ColumnIndex].Name; long shopId = dgvShop.Rows[e.RowIndex].Cells["colShopId"].Value.ParseToLong(); string shopAccount = dgvShop.Rows[e.RowIndex].Cells["colShopName"].Value.ToString(); var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == shopId.ToString()); var row = dgvShop.Rows[e.RowIndex]; switch (columnName) { case "colSelect": if (row.Cells["colCanUse"].Value.ParseToBool() || row.Cells["colSelect"].Value.ParseToBool()) { row.Cells["colSelect"].Value = !row.Cells["colSelect"].Value.ParseToBool(); chkSelectAll.CheckedChanged -= chkSelectAll_CheckedChanged; if (dgvShop.Rows.Cast().All(r => r.Cells["colSelect"].Value.ParseToBool())) chkSelectAll.Checked = true; else chkSelectAll.Checked = false; chkSelectAll.CheckedChanged += chkSelectAll_CheckedChanged; } else { BaseMsgForm.ShowInfo("店铺未登录!"); } break; case "colLoginStatus": ShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); if (shop.LoginStatus2 == "国际版在线") { ShopLoginForm shopLoginForm = new ShopLoginForm(shop); shopLoginForm.openType = EnumOpenType.manage; shopLoginForm.WindowState = FormWindowState.Maximized; shopLoginForm.InitUrl = "https://agentseller.temu.com"; shopLoginForm.Show(); } else { ShopLoginForm shopLoginForm = new ShopLoginForm(shop); shopLoginForm.openType = EnumOpenType.login; shopLoginForm.ShowDialog(); FiltShop(); } break; } } private void btnStop_Click(object sender, EventArgs e) { if (cancellationTokenSource != null) cancellationTokenSource.Cancel(); Invoke(new Action(() => { //ucGroupBoxEx2.Enabled = true; ucGroupBoxEx3.Enabled = true; ucGroupBoxEx4.Enabled = true; })); } private void dgvStock_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0 || e.ColumnIndex < 0) return; string columnName = dgvStock.Columns[e.ColumnIndex].Name; var row = dgvStock.Rows[e.RowIndex]; switch (columnName) { case "colCheck": row.Cells["colCheck"].Value = !row.Cells["colCheck"].Value.ParseToBool(); break; } } private void btnCancelSubPurchaseOrder_Click(object sender, EventArgs e) { var lstStockOrderSn = dgvStock.Rows.Cast().Where(row => row.Cells["colCheck"]?.Value.ParseToBool() == true).Select(r => r.Cells["colStockId"]?.Value.ToString()).ToList(); var lstStock = lstStockInfo.Where(s => lstStockOrderSn.Contains(s.subPurchaseOrderSn)).ToList(); if (lstStock.Count == 0) { BaseMsgForm.ShowInfo("请选择要取消的待创建备货单!"); return; } string searchText = txtStockid.Text.Trim(); //ucGroupBoxEx2.Enabled = false; ucGroupBoxEx3.Enabled = false; ucGroupBoxEx4.Enabled = false; cancellationTokenSource = new CancellationTokenSource(); Task.Run(() => { int i = 0; foreach (var stock in lstStock) { this.Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "正在取消待创建..."; this.statusBar.pgbTaskProgress.Maximum = lstStock.Count; this.statusBar.UpdateProgressBar(i + 1); i++; })); if (cancellationTokenSource.IsCancellationRequested) break; var rows = this.dgvStock.Rows.Cast().Where(r => r.Cells["colStockId"].Value.ToString() == stock.subPurchaseOrderSn); if (stock.isCancel) { Invoke(new Action(() => { foreach (var row in rows) { row.Cells["colMsg"].Value = "待创建备货单已取消"; } })); continue; } var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == stock.supplierId.ToString()); if (shop == null || shop.LoginStatus != "登录成功") { Invoke(new Action(() => { foreach (var row in rows) { row.Cells["colMsg"].Value = "店铺掉线或不存在"; } })); continue; } Invoke(new Action(() => { foreach (var row in rows) { row.Cells["colMsg"].Value = "正在取消"; } })); Thread.Sleep(200 + Randomx.GetId(100)); //string jsonStr = "{\"success\":true,\"errorCode\":1000000,\"errorMsg\":null,\"result\":{\"isSuccess\":true,\"errorInfoList\":[],\"successInfoList\":[]}}"; string jsonStr = CancelSubPurchaseOrder(shop, stock.subPurchaseOrderSn); bool isError = !jsonStr.Contains("\"success\":true"); string sErrMsg = BaseRegex.GetStringJson(ref jsonStr, "errorMsg"); if (!isError) { try { var jObj = JObject.Parse(jsonStr); var jItem = jObj["result"]; var subJsonstr = jItem == null ? "" : JsonHelper.SerializeObject(jItem); isError = !subJsonstr.Contains("\"isSuccess\":true"); sErrMsg = BaseRegex.GetStringJson(ref subJsonstr, "errorMsg"); } catch (Exception ex) { } } Invoke(new Action(() => { if (!isError) { stock.isCancel = true; foreach (var row in rows) { row.Cells["colMsg"].Value = "已取消待创建"; } } else { foreach (var row in rows) { row.Cells["colMsg"].Value = "取消待创建失败:" + sErrMsg; } } })); } Invoke(new Action(() => { //ucGroupBoxEx2.Enabled = true; ucGroupBoxEx3.Enabled = true; ucGroupBoxEx4.Enabled = true; string sRst = "操作结束(取消待创建)!"; if (cancellationTokenSource.IsCancellationRequested) sRst = "已取消操作(取消待创建)!"; BaseMsgForm.ShowInfo(sRst); this.statusBar.lblTaskStatus.Text = sRst; })); }, cancellationTokenSource.Token); } private void btnListWarehouse_Click(object sender, EventArgs e) { var lstShopId = dgvShop.Rows.Cast().Where(row => row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); if (lstShopId.Count == 0) { BaseMsgForm.ShowInfo("请选择店铺!"); return; } lstSubOrderInfo.Clear(); dgvStock.Rows.Clear(); int scale1 = this.txtScale1.Text.ParseToInt(); int scale2 = this.txtScale2.Text.ParseToInt(); var dgvRows = this.dgvShop.Rows.Cast();//.Where(r => lstShopId.Contains(r.Cells["colShopId"].Value.ParseToString())); foreach (var row in dgvRows) { row.Cells["colMessage"].Value = ""; } var columns = this.dgvStock.Columns.Cast(); foreach (var col in columns) { if (col.Name == "colParentStockId" || col.Name == "colStockId") { col.Visible = false; } if (col.Name == "colTodaySaleVolume" || col.Name == "colLastSevenDaysSaleVolume" || col.Name == "colInCartNumber7d" || col.Name == "colSalesInventoryNum" || col.Name == "colWaitReceiveNum" || col.Name == "colNeedStockUp" || col.Name == "colQualityScore") { col.Visible = true; } } string searchText = txtStockid.Text.Trim(); //ucGroupBoxEx2.Enabled = false; ucGroupBoxEx3.Enabled = false; ucGroupBoxEx4.Enabled = false; cancellationTokenSource = new CancellationTokenSource(); Task.Run(() => { var lstShopIdTemp = new List(); lstShopIdTemp.AddRange(lstShopId); int i = 0; foreach (var shopId in lstShopIdTemp) { this.Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "正在查询..."; this.statusBar.pgbTaskProgress.Maximum = lstShopIdTemp.Count; this.statusBar.UpdateProgressBar(i + 1); i++; })); if (cancellationTokenSource.IsCancellationRequested) break; var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == shopId); if (shop == null) continue; #region 检测登录 if (shop.LoginStatus != "登录成功") { continue; } if (ShopListForm.Instance == null) ShopListForm.Instance = new ShopListForm(); ShopListForm.Instance.CheckShopLogin(new string[] { shop.LoginName }, false); if (shop.LoginStatus != "登录成功") { Invoke(new Action(() => { var rows = this.dgvShop.Rows.Cast().Where(r => r.Cells["colShopLoginName"].Value.ToString() == shop.LoginName); foreach (var row in rows) { row.Cells["colMessage"].Value = "店铺掉线"; row.Cells["colLoginStatus"].Value = "未登录"; row.Cells["colCanUse"].Value = false; } })); continue; } #endregion Invoke(new Action(() => { var rows = this.dgvShop.Rows.Cast().Where(r => r.Cells["colShopId"].Value.ToString() == shop.ShopId); foreach (var row in rows) { row.Cells["colMessage"].Value = "正在查询"; } })); int page = 1; int totalPage = 1; bool isError = false; while (page <= totalPage) { Thread.Sleep(100 + Randomx.GetId(200)); string jsonStr = GetWarehouseList(shop, page); if (jsonStr.Contains("指定的值含有无效的控制字符")) { BaseMsgForm.ShowError("店铺" + shop.LoginName + " " + shop.ShopId + "已掉线"); isError = true; break; } if (!jsonStr.Contains("\"success\":true")) jsonStr = GetWarehouseList(shop, page); if (!jsonStr.Contains("\"success\":true")) { isError = true; } if (jsonStr.Contains("\"success\":true")) { var jArr = new JArray(); try { var jObj = JObject.Parse(jsonStr); jArr = jObj["result"]["subOrderList"] as JArray; if (jArr == null) jArr = new JArray(); } catch (Exception ex) { BaseMsgForm.ShowError(ex.Message); } List subOrderInfoLstTmp = new List(); foreach (var item in jArr) { string sItem = item.ToString(); WarehouseProductSubOrderInfo sInfo = JsonHelper.DeserializeJsonToObject(sItem); // 反序列化得到类 if (sInfo != null) { foreach(var sku in sInfo.skuQuantityDetailList) { // 近7日加购>今日销量使用系数2,否则使用系数1 // 拟申请备货数量=今日销量×系数-仓内可用库存-已发货库存 // 实际备货数量=平台实际允许数量和拟申请备货数量取小(申请备货时计算) int scale = scale1; if (rbTodaySaleCount.Checked) { if (sku.inCartNumber7d.ParseToInt() > sku.todaySaleVolume.ParseToInt()) { scale = scale2; } } else { if (sku.inCartNumber7d.ParseToInt() > sku.lastSevenDaysSaleVolume.ParseToInt() / 7.0m) { scale = scale2; } } if (rbTodaySaleCount.Checked) { sku.wantStockUpBound = sku.todaySaleVolume.ParseToInt() * scale - sku.inventoryNumInfo.warehouseInventoryNum.ParseToInt() - sku.inventoryNumInfo.waitReceiveNum.ParseToInt(); } else { sku.wantStockUpBound = (sku.lastSevenDaysSaleVolume.ParseToInt() / 7.0 * scale - sku.inventoryNumInfo.warehouseInventoryNum.ParseToInt() - sku.inventoryNumInfo.waitReceiveNum.ParseToInt()).ParseToInt(); } Invoke(new Action(() => { if (sku.wantStockUpBound > 0 && sku.wantStockUpBound < this.txtMinBound.Text.ParseToInt()) sku.wantStockUpBound = this.txtMinBound.Text.ParseToInt(); })); sku.wantStockUpBound = Math.Max(sku.wantStockUpBound, 0); } if (sInfo.skuQuantityDetailList.Any(s => s.wantStockUpBound > 0)) sInfo.needStockUp = true; else sInfo.needStockUp = false; subOrderInfoLstTmp.Add(sInfo); } } //获取品质信息------------------------------------------------------------------------ List qualityInfoLst = new List(); string productIds = string.Join(",", subOrderInfoLstTmp.Select(o=>o.productId)); string qualityErr = ""; try { for (int j = 1; j <= 4; j++) { var qualityRst1 = this.GetQualityInfo2(shop, productIds, j); if (qualityRst1.Contains("\"success\":true")) { var jObj = JObject.Parse(qualityRst1); string jStr = JsonHelper.SerializeObject(jObj["result"]["pageItems"]); qualityInfoLst.AddRange(JsonHelper.DeserializeJsonToList(jStr)); } else { qualityErr = BaseRegex.GetStringJson(ref qualityRst1, "errorMsg"); if (string.IsNullOrWhiteSpace(qualityErr)) qualityErr += BaseRegex.GetStringJson(ref qualityRst1, "error_msg"); } Thread.Sleep(Randomx.GetId(100, 200)); } } catch (Exception ex) { qualityErr += "\r\n" + ex.Message; }; if (qualityErr != "") { //BaseMsgForm.ShowError("获取商品品质信息失败!" + qualityErr); foreach(var order in subOrderInfoLstTmp) { order.goodsAfsScore = -1; order.qltyAfsOrdCnt = -1; order.qltyAfsOrdrRate = -1; } } foreach (var qualityInfo in qualityInfoLst) { var order = subOrderInfoLstTmp.FirstOrDefault(o => o.productId == qualityInfo.productId); if (order != null) { order.goodsAfsScore = qualityInfo.goodsAfsScore; order.qltyAfsOrdCnt = qualityInfo.qltyAfsOrdCnt; order.qltyAfsOrdrRate = qualityInfo.qltyAfsOrdrRate; } } //--------------------------------------------------------------------------------------- lstSubOrderInfo.AddRange(subOrderInfoLstTmp); foreach (var sInfo in subOrderInfoLstTmp) { Invoke(new Action(() => { var rowId = this.dgvStock.Rows.Add( "", true, sInfo.supplierId, sInfo.supplierName, "",//sInfo.subPurchaseOrderSn, "",//sInfo.originalPurchaseOrderSn, sInfo.productSkcPicture.Replace("https", "http"), defaultBitmap,//image, sInfo.productId, sInfo.productSkcId, sInfo.productName, "", "", "", sInfo.skuQuantityTotalInfo.inCartNumber7d, sInfo.skuQuantityTotalInfo.todaySaleVolume, sInfo.skuQuantityTotalInfo.lastSevenDaysSaleVolume, sInfo.skuQuantityTotalInfo.inventoryNumInfo.warehouseInventoryNum, sInfo.skuQuantityTotalInfo.inventoryNumInfo.waitReceiveNum, sInfo.goodsAfsScore == null ? "-" : (Math.Round(sInfo.goodsAfsScore.Value * 10) / 10).ToString(), sInfo.qltyAfsOrdrRate == null ? "-" : (Math.Round(sInfo.qltyAfsOrdrRate.Value * 10000) / 100).ToString("0.00"), sInfo.qltyAfsOrdCnt == null ? "-" : sInfo.qltyAfsOrdCnt.Value.ToString(), sInfo.needStockUp == false ? "无需备货" : "可备货", sInfo.goodsAfsScore == -1 ? "获取商品品质信息失败" : "" ); //if (sInfo.goodsAfsScore == -1) // sInfo.goodsAfsScore = null; if (rowId >= 0) dgvStock.Rows[rowId].Height = 60; })); } Invoke(new Action(() => { ShowDgvImg(); })); int total = BaseRegex.GetStringJson(ref jsonStr, "total").ParseToInt(); totalPage = Math.Ceiling(total / 10.0).ParseToInt(); } page++; } Invoke(new Action(() => { var rows = this.dgvShop.Rows.Cast().Where(r => r.Cells["colShopId"].Value.ToString() == shop.ShopId); if (!isError) { foreach (var row in rows) { row.Cells["colMessage"].Value = "已查询"; } } else { foreach (var row in rows) { row.Cells["colMessage"].Value = "查询失败"; } } })); } Invoke(new Action(() => { //ucGroupBoxEx2.Enabled = true; ucGroupBoxEx3.Enabled = true; ucGroupBoxEx4.Enabled = true; string sRst = "查询结束!"; if (cancellationTokenSource.IsCancellationRequested) sRst = "已取消查询!"; BaseMsgForm.ShowInfo(sRst); this.statusBar.lblTaskStatus.Text = sRst; })); }, cancellationTokenSource.Token); } private void btnStartStockUp_Click(object sender, EventArgs e) { var lstSkc = dgvStock.Rows.Cast().Where(row => row.Cells["colCheck"]?.Value.ParseToBool() == true).Select(r => r.Cells["colProdSkc"]?.Value.ToString()).ToList(); var lstStockUp = lstSubOrderInfo.Where(s => lstSkc.Contains(s.productSkcId.ParseToString())).ToList(); if (lstStockUp.Count == 0) { BaseMsgForm.ShowInfo("请选择要创建备货单的商品!"); return; } //ucGroupBoxEx2.Enabled = false; ucGroupBoxEx3.Enabled = false; ucGroupBoxEx4.Enabled = false; cancellationTokenSource = new CancellationTokenSource(); var minQualityScore = this.txtMinQualityScore.Text.ParseToDecimal(); if (!chkMinQualityScore.Checked) // 没选最低品质分,即不考虑品质分上货。 minQualityScore = -100; var maxQualityRate = this.txtMaxQualityRate.Text.ParseToDecimal(); if (!chkMaxQualityRate.Checked) // 没选最高品质售后率,即不考虑品质售后率上货。 maxQualityRate = 100; Task.Run(() => { int i = 0; foreach (var stockUp in lstStockUp) { this.Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "正在创建备货单..."; this.statusBar.pgbTaskProgress.Maximum = lstStockUp.Count; this.statusBar.UpdateProgressBar(i + 1); i++; })); if (cancellationTokenSource.IsCancellationRequested) break; var rows = this.dgvStock.Rows.Cast().Where(r => r.Cells["colProdSkc"].Value.ToString() == stockUp.productSkcId.ParseToString()); if (stockUp.needStockUp != true) { Invoke(new Action(() => { foreach (var row in rows) { row.Cells["colMsg"].Value = "无需创建备货单"; } })); continue; } if (stockUp.goodsAfsScore != null && stockUp.goodsAfsScore < minQualityScore) { Invoke(new Action(() => { foreach (var row in rows) { row.Cells["colMsg"].Value = "商品品质得分过低,请去网页手动备货"; } })); continue; } if (stockUp.qltyAfsOrdrRate != null && stockUp.qltyAfsOrdrRate * 100 > maxQualityRate) { Invoke(new Action(() => { foreach (var row in rows) { row.Cells["colMsg"].Value = "商品品质售后率过高,请去网页手动备货"; } })); continue; } var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == stockUp.supplierId.ToString()); if (shop == null || shop.LoginStatus != "登录成功") { Invoke(new Action(() => { foreach (var row in rows) { row.Cells["colMsg"].Value = "店铺掉线或不存在"; } })); continue; } Invoke(new Action(() => { foreach (var row in rows) { row.Cells["colMsg"].Value = "正在创建"; } })); Thread.Sleep(200 + Randomx.GetId(100)); string jsonStr = this.QueryStockBaseInfo(shop, stockUp); bool isError = !jsonStr.Contains("\"success\":true"); string sErrMsg1 = BaseRegex.GetStringJson(ref jsonStr, "errorMsg").ParseToString(); if (!isError) { Thread.Sleep(Randomx.GetId(200, 400)); var jStr = ""; try { var jObj = JObject.Parse(jsonStr); var jItem = jObj["result"]; jStr = jObj["result"].ParseToString(); } catch (Exception ex) { BaseMsgForm.ShowError(ex.Message); } stockBaseInfo sBaseInfo = JsonHelper.DeserializeJsonToObject(jStr); foreach(var sku in stockUp.skuQuantityDetailList) { if (sku.wantStockUpBound == 0) continue; var sBaseSku = sBaseInfo.purchaseConfigDetailList.FirstOrDefault(s => s.productSkuId == sku.productSkuId); if (sBaseSku == null) sku.wantStockUpBound = 0; if (sku.wantStockUpBound > sBaseSku.applyUpperBound.ParseToInt()) { sku.wantStockUpBound = sBaseSku.applyUpperBound.ParseToInt(); //如果强制要求最小数量,且平台可备数量小于最小数量,直接不允许备货 Invoke(new Action(() => { if (sku.wantStockUpBound < this.txtMinBound.Text.ParseToInt() && this.chkIfLessMakeZero.Checked) sku.wantStockUpBound = -1; })); } } if (!stockUp.skuQuantityDetailList.Any(s => s.wantStockUpBound > 0)) { //如果已备过货但是还未发出,做一个判断 isError = true; stockUp.needStockUp = false; sErrMsg1 += "已达平台备货量上限!已申请过备货"; } else { jsonStr = this.CreateStockOrder(shop, stockUp); isError = !jsonStr.Contains("\"success\":true"); string sErrMsg2 = BaseRegex.GetStringJson(ref jsonStr, "errorMsg").ParseToString(); try { var jObj2 = JObject.Parse(jsonStr); if (jObj2["result"] != null && jObj2["result"]["failDetailList"] != null) { string failDetailList = (jObj2["result"]["failDetailList"])?.ParseToString(); if (failDetailList.Length > 5) { isError = true; sErrMsg2 += failDetailList; } } } catch { } sErrMsg1 += sErrMsg2; } } Invoke(new Action(() => { if (!isError) { stockUp.isStockUp = true; foreach (var row in rows) { row.Cells["colMsg"].Value = "已创建备货单"; } } else { foreach (var row in rows) { row.Cells["colMsg"].Value = "创建备货单失败:" + sErrMsg1; } } })); } Invoke(new Action(() => { //ucGroupBoxEx2.Enabled = true; ucGroupBoxEx3.Enabled = true; ucGroupBoxEx4.Enabled = true; string sRst = "操作结束(创建备货单)!"; if (cancellationTokenSource.IsCancellationRequested) sRst = "已取消操作(创建备货单)!"; BaseMsgForm.ShowInfo(sRst); this.statusBar.lblTaskStatus.Text = sRst; })); }, cancellationTokenSource.Token); } private void txtMinBound_TextChanged(object sender, EventArgs e) { this.lblMinBound.Text = "备货量小于" + txtMinBound.Text.ParseToInt() + "按"; //this.chkIfLessMakeZero.Text = "平台允许备货数量小于" + txtMinBound.Text.ParseToInt() + "不备货"; } private void chkNewService_CheckedChanged(object sender, EventArgs e) { this.isNewService = ucCheckBox1.Checked; } Bitmap defaultBitmap = new Bitmap(80, 80); void ShowDgvImg() { Task.Run(() => { foreach (DataGridViewRow row in this.dgvStock.Rows) { if (row.Index > 0 && row.Cells["colProductSkcPic"].Displayed == false) { try { Invoke(new Action(() => { row.Cells["colProductSkcPic"].Value = defaultBitmap; })); } catch { } continue; } if (row.Cells["colProductSkcPic"].Value != null && row.Cells["colProductSkcPic"].Value != defaultBitmap) continue; Image image = null; string imgUrl = row.Cells["colImgUrl"]?.Value.ParseToString(); string getImgError = ""; if (!string.IsNullOrWhiteSpace(imgUrl)) image = GetHtml.GetUrlImg(imgUrl, out getImgError); if (!string.IsNullOrEmpty(getImgError)) //BaseMsgForm.ShowError("图片加载失败 " + getImgError); image = TemuKJD.Properties.Resources.errpic; try { Invoke(new Action(() => { row.Cells["colProductSkcPic"].Value = image; })); } catch { } } }); } private void dgvStock_Scroll(object sender, ScrollEventArgs e) { ShowDgvImg(); } private void rbTodaySaleCount_CheckedChanged(object sender, EventArgs e) { if(rbTodaySaleCount.Checked) { label101.Text = "备货数量:近7日加购小于今日销量,今日销量 ×"; label102.Text = "近7日加购大于今日销量,今日销量 ×"; } else { label101.Text = "备货数量:近7日加购小于7日平均销量,7日平均 ×"; label102.Text = "近7日加购大于7日平均销量,7日平均 ×"; } } private void btnEmpty_Click(object sender, EventArgs e) { txtNotes.Text = txtShopId.Text = txtShopName.Text = ""; FiltShop(); } } }