TaskData.go 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959
  1. package Task
  2. import (
  3. "ColdVerify_local/conf"
  4. "ColdVerify_local/lib"
  5. "ColdVerify_local/logs"
  6. "encoding/json"
  7. "fmt"
  8. "github.com/astaxie/beego/cache"
  9. _ "github.com/astaxie/beego/cache/redis"
  10. "github.com/beego/beego/v2/adapter/orm"
  11. orm2 "github.com/beego/beego/v2/client/orm"
  12. "github.com/go-sql-driver/mysql"
  13. _ "github.com/go-sql-driver/mysql"
  14. "math"
  15. "sort"
  16. "strconv"
  17. "strings"
  18. "time"
  19. )
  20. const (
  21. Temperature = "Temperature"
  22. Humidity = "Humidity"
  23. )
  24. // 模板 func TestBeego(t *testing.T) {
  25. type TaskData struct {
  26. Id int `orm:"column(ID);size(11);auto;pk"`
  27. T_id string `orm:"size(256);null"` // 标题
  28. T_t float32 `orm:"size(10);null"` // 温度
  29. T_rh float32 `orm:"size(10);null"` // 湿度
  30. T_time time.Time `orm:"type(timestamp);null;"` // 采集时间
  31. CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间 UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"` //auto_now 每次 model 保存时都会对时间自动更新
  32. }
  33. type TaskData_Time_Min_Max_GROUP struct {
  34. T_max float32 // 温度
  35. T_max_id string // 温度
  36. T_min float32 // 湿度
  37. T_min_id string // 湿度
  38. T_times string // 采集时间
  39. }
  40. func (t *TaskData) TableName() string {
  41. return "task_data" // 数据库名称 // ************** 替换 FormulaList **************
  42. }
  43. var redisCache_TaskData cache.Cache
  44. func init() {
  45. //orm2.Debug = true
  46. config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
  47. "redis_"+"TaskData", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
  48. logs.Println(config)
  49. var err error
  50. redisCache_TaskData, err = cache.NewCache("redis", config)
  51. if err != nil || redisCache_TaskData == nil {
  52. errMsg := "failed to init redis"
  53. logs.Println(errMsg, err)
  54. }
  55. }
  56. type TaskDataJPG struct {
  57. State int `json:"state"` //1:生成中 2:已完成 3:失败
  58. Msg string `json:"msg"`
  59. Url string `json:"url"` //url
  60. }
  61. // ---------------- Redis -------------------
  62. // Redis_Set(m.T_sn,m) // Redis 更新缓存
  63. func Redis_TaskDataJPG_Set(key string, r TaskDataJPG) (err error) {
  64. //json序列化
  65. str, err := json.Marshal(r)
  66. if err != nil {
  67. logs.Error(lib.FuncName(), err)
  68. return
  69. }
  70. err = redisCache_TaskData.Put(key, str, 5*time.Minute)
  71. if err != nil {
  72. logs.Println("set key:", key, ",value:", str, err)
  73. }
  74. return
  75. }
  76. // if r,is :=Redis_Get(T_sn);is{
  77. // return r,nil
  78. // }
  79. func Redis_TaskDataJPG_Get(key string) (r TaskDataJPG, is bool) {
  80. if redisCache_TaskData.IsExist(key) {
  81. logs.Println("找到key:", key)
  82. v := redisCache_TaskData.Get(key)
  83. json.Unmarshal(v.([]byte), &r)
  84. return r, true
  85. }
  86. logs.Println("没有 找到key:", key)
  87. return TaskDataJPG{}, false
  88. }
  89. func Redis_TaskDataJPG_Del(key string) (err error) {
  90. err = redisCache_TaskData.Delete(key)
  91. return
  92. }
  93. // 创建数据库 Device.CREATE_TaskData("")
  94. func CREATE_TaskData(alias_name, T_task_id string) bool {
  95. o := orm2.NewOrmUsingDB(alias_name)
  96. sql := "DROP TABLE IF EXISTS `z_task_data_" + T_task_id + "`"
  97. o.Raw(sql).Exec()
  98. sql = "CREATE TABLE IF NOT EXISTS `z_task_data_" + T_task_id + "` ( " +
  99. " `ID` int(11) NOT NULL AUTO_INCREMENT," +
  100. " `t_sn` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL," +
  101. " `t_id` varchar(256) DEFAULT NULL," +
  102. " `t_t` float(6, 1) NULL DEFAULT NULL," +
  103. " `t_rh` float(6, 1) NULL DEFAULT NULL," +
  104. " `t_time` datetime(0) NULL DEFAULT NULL," +
  105. " PRIMARY KEY (`ID`) USING BTREE," +
  106. " KEY `t_sn` (`t_sn`)," +
  107. " KEY `t_id` (`t_id`)," +
  108. " KEY `t_time` (`t_time`)" +
  109. ") ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;"
  110. _, err := o.Raw(sql).Exec()
  111. if err != nil {
  112. return false
  113. }
  114. //sqlIndex := "ALTER TABLE `z_task_data_" + T_task_id + "` add unique index(`t_sn`,`t_id`,`t_time`);"
  115. //logs.Debug(sqlIndex)
  116. //o.Raw(sqlIndex).Exec()
  117. return true
  118. }
  119. // ---------------- 特殊方法 -------------------
  120. // 清空
  121. func Truncate_TaskData(alias_name, T_task_id string) bool {
  122. o := orm2.NewOrmUsingDB(alias_name)
  123. sql := "truncate table z_task_data_" + T_task_id
  124. logs.Println(sql)
  125. _, err := o.Raw(sql).Exec()
  126. if err != nil {
  127. // 数据库表不存在,则创建数据库
  128. if err.(*mysql.MySQLError).Number == 1146 {
  129. CREATE_TaskData(alias_name, T_task_id)
  130. return true
  131. }
  132. logs.Error(lib.FuncName(), err)
  133. return false
  134. }
  135. return true
  136. }
  137. type TaskData_ struct {
  138. ID int `orm:"column(ID);size(100);null"` // ID
  139. T_sn string `orm:"column(t_sn);size(256);null"` // sn
  140. T_id string `orm:"column(t_id);size(256);null"` // 标题
  141. T_t float32 `orm:"column(t_t);size(10);null"` // 温度
  142. T_rh float32 `orm:"column(t_rh);size(10);null"` // 湿度
  143. T_time string `orm:"column(t_times);null;"` // 采集时间
  144. T_Certificate_sn string `orm:"size(256);null"` // 证书编号
  145. }
  146. type TaskDataClass_ struct {
  147. T_sn string `orm:"column(t_sn);size(256);null"` // 标题
  148. T_id string `orm:"column(t_id);size(256);null"` // 名称
  149. T_terminal int
  150. }
  151. type TaskData_AVG struct {
  152. T_t float32 `orm:"column(t_t);size(10);null"` // 温度
  153. T_time string `orm:"column(t_times);null;"` // 采集时间
  154. }
  155. func Read_TaskData_ById_List(T_task_id string, SN string, T_id string, Time_start_ string, Time_end_ string, page int, page_z int) ([]TaskData_, int64) {
  156. o := orm.NewOrm()
  157. var maps []TaskData_
  158. var maps_z []orm2.ParamsList
  159. pagez := page_z
  160. var offset int
  161. if page <= 1 {
  162. offset = 0
  163. } else {
  164. page -= 1
  165. offset = page * pagez
  166. }
  167. sql_condition := ""
  168. if len(Time_start_) > 1 {
  169. sql_condition += " AND t_time >= '" + Time_start_ + "'"
  170. }
  171. if len(Time_end_) > 1 {
  172. sql_condition += " AND t_time <= '" + Time_end_ + "'"
  173. }
  174. if len(T_id) > 0 {
  175. sql_condition += " AND t_id = '" + T_id + "'"
  176. }
  177. if len(SN) > 0 {
  178. sql_condition += " AND t_sn = '" + SN + "'"
  179. }
  180. if len(sql_condition) > 0 {
  181. sql_condition = " WHERE " + strings.TrimLeft(sql_condition, " AND ")
  182. }
  183. sql := "SELECT COUNT(ID) FROM z_task_data_" + T_task_id + sql_condition
  184. fmt.Println(sql)
  185. _, err := o.Raw(sql).ValuesList(&maps_z)
  186. if err != nil {
  187. return maps, 0
  188. }
  189. if len(maps_z) == 0 {
  190. return maps, 0
  191. }
  192. //fmt.Println("maps_z;",maps_z[0][0])
  193. sql = "SELECT ID,t_sn,t_id,t_t,t_rh,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_times,t_time FROM z_task_data_" + T_task_id + sql_condition + " ORDER BY t_time DESC"
  194. if page_z != 9999 {
  195. sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(pagez)
  196. }
  197. fmt.Println(sql)
  198. _, err = o.Raw(sql).QueryRows(&maps)
  199. if err != nil {
  200. logs.Error(lib.FuncName(), err)
  201. }
  202. //value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", cnt), 64)
  203. key, _ := strconv.Atoi(maps_z[0][0].(string))
  204. return maps, int64(key)
  205. }
  206. func Read_TaskData_ById_List_AES(T_task_id string, SN string, T_id string, Time_start_ string, Time_end_ string, page int, page_z int) ([]TaskData_, int64) {
  207. o := orm.NewOrm()
  208. var maps []TaskData_
  209. var maps_z []orm2.ParamsList
  210. pagez := page_z
  211. var offset int
  212. if page <= 1 {
  213. offset = 0
  214. } else {
  215. page -= 1
  216. offset = page * pagez
  217. }
  218. sql_condition := ""
  219. if len(Time_start_) > 1 {
  220. sql_condition += " AND t_time >= '" + Time_start_ + "'"
  221. }
  222. if len(Time_end_) > 1 {
  223. sql_condition += " AND t_time <= '" + Time_end_ + "'"
  224. }
  225. if len(T_id) > 0 {
  226. sql_condition += " AND t_id = '" + T_id + "'"
  227. }
  228. if len(SN) > 0 {
  229. if strings.Contains(SN, "|") {
  230. // 将字符串按 | 分割
  231. ids := strings.Split(strings.TrimSuffix(SN, "|"), "|")
  232. // 构建 SQL 查询
  233. query := " AND t_sn IN ("
  234. // 动态添加每个 id
  235. for i, id := range ids {
  236. query += "'" + id + "'"
  237. if i < len(ids)-1 {
  238. query += ", " // 添加逗号分隔
  239. }
  240. }
  241. query += ") " // 结束 SQL 查询
  242. sql_condition += query
  243. } else {
  244. sql_condition += " AND t_sn = '" + SN + "'"
  245. }
  246. }
  247. if len(sql_condition) > 0 {
  248. sql_condition = " WHERE " + strings.TrimLeft(sql_condition, " AND ")
  249. }
  250. sql := "SELECT COUNT(ID) FROM z_task_data_" + T_task_id + sql_condition
  251. fmt.Println(sql)
  252. _, err := o.Raw(sql).ValuesList(&maps_z)
  253. if err != nil {
  254. return maps, 0
  255. }
  256. if len(maps_z) == 0 {
  257. return maps, 0
  258. }
  259. //fmt.Println("maps_z;",maps_z[0][0])
  260. sql = "SELECT ID,t_sn,t_id,t_t,t_rh,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_times,t_time FROM z_task_data_" + T_task_id + sql_condition + " ORDER BY t_time"
  261. if page_z != 9999 {
  262. sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(pagez)
  263. }
  264. fmt.Println(sql)
  265. _, err = o.Raw(sql).QueryRows(&maps)
  266. if err != nil {
  267. logs.Error(lib.FuncName(), err)
  268. }
  269. //value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", cnt), 64)
  270. key, _ := strconv.Atoi(maps_z[0][0].(string))
  271. return maps, int64(key)
  272. }
  273. func Read_TaskData_ById_List_SQL(T_task_id string, SQL, SN string, T_id string, Time_start_ string, Time_end_ string, page int, page_z int) ([]TaskData_, int64) {
  274. o := orm.NewOrm()
  275. var maps []TaskData_
  276. var maps_z []orm2.ParamsList
  277. pagez := page_z
  278. var offset int
  279. if page <= 1 {
  280. offset = 0
  281. } else {
  282. page -= 1
  283. offset = page * pagez
  284. }
  285. sql_condition := ""
  286. if len(Time_start_) > 1 {
  287. sql_condition += " AND t_time >= '" + Time_start_ + "'"
  288. }
  289. if len(Time_end_) > 1 {
  290. sql_condition += " AND t_time <= '" + Time_end_ + "'"
  291. }
  292. if len(T_id) > 0 {
  293. sql_condition += " AND t_id = '" + T_id + "'"
  294. }
  295. if len(SQL) > 0 {
  296. sql_condition += SQL
  297. }
  298. if len(SN) > 0 {
  299. if strings.Contains(SN, "|") {
  300. // 将字符串按 | 分割
  301. ids := strings.Split(strings.TrimSuffix(SN, "|"), "|")
  302. // 构建 SQL 查询
  303. query := " AND t_sn IN ("
  304. // 动态添加每个 id
  305. for i, id := range ids {
  306. query += "'" + id + "'"
  307. if i < len(ids)-1 {
  308. query += ", " // 添加逗号分隔
  309. }
  310. }
  311. query += ") " // 结束 SQL 查询
  312. sql_condition += query
  313. } else {
  314. sql_condition += " AND t_sn = '" + SN + "'"
  315. }
  316. }
  317. if len(sql_condition) > 0 {
  318. sql_condition = " WHERE " + strings.TrimLeft(sql_condition, " AND ")
  319. }
  320. sql := "SELECT COUNT(ID) FROM z_task_data_" + T_task_id + sql_condition
  321. fmt.Println(sql)
  322. _, err := o.Raw(sql).ValuesList(&maps_z)
  323. if err != nil {
  324. return maps, 0
  325. }
  326. if len(maps_z) == 0 {
  327. return maps, 0
  328. }
  329. //fmt.Println("maps_z;",maps_z[0][0])
  330. sql = "SELECT ID,t_sn,t_id,t_t,t_rh,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_times,t_time FROM z_task_data_" + T_task_id + sql_condition + " ORDER BY t_time"
  331. if page_z != 9999 {
  332. sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(pagez)
  333. }
  334. fmt.Println(sql)
  335. _, err = o.Raw(sql).QueryRows(&maps)
  336. if err != nil {
  337. logs.Error(lib.FuncName(), err)
  338. }
  339. //value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", cnt), 64)
  340. key, _ := strconv.Atoi(maps_z[0][0].(string))
  341. return maps, int64(key)
  342. }
  343. func Read_TaskData_ById_List_(T_task_id string, SN string) []TaskData_ {
  344. o := orm.NewOrm()
  345. var maps []TaskData_
  346. sql_condition := ""
  347. sql_condition += " t_sn ='" + SN + "'"
  348. //fmt.Println("maps_z;",maps_z[0][0])
  349. sql := "SELECT ID,t_sn,t_id,t_t,t_rh,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i') AS t_times,t_time FROM z_task_data_" + T_task_id + " WHERE " + sql_condition + " ORDER BY t_time "
  350. fmt.Println(sql)
  351. _, err := o.Raw(sql).QueryRows(&maps)
  352. if err != nil {
  353. logs.Error(lib.FuncName(), err)
  354. return maps
  355. }
  356. return maps
  357. }
  358. func Read_TaskData_ById_AVG(T_task_id string, SN string, Time_start_ string, Time_end_ string) []TaskData_AVG {
  359. o := orm.NewOrm()
  360. var maps []TaskData_AVG
  361. sql_condition := ""
  362. if len(Time_start_) > 1 {
  363. sql_condition += " AND t_time >= '" + Time_start_ + "'"
  364. }
  365. if len(Time_end_) > 1 {
  366. sql_condition += " AND t_time <= '" + Time_end_ + "'"
  367. }
  368. if len(SN) > 0 {
  369. if strings.Contains(SN, "|") {
  370. // 将字符串按 | 分割
  371. ids := strings.Split(strings.TrimSuffix(SN, "|"), "|")
  372. // 构建 SQL 查询
  373. query := " AND t_sn IN ("
  374. // 动态添加每个 id
  375. for i, id := range ids {
  376. query += "'" + id + "'"
  377. if i < len(ids)-1 {
  378. query += ", " // 添加逗号分隔
  379. }
  380. }
  381. query += ") " // 结束 SQL 查询
  382. sql_condition += query
  383. } else {
  384. sql_condition += " AND t_sn = '" + SN + "'"
  385. }
  386. }
  387. if len(sql_condition) > 0 {
  388. sql_condition = " WHERE " + strings.TrimLeft(sql_condition, " AND ")
  389. }
  390. sql := "SELECT DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_times, AVG(t_t) AS t_t FROM z_task_data_" + T_task_id + sql_condition + " GROUP BY t_time ORDER BY t_time"
  391. fmt.Println(sql)
  392. o.Raw(sql).QueryRows(&maps)
  393. return maps
  394. }
  395. func Read_TaskData_ById_ClassList(T_task_id string) []TaskDataClass_ {
  396. o := orm.NewOrm()
  397. var maps []TaskDataClass_
  398. //fmt.Println("maps_z;",maps_z[0][0])
  399. //sql := "SELECT DISTINCT t_sn,t_id FROM z_task_data_" + T_task_id + " ORDER BY t_id "
  400. //sql := "SELECT DISTINCT t_sn FROM z_task_data_" + T_task_id + " ORDER BY t_id "
  401. sql := "SELECT t_sn,t_id FROM z_task_data_" + T_task_id + " GROUP BY t_sn,t_id ORDER BY t_id+0 "
  402. fmt.Println(sql)
  403. _, err := o.Raw(sql).QueryRows(&maps)
  404. if err != nil {
  405. // 数据库表不存在,则创建数据库
  406. if err.(*mysql.MySQLError).Number == 1146 {
  407. CREATE_TaskData(conf.Local_AliasName, T_task_id)
  408. }
  409. logs.Error(lib.FuncName(), err)
  410. return maps
  411. }
  412. return maps
  413. }
  414. func Read_TaskData_sn(T_task_id string) []TaskDataClass_ {
  415. o := orm.NewOrm()
  416. var maps []TaskDataClass_
  417. sql := "SELECT DISTINCT t_sn FROM z_task_data_" + T_task_id + " ORDER BY t_sn "
  418. fmt.Println(sql)
  419. _, err := o.Raw(sql).QueryRows(&maps)
  420. if err != nil {
  421. logs.Error(lib.FuncName(), err)
  422. return maps
  423. }
  424. return maps
  425. }
  426. func Update_TaskData_ByT_sn(T_task_id, T_sn, T_id string) error {
  427. o := orm.NewOrm()
  428. // 修改id
  429. sql := "UPDATE z_task_data_" + T_task_id + " SET `t_id` = '" + T_id + "' WHERE `t_sn` = '" + T_sn + "'"
  430. logs.Println(sql)
  431. _, err := o.Raw(sql).Exec()
  432. if err != nil {
  433. logs.Error(lib.FuncName(), err)
  434. return err
  435. }
  436. return nil
  437. }
  438. func Delete_TaskData_ByT_sn(T_task_id, T_sn string) error {
  439. o := orm.NewOrm()
  440. // 修改id
  441. sql := "DELETE FROM z_task_data_" + T_task_id + " WHERE `t_sn` = '" + T_sn + "'"
  442. logs.Println(sql)
  443. _, err := o.Raw(sql).Exec()
  444. if err != nil {
  445. logs.Error(lib.FuncName(), err)
  446. return err
  447. }
  448. return nil
  449. }
  450. // 添加
  451. func Add_TaskData(T_task_id string, T_sn string, T_id string, T_t string, T_rh string, T_time string) bool {
  452. o := orm2.NewOrm()
  453. tx, err := o.Begin()
  454. if err != nil {
  455. logs.Error("start the transaction failed")
  456. return false
  457. }
  458. // 开始插入数据
  459. //
  460. //sql := "INSERT INTO z_task_data_" + T_task_id + " (`t_sn`, `t_id`, `t_time`) " +
  461. // "VALUES ('" + T_sn + "', " + T_id + ", '" + T_time + "') " +
  462. // "ON DUPLICATE KEY UPDATE t_t=" + T_t + ", t_rh="+ T_rh +";"
  463. // 去重复数据
  464. sql := "DELETE FROM z_task_data_" + T_task_id + " WHERE " + " t_id = '" + T_id + "' AND " + " t_sn = '" + T_sn + "' " + "AND t_time = '" + T_time + "' "
  465. // 这里有时间优化 用于一次 prepare 多次 exec,以提高批量执行的速度
  466. //fmt.Println(sql)
  467. res, err := tx.Raw(sql).Exec()
  468. if err != nil {
  469. tx.Rollback()
  470. logs.Error(lib.FuncName(), err)
  471. return false
  472. }
  473. res.RowsAffected()
  474. sql = "INSERT INTO z_task_data_" + T_task_id + " (`t_sn`, `t_id`, `t_t`, `t_rh`, `t_time`) " +
  475. "VALUES ('" + T_sn + "', '" + T_id + "', " + T_t + "," + T_rh + ", '" + T_time + "')"
  476. // 更新数据
  477. //sql := "INSERT INTO z_task_data_" + T_task_id + " (`t_sn`, `t_id`, `t_t`, `t_rh`, `t_time`) " +
  478. // "VALUES ('" + T_sn + "', " + T_id + ", " + T_t + "," + T_rh + ", '" + T_time + "')" +
  479. // "on duplicate key update `t_t`=" + T_t + ",`t_rh`=" + T_rh
  480. //fmt.Println(sql)
  481. res, err = tx.Raw(sql).Exec()
  482. if err != nil {
  483. tx.Rollback()
  484. logs.Error(lib.FuncName(), err)
  485. return false
  486. }
  487. tx.Commit()
  488. //fmt.Println("mysql row affected nums: ", num)
  489. return true
  490. }
  491. // 创建唯一索引
  492. func Create_Unique_Index(T_task_id string) error {
  493. // 创建索引
  494. o := orm.NewOrm()
  495. createIndexSql := "ALTER TABLE z_task_data_" + T_task_id + " ADD CONSTRAINT unique_index_t_sn_t_id_t_time UNIQUE (t_sn, t_id, t_time);"
  496. //fmt.Println(sql)
  497. _, err := o.Raw(createIndexSql).Exec()
  498. if err != nil && !strings.Contains(err.Error(), "Duplicate key name 'unique_index_t_sn_t_id_t_time'") {
  499. logs.Error(lib.FuncName(), err)
  500. return err
  501. }
  502. return nil
  503. }
  504. // 删除唯一索引
  505. func Delete_Unique_Index(T_task_id string) error {
  506. // 创建索引
  507. o := orm.NewOrm()
  508. // 删除索引
  509. deleteIndexSql := "ALTER TABLE z_task_data_" + T_task_id + " DROP INDEX unique_index_t_sn_t_id_t_time;"
  510. //fmt.Println(sql)
  511. _, err := o.Raw(deleteIndexSql).Exec()
  512. if err != nil {
  513. logs.Error(lib.FuncName(), err)
  514. return err
  515. }
  516. return nil
  517. }
  518. func Adds_TaskData(T_task_id string, valueStrings []string) error {
  519. o := orm.NewOrm()
  520. // 插入数据
  521. sql := "INSERT INTO z_task_data_" + T_task_id + " (`t_sn`, `t_id`, `t_t`, `t_rh`, `t_time`) VALUES"
  522. sql += strings.Join(valueStrings, ",")
  523. sql += " ON DUPLICATE KEY UPDATE t_t = VALUES(t_t), t_rh = VALUES(t_rh)"
  524. //fmt.Println(sql)
  525. _, err := o.Raw(sql).Exec()
  526. if err != nil {
  527. logs.Error(lib.FuncName(), err)
  528. return err
  529. }
  530. //fmt.Println("mysql row affected nums: ", num)
  531. return nil
  532. }
  533. // 批量添加数据
  534. func Batch_Adds_TaskData(T_task_id string, valueStrings []string) error {
  535. pageSize := 10000 // 每页的条数
  536. totalPages := len(valueStrings) / pageSize // 总页数
  537. // 遍历每一页
  538. for page := 1; page <= totalPages+1; page++ {
  539. // 计算当前页的起始索引和结束索引
  540. startIndex := (page - 1) * pageSize
  541. if startIndex > len(valueStrings) {
  542. startIndex = len(valueStrings)
  543. }
  544. endIndex := page * pageSize
  545. // 边界判断,如果结束索引超过列表长度,则将结束索引设置为列表最后一个元素的索引加一
  546. if endIndex > len(valueStrings) {
  547. endIndex = len(valueStrings)
  548. }
  549. // 获取当前页的数据
  550. currentList := valueStrings[startIndex:endIndex]
  551. err := Adds_TaskData(T_task_id, currentList)
  552. if err != nil {
  553. return err
  554. }
  555. logs.Info(fmt.Sprintf("第%d-%d条数据插入成功", startIndex+1, endIndex))
  556. }
  557. return nil
  558. }
  559. // 修改
  560. func Up_TaskData(T_task_id string, Id string, T_t string, T_rh string, T_time string) bool {
  561. o := orm.NewOrm()
  562. SET_str := " SET "
  563. if len(T_t) > 0 {
  564. SET_str = SET_str + " t_t = " + T_t + " ,"
  565. }
  566. if len(T_rh) > 0 {
  567. SET_str = SET_str + " t_rh = " + T_rh + " ,"
  568. }
  569. if len(T_time) > 0 {
  570. SET_str = SET_str + " t_time = '" + T_time + "' ,"
  571. }
  572. if len(SET_str) > 7 {
  573. SET_str = SET_str[:(len(SET_str) - 1)]
  574. }
  575. // 开始插入数据 UPDATE `cold_verify`.`Z_TaskData_d8qMyeXLzIxn` SET `t_t` = 20.2 WHERE `ID` = 69
  576. sql := "UPDATE z_task_data_" + T_task_id + " " + SET_str + " WHERE ID = " + Id
  577. // 这里有时间优化 用于一次 prepare 多次 exec,以提高批量执行的速度
  578. //fmt.Println(sql)
  579. res, err := o.Raw(sql).Exec()
  580. if err != nil {
  581. logs.Error(lib.FuncName(), err)
  582. return false
  583. }
  584. res.RowsAffected()
  585. //fmt.Println("mysql row affected nums: ", num)
  586. return true
  587. }
  588. // 删除
  589. func Del_TaskData(T_task_id string, Id string) bool {
  590. o := orm.NewOrm()
  591. // 开始插入数据 UPDATE `cold_verify`.`Z_TaskData_d8qMyeXLzIxn` SET `t_t` = 20.2 WHERE `ID` = 69
  592. sql := "DELETE FROM z_task_data_" + T_task_id + " WHERE ID = " + Id
  593. // 这里有时间优化 用于一次 prepare 多次 exec,以提高批量执行的速度
  594. logs.Println(sql)
  595. res, err := o.Raw(sql).Exec()
  596. if err != nil {
  597. logs.Error(lib.FuncName(), err)
  598. return false
  599. }
  600. res.RowsAffected()
  601. //fmt.Println("mysql row affected nums: ", num)
  602. return true
  603. }
  604. func Read_TaskData_ByT_id(T_task_id string, Id string) (t_sn string, err error) {
  605. o := orm.NewOrm()
  606. // 开始插入数据 UPDATE `cold_verify`.`Z_TaskData_d8qMyeXLzIxn` SET `t_t` = 20.2 WHERE `ID` = 69
  607. sql := "SELECT t_sn FROM z_task_data_" + T_task_id + " WHERE t_id = '" + Id + "'"
  608. // 这里有时间优化 用于一次 prepare 多次 exec,以提高批量执行的速度
  609. logs.Println(sql)
  610. err = o.Raw(sql).QueryRow(&t_sn)
  611. if err != nil {
  612. logs.Error(lib.FuncName(), err)
  613. return t_sn, err
  614. }
  615. //fmt.Println("mysql row affected nums: ", num)
  616. return t_sn, err
  617. }
  618. func Read_TaskData_ByT_sn(T_task_id string, sn string) (t_id string, err error) {
  619. o := orm.NewOrm()
  620. // 开始插入数据 UPDATE `cold_verify`.`Z_TaskData_d8qMyeXLzIxn` SET `t_t` = 20.2 WHERE `ID` = 69
  621. sql := "SELECT t_id FROM z_task_data_" + T_task_id + " WHERE t_sn = '" + sn + "'"
  622. // 这里有时间优化 用于一次 prepare 多次 exec,以提高批量执行的速度
  623. logs.Println(sql)
  624. err = o.Raw(sql).QueryRow(&t_id)
  625. if err != nil {
  626. logs.Error(lib.FuncName(), err)
  627. return t_id, err
  628. }
  629. //fmt.Println("mysql row affected nums: ", num)
  630. return t_id, err
  631. }
  632. // 添加
  633. func Del_TaskData_t_id(T_task_id string, Id string) bool {
  634. o := orm.NewOrm()
  635. // 开始插入数据 UPDATE `cold_verify`.`Z_TaskData_d8qMyeXLzIxn` SET `t_t` = 20.2 WHERE `ID` = 69
  636. sql := "DELETE FROM z_task_data_" + T_task_id + " WHERE t_id = '" + Id + "'"
  637. // 这里有时间优化 用于一次 prepare 多次 exec,以提高批量执行的速度
  638. logs.Println(sql)
  639. res, err := o.Raw(sql).Exec()
  640. if err != nil {
  641. logs.Error(lib.FuncName(), err)
  642. return false
  643. }
  644. res.RowsAffected()
  645. //fmt.Println("mysql row affected nums: ", num)
  646. return true
  647. }
  648. // 检查导出表总数
  649. func Check_TaskData_Num(T_task_id string) bool {
  650. o1 := orm2.NewOrmUsingDB(conf.Local_AliasName)
  651. o2 := orm2.NewOrmUsingDB(conf.Server_AliasName)
  652. var maps_z1, maps_z2 []orm2.ParamsList
  653. sql := "SELECT COUNT(ID) FROM z_task_data_" + T_task_id
  654. fmt.Println(sql)
  655. _, err := o1.Raw(sql).ValuesList(&maps_z1)
  656. if err != nil {
  657. return false
  658. }
  659. _, err = o2.Raw(sql).ValuesList(&maps_z2)
  660. if err != nil {
  661. return false
  662. }
  663. if len(maps_z1) != len(maps_z2) {
  664. return false
  665. }
  666. return true
  667. }
  668. // 检查导出表总数
  669. func Check_TaskData_Num_Verify1(T_task_id string) bool {
  670. o1 := orm2.NewOrmUsingDB(conf.Local_AliasName)
  671. o2 := orm2.NewOrmUsingDB(conf.Verify1_AliasName)
  672. var maps_z1, maps_z2 []orm2.ParamsList
  673. sql := "SELECT COUNT(ID) FROM z_task_data_" + strings.ToLower(T_task_id)
  674. fmt.Println(sql)
  675. _, err := o1.Raw(sql).ValuesList(&maps_z1)
  676. if err != nil {
  677. return false
  678. }
  679. sql2 := "SELECT COUNT(ID) FROM Z_TaskData_" + T_task_id
  680. _, err = o2.Raw(sql2).ValuesList(&maps_z2)
  681. if err != nil {
  682. return false
  683. }
  684. if len(maps_z1) != len(maps_z2) {
  685. return false
  686. }
  687. return true
  688. }
  689. func Read_TaskData_Num(T_task_id string) int {
  690. o1 := orm2.NewOrmUsingDB(conf.Local_AliasName)
  691. var maps_z []orm2.ParamsList
  692. sql := "SELECT COUNT(ID) FROM z_task_data_" + T_task_id
  693. fmt.Println(sql)
  694. _, err := o1.Raw(sql).ValuesList(&maps_z)
  695. if err != nil {
  696. logs.Error(lib.FuncName(), err)
  697. return 0
  698. }
  699. key, _ := strconv.Atoi(maps_z[0][0].(string))
  700. return key
  701. }
  702. func Dump_TaskData(T_task_id, root, password, url_port, database, sql_file string) (string, error) {
  703. // url_port 127.0.0.1:3306
  704. // mysql8.0 以上加 --column-statistics=0
  705. // mysqldump --column-statistics=0 -uroot -proot -h127.0.0.1 -P3306 cold_verify Z_TaskData_ixEfo5zk2Oeb > /Data/Z_TaskData_ixEfo5zk2Oeb.sql
  706. v := Read_Local_Mysql_Version()
  707. host_port := strings.Split(url_port, ":")
  708. table_name := "z_task_data_" + T_task_id
  709. org := "mysqldump "
  710. if v >= 8 {
  711. org += "--column-statistics=0 "
  712. }
  713. //--no-create-info 只导出数据,而不添加 CREATE TABLE 语句。
  714. //--single-transaction 在备份库的时候并不锁定数据表
  715. //--add-locks:在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(默认为打开状态,使用--skip-add-locks取消选项)
  716. //--compact:压缩模式,产生更少的输出;
  717. org = org + fmt.Sprintf("-u%s -p%s -h%s -P%s --no-create-info --set-gtid-purged=OFF --skip-add-locks --compact --quick %s %s > %s ",
  718. root, password, host_port[0], host_port[1], database, table_name, sql_file)
  719. logs.Println(org)
  720. _, err := lib.Command(org)
  721. if err != nil {
  722. logs.Error(lib.FuncName(), err)
  723. }
  724. return org, err
  725. }
  726. func Dump_TaskData_Verify(T_task_id, root, password, url_port, database, sql_file string) (string, error) {
  727. // url_port 127.0.0.1:3306
  728. // mysql8.0 以上加 --column-statistics=0
  729. // mysqldump --column-statistics=0 -uroot -proot -h127.0.0.1 -P3306 cold_verify Z_TaskData_ixEfo5zk2Oeb > /Data/Z_TaskData_ixEfo5zk2Oeb.sql
  730. v := Read_Local_Mysql_Version()
  731. host_port := strings.Split(url_port, ":")
  732. table_name := "Z_TaskData_" + T_task_id
  733. org := "mysqldump "
  734. if v >= 8 {
  735. org += "--column-statistics=0 "
  736. }
  737. //--no-create-info 只导出数据,而不添加 CREATE TABLE 语句。
  738. //--single-transaction 在备份库的时候并不锁定数据表
  739. //--add-locks:在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(默认为打开状态,使用--skip-add-locks取消选项)
  740. //--compact:压缩模式,产生更少的输出;
  741. org = org + fmt.Sprintf("-u%s -p%s -h%s -P%s --no-create-info --set-gtid-purged=OFF --skip-add-locks --compact --quick %s %s > %s ",
  742. root, password, host_port[0], host_port[1], database, table_name, sql_file)
  743. logs.Println(org)
  744. _, err := lib.Command(org)
  745. if err != nil {
  746. logs.Error(lib.FuncName(), err)
  747. }
  748. return org, err
  749. }
  750. func Insert_TaskData(root, password, url_port, database, sql_file string) (string, error) {
  751. // url_port 127.0.0.1:3306
  752. // mysql -u root -p root -h127.0.0.1 -P3306 cold_verify_local < /data/Z_TaskData_ixEfo5zk2Oeb.sql
  753. host_port := strings.Split(url_port, ":")
  754. org := fmt.Sprintf("mysql -u%s -p%s -h%s -P%s %s < %s",
  755. root, password, host_port[0], host_port[1], database, sql_file)
  756. logs.Println(org)
  757. _, err := lib.Command(org)
  758. if err != nil {
  759. logs.Error(lib.FuncName(), err)
  760. }
  761. return org, err
  762. }
  763. func Read_Local_Mysql_Version() int {
  764. o := orm2.NewOrmUsingDB(conf.Local_AliasName)
  765. var params []orm2.Params
  766. o.Raw("select version();").Values(&params)
  767. version, _ := strconv.Atoi(params[0]["version()"].(string)[0:1])
  768. return version
  769. }
  770. func Import_TaskData(T_task_id string, offset, pagez int) bool {
  771. var maps []TaskData_
  772. serverOrm := orm2.NewOrmUsingDB(conf.Server_AliasName)
  773. localOrm := orm2.NewOrmUsingDB(conf.Local_AliasName)
  774. tb_name := "z_task_data_" + T_task_id
  775. // 开从先上版查询数据
  776. sql := "select `ID`, `t_sn`, `t_id`, `t_t`, `t_rh`, DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_times from " + tb_name + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(pagez)
  777. logs.Println(sql)
  778. _, err := serverOrm.Raw(sql).QueryRows(&maps)
  779. if err != nil {
  780. logs.Error(lib.FuncName(), err)
  781. return false
  782. }
  783. values := []string{}
  784. for _, row := range maps {
  785. // 处理数据
  786. values = append(values, fmt.Sprintf("('%s',%d,%v,%v,'%s')", row.T_sn, row.T_id, row.T_t, row.T_rh, row.T_time))
  787. }
  788. // 向本地版插入数据
  789. sql = "INSERT IGNORE INTO " + tb_name + "( `t_sn`, `t_id`, `t_t`, `t_rh`, `t_time`) VALUES " + strings.Join(values, ",")
  790. //logs.Println(sql)
  791. _, err = localOrm.Raw(sql).Exec()
  792. if err != nil {
  793. logs.Error(lib.FuncName(), err)
  794. return false
  795. }
  796. return true
  797. }
  798. // InsertTaskData 添加设备数据
  799. func InsertTaskData(T_task_id string, d TaskData_) {
  800. o := orm.NewOrm()
  801. var maps TaskData_
  802. sql := fmt.Sprintf("SELECT * FROM z_task_data_%s where t_time='%s' and t_id = '%s' and t_sn = '%s'", T_task_id, d.T_time, d.T_id, d.T_sn)
  803. err := o.Raw(sql).QueryRow(&maps)
  804. if err != nil && err.Error() != orm.ErrNoRows.Error() {
  805. logs.Error(lib.FuncName(), err)
  806. }
  807. // 添加
  808. if maps.ID == 0 {
  809. sqlStatement := fmt.Sprintf("insert into z_task_data_%s(t_sn, t_id, t_t, t_rh, t_time) value('%s','%s',%f,%f,'%s')", T_task_id, d.T_sn, d.T_id, d.T_t, d.T_rh, d.T_time)
  810. _, err = o.Raw(sqlStatement).Exec()
  811. if err != nil {
  812. logs.Error(lib.FuncName(), err)
  813. }
  814. return
  815. }
  816. //已经存在该条目,更新
  817. sqlStatement := fmt.Sprintf("update z_task_data_%s set t_t = %f,t_rh = %f where t_time= '%s' and t_id = '%s' and t_sn = '%s'", T_task_id, d.T_t, d.T_rh, d.T_time, d.T_id, d.T_sn)
  818. _, err = o.Raw(sqlStatement).Exec()
  819. if err != nil {
  820. logs.Error(lib.FuncName(), err)
  821. }
  822. }
  823. // InsertTaskData 添加设备数据
  824. func InsertTaskData_TH(T_task_id string, T_switch_t, T_switch_h bool, d TaskData_) {
  825. o := orm.NewOrm()
  826. var maps TaskData_
  827. sql := fmt.Sprintf("SELECT * FROM z_task_data_%s where t_time='%s' and t_id = '%s' and t_sn = '%s'", T_task_id, d.T_time, d.T_id, d.T_sn)
  828. err := o.Raw(sql).QueryRow(&maps)
  829. if err != nil && err.Error() != orm.ErrNoRows.Error() {
  830. logs.Error(lib.FuncName(), err)
  831. }
  832. // 添加
  833. if maps.ID == 0 {
  834. sqlStatement := fmt.Sprintf("insert into z_task_data_%s(t_sn, t_id, t_t, t_rh, t_time) value('%s','%s',%f,%f,'%s')", T_task_id, d.T_sn, d.T_id, d.T_t, d.T_rh, d.T_time)
  835. _, err = o.Raw(sqlStatement).Exec()
  836. if err != nil {
  837. logs.Error(lib.FuncName(), err)
  838. }
  839. return
  840. }
  841. //已经存在该条目,更新
  842. sqlStatement := fmt.Sprintf("update z_task_data_%s set t_t = %f,t_rh = %f where t_time= '%s' and t_id = '%s' and t_sn = '%s'", T_task_id, d.T_t, d.T_rh, d.T_time, d.T_id, d.T_sn)
  843. if T_switch_t && !T_switch_h {
  844. sqlStatement = fmt.Sprintf("update z_task_data_%s set t_t = %f where t_time= '%s' and t_id = '%s' and t_sn = '%s'", T_task_id, d.T_t, d.T_time, d.T_id, d.T_sn)
  845. }
  846. if !T_switch_t && T_switch_h {
  847. sqlStatement = fmt.Sprintf("update z_task_data_%s set t_rh = %f where t_time= '%s' and t_id = '%s' and t_sn = '%s'", T_task_id, d.T_rh, d.T_time, d.T_id, d.T_sn)
  848. }
  849. _, err = o.Raw(sqlStatement).Exec()
  850. if err != nil {
  851. logs.Error(lib.FuncName(), err)
  852. }
  853. }
  854. // DeleteTaskDataByTimeRange 删除时间范围内的数据
  855. func DeleteTaskDataByTimeRange(T_task_id, sn string, id string, startTime, endTime string) {
  856. sqlStatement := fmt.Sprintf("delete from z_task_data_%s where t_id = '%s' and t_sn = '%s'", T_task_id, id, sn)
  857. if len(startTime) > 0 && len(endTime) > 0 {
  858. sqlStatement += " AND t_time BETWEEN '" + startTime + "' AND '" + endTime + "'"
  859. }
  860. o := orm.NewOrm()
  861. exec, err := o.Raw(sqlStatement).Exec()
  862. if err != nil {
  863. fmt.Println(err.Error())
  864. }
  865. affected, _ := exec.RowsAffected()
  866. logs.Println(fmt.Sprintf("从 %s - %s 时间段删除了%d条数据", startTime, endTime, affected))
  867. }
  868. // UpdateTaskDataTemperatureAndHumidityRandom 随机更新
  869. func UpdateTaskDataTemperatureAndHumidityRandom(T_task_id, sn, id, startTime, endTime string, ttMax, ttMin, trhMax, trhMin int) {
  870. //sql语句
  871. sqlStatement := fmt.Sprintf("update z_task_data_%s set t_t = t_t + FLOOR(%d + RAND() * (%d - %d + 1)) /100.0, t_rh = t_rh + FLOOR(%d + RAND() * (%d - %d + 1)) /100.0 where t_time BETWEEN '%s' AND '%s' and t_id = '%s' and t_sn = '%s'", T_task_id, ttMin, ttMax, ttMin, trhMin, trhMax, trhMin, startTime, endTime, id, sn)
  872. o := orm.NewOrm()
  873. exec, err := o.Raw(sqlStatement).Exec()
  874. if err != nil {
  875. fmt.Println("执行错误:", sqlStatement)
  876. }
  877. affected, _ := exec.RowsAffected()
  878. fmt.Println("执行更新行数:", affected)
  879. }
  880. // UpdateTaskDataTemperatureAndHumidity 更新设备探头数据温湿度 固定偏移
  881. func UpdateTaskDataTemperatureAndHumidity(T_task_id, sn, id, startTime, endTime string, temperature, humidity float64) {
  882. sqlStatement := fmt.Sprintf("update z_task_data_%s set t_t = t_t + %f , t_rh = t_rh + %f where t_id = '%s' and t_sn = '%s' ", T_task_id, temperature, humidity, id, sn)
  883. if len(startTime) > 0 && len(endTime) > 0 {
  884. sqlStatement += " AND t_time BETWEEN '" + startTime + "' AND '" + endTime + "'"
  885. }
  886. o := orm.NewOrm()
  887. exec, err := o.Raw(sqlStatement).Exec()
  888. if err != nil {
  889. fmt.Println(err.Error())
  890. }
  891. affected, err := exec.RowsAffected()
  892. if err != nil {
  893. fmt.Println(err.Error())
  894. }
  895. fmt.Printf("影响了%d行\n", affected)
  896. }
  897. // UpdateTaskData 更新设备探头数据
  898. func UpdateTaskData(T_task_id, sn, id string, old, newO TaskData_) {
  899. sqlStatement := fmt.Sprintf("update z_task_data_%s set t_t = %f , t_rh = %f where t_sn = '%s' and t_id = '%s' and t_t = %f and t_rh = %f and t_time= '%s'", T_task_id, newO.T_t, newO.T_rh, sn, id, old.T_t, old.T_rh, old.T_time)
  900. fmt.Println("执行SQL:", sqlStatement)
  901. o := orm.NewOrm()
  902. exec, err := o.Raw(sqlStatement).Exec()
  903. if err != nil {
  904. fmt.Println("执行错误:", sqlStatement, err.Error())
  905. }
  906. affected, _ := exec.RowsAffected()
  907. fmt.Println("执行更新行数:", affected)
  908. }
  909. // 查询温度最小值 最大值
  910. func Read_TaskData_T_Min_Max(T_task_id string, SN string, T_id string, Time_start_ string, Time_end_ string) (minT, maxT float64) {
  911. o := orm.NewOrm()
  912. sql_condition := ""
  913. if len(Time_start_) > 1 {
  914. sql_condition += " AND t_time >= '" + Time_start_ + "'"
  915. }
  916. if len(Time_end_) > 1 {
  917. sql_condition += " AND t_time <= '" + Time_end_ + "'"
  918. }
  919. if len(T_id) > 0 {
  920. sql_condition += " AND t_id = '" + T_id + "'"
  921. }
  922. if len(SN) > 0 {
  923. sql_condition += " AND t_sn = '" + SN + "'"
  924. }
  925. if len(sql_condition) > 0 {
  926. sql_condition = " WHERE " + strings.TrimLeft(sql_condition, " AND ")
  927. }
  928. //fmt.Println("maps_z;",maps_z[0][0])
  929. sql := "SELECT MIN(t_t) AS min_t, MAX(t_t) AS max_t FROM z_task_data_" + T_task_id + sql_condition
  930. fmt.Println(sql)
  931. err := o.Raw(sql).QueryRow(&minT, &maxT)
  932. if err != nil {
  933. logs.Error(lib.FuncName(), err)
  934. }
  935. return
  936. }
  937. // UpdateTaskDataTemperatureAndHumidityByGeometric 更新设备探头数据温湿度 等比缩放
  938. func UpdateTaskDataTemperatureAndHumidityByGeometric(T_task_id, sn, id, startTime, endTime string, temperature, humidity float64) {
  939. sqlStatement := fmt.Sprintf("update z_task_data_%s set t_t = t_t * %f , t_rh = t_rh * %f where t_id = '%s' and t_sn = '%s' ", T_task_id, temperature, humidity, id, sn)
  940. if len(startTime) > 0 && len(endTime) > 0 {
  941. sqlStatement += " AND t_time BETWEEN '" + startTime + "' AND '" + endTime + "'"
  942. }
  943. o := orm.NewOrm()
  944. exec, err := o.Raw(sqlStatement).Exec()
  945. if err != nil {
  946. fmt.Println(err.Error())
  947. }
  948. affected, err := exec.RowsAffected()
  949. if err != nil {
  950. fmt.Println(err.Error())
  951. }
  952. fmt.Printf("影响了%d行\n", affected)
  953. }
  954. func UpdateTaskDataTemperatureAndHumidityByGeometric_id(T_task_id, id, startTime, endTime string, compress float64) {
  955. sqlStatement := fmt.Sprintf("update z_task_data_%s set t_t = t_t * %f where t_id = '%s' ", T_task_id, compress, id)
  956. if len(startTime) > 0 && len(endTime) > 0 {
  957. sqlStatement += " AND t_time BETWEEN '" + startTime + "' AND '" + endTime + "'"
  958. }
  959. o := orm.NewOrm()
  960. exec, err := o.Raw(sqlStatement).Exec()
  961. if err != nil {
  962. fmt.Println(err.Error())
  963. }
  964. affected, err := exec.RowsAffected()
  965. if err != nil {
  966. fmt.Println(err.Error())
  967. }
  968. fmt.Printf("影响了%d行\n", affected)
  969. }
  970. // UpdateTaskDataTemperatureAndHumidityByGeometric 更新设备探头数据温湿度 偏移
  971. func UpdateTaskDataTemperatureAndHumidityByGeometricAVG(T_task_id, id, startTime, endTime string, temperature float64) {
  972. sqlStatement := ""
  973. if temperature > 0 {
  974. sqlStatement = fmt.Sprintf("update z_task_data_%s set t_t = t_t + %f where t_id = '%s' ", T_task_id, temperature, id)
  975. } else {
  976. sqlStatement = fmt.Sprintf("update z_task_data_%s set t_t = t_t %f where t_id = '%s' ", T_task_id, temperature, id)
  977. }
  978. if len(startTime) > 0 && len(endTime) > 0 {
  979. sqlStatement += " AND t_time BETWEEN '" + startTime + "' AND '" + endTime + "'"
  980. }
  981. o := orm.NewOrm()
  982. exec, err := o.Raw(sqlStatement).Exec()
  983. if err != nil {
  984. fmt.Println(err.Error())
  985. }
  986. affected, err := exec.RowsAffected()
  987. if err != nil {
  988. fmt.Println(err.Error())
  989. }
  990. fmt.Printf("影响了%d行\n", affected)
  991. }
  992. func Read_TaskData_T_Min_Max_Time_Min_Max(T_task_id string, SN []string, T_id []string, Time_start_ string, Time_end_ string) (minT, maxT float64, minTime, maxTime time.Time) {
  993. o := orm.NewOrm()
  994. sql_condition := ""
  995. if len(Time_start_) > 1 {
  996. sql_condition += " AND t_time >= '" + Time_start_ + "'"
  997. }
  998. if len(Time_end_) > 1 {
  999. sql_condition += " AND t_time <= '" + Time_end_ + "'"
  1000. }
  1001. if len(T_id) > 0 || len(SN) > 0 {
  1002. sql_condition += " AND t_id in (" + strings.Join(T_id, ",") + ") OR t_sn in (" + strings.Join(SN, ",") + ")"
  1003. }
  1004. if len(sql_condition) > 0 {
  1005. sql_condition = " WHERE " + strings.TrimLeft(sql_condition, " AND ")
  1006. }
  1007. //fmt.Println("maps_z;",maps_z[0][0])
  1008. sql := "SELECT MIN(t_t) AS min_t, MAX(t_t) AS max_t,MIN(t_time) AS min_time, MAX(t_time) AS max_time FROM z_task_data_" + T_task_id + sql_condition
  1009. fmt.Println(sql)
  1010. err := o.Raw(sql).QueryRow(&minT, &maxT, &minTime, &maxTime)
  1011. if err != nil {
  1012. logs.Error(lib.FuncName(), err)
  1013. }
  1014. return
  1015. }
  1016. // 获取线上设备数据
  1017. func Read_DeviceData_T_Min_Max_Time_Min_Max(T_sn, T_id string, Time_start_ string, Time_end_ string) (minT, maxT float64, minTime, maxTime time.Time) {
  1018. o := orm2.NewOrmUsingDB(conf.Server_AliasName)
  1019. sql_condition := ""
  1020. if len(Time_start_) > 1 {
  1021. sql_condition += " AND t_time >= '" + Time_start_ + "'"
  1022. }
  1023. if len(Time_end_) > 1 {
  1024. sql_condition += " AND t_time <= '" + Time_end_ + "'"
  1025. }
  1026. sql_condition += " AND t_id = '" + T_id + "'"
  1027. if len(sql_condition) > 0 {
  1028. sql_condition = " WHERE " + strings.TrimLeft(sql_condition, " AND ")
  1029. }
  1030. //fmt.Println("maps_z;",maps_z[0][0])
  1031. sql := "SELECT MIN(t_t) AS min_t, MAX(t_t) AS max_t,MIN(t_time) AS min_time, MAX(t_time) AS max_time FROM z_devicedata_" + T_sn + sql_condition
  1032. fmt.Println(sql)
  1033. err := o.Raw(sql).QueryRow(&minT, &maxT, &minTime, &maxTime)
  1034. if err != nil {
  1035. logs.Error(lib.FuncName(), err)
  1036. }
  1037. return
  1038. }
  1039. func Read_TaskData_ByIds_List(T_task_id string, SN []string, T_id []string, Time_start_ string, Time_end_ string) []TaskData {
  1040. o := orm.NewOrm()
  1041. var maps []TaskData
  1042. sql_condition := ""
  1043. if len(Time_start_) > 1 {
  1044. sql_condition += " AND t_time >= '" + Time_start_ + "'"
  1045. }
  1046. if len(Time_end_) > 1 {
  1047. sql_condition += " AND t_time <= '" + Time_end_ + "'"
  1048. }
  1049. if len(T_id) > 0 || len(SN) > 0 {
  1050. sql_condition += " AND (t_id in (" + strings.Join(T_id, ",") + ") OR t_sn in (" + strings.Join(SN, ",") + "))"
  1051. }
  1052. if len(sql_condition) > 0 {
  1053. sql_condition = " WHERE " + strings.TrimLeft(sql_condition, " AND ")
  1054. }
  1055. //fmt.Println("maps_z;",maps_z[0][0])
  1056. sql := "SELECT ID,t_sn,t_id,t_t,t_rh,t_time FROM z_task_data_" + T_task_id + sql_condition + " ORDER BY t_time"
  1057. fmt.Println(sql)
  1058. _, err := o.Raw(sql).QueryRows(&maps)
  1059. if err != nil {
  1060. logs.Error(lib.FuncName(), err)
  1061. }
  1062. return maps
  1063. }
  1064. func Read_TaskData_T_Min_Max_Time_Min_Max_ListGROUP(T_task_id string, SN string, Time_start_ string, Time_end_ string) []TaskData_Time_Min_Max_GROUP {
  1065. o := orm.NewOrm()
  1066. var maps_Time_Min_Max_GROUP []TaskData_Time_Min_Max_GROUP
  1067. 时间_a, _ := time.Parse("2006-01-02 15:04:05", Time_start_)
  1068. 时间_b, _ := time.Parse("2006-01-02 15:04:05", Time_end_)
  1069. for 时间_a.Unix() <= 时间_b.Unix() {
  1070. var maps []TaskData_
  1071. maps_Time_Min_Max_GROUP_ := TaskData_Time_Min_Max_GROUP{
  1072. T_max: -100,
  1073. T_min: 100,
  1074. T_times: 时间_a.Format("2006-01-02 15:04:05"),
  1075. }
  1076. sql_condition := ""
  1077. Time_start_ = 时间_a.Format("2006-01-02 15:04:05")
  1078. Time_end_ = 时间_b.Format("2006-01-02 15:04:05")
  1079. if len(Time_start_) > 1 {
  1080. sql_condition += " AND t_time >= '" + Time_start_ + "'"
  1081. }
  1082. if len(Time_end_) > 1 {
  1083. sql_condition += " AND t_time <= '" + Time_end_ + "'"
  1084. }
  1085. if len(SN) > 0 {
  1086. if strings.Contains(SN, "|") {
  1087. // 将字符串按 | 分割
  1088. ids := strings.Split(strings.TrimSuffix(SN, "|"), "|")
  1089. // 构建 SQL 查询
  1090. query := " AND t_sn IN ("
  1091. // 动态添加每个 id
  1092. for i, id := range ids {
  1093. query += "'" + id + "'"
  1094. if i < len(ids)-1 {
  1095. query += ", " // 添加逗号分隔
  1096. }
  1097. }
  1098. query += ") " // 结束 SQL 查询
  1099. sql_condition += query
  1100. } else {
  1101. sql_condition += " AND t_sn = '" + SN + "'"
  1102. }
  1103. }
  1104. if len(sql_condition) > 0 {
  1105. sql_condition = " WHERE " + strings.TrimLeft(sql_condition, " AND ")
  1106. }
  1107. //fmt.Println("maps_z;",maps_z[0][0])
  1108. sql := "SELECT ID,t_sn,t_id,t_t,t_rh,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_times,t_time FROM z_task_data_" + T_task_id + sql_condition + " ORDER BY t_time DESC"
  1109. fmt.Println(sql)
  1110. _, err := o.Raw(sql).QueryRows(&maps)
  1111. if err != nil {
  1112. logs.Error(lib.FuncName(), err)
  1113. }
  1114. for _, data := range maps {
  1115. if data.T_t > maps_Time_Min_Max_GROUP_.T_max {
  1116. maps_Time_Min_Max_GROUP_.T_max = data.T_t
  1117. maps_Time_Min_Max_GROUP_.T_max_id = data.T_id
  1118. }
  1119. if data.T_t < maps_Time_Min_Max_GROUP_.T_max {
  1120. maps_Time_Min_Max_GROUP_.T_min = data.T_t
  1121. maps_Time_Min_Max_GROUP_.T_min_id = data.T_id
  1122. }
  1123. }
  1124. maps_Time_Min_Max_GROUP = append(maps_Time_Min_Max_GROUP, maps_Time_Min_Max_GROUP_)
  1125. 时间_a = 时间_a.Add(time.Minute * 10)
  1126. }
  1127. return maps_Time_Min_Max_GROUP
  1128. }
  1129. // 按照 t_id 分组数据
  1130. func GroupDataByTID(data []TaskData_) map[string][]TaskData_ {
  1131. groupedData := make(map[string][]TaskData_)
  1132. for _, d := range data {
  1133. groupedData[d.T_id] = append(groupedData[d.T_id], d)
  1134. }
  1135. return groupedData
  1136. }
  1137. // 删除的重复数据
  1138. func DeleteDeduplicate(T_task_id string) (int64, error) {
  1139. localOrm := orm2.NewOrmUsingDB(conf.Local_AliasName)
  1140. tb_name := "z_task_data_" + T_task_id
  1141. var cnt int64
  1142. // 创建临时表
  1143. sqlCreate := "CREATE TABLE `tmp_table` AS (SELECT MIN(`ID`) AS `min_id` FROM " + tb_name + " GROUP BY `t_sn`,`t_id`,`t_time`);"
  1144. _, err := localOrm.Raw(sqlCreate).Exec()
  1145. if err != nil {
  1146. logs.Error(lib.FuncName(), err)
  1147. return cnt, err
  1148. }
  1149. sqlDelete := "DELETE FROM " + tb_name + " WHERE `ID` NOT IN (SELECT `min_id` FROM `tmp_table`);"
  1150. res, err := localOrm.Raw(sqlDelete).Exec()
  1151. if err != nil {
  1152. logs.Error(lib.FuncName(), err)
  1153. return cnt, err
  1154. }
  1155. cnt, _ = res.RowsAffected()
  1156. sqlDrop := "DROP TABLE `tmp_table`;"
  1157. _, err = localOrm.Raw(sqlDrop).Exec()
  1158. if err != nil {
  1159. logs.Error(lib.FuncName(), err)
  1160. return cnt, err
  1161. }
  1162. return cnt, nil
  1163. }
  1164. func CheckTableExist(alias_name, T_task_id string) bool {
  1165. o := orm2.NewOrmUsingDB(alias_name)
  1166. sql := "select count(ID) from z_task_data_" + T_task_id
  1167. _, err := o.Raw(sql).Exec()
  1168. if err != nil {
  1169. // 数据库表不存在,则创建数据库
  1170. logs.Error(lib.FuncName(), err)
  1171. if err.(*mysql.MySQLError).Number == 1146 {
  1172. return false
  1173. }
  1174. }
  1175. return true
  1176. }
  1177. // 修改auto_increment的初始值
  1178. func UpdateAUTO_INCREMENT(alias_name, T_task_id string) error {
  1179. o := orm2.NewOrmUsingDB(alias_name)
  1180. var max_id int
  1181. sql := "select max(ID) from z_task_data_" + T_task_id
  1182. err := o.Raw(sql).QueryRow(&max_id)
  1183. if err != nil {
  1184. logs.Error(lib.FuncName(), err)
  1185. return err
  1186. }
  1187. // ALTER TABLE z_task_data_lg9v2zpfem7b AUTO_INCREMENT = 39905;
  1188. sql = "ALTER TABLE z_task_data_" + T_task_id + " AUTO_INCREMENT = " + strconv.Itoa(max_id+1)
  1189. _, err = o.Raw(sql).Exec()
  1190. if err != nil {
  1191. logs.Error(lib.FuncName(), err)
  1192. return err
  1193. }
  1194. return nil
  1195. }
  1196. // 修改auto_increment的初始值
  1197. func Read_TaskData_AVG(T_task_id, T_sn, T_id, startTime, endTime string) float64 {
  1198. o := orm.NewOrm()
  1199. var v float64
  1200. sql := fmt.Sprintf("select AVG(t_t) FROM z_task_data_%s where t_id = '%s' and t_time BETWEEN '%s' and '%s'", T_task_id, T_id, startTime, endTime)
  1201. err := o.Raw(sql).QueryRow(&v)
  1202. if err != nil {
  1203. logs.Error(lib.FuncName(), err)
  1204. return 0
  1205. }
  1206. return v
  1207. }
  1208. // 修改auto_increment的初始值
  1209. func Read_TaskData_max(T_task_id, T_sn, T_id, startTime, endTime string) float64 {
  1210. o := orm.NewOrm()
  1211. var v float64
  1212. sql := fmt.Sprintf("select MAX(t_t) FROM z_task_data_%s where t_id = '%s' and t_time BETWEEN '%s' and '%s'", T_task_id, T_id, startTime, endTime)
  1213. err := o.Raw(sql).QueryRow(&v)
  1214. if err != nil {
  1215. logs.Error(lib.FuncName(), err)
  1216. return 0
  1217. }
  1218. return v
  1219. }
  1220. // 修改auto_increment的初始值
  1221. func Read_TaskData_min(T_task_id, T_sn, T_id, startTime, endTime string) float64 {
  1222. o := orm.NewOrm()
  1223. var v float64
  1224. sql := fmt.Sprintf("select MIN(t_t) FROM z_task_data_%s where t_id = '%s' and t_time BETWEEN '%s' and '%s'", T_task_id, T_id, startTime, endTime)
  1225. err := o.Raw(sql).QueryRow(&v)
  1226. if err != nil {
  1227. logs.Error(lib.FuncName(), err)
  1228. return 0
  1229. }
  1230. return v
  1231. }
  1232. // 重置 SN数据
  1233. func Import_TaskData_Back(Sn string, T_id string, T_task_id string, Time_start string, Time_end string) error {
  1234. o := orm.NewOrm()
  1235. // 开始插入数据
  1236. sql := "insert into z_task_data_" + T_task_id + "(t_sn,t_id,t_t,t_rh,t_time) select '" + Sn + "','" + T_id + "',t_t,t_rh,t_time from z_devicedata_" + Sn
  1237. if len(Time_start) > 0 && len(Time_end) > 0 {
  1238. sql = sql + " WHERE t_time >= '" + Time_start + "' AND t_time <= '" + Time_end + "'"
  1239. }
  1240. logs.Println(sql)
  1241. _, err := o.Raw(sql).Exec()
  1242. if err != nil {
  1243. logs.Error(lib.FuncName(), err)
  1244. return err
  1245. }
  1246. return nil
  1247. }
  1248. func Import_Task_Back(Sn string, T_id string, T_task_id, To_T_task_id string, Time_start string, Time_end string) error {
  1249. o := orm.NewOrm()
  1250. // 开始插入数据
  1251. sql := "insert into z_task_data_" + To_T_task_id + "(t_sn,t_id,t_t,t_rh,t_time) select t_sn,t_id,t_t,t_rh,t_time from z_task_data_" + T_task_id
  1252. if len(Time_start) > 0 && len(Time_end) > 0 {
  1253. sql = sql + " WHERE t_sn = '" + Sn + "' AND t_id = '" + T_id + "' AND t_time >= '" + Time_start + "' AND t_time <= '" + Time_end + "'"
  1254. }
  1255. logs.Println(sql)
  1256. _, err := o.Raw(sql).Exec()
  1257. if err != nil {
  1258. logs.Error(lib.FuncName(), err)
  1259. return err
  1260. }
  1261. return nil
  1262. }
  1263. /* ==============================================================================================================
  1264. V型数据,下降持续5分钟,持续上升 5 分钟,取上升点的第一条数据
  1265. ==============================================================================================================
  1266. */
  1267. // isDescending checks if the given data points are strictly descending.
  1268. func isDescending(data []TaskData_) bool {
  1269. if len(data) < 2 {
  1270. return false // Not enough data to determine a trend.
  1271. }
  1272. for i := 1; i < len(data); i++ {
  1273. if data[i].T_t >= data[i-1].T_t {
  1274. return false // Not strictly descending.
  1275. }
  1276. }
  1277. return true
  1278. }
  1279. // isAscending checks if the given data points are strictly ascending.
  1280. func isAscending(data []TaskData_) bool {
  1281. if len(data) < 2 {
  1282. return false // Not enough data to determine a trend.
  1283. }
  1284. for i := 1; i < len(data); i++ {
  1285. if data[i].T_t <= data[i-1].T_t {
  1286. return false // Not strictly ascending.
  1287. }
  1288. }
  1289. return true
  1290. }
  1291. // findVTrend identifies a V-shaped trend in the data and returns the time of the lowest point.
  1292. // It looks for a sequence of at least 5 descending points followed by at least 5 ascending points.
  1293. func FindVTrend(data []TaskData_) (int, bool) {
  1294. if len(data) < 10 {
  1295. return -1, false // Not enough data to find a V-trend.
  1296. }
  1297. for i := 5; i < len(data)-5; i++ { // Adjust loop for index out of bounds error
  1298. descendingData := data[i-5 : i] // Get 5 descending point
  1299. ascendingData := data[i : i+5] // get 5 ascending point
  1300. if isDescending(descendingData) && isAscending(ascendingData) {
  1301. // Found a V-trend. Return the time of the lowest point (data[i]).
  1302. return i, true
  1303. }
  1304. }
  1305. return -1, false // No V-trend found.
  1306. }
  1307. type CalculateHumps_R struct {
  1308. Start TaskData_AVG
  1309. Peak TaskData_AVG
  1310. End TaskData_AVG
  1311. }
  1312. // 计算驼峰趋势
  1313. func CalculateHumps(data []TaskData_AVG) []CalculateHumps_R {
  1314. var humps []CalculateHumps_R
  1315. n := len(data)
  1316. if n < 3 {
  1317. return humps
  1318. }
  1319. i := 0
  1320. for i < n-5 {
  1321. // 寻找开始的最低点
  1322. for !(data[i].T_t <= data[i+1].T_t && data[i+1].T_t <= data[i+2].T_t && data[i+2].T_t <= data[i+3].T_t) {
  1323. i++
  1324. if i > n-5 {
  1325. break
  1326. }
  1327. }
  1328. start := i
  1329. // 寻找最高点
  1330. for !(data[i].T_t >= data[i+1].T_t && data[i+1].T_t > data[i+2].T_t && data[i+2].T_t > data[i+3].T_t) {
  1331. i++
  1332. if i > n-5 {
  1333. break
  1334. }
  1335. }
  1336. peak := i
  1337. Abs_peak := math.Abs(float64(data[start].T_t - data[peak].T_t))
  1338. if Abs_peak < 0.2 {
  1339. continue
  1340. }
  1341. // 寻找结束的最低点
  1342. for !(data[i].T_t <= data[i+1].T_t && data[i+1].T_t < data[i+2].T_t && data[i+2].T_t < data[i+3].T_t) {
  1343. i++
  1344. if i > n-5 {
  1345. break
  1346. }
  1347. }
  1348. end := i
  1349. Abs_end := math.Abs(float64(data[end].T_t - data[peak].T_t))
  1350. if Abs_end < 0.3 {
  1351. continue
  1352. }
  1353. // 如果找到了一个完整的驼峰
  1354. if start < peak && peak < end {
  1355. CalculateHumps_ := CalculateHumps_R{
  1356. Start: data[start],
  1357. Peak: data[peak],
  1358. End: data[end],
  1359. }
  1360. humps = append(humps, CalculateHumps_)
  1361. }
  1362. }
  1363. if len(humps) == 0 {
  1364. i = 0
  1365. for i < n-3 {
  1366. // 寻找开始的最低点
  1367. for !(data[i].T_t <= data[i+1].T_t && data[i+1].T_t <= data[i+2].T_t) {
  1368. i++
  1369. if i > n-3 {
  1370. break
  1371. }
  1372. }
  1373. start := i
  1374. // 寻找最高点
  1375. for !(data[i].T_t >= data[i+1].T_t && data[i+1].T_t > data[i+2].T_t) {
  1376. i++
  1377. if i > n-3 {
  1378. break
  1379. }
  1380. }
  1381. peak := i
  1382. Abs_peak := math.Abs(float64(data[start].T_t - data[peak].T_t))
  1383. if Abs_peak < 0.2 {
  1384. continue
  1385. }
  1386. // 寻找结束的最低点
  1387. for !(data[i].T_t <= data[i+1].T_t && data[i+1].T_t < data[i+2].T_t) {
  1388. i++
  1389. if i > n-3 {
  1390. break
  1391. }
  1392. }
  1393. end := i
  1394. Abs_end := math.Abs(float64(data[end].T_t - data[peak].T_t))
  1395. if Abs_end < 0.3 {
  1396. continue
  1397. }
  1398. // 如果找到了一个完整的驼峰
  1399. if start < peak && peak < end {
  1400. CalculateHumps_ := CalculateHumps_R{
  1401. Start: data[start],
  1402. Peak: data[peak],
  1403. End: data[end],
  1404. }
  1405. humps = append(humps, CalculateHumps_)
  1406. }
  1407. }
  1408. }
  1409. return humps
  1410. }
  1411. // 根据温度获取列表
  1412. func Read_TaskData_ByT_t_List_AES(T_task_id string, SN string, T_t float32, Time_start_ string, Time_end_ string) ([]TaskData_, int64) {
  1413. o := orm.NewOrm()
  1414. var maps []TaskData_
  1415. var maps_z []orm2.ParamsList
  1416. sql_condition := ""
  1417. if len(Time_start_) > 1 {
  1418. sql_condition += " AND t_time >= '" + Time_start_ + "'"
  1419. }
  1420. if len(Time_end_) > 1 {
  1421. sql_condition += " AND t_time <= '" + Time_end_ + "'"
  1422. }
  1423. if T_t > 0 {
  1424. sql_condition += fmt.Sprintf(" AND t_t = %f", T_t)
  1425. }
  1426. if len(SN) > 0 {
  1427. if strings.Contains(SN, "|") {
  1428. // 将字符串按 | 分割
  1429. ids := strings.Split(strings.TrimSuffix(SN, "|"), "|")
  1430. // 构建 SQL 查询
  1431. query := " AND t_sn IN ("
  1432. // 动态添加每个 id
  1433. for i, id := range ids {
  1434. query += "'" + id + "'"
  1435. if i < len(ids)-1 {
  1436. query += ", " // 添加逗号分隔
  1437. }
  1438. }
  1439. query += ") " // 结束 SQL 查询
  1440. sql_condition += query
  1441. } else {
  1442. sql_condition += " AND t_sn = '" + SN + "'"
  1443. }
  1444. }
  1445. if len(sql_condition) > 0 {
  1446. sql_condition = " WHERE " + strings.TrimLeft(sql_condition, " AND ")
  1447. }
  1448. sql := "SELECT COUNT(ID) FROM z_task_data_" + T_task_id + sql_condition
  1449. fmt.Println(sql)
  1450. _, err := o.Raw(sql).ValuesList(&maps_z)
  1451. if err != nil {
  1452. return maps, 0
  1453. }
  1454. if len(maps_z) == 0 {
  1455. return maps, 0
  1456. }
  1457. //fmt.Println("maps_z;",maps_z[0][0])
  1458. sql = "SELECT ID,t_sn,t_id,t_t,t_rh,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_times,t_time FROM z_task_data_" + T_task_id + sql_condition + " ORDER BY t_time"
  1459. fmt.Println(sql)
  1460. _, err = o.Raw(sql).QueryRows(&maps)
  1461. if err != nil {
  1462. logs.Error(lib.FuncName(), err)
  1463. }
  1464. //value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", cnt), 64)
  1465. key, _ := strconv.Atoi(maps_z[0][0].(string))
  1466. return maps, int64(key)
  1467. }
  1468. // 获取第一个时间点数据
  1469. func GetFirstTimeData(data []TaskData_) (list []TaskData_) {
  1470. if len(data) == 0 {
  1471. return list
  1472. }
  1473. for i := 0; i < len(data); i++ {
  1474. if data[i].T_time == data[0].T_time {
  1475. list = append(list, data[i])
  1476. }
  1477. }
  1478. return list
  1479. }
  1480. // 温度下降到指定温度 或者下降到最低点+0.2℃
  1481. func FindFirstDecreasingToNumber(data []TaskData_, number float32) *TaskData_ {
  1482. if len(data) < 2 {
  1483. return nil
  1484. }
  1485. startIndex := -1
  1486. for i := 0; i < len(data); i++ {
  1487. if data[i].T_t > number {
  1488. startIndex = i
  1489. break
  1490. }
  1491. }
  1492. if startIndex == -1 {
  1493. return nil
  1494. }
  1495. inDecreasing := false
  1496. record := data[startIndex:]
  1497. prev := record[0]
  1498. for i := 1; i < len(record); i++ {
  1499. curr := record[i]
  1500. if curr.T_t < prev.T_t {
  1501. // 下降趋势
  1502. if !inDecreasing {
  1503. inDecreasing = true
  1504. }
  1505. // 判断是否到达 8
  1506. if curr.T_t <= number {
  1507. return &curr
  1508. }
  1509. } else {
  1510. // 趋势中断,重置
  1511. inDecreasing = false
  1512. }
  1513. prev = curr
  1514. }
  1515. var dropStartIndex = -1
  1516. var dropEndIndex = -1
  1517. // 阶段 1: 识别首次下降趋势
  1518. for i := 1; i < len(record); i++ {
  1519. if record[i].T_t < record[i-1].T_t {
  1520. if dropStartIndex == -1 {
  1521. dropStartIndex = i - 1
  1522. }
  1523. dropEndIndex = i
  1524. } else if dropStartIndex != -1 {
  1525. break
  1526. }
  1527. }
  1528. // 如果没找到下降段
  1529. if dropStartIndex == -1 || dropEndIndex == -1 {
  1530. return nil
  1531. }
  1532. // 找最低点
  1533. minRecord := record[dropStartIndex]
  1534. for i := dropStartIndex + 1; i <= dropEndIndex; i++ {
  1535. if record[i].T_t < minRecord.T_t {
  1536. minRecord = record[i]
  1537. }
  1538. }
  1539. // 阶段 2: 从最低点开始向后找 ≥ min + 0.2℃ 的记录
  1540. minTemp := minRecord.T_t
  1541. minIndex := -1
  1542. for i, r := range record {
  1543. if r.ID == minRecord.ID {
  1544. minIndex = i
  1545. break
  1546. }
  1547. }
  1548. for i := minIndex + 1; i < len(record); i++ {
  1549. if record[i].T_t >= minTemp+0.2 {
  1550. return &record[i]
  1551. }
  1552. }
  1553. return nil
  1554. }
  1555. // 第一个持续下降趋势 到指定温度
  1556. func FindFirstDecreasingTendency(data []TaskData_, number float32) *TaskData_ {
  1557. if len(data) < 2 {
  1558. return nil
  1559. }
  1560. startIndex := -1
  1561. for i := 0; i < len(data); i++ {
  1562. if data[i].T_t > number {
  1563. startIndex = i
  1564. break
  1565. }
  1566. }
  1567. if startIndex == -1 {
  1568. return nil
  1569. }
  1570. inDecreasing := false
  1571. record := data[startIndex:]
  1572. prev := record[0]
  1573. for i := 1; i < len(record); i++ {
  1574. curr := record[i]
  1575. if curr.T_t < prev.T_t {
  1576. // 下降趋势
  1577. if !inDecreasing {
  1578. inDecreasing = true
  1579. }
  1580. // 判断是否到达 8
  1581. if curr.T_t <= number {
  1582. return &curr
  1583. }
  1584. } else {
  1585. // 趋势中断,重置
  1586. inDecreasing = false
  1587. }
  1588. prev = curr
  1589. }
  1590. return nil
  1591. }
  1592. // 按照 t_id 分组数据
  1593. func GroupDataByTSN(data []TaskData_) map[string][]TaskData_ {
  1594. groupedData := make(map[string][]TaskData_)
  1595. for _, d := range data {
  1596. groupedData[d.T_sn] = append(groupedData[d.T_sn], d)
  1597. }
  1598. return groupedData
  1599. }
  1600. //计算样本标准差(n-1分母)
  1601. func calculateStdDev(values []float64) float64 {
  1602. n := len(values)
  1603. if n < 2 {
  1604. return 0 // 单点数据无波动
  1605. }
  1606. // 计算均值
  1607. sum := 0.0
  1608. for _, v := range values {
  1609. sum += v
  1610. }
  1611. mean := sum / float64(n)
  1612. // 计算方差
  1613. variance := 0.0
  1614. for _, v := range values {
  1615. diff := v - mean
  1616. variance += diff * diff
  1617. }
  1618. variance /= float64(n - 1) // 样本方差分母n-1
  1619. return math.Sqrt(variance) // 标准差
  1620. }
  1621. // 获取波动度最大的三条数据集
  1622. func GetTheGreatestFluctuations(data []TaskData_, num int) string {
  1623. // 存储波动度结果
  1624. type Result struct {
  1625. T_sn string
  1626. StdDev float64
  1627. DataPoints []TaskData_
  1628. }
  1629. dataSets := GroupDataByTSN(data)
  1630. results := make([]Result, 0)
  1631. // 计算每条数据集的波动度
  1632. for T_sn, dataset := range dataSets {
  1633. values := make([]float64, len(dataset))
  1634. for j, dp := range dataset {
  1635. values[j] = float64(dp.T_t)
  1636. }
  1637. results = append(results, Result{
  1638. T_sn: T_sn,
  1639. //StdDev: calculateStdDev(values),
  1640. StdDev: standardDeviation(values),
  1641. DataPoints: dataset,
  1642. })
  1643. }
  1644. // 按波动度降序排序
  1645. sort.Slice(results, func(i, j int) bool {
  1646. return results[i].StdDev > results[j].StdDev
  1647. })
  1648. snList := make([]string, num)
  1649. if len(results) >= num {
  1650. for i := 0; i < num; i++ {
  1651. fmt.Println(results[i].T_sn, results[i].StdDev)
  1652. snList = append(snList, results[i].T_sn)
  1653. }
  1654. } else {
  1655. for _, v := range results {
  1656. snList = append(snList, v.T_sn)
  1657. }
  1658. }
  1659. return strings.Join(snList, "|")
  1660. }
  1661. // 计算平均值
  1662. func mean(data []float64) float64 {
  1663. sum := 0.0
  1664. for _, value := range data {
  1665. sum += value
  1666. }
  1667. return sum / float64(len(data))
  1668. }
  1669. func standardDeviation(data []float64) float64 {
  1670. meanVal := mean(data)
  1671. var sumSquares float64
  1672. for _, value := range data {
  1673. sumSquares += math.Pow(value-meanVal, 2)
  1674. }
  1675. return math.Sqrt(sumSquares / float64(len(data)))
  1676. }