service.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package many2many
  2. import (
  3. "git.sxidc.com/go-framework/baize/convenient/binding"
  4. "git.sxidc.com/go-framework/baize/convenient/binding/request"
  5. "git.sxidc.com/go-framework/baize/framwork/api"
  6. "git.sxidc.com/go-framework/baize/framwork/domain"
  7. "git.sxidc.com/go-framework/baize/framwork/domain/entity"
  8. "git.sxidc.com/go-framework/baize/framwork/infrastructure"
  9. "git.sxidc.com/go-framework/baize/framwork/infrastructure/database"
  10. "git.sxidc.com/go-framework/baize/framwork/infrastructure/database/sql"
  11. "git.sxidc.com/go-tools/utils/slice"
  12. "git.sxidc.com/service-supports/fserr"
  13. )
  14. func Update(middleTableName string, fromTableName string, fromDomainCNName string, fromRelationFieldName string, fromRelationColumnName string,
  15. toTableName string, toRelationColumnName string) binding.ServiceFunc[any] {
  16. return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (any, error) {
  17. object := objects[0]
  18. if object == nil {
  19. return nil, fserr.New("领域实体为空")
  20. }
  21. dbExecutor := i.DBExecutor()
  22. fromEntity, ok := object.(entity.Entity)
  23. if !ok {
  24. return nil, fserr.New("领域对象不是实体")
  25. }
  26. // 字段校验
  27. err := fromEntity.CheckFieldID(fromEntity.DomainCNName())
  28. if err != nil {
  29. return nil, err
  30. }
  31. // from存在性校验
  32. fromExist, err := database.CheckExist(dbExecutor, &sql.CheckExistExecuteParams{
  33. TableName: fromTableName,
  34. Conditions: sql.NewConditions().Equal(entity.ColumnID, fromEntity.GetID()),
  35. })
  36. if err != nil {
  37. return nil, err
  38. }
  39. if !fromExist {
  40. return nil, fserr.New(fromEntity.DomainCNName() + "不存在")
  41. }
  42. if !domain.HasField(object, fromRelationFieldName) {
  43. return nil, fserr.New("关联字段" + fromRelationFieldName + "不存在")
  44. }
  45. toIDs, err := domain.Field[[]string](object, fromRelationFieldName)
  46. if err != nil {
  47. return nil, err
  48. }
  49. if toIDs != nil && len(toIDs) != 0 {
  50. for _, toID := range toIDs {
  51. err := entity.CheckID(fromDomainCNName, fromRelationFieldName, toID)
  52. if err != nil {
  53. return nil, err
  54. }
  55. }
  56. toIDs = slice.RemoveRepeatElement(toIDs)
  57. }
  58. err = database.Transaction(dbExecutor, func(tx database.Executor) error {
  59. err := database.Delete(tx, &sql.DeleteExecuteParams{
  60. TableName: middleTableName,
  61. Conditions: sql.NewConditions().Equal(fromRelationColumnName, fromEntity.GetID()),
  62. })
  63. if err != nil {
  64. return err
  65. }
  66. if toIDs == nil || len(toIDs) == 0 {
  67. return nil
  68. }
  69. toCount, err := database.Count(dbExecutor, &sql.CountExecuteParams{
  70. TableName: toTableName,
  71. Conditions: sql.NewConditions().In(entity.ColumnID, toIDs),
  72. })
  73. if err != nil {
  74. return err
  75. }
  76. if int(toCount) != len(toIDs) {
  77. return fserr.New("部分{{ $toCNName }}不存在")
  78. }
  79. tableRows := make([]sql.TableRow, len(toIDs))
  80. for index, toID := range toIDs {
  81. tableRows[index] = *(sql.NewTableRow().
  82. Add(fromRelationColumnName, fromEntity.GetID()).
  83. Add(toRelationColumnName, toID))
  84. }
  85. err = database.InsertBatch(tx, &sql.InsertBatchExecuteParams{
  86. TableName: middleTableName,
  87. TableRowBatch: tableRows,
  88. })
  89. if err != nil {
  90. return err
  91. }
  92. return nil
  93. })
  94. if err != nil {
  95. return nil, err
  96. }
  97. return nil, nil
  98. }
  99. }
  100. func Query[TI any](tableName string) binding.ServiceFunc[TI] {
  101. return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (TI, error) {
  102. var info TI
  103. return info, nil
  104. }
  105. }