service.go 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. package one2one
  2. import (
  3. "git.sxidc.com/go-framework/baize/framwork/api"
  4. "git.sxidc.com/go-framework/baize/framwork/binding"
  5. "git.sxidc.com/go-framework/baize/framwork/binding/request"
  6. "git.sxidc.com/go-framework/baize/framwork/binding/response"
  7. "git.sxidc.com/go-framework/baize/framwork/domain"
  8. "git.sxidc.com/go-framework/baize/framwork/domain/entity"
  9. "git.sxidc.com/go-framework/baize/framwork/infrastructure"
  10. "git.sxidc.com/go-framework/baize/framwork/infrastructure/database"
  11. "git.sxidc.com/go-framework/baize/framwork/infrastructure/database/sql"
  12. "git.sxidc.com/go-framework/baize/framwork/tag/sql/sql_mapping"
  13. "git.sxidc.com/go-tools/utils/reflectutils"
  14. "git.sxidc.com/go-tools/utils/strutils"
  15. "git.sxidc.com/service-supports/fserr"
  16. "reflect"
  17. )
  18. func Update(fromTableName string, fromRelationFieldName string, fromRelationColumnName string,
  19. toTableName string, toDomainCNName string, toRelationColumnName string) binding.ServiceFunc[any] {
  20. return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (any, error) {
  21. object := objects[0]
  22. if object == nil {
  23. return nil, fserr.New("领域实体为空")
  24. }
  25. dbExecutor := i.DBExecutor()
  26. fromEntity, ok := object.(entity.Entity)
  27. if !ok {
  28. return nil, fserr.New("领域对象不是实体")
  29. }
  30. // 字段校验
  31. err := fromEntity.CheckFieldID()
  32. if err != nil {
  33. return nil, err
  34. }
  35. // from存在性校验
  36. fromResult, err := database.QueryOne(dbExecutor, &sql.QueryOneExecuteParams{
  37. TableName: fromTableName,
  38. Conditions: sql.NewConditions().Equal(entity.ColumnID, fromEntity.GetID()),
  39. })
  40. if err != nil {
  41. if database.IsErrorDBRecordNotExist(err) {
  42. return nil, fserr.New(fromEntity.DomainCNName() + "不存在")
  43. }
  44. return nil, err
  45. }
  46. if !domain.HasField(object, fromRelationFieldName) {
  47. return nil, fserr.New("关联字段" + fromRelationFieldName + "不存在")
  48. }
  49. existFrom := reflect.New(reflect.TypeOf(object).Elem()).Interface().(domain.Object)
  50. err = sql.ParseSqlResult(fromResult, existFrom)
  51. if err != nil {
  52. return nil, err
  53. }
  54. currentToID, err := domain.Field[string](existFrom, fromRelationFieldName)
  55. if err != nil {
  56. return nil, err
  57. }
  58. newToID, err := domain.Field[string](object, fromRelationFieldName)
  59. if err != nil {
  60. return nil, err
  61. }
  62. if strutils.IsStringNotEmpty(newToID) {
  63. // to存在性校验
  64. toExist, err := database.CheckExist(dbExecutor, &sql.CheckExistExecuteParams{
  65. TableName: toTableName,
  66. Conditions: sql.NewConditions().Equal(entity.ColumnID, newToID),
  67. })
  68. if err != nil {
  69. return nil, err
  70. }
  71. if !toExist {
  72. return nil, fserr.New(fromEntity.DomainCNName() + "关联的" + toDomainCNName + "不存在")
  73. }
  74. }
  75. err = database.Transaction(dbExecutor, func(tx database.Executor) error {
  76. if strutils.IsStringNotEmpty(fromTableName) {
  77. err := database.Update(tx, &sql.UpdateExecuteParams{
  78. TableName: fromTableName,
  79. TableRow: sql.NewTableRow().Add(fromRelationColumnName, newToID),
  80. Conditions: sql.NewConditions().Equal(entity.ColumnID, fromEntity.GetID()),
  81. })
  82. if err != nil {
  83. return err
  84. }
  85. }
  86. if strutils.IsStringNotEmpty(toTableName) &&
  87. (strutils.IsStringNotEmpty(currentToID) || strutils.IsStringNotEmpty(newToID)) {
  88. familyID := fromEntity.GetID()
  89. if strutils.IsStringEmpty(newToID) {
  90. familyID = ""
  91. }
  92. updateToID := currentToID
  93. if strutils.IsStringEmpty(currentToID) {
  94. updateToID = newToID
  95. }
  96. err := database.Update(tx, &sql.UpdateExecuteParams{
  97. TableName: toTableName,
  98. TableRow: sql.NewTableRow().Add(toRelationColumnName, familyID),
  99. Conditions: sql.NewConditions().Equal(entity.ColumnID, updateToID),
  100. })
  101. if err != nil {
  102. return err
  103. }
  104. }
  105. return nil
  106. })
  107. if err != nil {
  108. return nil, err
  109. }
  110. return nil, nil
  111. }
  112. }
  113. func Query[TI any](fromTableName string, fromRelationFieldName string, toTableName string) binding.ServiceFunc[TI] {
  114. return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (TI, error) {
  115. outputZero := reflectutils.Zero[TI]()
  116. object := objects[0]
  117. if object == nil {
  118. return outputZero, fserr.New("领域实体为空")
  119. }
  120. dbExecutor := i.DBExecutor()
  121. fromEntity, ok := object.(entity.Entity)
  122. if !ok {
  123. return outputZero, fserr.New("领域对象不是实体")
  124. }
  125. // from存在性校验
  126. existFromResult, err := database.QueryOne(dbExecutor, &sql.QueryOneExecuteParams{
  127. TableName: fromTableName,
  128. Conditions: sql.NewConditions().Equal(entity.ColumnID, fromEntity.GetID()),
  129. })
  130. if err != nil {
  131. if database.IsErrorDBRecordNotExist(err) {
  132. return outputZero, fserr.New(fromEntity.DomainCNName() + "不存在")
  133. }
  134. return outputZero, err
  135. }
  136. existFromEntity := reflect.New(reflect.TypeOf(object).Elem()).Interface().(domain.Object)
  137. err = sql.ParseSqlResult(existFromResult, existFromEntity)
  138. if err != nil {
  139. return outputZero, err
  140. }
  141. if !domain.HasField(existFromEntity, fromRelationFieldName) {
  142. return outputZero, fserr.New("关联字段" + fromRelationFieldName + "不存在")
  143. }
  144. toID, err := domain.Field[string](existFromEntity, fromRelationFieldName)
  145. if err != nil {
  146. return outputZero, err
  147. }
  148. toResult, err := database.QueryOne(dbExecutor, &sql.QueryOneExecuteParams{
  149. TableName: toTableName,
  150. Conditions: sql.NewConditions().Equal(entity.ColumnID, toID),
  151. })
  152. if err != nil && !database.IsErrorDBRecordNotExist(err) {
  153. return outputZero, err
  154. }
  155. info := reflectutils.Zero[TI]()
  156. err = sql.ParseSqlResult(toResult, &info)
  157. if err != nil {
  158. return outputZero, err
  159. }
  160. return info, nil
  161. }
  162. }
  163. type ConditionFieldCallback func(conditions *sql.Conditions, fieldName string, columnName string, value any) (hasDeal bool)
  164. func QueryWithOtherInfo[FI any, TI any](fromTableName string, fromRelationColumnName string, fromFieldCallback ConditionFieldCallback, toTableName string) binding.ServiceFunc[response.InfosData[map[string]any]] {
  165. return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (response.InfosData[map[string]any], error) {
  166. errResponse := response.InfosData[map[string]any]{
  167. Infos: make([]map[string]any, 0),
  168. }
  169. if params == nil {
  170. return errResponse, fserr.New("请求参数为空")
  171. }
  172. object := objects[0]
  173. if object == nil {
  174. return errResponse, fserr.New("领域实体为空")
  175. }
  176. dbExecutor := i.DBExecutor()
  177. queryParams, ok := params.(request.QueryRequestParams)
  178. if !ok {
  179. return errResponse, fserr.New("请求参数不是Query接口")
  180. }
  181. fromEntity, ok := object.(entity.Entity)
  182. if !ok {
  183. return errResponse, fserr.New("领域对象不是实体")
  184. }
  185. conditions := sql.NewConditions()
  186. fromFields, err := sql_mapping.DefaultUsage(fromEntity)
  187. if err != nil {
  188. return errResponse, err
  189. }
  190. for _, fromField := range fromFields {
  191. hasDeal := false
  192. if fromFieldCallback != nil {
  193. hasDeal = fromFieldCallback(conditions, fromField.FieldName, fromField.ColumnName, fromField.Value)
  194. }
  195. if !hasDeal {
  196. fieldValue := reflect.ValueOf(fromField.Value)
  197. if !fieldValue.IsZero() {
  198. conditions.Equal(fromField.ColumnName, fromField.Value)
  199. }
  200. }
  201. }
  202. fromResults, totalCount, err := database.Query(dbExecutor, &sql.QueryExecuteParams{
  203. TableName: fromTableName,
  204. Conditions: conditions,
  205. PageNo: queryParams.GetPageNo(),
  206. PageSize: queryParams.GetPageSize(),
  207. })
  208. if err != nil {
  209. return errResponse, nil
  210. }
  211. if fromResults == nil || len(fromResults) == 0 {
  212. return response.InfosData[map[string]any]{
  213. Infos: make([]map[string]any, 0),
  214. TotalCount: 0,
  215. PageNo: 0,
  216. }, nil
  217. }
  218. toIDs := make([]string, 0)
  219. for _, fromResult := range fromResults {
  220. toID := fromResult.ColumnValueString(fromRelationColumnName)
  221. if strutils.IsStringNotEmpty(toID) {
  222. toIDs = append(toIDs, toID)
  223. }
  224. }
  225. toResultMap := make(map[string]sql.Result)
  226. if toIDs != nil && len(toIDs) != 0 {
  227. toResults, _, err := database.Query(dbExecutor, &sql.QueryExecuteParams{
  228. TableName: toTableName,
  229. Conditions: sql.NewConditions().In(entity.ColumnID, toIDs),
  230. })
  231. if err != nil {
  232. return errResponse, err
  233. }
  234. for _, toResult := range toResults {
  235. toID := toResult.ColumnValueString(entity.ColumnID)
  236. toResultMap[toID] = toResult
  237. }
  238. }
  239. infos := make([]map[string]any, len(fromResults))
  240. for index, fromResult := range fromResults {
  241. fromInfo := reflectutils.Zero[FI]()
  242. toInfo := reflectutils.Zero[TI]()
  243. err = sql.ParseSqlResult(fromResult, &fromInfo)
  244. if err != nil {
  245. return errResponse, err
  246. }
  247. toID := fromResult.ColumnValueString(fromRelationColumnName)
  248. if strutils.IsStringEmpty(toID) {
  249. infos[index] = map[string]any{
  250. "self": fromInfo,
  251. "with": toInfo,
  252. }
  253. continue
  254. }
  255. toResult, ok := toResultMap[toID]
  256. if !ok {
  257. infos[index] = map[string]any{
  258. "self": fromInfo,
  259. "with": toInfo,
  260. }
  261. continue
  262. }
  263. err = sql.ParseSqlResult(toResult, &toInfo)
  264. if err != nil {
  265. return errResponse, err
  266. }
  267. infos[index] = map[string]any{
  268. "self": fromInfo,
  269. "with": toInfo,
  270. }
  271. }
  272. return response.InfosData[map[string]any]{
  273. Infos: infos,
  274. TotalCount: totalCount,
  275. PageNo: queryParams.GetPageNo(),
  276. }, nil
  277. }
  278. }