using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using siemensSapService.orm; using siemensSapService.aspEntity; using logtxtWrite; using Newtonsoft.Json; using System.Diagnostics; using System.IO; namespace siemensSapService.wcf { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“sapWcf”。 public class sapWcf : IsapWcf { /// /// 添加出库单,被 张展的iWareSAP服务调用 /// /// 要添加的plckList /// public string pickList(SaleOrder sale) { string result = ""; #region 验证传入参数/合并相同物料 if (sale.saleChild.Count == 0) { result = "出库明细数量为0!"; logtxt.txtWrite("类名:sapWcf,函数名: pickList:收到数量是0", 2); return result; } #region 合并相同物料编号的数据 //PICKlist child临时变量 List convertPickLIST = new List(); //按物料编号分组 var PickList = sale.saleChild.GroupBy(x => x.materialCode); foreach (var convertItem in PickList) { for (int i = 1; i < convertItem.ToList().Count; i++) { //数量合并到第一个 convertItem.ToList()[0].exitQty += convertItem.ToList()[i].exitQty; } convertPickLIST.Add(convertItem.ToList()[0]); } sale.saleChild = convertPickLIST; #endregion #endregion logtxt.txtWrite("类名:sapWcf,函数名: pickList:收到" + sale.saleChild.Count + "条数据", 0); try { using (dbModel mod = new dbModel()) { //出库单号/生成订单号 string orderCode = sale.orderNumber; Sale_Order checkList = mod.Sale_Order.FirstOrDefault(x => x.OrderCode == orderCode); List rstPo = sale.saleChild.Select(x => x.materialCode).ToList(); //查找物料基础数据 找到po明细物料编号在数据库里有的集合 var checkMateria1s = (from p in mod.Base_ProductInfo where (from f in rstPo select f).Contains(p.ProductCode) select p).ToList(); //有就修改没有就新建 string trackingNum = ""; if (checkList != null) { //检查明细有就修改没有就新建 List checkLists = mod.Sale_OrderList.Where(x => x.Order_Id == checkList.Order_Id).ToList(); //if (checkLists.Count < 1) //{ // logtxt.txtWrite("类名:sapWcf,函数名: pickList:更新出库单明细为" + sale.saleChild.Count + "条数据", 2); //} checkList.MaterialCount = sale.orderQuantity;//出库套数 //int unb = 0;//计数 foreach (var item in sale.saleChild) { string materialCode = item.materialCode; //unb++; Sale_OrderList isHave = checkLists.FirstOrDefault(x => x.ProductCode == item.materialCode); if (isHave != null) { //if (item.materialCode=="A7EQD-5170027509") //{ // decimal aa=item.exitQty; //} #region 修改出库单数据 // isHave.ExtendField06 = item.saleItem;//销售项号 isHave.ProductCode = materialCode;//物料编号 isHave.SmallUnit = item.stockUnit;//库存单位 isHave.ValidQuantity = item.exitQty - isHave.QuantityShipped + isHave.ValidQuantity;//未出库数量 extendField03 isHave.QuantityShipped = item.exitQty;//预出库数量 extendField03 isHave.ModifyDate = DateTime.Now; isHave.ExtendField09 = item.storageLocation;//G028 库区 continue; #endregion } else { #region 新增出库单 string materialName = "sapPickList物料"; long productId = 0; //查询物料找物料ID 没有就新建一个物料 Base_ProductInfo checkMateria = checkMateria1s.FirstOrDefault(x => x.ProductCode == materialCode); if (checkMateria != null) { productId = checkMateria.Product_Id; materialName = checkMateria.ProductName; } else { #region 检查物料基础信息里是否有这个物料没有就新建 Base_ProductInfo newMateria = new Base_ProductInfo(); newMateria.ProductCode = materialCode;//物料编号 newMateria.ProductName = materialName;//物料名称 newMateria.SmallUnit = item.stockUnit;//库存单位 newMateria.UnitConvert = 1M; newMateria.BigUnit = item.stockUnit;//采购单位 newMateria.Enable = 1;//设置为可用 /////////////// newMateria.Brand_Id = 0;//库存预警量 newMateria.ProductModel = materialCode; newMateria.Provider_Id = 926; newMateria.ProviderCode = "PV201940371"; newMateria.ProviderShortName = "默认供应商"; newMateria.Consignor_Id = 30; newMateria.ConsignorCode = "GX30"; newMateria.ConsignorName = "广州西门子"; newMateria.UserProduct_Id = 1007; newMateria.UserProductCode = "100000001"; mod.Base_ProductInfo.Add(newMateria); mod.SaveChanges(); //通过新建获取产品ID productId = newMateria.Product_Id; #endregion } if (productId == 0) { continue;//没这个物料到循环尾 } if (trackingNum == "")//一个出库单只有一个跟踪号,只需要匹配一次 { Purchase_OrderList saleList = mod.Purchase_OrderList.FirstOrDefault(x => x.ExtendField07 == sale.saleCode && x.SpecAlias == item.saleItem); trackingNum = saleList == null ? "" : saleList.ExtendField04; } int saleItem = 0; bool saleitemis0 = Int32.TryParse(item.saleItem, out saleItem); Sale_OrderList orderList = new Sale_OrderList(); orderList.Order_Id = checkList.Order_Id; orderList.ExtendField06 = item.saleItem;//销售项号 orderList.ProductCode = materialCode;//物料编号 orderList.ProductName = materialName;//物料名称 orderList.SmallUnit = item.stockUnit;//库存单位 orderList.QuantityShipped = item.exitQty;//预出库数量 extendField03 orderList.ValidQuantity = item.exitQty;//未出库数量 extendField03 orderList.ExtendField03 = "新建"; orderList.ExtendField01 = "261";//移动类型 orderList.ExtendField09 = item.storageLocation;//G028 库区 orderList.CreateDate = DateTime.Now; orderList.TrackingNumber = saleItem > 0 ? trackingNum : "";//跟踪号 orderList.SaleCode = sale.saleCode;//销售单 orderList.ExtendField10 = item.batch;//保留项号 //不为空的垃圾字段 orderList.Product_Id = productId; orderList.ProductModel = materialCode; mod.Sale_OrderList.Add(orderList); #endregion } } int numList = mod.SaveChanges(); } else { string productCode = sale.productNumber; Base_ProductInfo findProduct = mod.Base_ProductInfo.FirstOrDefault(x => x.ProductCode == productCode); string productName = "未找到产品名称"; if (findProduct != null) { productName = findProduct.ProductName; } Sale_Order saleOrder = new Sale_Order(); #region pickList主表 saleOrder.OrderCode = orderCode;//出库单号 =生产订单号=提料单号 800开头的号 saleOrder.MaterialCount = sale.orderQuantity;//订单出库套数 saleOrder.SaleCode = sale.saleCode;//销售单号 saleOrder.StoreName = sale.ReservationNumber;//保留号 saleOrder.DeptName = productName;//(产品名称)物料描述 saleOrder.PriorityNo = 0;//优先级 saleOrder.OrderType = "SAP生产订单";//单据类型 saleOrder.StorageName = "立体库"; saleOrder.StatusID = 1;//状态ID saleOrder.StatusText = "新建"; saleOrder.Client_Id = 0;//已出库套数 //不可为空垃圾字段 saleOrder.Storage_Id = 87; saleOrder.Consignor_Id = 30; saleOrder.ConsignorCode = "HZ20180002"; saleOrder.ConsignorName = "默认货主"; saleOrder.UserProduct_Id = 1007; saleOrder.CreateID = 1; saleOrder.Creator = "超级管理员"; saleOrder.CreateDate = DateTime.Now; #endregion #region 添加明细 foreach (var item in sale.saleChild) { #region 检查物料基础信息里是否有这个物料没有就新建 long productId = 0; string materialCode = item.materialCode; string materialName = "sapPickList物料"; //查询物料找物料ID 没有就新建一个物料 Base_ProductInfo checkMateria = checkMateria1s.FirstOrDefault(x => x.ProductCode == materialCode); if (checkMateria != null) { productId = checkMateria.Product_Id; materialName = checkMateria.ProductName; } else { #region 新建 Base_ProductInfo newMateria = new Base_ProductInfo(); newMateria.ProductCode = materialCode;//物料编号 newMateria.ProductName = materialName;//物料名称 newMateria.SmallUnit = item.stockUnit;//库存单位 newMateria.UnitConvert = 1M; newMateria.BigUnit = item.stockUnit;//采购单位 newMateria.Enable = 1;//设置为可用 /////////////// newMateria.Brand_Id = 0;//库存预警量 newMateria.ProductModel = materialCode; newMateria.Provider_Id = 926; newMateria.ProviderCode = "PV201940371"; newMateria.ProviderShortName = "默认供应商"; newMateria.Consignor_Id = 30; newMateria.ConsignorCode = "GX30"; newMateria.ConsignorName = "广州西门子"; newMateria.UserProduct_Id = 1007; newMateria.UserProductCode = "100000001"; mod.Base_ProductInfo.Add(newMateria); mod.SaveChanges(); //通过新建获取产品ID productId = newMateria.Product_Id; #endregion } if (productId == 0) { continue;//没这个物料到循环尾 } //查找跟踪号 if (trackingNum == "")//一个出库单只有一个跟踪号只需要匹配一次 { Purchase_OrderList saleList = mod.Purchase_OrderList.FirstOrDefault(x => x.ExtendField07 == sale.saleCode && x.SpecAlias == item.saleItem); trackingNum = saleList == null ? "" : saleList.ExtendField04; } if (trackingNum != "") { saleOrder.TrackingNumber = trackingNum; } #endregion int saleItem = 0; bool saleitemis0 = Int32.TryParse(item.saleItem, out saleItem); Sale_OrderList orderList = new Sale_OrderList(); orderList.ExtendField06 = item.saleItem;//销售项号 orderList.ProductCode = materialCode;//物料编号 orderList.ProductName = materialName;//物料名称 orderList.SmallUnit = item.stockUnit;//库存单位 orderList.QuantityShipped = item.exitQty;//预出库数量 extendField03 orderList.ValidQuantity = item.exitQty;//未出库数量 extendField03 orderList.ExtendField03 = "新建"; orderList.ExtendField01 = "261";//移动类型 orderList.ExtendField09 = item.storageLocation;//G028 库区 orderList.TrackingNumber = saleItem > 0 ? trackingNum : "";//跟踪号 orderList.SaleCode = sale.saleCode;//销售单 orderList.ExtendField10 = item.batch;//保留项号 orderList.CreateDate = DateTime.Now; //不为空的垃圾字段 orderList.Product_Id = productId; orderList.ProductModel = materialCode; saleOrder.Sale_OrderList.Add(orderList); } #endregion mod.Sale_Order.Add(saleOrder); int numList = mod.SaveChanges(); } } } catch (Exception ex) { //logtxt.txtWrite("类名:sapWcf,函数名: pickList:发生异常" + JsonConvert.SerializeObject(sale) + ex.ToString(), 2); //logtxt.txtWrite("类名:sapWcf,函数名: pickList:发生异常" + JsonConvert.SerializeObject(sale) + ex.ToString(), 2); //logtxt.txtWrite("类名:sapWcf,函数名: pickList:收到" + sale.saleChild.Count + "条数据,出现异常:" + ex.Message + ",堆栈:" + ex.StackTrace, 0); logtxt.txtWrite("类名:sapWcf,函数名: pickList:收到" + sale.saleChild.Count + "条数据,出现异常:" + ex.Message, 0); result = DateTime.Now.ToString() + "导入出库单异常" + ex.Message; } logtxt.txtWrite("类名:sapWcf,函数名: pickList:收到" + sale.saleChild.Count + "条数据,执行完毕:" + result, 0); return result; } /// /// 添加物料 /// /// 要添加的物料集合 /// public string addMaterial(List materials) { string result = ""; try { if (materials.Count == 0) { //return result = "没有传入数据"; return result = "";//返回成功 【EditBy shaocx,2022-06-17】 } //记录次数 using (dbModel mod = new dbModel()) { int num = 0; foreach (var item in materials) { num++; if (item.materialCode == null) { result += "第" + num + "条数据:物料编号为空\r\n"; continue; } string materialCode = item.materialCode; Base_ProductInfo checkMateria = mod.Base_ProductInfo.Where(x => x.ProductCode == materialCode).FirstOrDefault(); //已存在物料就修改 ,没有就新建 if (checkMateria != null) { checkMateria.ProductName = item.materialName;//物料名称 checkMateria.Weight = item.weight;//重量 checkMateria.BigUnit = item.purchaseUnit;//采购单位 checkMateria.SmallUnit = item.stockUnit;//库存单位 checkMateria.TypeName = item.Category;//物料类别; checkMateria.Creator = item.creator;//创建人 continue; } Base_ProductInfo material = new Base_ProductInfo(); material.ProductCode = item.materialCode;//物料编号 material.ProductName = item.materialName;//物料名称 material.Weight = item.weight;//重量 material.TypeName = item.Category;//物料类别; material.Brand_Id = 0;//库存预警量 material.BigUnit = item.purchaseUnit;//采购单位 material.SmallUnit = item.stockUnit;//库存单位 material.Creator = item.creator;//创建人 material.CreateDate = DateTime.Now; material.Enable = 1;//启用 material.UnitConvert = 1;//单位转换 //不为空的垃圾字段 material.Provider_Id = 926; material.ProviderCode = "PV201940371"; material.ProviderShortName = "默认供应商"; material.UserProduct_Id = 1007; material.ProductModel = item.materialCode; material.Consignor_Id = 30; material.ConsignorCode = "GX30"; material.ConsignorName = "广州西门子"; mod.Base_ProductInfo.Add(material); } mod.SaveChanges(); } //writeTxt.writeInfo("addMaterial", INFO); } catch (Exception ex) { result += "\r\n" + ex.Message; } return result; } /// /// 库存盘点,此接口被张展的iWareSAP所调用 /// /// 要核对的数据 /// 成功返回"",否则返回错误信息 public string takeStock(List stockQuantity) { //logtxt.txtWrite("类名:sapWcf,函数名: takeStock:收到盘点数据", 0); Log4NetHelper.WriteInfoLog(LogType.TakeStock, "收到盘点数据:" + JsonConvert.SerializeObject(stockQuantity)); Stopwatch deviceSw = new Stopwatch(); deviceSw.Start();//运行计算器开始记时 List sapInfo = new List(); #region 读取本地SA[库存盘点txt //var files = Directory.GetFiles("D:\\log_ShuYing"); //注意:是按照创建时间降序排列 var files = Directory.GetFiles("D:\\log_takeStock").OrderByDescending(x => new FileInfo(x).CreationTime).ToList();//盘点存放文件改为 log_takeStock 【EditBy shaocx,2022-10-12】 if (files.Count < 1) { //logtxt.txtWrite("类名:sapWcf,函数名: takeStock:收到数据为空 条", 2); Log4NetHelper.WriteInfoLog(LogType.TakeStock, "收到数据为空"); return ""; } var filePath = files[0]; var fileName = Path.GetFileName(filePath); using (var reader = new StreamReader(filePath)) { var line = reader.ReadLine(); if (line.StartsWith("MATNR")) { while (!string.IsNullOrEmpty(line)) { if (!line.StartsWith("MATNR")) { var spliterChar = Encoding.UTF8.GetString(new byte[] { 9 }); var args = line.Split(spliterChar.ToCharArray()); if (args[7] == "3TG1" && args[8] == "G021") { try { ProductStock stock = new ProductStock(); stock.SaleCode = args[11]; if (args[12] == "") { stock.SaleItem = args[12]; } else { stock.SaleItem = Convert.ToInt32(args[12]) < 1 ? "" : args[12]; } stock.materialCode = args[0]; stock.materialName = args[1]; stock.stockUnit = args[6]; stock.stockQuantity = decimal.Parse(args[19]); sapInfo.Add(stock); } catch (Exception) { } } } line = reader.ReadLine(); } } else { return ""; } } #endregion if (sapInfo.Count < 1) { //logtxt.txtWrite("类名:sapWcf,函数名: sapInfo:转换数据为空 条", 2); Log4NetHelper.WriteInfoLog(LogType.TakeStock, "sapInfo:转换数据为空"); return ""; } string result = ""; try { using (dbModel mod = new dbModel())//productCode { // DateTime todayTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd"));//今天凌晨时间 //删除之前的 盘点数据 string sql = "truncate table TakeStock "; mod.Database.ExecuteSqlCommand(sql); //立库库存数据 List stockInfo = mod.vvBase_ProductPosition.Where(x => x.PositionType == 1 && x.ProductStorage > 0).ToList(); #region 合并相同项 List stockInfoMerge = new List(); var merge = stockInfo.GroupBy(x => new { x.SaleCode, x.ExtendField08, x.ProductCode }); foreach (var item in merge) { vvBase_ProductPosition temporaryStock = new vvBase_ProductPosition(); if (item.ToList().Count > 1) { for (int k = 1; k < item.ToList().Count; k++) { temporaryStock.ProductStorage = item.ToList()[0].ProductStorage + item.ToList()[k].ProductStorage; } } else { temporaryStock.ProductStorage = item.ToList()[0].ProductStorage; } temporaryStock.SmallUnit = item.ToList()[0].SmallUnit; temporaryStock.ProductCode = item.ToList()[0].ProductCode; temporaryStock.ProductName = item.ToList()[0].ProductName; temporaryStock.SaleCode = item.ToList()[0].SaleCode; temporaryStock.ExtendField08 = item.ToList()[0].ExtendField08; stockInfoMerge.Add(temporaryStock); } int aa = mod.SaveChanges(); #endregion //SAP传过来的 销售单下数据 //立库库存里和sap数据对应的项 List stockInfoIdentical = stockInfoMerge.Where(p => sapInfo.Any(x => x.SaleCode == p.SaleCode && x.SaleItem == p.ExtendField08 && x.stockQuantity == p.ProductStorage && x.materialCode == p.ProductCode)).ToList(); //SAP库存和立库库存里数据对应的项 List sapInfoIdentical = sapInfo.Where(p => stockInfoMerge.Any(x => x.SaleCode == p.SaleCode && x.ExtendField08 == p.SaleItem && x.ProductStorage == p.stockQuantity && x.ProductCode == p.materialCode)).ToList(); #region 移除相同项 if (stockInfoIdentical.Count > 0)//移除立库库存相同项 { logtxt.txtWrite("类名:sapWcf,函数名: takeStock:盘点库存都相同的数据有:" + stockInfoIdentical.Count + "条", 0); foreach (var itemRE in stockInfoIdentical) { stockInfoMerge.Remove(itemRE); } } if (sapInfoIdentical.Count > 0)//移除SAP库存相同项 { foreach (var itemRE in sapInfoIdentical) { sapInfo.Remove(itemRE); } } #endregion //---------------------------------------------------------------------------------------------------------- //立库库存里和sap跟踪号和物料号对应且数量不对应的项 List stockInfoIdentical2 = stockInfoMerge.Where(p => sapInfo.Any(x => x.SaleCode == p.SaleCode && x.SaleItem == p.ExtendField08 && x.materialCode == p.ProductCode)).ToList(); //SAP库存和立库库存里跟踪号和物料号对应且数量不对应的项 List sapInfoIdentical2 = sapInfo.Where(p => stockInfoMerge.Any(x => x.SaleCode == p.SaleCode && x.ExtendField08 == p.SaleItem && x.ProductCode == p.materialCode)).ToList(); int matching = 0;//记录匹配失败的数量 aa = mod.SaveChanges(); TakeStock checkStatistics = new TakeStock(); checkStatistics.MateralName = "排除相同数据:" + stockInfoIdentical.Count + "条,数量差异数据:" + stockInfoIdentical2.Count + "条, " + "仅立库数据:" + stockInfoMerge.Count + "条, " + "仅SAP数据:" + sapInfo.Count + "条。"; checkStatistics.CreateDate = DateTime.Now;//创建时间 mod.TakeStock.Add(checkStatistics); int a = mod.SaveChanges(); if (sapInfoIdentical2.Count > 0) { #region 移除跟踪号和物料号对应且数量不对应的项 if (stockInfoIdentical2.Count > 0)//移除立库库存里和sap跟踪号和物料号对应且数量不对应的项 { logtxt.txtWrite("类名:sapWcf,函数名: takeStock:盘点库存都相同的数据有:" + stockInfoIdentical2.Count + "条", 0); foreach (var itemRE in stockInfoIdentical2) { stockInfoMerge.Remove(itemRE); } } if (sapInfoIdentical2.Count > 0)//移除SAP库存和立库库存里跟踪号和物料号对应且数量不对应的项 { foreach (var itemRE in sapInfoIdentical2) { sapInfo.Remove(itemRE); } } #endregion #region 写入匹配到的物料 for (int j = 0; j < sapInfoIdentical2.Count; j++) { //找出对应的立库库存数量 vvBase_ProductPosition stockInfoIdentical22 = stockInfoIdentical2.FirstOrDefault(x => x.ProductCode == sapInfoIdentical2[j].materialCode && x.SaleCode == sapInfoIdentical2[j].SaleCode && x.ExtendField08 == sapInfoIdentical2[j].SaleItem); if (sapInfoIdentical2 != null) { TakeStock check = new TakeStock(); check.ProcureCode = sapInfoIdentical2[j].SaleCode;//采购单号 check.ProcureItem = sapInfoIdentical2[j].SaleItem;//采购项号 check.MateralCode = sapInfoIdentical2[j].materialCode;//物料编号 check.MateralName = sapInfoIdentical2[j].materialName;//物料名称 check.Unit = stockInfoIdentical22.SmallUnit;//库存单位 check.SapQuantity = sapInfoIdentical2[j].stockQuantity;//SAP数量 check.Ex1 = stockInfoIdentical22.SmallUnit;//SAP单位 check.StockQuantity = stockInfoIdentical22.ProductStorage;//库存数量 // check.Ex2 = sapInfo[j].isStock == 1 ? "常规货位" : "暂存区";//库存单位 check.CreateDate = DateTime.Now;//创建时间 mod.TakeStock.Add(check); } else { matching++; } } if (matching > 0) { logtxt.txtWrite("类名:sapWcf,函数名: takeStock:相同项数量不同写入库存 匹配失败数量:" + matching + "条", 2); } #endregion } mod.SaveChanges(); #region 判断库存里有的,sap里没有的物料,如果有就写入到盘点表里 // if (stockInfoMerge.Count > 0) { foreach (var stock in stockInfoMerge) { TakeStock check = new TakeStock(); check.ProcureCode = stock.SaleCode;//销售单号 check.ProcureItem = stock.ExtendField08;//销售项号 check.MateralCode = stock.ProductCode;//物料编号 check.MateralName = stock.ProductName;//物料名称 check.Unit = "";//SAP单位 check.SapQuantity = 0;//SAP数量 check.Ex1 = stock.SmallUnit;//库存单位 check.StockQuantity = stock.ProductStorage;//库存数量 check.CreateDate = DateTime.Now;//创建时间 mod.TakeStock.Add(check); } } mod.SaveChanges(); #endregion #region 写入SAP有的库存没有的数据总和 //判断有没有库存里有的,sap里没有的物料,如果有就写入到盘点表里 if (sapInfo.Count > 0) { foreach (var sapStock in sapInfo) { TakeStock check = new TakeStock(); check.ProcureCode = sapStock.SaleCode;//销售单号 check.ProcureItem = sapStock.SaleItem;//销售项 check.MateralCode = sapStock.materialCode;//物料编号 check.MateralName = sapStock.materialName;//物料名称 check.Unit = sapStock.stockUnit;//SAP单位 check.SapQuantity = sapStock.stockQuantity;//SAP数量 check.Ex1 = "";//库存单位 check.StockQuantity = 0;//库存数量 check.CreateDate = DateTime.Now;//创建时间 mod.TakeStock.Add(check); } } #endregion int resultNum = mod.SaveChanges(); if (resultNum < 1) { result = "保存失败"; } //logtxt.txtWrite("类名:sapWcf,函数名: takeStock:盘点库存计算时间:" + deviceSw.Elapsed.ToString(), 0); Log4NetHelper.WriteInfoLog(LogType.TakeStock, "类名:sapWcf,函数名: takeStock:盘点库存计算时间:" + deviceSw.Elapsed.ToString()); deviceSw.Stop(); //处理成功后,将所有文件删除 var remove_files = Directory.GetFiles("D:\\log_takeStock"); foreach (var item in remove_files) { File.Delete(item);//文件删除 } } } catch (Exception ex) { //logtxt.txtWrite("类名:sapWcf,函数名: takeStock:异常" + ex.ToString() + ex.StackTrace.ToString(), 2); Log4NetHelper.WriteErrorLog(LogType.TakeStock, "类名:sapWcf,函数名: takeStock:异常:" + ex.Message, ex); result += "\r\n" + ex.Message; } return result; } } }