common.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. package controllers
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "io/ioutil"
  8. "net/http"
  9. "os"
  10. "reflect"
  11. "strconv"
  12. "strings"
  13. "time"
  14. "dashoo.cn/business2/permission"
  15. "dashoo.cn/labsop"
  16. "dashoo.cn/utils"
  17. "github.com/axgle/mahonia"
  18. "github.com/nsqio/go-nsq"
  19. )
  20. type blackboxddata struct {
  21. Code string
  22. Datapoint labsop.DatapointLabSop
  23. }
  24. type RandomOrderNumRequest struct {
  25. Id int64 `json:"id"`
  26. }
  27. // 保留两位小数
  28. func Get2point(v float64) string {
  29. return strconv.FormatFloat(v, 'f', 2, 64)
  30. }
  31. //格式化时间
  32. func FormatTime(timein time.Time) string {
  33. var timestring = timein.Format("2006-01-02")
  34. if strings.Contains("0001-01-01", timestring) {
  35. return ""
  36. } else {
  37. return timein.Format("2006-01-02")
  38. }
  39. }
  40. func Timeisnull(t time.Time) bool {
  41. var to time.Time
  42. return t.Equal(to)
  43. }
  44. func Apiget(str string) (body []byte) {
  45. str = strings.Replace(str, " ", "%20", -1)
  46. response, _ := http.Get(str)
  47. if response != nil {
  48. defer response.Body.Close()
  49. body, _ = ioutil.ReadAll(response.Body)
  50. }
  51. //json.Unmarshal(body, &devices)
  52. return
  53. }
  54. func Apipost(strUrl, method string, postDict interface{}) (body []byte) {
  55. strUrl = strings.Replace(strUrl, " ", "%20", -1)
  56. httpClient := &http.Client{
  57. //Transport:nil,
  58. //CheckRedirect: nil,
  59. }
  60. var httpReq *http.Request
  61. b, _ := json.Marshal(postDict)
  62. postBytesReader := bytes.NewReader(b)
  63. httpReq, _ = http.NewRequest(method, strUrl, postBytesReader)
  64. httpReq.Header.Add("Content-Type", "application/json")
  65. response, _ := httpClient.Do(httpReq)
  66. body, _ = ioutil.ReadAll(response.Body)
  67. return
  68. }
  69. func ApiKeyRequest(strUrl, method, apikey string, postDict interface{}) (body []byte) {
  70. httpClient := &http.Client{
  71. //Transport:nil,
  72. //CheckRedirect: nil,
  73. }
  74. var httpReq *http.Request
  75. b, _ := json.Marshal(postDict)
  76. postBytesReader := bytes.NewReader(b)
  77. httpReq, _ = http.NewRequest(method, strUrl, postBytesReader)
  78. httpReq.Header.Add("apikey", apikey)
  79. response, _ := httpClient.Do(httpReq)
  80. if response != nil {
  81. body, _ = ioutil.ReadAll(response.Body)
  82. }
  83. return
  84. }
  85. func SaveDirectory(path string) {
  86. os.MkdirAll(path, os.ModePerm)
  87. }
  88. // 上传图片
  89. func UploadImage(typename, path string, r *http.Request) string {
  90. fn, _, _ := r.FormFile("file")
  91. defer fn.Close()
  92. var spit string
  93. if os.IsPathSeparator('\\') { //前边的判断是否是系统的分隔符
  94. spit = "\\"
  95. } else {
  96. spit = "/"
  97. }
  98. var urlpath = path
  99. path = strings.Replace(path, "/", spit, -1)
  100. dir, _ := os.Getwd() //当前目录
  101. path = dir + path + spit + utils.ToStr(time.Now().Year()) + spit + fmt.Sprintf("%s", time.Now().Format("1")) + spit
  102. os.MkdirAll(path, os.ModePerm)
  103. var name = utils.GetGuid() + "." + typename
  104. f, _ := os.Create(path + name)
  105. defer f.Close()
  106. io.Copy(f, fn)
  107. return urlpath + utils.ToStr(time.Now().Year()) + "/" + fmt.Sprintf("%s", time.Now().Format("1")) + "/" + name
  108. }
  109. //上传附件
  110. func UploadFile(filename, path string, r *http.Request, fname ...string) string {
  111. filena := "upfile"
  112. if len(fname) > 0 {
  113. filena = fname[0]
  114. }
  115. fn, _, _ := r.FormFile(filena)
  116. defer fn.Close()
  117. var spit string
  118. if os.IsPathSeparator('\\') { //前边的判断是否是系统的分隔符
  119. spit = "\\"
  120. } else {
  121. spit = "/"
  122. }
  123. var urlpath = path
  124. path = strings.Replace(path, "/", spit, -1)
  125. dir, _ := os.Getwd() //当前目录
  126. path = dir + path + spit + utils.ToStr(time.Now().Year()) + spit + fmt.Sprintf("%s", time.Now().Format("1")) + spit
  127. os.MkdirAll(path, os.ModePerm)
  128. //var name = utils.GetGuid() + "." + typename
  129. f, _ := os.Create(path + filename)
  130. defer f.Close()
  131. io.Copy(f, fn)
  132. return urlpath + utils.ToStr(time.Now().Year()) + "/" + fmt.Sprintf("%s", time.Now().Format("1")) + "/" + filename
  133. }
  134. // 上传打印方案文件
  135. func UploadPrintFile(filename, path string, r *http.Request) string {
  136. fn, _, _ := r.FormFile("file")
  137. defer fn.Close()
  138. var spit string
  139. if os.IsPathSeparator('\\') { //前边的判断是否是系统的分隔符
  140. spit = "\\"
  141. } else {
  142. spit = "/"
  143. }
  144. var urlpath = path
  145. path = strings.Replace(path, "/", spit, -1)
  146. dir, _ := os.Getwd() //当前目录
  147. path = dir + path
  148. os.MkdirAll(path, os.ModePerm)
  149. var name = filename
  150. f, _ := os.Create(path + name)
  151. defer f.Close()
  152. io.Copy(f, fn)
  153. return urlpath + name
  154. }
  155. func GetTriggerItemNameByItem(item int) (name string) {
  156. switch item {
  157. case 1:
  158. name = ">"
  159. case 2:
  160. name = ">="
  161. case 3:
  162. name = "<"
  163. case 4:
  164. name = "<="
  165. case 5:
  166. name = "="
  167. }
  168. return
  169. }
  170. func GetChannelLast(code string) (lastdata labsop.DatapointLabSop, err error) {
  171. return labsop.GetBoxLastdata(strings.Replace(code, "c", "", 1))
  172. }
  173. func GetChannelCacheLast(code string) (lastdata labsop.BoxCache, err error) {
  174. return labsop.GetBox(strings.Replace(code, "c", "", 1))
  175. }
  176. func WriteAlertBindValue(code, value string) (err error) {
  177. key := strings.Replace(code, "c", "", 1)
  178. data := labsop.DatapointLabSop{Time: time.Now(), RequestData: value}
  179. err = labsop.UpdateBoxLastdata(key, data)
  180. if err == nil {
  181. cfg := nsq.NewConfig()
  182. Producernsq, _ := nsq.NewProducer(Nsqdtcpaddr, cfg)
  183. bdata, err := json.Marshal(blackboxddata{key, data})
  184. if err == nil {
  185. err = Producernsq.Publish(Nsqtopic, bdata)
  186. }
  187. }
  188. return
  189. }
  190. func GetChannelInfov2(code, u, p string, ftype int, startandend ...int64) (ctype string, cols []string, arrs [][]interface{}) {
  191. client := labsop.GetLabSopClient("coldcloud", "cc@1qaz2wsx", "coldcloud", "121.42.244.202:9086") //bs03
  192. sql := fmt.Sprintf("select * from %v ", code)
  193. if len(startandend) == 2 {
  194. sql = sql + fmt.Sprintf(" where time>%vs and time<%vs ", startandend[0], startandend[1])
  195. } else {
  196. sql = sql + " order by time desc limit 1"
  197. }
  198. data, err := client.QueryOneResultByCommand(sql)
  199. if err == nil && len(data) > 0 && len(data[0].Values) > 0 {
  200. ctype = "value"
  201. cols, arrs = data[0].Columns, data[0].Values
  202. }
  203. return
  204. }
  205. func CodertoGBK(str string) string {
  206. dec := mahonia.NewDecoder("UTF-8")
  207. enc := mahonia.NewEncoder("GBK")
  208. return enc.ConvertString(dec.ConvertString(str))
  209. }
  210. func CoderGBKtoUTF8(str string) string {
  211. dec := mahonia.FallbackDecoder(mahonia.NewDecoder("GBK"), mahonia.NewDecoder("UTF-8"))
  212. return dec.ConvertString(str)
  213. }
  214. //设备类型汇总
  215. const (
  216. Device_Box = "0" //设备,普通box
  217. Device_Alertor = "4" //设备,报警器
  218. ChannelItem_Sensor = "0,6,7,9,10,13,14,15" //sensor,常温,深低温,o2,co2,特殊(隐藏湿度的常温),功率,外接设备1,外接液位设备
  219. ChannelItem_Report = "0,6,7,9,10,14,15" //sensor报表使用,不需要功率,常温,深低温,o2,co2,特殊(隐藏湿度的常温),外接设备1,外接液位设备
  220. ChannelItem_Box = "1" //sensor,box自身数据
  221. ChannelItem_TAndH = "0,14" //sensor,常温,显示温湿度
  222. ChannelItem_Temperature = "6,10" //sensor,深低温,特殊,显示温度
  223. ChannelItem_Co2 = "9" //sensor,co2,显示温湿度,co2
  224. ChannelItem_O2 = "7" //sensor,o2,显示温湿度,O2
  225. ChannelItem_Power = "13" //sensor,功率插座,显示功率,市电
  226. ChannelItem_LiquidLevel = "15" //sensor,外接液位设备,显示温度,液位
  227. ChannelItem_HaveT = "0,6,7,9,10,15" //含温度数据
  228. ChannelItem_HaveV = "0,6,7,9,10" //含电压数据
  229. ChannelItem_HaveH = "0,7,9" //含湿度数据
  230. ChannelItem_HaveCO2 = "9" //含二氧化碳数据,co2
  231. ChannelItem_HaveO2 = "7" //含氧气数据,o2
  232. ChannelItem_HaveLiquidLevel = "15" //含液位数据
  233. Alertor_Alarm = "2,4,5,8,12" //报警器,普通,纯报警,纯正常,android,条屏
  234. Alertor_AlarmBindData = "3" //报警器,绑定数据
  235. Alertor_Alarm1 = "2" //报警器,普通
  236. Alertor_Alarm3 = "4" //报警器,纯报警
  237. Alertor_AlarmOnlyData = "5" //报警器,纯正常
  238. Alertor_AlarmAndroid = "8" //报警器,android
  239. Alertor_AlarmBaoJing = "2,4,5,8" //报警器,报警
  240. Alertor_AlarmLed = "12" //报警器,条屏
  241. Alertor_NeedAction = "2,4,5,8" //报警器,需要添加动作
  242. Alertor_NotNeedAction = "12" //报警器,不需要添加动作
  243. )
  244. //设备类型判断
  245. func DeviceItemContain(itemenum, item string) bool {
  246. return utils.SliceContains(strings.Split(itemenum, ","), item)
  247. }
  248. func DeviceItemContainint(itemenum string, item int) bool {
  249. return utils.SliceContains(strings.Split(itemenum, ","), utils.ToStr(item))
  250. }
  251. func StringIsContain(strs string, str ...interface{}) bool {
  252. if len(str) == 1 {
  253. return utils.SliceContains(strings.Split(strs, ","), utils.ToStr(str[0]))
  254. } else if len(str) == 2 {
  255. return utils.SliceContains(strings.Split(strs, ","), utils.ToStr(str[0])) || utils.SliceContains(strings.Split(strs, ","), utils.ToStr(str[1]))
  256. }
  257. return false
  258. }
  259. func IsAuthorized(uid string, permissionItemCode string) bool {
  260. svc := permission.GetPermissionService(utils.DBE)
  261. return svc.IsAuthorized(uid, permissionItemCode)
  262. }
  263. func Boxlinename(x int) string {
  264. switch x {
  265. case 1:
  266. return "A"
  267. case 2:
  268. return "B"
  269. case 3:
  270. return "C"
  271. case 4:
  272. return "D"
  273. case 5:
  274. return "E"
  275. case 6:
  276. return "F"
  277. case 7:
  278. return "G"
  279. case 8:
  280. return "H"
  281. case 9:
  282. return "I"
  283. case 10:
  284. return "J"
  285. case 11:
  286. return "K"
  287. case 12:
  288. return "L"
  289. case 13:
  290. return "M"
  291. case 14:
  292. return "N"
  293. case 15:
  294. return "O"
  295. case 16:
  296. return "P"
  297. case 17:
  298. return "Q"
  299. case 18:
  300. return "R"
  301. case 19:
  302. return "S"
  303. case 20:
  304. return "T"
  305. default:
  306. return "A"
  307. }
  308. }
  309. func NumtoUpChar(x int) string {
  310. return string(64 + x)
  311. }
  312. //截取字符串 start 起点下标 length 需要截取的长度
  313. func Substr(str string, start int, length int) string {
  314. rs := []rune(str)
  315. rl := len(rs)
  316. end := 0
  317. if start < 0 {
  318. start = rl - 1 + start
  319. }
  320. end = start + length
  321. if start > end {
  322. start, end = end, start
  323. }
  324. if start < 0 {
  325. start = 0
  326. }
  327. if start > rl {
  328. start = rl
  329. }
  330. if end < 0 {
  331. end = 0
  332. }
  333. if end > rl {
  334. end = rl
  335. }
  336. return string(rs[start:end])
  337. }
  338. //截取字符串 start 起点下标 end 终点下标(不包括)
  339. func Substr2(str string, start int, end int) string {
  340. rs := []rune(str)
  341. length := len(rs)
  342. if start < 0 || start > length {
  343. panic("start is wrong")
  344. }
  345. if end < 0 || end > length {
  346. panic("end is wrong")
  347. }
  348. return string(rs[start:end])
  349. }
  350. func GetKuoZhan(entity interface{}, filedname string) string {
  351. sfiledtype, _ := reflect.TypeOf(entity).FieldByName(filedname)
  352. objV := reflect.ValueOf(entity).FieldByName(filedname)
  353. switch sfiledtype.Type.Kind() {
  354. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  355. return utils.ToStr(objV.Int())
  356. case reflect.Float32, reflect.Float64:
  357. return utils.ToStr(objV.Float())
  358. case reflect.String:
  359. return objV.String()
  360. }
  361. return ""
  362. }
  363. func GetRandomOrderNum() int64 {
  364. var model RandomOrderNumRequest
  365. strurl := utils.Cfg.MustValue("server", "orderurl") //获取配置文件中方法
  366. json.Unmarshal(Apiget(strurl), &model)
  367. //json.Unmarshal(Apiget("http://uid.labsop.cn:8182/worker/2"), &model)
  368. return model.Id
  369. }