赖素文
authored
|
1
2
3
4
5
6
7
8
9
10
11
|
using Hh.Mes.Common.log;
using Hh.Mes.Common.Request;
using Hh.Mes.POJO.Entity;
using Hh.Mes.POJO.Response;
using Hh.Mes.Service.Repository;
using SqlSugar;
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Data;
using System.IO;
|
赖素文
authored
|
12
|
using Hh.Mes.Pojo.System;
|
唐召明
authored
|
13
|
using System.Collections.Generic;
|
赖素文
authored
|
14
|
using Microsoft.AspNetCore.Http;
|
|
15
|
using Hh.Mes.Service.SystemAuth;
|
赖素文
authored
|
16
17
18
19
20
|
namespace Hh.Mes.Service.Base
{
public class SysFileService : RepositorySqlSugar<sys_File>
{
|
|
21
22
|
public SysFileService(IAuth auth) : base(auth) { }
|
赖素文
authored
|
23
|
/// <summary>
|
|
24
|
/// 文件存储路径 new JoinQueryInfos(JoinType.Left, file.targetId == y.code)
|
赖素文
authored
|
25
26
27
|
/// </summary>
private readonly string FileNamePath = "\\wwwroot\\Document";
|
赖素文
authored
|
28
|
#region 列表、树结构数据
|
赖素文
authored
|
29
30
31
32
33
34
35
|
public dynamic Load(PageReq pageReq, sys_File entity)
{
return ExceptionsHelp.Instance.ExecuteT(() =>
{
var result = new Response();
var expression = LinqWhere(entity);
//先组合查询表达式
|
|
36
|
var query = Context.Queryable<sys_File, base_equipment>((x, y) => new JoinQueryInfos(JoinType.Inner, x.targetId == y.equipmentCode))
|
赖素文
authored
|
37
|
.Where(expression)
|
|
38
|
.Select((x, y) => new
|
赖素文
authored
|
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
{
x.fileName,
x.id,
x.targetId,
x.host,
x.url,
x.size,
x.suffix,
x.remark,
x.createBy,
x.createTime
});
|
|
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
if (!entity.isSelectEquipment)
{
var expressions=LinqAnotherWhere(entity);
query = Context.Queryable<sys_File>()
.Where(expressions)
.Select(x => new
{
x.fileName,
x.id,
x.targetId,
x.host,
x.url,
x.size,
x.suffix,
x.remark,
|
赖素文
authored
|
69
|
|
|
70
71
72
73
|
x.createBy,
x.createTime
});
}
|
赖素文
authored
|
74
|
|
赖素文
authored
|
75
76
77
78
|
//Exel为ture就不分页,因为导出的话是全部导出
if (pageReq != null)
{
int total = 0;
|
|
79
|
var list = query.ToOffsetPage(pageReq.page, pageReq.limit, ref total).Distinct();
|
赖素文
authored
|
80
|
result.Result = list;
|
赖素文
authored
|
81
82
83
84
|
result.Count = total;
}
else
{
|
|
85
|
result.Result = query.ToList().Distinct();
|
赖素文
authored
|
86
|
result.Count = result.Result.Count;
|
赖素文
authored
|
87
88
89
90
91
|
}
return result;
}, catchRetrunValue: "list");
}
|
|
92
|
public Expression<Func<sys_File, base_equipment, bool>> LinqWhere(sys_File model)
|
赖素文
authored
|
93
94
95
|
{
try
{
|
|
96
|
var exp = Expressionable.Create<sys_File, base_equipment>();
|
赖素文
authored
|
97
|
//数据过滤条件
|
赖素文
authored
|
98
99
|
//根节点
if (!string.IsNullOrWhiteSpace(model.targetTableName) && model.targetTableName != "root")
|
赖素文
authored
|
100
|
{
|
|
101
|
exp.And((x, y) => x.targetTableName.Contains(model.targetTableName));
|
赖素文
authored
|
102
103
104
|
}
if (!string.IsNullOrWhiteSpace(model.fileCode))
{
|
|
105
|
exp.And((x, y) => x.fileCode.Contains(model.fileCode));
|
赖素文
authored
|
106
107
108
|
}
if (!string.IsNullOrWhiteSpace(model.host))
{
|
|
109
|
exp.And((x, y) => x.host.Contains(model.host));
|
赖素文
authored
|
110
|
}
|
赖素文
authored
|
111
|
//根节点
|
赖素文
authored
|
112
|
if (!string.IsNullOrEmpty(model.targetId) && model.targetId != "r-1")
|
赖素文
authored
|
113
|
{
|
|
114
|
exp.And((x, y) => x.targetId.Equals(model.targetId));
|
赖素文
authored
|
115
116
117
|
}
if (!string.IsNullOrWhiteSpace(model.fileName))
{
|
|
118
|
exp.And((x, y) => x.fileName.Contains(model.fileName));
|
赖素文
authored
|
119
|
}
|
赖素文
authored
|
120
121
|
//读取当前用户下面所有的设备
string currentUser = sysWebUser.Account;
|
唐召明
authored
|
122
123
|
if (currentUser != SystemVariable.DefaultCreated)
{
|
唐召明
authored
|
124
|
var projectRoleKeys = GetProjectRoleKeys(currentUser);
|
|
125
|
exp.And((x, y) => SqlFunc.Subqueryable<sys_role_projects_rel>().Where(c => projectRoleKeys.Contains(c.project_roles_key) && c.project_key == y.projectKeys).Any());
|
唐召明
authored
|
126
|
}
|
赖素文
authored
|
127
128
129
130
131
132
133
134
|
return exp.ToExpression();//拼接表达式
}
catch (Exception ex)
{
throw new Exception($"{ex.Message}");
}
}
|
|
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
public Expression<Func<sys_File, bool>> LinqAnotherWhere(sys_File model)
{
try
{
var exp = Expressionable.Create<sys_File>();
//数据过滤条件
//根节点
if (!string.IsNullOrWhiteSpace(model.targetTableName) && model.targetTableName != "root")
{
exp.And(x => x.targetTableName.Contains(model.targetTableName));
}
//根节点
if (!string.IsNullOrEmpty(model.targetId) && model.targetId != "r-1")
{
exp.And(x => x.targetId.Equals(model.targetId));
}
return exp.ToExpression();//拼接表达式
}
catch (Exception ex)
{
throw new Exception($"{ex.Message}");
}
}
|
赖素文
authored
|
160
|
/// <summary>
|
赖素文
authored
|
161
|
/// /左侧列表 设备类型+设备
|
赖素文
authored
|
162
|
/// </summary>
|
唐召明
authored
|
163
|
public dynamic GetTreeList()
|
赖素文
authored
|
164
165
166
|
{
return ExceptionsHelp.Instance.ExecuteT(() =>
{
|
赖素文
authored
|
167
|
string user = sysWebUser.Account;
|
唐召明
authored
|
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
var equipmentNodes = Context.Queryable<base_equipment>().Where(GetTreeListExpression(user)).Select(x => new
{
id = "eq-" + x.id.ToString(),
name = x.equipmentName + " " + x.equipmentCode,
keys = x.equipmentCode,
parentId = x.equipmentTypeCode,
isok = true,
code = "eq",
projectKeys = x.projectKeys
}).Distinct().ToList();
var equipmentTypeCodes = equipmentNodes.Select(x => x.parentId).Distinct().ToList();
var rootNode = new
{
id = Guid.NewGuid(),
name = "根节点",
keys = "r-1",
parentId = "0",
isok = false,
code = "root",
projectKeys = Guid.Empty
};
var equipmentTypeNodes = Context.Queryable<base_equipment_type>()
.Where(x => equipmentTypeCodes.Contains(x.code))
.Select(x => new
{
id = "eqType-" + x.id.ToString(),
name = x.name,
keys = x.code,
parentId = rootNode.keys,
isok = true,
code = "eqType",
projectKeys = Guid.Empty
}).ToList();
var nodes = new List<dynamic>
{
rootNode
};
nodes.AddRange(equipmentTypeNodes);
nodes.AddRange(equipmentNodes);
return nodes;
|
赖素文
authored
|
212
|
});
|
唐召明
authored
|
213
214
215
216
217
218
219
|
}
public Expression<Func<base_equipment, bool>> GetTreeListExpression(string userAccount)
{
var exp = Expressionable.Create<base_equipment>();
var ignoreEquipmentTypeCodes = SystemVariable.IotNotContainDevice.Split(',');
exp.And(x => !ignoreEquipmentTypeCodes.Contains(x.equipmentTypeCode));
|
赖素文
authored
|
220
|
|
唐召明
authored
|
221
222
223
224
225
226
|
if (userAccount != SystemVariable.DefaultCreated)
{
var projectRoleKeys = GetProjectRoleKeys(userAccount);
exp.And(x => SqlFunc.Subqueryable<sys_role_projects_rel>().Where(c => projectRoleKeys.Contains(c.project_roles_key) && c.project_key == x.projectKeys).Any());
}
return exp.ToExpression();
|
唐召明
authored
|
227
|
}
|
唐召明
authored
|
228
|
|
赖素文
authored
|
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
|
#endregion
public dynamic DelByIds(int[] ids)
{
return ExceptionsHelp.Instance.ExecuteT(() =>
{
var response = new Response();
var docs = Context.Queryable<sys_File>().Where(x => ids.Contains(x.id)).ToList();
docs.ForEach((item) =>
{
DeleteDocument(item.url);
});
Context.Deleteable<sys_File>(t => ids.Contains(t.id)).ExecuteCommand();
return response;
});
}
/// <summary>
/// 删除服务器内文件
/// </summary>
/// <param name="fileName"></param>
|
|
251
|
public void DeleteDocument(string fileName)
|
赖素文
authored
|
252
253
254
255
256
257
258
259
|
{
string path = $"{Directory.GetCurrentDirectory()}{FileNamePath}\\{fileName}";
if (File.Exists(path))
{
File.Delete(path);
}
}
|
赖素文
authored
|
260
261
262
263
|
#region 文件上传新增
/// <summary>
/// 文件上传新增 需要在外面指定targetTableName
/// </summary>
|
赖素文
authored
|
264
265
266
267
268
269
|
public dynamic AddOrUpdate(sys_File entity)
{
return ExceptionsHelp.Instance.ExecuteT<dynamic>(() =>
{
var response = new Response();
string fileEmptyErrorMessage = "上传文件数据时,文件不能为空!";
|
赖素文
authored
|
270
271
|
if (!ValidateInitialConditions(entity, response, fileEmptyErrorMessage))
return response;
|
赖素文
authored
|
272
|
|
赖素文
authored
|
273
274
|
// 获取目标表名并检查有效性
entity.targetTableName = GetTargetTableName(entity.targetTableName);
|
赖素文
authored
|
275
|
|
赖素文
authored
|
276
|
var uploadPath = EnsureUploadDirectory();
|
赖素文
authored
|
277
278
279
|
foreach (var file in entity.excelfile)
{
|
唐召明
authored
|
280
281
282
283
|
if (!ValidateFile(file, response, fileEmptyErrorMessage))
{
return response;
}
|
赖素文
authored
|
284
|
|
赖素文
authored
|
285
286
287
288
289
290
291
292
293
|
var (newFileName, size) = SaveFile(file, uploadPath);
UpdateEntity(entity, newFileName, size);
Context.Insertable(entity).AddQueue();
}
var result = Context.SaveQueuesAsync().Result > 0;
if (!result) return response.ResponseError("文件上传保存失败,请刷新后重试,反复出现请联系管理员!");
return response;
});
}
|
赖素文
authored
|
294
|
|
赖素文
authored
|
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
|
// 验证初始条件,确保文件列表和targetId有效
private bool ValidateInitialConditions(sys_File entity, Response response, string errorMessage)
{
if (entity.excelfile == null || entity.excelfile.Count == 0)
{
response.ResponseError(errorMessage);
return false;
}
if (string.IsNullOrEmpty(entity.targetId))
{
response.ResponseError("上传文件,目标targetId不能为空!");
return false;
}
return true;
}
private bool ValidateFile(IFormFile file, Response response, string errorMessage)
{
if (file == null || file.Length == 0)
{
response.ResponseError(errorMessage);
return false;
}
|
唐召明
authored
|
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
|
var fileTypes = new List<string>
{
".exe",
".bat"
};
foreach (var item in fileTypes)
{
if (file.FileName.EndsWith(item, StringComparison.OrdinalIgnoreCase))
{
response.ResponseError($"禁止上传“{item}”文件");
return false;
}
}
|
赖素文
authored
|
335
336
|
return true;
}
|
赖素文
authored
|
337
|
|
赖素文
authored
|
338
339
340
341
342
343
344
345
346
347
|
// 获取目标表名,
private string GetTargetTableName(string targetTableName)
{
return targetTableName switch
{
"eqType" => "base_equipment_type",
"eq" => "base_equipment",
_ => targetTableName
};
}
|
赖素文
authored
|
348
|
|
赖素文
authored
|
349
350
351
352
353
354
355
356
357
358
|
// 确保上传目录存在
private string EnsureUploadDirectory()
{
var uploadPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "Document");
if (!Directory.Exists(uploadPath))
{
Directory.CreateDirectory(uploadPath);
}
return uploadPath;
}
|
赖素文
authored
|
359
|
|
赖素文
authored
|
360
361
362
363
364
365
|
// 保存文件并返回新文件名和文件大小
private (string newFileName, long size) SaveFile(IFormFile file, string uploadPath)
{
var suffix = Path.GetExtension(file.FileName);
var fileName = Path.GetFileNameWithoutExtension(file.FileName);
var newFileName = $"{fileName}_{DateTime.Now:yyyy-MM-dd-HH-mm-ss}{suffix}";
|
赖素文
authored
|
366
|
|
赖素文
authored
|
367
368
369
370
371
372
373
|
long size;
using (var fs = File.Create(Path.Combine(uploadPath, newFileName)))
{
file.CopyTo(fs);
size = fs.Length / 1024; // 以 KB 为单位
}
return (newFileName, size);
|
赖素文
authored
|
374
|
}
|
赖素文
authored
|
375
376
377
378
379
380
381
382
383
384
|
// 更新实体的文件信息
private void UpdateEntity(sys_File entity, string newFileName, long size)
{
entity.size = size > 1024 ? $"{size / 1024:N1}M" : $"{size:N1}Kb";
entity.suffix = Path.GetExtension(newFileName);
entity.fileName = Path.GetFileNameWithoutExtension(newFileName);
entity.url = newFileName;
entity.createBy = sysWebUser.Account;
entity.createTime = DateTime.Now;
|
唐召明
authored
|
385
|
}
|
赖素文
authored
|
386
|
#endregion
|
赖素文
authored
|
387
388
|
}
}
|