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)); }
/// <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); }