Browse Source

(新增)备忘录CURD,需前端展示MarkDown

jiangjc 1 year ago
parent
commit
5e5f9f6336

+ 1 - 0
OASystem/EntitySync/Program.cs

@@ -93,5 +93,6 @@ db.CodeFirst.SetStringDefaultLength(50).BackupTable().InitTables(new Type[]
     //typeof(Bus_ConfItemInfo)
     //typeof(Bus_ConfItemListInfo)
     //typeof(Res_CountryFeeCost)
+    typeof(Res_MemoInfo)
 });
 Console.WriteLine("数据库结构同步完成!");

+ 1 - 0
OASystem/OASystem.Api/Controllers/BusinessController.cs

@@ -162,5 +162,6 @@ Where c.ConfListId = {0}", ConfId);
         }
 
         #endregion
+
     }
 }

+ 238 - 1
OASystem/OASystem.Api/Controllers/ResourceController.cs

@@ -1,4 +1,6 @@
-using System.Collections.Generic;
+using OASystem.API.OAMethodLib;
+using OASystem.Domain.Dtos.Resource;
+using System.Collections.Generic;
 
 namespace OASystem.API.Controllers
 {
@@ -985,6 +987,241 @@ namespace OASystem.API.Controllers
 
         #endregion
         #endregion
+
+        #region 备忘录
+        /// <summary>
+        /// 备忘录查询
+        /// </summary>
+        /// <param name="paras">Json序列化</param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostSearchMemo(JsonDtoBase _jsonDto)
+        {
+            if (string.IsNullOrEmpty(_jsonDto.Paras))
+            {
+                return Ok(JsonView(false, "参数为空"));
+            }
+
+            Search_ResMemoDto _memoDto = JsonConvert.DeserializeObject<Search_ResMemoDto>(_jsonDto.Paras);
+            if (_memoDto != null)
+            {
+                if (_memoDto.SearchType == 2)
+                {
+                    //获取列表
+                    string sqlWhere = string.Format(" Where IsDel=0 ");
+
+                    #region SqlWhere
+
+                    if (!string.IsNullOrEmpty(_memoDto.Abstracts))
+                    {
+                        sqlWhere += string.Format(@" And m.Abstracts Like '%{0}%' ", _memoDto.Abstracts);
+                    }
+                    if (!string.IsNullOrEmpty(_memoDto.Title))
+                    {
+                        sqlWhere += string.Format(@" And m.Title Like '%{0}%' ", _memoDto.Title);
+                    }
+                    if (_memoDto.ReadLevel > 0)
+                    {
+                        sqlWhere += string.Format(@" And m.ReadLevel = {0} ", _memoDto.ReadLevel);
+                    }
+                    #endregion
+
+                    int currPIndex = (((_memoDto.PageIndex > 0) ? (_memoDto.PageIndex - 1) : 0) * _memoDto.PageSize) + 1;
+                    int currPSize = (((_memoDto.PageIndex > 0) ? (_memoDto.PageIndex - 1) : 0) + 1) * _memoDto.PageSize;
+                    string sql = string.Format(@" Select * From(Select ROW_NUMBER() Over(order By m.Id desc) as RowNumber,
+m.Id as MemoId,d.DepName as DepartmentName,m.ReadLevel,m.Title,m.Abstracts,
+m.LastedEditDt,m.LastedEditorId
+From Res_Memo as m With(Nolock) Inner Join Sys_Users as u With(Nolock) On m.CreateUserId=u.Id
+Inner Join Sys_Department as d With(Nolock) On u.DepId=d.Id {2}
+) as tb Where tb.RowNumber Between {0} And {1} ", currPIndex, currPSize, sqlWhere);
+                    Res_MemoListView rst = new Res_MemoListView();
+                    rst.CurrPageIndex = currPIndex;
+                    rst.CurrPageSize = currPSize;
+                    List<Res_MemoView> dataSource = _carDataRep._sqlSugar.SqlQueryable<Res_MemoView>(sql).ToList();
+                    Dictionary<int, string> userDic = new Dictionary<int, string>();
+
+                    foreach (var item in dataSource)
+                    {
+                        if (userDic.ContainsKey(item.LastedEditorId))
+                        {
+                            item.LastedEditor = userDic[item.LastedEditorId];
+                        }
+                        else
+                        {
+                            Sys_Users _sysUser = _carDataRep.Query<Sys_Users>(s => s.Id == item.LastedEditorId).First();
+                            userDic[item.LastedEditorId] = _sysUser.CnName;
+                            item.LastedEditor = _sysUser.CnName;
+                        }
+                    }
+                    rst.DataList = new List<Res_MemoView>(dataSource);
+
+                    if (rst.DataList.Count > 0)
+                    {
+                        string sqlCount = string.Format(@" Select Id From Res_Memo as m With(Nolock) {0} ", sqlWhere);
+                        int dataCount = _carDataRep._sqlSugar.SqlQueryable<Res_MemoInfo>(sqlCount).Count();
+                        rst.DataCount = dataCount;
+                    }
+                    return Ok(JsonView(rst));
+                }
+                else
+                {
+                    //获取对象
+                    string sqlSingle = string.Format(@" Select 
+m.Id as MemoId,d.DepName as DepartmentName,m.ReadLevel,m.Title,m.Abstracts,
+m.LastedEditDt,m.LastedEditor,m.MDFilePath
+From Res_Memo as m With(Nolock) Inner Join Sys_Users as u With(Nolock) On m.CreateUserId=u.Id
+Inner Join Sys_Department as d With(Nolock) On u.DepId=d.Id Where m.Id={0} ", _memoDto.MemoId);
+                    Res_MemoView _result = _carDataRep._sqlSugar.SqlQueryable<Res_MemoView>(sqlSingle).First();
+                    if (_result != null)
+                    {
+                        Sys_Users _sysUser = _carDataRep.Query<Sys_Users>(s => s.Id == _result.LastedEditorId).First();
+                        _result.LastedEditor = _sysUser.CnName;
+                        _result.MarkDownContent = new IOOperatorHelper().Read(_result.MDFilePath);
+                        return Ok(JsonView(_result));
+                    }
+                }
+            }
+            else
+            {
+                return Ok(JsonView(false, "参数反序列化失败"));
+            }
+
+
+
+
+            return Ok(JsonView(false));
+        }
+
+
+        /// <summary>
+        /// 创建/编辑/删除备忘录信息
+        /// </summary>
+        /// <param name="_dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostEditMemo(Edit_ResMemoDto _dto)
+        {
+            bool rst = false;
+            if (_dto.SysUserId < 1)
+            {
+                return Ok(JsonView(false, "操作人失效"));
+            }
+            Sys_Users _sysUser = _resItemInfoRep.Query<Sys_Users>(s => s.Id == _dto.SysUserId).First();
+            if (_sysUser == null)
+            {
+                return Ok(JsonView(false, "操作人失效02"));
+            }
+
+            if (_dto.EditType >= 0)
+            {
+                if (_dto.ReadLevel < 1)
+                {
+                    return Ok(JsonView(false, "未知的阅读等级"));
+                }
+                if (string.IsNullOrEmpty(_dto.Title.Trim()))
+                {
+                    return Ok(JsonView(false, "标题不能为空"));
+                }
+                if (string.IsNullOrEmpty(_dto.Content.Trim()))
+                {
+                    return Ok(JsonView(false, "正文内容不能为空"));
+                }
+                //新增备忘录
+                DateTime dtNow = DateTime.Now;
+                string dir = AppSettingsHelper.Get("MemoCurrPath");
+                string fileName = dtNow.ToString("yyyyMMddHHmmss") + _dto.Title + ".md";
+                string content = JsonConvert.SerializeObject(_dto.Content);
+                if (_dto.EditType == 0)//新增
+                {
+                    string savePath = new IOOperatorHelper().Write_CoverFile(content, dir, fileName);
+
+                    if (savePath.Length > 0)
+                    {
+                        Res_MemoInfo _insert = new Res_MemoInfo();
+                        _insert.Abstracts = _dto.Abstracts;
+                        _insert.Title = _dto.Title;
+                        _insert.DepartmentId = _sysUser.DepId;
+                        _insert.CreateUserId = _sysUser.Id;
+                        _insert.LastedEditDt = dtNow;
+                        _insert.LastedEditor = _sysUser.Id;
+                        _insert.MDFilePath = savePath;
+                        _insert.ReadLevel = _dto.ReadLevel;
+                        _insert.Title = _dto.Title;
+                        int result = await _resItemInfoRep.AddAsync(_insert);
+                        return Ok(JsonView(result > 0));
+                    }
+                    else
+                    {
+                        return Ok(JsonView(false, "路径保存失败"));
+                    }
+                }
+                else//修改
+                {
+                    if (_dto.MemoId < 1)
+                    {
+                        return Ok(JsonView(false, "MemoId不存在"));
+                    }
+
+                    Res_MemoInfo _source = _resItemInfoRep.Query<Res_MemoInfo>(s => s.Id == _dto.MemoId).First();
+                    if (_source == null)
+                    {
+                        return Ok(JsonView(false, "MemoInfo不存在"));
+                    }
+                    //修改
+                    string sourcePath = _source.MDFilePath;
+                    string recycDir = AppSettingsHelper.Get("MemoRecycleBinPath");
+                    new IOOperatorHelper().MoveFile(sourcePath, recycDir);
+                    string savePath = new IOOperatorHelper().Write_CoverFile(content, dir, fileName);
+
+                    if (savePath.Length > 0)
+                    {
+                        var result = await _resItemInfoRep._sqlSugar.Updateable<Res_MemoInfo>()
+                                                                    .SetColumns(it => it.LastedEditDt == DateTime.Now)
+                                                                    .SetColumns(it => it.LastedEditor == _sysUser.Id)
+                                                                    .SetColumns(it => it.Abstracts == _dto.Abstracts)
+                                                                    .SetColumns(it => it.MDFilePath == savePath)
+                                                                    .SetColumns(it => it.ReadLevel == _dto.ReadLevel)
+                                                                    .SetColumns(it => it.Title == _dto.Title)
+                                                                    .Where(s => s.Id == _source.Id)
+                                                                    .ExecuteCommandAsync();
+                        return Ok(JsonView(result > 0));
+                    }
+                }
+            }
+            else
+            {
+                //删除
+                if (_dto.MemoId < 1)
+                {
+                    return Ok(JsonView(false, "MemoId不存在"));
+                }
+
+                Res_MemoInfo _source = _resItemInfoRep.Query<Res_MemoInfo>(s => s.Id == _dto.MemoId).First();
+                if (_source == null)
+                {
+                    return Ok(JsonView(false, "MemoInfo不存在"));
+                }
+                //修改
+                string sourcePath = _source.MDFilePath;
+                string recycDir = AppSettingsHelper.Get("MemoRecycleBinPath");
+                new IOOperatorHelper().MoveFile(sourcePath, recycDir);
+
+                var result = await _resItemInfoRep._sqlSugar.Updateable<Res_MemoInfo>()
+                                                            .SetColumns(it => it.IsDel == 1)
+                                                            .SetColumns(it => it.DeleteUserId == _sysUser.Id)
+                                                            .SetColumns(it => it.DeleteTime == DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
+                                                            .Where(s => s.Id == _source.Id)
+                                                            .ExecuteCommandAsync();
+                return Ok(JsonView(result > 0));
+
+            }
+
+            return Ok(JsonView(rst));
+        }
+
+        #endregion
     }
 
 

+ 71 - 0
OASystem/OASystem.Api/OAMethodLib/IOOperatorHelper.cs

@@ -0,0 +1,71 @@
+using static StackExchange.Redis.Role;
+
+namespace OASystem.API.OAMethodLib
+{
+    public class IOOperatorHelper
+    {
+
+        /// <summary>
+        /// 写文件(覆盖)
+        /// </summary>
+        /// <param name="content"></param>
+        /// <param name="dir"></param>
+        /// <param name="fileName"></param>
+        /// <returns></returns>
+        public string Write_CoverFile(string content, string dir, string fileName)
+        {
+            if (!System.IO.Directory.Exists(dir)) System.IO.Directory.CreateDirectory(dir);   //该路径不存在时,在当前文件目录下创建文件夹"导出.."
+            //不存在该文件时先创建
+            String filePath = dir + fileName;
+            System.IO.StreamWriter file1 = new System.IO.StreamWriter(filePath, false);     //文件已覆盖方式添加内容
+            file1.Write(content);                                                              //保存数据到文件
+            file1.Close();                                                                  //关闭文件
+            file1.Dispose();                                                                //释放对象
+            return filePath;
+        }
+
+        public string Read(string filePath)
+        {
+            string result = string.Empty;
+
+            try
+            {
+                // 读取文本文件
+                using (StreamReader sr = new StreamReader(filePath))
+                {
+                    string line;
+                    // ReadLine()一行一行的循环读取
+                    //当然可以直接ReadToEnd()读到最后
+                    while ((line = sr.ReadLine()) != null)
+                    {
+                        result += line;
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+
+            }
+
+            result = JsonConvert.DeserializeObject<string>(result);
+
+            return result;
+        }
+
+        /// <summary>
+        /// 移动文件
+        /// </summary>
+        /// <param name="sourceFilePath"></param>
+        /// <param name="RecycleBinPath"></param>
+        /// <returns></returns>
+        public void MoveFile(string sourceFileFullPath, string RecycleBinPath)
+        {
+            //移动文件
+            if (!string.IsNullOrEmpty(sourceFileFullPath) && System.IO.File.Exists(sourceFileFullPath))
+            {
+                string fileName = Path.GetFileName(sourceFileFullPath);
+                System.IO.File.Move(sourceFileFullPath, RecycleBinPath + fileName);
+            }
+        }
+    }
+}

+ 4 - 1
OASystem/OASystem.Api/appsettings.json

@@ -106,6 +106,9 @@
   "ExcelBaseUrl": "http://132.232.92.186/",
   "ExcelBasePath": "C:/Server/File/OA2023/Office/Excel/",
   "OfficeBaseUrl": "http://132.232.92.186/",
-  "OfficeTempBasePath": "C:/Server/File/OA2023/Office/"
+  "OfficeTempBasePath": "C:/Server/File/OA2023/Office/",
+  "MemoBaseUrl": "http://132.232.92.186/",
+  "MemoCurrPath": "C:/Server/File/OA2023/Memo/Curr/",
+  "MemoRecycleBinPath": "C:/Server/File/OA2023/Memo/RecycleBin/"
 
 }

+ 46 - 0
OASystem/OASystem.Domain/Dtos/Resource/Res_MemoDto.cs

@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Resource
+{
+    public class Search_ResMemoDto : DtoBase
+    {
+        /// <summary>
+        /// 查询类型(int)
+        /// <list type="table">
+        /// <item>1:对象</item>
+        /// <item>2:列表</item>
+        /// </list>
+        /// </summary>
+        public int SearchType { get; set; }
+
+        #region 对象
+
+        public int MemoId { get; set; }
+
+        #endregion
+
+        public string Title { get; set; }
+        public string Abstracts { get; set; }
+        public int ReadLevel { get; set; }
+
+    }
+
+    public class Edit_ResMemoDto
+    {
+        public int MemoId { get; set; }
+        public int SysUserId { get; set; }
+        public int ReadLevel { get; set; }
+        public string Title { get; set; }
+        public string Content { get; set; }
+        public string Abstracts { get; set; }
+
+        /// <summary>
+        /// 0:添加,1:修改,-1:删除
+        /// </summary>
+        public int EditType { get; set; }
+    }
+}

+ 54 - 0
OASystem/OASystem.Domain/Entities/Resource/Res_MemoInfo.cs

@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Entities.Resource
+{
+    [SugarTable("Res_Memo")]
+    public class Res_MemoInfo : EntityBase
+    {
+        /// <summary>
+        /// 部门Id
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int DepartmentId { get; set; }
+
+        /// <summary>
+        /// 阅读级别,1:个人,2:部门,3:公司
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int ReadLevel { get; set; }
+
+        /// <summary>
+        /// 标题
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "nvarchar(100)")]
+        public string Title { get; set; }
+
+        /// <summary>
+        /// 摘要
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "nvarchar(100)")]
+        public string Abstracts { get; set; }
+
+        /// <summary>
+        /// MarkDown文件路径
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "nvarchar(200)")]
+        public string MDFilePath { get; set; }
+
+        /// <summary>
+        /// 最后更新时间
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "datetime")]
+        public DateTime LastedEditDt { get; set; }
+
+        /// <summary>
+        /// 最后提交用户
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int LastedEditor { get; set; }
+    }
+}

+ 26 - 0
OASystem/OASystem.Domain/ViewModels/Resource/Res_MemoView.cs

@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.ViewModels.Resource
+{
+    public class Res_MemoView
+    {
+        public int MemoId { get; set; }
+        public string DepartmentName { get; set; }
+        public int ReadLevel { get; set; }
+        public string Title { get; set; }
+        public string Abstracts { get; set; }
+        public DateTime LastedEditDt { get; set; }
+        public int LastedEditorId { get; set; }
+        public string LastedEditor { get; set; }
+
+        public string MarkDownContent { get; set; }
+        public string MDFilePath { get; set; }
+    }
+    public class Res_MemoListView : ListViewBase<Res_MemoView>
+    {
+    }
+}