database_io.go 8.4 KB

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