Просмотр исходного кода

商邀资料AI 设置复选框选中 批量、AI查询出的数据添加值商邀资料库

Lyyyi недель назад: 2
Родитель
Сommit
762187b29f

+ 105 - 23
OASystem/OASystem.Api/Controllers/ResourceController.cs

@@ -2940,54 +2940,64 @@ Inner Join Sys_Department as d With(Nolock) On u.DepId=d.Id Where m.Id={0} ", _m
         }
 
         /// <summary>
-        /// 商邀资料AI 设置复选框单条选中
+        /// 商邀资料AI 设置复选框选中 批量
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost]
-        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> InvitationAISetChecked([FromBody] InvitationAISetCheckedDto dto)
         {
-            // 采用统一拦截或更简洁的验证
-            if (dto.Id < 1 || dto.CurrUserId < 1 || string.IsNullOrEmpty(dto.Guid))
+            // 参数校验
+            if (dto.Id < 1 || dto.CurrUserId < 1 || dto.Guids == null || !dto.Guids.Any())
                 return Ok(JsonView(false, "请求参数不完整"));
 
-            // 只查询必要的列
+            // 获取主记录
             var invAiInfo = await _sqlSugar.Queryable<Res_InvitationAI>()
                 .FirstAsync(x => x.IsDel == 0 && x.Id == dto.Id);
 
             if (invAiInfo?.AiCrawledDetails == null || !invAiInfo.AiCrawledDetails.Any())
-                return Ok(JsonView(false, "邀请信息集合不存在或已损坏"));
-
-            // 使用 Linq 快速定位目标项
-            var targetItem = invAiInfo.AiCrawledDetails.FirstOrDefault(x => x.Guid == dto.Guid);
-            if (targetItem == null)
-                return Ok(JsonView(false, "未找到对应的邀请信息"));
+                return Ok(JsonView(false, "数据不存在或集合为空"));
 
-            // 获取操作人姓名 
+            // 准备更新所需数据
+            var guidSet = dto.Guids.ToHashSet();
+            var now = DateTime.Now;
             string operatorName = await _sqlSugar.Queryable<Sys_Users>()
                 .Where(x => x.Id == dto.CurrUserId)
                 .Select(x => x.CnName)
                 .FirstAsync() ?? "-";
 
-            // 更新目标属性
-            targetItem.IsChecked = dto.IsChecked;
-            targetItem.OperatedAt = DateTime.Now;
-            targetItem.Operator = operatorName;
+            // 单次遍历完成 重置 + 更新
+            bool hasMatch = false;
+            foreach (var item in invAiInfo.AiCrawledDetails)
+            {
+                if (guidSet.Contains(item.Guid))
+                {
+                    item.IsChecked = true;
+                    item.OperatedAt = now;
+                    item.Operator = operatorName;
+                    hasMatch = true;
+                }
+                else
+                {
+                    item.IsChecked = false;
+                }
+            }
+
+            if (!hasMatch)
+                return Ok(JsonView(false, "未匹配到任何有效的邀请项"));
 
-            // 排序处理(如果业务要求每次操作都要置顶,则保留)
+            // 排序逻辑(按需保留:仅当需要置顶显示选中项时开启
             invAiInfo.AiCrawledDetails = invAiInfo.AiCrawledDetails
                 .OrderByDescending(x => x.OperatedAt)
                 .ToList();
 
-            // 执行局部更新:仅更新 AiCrawledDetails 字段,减少 IO
-            bool isSuccess = await _sqlSugar.Updateable(invAiInfo)
+            // 提交数据库
+            // 注意:UpdateColumns 会序列化整个 List 覆盖原字段
+            int rowCount = await _sqlSugar.Updateable(invAiInfo)
                 .UpdateColumns(x => x.AiCrawledDetails)
-                .ExecuteCommandHasChangeAsync(); 
+                .ExecuteCommandAsync();
 
-            return Ok(isSuccess
-                ? JsonView(true, "设置成功")
-                : JsonView(false, "设置失败,数据未变更"));
+            return Ok(JsonView(true, "设置成功"));
         }
 
         /// <summary>
@@ -3069,6 +3079,78 @@ Inner Join Sys_Department as d With(Nolock) On u.DepId=d.Id Where m.Id={0} ", _m
             }));
         }
 
+        /// <summary>
+        /// 商邀资料AI AI查询出的数据添加值商邀资料库
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> InvitationAIInsertResource([FromBody] InvitationAIInsertResourceDto dto)
+        {
+            // 基础校验
+            if (dto.Id < 1 || dto.CurrUserId < 1 || dto.Guids == null || !dto.Guids.Any())
+                return Ok(JsonView(false, "参数不完整,请选择有效的单位数据"));
+
+            // 获取主记录
+            var dataInfo = await _sqlSugar.Queryable<Res_InvitationAI>()
+                .FirstAsync(x => x.IsDel == 0 && x.Id == dto.Id);
+
+            if (dataInfo?.AiCrawledDetails == null)
+                return Ok(JsonView(false, "当前数据信息不存在!"));
+
+            // 筛选出待转正的 AI 数据 (使用 HashSet 优化匹配)
+            var guidSet = dto.Guids.ToHashSet();
+            var targetAiDetails = dataInfo.AiCrawledDetails
+                .Where(x => x.Source == 1 && guidSet.Contains(x.Guid))
+                .ToList();
+
+            if (!targetAiDetails.Any())
+                return Ok(JsonView(false, "未找到符合条件的 AI 获取信息,无法重复添加或来源错误!"));
+
+            // 准备入库数据(批量构建)
+            var now = DateTime.Now;
+            var opUserName = await _sqlSugar.Queryable<Sys_Users>().Where(x => x.IsDel == 0 && x.Id == dto.CurrUserId).Select(x => x.CnName).FirstAsync() ?? "-";
+            var rawLocalDatas = targetAiDetails.Select(item => {
+                // 修改内存中的状态为本地数据
+                item.Source = 0;
+                item.OperatedAt = now;
+                item.Operator = opUserName;
+
+                return new Res_InvitationOfficialActivityData()
+                {
+                    // 批量加密操作
+                    Country = AesEncryptionHelper.Encrypt(item.Region),
+                    UnitName = AesEncryptionHelper.Encrypt(item.NameCn),
+                    Address = AesEncryptionHelper.Encrypt(item.Address),
+                    Field = AesEncryptionHelper.Encrypt(item.Scope),
+                    Contact = AesEncryptionHelper.Encrypt(item.Contact),
+                    Tel = AesEncryptionHelper.Encrypt(item.Phone),
+                    Email = AesEncryptionHelper.Encrypt(item.Email),
+                    UnitWeb = AesEncryptionHelper.Encrypt(item.SiteUrl),
+                    LastUpdateUserId = dto.CurrUserId,
+                    LastUpdateTime = now,
+                    CreateUserId = dto.CurrUserId,
+                    CreateTime = now
+                };
+            }).ToList();
+
+            // 开启事务执行双表更新
+            var result = await _sqlSugar.UseTranAsync(async () =>
+            {
+                // 插入本地资料库
+                await _sqlSugar.Insertable(rawLocalDatas).ExecuteCommandAsync();
+
+                // 更新 AI 主表的状态(全量覆盖 JSON 列)
+                await _sqlSugar.Updateable(dataInfo)
+                    .UpdateColumns(x => x.AiCrawledDetails)
+                    .ExecuteCommandAsync();
+            });
+
+            return Ok(result.IsSuccess
+                ? JsonView(true, "成功添加至资料库并更新来源状态")
+                : JsonView(false, $"操作失败:{result.ErrorMessage}"));
+        }
+
         /// <summary>
         /// 商邀资料AI 混元AI续写
         /// </summary>

+ 4 - 8
OASystem/OASystem.Domain/Dtos/Resource/InvitationAI.cs

@@ -31,14 +31,7 @@ namespace OASystem.Domain.Dtos.Resource
 
     public class InvitationAISetCheckedDto : InvitationAISearchDto
     {
-        public string Guid { get; set; }
-
-        /// <summary>
-        /// 是否选中
-        /// true 选中
-        /// false 未选中
-        /// </summary>
-        public bool IsChecked { get; set; }
+        public List<string> Guids { get; set; }
     }
 
     public class InvitationAISearchDto
@@ -97,4 +90,7 @@ namespace OASystem.Domain.Dtos.Resource
 
     }
 
+    public class InvitationAIInsertResourceDto: InvitationAIGenerateEmailDto
+    { }
+
 }