control.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package budget
  2. import (
  3. "zhiyuan/pkg/db"
  4. )
  5. type Control struct {
  6. Type string `json:"type"`
  7. Value interface{} `json:"value"`
  8. Param map[string]interface{} `json:"param"`
  9. Event map[string]string `json:"event"`
  10. Last bool `json:"last"`
  11. }
  12. func (control *Control) PraseForArgs(args ...interface{}) {
  13. if len(args) > 0 {
  14. control.Type = db.ToString(args[0])
  15. }
  16. if len(args) > 1 {
  17. control.Value = args[1]
  18. }
  19. if len(args) > 2 {
  20. if p, ok := args[2].(map[string]interface{}); ok {
  21. control.Param = p
  22. } else {
  23. control.Param = make(map[string]interface{})
  24. }
  25. } else {
  26. control.Param = make(map[string]interface{})
  27. }
  28. if len(args) > 3 {
  29. if event, ok := args[3].(map[string]string); ok {
  30. control.Event = event
  31. } else {
  32. control.Event = make(map[string]string)
  33. if event, ok := args[3].(map[string]interface{}); ok {
  34. for key, val := range event {
  35. control.Event[key] = db.ToString(val)
  36. }
  37. }
  38. }
  39. } else {
  40. control.Event = make(map[string]string)
  41. }
  42. control.Last = true
  43. if len(args) > 4 {
  44. if p, ok := args[4].(bool); ok {
  45. control.Last = p
  46. }
  47. }
  48. }
  49. func (control *Control) PraseForMap(value map[string]interface{}) {
  50. control.Type = db.ToString(value["type"])
  51. control.Value = value["value"]
  52. if param, ok := value["param"].(map[string]interface{}); ok {
  53. control.Param = param
  54. } else {
  55. control.Param = make(map[string]interface{})
  56. }
  57. if event, ok := value["event"].(map[string]string); ok {
  58. control.Event = event
  59. } else {
  60. control.Event = make(map[string]string)
  61. if event, ok := value["event"].(map[string]interface{}); ok {
  62. for key, val := range event {
  63. control.Event[key] = db.ToString(val)
  64. }
  65. }
  66. }
  67. control.Last = db.ToBool(value["last"])
  68. }
  69. func (control *Control) ToMap() map[string]interface{} {
  70. return map[string]interface{}{
  71. "type": control.Type,
  72. "value": control.Value,
  73. "param": control.Param,
  74. "event": control.Event,
  75. "last": control.Last,
  76. }
  77. }
  78. func (control *Control) Handle(typ string, value interface{}, prop *PropForm, context *Context) error {
  79. switch control.Type {
  80. case "group", "popover":
  81. if v, ok := value.(map[string]interface{}); ok {
  82. index, _ := db.ToInt64(v["index"])
  83. value := v["value"]
  84. controls := make([]interface{}, 0)
  85. if s, ok := control.Param["controls"].([]interface{}); ok {
  86. controls = s
  87. }
  88. if _, ok := prop.Result.([]interface{}); !ok {
  89. prop.Result = make([]interface{}, len(controls))
  90. }
  91. if result, ok := prop.Result.([]interface{}); ok {
  92. if len(result) < len(controls) {
  93. prop.Result = append(result, make([]interface{}, len(controls)-len(result)))
  94. }
  95. }
  96. if index < int64(len(controls)) {
  97. var control Control
  98. if c, ok := controls[index].(Control); ok {
  99. control = c
  100. } else if c, ok := controls[index].(*Control); ok {
  101. control = *c
  102. } else if c, ok := controls[index].(map[string]interface{}); ok {
  103. control.PraseForMap(c)
  104. }
  105. if result, ok := prop.Result.([]interface{}); ok {
  106. props := new(PropForm)
  107. props.Key = context.Order.NewPropKey()
  108. props.Instance = prop.Instance
  109. props.Control = &control
  110. props.Result = result[index]
  111. props.AddUseKey(0)
  112. control.Handle(typ, value, props, context)
  113. result[index] = props.Result
  114. prop.Result = result
  115. }
  116. }
  117. }
  118. default:
  119. switch typ {
  120. case "input":
  121. prop.Result = value
  122. }
  123. }
  124. context.ModifyAfter(prop.Key)
  125. if event, ok := control.Event[typ]; ok {
  126. _, err := context.Exec(event)
  127. if err != nil {
  128. return err
  129. }
  130. }
  131. return nil
  132. }