Exemplo n.º 1
0
        public JsonResult DeleteDirectory(int id)
        {
            var fileTypeBll = new TraficFileTypeBll();

            if (fileTypeBll.Exists("ParentId=" + id))
            {
                return(Json(ErrorModel.DeleteForbidden));
            }

            var fileBll = new TraficFilesBll();

            if (fileBll.Exists("IsDelete=0 AND TypeId=" + id))
            {
                return(Json(ErrorModel.DeleteForbidden));
            }

            var success = fileTypeBll.Delete(id);

            if (success)
            {
                DataUpdateLog.SingleUpdate(typeof(TraficFileType).Name, id, DataUpdateType.Delete);

                return(Json(ErrorModel.OperateSuccess));
            }

            return(Json(ErrorModel.OperateFailed));
        }
Exemplo n.º 2
0
        public JsonResult AddDirectory(string directory)
        {
            var model = JsonHelper.Deserialize <TraficFileType>(directory);

            if (model == null)
            {
                return(Json(ErrorModel.InputError));
            }

            var dirBll = new TraficFileTypeBll();
            // 验证目录是否重名
            var condition = $"ParentId={model.ParentId} AND TypeName='{model.TypeName}' AND IsDelete=0";

            if (dirBll.Exists(condition))
            {
                return(Json(ErrorModel.DirectoryExists));
            }

            // 准备数据库操作事务
            var         updateType    = model.Id > 0 ? DataUpdateType.Update : DataUpdateType.Insert;
            var         log           = $"添加了目录[{model.TypeName}]";
            Func <bool> doAddOrUpdate = () => dirBll.Insert(model).Id > 0;

            if (model.Id > 0)
            {
                var viewDirBll    = new ViewTraficFileTypeBll();
                var origin        = viewDirBll.QuerySingle(model.Id);
                var newDepartName = new DepartInfoBll().QuerySingle(model.DepartmentId, new[] { nameof(DepartInfo.DepartmentName) }).DepartmentName;
                log           = $"将目录由[{origin.TypeName}-{origin.DepartmentName}-{(origin.IsPublic ? "公共文件夹" : "私有文件夹")}]更新为[{model.TypeName}-{newDepartName}-{(model.IsPublic ? "公共文件夹" : "私有文件夹")}]";
                doAddOrUpdate = () => dirBll.Update(model);
            }

            // 执行事务
            var loginUser = LoginStatus.GetLoginId();
            var logBll    = new OperateLogBll();
            var success   = dirBll.ExecuteTransation(
                doAddOrUpdate,
                () => DataUpdateLog.SingleUpdate(nameof(TraficFileType), model.Id, updateType),
                () => logBll.Add(nameof(TraficFileType), model.Id, updateType, loginUser, log)
                );

            return(Json(success ? ErrorModel.AddDataSuccess(model.Id) : ErrorModel.OperateFailed));
        }
Exemplo n.º 3
0
        /// <summary>
        /// 删除目录,将在事务环境中执行以下操作
        ///  1. 删除此目录及所有子目录
        ///  2. 删除此目录及所有子目录下的文件
        ///  3. 删除此与此目录下所有文件关联的关键字搜索结果数据
        ///  4. 将操作同步到DbUpdateLog表中
        ///  5. 将操作日志记录到OperateLog表中
        /// </summary>
        /// <param name="id">待删除的目录Id</param>
        /// <returns></returns>
        private bool DeleteDirectoryAndChildren(int id)
        {
            var dirBll    = new TraficFileTypeBll();
            var dirList   = dirBll.QueryList("IsDelete=0", new[] { nameof(TraficFileType.Id), nameof(TraficFileType.ParentId), nameof(TraficFileType.TypeName) }).ToList();
            var deleteDir = dirList.Find(dir => dir.Id == id);

            if (deleteDir == null)
            {
                return(false);
            }

            var fileBll  = new TraficFilesBll();
            var fileList = fileBll.QueryList("IsDelete=0", new[] { nameof(TraficFiles.Id), nameof(TraficFiles.TypeId) }).ToList();

            // 所有待删除的目录Id
            var dirDeleteIdList = new List <int> {
                id
            };

            FindChildDirIds(dirList, id, dirDeleteIdList);

            // 所有待删除的文件Id
            var fileDeleteIdList = fileList.Where(file => dirDeleteIdList.Contains(file.TypeId)).Select(file => file.Id).ToList();

            // 所有待删除的搜索结果Id
            var searchBll    = new TraficSearchResultBll();
            var searchSql    = $"TraficFileId IN({string.Join(",", fileDeleteIdList.Count == 0 ? new List<int> { 0 } : fileDeleteIdList)})"; // 不能让sql语句中IN()中的字符串为空
            var searchIdList = searchBll.QueryList(searchSql, new[] { nameof(TraficSearchResult.Id) })
                               .Select(item => item.Id).ToList();

            // 操作日志
            var log = $"删除了目录[{deleteDir.TypeName}]及其所有的子目录和子文件";

            // 准备sql语句
            var dirDeleteSql    = $"UPDATE TraficFileType SET IsDelete=1 WHERE Id IN({string.Join(",", dirDeleteIdList)})";
            var fileDeleteSql   = $"UPDATE TraficFiles SET IsDelete=1 WHERE Id IN({string.Join(",", fileDeleteIdList)})";
            var searchDeleteSql = $"DELETE FROM TraficSearchResult WHERE TraficFileId IN({string.Join(",", fileDeleteIdList)})";

            // 准备执行委托
            var         logBll                = new OperateLogBll();
            var         loginUser             = LoginStatus.GetLoginId();
            Func <bool> deleteDirs            = () => dirBll.ExecuteSql(dirDeleteSql) == dirDeleteIdList.Count;
            Func <bool> deleteFiles           = () => fileDeleteIdList.Count == 0 ? true : fileBll.ExecuteSql(fileDeleteSql) == fileDeleteIdList.Count;
            Func <bool> deleleSearch          = () => searchIdList.Count == 0 ? true : searchBll.ExecuteSql(searchDeleteSql) == searchIdList.Count;
            Func <bool> insertDirUpdateLog    = () => { DataUpdateLog.BulkUpdate(nameof(TraficFileType), dirDeleteIdList, DataUpdateType.Delete); return(true); };
            Func <bool> insertFileUpdateLog   = () => { DataUpdateLog.BulkUpdate(nameof(TraficFiles), fileDeleteIdList, DataUpdateType.Delete); return(true); };
            Func <bool> insertSearchUpdateLog = () => { DataUpdateLog.BulkUpdate(nameof(TraficSearchResult), searchIdList, DataUpdateType.Delete); return(true); };
            Func <bool> insertOperateLog      = () => logBll.Add(nameof(TraficFileType), id, DataUpdateType.Delete, loginUser, log);

            // 执行事务
            var success = dirBll.ExecuteTransation(
                deleteDirs,
                deleteFiles,
                deleleSearch,
                insertDirUpdateLog,
                insertFileUpdateLog,
                insertSearchUpdateLog,
                insertOperateLog
                );

            return(success);
        }
Exemplo n.º 4
0
        public JsonResult AddFiles()
        {
            var typeId   = Request["typeId"].ToInt32();
            var departId = Request["depart"].ToInt32();

            if (typeId == 0 || departId == 0)
            {
                return(Json(new { msg = ErrorModel.InputError }));
            }

            // 将文件保存到本地
            var uploadRes    = UploadHelper.FileUpload();
            var filePathInfo = uploadRes as FilePathInfo;

            if (filePathInfo == null)
            {
                return(Json(new { msg = uploadRes }));
            }

            var fileBll = new TraficFilesBll();

            // 验证文件是否重名
            var condition = $"IsDelete=0 AND TypeId={typeId} AND FileName='{filePathInfo.OriginalFileName}'";

            if (fileBll.Exists(condition))
            {
                return(Json(ErrorModel.FileExists));
            }

            var loginUser = LoginStatus.GetLoginId();
            var fileModel = new TraficFiles
            {
                FileExtension  = filePathInfo.FileExtension,
                FileName       = filePathInfo.OriginalFileName,
                FilePath       = filePathInfo.FileRelativePath,
                OriginFilePath = filePathInfo.FileRelativePath,
                FileSize       = filePathInfo.FileSize,
                TypeId         = typeId,
                CreatorId      = loginUser,
                DepartmentId   = departId
            };

            var logBll = new OperateLogBll();
            var dirBll = new TraficFileTypeBll();
            var dir    = dirBll.QuerySingle(typeId);
            var log    = $"在目录[{dir.TypeName}]下添加了文件《{filePathInfo.OriginalFileName}》";

            // 执行插入操作、数据库更新日志插入操作以及后台操作日志插入操作
            var success = fileBll.ExecuteTransation(
                () => fileBll.Insert(fileModel).Id > 0,
                () => DataUpdateLog.SingleUpdate(nameof(TraficFiles), fileModel.Id, DataUpdateType.Insert),
                () => logBll.Add(nameof(TraficFiles), fileModel.Id, DataUpdateType.Insert, loginUser, log)
                );

            if (success)
            {
                // 开启新线程执行将 office 文件转换为 html 的任务
                // 以避免阻塞网络请求线程,造成用户长时间的等待
                Task.Factory.StartNew(() => FormatFile(fileModel));

                return(Json(new
                {
                    msg = ErrorModel.OperateSuccess,
                    data = uploadRes,
                    fileId = fileModel.Id,
                    fileModel
                }));
            }

            return(Json(new { msg = ErrorModel.OperateFailed }));
        }