| using AutoMapper; | 
| using MailKit.Search; | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using System.Text; | 
| using System.Threading.Tasks; | 
| using WIDESEA_Common.CommonEnum; | 
| using WIDESEA_Common.OrderEnum; | 
| using WIDESEA_Core; | 
| using WIDESEA_Core.BaseRepository; | 
| using WIDESEA_Core.BaseServices; | 
| using WIDESEA_Core.Helper; | 
| using WIDESEA_DTO; | 
| using WIDESEA_DTO.Basic; | 
| using WIDESEA_DTO.ERP; | 
| using WIDESEA_External.ERPService; | 
| using WIDESEA_External.Model; | 
| using WIDESEA_IBasicRepository; | 
| using WIDESEA_ICheckRepository; | 
| using WIDESEA_IInboundRepository; | 
| using WIDESEA_IInboundService; | 
| using WIDESEA_Model.Models; | 
|   | 
| namespace WIDESEA_InboundService | 
| { | 
|     public class ReceiveOrderService : ServiceBase<Dt_ReceiveOrder, IReceiveOrderRepository>, IReceiveOrderService | 
|     { | 
|         private readonly IUnitOfWorkManage _unitOfWorkManage; | 
|         private readonly IMapper _mapper; | 
|         private readonly ICheckOrderRepository _checkOrderRepository; | 
|         private readonly IInboundRepository _inboundRepository; | 
|         private readonly IBasicRepository _basicRepository; | 
|         private readonly IInvokeERPService _invokeERPService; | 
|   | 
|         public ReceiveOrderService(IReceiveOrderRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IMapper mapper, ICheckOrderRepository checkOrderRepository, IInboundRepository inboundRepository, IBasicRepository basicRepository, IInvokeERPService invokeERPService) : base(BaseDal) | 
|         { | 
|             _mapper = mapper; | 
|             _unitOfWorkManage = unitOfWorkManage; | 
|             _checkOrderRepository = checkOrderRepository; | 
|             _inboundRepository = inboundRepository; | 
|             _basicRepository = basicRepository; | 
|             _invokeERPService = invokeERPService; | 
|         } | 
|   | 
|         public override WebResponseContent AddData(SaveModel saveModel) | 
|         { | 
|             if (saveModel.MainData.ContainsKey(nameof(Dt_ReceiveOrder.ReceiveOrderStatus).FirstLetterToLower())) | 
|             { | 
|                 saveModel.MainData[nameof(Dt_ReceiveOrder.ReceiveOrderStatus).FirstLetterToLower()] = ReceiveOrderStatusEnum.NotStarted.ObjToInt(); | 
|             } | 
|             else | 
|             { | 
|                 saveModel.MainData.Add(nameof(Dt_ReceiveOrder.ReceiveOrderStatus).FirstLetterToLower(), ReceiveOrderStatusEnum.NotStarted.ObjToInt()); | 
|             } | 
|             if (saveModel.MainData.ContainsKey(nameof(Dt_ReceiveOrder.UploadStatus).FirstLetterToLower())) | 
|             { | 
|                 saveModel.MainData[nameof(Dt_ReceiveOrder.UploadStatus).FirstLetterToLower()] = WhetherEnum.False.ObjToInt(); | 
|             } | 
|             else | 
|             { | 
|                 saveModel.MainData.Add(nameof(Dt_ReceiveOrder.UploadStatus).FirstLetterToLower(), WhetherEnum.False.ObjToInt()); | 
|             } | 
|             if (saveModel.MainData.ContainsKey(nameof(Dt_ReceiveOrder.ReceiveDate).FirstLetterToLower())) | 
|             { | 
|                 saveModel.MainData[nameof(Dt_ReceiveOrder.ReceiveDate).FirstLetterToLower()] = DateTime.Now; | 
|             } | 
|             else | 
|             { | 
|                 saveModel.MainData.Add(nameof(Dt_ReceiveOrder.ReceiveDate).FirstLetterToLower(), DateTime.Now); | 
|             } | 
|   | 
|             if (saveModel.MainData.TryGetValue(nameof(Dt_ReceiveOrder.SuppliersId).FirstLetterToLower(), out object? suppliersId) && suppliersId != null && !string.IsNullOrEmpty(suppliersId.ToString())) | 
|             { | 
|                 Dt_ReceiveOrder receiveOrder = BaseDal.QueryFirst(x => x.SuppliersId == suppliersId.ToString() && x.WarehouseId == Convert.ToInt32(saveModel.MainData[nameof(Dt_ReceiveOrder.WarehouseId).FirstLetterToLower()])); | 
|                 if (receiveOrder != null && receiveOrder.ReceiveOrderStatus != ReceiveOrderStatusEnum.Completed.ObjToInt()) | 
|                 { | 
|                     return WebResponseContent.Instance.Error("该供应商有未完成的收货单"); | 
|                 } | 
|             } | 
|   | 
|             return base.AddData(saveModel); | 
|         } | 
|         /// <summary> | 
|         /// 收货完成并回传ERP | 
|         /// </summary> | 
|         /// <param name="orderId"></param> | 
|         /// <returns></returns> | 
|         public WebResponseContent FeedbackReceiveOrder(int orderId) | 
|         { | 
|             try | 
|             { | 
|                 Dt_ReceiveOrder receiveOrder = BaseDal.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderId == orderId).Includes(x => x.Details).First(); | 
|                 if (receiveOrder == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到收货单"); | 
|                 } | 
|                 if (receiveOrder.ReceiveOrderStatus == ReceiveOrderStatusEnum.Completed.ObjToInt()) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"收货单已完成"); | 
|                 } | 
|                 if (receiveOrder.Details == null || receiveOrder.Details.Count == 0) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到收货单明细"); | 
|                 } | 
|   | 
|                 Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == receiveOrder.WarehouseId); | 
|                 if (warehouse == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到仓库信息"); | 
|                 } | 
|   | 
|                 List<RecevieOrderDetailModel> recevieOrderDetails = new List<RecevieOrderDetailModel>(); | 
|                 foreach (var item in receiveOrder.Details) | 
|                 { | 
|                     RecevieOrderDetailModel recevieOrderDetail = new RecevieOrderDetailModel() | 
|                     { | 
|                         Currcode = "", | 
|                         IfInspection = item.IfInspection, | 
|                         Lotno = item.LotNo, | 
|                         MaterialsId = item.MaterielCode, | 
|                         PriceInTax = 0, | 
|                         PurchaseOrderCode = item.PurchaseOrderNo, | 
|                         PurchaseOrderSerno = item.PurchaseOrderDetailRowNo, | 
|                         QtyRecieved = item.ReceivedQuantity.ObjToInt(), | 
|                         Serno = item.RowNo, | 
|                         Supplotno = "", | 
|                         Taxrate = "", | 
|   | 
|                     }; | 
|                     recevieOrderDetails.Add(recevieOrderDetail); | 
|                 } | 
|   | 
|                 ERPReceiveModel receiveModel = new ERPReceiveModel() | 
|                 { | 
|                     Code = receiveOrder.ReceiveOrderNo, | 
|                     DeliveryCode = receiveOrder.DeliveryCode, | 
|                     CustomerId = receiveOrder.CustomerId, | 
|                     CreatorId = receiveOrder.Creater, | 
|                     EntDate = receiveOrder.CreateDate.ToString("yyyy-MM-dd HH:mm:ss"), | 
|                     ReceiveDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), | 
|                     SuppliersId = receiveOrder.SuppliersId, | 
|                     Type = Enum.GetName(typeof(ReceiveOrderTypeEnum), receiveOrder.ReceiveOrderType) ?? throw new Exception($"采购单类型错误"), | 
|                     UniqueTag = receiveOrder.ReceiveOrderId.ToString(), | 
|                     WarehouseCode = warehouse.WarehouseCode, | 
|                     Way = 1, | 
|                     Details = recevieOrderDetails | 
|                 }; | 
|                  | 
|                 //更新收货单信息 | 
|                 receiveOrder.ReceiveOrderStatus = ReceiveOrderStatusEnum.Completed.ObjToInt(); | 
|                 receiveOrder.UploadStatus = WhetherEnum.True.ObjToInt(); | 
|                 BaseDal.UpdateData(receiveOrder); | 
|                 //创建入库单 | 
|                 CreateInboundOrder(orderId); | 
|                 //收货推送至ERP 测试注释 | 
|                 _invokeERPService.InvokeMatReceiveApi(receiveModel); | 
|                 return WebResponseContent.Instance.OK(); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|   | 
|         public WebResponseContent GetReceiveOrders(SaveModel saveModel) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 int pageNo = saveModel.MainData["pageNo"].ObjToInt(); | 
|                 int warehouseId = saveModel.MainData["warehouseId"].ObjToInt(); | 
|                 string orderNo = saveModel.MainData["orderNo"].ToString(); | 
|                 List<Dt_ReceiveOrder> dt_ReceiveOrders = new List<Dt_ReceiveOrder>(); | 
|                 if (string.IsNullOrEmpty(orderNo)) | 
|                 { | 
|                     dt_ReceiveOrders = Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderStatus < ReceiveOrderStatusEnum.Completed.ObjToInt() && x.WarehouseId == warehouseId).ToPageList(pageNo, 5); | 
|                 } | 
|                 else | 
|                 { | 
|                     dt_ReceiveOrders = Db.Queryable<Dt_ReceiveOrder>().Where(x => (x.ReceiveOrderNo.Contains(orderNo) || x.SuppliersId.Contains(orderNo)) && x.ReceiveOrderStatus < ReceiveOrderStatusEnum.Completed.ObjToInt() && x.WarehouseId == warehouseId).ToPageList(pageNo, 5); | 
|                 } | 
|   | 
|                 content.OK(data: dt_ReceiveOrders); | 
|             } | 
|             catch (Exception) | 
|             { | 
|   | 
|                 throw; | 
|             } | 
|             return content; | 
|         } | 
|         /// <summary> | 
|         /// 创建入库单 | 
|         /// </summary> | 
|         /// <param name="receiveOrderId">收货单编号</param> | 
|         /// <returns></returns> | 
|         public WebResponseContent CreateInboundOrder(int receiveOrderId) | 
|         { | 
|             try | 
|             { | 
|                 Dt_ReceiveOrder receiveOrder = Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderId == receiveOrderId).Includes(x => x.Details).First(); | 
|                 if (receiveOrder == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到该收货单信息"); | 
|                 } | 
|                 if (receiveOrder.Details == null || receiveOrder.Details.Count() <= 0) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到该收货单明细信息"); | 
|                 } | 
|                 if (receiveOrder.ReceiveOrderStatus != ReceiveOrderStatusEnum.Completed.ObjToInt()) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"该收货单未完成"); | 
|                 } | 
|                 #region 注释 | 
|                 //List<Dt_CheckOrder> checkOrders = _checkOrderRepository.QueryData(x => x.ReceiveOrderNo == receiveOrder.ReceiveOrderNo); | 
|                 //if (checkOrders.FirstOrDefault(x => x.CheckOrderStatus == CheckOrderStatusEnum.NotCheck.ObjToInt()) != null) | 
|                 //{ | 
|                 //    return WebResponseContent.Instance.Error($"该收货单未质检完成"); | 
|                 //} | 
|   | 
|                 //if (checkOrders.FirstOrDefault(x => x.AuditStatus != AuditStatusEnum.Agree.ObjToInt()) != null) | 
|                 //{ | 
|                 //    return WebResponseContent.Instance.Error($"该收货单质检结果审批未完成"); | 
|                 //} | 
|                 #endregion | 
|   | 
|                 Dt_InboundOrder inboundOrder = new Dt_InboundOrder() | 
|                 { | 
|                     UpperOrderNo = receiveOrder.ReceiveOrderNo, | 
|                     CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(), | 
|                     OrderStatus = InOrderStatusEnum.未开始.ObjToInt(), | 
|                     OrderType = InOrderTypeEnum.Purchase.ObjToInt(), | 
|                     WarehouseId = receiveOrder.WarehouseId, | 
|                     SupplierId = receiveOrder.SuppliersId, | 
|                     Details = new List<Dt_InboundOrderDetail>() | 
|                 }; | 
|   | 
|                 foreach (var item in receiveOrder.Details) | 
|                 { | 
|                     float quantity = item.ReceivedQuantity; | 
|                     #region 注释 | 
|                     //if (item.IfInspection == WhetherEnum.True.ObjToInt()) | 
|                     //{ | 
|                     //    Dt_CheckOrder? checkOrder = checkOrders.FirstOrDefault(x => x.ReceiveOrderNo == receiveOrder.ReceiveOrderNo && x.ReceiveDetailRowNo == item.RowNo); | 
|                     //    if (checkOrder == null) | 
|                     //    { | 
|                     //        return WebResponseContent.Instance.Error($"质检单数据错误"); | 
|                     //    } | 
|                     //    quantity = checkOrder.QualifiedQuantity.GetValueOrDefault() + checkOrder.DefectedQuantity.GetValueOrDefault(); | 
|                     //} | 
|                     #endregion | 
|                     Dt_InboundOrderDetail detail = new Dt_InboundOrderDetail() | 
|                     { | 
|                         MaterielCode = item.MaterielCode, | 
|                         OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(), | 
|                         OrderQuantity = quantity, | 
|                         OverInQuantity = 0, | 
|                         ReceiptQuantity = 0, | 
|                         RowNo = item.RowNo, | 
|                         Unit = item.Unit, | 
|                         BatchNo = item.LotNo | 
|                     }; | 
|                     inboundOrder.Details.Add(detail); | 
|                 } | 
|   | 
|                 _inboundRepository.InboundOrderRepository.Db.InsertNav(inboundOrder).Include(x => x.Details).ExecuteCommand(); | 
|   | 
|                 return WebResponseContent.Instance.OK(); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|   | 
|         public WebResponseContent ReceiveAllOrder(int purchaseOrderId, string lotNo) | 
|         { | 
|             try | 
|             { | 
|                 Dt_PurchaseOrder purchaseOrder = Db.Queryable<Dt_PurchaseOrder>().Where(x => x.Id == purchaseOrderId).Includes(x => x.Details).First(); | 
|                 if (purchaseOrder == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到该采购单"); | 
|                 } | 
|                 if (purchaseOrder.Details.Count == 0) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到采购单明细信息"); | 
|                 } | 
|                 if (purchaseOrder.PurchaseOrderStatus == PurchaseOrderStatusEnum.Received.ObjToInt()) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"已收货完成"); | 
|                 } | 
|                 if (purchaseOrder.Details.FirstOrDefault(x => x.PurchaseDetailStatus == PurchaseOrderStatusEnum.NotReceived.ObjToInt()) == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"已收货完成"); | 
|                 } | 
|                 List<Dt_CheckOrder> checkOrders = new List<Dt_CheckOrder>(); | 
|                 List<Dt_MaterielInfo> materielInfos = new List<Dt_MaterielInfo>(); | 
|                 List<Dt_ReceiveOrderDetail> receiveOrderDetails = new List<Dt_ReceiveOrderDetail>(); | 
|                 Dt_ReceiveOrder receiveOrder = BaseDal.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.SuppliersId == purchaseOrder.SupplierCode && x.ReceiveOrderStatus != ReceiveOrderStatusEnum.Completed.ObjToInt()).Includes(x => x.Details).First(); | 
|                 if (receiveOrder == null) | 
|                 { | 
|                     int rowNo = 0; | 
|                     foreach (var item in purchaseOrder.Details) | 
|                     { | 
|                         Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterielCode); | 
|                         if (materielInfo == null) | 
|                         { | 
|                             materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == item.MaterielCode); | 
|                             if (materielInfo == null) | 
|                             { | 
|                                 return WebResponseContent.Instance.Error($"未找到该物料的信息"); | 
|                             } | 
|                             materielInfos.Add(materielInfo); | 
|                         } | 
|                         Dt_ReceiveOrderDetail receiveOrderDetail = new Dt_ReceiveOrderDetail() | 
|                         { | 
|                             PurchaseOrderNo = purchaseOrder.PurchaseOrderNo, | 
|                             ReceivedQuantity = item.PurchaseDetailQuantity, | 
|                             MaterielCode = item.MaterielCode, | 
|                             LotNo = lotNo, | 
|                             PurchaseOrderDetailRowNo = item.RowNo, | 
|                             IfInspection = materielInfo.IsCheck.ObjToInt(), | 
|                             CurrCode = "", | 
|                             PriceInTax = 0, | 
|                             TaxRate = "", | 
|                             RowNo = rowNo + 1, | 
|                             Unit = item.Unit | 
|                         }; | 
|                         rowNo += 1; | 
|                         receiveOrderDetails.Add(receiveOrderDetail); | 
|                         #region 注释 | 
|                         //if (materielInfo.IsCheck == WhetherEnum.True) | 
|                         //{ | 
|                         //    Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail); | 
|                         //    checkOrder.CheckOrderNo = "TestCheckNo21";//测试 | 
|                         //    checkOrder.ReceiveOrderNo = ""; | 
|                         //    checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity; | 
|                         //    checkOrder.ScrappedQuantity = 0; | 
|                         //    checkOrder.ReturnQuantity = 0; | 
|                         //    checkOrder.DefectedQuantity = 0; | 
|                         //    checkOrder.ReceiveDetailRowNo = rowNo; | 
|                         //    checkOrder.UploadStatus = CheckUploadEnum.UploadNo.ObjToInt(); | 
|                         //    checkOrders.Add(checkOrder); | 
|                         //} | 
|                         #endregion | 
|                     } | 
|                     receiveOrder = new Dt_ReceiveOrder() | 
|                     { | 
|                         ReceiveOrderStatus = ReceiveOrderStatusEnum.Receiving.ObjToInt(), | 
|                         CustomerId = "", | 
|                         DeliveryCode = "/", | 
|                         ReceiveDate = DateTime.Now, | 
|                         ReceiveOrderType = ReceiveOrderTypeEnum.PO.ObjToInt(), | 
|                         SuppliersId = purchaseOrder.SupplierCode, | 
|                         WarehouseId = purchaseOrder.Details.FirstOrDefault()?.WarehouseId ?? 0, | 
|                         UploadStatus = WhetherEnum.False.ObjToInt(), | 
|                         Details = receiveOrderDetails | 
|                     }; | 
|                 } | 
|                 else | 
|                 { | 
|                     int rowNo = receiveOrder.Details.Count > 0 ? receiveOrder.Details.Max(x => x.RowNo) : 0; | 
|   | 
|                     foreach (var item in purchaseOrder.Details) | 
|                     { | 
|                         Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterielCode); | 
|                         if (materielInfo == null) | 
|                         { | 
|                             materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == item.MaterielCode); | 
|                             if (materielInfo == null) | 
|                             { | 
|                                 return WebResponseContent.Instance.Error($"未找到该物料的信息"); | 
|                             } | 
|                             materielInfos.Add(materielInfo); | 
|                         } | 
|                         Dt_ReceiveOrderDetail receiveOrderDetail = new Dt_ReceiveOrderDetail() | 
|                         { | 
|                             PurchaseOrderNo = purchaseOrder.PurchaseOrderNo, | 
|                             ReceivedQuantity = item.PurchaseDetailQuantity, | 
|                             MaterielCode = item.MaterielCode, | 
|                             LotNo = lotNo, | 
|                             ReceiveOrderId = receiveOrder.ReceiveOrderId, | 
|                             PurchaseOrderDetailRowNo = item.RowNo, | 
|                             IfInspection = materielInfo.IsCheck.ObjToInt(), | 
|                             CurrCode = "", | 
|                             PriceInTax = 0, | 
|                             TaxRate = "", | 
|                             RowNo = rowNo + 1, | 
|                             Unit = item.Unit, | 
|   | 
|                         }; | 
|                         rowNo += 1; | 
|                         receiveOrderDetails.Add(receiveOrderDetail); | 
|   | 
|                         //if (materielInfo.IsCheck == WhetherEnum.True) | 
|                         //{ | 
|                         //    Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail); | 
|                         //    checkOrder.CheckOrderNo = "Test-CheckNo1";//测试 | 
|                         //    checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity; | 
|                         //    checkOrder.ScrappedQuantity = 0; | 
|                         //    checkOrder.ReceiveOrderNo = receiveOrder.ReceiveOrderNo; | 
|                         //    checkOrder.ReturnQuantity = 0; | 
|                         //    checkOrder.DefectedQuantity = 0; | 
|                         //    checkOrder.ReceiveDetailRowNo = rowNo; | 
|                         //    checkOrder.UploadStatus = CheckUploadEnum.UploadNo.ObjToInt(); | 
|                         //    checkOrders.Add(checkOrder); | 
|                         //} | 
|                     } | 
|                 } | 
|   | 
|                 purchaseOrder.Details.ForEach(x => x.PurchaseDetailStatus = PurchaseOrderStatusEnum.Received.ObjToInt()); | 
|                 purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Received.ObjToInt(); | 
|   | 
|                 _unitOfWorkManage.BeginTran(); | 
|                 if (receiveOrder.ReceiveOrderId > 0) | 
|                 { | 
|                     Db.Insertable(receiveOrderDetails).ExecuteCommand(); | 
|                 } | 
|                 else | 
|                 { | 
|                     Db.InsertNav(receiveOrder).Include(x => x.Details).ExecuteCommand(); | 
|                     checkOrders.ForEach(x => x.ReceiveOrderNo = receiveOrder.ReceiveOrderNo); | 
|                 } | 
|                 //if (checkOrders.Count > 0) | 
|                 //{ | 
|                 //    _checkOrderRepository.AddData(checkOrders); | 
|                 //} | 
|                 _inboundRepository.PurchaseOrderRepository.UpdateData(purchaseOrder); | 
|                 _inboundRepository.PurchaseOrderDetailRepository.UpdateData(purchaseOrder.Details); | 
|                 _unitOfWorkManage.CommitTran(); | 
|                 return WebResponseContent.Instance.OK(); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 _unitOfWorkManage.RollbackTran(); | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|     } | 
| } |