瀏覽代碼

增强物资管理与翻译人员处理功能

在 `PersonnelModuleController.cs` 中添加企业微信消息通知支持,并修改物资领用处理逻辑以确保成功接收后发送通知。
删除 `ResourceController.cs` 中与策划部供应商资料相关的 Excel 导入方法。
在 `Library.cs` 中实现物资领用通知功能,向人事相关人员发送通知。
修改 `GoodsRepository.cs` 中物品领用删除逻辑,确保事务处理并返回操作结果。
重构 `OfficialActivitiesRepository.cs` 中翻译人员资料处理逻辑,优化添加和更新流程。
LEIYI 3 月之前
父節點
當前提交
e9ceab0425

+ 28 - 2
OASystem/OASystem.Api/Controllers/PersonnelModuleController.cs

@@ -1,7 +1,9 @@
 using Aspose.Cells;
 using FluentValidation;
 using Microsoft.AspNetCore.SignalR;
+using NPOI.XSSF.Model;
 using OASystem.API.OAMethodLib;
+using OASystem.API.OAMethodLib.APNs;
 using OASystem.API.OAMethodLib.Hub.HubClients;
 using OASystem.API.OAMethodLib.Hub.Hubs;
 using OASystem.API.OAMethodLib.QiYeWeChatAPI;
@@ -12,12 +14,14 @@ using OASystem.Domain.Entities.Groups;
 using OASystem.Domain.Entities.PersonnelModule;
 using OASystem.Domain.ViewModels.PersonnelModule;
 using OASystem.Domain.ViewModels.QiYeWeChat;
+using OASystem.Domain.ViewModels.Statistics;
 using OASystem.Infrastructure.Repositories.Groups;
 using OASystem.Infrastructure.Repositories.PersonnelModule;
 using System.Data;
 using System.Diagnostics;
 using System.Globalization;
 using static OASystem.API.OAMethodLib.JWTHelper;
+using static OpenAI.GPT3.ObjectModels.SharedModels.IOpenAiModels;
 
 namespace OASystem.API.Controllers
 {
@@ -2134,7 +2138,17 @@ WHERE
                 CurrUserId = currUserInfo.UserId,
             };
 
-            return Ok(await _goodsRep.GoodsReceiveBatchOpAsync(newDto));
+            var res = await _goodsRep.GoodsReceiveBatchOpAsync(newDto);
+            //企业微信消息通知
+            if (res.Code == StatusCodes.Status200OK && dto.Id < 1)
+            {
+                var signProperty = res.Data?.GetType().GetProperty("sign");
+                int sign = signProperty != null && signProperty.GetValue(res.Data, null) is int value ? value : 0;
+                //物资领用通知
+                await AppNoticeLibrary.SendUserMsg_CompanyShare_ToHR(sign, dto.GroupId, currUserInfo.UserId);
+            }
+
+            return Ok(res);
 
         }
 
@@ -2327,7 +2341,19 @@ WHERE
                 index++;
             }
 
-            return Ok(await _goodsRep.GoodsReceiveBatchOpAsync(dto));
+            var res = await _goodsRep.GoodsReceiveBatchOpAsync(dto);
+
+            //企业微信消息通知
+            if (res.Code == StatusCodes.Status200OK && dto.Id < 1)
+            {
+                var signProperty = res.Data?.GetType().GetProperty("sign");
+                int sign = signProperty != null && signProperty.GetValue(res.Data, null) is int value ? value : 0;
+
+                //物资领用通知
+                await AppNoticeLibrary.SendUserMsg_CompanyShare_ToHR(sign, dto.GroupId, dto.CurrUserId);
+            }
+            
+            return Ok(res);
         }
 
         /// <summary>

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

@@ -4661,147 +4661,7 @@ WHERE
             return Ok(await _mediaSupplierRep.SoftDel(dto));
         }
 
-        /// <summary>
-        /// 策划部供应商资料
-        /// excel导入
-        /// </summary>
-        /// <param name="file"></param>
-        /// <param name="currUserId">录入人userId</param>
-        /// <returns></returns>
-        [HttpPost]
-        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
-        public async Task<IActionResult> MediaSupplierExcelImport(IFormFile file, [FromQuery] int currUserId = 258)
-        {
-            // 检查文件是否为空
-            if (file == null || file.Length == 0)
-            {
-                return Ok(JsonView(false,"请选择文件!"));
-            }
-
-            // 文件签名验证
-            var perExtensions = new[] { ".xls", ".xlsx" };
-            Dictionary<string, List<byte[]>> fileSignature = CommonFun.FileSignature;
-            fileSignature = fileSignature.Where(pair => perExtensions.Contains(pair.Key)).ToDictionary(pair => pair.Key, pair => pair.Value);
-
-            // 文件扩展名验证
-            var ext = Path.GetExtension(file.FileName).ToLowerInvariant();
-            if (string.IsNullOrEmpty(ext) || !fileSignature.ContainsKey(ext))
-            {
-                return Ok(JsonView(false, "不支持的文件类型!"));
-            }
-
-            using (var memoryStream = new MemoryStream())
-            {
-                await file.CopyToAsync(memoryStream);
-
-                // 检查文件签名
-                var fileData = memoryStream.ToArray();
-                var signatures = fileSignature[ext];
-                bool signatureValid = signatures.Any(signature =>
-                    fileData.Take(signature.Length).SequenceEqual(signature));
-
-                if (!signatureValid)
-                {
-                    return Ok(JsonView(false, "文件内容与类型不匹配!"));
-                }
-            }
-
-            // 保存文件到服务器
-            var uploadsFolder = @$"D:\FTP\File\OA2023\Office\Excel\MediaSupplierExcelImportFile";
-            if (!Directory.Exists(uploadsFolder))
-            {
-                Directory.CreateDirectory(uploadsFolder);
-            }
-
-            var fileName = CommonFun.ValidFileName(file.Name);
-
-            var filePath = Path.Combine(uploadsFolder, fileName);
-            using (var stream = new FileStream(filePath, FileMode.Create))
-            {
-                await file.CopyToAsync(stream);
-            }
-
-            Workbook workbook = new Workbook(filePath);
-
-            // 获取第一个工作表
-            Worksheet worksheet = workbook.Worksheets[0];
-
-            // 获取表头(第一行作为列名)
-            int headerRowIndex = 0; 
-            Row headerRow = worksheet.Cells.Rows[headerRowIndex];
-            int colCount = worksheet.Cells.MaxDataColumn + 1;
-
-            // 动态存储列名
-            var datas = new List<Res_MediaSuppliers>();
-
-            var typeDatas = await _sqlSugar.Queryable<Sys_SetData>()
-               .Where(x => x.IsDel == 0 && x.STid == 21)
-               .Select(x => new { x.Id, Text = x.Name })
-               .ToListAsync();
-
-            // 遍历数据行(从第二行开始)
-            int rowCount = worksheet.Cells.MaxDataRow + 1;
-            var msgs = new StringBuilder();
-            for (int row = headerRowIndex + 2; row < rowCount; row++)
-            {
-                var cellVal1 = worksheet.Cells[row, 0].Value;    //序号
-                var cellVal2 = worksheet.Cells[row, 1].Value;    //供应商类型
-                var cellVal3 = worksheet.Cells[row, 2].Value;    //地区
-                var cellVal4 = worksheet.Cells[row, 3].Value;    //城市
-                var cellVal5 = worksheet.Cells[row, 4].Value;    //单位名称
-                var cellVal6 = worksheet.Cells[row, 5].Value;    //单位联系人
-                var cellVal7 = worksheet.Cells[row, 6].Value;    //性别
-                var cellVal8 = worksheet.Cells[row, 7].Value;    //联系电话
-                var cellVal9 = worksheet.Cells[row, 8].Value;    //电子邮件
-                var cellVal10 = worksheet.Cells[row, 9].Value;   //单位缩写
-                var cellVal11 = worksheet.Cells[row, 10].Value;  //职位
-                var cellVal12 = worksheet.Cells[row, 11].Value;  //传真号码
-                var cellVal13 = worksheet.Cells[row, 12].Value;  //微信
-                var cellVal14 = worksheet.Cells[row, 13].Value;  //单位地址
-                var cellVal15 = worksheet.Cells[row, 14].Value;  //备注
-
-                int typeId = typeDatas.FirstOrDefault(x => x.Text == cellVal2?.ToString())?.Id ?? 0;
-                if (typeId < 1)
-                {
-                    var name = cellVal5?.ToString() ?? $"序号:{cellVal1?.ToString() ?? "-"}";
-                    msgs.AppendLine($"[{name}]未设置供应商类型!请手动录入!!!");
-                    continue;
-                }
-
-                var rowData = new Res_MediaSuppliers()
-                {
-                    TypeId = typeId,
-                    Privince = cellVal3?.ToString() ?? "",
-                    City = cellVal4?.ToString() ?? "",
-                    UnitName = cellVal5?.ToString() ?? "",
-                    Contact = cellVal6?.ToString() ?? "",
-                    Sex = string.IsNullOrEmpty(cellVal7?.ToString() ?? "") ? -1 : cellVal7.ToString().Equals("男") ? 0 : 1,
-                    Tel = cellVal8?.ToString() ?? "",
-                    Email = cellVal9?.ToString() ?? "",
-                    UnitAbbreviation = cellVal10?.ToString() ?? "",
-                    Post = cellVal11?.ToString() ?? "",
-                    Fax = cellVal12?.ToString() ?? "",
-                    WeChat = cellVal13?.ToString() ?? "",
-                    UnitAddress = cellVal14?.ToString() ?? "",
-                    Remark = cellVal15?.ToString() ?? "",
-                    CreateUserId = currUserId
-
-                };
-
-                datas.Add(rowData); // 将当前行数据添加到集合中
-            }
-
-            if (datas.Any())
-            {
-                var insert = await _sqlSugar.Insertable(datas).ExecuteCommandAsync();
-                if (insert > 0)
-                {
-                    return Ok(JsonView(true, $"导入成功!count:{insert} warningMsg:{msgs.ToString()}"));
-                }
-
-            }
-            return Ok(JsonView(false,"excel导入失败!"));
-        }
+        
 
 
 

+ 274 - 0
OASystem/OASystem.Api/Controllers/SystemController.cs

@@ -3261,5 +3261,279 @@ And u.UId = {0} And u.FId = 1 ", dto.UserId);
 
         #endregion
 
+
+        #region 资料相关Excel 导入
+        /// <summary>
+        /// excel导入 策划部供应商资料
+        /// </summary>
+        /// <param name="file"></param>
+        /// <param name="currUserId">录入人userId</param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> ExcelImportMediaSupplier(IFormFile file, [FromQuery] int currUserId = 258)
+        {
+            // 检查文件是否为空
+            if (file == null || file.Length == 0)
+            {
+                return Ok(JsonView(false, "请选择文件!"));
+            }
+
+            // 文件签名验证
+            var perExtensions = new[] { ".xls", ".xlsx" };
+            Dictionary<string, List<byte[]>> fileSignature = CommonFun.FileSignature;
+            fileSignature = fileSignature.Where(pair => perExtensions.Contains(pair.Key)).ToDictionary(pair => pair.Key, pair => pair.Value);
+
+            // 文件扩展名验证
+            var ext = Path.GetExtension(file.FileName).ToLowerInvariant();
+            if (string.IsNullOrEmpty(ext) || !fileSignature.ContainsKey(ext))
+            {
+                return Ok(JsonView(false, "不支持的文件类型!"));
+            }
+
+            using (var memoryStream = new MemoryStream())
+            {
+                await file.CopyToAsync(memoryStream);
+
+                // 检查文件签名
+                var fileData = memoryStream.ToArray();
+                var signatures = fileSignature[ext];
+                bool signatureValid = signatures.Any(signature =>
+                    fileData.Take(signature.Length).SequenceEqual(signature));
+
+                if (!signatureValid)
+                {
+                    return Ok(JsonView(false, "文件内容与类型不匹配!"));
+                }
+            }
+
+            // 保存文件到服务器
+            var uploadsFolder = @$"D:\FTP\File\OA2023\Office\Excel\MediaSupplierExcelImportFile";
+            if (!Directory.Exists(uploadsFolder))
+            {
+                Directory.CreateDirectory(uploadsFolder);
+            }
+
+            var fileName = CommonFun.ValidFileName(file.Name);
+
+            var filePath = Path.Combine(uploadsFolder, fileName);
+            using (var stream = new FileStream(filePath, FileMode.Create))
+            {
+                await file.CopyToAsync(stream);
+            }
+
+            Workbook workbook = new Workbook(filePath);
+
+            // 获取第一个工作表
+            Worksheet worksheet = workbook.Worksheets[0];
+
+            // 获取表头(第一行作为列名)
+            int headerRowIndex = 0;
+            Row headerRow = worksheet.Cells.Rows[headerRowIndex];
+            int colCount = worksheet.Cells.MaxDataColumn + 1;
+
+            // 动态存储列名
+            var datas = new List<Res_MediaSuppliers>();
+
+            var typeDatas = await _sqlSugar.Queryable<Sys_SetData>()
+               .Where(x => x.IsDel == 0 && x.STid == 21)
+               .Select(x => new { x.Id, Text = x.Name })
+               .ToListAsync();
+
+            // 遍历数据行(从第二行开始)
+            int rowCount = worksheet.Cells.MaxDataRow + 1;
+            var msgs = new StringBuilder();
+            for (int row = headerRowIndex + 2; row < rowCount; row++)
+            {
+                var cellVal1 = worksheet.Cells[row, 0].Value;    //序号
+                var cellVal2 = worksheet.Cells[row, 1].Value;    //供应商类型
+                var cellVal3 = worksheet.Cells[row, 2].Value;    //地区
+                var cellVal4 = worksheet.Cells[row, 3].Value;    //城市
+                var cellVal5 = worksheet.Cells[row, 4].Value;    //单位名称
+                var cellVal6 = worksheet.Cells[row, 5].Value;    //单位联系人
+                var cellVal7 = worksheet.Cells[row, 6].Value;    //性别
+                var cellVal8 = worksheet.Cells[row, 7].Value;    //联系电话
+                var cellVal9 = worksheet.Cells[row, 8].Value;    //电子邮件
+                var cellVal10 = worksheet.Cells[row, 9].Value;   //单位缩写
+                var cellVal11 = worksheet.Cells[row, 10].Value;  //职位
+                var cellVal12 = worksheet.Cells[row, 11].Value;  //传真号码
+                var cellVal13 = worksheet.Cells[row, 12].Value;  //微信
+                var cellVal14 = worksheet.Cells[row, 13].Value;  //单位地址
+                var cellVal15 = worksheet.Cells[row, 14].Value;  //备注
+
+                int typeId = typeDatas.FirstOrDefault(x => x.Text == cellVal2?.ToString())?.Id ?? 0;
+                if (typeId < 1)
+                {
+                    var name = cellVal5?.ToString() ?? $"序号:{cellVal1?.ToString() ?? "-"}";
+                    msgs.AppendLine($"[{name}]未设置供应商类型!请手动录入!!!");
+                    continue;
+                }
+
+                var rowData = new Res_MediaSuppliers()
+                {
+                    TypeId = typeId,
+                    Privince = cellVal3?.ToString() ?? "",
+                    City = cellVal4?.ToString() ?? "",
+                    UnitName = cellVal5?.ToString() ?? "",
+                    Contact = cellVal6?.ToString() ?? "",
+                    Sex = string.IsNullOrEmpty(cellVal7?.ToString() ?? "") ? -1 : cellVal7.ToString().Equals("男") ? 0 : 1,
+                    Tel = cellVal8?.ToString() ?? "",
+                    Email = cellVal9?.ToString() ?? "",
+                    UnitAbbreviation = cellVal10?.ToString() ?? "",
+                    Post = cellVal11?.ToString() ?? "",
+                    Fax = cellVal12?.ToString() ?? "",
+                    WeChat = cellVal13?.ToString() ?? "",
+                    UnitAddress = cellVal14?.ToString() ?? "",
+                    Remark = cellVal15?.ToString() ?? "",
+                    CreateUserId = currUserId
+
+                };
+
+                datas.Add(rowData); // 将当前行数据添加到集合中
+            }
+
+            if (datas.Any())
+            {
+                var insert = await _sqlSugar.Insertable(datas).ExecuteCommandAsync();
+                if (insert > 0)
+                {
+                    return Ok(JsonView(true, $"导入成功!count:{insert} warningMsg:{msgs.ToString()}"));
+                }
+            }
+            return Ok(JsonView(false, "excel导入失败!"));
+        }
+
+
+        /// <summary>
+        /// excel导入 策划部供应商资料
+        /// </summary>
+        /// <param name="file"></param>
+        /// <param name="currUserId">录入人userId</param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> CarDataSouceExcelTemp(IFormFile file, [FromQuery] int currUserId = 258)
+        {
+            var url = $"http://132.232.92.186:24/Office/Excel/CarDataSouceImportFile/op地接供应商资料收集模板.xlsx";
+            return Ok(JsonView(true, url));
+        }
+
+        /// <summary>
+        /// excel导入 车公司资料
+        /// </summary>
+        /// <param name="file"></param>
+        /// <param name="currUserId">录入人userId</param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> ExcelImportCarDataSouce(IFormFile file, [FromQuery] int currUserId = 208)
+        {
+            // 检查文件是否为空
+            if (file == null || file.Length == 0)
+            {
+                return Ok(JsonView(false, "请选择文件!"));
+            }
+
+            // 文件签名验证
+            var perExtensions = new[] { ".xls", ".xlsx" };
+            Dictionary<string, List<byte[]>> fileSignature = CommonFun.FileSignature;
+            fileSignature = fileSignature.Where(pair => perExtensions.Contains(pair.Key)).ToDictionary(pair => pair.Key, pair => pair.Value);
+
+            // 文件扩展名验证
+            var ext = Path.GetExtension(file.FileName).ToLowerInvariant();
+            if (string.IsNullOrEmpty(ext) || !fileSignature.ContainsKey(ext))
+            {
+                return Ok(JsonView(false, "不支持的文件类型!"));
+            }
+
+            using (var memoryStream = new MemoryStream())
+            {
+                await file.CopyToAsync(memoryStream);
+
+                // 检查文件签名
+                var fileData = memoryStream.ToArray();
+                var signatures = fileSignature[ext];
+                bool signatureValid = signatures.Any(signature =>
+                    fileData.Take(signature.Length).SequenceEqual(signature));
+
+                if (!signatureValid)
+                {
+                    return Ok(JsonView(false, "文件内容与类型不匹配!"));
+                }
+            }
+
+            // 保存文件到服务器
+            var uploadsFolder = @$"D:\FTP\File\OA2023\Office\Excel\CarDataSouceImportFile";
+            if (!Directory.Exists(uploadsFolder))
+            {
+                Directory.CreateDirectory(uploadsFolder);
+            }
+
+            var fileName = CommonFun.ValidFileName(file.Name);
+
+            var filePath = Path.Combine(uploadsFolder, fileName);
+            using (var stream = new FileStream(filePath, FileMode.Create))
+            {
+                await file.CopyToAsync(stream);
+            }
+
+            Workbook workbook = new Workbook(filePath);
+
+            // 获取第一个工作表
+            Worksheet worksheet = workbook.Worksheets[0];
+
+            // 获取表头(第一行作为列名)
+            int headerRowIndex = 0;
+            Row headerRow = worksheet.Cells.Rows[headerRowIndex];
+            int colCount = worksheet.Cells.MaxDataColumn + 1;
+
+            // 动态存储列名
+            var datas = new List<Res_CarData>();
+
+            // 遍历数据行(从第三行开始)
+            int rowCount = worksheet.Cells.MaxDataRow + 1;
+            var msgs = new StringBuilder();
+            for (int row = headerRowIndex + 2; row < rowCount; row++)
+            {
+                var cellVal1 = worksheet.Cells[row, 0].Value;    //地区
+                var cellVal2 = worksheet.Cells[row, 1].Value;    //公司名称
+                var cellVal3 = worksheet.Cells[row, 2].Value;    //公司地址
+                var cellVal4 = worksheet.Cells[row, 3].Value;    //联系人
+                var cellVal5 = worksheet.Cells[row, 4].Value;    //联系电话
+                var cellVal6 = worksheet.Cells[row, 5].Value;    //电子邮箱
+                var cellVal7 = worksheet.Cells[row, 6].Value;    //其他信息
+
+                var dtTimeNoew = DateTime.Now;
+                var rowData = new Res_CarData()
+                {
+                    UnitArea = cellVal1?.ToString() ?? "",
+                    UnitName = cellVal2?.ToString() ?? "",
+                    Address = cellVal3?.ToString() ?? "",
+                    Contact = cellVal4?.ToString() ?? "",
+                    ContactTel = cellVal5?.ToString() ?? "",
+                    ContactEmail = cellVal6?.ToString() ?? "",
+                    OtherInfo = cellVal7?.ToString() ?? "",
+                    LastUpdateTime = dtTimeNoew,
+                    LastUpdateUserId = currUserId,
+                    CreateTime = dtTimeNoew,
+                    CreateUserId = currUserId,
+                    Remark = $"excel导入添加!"
+                };
+                EncryptionProcessor.EncryptProperties(rowData);
+                datas.Add(rowData); 
+            }
+
+            if (datas.Any())
+            {
+                var insert = await _sqlSugar.Insertable(datas).ExecuteCommandAsync();
+                if (insert > 0)
+                {
+                    return Ok(JsonView(true, $"导入成功!count:{insert} warningMsg:{msgs.ToString()}"));
+                }
+            }
+            return Ok(JsonView(false, "excel导入失败!"));
+        }
+        #endregion
+
     }
 }

+ 85 - 1
OASystem/OASystem.Api/OAMethodLib/QiYeWeChatAPI/AppNotice/Library.cs

@@ -1,10 +1,13 @@
 using OASystem.Domain.Dtos.Groups;
 using OASystem.Domain.Entities.Financial;
 using OASystem.Domain.Entities.Groups;
+using OASystem.Domain.Entities.PersonnelModule;
 using OASystem.Domain.ViewModels.CRM;
 using OASystem.Domain.ViewModels.Groups;
 using OASystem.Domain.ViewModels.QiYeWeChat;
+using OASystem.Domain.ViewModels.Statistics;
 using OASystem.Infrastructure.Repositories.Groups;
+using Quartz.Logging;
 
 namespace OASystem.API.OAMethodLib.QiYeWeChatAPI.AppNotice
 {
@@ -40,7 +43,6 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI.AppNotice
 
         #endregion
 
-
         #region 确认出团
 
         /// <summary>
@@ -1182,6 +1184,88 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI.AppNotice
         }
         #endregion
 
+        #region 物资通知
+
+        /// <summary>
+        /// 物资领用通知
+        /// 接收者:人事相关人员
+        /// </summary>
+        /// <param name="dataId"></param>
+        /// <param name="diId"></param>
+        /// <param name="operationId"></param>
+        /// <returns></returns>
+        public static async Task<bool> SendUserMsg_CompanyShare_ToHR(int dataId,int diId, int operationId)
+        {
+            //企微通知
+            var userIds = new List<string>()
+            {
+                "208", //雷怡
+                "374", //罗颖
+            };
+            Grp_DelegationInfo groupInfo = _grpDeleRep.Query<Grp_DelegationInfo>(s => s.Id == diId).First();
+            var operationName = _grpDeleRep.Query<Sys_Users>(s => s.IsDel == 0 && s.Id == operationId).First()?.CnName ?? "Unknown";
+
+            var groupName = diId switch
+            {
+                0 => "其他物资(公司内部物资)",
+                -1 => "拜访客户所使用的物资",
+                -2 => "库存调整",
+                _ => groupInfo?.TeamName ?? "-"
+            };
+
+
+            var receiveInfo = _grpDeleRep._sqlSugar.Queryable<Pm_GoodsReceive>().First(x => x.IsDel == 0 && x.Id == dataId);
+            if (receiveInfo == null) return false;
+            var receiveDetails = _grpDeleRep._sqlSugar
+                .Queryable<Pm_GoodsReceiveDetails>()
+                .LeftJoin<Pm_GoodsInfo>((x,y) => x.GoodsId == y.Id)
+                .Where(x => x.IsDel == 0 && x.GoodsReceiveId == dataId)
+                .Select((x,y) => new { 
+                    y.Name,
+                    x.Quantity,
+                    y.Unit
+                })
+                .ToList();
+
+            if (!receiveDetails.Any()) return false;
+
+            var goodsMsg = new StringBuilder();
+            foreach (var info in receiveDetails)
+            {
+                goodsMsg.AppendLine($">- {info.Name}:{info.Quantity:#0.00} {info.Unit}");
+            } 
+
+
+            string resMsg = string.Format(@" ` 物资领用申请通知 `  
+
+> ` {0} `提交物资领用申请: 
+
+>团组归属:<font color='info'>{1}</font>
+
+>**物资明细**   
+{2}
+>用途:<font color='comment'>{3}</font> 
+>申请时间:<font color='comment'>{4}</font> 
+
+[详细信息请前往OA系统查看](http://oa.pan-american-intl.com:4399/)   ",
+operationName,
+groupInfo?.TeamName ?? "-",
+goodsMsg,
+receiveInfo.Reason,
+DateTime.Now.ToString("yyyy-MM-dd HH:mm"));
+
+            List<string> qwUserIdList = GetQiyeChatUserIdList(userIds);
+            ResponseBase result = await _qiYeWeChatApiService.GroupStatus_SendMessage_ToUser_Markdown(qwUserIdList, resMsg);
+            if (result.errcode != 0)
+            {
+                //抄送日志 
+                return false;
+            }
+
+            return true;
+        }
+        #endregion
+
         #region Helper
 
         private static string getClientNameStr(List<SimplClientInfo> list, string origin)

+ 25 - 3
OASystem/OASystem.Infrastructure/Repositories/PersonnelModule/GoodsRepository.cs

@@ -2936,6 +2936,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
         /// <returns></returns>
         public async Task<JsonView> GoodsReceiveDel(int id, int currUserId)
         {
+            _jv.Msg = $"操作失败";
             var receiveInfo = await _sqlSugar
                 .Queryable<Pm_GoodsReceive>()
                 .Where(x => x.IsDel == 0 && x.Id == id)
@@ -2946,6 +2947,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                 return _jv;
             }
 
+            _sqlSugar.BeginTran();
             var edit = await _sqlSugar
                 .Updateable<Pm_GoodsReceive>()
                 .SetColumns(x => new Pm_GoodsReceive()
@@ -2956,13 +2958,31 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                 })
                 .Where(x => x.Id == id)
                 .ExecuteCommandAsync();
-            if (edit > 0)
+            if (edit < 1)
             {
-                _jv.Msg = $"操作成功!";
-                _jv.Code = StatusCodes.Status200OK;
+                _sqlSugar.RollbackTran();
                 return _jv;
             }
+            var editSub = await _sqlSugar
+                .Updateable<Pm_GoodsReceiveDetails>()
+                .SetColumns(x => new Pm_GoodsReceiveDetails()
+                {
+                    IsDel = 1,
+                    DeleteUserId = currUserId,
+                    DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+                })
+                .Where(x => x.GoodsReceiveId == id)
+                .ExecuteCommandAsync();
 
+            if (editSub > 0)
+            {
+                _sqlSugar.RollbackTran();
+                return _jv;
+            }
+
+            _sqlSugar.CommitTran();
+            _jv.Msg = $"操作成功!";
+            _jv.Code = StatusCodes.Status200OK;
             return _jv;
         }
 
@@ -3463,7 +3483,9 @@ FROM
 
             _sqlSugar.CommitTran();
             _jv.Code = StatusCodes.Status200OK;
+            _jv.Data = new { sign = goodsReceiveId };
             _jv.Msg = $"操作成功!";
+
             return _jv;
         }
 

+ 77 - 45
OASystem/OASystem.Infrastructure/Repositories/Resource/OfficialActivitiesRepository.cs

@@ -1,6 +1,7 @@
 using AutoMapper;
 using MathNet.Numerics.Distributions;
 using MathNet.Numerics.Statistics.Mcmc;
+using NetTaste;
 using Newtonsoft.Json;
 using NPOI.SS.Formula.Functions;
 using OASystem.Domain;
@@ -13,6 +14,7 @@ using OASystem.Infrastructure.Tools;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Reflection;
 using System.Text;
 using System.Threading.Tasks;
 
@@ -196,7 +198,6 @@ FROM
         public async Task<Result> OpOfficialActivities(OpOfficialActivitiesDto dto)
         {
             var result = new Result() { Code = -2, Msg = "未知错误" };
-
             var language = dto?.TranslatorInfo?.Language;
 
             #region 特殊字符转码  037 - 4.28 15:17
@@ -213,29 +214,61 @@ FROM
             _sqlSugar.BeginTran();
 
             //添加到资料库
-            var res_InvitationData = new Res_InvitationOfficialActivityData();
-            res_InvitationData.Country = dto.Country;
-            res_InvitationData.City = dto.Area;
-            res_InvitationData.UnitName = dto.Client;
-            res_InvitationData.Delegation = dto.DiId.ToString();
-            res_InvitationData.Address = dto.Address;
-            res_InvitationData.CreateUserId = dto.CreateUserId;
-            res_InvitationData.Contact = dto.Contact;
-            res_InvitationData.Job = dto.Job;
-            res_InvitationData.Tel = dto.Tel;
-            res_InvitationData.Field = dto.Field;
+            var res_InvitationData = new Res_InvitationOfficialActivityData
+            {
+                Country = dto.Country,
+                City = dto.Area,
+                UnitName = dto.Client,
+                Delegation = dto.DiId.ToString(),
+                Address = dto.Address,
+                CreateUserId = dto.CreateUserId,
+                Contact = dto.Contact,
+                Job = dto.Job,
+                Tel = dto.Tel,
+                Field = dto.Field
+            };
             EncryptionProcessor.EncryptProperties(res_InvitationData);
 
-            var isInserTranslator = false;
-            var translatorInfo = new Res_TranslatorLibrary();
-            if (true)
+            var isInserTranslator = true;
+
+            /*
+             * 2025-04-28 
+             * 翻译人员ID = 0 && 相关文本值 == “-” 不执行添加
+             *
+             */
+            // 获取所有string类型的公共实例属性 排除币种名称
+
+            var pTypes = new List<string>
+            {
+                "CurrencyName",
+            };
+            var stringProperties = dto.TranslatorInfo.GetType()
+                .GetProperties(BindingFlags.Public | BindingFlags.Instance)
+                .Where(p => p.PropertyType == typeof(string) && !pTypes.Contains(p.Name));
+
+            // 检查是否有任何属性的值为 -
+            int valCount = 0;
+            foreach (var property in stringProperties)
+            {
+                var value = (string)property.GetValue(dto.TranslatorInfo) ?? "";
+                if (value.Trim().Equals("-")) { valCount++; }
+            }
+
+            if (stringProperties.Count() == valCount) isInserTranslator = false;
+
+            var transInfo = new Res_TranslatorLibrary();
+
+            if (isInserTranslator)
             {
                 //翻译人员资料
-                translatorInfo = _mapper.Map<Res_TranslatorLibrary>(dto.TranslatorInfo);
-                translatorInfo.CreateUserId = dto.CreateUserId;
-                if (dto.TranslatorIdItem.Any()) translatorInfo.Id = dto.TranslatorIdItem[0];
+                transInfo = _mapper.Map<Res_TranslatorLibrary>(dto.TranslatorInfo);
 
-                EncryptionProcessor.EncryptProperties(translatorInfo);
+                transInfo.LastUpdateUserId = dto.CreateUserId;
+                transInfo.LastUpdateTime = DateTime.Now;
+                transInfo.CreateUserId = dto.CreateUserId;
+                if (dto.TranslatorIdItem.Any()) transInfo.Id = dto.TranslatorIdItem[0];
+
+                EncryptionProcessor.EncryptProperties(transInfo);
                 isInserTranslator = true;
             }
 
@@ -255,13 +288,13 @@ FROM
                 }
                 else
                 {
-                    var translatorId = translatorInfo.Id;
+                    var translatorId = transInfo.Id;
 
                     if (isInserTranslator)
                     {
                         if (translatorId > 0) // 翻译人员资料更新
                         {
-                            var tiStatus = await _sqlSugar.Updateable<Res_TranslatorLibrary>(translatorInfo)
+                            var tiStatus = await _sqlSugar.Updateable<Res_TranslatorLibrary>(transInfo)
                                 .UpdateColumns(x => new
                                 {
                                     x.Area,
@@ -285,7 +318,7 @@ FROM
                         }
                         else //添加翻译人员资料
                         {
-                            translatorId = await _sqlSugar.Insertable(translatorInfo).ExecuteReturnIdentityAsync();
+                            translatorId = await _sqlSugar.Insertable(transInfo).ExecuteReturnIdentityAsync();
                             if (translatorId == 0)
                             {
                                 _sqlSugar.RollbackTran();
@@ -345,21 +378,21 @@ FROM
                 {
                     DataID = res_InvitationData.Id;
                     //商邀资料
-                    await _sqlSugar.Updateable<Res_InvitationOfficialActivityData>(res_InvitationData)
-                                    .UpdateColumns(x => new
-                                    {
-                                        x.Country,
-                                        x.City,
-                                        x.UnitName,
-                                        x.Delegation,
-                                        x.Address,
-                                        x.CreateUserId,
-                                        x.Contact,
-                                        x.Job,
-                                        x.Tel,
-                                        x.Field,
-                                    })
-                                    .ExecuteCommandAsync();
+                    await _sqlSugar.Updateable(res_InvitationData)
+                        .UpdateColumns(x => new
+                        {
+                            x.Country,
+                            x.City,
+                            x.UnitName,
+                            x.Delegation,
+                            x.Address,
+                            x.CreateUserId,
+                            x.Contact,
+                            x.Job,
+                            x.Tel,
+                            x.Field,
+                        })
+                        .ExecuteCommandAsync();
                 }
                
                 //公务出访
@@ -401,9 +434,9 @@ FROM
                     {
                         #region 更新(公务信息关联翻译人员) 关联信息
 
-                        if (translatorInfo.Id > 0) //资料更新
+                        if (transInfo.Id > 0) //资料更新
                         {
-                            var tiStatus = await _sqlSugar.Updateable<Res_TranslatorLibrary>(translatorInfo)
+                            var tiStatus = await _sqlSugar.Updateable<Res_TranslatorLibrary>(transInfo)
                                 .UpdateColumns(x => new
                                 {
                                     x.Area,
@@ -426,13 +459,13 @@ FROM
                             }
 
                             var dutyLink_select = await _sqlSugar.Queryable<Grp_OfficialDutyLinkTranslator>()
-                           .Where(x => x.IsDel == 0 && x.OfficialDutyId == dto.Id && x.TranslatorId == translatorInfo.Id)
+                           .Where(x => x.IsDel == 0 && x.OfficialDutyId == dto.Id && x.TranslatorId == transInfo.Id)
                            .FirstAsync();
                             if (dutyLink_select == null)
                             {
                                 var odltStatus = await _sqlSugar.Insertable(new Grp_OfficialDutyLinkTranslator()
                                 {
-                                    TranslatorId = translatorInfo.Id,
+                                    TranslatorId = transInfo.Id,
                                     OfficialDutyId = dto.Id,
                                     CreateUserId = dto.CreateUserId,
                                     Remark = $"公务出访客户资料-->添加"
@@ -446,15 +479,15 @@ FROM
                         }
                         else // 添加
                         {
-                            translatorInfo.Id = await _sqlSugar.Insertable(translatorInfo).ExecuteReturnIdentityAsync();
-                            if (translatorInfo.Id == 0)
+                            transInfo.Id = await _sqlSugar.Insertable(transInfo).ExecuteReturnIdentityAsync();
+                            if (transInfo.Id == 0)
                             {
                                 _sqlSugar.RollbackTran();
                                 return new Result() { Code = -1, Msg = "翻译人员资料添加失败!", Data = new { Id = dto.Id } };
                             }
                             var odltStatus = await _sqlSugar.Insertable(new Grp_OfficialDutyLinkTranslator()
                             {
-                                TranslatorId = translatorInfo.Id,
+                                TranslatorId = transInfo.Id,
                                 OfficialDutyId = dto.Id,
                                 CreateUserId = dto.CreateUserId,
                                 Remark = $"公务出访客户资料-->添加"
@@ -468,7 +501,6 @@ FROM
                         #endregion
                     }
 
-
                     _sqlSugar.CommitTran();
                     result = new Result() { Code = 0, Msg = "修改成功!", Data = new { Id = dto.Id } };
                 }