TaskData.go 57 KB

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