using HH.Redis.ReisModel; using HH.WMS.BLL; using HH.WMS.BLL.Basic; using HH.WMS.BLL.Common; using HH.WMS.BLL.InStock; using HH.WMS.Common; using HH.WMS.Entitys; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.Common; using HH.WMS.WebApi.Areas.Common.Controllers; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using System.Xml; namespace HH.WMS.WebApi.Areas.InStock.Controllers { public class XmlUpController : BaseController { #region Xml文件导入 /// /// Xml文件导入 /// /// 审批实体 /// /// [HANHE(XDL)] CREATED BY 2018-11-30 [HttpPost] public OperateResult ImportXmlDataString(dynamic entityStr) { string tokenId = entityStr.tokenId.ToString(); try { return ValidateToken(tokenId, t => { //最终实体 List uniqueEntityList = new List(); string stream = entityStr.streamStr.ToString(); var newStr = stream.Replace("[\"", "").Replace("\"]", "").Replace("\",\"", ","); string[] splitXml = newStr.Split(','); //当存在多文件时,使用循环 foreach (var splitnewStr in splitXml) { XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(splitnewStr.Replace("\\", "").Trim()); XmlNodeList listNode = xmldoc.SelectSingleNode("DataList").ChildNodes; //获取Product节点下的所有节点列表 //到Product一级 foreach (XmlNode node in listNode) { XmlElement xe = (XmlElement)node; var productName = xe.GetAttribute("productName"); //产品名称 var pzwh = xe.GetAttribute("pzwh"); //批准文号 XmlNodeList xnfChild = xe.ChildNodes; //到Batch一级 foreach (XmlNode child in xnfChild) { XmlElement xmlchild = (XmlElement)child; List dataCodeList = new List(); XmlNodeList xnfDataChild = xmlchild.ChildNodes; //到Data一级 foreach (XmlNode datachild in xnfDataChild) { XmlElement xmldatachild = (XmlElement)datachild; var dataCode = xmldatachild.GetAttribute("code"); //所有Data dataCodeList.Add(dataCode); } var res = BLLCreator.Create().GetValue(dataCodeList[0]); if (res != null) { return OperateResult.Error("该XML已上传,请选择其他未上传的XML文件!"); } //创建实体 uniqueEntityList = DoCreateEntity(productName, pzwh, xmlchild, dataCodeList, t); } } } // OperateResult or = BLLCreator.Create().AddList(uniqueEntityList, "TN_WM_B_UNIQUE_BARCODE"); //SqlBulkCopy不支持事务,没法trans OperateResult or = BLLCreator.Create().AddList(uniqueEntityList); if (or.Success)//mongo不支持事务,没法trans { or = BLLCreator.Create().AddList(TempList, "MONGO_KEYTYPE_MAP"); } return or; }); } catch (Exception ex) { return OperateResult.Error(ex.Message); } } /// /// 拼接实体 /// /// 产品名称 /// 批准文号 /// xml节点 /// 所有Data的List集合 /// 用户实体 /// private List DoCreateEntity(string productName, string pzwh, XmlElement xmlchild, List dataCodeList, RedisUserEntity userEntity) { var specification = xmlchild.GetAttribute("specification"); //包装规格 var batchNo = xmlchild.GetAttribute("batchNo"); //批次编码 AutoBomItemEntity itemEntity = new AutoBomItemEntity(); List itemEnityList = BLLCreator.Create().GetItemByNameSpec(productName, specification); Log.Info("XML导入获取mongo实体", JsonConvert.SerializeObject(itemEnityList)); bool noExist = false; if (itemEnityList != null) { if (itemEnityList.Any()) { if (itemEnityList.Count == 1)//mongo返回单条 { itemEntity = itemEnityList[0]; } else { List inDtlEntity = BLLCreator.Create().GetDtlByBatch(batchNo); Log.Info("XML导入获取入库单实体", JsonConvert.SerializeObject(inDtlEntity)); if (inDtlEntity.Count > 0) { noExist = true; } else { if (inDtlEntity.Count == 1) { string itemCode = inDtlEntity[0].CN_S_ITEM_CODE; itemEntity = BLLCreator.Create().GetItem(itemCode); } else { var entity = inDtlEntity.Where(x => x.CN_S_ITEM_NAME.Contains(productName)).ToList(); Log.Info("XML导入匹配产品名称", JsonConvert.SerializeObject(entity)); if (entity.Count != 1) { Exception ex = new Exception("在入库单明细表中未找到或找到多条生产批次是<" + batchNo + ">的数据!"); throw ex; } else { string itemCode = inDtlEntity[0].CN_S_ITEM_CODE; itemEntity = BLLCreator.Create().GetItem(itemCode); } } } } } else { noExist = true; } } else { noExist = true; } if (noExist)//不存在、抛异常 { Exception ex = new Exception("未找到物料<" + productName + ">的Mongo实体!"); throw ex; } List uniqueEntityList = new List(); var tagRatio = xmlchild.GetAttribute("tagRatio");//级别 int position = Convert.ToInt32(tagRatio.Split(':')[1]); if (tagRatio.Split(':').Length == 2) { uniqueEntityList = ForeachData(productName, pzwh, xmlchild, dataCodeList, "", itemEntity, userEntity); } if (tagRatio.Split(':').Length == 3) { string[] tagRatios = tagRatio.Split(':'); var foreachCount = Convert.ToInt32(tagRatios[0]) + Convert.ToInt32(tagRatios[1]) + Convert.ToInt32(tagRatios[2]); var boci = 0; List foreachList = new List(); for (int i = 1; i <= (dataCodeList.Count) / foreachCount; i++) { foreachList = dataCodeList.GetRange(boci * foreachCount, foreachCount); var list = ForeachData(productName, pzwh, xmlchild, foreachList, foreachList[foreachList.Count - 1], itemEntity, userEntity); uniqueEntityList.AddRange(list); boci++; } } return uniqueEntityList; } List TempList = new List() { }; /// /// 内部循环 /// /// 产品名称 /// 批准文号 /// xml节点 /// 所有Data的List集合 /// 结束点 /// Item实体 /// 用户实体 /// private List ForeachData(string productName, string pzwh, XmlElement xmlchild, List dataCodeList, string endCode, AutoBomItemEntity itemEnity, RedisUserEntity userEntity) { List uniqueEntityList = new List(); var batchNo = xmlchild.GetAttribute("batchNo"); //批次编码 var specification = xmlchild.GetAttribute("specification"); //包装规格 var minPackUnit = xmlchild.GetAttribute("minPackUnit"); // var minTagUnit = xmlchild.GetAttribute("minTagUnit"); // var tagPackRatio = xmlchild.GetAttribute("tagPackRatio"); // var produceDate = xmlchild.GetAttribute("produceDate"); // var operatorName = xmlchild.GetAttribute("operator"); // var oprDate = xmlchild.GetAttribute("oprDate"); // var count = xmlchild.GetAttribute("count"); // var countUnit = xmlchild.GetAttribute("countUnit"); // var tagRatio = xmlchild.GetAttribute("tagRatio"); // int position = Convert.ToInt32(tagRatio.Split(':')[1]); int xiangPos = 1; //标记箱码位置 int foreachIndex = 0; //标记循环位置 foreach (var dataCode in dataCodeList) { string[] tagRatios = tagRatio.Split(':'); var qty = 0; var unit = ""; int packingJb = tagRatios.Length; if (foreachIndex != xiangPos * position + (xiangPos - 1)) { if (dataCode == endCode) { if (packingJb == 2)// 盒/箱两级的情况下,这个条件就是箱码的包装数量和单位 { qty = Convert.ToInt32(tagRatios[1]) / (Convert.ToInt32(tagRatios[0])); unit = qty + "盒/箱"; } if (packingJb == 3)// 支/盒/箱三级的情况下,这个条件就是箱码的包装数量和单位 { qty = Convert.ToInt32(tagRatios[2]) / (Convert.ToInt32(tagRatios[0])); unit = qty + minPackUnit + "/" + minTagUnit; } } TN_WM_B_UNIQUE_BARCODEEntity bar = new TN_WM_B_UNIQUE_BARCODEEntity(); bar.CN_S_CODE = dataCode; bar.CN_S_CODE_TYPE = ""; bar.CN_S_PARENT_CODE = (dataCode == endCode) ? "" : dataCodeList[xiangPos * position + (xiangPos - 1)]; bar.CN_S_PRODUCT_NAME = productName; bar.CN_S_PZWH = pzwh; bar.CN_S_BATCH_NO = batchNo; bar.CN_S_SPECIFICATION = specification; bar.CN_S_MIN_PACK_UNIT = minPackUnit; bar.CN_S_MIN_TAG_UNIT = minTagUnit; bar.CN_S_TAG_PACK_RATIO = tagPackRatio; bar.CN_T_PRODUCT_DATE = Convert.ToDateTime(produceDate); bar.CN_S_OPERATOR = operatorName; bar.CN_T_OPR_DATE = Convert.ToDateTime(oprDate); bar.CN_F_QUANTITY = Convert.ToInt32(count); bar.CN_S_QUANTITY_UNIT = countUnit; bar.CN_S_TAG_RATIO = tagRatio; bar.CN_S_CREATOR = userEntity.CN_S_LOGIN; bar.CN_S_CREATOR_BY = userEntity.CN_S_NAME; bar.CN_T_CREATE = DateTime.Now; bar.CN_S_MODIFY = userEntity.CN_S_LOGIN; bar.CN_S_MODIFY_BY = userEntity.CN_S_NAME; bar.CN_T_MODIFY = DateTime.Now; bar.CN_S_PACKING_UNIT = unit; bar.CN_F_PACKING_QTY = qty; bar.CN_S_ITEM_CODE = itemEnity.CN_S_ITEM_CODE; bar.CN_S_ITEM_NAME = itemEnity.CN_S_ITEM_NAME; bar.CN_S_MEASURE_UNIT = itemEnity.CN_S_MEASURE_UNIT; bar.CN_S_MODEL = itemEnity.CN_S_MODEL; bar.CN_S_ITEM_STATE = "待检";//Constants.DefaultItemState; bar.CN_S_OWNER = Constants.DefaultOwner; uniqueEntityList.Add(bar); } else { if (dataCode != endCode) { if (packingJb == 2)// 盒/箱三级的情况下,这个条件就是箱码的包装数量和单位 { qty = Convert.ToInt32(tagRatios[1]) / (Convert.ToInt32(tagRatios[0])); unit = qty + "盒/箱"; //minPackUnit + "/" + minTagUnit; } if (packingJb == 3)// 支/盒/箱三级的情况下,这个条件就是箱码的包装数量和单位 { qty = Convert.ToInt32(tagRatios[2]) / (Convert.ToInt32(tagRatios[0])); unit = qty + minPackUnit + "/" + minTagUnit; } } TN_WM_B_UNIQUE_BARCODEEntity bar = new TN_WM_B_UNIQUE_BARCODEEntity(); bar.CN_S_CODE = dataCode; bar.CN_S_CODE_TYPE = ""; bar.CN_S_PARENT_CODE = endCode; bar.CN_S_PRODUCT_NAME = productName; bar.CN_S_PZWH = pzwh; bar.CN_S_BATCH_NO = batchNo; bar.CN_S_SPECIFICATION = specification; bar.CN_S_MIN_PACK_UNIT = minPackUnit; bar.CN_S_MIN_TAG_UNIT = minTagUnit; bar.CN_S_TAG_PACK_RATIO = tagPackRatio; bar.CN_T_PRODUCT_DATE = Convert.ToDateTime(produceDate); bar.CN_S_OPERATOR = operatorName; bar.CN_T_OPR_DATE = Convert.ToDateTime(oprDate); bar.CN_F_QUANTITY = Convert.ToInt32(count); bar.CN_S_QUANTITY_UNIT = countUnit; bar.CN_S_TAG_RATIO = tagRatio; bar.CN_S_CREATOR = userEntity.CN_S_LOGIN; bar.CN_S_CREATOR_BY = userEntity.CN_S_NAME; bar.CN_T_CREATE = DateTime.Now; bar.CN_S_MODIFY = userEntity.CN_S_LOGIN; bar.CN_S_MODIFY_BY = userEntity.CN_S_NAME; bar.CN_T_MODIFY = DateTime.Now; bar.CN_S_PACKING_UNIT = unit; bar.CN_F_PACKING_QTY = qty; bar.CN_S_ITEM_CODE = itemEnity.CN_S_ITEM_CODE; bar.CN_S_ITEM_NAME = itemEnity.CN_S_ITEM_NAME; bar.CN_S_MEASURE_UNIT = itemEnity.CN_S_MEASURE_UNIT; bar.CN_S_MODEL = itemEnity.CN_S_MODEL; bar.CN_S_ITEM_STATE = "待检"; bar.CN_S_OWNER = Constants.DefaultOwner; uniqueEntityList.Add(bar); if ((xiangPos + 1) * position == dataCodeList.Count) { continue; } xiangPos++; } TempList.Add(new MONGO_KEYTYPE_MAP { Key = dataCode, Type = "2" }); foreachIndex++; } return uniqueEntityList; } #endregion #region 查询数据集 /// /// 获取Xml列表 /// /// 查询实体(页码,显示条数,条件等) /// /// [HANHE(XDL)] CREATED BY 2018-11-30 [HttpPost] public string GetXmlList(SearchModel searchModel) { try { return ValidateToken(searchModel.TokenId, t => { //根据tokenId 获取当前登陆信息 OperateResult resultInfo = GetTokenInfo(searchModel.TokenId); if (!resultInfo.Success) return JsonConvert.SerializeObject(resultInfo); IsoDateTimeConverter timeFormat = new IsoDateTimeConverter(); timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; OperateResult pagingList = BLLCreator.Create().GetXmlList(searchModel); return JsonConvert.SerializeObject(pagingList, timeFormat); }); } catch (Exception ex) { return JsonConvert.SerializeObject(OperateResult.Error(ex.ToString())); throw; } } #endregion } }