using Aspose.Pdf.Operators; using NetLibrary; using NetLibrary.Data; using NetLibrary.Log; using NetLibrary.ReportPrint; using Newtonsoft.Json; using NPOI.HSSF.Model; using NPOI.HSSF.Record.Formula.Functions; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Drawing.Printing; using System.IO; using System.Linq; using System.Web; using System.Web.Script.Serialization; using System.Web.Script.Services; using System.Web.Services; using System.Web.UI.WebControls; using TradeManage; using TradeManageNew.OrderPost; using TradeModel; using ZXing.Common; using ZXing; using ZXing.QrCode.Internal; using static System.Runtime.CompilerServices.RuntimeHelpers; using System.Drawing.Imaging; using System.Net.Http.Headers; using System.Net.Http; using System.Net; using System.Web.UI; using TradeManageNew.RateWebReference; using System.Web.UI.WebControls.Expressions; using System.Text; using Org.BouncyCastle.Math.EC; using System.Diagnostics; namespace TradeManageNew { /// /// PostGoodServiceNew 的摘要说明 /// [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 [System.Web.Script.Services.ScriptService] public class PostGoodServiceNew : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } #region 获取仓库订单发货信息表数量 [WebMethod(EnableSession = true)] public JsonModel> GetOrderPostInfoList(string searchCode, int searchType,string wareHouse, int postState,int printState,DateTime? sDate,DateTime? eDate, int PageSize, int PageIndex) { PagesNew.Login(base.Session); var rmodel = new JsonModel>(); int rowCount = 0; rmodel.DataSource = DataNew.GetOrderPostInfoDatas(searchCode, searchType, wareHouse, postState, printState, sDate, eDate, PageSize, PageIndex, out rowCount); rmodel.RowCount = rowCount; return rmodel; } [WebMethod(EnableSession = true)] public APIReturnModel SaveOrderPostInfo(OrderPostInfo md) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { DataNew.SaveOrderPostInfo(md); rmodel.Code = 1; rmodel.Message = "Success"; } catch(Exception ex) { rmodel.Code = 0; rmodel.Message = "Fail:" + ex.Message; } return rmodel; } [WebMethod(EnableSession = true)] public APIReturnModel DeleteOrderPostInfo(int id) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { DataNew.DeleteOrderPostInfo(id); rmodel.Code = 1; rmodel.Message = "Success"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Fail:" + ex.Message; } return rmodel; } [WebMethod(EnableSession = true)] public APIReturnModel DeleteOrderPostInfoForIDs(string ids) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { ids = ids.TrimEnd(','); DataNew.DeleteOrderPostInfoForIDs(ids); rmodel.Code = 1; rmodel.Message = "Success"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Fail:" + ex.Message; } return rmodel; } /// /// 导入发货订单 /// /// /// /// /// [WebMethod(EnableSession = true)] public string ImportShipOrderDatas(string fileName,string wareHouse,DateTime ipDate) { PagesNew.Login(base.Session); try { if (string.IsNullOrEmpty(fileName)) return "要导入的文件路径不能为空"; string ServerFileName = AppDomain.CurrentDomain.BaseDirectory + fileName; if (!System.IO.File.Exists(ServerFileName)) return "要导入的文件路径不存在"; MicrosoftExcel excel = new MicrosoftExcel(); DataTable tb = excel.ImportExcel(ServerFileName); var orders = new List(); for (int i = 0; i < tb.Rows.Count; i++) { if (string.IsNullOrEmpty(tb.Rows[i][0].ToString())) { return "第" + (i + 1).ToString() + "行的OrderCode为空"; } if (string.IsNullOrEmpty(tb.Rows[i][1].ToString())) { return "第" + (i + 1).ToString() + "行的SKU为空"; } if (string.IsNullOrEmpty(tb.Rows[i][3].ToString())) { return "第" + (i + 1).ToString() + "行的Qty为空"; } if (string.IsNullOrEmpty(tb.Rows[i][4].ToString())) { return "第" + (i + 1).ToString() + "行的Location为空"; } if (string.IsNullOrEmpty(tb.Rows[i][5].ToString())) { return "第" + (i + 1).ToString() + "行的TrackCode为空"; } var md = new OrderPostInfo() { ID = 0, WareHouse = wareHouse, PostDate = ipDate.Date, OrderCode = tb.Rows[i][0].ToString().Trim(), SKU = tb.Rows[i][1].ToString().Trim(), NewSKU = tb.Rows[i][2].ToString().Trim(), Qty = Convert.ToInt32(tb.Rows[i][3].ToString()), LocationCode = tb.Rows[i][4].ToString().Trim(), TrackCode = tb.Rows[i][5].ToString().Trim(), PostQty = 0, PostState = 0, PrintState = 0, Remark = tb.Rows[i][6].ToString(), }; orders.Add(md); } if(orders!=null && orders.Count > 0) { foreach(var order in orders) { DataNew.SaveOrderPostInfo(order); } } } catch (Exception ex) { return "Error:" + ex.Message; } return "Success"; } /// /// 选择发货订单生成拣货单 /// /// /// [WebMethod(EnableSession = true)] public APIReturnModel MakePickGoodListForIds(string ids,string wareHouse) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { //当前操作用户权限限定,只能美国仓库员工导出自己仓库的数据 var userId = Convert.ToInt32(Session["UserId"]); //var userInfo = DataNew.GetUserInfoByUserId(userId); //if (userInfo == null) //{ // rmodel.Code = 0; // rmodel.Message = "User Data Error"; // return rmodel; //} //else //{ // if (userInfo.DeptId != 30 || userInfo.State != 1 || string.IsNullOrEmpty(userInfo.WorkDesc)) // { // rmodel.Code = 0; // rmodel.Message = "no permission"; // return rmodel; // } // var _warehouse = userInfo.WorkDesc == "东仓" ? "E" : "W"; // if (_warehouse != wareHouse) // { // rmodel.Code = 0; // rmodel.Message = "Unable to export data from other warehouses"; // return rmodel; // } //} var ops = DataNew.GetOrderPostInfoListByIds(ids.TrimEnd(','), wareHouse); if (ops == null) { rmodel.Code = 0; rmodel.Message = "Not Find Datas"; return rmodel; } var singleOPs = new List();//单个订单只用一种商品 var moreOPs = new List();//单个订单有多种商品,需要单独放到最后,一起拣货 foreach (var op in ops) { var _op = ops.Where(r => r.OrderCode == op.OrderCode && r.ID != op.ID).FirstOrDefault(); if (_op == null) { singleOPs.Add(op); } else { moreOPs.Add(op); } } var exportPickGoods = new List(); //获取仓库所有的拣货类型以及拣货人员 var pickUsers = DataNew.GetStorePostionPickers(wareHouse); if (singleOPs != null) { var singlePickGoods = singleOPs.GroupBy(r => new { r.SKU, r.NewSKU, r.LocationCode }).Select(g => new ShipOrderPickGoods { NewSKU = g.Key.NewSKU, SKU = g.Key.SKU, LocationCode = g.Key.LocationCode, Qty = g.Sum(r => r.Qty) }).OrderBy(n => n.LocationCode).ToList(); if (wareHouse == "W")//西部仓库 { //西部拣货规则类型:1:1-16 row(A layer)(1-16排A层);2:1-16 row(B,C,D layer)(1-16排B层);3:After row 16(16排之后);4:Multiple Goods(多件货);5:Others(其它) //排 var pai = new List() { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16" }; //层 var ceng = new List() { "B", "C", "D" }; foreach (var spg in singlePickGoods) { if (spg.LocationCode == "TestLocation") //每天测试专用库位,分配给指定人员,只在西部仓库测试 { spg.PickUserId = 238; continue; } int num = 0; int pickType = 0;//拣货类型 if (string.IsNullOrEmpty(spg.LocationCode)) { //spg.PickUserId = 103;//Eddie pickType = 5; } else if (spg.LocationCode.ToUpper().StartsWith("000A")) { //000开头A层 Jose pickType = 1; } else if (spg.LocationCode.ToUpper().StartsWith("000B") || spg.LocationCode.ToUpper().StartsWith("000C") || spg.LocationCode.ToUpper().StartsWith("000D")) { //000开头B/C/D层 Silvestre pickType = 2; } else if (pai.Contains(spg.LocationCode.Substring(0, 2)) && spg.LocationCode.Substring(2, 1) == "A") { //1-16排,并且是A层(第一层) //spg.PickUserId = 164;//Jose pickType = 1; } else if (pai.Contains(spg.LocationCode.Substring(0, 2)) && ceng.Contains(spg.LocationCode.Substring(2, 1))) { //1-16排,并且是BCD层(2,3,4层) //spg.PickUserId = 165;//Silvestre pickType = 2; } else if (int.TryParse(spg.LocationCode.Substring(0, 2), out num) && num > 16) { //17排以及之后表示地面,由Ricardo负责 //spg.PickUserId = 166;//由Ricardo pickType = 3; } else { //spg.PickUserId = 103;//Eddie pickType = 5; } var _pickUser = pickUsers.Where(r => r.PickType == pickType).FirstOrDefault(); if (_pickUser != null) { spg.PickUserId = _pickUser.PickUserId; } else { rmodel.Code = 0; rmodel.Message = "Not Find Pick Type Datas"; return rmodel; } } } else //东部仓库 { //东部拣货规则类型:11:1-10 row(1-10排);12:After row 10(10排之后);13:Multiple Goods(多件货);14:Others(其它) foreach (var spg in singlePickGoods) { int pickType = 0;//拣货类型 int num = 0; if (spg.LocationCode.StartsWith("E-") && spg.LocationCode.Length == 7 && int.TryParse(spg.LocationCode.Substring(2, 2), out num) && num <= 10) { //1-10排 pickType = 11; } else if (spg.LocationCode.StartsWith("E-") && spg.LocationCode.Length == 7 && int.TryParse(spg.LocationCode.Substring(2, 2), out num) && num > 10) { //10排之后 pickType = 12; } else { //其它 pickType = 14; } var _pickUser = pickUsers.Where(r => r.PickType == pickType).FirstOrDefault(); if (_pickUser != null) { spg.PickUserId = _pickUser.PickUserId; } else { rmodel.Code = 0; rmodel.Message = "Not Find Pick Type Datas"; return rmodel; } } } exportPickGoods.AddRange(singlePickGoods); } if (moreOPs != null) { if (wareHouse == "W") //同一个订单多种商品的西部统一分配给一个人拣货 { var _pickUser = pickUsers.Where(r => r.PickType == 4).FirstOrDefault();//找到多件货的拣货人员 if (_pickUser == null) { rmodel.Code = 0; rmodel.Message = "Not Find Pick Type Datas"; return rmodel; } var morePickGoods = moreOPs.GroupBy(r => new { r.SKU, r.NewSKU, r.LocationCode }).Select(g => new ShipOrderPickGoods { NewSKU = g.Key.NewSKU, SKU = g.Key.SKU, LocationCode = g.Key.LocationCode, Qty = g.Sum(r => r.Qty), PickUserId = _pickUser.PickUserId }).OrderBy(n => n.LocationCode); exportPickGoods.AddRange(morePickGoods); } else //东部分配给 { var _pickUser = pickUsers.Where(r => r.PickType == 13).FirstOrDefault();//找到多件货的拣货人员 if (_pickUser == null) { rmodel.Code = 0; rmodel.Message = "Not Find Pick Type Datas"; return rmodel; } var morePickGoods = moreOPs.GroupBy(r => new { r.SKU, r.NewSKU, r.LocationCode }).Select(g => new ShipOrderPickGoods { NewSKU = g.Key.NewSKU, SKU = g.Key.SKU, LocationCode = g.Key.LocationCode, Qty = g.Sum(r => r.Qty), PickUserId = _pickUser.PickUserId }).OrderBy(n => n.LocationCode); exportPickGoods.AddRange(morePickGoods); } } //左连匹配用户名 var users = DataNew.GetListUserSelect(); var exportPickGoodsNew = from a in exportPickGoods join b in users on a.PickUserId equals b.UserId into Temp from c in Temp.DefaultIfEmpty() orderby a.PickUserId select new ShipOrderPickGoods { SKU = a.SKU, NewSKU = a.NewSKU, Qty = a.Qty, LocationCode = a.LocationCode, PickUserId = a.PickUserId, PickUserName = Temp.Select(r => r.Name).FirstOrDefault() }; if (exportPickGoodsNew != null) { DataTable tb = new DataTable(); tb.Columns.Add("NEWSKU", Type.GetType("System.String")); tb.Columns.Add("SKU", Type.GetType("System.String")); tb.Columns.Add("QTY", Type.GetType("System.Int32")); tb.Columns.Add("LOCATION", Type.GetType("System.String")); tb.Columns.Add("UserName", Type.GetType("System.String")); //拣货日期 var usaTime = DateTime.Now; foreach (var ep in exportPickGoodsNew) { var packGoodCode1 = ""; var packGoodCode2 = ""; var packCode = DataNew.GetGoodsPackCodeBySKU(ep.SKU); if (packCode != null) { //if (!string.IsNullOrEmpty(packCode.GoodsCode) && !string.IsNullOrEmpty(packCode.TypeCode)) //{ // if (packCode.GoodsCode.Contains("-")) // { // var goodCodes = packCode.GoodsCode.Split('-'); // packGoodCode1 = (goodCodes[0].Length >= 6 ? goodCodes[0] : goodCodes[1]) + (packCode.TypeCode.StartsWith("000") ? packCode.TypeCode.Substring(packCode.TypeCode.Length - 3, 3) : packCode.TypeCode) + (packCode.BoxRate.HasValue ? packCode.BoxRate.Value.ToString("000") : "001"); // } // else // { // packGoodCode1 = packCode.GoodsCode + (packCode.TypeCode.StartsWith("000") ? packCode.TypeCode.Substring(packCode.TypeCode.Length - 3, 3) : packCode.TypeCode) + (packCode.BoxRate.HasValue ? packCode.BoxRate.Value.ToString("000") : "001"); // } //} //if (!string.IsNullOrEmpty(packCode.GoodsOldCode) && !string.IsNullOrEmpty(packCode.TypeCode)) //{ // if (packCode.GoodsOldCode.Contains("-")) // { // var goodCodes = packCode.GoodsOldCode.Split('-'); // packGoodCode2 = (goodCodes[0].Length >= 6 ? goodCodes[0] : goodCodes[1]) + (packCode.TypeCode.StartsWith("000") ? packCode.TypeCode.Substring(packCode.TypeCode.Length - 3, 3) : packCode.TypeCode) + (packCode.BoxRate.HasValue ? packCode.BoxRate.Value.ToString("000") : "001"); // } // else // { // packGoodCode2 = packCode.GoodsOldCode + (packCode.TypeCode.StartsWith("000") ? packCode.TypeCode.Substring(packCode.TypeCode.Length - 3, 3) : packCode.TypeCode) + (packCode.BoxRate.HasValue ? packCode.BoxRate.Value.ToString("000") : "001"); // } //} packGoodCode1 = packCode.Barcode; } DataRow row = tb.NewRow(); row["NEWSKU"] = ep.NewSKU; row["SKU"] = ep.SKU; row["QTY"] = ep.Qty; row["LOCATION"] = ep.LocationCode; row["UserName"] = ep.PickUserName; tb.Rows.Add(row); //保存拣货单数据 var pickGd = new PickGoodsInfo() { InDate = usaTime.Date, WareHouse = wareHouse, NewSKU = ep.NewSKU, SKU = ep.SKU, PickQty = ep.Qty, ScanQty = 0, LocationCode = ep.LocationCode, PickUserId = ep.PickUserId, PackGoodCode = packGoodCode1, PackGoodCode2 = packGoodCode2, }; DataNew.SavePickGoodsInfoData(pickGd); } TableColumnCollection listColumns = new TableColumnCollection(); listColumns.Add("NEWSKU", "NEW SKU", DbType.String, ""); listColumns.Add("SKU", "SKU", DbType.String, ""); listColumns.Add("QTY", "QTY", DbType.Int32, ""); listColumns.Add("LOCATION", "LOCATION", DbType.String, ""); listColumns.Add("UserName", "UserName", DbType.String, ""); MicrosoftExcel obj2 = new MicrosoftExcel(); var filePath = obj2.Export(tb, listColumns); var trayMaxVolume = DataNew.GetTrayMaxVolumeDatas(wareHouse); var trayVolume = trayMaxVolume == null ? 0.6m : trayMaxVolume.MaxVolume;//无数据默认0.6m³ var pickUserIds = exportPickGoodsNew.Select(r => r.PickUserId.Value).Distinct(); foreach (var pickUserId in pickUserIds) { //获取每个人拣货的总立方 var solid = DataNew.GetUserPickGoodsTotalSolid(usaTime, pickUserId); if (solid <= 0) continue; //假设每个托盘的拣货立方是0.6m³,计算出每个人总共需要的托盘数,在计算出来的托盘数上,冗余一倍 var trayCount = (int)Math.Ceiling(solid / trayVolume) * 2;//计算的托盘数向上取整,再*2 //新增拣货用户的托盘码 for (int i = 0; i < trayCount; i++) { var mde = new TrayInfo() { InDate = usaTime, WareHouse = wareHouse, PrintState = 0, TrayUserId = pickUserId, }; DataNew.AddTrayInfo(mde); } } //订单生成拣货列表之后,将状态改为打印中状态 DataNew.UpdateOrderPostInfoToPrinting(string.Join(",", ops.Select(r => r.ID))); rmodel.Code = 1; rmodel.Message = filePath; return rmodel; } else { rmodel.Code = 0; rmodel.Message = "Not Find Datas"; return rmodel; } } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Error:" + ex.Message; return rmodel; } } /// /// 根据搜索条件查询数据生成拣货单(已弃用) /// /// /// /// /// /// /// /// /// 是否覆盖生成拣货单 /// [WebMethod(EnableSession = true)] public APIReturnModel MakePickGoodListForAllDatas(string searchCode, int searchType, string wareHouse, int postState, int printState, DateTime? sDate, DateTime? eDate,int isFG) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { //当前操作用户权限限定,只能美国仓库员工导出自己仓库的数据 var userId = Convert.ToInt32(Session["UserId"]); //var userInfo = DataNew.GetUserInfoByUserId(userId); //if (userInfo == null) //{ // rmodel.Code = 0; // rmodel.Message = "User Data Error"; // return rmodel; //} //else //{ // if (userInfo.DeptId != 30 || userInfo.State != 1 || string.IsNullOrEmpty(userInfo.WorkDesc)) // { // rmodel.Code = 0; // rmodel.Message = "no permission"; // return rmodel; // } // var _warehouse = userInfo.WorkDesc == "东仓" ? "E" : "W"; // if (_warehouse != wareHouse) // { // rmodel.Code = 0; // rmodel.Message = "Unable to export data from other warehouses"; // return rmodel; // } //} var ops = DataNew.GetOrderPostInfoDatasBySearch(searchCode, searchType, wareHouse, postState, printState, sDate, eDate); var singleOPs = new List();//单个订单只有一种商品,并且数量多个时,在同一拣货库位 var moreOPs = new List();//单个订单有多种商品,需要单独放到最后,一起拣货 if (ops == null) { rmodel.Code = 0; rmodel.Message = "Not Find Datas"; return rmodel; } #region 检查所有的发货订单的面单地址和SKU信息是否完整 var orderCodes =ops.Select(r=>r.OrderCode).Distinct().ToList(); foreach(var orderCode in orderCodes) { var tracks = DataNew.GetDT_TrackCodeApplyNewsByOrderCode(orderCode); if (tracks==null) { rmodel.Code = 0; rmodel.Message = "订单号:" + orderCode + "未找到发货面单信息,请检查"; return rmodel; } foreach(var track in tracks) { if (string.IsNullOrEmpty(track.LabelUrl) || !track.LabelUrl.Contains(track.TrackCode)) { rmodel.Code = 0; rmodel.Message = "订单号:" + orderCode + ",跟踪码:"+track.TrackCode+" 面单文件地址为空或者与跟踪码不一致,请重新上传此面单"; return rmodel; } else if (string.IsNullOrEmpty(track.SKU)) { rmodel.Code = 0; rmodel.Message = "订单号:" + orderCode + ",跟踪码:" + track.TrackCode + " 货物SKU信息为空,请检查"; return rmodel; } } } #endregion foreach (var op in ops) { var _op = ops.Where(r => r.OrderCode == op.OrderCode && r.ID != op.ID).FirstOrDefault(); if (_op == null) { singleOPs.Add(op); } else { moreOPs.Add(op); } } var exportPickGoods = new List(); //获取仓库所有的拣货类型以及拣货人员 var pickUsers = DataNew.GetStorePostionPickers(wareHouse); if (singleOPs != null) { var singlePickGoods = singleOPs.GroupBy(r => new { r.SKU, r.NewSKU, r.LocationCode }).Select(g => new ShipOrderPickGoods { NewSKU = g.Key.NewSKU, SKU = g.Key.SKU, LocationCode = g.Key.LocationCode, Qty = g.Sum(r => r.Qty) }).OrderBy(n => n.LocationCode).ToList(); if (wareHouse == "W")//西部仓库 { //西部拣货规则类型:1:1-16 row(A layer)(1-16排A层);2:1-16 row(B,C,D layer)(1-16排B层);3:After row 16(16排之后);4:Multiple Goods(多件货);5:Others(其它) //排 var pai = new List() { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16" }; //层 var ceng = new List() { "B", "C", "D" }; foreach (var spg in singlePickGoods) { if(spg.LocationCode == "TestLocation") //每天测试专用库位,分配给指定人员,只在西部仓库测试 { spg.PickUserId =238; continue; } int num = 0; int pickType = 0;//拣货类型 if (string.IsNullOrEmpty(spg.LocationCode)) { //spg.PickUserId = 103;//Eddie pickType = 5; } else if (spg.LocationCode.ToUpper().StartsWith("000A")) { //000开头A层 Jose pickType = 1; } else if(spg.LocationCode.ToUpper().StartsWith("000B") || spg.LocationCode.ToUpper().StartsWith("000C") || spg.LocationCode.ToUpper().StartsWith("000D")) { //000开头B/C/D层 Silvestre pickType = 2; } else if(pai.Contains(spg.LocationCode.Substring(0,2)) && spg.LocationCode.Substring(2, 1) == "A") { //1-16排,并且是A层(第一层) //spg.PickUserId = 164;//Jose pickType = 1; } else if(pai.Contains(spg.LocationCode.Substring(0, 2)) && ceng.Contains(spg.LocationCode.Substring(2, 1))) { //1-16排,并且是BCD层(2,3,4层) //spg.PickUserId = 165;//Silvestre pickType = 2; } else if(int.TryParse(spg.LocationCode.Substring(0, 2),out num) && num > 16) { //17排以及之后表示地面,由Ricardo负责 //spg.PickUserId = 166;//由Ricardo pickType = 3; } else { //spg.PickUserId = 103;//Eddie pickType = 5; } var _pickUser = pickUsers.Where(r => r.PickType == pickType).FirstOrDefault(); if (_pickUser != null) { spg.PickUserId = _pickUser.PickUserId; } else { rmodel.Code = 0; rmodel.Message = "Not Find Pick Type Datas"; return rmodel; } } } else //东部仓库 { //东部拣货规则类型:11:1-10 row(1-10排);12:After row 10(10排之后);13:Multiple Goods(多件货);14:Others(其它) foreach(var spg in singlePickGoods) { int pickType = 0;//拣货类型 int num = 0; if(spg.LocationCode.StartsWith("E-") && spg.LocationCode.Length==7 && int.TryParse(spg.LocationCode.Substring(2, 2), out num) && num <= 10) { //1-10排 pickType = 11; } else if(spg.LocationCode.StartsWith("E-") && spg.LocationCode.Length == 7 && int.TryParse(spg.LocationCode.Substring(2, 2), out num) && num > 10) { //10排之后 pickType = 12; } else { //其它 pickType = 14; } var _pickUser = pickUsers.Where(r => r.PickType == pickType).FirstOrDefault(); if (_pickUser != null) { spg.PickUserId = _pickUser.PickUserId; } else { rmodel.Code = 0; rmodel.Message = "Not Find Pick Type Datas"; return rmodel; } } } exportPickGoods.AddRange(singlePickGoods); } if (moreOPs != null) { if(wareHouse == "W") //同一个订单多种商品的西部统一分配给一个人拣货 { var _pickUser = pickUsers.Where(r => r.PickType == 4).FirstOrDefault();//找到多件货的拣货人员 if (_pickUser == null) { rmodel.Code = 0; rmodel.Message = "Not Find Pick Type Datas"; return rmodel; } var morePickGoods = moreOPs.GroupBy(r => new { r.SKU, r.NewSKU, r.LocationCode }).Select(g => new ShipOrderPickGoods { NewSKU = g.Key.NewSKU, SKU = g.Key.SKU, LocationCode = g.Key.LocationCode, Qty = g.Sum(r => r.Qty), PickUserId = _pickUser.PickUserId }).OrderBy(n => n.LocationCode); exportPickGoods.AddRange(morePickGoods); } else //东部分配给 { var _pickUser = pickUsers.Where(r => r.PickType == 13).FirstOrDefault();//找到多件货的拣货人员 if (_pickUser == null) { rmodel.Code = 0; rmodel.Message = "Not Find Pick Type Datas"; return rmodel; } var morePickGoods = moreOPs.GroupBy(r => new { r.SKU, r.NewSKU, r.LocationCode }).Select(g => new ShipOrderPickGoods { NewSKU = g.Key.NewSKU, SKU = g.Key.SKU, LocationCode = g.Key.LocationCode, Qty = g.Sum(r => r.Qty), PickUserId = _pickUser.PickUserId }).OrderBy(n => n.LocationCode); exportPickGoods.AddRange(morePickGoods); } } //左连匹配用户名 var users = DataNew.GetListUserSelect(); var exportPickGoodsNew = from a in exportPickGoods join b in users on a.PickUserId equals b.UserId into Temp from c in Temp.DefaultIfEmpty() orderby a.PickUserId select new ShipOrderPickGoods { SKU = a.SKU, NewSKU = a.NewSKU, Qty = a.Qty, LocationCode = a.LocationCode, PickUserId = a.PickUserId, PickUserName = Temp.Select(r => r.Name).FirstOrDefault() }; if (isFG == 1)//覆盖生成,删除仓库当天生成的所有拣货单 { DataNew.DeleteAllPickGoodsList(wareHouse); } if (exportPickGoodsNew != null) { DataTable tb = new DataTable(); tb.Columns.Add("NEWSKU", Type.GetType("System.String")); tb.Columns.Add("SKU", Type.GetType("System.String")); tb.Columns.Add("QTY", Type.GetType("System.Int32")); tb.Columns.Add("LOCATION", Type.GetType("System.String")); tb.Columns.Add("UserName", Type.GetType("System.String")); //拣货日期 var usaTime = DateTime.Now; foreach (var ep in exportPickGoodsNew) { var packGoodCode1 = ""; var packGoodCode2 = ""; var packCode=DataNew.GetGoodsPackCodeBySKU(ep.SKU); if (packCode != null) { //if (!string.IsNullOrEmpty(packCode.GoodsCode) && !string.IsNullOrEmpty(packCode.TypeCode)) //{ // if (packCode.GoodsCode.Contains("-")) // { // var goodCodes = packCode.GoodsCode.Split('-'); // packGoodCode1 = (goodCodes[0].Length >= 6 ? goodCodes[0] : goodCodes[1]) + (packCode.TypeCode.StartsWith("000") ? packCode.TypeCode.Substring(packCode.TypeCode.Length - 3, 3) : packCode.TypeCode) + (packCode.BoxRate.HasValue ? packCode.BoxRate.Value.ToString("000") : "001"); // } // else // { // packGoodCode1 = packCode.GoodsCode + (packCode.TypeCode.StartsWith("000") ? packCode.TypeCode.Substring(packCode.TypeCode.Length - 3, 3) : packCode.TypeCode) + (packCode.BoxRate.HasValue ? packCode.BoxRate.Value.ToString("000") : "001"); // } //} //if (!string.IsNullOrEmpty(packCode.GoodsOldCode) && !string.IsNullOrEmpty(packCode.TypeCode)) //{ // if (packCode.GoodsOldCode.Contains("-")) // { // var goodCodes = packCode.GoodsOldCode.Split('-'); // packGoodCode2 = (goodCodes[0].Length >= 6 ? goodCodes[0] : goodCodes[1]) + (packCode.TypeCode.StartsWith("000") ? packCode.TypeCode.Substring(packCode.TypeCode.Length - 3, 3) : packCode.TypeCode) + (packCode.BoxRate.HasValue ? packCode.BoxRate.Value.ToString("000") : "001"); // } // else // { // packGoodCode2 = packCode.GoodsOldCode + (packCode.TypeCode.StartsWith("000") ? packCode.TypeCode.Substring(packCode.TypeCode.Length - 3, 3) : packCode.TypeCode) + (packCode.BoxRate.HasValue ? packCode.BoxRate.Value.ToString("000") : "001"); // } //} packGoodCode1 = packCode.Barcode; } DataRow row = tb.NewRow(); row["NEWSKU"] = ep.NewSKU; row["SKU"] = ep.SKU; row["QTY"] = ep.Qty; row["LOCATION"] = ep.LocationCode; row["UserName"] = ep.PickUserName; tb.Rows.Add(row); //保存拣货单数据 var pickGd = new PickGoodsInfo() { InDate = usaTime.Date, WareHouse = wareHouse, NewSKU = ep.NewSKU, SKU = ep.SKU, PickQty = ep.Qty, ScanQty = 0, LocationCode = ep.LocationCode, PickUserId = ep.PickUserId, PackGoodCode=packGoodCode1, PackGoodCode2=packGoodCode2, }; DataNew.SavePickGoodsInfoData(pickGd); } TableColumnCollection listColumns = new TableColumnCollection(); listColumns.Add("NEWSKU", "NEW SKU", DbType.String, ""); listColumns.Add("SKU", "SKU", DbType.String, ""); listColumns.Add("QTY", "QTY", DbType.Int32, ""); listColumns.Add("LOCATION", "LOCATION", DbType.String, ""); listColumns.Add("UserName", "UserName", DbType.String, ""); MicrosoftExcel obj2 = new MicrosoftExcel(); var filePath = obj2.Export(tb, listColumns); var trayMaxVolume = DataNew.GetTrayMaxVolumeDatas(wareHouse); var trayVolume = trayMaxVolume == null ? 0.6m : trayMaxVolume.MaxVolume;//无数据默认0.6m³ var pickUserIds = exportPickGoodsNew.Select(r => r.PickUserId.Value).Distinct(); foreach ( var pickUserId in pickUserIds) { //获取每个人拣货的总立方 var solid = DataNew.GetUserPickGoodsTotalSolid(usaTime, pickUserId); if (solid <= 0) continue; //假设每个托盘的拣货立方是0.6m³,计算出每个人总共需要的托盘数,在计算出来的托盘数上,冗余一倍 var trayCount =(int)Math.Ceiling(solid / trayVolume) * 2;//计算的托盘数向上取整,再*2 //新增拣货用户的托盘码 for(int i = 0; i < trayCount; i++) { var mde = new TrayInfo() { InDate = usaTime, WareHouse = wareHouse, PrintState = 0, TrayUserId = pickUserId, }; DataNew.AddTrayInfo(mde); } } //订单生成拣货列表之后,将状态改为打印中状态 DataNew.UpdateOrderPostInfoToPrinting(string.Join(",", ops.Select(r => r.ID))); rmodel.Code = 1; rmodel.Message = filePath; return rmodel; } else { rmodel.Code = 0; rmodel.Message = "Not Find Datas"; return rmodel; } } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Error:" + ex.Message; return rmodel; } } /// /// 根据搜索条件查询数据生成拣货单 /// /// /// /// /// /// /// /// /// 是否覆盖生成拣货单 /// [WebMethod(EnableSession = true)] public APIReturnModel MakePickGoodListForAllDatasNew(string searchCode, int searchType, string wareHouse, int postState, int printState, DateTime? sDate, DateTime? eDate, int isFG) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { //当前操作用户权限限定,只能美国仓库员工导出自己仓库的数据 var userId = Convert.ToInt32(Session["UserId"]); var ops = DataNew.GetOrderPostInfoDatasBySearch(searchCode, searchType, wareHouse, postState, printState, sDate, eDate); var singleOPs = new List();//单个订单只有一种商品 var moreOPs = new List();//单个订单有多种商品,需要单独放到最后,一起拣货 var sameGoodOPs=new List();//同一个订单,同一种商品,多个数量,分配在不同库位 if (ops == null) { rmodel.Code = 0; rmodel.Message = "Not Find Datas"; return rmodel; } #region 检查所有的发货订单的面单地址和SKU信息是否完整 var _corderCodes = ops.Select(r => r.OrderCode).Distinct().ToList(); foreach (var orderCode in _corderCodes) { var tracks = DataNew.GetDT_TrackCodeApplyNewsByOrderCode(orderCode); if (tracks == null) { rmodel.Code = 0; rmodel.Message = "订单号:" + orderCode + "未找到发货面单信息,请检查"; return rmodel; } foreach (var track in tracks) { if (string.IsNullOrEmpty(track.LabelUrl) || !track.LabelUrl.Contains(track.TrackCode)) { rmodel.Code = 0; rmodel.Message = "订单号:" + orderCode + ",跟踪码:" + track.TrackCode + " 面单文件地址为空或者与跟踪码不一致,请重新上传此面单"; return rmodel; } else if (string.IsNullOrEmpty(track.SKU)) { rmodel.Code = 0; rmodel.Message = "订单号:" + orderCode + ",跟踪码:" + track.TrackCode + " 货物SKU信息为空,请检查"; return rmodel; } } } #endregion foreach (var op in ops) { //查找是否存在订单号相同,SKU不同的订单,如果存在,则说明这个订单包含多种商品 var _op = ops.Where(r => r.OrderCode == op.OrderCode && r.SKU!=op.SKU && r.ID != op.ID).FirstOrDefault(); if (_op == null) { //同一个订单,相同的SKU,并且在不同的库位 var _op2 = ops.Where(r => r.OrderCode == op.OrderCode && r.SKU == op.SKU && r.LocationCode != op.LocationCode && r.ID != op.ID).FirstOrDefault(); if (_op2 != null) { sameGoodOPs.Add(op); } else { singleOPs.Add(op); } } else { moreOPs.Add(op); } } var exportPickGoods = new List(); //获取仓库所有的拣货类型以及拣货人员 var pickUsers = DataNew.GetStorePostionPickers(wareHouse); //西部拣货规则类型:1:1-16 row(A layer)(1-16排A层);2:1-16 row(B,C,D layer)(1-16排B层);3:After row 16(16排之后);4:Multiple Goods(多件货);5:Others(其它) //排 var pai = new List() { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16" }; //层 var ceng = new List() { "B", "C", "D" }; if (singleOPs != null) { var singlePickGoods = singleOPs.GroupBy(r => new { r.SKU, r.NewSKU, r.LocationCode }).Select(g => new ShipOrderPickGoods { NewSKU = g.Key.NewSKU, SKU = g.Key.SKU, LocationCode = g.Key.LocationCode, Qty = g.Sum(r => r.Qty) }).OrderBy(n => n.LocationCode).ToList(); if (wareHouse == "W")//西部仓库 { foreach (var spg in singlePickGoods) { if (spg.LocationCode == "TestLocation") //每天测试专用库位,分配给指定人员,只在西部仓库测试 { spg.PickUserId = 238; continue; } int num = 0; int pickType = 0;//拣货类型 if (string.IsNullOrEmpty(spg.LocationCode)) { //spg.PickUserId = 103;//Eddie pickType = 5; } else if (spg.LocationCode.ToUpper().StartsWith("000A")) { //000开头A层 Jose pickType = 1; } else if (spg.LocationCode.ToUpper().StartsWith("000B") || spg.LocationCode.ToUpper().StartsWith("000C") || spg.LocationCode.ToUpper().StartsWith("000D")) { //000开头B/C/D层 Silvestre pickType = 2; } else if (pai.Contains(spg.LocationCode.Substring(0, 2)) && spg.LocationCode.Substring(2, 1) == "A") { //0-16排,并且是A层(第一层) //spg.PickUserId = 164;//Jose pickType = 1; } else if (pai.Contains(spg.LocationCode.Substring(0, 2)) && ceng.Contains(spg.LocationCode.Substring(2, 1))) { //0-16排,并且是BCD层(2,3,4层) //spg.PickUserId = 165;//Silvestre pickType = 2; } else if (int.TryParse(spg.LocationCode.Substring(0, 2), out num) && num > 16) { //17排以及之后表示地面,由Ricardo负责 //spg.PickUserId = 166;//由Ricardo pickType = 3; } else { //spg.PickUserId = 103;//Eddie pickType = 5; } var _pickUser = pickUsers.Where(r => r.PickType == pickType).FirstOrDefault(); if (_pickUser != null) { spg.PickUserId = _pickUser.PickUserId; } else { rmodel.Code = 0; rmodel.Message = "Not Find Pick Type Datas"; return rmodel; } } } else //东部仓库 { //东部拣货规则类型:11:1-10 row(1-10排);12:After row 10(10排之后);13:Multiple Goods(多件货);14:Others(其它) foreach (var spg in singlePickGoods) { int pickType = 0;//拣货类型 int num = 0; if (spg.LocationCode.StartsWith("E-") && spg.LocationCode.Length == 7 && int.TryParse(spg.LocationCode.Substring(2, 2), out num) && num <= 10) { //1-10排 pickType = 11; } else if (spg.LocationCode.StartsWith("E-") && spg.LocationCode.Length == 7 && int.TryParse(spg.LocationCode.Substring(2, 2), out num) && num > 10) { //10排之后 pickType = 12; } else { //其它 pickType = 14; } var _pickUser = pickUsers.Where(r => r.PickType == pickType).FirstOrDefault(); if (_pickUser != null) { spg.PickUserId = _pickUser.PickUserId; } else { rmodel.Code = 0; rmodel.Message = "Not Find Pick Type Datas"; return rmodel; } } } exportPickGoods.AddRange(singlePickGoods); } if (moreOPs != null) { if (wareHouse == "W") //同一个订单多种商品的西部统一分配给一个人拣货 { var _pickUser = pickUsers.Where(r => r.PickType == 4).FirstOrDefault();//找到多件货的拣货人员 if (_pickUser == null) { rmodel.Code = 0; rmodel.Message = "Not Find Pick Type Datas"; return rmodel; } var morePickGoods = moreOPs.GroupBy(r => new { r.SKU, r.NewSKU, r.LocationCode }).Select(g => new ShipOrderPickGoods { NewSKU = g.Key.NewSKU, SKU = g.Key.SKU, LocationCode = g.Key.LocationCode, Qty = g.Sum(r => r.Qty), PickUserId = _pickUser.PickUserId }).OrderBy(n => n.LocationCode); exportPickGoods.AddRange(morePickGoods); } else //东部分配给 { var _pickUser = pickUsers.Where(r => r.PickType == 13).FirstOrDefault();//找到多件货的拣货人员 if (_pickUser == null) { rmodel.Code = 0; rmodel.Message = "Not Find Pick Type Datas"; return rmodel; } var morePickGoods = moreOPs.GroupBy(r => new { r.SKU, r.NewSKU, r.LocationCode }).Select(g => new ShipOrderPickGoods { NewSKU = g.Key.NewSKU, SKU = g.Key.SKU, LocationCode = g.Key.LocationCode, Qty = g.Sum(r => r.Qty), PickUserId = _pickUser.PickUserId }).OrderBy(n => n.LocationCode); exportPickGoods.AddRange(morePickGoods); } } if (sameGoodOPs != null) { //已经判断过的订单 var orderCodes = new List(); var samePickGoods = new List(); sameGoodOPs = sameGoodOPs.OrderBy(r => r.OrderCode).ToList(); if (wareHouse == "W")//西部仓库 { foreach(var sg in sameGoodOPs) { //已经判断过了订单直接跳过 if (orderCodes.Contains(sg.OrderCode)) continue; //获取到该订单号的所有拣货数据 var smOrders = sameGoodOPs.Where(r => r.OrderCode == sg.OrderCode).ToList(); //逐个判断拣货库位属于哪个拣货人员 int isEddie = 0, isJose = 0, isSilvestre = 0, isRicardo = 0; foreach (var or in smOrders) { int num = 0; if (string.IsNullOrEmpty(or.LocationCode)) { //spg.PickUserId = 103;//Eddie isEddie = 1; } else if (or.LocationCode.ToUpper().StartsWith("000A")) { //000开头A层 Jose isJose = 1; } else if (or.LocationCode.ToUpper().StartsWith("000B") || or.LocationCode.ToUpper().StartsWith("000C") || or.LocationCode.ToUpper().StartsWith("000D")) { //000开头B/C/D层 Silvestre isSilvestre = 1; } else if (pai.Contains(or.LocationCode.Substring(0, 2)) && or.LocationCode.Substring(2, 1) == "A") { //0-16排,并且是A层(第一层) //spg.PickUserId = 164;//Jose isJose = 1; } else if (pai.Contains(or.LocationCode.Substring(0, 2)) && ceng.Contains(or.LocationCode.Substring(2, 1))) { //0-16排,并且是BCD层(2,3,4层) //spg.PickUserId = 165;//Silvestre isSilvestre = 1; } else if (int.TryParse(or.LocationCode.Substring(0, 2), out num) && num > 16) { //17排以及之后表示地面,由Ricardo负责 //spg.PickUserId = 166;//由Ricardo isRicardo = 1; } else { //spg.PickUserId = 103;//Eddie isEddie = 1; } } //最后归属的拣货人,默认是Eddie //有BCD层的优先分配给Silvestre,其次Eddie,Ricardo,Jose int lastPickUserid = 103;//Eddie if (isSilvestre == 1) lastPickUserid = 165;//Silvestre else if (isEddie == 1) lastPickUserid = 103;//Eddie else if (isRicardo == 1) lastPickUserid = 166;//Ricardo else if (isJose == 1) lastPickUserid = 164;//Jose foreach (var or in smOrders) { var shorpg = new ShipOrderPickGoods() { NewSKU = or.NewSKU, SKU = or.SKU, Qty = or.Qty, LocationCode = or.LocationCode, PickUserId = lastPickUserid }; samePickGoods.Add(shorpg); } orderCodes.Add(sg.OrderCode); } exportPickGoods.AddRange(samePickGoods); } else //东部仓库 { foreach(var sg in sameGoodOPs) { //已经判断过了订单直接跳过 if (orderCodes.Contains(sg.OrderCode)) continue; //获取到该订单号的所有拣货数据 var smOrders = sameGoodOPs.Where(r => r.OrderCode == sg.OrderCode).ToList(); int isNicolas = 0; int isGabi = 0; foreach (var or in smOrders) { int num = 0; if (or.LocationCode.StartsWith("E-") && or.LocationCode.Length == 7 && int.TryParse(or.LocationCode.Substring(2, 2), out num) && num <= 10) { //1-10排 isGabi = 1; } else if (or.LocationCode.StartsWith("E-") && or.LocationCode.Length == 7 && int.TryParse(or.LocationCode.Substring(2, 2), out num) && num > 10) { //10排之后 isNicolas = 1; } else { //其它 isNicolas = 1; } } int lastPickUserid = 176;//Nicolas if (isNicolas == 1) lastPickUserid = 176; else if (isGabi == 1) lastPickUserid = 220; foreach (var or in smOrders) { var shorpg = new ShipOrderPickGoods() { NewSKU = or.NewSKU, SKU = or.SKU, Qty = or.Qty, LocationCode = or.LocationCode, PickUserId = lastPickUserid }; samePickGoods.Add(shorpg); } orderCodes.Add(sg.OrderCode); } exportPickGoods.AddRange(samePickGoods); } } //把三种情况获取的值进行分组汇总 var _exportPickGoods = exportPickGoods.GroupBy(r => new { r.SKU, r.NewSKU, r.LocationCode, r.PickUserId }).Select(g => new ShipOrderPickGoods { SKU = g.Key.SKU, NewSKU = g.Key.NewSKU, LocationCode = g.Key.LocationCode, PickUserId = g.Key.PickUserId, Qty = g.Sum(r => r.Qty) }).ToList(); //左连匹配用户名 var users = DataNew.GetListUserSelect(); var exportPickGoodsNew = from a in _exportPickGoods join b in users on a.PickUserId equals b.UserId into Temp from c in Temp.DefaultIfEmpty() orderby a.PickUserId select new ShipOrderPickGoods { SKU = a.SKU, NewSKU = a.NewSKU, Qty = a.Qty, LocationCode = a.LocationCode, PickUserId = a.PickUserId, PickUserName = Temp.Select(r => r.Name).FirstOrDefault() }; if (isFG == 1)//覆盖生成,删除仓库当天生成的所有拣货单 { DataNew.DeleteAllPickGoodsList(wareHouse); } if (exportPickGoodsNew != null) { DataTable tb = new DataTable(); tb.Columns.Add("NEWSKU", Type.GetType("System.String")); tb.Columns.Add("SKU", Type.GetType("System.String")); tb.Columns.Add("QTY", Type.GetType("System.Int32")); tb.Columns.Add("LOCATION", Type.GetType("System.String")); tb.Columns.Add("UserName", Type.GetType("System.String")); //拣货日期 var usaTime = DateTime.Now; foreach (var ep in exportPickGoodsNew) { var packGoodCode1 = ""; var packGoodCode2 = ""; var packCode = DataNew.GetGoodsPackCodeBySKU(ep.SKU); if (packCode != null) { packGoodCode1 = packCode.Barcode; } DataRow row = tb.NewRow(); row["NEWSKU"] = ep.NewSKU; row["SKU"] = ep.SKU; row["QTY"] = ep.Qty; row["LOCATION"] = ep.LocationCode; row["UserName"] = ep.PickUserName; tb.Rows.Add(row); //保存拣货单数据 var pickGd = new PickGoodsInfo() { InDate = usaTime.Date, WareHouse = wareHouse, NewSKU = ep.NewSKU, SKU = ep.SKU, PickQty = ep.Qty, ScanQty = 0, LocationCode = ep.LocationCode, PickUserId = ep.PickUserId, PackGoodCode = packGoodCode1, PackGoodCode2 = packGoodCode2, }; DataNew.SavePickGoodsInfoData(pickGd); } TableColumnCollection listColumns = new TableColumnCollection(); listColumns.Add("NEWSKU", "NEW SKU", DbType.String, ""); listColumns.Add("SKU", "SKU", DbType.String, ""); listColumns.Add("QTY", "QTY", DbType.Int32, ""); listColumns.Add("LOCATION", "LOCATION", DbType.String, ""); listColumns.Add("UserName", "UserName", DbType.String, ""); MicrosoftExcel obj2 = new MicrosoftExcel(); var filePath = obj2.Export(tb, listColumns); var trayMaxVolume = DataNew.GetTrayMaxVolumeDatas(wareHouse); var trayVolume = trayMaxVolume == null ? 0.6m : trayMaxVolume.MaxVolume;//无数据默认0.6m³ var pickUserIds = exportPickGoodsNew.Select(r => r.PickUserId.Value).Distinct(); foreach (var pickUserId in pickUserIds) { //获取每个人拣货的总立方 var solid = DataNew.GetUserPickGoodsTotalSolid(usaTime, pickUserId); if (solid <= 0) continue; //假设每个托盘的拣货立方是0.6m³,计算出每个人总共需要的托盘数,在计算出来的托盘数上,冗余一倍 var trayCount = (int)Math.Ceiling(solid / trayVolume) * 2;//计算的托盘数向上取整,再*2 //新增拣货用户的托盘码 for (int i = 0; i < trayCount; i++) { var mde = new TrayInfo() { InDate = usaTime, WareHouse = wareHouse, PrintState = 0, TrayUserId = pickUserId, }; DataNew.AddTrayInfo(mde); } } //订单生成拣货列表之后,将状态改为打印中状态 DataNew.UpdateOrderPostInfoToPrinting(string.Join(",", ops.Select(r => r.ID))); rmodel.Code = 1; rmodel.Message = filePath; return rmodel; } else { rmodel.Code = 0; rmodel.Message = "Not Find Datas"; return rmodel; } } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Error:" + ex.Message; return rmodel; } } /// /// 导出temu平台订单的跟踪码图片,并且按照sku+仓库+库位重命名 /// /// /// /// /// [WebMethod(EnableSession = true)] public APIReturnModel DownLoadTemuTrackCodeImg(string wareHouse, DateTime? sDate, DateTime? eDate) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { var ops = DataNew.GetTemuOrderPostInfoDatasBySearch(wareHouse, sDate, eDate); if (ops == null) { rmodel.Code = 0; rmodel.Message = "Not Find Datas"; return rmodel; } #region 检查所有的发货订单的面单地址和SKU信息是否完整 var _corderCodes = ops.Select(r => r.OrderCode).Distinct().ToList(); foreach (var orderCode in _corderCodes) { var tracks = DataNew.GetDT_TrackCodeApplyNewsByOrderCode(orderCode); if (tracks == null) { rmodel.Code = 0; rmodel.Message = "订单号:" + orderCode + "未找到发货面单信息,请检查"; return rmodel; } foreach (var track in tracks) { if (string.IsNullOrEmpty(track.LabelUrl) || !track.LabelUrl.Contains(track.TrackCode)) { rmodel.Code = 0; rmodel.Message = "订单号:" + orderCode + ",跟踪码:" + track.TrackCode + " 面单文件地址为空或者与跟踪码不一致,请重新上传此面单"; return rmodel; } else if (string.IsNullOrEmpty(track.SKU)) { rmodel.Code = 0; rmodel.Message = "订单号:" + orderCode + ",跟踪码:" + track.TrackCode + " 货物SKU信息为空,请检查"; return rmodel; } } } #endregion var path = System.AppDomain.CurrentDomain.BaseDirectory + "ServerCookies/"; var fileName = wareHouse + DateTime.Now.ToString("MMdd"); //如果文件夹已经存在,删除文件夹以及文件 var filePath = path + fileName; if (Directory.Exists(filePath)) { string[] files = Directory.GetFiles(filePath);//获取文件夹中所有文件 foreach (string file in files) { File.Delete(file); } Directory.Delete(filePath, true); } //创建文件夹 Directory.CreateDirectory(filePath); var sdOPs = new List(); foreach(var op in ops) { //同一个订单号,存在多条数据,说明这个订单里面包含多个商品或者商品在不同库位,需要人工手动处理订单重命名 var _Op = ops.Where(r => r.OrderCode == op.OrderCode && r.ID != op.ID).FirstOrDefault(); if (_Op != null) { sdOPs.Add(_Op.OrderCode); continue; } var trackCodes = DataNew.GetTemuTrackCodeFileDatas(op.OrderCode); if (trackCodes == null) { throw new Exception("订单号:" + op.OrderCode + "未找到发货面单信息,请检查"); } foreach(var track in trackCodes) { if (string.IsNullOrEmpty(track.LabelUrl) || !track.LabelUrl.Contains(track.TrackCode)) { throw new Exception("订单号:" + op.OrderCode + ",跟踪码:" + track.TrackCode + " 面单文件地址为空或者与跟踪码不一致,请重新上传此面单"); } else if (string.IsNullOrEmpty(track.SKU)) { throw new Exception("订单号:" + op.OrderCode + ",跟踪码:" + track.TrackCode + " 货物SKU信息为空,请检查"); } var trackFile = System.AppDomain.CurrentDomain.BaseDirectory + "attached/"; if (track.ExpressName.ToUpper().Contains("FEDEX")) { trackFile += "fedex/" + track.LabelUrl; } else if (track.ExpressName.ToUpper().Contains("UPS")) { trackFile += "ups/" + track.LabelUrl; } else if (track.ExpressName.ToUpper().Contains("USPS")) { trackFile += "usps/" + track.LabelUrl; } else if (track.ExpressName.Contains("客户自提")) { trackFile += "khzt/" + track.LabelUrl; } if (!File.Exists(trackFile)) { throw new Exception("订单号:" + op.OrderCode + ",跟踪码:" + track.TrackCode + " 面单文件不存在,请重新上传"); } //文件后缀名 var fileExtion = track.LabelUrl.Substring(track.LabelUrl.LastIndexOf('.')); //重命名:sku+库位 var newTrackFileName = track.SKU + "+" + op.LocationCode; var lastTrackFileName = "";//最后保存的重命名文件地址 int _index = 0; while (true) { //重命名之后的完整文件地址 var newFilePath = filePath + "/" + newTrackFileName + (_index == 0 ? "" : ("(" + _index.ToString())) + fileExtion; //判断最后的完整的重命名地址是否重复,重复的话,数字加1 if (File.Exists(newFilePath)) { _index++; continue; } else { lastTrackFileName = newFilePath; break; } } File.Copy(trackFile, lastTrackFileName);//把面单文件复制到导出的目标文件夹 } } //压缩文件夹地址 var zipFilePath = filePath + ".zip"; if (File.Exists(zipFilePath)) File.Delete(zipFilePath); System.IO.Compression.ZipFile.CreateFromDirectory(filePath, zipFilePath); if (Directory.Exists(filePath)) { string[] files = Directory.GetFiles(filePath);//获取文件夹中所有文件 foreach (string file in files) { File.Delete(file); } Directory.Delete(filePath, true); } rmodel.Code = 1; rmodel.Message = (sdOPs != null && sdOPs.Count > 0) ? ("订单号:" + string.Join(",", sdOPs.Distinct()) + "请手动生成") : ""; rmodel.Datas = "ServerCookies/" + fileName + ".zip"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Error:" + ex.Message; } return rmodel; } [WebMethod(EnableSession = true)] public JsonModel> GetTrayInfoDatas(int userId, DateTime? inDate, string searchCode, string wareHouse, int state, int PageIndex, int PageSize) { PagesNew.Login(base.Session); var rmodel=new JsonModel>(); var _userid = Convert.ToInt32(Session["UserId"]); if (_userid == 103) { wareHouse = "W"; } else if (_userid == 176) { wareHouse="E"; } int rowCount = 0; rmodel.DataSource = DataNew.GetTrayInfoDatas(inDate, userId,_userid, searchCode, wareHouse, state, PageIndex, PageSize, out rowCount); rmodel.RowCount = rowCount; return rmodel; } [WebMethod(EnableSession = true)] public APIReturnModel SaveTrayInfoData(TrayInfo md) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { DataNew.SaveTrayInfo(md); rmodel.Code = 1; rmodel.Message = "Success"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Fail:" + ex.Message; } return rmodel; } [WebMethod(EnableSession = true)] public APIReturnModel DeleteTrayInfo(int id) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); var userid = Convert.ToInt32(Session["UserId"]); if (userid != 1) { rmodel.Code = 0; rmodel.Message = "No deletion permission"; return rmodel; } try { DataNew.DeleteTrayInfo(id); rmodel.Code = 1; rmodel.Message = "Success"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Fail:" + ex.Message; } return rmodel; } [WebMethod(EnableSession = true)] public APIReturnModel UpdateTrayInfo(int id) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { DataNew.UpdateTrayInfo(id); rmodel.Code = 1; rmodel.Message = "Success"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Fail:" + ex.Message; } return rmodel; } [WebMethod(EnableSession = true)] public APIReturnModel AddTrayInfo(int count,int userid) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); //var userid = Convert.ToInt32(Session["UserId"]); var userInfo=DataNew.GetUserInfoByUserId(userid); if(userInfo==null || (userInfo.WorkDesc!="东仓" && userInfo.WorkDesc != "西仓")) { rmodel.Code = 0; rmodel.Message = "No permission to add code"; return rmodel; } var warehouse = userInfo.WorkDesc == "东仓" ? "E" : "W"; try { for (var i = 0; i < count; i++) { var mde = new TrayInfo() { InDate = DateTime.Now.AddHours(-12).Date, WareHouse = warehouse, PrintState = 0, TrayUserId = userid, }; DataNew.AddTrayInfo(mde); } rmodel.Code = 1; rmodel.Message = "Success"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Fail:" + ex.Message; } return rmodel; } [WebMethod(EnableSession = true)] public JsonModel> GetStorePostionPickerDatas(string wareHouse, int PageIndex, int PageSize) { PagesNew.Login(base.Session); var rmodel = new JsonModel>(); int rowCount = 0; rmodel.DataSource = DataNew.GetPositionPickerDatas(wareHouse, PageIndex, PageSize, out rowCount); rmodel.RowCount = rowCount; return rmodel; } [WebMethod(EnableSession = true)] public APIReturnModel SavePositionPickerData(StorePostionPicker md) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { var code = DataNew.SavePositionPicker(md); if (code == 0) { rmodel.Code = 0; rmodel.Message = "Data already exists"; } else { rmodel.Code = 1; rmodel.Message = "Success"; } } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Fail:" + ex.Message; } return rmodel; } [WebMethod(EnableSession = true)] public APIReturnModel DeletePositionPickerData(int id) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { DataNew.DeletePositionPicker(id); rmodel.Code = 1; rmodel.Message = "Success"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Fail:" + ex.Message; } return rmodel; } /// /// 获取拣货单数据 /// /// /// /// /// /// /// /// [WebMethod(EnableSession = true)] public JsonModel> GetPickGoodsInfoDatas(DateTime? inDate, string sku, string wareHouse, int userid, int PageIndex, int PageSize) { PagesNew.Login(base.Session); var rmodel = new JsonModel>(); int rowCount = 0; rmodel.DataSource = DataNew.GetPickGoodsInfosData(inDate, wareHouse, sku,userid, PageIndex, PageSize, out rowCount); rmodel.RowCount = rowCount; return rmodel; } /// /// 删除拣货单数据 /// /// /// [WebMethod(EnableSession = true)] public APIReturnModel DeletePickGoodsInfoDatas(string ids) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { DataNew.DeletePickGoodsInfoForIds(ids.TrimEnd(',')); rmodel.Code = 1; rmodel.Message = "Success"; } catch(Exception ex) { rmodel.Code = 0; rmodel.Message = "Delete Fail:" + ex.Message; } return rmodel; } /// /// 获取拣货工信息 /// /// [WebMethod(EnableSession = true)] public List GetPickUserDatas() { PagesNew.Login(base.Session); return DataNew.GetPickUserDatas(); } /// /// 扫码托盘码时,获取托盘拣货打印数据 /// /// [WebMethod(EnableSession = true)] public JsonModel> GetTrayGoodsDetailPrintDatas(string trayCode) { PagesNew.Login(base.Session); var userid = Convert.ToInt32(Session["UserId"]); var rmodel = new JsonModel>(); if(userid!=103 && userid != 176 && userid!=238) { rmodel.DataSource = null; rmodel.RowCount = -1; return rmodel; } var rdatas = DataNew.GetTrayGoodsDetailPrintDatas(trayCode); rmodel.DataSource = rdatas; rmodel.RowCount = rdatas != null ? rdatas.Count : 0; //var pUserid = DataNew.GetTrayCodeBelongUserid(trayCode); //if((pUserid==0 || userid != pUserid) && userid!=103 && userid!=176)//当前扫描的托盘码不属于该用户 //{ // rmodel.DataSource = null; // rmodel.RowCount = -1; //} //else //{ // var rdatas = DataNew.GetTrayGoodsDetailPrintDatas(trayCode); // rmodel.DataSource = rdatas; // rmodel.RowCount = rdatas != null ? rdatas.Count : 0; //} return rmodel; } /// /// 扫码托盘码时,获取托盘拣货打印数据 /// /// [WebMethod(EnableSession = true)] public APIReturnModel GetPrintedTrayGoodsDetailDatas(string trayCode) { PagesNew.Login(base.Session); var userid = Convert.ToInt32(Session["UserId"]); var rmodel = new APIReturnModel(); var pUserid = DataNew.GetTrayCodeBelongUserid(trayCode); if (userid!=103 && userid!=176)//当前扫描的托盘码不属于该用户 { rmodel.Code = 0; rmodel.Message = "Your account can not print tracking code "; } else { var rdatas = DataNew.GetTrayGoodsDetailPrintDatas(trayCode); if (rdatas != null) { if (rdatas.Where(r => r.PickQty > r.PrintQty).Count() > 0) { rmodel.Code = 0; rmodel.Message = "Print Not Completed"; rmodel.Datas = rdatas; } else { rmodel.Code = 1; rmodel.Message = "Print Completed"; rmodel.Datas = rdatas; } } else { rmodel.Code = 0; rmodel.Message = "No Datas"; rmodel.Datas = null; } } return rmodel; } /// /// 扫码托盘码时,获取托盘拣货打印数据 /// /// [WebMethod(EnableSession = true)] public JsonModel> GetTrayGoodsDetailPrintDatasByTrayCodes(string trayCodes) { PagesNew.Login(base.Session); var rmodel = new JsonModel>(); try { var userid = Convert.ToInt32(Session["UserId"]); var rdatas = new List(); var tcodes = trayCodes.Split(','); foreach (var tcode in tcodes) { //var pUserid = DataNew.GetTrayCodeBelongUserid(tcode); //if (pUserid == 0 || userid != pUserid)//当前扫描的托盘码不属于该用户 //{ // continue; //} //else //{ // var _rdatas = DataNew.GetTrayGoodsDetailPrintDatas(tcode); // if (_rdatas != null) // rdatas.AddRange(_rdatas); //} var _rdatas = DataNew.GetTrayGoodsDetailPrintDatas(tcode); if (_rdatas != null) rdatas.AddRange(_rdatas); } rmodel.DataSource = rdatas; rmodel.RowCount = rdatas != null ? rdatas.Count : 0; } catch (Exception ex) { rmodel.DataSource = null; rmodel.RowCount = -1; } return rmodel; } /// /// 把拣货单内的数据转给其他人 /// /// [WebMethod(EnableSession = true)] public APIReturnModel TransferPickGoodsInfoDatasToUser(string ids,int userid) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { if (!string.IsNullOrEmpty(ids)) { var _ids = ids.TrimEnd(',').Split(','); foreach(var id in _ids) { var md = DataNew.GetPickGoodsInfoModelById(Convert.ToInt32(id)); if (md != null) DataNew.TransferPickGoodsInfoDataToUserNew(md, userid); } } rmodel.Code = 1; rmodel.Message = "Success"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Transfer Fail:" + ex.Message; } return rmodel; } /// /// 匹配订单跟踪码 /// /// 已扫描的SKU,需要进行匹配拣货列表以及面单 /// 已扫描的托盘码中的拣货数据 /// [WebMethod(EnableSession = true)] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public MatchTrackingCodeReturnModel MatchOrderTrackingCode(List tpgs,List tgoods,DateTime nowDate) { ErrorFollow.TraceWrite("匹配面单开始,tpgs:", JsonConvert.SerializeObject(tpgs), ""); PagesNew.Login(base.Session); var rmodel = new MatchTrackingCodeReturnModel(); try { var userid = Convert.ToInt32(Session["UserId"]); var userInfo = DataNew.GetUserInfoByUserId(userid); var wareHouse = userInfo.WorkDesc == "东仓" ? "E" : "W";//判断当前用户属于哪个仓库 if (tpgs == null || tpgs.Count == 0 || tgoods == null || tgoods.Count == 0) { rmodel.Code = 0; rmodel.Msg = "no datas"; rmodel.Obj = null; return rmodel; } //将同样的SKU数量汇总 var matchGds = tpgs.GroupBy(r => r.SKU).Select(g => new { sku = g.Key, qty = g.Sum(r => r.ScanQty) }).ToList(); //已匹配的托盘商品数据 var matchTrayGoods = new List(); //循环需要匹配的列表,逐个去匹配已扫描托盘中的数据,当匹配不到相同的SKU或者数量不对时,返回错误提示 foreach (var gd in matchGds) { var matQty = gd.qty;//需要匹配的数量 foreach (var tg in tgoods) { if (tg.SKU != gd.sku || tg.PrintQty >= tg.PickQty) continue; else if (tg.PrintQty + matQty <= tg.PickQty) { var mtg = new MatchTrayGoodsDetailModel() { ID = tg.ID, TrayCode = tg.TrayCode, SKU = tg.SKU, WareHouse = tg.WareHouse, LocationCode = tg.LocationCode, MatchQty = matQty }; matchTrayGoods.Add(mtg); tg.PrintQty += matQty;//加上已匹配的数量 matQty = 0;//需要匹配的数量全部匹配了 break; } else if (tg.PrintQty + matQty > tg.PickQty) { var canQty = tg.PickQty - tg.PrintQty;//该条数据可以用来匹配的数量 var mtg = new MatchTrayGoodsDetailModel() { ID = tg.ID, TrayCode = tg.TrayCode, SKU = tg.SKU, WareHouse = tg.WareHouse, LocationCode = tg.LocationCode, MatchQty = canQty.Value }; matchTrayGoods.Add(mtg); tg.PrintQty = tg.PickQty;//该条数据已经被全部匹配占用了 matQty -= canQty.Value;//需要匹配数量-该条数据可以匹配的数量 } } //当需要匹配的数量<=0时,直接进行下一条数据的匹配 if (matQty <= 0) continue; else //表格中所有数据都匹配一遍之后,还剩余匹配数量,说明已扫码存在的现有托盘中能够匹配的数量不够 { rmodel.Code = 0; rmodel.Msg = gd.sku + " scanning quantity is " + gd.qty + ", there is not enough quantity in the pallet"; rmodel.Obj = null; return rmodel; } } //已匹配的托盘商品数据为空,不能在扫描的托盘中匹配到SKU if (matchTrayGoods == null) { rmodel.Code = 0; rmodel.Msg = "Scanned SKU cannot match data"; rmodel.Obj = null; return rmodel; } //获取到此次所有需要匹配的SKU以及数量 var filt = ""; var filtHE = new List(); var skusArr = new List(); var skus = ""; foreach (var gd in matchGds) { filt += " and b.sku like '%" + gd.qty.ToString() + "x" + gd.sku + "%'"; filtHE.Add(gd.qty.ToString() + "x" + gd.sku); //skus += gd.qty.ToString() + "x" + gd.sku + " "; skusArr.Add(gd.qty.ToString() + "x" + gd.sku); } //skus = skus.TrimStart().TrimEnd(); skus = string.Join(" ", skusArr); filt += " and (Len(LTRIM(RTRIM(b.sku)))=" + string.Join("+", filtHE).Length + " or Len( LTRIM(RTRIM(b.sku))) =" + skus.Length + ")";//去除头尾空格比较长度,或者合并订单符合各个SKU"+"拼接的条件 //去匹配符合的快递单,只匹配当天的订单 //DT_TrackCodeApply中匹配包含这些商品和对应数量的跟踪码 var magd = DataNew.MatchGoodsTrackingCode(filt, wareHouse, nowDate); //货物编码存在新老码的情况,如果当前的编码没有匹配到,切换另外一个编码匹配 if (magd == null) { var filt2 = ""; var filtHE2 = new List(); var skusArr2 = new List(); var skus2 = ""; foreach (var gd in matchGds) //循环每个SKU 去得到另一个编码 { var goodCode = DataNew.GetGoodsCodeBySKU(gd.sku); if (string.IsNullOrEmpty(goodCode)) //没有另一个编码,还是用之前的sku { filt2 += " and b.sku like '%" + gd.qty.ToString() + "x" + gd.sku + "%'"; filtHE2.Add(gd.qty.ToString() + "x" + gd.sku); skusArr2.Add(gd.qty.ToString() + "x" + gd.sku); } else { filt2 += " and b.sku like '%" + gd.qty.ToString() + "x" + goodCode + "%'"; filtHE2.Add(gd.qty.ToString() + "x" + goodCode); skusArr2.Add(gd.qty.ToString() + "x" + goodCode); } } skus2 = string.Join(" ", skusArr2); filt2 += " and (Len(LTRIM(RTRIM(b.sku)))=" + string.Join("+", filtHE2).Length + " or Len( LTRIM(RTRIM(b.sku))) =" + skus2.Length + ")";//去除头尾空格比较长度,或者合并订单符合各个SKU"+"拼接的条件 magd = DataNew.MatchGoodsTrackingCode(filt2, wareHouse, nowDate); } if (magd != null) { //if (magd.ExpressName.ToUpper().Contains("FEDEX")) //{ // magd.LabelUrl = "../attached/fedex/" + magd.LabelUrl; //} //else if (magd.ExpressName.ToUpper().Contains("UPS")) //{ // magd.LabelUrl = "../attached/ups/" + magd.LabelUrl; //} //else if (magd.ExpressName.ToUpper().Contains("USPS")) //{ // magd.LabelUrl = "../attached/usps/" + magd.LabelUrl; //} //else if (magd.ExpressName.Contains("客户自提")) //{ // magd.LabelUrl = "../attached/khzt/" + magd.LabelUrl; //} if (magd.ExpressName.ToUpper().Contains("FEDEX")) { magd.LabelUrl = "https://www.kferp.net/attached/fedex/" + magd.LabelUrl; } else if (magd.ExpressName.ToUpper().Contains("UPS")) { magd.LabelUrl = "https://www.kferp.net/attached/ups/" + magd.LabelUrl; } else if (magd.ExpressName.ToUpper().Contains("USPS")) { magd.LabelUrl = "https://www.kferp.net/attached/usps/" + magd.LabelUrl; } else if (magd.ExpressName.Contains("客户自提")) { magd.LabelUrl = "https://www.kferp.net/attached/khzt/" + magd.LabelUrl; } magd.matchTrayGoods = matchTrayGoods; rmodel.Code = 1; rmodel.Msg = "Match Success,Tracking Code:" + magd.TrackCode; rmodel.Obj = magd; ErrorFollow.TraceWrite("匹配面单成功,面单信息:", "MatchOrderTrackingCode", JsonConvert.SerializeObject(rmodel)); return rmodel; } else //没有完整匹配到跟踪码,推荐可能想要匹配的跟踪码 { var filt2 = " and ("; int _index = 1; foreach (var gd in matchGds) { if (_index == 1) filt2 += " b.SKU like '%" + gd.sku + "%'"; else filt2 += " Or b.SKU like '%" + gd.sku + "%'"; _index++; } filt2 += " )"; //只匹配当天的订单 var tjMaGds = DataNew.MatchGoodsTrackingCodeTJ(filt2, wareHouse,nowDate); if (tjMaGds == null)//没有适合推荐的跟踪码 { rmodel.Code = 0; rmodel.Msg = "Tracking Code non-existent"; rmodel.Obj = null; ErrorFollow.TraceWrite("推荐匹配面单,推荐面单信息:", "MatchOrderTrackingCode", "无推荐面单"); return rmodel; } else { var tjMsg = "You may want to print these Tracking Codes:"; foreach (var tjm in tjMaGds) { tjMsg += " " + tjm.TrackCode + ":" + tjm.QtySKU + "; "; } rmodel.Code = 0; rmodel.Msg = tjMsg; rmodel.Obj = null; ErrorFollow.TraceWrite("推荐匹配面单,推荐面单信息:", "MatchOrderTrackingCode", JsonConvert.SerializeObject(rmodel)); return rmodel; } } } catch(Exception ex) { rmodel.Code = 0; rmodel.Msg = "Error:" + ex.Message; rmodel.Obj = null; ErrorFollow.TraceWrite("推荐匹配面单失败:", "MatchOrderTrackingCode", ex.Message); return rmodel; } } /// /// 打印匹配好的面单 /// /// [WebMethod(EnableSession = true)] public APIReturnModel PrintOrderTrackingCode(MatchTrackingCodeModel obj) { PagesNew.Login(base.Session); var userid = Convert.ToInt32(Session["UserId"]); var rmodel=new APIReturnModel(); if(obj==null || obj.matchTrayGoods == null) { rmodel.Code = 0; rmodel.Message = "print fail, datas error"; return rmodel; } else { //将打印匹配的商品保存到托盘商品已打印表中 foreach(var item in obj.matchTrayGoods) { var pg = new TrayPrintGoodsInfo() { TrayCode = item.TrayCode, SKU = item.SKU, WareHouse = item.WareHouse, LocationCode = item.LocationCode, PrintQty = item.MatchQty, PrintUserId = userid, TrackingCode=obj.TrackCode }; DataNew.SaveTrayPrintGoodsInfo(pg); } //更新订单发货OrderPostInfo表的发货数量以及发货状态 foreach (var item in obj.matchTrayGoods) { //当前已匹配发货的商品去订单发货表中逐一匹配,修改状态 var opgs = DataNew.GetOrderPostInfoDatasForPrint(obj.OrderCode, item.SKU); if (opgs != null) { var postQty = item.MatchQty;//需要发货的数量 foreach(var opg in opgs) { if (postQty <= 0) break; if (postQty < opg.Qty - opg.PostQty) { opg.PostQty += postQty; opg.PostState = 1; opg.PrintState = 1; postQty = 0; break; } else if (postQty == (opg.Qty - opg.PostQty)) { opg.PostQty = +postQty; opg.PostState = 2; opg.PrintState = 2; postQty = 0; break; } else if (postQty > (opg.Qty - opg.PostQty)) { opg.PostQty = opg.Qty; opg.PostState = 2; opg.PrintState = 2; postQty = postQty - (opg.Qty.Value - opg.PostQty.Value); continue; } DataNew.UpdateOrderPostInfo(opg); } } } rmodel.Code = 1; rmodel.Message = "success"; return rmodel; } } #endregion /// /// 打印面单,并且修改面单中包含的OrderPostInfo表的商品数据 /// /// /// [WebMethod(EnableSession = true)] public APIReturnModel PrintMDImg(MatchTrackingCodeModel obj) { PagesNew.Login(base.Session); ErrorFollow.TraceWrite("打印面单成功回调开始", "PrintMDImg", JsonConvert.SerializeObject(obj)); var userid = Convert.ToInt32(Session["UserId"]); var rmodel = new APIReturnModel(); //imgurl = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + imgurl.Replace("..", ""); try { #region 连接打印机打印快递面单 //using (var webClient = new System.Net.WebClient()) //{ // byte[] imageData = webClient.DownloadData(imgurl); // using (var ms = new System.IO.MemoryStream(imageData)) // { // using (var image = System.Drawing.Image.FromStream(ms)) // { // PrintDocument pd = new PrintDocument(); // pd.PrinterSettings.PrinterName = printer;// "HP LaserJet MFP M437-M443 PCL6";设置打印机名称 // //pd.DefaultPageSettings.PaperSize = new PaperSize("Custom", 800, 1200);//设置打印尺寸 // pd.PrintPage += (sender, e) => // { // e.Graphics.DrawImage(image, 0, 0, pd.DefaultPageSettings.PrintableArea.Width, pd.DefaultPageSettings.PrintableArea.Height); // }; // pd.Print(); // } // } //} #endregion #region 快递面单打印成功后,更新相关数据 if (obj == null || obj.matchTrayGoods == null) { rmodel.Code = 0; rmodel.Message = "print fail, datas error"; return rmodel; } else { //快递面单打印成功后,将这条数据标记为已打印状态,以及关联的跟踪码面单数据也需要更改为打印状态 DataNew.UpdateTrackCodeApplyPrintState(obj.TrackCodeApplyID.Value); ErrorFollow.TraceWrite("打印面单成功回调中,面单状态改为打印", "PrintMDImg", "面单ID:" + obj.TrackCodeApplyID.Value.ToString()); //将打印匹配的商品保存到托盘商品已打印表中 foreach (var item in obj.matchTrayGoods) { var pg = new TrayPrintGoodsInfo() { TrayCode = item.TrayCode, SKU = item.SKU, WareHouse = item.WareHouse, LocationCode = item.LocationCode, PrintQty = item.MatchQty, PrintUserId = userid, TrackingCode = obj.TrackCode }; DataNew.SaveTrayPrintGoodsInfo(pg); } //更新订单发货OrderPostInfo表的发货数量以及发货状态 foreach (var item in obj.matchTrayGoods) { //当前已匹配发货的商品去订单发货表中逐一匹配,修改状态 var opgs = DataNew.GetOrderPostInfoDatasForPrint(obj.OrderCode, item.SKU); if (opgs != null) { var postQty = item.MatchQty;//需要发货的数量 foreach (var opg in opgs) { if (postQty <= 0) break; if (postQty < opg.Qty - opg.PostQty) //需要发货数量<此订单发货表数据还需要发货数量时,还是正在打印以及部分发货中状态 { opg.PostQty += postQty; opg.PostState = 1; opg.PrintState = 1; postQty = 0; } else if (postQty == (opg.Qty - opg.PostQty))//需要发货数量=此订单发货表数据还需要发货数量时,打印完成以及全部发货状态状态 { opg.PostQty += postQty; opg.PostState = 2; opg.PrintState = 2; postQty = 0; } else if (postQty > (opg.Qty - opg.PostQty))//需要发货数量>此订单发货表数据还需要发货数量时,打印完成以及全部发货状态状态,并且继续匹配下一条数据 { opg.PostQty = opg.Qty; opg.PostState = 2; opg.PrintState = 2; postQty = postQty - (opg.Qty.Value - opg.PostQty.Value); } DataNew.UpdateOrderPostInfo(opg); if (postQty > 0) continue; else break; } } } rmodel.Code = 1; rmodel.Message = "success"; } ErrorFollow.TraceWrite("打印面单成功回调结束", "PrintMDImg", JsonConvert.SerializeObject(obj)); #endregion } catch (Exception ex) { //即使上面改发货数量失败,也要将面单打印状态改变 //快递面单打印成功后,将这条数据标记为已打印状态 DataNew.UpdateTrackCodeApplyPrintState(obj.TrackCodeApplyID.Value); ErrorFollow.TraceWrite("打印面单回调失败", "PrintMDImg", ex.Message); rmodel.Code = 0; rmodel.Message = ex.Message; } return rmodel; } /// /// 获取当前电脑已连接的打印机名称 /// /// [WebMethod(EnableSession = true)] public List GetUsablePrinters() { List PrintsList = new List(); foreach (string sPrint in System.Drawing.Printing.PrinterSettings.InstalledPrinters)//获取计算机安装所有打印机的名称 { PrintsList.Add(sPrint); } return PrintsList; } /// /// 上传快递面单图片 /// /// [WebMethod(EnableSession = true)] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public void UploadTrackCodeImages() { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); var httpRequest = System.Web.HttpContext.Current.Request; var context = System.Web.HttpContext.Current; try { int errorCount = 0; string errorMsg = ""; if (httpRequest.Files.Count > 0) { for(int i = 0; i < httpRequest.Files.Count; i++) { var file = httpRequest.Files[i]; var fileName = file.FileName; var trackCode = fileName.Split('.')[0]; if (string.IsNullOrEmpty(trackCode)) { errorCount++; errorMsg += fileName + "; "; continue; } var trackName=DataNew.GetTrackCodePostName(trackCode); if (trackName != null) { var imgPath = System.AppDomain.CurrentDomain.BaseDirectory+"attached/"; if (trackName.ToUpper().Contains("FEDEX")) { imgPath += "fedex/" + fileName; } else if (trackName.ToUpper().Contains("UPS")) { imgPath += "ups/" + fileName; } else if (trackName.ToUpper().Contains("USPS")) { imgPath += "usps/" + fileName; } else if (trackName.Contains("客户自提")) { imgPath += "khzt/" + fileName; } else { errorCount++; errorMsg += fileName + "; "; continue; } if (File.Exists(imgPath)) { // 文件存在,删除文件 File.Delete(imgPath); } file.SaveAs(imgPath); DataNew.UpdateTrackCodeImage(trackCode, fileName); } else { errorCount++; errorMsg += fileName + "; "; } } } if (errorCount > 0) { rmodel.Code = 0; rmodel.Message = errorCount + " failed uploads:" + errorMsg; } else { rmodel.Code = 1; rmodel.Message = "success"; } } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = ex.Message; } var serializer = new JavaScriptSerializer(); // 设置响应的内容类型为 JSON context.Response.ContentType = "application/json"; context.Response.Write(serializer.Serialize(rmodel)); context.Response.End(); } /// /// 获取托盘条形码 /// /// [WebMethod(EnableSession = true)] public byte[] GetPalletBarcodeImg(string code) { BarcodeWriter barcodeWriter = new BarcodeWriter { Format = BarcodeFormat.CODE_128, Options = new EncodingOptions { Height = 100, Width = 300 } }; Bitmap barcodeBitmap = barcodeWriter.Write(code); using (MemoryStream stream = new MemoryStream()) { barcodeBitmap.Save(stream, ImageFormat.Png); byte[] byteArray = stream.ToArray(); return byteArray; //HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); //response.Content = new ByteArrayContent(byteArray); //response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png"); //return response; // 返回生成的条形码图片 } } /// /// 获取退货条形码 /// /// [WebMethod(EnableSession = true)] public JsonModel> GetOrderReturnBarcodeDatas(int searchType,string search,int printState,int PageSize, int PageIndex) { PagesNew.Login(base.Session); var rmodel=new JsonModel>(); int rowCount = 0; rmodel.DataSource = DataNew.GetOrderReturnBarcodeList(search, searchType, printState, PageIndex, PageSize, out rowCount); rmodel.RowCount = rowCount; return rmodel; } /// /// 保存退货条形码 /// /// [WebMethod(EnableSession = true)] public APIReturnModel SaveOrderReturnBarcode(OrderReturnBarcode md) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { DataNew.SaveOrderReturnBarcodeDatas(md); rmodel.Code = 1; rmodel.Message = "Success"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Fail:" + ex.Message; } return rmodel; } /// /// 删除退货条形码 /// /// [WebMethod(EnableSession = true)] public APIReturnModel DeleteOrderReturnBarcode(int id) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { DataNew.DeleteOrderReturnBarcodeDatas(id); rmodel.Code = 1; rmodel.Message = "Success"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Fail:" + ex.Message; } return rmodel; } /// /// 更新退货条形码为打印状态 /// /// [WebMethod(EnableSession = true)] public APIReturnModel UpdateOrderReturnBarcodePrint(int id) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { DataNew.UpdateOrderReturnBarcodePrintState(id); rmodel.Code = 1; rmodel.Message = "Success"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Fail:" + ex.Message; } return rmodel; } /// /// 获取退货条形码 /// /// [WebMethod(EnableSession = true)] public byte[] GetOrderReturnBarcodeImg(string code) { BarcodeWriter barcodeWriter = new BarcodeWriter { Format = BarcodeFormat.CODE_128, Options = new EncodingOptions { Height = 100, Width = 300 } }; Bitmap barcodeBitmap = barcodeWriter.Write(code); using (MemoryStream stream = new MemoryStream()) { barcodeBitmap.Save(stream, ImageFormat.Png); byte[] byteArray = stream.ToArray(); return byteArray; } } [WebMethod(EnableSession = true)] public APIReturnModel SendPrintImgToPrintAPP(string imgPath) { imgPath = "http://localhost:53137/attached/fedex/270299558951.pdf"; PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { using (HttpClient client = new HttpClient()) { var apiUrl = "http://localhost:8090/api/home/PrintTrackingCode?imgPath=" + imgPath; HttpResponseMessage response = client.GetAsync(apiUrl).Result; if (response.IsSuccessStatusCode) { string responseBody = response.Content.ReadAsStringAsync().Result; var robj=JsonConvert.DeserializeObject(responseBody); if (robj.Code == 1) { rmodel.Code = 1; rmodel.Message = "Success"; } else { rmodel.Code = 0; rmodel.Message = robj.Msg; } return rmodel; } else { rmodel.Code = 0; rmodel.Message = "Fail"; return rmodel; } } rmodel.Code = 1; rmodel.Message = "Success"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Fail:" + ex.Message; } return rmodel; } /// /// 获取跟踪码关联数据 /// /// [WebMethod(EnableSession = true)] public JsonModel> GetTrackCodeRelationDatas(string search, int PageSize, int PageIndex) { PagesNew.Login(base.Session); var rmodel = new JsonModel>(); int rowCount = 0; rmodel.DataSource = DataNew.GetTrackCodeRelations(search, PageIndex, PageSize, out rowCount); rmodel.RowCount = rowCount; return rmodel; } /// /// 保存跟踪码关联数据 /// /// [WebMethod(EnableSession = true)] public APIReturnModel SaveTrackCodeRelation(TrackCodeRelation md) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { DataNew.SaveTrackCodeRelation(md); rmodel.Code = 1; rmodel.Message = "Success"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Fail:" + ex.Message; } return rmodel; } /// /// 删除TrackCodeRelation /// /// [WebMethod(EnableSession = true)] public APIReturnModel DeleteTrackCodeRelation(int id) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { DataNew.DeleteTrackCodeRelation(id); rmodel.Code = 1; rmodel.Message = "Success"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = "Fail:" + ex.Message; } return rmodel; } /// /// 获取仓库未打印的面单数据 /// /// [WebMethod(EnableSession = true)] public APIReturnModel GetWareHouseUnPrintedDatas(DateTime date) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { var userid = Convert.ToInt32(Session["UserId"]); var userInfo = DataNew.GetUserInfoByUserId(userid); if (userid != 1 && userInfo.WorkDesc != "东仓" && userInfo.WorkDesc != "西仓") { rmodel.Code = 0; rmodel.Message = "You don't have permission to view"; return rmodel; } var warehouse = ""; if (userInfo.WorkDesc == "东仓") { warehouse = "E"; } else if (userInfo.WorkDesc == "西仓") { warehouse = "W"; } var datas = DataNew.GetWareHouseNoPrintedDatas(warehouse, date); rmodel.Code = 1; rmodel.Message = "Success"; rmodel.Datas = datas; } catch(Exception ex) { rmodel.Code = 0; rmodel.Message = ex.Message; } return rmodel; } /// /// 获取仓库未打印的面单数据 /// /// [WebMethod(EnableSession = true)] public APIReturnModel GetWareHouseUnPrintedDatasIndex(string wareHouse, DateTime date) { PagesNew.Login(base.Session); var rmodel = new APIReturnModel(); try { var datas = DataNew.GetWareHouseNoPrintedDatas(wareHouse, date); rmodel.Code = 1; rmodel.Message = "Success"; rmodel.Datas = datas; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = ex.Message; } return rmodel; } /// /// 获取仓库未打印的面单数据 /// /// [WebMethod(EnableSession = true)] public APIReturnModel SyncERPOrderListToWMS(DateTime sDate,DateTime eDate) { var rmodel = new APIReturnModel(); try { DataNew.SyncERPOrderToWMS(sDate, eDate); rmodel.Code = 1; rmodel.Message = "Success"; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = ex.Message; } return rmodel; } /// /// 获取需要同步到WMS的订单(接口提供给WMS调用) /// /// [WebMethod(EnableSession = true)] public APIReturnModel SyncERPOrderListToWMSNew(DateTime sDate, DateTime eDate) { var rmodel = new APIReturnModel(); try { var orders = DataNew.GetSyncToWMSOrderDatas(sDate, eDate); if(orders == null || orders.Count<=0) { rmodel.Code = 1; rmodel.Message = "暂无需要同步的订单"; rmodel.Datas = null; return rmodel; } var datas = new List(); //循环订单 foreach (var order in orders) { var _order = DataNew.GetOrderModelNew2(order.OrderId); if (_order == null) continue; order.PlatId = _order.PlatId; order.ShopName = _order.ShopName; order.OrderCode = _order.OrderCode; order.PlatOrderCode= _order.PlatOrderCode; order.OrderDate=_order.OrderDate; order.InDate = _order.InDate; order.RevName = _order.RevName; order.RevCountry = _order.RevCountry; order.RevAddr = _order.RevAddr; order.RevPhone = _order.RevPhone; order.RevMoblie = _order.RevMoblie; order.RevMail = _order.RevMail; order.RevFax = _order.RevFax; order.RevPostCode = _order.RevPostCode; order.SendInfo= _order.SendInfo; order.ErrorInfo = _order.ErrorInfo; order.BuyRemark = _order.BuyRemark; order.LeaveWord = _order.LeaveWord; order.TrackCode = _order.TrackCode; order.RevProvince = _order.RevProvince; order.RevCity = _order.RevCity; order.RevArea = _order.RevArea; var ogoods = DataNew.GetSyncToWMSOrderGoodsDatas(order.OrderId); if (ogoods == null) continue; order.OrderGoods = ogoods; var temuGoods = DataNew.GetSyncToWMSTemuOrderGoodsDatas(order.OrderCode); order.TemuOrderGoods = temuGoods; datas.Add(order); } rmodel.Code = 1; rmodel.Message = "成功"; rmodel.Datas=datas; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = ex.Message; } return rmodel; } /// /// 获取需要同步到WMS的订单(接口提供给WMS调用) xsx 20241115因迁移服务器参照原接口添加,后续禁止链接服务器串表查询 /// /// [WebMethod(EnableSession = true)] public APIReturnModel SyncERPOrderListToWMSNew_New(DateTime sDate, DateTime eDate) { var rmodel = new APIReturnModel(); try { var orders = DataNew.GetSyncToWMSOrderDatas_New(sDate, eDate); if (orders == null || orders.Count <= 0) { rmodel.Code = 1; rmodel.Message = "暂无需要同步的订单"; rmodel.Datas = null; return rmodel; } var datas = new List(); //循环订单 foreach (var order in orders) { var _order = DataNew.GetOrderModelNew2(order.OrderId); if (_order == null) continue; order.PlatId = _order.PlatId; order.ShopName = _order.ShopName; order.OrderCode = _order.OrderCode; order.PlatOrderCode = _order.PlatOrderCode; order.OrderDate = _order.OrderDate; order.InDate = _order.InDate; order.RevName = _order.RevName; order.RevCountry = _order.RevCountry; order.RevAddr = _order.RevAddr; order.RevPhone = _order.RevPhone; order.RevMoblie = _order.RevMoblie; order.RevMail = _order.RevMail; order.RevFax = _order.RevFax; order.RevPostCode = _order.RevPostCode; order.SendInfo = _order.SendInfo; order.ErrorInfo = _order.ErrorInfo; order.BuyRemark = _order.BuyRemark; order.LeaveWord = _order.LeaveWord; order.TrackCode = _order.TrackCode; order.RevProvince = _order.RevProvince; order.RevCity = _order.RevCity; order.RevArea = _order.RevArea; var ogoods = DataNew.GetSyncToWMSOrderGoodsDatas(order.OrderId); if (ogoods == null) continue; order.OrderGoods = ogoods; var temuGoods = DataNew.GetSyncToWMSTemuOrderGoodsDatas(order.OrderCode); order.TemuOrderGoods = temuGoods; datas.Add(order); } rmodel.Code = 1; rmodel.Message = "成功"; rmodel.Datas = datas; } catch (Exception ex) { rmodel.Code = 0; rmodel.Message = ex.Message; } return rmodel; } } }