| | |
| | | using MES.Service.DB; |
| | | using System.Data; |
| | | using MES.Service.DB; |
| | | using MES.Service.Dto.service; |
| | | using MES.Service.Modes; |
| | | using MES.Service.util; |
| | | using SqlSugar; |
| | | using DbType = System.Data.DbType; |
| | | |
| | | |
| | | namespace MES.Service.service.QC; |
| | | |
| | | public class LljService |
| | | { |
| | | |
| | | public List<LtsLlj> GetPage(XJPageResult queryObj) |
| | | public (List<LtsLlj> item, int TotalCount) GetPage(XJPageResult queryObj) |
| | | { |
| | | var db = SqlSugarHelper.GetInstance(); |
| | | |
| | | var id = Convert.ToDecimal(queryObj.id); |
| | | |
| | | return db.Queryable<LtsLlj>() |
| | | .WhereIF( |
| | | StringUtil.IsNotNullOrEmpty(queryObj.result) && |
| | | "未完成".Equals(queryObj.result), |
| | | (a) =>a.FcheckResu == null) |
| | | .WhereIF( |
| | | StringUtil.IsNotNullOrEmpty(queryObj.result) && |
| | | !"未完成".Equals(queryObj.result), |
| | | (a) => a.FcheckResu != null) |
| | | .WhereIF(id > 0, (a) => a.Id == id) |
| | | .ToPageList(queryObj.PageIndex, queryObj.Limit); |
| | | |
| | | |
| | | var totalCount = 0; |
| | | |
| | | var pageList = db.Queryable<LtsLlj>() |
| | | .WhereIF( |
| | | StringUtil.IsNotNullOrEmpty(queryObj.result) && |
| | | "未完成".Equals(queryObj.result), |
| | | a => a.FcheckResu == null) |
| | | .WhereIF( |
| | | StringUtil.IsNotNullOrEmpty(queryObj.result) && |
| | | !"未完成".Equals(queryObj.result), |
| | | a => a.FcheckResu != null) |
| | | .WhereIF(id > 0, a => a.Id == id) |
| | | //加筛选条件,根据供应商,物料编码,物料名称搜索 |
| | | //.WhereIF(queryObj.SearchValue!=null && queryObj.SearchValue!="", (a) => a.SuppName == queryObj.SearchValue|| a.ItemName == queryObj.SearchValue || a.ItemNo == queryObj.SearchValue ) |
| | | .WhereIF(queryObj.SearchValue != null && queryObj.SearchValue != "", |
| | | (a) => (a.SuppName.ToLower().Contains(queryObj.SearchValue.ToLower()) |
| | | || a.ItemName.ToLower().Contains(queryObj.SearchValue.ToLower()) |
| | | || a.ItemNo.ToLower().Contains(queryObj.SearchValue.ToLower()))) |
| | | .OrderByDescending(a => a.Id) |
| | | .ToPageList(queryObj.PageIndex, queryObj.Limit, ref totalCount); |
| | | |
| | | return (pageList, totalCount); |
| | | } |
| | | //根据检验标准来计算检验个数 |
| | | public List<MesQaItemsDetectDetail5> SetItems(string itemNo, decimal quantity,string releaseNo) |
| | | |
| | | //根据检验标准来计算检验个数 |
| | | public List<MesQaItemsDetectDetail5> SetItems(string itemNo, |
| | | decimal quantity, string releaseNo) |
| | | { |
| | | var db = SqlSugarHelper.GetInstance(); |
| | | |
| | | |
| | | var count = db.Queryable<MesQaIqc>().Where(s => s.EE == 1 && s.ISENABLED == 1 |
| | | && s.ItemNo == itemNo && s.FTYPE == "1").Count(); |
| | | |
| | | var count = db.Queryable<MesQaIqc>().Where(s => s.EE == 1 && |
| | | s.ISENABLED == 1 |
| | | && s.ItemNo == itemNo && s.FTYPE == "1").Count(); |
| | | |
| | | if (count <= 0) return []; |
| | | |
| | | var mesQaIqcItem = db |
| | | .Queryable<MesQaIqc>().Where(s => s.EE == 1 && s.ISENABLED == 1 |
| | | && s.ItemNo == itemNo && s.FTYPE == "1").Select( |
| | | && s.ItemNo == itemNo && s.FTYPE == "1").Select( |
| | | b => new MesQaItemsDetectDetail5 |
| | | { |
| | | |
| | | ReleaseNo = releaseNo, |
| | | FacLevel = b.FacLevel, |
| | | FcheckItem = b.FcheckItem , |
| | | FdownAllow = b.FdownAllow, |
| | | FcheckLevel = b.FREQUENCY, |
| | | Fstand =b.FSTAND, |
| | | FupAllow = b.FupAllow, |
| | | SampleSizeNo = b.SampleSizeNo , |
| | | ReleaseNo = releaseNo, |
| | | FacLevel = b.FacLevel, |
| | | FcheckItem = b.FcheckItem, |
| | | FdownAllow = b.FdownAllow, |
| | | FcheckLevel = b.FREQUENCY, |
| | | Fstand = b.FSTAND, |
| | | FupAllow = b.FupAllow, |
| | | SampleSizeNo = b.SampleSizeNo, |
| | | FenterQty = 0, |
| | | Factory = "1000", |
| | | Factory = "1000", |
| | | Company = "1000", |
| | | |
| | | |
| | | // FcheckItemDesc = "0", |
| | | // FcheckResu = "0", |
| | | FcheckTool = b.FcheckTool, |
| | | FspecRequ = b.FspecRequ, |
| | | // FtextType = "0", |
| | | // Funit = "0", |
| | | // LastupdateBy = "0", |
| | | // ProcNo = "0", |
| | | // WorkshopCenterCode = "0" |
| | | |
| | | |
| | | |
| | | // FcheckItemDesc = "0", |
| | | // FcheckResu = "0", |
| | | FcheckTool = b.FcheckTool, |
| | | FspecRequ = b.FspecRequ |
| | | // FtextType = "0", |
| | | // Funit = "0", |
| | | // LastupdateBy = "0", |
| | | // ProcNo = "0", |
| | | // WorkshopCenterCode = "0" |
| | | }).ToList(); |
| | | |
| | | mesQaIqcItem.ForEach(item => |
| | |
| | | string LEV = null; |
| | | switch (item.FcheckLevel) |
| | | { |
| | | case string s when s.Contains("S1"): |
| | | case null: |
| | | LEV = ""; // 默认值 |
| | | break; |
| | | case { } s when s.Contains("S1"): |
| | | LEV = "B.FLEVEL_S1"; |
| | | break; |
| | | case string s when s.Contains("S2"): |
| | | case { } s when s.Contains("S2"): |
| | | LEV = "B.FLEVEL_S2"; |
| | | break; |
| | | case string s when s.Contains("S3"): |
| | | case { } s when s.Contains("S3"): |
| | | LEV = "B.FLEVEL_S3"; |
| | | break; |
| | | case string s when s.Contains("S4"): |
| | | case { } s when s.Contains("S4"): |
| | | LEV = "B.FLEVEL_S4"; |
| | | break; |
| | | case string s when s.Contains("(I)"): |
| | | case { } s when s.Contains("(I)"): |
| | | LEV = "B.FLEVEL_I"; |
| | | break; |
| | | case string s when s.Contains("(II)"): |
| | | case { } s when s.Contains("(II)"): |
| | | LEV = "B.FLEVEL_II"; |
| | | break; |
| | | case string s when s.Contains("(III)"): |
| | | case { } s when s.Contains("(III)"): |
| | | LEV = "B.FLEVEL_III"; |
| | | break; |
| | | default: |
| | |
| | | break; |
| | | } |
| | | |
| | | if (string.IsNullOrEmpty(LEV)) |
| | | throw new Exception(item.SampleSizeNo + "的检验水平不正确"); |
| | | |
| | | var sql = |
| | | "SELECT " + LEV + |
| | | " FROM MES_QM_AQL1 A LEFT JOIN MES_QM_AQL2 B ON B.AQL1_ID=A.ID WHERE A.SAMPLE_SIZE_NO='" + |
| | | item.SampleSizeNo + "' AND B.LOT_FROM<= " + quantity + " AND " + |
| | | item.SampleSizeNo + "' AND B.LOT_FROM<= " + quantity + |
| | | " AND " + |
| | | quantity + "<=B.LOT_TO"; |
| | | |
| | | var maxBillNo = db.Ado.SqlQuerySingle<string>(sql); |
| | | |
| | | if (string.IsNullOrEmpty(maxBillNo)) |
| | | throw new Exception(item.SampleSizeNo + "下的" + quantity + |
| | | "这个范围下没有匹配到检验项目"); |
| | | |
| | | var result = ExtractSubstring(item.FacLevel, '(', ')'); |
| | | |
| | | if (string.IsNullOrEmpty(result)) |
| | | throw new Exception(item.SampleSizeNo + "下的" + quantity + |
| | | "拒收水平不正确"); |
| | | |
| | | sql = "SELECT FSAMPLE_SIZE_WORD, " + result + |
| | | " Result FROM MES_QM_AQL1 A LEFT JOIN MES_QM_AQL3 C ON C.AQL1_ID=A.ID WHERE A.SAMPLE_SIZE_NO= '" + |
| | | item.SampleSizeNo + "' AND SAMPLE_SIZE_WORD= '" + maxBillNo + "'"; |
| | | item.SampleSizeNo + "' AND SAMPLE_SIZE_WORD= '" + maxBillNo + |
| | | "'"; |
| | | var resultClass = db.Ado.SqlQuerySingle<ResultClass>(sql); |
| | | |
| | | item.CheckQyt = resultClass.FSAMPLE_SIZE_WORD; |
| | |
| | | var length = endIndex - startIndex - 1; |
| | | return input.Substring(startIndex + 1, length); |
| | | } |
| | | |
| | | public int saveItem(LLJDto rkjDto) |
| | | { |
| | | var items = rkjDto.items; |
| | |
| | | }); |
| | | |
| | | rkjDto.items = GetItems(rkjDto.releaseNo, null); |
| | | |
| | | |
| | | var db = SqlSugarHelper.GetInstance(); |
| | | |
| | | rkjDto.items.ForEach(s => |
| | | { |
| | | if (s.FupAllow != null || s.Fstand != null || |
| | | s.FdownAllow != null ) return; |
| | | |
| | | if (s.FupAllow != null || s.Fstand != null || |
| | | s.FdownAllow != null) return; |
| | | |
| | | // 没有录入参考值,判断有多少个NG,那么录入的抽检结果必须是OK或者NG,NG代表不合格 |
| | | var ifck = db.Queryable<MesQaItemsDetectDetail12>() |
| | | .Where(x => x.FcheckResu == "NG" && x.MainId == s.Id).Count(); |
| | | |
| | | //检验明细总数 |
| | | var count = db.Queryable<MesQaItemsDetectDetail12>().Where(x1 => x1.MainId == s.Id).Count(); |
| | | var count = db.Queryable<MesQaItemsDetectDetail12>() |
| | | .Where(x1 => x1.MainId == s.Id).Count(); |
| | | |
| | | if (ifck > s.FreQty && s.CheckQyt == count) |
| | | { |
| | | s.FcheckResu = "不合格"; |
| | | }else if (ifck < s.FreQty && s.CheckQyt == count) |
| | | { |
| | | else if (ifck < s.FreQty && s.CheckQyt == count) |
| | | s.FcheckResu = "合格"; |
| | | } |
| | | else |
| | | { |
| | | s.FcheckResu = "未完成"; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | var detail = new MesQaItemsDetectDetail12(); |
| | | detail.MainId = s.Id; |
| | | detail.ReleaseNo = rkjDto.releaseNo; |
| | |
| | | |
| | | return Convert.ToInt32(rkjDto.gid); |
| | | } |
| | | public List<MesQaItemsDetectDetail5> GetItems(string? releaseNo, decimal? id) |
| | | |
| | | public List<MesQaItemsDetectDetail5> GetItems(string? releaseNo, |
| | | decimal? id) |
| | | { |
| | | var db = SqlSugarHelper.GetInstance(); |
| | | |
| | | return db.Queryable<MesQaItemsDetectDetail5, MesQaItemsDetectDetail12>((a, b) => |
| | | new JoinQueryInfos(JoinType.Left, a.Id == b.MainId)) |
| | | |
| | | return db.Queryable<MesQaItemsDetectDetail5, MesQaItemsDetectDetail12>( |
| | | (a, b) => |
| | | new JoinQueryInfos(JoinType.Left, a.Id == b.MainId)) |
| | | .Where((a, b) => a.ReleaseNo == releaseNo) |
| | | // .WhereIF(id > 0, (a, b) => a.Id == id) |
| | | // .WhereIF(id > 0, (a, b) => a.Id == id) |
| | | .GroupBy((a, b) => new |
| | | { |
| | | a.Id, |
| | | a.ReleaseNo, |
| | | a.FacLevel, |
| | | a.FcheckItem , |
| | | a.FcheckTool , |
| | | a.FdownAllow, |
| | | a.FcheckLevel, |
| | | a.Fstand, |
| | | a.FupAllow, |
| | | a.SampleSizeNo , |
| | | a.FspecRequ , |
| | | a.FreQty, |
| | | a.CheckQyt, |
| | | a.FcheckResu |
| | | |
| | | |
| | | a.ReleaseNo, |
| | | a.FacLevel, |
| | | a.FcheckItem, |
| | | a.FcheckTool, |
| | | a.FdownAllow, |
| | | a.FcheckLevel, |
| | | a.Fstand, |
| | | a.FupAllow, |
| | | a.SampleSizeNo, |
| | | a.FspecRequ, |
| | | a.FreQty, |
| | | a.CheckQyt, |
| | | a.FcheckResu |
| | | }).Select((a, b) => new MesQaItemsDetectDetail5 |
| | | { |
| | | Id = a.Id, |
| | | ReleaseNo = a.ReleaseNo, |
| | | CheckQyt = a.CheckQyt, |
| | | FacLevel = a.FacLevel, |
| | | FcheckItem = a.FcheckItem , |
| | | FcheckTool = a.FcheckTool , |
| | | FdownAllow = a.FdownAllow, |
| | | FcheckLevel = a.FcheckLevel, |
| | | Fstand =a.Fstand, |
| | | FupAllow = a.FupAllow, |
| | | SampleSizeNo = a.SampleSizeNo , |
| | | FspecRequ =a.FspecRequ , |
| | | FreQty = a.FreQty, |
| | | Factory = "1000", |
| | | FacLevel = a.FacLevel, |
| | | FcheckItem = a.FcheckItem, |
| | | FcheckTool = a.FcheckTool, |
| | | FdownAllow = a.FdownAllow, |
| | | FcheckLevel = a.FcheckLevel, |
| | | Fstand = a.Fstand, |
| | | FupAllow = a.FupAllow, |
| | | SampleSizeNo = a.SampleSizeNo, |
| | | FspecRequ = a.FspecRequ, |
| | | FreQty = a.FreQty, |
| | | Factory = "1000", |
| | | Company = "1000", |
| | | FenterQty = SqlFunc.AggregateCount(b.Id), |
| | | FcheckResu = a.FcheckResu |
| | | FcheckResu = a.FcheckResu |
| | | }).ToList(); |
| | | } |
| | | |
| | | |
| | | public int SetQSItemDetail(MesQaItemsDetectDetail12 detail) |
| | | { |
| | | var dbd = SqlSugarHelper.GetInstance(); |
| | |
| | | item.Factory = "1000"; |
| | | item.Company = "1000"; |
| | | result.Add(item); |
| | | |
| | | } |
| | | |
| | | |
| | | return db.Insertable(result).ExecuteCommand(); |
| | | |
| | | }); |
| | | |
| | | detail.CreateBy = detail.LastupdateBy; |
| | | |
| | | |
| | | |
| | | |
| | | autoResult(detail); |
| | | |
| | | return oracle; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | private int autoResult(MesQaItemsDetectDetail12 detail) |
| | | { |
| | | var db = SqlSugarHelper.GetInstance(); |
| | |
| | | //查询这个检验项目下的检验结果 |
| | | var count = db.Queryable<MesQaItemsDetectDetail12>() |
| | | .Where(s => s.MainId == detail.MainId).Count(); |
| | | |
| | | |
| | | updateDetail5(detail); |
| | | var result = ""; |
| | | |
| | |
| | | result = "合格"; |
| | | //else if (count - passCount < QsItemOqcItem.FreQty) |
| | | // result = "不合格"; |
| | | else if (noCount >= QsItemOqcItem.FreQty) |
| | | else if (noCount >= QsItemOqcItem.FreQty) |
| | | result = "不合格"; |
| | | var useTransactionWithOracle = SqlSugarHelper.UseTransactionWithOracle( |
| | | db => |
| | |
| | | }); |
| | | |
| | | var isNull = db.Queryable<MesQaItemsDetectDetail5>() |
| | | .Where(s => s.ReleaseNo == detail.ReleaseNo && s.FcheckResu == null).Count(); |
| | | .Where(s => s.ReleaseNo == detail.ReleaseNo && s.FcheckResu == null) |
| | | .Count(); |
| | | |
| | | if (isNull > 0) return 1; |
| | | |
| | |
| | | |
| | | //获取检验单下的合格的检验项目个数 |
| | | var icount = db.Queryable<MesQaItemsDetectDetail5>() |
| | | .Where(s => s.ReleaseNo == detail.ReleaseNo && s.FcheckResu == "合格").Count(); |
| | | .Where(s => s.ReleaseNo == detail.ReleaseNo && s.FcheckResu == "合格") |
| | | .Count(); |
| | | |
| | | var FcheckResu = "不合格"; |
| | | |
| | |
| | | .Where(s => s.ReleaseNo == detail.ReleaseNo) |
| | | .ExecuteCommand(); |
| | | }); |
| | | // if (FcheckResu.Equals("不合格")) |
| | | //自动生成入库检异常对策 |
| | | /// saveDetect02(detail.Id, detail.CreateBy); |
| | | // if (FcheckResu.Equals("不合格")) |
| | | //自动生成入库检异常对策 |
| | | /// saveDetect02(detail.Id, detail.CreateBy); |
| | | |
| | | return useTransactionWithOracle; |
| | | } |
| | |
| | | .ExecuteCommand()); |
| | | } |
| | | */ |
| | | |
| | | |
| | | public LLJDto getXjDetail02ById(decimal? id) |
| | | { |
| | | var rkjDto = new LLJDto(); |
| | |
| | | var qsItemOqcItem = |
| | | db.Queryable<MesQaItemsDetectDetail5>().Single(s => s.Id == id); |
| | | |
| | | /* if (qsItemOqcItem.IsPass == 0) |
| | | qsItemOqcItem.Result = "不合格"; |
| | | else if (qsItemOqcItem.IsPass == 1) |
| | | qsItemOqcItem.Result = "合格"; |
| | | else |
| | | qsItemOqcItem.Result = "未完成"; |
| | | /* if (qsItemOqcItem.IsPass == 0) |
| | | qsItemOqcItem.Result = "不合格"; |
| | | else if (qsItemOqcItem.IsPass == 1) |
| | | qsItemOqcItem.Result = "合格"; |
| | | else |
| | | qsItemOqcItem.Result = "未完成"; |
| | | |
| | | if (qsItemOqcItem.Picture is { Length: > 0 }) |
| | | qsItemOqcItem.imageData = |
| | | Convert.ToBase64String(qsItemOqcItem.Picture); |
| | | */ |
| | | if (qsItemOqcItem.Picture is { Length: > 0 }) |
| | | qsItemOqcItem.imageData = |
| | | Convert.ToBase64String(qsItemOqcItem.Picture); |
| | | */ |
| | | //获取不合格数 |
| | | var count = db.Queryable<MesQaItemsDetectDetail12>() |
| | | .Where(s => s.Fstand == "×" && s.MainId == id).Count(); |
| | |
| | | { |
| | | return db.Updateable<MesQaItemsDetectDetail12>() |
| | | .SetColumns(s => s.LastupdateBy == detail.LastupdateBy) |
| | | // .SetColumns(s => s.LastupdateDate == DateTime.Now) |
| | | // .SetColumns(s => s.LastupdateDate == DateTime.Now) |
| | | .SetColumnsIF(StringUtil.IsNotNullOrEmpty(detail.Fstand), |
| | | |
| | | s => s.Fstand == detail.Fstand) |
| | | .SetColumnsIF(StringUtil.IsNotNullOrEmpty(detail.FcheckResu), |
| | | s => s.FcheckResu == detail.FcheckResu) |
| | |
| | | |
| | | return withOracle; |
| | | } |
| | | |
| | | //更新检验明细已检、不合格数量 |
| | | private int updateDetail5(MesQaItemsDetectDetail12 detail) |
| | | { |
| | | var db = SqlSugarHelper.GetInstance(); |
| | | |
| | | |
| | | //查询这个检验项目下的检验数量 |
| | | var count = db.Queryable<MesQaItemsDetectDetail12>() |
| | | .Where(s => s.MainId == detail.MainId).Count(); |
| | | |
| | | |
| | | //获取不合格数 |
| | | var countNo = db.Queryable<MesQaItemsDetectDetail12>() |
| | | .Where(s => s.MainId == detail.MainId && s.Fstand == "×").Count(); |
| | |
| | | .Where(s => s.Id == detail.MainId) |
| | | .ExecuteCommand(); |
| | | }); |
| | | |
| | | |
| | | return withOracle; |
| | | } |
| | | |
| | | //主表修改备注字段 |
| | | public int saveRemarksGid(LLJDto dto) |
| | | { |
| | |
| | | .ExecuteCommand(); |
| | | }); |
| | | } |
| | | |
| | | //子表修改备注字段 |
| | | public int saveRemarksPid(LLJDto dto) |
| | | { |
| | |
| | | .ExecuteCommand(); |
| | | }); |
| | | } |
| | | |
| | | |
| | | //删除主表并且连级删除子表和孙表 |
| | | public int removeXJ(string? releaseNo) |
| | | { |
| | |
| | | { |
| | | var commit = 0; |
| | | //删除主表 |
| | | commit += db.Deleteable<MesQaItemsDetect01>().Where(s => s.ReleaseNo == releaseNo) |
| | | commit += db.Deleteable<MesQaItemsDetect01>() |
| | | .Where(s => s.ReleaseNo == releaseNo) |
| | | .ExecuteCommand(); |
| | | //删除子表 |
| | | commit += db.Deleteable<MesQaItemsDetectDetail5>().Where(s => s.ReleaseNo == releaseNo) |
| | | commit += db.Deleteable<MesQaItemsDetectDetail5>() |
| | | .Where(s => s.ReleaseNo == releaseNo) |
| | | .ExecuteCommand(); |
| | | //删除孙表 |
| | | commit += db.Deleteable<MesQaItemsDetectDetail12>() |
| | |
| | | |
| | | return withOracle; |
| | | } |
| | | |
| | | public bool IqcQaSubmit(LLJDto dto) |
| | | { |
| | | var (factory, company) = UserUtil.GetFactory(dto.userNo); |
| | | try |
| | | { |
| | | // 定义输出参数 |
| | | var outputResult = new SugarParameter("o_Result", null, |
| | | DbType.Int32, ParameterDirection.Output, |
| | | 4000); |
| | | |
| | | var outputMessage = new SugarParameter("o_Msg", null, |
| | | DbType.String, |
| | | ParameterDirection.Output, 4000); |
| | | |
| | | // 定义输入参数 |
| | | var parameters = new List<SugarParameter> |
| | | { |
| | | new("PI_FACTORY", factory, |
| | | DbType.String, ParameterDirection.Input), |
| | | new("PI_COMPANY", company, DbType.String, |
| | | ParameterDirection.Input), |
| | | new("p_Release_No", dto.releaseNo, DbType.String, |
| | | ParameterDirection.Input), |
| | | new("p_User", dto.userNo, DbType.String, |
| | | ParameterDirection.Input), |
| | | outputResult, |
| | | outputMessage |
| | | }; |
| | | |
| | | var db = SqlSugarHelper.GetInstance(); |
| | | |
| | | // 使用 SqlSugar 执行存储过程 |
| | | db.Ado.ExecuteCommand( |
| | | "BEGIN Prc_Mes_Iqc_Qa_Submit82(:PI_FACTORY, :PI_COMPANY, :p_Release_No, :p_User, :o_Result, :o_Msg); END;", |
| | | parameters.ToArray()); |
| | | |
| | | // 获取输出参数的值 |
| | | var resultValue = outputResult.Value?.ToString(); |
| | | var messageValue = outputMessage.Value?.ToString(); |
| | | |
| | | if ("1".Equals(resultValue)) throw new Exception(messageValue); |
| | | |
| | | return true; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | throw new Exception(ex.Message); |
| | | } |
| | | } |
| | | } |