|
|
@@ -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>
|