computer.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. package log
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/xuri/excelize/v2"
  6. "gorm.io/gorm"
  7. "log-server/global"
  8. "log-server/model/log"
  9. "log-server/model/log/request"
  10. "log-server/model/log/response"
  11. loging2 "log-server/service/log/loging"
  12. "os"
  13. "time"
  14. )
  15. type ServiceComputer struct {
  16. Logical loging2.LogicalLog
  17. }
  18. func (exa *ServiceComputer) ParseExcel2InfoList(filePath string) (err error) {
  19. skipHeader := true
  20. fixedHeader := []string{"pc_code", "user", "supplier"}
  21. file, err := excelize.OpenFile(filePath)
  22. if err != nil {
  23. return err
  24. }
  25. var Computers []*log.Computer
  26. rows, err := file.Rows("Sheet1")
  27. if err != nil {
  28. return err
  29. }
  30. for rows.Next() {
  31. row, err := rows.Columns()
  32. if err != nil {
  33. return err
  34. }
  35. if skipHeader {
  36. if exa.compareStrSlice(row, fixedHeader) {
  37. skipHeader = false
  38. continue
  39. } else {
  40. return errors.New("Excel格式错误")
  41. }
  42. }
  43. if len(row) != len(fixedHeader) {
  44. continue
  45. }
  46. c := new(log.Computer)
  47. c.PcCode = row[0]
  48. c.User = row[1]
  49. c.Supplier = row[2]
  50. c.CreateTime = time.Now().Format("2006-01-02 15:04:05")
  51. c.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
  52. c.Status = 1
  53. Computers = append(Computers, c)
  54. }
  55. err = os.RemoveAll(filePath)
  56. if err != nil {
  57. return
  58. }
  59. err = global.GVA_DB.Create(Computers).Error
  60. if err != nil {
  61. return
  62. }
  63. var cp log.Computer
  64. err = cp.DelAllOnlinePcCodeCache()
  65. return
  66. }
  67. func (exa *ServiceComputer) compareStrSlice(a, b []string) bool {
  68. if len(a) != len(b) {
  69. return false
  70. }
  71. if (b == nil) != (a == nil) {
  72. return false
  73. }
  74. for key, value := range a {
  75. if value != b[key] {
  76. return false
  77. }
  78. }
  79. return true
  80. }
  81. //@author: [piexlmax](https://github.com/piexlmax)
  82. //@function: GetPcInfoList
  83. //@description: 分页获取数据,
  84. //@param: card card.Card, info request.PageInfo, order string, desc bool
  85. //@return: list interface{}, total int64, err error
  86. func (apiService *ServiceComputer) GetPcInfoList(api log.Computer, info request.PageInfo, order string, desc bool) (list interface{}, total int64, err error) {
  87. limit := info.PageSize
  88. offset := info.PageSize * (info.Page - 1)
  89. db := global.GVA_DB.Model(&log.Computer{})
  90. var apiList []log.Computer
  91. if api.PcCode != "" {
  92. db = db.Where("pc_code LIKE ?", "%"+api.PcCode+"%")
  93. }
  94. if api.User != "" {
  95. db = db.Where("user LIKE ?", "%"+api.User+"%")
  96. }
  97. if api.Status != 0 {
  98. if api.Status == -1 {
  99. db = db.Where("status = ?", 0)
  100. }
  101. }
  102. err = db.Count(&total).Error
  103. if err != nil {
  104. return apiList, total, err
  105. } else {
  106. db = db.Limit(limit).Offset(offset)
  107. if order != "" {
  108. var OrderStr string
  109. // 设置有效排序key 防止sql注入
  110. // 感谢 Tom4t0 提交漏洞信息
  111. orderMap := make(map[string]bool, 4)
  112. orderMap["id"] = true
  113. orderMap["pc_code"] = true
  114. orderMap["user"] = true
  115. if orderMap[order] {
  116. if desc {
  117. OrderStr = order + " desc"
  118. } else {
  119. OrderStr = order
  120. }
  121. } else { // didn't matched any order key in `orderMap`
  122. err = fmt.Errorf("非法的排序字段: %v", order)
  123. return apiList, total, err
  124. }
  125. err = db.Order(OrderStr).Find(&apiList).Error
  126. } else {
  127. err = db.Order("id").Find(&apiList).Error
  128. }
  129. }
  130. var apisReply []*response.GetPcListReply
  131. if len(apiList) != 0 {
  132. for _, apiInfo := range apiList {
  133. apiReply := new(response.GetPcListReply)
  134. apiReply.Id = apiInfo.Id
  135. apiReply.Status = apiInfo.Status
  136. apiReply.PcCode = apiInfo.PcCode
  137. apiReply.Supplier = apiInfo.Supplier
  138. apiReply.UpdateTime = apiInfo.UpdateTime
  139. apiReply.CreateTime = apiInfo.CreateTime
  140. apiReply.User = apiInfo.User
  141. apisReply = append(apisReply, apiReply)
  142. }
  143. }
  144. return apisReply, total, err
  145. }
  146. //@author: [piexlmax](https://github.com/piexlmax)
  147. //@function: GetPcById
  148. //@description: 根据id获取pc
  149. //@param: id uint
  150. //@return: apiReply response.GetPcListReply, err error
  151. func (c *ServiceComputer) GetPcById(id int) (cardReply response.GetPcListReply, err error) {
  152. var api log.Computer
  153. err = global.GVA_DB.Where("id = ?", id).First(&api).Error
  154. if err != nil {
  155. return
  156. }
  157. cardReply.Id = api.Id
  158. cardReply.Status = api.Status
  159. cardReply.Supplier = api.Supplier
  160. cardReply.User = api.User
  161. cardReply.PcCode = api.PcCode
  162. cardReply.CreateTime = api.CreateTime
  163. cardReply.UpdateTime = api.UpdateTime
  164. return
  165. }
  166. func (a *ServiceComputer) CreatePc(c log.Computer) (err error) {
  167. if !errors.Is(global.GVA_DB.Where("pc_code = ?", c.PcCode).First(&log.Computer{}).Error, gorm.ErrRecordNotFound) {
  168. return errors.New("存在相同编号")
  169. }
  170. c.CreateTime = time.Now().Format("2006-01-02 15:04:05")
  171. c.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
  172. err = global.GVA_DB.Create(&c).Error
  173. if err != nil {
  174. return err
  175. }
  176. if c.Status == 1 {
  177. err = c.UpdateOnlinePcCodeCache(c.PcCode, c.User)
  178. }
  179. return
  180. }
  181. //@author: [piexlmax](https://github.com/piexlmax)
  182. //@function: UpdatePc
  183. //@description: 根据id更新pc
  184. //@param: Computer log.Computer
  185. //@return: err error
  186. func (a *ServiceComputer) UpdatePc(c log.Computer) (err error) {
  187. var oldA log.Computer
  188. err = global.GVA_DB.Where("id = ?", c.Id).First(&oldA).Error
  189. if err != nil {
  190. return err
  191. }
  192. if oldA.PcCode != c.PcCode {
  193. if !errors.Is(global.GVA_DB.Where("pc_code = ?", c.PcCode).First(&log.Computer{}).Error, gorm.ErrRecordNotFound) {
  194. return errors.New("存在相同编号")
  195. }
  196. }
  197. var updateInfo = make(map[string]interface{})
  198. updateInfo["pc_code"] = c.PcCode
  199. updateInfo["user"] = c.User
  200. updateInfo["supplier"] = c.Supplier
  201. updateInfo["status"] = c.Status
  202. err = global.GVA_DB.Table("computer").Where("id", c.Id).Updates(updateInfo).Error
  203. if err != nil {
  204. return err
  205. }
  206. if c.Status == -1 {
  207. err = oldA.DelOnlinePcCodeCache(c.PcCode)
  208. } else if c.Status == 1 {
  209. err = oldA.DelOnlinePcCodeCache(oldA.PcCode)
  210. err = oldA.UpdateOnlinePcCodeCache(c.PcCode, c.User)
  211. }
  212. return err
  213. }
  214. //@author: [piexlmax](https://github.com/piexlmax)
  215. //@function: UpdatePcStatus
  216. //@description: 根据id更新 status
  217. //@param: Computer log.Computer
  218. //@return: err error
  219. func (a *ServiceComputer) UpdatePcStatus(c log.Computer) (err error) {
  220. var oldA log.Computer
  221. err = global.GVA_DB.Where("id = ?", c.Id).First(&oldA).Error
  222. if err != nil {
  223. return err
  224. }
  225. err = global.GVA_DB.Table("computer").Where("id", c.Id).Update("status", c.Status).Error
  226. return err
  227. }