Res_InvitationAI.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. using System.Text.Json.Serialization;
  2. namespace OASystem.Domain.Entities.Resource
  3. {
  4. /// <summary>
  5. /// 商邀公务AI
  6. /// </summary>
  7. [SugarTable("Res_InvitationAI", "商邀公务AI")]
  8. public class Res_InvitationAI : EntityBase
  9. {
  10. /// <summary>
  11. /// 名称
  12. /// </summary>
  13. [SugarColumn(ColumnName = "InvName", ColumnDescription = "名称", IsNullable = true, ColumnDataType = "varchar(150)")]
  14. public string InvName { get; set; }
  15. /// <summary>
  16. /// 团组ID
  17. /// 注:自定义命名时,GroupID = 0;使用团组名称时,GroupID = Grp_DelegationInfo.Id
  18. /// </summary>
  19. [SugarColumn(ColumnName = "GroupId", ColumnDescription = "团组ID", IsNullable = true, ColumnDataType = "int")]
  20. public int GroupId { get; set; }
  21. /// <summary>
  22. /// ai 抓取信息存储(含本地数据信息)
  23. /// </summary>
  24. [SugarColumn(ColumnName = "AiCrawledDetails", ColumnDescription = "ai 抓取信息存储(含本地数据信息)", IsJson = true, IsNullable = true, ColumnDataType = "varchar(max)")]
  25. public List<InvitationAIInfo> AiCrawledDetails { get; set; } = new List<InvitationAIInfo>();
  26. /// <summary>
  27. /// 词条信息
  28. /// </summary>
  29. [SugarColumn(ColumnName = "Entries", ColumnDescription = "词条信息", IsJson = true, IsNullable = true, ColumnDataType = "varchar(max)")]
  30. public EntryInfo EntryInfo { get; set; } = new EntryInfo();
  31. }
  32. /// <summary>
  33. /// 单位信息
  34. /// </summary>
  35. public class InvitationAIInfo
  36. {
  37. /// <summary>
  38. /// Guid
  39. /// </summary>
  40. public string Guid { get; set; }
  41. /// <summary>
  42. /// 复选框是否选中
  43. /// </summary>
  44. public bool IsChecked { get; set; } = false;
  45. /// <summary>
  46. /// 数据来源
  47. /// 0-本地数据;1-第三方AI接口数据;2-用户手动输入数据
  48. /// </summary>
  49. public int Source { get; set; } = 0;
  50. /// <summary>
  51. /// 归属区域
  52. /// </summary>
  53. public string Region { get; set; }
  54. /// <summary>
  55. /// 标准行业:信息技术、金融与财会、工业制造、医疗保健、政府与公共服务、消费与贸易
  56. /// </summary>
  57. public string Industry { get; set; }
  58. /// <summary>
  59. /// 名称(中文)
  60. /// </summary>
  61. public string NameCn { get; set; }
  62. /// <summary>
  63. /// 名称(英文)
  64. /// </summary>
  65. public string NameEn { get; set; }
  66. /// <summary>
  67. /// 地址
  68. /// </summary>
  69. public string Address { get; set; }
  70. /// <summary>
  71. /// 经营范围
  72. /// </summary>
  73. public string Scope { get; set; }
  74. /// <summary>
  75. /// 联系人
  76. /// </summary>
  77. public string Contact { get; set; }
  78. /// <summary>
  79. /// 联系电话
  80. /// </summary>
  81. public string Phone { get; set; }
  82. /// <summary>
  83. /// 联系邮箱
  84. /// </summary>
  85. public string Email { get; set; }
  86. /// <summary>
  87. /// 官网地址
  88. /// </summary>
  89. public string SiteUrl { get; set; }
  90. /// <summary>
  91. /// 文章地址
  92. /// </summary>
  93. public List<PostNewsItem> PostUrl { get; set; } = new List<PostNewsItem>();
  94. /// <summary>
  95. /// 推荐等级
  96. /// </summary>
  97. public string RecLevel { get; set; }
  98. /// <summary>
  99. /// 对接建议
  100. /// </summary>
  101. public string IntgAdvice { get; set; }
  102. /// <summary>
  103. /// 邮件信息
  104. /// </summary>
  105. public EmailInfo EmailInfo { get; set; } = new EmailInfo();
  106. /// <summary>
  107. /// 备注
  108. /// </summary>
  109. public string Remark { get; set; }
  110. /// <summary>
  111. /// 操作时间
  112. /// </summary>
  113. public DateTime OperatedAt { get; set; }
  114. /// <summary>
  115. /// 操作人
  116. /// </summary>
  117. public string Operator { get; set; }
  118. }
  119. /// <summary>
  120. /// 新闻链接信息
  121. /// </summary>
  122. public class PostNewsItem
  123. {
  124. public string Date { get; set; }
  125. public string Description { get; set; }
  126. public string Url { get; set; }
  127. }
  128. public class EntryInfo
  129. {
  130. /// <summary>
  131. /// 出访单位
  132. /// </summary>
  133. public string OriginUnit { get; set; }
  134. /// <summary>
  135. /// 拜访国家
  136. /// </summary>
  137. public List<string> TargetCountry { get; set; } = new List<string>();
  138. /// <summary>
  139. /// 行业信息
  140. /// 信息技术、金融与财会、工业制造、医疗保健、政府与公共服务、消费与贸易
  141. /// </summary>
  142. public List<string> Industries { get; set; } = new List<string>();
  143. /// <summary>
  144. /// 规模类型
  145. /// </summary>
  146. public List<string> ScaleTypes { get; set; } = new List<string>();
  147. /// <summary>
  148. /// 是否需要华人单位背景
  149. /// </summary>
  150. public bool IsBackground { get; set; } = false;
  151. /// <summary>
  152. /// 公司类型
  153. /// 全部、总部、分公司
  154. /// 默认:总部
  155. /// </summary>
  156. public string OrgLevel { get; set; } = "总部";
  157. /// <summary>
  158. /// 出访目的
  159. /// </summary>
  160. public string Objective { get; set; }
  161. /// <summary>
  162. /// 数据条数
  163. /// 每个国家获取数据总条数,默认20条
  164. /// </summary>
  165. public int NeedCount { get; set; } = 20;
  166. /// <summary>
  167. /// 其他规则
  168. /// </summary>
  169. public string OtherConstraints { get; set; }
  170. /// <summary>
  171. /// 操作时间
  172. /// </summary>
  173. public DateTime OperatedAt { get; set; } = new DateTime();
  174. /// <summary>
  175. /// 操作人
  176. /// </summary>
  177. public string Operator { get; set; }
  178. }
  179. public class EmailInfo
  180. {
  181. /// <summary>
  182. /// 邮件标题
  183. /// </summary>
  184. public string EmailTitle { get; set; }
  185. /// <summary>
  186. /// 邮箱内容
  187. /// </summary>
  188. public string EmailContent { get; set; }
  189. /// <summary>
  190. /// 附件地址
  191. /// </summary>
  192. public List<string> AttachmentPaths { get; set; } = new List<string>();
  193. /// <summary>
  194. /// 发送状态
  195. /// 1.未开始
  196. /// 2.AI生成成功
  197. /// 3.手动编辑
  198. /// 4.发送完成
  199. /// 5.发送失败
  200. /// </summary>
  201. public int Status { get; set; } = 1;
  202. /// <summary>
  203. /// 操作时间
  204. /// </summary>
  205. public DateTime OperatedAt { get; set; }
  206. /// <summary>
  207. /// 操作人
  208. /// </summary>
  209. public string Operator { get; set; }
  210. }
  211. public class AICreateEmailInfo
  212. {
  213. public string Guid { get; set; }
  214. public string NameCn { get; set; }
  215. public string Scope { get; set; }
  216. public string Subject { get; set; }
  217. public string Content { get; set; }
  218. }
  219. public class CountryAIPormptInfo
  220. {
  221. public string Country { get; set; }
  222. public int Count { get; set; }
  223. }
  224. public class AITaskItem
  225. {
  226. public string Region { get; set; } // 如 "North America"
  227. public string Industry { get; set; } // 如 "Software"
  228. public string Scale { get; set; } // 如 "Large"
  229. }
  230. #region 单位规模信息
  231. /// <summary>
  232. /// 单位规模
  233. /// </summary>
  234. public class OrgScale
  235. {
  236. public string Name { get; init; }
  237. public int MinStaff { get; init; }
  238. public int MaxStaff { get; init; }
  239. public static List<OrgScale> BuildInitialData() => new()
  240. {
  241. new() { Name = "微型 (1-10人)", MinStaff = 1, MaxStaff = 10 },
  242. new() { Name = "小型 (11-50人)", MinStaff = 11, MaxStaff = 50 },
  243. new() { Name = "中型 (51-200人)", MinStaff = 51, MaxStaff = 200 },
  244. new() { Name = "大型 (201-1000人)", MinStaff = 201, MaxStaff = 1000 },
  245. new() { Name = "超大型 (1000人以上)", MinStaff = 1001, MaxStaff = int.MaxValue }
  246. };
  247. /// <summary>
  248. /// 根据人数自动匹配规模标签
  249. /// </summary>
  250. public static string GetLabel(int count) =>
  251. BuildInitialData().FirstOrDefault(s => count >= s.MinStaff && count <= s.MaxStaff)?.Name ?? "未知规模";
  252. }
  253. #endregion
  254. #region AI 行业匹配结果实体
  255. /// <summary>
  256. /// AI 行业匹配结果实体
  257. /// </summary>
  258. public class IndustryMatchResult
  259. {
  260. /// <summary>
  261. /// 原始出访单位名称
  262. /// </summary>
  263. public string SourceUnitName { get; set; } = string.Empty;
  264. /// <summary>
  265. /// 匹配到的目标单位名称(必须与输入 NameCn 一致)
  266. /// </summary>
  267. public string TargetUnitName { get; set; } = string.Empty;
  268. /// <summary>
  269. /// 目标单位所属国家
  270. /// </summary>
  271. public string TargetCountry { get; set; } = string.Empty;
  272. /// <summary>
  273. /// 识别出的行业分类(来自动态传入的行业标准)
  274. /// </summary>
  275. public string MatchedIndustry { get; set; } = string.Empty;
  276. /// <summary>
  277. /// 匹配置信度 (0.0 - 1.0)
  278. /// </summary>
  279. public double ConfidenceScore { get; set; }
  280. /// <summary>
  281. /// AI 给出的匹配理由说明
  282. /// </summary>
  283. public string MatchReason { get; set; } = string.Empty;
  284. // --- 辅助属性 (非 AI 返回内容) ---
  285. /// <summary>
  286. /// 判断是否为高价值匹配(业务逻辑判定)
  287. /// </summary>
  288. [JsonIgnore]
  289. public bool IsHighValue => ConfidenceScore >= 0.8;
  290. }
  291. #endregion
  292. }