feat: 完善材料管理与焊接业务功能
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace BLL
|
||||
{
|
||||
/// <summary>
|
||||
/// 焊接日报待审核接口服务适配层。
|
||||
/// </summary>
|
||||
public static class APIWeldReportService
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取焊接日报待审核列表。
|
||||
/// </summary>
|
||||
public static List<Model.WeldingDailyTempDetailItem> GetPendingWeldingDailyTempDetailList(
|
||||
string projectId, string unitWorkId, string weldingDate, string pipelineCode, string welderCode)
|
||||
{
|
||||
return WeldingDailyService.GetWeldingDailyTempDetailList(projectId, unitWorkId,
|
||||
ParseWeldingDate(weldingDate), pipelineCode, welderCode);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查看单条焊接日报待审核明细。
|
||||
/// </summary>
|
||||
public static Model.WeldingDailyTempDetailItem GetPendingWeldingDailyTempDetail(string tempDetailId)
|
||||
{
|
||||
return WeldingDailyService.GetWeldingDailyTempDetailById(tempDetailId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量审核通过焊接日报待审核明细。
|
||||
/// </summary>
|
||||
public static string AuditPendingWeldingDailyTempDetails(string[] tempDetailIds, string auditMan)
|
||||
{
|
||||
// 审核规则、建日报、组批及状态回写统一由PC端已经使用的公共服务处理。
|
||||
return WeldingDailyService.AuditWeldingDailyTempDetails(tempDetailIds, auditMan);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量删除焊接日报待审核明细。
|
||||
/// </summary>
|
||||
public static string DeletePendingWeldingDailyTempDetails(string[] tempDetailIds)
|
||||
{
|
||||
return WeldingDailyService.DeleteWeldingDailyTempDetails(tempDetailIds);
|
||||
}
|
||||
|
||||
private static DateTime? ParseWeldingDate(string weldingDate)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(weldingDate))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
DateTime parsedDate;
|
||||
if (!DateTime.TryParse(weldingDate, out parsedDate))
|
||||
{
|
||||
throw new ArgumentException("焊接日期格式不正确");
|
||||
}
|
||||
|
||||
return parsedDate.Date;
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -205,6 +205,7 @@
|
||||
<Compile Include="API\HJGL\APIPipelineComponentService.cs" />
|
||||
<Compile Include="API\HJGL\APIPreWeldInspectionService.cs" />
|
||||
<Compile Include="API\HJGL\APIPreWeldingDailyService.cs" />
|
||||
<Compile Include="API\HJGL\APIWeldReportService.cs" />
|
||||
<Compile Include="API\HJGL\APIReportQueryService.cs" />
|
||||
<Compile Include="API\HJGL\APITestPackageService.cs" />
|
||||
<Compile Include="API\HJGL\APITrainNumberManagerService.cs" />
|
||||
@@ -918,4 +919,4 @@
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
</Project>
|
||||
|
||||
@@ -259,28 +259,60 @@ namespace BLL
|
||||
/// <param name="pipelineIds"></param>
|
||||
/// <param name="warehouseCode"></param>
|
||||
/// <returns></returns>
|
||||
public static List<Tw_PipeMatMatchOutput> GetPipeMatMatch(string projectId, List<string> pipelineIds, string warehouseCode, Dictionary<string, List<string>> priorityWeldJoints = null)
|
||||
public static List<Tw_PipeMatMatchOutput> GetPipeMatMatch(string projectId, List<string> pipelineIds, string warehouseCode, Dictionary<string, List<string>> priorityWeldJoints = null, string pipeArea = null)
|
||||
{
|
||||
using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
|
||||
{
|
||||
var results = new List<Tw_PipeMatMatchOutput>();
|
||||
if (pipelineIds == null || !pipelineIds.Any())
|
||||
{
|
||||
return results;
|
||||
}
|
||||
pipelineIds = pipelineIds.Where(x => !string.IsNullOrEmpty(x)).Distinct().ToList();
|
||||
if (!pipelineIds.Any())
|
||||
{
|
||||
return results;
|
||||
}
|
||||
|
||||
// 获取所需材料列表
|
||||
var pipeLineMats = (from x in db.HJGL_PipeLineMat
|
||||
join z in db.HJGL_Pipeline on x.PipelineId equals z.PipelineId
|
||||
join m in db.WBS_UnitWork on z.UnitWorkId equals m.UnitWorkId
|
||||
join w in db.HJGL_WeldJoint on x.WeldJointId equals w.WeldJointId into weldJoin
|
||||
from w in weldJoin.DefaultIfEmpty()
|
||||
// 材料匹配只处理所需量大于0的非散件材料,避免零用量明细占用库存或影响焊口生成任务单判断。
|
||||
where z.ProjectId == projectId && pipelineIds.Contains(z.PipelineId) && x.PrefabricatedComponents != "" && (x.Number ?? 0) > 0
|
||||
select new
|
||||
{
|
||||
PipeLineMat = x,
|
||||
PipelineCode = z.PipelineCode,
|
||||
UnitWorkId = z.UnitWorkId,
|
||||
UnitWorkName = m.UnitWorkName,
|
||||
WeldJointCode = w == null ? null : w.WeldJointCode
|
||||
}).ToList();
|
||||
// 先保留当前区域内已焊和未焊数据,用于识别“已经开工但尚未完成”的续作组件。
|
||||
var pipeLineMatQuery = from x in db.HJGL_PipeLineMat
|
||||
join z in db.HJGL_Pipeline on x.PipelineId equals z.PipelineId
|
||||
join m in db.WBS_UnitWork on z.UnitWorkId equals m.UnitWorkId
|
||||
join w in db.HJGL_WeldJoint on x.WeldJointId equals w.WeldJointId into weldJoin
|
||||
from w in weldJoin.DefaultIfEmpty()
|
||||
// 先保留组件全部材料行,避免数量为0的历史已焊口导致续作组件识别遗漏。
|
||||
where z.ProjectId == projectId && pipelineIds.Contains(z.PipelineId)
|
||||
&& x.PrefabricatedComponents != null && x.PrefabricatedComponents != ""
|
||||
select new
|
||||
{
|
||||
PipeLineMat = x,
|
||||
PipelineCode = z.PipelineCode,
|
||||
UnitWorkId = z.UnitWorkId,
|
||||
UnitWorkName = m.UnitWorkName,
|
||||
WeldJoint = w
|
||||
};
|
||||
|
||||
string jointAttribute = GetJointAttributeByPipeArea(pipeArea);
|
||||
bool filterByPipeArea = !string.IsNullOrEmpty(jointAttribute);
|
||||
if (filterByPipeArea)
|
||||
{
|
||||
// 页面用途以材料表 PipeArea 为准,工厂/现场只能匹配相应类型的焊口。
|
||||
pipeLineMatQuery = pipeLineMatQuery.Where(x => x.PipeLineMat.PipeArea == pipeArea
|
||||
&& x.WeldJoint != null
|
||||
&& x.WeldJoint.JointAttribute == jointAttribute);
|
||||
}
|
||||
|
||||
var allPipeLineMats = pipeLineMatQuery.ToList();
|
||||
var continuationComponentKeys = new HashSet<string>(allPipeLineMats
|
||||
.Where(x => x.WeldJoint != null && !string.IsNullOrEmpty(x.WeldJoint.WeldingDailyId))
|
||||
.Select(x => GetComponentKey(x.PipeLineMat.PipelineId, x.PipeLineMat.PrefabricatedComponents)));
|
||||
|
||||
// 页面匹配只展示并消耗尚未焊接的焊口材料;不传区域的旧调用保留原查询行为。
|
||||
var pipeLineMats = filterByPipeArea
|
||||
? allPipeLineMats.Where(x => x.WeldJoint != null
|
||||
&& x.WeldJoint.WeldingDailyId==null
|
||||
&& (x.PipeLineMat.Number ?? 0) > 0).ToList()
|
||||
: allPipeLineMats.Where(x => (x.PipeLineMat.Number ?? 0) > 0).ToList();
|
||||
|
||||
var materialCodes = pipeLineMats
|
||||
.Where(x => !string.IsNullOrEmpty(x.PipeLineMat.MaterialCode))
|
||||
@@ -311,17 +343,16 @@ namespace BLL
|
||||
{
|
||||
lib = libByMaterialCode[x.PipeLineMat.MaterialCode];
|
||||
}
|
||||
// 未反写时只能按导入材料编码 Code 找候选材料库,用于展示材料名称、规格等基础信息。
|
||||
// 未反写时只能按导入材料编码 Code 找候选材料库。
|
||||
else if (!string.IsNullOrEmpty(x.PipeLineMat.MaterialCode2) && libByCode.ContainsKey(x.PipeLineMat.MaterialCode2))
|
||||
{
|
||||
lib = libByCode[x.PipeLineMat.MaterialCode2];
|
||||
}
|
||||
|
||||
// MaterialCode 对外展示导入材料编码,避免把临时匹配出的材料主编码误当成已确认结果。
|
||||
string code = !string.IsNullOrEmpty(x.PipeLineMat.MaterialCode2) ? x.PipeLineMat.MaterialCode2 : lib?.Code;
|
||||
return new Tw_PipeMatMatchOutput
|
||||
{
|
||||
Id = Guid.NewGuid().ToString(),
|
||||
{
|
||||
Id = Guid.NewGuid().ToString(),
|
||||
PipeLineMatId = x.PipeLineMat.PipeLineMatId,
|
||||
PipelineId = x.PipeLineMat.PipelineId,
|
||||
PipelineCode = x.PipelineCode,
|
||||
@@ -329,7 +360,7 @@ namespace BLL
|
||||
UnitWorkName = x.UnitWorkName,
|
||||
PrefabricatedComponents = x.PipeLineMat.PrefabricatedComponents,
|
||||
WeldJointId = x.PipeLineMat.WeldJointId,
|
||||
WeldJointCode = x.WeldJointCode,
|
||||
WeldJointCode = x.WeldJoint == null ? null : x.WeldJoint.WeldJointCode,
|
||||
MaterialCode = code,
|
||||
MatchMaterialCode = x.PipeLineMat.MaterialCode,
|
||||
Code = code,
|
||||
@@ -342,29 +373,179 @@ namespace BLL
|
||||
NeedNum = x.PipeLineMat.Number,
|
||||
};
|
||||
}).ToList();
|
||||
var newRequiredMaterials = new List<Tw_PipeMatMatchOutput>();
|
||||
|
||||
var orderedPipelineMaterials = new Dictionary<string, List<Tw_PipeMatMatchOutput>>();
|
||||
foreach (string id in pipelineIds)
|
||||
{
|
||||
orderedPipelineMaterials[id] = requiredMaterials
|
||||
.Where(x => x.PipelineId == id)
|
||||
.OrderBy(x => x.PrefabricatedComponents)
|
||||
.ThenBy(x => x.WeldJointCode)
|
||||
.ThenBy(x => x.MaterialCode)
|
||||
.ThenBy(x => x.PipeLineMatId)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
var newRequiredMaterials = new List<Tw_PipeMatMatchOutput>();
|
||||
var addedMaterialIds = new HashSet<string>();
|
||||
|
||||
// 先处理全部管线的手动优先焊口,保证人工选择始终高于任何自动优先规则。
|
||||
foreach (string id in pipelineIds)
|
||||
{
|
||||
var pipelineMaterials = requiredMaterials.Where(x => x.PipelineId == id).ToList();
|
||||
if (priorityWeldJoints != null && priorityWeldJoints.ContainsKey(id) && priorityWeldJoints[id] != null && priorityWeldJoints[id].Any())
|
||||
{
|
||||
// 手动优先焊口只改变本次匹配消耗顺序,不写入长期规则。
|
||||
var weldJointIds = priorityWeldJoints[id];
|
||||
newRequiredMaterials.AddRange(pipelineMaterials
|
||||
var manualPriorityMaterials = orderedPipelineMaterials[id]
|
||||
.Where(x => weldJointIds.Contains(x.WeldJointId))
|
||||
.OrderBy(x => weldJointIds.IndexOf(x.WeldJointId)));
|
||||
newRequiredMaterials.AddRange(pipelineMaterials
|
||||
.Where(x => !weldJointIds.Contains(x.WeldJointId)));
|
||||
}
|
||||
else
|
||||
{
|
||||
newRequiredMaterials.AddRange(pipelineMaterials);
|
||||
.OrderBy(x => weldJointIds.IndexOf(x.WeldJointId))
|
||||
.ThenBy(x => x.PrefabricatedComponents)
|
||||
.ThenBy(x => x.WeldJointCode)
|
||||
.ThenBy(x => x.MaterialCode)
|
||||
.ToList();
|
||||
newRequiredMaterials.AddRange(manualPriorityMaterials);
|
||||
foreach (var item in manualPriorityMaterials)
|
||||
{
|
||||
addedMaterialIds.Add(item.PipeLineMatId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 再处理全部续作组件,避免前一条管线的未开工组件抢占后一条管线续作组件的库存。
|
||||
foreach (string id in pipelineIds)
|
||||
{
|
||||
var continuationMaterials = orderedPipelineMaterials[id]
|
||||
.Where(x => !addedMaterialIds.Contains(x.PipeLineMatId)
|
||||
&& continuationComponentKeys.Contains(GetComponentKey(x.PipelineId, x.PrefabricatedComponents)))
|
||||
.ToList();
|
||||
newRequiredMaterials.AddRange(continuationMaterials);
|
||||
foreach (var item in continuationMaterials)
|
||||
{
|
||||
addedMaterialIds.Add(item.PipeLineMatId);
|
||||
}
|
||||
}
|
||||
|
||||
// 最后处理所有尚未开工组件,保持管线及组件内的稳定排序。
|
||||
foreach (string id in pipelineIds)
|
||||
{
|
||||
newRequiredMaterials.AddRange(orderedPipelineMaterials[id].Where(x => !addedMaterialIds.Contains(x.PipeLineMatId)));
|
||||
}
|
||||
|
||||
results = GetMatMatchOutput(newRequiredMaterials, warehouseCode, projectId, true);
|
||||
// 组件匹配率以当前区域剩余未焊口的材料需求为口径,并回填到每条明细供表格合并展示。
|
||||
foreach (var componentGroup in results.GroupBy(x => new { x.PipelineId, x.PrefabricatedComponents }))
|
||||
{
|
||||
decimal needNum = componentGroup.Sum(x => x.NeedNum) ?? 0;
|
||||
decimal matchNum = componentGroup.Sum(x => x.MatchNum) ?? 0;
|
||||
decimal componentMatchRate = needNum > 0 ? matchNum / needNum : 0;
|
||||
string componentMatchRateString = Math.Round(componentMatchRate * 100, 2).ToString() + "%";
|
||||
foreach (var item in componentGroup)
|
||||
{
|
||||
item.ComponentMatchRate = componentMatchRate;
|
||||
item.ComponentMatchRateString = componentMatchRateString;
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取单位工程下当前区域内同时存在已焊口和未焊口的组件汇总。
|
||||
/// </summary>
|
||||
public static List<Tw_PartialWeldedComponentOutput> GetPartialWeldedComponents(string projectId, string unitWorkId, string pipeArea, string warehouseCode)
|
||||
{
|
||||
string jointAttribute = GetJointAttributeByPipeArea(pipeArea);
|
||||
if (string.IsNullOrEmpty(projectId) || string.IsNullOrEmpty(unitWorkId) || string.IsNullOrEmpty(jointAttribute))
|
||||
{
|
||||
return new List<Tw_PartialWeldedComponentOutput>();
|
||||
}
|
||||
|
||||
using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
|
||||
{
|
||||
var componentWeldRows = (from x in db.HJGL_PipeLineMat
|
||||
join z in db.HJGL_Pipeline on x.PipelineId equals z.PipelineId
|
||||
join m in db.WBS_UnitWork on z.UnitWorkId equals m.UnitWorkId
|
||||
join w in db.HJGL_WeldJoint on x.WeldJointId equals w.WeldJointId
|
||||
where z.ProjectId == projectId && z.UnitWorkId == unitWorkId
|
||||
&& x.PipeArea == pipeArea
|
||||
&& x.PrefabricatedComponents != null && x.PrefabricatedComponents != ""
|
||||
&& w.JointAttribute == jointAttribute
|
||||
select new
|
||||
{
|
||||
z.PipelineId,
|
||||
z.PipelineCode,
|
||||
z.UnitWorkId,
|
||||
m.UnitWorkName,
|
||||
x.PrefabricatedComponents,
|
||||
w.WeldJointId,
|
||||
w.WeldingDailyId
|
||||
}).ToList();
|
||||
|
||||
var partialComponents = componentWeldRows
|
||||
.GroupBy(x => new { x.PipelineId, x.PipelineCode, x.UnitWorkId, x.UnitWorkName, x.PrefabricatedComponents })
|
||||
.Select(group =>
|
||||
{
|
||||
var weldJoints = group.GroupBy(x => x.WeldJointId).Select(x => x.First()).ToList();
|
||||
int weldedCount = weldJoints.Count(x => !string.IsNullOrEmpty(x.WeldingDailyId));
|
||||
int totalCount = weldJoints.Count;
|
||||
return new Tw_PartialWeldedComponentOutput
|
||||
{
|
||||
UnitWorkId = group.Key.UnitWorkId,
|
||||
UnitWorkName = group.Key.UnitWorkName,
|
||||
PipelineId = group.Key.PipelineId,
|
||||
PipelineCode = group.Key.PipelineCode,
|
||||
PrefabricatedComponents = group.Key.PrefabricatedComponents,
|
||||
PipeArea = pipeArea,
|
||||
PipeAreaText = pipeArea == PipelineService.PipeArea_SHOP ? "工厂预制" : "现场安装",
|
||||
TotalWeldJointCount = totalCount,
|
||||
WeldedWeldJointCount = weldedCount,
|
||||
UnweldedWeldJointCount = totalCount - weldedCount
|
||||
};
|
||||
})
|
||||
.Where(x => x.WeldedWeldJointCount > 0 && x.UnweldedWeldJointCount > 0)
|
||||
.OrderBy(x => x.PipelineCode)
|
||||
.ThenBy(x => x.PrefabricatedComponents)
|
||||
.ToList();
|
||||
|
||||
if (!partialComponents.Any())
|
||||
{
|
||||
return partialComponents;
|
||||
}
|
||||
|
||||
// 导出匹配率复用页面匹配规则,保证区域、未焊口及续作组件优先级完全一致。
|
||||
var pipelineIds = partialComponents.Select(x => x.PipelineId).Distinct().ToList();
|
||||
var matchOutputs = GetPipeMatMatch(projectId, pipelineIds, warehouseCode, null, pipeArea);
|
||||
var componentRates = matchOutputs
|
||||
.GroupBy(x => GetComponentKey(x.PipelineId, x.PrefabricatedComponents))
|
||||
.ToDictionary(x => x.Key, x => x.First().ComponentMatchRate ?? 0);
|
||||
foreach (var component in partialComponents)
|
||||
{
|
||||
decimal componentRate;
|
||||
componentRates.TryGetValue(GetComponentKey(component.PipelineId, component.PrefabricatedComponents), out componentRate);
|
||||
component.ComponentMatchRate = componentRate;
|
||||
component.ComponentMatchRateString = Math.Round(componentRate * 100, 2).ToString() + "%";
|
||||
}
|
||||
|
||||
return partialComponents;
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetJointAttributeByPipeArea(string pipeArea)
|
||||
{
|
||||
if (pipeArea == PipelineService.PipeArea_SHOP)
|
||||
{
|
||||
return "预制口";
|
||||
}
|
||||
if (pipeArea == PipelineService.PipeArea_FIELD)
|
||||
{
|
||||
return "安装口";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static string GetComponentKey(string pipelineId, string componentCode)
|
||||
{
|
||||
return (pipelineId ?? string.Empty) + "\u001f" + (componentCode ?? string.Empty);
|
||||
}
|
||||
/// <summary>
|
||||
/// 根据管线材料匹配结果,获取管线匹配率
|
||||
/// </summary>
|
||||
|
||||
@@ -59,7 +59,8 @@
|
||||
PipeGrade = codeLib.PipeGrade,
|
||||
MaterialUnit = codeLib.MaterialUnit,
|
||||
ProjectId = codeLib.ProjectId,
|
||||
Code = codeLib.Code
|
||||
Code = codeLib.Code,
|
||||
DesignInstitute = codeLib.DesignInstitute
|
||||
};
|
||||
db.HJGL_MaterialCodeLib.InsertOnSubmit(newCodeLib);
|
||||
db.SubmitChanges();
|
||||
@@ -89,6 +90,7 @@
|
||||
newCodeLib.PipeGrade = codeLib.PipeGrade;
|
||||
newCodeLib.MaterialUnit = codeLib.MaterialUnit;
|
||||
newCodeLib.Code = codeLib.Code;
|
||||
newCodeLib.DesignInstitute = codeLib.DesignInstitute;
|
||||
db.SubmitChanges();
|
||||
}
|
||||
}
|
||||
@@ -231,6 +233,12 @@
|
||||
///</summary>
|
||||
[ExcelColumnName("类型")]
|
||||
public string MaterialName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 材料编码来源设计院。
|
||||
/// </summary>
|
||||
[ExcelColumnName("所属设计院")]
|
||||
public string DesignInstitute { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@ namespace BLL
|
||||
PipelineId = pipelineMat.PipelineId,
|
||||
Number = pipelineMat.Number,
|
||||
PrefabricatedComponents = pipelineMat.PrefabricatedComponents,
|
||||
PipeArea = pipelineMat.PipeArea,
|
||||
};
|
||||
db.HJGL_PipeLineMat.InsertOnSubmit(newPipelineMat);
|
||||
db.SubmitChanges();
|
||||
@@ -57,6 +58,7 @@ namespace BLL
|
||||
newPipelineMat.PipelineId = pipelineMat.PipelineId;
|
||||
newPipelineMat.Number = pipelineMat.Number;
|
||||
newPipelineMat.PrefabricatedComponents = pipelineMat.PrefabricatedComponents;
|
||||
newPipelineMat.PipeArea = pipelineMat.PipeArea;
|
||||
db.SubmitChanges();
|
||||
}
|
||||
}
|
||||
@@ -80,6 +82,20 @@ namespace BLL
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新材料用途,1 为工厂预制,2 为现场安装。
|
||||
/// </summary>
|
||||
public static void UpdatePipeArea(string pipelineMatId, string pipeArea)
|
||||
{
|
||||
Model.SGGLDB db = Funs.DB;
|
||||
Model.HJGL_PipeLineMat pipeLineMat = db.HJGL_PipeLineMat.FirstOrDefault(e => e.PipeLineMatId == pipelineMatId);
|
||||
if (pipeLineMat != null)
|
||||
{
|
||||
pipeLineMat.PipeArea = pipeArea;
|
||||
db.SubmitChanges();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据材料匹配结果反写材料主编码
|
||||
/// </summary>
|
||||
|
||||
@@ -295,6 +295,179 @@ namespace BLL
|
||||
}
|
||||
|
||||
#region 焊接日报待审核
|
||||
/// <summary>
|
||||
/// 获取焊接日报待审核明细列表。
|
||||
/// </summary>
|
||||
/// <param name="projectId">项目ID</param>
|
||||
/// <param name="unitWorkId">单位工程ID,为空时不按单位工程过滤</param>
|
||||
/// <param name="weldingDate">焊接日期,为空时不按日期过滤</param>
|
||||
/// <param name="pipelineCode">管线编号关键字</param>
|
||||
/// <param name="welderCode">焊工编号关键字</param>
|
||||
/// <returns>待审核明细列表</returns>
|
||||
public static List<Model.WeldingDailyTempDetailItem> GetWeldingDailyTempDetailList(string projectId,
|
||||
string unitWorkId, DateTime? weldingDate, string pipelineCode, string welderCode)
|
||||
{
|
||||
if (string.IsNullOrEmpty(projectId))
|
||||
{
|
||||
return new List<Model.WeldingDailyTempDetailItem>();
|
||||
}
|
||||
|
||||
using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
|
||||
{
|
||||
var query = QueryPendingWeldingDailyTempDetails(db);
|
||||
query = query.Where(x => x.ProjectId == projectId);
|
||||
if (!string.IsNullOrEmpty(unitWorkId))
|
||||
{
|
||||
query = query.Where(x => x.UnitWorkId == unitWorkId);
|
||||
}
|
||||
if (weldingDate.HasValue)
|
||||
{
|
||||
DateTime startDate = weldingDate.Value.Date;
|
||||
DateTime endDate = startDate.AddDays(1);
|
||||
query = query.Where(x => x.WeldingDate >= startDate && x.WeldingDate < endDate);
|
||||
}
|
||||
if (!string.IsNullOrEmpty(pipelineCode))
|
||||
{
|
||||
query = query.Where(x => x.PipelineCode != null && x.PipelineCode.Contains(pipelineCode));
|
||||
}
|
||||
if (!string.IsNullOrEmpty(welderCode))
|
||||
{
|
||||
query = query.Where(x => (x.CoverWelderCode != null && x.CoverWelderCode.Contains(welderCode))
|
||||
|| (x.BackingWelderCode != null && x.BackingWelderCode.Contains(welderCode)));
|
||||
}
|
||||
|
||||
var data = query.OrderBy(x => x.PipelineCode).ThenBy(x => x.WeldJointCode).ToList();
|
||||
SetWeldingDailyTempDetailAttachUrls(db, data);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取单条焊接日报待审核明细。
|
||||
/// </summary>
|
||||
/// <param name="tempDetailId">待审核明细ID</param>
|
||||
/// <returns>待审核明细,不存在时返回空</returns>
|
||||
public static Model.WeldingDailyTempDetailItem GetWeldingDailyTempDetailById(string tempDetailId)
|
||||
{
|
||||
if (string.IsNullOrEmpty(tempDetailId))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
|
||||
{
|
||||
var data = QueryPendingWeldingDailyTempDetails(db)
|
||||
.Where(x => x.TempDetailId == tempDetailId)
|
||||
.Take(1)
|
||||
.ToList();
|
||||
SetWeldingDailyTempDetailAttachUrls(db, data);
|
||||
return data.FirstOrDefault();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 构造待审核查询。PC端列表和接口列表、明细均从这里读取,确保字段映射和待审核状态一致。
|
||||
/// </summary>
|
||||
private static System.Linq.IQueryable<Model.WeldingDailyTempDetailItem> QueryPendingWeldingDailyTempDetails(Model.SGGLDB db)
|
||||
{
|
||||
// 待审核模块只展示 AuditState=0;审核、删除仍复用本类下方已有批量业务方法。
|
||||
return from temp in db.HJGL_WeldingDailyTempDetail
|
||||
join jotItem in db.View_HJGL_WeldJoint on temp.WeldJointId equals jotItem.WeldJointId into jotItems
|
||||
from jot in jotItems.DefaultIfEmpty()
|
||||
join coverItem in db.SitePerson_Person on temp.CoverWelderId equals coverItem.PersonId into coverItems
|
||||
from coverWelder in coverItems.DefaultIfEmpty()
|
||||
join backingItem in db.SitePerson_Person on temp.BackingWelderId equals backingItem.PersonId into backingItems
|
||||
from backingWelder in backingItems.DefaultIfEmpty()
|
||||
join locationItem in db.Base_WeldingLocation on temp.WeldingLocationId equals locationItem.WeldingLocationId into locationItems
|
||||
from location in locationItems.DefaultIfEmpty()
|
||||
join submitItem in db.Person_Persons on temp.SubmitPersonId equals submitItem.PersonId into submitItems
|
||||
from submitPerson in submitItems.DefaultIfEmpty()
|
||||
where temp.AuditState == 0
|
||||
select new Model.WeldingDailyTempDetailItem
|
||||
{
|
||||
TempDetailId = temp.TempDetailId,
|
||||
ProjectId = temp.ProjectId,
|
||||
UnitId = temp.UnitId,
|
||||
UnitWorkId = temp.UnitWorkId,
|
||||
WeldJointId = temp.WeldJointId,
|
||||
PipelineId = jot == null ? null : jot.PipelineId,
|
||||
PipelineCode = jot == null ? null : jot.PipelineCode,
|
||||
WeldJointCode = jot == null ? null : jot.WeldJointCode,
|
||||
WeldingDate = temp.WeldingDate,
|
||||
CoverWelderId = temp.CoverWelderId,
|
||||
CoverWelderCode = coverWelder == null ? null : coverWelder.WelderCode,
|
||||
BackingWelderId = temp.BackingWelderId,
|
||||
BackingWelderCode = backingWelder == null ? null : backingWelder.WelderCode,
|
||||
JointAttribute = temp.JointAttribute,
|
||||
WeldingLocationId = temp.WeldingLocationId,
|
||||
WeldingLocationCode = location == null ? null : location.WeldingLocationCode,
|
||||
WeldingMode = temp.WeldingMode,
|
||||
Material1Code = jot == null ? null : jot.Material1Code,
|
||||
Material2Code = jot == null ? null : jot.Material2Code,
|
||||
DNDia = jot == null ? null : jot.DNDia,
|
||||
Size = jot == null ? (decimal?)null : jot.Size,
|
||||
Dia = jot == null ? (decimal?)null : jot.Dia,
|
||||
Thickness = jot == null ? (decimal?)null : jot.Thickness,
|
||||
WeldTypeCode = jot == null ? null : jot.WeldTypeCode,
|
||||
WeldingMethodCode = jot == null ? null : jot.WeldingMethodCode,
|
||||
WeldingWireCode = jot == null ? null : jot.WeldingWireCode,
|
||||
WeldingRodCode = jot == null ? null : jot.WeldingRodCode,
|
||||
SubmitPersonId = temp.SubmitPersonId,
|
||||
SubmitPersonName = submitPerson == null ? null : submitPerson.PersonName,
|
||||
SubmitDate = temp.SubmitDate,
|
||||
AttachUrl = temp.AttachUrl,
|
||||
AuditState = temp.AuditState,
|
||||
AuditMan = temp.AuditMan,
|
||||
AuditDate = temp.AuditDate,
|
||||
AuditRemark = temp.AuditRemark
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 按待审核明细ID批量回写焊前、焊后附件地址。
|
||||
/// </summary>
|
||||
private static void SetWeldingDailyTempDetailAttachUrls(Model.SGGLDB db,
|
||||
List<Model.WeldingDailyTempDetailItem> data)
|
||||
{
|
||||
if (data == null || data.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var toKeyIds = data.SelectMany(x => new[]
|
||||
{
|
||||
x.TempDetailId + "#Before",
|
||||
x.TempDetailId + "#After"
|
||||
}).ToList();
|
||||
var attachUrlMap = db.AttachFile
|
||||
.Where(x => x.MenuId == Const.HJGL_WeldReportMenuId && toKeyIds.Contains(x.ToKeyId))
|
||||
.Select(x => new { x.ToKeyId, x.AttachUrl })
|
||||
.ToList()
|
||||
.GroupBy(x => x.ToKeyId)
|
||||
.ToDictionary(x => x.Key, x => x.Select(y => y.AttachUrl).FirstOrDefault());
|
||||
|
||||
foreach (var item in data)
|
||||
{
|
||||
string beforeUrl;
|
||||
if (attachUrlMap.TryGetValue(item.TempDetailId + "#Before", out beforeUrl))
|
||||
{
|
||||
// API统一返回斜杠路径,PC端继续兼容原有反斜杠路径显示逻辑。
|
||||
item.BeforePhotoUrl = NormalizeAttachUrl(beforeUrl);
|
||||
}
|
||||
|
||||
string afterUrl;
|
||||
if (attachUrlMap.TryGetValue(item.TempDetailId + "#After", out afterUrl))
|
||||
{
|
||||
item.AfterPhotoUrl = NormalizeAttachUrl(afterUrl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static string NormalizeAttachUrl(string attachUrl)
|
||||
{
|
||||
return string.IsNullOrEmpty(attachUrl) ? attachUrl : attachUrl.Replace('\\', '/');
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 移动端按焊口保存焊接日报待审核明细
|
||||
/// </summary>
|
||||
@@ -610,9 +783,9 @@ namespace BLL
|
||||
return weldingDaily;
|
||||
}
|
||||
|
||||
var submitPerson = Funs.DB.Person_Persons.FirstOrDefault(x => x.PersonId == tempDetail.SubmitPersonId);
|
||||
string personName = submitPerson != null ? submitPerson.PersonName : string.Empty;
|
||||
string perfix = string.Format("{0:yyyyMMdd}", tempDetail.WeldingDate) + "-" + personName + "-";
|
||||
var submitUnitwork = Funs.DB.WBS_UnitWork.FirstOrDefault(x => x.UnitWorkId == tempDetail.UnitWorkId);
|
||||
string unitWorkName = submitUnitwork != null ? submitUnitwork.UnitWorkName : string.Empty;
|
||||
string perfix = string.Format("{0:yyyyMMdd}", tempDetail.WeldingDate) + "-" + unitWorkName + "-";
|
||||
weldingDaily = new Model.HJGL_WeldingDaily
|
||||
{
|
||||
WeldingDailyId = Guid.NewGuid().ToString(),
|
||||
|
||||
Reference in New Issue
Block a user