x_bus_rebo.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. package repositories
  2. import (
  3. "errors"
  4. "fmt"
  5. "math"
  6. "strconv"
  7. "time"
  8. "xorm.io/xorm"
  9. "xps/cache"
  10. "xps/constant"
  11. "xps/viewmodels"
  12. )
  13. type XBusRepo struct {
  14. engine *xorm.Engine
  15. }
  16. func NewXBusRepo(engine *xorm.Engine) *XBusRepo {
  17. return &XBusRepo{
  18. engine: engine,
  19. }
  20. }
  21. func (d *XBusRepo) BuildPageQueryParam(params []viewmodels.QueryParam)(string, int, int, error) {
  22. sqlWhere := " WHERE 1 = 1 "
  23. limit := int(0)
  24. page := int(0)
  25. ok := false
  26. for _, param := range params {
  27. if param.Name == "limit" {
  28. limit, ok = param.Value.(int)
  29. if !ok {
  30. return sqlWhere, limit, page, errors.New("limit值不正确")
  31. }
  32. } else if param.Name == "page" {
  33. page, ok = param.Value.(int)
  34. if !ok {
  35. return sqlWhere, limit, page, errors.New("page值不正确")
  36. }
  37. } else {
  38. sqlWhere += fmt.Sprintf(" %s %v %s %v", param.LogicalOperator, param.Name, param.CompareOperator, param.Value )
  39. }
  40. }
  41. return sqlWhere, limit, page, nil
  42. }
  43. func (d *XBusRepo) BuildQueryParam(params []viewmodels.QueryParam)(string, error) {
  44. sqlWhere := " WHERE 1 = 1 "
  45. for _, param := range params {
  46. sqlWhere += fmt.Sprintf(" %s %v %s %v", param.LogicalOperator, param.Name, param.CompareOperator, param.Value )
  47. }
  48. return sqlWhere, nil
  49. }
  50. func (d *XBusRepo) GetPage(sqlStatement, sqlCount string, params []viewmodels.QueryParam) (*viewmodels.PageResult, error) {
  51. sqlWhere, limit, page, err1 := d.BuildPageQueryParam(params)
  52. if err1 != nil {
  53. return nil, err1
  54. }
  55. res, err2 := d.engine.Query(sqlCount + sqlWhere)
  56. if err2 != nil {
  57. return nil, err2
  58. }
  59. total := int64(0)
  60. for _, v := range res[0] {
  61. total, _ = strconv.ParseInt(string(v), 10, 64)
  62. }
  63. pageStart := (page - 1) * limit
  64. sqlLimit := fmt.Sprintf(" LIMIT %d OFFSET %d ", limit, pageStart)
  65. results, err4 := d.engine.QueryInterface(sqlStatement + sqlWhere + sqlLimit)
  66. if err4 != nil {
  67. return nil, err4
  68. }
  69. pageResult := &viewmodels.PageResult{}
  70. pageResult.Data = results
  71. pageResult.Total = total
  72. pageResult.PageSize = limit
  73. pageResult.Page = page
  74. pageResult.TotalPage= int64(math.Ceil(float64(total / int64(limit))))
  75. return pageResult, nil
  76. }
  77. func (d *XBusRepo) GetList(sqlStatement string, params []viewmodels.QueryParam) ([]map[string]interface{}, error) {
  78. sqlWhere, err1 := d.BuildQueryParam(params)
  79. if err1 != nil {
  80. return nil, err1
  81. }
  82. results, err := d.engine.QueryInterface(sqlStatement + sqlWhere)
  83. if err != nil {
  84. return nil, err
  85. }
  86. return results, nil
  87. }
  88. func (d *XBusRepo) GetById(sqlStatement string, params []viewmodels.QueryParam)(map[string]interface{}, error){
  89. sqlWhere, err1 := d.BuildQueryParam(params)
  90. if err1 != nil {
  91. return nil, err1
  92. }
  93. results, err := d.engine.QueryInterface(sqlStatement + sqlWhere)
  94. if err != nil {
  95. return nil, err
  96. }
  97. if len(results) > 1 {
  98. return nil, errors.New(" 主键不唯一")
  99. }
  100. return results[0], nil
  101. }
  102. func (d *XBusRepo) Create(objectCode string, values map[string]interface{}) error {
  103. object, err1 := cache.GetModelObject(objectCode)
  104. if err1 != nil {
  105. return err1
  106. }
  107. tableName := object.ObjectCode
  108. fields, err2 := cache.GetModelObjectAttrs(objectCode)
  109. if err2 != nil {
  110. return err2
  111. }
  112. sql := "INSERT INTO" + fmt.Sprintf(" %s ", tableName)
  113. sqlFields := "( "
  114. sqlValues := "VALUES ( "
  115. for idx, field := range fields {
  116. fieldName := field.AttrCode
  117. fieldType := field.AttrType
  118. fieldValue, ok := values[fieldName]
  119. if !ok {
  120. return nil
  121. }
  122. if idx > 0 {
  123. sqlFields += ","
  124. sqlValues += ","
  125. }
  126. sqlFields += fieldName + ""
  127. if fieldType == constant.DATA_TYPE_DATE ||
  128. fieldType == constant.DATA_TYPE_DATETIME ||
  129. fieldType == constant.DATA_TYPE_VARCHAR {
  130. sqlValues += fmt.Sprintf("'%v'", fieldValue) + ""
  131. } else {
  132. sqlValues += fmt.Sprintf("%v", fieldValue) + ""
  133. }
  134. }
  135. sqlFields += ") "
  136. sqlValues += ") "
  137. _, err3 := d.engine.Exec(sql + sqlFields + sqlValues)
  138. return err3
  139. }
  140. func (d *XBusRepo) Update(objectCode string, values map[string]interface{}) error {
  141. object, err1 := cache.GetModelObject(objectCode)
  142. if err1 != nil {
  143. return err1
  144. }
  145. tableName := object.ObjectCode
  146. fields, err2 := cache.GetModelObjectAttrs(objectCode)
  147. if err2 != nil {
  148. return err2
  149. }
  150. sql := fmt.Sprintf("UPDATE %s ", tableName)
  151. sqlFieldSets := " SET "
  152. sqlWhere := " WHERE 1 = 1 "
  153. bFirstSetValue := true
  154. for _, field := range fields {
  155. fieldName := field.AttrCode
  156. fieldType := field.AttrType
  157. fieldValue, ok := values[fieldName]
  158. if !ok {
  159. return nil
  160. }
  161. if !bFirstSetValue {
  162. sqlFieldSets += ","
  163. }
  164. if field.IsPKey <= 0 {
  165. bFirstSetValue = false
  166. if fieldType == constant.DATA_TYPE_DATE ||
  167. fieldType == constant.DATA_TYPE_DATETIME ||
  168. fieldType == constant.DATA_TYPE_VARCHAR {
  169. sqlFieldSets += fmt.Sprintf(" %s = '%v' ", fieldName, fieldValue) + ""
  170. } else {
  171. sqlFieldSets += fmt.Sprintf(" %s = %v ", fieldName, fieldValue) + ""
  172. }
  173. } else {
  174. if fieldType == constant.DATA_TYPE_DATE ||
  175. fieldType == constant.DATA_TYPE_DATETIME ||
  176. fieldType == constant.DATA_TYPE_VARCHAR {
  177. sqlWhere += fmt.Sprintf(" AND %s = '%v' ", fieldName, fieldValue) + ""
  178. } else {
  179. sqlWhere += fmt.Sprintf(" AND %s = %v ", fieldName, fieldValue) + ""
  180. }
  181. }
  182. }
  183. _, err := d.engine.Exec(sql + sqlFieldSets + sqlWhere)
  184. return err
  185. }
  186. func (d *XBusRepo) Patch(objectCode string, values map[string]interface{}) error {
  187. object, err1 := cache.GetModelObject(objectCode)
  188. if err1 != nil {
  189. return err1
  190. }
  191. tableName := object.ObjectCode
  192. fields, err2 := cache.GetModelObjectAttrs(objectCode)
  193. if err2 != nil {
  194. return err2
  195. }
  196. sql := fmt.Sprintf("UPDATE table %s ", tableName)
  197. sqlFieldSets := "SET "
  198. sqlWhere := "WHERE 1 = 1"
  199. for idx, field := range fields {
  200. fieldName := field.AttrCode
  201. fieldType := field.AttrType
  202. fieldValue, ok := values[fieldName]
  203. if !ok {
  204. return nil
  205. }
  206. if idx > 0 {
  207. sqlFieldSets += ","
  208. }
  209. if field.IsPKey <= 0 {
  210. if fieldType == constant.DATA_TYPE_DATE ||
  211. fieldType == constant.DATA_TYPE_DATETIME ||
  212. fieldType == constant.DATA_TYPE_VARCHAR {
  213. sqlFieldSets += fmt.Sprintf(" %s = '%v' ", fieldName, fieldValue) + ""
  214. } else {
  215. sqlFieldSets += fmt.Sprintf(" %s = %v ", fieldName, fieldValue) + ""
  216. }
  217. } else {
  218. if fieldType == constant.DATA_TYPE_DATE ||
  219. fieldType == constant.DATA_TYPE_DATETIME ||
  220. fieldType == constant.DATA_TYPE_VARCHAR {
  221. sqlWhere += fmt.Sprintf(" AND %s = '%v' ", fieldName, fieldValue) + ""
  222. } else {
  223. sqlWhere += fmt.Sprintf(" AND %s = %v ", fieldName, fieldValue) + ""
  224. }
  225. }
  226. }
  227. _, err := d.engine.Exec(sql + sqlFieldSets + sqlWhere)
  228. return err
  229. }
  230. func (d *XBusRepo) Delete(objectCode string, values map[string]interface{}) error {
  231. object, err1 := cache.GetModelObject(objectCode)
  232. if err1 == nil {
  233. return err1
  234. }
  235. tableName := object.ObjectCode
  236. fields, err2 := cache.GetModelObjectAttrs(objectCode)
  237. if err2 != nil {
  238. return err2
  239. }
  240. deletedBy := values["deletedBy"].(int64)
  241. sql := fmt.Sprintf("UPDATE table %s ", tableName)
  242. sqlFieldSets := fmt.Sprintf("SET deleted_flag = 1 AND deleted_by = %d AND deleted_at = %s", deletedBy, time.Now().String())
  243. sqlWhere := "WHERE 1 = 1"
  244. for idx, field := range fields {
  245. fieldName := field.AttrCode
  246. fieldType := field.AttrType
  247. fieldValue, ok := values[fieldName]
  248. if !ok {
  249. return nil
  250. }
  251. if idx > 0 {
  252. sqlFieldSets += ","
  253. }
  254. if field.IsPKey >= 1 {
  255. if fieldType == constant.DATA_TYPE_DATE ||
  256. fieldType == constant.DATA_TYPE_DATETIME ||
  257. fieldType == constant.DATA_TYPE_VARCHAR {
  258. sqlFieldSets += fmt.Sprintf(" %s = '%v' ", fieldName, fieldValue) + ""
  259. } else {
  260. sqlFieldSets += fmt.Sprintf(" %s = %v ", fieldName, fieldValue) + ""
  261. }
  262. }
  263. }
  264. _, err := d.engine.Exec(sql + sqlFieldSets + sqlWhere)
  265. return err
  266. }