CustomSyncData.cs 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  1. using System.Threading.Tasks;
  2. using ZhonTai.Admin.Domain.DictType;
  3. using ZhonTai.Admin.Domain.Dict;
  4. using ZhonTai.Admin.Domain.Api;
  5. using ZhonTai.Admin.Domain.Permission;
  6. using ZhonTai.Admin.Domain.User;
  7. using ZhonTai.Admin.Domain.Role;
  8. using ZhonTai.Admin.Domain.UserRole;
  9. using ZhonTai.Admin.Domain.RolePermission;
  10. using ZhonTai.Admin.Domain.Tenant;
  11. using ZhonTai.Admin.Domain.TenantPermission;
  12. using ZhonTai.Admin.Domain.PermissionApi;
  13. using ZhonTai.Admin.Domain.View;
  14. using ZhonTai.Admin.Core.Configs;
  15. using ZhonTai.Admin.Domain.Org;
  16. using ZhonTai.Admin.Domain.UserStaff;
  17. using ZhonTai.Admin.Core.Db.Data;
  18. using ZhonTai.Admin.Domain.UserOrg;
  19. using System.Linq;
  20. using ZhonTai.Common.Extensions;
  21. using System;
  22. using FreeSql;
  23. using Mapster;
  24. using System.Collections.Generic;
  25. namespace ZhonTai.Admin.Repositories;
  26. /// <summary>
  27. /// 同步数据
  28. /// </summary>
  29. public class CustomSyncData : SyncData, ISyncData
  30. {
  31. /// <summary>
  32. /// 初始化字典类型
  33. /// </summary>
  34. /// <param name="db"></param>
  35. /// <param name="unitOfWork"></param>
  36. /// <param name="dbConfig"></param>
  37. /// <returns></returns>
  38. private async Task InitDictTypeAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig)
  39. {
  40. var tableName = GetTableName<DictTypeEntity>();
  41. try
  42. {
  43. if (!IsSyncData(tableName, dbConfig))
  44. {
  45. return;
  46. }
  47. var rep = db.GetRepository<DictTypeEntity>();
  48. rep.UnitOfWork = unitOfWork;
  49. //数据列表
  50. var sourceDataList = GetData<DictTypeEntity>(path: dbConfig.SyncDataPath);
  51. if (!(sourceDataList?.Length > 0))
  52. {
  53. Console.WriteLine($"table: {tableName} import data []");
  54. return;
  55. }
  56. //查询
  57. var sourceDataIds = sourceDataList.Select(e => e.Id).ToList();
  58. var dataList = await rep.Where(a => sourceDataIds.Contains(a.Id)).ToListAsync();
  59. //新增
  60. var dataIds = dataList.Select(a => a.Id).ToList();
  61. var insertDataList = sourceDataList.Where(a => !dataIds.Contains(a.Id));
  62. if (insertDataList.Any())
  63. {
  64. await rep.InsertAsync(insertDataList);
  65. }
  66. //修改
  67. if (dbConfig.SysUpdateData)
  68. {
  69. var updateDataList = dataList.Where(a => sourceDataIds.Contains(a.Id));
  70. if (updateDataList.Any())
  71. {
  72. foreach (var data in updateDataList)
  73. {
  74. var sourceData = sourceDataList.Where(a => a.Id == data.Id).First();
  75. sourceData.Adapt(data);
  76. }
  77. await rep.UpdateAsync(updateDataList);
  78. }
  79. }
  80. Console.WriteLine($"table: {tableName} sync data succeed");
  81. }
  82. catch (Exception ex)
  83. {
  84. var msg = $"table: {tableName} sync data failed.\n{ex.Message}";
  85. Console.WriteLine(msg);
  86. throw new Exception(msg);
  87. }
  88. }
  89. /// <summary>
  90. /// 初始化字典
  91. /// </summary>
  92. /// <param name="db"></param>
  93. /// <param name="unitOfWork"></param>
  94. /// <param name="dbConfig"></param>
  95. /// <returns></returns>
  96. private async Task InitDictAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig)
  97. {
  98. var tableName = GetTableName<DictEntity>();
  99. try
  100. {
  101. if (!IsSyncData(tableName, dbConfig))
  102. {
  103. return;
  104. }
  105. var rep = db.GetRepository<DictEntity>();
  106. rep.UnitOfWork = unitOfWork;
  107. //数据列表
  108. var sourceDataList = GetData<DictEntity>(path: dbConfig.SyncDataPath);
  109. if (!(sourceDataList?.Length > 0))
  110. {
  111. Console.WriteLine($"table: {tableName} import data []");
  112. return;
  113. }
  114. //查询
  115. var sourceDataIds = sourceDataList.Select(e => e.Id).ToList();
  116. var dataList = await rep.Where(a => sourceDataIds.Contains(a.Id)).ToListAsync();
  117. //新增
  118. var dataIds = dataList.Select(a => a.Id).ToList();
  119. var insertDataList = sourceDataList.Where(a => !dataIds.Contains(a.Id));
  120. if (insertDataList.Any())
  121. {
  122. await rep.InsertAsync(insertDataList);
  123. }
  124. //修改
  125. if (dbConfig.SysUpdateData)
  126. {
  127. var updateDataList = dataList.Where(a => sourceDataIds.Contains(a.Id));
  128. if (updateDataList.Any())
  129. {
  130. foreach (var data in updateDataList)
  131. {
  132. var sourceData = sourceDataList.Where(a => a.Id == data.Id).First();
  133. sourceData.Adapt(data);
  134. }
  135. await rep.UpdateAsync(updateDataList);
  136. }
  137. }
  138. Console.WriteLine($"table: {tableName} sync data succeed");
  139. }
  140. catch (Exception ex)
  141. {
  142. var msg = $"table: {tableName} sync data failed.\n{ex.Message}";
  143. Console.WriteLine(msg);
  144. throw new Exception(msg);
  145. }
  146. }
  147. /// <summary>
  148. /// 初始化用户
  149. /// </summary>
  150. /// <param name="db"></param>
  151. /// <param name="unitOfWork"></param>
  152. /// <param name="dbConfig"></param>
  153. /// <param name="isTenant"></param>
  154. /// <returns></returns>
  155. private async Task InitUserAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig, bool isTenant)
  156. {
  157. var tableName = GetTableName<UserEntity>();
  158. try
  159. {
  160. if (!IsSyncData(tableName, dbConfig))
  161. {
  162. return;
  163. }
  164. var rep = db.GetRepository<UserEntity>();
  165. rep.UnitOfWork = unitOfWork;
  166. //数据列表
  167. var sourceDataList = GetData<UserEntity>(isTenant, dbConfig.SyncDataPath);
  168. if (!(sourceDataList?.Length > 0))
  169. {
  170. Console.WriteLine($"table: {tableName} import data []");
  171. return;
  172. }
  173. //查询
  174. var sourceDataIds = sourceDataList.Select(e => e.Id).ToList();
  175. var dataList = await rep.Where(a => sourceDataIds.Contains(a.Id)).ToListAsync();
  176. //新增
  177. var dataIds = dataList.Select(a => a.Id).ToList();
  178. var insertDataList = sourceDataList.Where(a => !dataIds.Contains(a.Id));
  179. if (insertDataList.Any())
  180. {
  181. await rep.InsertAsync(insertDataList);
  182. }
  183. //修改
  184. if (dbConfig.SysUpdateData)
  185. {
  186. var updateDataList = dataList.Where(a => sourceDataIds.Contains(a.Id));
  187. if (updateDataList.Any())
  188. {
  189. foreach (var data in updateDataList)
  190. {
  191. var sourceData = sourceDataList.Where(a => a.Id == data.Id).First();
  192. sourceData.Adapt(data);
  193. }
  194. await rep.UpdateAsync(updateDataList);
  195. }
  196. }
  197. Console.WriteLine($"table: {tableName} sync data succeed");
  198. }
  199. catch (Exception ex)
  200. {
  201. var msg = $"table: {tableName} sync data failed.\n{ex.Message}";
  202. Console.WriteLine(msg);
  203. throw new Exception(msg);
  204. }
  205. }
  206. /// <summary>
  207. /// 初始化用户员工
  208. /// </summary>
  209. /// <param name="db"></param>
  210. /// <param name="unitOfWork"></param>
  211. /// <param name="dbConfig"></param>
  212. /// <param name="isTenant"></param>
  213. /// <returns></returns>
  214. private async Task InitUserStaffAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig, bool isTenant)
  215. {
  216. var tableName = GetTableName<UserStaffEntity>();
  217. try
  218. {
  219. if (!IsSyncData(tableName, dbConfig))
  220. {
  221. return;
  222. }
  223. var rep = db.GetRepository<UserStaffEntity>();
  224. rep.UnitOfWork = unitOfWork;
  225. //数据列表
  226. var sourceDataList = GetData<UserStaffEntity>(isTenant, dbConfig.SyncDataPath);
  227. if (!(sourceDataList?.Length > 0))
  228. {
  229. Console.WriteLine($"table: {tableName} import data []");
  230. return;
  231. }
  232. //查询
  233. var sourceDataIds = sourceDataList.Select(e => e.Id).ToList();
  234. var dataList = await rep.Where(a => sourceDataIds.Contains(a.Id)).ToListAsync();
  235. //新增
  236. var dataIds = dataList.Select(a => a.Id).ToList();
  237. var insertDataList = sourceDataList.Where(a => !dataIds.Contains(a.Id));
  238. if (insertDataList.Any())
  239. {
  240. await rep.InsertAsync(insertDataList);
  241. }
  242. //修改
  243. if (dbConfig.SysUpdateData)
  244. {
  245. var updateDataList = dataList.Where(a => sourceDataIds.Contains(a.Id));
  246. if (updateDataList.Any())
  247. {
  248. foreach (var data in updateDataList)
  249. {
  250. var sourceData = sourceDataList.Where(a => a.Id == data.Id).First();
  251. sourceData.Adapt(data);
  252. }
  253. await rep.UpdateAsync(updateDataList);
  254. }
  255. }
  256. Console.WriteLine($"table: {tableName} sync data succeed");
  257. }
  258. catch (Exception ex)
  259. {
  260. var msg = $"table: {tableName} sync data failed.\n{ex.Message}";
  261. Console.WriteLine(msg);
  262. throw new Exception(msg);
  263. }
  264. }
  265. /// <summary>
  266. /// 初始化部门
  267. /// </summary>
  268. /// <param name="db"></param>
  269. /// <param name="unitOfWork"></param>
  270. /// <param name="dbConfig"></param>
  271. /// <param name="isTenant"></param>
  272. /// <returns></returns>
  273. private async Task InitOrgAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig, bool isTenant)
  274. {
  275. var tableName = GetTableName<OrgEntity>();
  276. try
  277. {
  278. if (!IsSyncData(tableName, dbConfig))
  279. {
  280. return;
  281. }
  282. var rep = db.GetRepository<OrgEntity>();
  283. rep.UnitOfWork = unitOfWork;
  284. //数据列表
  285. var dataTree = GetData<OrgEntity>(isTenant, dbConfig.SyncDataPath);
  286. var sourceDataList = dataTree.ToList().ToPlainList((a) => a.Childs).ToArray();
  287. if (!(sourceDataList?.Length > 0))
  288. {
  289. Console.WriteLine($"table: {tableName} import data []");
  290. return;
  291. }
  292. //查询
  293. var sourceDataIds = sourceDataList.Select(e => e.Id).ToList();
  294. var dataList = await rep.Where(a => sourceDataIds.Contains(a.Id)).ToListAsync();
  295. //新增
  296. var dataIds = dataList.Select(a => a.Id).ToList();
  297. var insertDataList = sourceDataList.Where(a => !dataIds.Contains(a.Id));
  298. if (insertDataList.Any())
  299. {
  300. await rep.InsertAsync(insertDataList);
  301. }
  302. //修改
  303. if (dbConfig.SysUpdateData)
  304. {
  305. var updateDataList = dataList.Where(a => sourceDataIds.Contains(a.Id));
  306. if (updateDataList.Any())
  307. {
  308. foreach (var data in updateDataList)
  309. {
  310. var sourceData = sourceDataList.Where(a => a.Id == data.Id).First();
  311. sourceData.Adapt(data);
  312. }
  313. await rep.UpdateAsync(updateDataList);
  314. }
  315. }
  316. Console.WriteLine($"table: {tableName} sync data succeed");
  317. }
  318. catch (Exception ex)
  319. {
  320. var msg = $"table: {tableName} sync data failed.\n{ex.Message}";
  321. Console.WriteLine(msg);
  322. throw new Exception(msg);
  323. }
  324. }
  325. /// <summary>
  326. /// 初始化角色
  327. /// </summary>
  328. /// <param name="db"></param>
  329. /// <param name="unitOfWork"></param>
  330. /// <param name="dbConfig"></param>
  331. /// <param name="isTenant"></param>
  332. /// <returns></returns>
  333. private async Task InitRoleAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig, bool isTenant)
  334. {
  335. var tableName = GetTableName<RoleEntity>();
  336. try
  337. {
  338. if (!IsSyncData(tableName, dbConfig))
  339. {
  340. return;
  341. }
  342. var rep = db.GetRepository<RoleEntity>();
  343. rep.UnitOfWork = unitOfWork;
  344. //数据列表
  345. var sourceDataList = GetData<RoleEntity>(isTenant, dbConfig.SyncDataPath);
  346. if (!(sourceDataList?.Length > 0))
  347. {
  348. Console.WriteLine($"table: {tableName} import data []");
  349. return;
  350. }
  351. //查询
  352. var sourceDataIds = sourceDataList.Select(e => e.Id).ToList();
  353. var dataList = await rep.Where(a => sourceDataIds.Contains(a.Id)).ToListAsync();
  354. //新增
  355. var dataIds = dataList.Select(a => a.Id).ToList();
  356. var insertDataList = sourceDataList.Where(a => !dataIds.Contains(a.Id));
  357. if (insertDataList.Any())
  358. {
  359. await rep.InsertAsync(insertDataList);
  360. }
  361. //修改
  362. if (dbConfig.SysUpdateData)
  363. {
  364. var updateDataList = dataList.Where(a => sourceDataIds.Contains(a.Id));
  365. if (updateDataList.Any())
  366. {
  367. foreach (var data in updateDataList)
  368. {
  369. var sourceData = sourceDataList.Where(a => a.Id == data.Id).First();
  370. sourceData.Adapt(data);
  371. }
  372. await rep.UpdateAsync(updateDataList);
  373. }
  374. }
  375. Console.WriteLine($"table: {tableName} sync data succeed");
  376. }
  377. catch (Exception ex)
  378. {
  379. var msg = $"table: {tableName} sync data failed.\n{ex.Message}";
  380. Console.WriteLine(msg);
  381. throw new Exception(msg);
  382. }
  383. }
  384. /// <summary>
  385. /// 初始化接口
  386. /// </summary>
  387. /// <param name="db"></param>
  388. /// <param name="unitOfWork"></param>
  389. /// <param name="dbConfig"></param>
  390. /// <returns></returns>
  391. private async Task InitApiAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig)
  392. {
  393. var tableName = GetTableName<ApiEntity>();
  394. try
  395. {
  396. if (!IsSyncData(tableName, dbConfig))
  397. {
  398. return;
  399. }
  400. var rep = db.GetRepository<ApiEntity>();
  401. rep.UnitOfWork = unitOfWork;
  402. //数据列表
  403. var dataTree = GetData<ApiEntity>(path: dbConfig.SyncDataPath);
  404. var sourceDataList = dataTree.ToList().ToPlainList((a) => a.Childs).ToArray();
  405. if (!(sourceDataList?.Length > 0))
  406. {
  407. Console.WriteLine($"table: {tableName} import data []");
  408. return;
  409. }
  410. //查询
  411. var sourceDataIds = sourceDataList.Select(e => e.Id).ToList();
  412. var dataList = await rep.Where(a => sourceDataIds.Contains(a.Id)).ToListAsync();
  413. //新增
  414. var dataIds = dataList.Select(a => a.Id).ToList();
  415. var insertDataList = sourceDataList.Where(a => !dataIds.Contains(a.Id));
  416. if (insertDataList.Any())
  417. {
  418. await rep.InsertAsync(insertDataList);
  419. }
  420. //修改
  421. if (dbConfig.SysUpdateData)
  422. {
  423. var updateDataList = dataList.Where(a => sourceDataIds.Contains(a.Id));
  424. if (updateDataList.Any())
  425. {
  426. foreach (var data in updateDataList)
  427. {
  428. var sourceData = sourceDataList.Where(a => a.Id == data.Id).First();
  429. sourceData.Adapt(data);
  430. }
  431. await rep.UpdateAsync(updateDataList);
  432. }
  433. }
  434. Console.WriteLine($"table: {tableName} sync data succeed");
  435. }
  436. catch (Exception ex)
  437. {
  438. var msg = $"table: {tableName} sync data failed.\n{ex.Message}";
  439. Console.WriteLine(msg);
  440. throw new Exception(msg);
  441. }
  442. }
  443. /// <summary>
  444. /// 初始化视图
  445. /// </summary>
  446. /// <param name="db"></param>
  447. /// <param name="unitOfWork"></param>
  448. /// <param name="dbConfig"></param>
  449. /// <returns></returns>
  450. private async Task InitViewAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig)
  451. {
  452. var tableName = GetTableName<ViewEntity>();
  453. try
  454. {
  455. if (!IsSyncData(tableName, dbConfig))
  456. {
  457. return;
  458. }
  459. var rep = db.GetRepository<ViewEntity>();
  460. rep.UnitOfWork = unitOfWork;
  461. //数据列表
  462. var dataTree = GetData<ViewEntity>(path: dbConfig.SyncDataPath);
  463. var sourceDataList = dataTree.ToList().ToPlainList((a) => a.Childs).ToArray();
  464. if (!(sourceDataList?.Length > 0))
  465. {
  466. Console.WriteLine($"table: {tableName} import data []");
  467. return;
  468. }
  469. //查询
  470. var sourceDataIds = sourceDataList.Select(e => e.Id).ToList();
  471. var dataList = await rep.Where(a => sourceDataIds.Contains(a.Id)).ToListAsync();
  472. //新增
  473. var dataIds = dataList.Select(a => a.Id).ToList();
  474. var insertDataList = sourceDataList.Where(a => !dataIds.Contains(a.Id));
  475. if (insertDataList.Any())
  476. {
  477. await rep.InsertAsync(insertDataList);
  478. }
  479. //修改
  480. if (dbConfig.SysUpdateData)
  481. {
  482. var updateDataList = dataList.Where(a => sourceDataIds.Contains(a.Id));
  483. if (updateDataList.Any())
  484. {
  485. foreach (var data in updateDataList)
  486. {
  487. var sourceData = sourceDataList.Where(a => a.Id == data.Id).First();
  488. sourceData.Adapt(data);
  489. }
  490. await rep.UpdateAsync(updateDataList);
  491. }
  492. }
  493. Console.WriteLine($"table: {tableName} sync data succeed");
  494. }
  495. catch (Exception ex)
  496. {
  497. var msg = $"table: {tableName} sync data failed.\n{ex.Message}";
  498. Console.WriteLine(msg);
  499. throw new Exception(msg);
  500. }
  501. }
  502. /// <summary>
  503. /// 初始化权限
  504. /// </summary>
  505. /// <param name="db"></param>
  506. /// <param name="unitOfWork"></param>
  507. /// <param name="dbConfig"></param>
  508. /// <returns></returns>
  509. private async Task InitPermissionAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig)
  510. {
  511. var tableName = GetTableName<PermissionEntity>();
  512. try
  513. {
  514. if (!IsSyncData(tableName, dbConfig))
  515. {
  516. return;
  517. }
  518. var rep = db.GetRepository<PermissionEntity>();
  519. rep.UnitOfWork = unitOfWork;
  520. //数据列表
  521. var dataTree = GetData<PermissionEntity>(path: dbConfig.SyncDataPath);
  522. var sourceDataList = dataTree.ToList().ToPlainList((a) => a.Childs).ToArray();
  523. if (!(sourceDataList?.Length > 0))
  524. {
  525. Console.WriteLine($"table: {tableName} import data []");
  526. return;
  527. }
  528. //查询
  529. var sourceDataIds = sourceDataList.Select(e => e.Id).ToList();
  530. var dataList = await rep.Where(a => sourceDataIds.Contains(a.Id)).ToListAsync();
  531. //新增
  532. var dataIds = dataList.Select(a => a.Id).ToList();
  533. var insertDataList = sourceDataList.Where(a => !dataIds.Contains(a.Id));
  534. if (insertDataList.Any())
  535. {
  536. await rep.InsertAsync(insertDataList);
  537. }
  538. //修改
  539. if (dbConfig.SysUpdateData)
  540. {
  541. var updateDataList = dataList.Where(a => sourceDataIds.Contains(a.Id));
  542. if (updateDataList.Any())
  543. {
  544. foreach (var data in updateDataList)
  545. {
  546. var sourceData = sourceDataList.Where(a => a.Id == data.Id).First();
  547. sourceData.Adapt(data);
  548. }
  549. await rep.UpdateAsync(updateDataList);
  550. }
  551. }
  552. Console.WriteLine($"table: {tableName} sync data succeed");
  553. }
  554. catch (Exception ex)
  555. {
  556. var msg = $"table: {tableName} sync data failed.\n{ex.Message}";
  557. Console.WriteLine(msg);
  558. throw new Exception(msg);
  559. }
  560. }
  561. /// <summary>
  562. /// 初始化权限接口
  563. /// </summary>
  564. /// <param name="db"></param>
  565. /// <param name="unitOfWork"></param>
  566. /// <param name="dbConfig"></param>
  567. /// <returns></returns>
  568. private async Task InitPermissionApiAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig)
  569. {
  570. var tableName = GetTableName<PermissionApiEntity>();
  571. try
  572. {
  573. if (!IsSyncData(tableName, dbConfig))
  574. {
  575. return;
  576. }
  577. var rep = db.GetRepository<PermissionApiEntity>();
  578. rep.UnitOfWork = unitOfWork;
  579. //数据列表
  580. var sourceDataList = GetData<PermissionApiEntity>(path: dbConfig.SyncDataPath);
  581. if (!(sourceDataList?.Length > 0))
  582. {
  583. Console.WriteLine($"table: {tableName} import data []");
  584. return;
  585. }
  586. //查询
  587. var dataList = await rep.Where(a => rep.Select.WithMemory(sourceDataList).Where(b => b.PermissionId == a.PermissionId && b.ApiId == a.ApiId).Any()).ToListAsync();
  588. //新增
  589. var insertDataList = sourceDataList.Where(a => !(dataList.Where(b => a.PermissionId == b.PermissionId && a.ApiId == b.ApiId).Any())).ToList();
  590. if (insertDataList.Any())
  591. {
  592. await rep.InsertAsync(insertDataList);
  593. }
  594. Console.WriteLine($"table: {tableName} sync data succeed");
  595. }
  596. catch (Exception ex)
  597. {
  598. var msg = $"table: {tableName} sync data failed.\n{ex.Message}";
  599. Console.WriteLine(msg);
  600. throw new Exception(msg);
  601. }
  602. }
  603. /// <summary>
  604. /// 用户角色记录
  605. /// </summary>
  606. /// <param name="UserId"></param>
  607. /// <param name="RoleId"></param>
  608. record UserRoleRecord(long UserId, long RoleId);
  609. /// <summary>
  610. /// 初始化用户角色
  611. /// </summary>
  612. /// <param name="db"></param>
  613. /// <param name="unitOfWork"></param>
  614. /// <param name="dbConfig"></param>
  615. /// <returns></returns>
  616. private async Task InitUserRoleAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig)
  617. {
  618. var tableName = GetTableName<UserRoleEntity>();
  619. try
  620. {
  621. if (!IsSyncData(tableName, dbConfig))
  622. {
  623. return;
  624. }
  625. var rep = db.GetRepository<UserRoleEntity>();
  626. rep.UnitOfWork = unitOfWork;
  627. //数据列表
  628. var sourceDataList = GetData<UserRoleEntity>(path: dbConfig.SyncDataPath);
  629. if (!(sourceDataList?.Length > 0))
  630. {
  631. Console.WriteLine($"table: {tableName} import data []");
  632. return;
  633. }
  634. //查询
  635. var userRoleRecordList = sourceDataList.Adapt<List<UserRoleRecord>>();
  636. var dataList = await rep.Where(a => rep.Orm.Select<UserRoleRecord>().WithMemory(userRoleRecordList).Where(b => b.UserId == a.UserId && b.RoleId == a.RoleId).Any()).ToListAsync();
  637. //新增
  638. var insertDataList = sourceDataList.Where(a => !(dataList.Where(b => a.UserId == b.UserId && a.RoleId == b.RoleId).Any())).ToList();
  639. if (insertDataList.Any())
  640. {
  641. await rep.InsertAsync(insertDataList);
  642. }
  643. Console.WriteLine($"table: {tableName} sync data succeed");
  644. }
  645. catch (Exception ex)
  646. {
  647. var msg = $"table: {tableName} sync data failed.\n{ex.Message}";
  648. Console.WriteLine(msg);
  649. throw new Exception(msg);
  650. }
  651. }
  652. /// <summary>
  653. /// 用户部门记录
  654. /// </summary>
  655. /// <param name="UserId"></param>
  656. /// <param name="OrgId"></param>
  657. record UserOrgRecord(long UserId, long OrgId);
  658. /// <summary>
  659. /// 初始化用户部门
  660. /// </summary>
  661. /// <param name="db"></param>
  662. /// <param name="unitOfWork"></param>
  663. /// <param name="dbConfig"></param>
  664. /// <returns></returns>
  665. private async Task InitUserOrgAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig)
  666. {
  667. var tableName = GetTableName<UserOrgEntity>();
  668. try
  669. {
  670. if (!IsSyncData(tableName, dbConfig))
  671. {
  672. return;
  673. }
  674. var rep = db.GetRepository<UserOrgEntity>();
  675. rep.UnitOfWork = unitOfWork;
  676. //数据列表
  677. var sourceDataList = GetData<UserOrgEntity>(path: dbConfig.SyncDataPath);
  678. if (!(sourceDataList?.Length > 0))
  679. {
  680. Console.WriteLine($"table: {tableName} import data []");
  681. return;
  682. }
  683. //查询
  684. var userOrgRecordList = sourceDataList.Adapt<List<UserOrgRecord>>();
  685. var dataList = await rep.Where(a => rep.Orm.Select<UserOrgRecord>().WithMemory(userOrgRecordList).Where(b => b.UserId == a.UserId && b.OrgId == a.OrgId).Any()).ToListAsync();
  686. //新增
  687. var insertDataList = sourceDataList.Where(a => !(dataList.Where(b => a.UserId == b.UserId && a.OrgId == b.OrgId).Any())).ToList();
  688. if (insertDataList.Any())
  689. {
  690. await rep.InsertAsync(insertDataList);
  691. }
  692. Console.WriteLine($"table: {tableName} sync data succeed");
  693. }
  694. catch (Exception ex)
  695. {
  696. var msg = $"table: {tableName} sync data failed.\n{ex.Message}";
  697. Console.WriteLine(msg);
  698. throw new Exception(msg);
  699. }
  700. }
  701. /// <summary>
  702. /// 角色权限记录
  703. /// </summary>
  704. /// <param name="RoleId"></param>
  705. /// <param name="PermissionId"></param>
  706. record RolePermissionRecord(long RoleId, long PermissionId);
  707. /// <summary>
  708. /// 初始化角色权限
  709. /// </summary>
  710. /// <param name="db"></param>
  711. /// <param name="unitOfWork"></param>
  712. /// <param name="dbConfig"></param>
  713. /// <returns></returns>
  714. private async Task InitRolePermissionAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig)
  715. {
  716. var tableName = GetTableName<RolePermissionEntity>();
  717. try
  718. {
  719. if (!IsSyncData(tableName, dbConfig))
  720. {
  721. return;
  722. }
  723. var rep = db.GetRepository<RolePermissionEntity>();
  724. rep.UnitOfWork = unitOfWork;
  725. //数据列表
  726. var sourceDataList = GetData<RolePermissionEntity>(path: dbConfig.SyncDataPath);
  727. if (!(sourceDataList?.Length > 0))
  728. {
  729. Console.WriteLine($"table: {tableName} import data []");
  730. return;
  731. }
  732. //查询
  733. var rolePermissionRecordList = sourceDataList.Adapt<List<RolePermissionRecord>>();
  734. var dataList = await rep.Where(a => rep.Orm.Select<RolePermissionRecord>().WithMemory(rolePermissionRecordList).Where(b => b.RoleId == a.RoleId && b.PermissionId == a.PermissionId).Any()).ToListAsync();
  735. //新增
  736. var insertDataList = sourceDataList.Where(a => !(dataList.Where(b => a.RoleId == b.RoleId && a.PermissionId == b.PermissionId).Any())).ToList();
  737. if (insertDataList.Any())
  738. {
  739. await rep.InsertAsync(insertDataList);
  740. }
  741. Console.WriteLine($"table: {tableName} sync data succeed");
  742. }
  743. catch (Exception ex)
  744. {
  745. var msg = $"table: {tableName} sync data failed.\n{ex.Message}";
  746. Console.WriteLine(msg);
  747. throw new Exception(msg);
  748. }
  749. }
  750. /// <summary>
  751. /// 初始化租户
  752. /// </summary>
  753. /// <param name="db"></param>
  754. /// <param name="unitOfWork"></param>
  755. /// <param name="dbConfig"></param>
  756. /// <returns></returns>
  757. private async Task InitTenantAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig)
  758. {
  759. var tableName = GetTableName<TenantEntity>();
  760. try
  761. {
  762. if (!IsSyncData(tableName, dbConfig))
  763. {
  764. return;
  765. }
  766. var rep = db.GetRepository<TenantEntity>();
  767. rep.UnitOfWork = unitOfWork;
  768. //数据列表
  769. var sourceDataList = GetData<TenantEntity>(path: dbConfig.SyncDataPath);
  770. if (!(sourceDataList?.Length > 0))
  771. {
  772. Console.WriteLine($"table: {tableName} import data []");
  773. return;
  774. }
  775. //查询
  776. var sourceDataIds = sourceDataList.Select(e => e.Id).ToList();
  777. var dataList = await rep.Where(a => sourceDataIds.Contains(a.Id)).ToListAsync();
  778. //新增
  779. var dataIds = dataList.Select(a => a.Id).ToList();
  780. var insertDataList = sourceDataList.Where(a => !dataIds.Contains(a.Id));
  781. if (insertDataList.Any())
  782. {
  783. await rep.InsertAsync(insertDataList);
  784. }
  785. //修改
  786. if (dbConfig.SysUpdateData)
  787. {
  788. var updateDataList = dataList.Where(a => sourceDataIds.Contains(a.Id));
  789. if (updateDataList.Any())
  790. {
  791. foreach (var data in updateDataList)
  792. {
  793. var sourceData = sourceDataList.Where(a => a.Id == data.Id).First();
  794. sourceData.Adapt(data);
  795. }
  796. await rep.UpdateAsync(updateDataList);
  797. }
  798. }
  799. Console.WriteLine($"table: {tableName} sync data succeed");
  800. }
  801. catch (Exception ex)
  802. {
  803. var msg = $"table: {tableName} sync data failed.\n{ex.Message}";
  804. Console.WriteLine(msg);
  805. throw new Exception(msg);
  806. }
  807. }
  808. /// <summary>
  809. /// 租户权限记录
  810. /// </summary>
  811. /// <param name="TenantId"></param>
  812. /// <param name="PermissionId"></param>
  813. record TenantPermissionRecord(long TenantId, long PermissionId);
  814. /// <summary>
  815. /// 初始化租户权限
  816. /// </summary>
  817. /// <param name="db"></param>
  818. /// <param name="unitOfWork"></param>
  819. /// <param name="dbConfig"></param>
  820. /// <returns></returns>
  821. private async Task InitTenantPermissionAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig)
  822. {
  823. var tableName = GetTableName<TenantPermissionEntity>();
  824. try
  825. {
  826. if (!IsSyncData(tableName, dbConfig))
  827. {
  828. return;
  829. }
  830. var rep = db.GetRepository<TenantPermissionEntity>();
  831. rep.UnitOfWork = unitOfWork;
  832. //数据列表
  833. var sourceDataList = GetData<TenantPermissionEntity>(path: dbConfig.SyncDataPath);
  834. if (!(sourceDataList?.Length > 0))
  835. {
  836. Console.WriteLine($"table: {tableName} import data []");
  837. return;
  838. }
  839. //查询
  840. var tenantPermissionRecordList = sourceDataList.Adapt<List<TenantPermissionRecord>>();
  841. var dataList = await rep.Where(a => rep.Orm.Select<TenantPermissionRecord>().WithMemory(tenantPermissionRecordList).Where(b => b.TenantId == a.TenantId && b.PermissionId == a.PermissionId).Any()).ToListAsync();
  842. //新增
  843. var insertDataList = sourceDataList.Where(a => !(dataList.Where(b => a.TenantId == b.TenantId && a.PermissionId == b.PermissionId).Any())).ToList();
  844. if (insertDataList.Any())
  845. {
  846. await rep.InsertAsync(insertDataList);
  847. }
  848. Console.WriteLine($"table: {tableName} sync data succeed");
  849. }
  850. catch (Exception ex)
  851. {
  852. var msg = $"table: {tableName} sync data failed.\n{ex.Message}";
  853. Console.WriteLine(msg);
  854. throw new Exception(msg);
  855. }
  856. }
  857. /// <summary>
  858. /// 同步数据
  859. /// </summary>
  860. /// <param name="db"></param>
  861. /// <param name="dbConfig"></param>
  862. /// <param name="appConfig"></param>
  863. /// <returns></returns>
  864. public virtual async Task SyncDataAsync(IFreeSql db, DbConfig dbConfig = null, AppConfig appConfig = null)
  865. {
  866. using var unitOfWork = db.CreateUnitOfWork();
  867. try
  868. {
  869. var isTenant = appConfig.Tenant;
  870. await InitDictTypeAsync(db, unitOfWork, dbConfig);
  871. await InitDictAsync(db, unitOfWork, dbConfig);
  872. await InitUserAsync(db, unitOfWork, dbConfig, isTenant);
  873. await InitUserStaffAsync(db, unitOfWork, dbConfig, isTenant);
  874. await InitOrgAsync(db, unitOfWork, dbConfig, isTenant);
  875. await InitRoleAsync(db, unitOfWork, dbConfig, isTenant);
  876. await InitApiAsync(db, unitOfWork, dbConfig);
  877. await InitViewAsync(db, unitOfWork, dbConfig);
  878. await InitPermissionAsync(db, unitOfWork, dbConfig);
  879. await InitPermissionApiAsync(db, unitOfWork, dbConfig);
  880. await InitUserRoleAsync(db, unitOfWork, dbConfig);
  881. await InitUserOrgAsync(db, unitOfWork, dbConfig);
  882. await InitRolePermissionAsync(db, unitOfWork, dbConfig);
  883. await InitTenantAsync(db, unitOfWork, dbConfig);
  884. await InitTenantPermissionAsync(db, unitOfWork, dbConfig);
  885. unitOfWork.Commit();
  886. }
  887. catch (Exception)
  888. {
  889. unitOfWork.Rollback();
  890. throw;
  891. }
  892. }
  893. }