common.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. package common
  2. import (
  3. "fmt"
  4. "gorm.io/gorm"
  5. "math/rand"
  6. "reflect"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. // Operation type 操作类型
  12. const (
  13. OperationDefault = iota
  14. OperationLogin //登录
  15. OperationLogout //注销
  16. OperationCreate //新增
  17. OperationUpdate //修改
  18. OperationRemove //删除
  19. OperationImport //导入导出
  20. OperationLightStrategy //开关灯控策略
  21. OperationOrderCreate //工单发起
  22. OperationOrderChange //工单转派
  23. OperationOrderHandle //工单处理
  24. OperationProgramPublish //节目发布待审核
  25. OperationProgramResult //节目处理结果
  26. OperationStrategyRelation //策略关联
  27. OperationControl //操作
  28. OperationAlarmHandle //告警处理
  29. OperationSuccess = 0
  30. OperationFail = 1
  31. )
  32. const (
  33. ModuleTypeDefault = iota //操作记录模块
  34. ModuleTypeDevice //设备台账管理
  35. ModuleTypeInfoBar //信息发布系统
  36. ModuleTypeOrder //工单运维
  37. ModuleTypeNotification //通知公告
  38. ModuleTypeLightStrategy //照明策略
  39. ModuleTypeLighting //智慧照明系统-智能照明
  40. ModuleTypeAuth //系统管理
  41. ModuleTypeAlarm //告警管理
  42. ModuleTypeOperation //运营分析
  43. ModuleTypeRecord //记录处理
  44. ModuleTypeWisdomLighting //智能感应照明系统-灯随车走照明控制
  45. )
  46. // deviceType 设备类型 1** 交通 2** 农业
  47. const (
  48. DeviceTypeDefault = 0 //--
  49. DeviceTypeCamera = 100 //摄像头
  50. DeviceTypeLightControl = 101 //灯控
  51. DeviceTypeInfoBoard = 102 //信息屏
  52. DeviceTypeSwitchBox = 103 //配电箱
  53. DeviceTypeGateway = 104 //网关
  54. DeviceTypeOptoSensor = 105 // 环境监测
  55. DeviceTypeZigbee = 106 //ZigBee
  56. DeviceTypeAlarmTerminal = 107 //一键告警终端
  57. DeviceTypeAlarmServer = 108 //一键告警服务端
  58. DeviceTypeBridgeSensor = 109 //桥梁传感器
  59. DeviceTypeBridge = 110 //桥梁
  60. DeviceTypeIPBroadcast = 111 //ip音柱
  61. DeviceTypeManholeCover = 112 //井盖
  62. DeviceTypeGarbage = 113 //垃圾桶
  63. DeviceTypeLampPoleGroup = 114 //灯杆分组
  64. DeviceTypeLampPole = 115 //灯杆
  65. DeviceTypeCaptureUnit = 116 //抓拍单元
  66. DeviceTypePoint = 117 //卡口
  67. DeviceTypeGarbageGroup = 118 //垃圾桶分组
  68. DeviceTypeLightStrategy = 119 //灯控策略
  69. DeviceTypeOnDemandGroup = 120 //灯随车走分组
  70. DeviceTypeOnDemandSensor = 121 //灯随车走传感器
  71. DeviceTypeTransformer = 122 //变压器
  72. )
  73. var mLocation *time.Location
  74. func init() {
  75. loc, err := time.LoadLocation("Asia/Shanghai")
  76. if err != nil {
  77. mLocation = time.FixedZone("CST", 8*3600)
  78. } else {
  79. mLocation = loc
  80. }
  81. }
  82. func GetDeviceObject(id int, name string) string {
  83. return strconv.Itoa(id) + "(" + name + ")"
  84. }
  85. func StringToInt(id string) int {
  86. if id != "" {
  87. id, err := strconv.Atoi(id)
  88. if err == nil {
  89. return id
  90. }
  91. }
  92. return -1
  93. }
  94. func RandomString(n int) string {
  95. var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
  96. rand.Seed(time.Now().Unix())
  97. b := make([]rune, n)
  98. for i := range b {
  99. b[i] = letters[rand.Intn(len(letters))]
  100. }
  101. return string(b)
  102. }
  103. func RandomString2(n int) string {
  104. //var letters = []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
  105. var letters = []rune("123456789")
  106. rand.Seed(time.Now().Unix())
  107. b := make([]rune, n)
  108. for i := range b {
  109. b[i] = letters[rand.Intn(len(letters))]
  110. }
  111. return string(b)
  112. }
  113. func StringToInt64Array(str string) []int64 {
  114. tmp := strings.Split(str, ",")
  115. var result []int64
  116. for _, t := range tmp {
  117. i, _ := strconv.ParseInt(t, 10, 64)
  118. result = append(result, i)
  119. }
  120. return result
  121. }
  122. func StringToIntArray(str string) []int {
  123. tmp := strings.Split(str, ",")
  124. var result []int
  125. for _, t := range tmp {
  126. i, _ := strconv.Atoi(t)
  127. result = append(result, i)
  128. }
  129. return result
  130. }
  131. func MlParseTime(strTime string) (time.Time, error) {
  132. if strings.Contains(strTime, ".") {
  133. return time.ParseInLocation("2006-01-02 15:04:05.000", strTime, mLocation)
  134. }
  135. return time.ParseInLocation("2006-01-02 15:04:05", strTime, mLocation)
  136. }
  137. func IsAdmin(roleId int) bool {
  138. return roleId == 1
  139. }
  140. // TableModelAuto 给表命名字
  141. type TableModelAuto struct {
  142. Model interface{}
  143. Comment string
  144. }
  145. // MultimediaEfficacyTime ip音柱效验时间是否在当前时间之前
  146. func MultimediaEfficacyTime(stime Time, etime Time, time2 string) bool {
  147. stimeStr := stime.String()
  148. etimeStr := etime.String()
  149. if stimeStr == "" || etimeStr == "" || time2 == "" {
  150. return true
  151. }
  152. currDate := time.Now().Format("2006-01-02")
  153. kstime := currDate + time2
  154. nowTime, _ := time.Parse("2006-01-02 15:04:05", kstime)
  155. time3 := time.Now()
  156. if etimeStr == stimeStr && currDate == etimeStr && time3.Before(nowTime) {
  157. return false
  158. }
  159. return true
  160. }
  161. // Paginate 翻页
  162. func Paginate(page int, size int) func(db *gorm.DB) *gorm.DB {
  163. return func(db *gorm.DB) *gorm.DB {
  164. page := page
  165. if page == 0 {
  166. page = 1
  167. }
  168. pageSize := size
  169. switch {
  170. case pageSize > 100:
  171. pageSize = 100
  172. case pageSize <= 0:
  173. pageSize = 10
  174. }
  175. offset := (page - 1) * pageSize
  176. return db.Offset(offset).Limit(pageSize)
  177. }
  178. }
  179. var timeTemplates = []string{
  180. "2006-01-02 15:04:05", //常规类型
  181. "2006/01/02 15:04:05",
  182. "2006-01-02",
  183. "2006/01/02",
  184. "15:04:05",
  185. }
  186. /* 时间格式字符串转换 */
  187. func TimeStringToGoTime(tm string) time.Time {
  188. for i := range timeTemplates {
  189. t, err := time.ParseInLocation(timeTemplates[i], tm, time.Local)
  190. if nil == err && !t.IsZero() {
  191. return t
  192. }
  193. }
  194. return time.Time{}
  195. }
  196. // GetTimeDays 时间区间的所有天数
  197. func GetTimeDays(start_time, stop_time string) []string {
  198. star := []rune(start_time)
  199. end := []rune(stop_time)
  200. tm1, _ := time.Parse("2006-01-02", string(star[:10]))
  201. tm2, _ := time.Parse("2006-01-02", string(end[:10]))
  202. sInt := tm1.Unix()
  203. eInt := tm2.Unix()
  204. var args []string
  205. for {
  206. sInt += 86400
  207. st := time.Unix(sInt, 0).Format("2006-01-02")
  208. args = append(args, st)
  209. if sInt > eInt {
  210. break
  211. }
  212. }
  213. var days []string
  214. for i := 0; i < len(args); i++ {
  215. parse, _ := time.Parse("2006-01-02", string(star[:10]))
  216. date := parse.AddDate(0, 0, i).Format("2006-01-02")
  217. days = append(days, date)
  218. }
  219. return Reverse(days)
  220. }
  221. // GetTimeMonths 时间区间的所有月份
  222. func GetTimeMonths(start_time, stop_time string) []string {
  223. star := []rune(start_time)
  224. end := []rune(stop_time)
  225. var months []string
  226. i := 0
  227. for {
  228. parse, _ := time.Parse("2006-01", string(star[:7]))
  229. endStr, _ := time.Parse("2006-01", string(end[:7]))
  230. month := parse.AddDate(0, i, 0).Format("2006-01")
  231. month = month + "-01"
  232. months = append(months, month)
  233. if month == endStr.Format("2006-01")+"-01" || i > 24 {
  234. break
  235. }
  236. i++
  237. }
  238. return Reverse(months)
  239. }
  240. // Decimal float64 保留2位小数
  241. func Decimal(value float64) float64 {
  242. value, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", value), 64)
  243. return value
  244. }
  245. // Reverse 反转数组
  246. func Reverse(s []string) []string {
  247. for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
  248. s[i], s[j] = s[j], s[i]
  249. }
  250. return s
  251. }
  252. func InIntArr(target int, str_array []int) bool {
  253. for _, element := range str_array {
  254. if target == element {
  255. return true
  256. }
  257. }
  258. return false
  259. }
  260. func ACopyToB(a interface{}, b interface{}) {
  261. vVal := reflect.ValueOf(a).Elem() //获取reflect.Type类型
  262. bVal := reflect.ValueOf(b).Elem() //获取reflect.Type类型
  263. vTypeOfT := vVal.Type()
  264. for i := 0; i < vVal.NumField(); i++ {
  265. // 在要修改的结构体中查询有数据结构体中相同属性的字段,有则修改其值
  266. name := vTypeOfT.Field(i).Name
  267. if ok := bVal.FieldByName(name).IsValid(); ok {
  268. bVal.FieldByName(name).Set(reflect.ValueOf(vVal.Field(i).Interface()))
  269. }
  270. }
  271. }
  272. // 例如,若想将值 50 从区间 [0, 100] 映射到区间 [-1, 1] 中,则可以调用该函数如下:
  273. // mappedValue := common.MapRange(50, 0, 100, -1, 1)
  274. func MapRange(value, fromLow, fromHigh, toLow, toHigh float64) float64 {
  275. // Check for invalid input values
  276. if value < fromLow || value > fromHigh || fromLow == fromHigh || toLow == toHigh {
  277. return -1
  278. }
  279. // Calculate the ratio of the input range
  280. ratio := (value - fromLow) / (fromHigh - fromLow)
  281. // Scale the ratio to the output range and return the result
  282. return (ratio * (toHigh - toLow)) + toLow
  283. }