平安校园
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

PersonApi.cs 22 KiB

vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 7 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
vor 8 Monaten
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. using MoYu.FriendlyException;
  2. using MoYu.RemoteRequest;
  3. using MoYu.RemoteRequest.Extensions;
  4. using Newtonsoft.Json.Linq;
  5. using SafeCampus.Application.Manager.DeepelephManager;
  6. using SafeCampus.Application.Services.Business.PersonFacesService;
  7. using SafeCampus.Application.Services.Business.PersonInfoService;
  8. using SafeCampus.Web.Core.Controllers.Application.Business.Dto.Person;
  9. namespace SafeCampus.Web.Core.Controllers.Application.Business;
  10. /// <summary>
  11. /// 人员管理接口
  12. /// </summary>
  13. [Route("/business/[controller]")]
  14. [ApiDescriptionSettings(ApiGroupConsts.SYSTEM_Business, Order = 98,Tag = "人员管理")]
  15. public class PersonApi : IDynamicApiController
  16. {
  17. private readonly IDeepelephManager _deepelephManager;
  18. private readonly IPersonInfoService _personInfoService;
  19. private readonly IPersonFacesService _personFacesService;
  20. public PersonApi(IDeepelephManager deepelephManager, IPersonInfoService personInfoService, IPersonFacesService personFacesService)
  21. {
  22. _deepelephManager = deepelephManager;
  23. _personInfoService = personInfoService;
  24. _personFacesService = personFacesService;
  25. }
  26. /// <summary>
  27. /// 新增人员
  28. /// </summary>
  29. /// <param name="info">人员信息</param>
  30. /// <returns></returns>
  31. public async Task<dynamic> CreatePersonA(PersonModel info)
  32. {
  33. info.Faces = info.Faces.Select(x => new Faces {faceId = Guid.NewGuid().ToString("N"),faceUrl = x.faceUrl}).ToList();
  34. var personId = Guid.NewGuid().ToString("N");
  35. var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
  36. var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/create"
  37. .SetBody(new
  38. {
  39. token = _deepelephManager.GetToken(),
  40. tenantCode = appSettings.TenantCode,
  41. poiId = appSettings.PoiId,
  42. personId = personId,
  43. age = info.Age,
  44. name = info.Name,
  45. gender = info.Gender,
  46. phone = info.Phone,
  47. exData = info.ExData,
  48. faces = info.Faces
  49. })
  50. .SetContentType("application/json")
  51. .PostAsAsync<string>();
  52. var model = JsonConvert.DeserializeObject<JObject>(str);
  53. if ((bool)model["success"])
  54. {
  55. var person = new PersonInfoDto
  56. {
  57. PersonId = personId,
  58. Age = info.Age,
  59. Name = info.Name,
  60. Gender = info.Gender,
  61. Phone = info.Phone,
  62. CreateTime = DateTime.Now,
  63. ExtData = info.ExData,
  64. FaceSizeLimit = 60,
  65. QualityScore = 30,
  66. };
  67. if (!string.IsNullOrEmpty(info.PersonSetId))
  68. {
  69. await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/set/bind"
  70. .SetBody(new
  71. {
  72. token = _deepelephManager.GetToken(),
  73. tenantCode = appSettings.TenantCode,
  74. poiId = appSettings.PoiId,
  75. personSetId = info.PersonSetId,
  76. personIds = new List<string> { model["data"].ToString() }
  77. })
  78. .SetContentType("application/json")
  79. .PostAsAsync<string>();
  80. person.PersonSetId=info.PersonSetId;
  81. }
  82. await _personInfoService.Add(person);
  83. await _personFacesService.BatchAdd(info.Faces.Select(x => new PersonFaces
  84. {
  85. FaceId = x.faceId,
  86. FaceUrl = x.faceUrl,
  87. PersonId = personId
  88. }).ToList());
  89. return model["data"];
  90. }
  91. throw Oops.Oh(model["message"].ToString());
  92. }
  93. /// <summary>
  94. /// 人脸图片上传
  95. /// </summary>
  96. /// <param name="input"></param>
  97. /// <returns></returns>
  98. public async Task<dynamic> UploadFile([FromForm] BaseFileInput input)
  99. {
  100. var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
  101. var jsonparam = JsonConvert.SerializeObject(new
  102. {
  103. token = _deepelephManager.GetToken(),
  104. tenantCode = appSettings.TenantCode,
  105. poiId = appSettings.PoiId,
  106. usageScenario = "personSet"
  107. });
  108. var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/common/upload-file"
  109. .SetFiles(HttpFile.Create("file", input.File.OpenReadStream(), input.File.FileName))
  110. .SetBody(new
  111. {
  112. param = jsonparam
  113. })
  114. .SetContentType("multipart/form-data")
  115. .PostAsAsync<string>();
  116. var model = JsonConvert.DeserializeObject<JObject>(str);
  117. if ((bool)model["success"])
  118. {
  119. var strCheck = await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/faceQuality/check"
  120. .SetBody(new
  121. {
  122. token = _deepelephManager.GetToken(),
  123. tenantCode = appSettings.TenantCode,
  124. poiId = appSettings.PoiId,
  125. faceSizeLimit = 60,
  126. qualityScore = 30,
  127. faceUrl = model["data"]["httpUrl"].ToString()
  128. })
  129. .SetContentType("application/json")
  130. .PostAsAsync<string>();
  131. var modelCheck = JsonConvert.DeserializeObject<JObject>(strCheck);
  132. if ((bool)modelCheck["success"])
  133. {
  134. if ((bool)modelCheck["data"]["pass"])
  135. {
  136. return model["data"]["httpUrl"].ToString();
  137. }
  138. throw Oops.Oh(modelCheck["data"]["message"].ToString());
  139. }
  140. else
  141. {
  142. throw Oops.Oh("人脸效验失败!");
  143. }
  144. }
  145. throw Oops.Oh(model["message"].ToString());
  146. }
  147. /// <summary>
  148. /// 删除人员
  149. /// </summary>
  150. /// <param name="personId"></param>
  151. /// <returns></returns>
  152. public async Task<dynamic> DeletePersonD(string id)
  153. {
  154. var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
  155. var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/delete"
  156. .SetBody(new
  157. {
  158. token = _deepelephManager.GetToken(),
  159. tenantCode = appSettings.TenantCode,
  160. poiId = appSettings.PoiId,
  161. personId = id,
  162. })
  163. .SetContentType("application/json")
  164. .PostAsAsync<string>();
  165. var model = JsonConvert.DeserializeObject<JObject>(str);
  166. if ((bool)model["success"])
  167. {
  168. var isOk = model["data"].ToString() == id;
  169. if (isOk)
  170. {
  171. await _personInfoService.Delete(id);
  172. }
  173. return isOk;
  174. }
  175. throw Oops.Oh(model["message"].ToString());
  176. }
  177. /// <summary>
  178. /// 更新人员信息
  179. /// </summary>
  180. /// <param name="info"></param>
  181. /// <returns></returns>
  182. public async Task<dynamic> UpdatePersionU(PersonModel info)
  183. {
  184. var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
  185. var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/createOrOverride"
  186. .SetBody(new
  187. {
  188. token = _deepelephManager.GetToken(),
  189. tenantCode = appSettings.TenantCode,
  190. poiId = appSettings.PoiId,
  191. personId = info.PersonId,
  192. age = info.Age,
  193. name = info.Name,
  194. gender = info.Gender,
  195. phone = info.Phone,
  196. exData = info.ExData,
  197. faces = info.Faces
  198. })
  199. .SetContentType("application/json")
  200. .PostAsAsync<string>();
  201. var model = JsonConvert.DeserializeObject<JObject>(str);
  202. if ((bool)model["success"])
  203. {
  204. var person = new PersonInfoDto
  205. {
  206. PersonId = info.PersonId,
  207. Age = info.Age,
  208. Name = info.Name,
  209. Gender = info.Gender,
  210. Phone = info.Phone,
  211. CreateTime = DateTime.Now,
  212. ExtData = info.ExData,
  213. FaceSizeLimit = 60,
  214. QualityScore = 30,
  215. };
  216. if (!string.IsNullOrEmpty(info.PersonSetId))
  217. {
  218. person.PersonSetId = info.PersonSetId;
  219. var perInfo = await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/query"
  220. .SetBody(new
  221. {
  222. token = _deepelephManager.GetToken(),
  223. tenantCode = appSettings.TenantCode,
  224. poiId = appSettings.PoiId,
  225. personId = info.PersonId,
  226. })
  227. .SetContentType("application/json")
  228. .PostAsAsync<string>();
  229. var permodel = JsonConvert.DeserializeObject<JObject>(perInfo);
  230. if ((bool)permodel["success"])
  231. {
  232. if (permodel["data"]["personSets"].Count() > 0)
  233. {
  234. var old = permodel["data"]["personSets"][0]["personSetId"].ToString();
  235. if (old != info.PersonSetId)
  236. {
  237. //解绑旧班级
  238. await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/set/unbind"
  239. .SetBody(new
  240. {
  241. token = _deepelephManager.GetToken(),
  242. tenantCode = appSettings.TenantCode,
  243. poiId = appSettings.PoiId,
  244. personId = info.PersonId,
  245. personSetId = old,
  246. })
  247. .SetContentType("application/json")
  248. .PostAsAsync<string>();
  249. //绑定新班级
  250. await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/set/bind"
  251. .SetBody(new
  252. {
  253. token = _deepelephManager.GetToken(),
  254. tenantCode = appSettings.TenantCode,
  255. poiId = appSettings.PoiId,
  256. personSetId = info.PersonSetId,
  257. personIds = new List<string> { info.PersonId }
  258. })
  259. .SetContentType("application/json")
  260. .PostAsAsync<string>();
  261. }
  262. }
  263. else
  264. {
  265. //绑定新班级
  266. await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/set/bind"
  267. .SetBody(new
  268. {
  269. token = _deepelephManager.GetToken(),
  270. tenantCode = appSettings.TenantCode,
  271. poiId = appSettings.PoiId,
  272. personSetId = info.PersonSetId,
  273. personIds = new List<string> { model["data"].ToString() }
  274. })
  275. .SetContentType("application/json")
  276. .PostAsAsync<string>();
  277. }
  278. }
  279. }
  280. await _personInfoService.Update(person);
  281. await _personFacesService.BatchAdd(info.Faces.Select(x => new PersonFaces
  282. {
  283. FaceId = x.faceId,
  284. FaceUrl = x.faceUrl,
  285. PersonId = info.PersonId
  286. }).ToList());
  287. return model["data"];
  288. }
  289. throw Oops.Oh(model["message"].ToString());
  290. }
  291. /// <summary>
  292. /// 分页查询人员信息
  293. /// </summary>
  294. /// <param name="search">查询条件</param>
  295. /// <returns></returns>
  296. public async Task<dynamic> PageQuery(PersonInfoSearch search)
  297. {
  298. return await _personInfoService.GetPageList(search);
  299. var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
  300. var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/pageQuery"
  301. .SetBody(new
  302. {
  303. token = _deepelephManager.GetToken(),
  304. tenantCode = appSettings.TenantCode,
  305. poiId = appSettings.PoiId,
  306. personSetId = search.PersonSetId,
  307. //personId = search.PersonId,
  308. personName = search.PersonName,
  309. pageIndex = search.PageNum,
  310. pageSize = search.PageSize,
  311. })
  312. .SetContentType("application/json")
  313. .PostAsAsync<string>();
  314. var model = JsonConvert.DeserializeObject<JObject>(str);
  315. if (!(bool)model["success"]) throw Oops.Oh(model["message"].ToString());
  316. if (model["data"] != null)
  317. {
  318. return new
  319. {
  320. pageNum = search.PageNum,
  321. pageSize = model["pageSize"],
  322. total = model["totalCount"],
  323. pages = model["pageIndex"],
  324. list = model["data"]
  325. };
  326. }
  327. return new
  328. {
  329. pageNum = search.PageNum,
  330. pageSize = 0,
  331. total = 0,
  332. pages = 0,
  333. list = new List<string>()
  334. };
  335. }
  336. /// <summary>
  337. /// 查看人员详情
  338. /// </summary>
  339. /// <param name="personId">人员id</param>
  340. /// <returns></returns>
  341. public async Task<dynamic> GetPersionById(ControllersIdInput input)
  342. {
  343. return await _personInfoService.GetInfo(input.Id);
  344. var appSettings = App.GetOptionsMonitor < AppInfoOptions>();
  345. var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/query"
  346. .SetBody(new
  347. {
  348. token = _deepelephManager.GetToken(),
  349. tenantCode = appSettings.TenantCode,
  350. poiId = appSettings.PoiId,
  351. personId = input.Id,
  352. })
  353. .SetContentType("application/json")
  354. .PostAsAsync<string>();
  355. var model = JsonConvert.DeserializeObject<JObject>(str);
  356. if ((bool)model["success"])
  357. {
  358. if (model["data"]["personSets"].Count() > 0)
  359. {
  360. model["data"]["personSetId"] = model["data"]["personSets"][0]["personSetId"];
  361. model["data"]["personSetName"] = model["data"]["personSets"][0]["personSetName"];
  362. }
  363. else
  364. {
  365. model["data"]["personSetId"] = null;
  366. model["data"]["personSetName"] = null;
  367. }
  368. return model["data"];
  369. }
  370. throw Oops.Oh(model["message"].ToString());
  371. }
  372. /// <summary>
  373. /// 添加人脸
  374. /// </summary>
  375. /// <param name="info">人脸信息</param>
  376. /// <returns></returns>
  377. public async Task<dynamic> AddFaceA(PersonFaceInfo info)
  378. {
  379. var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
  380. var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/addFace"
  381. .SetBody(new
  382. {
  383. token = _deepelephManager.GetToken(),
  384. tenantCode = appSettings.TenantCode,
  385. poiId = appSettings.PoiId,
  386. personId = info.PersonId,
  387. info.faceSizeLimit,
  388. info.qualityScore,
  389. faces = new List<Faces>
  390. {
  391. new Faces
  392. {
  393. faceUrl = info.faceUrl,
  394. faceId=Guid.NewGuid().ToString("N"),
  395. }
  396. }
  397. })
  398. .SetContentType("application/json")
  399. .PostAsAsync<string>();
  400. var model = JsonConvert.DeserializeObject<JObject>(str);
  401. if ((bool)model["success"])
  402. {
  403. var faceModel = new PersonFaces { PersonId = info.PersonId, FaceId = Guid.NewGuid().ToString("N"), FaceUrl = info.faceUrl };
  404. await _personFacesService.Add(faceModel);
  405. return true;
  406. }
  407. throw Oops.Oh(model["message"].ToString());
  408. }
  409. /// <summary>
  410. /// 删除人脸
  411. /// </summary>
  412. /// <param name="info">删除信息</param>
  413. /// <returns></returns>
  414. [HttpPost]
  415. public async Task<dynamic> DeleteFaceD(PersonFaceDel info)
  416. {
  417. var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
  418. var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/removeFace"
  419. .SetBody(new
  420. {
  421. token = _deepelephManager.GetToken(),
  422. tenantCode = appSettings.TenantCode,
  423. poiId = appSettings.PoiId,
  424. info.personId,
  425. info.faceIds
  426. })
  427. .SetContentType("application/json")
  428. .PostAsAsync<string>();
  429. var model = JsonConvert.DeserializeObject<JObject>(str);
  430. if ((bool)model["success"])
  431. {
  432. await _personFacesService.Delete(info.personId, info.faceIds);
  433. return true;
  434. }
  435. throw Oops.Oh(model["message"].ToString());
  436. }
  437. /// <summary>
  438. /// 人员和底库绑定
  439. /// </summary>
  440. /// <param name="info"></param>
  441. /// <returns></returns>
  442. public async Task<dynamic> PersonBindDfie(PersonDfieDfie info)
  443. {
  444. var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
  445. var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/set/bind"
  446. .SetBody(new
  447. {
  448. token = _deepelephManager.GetToken(),
  449. tenantCode = appSettings.TenantCode,
  450. poiId = appSettings.PoiId,
  451. personSetId = info.PersonSetId,
  452. personIds = info.PersonIds
  453. })
  454. .SetContentType("application/json")
  455. .PostAsAsync<string>();
  456. var model = JsonConvert.DeserializeObject<JObject>(str);
  457. if ((bool)model["success"])
  458. {
  459. await _personInfoService.UpdateSet(info.PersonIds, info.PersonSetId);
  460. return true;
  461. }
  462. throw Oops.Oh(model["message"].ToString());
  463. }
  464. /// <summary>
  465. /// 人员与底库解绑
  466. /// </summary>
  467. /// <returns></returns>
  468. public async Task<dynamic> PersonUnBindDfie(PersonUnBindDfieInput input)
  469. {
  470. var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
  471. var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/set/unbind"
  472. .SetBody(new
  473. {
  474. token = _deepelephManager.GetToken(),
  475. tenantCode = appSettings.TenantCode,
  476. poiId = appSettings.PoiId,
  477. personId = input.PersonId,
  478. personSetId = input.PersonSetId,
  479. })
  480. .SetContentType("application/json")
  481. .PostAsAsync<string>();
  482. var model = JsonConvert.DeserializeObject<JObject>(str);
  483. if ((bool)model["success"])
  484. {
  485. await _personInfoService.UpdateSet(new List<string>{ input.PersonId}, null);
  486. return true;
  487. }
  488. throw Oops.Oh(model["message"].ToString());
  489. }
  490. /// <summary>
  491. /// 人员数据同步
  492. /// </summary>
  493. /// <returns></returns>
  494. public async Task<bool> SyncData()
  495. {
  496. var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
  497. var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/pageQuery"
  498. .SetBody(new
  499. {
  500. token = _deepelephManager.GetToken(),
  501. tenantCode = appSettings.TenantCode,
  502. poiId = appSettings.PoiId,
  503. pageIndex =1,
  504. pageSize = 1000,
  505. })
  506. .SetContentType("application/json")
  507. .PostAsAsync<string>();
  508. var model = JsonConvert.DeserializeObject<JObject>(str);
  509. if (!(bool)model["success"]) throw Oops.Oh(model["message"].ToString());
  510. if (model["data"] != null)
  511. {
  512. foreach (var item in model["data"])
  513. {
  514. var personModel = new PersonInfoDto
  515. {
  516. PersonId = item["personId"]?.ToString(),
  517. Age = (int)item["age"],
  518. Name = item["name"]?.ToString(),
  519. Gender = item["gender"]?.ToString(),
  520. Phone = item["phone"]?.ToString(),
  521. CreateTime = DateTime.Now,
  522. ExtData = item["extData"]?.ToString(),
  523. FaceSizeLimit = 60,
  524. QualityScore = 30,
  525. PersonSetId = item["personSets"]?[0]?["personSetId"]?.ToString()
  526. };
  527. if (item["faces"]?.Count()>0)
  528. {
  529. var list = new List<PersonFaces>();
  530. foreach (var faceItem in item["faces"])
  531. {
  532. var face = new PersonFaces
  533. {
  534. FaceId = faceItem["faceId"]?.ToString(),
  535. FaceUrl = faceItem["faceUrl"]?.ToString(),
  536. PersonId = item["personId"]?.ToString(),
  537. Tag = faceItem["tag"]?.ToString(),
  538. };
  539. var signImg = Path.Combine(Directory.GetCurrentDirectory(), "Files", App.Configuration["AppInfo:PersonImg"], face.FaceId + ".jpg");
  540. await face.FaceUrl.GetToSaveAsync(signImg);
  541. face.FaceUrl = $"/Files/{App.Configuration["AppInfo:PersonImg"]}/{face.FaceId}.jpg";
  542. list.Add(face);
  543. }
  544. await _personFacesService.BatchAdd(list);
  545. }
  546. var oldmodel = await _personInfoService.GetInfo(personModel.PersonId);
  547. if (oldmodel==null)
  548. {
  549. await _personInfoService.Add(personModel);
  550. }
  551. }
  552. }
  553. return true;
  554. }
  555. }