| | |
| | | { |
| | | ds = oCN.RunProcReturn |
| | | ("select a.HInterID,a.HBillType,a.HICMOBillNo,a.HICMOInterID,a.HMaterID" + |
| | | ",m.HNumber HMaterNumber,m.HName HMaterName,m.HModel HMaterModel,a.HICMOEntryID" + |
| | | ",a.HSourceBillNo,a.HSourceInterID,a.HSourceEntryID,a.HDatePlanQty " + |
| | | ",m.HNumber HMaterNumber,m.HName HMaterName,m.HModel HMaterModel,a.HICMOEntryID,a.HSourceID,s.HName HSourceName" + |
| | | ",a.HSourceBillNo,a.HSourceInterID,a.HSourceEntryID,a.HDatePlanQty,a.HDeptID,d.HName HDeptName,m.HUnitID,u.HName HUnitName,a.HProcID,p.HName HProcName" + |
| | | " from Sc_ICMOBillStatus_Tmp a " + |
| | | " left join Gy_Material m on a.HMaterID=m.HItemID " + |
| | | " left join Gy_Department d on a.HDeptID=d.HItemID " + |
| | | " left join Gy_Unit u on m.HUnitID=u.HItemID " + |
| | | " left join Gy_Source s on a.HSourceID=s.HItemID " + |
| | | " left join Gy_Process p on a.HProcID = p.HItemID " + |
| | | " Where a.HInterID=" + HInterID + " and a.HBillType=" + HBillType, "Sc_ICMOBillStatus_Tmp"); |
| | | } |
| | | else { |
| | | ds = oCN.RunProcReturn |
| | | ("select a.HInterID,a.HBillType,a.HICMOBillNo,a.HICMOInterID,a.HMaterID" + |
| | | ",m.HNumber HMaterNumber,m.HName HMaterName,m.HModel HMaterModel,a.HICMOEntryID " + |
| | | ("select a.HInterID,a.HBillType,a.HICMOBillNo,a.HICMOInterID,a.HMaterID,a.HSourceID,s.HName HSourceName" + |
| | | ",m.HNumber HMaterNumber,m.HName HMaterName,m.HModel HMaterModel,a.HICMOEntryID,a.HDeptID,d.HName HDeptName,m.HUnitID,u.HName HUnitName,a.HProcID,p.HName HProcName " + |
| | | " from Sc_ICMOBillStatus_Tmp a " + |
| | | " left join Gy_Material m on a.HMaterID=m.HItemID " + |
| | | " left join Gy_Department d on a.HDeptID=d.HItemID " + |
| | | " left join Gy_Unit u on m.HUnitID=u.HItemID " + |
| | | " left join Gy_Source s on a.HSourceID=s.HItemID " + |
| | | " left join Gy_Process p on a.HProcID = p.HItemID " + |
| | | " Where a.HInterID=" + HInterID + " and a.HBillType=" + HBillType, "Sc_ICMOBillStatus_Tmp"); |
| | | } |
| | | |
| | |
| | | BillNew.HMaterID = mainList[0].HMaterID; |
| | | BillNew.HSourceID = mainList[0].HSourceID; |
| | | BillNew.HGroupID = mainList[0].HGroupID; |
| | | BillNew.HDeptID = mainList[0].HDeptID; |
| | | BillNew.HCheckManID = mainList[0].HCheckManID; |
| | | BillNew.HBadReasonID = mainList[0].HBadReasonID; |
| | | BillNew.HBarCode = mainList[0].HBarCode; |
| | |
| | | oCN.RunProc("Insert Into Sc_ICMOBillQualityStatus_Tmp " + |
| | | " (HInterID,HBillNo,HDate,HICMOBillNo,HICMOInterID" + |
| | | ",HProcExchBillNo,HProcExchInterID,HProcExchEntryID,HProcID,HMaterID" + |
| | | ",HSourceID,HGroupID,HCheckManID,HBadReasonID,HBarCode" + |
| | | ",HSourceID,HGroupID,HDeptID,HCheckManID,HBadReasonID,HBarCode" + |
| | | ",HMaker,HMakeDate,HBillType,HReportType,HSourceBillNo" + |
| | | ",HSourceInterID,HSourceBillType,HICMOEntryID,HSourceEntryID,HBadReasonHQty" + |
| | | ") " + |
| | | " values(" + BillNew.HInterID + ",'" + BillNew.HBillNo + "','" + BillNew.HDate + "','" + BillNew.HICMOBillNo + "'," + BillNew.HICMOInterID + |
| | | ",'" + BillNew.HProcExchBillNo + "'," + BillNew.HProcExchInterID + "," + BillNew.HProcExchEntryID + "," + BillNew.HProcID + "," + BillNew.HMaterID + |
| | | "," + BillNew.HSourceID + "," + BillNew.HGroupID + "," + BillNew.HCheckManID + "," + BillNew.HBadReasonID + ",'" + BillNew.HBarCode + "'" + |
| | | "," + BillNew.HSourceID + "," + BillNew.HGroupID + "," + BillNew.HDeptID + "," + BillNew.HCheckManID + "," + BillNew.HBadReasonID + ",'" + BillNew.HBarCode + "'" + |
| | | ",'" + BillNew.HMaker + "','" + BillNew.HMakeDate + "','" + BillNew.HBillType + "','" + +BillNew.HReportType + "','" +BillNew.HSourceBillNo + "'" + |
| | | "," + BillNew.HSourceInterID + ",'" + BillNew.HSourceBillType + "'," + BillNew.HICMOEntryID + "," + BillNew.HICMOEntryID + "," + BillNew.HBadReasonHQty + |
| | | ") "); |
| | |
| | | #region æäº¤ä¿åï¼å主å表åæç»è¡¨ |
| | | [Route("Sc_QualityReportBill/set_SaveBill")] |
| | | [HttpGet] |
| | | public object set_SaveBill(long HInterID,string HBillNo, string HChecker,string HBadReasonHQty) |
| | | public object set_SaveBill(long HInterID,string HBillNo, string HChecker,string HBillSubType) |
| | | { |
| | | try |
| | | { |
| | |
| | | return objJsonResult; |
| | | } |
| | | //========================================================= |
| | | //ä¿å |
| | | oCN.RunProc("exec h_p_save_Sc_QualityReportBill " + HInterID+",'"+ HBadReasonHQty +"'"); |
| | | //ä¿å æ¹éä¿åå
çå表æ¯å¦ææ°æ®,ææ°æ®å°±è¿ åå
¥ä¸»è¡¨ æç»è¡¨ 没æå°±åå¨ä¸»åæç»è¡¨ |
| | | string sql = "select * from Sc_QualityReportBillSub where HInterID = '" + HInterID + "'"; |
| | | ds = oCN.RunProcReturn(sql, "Sc_QualityReportBillSub"); |
| | | if (ds.Tables[0].Rows.Count>0) |
| | | { |
| | | oCN.RunProc("exec h_p_save_Sc_QualityReportBillSum '" + HInterID + "','" + HBillSubType +"'"); |
| | | } |
| | | else |
| | | { |
| | | oCN.RunProc("exec h_p_save_Sc_QualityReportBill '" + HInterID + "','" + HBillSubType + "'"); |
| | | } |
| | | |
| | | //夿æ¯å¦å
许ä¿åï¼ä¸å
许ååæ» |
| | | ds = oCN.RunProcReturn("exec h_p_JIT_ICMOBillQualityStatus_SaveCtrl", "h_p_JIT_ICMOBillQualityStatus_SaveCtrl"); |
| | | if (ClsPub.isStrNull(ds.Tables[0].Rows[0]["HBack"]) == "2") |
| | |
| | | string subSql = "Insert into Sc_QualityReportBillSub " + |
| | | " (HInterID,HEntryID,HBillNo_bak,HRemark" + |
| | | ",HSourceInterID,HSourceEntryID,HSourceBillNo,HSourceBillType,HRelationQty,HRelationMoney" + |
| | | ",HMaterID,HUnitID,HQty,HResult,HEmpID,HSourceID,HBadReasonID" + |
| | | ",HMaterID,HUnitID,HQty,HResult,HEmpID,HSourceID,HProcID,HBadReasonID,HBadReasonNumber,HBadPhenomenaID,HGroupID" + |
| | | ",HICMOInterID,HICMOEntryID,HICMOBillNo,HProcExchInterID,HProcExchEntryID,HProcExchBillNo" + |
| | | ",HBarCode,HReportType" + |
| | | ",HAddr,HMaker,HMakeDate" + |
| | |
| | | "','" + oSub.HResult + "'" + |
| | | "," + oSub.HEmpID.ToString() + "" + |
| | | "," + oSub.HSourceID.ToString() + "" + |
| | | "," + oSub.HProcID.ToString() + "" + |
| | | "," + oSub.HBadReasonID.ToString() + "" + |
| | | ",'" + oSub.HBadReasonNumber.ToString() + "'" + |
| | | "," + oSub.HBadPhenomenaID.ToString() + "" + |
| | | ",'" + oSub.HGroupID.ToString() + "'" + |
| | | |
| | | "," + oSub.HICMOInterID.ToString() + "" + |
| | | "," + oSub.HICMOEntryID.ToString() + "" + |
| | |
| | | "," + oSub.HProcExchInterID + "" + |
| | | "," + oSub.HProcExchEntryID + "" + |
| | | ",'" + oSub.HProcExchBillNo + "'" + |
| | | ",'" + oSub.HBarCode + "'" + |
| | | ",'" + oSub.HBadReasonNumber.ToString() + "'" + |
| | | |
| | | ",'" + 3 + |
| | | ",'" + 1 + |
| | | "','" + oSub.HAddr + "'" + |
| | | ",'" + msg4 + "'" + |
| | | ",'" + oSub.HMakeDate.ToShortDateString() + "'" + |
| | | ",GETDATE()" + |
| | | ") "; |
| | | oCN.RunProc(subSql); |
| | | |
| | |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | |
| | | |
| | | |
| | |
| | | public string HName; |
| | | public DateTime HBeginDate; |
| | | public DateTime HEndDate; |
| | | public string HProcName; |
| | | public string HEquipName; |
| | | public string HBactNo; |
| | | } |
| | | [Route("Sc_QualityReportBill/getSc_QualityReportBillDay")] |
| | | [HttpGet] |
| | |
| | | return objJsonResult; |
| | | } |
| | | ReportWorkDemandPlanBill Report = JsonConvert.DeserializeObject<ReportWorkDemandPlanBill>(sWhere); |
| | | ds = oCN.RunProcReturn($"exec h_p_Sc_StationOutBillMain '{Report.HBeginDate}','{Report.HEndDate}','{Report.HNumber}','{Report.HName}'", "h_p_Sc_StationOutBillMain"); |
| | | ds = oCN.RunProcReturn($"exec h_p_Sc_StationOutBillMain '{Report.HBeginDate}','{Report.HEndDate}','{Report.HNumber}','{Report.HName}','{Report.HProcName}','{Report.HEquipName}','{Report.HBactNo}'", "h_p_Sc_StationOutBillMain"); |
| | | |
| | | //æ·»å åå |
| | | foreach (DataColumn col in ds.Tables[0].Columns) |
| | |
| | | public string HYear; |
| | | public string HWorkCenter; |
| | | public string HName; |
| | | public DateTime HBeginDate; |
| | | public DateTime HEndDate; |
| | | |
| | | } |
| | | [Route("Sc_QualityReportBill/getSc_QualityReportBillMonth")] |
| | |
| | | return objJsonResult; |
| | | } |
| | | ReportWorkDemandPlanBill1 Report = JsonConvert.DeserializeObject<ReportWorkDemandPlanBill1>(sWhere); |
| | | ds = oCN.RunProcReturn($"exec h_p_Sc_StationOutBillMonth '{Report.HYear}','{Report.HWorkCenter}','{Report.HName}'", "h_p_Sc_StationOutBillMonth"); |
| | | ds = oCN.RunProcReturn($"exec h_p_Sc_StationOutBillMonth '{Report.HYear}','{Report.HWorkCenter}','{Report.HName}', '{Report.HBeginDate}','{Report.HEndDate}'", "h_p_Sc_StationOutBillMonth"); |
| | | |
| | | //æ·»å åå |
| | | foreach (DataColumn col in ds.Tables[0].Columns) |
| | |
| | | } |
| | | #endregion |
| | | |
| | | #region ç©æç产è¯çç»è®¡(æ¯è«å°) æ¥è¯¢ |
| | | |
| | | [Route("Sc_QualityReportBill/getSc_HMaterYieldStatistics")] |
| | | [HttpGet] |
| | | public object getSc_HMaterYieldStatistics(string sWhere, string user) |
| | | { |
| | | try |
| | | { |
| | | List<object> columnNameList = new List<object>(); |
| | | //æ¥çæé |
| | | if (!DBUtility.ClsPub.Security_Log("Sc_QualityReportBill_Query", 1, false, user)) |
| | | { |
| | | objJsonResult.code = "0"; |
| | | objJsonResult.count = 0; |
| | | objJsonResult.Message = "æ æ¥çæéï¼"; |
| | | objJsonResult.data = null; |
| | | return objJsonResult; |
| | | } |
| | | |
| | | if (sWhere == null || sWhere.Equals("")) |
| | | { |
| | | ds = oCN.RunProcReturn("select * from h_v_Sc_HMater_Yield_Statistics_Query order by åæ®å· desc", "h_v_Sc_HMater_Yield_Statistics_Query"); |
| | | } |
| | | else |
| | | { |
| | | string sql1 = "select * from h_v_Sc_HMater_Yield_Statistics_Query where 1 = 1 "; |
| | | string sql = sql1 + sWhere + " order by æ¥æ desc"; |
| | | ds = oCN.RunProcReturn(sql, "h_v_Sc_HMater_Yield_Statistics_Query"); |
| | | } |
| | | |
| | | //æ·»å åå |
| | | foreach (DataColumn col in ds.Tables[0].Columns) |
| | | { |
| | | Type dataType = col.DataType; |
| | | string ColmString = "{\"ColmCols\":\"" + col.ColumnName + "\",\"ColmType\":\"" + dataType.Name + "\"}"; |
| | | columnNameList.Add(JsonConvert.DeserializeObject(ColmString));//è·åå°DataColumnå对象çåå |
| | | } |
| | | |
| | | objJsonResult.code = "1"; |
| | | objJsonResult.count = 1; |
| | | objJsonResult.Message = "Sucessï¼"; |
| | | objJsonResult.data = ds.Tables[0]; |
| | | objJsonResult.list = columnNameList; |
| | | return objJsonResult; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | objJsonResult.code = "0"; |
| | | objJsonResult.count = 0; |
| | | objJsonResult.Message = "Exceptionï¼" + e.ToString(); |
| | | objJsonResult.data = null; |
| | | return objJsonResult; |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | #region ä»»å¡åéè¿ç(æ¯è«å°) æ¥è¯¢ |
| | | |
| | | [Route("Sc_QualityReportBill/getSc_HICMMaterStatistics")] |
| | | [HttpGet] |
| | | public object getSc_HICMMaterStatistics(string sWhere, string user) |
| | | { |
| | | try |
| | | { |
| | | List<object> columnNameList = new List<object>(); |
| | | //æ¥çæé |
| | | if (!DBUtility.ClsPub.Security_Log("Sc_QualityReportBill_Query", 1, false, user)) |
| | | { |
| | | objJsonResult.code = "0"; |
| | | objJsonResult.count = 0; |
| | | objJsonResult.Message = "æ æ¥çæéï¼"; |
| | | objJsonResult.data = null; |
| | | return objJsonResult; |
| | | } |
| | | |
| | | if (sWhere == null || sWhere.Equals("")) |
| | | { |
| | | ds = oCN.RunProcReturn("select * from h_v_Sc_HICMMater_Statistics_Query order by åæ®å· desc", "h_v_Sc_HICMMater_Statistics_Query"); |
| | | } |
| | | else |
| | | { |
| | | string sql1 = "select * from h_v_Sc_HICMMater_Statistics_Query where 1 = 1 "; |
| | | string sql = sql1 + sWhere + " order by æ¥æ desc"; |
| | | ds = oCN.RunProcReturn(sql, "h_v_Sc_HICMMater_Statistics_Query"); |
| | | } |
| | | |
| | | //æ·»å åå |
| | | foreach (DataColumn col in ds.Tables[0].Columns) |
| | | { |
| | | Type dataType = col.DataType; |
| | | string ColmString = "{\"ColmCols\":\"" + col.ColumnName + "\",\"ColmType\":\"" + dataType.Name + "\"}"; |
| | | columnNameList.Add(JsonConvert.DeserializeObject(ColmString));//è·åå°DataColumnå对象çåå |
| | | } |
| | | |
| | | objJsonResult.code = "1"; |
| | | objJsonResult.count = 1; |
| | | objJsonResult.Message = "Sucessï¼"; |
| | | objJsonResult.data = ds.Tables[0]; |
| | | objJsonResult.list = columnNameList; |
| | | return objJsonResult; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | objJsonResult.code = "0"; |
| | | objJsonResult.count = 0; |
| | | objJsonResult.Message = "Exceptionï¼" + e.ToString(); |
| | | objJsonResult.data = null; |
| | | return objJsonResult; |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | #region çäº§è´¨éæ±æ¥å_PDA æ°å¢ |
| | | [Route("Sc_QualityReportBill/SaveSc_QualityReportBill_PDA")] |
| | | [HttpPost] |
| | | public object SaveSc_QualityReportBill_PDA([FromBody] JObject msg) |
| | | { |
| | | var _value = msg["msg"].ToString(); |
| | | string msg1 = _value.ToString(); |
| | | string[] sArray = msg1.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); |
| | | string msg2 = sArray[0].ToString(); //è¡¨å¤´æ°æ® |
| | | string msg3 = sArray[1].ToString(); //å表1æ°æ® |
| | | string refSav = sArray[2].ToString(); //æä½æ¹å¼ |
| | | string msg4 = sArray[3].ToString(); //ç¨æ· |
| | | |
| | | DBUtility.ClsPub.CurUserName = msg4; |
| | | ListModels oListModels = new ListModels(); |
| | | string s = ""; |
| | | try |
| | | { |
| | | //ç¼è¾æé |
| | | if (!DBUtility.ClsPub.Security_Log_second("Sc_QualityReportBill_Edit", 1, false, msg4)) |
| | | { |
| | | objJsonResult.code = "0"; |
| | | objJsonResult.count = 0; |
| | | objJsonResult.Message = "æ ä¿åæéï¼"; |
| | | objJsonResult.data = null; |
| | | return objJsonResult; |
| | | } |
| | | |
| | | DAL.ClsSc_QualityReportBill oBill = new DAL.ClsSc_QualityReportBill(); |
| | | List<Model.ClsSc_QualityReportBillMain> lsmain = new List<Model.ClsSc_QualityReportBillMain>(); |
| | | msg2 = msg2.Replace("\\", ""); |
| | | msg2 = msg2.Replace("\n", ""); //\n |
| | | lsmain = oListModels.getObjectByJson_Sc_QualityReportBillMain(msg2); |
| | | foreach (Model.ClsSc_QualityReportBillMain oItem in lsmain) |
| | | { |
| | | if (refSav == "Add") |
| | | { |
| | | //忮巿¯å¦éå¤ |
| | | if (BillNew0.IsExistBillNo(ref ClsPub.sExeReturnInfo, oItem.HBillNo, BillStatus, BillOld.omodel.HInterID)) |
| | | { |
| | | objJsonResult.code = "0"; |
| | | objJsonResult.count = 0; |
| | | objJsonResult.Message = "åæ®å·éå¤ï¼ä¸å
许ä¿åï¼"; |
| | | objJsonResult.data = 1; |
| | | return objJsonResult; |
| | | } |
| | | } |
| | | if (refSav == "Update") |
| | | { |
| | | if (BillOld.ShowBill(oItem.HInterID, ref s) == false) |
| | | { |
| | | objJsonResult.code = "0"; |
| | | objJsonResult.count = 0; |
| | | objJsonResult.Message = "æ¤åæ®æè¯¯ï¼"; |
| | | objJsonResult.data = 1; |
| | | return objJsonResult; |
| | | } |
| | | //夿æ¯å¦å¯ç¼è¾ |
| | | if (BillOld.omodel.HChecker != "" && BillOld.omodel.HChecker != null) |
| | | { |
| | | objJsonResult.code = "0"; |
| | | objJsonResult.count = 0; |
| | | objJsonResult.Message = "æ¤åæ®å·²ç»è¢«å®¡æ ¸ï¼ä¸å
许修æ¹ï¼"; |
| | | objJsonResult.data = 1; |
| | | return objJsonResult; |
| | | } |
| | | if (BillOld.omodel.HBillStatus > 1) |
| | | { |
| | | objJsonResult.code = "0"; |
| | | objJsonResult.count = 0; |
| | | objJsonResult.Message = "æ¤åæ®å¤äºä¸å¯ç¼è¾ç¶æï¼ä¸å
许修æ¹ï¼"; |
| | | objJsonResult.data = 1; |
| | | return objJsonResult; |
| | | } |
| | | if (!DBUtility.Xt_BaseBillFun.Fun_AllowEditBill(BillOld, ref s)) |
| | | { |
| | | objJsonResult.code = "0"; |
| | | objJsonResult.count = 0; |
| | | objJsonResult.Message = s + "ï¼ä¸å
许修æ¹"; |
| | | objJsonResult.data = 1; |
| | | return objJsonResult; |
| | | } |
| | | } |
| | | if (DBUtility.ClsPub.isStrNull(oItem.HDate) == "") |
| | | { |
| | | objJsonResult.code = "0"; |
| | | objJsonResult.count = 0; |
| | | objJsonResult.Message = "ä¿åå¤±è´¥ï¼æ²¡æåæ®æ¥æï¼æ æ³ä¿åï¼"; |
| | | objJsonResult.data = 1; |
| | | return objJsonResult; |
| | | } |
| | | oBill.omodel = oItem; |
| | | } |
| | | |
| | | |
| | | //è¡¨ä½æ°æ® |
| | | //æ },{æ¥æåæ°ç» //廿ãåã |
| | | msg3 = msg3.Substring(1, msg3.Length - 2); |
| | | msg3 = msg3.Replace("\\", ""); |
| | | msg3 = msg3.Replace("\n", ""); //\n |
| | | //msg2 = msg2.Replace("'", "â"); |
| | | List<Model.ClsSc_QualityReportBillSub> ls = new List<Model.ClsSc_QualityReportBillSub>(); |
| | | ls = oListModels.getObjectByJson_Sc_QualityReportBillSub(msg3); |
| | | int i = 0; |
| | | foreach (Model.ClsSc_QualityReportBillSub oItemSub in ls) |
| | | { |
| | | i++; |
| | | oItemSub.HEntryID = i; |
| | | oItemSub.HEntryCloseDate = DBUtility.ClsPub.isDate(DateTime.Now); |
| | | oItemSub.HCloseType = false; //å
³éç±»å |
| | | oBill.DetailColl.Add(oItemSub); |
| | | } |
| | | |
| | | //ä¿å |
| | | //ä¿å宿¯åå¤ç |
| | | bool bResult; |
| | | if (refSav == "Add") |
| | | { |
| | | bResult = oBill.AddBill(ref DBUtility.ClsPub.sExeReturnInfo); |
| | | } |
| | | else if (refSav == "Update") |
| | | { |
| | | bResult = oBill.ModifyBill(oBill.omodel.HInterID, ref DBUtility.ClsPub.sExeReturnInfo); |
| | | } |
| | | else |
| | | { |
| | | bResult = false; |
| | | } |
| | | if (bResult) |
| | | { |
| | | objJsonResult.code = "0"; |
| | | objJsonResult.count = 1; |
| | | objJsonResult.Message = "ä¿åæåï¼"; |
| | | objJsonResult.data = 1; |
| | | return objJsonResult; |
| | | } |
| | | else |
| | | { |
| | | objJsonResult.code = "0"; |
| | | objJsonResult.count = 0; |
| | | objJsonResult.Message = "ä¿å失败ï¼" + DBUtility.ClsPub.sExeReturnInfo; |
| | | objJsonResult.data = 1; |
| | | return objJsonResult; |
| | | } |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | objJsonResult.code = "0"; |
| | | objJsonResult.count = 0; |
| | | objJsonResult.Message = "ä¿å失败ï¼" + e.ToString(); |
| | | objJsonResult.data = 1; |
| | | return objJsonResult; |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | } |
| | | } |