/// <summary> /// 同步2c订单 /// </summary> public void SyncB2COrder() { List <NikeCrodOrderLog> logs = new List <NikeCrodOrderLog>(); //读取配置文件 XmlSerializerHelper <OrderConfig> config = new XmlSerializerHelper <OrderConfig>(); config.Load(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "StoreConfig.xml")); if (config != null && config.Value != null && config.Value.customerStores != null && config.Value.customerStores.Any() && config.Value.orderTypes != null && config.Value.orderTypes.Any()) { List <CustomerStore> storeConfig = config.Value.customerStores.ToList(); List <OrderTypeConfig> orderTypeConfig = config.Value.orderTypes.ToList(); //获取中间表的订单信息 OrderECModel model = new OrderECManagementService().GetNikeOrderB2C(1); if (model != null && model.Order_Headers != null && model.Order_Headers.Any() && model.Order_Details != null && model.Order_Details.Any()) { //PreOrderRequest request = new PreOrderRequest(); IList <PreOrder> preorders = new List <PreOrder>(); IList <PreOrderDetail> preorderDetails = new List <PreOrderDetail>(); foreach (var item in model.Order_Headers) { if (string.IsNullOrEmpty(item.orderCode)) { continue; } List <Order_Detail> details = model.Order_Details.Where(m => m.orderCode == item.orderCode).ToList(); //没有明细 if (details == null || !details.Any()) { logs.Add(new NikeCrodOrderLog() { OrderCode = item.orderCode, Type = "GetB2COrder", Operation = "抓取B2C订单", Remark = "抓取失败:该订单没有明细信息", Creator = "sysService", Str1 = "", Str2 = "", Str3 = "", Str4 = "", Str5 = "" }); continue; } CustomerStore _store = storeConfig.Where(m => m.StoreKey == item.appointStcode).FirstOrDefault(); OrderTypeConfig _ordertype = orderTypeConfig.Where(m => m.OrderTypeCode.ToString() == item.platType).FirstOrDefault(); //没有找到这家门店 ,log if (_store == null || _ordertype == null) { logs.Add(new NikeCrodOrderLog() { OrderCode = item.orderCode, Type = "GetB2COrder", Operation = "抓取B2C订单", Remark = "抓取失败:该订单对应的门店代码或者订单类型未配置", Creator = "sysService", Str1 = "", Str2 = "", Str3 = "", Str4 = "", Str5 = "" }); continue; } #region 头信息 PreOrder order = new PreOrder(); order.ExternOrderNumber = item.orderCode; order.CustomerID = _store.CustomerID; order.CustomerName = _store.CustomerName; order.Warehouse = _store.WarehouseName; order.OrderType = _ordertype.OrderType; order.Status = 1; order.OrderTime = item.pushTime.ObjectToNullableDateTime(); order.Province = item.province; order.City = item.city; order.District = item.district; order.Address = item.address; order.Consignee = item.receiver; order.Contact = item.receiverPhone; order.ExpressCompany = "顺丰快递";//默认顺丰 order.DetailCount = details.Count; order.Creator = "sysService"; order.str4 = item.appointStcode; //门店代码 order.str2 = item.platType == "31" ? "3721" : item.appointStcode; order.str13 = "cord"; //订单打个标记,代表cord订单 //为了方便知道往哪个库里面插入,打个标记 order.str20 = _store.DBType; preorders.Add(order); #endregion #region 明细 foreach (var detailitem in details) { PreOrderDetail detail = new PreOrderDetail(); detail.ExternOrderNumber = item.orderCode; detail.CustomerID = _store.CustomerID; detail.CustomerName = _store.CustomerName; detail.Warehouse = _store.WarehouseName; detail.WarehouseId = _store.WarehouseID; detail.LineNumber = detailitem.lineId; detail.SKU = detailitem.barCode; detail.GoodsName = detailitem.skuName; detail.GoodsType = "A品"; detail.OriginalQty = detailitem.quantity; detail.Creator = order.Creator; detail.str6 = detailitem.style_color + "-" + detailitem.size; detail.str20 = _store.DBType; preorderDetails.Add(detail); } #endregion } if (preorders != null && preorders.Any() && preorderDetails != null && preorderDetails.Any()) { List <string> dbs = preorders.Select(m => m.str20).Distinct().ToList(); //不同数据库的订单 foreach (var dbitem in dbs) { List <PreOrder> preodertowms = preorders.Where(m => m.str20 == dbitem).ToList();//得到本库的订单 List <PreOrderDetail> predetailtowms = preorderDetails.Where(m => m.str20 == dbitem).ToList(); //request.PreOrderList = preorders.Where(m => m.str20 == dbitem).ToList(); //request.PreOd = preorderDetails.Where(m => m.str20 == dbitem).ToList(); //插入数据库 string dbconnStr = ""; if (dbitem == "1")//1.上海数据库 { dbconnStr = Common.SHWMSSqlConnection; } else if (dbitem == "2")//2.成都武汉西安那个数据库 { dbconnStr = Common.CDWMSSSqlConnection; } IEnumerable <PreOrder> wmspreorders = new PreOrderService().GetWMSPreOrdersByExternNumber(preodertowms, dbconnStr); if (wmspreorders != null && wmspreorders.Any()) { foreach (var item in wmspreorders) { preodertowms.Remove(preodertowms.Where(m => m.ExternOrderNumber == item.ExternOrderNumber).FirstOrDefault()); predetailtowms.Remove(predetailtowms.Where(m => m.ExternOrderNumber == item.ExternOrderNumber).FirstOrDefault()); } } if (!preodertowms.Any())//本库的没有订单了,下一个库 { continue; } preodertowms.Where(m => m.str20 == dbitem).ToList().ForEach(m => m.str20 = null); predetailtowms.Where(m => m.str20 == dbitem).ToList().ForEach(m => m.str20 = null); var response = new PreOrderService().AddPreOrderAndPreOrderDetailDynamicConn(preodertowms, predetailtowms, "sysService", dbconnStr); //成功 if (response.IsSuccess && response.Result != null && response.Result.PreOrderList != null && response.Result.PreOrderList.Any()) { foreach (var item in preodertowms) { logs.Add(new NikeCrodOrderLog() { OrderCode = item.ExternOrderNumber, Type = "GetB2COrder", Operation = "抓取B2C订单", Remark = "抓取成功", Creator = "sysService", Str1 = "", Str2 = "", Str3 = "", Str4 = "", Str5 = "" }); } //更新中间表状态 List <string> Numbers = preodertowms.Select(m => m.ExternOrderNumber).Distinct().ToList(); new OrderECManagementService().UpdateNikeOrderStatus(Numbers); } else { foreach (var item in preodertowms) { logs.Add(new NikeCrodOrderLog() { OrderCode = item.ExternOrderNumber, Type = "GetB2COrder", Operation = "抓取B2C订单", Remark = "抓取失败:订单数据库插入失败", Creator = "sysService", Str1 = "", Str2 = "", Str3 = "", Str4 = "", Str5 = "" }); } } } } else { //没有需要插入的订单 } } else { //中间表没查到数据 } } else { logs.Add(new NikeCrodOrderLog() { OrderCode = "", Type = "GetB2COrder", Operation = "抓取B2C订单", Remark = "抓取失败:未读取到门店和客户仓库配置文件", Creator = "sysService", Str1 = "", Str2 = "", Str3 = "", Str4 = "", Str5 = "" }); } //日志 if (logs != null && logs.Any()) { new LogOperationService().AddNikeCordOrderLog(logs); } }
/// <summary> /// 解析出库单,一个文件一单 根据loadkey区分 /// </summary> /// <param name="txtlists"></param> /// <param name="externumber"></param> /// <returns></returns> public string LFOrderImportByLoadKey(List <string> txtlists, out string externumber) { externumber = ""; try { PreOrderRequest requestPo = new PreOrderRequest(); List <PreOrder> _preorderLists = new List <PreOrder>(); List <PreOrderDetail> _preorderDetailLists = new List <PreOrderDetail>(); if (txtlists[0].TxtSubstring(0, 10) == "WMSSHP" && txtlists[0].TxtSubstring(10, 2) == "O")//LF出库单 { int linenumber = 1; for (int i = 0; i < txtlists.Count; i++) { if (txtlists[i].TxtSubstring(0, 10) == "WMSSHP")//文档头 { continue; } if (txtlists[i].TxtSubstring(0, 5) == "SHPHD" && txtlists[i].TxtSubstring(5, 1) == "A")//订单头 { string loadkey = txtlists[i].TxtSubstring(4166, 10); if (string.IsNullOrEmpty(loadkey)) { return(ReturnTxtError("文档中存在LoadKey为空的订单")); } if (_preorderLists.Count() <= 0)//订单头只有一行 { #region 订单头 PreOrder preorder = new PreOrder(); preorder.str9 = loadkey; externumber = loadkey; string plantime = string.IsNullOrEmpty(txtlists[i].TxtSubstring(65, 14)) ? "" : DateTime.ParseExact(txtlists[i].TxtSubstring(65, 14), "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture).ToString("yyyy-MM-dd"); //计划发货时间 string shiptype = txtlists[i].TxtSubstring(209, 30); //运输方式 if (string.IsNullOrEmpty(plantime)) { return(ReturnTxtError("文档中计划发货时间为空,无法生成外部单号")); } preorder.str7 = plantime; //计划发货时间 preorder.str3 = shiptype; //运输方式 //外部单号 preorder.ExternOrderNumber = "LF" + preorder.str7.Replace("-", "") + "-" + preorder.str9; if (!string.IsNullOrEmpty(shiptype))//加上运输方式 { preorder.ExternOrderNumber += "-" + preorder.str3; } preorder.str17 = txtlists[i].TxtSubstring(2093, 10); //LF出库单号,这个在数据库是存在明细str8里面的,插入时清空这个值 //preorder.str16 = txtlists[i].TxtSubstring(21, 20);//NIKE单据编码,这个在数据库是存在明细里面的,插入时清空这个值 preorder.str20 = txtlists[i].TxtSubstring(21, 20); //NIKE单据编码,这个在数据库是存在明细里面的,插入时清空这个值 preorder.OrderTime = DateTime.Now; preorder.str4 = txtlists[i].TxtSubstring(79, 15); //NFS店铺编码 string DivisionCode = txtlists[i].TxtSubstring(349, 10); //Division Code if (DivisionCode == "10") { preorder.str13 = "APP"; } else if (DivisionCode == "20" || DivisionCode == "40") { preorder.str13 = "FTW"; } else { preorder.str13 = "EQP"; } preorder.str10 = txtlists[i].TxtSubstring(703, 20); //NIKE PO preorder.str2 = txtlists[i].TxtSubstring(724, 20); //运输时效 preorder.str8 = txtlists[i].TxtSubstring(804, 20); //VAS CODE preorder.str11 = txtlists[i].TxtSubstring(907, 30); //PACK SLIP NO preorder.str5 = txtlists[i].TxtSubstring(1705, 45); //公司名 preorder.Address = txtlists[i].TxtSubstring(1750, 45) + "&" + txtlists[i].TxtSubstring(1795, 45) + "&" + txtlists[i].TxtSubstring(1840, 45) + "&" + txtlists[i].TxtSubstring(1885, 45); //地址1,2,3,4 preorder.City = txtlists[i].TxtSubstring(1930, 45); //城市 preorder.Province = txtlists[i].TxtSubstring(1975, 2); //省 preorder.str12 = "否"; //是否单仓LoadKey preorder.str6 = ""; //好像是男女童鞋服配之类的 preorder.str14 = ""; //RP LI,先判断NIKE PO的第九位,是L时,值为LI,是S时,值为RP,否则取VAS Code if (preorder.str10.Length >= 9) { if (preorder.str10.Substring(8, 1) == "L") { preorder.str14 = "LI"; } else if (preorder.str10.Substring(8, 1) == "S") { preorder.str14 = "RP"; } else { if (preorder.str8.Equals("NIKECN"))//VAS Code { preorder.str14 = ""; } else { preorder.str14 = preorder.str8; } } } else { if (preorder.str8.Equals("NIKECN"))//VAS Code { preorder.str14 = ""; } else { preorder.str14 = preorder.str8; } } //CRD逻辑 计划发货时间+运输时效 preorder.str15 = (DateTime.Parse(preorder.str7).AddDays(int.Parse(preorder.str2))).ToString("yyyy-MM-dd"); try { if (DateTime.Parse(preorder.str7).AddDays(int.Parse(preorder.str2)) > DateTime.ParseExact(preorder.str10.Substring(0, 8), "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture)) { preorder.str15 = "";//CRD } else { preorder.str15 = DateTime.ParseExact(preorder.str10.Substring(0, 8), "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture).ToString("yyyy-MM-dd"); } } catch (Exception ea) { } //预计卸货时间 preorder.str16 = (DateTime.Parse(preorder.str7).AddDays(int.Parse(preorder.str2))).ToString("yyyy-MM-dd"); try { DateTime time = DateTime.Parse(preorder.str10.Substring(0, 8).Insert(4, "-").Insert(7, "-")); preorder.str16 = preorder.str10.Substring(0, 8).Insert(4, "-").Insert(7, "-"); } catch (Exception) { } preorder.str18 = "LF";//标识利丰订单 preorder.CustomerID = 103; preorder.CustomerName = "NIKE-Return"; preorder.Warehouse = "NIKE-退货仓"; preorder.OrderType = "正常出库"; preorder.Status = 1; preorder.Creator = "SFTPUser"; _preorderLists.Add(preorder); #endregion } else { if (_preorderLists.Where(m => m.str9 == loadkey).Count() <= 0) { return(ReturnTxtError("文档中存在多个LoadKey的情况")); } continue; } } else if (txtlists[i].TxtSubstring(0, 5) == "SHPDT" && txtlists[i].TxtSubstring(5, 1) == "A") //订单明细SKU { string ArticleColorSize = txtlists[i].TxtSubstring(36, 20); //lf传过来的sku,里面包含款色码 if (string.IsNullOrEmpty(ArticleColorSize)) { return(ReturnTxtError("文档信息中SKU(articlesize)为空")); } //相同SKU if (_preorderDetailLists.Where(m => m.str16 == ArticleColorSize).Count() > 0) { //同SKU数量累加 _preorderDetailLists.Where(m => m.str16 == ArticleColorSize).FirstOrDefault().OriginalQty += txtlists[i].TxtSubstring(538, 10).ObjectToInt32();//数量 continue; } else { #region 订单明细 PreOrderDetail predetail = new PreOrderDetail(); predetail.str16 = ArticleColorSize; //先存着和vas行去比较 predetail.str17 = ArticleColorSize.Substring(0, 6).Trim() + '-' + ArticleColorSize.Substring(6, 3).Trim(); //article predetail.str18 = ArticleColorSize.Substring(9).Trim(); //size predetail.str6 = predetail.str17 + '-' + predetail.str18; //Article+size predetail.str7 = ""; //取主表的Division Code predetail.str8 = txtlists[i].TxtSubstring(460, 10); //LF出库单号 predetail.str9 = ""; //NIKE单据编码 predetail.OriginalQty = txtlists[i].TxtSubstring(538, 10).ObjectToInt32(); //数量 //predetail.LineNumber = txtlists[i].TxtSubstring(548, 5);//LF出库单行号 predetail.LineNumber = linenumber.ToString().TxtPadLeftstring(5, '0'); predetail.CustomerID = 103; predetail.CustomerName = "NIKE-Return"; predetail.Warehouse = "NIKE-退货仓"; predetail.WarehouseId = 58; predetail.GoodsType = "A品"; _preorderDetailLists.Add(predetail); linenumber++; #endregion } } else if (txtlists[i].TxtSubstring(0, 5) == "ORDRF" && txtlists[i].TxtSubstring(5, 1) == "A")//SKU的VAS信息 { continue; } } if (!_preorderLists.Any() || !_preorderDetailLists.Any()) { return(ReturnTxtError("文档中不存在订单信息")); } //验证loadkey在系统是否存在 IEnumerable <PreOrder> getpreorders = new PreOrderService().GetWMSPreOrderlistByLoadKey(_preorderLists); if (getpreorders != null && getpreorders.Any()) { return(ReturnTxtError("文档中的LoadKey在系统中已经存在")); } //验证SKU是否存在 List <ProductSearch> searprolistfs = new List <ProductSearch>(); foreach (var item in _preorderDetailLists) { ProductSearch psfs = new ProductSearch(); psfs.Str10 = item.str17; psfs.Str9 = item.str18; psfs.Str8 = "01"; searprolistfs.Add(psfs); } IEnumerable <ProductSearch> productListfs = new ProductService().GetSearchProduct(103, searprolistfs, "Acticle"); foreach (var item in _preorderDetailLists) { //判断如果通过article+size是否存在信息 ProductSearch search = productListfs.Where(m => m.Str10 == item.str17 && m.Str9 == item.str18).FirstOrDefault(); if (search == null) { return(ReturnTxtError("文档中的article:" + item.str17 + "Size:" + item.str18 + "在系统不存在")); } item.SKU = search.SKU; item.GoodsName = search.GoodsName; item.str2 = search.Price; item.str3 = search.SafeLock; item.str4 = search.Hanger; item.str10 = search.GenderAge; item.ExternOrderNumber = _preorderLists.FirstOrDefault().ExternOrderNumber; item.str7 = _preorderLists.FirstOrDefault().str13; //Division Code //item.str9 = _preorderLists.FirstOrDefault().str16;//NIKE单据编码 item.str9 = _preorderLists.FirstOrDefault().str20; //NIKE单据编码 _preorderLists.FirstOrDefault().str6 = item.str10; ////GenderAge } //foreach (var detailitem in _preorderDetailLists) //{ // detailitem.ExternOrderNumber = _preorderLists.FirstOrDefault().ExternOrderNumber; // detailitem.str7 = _preorderLists.FirstOrDefault().str13; //Division Code // detailitem.str9 = _preorderLists.FirstOrDefault().str16;//NIKE单据编码 // _preorderLists.FirstOrDefault().str6 = detailitem.str10;////GenderAge //} //把主表不需要的清空,明细不需要的清空 _preorderLists.ForEach((item) => { item.str20 = null;// item.str16 = null; item.str17 = null; }); _preorderDetailLists.ForEach((item) => { item.str10 = null; item.str16 = null; item.str17 = null; item.str18 = null; }); requestPo.PreOrderList = _preorderLists; requestPo.PreOd = _preorderDetailLists; var response = new PreOrderService().AddPreOrderAndPreOrderDetail(requestPo, "SFTPService"); if (response.IsSuccess) { if (response.Result == null || response.Result.PreOrderList == null || response.Result.PreOrderList.Count() <= 0) { return("订单数据库插入失败,不移动文件!"); } else { return(""); } } else { return("数据库层报错:" + response.ErrorCode.ToString()); } } else { return(ReturnTxtError()); } } catch (Exception ex) { return(ex.Message.ToString()); } }