common.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. package controllers
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "io/ioutil"
  8. "math/rand"
  9. "net/http"
  10. "os"
  11. "strconv"
  12. "strings"
  13. "time"
  14. "github.com/axgle/mahonia"
  15. "github.com/nsqio/go-nsq"
  16. "dashoo.cn/base_common/business/permission"
  17. "dashoo.cn/base_common/labsop"
  18. "dashoo.cn/base_common/utils"
  19. )
  20. var (
  21. Nsqdtcpaddr string
  22. Nsqtopic string
  23. SalesAdmin string = "SalesAdmin" //分销商管理员
  24. ProjectSourse string = "coldchain"
  25. )
  26. type blackboxddata struct {
  27. Code string
  28. Datapoint labsop.DatapointLabSop
  29. }
  30. // 保留两位小数
  31. func Get2point(v float64) string {
  32. return strconv.FormatFloat(v, 'f', 2, 64)
  33. }
  34. //格式化时间
  35. func FormatTime(timein time.Time) string {
  36. var timestring = timein.Format("2006-01-02")
  37. if strings.Contains("0001-01-01", timestring) {
  38. return ""
  39. } else {
  40. return timein.Format("2006-01-02")
  41. }
  42. }
  43. func Timeisnull(t time.Time) bool {
  44. var to time.Time
  45. return t.Equal(to)
  46. }
  47. func Apiget(str string) (body []byte) {
  48. str = strings.Replace(str, " ", "%20", -1)
  49. response, _ := http.Get(str)
  50. if response != nil {
  51. defer response.Body.Close()
  52. body, _ = ioutil.ReadAll(response.Body)
  53. }
  54. //json.Unmarshal(body, &devices)
  55. return
  56. }
  57. func Apipost(strUrl, method string, postDict interface{}) (body []byte) {
  58. strUrl = strings.Replace(strUrl, " ", "%20", -1)
  59. httpClient := &http.Client{
  60. //Transport:nil,
  61. //CheckRedirect: nil,
  62. }
  63. var httpReq *http.Request
  64. b, _ := json.Marshal(postDict)
  65. postBytesReader := bytes.NewReader(b)
  66. httpReq, _ = http.NewRequest(method, strUrl, postBytesReader)
  67. httpReq.Header.Add("Content-Type", "application/json")
  68. response, _ := httpClient.Do(httpReq)
  69. body, _ = ioutil.ReadAll(response.Body)
  70. return
  71. }
  72. func SaveDirectory(path string) {
  73. os.MkdirAll(path, os.ModePerm)
  74. }
  75. // 上传图片
  76. func UploadImage(typename, path string, r *http.Request) string {
  77. fn, _, _ := r.FormFile("file")
  78. defer fn.Close()
  79. var spit string
  80. if os.IsPathSeparator('\\') { //前边的判断是否是系统的分隔符
  81. spit = "\\"
  82. } else {
  83. spit = "/"
  84. }
  85. var urlpath = path
  86. path = strings.Replace(path, "/", spit, -1)
  87. dir, _ := os.Getwd() //当前目录
  88. path = dir + path + spit + utils.ToStr(time.Now().Year()) + spit + fmt.Sprintf("%s", time.Now().Format("1")) + spit
  89. os.MkdirAll(path, os.ModePerm)
  90. var name = utils.GetGuid() + "." + typename
  91. f, _ := os.Create(path + name)
  92. defer f.Close()
  93. io.Copy(f, fn)
  94. return urlpath + utils.ToStr(time.Now().Year()) + "/" + fmt.Sprintf("%s", time.Now().Format("1")) + "/" + name
  95. }
  96. func GetTriggerItemNameByItem(item int) (name string) {
  97. switch item {
  98. case 1:
  99. name = ">"
  100. case 2:
  101. name = ">="
  102. case 3:
  103. name = "<"
  104. case 4:
  105. name = "<="
  106. case 5:
  107. name = "="
  108. }
  109. return
  110. }
  111. func GetChannelLast(code string) (lastdata labsop.DatapointLabSop, err error) {
  112. return labsop.GetBoxLastdata(strings.Replace(code, "c", "", 1))
  113. }
  114. func GetChannelCacheLast(code string) (lastdata labsop.BoxCache, err error) {
  115. return labsop.GetBox(strings.Replace(code, "c", "", 1))
  116. }
  117. func WriteAlertBindValue(code, value string) (err error) {
  118. key := strings.Replace(code, "c", "", 1)
  119. data := labsop.DatapointLabSop{Time: time.Now(), RequestData: value}
  120. err = labsop.UpdateBoxLastdata(key, data)
  121. if err == nil {
  122. cfg := nsq.NewConfig()
  123. Producernsq, _ := nsq.NewProducer(Nsqdtcpaddr, cfg)
  124. bdata, err := json.Marshal(blackboxddata{key, data})
  125. if err == nil {
  126. err = Producernsq.Publish(Nsqtopic, bdata)
  127. }
  128. }
  129. return
  130. }
  131. func GetChannelInfov2(code string, startandend ...int64) (cols []string, arrs [][]interface{}) {
  132. client := labsop.GetLabSopClient("coldcloud", "cc@1qaz2wsx", "coldcloud", "114.215.27.56:9086")
  133. sql := fmt.Sprintf("select * from %v ", code)
  134. if len(startandend) == 2 {
  135. sql = sql + fmt.Sprintf(" where time>%vs and time<%vs ", startandend[0], startandend[1])
  136. } else {
  137. sql = sql + " order by time desc limit 1"
  138. }
  139. data, err := client.QueryOneResultByCommand(sql)
  140. if err == nil && len(data) > 0 && len(data[0].Values) > 0 {
  141. cols, arrs = data[0].Columns, data[0].Values
  142. }
  143. return
  144. }
  145. func GetChannelBysql(sql string) (cols []string, arrs [][]interface{}) {
  146. client := labsop.GetLabSopClient("coldcloud", "cc@1qaz2wsx", "coldcloud", "47.92.249.239:9086")
  147. data, err := client.QueryOneResultByCommand(sql)
  148. if err == nil && len(data) > 0 && len(data[0].Values) > 0 {
  149. cols, arrs = data[0].Columns, data[0].Values
  150. }
  151. return
  152. }
  153. func CodertoGBK(str string) string {
  154. dec := mahonia.NewDecoder("UTF-8")
  155. enc := mahonia.NewEncoder("GBK")
  156. return enc.ConvertString(dec.ConvertString(str))
  157. }
  158. func CoderGBKtoUTF8(str string) string {
  159. dec := mahonia.FallbackDecoder(mahonia.NewDecoder("GBK"), mahonia.NewDecoder("UTF-8"))
  160. return dec.ConvertString(str)
  161. }
  162. //设备类型汇总
  163. const (
  164. Device_Box = "0" //设备,普通box
  165. Device_Alertor = "4" //设备,报警器
  166. ChannelItem_Sensor = "0,6,7,9,10,13,14,17,26,25,31" //sensor,常温,深低温,o2,co2,特殊(隐藏湿度的常温),功率
  167. ChannelItem_Report = "0,6,7,9,10,14" //sensor报表使用,不需要功率,常温,深低温,o2,co2,特殊(隐藏湿度的常温)
  168. ChannelItem_Box = "1" //sensor,box自身数据
  169. ChannelItem_TAndH = "0" //sensor,常温,显示温湿度
  170. ChannelItem_Temperature = "6,10" //sensor,深低温,特殊,显示温度
  171. ChannelItem_Co2 = "9,26" //sensor,co2,显示温湿度,co2
  172. ChannelItem_O2 = "7,17" //sensor,o2,显示温湿度,O2
  173. ChannelItem_Power = "13" //sensor,功率插座,显示功率,电量
  174. ChannelItem_HaveT = "0,6,7,9,10" //含温度数据
  175. ChannelItem_HaveV = "0,6,7,9,10" //含电压数据
  176. ChannelItem_HaveH = "0,7,9" //含湿度数据
  177. ChannelItem_HaveCO2 = "9,26" //含二氧化碳数据,co2
  178. ChannelItem_HaveO2 = "7,17" //含氧气数据,o2
  179. Alertor_Alarm = "2,4,5,8,12" //报警器,普通,纯报警,纯正常,android,条屏
  180. Alertor_AlarmBindData = "3" //报警器,绑定数据
  181. Alertor_Alarm1 = "2" //报警器,普通
  182. Alertor_Alarm3 = "4" //报警器,纯报警
  183. Alertor_AlarmOnlyData = "5" //报警器,纯正常
  184. Alertor_AlarmAndroid = "8" //报警器,android
  185. Alertor_AlarmBaoJing = "2,4,5,8" //报警器,报警
  186. Alertor_AlarmLed = "12" //报警器,条屏
  187. Alertor_NeedAction = "2,4,5,8" //报警器,需要添加动作
  188. Alertor_NotNeedAction = "12" //报警器,不需要添加动作
  189. )
  190. //设备类型判断
  191. func DeviceItemContain(itemenum, item string) bool {
  192. return utils.SliceContains(strings.Split(itemenum, ","), item)
  193. }
  194. func DeviceItemContainint(itemenum string, item int) bool {
  195. return utils.SliceContains(strings.Split(itemenum, ","), utils.ToStr(item))
  196. }
  197. func StringIsContain(strs string, str ...interface{}) bool {
  198. if len(str) == 1 {
  199. return utils.SliceContains(strings.Split(strs, ","), utils.ToStr(str[0]))
  200. } else if len(str) == 2 {
  201. return utils.SliceContains(strings.Split(strs, ","), utils.ToStr(str[0])) || utils.SliceContains(strings.Split(strs, ","), utils.ToStr(str[1]))
  202. }
  203. return false
  204. }
  205. func IsAuthorized(uid string, permissionItemCode string) bool {
  206. svc := permission.GetPermissionService(utils.DBE)
  207. return svc.IsAuthorized(uid, permissionItemCode)
  208. }
  209. func randInt(min int, max int) int {
  210. if max-min <= 0 {
  211. return min
  212. }
  213. rand.Seed(time.Now().UTC().UnixNano())
  214. return min + rand.Intn(max-min)
  215. }
  216. //比较大小
  217. func Compare(item int, v1, v2 float64) bool {
  218. istrue := false
  219. switch item {
  220. case 1:
  221. istrue = v1 > v2
  222. case 2:
  223. istrue = v1 >= v2
  224. case 3:
  225. istrue = v1 < v2
  226. case 4:
  227. istrue = v1 <= v2
  228. case 5:
  229. istrue = v1 == v2
  230. }
  231. return istrue
  232. }