TaskData.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. package Task
  2. import (
  3. "ColdVerify_local/conf"
  4. "ColdVerify_local/lib"
  5. "ColdVerify_local/logs"
  6. "fmt"
  7. _ "github.com/astaxie/beego/cache/redis"
  8. "github.com/beego/beego/v2/adapter/orm"
  9. orm2 "github.com/beego/beego/v2/client/orm"
  10. _ "github.com/go-sql-driver/mysql"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. // 模板
  16. type TaskData struct {
  17. Id int `orm:"column(ID);size(11);auto;pk"`
  18. T_id string `orm:"size(256);null"` // 标题
  19. T_t float32 `orm:"size(10);null"` // 温度
  20. T_rh float32 `orm:"size(10);null"` // 湿度
  21. T_time time.Time `orm:"type(timestamp);null;"` // 采集时间
  22. 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 保存时都会对时间自动更新
  23. }
  24. func (t *TaskData) TableName() string {
  25. return "task_data" // 数据库名称 // ************** 替换 FormulaList **************
  26. }
  27. func init() {
  28. }
  29. // 创建数据库 Device.CREATE_TaskData("")
  30. func CREATE_TaskData(alias_name, T_task_id string) bool {
  31. o := orm2.NewOrmUsingDB(alias_name)
  32. sql := "DROP TABLE IF EXISTS `z_task_data_" + T_task_id + "`"
  33. o.Raw(sql).Exec()
  34. sql = "CREATE TABLE IF NOT EXISTS `z_task_data_" + T_task_id + "` ( " +
  35. " `ID` int(11) NOT NULL AUTO_INCREMENT," +
  36. " `t_sn` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL," +
  37. " `t_id` varchar(256) DEFAULT NULL," +
  38. " `t_t` float(6, 1) NULL DEFAULT NULL," +
  39. " `t_rh` float(6, 1) NULL DEFAULT NULL," +
  40. " `t_time` datetime(0) NULL DEFAULT NULL," +
  41. " PRIMARY KEY (`ID`) USING BTREE," +
  42. " KEY `t_sn` (`t_sn`)," +
  43. " KEY `t_id` (`t_id`)," +
  44. " KEY `t_time` (`t_time`)" +
  45. ") ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;"
  46. _, err := o.Raw(sql).Exec()
  47. if err != nil {
  48. return false
  49. }
  50. //sqlIndex := "ALTER TABLE `z_task_data_" + T_task_id + "` add unique index(`t_sn`,`t_id`,`t_time`);"
  51. //logs.Debug(sqlIndex)
  52. //o.Raw(sqlIndex).Exec()
  53. return true
  54. }
  55. // ---------------- 特殊方法 -------------------
  56. // 清空
  57. func Truncate_TaskData(alias_name, T_task_id string) bool {
  58. o := orm2.NewOrmUsingDB(alias_name)
  59. sql := "truncate table z_task_data_" + T_task_id
  60. logs.Println(sql)
  61. _, err := o.Raw(sql).Exec()
  62. if err != nil {
  63. logs.Error(lib.FuncName(), err)
  64. return false
  65. }
  66. return true
  67. }
  68. type TaskData_ struct {
  69. ID int `orm:"column(ID);size(100);null"` // ID
  70. T_sn string `orm:"column(t_sn);size(256);null"` // sn
  71. T_id string `orm:"column(t_id);size(256);null"` // 标题
  72. T_t float32 `orm:"column(t_t);size(10);null"` // 温度
  73. T_rh float32 `orm:"column(t_rh);size(10);null"` // 湿度
  74. T_time string `orm:"column(t_times);null;"` // 采集时间
  75. }
  76. type TaskDataClass_ struct {
  77. T_sn string `orm:"column(t_sn);size(256);null"` // 标题
  78. T_id string `orm:"column(t_id);size(256);null"` // 名称
  79. }
  80. func Read_TaskData_ById_List(T_task_id string, SN string, T_id int, Time_start_ string, Time_end_ string, page int, page_z int) ([]TaskData_, int64) {
  81. o := orm.NewOrm()
  82. var maps []TaskData_
  83. var maps_z []orm2.ParamsList
  84. pagez := page_z
  85. var offset int
  86. if page <= 1 {
  87. offset = 0
  88. } else {
  89. page -= 1
  90. offset = page * pagez
  91. }
  92. sql_condition := ""
  93. if len(Time_start_) > 1 {
  94. sql_condition += " AND t_time >= '" + Time_start_ + "'"
  95. }
  96. if len(Time_end_) > 1 {
  97. sql_condition += " AND t_time <= '" + Time_end_ + "'"
  98. }
  99. if T_id != -1 {
  100. sql_condition += " AND t_id = " + strconv.Itoa(T_id)
  101. }
  102. if len(SN) > 0 {
  103. sql_condition += " AND t_sn = '" + SN + "'"
  104. }
  105. if len(sql_condition) > 0 {
  106. sql_condition = " WHERE " + strings.TrimLeft(sql_condition, " AND ")
  107. }
  108. sql := "SELECT COUNT(ID) FROM z_task_data_" + T_task_id + sql_condition
  109. fmt.Println(sql)
  110. _, err := o.Raw(sql).ValuesList(&maps_z)
  111. if err != nil {
  112. return maps, 0
  113. }
  114. if len(maps_z) == 0 {
  115. return maps, 0
  116. }
  117. //fmt.Println("maps_z;",maps_z[0][0])
  118. 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"
  119. if page_z != 9999 {
  120. sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(pagez)
  121. }
  122. fmt.Println(sql)
  123. _, err = o.Raw(sql).QueryRows(&maps)
  124. if err != nil {
  125. logs.Error(lib.FuncName(), err)
  126. }
  127. //value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", cnt), 64)
  128. key, _ := strconv.Atoi(maps_z[0][0].(string))
  129. return maps, int64(key)
  130. }
  131. func Read_TaskData_ById_List_(T_task_id string, SN string) []TaskData_ {
  132. o := orm.NewOrm()
  133. var maps []TaskData_
  134. sql_condition := ""
  135. sql_condition += " t_sn ='" + SN + "'"
  136. //fmt.Println("maps_z;",maps_z[0][0])
  137. sql := "SELECT ID,t_sn,t_id,t_t,t_rh,DATE_FORMAT(t_time,'%Y-%c-%d %H:%i') AS t_times,t_time FROM z_task_data_" + T_task_id + " WHERE " + sql_condition + " ORDER BY t_time "
  138. fmt.Println(sql)
  139. _, err := o.Raw(sql).QueryRows(&maps)
  140. if err != nil {
  141. logs.Error(lib.FuncName(), err)
  142. return maps
  143. }
  144. return maps
  145. }
  146. func Read_TaskData_ById_ClassList(T_task_id string) []TaskDataClass_ {
  147. o := orm.NewOrm()
  148. var maps []TaskDataClass_
  149. //fmt.Println("maps_z;",maps_z[0][0])
  150. //sql := "SELECT DISTINCT t_sn,t_id FROM z_task_data_" + T_task_id + " ORDER BY t_id "
  151. //sql := "SELECT DISTINCT t_sn FROM z_task_data_" + T_task_id + " ORDER BY t_id "
  152. sql := "SELECT t_sn,t_id FROM z_task_data_" + T_task_id + " GROUP BY t_sn ORDER BY t_id "
  153. fmt.Println(sql)
  154. _, err := o.Raw(sql).QueryRows(&maps)
  155. if err != nil {
  156. logs.Error(lib.FuncName(), err)
  157. return maps
  158. }
  159. return maps
  160. }
  161. func Read_TaskData_sn(T_task_id string) []TaskDataClass_ {
  162. o := orm.NewOrm()
  163. var maps []TaskDataClass_
  164. sql := "SELECT DISTINCT t_sn FROM z_task_data_" + T_task_id + " ORDER BY t_sn "
  165. fmt.Println(sql)
  166. _, err := o.Raw(sql).QueryRows(&maps)
  167. if err != nil {
  168. logs.Error(lib.FuncName(), err)
  169. return maps
  170. }
  171. return maps
  172. }
  173. func Update_TaskData_ByT_sn(T_task_id, T_sn, T_id string) error {
  174. o := orm.NewOrm()
  175. // 修改id
  176. sql := "UPDATE z_task_data_" + T_task_id + " SET `t_id` = '" + T_id + "' WHERE `t_sn` = " + T_sn
  177. logs.Println(sql)
  178. _, err := o.Raw(sql).Exec()
  179. if err != nil {
  180. logs.Error(lib.FuncName(), err)
  181. return err
  182. }
  183. return nil
  184. }
  185. func Delete_TaskData_ByT_sn(T_task_id, T_sn string) error {
  186. o := orm.NewOrm()
  187. // 修改id
  188. sql := "DELETE FROM z_task_data_" + T_task_id + " WHERE `t_sn` = " + T_sn
  189. logs.Println(sql)
  190. _, err := o.Raw(sql).Exec()
  191. if err != nil {
  192. logs.Error(lib.FuncName(), err)
  193. return err
  194. }
  195. return nil
  196. }
  197. // 添加
  198. func Add_TaskData(T_task_id string, T_sn string, T_id string, T_t string, T_rh string, T_time string) bool {
  199. o := orm.NewOrm()
  200. // 开始插入数据
  201. //
  202. //sql := "INSERT INTO z_task_data_" + T_task_id + " (`t_sn`, `t_id`, `t_time`) " +
  203. // "VALUES ('" + T_sn + "', " + T_id + ", '" + T_time + "') " +
  204. // "ON DUPLICATE KEY UPDATE t_t=" + T_t + ", t_rh="+ T_rh +";"
  205. // 去重复数据
  206. //sql := "DELETE FROM z_task_data_" + T_task_id + " WHERE " + " t_id = " + T_id + " AND "+ " t_sn = '"+T_sn+"' " + "AND t_time = '" + T_time + "' "
  207. //
  208. //// 这里有时间优化 用于一次 prepare 多次 exec,以提高批量执行的速度
  209. //fmt.Println(sql)
  210. //res, err := o.Raw(sql).Exec()
  211. //if err != nil {
  212. // fmt.Println(err)
  213. // return false
  214. //}
  215. //res.RowsAffected()
  216. sql := "INSERT INTO z_task_data_" + T_task_id + " (`t_sn`, `t_id`, `t_t`, `t_rh`, `t_time`) " +
  217. "VALUES ('" + T_sn + "', " + T_id + ", " + T_t + "," + T_rh + ", '" + T_time + "')"
  218. // 更新数据
  219. //sql := "INSERT INTO z_task_data_" + T_task_id + " (`t_sn`, `t_id`, `t_t`, `t_rh`, `t_time`) " +
  220. // "VALUES ('" + T_sn + "', " + T_id + ", " + T_t + "," + T_rh + ", '" + T_time + "')" +
  221. // "on duplicate key update `t_t`=" + T_t + ",`t_rh`=" + T_rh
  222. fmt.Println(sql)
  223. res, err := o.Raw(sql).Exec()
  224. if err != nil {
  225. logs.Error(lib.FuncName(), err)
  226. return false
  227. }
  228. res.RowsAffected()
  229. //fmt.Println("mysql row affected nums: ", num)
  230. return true
  231. }
  232. // 修改
  233. func Up_TaskData(T_task_id string, Id string, T_t string, T_rh string, T_time string) bool {
  234. o := orm.NewOrm()
  235. SET_str := " SET "
  236. if len(T_t) > 0 {
  237. SET_str = SET_str + " t_t = " + T_t + " ,"
  238. }
  239. if len(T_rh) > 0 {
  240. SET_str = SET_str + " t_rh = " + T_rh + " ,"
  241. }
  242. if len(T_time) > 0 {
  243. SET_str = SET_str + " t_time = '" + T_time + "' ,"
  244. }
  245. if len(SET_str) > 7 {
  246. SET_str = SET_str[:(len(SET_str) - 1)]
  247. }
  248. // 开始插入数据 UPDATE `cold_verify`.`Z_TaskData_d8qMyeXLzIxn` SET `t_t` = 20.2 WHERE `ID` = 69
  249. sql := "UPDATE z_task_data_" + T_task_id + " " + SET_str + " WHERE ID = " + Id
  250. // 这里有时间优化 用于一次 prepare 多次 exec,以提高批量执行的速度
  251. //fmt.Println(sql)
  252. res, err := o.Raw(sql).Exec()
  253. if err != nil {
  254. logs.Error(lib.FuncName(), err)
  255. return false
  256. }
  257. res.RowsAffected()
  258. //fmt.Println("mysql row affected nums: ", num)
  259. return true
  260. }
  261. // 添加
  262. func Del_TaskData(T_task_id string, Id string) bool {
  263. o := orm.NewOrm()
  264. // 开始插入数据 UPDATE `cold_verify`.`Z_TaskData_d8qMyeXLzIxn` SET `t_t` = 20.2 WHERE `ID` = 69
  265. sql := "DELETE FROM z_task_data_" + T_task_id + " WHERE ID = " + Id
  266. // 这里有时间优化 用于一次 prepare 多次 exec,以提高批量执行的速度
  267. logs.Println(sql)
  268. res, err := o.Raw(sql).Exec()
  269. if err != nil {
  270. logs.Error(lib.FuncName(), err)
  271. return false
  272. }
  273. res.RowsAffected()
  274. //fmt.Println("mysql row affected nums: ", num)
  275. return true
  276. }
  277. // 添加
  278. func Del_TaskData_t_id(T_task_id string, Id string) bool {
  279. o := orm.NewOrm()
  280. // 开始插入数据 UPDATE `cold_verify`.`Z_TaskData_d8qMyeXLzIxn` SET `t_t` = 20.2 WHERE `ID` = 69
  281. sql := "DELETE FROM z_task_data_" + T_task_id + " WHERE t_id = " + Id
  282. // 这里有时间优化 用于一次 prepare 多次 exec,以提高批量执行的速度
  283. logs.Println(sql)
  284. res, err := o.Raw(sql).Exec()
  285. if err != nil {
  286. logs.Error(lib.FuncName(), err)
  287. return false
  288. }
  289. res.RowsAffected()
  290. //fmt.Println("mysql row affected nums: ", num)
  291. return true
  292. }
  293. // 检查导出表总数
  294. func Check_TaskData_Num(T_task_id string) bool {
  295. o1 := orm2.NewOrmUsingDB(conf.Local_AliasName)
  296. o2 := orm2.NewOrmUsingDB(conf.Server_AliasName)
  297. var maps_z1, maps_z2 []orm2.ParamsList
  298. sql := "SELECT COUNT(ID) FROM z_task_data_" + T_task_id
  299. fmt.Println(sql)
  300. _, err := o1.Raw(sql).ValuesList(&maps_z1)
  301. if err != nil {
  302. return false
  303. }
  304. _, err = o2.Raw(sql).ValuesList(&maps_z2)
  305. if err != nil {
  306. return false
  307. }
  308. if len(maps_z1) != len(maps_z2) {
  309. return false
  310. }
  311. return true
  312. }
  313. func Read_TaskData_Num(T_task_id string) int {
  314. o1 := orm2.NewOrmUsingDB(conf.Local_AliasName)
  315. var maps_z []orm2.ParamsList
  316. sql := "SELECT COUNT(ID) FROM z_task_data_" + T_task_id
  317. fmt.Println(sql)
  318. _, err := o1.Raw(sql).ValuesList(&maps_z)
  319. if err != nil {
  320. logs.Error(lib.FuncName(), err)
  321. return 0
  322. }
  323. key, _ := strconv.Atoi(maps_z[0][0].(string))
  324. return key
  325. }
  326. func Dump_TaskData(T_task_id, root, password, url_port, database, sql_file string) (string, error) {
  327. // url_port 127.0.0.1:3306
  328. // mysql8.0 以上加 --column-statistics=0
  329. // mysqldump --column-statistics=0 -uroot -proot -h127.0.0.1 -P3306 cold_verify Z_TaskData_ixEfo5zk2Oeb > /Data/Z_TaskData_ixEfo5zk2Oeb.sql
  330. v := Read_Local_Mysql_Version()
  331. host_port := strings.Split(url_port, ":")
  332. table_name := "z_task_data_" + T_task_id
  333. org := "mysqldump "
  334. if v >= 8 {
  335. org += "--column-statistics=0 "
  336. }
  337. //--no-create-info 只导出数据,而不添加 CREATE TABLE 语句。
  338. org = org + fmt.Sprintf("-u%s -p%s -h%s -P%s --no-create-info --set-gtid-purged=OFF --quick %s %s > %s ",
  339. root, password, host_port[0], host_port[1], database, table_name, sql_file)
  340. logs.Println(org)
  341. _, err := lib.Command(org)
  342. if err != nil {
  343. logs.Error(lib.FuncName(), err)
  344. }
  345. return org, err
  346. }
  347. func Insert_TaskData(root, password, url_port, database, sql_file string) (string, error) {
  348. // url_port 127.0.0.1:3306
  349. // mysql -u root -p root -h127.0.0.1 -P3306 cold_verify_local < /data/Z_TaskData_ixEfo5zk2Oeb.sql
  350. host_port := strings.Split(url_port, ":")
  351. org := fmt.Sprintf("mysql -u%s -p%s -h%s -P%s %s < %s",
  352. root, password, host_port[0], host_port[1], database, sql_file)
  353. logs.Println(org)
  354. _, err := lib.Command(org)
  355. if err != nil {
  356. logs.Error(lib.FuncName(), err)
  357. }
  358. return org, err
  359. }
  360. func Read_Local_Mysql_Version() int {
  361. o := orm2.NewOrmUsingDB(conf.Local_AliasName)
  362. var params []orm2.Params
  363. o.Raw("select version();").Values(&params)
  364. version, _ := strconv.Atoi(params[0]["version()"].(string)[0:1])
  365. return version
  366. }
  367. func Import_TaskData(T_task_id string, offset, pagez int) bool {
  368. var maps []TaskData_
  369. serverOrm := orm2.NewOrmUsingDB(conf.Server_AliasName)
  370. localOrm := orm2.NewOrmUsingDB(conf.Local_AliasName)
  371. tb_name := "z_task_data_" + T_task_id
  372. // 开从先上版查询数据
  373. 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)
  374. logs.Println(sql)
  375. _, err := serverOrm.Raw(sql).QueryRows(&maps)
  376. if err != nil {
  377. logs.Error(lib.FuncName(), err)
  378. return false
  379. }
  380. values := []string{}
  381. for _, row := range maps {
  382. // 处理数据
  383. 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))
  384. }
  385. // 向本地版插入数据
  386. sql = "INSERT IGNORE INTO " + tb_name + "( `t_sn`, `t_id`, `t_t`, `t_rh`, `t_time`) VALUES " + strings.Join(values, ",")
  387. //logs.Println(sql)
  388. _, err = localOrm.Raw(sql).Exec()
  389. if err != nil {
  390. logs.Error(lib.FuncName(), err)
  391. return false
  392. }
  393. return true
  394. }