SBaseService.kt 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719
  1. /*
  2. * *********************************************************************************************************************
  3. *
  4. * !!
  5. * .F88X
  6. * X8888Y
  7. * .}888888N;
  8. * i888888N; .:! .I$WI:
  9. * R888888I .'N88~ i8}+8Y&8"l8i$8>8W~'>W8}8]KW+8IIN"8&
  10. * .R888888I .;N8888~ .X8' "8I.!,/8" !%NY8`"8I8~~8>,88I
  11. * +888888N; .8888888Y "&&8Y.}8,
  12. * ./888888N; .R888888Y .'}~ .>}'.`+> i}! "i' +/' .'i~ !11,.:">, .~]! .i}i
  13. * ~888888%: .I888888l .]88~`1/iY88Ii+1'.R$8$8]"888888888> Y8$ W8E X8E W8888'188Il}Y88$*
  14. * 18888888 E8888881 .]W%8$`R8X'&8%++N8i,8N%N8+l8%` .}8N:.R$RE%N88N%N$K$R 188,FE$8%~Y88I
  15. * .E888888I .i8888888' .:$8I;88+`E8R:/8N,.>881.`$8E/1/]N8X.Y8N`"KF&&FK!'88*."88K./$88%RN888+~
  16. * 8888888I .,N888888~ ~88i"8W,!N8*.I88.}888%F,i$88"F88" 888:E8X.>88!i88>`888*.}Fl1]*}1YKi'
  17. * i888888N' I888Y ]88;/EX*IFKFK88X K8R .l8W 88Y ~88}'88E&%8W.X8N``]88!.$8K .:W8I
  18. * .i888888N; I8Y .&8$ .X88! i881.:%888>I88 ;88] +88+.';;;;:.Y88X 18N.,88l .+88/
  19. * .:R888888I
  20. * .&888888I Copyright (c) 2016-2020. 博锐尚格科技股份有限公司
  21. * ~8888'
  22. * .!88~ All rights reserved.
  23. *
  24. * *********************************************************************************************************************
  25. */
  26. package com.persagy.service
  27. import com.persagy.base.extensions.getAllDeclaredField
  28. import com.persagy.base.extensions.toJson
  29. import com.persagy.database.*
  30. import com.persagy.database.extensions.keyFieldList
  31. import com.persagy.database.extensions.keyValue
  32. import com.persagy.service.models.SCascadeQuery
  33. import com.persagy.service.models.annotations.SCascade
  34. import com.persagy.service.models.annotations.SCascadeCount
  35. import java.lang.reflect.Field
  36. import java.lang.reflect.ParameterizedType
  37. /**
  38. * 服务类基类
  39. *
  40. * @author 庞利祥 <sybotan@126.com>
  41. */
  42. open class SBaseService<ENTITY: Any> {
  43. /** 数据访问对象 */
  44. protected var baseDao: SAbstractDao<ENTITY>
  45. /** 实体类类型 */
  46. val entityClass: Class<ENTITY>
  47. get() = baseDao.entityClass
  48. /**
  49. * 构造函数
  50. *
  51. * @param entityClazz 实体类
  52. */
  53. constructor(entityClazz: Class<ENTITY>) {
  54. baseDao = daoFactory(entityClazz)
  55. } // Constructor()
  56. /**
  57. * 构造函数
  58. *
  59. * @param daoObject 数据访问对象
  60. */
  61. constructor(daoObject: SAbstractDao<ENTITY>) {
  62. baseDao = daoObject
  63. } // Constructor()
  64. /**
  65. * Dao对象工厂类
  66. *
  67. * @param entityClazz 实体类
  68. * @return 访问实体的Dao对象
  69. */
  70. private fun daoFactory(entityClazz: Class<ENTITY>): SAbstractDao<ENTITY> {
  71. @Suppress("UNCHECKED_CAST")
  72. val factory = Class.forName("com.persagy.mybatis.SDaoFactory").newInstance() as SAbstractDaoFactory<ENTITY>
  73. return factory.createDao(entityClazz)
  74. } // Fun daoFactory
  75. /**
  76. * 在数据库中插入实体
  77. *
  78. * @param entity 插入数据库的实体
  79. * @return 插入是否成功
  80. */
  81. open fun insert(entity: ENTITY): Boolean {
  82. return baseDao.insert(entity)
  83. } // Fun insert()
  84. /**
  85. * 在数据库中插入实体
  86. *
  87. * @param entity 插入数据库的实体
  88. * @return 插入是否成功
  89. */
  90. open fun replace(entity: ENTITY): Boolean {
  91. return baseDao.replace(entity)
  92. } // Fun replace()
  93. /**
  94. * 删除实体
  95. *
  96. * @param entity 被删除的实体
  97. * @return 删除是否成功
  98. */
  99. open fun delete(entity: ENTITY): Boolean {
  100. return baseDao.delete(entity)
  101. } // Fun delete()
  102. /**
  103. * 根据条件删除
  104. *
  105. * @param args 删除条件
  106. * @return 删除是否成功
  107. */
  108. open fun delete(vararg args: Pair<String, Any>): Boolean {
  109. return baseDao.delete(*args)
  110. } // Fun delete()
  111. /**
  112. * 根据条件删除
  113. *
  114. * @param args 删除条件
  115. * @return 删除是否成功
  116. */
  117. open fun delete(vararg args: SFilter): Boolean {
  118. return baseDao.delete(*args)
  119. } // Fun delete()
  120. /**
  121. * 根据条件删除
  122. *
  123. * @param args 删除条件
  124. * @return 删除是否成功
  125. */
  126. open fun delete(args: List<SFilter>): Boolean {
  127. return baseDao.delete(args)
  128. } // Fun delete()
  129. /**
  130. * 根据条件删除
  131. *
  132. * @param query 删除条件
  133. * @return 删除是否成功
  134. */
  135. open fun delete(query: String): Boolean {
  136. return baseDao.delete(query)
  137. } // Fun delete()
  138. /**
  139. * 删除所有记录
  140. *
  141. * @return 删除是否成功
  142. */
  143. open fun deleteAll(): Boolean {
  144. return baseDao.deleteAll()
  145. } // Fun deleteAll()
  146. /**
  147. * 更新实体
  148. *
  149. * @param entity 更新实体
  150. * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
  151. * @return 更新是否成功
  152. */
  153. open fun update(entity: ENTITY, projection: ArrayList<String>? = null): Boolean {
  154. return baseDao.update(entity, projection)
  155. } // Fun update()
  156. /**
  157. * 根据条件更新
  158. *
  159. * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
  160. * @param args 更新条件
  161. * @return 更新是否成功
  162. */
  163. open fun update(entity: ENTITY, projection: ArrayList<String>?, vararg args: Pair<String, Any>): Boolean {
  164. return baseDao.update(entity, projection, *args)
  165. } // Fun update()
  166. /**
  167. * 根据条件更新
  168. *
  169. * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
  170. * @param args 更新条件
  171. * @return 更新是否成功
  172. */
  173. open fun update(entity: ENTITY, projection: ArrayList<String>?, vararg args: SFilter): Boolean {
  174. return baseDao.update(entity, projection, *args)
  175. } // Fun update()
  176. /**
  177. * 根据条件更新
  178. *
  179. * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
  180. * @param args 更新条件
  181. * @return 更新是否成功
  182. */
  183. open fun update(entity: ENTITY, projection: ArrayList<String>?, args: List<SFilter>): Boolean {
  184. return baseDao.update(entity, projection, args)
  185. } // Fun update()
  186. /**
  187. * 根据条件更新
  188. *
  189. * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
  190. * @param query 更新条件
  191. * @return 更新是否成功
  192. */
  193. open fun update(entity: ENTITY, projection: ArrayList<String>?, query: String): Boolean {
  194. return baseDao.update(entity, projection, query)
  195. } // Fun update()
  196. /**
  197. * 根据条件查询一条记录
  198. *
  199. * @param args 查询条件
  200. */
  201. open fun select(vararg args: Pair<String, Any>): SQueryBuilder<ENTITY> {
  202. return baseDao.select(*args)
  203. } // Fun select()
  204. /**
  205. * 根据条件查询记录
  206. *
  207. * @param args 查询条件
  208. * @return 查询构造器
  209. */
  210. open fun select(vararg args: SFilter): SQueryBuilder<ENTITY> {
  211. return baseDao.select(*args)
  212. } // Fun select()
  213. /**
  214. * 根据条件查询记录
  215. *
  216. * @param args 查询条件
  217. * @return 查询构造器
  218. */
  219. open fun select(args: List<SFilter>): SQueryBuilder<ENTITY> {
  220. return baseDao.select(args)
  221. } // Fun select()
  222. /**
  223. * 根据条件查询记录
  224. *
  225. * @param query 查询条件
  226. * @return 查询构造器
  227. */
  228. open fun select(query: String?): SQueryBuilder<ENTITY> {
  229. return baseDao.select(query)
  230. } // Fun select()
  231. /**
  232. * 根据条件查询所有记录
  233. *
  234. * @return 查找的记录
  235. */
  236. open fun selectAll(): SQueryBuilder<ENTITY> {
  237. var builder = baseDao.selectAll()
  238. builder.limit(9999999)
  239. return builder
  240. } // Fun selectAll()
  241. /**
  242. * 执行查询操作
  243. *
  244. * @param builder 查询查询构造器
  245. * @return 查询到的记录
  246. */
  247. open fun execQuery(builder: SQueryBuilder<ENTITY>): ArrayList<ENTITY> {
  248. return baseDao.execQuery(builder)
  249. } // Fun execQuery()
  250. /**
  251. * 执行查询操作
  252. *
  253. * @param builder 查询查询构造器
  254. * @return 查询到的记录数
  255. */
  256. open fun execCount(builder: SQueryBuilder<ENTITY>): Long {
  257. return baseDao.execCount(builder)
  258. } // Fun execQuery()
  259. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  260. // 回调函数
  261. /**
  262. * 创建对象前回调函数
  263. *
  264. * @param entity 创建前的回调函数
  265. * @return 返回true,可以创建对象
  266. */
  267. protected open fun onCreateBefore(entity: ENTITY): Boolean {
  268. return true
  269. } // Fun onCreateBefore()
  270. /**
  271. * 创建成功后回调函数
  272. *
  273. * @param entityList 创建成功对象列表
  274. */
  275. protected open fun onCreateSuccess(entityList: ArrayList<ENTITY>) {
  276. } // Fun onCreateSuccess()
  277. /**
  278. * 创建失败回调函数
  279. *
  280. * @param entityList 创建失败对象列表
  281. */
  282. protected open fun onCreateFailure(entityList: ArrayList<ENTITY>) {
  283. } // Fun onCreateFailure()
  284. /**
  285. * 删除前回调函数
  286. *
  287. * @param entity 创建前的回调函数
  288. * @return 返回true,可以删除对象
  289. */
  290. protected open fun onDeleteBefore(entity: ENTITY): Boolean {
  291. return true
  292. } // Fun onCreateEntity()
  293. /**
  294. * 删除成功回调函数
  295. *
  296. * @param entityList 删除成功对象列表
  297. */
  298. protected open fun onDeleteSuccess(entityList: ArrayList<ENTITY>) {
  299. } // Fun onDeleteSuccess()
  300. /**
  301. * 删除失败回调函数
  302. *
  303. * @param entityList 删除失败对象列表
  304. */
  305. protected open fun onDeleteFailure(entityList: ArrayList<ENTITY>) {
  306. } // Fun onDeleteFailure()
  307. /**
  308. * 更新前回调函数
  309. *
  310. * @param entity 创建前的回调函数
  311. */
  312. protected open fun onUpdateBefore(entity: ENTITY): Boolean {
  313. return true
  314. } // Fun onCreateEntity()
  315. /**
  316. * 更新成功能回调函数
  317. *
  318. * @param entityList 更新成功对象列表
  319. */
  320. protected open fun onUpdateSuccess(entityList: ArrayList<ENTITY>) {
  321. } // Fun onUpdateSuccess()
  322. /**
  323. * 更新失败回调函数
  324. *
  325. * @param entityList 更新失败对象列表
  326. */
  327. protected open fun onUpdateFailure(entityList: ArrayList<ENTITY>) {
  328. } // Fun onUpdateFailure()
  329. /**
  330. * 查询前回调函数
  331. *
  332. * @param queryBuilder 查询构造器
  333. */
  334. protected open fun onQueryBefore(queryBuilder: SQueryBuilder<ENTITY>) {
  335. } // Fun onQueryBefore()
  336. /**
  337. * 查询成功回调函数
  338. *
  339. * @param pageInfo 页面信息
  340. */
  341. protected open fun onQuerySuccess(pageInfo: SPageQueryInfo<ENTITY>) {
  342. } // Fun onQuerySuccess()
  343. /**
  344. * 统计个数前回调函数
  345. *
  346. * @param queryBuilder 查询构造器
  347. */
  348. protected open fun onCountBefore(queryBuilder: SQueryBuilder<ENTITY>) {
  349. } // Fun onQueryBefore()
  350. /**
  351. * 统计个数成功回调函数
  352. *
  353. * @param count 统计结果
  354. */
  355. protected open fun onCountSuccess(count: Long) {
  356. } // Fun onCountSuccess()
  357. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  358. // 级联操作相关
  359. /**
  360. * 进行级联查询处理
  361. *
  362. * @param entityList 实体列表
  363. * @param cascadeList 级联请求列表
  364. */
  365. fun processCascadeQuery(entityList: ArrayList<Any>, cascadeList: ArrayList<SCascadeQuery>) {
  366. val entityMap = entityListToMap(entityList)
  367. for (cascade in cascadeList) {
  368. if (cascade.name == null) {
  369. continue
  370. }
  371. // 获得级联相关信息。如果信息不完整,则退出
  372. val cascadeField = entityClass.getAllDeclaredField(cascade.name!!) ?: continue
  373. val cascadeQueryAnno = cascadeField.getAnnotation(SCascade::class.java)
  374. val cascadeCountAnno = cascadeField.getAnnotation(SCascadeCount::class.java)
  375. if (cascadeQueryAnno != null) {
  376. cascadeQuery(entityMap, cascadeQueryAnno, cascadeField, cascade)
  377. } else if (cascadeCountAnno != null) {
  378. cascadeCount(entityMap, cascadeCountAnno, cascadeField, cascade)
  379. }
  380. }
  381. return
  382. } // Fun cascadeQuery()
  383. /**
  384. * 进行级联查询
  385. *
  386. * @param entityMap 实体Map
  387. * @param cascadeAnno 级联查询注解
  388. * @param cascadeField 级联查询对应的属性
  389. * @param cascade 级联请求
  390. */
  391. private fun cascadeQuery(entityMap: HashMap<Any, Any>, cascadeAnno: SCascade, cascadeField: Field, cascade: SCascadeQuery) {
  392. val cascadeClass = if (List::class.java.isAssignableFrom(cascadeField.type)) {
  393. // 如果是1对多,或多对多。取列表的泛型
  394. (cascadeField.genericType as ParameterizedType).actualTypeArguments[0] as Class<*>
  395. } else {
  396. // 如果为1对1,直接取对象类型
  397. cascadeField.type
  398. }
  399. val idList = entityIdList(entityMap)
  400. val relationList = baseDao.relationQuery(cascadeAnno.table, cascadeAnno.idColumn, cascadeAnno.childIdColumn, cascadeAnno.self, cascadeAnno.filter, idList)
  401. // 如果未取到关联数据,则开始取下一个关联对象
  402. if (relationList.size <= 0) {
  403. return
  404. }
  405. val relationMap = relationListToMap(relationList)
  406. /////////////////////////////////
  407. // 开始构造级联查询
  408. val service = SBaseService(cascadeClass)
  409. val sqlBuilder = service.select(cascade.filters)
  410. sqlBuilder.filter(SFilter.inList(cascadeClass.keyFieldList()[0].name, relationMap.keys.toList()))
  411. /** 排序条件 */
  412. if (null != cascade.orders) {
  413. sqlBuilder.order(cascade.orders!!)
  414. }
  415. /** 去重 */
  416. if (null != cascade.distinct && cascade.distinct!!) {
  417. sqlBuilder.distinct()
  418. }
  419. /** 映射标志 */
  420. if (null != cascade.projection) {
  421. sqlBuilder.projection(cascade.projection!!)
  422. }
  423. /** 分组统计 */
  424. if (null != cascade.group && !cascade.group!!.nameList.isNullOrEmpty()) {
  425. // 分组属性名列表
  426. sqlBuilder.group(*cascade.group!!.nameList.toArray(emptyArray<String>()))
  427. // 是否统计个数
  428. sqlBuilder.count(cascade.group!!.count ?: false)
  429. // 求和
  430. if (!cascade.group!!.sumList.isNullOrEmpty()) {
  431. sqlBuilder.sum(*cascade.group!!.sumList.toArray(emptyArray<String>()))
  432. }
  433. // 求平均值
  434. if (!cascade.group!!.avgList.isNullOrEmpty()) {
  435. sqlBuilder.avg(*cascade.group!!.avgList.toArray(emptyArray<String>()))
  436. }
  437. // 取最大值
  438. if (!cascade.group!!.maxList.isNullOrEmpty()) {
  439. sqlBuilder.max(*cascade.group!!.maxList.toArray(emptyArray<String>()))
  440. }
  441. // 取最小值
  442. if (!cascade.group!!.minList.isNullOrEmpty()) {
  443. sqlBuilder.min(*cascade.group!!.minList.toArray(emptyArray<String>()))
  444. }
  445. }
  446. val childrenList = sqlBuilder.exec()
  447. for (child in childrenList) {
  448. val childKey = child::class.java.keyFieldList()[0].name
  449. val id2 = child.keyValue(childKey)
  450. @Suppress("UNCHECKED_CAST")
  451. val id1List = relationMap[id2] as ArrayList<Any?>?
  452. id1List ?: continue
  453. for (id1 in id1List) {
  454. if (entityMap[id1] != null) {
  455. fillCascadeObject(entityMap[id1]!!, child, cascadeField)
  456. }
  457. }
  458. }
  459. /** 如果需要进行级联查询 */
  460. if (cascade.cascade != null && cascade.cascade!!.size > 0 &&
  461. childrenList.size > 0) {
  462. @Suppress("UNCHECKED_CAST")
  463. service.processCascadeQuery(childrenList as ArrayList<Any>, cascade.cascade!!)
  464. }
  465. return
  466. } // Fun cascadeQuery()
  467. /**
  468. * 进行级联查询
  469. *
  470. * @param entityMap 实体Map
  471. * @param cascadeAnno 级联查询注解
  472. * @param cascadeField 级联查询对应的属性
  473. * @param cascade 级联请求
  474. */
  475. private fun cascadeCount(entityMap: HashMap<Any, Any>, cascadeAnno: SCascadeCount, cascadeField: Field, cascade: SCascadeQuery) {
  476. val idList = entityIdList(entityMap)
  477. val relationList = baseDao.relationQuery(cascadeAnno.table, cascadeAnno.idColumn, cascadeAnno.childIdColumn, cascadeAnno.self, cascadeAnno.filter, idList)
  478. // 如果未取到关联数据,则开始取下一个关联对象
  479. if (relationList.size <= 0) {
  480. return
  481. }
  482. val relationMap = relationListToMap(relationList)
  483. /////////////////////////////////
  484. // 开始构造级联查询
  485. val service = SBaseService(cascadeAnno.childClass.java)
  486. val sqlBuilder = service.select(cascade.filters)
  487. sqlBuilder.filter(SFilter.inList(cascadeAnno.childClass.java.keyFieldList()[0].name, relationMap.keys.toList()))
  488. /** 排序条件 */
  489. if (null != cascade.orders) {
  490. sqlBuilder.order(cascade.orders!!)
  491. }
  492. /** 去重 */
  493. if (null != cascade.distinct && cascade.distinct!!) {
  494. sqlBuilder.distinct()
  495. }
  496. /** 映射标志 */
  497. if (null != cascade.projection) {
  498. sqlBuilder.projection(cascade.projection!!)
  499. }
  500. /** 分组统计 */
  501. if (null != cascade.group && !cascade.group!!.nameList.isNullOrEmpty()) {
  502. // 分组属性名列表
  503. sqlBuilder.group(*cascade.group!!.nameList.toArray(emptyArray<String>()))
  504. // 是否统计个数
  505. sqlBuilder.count(cascade.group!!.count ?: false)
  506. // 求和
  507. if (!cascade.group!!.sumList.isNullOrEmpty()) {
  508. sqlBuilder.sum(*cascade.group!!.sumList.toArray(emptyArray<String>()))
  509. }
  510. // 求平均值
  511. if (!cascade.group!!.avgList.isNullOrEmpty()) {
  512. sqlBuilder.avg(*cascade.group!!.avgList.toArray(emptyArray<String>()))
  513. }
  514. // 取最大值
  515. if (!cascade.group!!.maxList.isNullOrEmpty()) {
  516. sqlBuilder.max(*cascade.group!!.maxList.toArray(emptyArray<String>()))
  517. }
  518. // 取最小值
  519. if (!cascade.group!!.minList.isNullOrEmpty()) {
  520. sqlBuilder.min(*cascade.group!!.minList.toArray(emptyArray<String>()))
  521. }
  522. }
  523. val childrenList = sqlBuilder.exec()
  524. for (child in childrenList) {
  525. val childKey = child::class.java.keyFieldList()[0].name
  526. val id2 = child.keyValue(childKey)
  527. @Suppress("UNCHECKED_CAST")
  528. val id1List = relationMap[id2] as ArrayList<Any?>?
  529. id1List ?: continue
  530. for (id1 in id1List) {
  531. if (entityMap[id1] != null) {
  532. fillCascadeCount(entityMap[id1]!!, child, cascadeField)
  533. }
  534. }
  535. }
  536. return
  537. } // Fun cascadeCount()
  538. /**
  539. * 为加速填充级联对象,将实体列表转换为map。
  540. *
  541. * @param entityList 实体列表
  542. * @return 以Map形式存储的实体
  543. */
  544. private fun entityListToMap(entityList: ArrayList<Any>): HashMap<Any, Any> {
  545. val map = HashMap<Any, Any>()
  546. val key = entityClass.keyFieldList()[0]
  547. for (entity in entityList) {
  548. map[entity.keyValue(key.name)!!] = entity
  549. }
  550. return map
  551. } // Fun entityMap()
  552. /**
  553. * 获得实体的Id列表
  554. *
  555. * @param entityMap 实体Map
  556. * @return ID列表
  557. */
  558. private fun entityIdList(entityMap: HashMap<Any, Any>): ArrayList<Any> {
  559. val idList = ArrayList<Any>()
  560. for (entity in entityMap) {
  561. val keyField = entity.value.javaClass.keyFieldList()[0]
  562. val keyValue = entity.value.keyValue(keyField.name)!!
  563. println("keyField=${keyField.toJson()}")
  564. println("keyValue=${keyValue.toJson()}")
  565. idList.add(keyValue)
  566. }
  567. return idList
  568. } // Fun entityIdList()
  569. /**
  570. * 将关系列表转换为Map
  571. *
  572. * @param cascadeList 被转换的列表
  573. * @return 转换后的Map
  574. */
  575. private fun relationListToMap(cascadeList: List<HashMap<String, Any>>): HashMap<Any, ArrayList<Any>> {
  576. val map = HashMap<Any, ArrayList<Any>>()
  577. for (item in cascadeList) {
  578. item["id2"] ?: continue
  579. var list = map[item["id2"]!!]
  580. if (list == null) {
  581. list = ArrayList()
  582. }
  583. list.add(item["id1"]!!)
  584. map[item["id2"]!!] = list
  585. }
  586. return map
  587. } // Fun cascadeToMap()
  588. /**
  589. * 填级联对象
  590. *
  591. * @param entity 实体
  592. * @param child 填入的对象
  593. * @param field 填入的对象对应的实体类属性
  594. */
  595. private fun fillCascadeObject(entity: Any, child: Any?, field: Field) {
  596. // 如果child为空,则返回
  597. child ?: return
  598. // 保存访问权限
  599. val accessible = field.isAccessible
  600. field.isAccessible = true
  601. // 如果field是列表
  602. if (List::class.java.isAssignableFrom(field.type)) {
  603. @Suppress("UNCHECKED_CAST")
  604. var children = field.get(entity) as ArrayList<Any>?
  605. if (children == null) {
  606. children = ArrayList()
  607. }
  608. children.add(child)
  609. field.set(entity, children)
  610. } else {
  611. // 如果field是对象
  612. if (field.get(entity) == null) {
  613. field.set(entity, child)
  614. }
  615. }
  616. // 恢复访问权限
  617. field.isAccessible = accessible
  618. return
  619. } // Fun fillCascadeObject()
  620. /**
  621. * 填级联对象
  622. *
  623. * @param entity 实体
  624. * @param child 填入的对象
  625. * @param field 填入的对象对应的实体类属性
  626. */
  627. private fun fillCascadeCount(entity: Any, child: Any?, field: Field) {
  628. // 如果child为空,则返回
  629. child ?: return
  630. // 保存访问权限
  631. val accessible = field.isAccessible
  632. field.isAccessible = true
  633. @Suppress("UNCHECKED_CAST")
  634. var count = field.get(entity) as? Int
  635. if (count == null) {
  636. count = 0
  637. }
  638. count++
  639. field.set(entity, count)
  640. // 恢复访问权限
  641. field.isAccessible = accessible
  642. return
  643. } // Fun fillCascadeCount()
  644. } // Class SBaseService