唐召明
authored
|
1
|
using Hh.Mes.POJO.Entity;
|
唐召明
authored
|
2
3
|
using Hh.Mes.POJO.EnumEntitys;
using SqlSugar;
|
唐召明
authored
|
4
5
6
7
8
9
|
using System;
using System.Linq;
namespace Quartz.Job.Jobs
{
/// <summary>
|
唐召明
authored
|
10
|
/// 保养记录生成
|
唐召明
authored
|
11
12
13
14
15
|
/// </summary>
public class MaintainJob : JobBase
{
public override void ExecuteJob(IJobExecutionContext context)
{
|
唐召明
authored
|
16
|
var equipments = _dbContext.Queryable<base_equipment>().Where(x => x.isEnable && !string.IsNullOrEmpty(x.equipmentMaintainRuleCode)).ToList();
|
唐召明
authored
|
17
|
//保养规则
|
唐召明
authored
|
18
19
20
|
var busEquipmentMaintainRuleHeads = _dbContext.Queryable<bus_equipment_maintain_rule_head>()
.Where(x => SqlFunc.Subqueryable<base_equipment>().Where(s => s.isEnable && !string.IsNullOrEmpty(s.equipmentMaintainRuleCode) && s.equipmentMaintainRuleCode == x.equipmentRuleCode).Any())
.ToList();
|
唐召明
authored
|
21
|
|
唐召明
authored
|
22
|
var ruleHeadKeys = busEquipmentMaintainRuleHeads.Select(x => x.keys).ToList();
|
唐召明
authored
|
23
24
|
var busEquipmentMaintainRuleDetails = _dbContext.Queryable<bus_equipment_maintain_rule_detail>()
.Where(x => ruleHeadKeys.Contains(x.headKeys)).ToList();
|
唐召明
authored
|
25
|
|
唐召明
authored
|
26
27
28
|
//设备部件
var equipmentTypeCodes = equipments.Select(x => x.equipmentTypeCode).Distinct().ToList();
var equipmentParts = _dbContext.Queryable<base_equipment_part>().Where(x => equipmentTypeCodes.Contains(x.equipmentTypeCode)).ToList();
|
唐召明
authored
|
29
|
var busEquipmentMaintainRuleDetailIndicatorRels = _dbContext.Queryable<bus_equipment_maintain_rule_detail_indicator_rel>().ToList();
|
唐召明
authored
|
30
31
32
|
var busEquipmentMaintainRecordTops = _dbContext.Queryable<bus_equipment_maintain_record_top>()
.Where(x => SqlFunc.Subqueryable<base_equipment>().Where(s => s.equipmentCode == x.equipmentCode).Any())
.ToList();
|
唐召明
authored
|
33
34
35
|
foreach (var equipment in equipments)
{
|
唐召明
authored
|
36
|
try
|
唐召明
authored
|
37
|
{
|
唐召明
authored
|
38
|
var ruleHead = busEquipmentMaintainRuleHeads.Where(x => x.equipmentRuleCode == equipment.equipmentMaintainRuleCode).FirstOrDefault();
|
唐召明
authored
|
39
40
41
42
43
|
//未匹配到维护规则,则跳过
if (ruleHead == null)
{
continue;
}
|
唐召明
authored
|
44
|
|
唐召明
authored
|
45
46
47
|
//无明细数据,则跳过
var ruleDetails = busEquipmentMaintainRuleDetails.Where(x => x.headKeys == ruleHead.keys).ToList();
if (ruleDetails.Count == 0)
|
唐召明
authored
|
48
|
{
|
唐召明
authored
|
49
50
|
continue;
}
|
唐召明
authored
|
51
|
|
唐召明
authored
|
52
53
54
55
56
57
58
|
var currentEquipmentParts = equipmentParts.Where(x => x.equipmentTypeCode == equipment.equipmentTypeCode).ToList();
var busEquipmentMaintainRecordTop = busEquipmentMaintainRecordTops.Where(x => x.equipmentCode == equipment.equipmentCode).FirstOrDefault();
//开启事务
_dbContext.Ado.BeginTran();
if (busEquipmentMaintainRecordTop == null)
|
唐召明
authored
|
59
|
{
|
唐召明
authored
|
60
|
busEquipmentMaintainRecordTop = new bus_equipment_maintain_record_top
|
唐召明
authored
|
61
|
{
|
唐召明
authored
|
62
|
keys = Guid.NewGuid(),
|
唐召明
authored
|
63
|
equipmentCode = equipment.equipmentCode,
|
唐召明
authored
|
64
|
equipmentName = equipment.equipmentName,
|
唐召明
authored
|
65
66
67
68
|
equipmentTypeCode = equipment.equipmentTypeCode,
factoryCode = equipment.factoryCode,
projectKeys = equipment.projectKeys,
createTime = DateTime.Now,
|
唐召明
authored
|
69
|
createBy = nameof(MaintainJob),
|
唐召明
authored
|
70
|
};
|
唐召明
authored
|
71
|
busEquipmentMaintainRecordTop.id = _dbContext.Insertable(busEquipmentMaintainRecordTop).ExecuteReturnIdentity();
|
唐召明
authored
|
72
73
|
}
|
唐召明
authored
|
74
75
76
77
|
var busEquipmentMaintainRecordHeads = _dbContext.Queryable<bus_equipment_maintain_record_head>()
.Where(x => x.topKeys == busEquipmentMaintainRecordTop.keys).ToList();
var busEquipmentMaintainRecordDetails = _dbContext.Queryable<bus_equipment_maintain_record_detail>()
.Where(x => x.topKeys == busEquipmentMaintainRecordTop.keys && x.status != (int)EnumMaintainStatus.Maintained).ToList();
|
唐召明
authored
|
78
|
foreach (var equipmentPart in currentEquipmentParts)
|
唐召明
authored
|
79
|
{
|
唐召明
authored
|
80
81
82
83
84
85
86
|
//当前部件的保养规则
var currentRuleDetail = ruleDetails.Where(x => x.equipmentPartCode == equipmentPart.partCode).FirstOrDefault();
if (currentRuleDetail == null)
{
//当前部件未配置保养规则,则跳过
continue;
}
|
唐召明
authored
|
87
|
|
唐召明
authored
|
88
|
var indicatorTypes = busEquipmentMaintainRuleDetailIndicatorRels.Where(x => x.ruleDetailKeys == currentRuleDetail.detailKeys).ToList();
|
唐召明
authored
|
89
|
|
唐召明
authored
|
90
91
92
93
94
|
//保养周期类型未设定,则跳过
if (indicatorTypes.Count == 0)
{
continue;
}
|
唐召明
authored
|
95
|
|
唐召明
authored
|
96
97
|
var busEquipmentMaintainRecordHead = busEquipmentMaintainRecordHeads.Where(x => x.partCode == equipmentPart.partCode).FirstOrDefault();
if (busEquipmentMaintainRecordHead == null)
|
唐召明
authored
|
98
|
{
|
唐召明
authored
|
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
busEquipmentMaintainRecordHead = new bus_equipment_maintain_record_head
{
topKeys = busEquipmentMaintainRecordTop.keys,
headKeys = Guid.NewGuid(),
equipmentCode = equipment.equipmentCode,
equipmentTypeCode = equipment.equipmentTypeCode,
factoryCode = equipment.factoryCode,
projectKeys = equipment.projectKeys,
partCode = equipmentPart.partCode,
partName = equipmentPart.partName,
lastMaintainTime = DateTime.Now,
nextMaintainTime = DateTime.Now,
createTime = DateTime.Now,
createBy = nameof(MaintainJob),
};
busEquipmentMaintainRecordHead.id = _dbContext.Insertable(busEquipmentMaintainRecordHead).ExecuteReturnIdentity();
}
|
唐召明
authored
|
116
|
|
唐召明
authored
|
117
|
//当前部件上次保养时间
|
唐召明
authored
|
118
|
var lastMaintainTime = _dbContext.Queryable<bus_equipment_maintain_record_detail>().Where(x => x.topKeys == busEquipmentMaintainRecordTop.keys && x.headKeys == busEquipmentMaintainRecordHead.headKeys && x.status == (int)EnumMaintainStatus.Maintained).Max(x => x.maintainTime) ?? DateTime.Today;
|
唐召明
authored
|
119
|
//下次保养时间
|
唐召明
authored
|
120
|
var nextMaintainTime = indicatorTypes.Select(x => GetNextMaintainTime(x, lastMaintainTime)).Min();
|
唐召明
authored
|
121
122
|
if (nextMaintainTime == DateTime.MaxValue)
{
|
唐召明
authored
|
123
|
//未配置,则不生成记录
|
唐召明
authored
|
124
|
continue;
|
唐召明
authored
|
125
126
|
}
|
唐召明
authored
|
127
128
129
130
131
|
//解析保养规则,生成保养记录,待完善
var busEquipmentMaintainRecordDetail = busEquipmentMaintainRecordDetails.Where(x => x.headKeys == busEquipmentMaintainRecordHead.headKeys && x.partCode == equipmentPart.partCode).FirstOrDefault();
var nextDurationTime = (nextMaintainTime - DateTime.Now).Days;
//无记录,则需要新增
if (busEquipmentMaintainRecordDetail == null)
|
唐召明
authored
|
132
|
{
|
唐召明
authored
|
133
134
135
136
137
138
139
140
141
|
//基础数据
busEquipmentMaintainRecordDetail = new bus_equipment_maintain_record_detail
{
topKeys = busEquipmentMaintainRecordTop.keys,
headKeys = busEquipmentMaintainRecordHead.headKeys,
equipmentCode = equipment.equipmentCode,
equipmentTypeCode = equipment.equipmentTypeCode,
projectKeys = equipment.projectKeys,
factoryCode = equipment.factoryCode,
|
唐召明
authored
|
142
|
status = (int)EnumMaintainStatus.ToBeMaintain,
|
唐召明
authored
|
143
144
145
146
147
148
|
partCode = equipmentPart.partCode,
partName = equipmentPart.partName,
lastMaintainTime = lastMaintainTime,
nextMaintainTime = nextMaintainTime,
nextDurationTime = nextDurationTime,
};
|
唐召明
authored
|
149
150
|
_dbContext.Insertable(busEquipmentMaintainRecordDetail).ExecuteCommand();
}
|
唐召明
authored
|
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
else
{
busEquipmentMaintainRecordDetail.nextMaintainTime = nextMaintainTime;
busEquipmentMaintainRecordDetail.nextDurationTime = (nextMaintainTime - DateTime.Now).Days;
_dbContext.Updateable(busEquipmentMaintainRecordDetail).UpdateColumns(x => new
{
x.nextMaintainTime,
x.nextDurationTime,
}).ExecuteCommand();
}
//更新Head表
var headSumPrice = _dbContext.Queryable<bus_equipment_maintain_record_detail>().Where(x => x.topKeys == busEquipmentMaintainRecordTop.keys && x.headKeys == busEquipmentMaintainRecordHead.headKeys && x.maintainTime != null).Sum(x => x.maintainPrice);
busEquipmentMaintainRecordHead.lastMaintainTime = busEquipmentMaintainRecordDetail.lastMaintainTime;
busEquipmentMaintainRecordHead.nextMaintainTime = nextMaintainTime;
busEquipmentMaintainRecordHead.nextMaintianDate = nextDurationTime;
busEquipmentMaintainRecordHead.sumPrice = headSumPrice;
busEquipmentMaintainRecordHead.updateTime = DateTime.Now;
busEquipmentMaintainRecordHead.updateBy = nameof(MaintainJob);
_dbContext.Updateable(busEquipmentMaintainRecordHead).UpdateColumns(x => new
{
x.lastMaintainTime,
x.nextMaintainTime,
x.nextMaintianDate,
x.sumPrice,
x.updateTime,
x.updateBy,
}).ExecuteCommand();
|
唐召明
authored
|
180
181
|
}
|
唐召明
authored
|
182
183
184
185
186
187
|
//更新概述表
var topMaintainNumber = _dbContext.Queryable<bus_equipment_maintain_record_detail>().Where(x => x.topKeys == busEquipmentMaintainRecordTop.keys && x.status == (int)EnumMaintainStatus.Maintained).Count();
var topLastMaintainTime = _dbContext.Queryable<bus_equipment_maintain_record_head>().Where(x => x.topKeys == busEquipmentMaintainRecordTop.keys).Max(x => x.lastMaintainTime);
var topToBeMaintainedNumber = _dbContext.Queryable<bus_equipment_maintain_record_detail>().Where(x => x.topKeys == busEquipmentMaintainRecordTop.keys && x.status != (int)EnumMaintainStatus.Maintained).Count();
|
唐召明
authored
|
188
|
|
唐召明
authored
|
189
|
var topSumAmount = _dbContext.Queryable<bus_equipment_maintain_record_head>().Where(x => x.topKeys == busEquipmentMaintainRecordTop.keys).Sum(x => x.sumPrice);
|
唐召明
authored
|
190
|
|
唐召明
authored
|
191
192
193
194
195
196
197
|
busEquipmentMaintainRecordTop.maintainNumber = topMaintainNumber;
busEquipmentMaintainRecordTop.lastMaintainTime = topLastMaintainTime;
busEquipmentMaintainRecordTop.toBeMaintainedNumber = topToBeMaintainedNumber;
busEquipmentMaintainRecordTop.sumAmount = topSumAmount;
busEquipmentMaintainRecordTop.updateTime = DateTime.Now;
busEquipmentMaintainRecordTop.updateBy = nameof(MaintainJob);
_dbContext.Updateable(busEquipmentMaintainRecordTop).UpdateColumns(x => new
|
唐召明
authored
|
198
|
{
|
唐召明
authored
|
199
|
x.maintainNumber,
|
唐召明
authored
|
200
|
x.lastMaintainTime,
|
唐召明
authored
|
201
202
203
204
|
x.toBeMaintainedNumber,
x.sumAmount,
x.updateTime,
x.updateBy
|
唐召明
authored
|
205
206
|
}).ExecuteCommand();
|
唐召明
authored
|
207
208
209
210
|
//提交
_dbContext.Ado.CommitTran();
}
catch (Exception ex)
|
唐召明
authored
|
211
|
{
|
唐召明
authored
|
212
213
|
//异常回滚
_dbContext.Ado.RollbackTran();
|
唐召明
authored
|
214
|
_log4net.Error($"[{nameof(MaintainJob)}]定时器异常:{ex}");
|
唐召明
authored
|
215
|
}
|
唐召明
authored
|
216
217
|
}
}
|
唐召明
authored
|
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
|
/// <summary>
/// 获取下次保养时间
/// </summary>
/// <param name="indicatorType"></param>
/// <param name="lastMaintainTime">上次保养时间</param>
/// <returns></returns>
private DateTime GetNextMaintainTime(bus_equipment_maintain_rule_detail_indicator_rel indicatorType, DateTime lastMaintainTime)
{
_ = int.TryParse(indicatorType.indicatorValue, out var indicatorValue);
if (indicatorValue == 0)
{
return DateTime.MaxValue;
}
if (indicatorType.indicatorTypeName == EnumIndicatorType.天.ToString())
{
return lastMaintainTime.AddDays(indicatorValue);
}
else if (indicatorType.indicatorTypeName == EnumIndicatorType.月.ToString())
{
return lastMaintainTime.AddMonths(indicatorValue);
}
//else if (indicatorType.indicatorTypeName == EnumIndicatorType.季度.ToString())
//{
// return lastMaintainTime.AddMonths(indicatorValue * 3);
//}
//else if (indicatorType.indicatorTypeName == EnumIndicatorType.年.ToString())
//{
// return lastMaintainTime.AddYears(indicatorValue);
//}
else if (indicatorType.indicatorTypeName.Contains(EnumIndicatorType.公里数.ToString()))
{
//待定
}
//else if (indicatorType.indicatorTypeName == EnumIndicatorType.圈数.ToString())
//{
// //待定
//}
//else if (indicatorType.indicatorTypeName == EnumIndicatorType.次数.ToString())
//{
// //待定
//}
//不支持
return DateTime.MaxValue;
}
|
唐召明
authored
|
264
265
|
}
}
|