using System; using System.Collections.Generic; using System.Linq; namespace BLL { /// /// 焊前检查台账服务 /// public static class PreWeldInspectionService { public const int CuttingReviewCompleted = 0; public const int CuttingReviewPending = 1; public const int CuttingReviewApproved = 2; /// /// 获取下料检查台账 /// public static Tuple, int> GetCuttingCheckList(string projectId, string pipelineCode, string weldJointCode, int pageIndex, int pageSize) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var query = from c in db.HJGL_PreWeldCuttingCheck join w in db.HJGL_WeldJoint on c.WeldJointId equals w.WeldJointId join p in db.Person_Persons on c.CheckPerson equals p.PersonId into persons from p in persons.DefaultIfEmpty() where string.IsNullOrEmpty(projectId) || c.ProjectId == projectId || w.ProjectId == projectId select new { c, w, CheckPersonName = p == null ? string.Empty : p.PersonName }; if (!string.IsNullOrEmpty(pipelineCode)) { query = query.Where(x => x.w.PipelineCode.Contains(pipelineCode)); } if (!string.IsNullOrEmpty(weldJointCode)) { query = query.Where(x => x.w.WeldJointCode.Contains(weldJointCode)); } int total = query.Count(); var data = query.OrderByDescending(x => x.c.CheckTime) .Skip(pageIndex * pageSize) .Take(pageSize) .Select(x => new Model.PreWeldCuttingCheckItem { CuttingCheckId = x.c.CuttingCheckId, ProjectId = x.c.ProjectId, WeldJointId = x.c.WeldJointId, PipelineCode = x.w.PipelineCode, WeldJointCode = x.w.WeldJointCode, CuttingLength = x.c.CuttingLength, GrooveForm = x.c.GrooveForm, GrooveAngle = x.c.GrooveAngle, IsMaterialCodeBatchNoAccurate = x.c.IsMaterialCodeBatchNoAccurate, IsMaterialQuantityAccurate = x.c.IsMaterialQuantityAccurate, IsQualified = x.c.IsQualified, CheckPerson = x.c.CheckPerson, CheckPersonName = x.CheckPersonName, CheckTime = x.c.CheckTime, CreateUser = x.c.CreateUser, CreateTime = x.c.CreateTime, CheckResult = x.c.CheckResult, UnqualifiedReason = x.c.UnqualifiedReason, RectifyRequirement = x.c.RectifyRequirement, Remark = x.c.Remark, ReviewState = x.c.ReviewState, SpecialReviewerId = x.c.SpecialReviewerId, ReviewerId = x.c.ReviewerId, ReviewTime = x.c.ReviewTime }) .ToList(); PopulateCuttingCheckDetails(db, data); return Tuple.Create(data, total); } } /// /// 获取组对检查台账 /// public static Tuple, int> GetFitupCheckList(string projectId, string pipelineCode, string weldJointCode, int pageIndex, int pageSize) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var query = from f in db.HJGL_PreWeldFitupCheck join w in db.HJGL_WeldJoint on f.WeldJointId equals w.WeldJointId join g in db.Base_GrooveType on f.GrooveTypeId equals g.GrooveTypeId into grooveTypes from g in grooveTypes.DefaultIfEmpty() join p in db.Person_Persons on f.CheckPerson equals p.PersonId into persons from p in persons.DefaultIfEmpty() where string.IsNullOrEmpty(projectId) || f.ProjectId == projectId || w.ProjectId == projectId select new { f, w, g, CheckPersonName = p == null ? string.Empty : p.PersonName }; if (!string.IsNullOrEmpty(pipelineCode)) { query = query.Where(x => x.w.PipelineCode.Contains(pipelineCode)); } if (!string.IsNullOrEmpty(weldJointCode)) { query = query.Where(x => x.w.WeldJointCode.Contains(weldJointCode)); } int total = query.Count(); var data = query.OrderByDescending(x => x.f.CheckTime) .Skip(pageIndex * pageSize) .Take(pageSize) .Select(x => new Model.PreWeldFitupCheckItem { FitupCheckId = x.f.FitupCheckId, ProjectId = x.f.ProjectId, WeldJointId = x.f.WeldJointId, PipelineCode = x.w.PipelineCode, WeldJointCode = x.w.WeldJointCode, GrooveTypeId = x.f.GrooveTypeId, GrooveTypeCode = x.g == null ? string.Empty : x.g.GrooveTypeCode, GrooveTypeName = x.g == null ? string.Empty : x.g.GrooveTypeName, GrooveProcessType = x.f.GrooveProcessType, GrooveAngle = x.f.GrooveAngle, FitupGap = x.f.FitupGap, Misalignment = x.f.Misalignment, WeldReinforcement = x.f.WeldReinforcement, WeldHeight = x.f.WeldHeight, WeldWidth = x.f.WeldWidth, SurfaceDefect = x.f.SurfaceDefect, CheckPerson = x.f.CheckPerson, CheckPersonName = x.CheckPersonName, CheckTime = x.f.CheckTime, CreateUser = x.f.CreateUser, CreateTime = x.f.CreateTime, CheckResult = x.f.CheckResult, UnqualifiedReason = x.f.UnqualifiedReason, RectifyRequirement = x.f.RectifyRequirement, Remark = x.f.Remark }) .ToList(); foreach (var item in data) { item.AttachUrl1 = GetInspectionAttachUrl(db, Const.HJGL_PreWeldFitupCheckMenuId, item.FitupCheckId); } return Tuple.Create(data, total); } } /// /// 获取下料检查实体 /// public static Model.HJGL_PreWeldCuttingCheck GetCuttingCheckById(string cuttingCheckId) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { return db.HJGL_PreWeldCuttingCheck.FirstOrDefault(x => x.CuttingCheckId == cuttingCheckId); } } /// /// 获取组对检查实体 /// public static Model.HJGL_PreWeldFitupCheck GetFitupCheckById(string fitupCheckId) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { return db.HJGL_PreWeldFitupCheck.FirstOrDefault(x => x.FitupCheckId == fitupCheckId); } } /// /// 兼容旧调用:按焊口获取组对检查记录,返回最新一条 /// public static Model.HJGL_PreWeldFitupCheck GetFitupCheckByWeldJointId(string weldJointId) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { return db.HJGL_PreWeldFitupCheck.Where(x => x.WeldJointId == weldJointId) .OrderByDescending(x => x.CheckTime) .FirstOrDefault(); } } /// /// 按焊口获取下料记录 /// public static List GetCuttingChecksByWeldJointId(string weldJointId) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { return db.HJGL_PreWeldCuttingCheck.Where(x => x.WeldJointId == weldJointId) .OrderByDescending(x => x.CheckTime) .ToList(); } } public static List GetCuttingCheckItemsByWeldJointId(string weldJointId) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var data = (from c in db.HJGL_PreWeldCuttingCheck join w in db.HJGL_WeldJoint on c.WeldJointId equals w.WeldJointId join p in db.Person_Persons on c.CheckPerson equals p.PersonId into persons from p in persons.DefaultIfEmpty() where c.WeldJointId == weldJointId orderby c.CheckTime descending, c.CreateTime descending select new Model.PreWeldCuttingCheckItem { CuttingCheckId = c.CuttingCheckId, ProjectId = c.ProjectId, WeldJointId = c.WeldJointId, PipelineCode = w.PipelineCode, WeldJointCode = w.WeldJointCode, CuttingLength = c.CuttingLength, GrooveForm = c.GrooveForm, GrooveAngle = c.GrooveAngle, IsMaterialCodeBatchNoAccurate = c.IsMaterialCodeBatchNoAccurate, IsMaterialQuantityAccurate = c.IsMaterialQuantityAccurate, IsQualified = c.IsQualified, CheckPerson = c.CheckPerson, CheckPersonName = p == null ? string.Empty : p.PersonName, CheckTime = c.CheckTime, CreateUser = c.CreateUser, CreateTime = c.CreateTime, CheckResult = c.CheckResult, UnqualifiedReason = c.UnqualifiedReason, RectifyRequirement = c.RectifyRequirement, Remark = c.Remark, ReviewState = c.ReviewState, SpecialReviewerId = c.SpecialReviewerId, ReviewerId = c.ReviewerId, ReviewTime = c.ReviewTime }).ToList(); PopulateCuttingCheckDetails(db, data); return data; } } /// /// 按焊口获取组对记录 /// public static List GetFitupChecksByWeldJointId(string weldJointId) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { return db.HJGL_PreWeldFitupCheck.Where(x => x.WeldJointId == weldJointId) .OrderByDescending(x => x.CheckTime) .ToList(); } } /// /// 保存下料检查;传入主键时修改对应记录,否则新增一条记录 /// public static string SaveCuttingCheck(Model.PreWeldCuttingCheckInput item) { if (item == null) { throw new ArgumentNullException("item"); } if (string.IsNullOrEmpty(item.WeldJointId)) { throw new ArgumentException("焊口ID不能为空。"); } using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var weldJoint = db.HJGL_WeldJoint.FirstOrDefault(x => x.WeldJointId == item.WeldJointId); if (weldJoint == null) { throw new ArgumentException("未找到对应焊口。"); } var check = string.IsNullOrEmpty(item.CuttingCheckId) ? null : db.HJGL_PreWeldCuttingCheck.FirstOrDefault(x => x.CuttingCheckId == item.CuttingCheckId); if (check == null) { check = new Model.HJGL_PreWeldCuttingCheck { CuttingCheckId = string.IsNullOrEmpty(item.CuttingCheckId) ? Guid.NewGuid().ToString() : item.CuttingCheckId, CreateTime = DateTime.Now }; db.HJGL_PreWeldCuttingCheck.InsertOnSubmit(check); } check.WeldJointId = item.WeldJointId; check.ProjectId = string.IsNullOrEmpty(item.ProjectId) ? weldJoint.ProjectId : item.ProjectId; check.CuttingLength = item.CuttingLength; check.GrooveForm = item.GrooveForm; check.GrooveAngle = item.GrooveAngle; check.IsMaterialCodeBatchNoAccurate = item.IsMaterialCodeBatchNoAccurate; check.IsMaterialQuantityAccurate = item.IsMaterialQuantityAccurate; // 下料检查合格规则:材料编码批次和材料数量都准确才判定为合格。 check.IsQualified = item.IsMaterialCodeBatchNoAccurate && item.IsMaterialQuantityAccurate; check.CheckPerson = item.CheckPerson; check.CheckTime = item.CheckTime ?? DateTime.Now; check.CreateUser = item.CreateUser ?? item.CheckPerson; check.CheckResult = item.CheckResult; check.UnqualifiedReason = item.UnqualifiedReason; check.RectifyRequirement = item.RectifyRequirement; check.Remark = item.Remark; bool requiresSpecialReview = !item.IsMaterialCodeBatchNoAccurate; if (requiresSpecialReview && string.IsNullOrWhiteSpace(item.SpecialReviewerId)) { throw new ArgumentException("材料编码或批次不准确时必须选择专项审核办理人。"); } if (requiresSpecialReview && !db.SitePerson_Person.Any(x => x.ProjectId == check.ProjectId && x.PersonId == item.SpecialReviewerId && x.States == Const.ProjectPersonStates_1)) { throw new ArgumentException("专项审核办理人不属于当前项目或已停用。"); } check.ReviewState = requiresSpecialReview ? CuttingReviewPending : CuttingReviewCompleted; check.SpecialReviewerId = requiresSpecialReview ? item.SpecialReviewerId : null; check.ReviewerId = null; check.ReviewTime = null; SaveCuttingMaterialSnapshots(db, check, item.Materials); SyncCuttingReviewTodo(db, check, item.CreateUser ?? item.CheckPerson); db.SubmitChanges(); SaveInspectionAttachUrl(item.AttachUrl1, Const.HJGL_PreWeldCuttingCheckMenuId, check.CuttingCheckId); return check.CuttingCheckId; } } public static string ReviewCuttingCheck(Model.PreWeldCuttingCheckReviewInput item) { if (item == null || string.IsNullOrWhiteSpace(item.CuttingCheckId)) { throw new ArgumentException("下料检查记录ID不能为空。"); } using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var check = db.HJGL_PreWeldCuttingCheck.FirstOrDefault(x => x.CuttingCheckId == item.CuttingCheckId); if (check == null) { throw new ArgumentException("未找到下料检查记录。"); } if (check.ReviewState != CuttingReviewPending) { throw new InvalidOperationException("该专项审核已办理或无需办理。"); } if (string.IsNullOrWhiteSpace(item.ReviewerId) || check.SpecialReviewerId != item.ReviewerId) { throw new InvalidOperationException("当前人员不是该专项审核的办理人。"); } if (item.Materials != null) { SaveCuttingMaterialSnapshots(db, check, item.Materials); } if (!string.IsNullOrWhiteSpace(item.Remark)) { check.Remark = item.Remark; } check.ReviewState = CuttingReviewApproved; check.ReviewerId = item.ReviewerId; check.ReviewTime = item.ReviewTime ?? DateTime.Now; CompleteCuttingReviewTodo(db, check.CuttingCheckId, item.ReviewerId); db.SubmitChanges(); return check.CuttingCheckId; } } /// /// 保存组对检查;传入主键时修改对应记录,否则新增一条记录 /// public static string SaveFitupCheck(Model.PreWeldFitupCheckInput item) { if (item == null) { throw new ArgumentNullException("item"); } if (string.IsNullOrEmpty(item.WeldJointId)) { throw new ArgumentException("焊口ID不能为空。"); } /* if (string.IsNullOrEmpty(item.GrooveTypeId)) { throw new ArgumentException("坡口类型不能为空。"); }*/ using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var weldJoint = db.HJGL_WeldJoint.FirstOrDefault(x => x.WeldJointId == item.WeldJointId); if (weldJoint == null) { throw new ArgumentException("未找到对应焊口。"); } /* if (!db.Base_GrooveType.Any(x => x.GrooveTypeId == item.GrooveTypeId)) { throw new ArgumentException("坡口类型不存在。"); }*/ var check = string.IsNullOrEmpty(item.FitupCheckId) ? null : db.HJGL_PreWeldFitupCheck.FirstOrDefault(x => x.FitupCheckId == item.FitupCheckId); if (check == null) { check = new Model.HJGL_PreWeldFitupCheck { FitupCheckId = string.IsNullOrEmpty(item.FitupCheckId) ? Guid.NewGuid().ToString() : item.FitupCheckId, CreateTime = DateTime.Now }; db.HJGL_PreWeldFitupCheck.InsertOnSubmit(check); } check.ProjectId = string.IsNullOrEmpty(item.ProjectId) ? weldJoint.ProjectId : item.ProjectId; check.WeldJointId = item.WeldJointId; //check.GrooveTypeId = item.GrooveTypeId; check.GrooveProcessType = item.GrooveProcessType; check.GrooveAngle = item.GrooveAngle; check.FitupGap = item.FitupGap; check.Misalignment = item.Misalignment; check.WeldReinforcement = item.WeldReinforcement; check.WeldHeight = item.WeldHeight; check.WeldWidth = item.WeldWidth; check.SurfaceDefect = item.SurfaceDefect; check.CheckPerson = item.CheckPerson; check.CheckTime = item.CheckTime ?? DateTime.Now; check.CreateUser = item.CreateUser ?? item.CheckPerson; check.CheckResult = item.CheckResult; check.UnqualifiedReason = item.UnqualifiedReason; check.RectifyRequirement = item.RectifyRequirement; check.Remark = item.Remark; // 组对检查需要同步回写焊口主表,保证焊口基础信息保持最新 // weldJoint.GrooveTypeId = item.GrooveTypeId; weldJoint.GrooveProcessType = item.GrooveProcessType; weldJoint.GrooveAngle = item.GrooveAngle; weldJoint.FitupGap = item.FitupGap; weldJoint.Misalignment = item.Misalignment; db.SubmitChanges(); SaveInspectionAttachUrl(item.AttachUrl1, Const.HJGL_PreWeldFitupCheckMenuId, check.FitupCheckId); return check.FitupCheckId; } } /// /// 获取防腐检查台账 /// public static Tuple, int> GetAntiCorrosionCheckList(string projectId, string materialCode, string paintCode, string intermediatePaint, string topcoat, string filmThickness, string checkResult, DateTime? startTime, DateTime? endTime, int pageIndex, int pageSize) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var query = from r in db.HJGL_AntiCorrosionCheckRecord join m in db.HJGL_MaterialCodeLib on r.MaterialCode equals m.MaterialCode into materialJoin from m in materialJoin.DefaultIfEmpty() join paint in db.Tw_PaintCodeDict on r.PaintId equals paint.Id into paintJoin from paint in paintJoin.DefaultIfEmpty() join person in db.Person_Persons on r.CheckPerson equals person.PersonId into personJoin from person in personJoin.DefaultIfEmpty() where string.IsNullOrEmpty(projectId) || r.ProjectId == projectId select new { r, m, paint, person }; if (!string.IsNullOrEmpty(materialCode)) { query = query.Where(x => x.r.MaterialCode.Contains(materialCode)); } if (!string.IsNullOrEmpty(paintCode)) { query = query.Where(x => x.paint != null && x.paint.PaintCode.Contains(paintCode)); } if (!string.IsNullOrEmpty(intermediatePaint)) { query = query.Where(x => x.paint != null && x.paint.IntermediatePaint.Contains(intermediatePaint)); } if (!string.IsNullOrEmpty(topcoat)) { query = query.Where(x => x.paint != null && x.paint.Topcoat.Contains(topcoat)); } decimal filmThicknessValue; if (!string.IsNullOrWhiteSpace(filmThickness) && decimal.TryParse(filmThickness, out filmThicknessValue)) { query = query.Where(x => x.r.FilmThickness == filmThicknessValue); } if (!string.IsNullOrEmpty(checkResult)) { query = query.Where(x => x.r.CheckResult == checkResult); } if (startTime.HasValue) { query = query.Where(x => x.r.CheckTime >= startTime.Value); } if (endTime.HasValue) { query = query.Where(x => x.r.CheckTime < endTime.Value.AddDays(1)); } int total = query.Count(); var data = query.OrderByDescending(x => x.r.CheckTime) .Skip(pageIndex * pageSize) .Take(pageSize) .Select(x => new Model.AntiCorrosionCheckRecordItem { AntiCorrosionCheckId = x.r.AntiCorrosionCheckId, ProjectId = x.r.ProjectId, UnitWorkId = x.r.UnitWorkId, MaterialId = x.r.MaterialId, MaterialCode = x.r.MaterialCode, MaterialName = x.m == null ? string.Empty : x.m.MaterialName, MaterialSpec = x.m == null ? string.Empty : x.m.MaterialSpec, MaterialMade = x.m == null ? string.Empty : x.m.MaterialMade, MaterialDef = x.m == null ? string.Empty : x.m.MaterialDef, MaterialUnit = x.m == null ? string.Empty : x.m.MaterialUnit, HeatNo = x.m == null ? string.Empty : x.m.HeatNo, BatchNo = x.m == null ? string.Empty : x.m.BatchNo, Code = x.m == null ? string.Empty : x.m.Code, AnticorrosionLevel = x.r.AnticorrosionLevel, PaintId = x.r.PaintId, PaintCode = x.paint == null ? string.Empty : x.paint.PaintCode, Primer = x.paint == null ? string.Empty : x.paint.Primer, IntermediatePaint = x.paint == null ? string.Empty : x.paint.IntermediatePaint, Topcoat = x.paint == null ? string.Empty : x.paint.Topcoat, ColorCode = x.paint == null ? string.Empty : x.paint.ColorCode, FilmThickness = x.r.FilmThickness, SandBlasting = x.r.SandBlasting, RustSandBlasting = x.r.RustSandBlasting, CheckResult = x.r.CheckResult, CheckPerson = x.r.CheckPerson, CheckPersonName = x.person == null ? string.Empty : x.person.PersonName, CheckTime = x.r.CheckTime, UnqualifiedReason = x.r.UnqualifiedReason, RectifyRequirement = x.r.RectifyRequirement, Remark = x.r.Remark, CreateUser = x.r.CreateUser, CreateTime = x.r.CreateTime }) .ToList(); foreach (var item in data) { item.AttachUrl1 = GetInspectionAttachUrl(db, Const.Tw_AntiCorrosionCheckRecordMenuId, item.AntiCorrosionCheckId); } return Tuple.Create(data, total); } } /// /// 根据防腐记录ID获取详情 /// public static Model.AntiCorrosionCheckRecordItem GetAntiCorrosionCheckById(string antiCorrosionCheckId) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var query = from r in db.HJGL_AntiCorrosionCheckRecord join m in db.HJGL_MaterialCodeLib on r.MaterialCode equals m.MaterialCode into materialJoin from m in materialJoin.DefaultIfEmpty() join paint in db.Tw_PaintCodeDict on r.PaintId equals paint.Id into paintJoin from paint in paintJoin.DefaultIfEmpty() join person in db.Person_Persons on r.CheckPerson equals person.PersonId into personJoin from person in personJoin.DefaultIfEmpty() where r.AntiCorrosionCheckId == antiCorrosionCheckId select new Model.AntiCorrosionCheckRecordItem { AntiCorrosionCheckId = r.AntiCorrosionCheckId, ProjectId = r.ProjectId, UnitWorkId = r.UnitWorkId, MaterialId = r.MaterialId, MaterialCode = r.MaterialCode, MaterialName = m == null ? string.Empty : m.MaterialName, MaterialSpec = m == null ? string.Empty : m.MaterialSpec, MaterialMade = m == null ? string.Empty : m.MaterialMade, MaterialDef = m == null ? string.Empty : m.MaterialDef, MaterialUnit = m == null ? string.Empty : m.MaterialUnit, HeatNo = m == null ? string.Empty : m.HeatNo, BatchNo = m == null ? string.Empty : m.BatchNo, Code = m == null ? string.Empty : m.Code, AnticorrosionLevel = r.AnticorrosionLevel, PaintId = r.PaintId, PaintCode = paint == null ? string.Empty : paint.PaintCode, Primer = paint == null ? string.Empty : paint.Primer, IntermediatePaint = paint == null ? string.Empty : paint.IntermediatePaint, Topcoat = paint == null ? string.Empty : paint.Topcoat, ColorCode = paint == null ? string.Empty : paint.ColorCode, FilmThickness = r.FilmThickness, SandBlasting = r.SandBlasting, RustSandBlasting = r.RustSandBlasting, CheckResult = r.CheckResult, CheckPerson = r.CheckPerson, CheckPersonName = person == null ? string.Empty : person.PersonName, CheckTime = r.CheckTime, UnqualifiedReason = r.UnqualifiedReason, RectifyRequirement = r.RectifyRequirement, Remark = r.Remark, CreateUser = r.CreateUser, CreateTime = r.CreateTime }; var item = query.FirstOrDefault(); if (item != null) { item.AttachUrl1 = GetInspectionAttachUrl(db, Const.Tw_AntiCorrosionCheckRecordMenuId, item.AntiCorrosionCheckId); } return item; } } /// /// 按材料编码获取防腐记录列表 /// public static List GetAntiCorrosionChecksByMaterialCode(string materialCode, string projectId) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var query = from r in db.HJGL_AntiCorrosionCheckRecord join m in db.HJGL_MaterialCodeLib on r.MaterialCode equals m.MaterialCode into materialJoin from m in materialJoin.DefaultIfEmpty() join paint in db.Tw_PaintCodeDict on r.PaintId equals paint.Id into paintJoin from paint in paintJoin.DefaultIfEmpty() join person in db.Person_Persons on r.CheckPerson equals person.PersonId into personJoin from person in personJoin.DefaultIfEmpty() where r.MaterialCode == materialCode && (string.IsNullOrEmpty(projectId) || r.ProjectId == projectId) orderby r.CheckTime descending select new Model.AntiCorrosionCheckRecordItem { AntiCorrosionCheckId = r.AntiCorrosionCheckId, ProjectId = r.ProjectId, UnitWorkId = r.UnitWorkId, MaterialId = r.MaterialId, MaterialCode = r.MaterialCode, MaterialName = m == null ? string.Empty : m.MaterialName, MaterialSpec = m == null ? string.Empty : m.MaterialSpec, MaterialMade = m == null ? string.Empty : m.MaterialMade, MaterialDef = m == null ? string.Empty : m.MaterialDef, MaterialUnit = m == null ? string.Empty : m.MaterialUnit, HeatNo = m == null ? string.Empty : m.HeatNo, BatchNo = m == null ? string.Empty : m.BatchNo, Code = m == null ? string.Empty : m.Code, AnticorrosionLevel = r.AnticorrosionLevel, PaintId = r.PaintId, PaintCode = paint == null ? string.Empty : paint.PaintCode, Primer = paint == null ? string.Empty : paint.Primer, IntermediatePaint = paint == null ? string.Empty : paint.IntermediatePaint, Topcoat = paint == null ? string.Empty : paint.Topcoat, ColorCode = paint == null ? string.Empty : paint.ColorCode, FilmThickness = r.FilmThickness, SandBlasting = r.SandBlasting, RustSandBlasting = r.RustSandBlasting, CheckResult = r.CheckResult, CheckPerson = r.CheckPerson, CheckPersonName = person == null ? string.Empty : person.PersonName, CheckTime = r.CheckTime, UnqualifiedReason = r.UnqualifiedReason, RectifyRequirement = r.RectifyRequirement, Remark = r.Remark, CreateUser = r.CreateUser, CreateTime = r.CreateTime }; var data = query.ToList(); foreach (var item in data) { item.AttachUrl1 = GetInspectionAttachUrl(db, Const.Tw_AntiCorrosionCheckRecordMenuId, item.AntiCorrosionCheckId); } return data; } } /// /// 按焊口获取防腐检查记录列表 /// /// /// public static List GetAntiCorrosionChecksByWeldJointId(string weldJointId) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var getweldJointPaintId=(from x in db.HJGL_WeldJoint join y in db.HJGL_Pipeline on x.PipelineId equals y.PipelineId where x.WeldJointId == weldJointId select y.PaintId).FirstOrDefault(); var getweldJointMaterialCode = (from x in db.HJGL_PipeLineMat where x.WeldJointId == weldJointId select x.MaterialCode).FirstOrDefault(); var query = from r in db.HJGL_AntiCorrosionCheckRecord join m in db.HJGL_MaterialCodeLib on r.MaterialCode equals m.MaterialCode into materialJoin from m in materialJoin.DefaultIfEmpty() join paint in db.Tw_PaintCodeDict on r.PaintId equals paint.Id into paintJoin from paint in paintJoin.DefaultIfEmpty() join person in db.Person_Persons on r.CheckPerson equals person.PersonId into personJoin from person in personJoin.DefaultIfEmpty() join weldmat in db.HJGL_PipeLineMat on r.MaterialCode equals weldmat.MaterialCode into weldJoin from weldmat in weldJoin.DefaultIfEmpty() where weldmat.WeldJointId == weldJointId && (string.IsNullOrEmpty(getweldJointPaintId) || r.PaintId == getweldJointPaintId) orderby r.CheckTime descending select new Model.AntiCorrosionCheckRecordItem { AntiCorrosionCheckId = r.AntiCorrosionCheckId, ProjectId = r.ProjectId, UnitWorkId = r.UnitWorkId, MaterialId = r.MaterialId, MaterialCode = r.MaterialCode, MaterialName = m == null ? string.Empty : m.MaterialName, MaterialSpec = m == null ? string.Empty : m.MaterialSpec, MaterialMade = m == null ? string.Empty : m.MaterialMade, MaterialDef = m == null ? string.Empty : m.MaterialDef, MaterialUnit = m == null ? string.Empty : m.MaterialUnit, HeatNo = m == null ? string.Empty : m.HeatNo, BatchNo = m == null ? string.Empty : m.BatchNo, Code = m == null ? string.Empty : m.Code, AnticorrosionLevel = r.AnticorrosionLevel, PaintId = r.PaintId, PaintCode = paint == null ? string.Empty : paint.PaintCode, Primer = paint == null ? string.Empty : paint.Primer, IntermediatePaint = paint == null ? string.Empty : paint.IntermediatePaint, Topcoat = paint == null ? string.Empty : paint.Topcoat, ColorCode = paint == null ? string.Empty : paint.ColorCode, FilmThickness = r.FilmThickness, SandBlasting = r.SandBlasting, RustSandBlasting = r.RustSandBlasting, CheckResult = r.CheckResult, CheckPerson = r.CheckPerson, CheckPersonName = person == null ? string.Empty : person.PersonName, CheckTime = r.CheckTime, UnqualifiedReason = r.UnqualifiedReason, RectifyRequirement = r.RectifyRequirement, Remark = r.Remark, CreateUser = r.CreateUser, CreateTime = r.CreateTime }; var data = query.ToList(); foreach (var item in data) { item.AttachUrl1 = GetInspectionAttachUrl(db, Const.Tw_AntiCorrosionCheckRecordMenuId, item.AntiCorrosionCheckId); } return data; } } /// /// 保存防腐检查,始终新增一条历史记录 /// public static string SaveAntiCorrosionCheck(Model.AntiCorrosionCheckRecordInput item) { if (item == null) { throw new ArgumentNullException("item"); } if (string.IsNullOrEmpty(item.MaterialCode)) { throw new ArgumentException("材料编码不能为空。"); } if (string.IsNullOrEmpty(item.PaintId)) { throw new ArgumentException("防腐代码不能为空。"); } using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { if (!db.Tw_PaintCodeDict.Any(x => x.Id == item.PaintId && x.IsUsed)) { throw new ArgumentException("防腐代码不存在或已停用。"); } var check = string.IsNullOrEmpty(item.AntiCorrosionCheckId) ? null : db.HJGL_AntiCorrosionCheckRecord.FirstOrDefault(x => x.AntiCorrosionCheckId == item.AntiCorrosionCheckId); if (check == null) { check = new Model.HJGL_AntiCorrosionCheckRecord { AntiCorrosionCheckId = string.IsNullOrEmpty(item.AntiCorrosionCheckId) ? Guid.NewGuid().ToString() : item.AntiCorrosionCheckId, CreateTime = DateTime.Now }; db.HJGL_AntiCorrosionCheckRecord.InsertOnSubmit(check); } var materialId = item.MaterialId; check.ProjectId = item.ProjectId; check.MaterialId = materialId; check.MaterialCode = item.MaterialCode; check.AnticorrosionLevel = item.AnticorrosionLevel; check.PaintId = item.PaintId; check.FilmThickness = item.FilmThickness; check.SandBlasting = item.SandBlasting; check.RustSandBlasting = item.RustSandBlasting; check.CheckResult = item.CheckResult; check.CheckPerson = item.CheckPerson; check.CheckTime = item.CheckTime ?? DateTime.Now; check.UnqualifiedReason = item.UnqualifiedReason; check.RectifyRequirement = item.RectifyRequirement; check.Remark = item.Remark; check.CreateUser = string.IsNullOrEmpty(item.CreateUser) ? item.CheckPerson : item.CreateUser; db.SubmitChanges(); SaveInspectionAttachUrl(item.AttachUrl1, Const.Tw_AntiCorrosionCheckRecordMenuId, check.AntiCorrosionCheckId); return check.AntiCorrosionCheckId; } } /// /// 保存检查附件 /// private static void SaveInspectionAttachUrl(string attachUrl, string menuId, string dataId) { if (attachUrl == null) { return; } if (!string.IsNullOrEmpty(attachUrl)) { UploadFileService.SaveAttachUrl(UploadFileService.GetSourceByAttachUrl(attachUrl, 10, null), attachUrl, menuId, dataId); } else { CommonService.DeleteAttachFileById(menuId, dataId); } } private static void SaveCuttingMaterialSnapshots(Model.SGGLDB db, Model.HJGL_PreWeldCuttingCheck check, IList materials) { var currentMaterials = db.HJGL_PipeLineMat .Where(x => x.WeldJointId == check.WeldJointId) .OrderBy(x => x.PipeLineMatId) .ToList(); var inputs = materials ?? currentMaterials.Select((x, index) => new Model.PreWeldCuttingMaterialInput { PipeLineMatId = x.PipeLineMatId, MaterialSide = index + 1, ReportedMainCode = x.MaterialCode }).ToList(); var existing = db.HJGL_PreWeldCuttingCheckMaterial .Where(x => x.CuttingCheckId == check.CuttingCheckId) .ToList(); var originalCodeMap = existing.GroupBy(x => x.PipeLineMatId) .ToDictionary(x => x.Key, x => x.First().OriginalMainCode); db.HJGL_PreWeldCuttingCheckMaterial.DeleteAllOnSubmit(existing); int side = 0; foreach (var input in inputs) { side++; var material = currentMaterials.FirstOrDefault(x => x.PipeLineMatId == input.PipeLineMatId); if (material == null) { throw new ArgumentException("反馈材料不属于当前焊口。"); } string reportedMainCode = string.IsNullOrWhiteSpace(input.ReportedMainCode) ? material.MaterialCode : input.ReportedMainCode.Trim(); db.HJGL_PreWeldCuttingCheckMaterial.InsertOnSubmit(new Model.HJGL_PreWeldCuttingCheckMaterial { CuttingCheckMaterialId = Guid.NewGuid().ToString(), CuttingCheckId = check.CuttingCheckId, PipeLineMatId = material.PipeLineMatId, MaterialSide = input.MaterialSide > 0 ? input.MaterialSide : side, // 专项审核再次保存时保留首次提交快照,避免原始主编码被当前正式数据覆盖。 OriginalMainCode = originalCodeMap.ContainsKey(material.PipeLineMatId) ? originalCodeMap[material.PipeLineMatId] : material.MaterialCode, ReportedMainCode = reportedMainCode, IsBatchChanged = !string.Equals(material.MaterialCode, reportedMainCode, StringComparison.OrdinalIgnoreCase) }); } } private static void SyncCuttingReviewTodo(Model.SGGLDB db, Model.HJGL_PreWeldCuttingCheck check, string creator) { var todos = db.Workflow_TodoItems.Where(x => x.FlowId == check.CuttingCheckId && x.WorkflowName == "下料抽检专项审核").ToList(); db.Workflow_TodoItems.DeleteAllOnSubmit(todos); if (check.ReviewState != CuttingReviewPending) { return; } db.Workflow_TodoItems.InsertOnSubmit(new Model.Workflow_TodoItems { Id = SQLHelper.GetNewID(), SysCode = WorkflowTodoitemsService.SysCode, FlowId = check.CuttingCheckId, RequestName = "下料抽检结果不准确,请专项审核", WorkflowName = "下料抽检专项审核", NodeName = "专项审核", PCUrl = "HJGL/PreWeld/CuttingCheckEdit.aspx?CuttingCheckId=" + check.CuttingCheckId + "&review=1", AppUrl = "/pages/hjgl/preWeld/cuttingCheckReview?cuttingCheckId=" + check.CuttingCheckId, Creator = creator, CreateDateTime = DateTime.Now, Receiver = check.SpecialReviewerId, ReceiveDateTime = DateTime.Now, Status = (int)WorkflowTodoitemsService.Status.待办 }); } private static void CompleteCuttingReviewTodo(Model.SGGLDB db, string cuttingCheckId, string reviewerId) { var todo = db.Workflow_TodoItems.FirstOrDefault(x => x.FlowId == cuttingCheckId && x.Receiver == reviewerId && x.WorkflowName == "下料抽检专项审核" && x.Status == (int)WorkflowTodoitemsService.Status.待办); if (todo != null) { todo.Status = (int)WorkflowTodoitemsService.Status.已办; } } private static void PopulateCuttingCheckDetails(Model.SGGLDB db, IList data) { if (data == null || data.Count == 0) { return; } var ids = data.Select(x => x.CuttingCheckId).ToList(); var snapshots = db.HJGL_PreWeldCuttingCheckMaterial .Where(x => ids.Contains(x.CuttingCheckId)) .ToList(); var personIds = data.SelectMany(x => new[] { x.SpecialReviewerId, x.ReviewerId }) .Where(x => !string.IsNullOrEmpty(x)).Distinct().ToList(); var personNames = db.Person_Persons.Where(x => personIds.Contains(x.PersonId)) .ToDictionary(x => x.PersonId, x => x.PersonName); foreach (var item in data) { item.AttachUrl1 = GetInspectionAttachUrl(db, Const.HJGL_PreWeldCuttingCheckMenuId, item.CuttingCheckId); item.ReviewStateText = item.ReviewState == CuttingReviewPending ? "待专项审核" : item.ReviewState == CuttingReviewApproved ? "专项审核完成" : "普通完成"; string name; item.SpecialReviewerName = personNames.TryGetValue(item.SpecialReviewerId ?? string.Empty, out name) ? name : string.Empty; item.ReviewerName = personNames.TryGetValue(item.ReviewerId ?? string.Empty, out name) ? name : string.Empty; item.Materials = snapshots.Where(x => x.CuttingCheckId == item.CuttingCheckId) .OrderBy(x => x.MaterialSide) .Select(x => new Model.PreWeldCuttingMaterialItem { PipeLineMatId = x.PipeLineMatId, MaterialSide = x.MaterialSide, OriginalMainCode = x.OriginalMainCode, ReportedMainCode = x.ReportedMainCode, IsBatchChanged = x.IsBatchChanged }).ToList(); } } /// /// 根据菜单和记录ID获取检查附件地址 /// private static string GetInspectionAttachUrl(Model.SGGLDB db, string menuId, string dataId) { var attachUrl = db.AttachFile .Where(x => x.MenuId == menuId && x.ToKeyId == dataId) .Select(x => x.AttachUrl) .FirstOrDefault(); return string.IsNullOrEmpty(attachUrl) ? attachUrl : attachUrl.Replace('\\', '/'); } } }