| /*using AutoMapper; | 
| using MailKit.Search; | 
| using Newtonsoft.Json; | 
| using Newtonsoft.Json.Serialization; | 
| using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using System.Linq.Expressions; | 
| using System.Text; | 
| using System.Threading.Tasks; | 
| using WIDESEA_Common.OrderEnum; | 
| using WIDESEA_Common.StockEnum; | 
| using WIDESEA_Common.WareHouseEnum; | 
| using WIDESEA_Core; | 
| using WIDESEA_Core.BaseRepository; | 
| using WIDESEA_Core.BaseServices; | 
| using WIDESEA_Core.Enums; | 
| using WIDESEA_Core.Helper; | 
| using WIDESEA_Core.Utilities; | 
| using WIDESEA_DTO.ERP; | 
| using WIDESEA_DTO.Inbound; | 
| using WIDESEA_DTO.Outbound; | 
| using WIDESEA_External.ERPService; | 
| using WIDESEA_External.Model; | 
| using WIDESEA_IBasicService; | 
| using WIDESEA_IOutboundRepository; | 
| using WIDESEA_IOutboundService; | 
| using WIDESEA_IStockRepository; | 
| using WIDESEA_IStockService; | 
| using WIDESEA_Model.Models; | 
|   | 
| namespace WIDESEA_OutboundService | 
| { | 
|     public class OutboundOrderService : ServiceBase<Dt_OutboundOrder, IOutboundOrderRepository>, IOutboundOrderService | 
|     { | 
|         private readonly IMapper _mapper; | 
|         private readonly IUnitOfWorkManage _unitOfWorkManage; | 
|         private readonly IBasicService _basicService; | 
|         private readonly IOutboundOrderDetailRepository _outboundOrderDetailRepository; | 
|         private readonly IStockInfoService _stockInfoService; | 
|         private readonly IStockInfoRepository _stockInfoRepository; | 
|         public IOutboundOrderRepository Repository => BaseDal; | 
|         private readonly IInvokeERPService _invokeERPService; | 
|         private readonly IOutStockLockInfoService _outStockLockInfoService; | 
|   | 
|         public OutboundOrderService(IOutboundOrderRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IBasicService basicService, IOutboundOrderDetailRepository outboundOrderDetailRepository, IStockInfoService stockInfoService, | 
|           IStockInfoRepository stockInfoRepository, IInvokeERPService invokeERPService, IOutStockLockInfoService outStockLockInfoService) : base(BaseDal) | 
|         { | 
|             _mapper = mapper; | 
|             _unitOfWorkManage = unitOfWorkManage; | 
|             _basicService = basicService; | 
|             _outboundOrderDetailRepository = outboundOrderDetailRepository; | 
|             _stockInfoService = stockInfoService; | 
|             _stockInfoRepository = stockInfoRepository; | 
|             _invokeERPService = invokeERPService; | 
|             _outStockLockInfoService = outStockLockInfoService; | 
|         } | 
|   | 
|         public WebResponseContent ReceiveOutOrder(ErpOutOrderDTO model) | 
|         { | 
|             try | 
|             { | 
|                 Dt_MaterielInfo materielInfo = _basicService.MaterielInfoService.Repository.QueryFirst(x => x.MaterielCode == model.MCode); | 
|                 if (materielInfo == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到该物料信息"); | 
|                 } | 
|   | 
|                 Dt_Warehouse warehouse = _basicService.WarehouseService.Repository.QueryFirst(x => x.WarehouseCode == model.WaId); | 
|                 if (warehouse == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到该仓库信息"); | 
|                 } | 
|   | 
|                 Dt_OutboundOrder oldOutboundOrder = BaseDal.Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == model.OrderNo).Includes(x => x.Details).First(); | 
|   | 
|                 if (model.Way == 1) | 
|                 { | 
|                     if (oldOutboundOrder != null) | 
|                     { | 
|                         if (oldOutboundOrder.Details.FirstOrDefault(x => x.RowNo == Convert.ToInt32(model.RowNo)) != null) | 
|                         { | 
|                             return WebResponseContent.Instance.Error($"该明细行号已存在"); | 
|                         } | 
|                         if (oldOutboundOrder.WarehouseId != warehouse.WarehouseId) | 
|                         { | 
|                             return WebResponseContent.Instance.Error($"仓库不一致"); | 
|                         } | 
|                         else | 
|                         { | 
|                             Dt_OutboundOrderDetail outboundOrderDetail = new Dt_OutboundOrderDetail() | 
|                             { | 
|                                 RowNo = Convert.ToInt32(model.RowNo), | 
|                                 BatchNo = model.MLot, | 
|                                 MaterielCode = model.MCode, | 
|                                 MaterielName = materielInfo.MaterielName, | 
|                                 OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(), | 
|                                 OrderQuantity = model.Qty, | 
|                                 OrderId = oldOutboundOrder.Id | 
|                             }; | 
|   | 
|                             if (warehouse.WarehouseCode == WarehouseEnum.HA64.ToString()) | 
|                             { | 
|                                 Dt_StockInfo stockInfo = _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId).Includes(x => x.Details).Where(x => x.Details.Any(v => v.BatchNo == model.MLot)).First(); | 
|                                 if (stockInfo == null) | 
|                                 { | 
|                                     return WebResponseContent.Instance.Error($"库存不足"); | 
|                                 } | 
|                                 //更改状态 | 
|                                 stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt(); | 
|                                 stockInfo.Details.ForEach(x => { x.Remark = oldOutboundOrder.OrderNo; }); | 
|   | 
|                                 Db.Updateable(stockInfo.Details); | 
|                                 _stockInfoRepository.UpdateData(stockInfo); | 
|                             } | 
|                             _outboundOrderDetailRepository.AddData(outboundOrderDetail); | 
|                         } | 
|                     } | 
|                     else | 
|                     { | 
|                         Dt_OutboundOrderDetail outboundOrderDetail = new Dt_OutboundOrderDetail() | 
|                         { | 
|                             RowNo = Convert.ToInt32(model.RowNo), | 
|                             BatchNo = model.MLot, | 
|                             MaterielCode = model.MCode, | 
|                             MaterielName = materielInfo.MaterielName, | 
|                             OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(), | 
|                             OrderQuantity = model.Qty, | 
|                         }; | 
|                         Dt_OutboundOrder outboundOrder = new Dt_OutboundOrder() | 
|                         { | 
|                             OrderNo = model.OrderNo, | 
|                             UpperOrderNo = model.OrderNo, | 
|                             OrderStatus = OutOrderStatusEnum.未开始.ObjToInt(), | 
|                             OrderType = OutOrderTypeEnum.Issue.ObjToInt(), | 
|                             CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(), | 
|                             WarehouseId = warehouse.WarehouseId, | 
|                             DepartmentCode = model.DepartmentCode, | 
|                             DepartmentName = model.DepartmentName, | 
|                             Details = new List<Dt_OutboundOrderDetail> { outboundOrderDetail } | 
|                         }; | 
|   | 
|                         _unitOfWorkManage.BeginTran(); | 
|                         Db.InsertNav(outboundOrder).Include(x => x.Details).ExecuteCommand(); | 
|   | 
|                         if (warehouse.WarehouseCode == WarehouseEnum.HA64.ToString()) | 
|                         { | 
|                             Dt_StockInfo stockInfo = _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId).Includes(x => x.Details).Where(x => x.Details.Any(v => v.BatchNo == model.MLot)).First(); | 
|                             if (stockInfo == null) | 
|                             { | 
|                                 return WebResponseContent.Instance.Error($"库存不足"); | 
|                             } | 
|   | 
|                             //更改状态 | 
|                             stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt(); | 
|                             stockInfo.Details.ForEach(x => { x.Remark = outboundOrder.OrderNo; }); | 
|                             _stockInfoRepository.UpdateData(stockInfo); | 
|                             Db.Updateable(stockInfo.Details); | 
|                         } | 
|                         _unitOfWorkManage.CommitTran(); | 
|                     } | 
|                 } | 
|                 else if (model.Way == 2) | 
|                 { | 
|                     if (oldOutboundOrder == null) | 
|                     { | 
|                         return WebResponseContent.Instance.Error($"未找到该出库单"); | 
|                     } | 
|                     Dt_OutboundOrderDetail? outboundOrderDetail = oldOutboundOrder.Details.FirstOrDefault(x => x.RowNo == Convert.ToInt32(model.RowNo)); | 
|                     if (outboundOrderDetail == null) | 
|                     { | 
|                         return WebResponseContent.Instance.Error($"未找到该明细行号信息"); | 
|                     } | 
|                     if (outboundOrderDetail.OrderDetailStatus != OrderDetailStatusEnum.New.ObjToInt()) | 
|                     { | 
|                         return WebResponseContent.Instance.Error($"该明细不可修改"); | 
|                     } | 
|                     outboundOrderDetail = new Dt_OutboundOrderDetail() | 
|                     { | 
|                         RowNo = Convert.ToInt32(model.RowNo), | 
|                         BatchNo = model.MLot, | 
|                         MaterielCode = model.MCode, | 
|                         MaterielName = materielInfo.MaterielName, | 
|                         OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(), | 
|                         OrderQuantity = model.Qty, | 
|                     }; | 
|   | 
|                     _outboundOrderDetailRepository.UpdateData(outboundOrderDetail); | 
|                 } | 
|                 else if (model.Way == 3) | 
|                 { | 
|                     if (oldOutboundOrder == null) | 
|                     { | 
|                         return WebResponseContent.Instance.Error($"未找到该出库单"); | 
|                     } | 
|                 } | 
|   | 
|                 return WebResponseContent.Instance.OK(); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 _unitOfWorkManage.RollbackTran(); | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|   | 
|         public WebResponseContent TestOutUpload(Dt_OutboundOrder outboundOrder, Dt_StockInfo stockInfo, string warehouseCode) | 
|         { | 
|             try | 
|             { | 
|                 List<ERPPickItemModel> eRPOutPick = new List<ERPPickItemModel>(); | 
|                 ERPPickItemModel pickItemModel = new ERPPickItemModel() | 
|                 { | 
|                     Lotno = stockInfo.Details[0].BatchNo, | 
|                     Qty = stockInfo.Details[0].StockQuantity.ObjToInt().ToString(), | 
|                     Location = warehouseCode | 
|                 }; | 
|                 eRPOutPick.Add(pickItemModel); | 
|   | 
|                 ERPPickModel pickModel = new ERPPickModel() | 
|                 { | 
|                     Rowindex = outboundOrder.Details[0].RowNo, | 
|                     Material = outboundOrder.Details[0].MaterielCode, | 
|                     Qty = (outboundOrder.Details[0].OrderQuantity.ObjToInt()).ToString(), | 
|                     Dataitem = eRPOutPick | 
|                 }; | 
|   | 
|                 ERPIssueItemModel issueItemModel = new ERPIssueItemModel() | 
|                 { | 
|                     Pickcode = outboundOrder.UpperOrderNo, | 
|                     PickList = new List<ERPPickModel>() { pickModel } | 
|                 }; | 
|                 ERPIssueModel issueModel = new ERPIssueModel() | 
|                 { | 
|                     UniqueTag = outboundOrder.Id.ToString(), | 
|                     Code = outboundOrder.OrderNo,//测试 | 
|                     WarehouseCode = warehouseCode, | 
|                     Docremark = "", | 
|                     Deptno = outboundOrder.DepartmentCode, | 
|                     Deptname = outboundOrder.DepartmentName, | 
|                     Createtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), | 
|                     Createuser = outboundOrder.Creater, | 
|                     Issitem = new List<ERPIssueItemModel>() { issueItemModel }, | 
|                 }; | 
|   | 
|                 string response = _invokeERPService.InvokeOutStandardsApi(issueModel); | 
|                 ErpRequestContent requestContent = response.DeserializeObject<ErpRequestContent>(); | 
|                 if (requestContent.res == 1) | 
|                 { | 
|                     return WebResponseContent.Instance.OK(); | 
|                 } | 
|                 else | 
|                 { | 
|                     return WebResponseContent.Instance.Error(requestContent.Data); | 
|                 } | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|   | 
|         //上报出库完成 | 
|         public WebResponseContent TestOutUpload(int id, Dt_StockInfo stockInfo) | 
|         { | 
|             try | 
|             { | 
|                 Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.Id == id).Includes(x => x.Details).First(); | 
|                 Dt_Warehouse warehouse = _basicService.WarehouseService.Repository.QueryFirst(x => x.WarehouseId == outboundOrder.WarehouseId); | 
|                 //测试架库给ERP上报出库完成 | 
|                 ERPIssueModel issueModel = new ERPIssueModel(); | 
|                 List<Dt_StockInfo> stockInfos = new List<Dt_StockInfo>(); | 
|                 if (stockInfo == null) | 
|                 { | 
|                     stockInfos = TestOutStocksUpdate(warehouse).Data as List<Dt_StockInfo> ?? new List<Dt_StockInfo>(); | 
|                     List<ERPPickItemModel> eRPOutPick = new List<ERPPickItemModel>(); | 
|                     for (int i = 0; i < stockInfos.Count; i++) | 
|                     { | 
|                         ERPPickItemModel pickItemModel = new ERPPickItemModel() | 
|                         { | 
|                             Lotno = stockInfos[i].Details[0].BatchNo, | 
|                             Qty = stockInfos[i].Details[0].StockQuantity.ObjToInt().ToString(), | 
|                             Location = warehouse.WarehouseCode | 
|                         }; | 
|                         eRPOutPick.Add(pickItemModel); | 
|                     } | 
|   | 
|                     ERPPickModel pickModel = new ERPPickModel() | 
|                     { | 
|                         Rowindex = outboundOrder.Details[0].RowNo, | 
|                         Material = outboundOrder.Details[0].MaterielCode, | 
|                         Qty = (outboundOrder.Details[0].OrderQuantity.ObjToInt()).ToString(), | 
|                         Dataitem = eRPOutPick | 
|                     }; | 
|   | 
|                     ERPIssueItemModel issueItemModel = new ERPIssueItemModel() | 
|                     { | 
|                         Pickcode = outboundOrder.UpperOrderNo, | 
|                         PickList = new List<ERPPickModel>() { pickModel } | 
|                     }; | 
|                     issueModel = new ERPIssueModel() | 
|                     { | 
|                         UniqueTag = id.ToString(), | 
|                         WarehouseCode = warehouse.WarehouseCode, | 
|                         Docremark = "", | 
|                         Deptno = outboundOrder.DepartmentCode, | 
|                         Deptname = outboundOrder.DepartmentName, | 
|                         Createtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), | 
|                         Createuser = outboundOrder.Creater, | 
|                         Issitem = new List<ERPIssueItemModel>() { issueItemModel }, | 
|                     }; | 
|                 } | 
|                 else | 
|                 { | 
|                     Dt_OutboundOrderDetail orderDetail = outboundOrder.Details.FirstOrDefault(x => x.MaterielCode == stockInfo.Details[0].MaterielCode); | 
|   | 
|                     ERPPickItemModel pickItemModel = new ERPPickItemModel() | 
|                     { | 
|                         Lotno = stockInfo.Details[0].BatchNo, | 
|                         Qty = stockInfo.Details[0].StockQuantity.ObjToInt().ToString(), | 
|                         Location = stockInfo.LocationCode | 
|                     }; | 
|                     ERPPickModel pickModel = new ERPPickModel() | 
|                     { | 
|                         Rowindex = outboundOrder.Details[0].RowNo, | 
|                         Material = outboundOrder.Details[0].MaterielCode, | 
|                         Qty = (outboundOrder.Details[0].OrderQuantity.ObjToInt()).ToString(), | 
|                         Dataitem = new List<ERPPickItemModel> { pickItemModel } | 
|                     }; | 
|                     ERPIssueItemModel issueItemModel = new ERPIssueItemModel() | 
|                     { | 
|                         Pickcode = outboundOrder.UpperOrderNo, | 
|                         PickList = new List<ERPPickModel>() { pickModel } | 
|                     }; | 
|                     issueModel = new ERPIssueModel() | 
|                     { | 
|                         UniqueTag = id.ToString(), | 
|                         Code = outboundOrder.OrderNo,//测试 | 
|                         WarehouseCode = warehouse.WarehouseCode, | 
|                         Docremark = "", | 
|                         Deptno = outboundOrder.DepartmentCode, | 
|                         Deptname = outboundOrder.DepartmentName, | 
|                         Createtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), | 
|                         Createuser = outboundOrder.Creater, | 
|                         Issitem = new List<ERPIssueItemModel>() { issueItemModel }, | 
|                     }; | 
|                 } | 
|   | 
|                 string response = _invokeERPService.InvokeOutStandardsApi(issueModel); | 
|                 ErpRequestContent requestContent = response.DeserializeObject<ErpRequestContent>(); | 
|                 if (requestContent.res == 1) | 
|                 { | 
|                     if (stockInfos.Count > 0) | 
|                     { | 
|                         _stockInfoRepository.UpdateData(stockInfos); | 
|                     } | 
|                     return WebResponseContent.Instance.OK(requestContent.Data); | 
|                 } | 
|                 else | 
|                 { | 
|                     return WebResponseContent.Instance.Error(requestContent.Data); | 
|                 } | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|         /// <summary> | 
|         /// 更改出库单库存状态 | 
|         /// </summary> | 
|         /// <param name="warehouse"></param> | 
|         /// <param name="model"></param> | 
|         /// <returns></returns> | 
|         public WebResponseContent TestOutStocksUpdate(Dt_Warehouse warehouse) | 
|         { | 
|             try | 
|             { | 
|                 //获取出库单库存 | 
|                 List<Dt_StockInfo> stockInfos = _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId).Includes(x => x.Details).ToList(); | 
|                 if (stockInfos.Count <= 0) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"库存不足"); | 
|                 } | 
|                 //更改状态 | 
|                 stockInfos.ForEach(x => | 
|                 { | 
|                     x.StockStatus = StockStatusEmun.入库完成.ObjToInt(); | 
|                 }); | 
|                 return WebResponseContent.Instance.OK("成功", stockInfos); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|     } | 
| }*/ |