Blame view

sys/Hh.Mes.Service/WebService/Base/SysFileService.cs 14.2 KB
赖素文 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;
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";
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))
37
                                   .Where(expression)
38
                                   .Select((x, y) => new
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,
69
70
71
72
73
                                       x.createBy,
                                       x.createTime
                                   });
                }
74
赖素文 authored
75
76
77
78
                //Exelture就不分页,因为导出的话是全部导出
                if (pageReq != null)
                {
                    int total = 0;
79
                    var list = query.ToOffsetPage(pageReq.page, pageReq.limit, ref total).Distinct();
80
                    result.Result = list;
赖素文 authored
81
82
83
84
                    result.Count = total;
                }
                else
                {
85
                    result.Result = query.ToList().Distinct();
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
                //数据过滤条件
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
                }
111
                //根节点
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
                }
120
121
                //读取当前用户下面所有的设备
                string currentUser = sysWebUser.Account;
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());
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>
161
        /// /左侧列表 设备类型+设备
赖素文 authored
162
        /// </summary>
唐召明 authored
163
        public dynamic GetTreeList()
赖素文 authored
164
165
166
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
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();
227
        }
唐召明 authored
228
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)
252
253
254
255
256
257
258
259
        {
            string path = $"{Directory.GetCurrentDirectory()}{FileNamePath}\\{fileName}";
            if (File.Exists(path))
            {
                File.Delete(path);
            }
        }
260
261
262
263
        #region 文件上传新增 
        /// <summary>
        /// 文件上传新增 需要在外面指定targetTableName
        /// </summary>
264
265
266
267
268
269
        public dynamic AddOrUpdate(sys_File entity)
        {
            return ExceptionsHelp.Instance.ExecuteT<dynamic>(() =>
            {
                var response = new Response();
                string fileEmptyErrorMessage = "上传文件数据时,文件不能为空!";
270
271
                if (!ValidateInitialConditions(entity, response, fileEmptyErrorMessage))
                    return response;
272
273
274
                // 获取目标表名并检查有效性
                entity.targetTableName = GetTargetTableName(entity.targetTableName);
275
276
                var uploadPath = EnsureUploadDirectory();
277
278
279

                foreach (var file in entity.excelfile)
                {
唐召明 authored
280
281
282
283
                    if (!ValidateFile(file, response, fileEmptyErrorMessage))
                    {
                        return response;
                    }
284
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;
            });
        }
294
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;
                }
            }
335
336
            return true;
        }
337
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
            };
        }
348
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;
        }
359
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}";
366
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
        }
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
        }
386
        #endregion
赖素文 authored
387
388
    }
}