package main import ( "fmt" "io" "math" "net/http" "path/filepath" "sort" "encoding/json" "strconv" "io/ioutil" "time" "database/sql" "strings" _ "github.com/mattn/go-adodb" "golang.org/x/net/websocket" _ "github.com/denisenkom/go-mssqldb" //_ "deescloud/odbc/driver" //_ "github.com/alexbrainman/odbc" //_ "gitlab.com/stone.code/odbc3-go" //_ "github.com/weigj/go-odbc"-->deescloud/odbc/driver _ "github.com/LukeMauldin/lodbc" "deescloud/ModulePath" "os" "sync" "github.com/astaxie/beego" "github.com/astaxie/beego/logs" _ "github.com/mattn/go-sqlite3" uuid "github.com/satori/go.uuid" "encoding/csv" //_ "net/http/pprof" // "runtime" "github.com/shopspring/decimal" "github.com/tealeg/xlsx" "github.com/signintech/gopdf" "github.com/lionsoul2014/ip2region/binding/golang/xdb" ) /* go-adodb ---cache leak github.com/weigj/go-odbc ---查询处理特殊字符有问题 github.com/alexbrainman/odbc ---sqlserver读取汉字乱码(编码格式没有转换) */ func testAdo() { var conf []string var db *sql.DB var err error conf = append(conf, "Provider=SQLOLEDB") conf = append(conf, "Data Source=127.0.0.1,1433") // sqlserver IP 和 服务器名称 conf = append(conf, "Initial Catalog=WellNameInformation") // 数据库名 conf = append(conf, "user id=sa") // 登陆用户名 conf = append(conf, "password=lh123456") // 登陆密码 fmt.Println(strings.Join(conf, ";")) db, err = sql.Open("adodb", strings.Join(conf, ";")) if err != nil { fmt.Println("sql open:", err) return } else { } defer db.Close() beginTime := time.Now() // 执行SQL语句 rows, err := db.Query("select [6506] from [AUTHINFO] order by ID") if err != nil { fmt.Println("query: ", err) return } for rows.Next() { var id float32 rows.Scan(&id) fmt.Println("id: ", id) } defer rows.Close() fmt.Println(fmt.Sprintf("use time:%v", (time.Now().UnixNano()-beginTime.UnixNano())/1e6)) } // 2008是要升级sqlserver数据库的补丁的,不建议使用。 func testMssqldb() { var server = "127.0.0.1" port := 1433 var user = "sa" var password = "lh123456" var database = "WellNameInformation" //连接字符串 connString := fmt.Sprintf("server=%s;port%d;database=%s;user id=%s;password=%s", server, port, database, user, password) fmt.Println(connString) //建立连接 db, err := sql.Open("mssql", connString) if err != nil { fmt.Println("Open Connection failed:", err.Error()) } defer db.Close() //通过连接对象执行查询 rows, err := db.Query(`select ID from WellInformation order by ID`) if err != nil { fmt.Println("Query failed:", err.Error()) return } defer rows.Close() for rows.Next() { var id int64 rows.Scan(&id) fmt.Printf("id: %d \n", id) } } func testOdbc() { conn, err := sql.Open("odbc", "driver={SQL Server};SERVER=127.0.0.1;UID=sa;PWD=lh123456?;DATABASE=WellNameInformation") if err != nil { fmt.Println("Connecting Error", err.Error()) return } else { fmt.Println("connect success!") } defer conn.Close() beginTime := time.Now() stmt, err := conn.Prepare("select ID from [WellNameInformation].[dbo].[WellInformation] order by ID") if err != nil { fmt.Println("Query Error", err) return } defer stmt.Close() row, err := stmt.Query() if err != nil { fmt.Println("Query Error", err) return } defer row.Close() cnt := 0 for row.Next() { var id int if err := row.Scan(&id); err == nil { //fmt.Println(id) cnt++ } } fmt.Println("record len:", cnt) fmt.Println(fmt.Sprintf("use time:%v", (time.Now().UnixNano()-beginTime.UnixNano())/1e6)) fmt.Printf("%s\n", "finish") return } func testDB() { //testOdbc() //time.Sleep(time.Second * 5) //testAdo() } var ( server string port int user string password string database string sqlConn *sql.DB //odbcConn *sql.DB wellParaNameMap map[int]string wellParaUnitMap map[int]string wellParaNameMap_en map[int]string wellParaUnitMap_en map[int]string //well name cache lastUpdateTime time.Time updateWellNameLocker sync.RWMutex wellNamemap map[string]string rwLocker sync.RWMutex //well realdata wsRealWellDataUpdateMap map[string]string wsUpdateLocker sync.RWMutex //user refreshSpan int64 ExpireTimeSpan time.Duration modelePath string userLevelMap map[string]int TY_START int = 212 ch_battery_info chan battery_info ch_battery_notify chan int loc string = "2006-01-02 15:04:05" dbPath string = "D:\\deescloud\\deesCloudServer\\ip2region.xdb" // dbPath string = "./ip2region.xdb" cBuff []byte pageSetting map[string]page_setting_req month_en_name map[string]string spe_user map[string]string Overdue_account map[string]string dbStatus = make(map[string]string) // 存储数据库状态(online/offline) statusLocker = sync.RWMutex{} // 状态专用锁 ) func initLog() { beego.BeeLogger.DelLogger("console") var err error modelePath, err = ModulePath.GetModuleCurrentPath() if err != nil { fmt.Println("ModulePath.GetModuleCurrentPath() failed err:", err.Error()) return } fmt.Println("modelePath:", modelePath) config := make(map[string]interface{}) config["filename"] = modelePath + string("/logs/deescloud.log") config["level"] = 7 config["maxlines"] = 0 config["maxsize"] = 50 * 1024 * 1024 config["daily"] = true config["maxdays"] = 10 configJsonStr, err := json.Marshal(config) if err != nil { fmt.Println("package main init json.Marshal(config) failed,err:", err.Error()) os.Exit(-1) } logs.SetLogger(logs.AdapterFile, string(configJsonStr)) } func initWellnamesMap() error { sqlstr := "select WELLNameSource,WELLName from [WellNameInformation].[dbo].[WellInformation] order by ID" row, err := sqlConn.Query(sqlstr) if err != nil { logs.Info("initWellnamesMap Query Error", err.Error()) return err } defer row.Close() rwLocker.Lock() for row.Next() { var d GetWellNamesResp var wellname string if err := row.Scan(&d.Label, &wellname); err == nil { wellNamemap[d.Label] = wellname } else { logs.Info("Query Error", err.Error()) rwLocker.Unlock() return err } } rwLocker.Unlock() return nil } func initSqlPool(driverType string) { if driverType == "ado" { var conf []string var err error conf = append(conf, "Provider=SQLOLEDB") conf = append(conf, fmt.Sprintf("Data Source=%s,%d", server, port)) // sqlserver IP 和 服务器名称 conf = append(conf, fmt.Sprintf("Initial Catalog=%s", database)) // 数据库名 conf = append(conf, fmt.Sprintf("user id=%s", user)) // 登陆用户名 conf = append(conf, fmt.Sprintf("password=%s", password)) // 登陆密码 fmt.Println(strings.Join(conf, ";")) sqlConn, err = sql.Open("adodb", strings.Join(conf, ";")) if err != nil { fmt.Println("sql open:", err.Error()) os.Exit(0) } else { fmt.Println("connect success!") } } else { // dataSource := fmt.Sprintf("driver={SQL Server};SERVER=%s;UID=%s;PWD=%s;DATABASE=%s", server, user, password, database) // fmt.Println(dataSource) // var err error // sqlConn, err = sql.Open("lodbc", dataSource) // if err != nil { // fmt.Println("sql open:", err.Error()) // os.Exit(0) // } else { // logs.Info("connect success!") // } fmt.Println("wqeqdsadq211111") dataSource := fmt.Sprintf( "server=%s;user id=%s;password=%s;database=%s;port=%d;encrypt=disable;TrustServerCertificate=true", server, // 仅服务器 IP 或域名(不包含端口) user, password, database, port, // 端口通过 port 参数单独指定 ) fmt.Println("啦啦啦啦啦", dataSource) var err error // sqlConn, err = sql.Open("lodbc", dataSource) // sqlConn, err = sql.Open("odbc", dataSource) sqlConn, err = sql.Open("sqlserver", dataSource) if err = sqlConn.Ping(); err != nil { fmt.Println("sql open:", err.Error()) os.Exit(0) } else { fmt.Println("connect success!") logs.Info("connect success!") } } sqlConn.SetMaxOpenConns(10) sqlConn.SetMaxIdleConns(5) /* var err error dataSource := fmt.Sprintf("driver={SQL Server};SERVER=%s;UID=%s;PWD=%s;DATABASE=%s", server, user, password, database) fmt.Println(dataSource) odbcConn, err = sql.Open("lodbc", dataSource) if err != nil { fmt.Println("sql open:", err.Error()) os.Exit(0) } else { logs.Info("connect success!") } odbcConn.SetMaxOpenConns(10) odbcConn.SetMaxIdleConns(5) */ } func getConn(db string) (conn *sql.DB, err error) { var conf []string conf = append(conf, "Provider=SQLOLEDB") conf = append(conf, fmt.Sprintf("Data Source=%s,%d", server, port)) // sqlserver IP 和 服务器名称 conf = append(conf, fmt.Sprintf("Initial Catalog=%s", db)) // 数据库名 conf = append(conf, fmt.Sprintf("user id=%s", user)) // 登陆用户名 conf = append(conf, fmt.Sprintf("password=%s", password)) // 登陆密码 //fmt.Println(strings.Join(conf, ";")) conn, err = sql.Open("adodb", strings.Join(conf, ";")) if err != nil { fmt.Println("sql open:", err.Error()) logs.Error("sql open:", err.Error()) return } conn.SetMaxIdleConns(1) conn.SetMaxOpenConns(2) return } func getOdbcConn(db string) (conn *sql.DB, err error) { dataSource := fmt.Sprintf("driver={SQL Server};SERVER=%s;UID=%s;PWD=%s;DATABASE=%s", server, user, password, db) //fmt.Println(dataSource) conn, err = sql.Open("lodbc", dataSource) if err != nil { logs.Error("sql open:", err.Error()) return } conn.SetMaxOpenConns(2) conn.SetMaxIdleConns(1) return } func initwellParaNameMap_en() { wellParaNameMap_en = make(map[int]string) wellParaNameMap_en[1] = "INC" wellParaNameMap_en[2] = "AZ" wellParaNameMap_en[3] = "GTF" wellParaNameMap_en[4] = "MTF" wellParaNameMap_en[5] = "GT" wellParaNameMap_en[6] = "MT" wellParaNameMap_en[7] = "DIP" wellParaNameMap_en[8] = "TEMP" wellParaNameMap_en[9] = "BV" wellParaNameMap_en[10] = "BQ" wellParaNameMap_en[11] = "Rotary speed" wellParaNameMap_en[12] = "Vibration" wellParaNameMap_en[13] = "GAMMA" // wellParaNameMap_en[14] = "NREV" // wellParaNameMap_en[15] = "NINC" // wellParaNameMap_en[16] = "NGTF" // wellParaNameMap_en[17] = "NTorque" // wellParaNameMap_en[18] = "NGR" // wellParaNameMap_en[19] = "NUPGAMMA" // wellParaNameMap_en[20] = "NBV" wellParaNameMap_en[14] = "NearBit-REV" wellParaNameMap_en[15] = "NearBit-INC" wellParaNameMap_en[16] = "NearBit-GTF" wellParaNameMap_en[17] = "NearBit-Torque" wellParaNameMap_en[18] = "NearBit-GR" wellParaNameMap_en[19] = "NearBit-UPGAMMA" wellParaNameMap_en[20] = "NearBit-V" wellParaNameMap_en[21] = "GW-ROP" wellParaNameMap_en[22] = "GW-TQCX" wellParaNameMap_en[23] = "GWBitPres" wellParaNameMap_en[24] = "NLEFTGAMMA " wellParaNameMap_en[25] = "GW-APWD-Inner" wellParaNameMap_en[26] = "GW-APWD-Outer" wellParaNameMap_en[27] = "GWTransVib" wellParaNameMap_en[28] = "GWLongiVib" // wellParaNameMap_en[29] = "NBV2" // wellParaNameMap_en[30] = "NOutAP" // wellParaNameMap_en[31] = "NTEMP1" // wellParaNameMap_en[32] = "NDOWNGAMMA" // wellParaNameMap_en[37] = "NSINC" wellParaNameMap_en[29] = "NearBit-V2" wellParaNameMap_en[30] = "NearBit-OutAP" wellParaNameMap_en[31] = "NearBit-TEMP1" wellParaNameMap_en[32] = "NearBit-DOWNGAMMA" wellParaNameMap_en[33] = "PAZUPGAMMA" wellParaNameMap_en[34] = "PAZDOWNGAMMA" wellParaNameMap_en[35] = "PAZLEFTGAMMA" wellParaNameMap_en[36] = "TYRPM" wellParaNameMap_en[37] = "NearBit-SINC" wellParaNameMap_en[39] = "Gx" wellParaNameMap_en[40] = "Gy" wellParaNameMap_en[41] = "Gz" wellParaNameMap_en[42] = "Mx" wellParaNameMap_en[43] = "My" wellParaNameMap_en[44] = "Mz" wellParaNameMap_en[45] = "GWTEMP" wellParaNameMap_en[46] = "PAZRIGHTGAMMA" wellParaNameMap_en[47] = "C-FGAMAZ.GRAUFM" wellParaNameMap_en[48] = "C-FGAMAZ.GRADFM" // wellParaNameMap_en[49] = "NRIGHTGAMMA" wellParaNameMap_en[49] = "NearBit-RIGHTGAMMA" wellParaNameMap_en[50] = "TYGmmaD" wellParaNameMap_en[51] = "TYGmmaU" wellParaNameMap_en[52] = "TYGmmaN" wellParaNameMap_en[53] = "GWStickSlipVib" wellParaNameMap_en[54] = "C-FGAMAZ.GRALFM" wellParaNameMap_en[55] = "C-FGAMAZ.GRARFM" wellParaNameMap_en[60] = "R34PHF" wellParaNameMap_en[61] = "R12PHF" wellParaNameMap_en[62] = "R34PLF" wellParaNameMap_en[63] = "R12PLF" wellParaNameMap_en[64] = "ResistivityGR" wellParaNameMap_en[65] = "RUPGAMMA" wellParaNameMap_en[66] = "RDOWNGAMMA" wellParaNameMap_en[67] = "RINC" wellParaNameMap_en[68] = "G_INC" wellParaNameMap_en[69] = "G_AZ" wellParaNameMap_en[70] = "G_GHS" wellParaNameMap_en[71] = "G_NTF" wellParaNameMap_en[72] = "G_ERH" wellParaNameMap_en[73] = "G_BIAS" wellParaNameMap_en[74] = "G_TEMP" wellParaNameMap_en[75] = "G_GX" wellParaNameMap_en[76] = "G_GY" wellParaNameMap_en[77] = "G_GZ" wellParaNameMap_en[78] = "G_WX" wellParaNameMap_en[79] = "G_WY" wellParaNameMap_en[80] = "G_GT" wellParaNameMap_en[81] = "OAP" wellParaNameMap_en[82] = "FOP" wellParaNameMap_en[83] = "FOF" wellParaNameMap_en[84] = "DIFP" wellParaNameMap_en[86] = "GWWTORSX" wellParaNameMap_en[87] = "GWWTORSY" wellParaNameMap_en[88] = "Custom parameter1" wellParaNameMap_en[89] = "Custom parameter2" wellParaNameMap_en[90] = "Custom parameter3" wellParaNameMap_en[91] = "Custom parameter4" wellParaNameMap_en[92] = "Custom parameter5" wellParaNameMap_en[93] = "Custom parameter6" wellParaNameMap_en[94] = "Custom parameter7" wellParaNameMap_en[95] = "Custom parameter8" wellParaNameMap_en[96] = "Custom parameter9" wellParaNameMap_en[97] = "Custom parameter10" wellParaNameMap_en[98] = "Custom parameter11" wellParaNameMap_en[99] = "Custom parameter12" wellParaNameMap_en[100] = "Custom parameter13" wellParaNameMap_en[101] = "Custom parameter14" wellParaNameMap_en[102] = "Custom parameter15" wellParaNameMap_en[103] = "Custom parameter16" wellParaNameMap_en[104] = "SlipXVIB" wellParaNameMap_en[105] = "SlipZVIB" wellParaNameMap_en[106] = "SlipV" // wellParaNameMap_en[107] = "COLLARAZINC" // wellParaNameMap_en[108] = "NUPGAMMAzsh" // wellParaNameMap_en[109] = "NDOWNGAMMAzsh" // wellParaNameMap_en[110] = "NNGAMMAzsh" // wellParaNameMap_en[111] = "NINCzsh" // wellParaNameMap_en[112] = "NROzsh" // wellParaNameMap_en[113] = "NTEMPzsh" // wellParaNameMap_en[114] = "NLEFTGAMMAzsh" // wellParaNameMap_en[115] = "NRIGHTGAMMAzsh" // wellParaNameMap_en[116] = "NBXVI" // wellParaNameMap_en[117] = "NBZVI" wellParaNameMap_en[107] = "COLLARAZINC" wellParaNameMap_en[108] = "NearBit-UPGAMMAzsh" wellParaNameMap_en[109] = "NearBit-DOWNGAMMAzsh" wellParaNameMap_en[110] = "NearBit-NGAMMAzsh" wellParaNameMap_en[111] = "NearBit-INCzsh" wellParaNameMap_en[112] = "NearBit-ROzsh" wellParaNameMap_en[113] = "NearBit-TEMPzsh" wellParaNameMap_en[114] = "NearBit-LEFTGAMMAzsh" wellParaNameMap_en[115] = "NearBit-RIGHTGAMMAzsh" wellParaNameMap_en[116] = "NearBit-XVI" wellParaNameMap_en[117] = "NearBit-ZVI" wellParaNameMap_en[118] = "Secondary Battery Voltage" wellParaNameMap_en[119] = "Secondary Battery Quantity" //天意 start 212 wellParaNameMap_en[TY_START] = "起始序列" wellParaNameMap_en[TY_START+1] = "井斜高位" wellParaNameMap_en[TY_START+2] = "井斜低位" wellParaNameMap_en[TY_START+3] = "工具面" wellParaNameMap_en[TY_START+4] = "压力1" wellParaNameMap_en[TY_START+5] = "压力2" wellParaNameMap_en[TY_START+6] = "压力3" wellParaNameMap_en[TY_START+7] = "转速" wellParaNameMap_en[TY_START+8] = "导向模式编号" wellParaNameMap_en[TY_START+9] = "电机模式" wellParaNameMap_en[TY_START+10] = "造斜力" wellParaNameMap_en[TY_START+11] = "平移力" wellParaNameMap_en[TY_START+12] = "设置井斜_H" wellParaNameMap_en[TY_START+13] = "设置井斜_L" wellParaNameMap_en[TY_START+14] = "电机模式" wellParaNameMap_en[TY_START+15] = "电机模式" wellParaNameMap_en[TY_START+16] = "逆变中控转速" wellParaNameMap_en[TY_START+17] = "逆变输入电压" wellParaNameMap_en[TY_START+18] = "逆变输入电流" wellParaNameMap_en[TY_START+19] = "次级整流后电源电压" wellParaNameMap_en[TY_START+20] = "次级整流后电源电流" wellParaNameMap_en[TY_START+21] = "电子节48V电源电压" wellParaNameMap_en[TY_START+22] = "电机1转速" wellParaNameMap_en[TY_START+23] = "电机1电流" wellParaNameMap_en[TY_START+24] = "电机2转速" wellParaNameMap_en[TY_START+25] = "电机2电流" wellParaNameMap_en[TY_START+26] = "电机3转速" wellParaNameMap_en[TY_START+27] = "电机3电流" wellParaNameMap_en[TY_START+28] = "TG值_H" wellParaNameMap_en[TY_START+29] = "TG值_L" wellParaNameMap_en[TY_START+30] = "外套平均转速" wellParaNameMap_en[TY_START+31] = "30s轴向振动峰值" wellParaNameMap_en[TY_START+32] = "30s侧向振动峰值" wellParaNameMap_en[TY_START+33] = "温度" wellParaNameMap_en[TY_START+34] = "轴向冲击" wellParaNameMap_en[TY_START+35] = "侧向冲击" wellParaNameMap_en[TY_START+36] = "背压" wellParaNameMap_en[TY_START+37] = "通信状态" wellParaNameMap_en[TY_START+38] = "是否停钻" //0-停钻 1-未停钻 wellParaNameMap_en[TY_START+39] = "接收指令类型" wellParaNameMap_en[2000] = "井斜" wellParaNameMap_en[2001] = "设置井斜" wellParaNameMap_en[2002] = "TG值" wellParaNameMap[2005] = "PGAMMA" } func initwellParaUnitMap_en() { wellParaUnitMap_en = make(map[int]string) wellParaUnitMap_en[1] = "deg" wellParaUnitMap_en[2] = "deg" wellParaUnitMap_en[3] = "deg" wellParaUnitMap_en[4] = "deg" wellParaUnitMap_en[5] = "g" wellParaUnitMap_en[6] = "μT" wellParaUnitMap_en[7] = "deg" wellParaUnitMap_en[8] = "℃" wellParaUnitMap_en[9] = "V" wellParaUnitMap_en[10] = "V" wellParaUnitMap_en[11] = "r/min" wellParaUnitMap_en[12] = "g" wellParaUnitMap_en[13] = "API" wellParaUnitMap_en[14] = "r/min" wellParaUnitMap_en[15] = "deg" wellParaUnitMap_en[16] = "deg" wellParaUnitMap_en[17] = "" wellParaUnitMap_en[18] = "API" wellParaUnitMap_en[19] = "API" wellParaUnitMap_en[20] = "V" wellParaUnitMap_en[21] = "r/min" wellParaUnitMap_en[22] = "kN*m" wellParaUnitMap_en[23] = "kN" wellParaUnitMap_en[24] = "API " wellParaUnitMap_en[25] = "MPa" wellParaUnitMap_en[26] = "MPa" wellParaUnitMap_en[27] = "g" wellParaUnitMap_en[28] = "g" wellParaUnitMap_en[29] = "V" wellParaUnitMap_en[30] = "MPa" wellParaUnitMap_en[31] = "℃" wellParaUnitMap_en[32] = "API" wellParaUnitMap_en[33] = "API" wellParaUnitMap_en[34] = "API" wellParaUnitMap_en[35] = "API" wellParaUnitMap_en[36] = "r/min" wellParaUnitMap_en[37] = "deg" wellParaUnitMap_en[39] = "g" wellParaUnitMap_en[40] = "g" wellParaUnitMap_en[41] = "g" wellParaUnitMap_en[42] = "Gs" wellParaUnitMap_en[43] = "Gs" wellParaUnitMap_en[44] = "Gs" wellParaUnitMap_en[45] = "℃" wellParaUnitMap_en[46] = "API" wellParaUnitMap_en[47] = "API" wellParaUnitMap_en[48] = "API" wellParaUnitMap_en[49] = "API" wellParaUnitMap_en[50] = "API" wellParaUnitMap_en[51] = "API" wellParaUnitMap_en[52] = "API" wellParaUnitMap_en[53] = "g" wellParaUnitMap_en[54] = "'API" wellParaUnitMap_en[55] = "API" wellParaUnitMap_en[60] = "Ω.m" wellParaUnitMap_en[61] = "Ω.m" wellParaUnitMap_en[62] = "Ω.m" wellParaUnitMap_en[63] = "Ω.m" wellParaUnitMap_en[64] = "API" wellParaUnitMap_en[65] = "API" wellParaUnitMap_en[66] = "API" wellParaUnitMap_en[67] = "deg" wellParaUnitMap_en[68] = "deg" wellParaUnitMap_en[69] = "deg" wellParaUnitMap_en[70] = "deg" wellParaUnitMap_en[71] = "deg" wellParaUnitMap_en[72] = "deg/s" wellParaUnitMap_en[73] = "deg/s" wellParaUnitMap_en[74] = "℃" wellParaUnitMap_en[75] = "g" wellParaUnitMap_en[76] = "g" wellParaUnitMap_en[77] = "g" wellParaUnitMap_en[78] = "deg/s" wellParaUnitMap_en[79] = "deg/s" wellParaUnitMap_en[80] = "g" wellParaUnitMap_en[81] = "MPa" wellParaUnitMap_en[82] = "MPa" wellParaUnitMap_en[83] = "D/cP" wellParaUnitMap_en[84] = "MPa" wellParaUnitMap_en[86] = "kN*m" wellParaUnitMap_en[87] = "kN*m" wellParaUnitMap_en[88] = "" wellParaUnitMap_en[89] = "" wellParaUnitMap_en[90] = "" wellParaUnitMap_en[91] = "" wellParaUnitMap_en[92] = "" wellParaUnitMap_en[93] = "" wellParaUnitMap_en[94] = "" wellParaUnitMap_en[95] = "" wellParaUnitMap_en[96] = "" wellParaUnitMap_en[97] = "" wellParaUnitMap_en[98] = "" wellParaUnitMap_en[99] = "" wellParaUnitMap_en[100] = "" wellParaUnitMap_en[101] = "" wellParaUnitMap_en[102] = "" wellParaUnitMap_en[103] = "" wellParaUnitMap_en[104] = "g" wellParaUnitMap_en[105] = "g" wellParaUnitMap_en[106] = "%%" wellParaUnitMap_en[107] = "deg" wellParaUnitMap_en[108] = "API" wellParaUnitMap_en[109] = "API" wellParaUnitMap_en[110] = "API" wellParaUnitMap_en[111] = "deg" wellParaUnitMap_en[112] = "r/min" wellParaUnitMap_en[113] = "℃" wellParaUnitMap_en[114] = "API" wellParaUnitMap_en[115] = "API" wellParaUnitMap_en[116] = "g" wellParaUnitMap_en[117] = "g" wellParaUnitMap_en[118] = "V" wellParaUnitMap_en[119] = "Ah" //天意 start 212 wellParaUnitMap_en[TY_START] = "" wellParaUnitMap_en[TY_START+1] = "deg" wellParaUnitMap_en[TY_START+2] = "deg" wellParaUnitMap_en[TY_START+3] = "deg" wellParaUnitMap_en[TY_START+4] = "MPa" wellParaUnitMap_en[TY_START+5] = "MPa" wellParaUnitMap_en[TY_START+6] = "MPa" wellParaUnitMap_en[TY_START+7] = "r/min" wellParaUnitMap_en[TY_START+8] = "" wellParaUnitMap_en[TY_START+9] = "" wellParaUnitMap_en[TY_START+10] = "" wellParaUnitMap_en[TY_START+11] = "" wellParaUnitMap_en[TY_START+12] = "deg" wellParaUnitMap_en[TY_START+13] = "deg" wellParaUnitMap_en[TY_START+14] = "" wellParaUnitMap_en[TY_START+15] = "" wellParaUnitMap_en[TY_START+16] = "r/min" wellParaUnitMap_en[TY_START+17] = "V" wellParaUnitMap_en[TY_START+18] = "A" wellParaUnitMap_en[TY_START+19] = "V" wellParaUnitMap_en[TY_START+20] = "A" wellParaUnitMap_en[TY_START+21] = "V" wellParaUnitMap_en[TY_START+22] = "r/min" wellParaUnitMap_en[TY_START+23] = "A" wellParaUnitMap_en[TY_START+24] = "r/min" wellParaUnitMap_en[TY_START+25] = "A" wellParaUnitMap_en[TY_START+26] = "r/min" wellParaUnitMap_en[TY_START+27] = "A" wellParaUnitMap_en[TY_START+28] = "mG" wellParaUnitMap_en[TY_START+29] = "mG" wellParaUnitMap_en[TY_START+30] = "deg/s" wellParaUnitMap_en[TY_START+31] = "g" wellParaUnitMap_en[TY_START+32] = "g" wellParaUnitMap_en[TY_START+33] = "℃" wellParaUnitMap_en[TY_START+34] = "g" wellParaUnitMap_en[TY_START+35] = "g" wellParaUnitMap_en[TY_START+36] = "MPa" wellParaUnitMap_en[TY_START+37] = "" wellParaUnitMap_en[TY_START+38] = "" //0-停钻 1-未停钻 wellParaUnitMap_en[TY_START+39] = "" wellParaUnitMap_en[2000] = "deg" wellParaUnitMap_en[2001] = "deg" wellParaUnitMap_en[2002] = "mG" wellParaUnitMap_en[2005] = "API" } func initwellParaNameMap() { wellParaNameMap = make(map[int]string) wellParaNameMap[1] = "井斜" wellParaNameMap[2] = "方位" wellParaNameMap[3] = "重工面" wellParaNameMap[4] = "磁工面" wellParaNameMap[5] = "重力和" wellParaNameMap[6] = "磁场强度" wellParaNameMap[7] = "磁倾角" wellParaNameMap[8] = "温度" wellParaNameMap[9] = "BV" wellParaNameMap[10] = "副电池供电电压" wellParaNameMap[11] = "转速" wellParaNameMap[12] = "振动" wellParaNameMap[13] = "GAMMA" wellParaNameMap[14] = "近钻头转速" wellParaNameMap[15] = "近钻头井斜" wellParaNameMap[16] = "近钻头重工面" wellParaNameMap[17] = "接受天线信号幅值" wellParaNameMap[18] = "近钻头自然伽马" wellParaNameMap[19] = "近钻头上伽马" wellParaNameMap[20] = "近钻头电压" wellParaNameMap[21] = "GW转速" wellParaNameMap[22] = "GW扭矩" wellParaNameMap[23] = "GW钻压" wellParaNameMap[24] = "近钻头左伽马 " wellParaNameMap[25] = "GW内环空压力" wellParaNameMap[26] = "GW外环空压力" wellParaNameMap[27] = "GW横向振动" wellParaNameMap[28] = "GW纵向振动" wellParaNameMap[29] = "近钻头电池电压" wellParaNameMap[30] = "近钻头外环空压力" wellParaNameMap[31] = "近钻头温度" wellParaNameMap[32] = "近钻头下伽马" wellParaNameMap[33] = "探管式方位上伽马" wellParaNameMap[34] = "探管式方位下伽马" wellParaNameMap[35] = "探管式方位左伽马" wellParaNameMap[36] = "发动机转速" wellParaNameMap[37] = "近钻头井斜" wellParaNameMap[39] = "Gx" wellParaNameMap[40] = "Gy" wellParaNameMap[41] = "Gz" wellParaNameMap[42] = "Mx" wellParaNameMap[43] = "My" wellParaNameMap[44] = "Mz" wellParaNameMap[45] = "GW温度" wellParaNameMap[46] = "探管式方位右伽玛" wellParaNameMap[47] = "钻铤式方位上伽马" wellParaNameMap[48] = "钻铤式方位下伽玛" wellParaNameMap[49] = "近钻头右伽马" wellParaNameMap[50] = "天意下伽玛" wellParaNameMap[51] = "天意上伽玛" wellParaNameMap[52] = "天意自然伽玛" wellParaNameMap[53] = "GW粘滑振动" wellParaNameMap[54] = "'钻铤式方位左伽马" wellParaNameMap[55] = "钻铤式方位右伽玛" wellParaNameMap[60] = "R12PHF" wellParaNameMap[61] = "R34PHF" wellParaNameMap[62] = "R12PLF" wellParaNameMap[63] = "R34PLF" wellParaNameMap[64] = "RNGAMMA" wellParaNameMap[65] = "RUPGAMMA" wellParaNameMap[66] = "RDOWNGAMMA" wellParaNameMap[67] = "RINC" wellParaNameMap[68] = "随钻陀螺井斜" wellParaNameMap[69] = "随钻陀螺方位" wellParaNameMap[70] = "随钻陀螺重工面" wellParaNameMap[71] = "随钻陀螺北向高边" wellParaNameMap[72] = "G_ERH" wellParaNameMap[73] = "G_BIAS" wellParaNameMap[74] = "G_TEMP" wellParaNameMap[75] = "G_GX" wellParaNameMap[76] = "G_GY" wellParaNameMap[77] = "G_GZ" wellParaNameMap[78] = "G_WX" wellParaNameMap[79] = "G_WY" wellParaNameMap[80] = "G_GT" wellParaNameMap[81] = "外环空压力" wellParaNameMap[82] = "地层压力" wellParaNameMap[83] = "底层流度" wellParaNameMap[84] = "油泵差压" wellParaNameMap[86] = "工程参数弯矩X" wellParaNameMap[87] = "工程参数弯矩Y" wellParaNameMap[88] = "自定义参数1" wellParaNameMap[89] = "自定义参数2" wellParaNameMap[90] = "自定义参数3" wellParaNameMap[91] = "自定义参数4" wellParaNameMap[92] = "自定义参数5" wellParaNameMap[93] = "自定义参数6" wellParaNameMap[94] = "自定义参数7" wellParaNameMap[95] = "自定义参数8" wellParaNameMap[96] = "自定义参数9" wellParaNameMap[97] = "自定义参数10" wellParaNameMap[98] = "自定义参数11" wellParaNameMap[99] = "自定义参数12" wellParaNameMap[100] = "自定义参数13" wellParaNameMap[101] = "自定义参数14" wellParaNameMap[102] = "自定义参数15" wellParaNameMap[103] = "自定义参数16" wellParaNameMap[104] = "横向振动" wellParaNameMap[105] = "纵向振动" wellParaNameMap[106] = "粘滑" wellParaNameMap[107] = "钻铤式方位伽马井斜" wellParaNameMap[108] = "zsh上伽马" wellParaNameMap[109] = "zsh下伽马" wellParaNameMap[110] = "zsh总伽马" wellParaNameMap[111] = "zsh井斜" wellParaNameMap[112] = "zsh转速" wellParaNameMap[113] = "zsh温度" wellParaNameMap[114] = "zsh左伽马" wellParaNameMap[115] = "zsh右伽马" wellParaNameMap[116] = "近钻头横向振动" wellParaNameMap[117] = "近钻头纵向振动" wellParaNameMap[118] = "副电池电压" wellParaNameMap[119] = "副电池电量" //天意 start 212 wellParaNameMap[TY_START] = "起始序列" wellParaNameMap[TY_START+1] = "井斜高位" wellParaNameMap[TY_START+2] = "井斜低位" wellParaNameMap[TY_START+3] = "工具面" wellParaNameMap[TY_START+4] = "压力1" wellParaNameMap[TY_START+5] = "压力2" wellParaNameMap[TY_START+6] = "压力3" wellParaNameMap[TY_START+7] = "转速" wellParaNameMap[TY_START+8] = "导向模式编号" wellParaNameMap[TY_START+9] = "电机模式" wellParaNameMap[TY_START+10] = "造斜力" wellParaNameMap[TY_START+11] = "平移力" wellParaNameMap[TY_START+12] = "设置井斜_H" wellParaNameMap[TY_START+13] = "设置井斜_L" wellParaNameMap[TY_START+14] = "电机模式" wellParaNameMap[TY_START+15] = "电机模式" wellParaNameMap[TY_START+16] = "逆变中控转速" wellParaNameMap[TY_START+17] = "逆变输入电压" wellParaNameMap[TY_START+18] = "逆变输入电流" wellParaNameMap[TY_START+19] = "次级整流后电源电压" wellParaNameMap[TY_START+20] = "次级整流后电源电流" wellParaNameMap[TY_START+21] = "电子节48V电源电压" wellParaNameMap[TY_START+22] = "电机1转速" wellParaNameMap[TY_START+23] = "电机1电流" wellParaNameMap[TY_START+24] = "电机2转速" wellParaNameMap[TY_START+25] = "电机2电流" wellParaNameMap[TY_START+26] = "电机3转速" wellParaNameMap[TY_START+27] = "电机3电流" wellParaNameMap[TY_START+28] = "TG值_H" wellParaNameMap[TY_START+29] = "TG值_L" wellParaNameMap[TY_START+30] = "外套平均转速" wellParaNameMap[TY_START+31] = "30s轴向振动峰值" wellParaNameMap[TY_START+32] = "30s侧向振动峰值" wellParaNameMap[TY_START+33] = "温度" wellParaNameMap[TY_START+34] = "轴向冲击" wellParaNameMap[TY_START+35] = "侧向冲击" wellParaNameMap[TY_START+36] = "背压" wellParaNameMap[TY_START+37] = "通信状态" wellParaNameMap[TY_START+38] = "是否停钻" //0-停钻 1-未停钻 wellParaNameMap[TY_START+39] = "接收指令类型" wellParaNameMap[2000] = "井斜" wellParaNameMap[2001] = "设置井斜" wellParaNameMap[2002] = "TG值" wellParaNameMap[2005] = "探管式自然伽马" } func initwellParaUnitMap() { wellParaUnitMap = make(map[int]string) wellParaUnitMap[1] = "deg" wellParaUnitMap[2] = "deg" wellParaUnitMap[3] = "deg" wellParaUnitMap[4] = "deg" wellParaUnitMap[5] = "g" wellParaUnitMap[6] = "μT" wellParaUnitMap[7] = "deg" wellParaUnitMap[8] = "℃" wellParaUnitMap[9] = "V" wellParaUnitMap[10] = "V" wellParaUnitMap[11] = "r/min" wellParaUnitMap[12] = "g" wellParaUnitMap[13] = "API" wellParaUnitMap[14] = "r/min" wellParaUnitMap[15] = "deg" wellParaUnitMap[16] = "deg" wellParaUnitMap[17] = "" wellParaUnitMap[18] = "API" wellParaUnitMap[19] = "API" wellParaUnitMap[20] = "V" wellParaUnitMap[21] = "r/min" wellParaUnitMap[22] = "kN*m" wellParaUnitMap[23] = "kN" wellParaUnitMap[24] = "API " wellParaUnitMap[25] = "MPa" wellParaUnitMap[26] = "MPa" wellParaUnitMap[27] = "g" wellParaUnitMap[28] = "g" wellParaUnitMap[29] = "V" wellParaUnitMap[30] = "MPa" wellParaUnitMap[31] = "℃" wellParaUnitMap[32] = "API" wellParaUnitMap[33] = "API" wellParaUnitMap[34] = "API" wellParaUnitMap[35] = "API" wellParaUnitMap[36] = "r/min" wellParaUnitMap[37] = "deg" wellParaUnitMap[39] = "g" wellParaUnitMap[40] = "g" wellParaUnitMap[41] = "g" wellParaUnitMap[42] = "Gs" wellParaUnitMap[43] = "Gs" wellParaUnitMap[44] = "Gs" wellParaUnitMap[45] = "℃" wellParaUnitMap[46] = "API" wellParaUnitMap[47] = "API" wellParaUnitMap[48] = "API" wellParaUnitMap[49] = "API" wellParaUnitMap[50] = "API" wellParaUnitMap[51] = "API" wellParaUnitMap[52] = "API" wellParaUnitMap[53] = "g" wellParaUnitMap[54] = "'API" wellParaUnitMap[55] = "API" wellParaUnitMap[60] = "Ω.m" wellParaUnitMap[61] = "Ω.m" wellParaUnitMap[62] = "Ω.m" wellParaUnitMap[63] = "Ω.m" wellParaUnitMap[64] = "API" wellParaUnitMap[65] = "API" wellParaUnitMap[66] = "API" wellParaUnitMap[67] = "deg" wellParaUnitMap[68] = "deg" wellParaUnitMap[69] = "deg" wellParaUnitMap[70] = "deg" wellParaUnitMap[71] = "deg" wellParaUnitMap[72] = "°/s" wellParaUnitMap[73] = "°/s" wellParaUnitMap[74] = "℃" wellParaUnitMap[75] = "g" wellParaUnitMap[76] = "g" wellParaUnitMap[77] = "g" wellParaUnitMap[78] = "deg/s" wellParaUnitMap[79] = "deg/s" wellParaUnitMap[80] = "g" wellParaUnitMap[81] = "MPa" wellParaUnitMap[82] = "MPa" wellParaUnitMap[83] = "D/cP" wellParaUnitMap[84] = "MPa" wellParaUnitMap[86] = "kN*m" wellParaUnitMap[87] = "kN*m" wellParaUnitMap[88] = "" wellParaUnitMap[89] = "" wellParaUnitMap[90] = "" wellParaUnitMap[91] = "" wellParaUnitMap[92] = "" wellParaUnitMap[93] = "" wellParaUnitMap[94] = "" wellParaUnitMap[95] = "" wellParaUnitMap[96] = "" wellParaUnitMap[97] = "" wellParaUnitMap[98] = "" wellParaUnitMap[99] = "" wellParaUnitMap[100] = "" wellParaUnitMap[101] = "" wellParaUnitMap[102] = "" wellParaUnitMap[103] = "" wellParaUnitMap[104] = "g" wellParaUnitMap[105] = "g" wellParaUnitMap[106] = "%%" wellParaUnitMap[107] = "deg" wellParaUnitMap[108] = "API" wellParaUnitMap[109] = "API" wellParaUnitMap[110] = "API" wellParaUnitMap[111] = "deg" wellParaUnitMap[112] = "r/min" wellParaUnitMap[113] = "℃" wellParaUnitMap[114] = "API" wellParaUnitMap[115] = "API" wellParaUnitMap[116] = "g" wellParaUnitMap[117] = "g" wellParaUnitMap[118] = "V" wellParaUnitMap[119] = "Ah" //天意 start 212 wellParaUnitMap[TY_START] = "" wellParaUnitMap[TY_START+1] = "deg" wellParaUnitMap[TY_START+2] = "deg" wellParaUnitMap[TY_START+3] = "deg" wellParaUnitMap[TY_START+4] = "MPa" wellParaUnitMap[TY_START+5] = "MPa" wellParaUnitMap[TY_START+6] = "MPa" wellParaUnitMap[TY_START+7] = "r/min" wellParaUnitMap[TY_START+8] = "" wellParaUnitMap[TY_START+9] = "" wellParaUnitMap[TY_START+10] = "" wellParaUnitMap[TY_START+11] = "" wellParaUnitMap[TY_START+12] = "deg" wellParaUnitMap[TY_START+13] = "deg" wellParaUnitMap[TY_START+14] = "" wellParaUnitMap[TY_START+15] = "" wellParaUnitMap[TY_START+16] = "r/min" wellParaUnitMap[TY_START+17] = "V" wellParaUnitMap[TY_START+18] = "A" wellParaUnitMap[TY_START+19] = "V" wellParaUnitMap[TY_START+20] = "A" wellParaUnitMap[TY_START+21] = "V" wellParaUnitMap[TY_START+22] = "r/min" wellParaUnitMap[TY_START+23] = "A" wellParaUnitMap[TY_START+24] = "r/min" wellParaUnitMap[TY_START+25] = "A" wellParaUnitMap[TY_START+26] = "r/min" wellParaUnitMap[TY_START+27] = "A" wellParaUnitMap[TY_START+28] = "mG" wellParaUnitMap[TY_START+29] = "mG" wellParaUnitMap[TY_START+30] = "deg/s" wellParaUnitMap[TY_START+31] = "g" wellParaUnitMap[TY_START+32] = "g" wellParaUnitMap[TY_START+33] = "℃" wellParaUnitMap[TY_START+34] = "g" wellParaUnitMap[TY_START+35] = "g" wellParaUnitMap[TY_START+36] = "MPa" wellParaUnitMap[TY_START+37] = "" wellParaUnitMap[TY_START+38] = "" //0-停钻 1-未停钻 wellParaUnitMap[TY_START+39] = "" wellParaUnitMap[2000] = "deg" wellParaUnitMap[2001] = "deg" wellParaUnitMap[2002] = "mG" wellParaUnitMap[2005] = "API" } func fileServerG() { http.Handle("/file/", http.StripPrefix("/file/", http.FileServer(http.Dir(modelePath+"/authfile")))) err := http.ListenAndServe("0.0.0.0:8881", nil) if err != nil { fmt.Println("服务器错误8881") } } func uploadFile() { http.Handle("/upload/", http.StripPrefix("/upload/", http.FileServer(http.Dir(modelePath+"/upload")))) err := http.ListenAndServe("0.0.0.0:8882", nil) if err != nil { fmt.Print(err) } } func init_month_en_name() { month_en_name = make(map[string]string) month_en_name["01"] = "Jan" month_en_name["02"] = "Feb" month_en_name["03"] = "Mar" month_en_name["04"] = "Apr" month_en_name["05"] = "May" month_en_name["06"] = "June" month_en_name["07"] = "July" month_en_name["08"] = "Aug" month_en_name["09"] = "Sep" month_en_name["10"] = "Oct" month_en_name["11"] = "Nov" month_en_name["12"] = "Dec" } func convert_2_time(time_str string) (t time.Time) { timeLayout := "2006-01-02 15:04:05" loc, _ := time.LoadLocation("Local") t, _ = time.ParseInLocation(timeLayout, time_str, loc) return } func init() { spe_user = make(map[string]string) // k-v 登录用户-上传用户 spe_user["320009"] = "李勇政" //定制的上传用户是写死的。 spe_user["198688"] = "涂建平" //定制的上传用户是写死的。 spe_user["DC_acount"] = "DC_acount" //定制的上传用户是写死的。 spe_user["320010"] = "320010" //川东实验账号 有效期3个月 Overdue_account = make(map[string]string) Overdue_account["320010"] = "2025-12-01 00:00:00" init_month_en_name() pageSetting = make(map[string]page_setting_req) var err error cBuff, err = xdb.LoadContentFromFile(dbPath) if err != nil { fmt.Printf("failed to load content from `%s`: %s\n", dbPath, err) os.Exit(0) } ch_battery_info = make(chan battery_info, 100) ch_battery_notify = make(chan int, 100) refreshSpan = 5 //5s // ExpireTimeSpan = time.Second * 25 ExpireTimeSpan = time.Minute * 300 // 改为30分钟 wsRealWellDataUpdateMap = make(map[string]string) wellNamemap = make(map[string]string) lastUpdateTime = time.Now() initLog() server = beego.AppConfig.String("server") port, _ = beego.AppConfig.Int("port") user = beego.AppConfig.String("user") password = beego.AppConfig.String("password") database = beego.AppConfig.String("database") initSqlPool("odbc") err = initWellnamesMap() if err != nil { logs.Info("initWellnamesMap err:", err.Error()) os.Exit(0) } initwellParaNameMap() initwellParaUnitMap() initwellParaNameMap_en() initwellParaUnitMap_en() userLevelMap = make(map[string]int) userLevelMap["系统管理员"] = 0 userLevelMap["部门经理"] = 1 userLevelMap["区域经理"] = 1 userLevelMap["项目组长"] = 1 userLevelMap["授权管理员"] = 2 userLevelMap["审核专员"] = 3 userLevelMap["区域工程师"] = 3 userLevelMap["部门成员"] = 3 userLevelMap["项目成员"] = 3 userLevelMap["访客"] = 4 sync_page_setting() } func main() { //exportTestType() //return go collect_nb_g() go checkFileExpired() //fileserver go fileServerG() go uploadFile() http.HandleFunc("/test", test) http.Handle("/ws", websocket.Handler(HandleSubscribe)) http.HandleFunc("/deescloud/getWell", getWell) http.HandleFunc("/deescloud/getWell_en", getWell_en) http.HandleFunc("/deescloud/getWellHistory", getWellHistory) http.HandleFunc("/deescloud/getWellHistory_en", getWellHistory_en) http.HandleFunc("/deescloud/exportWellHistory", exportWellHistory) http.HandleFunc("/deescloud/exportWellHistory_en", exportWellHistory_en) http.HandleFunc("/deescloud/getWellNames", getWellNames) http.HandleFunc("/deescloud/getWellRealData", getWellRealTimeData) http.HandleFunc("/deescloud/getWellRealData_en", getWellRealTimeData_en) http.HandleFunc("/deescloud/getUsers", getUsers) http.HandleFunc("/deescloud/postUser", postUser) http.HandleFunc("/deescloud/login", Login) http.HandleFunc("/deescloud/loginOut", LoginOut) http.HandleFunc("/deescloud/refreshUser", refreshUser) http.HandleFunc("/deescloud/getAuth", getAuth) http.HandleFunc("/deescloud/postAuth", postAuth) http.HandleFunc("/deescloud/getDeesAuth", getDeesAuth) http.HandleFunc("/deescloud/getDeesAuthDb", getDeesAuthDb) http.HandleFunc("/deescloud/getMenu", getMenu) http.HandleFunc("/deescloud/getMenu_en", getMenu_en) http.HandleFunc("/deescloud/getMh", getMh) http.HandleFunc("/deescloud/getMh_en", getMh_en) http.HandleFunc("/deescloud/getMhS", getMhS) http.HandleFunc("/deescloud/getMhCsv", getMhCsv) http.HandleFunc("/deescloud/getMhCsv_en", getMhCsv_en) http.HandleFunc("/deescloud/getMhSCsv", getMhSCsv) http.HandleFunc("/deescloud/getMhSCsv_en", getMhSCsv_en) http.HandleFunc("/deescloud/getMs", getMs) http.HandleFunc("/deescloud/getMss", getMss) http.HandleFunc("/deescloud/getMss_en", getMss_en) http.HandleFunc("/deescloud/getMsCsv", getMsCsv) http.HandleFunc("/deescloud/getMsCsv_en", getMsCsv_en) http.HandleFunc("/deescloud/getMssCsv", getMssCsv) http.HandleFunc("/deescloud/getMssCsv_en", getMssCsv_en) http.HandleFunc("/deescloud/getuh", getUserOpHistory) http.HandleFunc("/deescloud/getts", getTs) http.HandleFunc("/deescloud/exportts", getTsCsv) http.HandleFunc("/deescloud/exportts_en", getTsCsv_en) http.HandleFunc("/deescloud/getts_details", getTsDetails) http.HandleFunc("/deescloud/getts_details_en", getTsDetails_en) http.HandleFunc("/deescloud/getfr", getFaultRate) http.HandleFunc("/deescloud/exportfr", getFaultRateCsv) http.HandleFunc("/deescloud/exportfr_en", getFaultRateCsv_en) http.HandleFunc("/deescloud/getwtt", getWellTestType) http.HandleFunc("/deescloud/getwtt_en", getWellTestType_en) http.HandleFunc("/deescloud/getWellTypeCsv", exportTestType) http.HandleFunc("/deescloud/getWellTypeCsv_en", exportTestType_en) http.HandleFunc("/deescloud/get_mt_analysis", getMtAnalysisCsv) http.HandleFunc("/deescloud/get_mt_analysis_en", getMtAnalysisCsv_en) //http.HandleFunc("/deescloud/updateMhSetting", UpdateMhSetting) //http.HandleFunc("/deescloud/GetMhSetting", GetMhSetting) http.HandleFunc("/deescloud/postFrSetting", postFrSetting) http.HandleFunc("/deescloud/getFrSetting", GetFrSetting) http.HandleFunc("/deescloud/getMsSetting", getMsSetting) http.HandleFunc("/deescloud/postMsSetting", postMsSetting) http.HandleFunc("/deescloud/deesAddUser", addUserByDees) http.HandleFunc("/deescloud/registerUser", registerUser) http.HandleFunc("/deescloud/getWellWorkingCondition", getWellWorkingCondition) http.HandleFunc("/deescloud/getAuthorizePosCsv", getAuthorizePosCsv) http.HandleFunc("/deescloud/getSeriesWarningCsv", getSeriesWarningCsv) http.HandleFunc("/deescloud/getSeriesWarningCsv_en", getSeriesWarningCsv_en) http.HandleFunc("/deescloud/batchAuth", batchAuth) http.HandleFunc("/deescloud/getWellEx", getWellEx) http.HandleFunc("/deescloud/getWellEx_en", getWellEx_en) http.HandleFunc("/deescloud/get_well_es", get_well_es) http.HandleFunc("/deescloud/get_well_es_en", get_well_es_en) http.HandleFunc("/deescloud/getWellEx1", getWellEx1) http.HandleFunc("/deescloud/getWellEx1_en", getWellEx1_en) http.HandleFunc("/deescloud/get_well_history", get_well_history) http.HandleFunc("/deescloud/get_well_history_en", get_well_history_en) http.HandleFunc("/deescloud/getEs", getEs) http.HandleFunc("/deescloud/getEsCsv", getEsCsv) http.HandleFunc("/deescloud/getEsCsv_en", getEsCsv_en) http.HandleFunc("/deescloud/getUserLoginCntCsv", getUserLoginCntCsv) http.HandleFunc("/deescloud/getUserLoginCnt", getUserLoginCnt) http.HandleFunc("/deescloud/getAuthHisPos", getAuthHisPos) http.HandleFunc("/deescloud/getWellAnalysisResult", getWellAnalysisResult) http.HandleFunc("/deescloud/getWellAnalysisResult_en", getWellAnalysisResult_en) http.HandleFunc("/deescloud/getLcm", getLcm) http.HandleFunc("/deescloud/postLcm", postLcm) http.HandleFunc("/deescloud/getLcm_ex", getLcm_ex) http.HandleFunc("/deescloud/postLcm_ex", postLcm_ex) http.HandleFunc("/deescloud/getLcmDevice", getLcmDevice) http.HandleFunc("/deescloud/postLcmDevice", postLcmDevice) http.HandleFunc("/deescloud/getLcmMss", getLcmMss) http.HandleFunc("/deescloud/getNotify", getNotify) http.HandleFunc("/deescloud/getNotify_en", getNotify_en) http.HandleFunc("/deescloud/deesUserAuth", userAuth) http.HandleFunc("/deescloud/get_nb", get_nb) http.HandleFunc("/deescloud/get_nb_his", get_nb_his) http.HandleFunc("/deescloud/get_nb_his_en", get_nb_his_en) http.HandleFunc("/deescloud/add_nb_his", add_nb_his) http.HandleFunc("/deescloud/update_nb_his", update_nb_his) http.HandleFunc("/deescloud/remove_nb_his", remove_nb_his) http.HandleFunc("/deescloud/get_nb_csv", get_nb_csv) http.HandleFunc("/deescloud/get_nb_csv_en", get_nb_csv_en) http.HandleFunc("/deescloud/get_nb_warning_csv", get_nb_warning_csv) http.HandleFunc("/deescloud/get_nb_warning_csv_en", get_nb_warning_csv_en) http.HandleFunc("/deescloud/get_well_cmp", get_well_cmp) http.HandleFunc("/deescloud/get_well_cmp_en", get_well_cmp_en) http.HandleFunc("/deescloud/get_cmr", get_cmr) http.HandleFunc("/deescloud/get_cmr_record", get_cmr_record) http.HandleFunc("/deescloud/get_cmr_record_en", get_cmr_record_en) http.HandleFunc("/deescloud/get_cmr_pdf", get_cmr_pdf) http.HandleFunc("/deescloud/get_cmr_pdf_en", get_cmr_pdf_en) http.HandleFunc("/deescloud/get_srr_base", get_srr_base) http.HandleFunc("/deescloud/get_srr_state", get_srr_state) http.HandleFunc("/deescloud/get_srr_event", get_srr_event) http.HandleFunc("/deescloud/get_srr_event_en", get_srr_event_en) http.HandleFunc("/deescloud/get_srr_pdf", get_srr_pdf) http.HandleFunc("/deescloud/get_srr_pdf_en", get_srr_pdf_en) http.HandleFunc("/deescloud/get_vibration_report_pdf", get_vibration_report_pdf) http.HandleFunc("/deescloud/get_well_tool", get_well_tool) http.HandleFunc("/deescloud/get_tool_warning", get_tool_warning) http.HandleFunc("/deescloud/get_tool_warning_en", get_tool_warning_en) http.HandleFunc("/deescloud/get_tool_warning_pdf", get_tool_warning_pdf) http.HandleFunc("/deescloud/get_tool_mess_pdf", get_tool_mess_pdf) http.HandleFunc("/deescloud/get_tool_mess_pdf_en", get_tool_mess_pdf_en) http.HandleFunc("/deescloud/get_tool_warning_pdf_en", get_tool_warning_pdf_en) http.HandleFunc("/deescloud/get_dev_manage", get_dev_manage) http.HandleFunc("/deescloud/add_dev_manage", add_dev_manage) http.HandleFunc("/deescloud/update_dev_manage", update_dev_manage) http.HandleFunc("/deescloud/remove_dev_manage", remove_dev_manage) http.HandleFunc("/deescloud/get_dev_manage_pdf", get_dev_manage_pdf) http.HandleFunc("/deescloud/get_dev_manage_pdf_en", get_dev_manage_pdf_en) http.HandleFunc("/deescloud/get_well_dev", get_well_dev) http.HandleFunc("/deescloud/get_well_dev_en", get_well_dev_en) http.HandleFunc("/deescloud/get_well_files", get_well_files) http.HandleFunc("/deescloud/download_file", download_file) http.HandleFunc("/deescloud/get_up_off_well_info", get_up_off_well_info) http.HandleFunc("/deescloud/get_up_off_well_csv", get_up_off_well_csv) http.HandleFunc("/deescloud/page_setting", page_setting) http.HandleFunc("/deescloud/get_page_setting", get_page_setting) http.HandleFunc("/deescloud/add_battery_base", add_battery_base) http.HandleFunc("/deescloud/get_battery_base", get_battery_base) http.HandleFunc("/deescloud/remove_battery_base", remove_battery_base) http.HandleFunc("/deescloud/get_nb_his_ex", get_nb_his_ex) http.HandleFunc("/deescloud/get_nb_pdf", get_nb_pdf) http.HandleFunc("/deescloud/get_well_nb_pdf", get_well_nb_pdf) http.HandleFunc("/deescloud/get_nb_pdf_en", get_nb_pdf_en) http.HandleFunc("/deescloud/get_well_nb_pdf_en", get_well_nb_pdf_en) http.HandleFunc("/deescloud/get_well_cur_data", get_well_cur_data) http.HandleFunc("/deescloud/get_well_nb", get_well_nb) http.HandleFunc("/deescloud/get_well_instrument_timeout", get_well_instrument_timeout) http.HandleFunc("/deescloud/get_well_ver_timeout", get_well_ver_timeout) http.HandleFunc("/deescloud/add_b_life", add_battery_life) http.HandleFunc("/deescloud/remove_blife", remove_battery_life) http.HandleFunc("/deescloud/get_b_life", get_battery_life) http.HandleFunc("/deescloud/get_tool_WarningCsv", get_tool_WarningCsv) http.HandleFunc("/deescloud/getInstrumentMess", getInstrumentMess) http.HandleFunc("/deescloud/getInstrumentMess_en", getInstrumentMess_en) http.HandleFunc("/deescloud/addQualityData", addQualityData) http.HandleFunc("/deescloud/getQualityData", getQualityData) http.HandleFunc("/deescloud/upload", upload) http.HandleFunc("/deescloud/download_ds_file", download_ds_file) http.HandleFunc("/deescloud/delete_ds_file", delete_ds_file) http.HandleFunc("/deescloud/saveLinkData", saveLinkData) http.HandleFunc("/deescloud/get_dev_list", get_dev_list) http.HandleFunc("/deescloud/export_Seir_detail", export_Seir_detail) http.HandleFunc("/deescloud/export_Well_detail", export_Well_detail) http.HandleFunc("/deescloud/getQueryWell", getQueryWell) http.HandleFunc("/deescloud/export_Seir_detail_en", export_Seir_detail_en) http.HandleFunc("/deescloud/export_Well_detail_en", export_Well_detail_en) //监听服务 fmt.Println("listen server ...") err := http.ListenAndServe("0.0.0.0:8880", nil) if err != nil { fmt.Println("服务器错误") } } func remove_battery_life(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("remove_battery_base recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req remove_battery_base_req json.Unmarshal(reqdata, &req) var selSql string var resp CommonResp b := checkUserIfOnline(req.OpUser) if !b { resp.Ret = -1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } user_info, _ := getUserInfo(req.OpUser) userPositionLevel := getUserLevel(user_info.Userrole) if userPositionLevel != 0 && user_info.UserDepartment != "维保部" { resp.Ret = 1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } selSql = fmt.Sprintf(` delete from [battery_life] where [ID]=%d`, req.ID) fmt.Println() _, err := sqlConn.Exec(selSql) if err != nil { logs.Error("remove_battery_life exec Error", err.Error()) return } ch_battery_notify <- 1 jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("remove_battery_life recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_battery_life(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_battery_life recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_battery_base_req json.Unmarshal(reqdata, &req) var resp get_battery_life_resp var sel_sql string var ifwhere bool var whereSql string if req.B_code != "" { likestr := "%" + req.B_code + "%" whereSql += fmt.Sprintf(` [b_code] like '%s' `, likestr) ifwhere = true } if ifwhere { sel_sql = fmt.Sprintf(`SELECT [ID] ,[b_code] ,[b_life] FROM [battery_life] where %s order by ID desc`, whereSql) } else { sel_sql = fmt.Sprintf(`SELECT [ID] ,[b_code] ,[b_life] FROM [battery_life] order by ID desc`) } fmt.Println(sel_sql) rows, err := sqlConn.Query(sel_sql) if err == nil { for rows.Next() { var d Battery_life if err = rows.Scan(&d.ID, &d.B_code, &d.B_life); err == nil { resp.Data = append(resp.Data, d) } } rows.Close() } resp.Total = len(resp.Data) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_battery_life recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func add_battery_life(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("add_battery_life recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req add_battery_life_req json.Unmarshal(reqdata, &req) var selSql string var resp CommonResp b := checkUserIfOnline(req.OpUser) if !b { resp.Ret = -1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } user_info, _ := getUserInfo(req.OpUser) userPositionLevel := getUserLevel(user_info.Userrole) if userPositionLevel != 0 && user_info.UserDepartment != "维保部" { resp.Ret = 1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } selSql = fmt.Sprintf(` delete from [battery_life] where [b_code]='%s'`, req.B_code) _, err := sqlConn.Exec(selSql) if err != nil { logs.Error("add_battery_life exec Error", err.Error()) return } selSql = fmt.Sprintf(`INSERT INTO [battery_life] ([b_code] ,[b_life] ) VALUES ('%s' ,'%s')`, req.B_code, req.B_life) //fmt.Println(selSql) _, err = sqlConn.Exec(selSql) if err != nil { logs.Error("add_battery_life exec Error", err.Error()) return } ch_battery_notify <- 1 jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("add_battery_life recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_well_ver_timeout(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("get_well_ver_timeout recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetMssReq json.Unmarshal(reqdata, &req) // ps_info := get_ps_info(req.OpUser) var resp GetMssResp var whereSql string = " where [if_available] !=1" if req.WellName != "" { whereSql += fmt.Sprintf(` and wellname ='%s' `, req.WellName) } if req.Series != "" { whereSql += " and series like '%" + req.Series + "%'" } if req.Instrument_id != "" { whereSql += " and instrument_id like '%" + req.Instrument_id + "%'" } if req.Checked { likeid := fmt.Sprintf(" and [service_type]=1") whereSql += likeid } if spe_name, ok := spe_user[req.OpUser]; ok { likeid := fmt.Sprintf(" and [ClOUDACCOUNT]='%s' ", spe_name) whereSql += likeid } // orderBySql := " order by saveTime desc" selSql := fmt.Sprintf(`select [series],[instrument_id],[ver],[lastVer],[workTime] from [analysis_result_mss] `) if whereSql != "" { selSql += whereSql } fmt.Println(selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error(fmt.Sprintf("getMss db query err:%s", err.Error())) jdata, _ := json.Marshal(resp) response.Write(jdata) return } var rds []GetMssRespData // timeLayout := "2006-01-02 15:04:05" // loc, _ := time.LoadLocation("Local") for row.Next() { // var id int var v GetMssRespData if err = row.Scan(&v.Series, &v.InstrumentID, &v.Ver, &v.LastVer, &v.WorkTime); err == nil { //opTime, _ := time.ParseInLocation(timeLayout, v.SaveTime, loc) if true /*time.Now().Sub(opTime).Hours() < 24*30 */ { /*wt, _ := strconv.Atoi(v.WorkTime) if wt > 1000 { v.Warn_type = "建议进行维保" } else { }*/ var n1, n2 int d := strings.Split(v.Ver, ".") if len(d) == 3 { t1, _ := strconv.Atoi(d[0]) t2, _ := strconv.Atoi(d[1]) t3, _ := strconv.Atoi(d[2]) if t1 < 100 && t2 < 100 && t3 < 100 { n1 = t1*10000 + t2*100 // n1 = t1*10000 + t2*100 + t3 //ver = fmt.Sprintf("%02d.%02d.%02d", t1, t2, t3) } } else if len(d) == 2 { t1, _ := strconv.Atoi(d[0]) t2, _ := strconv.Atoi(d[1]) if t1 < 100 && t2 < 100 { n1 = t1*100 + t2 //ver = fmt.Sprintf("00.%02d.%02d", t1, t2) } } d1 := strings.Split(v.LastVer, ".") if len(d1) == 3 { t1, _ := strconv.Atoi(d1[0]) t2, _ := strconv.Atoi(d1[1]) t3, _ := strconv.Atoi(d1[2]) if t1 < 100 && t2 < 100 && t3 < 100 { n2 = t1*10000 + t2*100 // n1 = t1*10000 + t2*100 + t3 //lastVer = fmt.Sprintf("%02d.%02d.%02d", t1, t2, t3) } } else if len(d1) == 2 { t1, _ := strconv.Atoi(d1[0]) t2, _ := strconv.Atoi(d1[1]) if t1 < 100 && t2 < 100 { n2 = t1*100 + t2 //lastVer = fmt.Sprintf("00.%02d.%02d", t1, t2) } } var diff_level int if n2-n1 > 200 { diff_level = 1 } else if n2-n1 > 0 { diff_level = 2 } else if n2-n1 < 0 { diff_level = 3 } if strings.Contains(v.Ver, "A") || strings.Contains(v.Ver, "a") || strings.Contains(v.LastVer, "B") || strings.Contains(v.LastVer, "b") { } else { if v.Ver != "" && v.LastVer != "" && diff_level == 2 { if !req.If_en { v.Warn_type = fmt.Sprintf(`建议升级到%s版本`, v.LastVer) } else { v.Warn_type = fmt.Sprintf(`Suggest upgrading to version %s`, v.LastVer) } } } } //v.SaveTime = do_time_by_ps(v.SaveTime, ps_info) rds = append(rds, v) } } row.Close() //resp.Total = rcnt resp.Data = append(resp.Data, rds...) if len(resp.Data) == 0 { /*for i := 0; i < 5; i++ { var v GetMssRespData v.Series = "LHE6117" v.InstrumentID = "AH" v.Ver = "01.01.06" if i == 3 { v.Warn_type = fmt.Sprintf(`建议升级到%s版本`, "01.01.10") } resp.Data = append(resp.Data, v) }*/ resp.Data = []GetMssRespData{} } jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("get_well_ver_timeout recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_well_instrument_timeout(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("get_well_instrument_timeout recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetMssReq json.Unmarshal(reqdata, &req) // ps_info := get_ps_info(req.OpUser) var resp GetMssResp var whereSql string = " where [if_available] !=1" if req.WellName != "" { whereSql += fmt.Sprintf(` and wellname ='%s' `, req.WellName) } if req.Series != "" { whereSql += " and series like '%" + req.Series + "%'" } if req.Instrument_id != "" { whereSql += " and instrument_id like '%" + req.Instrument_id + "%'" } if req.Checked { likeid := fmt.Sprintf(" and [service_type]=1") whereSql += likeid } if spe_name, ok := spe_user[req.OpUser]; ok { likeid := fmt.Sprintf(" and [ClOUDACCOUNT]='%s' ", spe_name) whereSql += likeid } // orderBySql := " order by saveTime desc" selSql := fmt.Sprintf(`select [series],[instrument_id],[ver],[lastVer],[workTime] from [analysis_result_mss] `) if whereSql != "" { selSql += whereSql } fmt.Println(selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error(fmt.Sprintf("getMss db query err:%s", err.Error())) jdata, _ := json.Marshal(resp) response.Write(jdata) return } var rds []GetMssRespData // timeLayout := "2006-01-02 15:04:05" // loc, _ := time.LoadLocation("Local") for row.Next() { // var id int var v GetMssRespData if err = row.Scan(&v.Series, &v.InstrumentID, &v.Ver, &v.LastVer, &v.WorkTime); err == nil { //opTime, _ := time.ParseInLocation(timeLayout, v.SaveTime, loc) if true /*time.Now().Sub(opTime).Hours() < 24*30 */ { wt, _ := strconv.Atoi(v.WorkTime) if wt > 1000 { if !req.If_en { v.Warn_type = "建议进行维保" } else { v.Warn_type = "Suggest maintenance" } } /*else { if strings.Contains(v.Ver, "A") || strings.Contains(v.Ver, "a") || strings.Contains(v.LastVer, "B") || strings.Contains(v.LastVer, "b") { } else { if v.Ver != "" && v.LastVer != "" && v.Ver < v.LastVer { v.Warn_type = "2" } } }*/ } //v.SaveTime = do_time_by_ps(v.SaveTime, ps_info) rds = append(rds, v) } } row.Close() //resp.Total = rcnt resp.Data = append(resp.Data, rds...) if len(resp.Data) == 0 { /*for i := 0; i < 5; i++ { var v GetMssRespData v.Series = "LHE6117" v.InstrumentID = "AH" if i == 3 { v.Warn_type = "建议进行维保" } resp.Data = append(resp.Data, v) }*/ resp.Data = []GetMssRespData{} } jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("get_well_instrument_timeout recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_well_nb(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_well_nb recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_nb_his_ex_req json.Unmarshal(reqdata, &req) // ps_info := get_ps_info(req.OpUser) var selSql string // var cntSql string var whereSql string var ifWhere bool if spe_name, ok := spe_user[req.OpUser]; ok { whereSql = fmt.Sprintf(` [ClOUDACCOUNT] = '%s'`, spe_name) ifWhere = true } if req.Wellname != "" { if ifWhere { whereSql += fmt.Sprintf(` and [wellname] = '%s' `, req.Wellname) } else { whereSql += fmt.Sprintf(` [wellname] = '%s' `, req.Wellname) } ifWhere = true } if req.Checked { if ifWhere { whereSql += fmt.Sprintf(` and [service_type] = 1 `) } else { whereSql += fmt.Sprintf(` [service_type] = 1 `) } ifWhere = true } if ifWhere { selSql = fmt.Sprintf("select distinct [b_code] from [analysis_battery_well] where %s ", whereSql) } else { selSql = fmt.Sprintf("select distinct [b_code] from [analysis_battery_well] ") } row, err := sqlConn.Query(selSql) if err != nil { logs.Error("get_well_nb Query Error", err.Error()) return } defer row.Close() var resp get_nb_his_resp // resp.Total = cnt for row.Next() { var d battery_his_info if err := row.Scan(&d.Bcode); err == nil { resp.Data = append(resp.Data, d) } else { logs.Error(err.Error()) } } for i := 0; i < len(resp.Data); i++ { v := resp.Data[i] selSql = fmt.Sprintf(`select [use_t] from analysis_battery where [battery_code]='%s'`, v.Bcode) rows, err := sqlConn.Query(selSql) if err == nil { for rows.Next() { var use_t string if err = rows.Scan(&use_t); err == nil { f, _ := strconv.ParseFloat(use_t, 64) resp.Data[i].Uset = float32(f) if f > 600 { resp.Data[i].Action = "建议更换电池" } } } rows.Close() } } if len(resp.Data) == 0 { resp.Data = []battery_his_info{} } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_well_nb recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_well_cur_data(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_well_cur_data recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_cmr_req json.Unmarshal(reqdata, &req) // ps_info := get_ps_info(req.OpUser) var resp get_cur_well_dep_resp var data Cmr var cnt int selSql := fmt.Sprintf("select [data] from [analysis_es] where [wellname]='%s' ", req.Wellname) row, err := sqlConn.Query(selSql) if err != nil { logs.Info("get_well_cur_data Query Error", err.Error()) goto exit } for row.Next() { var s string if err := row.Scan(&s); err == nil { cnt++ json.Unmarshal([]byte(s), &data) resp.Wellname = data.Wellname resp.X = data.X resp.Y = data.Y //var d Drilling var num int for i := 0; i < len(data.Drilling_data); i++ { v := data.Drilling_data[i] t, _ := strconv.Atoi(v.Drilling_num) if t > num && v.Servicer != "" && v.Wait_time != "" && v.Work_time != "" { resp.Drilling_num = v.Drilling_num resp.Servicer = v.Servicer resp.Wait_time = v.Wait_time resp.Work_time = v.Work_time indep, _ := strconv.ParseFloat(v.In_depth, 64) ftage, _ := strconv.ParseFloat(v.Footage, 64) //indep, _ := decimal.NewFromFloat(float64(in_dep)).Round(2).Float64() //ftage, _ := decimal.NewFromFloat(float64(f_tage)).Round(2).Float64() resp.Cur_well_dep = fmt.Sprintf(`%0.2f`, indep+ftage) } } } else { logs.Info("get_well_cur_data Query Error", err.Error()) } } row.Close() exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_well_cur_data recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func remove_battery_base(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("remove_battery_base recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req remove_battery_base_req json.Unmarshal(reqdata, &req) var selSql string var resp CommonResp b := checkUserIfOnline(req.OpUser) if !b { resp.Ret = -1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } user_info, _ := getUserInfo(req.OpUser) userPositionLevel := getUserLevel(user_info.Userrole) if userPositionLevel != 0 && user_info.UserDepartment != "维保部" { resp.Ret = 1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } selSql = fmt.Sprintf(` delete from [battery_base] where [ID]=%d`, req.ID) fmt.Println() _, err := sqlConn.Exec(selSql) if err != nil { logs.Error("remove_battery_base exec Error", err.Error()) return } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("remove_battery_base recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_battery_base(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_battery_base recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_battery_base_req json.Unmarshal(reqdata, &req) var resp get_battery_base_resp var sel_sql string var ifwhere bool var whereSql string if req.S_ID != "" { likestr := "%" + req.S_ID + "%" whereSql += fmt.Sprintf(` [sid] like '%s' `, likestr) ifwhere = true } if req.IID != "" { likestr := "%" + req.IID + "%" if ifwhere { whereSql += fmt.Sprintf(` and [iid] like '%s' `, likestr) } else { whereSql += fmt.Sprintf(` [iid] like '%s' `, likestr) } ifwhere = true } if req.B_ID != "" { likestr := "%" + req.B_ID + "%" if ifwhere { whereSql += fmt.Sprintf(` and [b_id] like '%s' `, likestr) } else { whereSql += fmt.Sprintf(` [b_id] like '%s' `, likestr) } ifwhere = true } if req.B_code != "" { likestr := "%" + req.B_code + "%" if ifwhere { whereSql += fmt.Sprintf(` and [b_code] like '%s' `, likestr) } else { whereSql += fmt.Sprintf(` [b_code] like '%s' `, likestr) } ifwhere = true } if ifwhere { sel_sql = fmt.Sprintf(`SELECT [ID] ,[b_id] ,[b_code] ,[sid] ,[iid] FROM [battery_base] where %s order by ID desc`, whereSql) } else { sel_sql = fmt.Sprintf(`SELECT [ID] ,[b_id] ,[b_code] ,[sid] ,[iid] FROM [battery_base] order by ID desc`) } fmt.Println(sel_sql) rows, err := sqlConn.Query(sel_sql) if err == nil { for rows.Next() { var d Battery_base if err = rows.Scan(&d.ID, &d.B_ID, &d.B_code, &d.S_ID, &d.IID); err == nil { resp.Data = append(resp.Data, d) } } rows.Close() } resp.Total = len(resp.Data) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_battery_base recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func add_battery_base(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("add_battery_base recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req add_battery_base_req json.Unmarshal(reqdata, &req) var selSql string var resp CommonResp b := checkUserIfOnline(req.OpUser) if !b { resp.Ret = -1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } user_info, _ := getUserInfo(req.OpUser) userPositionLevel := getUserLevel(user_info.Userrole) if userPositionLevel != 0 && user_info.UserDepartment != "维保部" { resp.Ret = 1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } selSql = fmt.Sprintf(` delete from [battery_base] where [b_id]='%s' and [b_code]='%s'`, req.B_ID, req.B_code) fmt.Println() _, err := sqlConn.Exec(selSql) if err != nil { logs.Error("add_battery_base exec Error", err.Error()) return } selSql = fmt.Sprintf(`INSERT INTO [battery_base] ([b_id] ,[b_code] ,[sid] ,[iid]) VALUES ('%s' ,'%s' ,'%s' ,'%s')`, req.B_ID, req.B_code, req.S_ID, req.IID) //fmt.Println(selSql) _, err = sqlConn.Exec(selSql) if err != nil { logs.Error("add_battery_base exec Error", err.Error()) return } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("add_battery_base recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func sync_page_setting() { sel_sql := fmt.Sprintf(`SELECT [user],[data] FROM [page_setting] `) //fmt.Println(sel_sql) rows, err := sqlConn.Query(sel_sql) if err == nil { for rows.Next() { var user string var data string var resp page_setting_req if err = rows.Scan(&user, &data); err == nil { json.Unmarshal([]byte(data), &resp) pageSetting[user] = resp } } rows.Close() } fmt.Println(pageSetting) } func get_page_setting_data(user string) (resp get_page_setting_resp) { resp.R1 = "1" resp.R2 = "1" resp.R3 = "1" sel_sql := fmt.Sprintf(`SELECT [data] FROM [page_setting] WHERE [user] = '%s'`, user) fmt.Println(sel_sql) rows, err := sqlConn.Query(sel_sql) if err == nil { for rows.Next() { var data string if err = rows.Scan(&data); err == nil { json.Unmarshal([]byte(data), &resp) } } rows.Close() } return } func get_page_setting(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_page_setting recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_page_setting_req json.Unmarshal(reqdata, &req) var resp get_page_setting_resp resp = get_page_setting_data(req.OpUser) if resp.R5 == "" { resp.R5 = "1" } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_page_setting recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func page_setting(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("page_setting recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req page_setting_req json.Unmarshal(reqdata, &req) var id int var resp CommonResp jdata, _ := json.Marshal(req) sel_sql := fmt.Sprintf(`select ID from [page_setting] where [user] = '%s'`, req.OpUser) rows, err := sqlConn.Query(sel_sql) if err == nil { for rows.Next() { if err = rows.Scan(&id); err == nil { } } rows.Close() } if id > 0 { update_sql := fmt.Sprintf(`UPDATE [page_setting] SET [data] = '%s' WHERE [user] = '%s'`, string(jdata), req.OpUser) fmt.Println(update_sql) _, err = sqlConn.Exec(update_sql) if err != nil { logs.Info("page_setting exec Error", err.Error()) resp.Ret = -1 goto exit } } else { update_sql := fmt.Sprintf(`INSERT INTO [dbo].[page_setting] ([user] ,[data]) VALUES ('%s' ,'%s')`, req.OpUser, string(jdata)) fmt.Println(update_sql) _, err = sqlConn.Exec(update_sql) if err != nil { logs.Info("page_setting exec Error", err.Error()) resp.Ret = -1 goto exit } } pageSetting[req.OpUser] = req exit: jdata, _ = json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("page_setting recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_up_off_well_csv(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_get_up_off_well_csv recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_up_off_well_info_req json.Unmarshal(reqdata, &req) var ps_info page_setting_req if _, ok := pageSetting[req.OpUser]; ok { ps_info = pageSetting[req.OpUser] } else { ps_info.R1 = "1" ps_info.R2 = "1" ps_info.R3 = "1" } var resp get_csv_resp var data []Up_off_well var selSql string var whereSql string var ifwhere bool if req.Wellname != "" { likestr := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` [6841] like '%s' `, likestr) ifwhere = true } if req.User != "" { likestr := "%" + req.User + "%" if ifwhere { whereSql += fmt.Sprintf(` and [6845] like '%s' `, likestr) } else { whereSql += fmt.Sprintf(` [6845] like '%s' `, likestr) } ifwhere = true } if req.If_es { if ifwhere { whereSql += fmt.Sprintf(` and [6844] =1 `) } else { whereSql += fmt.Sprintf(` [6844] =1 `) } ifwhere = true } if ifwhere { whereSql = " where " + whereSql } selSql = fmt.Sprintf("select distinct [6841],[6844],[6845],[6846],[6847],[6848],[6849] from WORKHOURS %s order by [6846] desc", whereSql) fmt.Println("get_get_up_off_well_csv sql:", selSql) logs.Info("get_get_up_off_well_csv sql:", selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Info("Query Error", err.Error()) goto write_csv } for row.Next() { var d Up_off_well var s_type int if err := row.Scan(&d.Wellname, &s_type, &d.User, &d.Up_well_time, &d.Off_well_time, &d.Entry_time, &d.Out_time); err == nil { ot := []byte(d.Up_well_time) if string(ot[0]) != "-" { if len(d.Up_well_time) >= 19 { d.Up_well_time = d.Up_well_time[:10] + " " + d.Up_well_time[11:19] d.Up_well_time = do_time_by_ps(d.Up_well_time, ps_info) } } else { d.Up_well_time = "" } ot = []byte(d.Entry_time) if string(ot[0]) != "-" { if len(d.Entry_time) >= 19 { d.Entry_time = d.Entry_time[:10] + " " + d.Entry_time[11:19] d.Entry_time = do_time_by_ps(d.Entry_time, ps_info) } } else { d.Entry_time = "" } //fmt.Println(d.Out_time) ot = []byte(d.Out_time) //fmt.Println(string(ot[0])) if string(ot[0]) != "-" { if len(d.Out_time) >= 19 { d.Out_time = d.Out_time[:10] + " " + d.Out_time[11:19] d.Out_time = do_time_by_ps(d.Out_time, ps_info) } } else { d.Out_time = "" } ot = []byte(d.Off_well_time) if string(ot[0]) != "-" { if len(d.Off_well_time) >= 19 { d.Off_well_time = d.Off_well_time[:10] + " " + d.Off_well_time[11:19] d.Off_well_time = do_time_by_ps(d.Off_well_time, ps_info) } } else { d.Off_well_time = "" } if s_type == 0 { d.Service_type = "其他服务" } else if s_type == 1 { d.Service_type = "工程服务" } else if s_type == 2 { d.Service_type = "售后服务" } data = append(data, d) } else { logs.Info("get_get_up_off_well_csv Query Error", err.Error()) } } row.Close() write_csv: var csv_data [][]string var w *csv.Writer filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { logs.Error(err.Error()) goto exit } defer f.Close() csv_data = append(csv_data, []string{"井号", "服务类别", "上井人员", "人员上井时间", "仪器入井时间", "仪器出井时间", "人员离井时间"}) for i := 0; i < len(data); i++ { v := data[i] csv_data = append(csv_data, []string{v.Wellname, v.Service_type, v.User, v.Up_well_time, v.Entry_time, v.Out_time, v.Off_well_time}) } f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM w = csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(csv_data) w.Flush() resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_get_up_off_well_csv recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_up_off_well_info(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_up_off_well_info recv req begin", time.Now().Format(loc)) reqdata, _ := ioutil.ReadAll(request.Body) var req get_up_off_well_info_req json.Unmarshal(reqdata, &req) var ps_info page_setting_req if _, ok := pageSetting[req.OpUser]; ok { ps_info = pageSetting[req.OpUser] } else { ps_info.R1 = "1" ps_info.R2 = "1" ps_info.R3 = "1" } var resp get_up_off_well_info_resp var cntSql string var selSql string var whereSql string var ifwhere bool if req.Wellname != "" { likestr := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` [6841] like '%s' `, likestr) ifwhere = true } if req.User != "" { likestr := "%" + req.User + "%" if ifwhere { whereSql += fmt.Sprintf(` and [6845] like '%s' `, likestr) } else { whereSql += fmt.Sprintf(` [6845] like '%s' `, likestr) } ifwhere = true } if req.If_es { if ifwhere { whereSql += fmt.Sprintf(` and [6844] =1 `) } else { whereSql += fmt.Sprintf(` [6844] =1 `) } ifwhere = true } if ifwhere { whereSql = " where " + whereSql } if ifwhere { cntSql = fmt.Sprintf("select count(*) from (select distinct [6841],[6844],[6845],[6846],[6847],[6848],[6849] from WORKHOURS %s)t", whereSql) } else { cntSql = fmt.Sprintf("select count(*) from (select distinct [6841],[6844],[6845],[6846],[6847],[6848],[6849] from WORKHOURS )t") } logs.Info("get_up_off_well_info cntSql ", cntSql) fmt.Println("get_up_off_well_info cntSql:", cntSql) rcnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", cntSql, err.Error())) return } query_cnt := req.Index * req.Count var cnt int if query_cnt > rcnt { cnt = rcnt + req.Count - query_cnt } else { cnt = req.Count } // selSql = fmt.Sprintf("select distinct top %v [6841],[6844],[6845],[6846],[6847],[6848],[6849],[6850] from ( select distinct top %v [6841],[6844],[6845],[6846],[6847],[6848],[6849],[6850] from WORKHOURS ", cnt, req.Index*req.Count) selSql = fmt.Sprintf("select distinct top %v [6841],[6844],[6845],ISNULL([6846],'') as [6846],ISNULL([6847],'') as [6847],ISNULL([6848],'') as [6848],ISNULL([6849],'') as [6849],ISNULL([6850],'') as [6850] from ( select distinct top %v [6841],[6844],[6845],ISNULL([6846],'') as [6846],ISNULL([6847],'') as [6847],ISNULL([6848],'') as [6848],ISNULL([6849],'') as [6849],ISNULL([6850],'') as [6850] from WORKHOURS ", cnt, req.Index*req.Count) selSql += whereSql ascSql := " order by [6846] asc" descSql := " order by [6846] desc" selSql += descSql + ")t " + whereSql + ascSql fmt.Println("get_up_off_well_info sql:", selSql) logs.Info("get_up_off_well_info sql:", selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Info("Query Error", err.Error()) return } defer row.Close() var data []Up_off_well resp.Total = rcnt for row.Next() { var d Up_off_well var s_type int if err := row.Scan(&d.Wellname, &s_type, &d.User, &d.Up_well_time, &d.Off_well_time, &d.Entry_time, &d.Out_time, &d.Op_type); err == nil { ot := []byte(d.Up_well_time) if string(ot[0]) != "-" { if len(d.Up_well_time) >= 19 { d.Up_well_time = d.Up_well_time[:10] + " " + d.Up_well_time[11:19] d.Up_well_time = do_time_by_ps(d.Up_well_time, ps_info) } } else { d.Up_well_time = "" } ot = []byte(d.Entry_time) if string(ot[0]) != "-" { if len(d.Entry_time) >= 19 { d.Entry_time = d.Entry_time[:10] + " " + d.Entry_time[11:19] d.Entry_time = do_time_by_ps(d.Entry_time, ps_info) } } else { d.Entry_time = "" } //fmt.Println(d.Out_time) ot = []byte(d.Out_time) //fmt.Println(string(ot[0])) if string(ot[0]) != "-" { if len(d.Out_time) >= 19 { d.Out_time = d.Out_time[:10] + " " + d.Out_time[11:19] d.Out_time = do_time_by_ps(d.Out_time, ps_info) } } else { d.Out_time = "" } ot = []byte(d.Off_well_time) if string(ot[0]) != "-" { if len(d.Off_well_time) >= 19 { d.Off_well_time = d.Off_well_time[:10] + " " + d.Off_well_time[11:19] d.Off_well_time = do_time_by_ps(d.Off_well_time, ps_info) } } else { d.Off_well_time = "" } if s_type == 0 { d.Service_type = "其他服务" } else if s_type == 1 { d.Service_type = "工程服务" } else if s_type == 2 { d.Service_type = "售后服务" } /* 0 一级定向 1 二级定向 2 一级仪器操作 3 二级仪器操作 4 三级仪器操作 5 四级仪器操作 */ if d.Op_type == "0" { d.Op_type = "一级定向" } else if d.Op_type == "1" { d.Op_type = "二级定向" } else if d.Op_type == "2" { d.Op_type = "一级仪器操作" } else if d.Op_type == "3" { d.Op_type = "二级仪器操作" } else if d.Op_type == "4" { d.Op_type = "三级仪器操作" } else if d.Op_type == "5" { d.Op_type = "四级仪器操作" } else { d.Op_type = "" } data = append(data, d) } else { logs.Info("get_up_off_well_info Query Error", err.Error()) fmt.Println("get_up_off_well_info Query Error", err.Error()) } } fmt.Println("len(data)---", len(data)) logs.Info("len(data)---", len(data)) if len(data) > 0 { for i := len(data) - 1; ; { resp.Data = append(resp.Data, data[i]) i-- if i < 0 { break } } } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_up_off_well_info recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_well_files(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_well_files recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_well_files_req json.Unmarshal(reqdata, &req) var resp get_well_files_resp sel_sql := fmt.Sprintf(`select distinct [ID],[6834] from [UPLOADFILES] where [6831]='%s'`, req.Wellname) rows, err := sqlConn.Query(sel_sql) if err == nil { for rows.Next() { var v Well_file if err = rows.Scan(&v.ID, &v.Filename); err != nil { logs.Error("get_well_files scan database err:", err.Error()) } else { resp.Data = append(resp.Data, v) } } rows.Close() } if len(resp.Data) == 0 { resp.Data = []Well_file{} } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_well_files recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func download_file(rw http.ResponseWriter, r *http.Request) { //获取请求参数 /*var req download_file_req reqdata, _ := ioutil.ReadAll(r.Body) json.Unmarshal(reqdata, &req) fn := req.Filename*/ id := r.FormValue("id") //fmt.Println("id:", id) var fn string var filepath string sel_sql := fmt.Sprintf(`select distinct [6834],[6835] from [UPLOADFILES] where [ID]=%v `, id) rows, err := sqlConn.Query(sel_sql) if err == nil { for rows.Next() { if err = rows.Scan(&fn, &filepath); err != nil { logs.Error("download_file scan database err:", err.Error()) } } rows.Close() } //fmt.Println("文件下载:", fn, filepath) if filepath != "" { //设置响应头 header := rw.Header() header.Add("Content-Type", "application/octet-stream") //header.Add("Content-Disposition", "attachment;filename="+fn) //使用ioutil包读取文件 //filepath = filepath //fmt.Println(filepath) b, _ := ioutil.ReadFile(filepath) //写入到响应流中 rw.Write(b) } } func get_dev_manage_pdf_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_dev_manage_pdf_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_cmr_pdf_req json.Unmarshal(reqdata, &req) var resp get_cmr_pdf_resp var baseinfo get_srr_base_resp var devs []Dev_manage var filename string baseinfo = get_srr_baseinfo(req.Wellname) devs = get_dev_manage_info(req.OpUser, req.Wellname) filename = export_dev_manage_pdf_en(req.OpUser, baseinfo, devs) resp.FileId = fmt.Sprintf(`%v.pdf`, filename) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_dev_manage_pdf_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_dev_manage_pdf(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_dev_manage_pdf recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_cmr_pdf_req json.Unmarshal(reqdata, &req) var resp get_cmr_pdf_resp var baseinfo get_srr_base_resp var devs []Dev_manage var filename string baseinfo = get_srr_baseinfo(req.Wellname) devs = get_dev_manage_info(req.OpUser, req.Wellname) filename = export_dev_manage_pdf(req.OpUser, baseinfo, devs) resp.FileId = fmt.Sprintf(`%v.pdf`, filename) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_dev_manage_pdf recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func export_dev_manage_pdf_en(opuser string, baseinfo get_srr_base_resp, data []Dev_manage) (filename string) { ps_info := get_ps_info(opuser) //W: 595, H: 842 page_W := gopdf.PageSizeA4.W page_H := gopdf.PageSizeA4.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var one_cm float64 = page_W / float64(21) var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 //var h_span float64 = 150 page_H = page_H - margin_top page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4.W}, "Equipment Asset Management Report", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4.W / 2}, fmt.Sprintf("Report Time:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4.W / 2) - margin_left}, fmt.Sprintf(`Report NO.:%s+D0001`, baseinfo.Wellname), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4.W-margin_left, margin_top+60) //cal total pagenum var cur_page int = 1 var total_page int = 1 var total_page_len float64 total_page_len += 60 for i := 0; i < len(data); i++ { v := data[i] s := fmt.Sprintf(`Instrument:%s Version:%s Production Date:%s Calibration Date:%s Total Working Time(h):%s Current Working Time(h):%s Region:%s Location:%s Responsible Person:%s`, v.Sid+"/"+v.Iid, v.Ver, v.P_date, v.Cal_date, v.Total_wt, v.Cur_wt, v.Region, v.Location, v.Responsible) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { total_page_len += span } total_page_len += (0.5 * span) } total_page_len += (1 * span) page_num := total_page_len / (page_H - margin_top) total_page = int(math.Ceil(page_num)) fmt.Println("仪器报告:", page_num, total_page) var base float64 = margin_top + 60 for i := 0; i < len(data); i++ { v := data[i] s := fmt.Sprintf(`Instrument:%s Version:%s Production Date:%s Calibration Date:%s Total Working Time(h):%s Current Working Time(h):%s Region:%s Location:%s Responsible Person:%s`, v.Sid+"/"+v.Iid, v.Ver, v.P_date, v.Cal_date, v.Total_wt, v.Cur_wt, v.Region, v.Location, v.Responsible) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + base - page_H pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } pdf.Text(fmt.Sprintf(`%s`, context[j])) } base += (span / 2) if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + (base - page_H) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) } base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + base - page_H pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } s := fmt.Sprintf(`Number of instruments:%d Upload Account:%s Print Account:%s V1.0.0`, len(data), strings.TrimSpace(baseinfo.Uploadname), opuser) fmt.Println(s) pdf.Text(s) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) //save beginTime := time.Now().UnixNano() pdf.WritePdf(fmt.Sprintf(`./authfile/%v.pdf`, beginTime)) filename = strconv.FormatInt(beginTime, 10) return } func export_dev_manage_pdf(opuser string, baseinfo get_srr_base_resp, data []Dev_manage) (filename string) { ps_info := get_ps_info(opuser) //W: 595, H: 842 page_W := gopdf.PageSizeA4.W page_H := gopdf.PageSizeA4.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var one_cm float64 = page_W / float64(21) var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 //var h_span float64 = 150 page_H = page_H - margin_top page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4.W}, "设备资产管理报告", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4.W / 2}, fmt.Sprintf("报告时间:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4.W / 2) - margin_left}, fmt.Sprintf(`报告编号:%s+D0001`, baseinfo.Wellname), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4.W-margin_left, margin_top+60) //cal total pagenum var cur_page int = 1 var total_page int = 1 var total_page_len float64 total_page_len += 60 for i := 0; i < len(data); i++ { v := data[i] s := fmt.Sprintf(`仪器编号:%s 版本号:%s 出厂日期:%s 校准日期:%s 出厂累计工作时间(h):%s 当次累计工作时间(h):%s 所属区域:%s 所在地:%s 管理责任人:%s`, v.Sid+"/"+v.Iid, v.Ver, v.P_date, v.Cal_date, v.Total_wt, v.Cur_wt, v.Region, v.Location, v.Responsible) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { total_page_len += span } total_page_len += (0.5 * span) } total_page_len += (1 * span) page_num := total_page_len / (page_H - margin_top) total_page = int(math.Ceil(page_num)) fmt.Println("仪器报告:", page_num, total_page) var base float64 = margin_top + 60 for i := 0; i < len(data); i++ { v := data[i] s := fmt.Sprintf(`仪器编号:%s 版本号:%s 出厂日期:%s 校准日期:%s 出厂累计工作时间(h):%s 当次累计工作时间(h):%s 所属区域:%s 所在地:%s 管理责任人:%s`, v.Sid+"/"+v.Iid, v.Ver, v.P_date, v.Cal_date, v.Total_wt, v.Cur_wt, v.Region, v.Location, v.Responsible) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + base - page_H pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } pdf.Text(fmt.Sprintf(`%s`, context[j])) } base += (span / 2) if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + (base - page_H) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) } base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + base - page_H pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`仪器数量:%d`, len(data))) pdf.SetXY(3*margin_left, base) pdf.Text(fmt.Sprintf(`上传账号:%s`, baseinfo.Uploadname)) pdf.SetXY(6*margin_left, base) pdf.Text(fmt.Sprintf(`打印账号:%s`, opuser)) pdf.SetXY(9*margin_left, base) pdf.Text(fmt.Sprintf(`V1.0.0`)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) //save beginTime := time.Now().UnixNano() pdf.WritePdf(fmt.Sprintf(`./authfile/%v.pdf`, beginTime)) filename = strconv.FormatInt(beginTime, 10) return } func remove_dev_manage(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("remove_dev_manage recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req add_dev_manage_req json.Unmarshal(reqdata, &req) var selSql string var resp CommonResp b := checkUserIfOnline(req.OpUser) if !b { resp.Ret = -1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } selSql = fmt.Sprintf(`DELETE FROM [EQUIPMENTASSETS] where ID=%d`, req.Data.ID) _, err := sqlConn.Exec(selSql) if err != nil { logs.Error("remove_dev_manage exec Error", err.Error()) return } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("remove_dev_manage recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func update_dev_manage(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("update_dev_manage recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req add_dev_manage_req json.Unmarshal(reqdata, &req) var selSql string var resp CommonResp b := checkUserIfOnline(req.OpUser) if !b { resp.Ret = -1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } selSql = fmt.Sprintf(`UPDATE [EQUIPMENTASSETS] SET [6803] = '%s' ,[6804] = '%s' ,[6805] = '%s' ,[6806] = '%s' ,[6807] = '%s' ,[6808] = '%s' ,[6809] = '%s' ,[6810] = '%s' ,[6811] = '%s' ,[6812] = '%s' ,[6813] = '%s' where ID=%d`, req.Data.Sid, req.Data.Iid, req.Data.Ver, req.Data.P_date, req.Data.Cal_date, req.Data.Total_wt, req.Data.Cur_wt, req.Data.Repair_cnt, req.Data.Region, req.Data.Location, req.Data.Responsible, req.Data.ID) fmt.Println(selSql) _, err := sqlConn.Exec(selSql) if err != nil { logs.Error("update_dev_manage exec Error", err.Error()) return } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("update_dev_manage recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func add_dev_manage(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("add_dev_manage recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req add_dev_manage_req json.Unmarshal(reqdata, &req) var selSql string var resp CommonResp b := checkUserIfOnline(req.OpUser) if !b { resp.Ret = -1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } selSql = fmt.Sprintf(`INSERT INTO [EQUIPMENTASSETS] ([6800] ,[6803] ,[6804] ,[6805] ,[6806] ,[6807] ,[6808] ,[6809] ,[6810] ,[6811] ,[6812] ,[6813] ,[6820]) VALUES ('%s' ,'%s' ,'%s' ,'%s' ,'%s' ,'%s' ,'%s' ,'%s' ,'%s' ,'%s' ,'%s' ,'%s' ,'1')`, req.Data.Wellname, req.Data.Sid, req.Data.Iid, req.Data.Ver, req.Data.P_date, req.Data.Cal_date, req.Data.Total_wt, req.Data.Cur_wt, req.Data.Repair_cnt, req.Data.Region, req.Data.Location, req.Data.Responsible) //fmt.Println(selSql) _, err := sqlConn.Exec(selSql) if err != nil { logs.Error("add_dev_manage exec Error", err.Error()) return } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("add_dev_manage recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_dev_manage_info(user string, wellname string) (resp []Dev_manage) { ps_info := get_ps_info(user) m := make(map[string]bool) var data []Dev_manage sel_sql := fmt.Sprintf(`SELECT [ID],[6803],[6804],[6805],[6806],[6807],COALESCE([6808], '') AS [6808],COALESCE([6809], '') as [6810],COALESCE([6810], '') as [6810],COALESCE([6811], '') AS [6811],COALESCE([6812], '') AS [6812],COALESCE([6813], '') AS [6813],COALESCE([6820], '') AS [6820] FROM [EQUIPMENTASSETS] where [6800]='%s' order by [6802] desc`, wellname) rows, err := sqlConn.Query(sel_sql) if err == nil { for rows.Next() { var v Dev_manage var s string if err = rows.Scan(&v.ID, &v.Sid, &v.Iid, &v.Ver, &v.P_date, &v.Cal_date, &v.Total_wt, &v.Cur_wt, &v.Repair_cnt, &v.Region, &v.Location, &v.Responsible, &s); err != nil { logs.Error(fmt.Sprintf(`get_dev_manage_info scan upload err:%s`, err.Error())) fmt.Println(fmt.Sprintf(`get_dev_manage_info scan upload err:%s`, err.Error())) } else { if s == "1" { v.Flag = true } v.P_date = do_date_time_by_ps(v.P_date, ps_info) v.Cal_date = do_date_time_by_ps(v.Cal_date, ps_info) v.Wellname = wellname if _, ok := m[v.Sid+v.Iid]; !ok { data = append(data, v) m[v.Sid+v.Iid] = true } } } rows.Close() } if len(data) > 0 { resp = data } else { resp = []Dev_manage{} } return } func get_dev_manage(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_dev_manage recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_dev_manage_req json.Unmarshal(reqdata, &req) var resp get_dev_manage_resp resp.Data = get_dev_manage_info(req.OpUser, req.Wellname) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_dev_manage recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_tool_warning_pdf_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_tool_warning_pdf_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_cmr_pdf_req json.Unmarshal(reqdata, &req) var resp get_cmr_pdf_resp var baseinfo get_srr_base_resp var tw []Tool_warning var filename string baseinfo = get_srr_baseinfo(req.Wellname) tw = get_tool_warning_info_en(req.OpUser, req.Wellname) data := get_tool_lcm_from_well(req.OpUser, req.Wellname) filename = export_tool_warning_pdf_en(req.OpUser, baseinfo, tw, data) resp.FileId = fmt.Sprintf(`%v.pdf`, filename) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_tool_warning_pdf recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_tool_warning_pdf(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_tool_warning_pdf recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_cmr_pdf_req json.Unmarshal(reqdata, &req) var resp get_cmr_pdf_resp var baseinfo get_srr_base_resp var tw []Tool_warning var filename string baseinfo = get_srr_baseinfo(req.Wellname) tw = get_tool_warning_info(req.OpUser, req.Wellname) data := get_tool_lcm_from_well(req.OpUser, req.Wellname) fmt.Println("99", data) filename = export_tool_warning_pdf(req.OpUser, baseinfo, tw, data) fmt.Println("filename", filename) resp.FileId = fmt.Sprintf(`%v.pdf`, filename) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_tool_warning_pdf recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } // 导出仪器报告 func get_tool_mess_pdf(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("导出仪器报告 begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var resp get_cmr_pdf_resp var reqMess InstrumentMess json.Unmarshal(reqdata, &reqMess) warnData := get_tool_warning_info(reqMess.Opuser, reqMess.WellName) // 创建用于存储所有响应数据的切片 var allRespData []interface{} // 循环处理每个警告项 for _, warn := range warnData { // 更新请求参数 reqMess.Series = warn.Series reqMess.Instrument = warn.Instrument reqMess.Content = warn.Context // 调用工具方法 respData, err := getInstrumentMessUtil(reqMess) // 打印响应结果 if err != nil { fmt.Printf("!!! 调用出错: %v\n", err) } else { _, marshalErr := json.MarshalIndent(respData, "", " ") if marshalErr != nil { // 将原始响应内容添加到切片 allRespData = append(allRespData, respData) fmt.Println("原始响应内容:", respData) } else { // 成功序列化也添加到切片 allRespData = append(allRespData, respData) } } } fullData, _ := json.MarshalIndent(allRespData, "", " ") fmt.Println(string(fullData)) filename := GenerateInstrumentPDF(fullData, warnData) fmt.Println("文件名------------------------:", filename) resp.FileId = filename jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_tool_warning_pdf recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_tool_mess_pdf_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("导出仪器报告 begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var resp get_cmr_pdf_resp var reqMess InstrumentMess json.Unmarshal(reqdata, &reqMess) warnData := get_tool_warning_info(reqMess.Opuser, reqMess.WellName) // 创建用于存储所有响应数据的切片 var allRespData []interface{} // 循环处理每个警告项 for _, warn := range warnData { // 更新请求参数 reqMess.Series = warn.Series reqMess.Instrument = warn.Instrument reqMess.Content = warn.Context // 调用工具方法 respData, err := getInstrumentMessUtil(reqMess) // 打印响应结果 if err != nil { fmt.Printf("!!! 调用出错: %v\n", err) } else { _, marshalErr := json.MarshalIndent(respData, "", " ") if marshalErr != nil { // 将原始响应内容添加到切片 allRespData = append(allRespData, respData) fmt.Println("原始响应内容:", respData) } else { // 成功序列化也添加到切片 allRespData = append(allRespData, respData) } } } fullData, _ := json.MarshalIndent(allRespData, "", " ") fmt.Println(string(fullData)) filename := GenerateInstrumentPDF_EN(fullData, warnData) fmt.Println("文件名------------------------:", filename) resp.FileId = filename jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_tool_warning_pdf recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func GenerateInstrumentPDF(fullData []byte, resp []Tool_warning) (filename string) { fmt.Println("开始导出中文版--------------") respJSON, err := json.Marshal(resp) if err != nil { logs.Error("Tool_warning数据JSON序列化错误:", err) } fmt.Println("Tool_warning JSON:", string(respJSON)) // 解析JSON数据 var instruments []InstrumentMessRespdata if err := json.Unmarshal(fullData, &instruments); err != nil { logs.Error("JSON解析错误:", err) return "" } // 初始化PDF pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4}) // 加载中文字体 if err := pdf.AddTTFFont("simfang", "./simsun.ttf"); err != nil { logs.Error("加载字体错误:", err) return "" } // 基础样式参数 margin := 28.0 // 页边距 lineHeight := 22.0 // 行高 sectionGap := 20.0 // 段落间距 colGap := 15.0 // 列间距 cellPadding := 5.0 // 表格单元格内边距 pageHeight := gopdf.PageSizeA4.H - margin*2 minBottomMargin := 20.0 // 最小底部间距 y := margin // 添加页码的函数 addPageNumber := func(pageNum int) { // 保存当前状态 currentY := pdf.GetY() currentX := pdf.GetX() // 设置页码样式 pdf.SetFont("simfang", "", 12) pdf.SetTextColor(0, 0, 0) pdf.SetX(gopdf.PageSizeA4.W - margin - 30) pdf.SetY(gopdf.PageSizeA4.H - margin/1.5) pdf.Cell(nil, fmt.Sprintf("第 %d 页", pageNum)) // 恢复位置 pdf.SetY(currentY) pdf.SetX(currentX) } // 样式函数 titleStyle := func() { pdf.SetFont("simfang", "", 18) pdf.SetTextColor(0, 0, 0) } sectionStyle := func() { pdf.SetFont("simfang", "", 14) pdf.SetTextColor(0, 0, 0) } tableHeaderStyle := func() { pdf.SetFont("simfang", "", 12) pdf.SetTextColor(255, 255, 255) pdf.SetFillColor(57, 99, 156) } tableCellStyle := func() { pdf.SetFont("simfang", "", 11) pdf.SetTextColor(0, 0, 0) pdf.SetFillColor(255, 255, 255) } // 辅助函数:检查是否需要换页 checkPageBreak := func(requiredHeight float64) bool { return y+requiredHeight > pageHeight-minBottomMargin } // 使用示例 if checkPageBreak(lineHeight * 2) { pdf.AddPage() y = margin + 10 // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) pdf.SetFont("simfang", "", 12) } // 生成PDF报告 pdf.AddPage() // 添加第一页的页码 addPageNumber(pdf.GetNumberOfPages()) // 获取井名 var wellName string if len(instruments) > 0 { wellName = instruments[0].WellName } // 主标题 titleStyle() pdf.SetX(margin) pdf.SetY(y) titleWidth := gopdf.PageSizeA4.W - margin*2 var titleOption gopdf.CellOption titleOption.Align = gopdf.Center pdf.CellWithOption(&gopdf.Rect{W: titleWidth, H: lineHeight}, wellName, titleOption) y += lineHeight * 1.8 // 风险提示部分 if len(resp) > 0 { pdf.SetFont("simfang", "B", 12) pdf.SetTextColor(0, 0, 255) pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, "本口井风险提示") y += lineHeight * 1.5 reportTime := time.Now().Format("2006-01-02 15:04:05") pdf.SetFont("simfang", "", 12) pdf.SetTextColor(0, 0, 0) // pdf.SetX(margin) // pdf.SetY(y) // pdf.Cell(nil, fmt.Sprintf("井号:%s\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t报告时间:%s", wellName, reportTime)) // y += lineHeight * 1.2 // pdf.Line(margin, y, gopdf.PageSizeA4.W-margin, y) // y += 10 pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, fmt.Sprintf("井号: %s", wellName)) // 计算Report Time的位置 timeWidth := 200.0 // 预估时间文本宽度 timeX := gopdf.PageSizeA4.W - margin - timeWidth pdf.SetX(timeX) pdf.Cell(nil, fmt.Sprintf("报告时间 %s", reportTime)) y += lineHeight * 1.2 pdf.Line(margin, y, gopdf.PageSizeA4.W-margin, y) y += 10 pdf.SetFont("simfang", "B", 16) pdf.SetTextColor(220, 20, 60) pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, "风险预警:") y += lineHeight * 1.2 for _, warning := range resp { if checkPageBreak(lineHeight * 1.2) { pdf.AddPage() y = margin + 15 // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) } var contextText string var warningText string fmt.Println("打印--------------------- warning.Time----------", warning.Time) if warning.Flag == 0 { contextText = "正常" // warningText = fmt.Sprintf("%s", contextText) warningText = fmt.Sprintf("%s%s %s", warning.Series+" ", warning.Instrument, contextText) pdf.SetTextColor(0, 0, 0) } else { pdf.SetTextColor(200, 0, 0) contextText = warning.Time + " " + warning.Context warningText = fmt.Sprintf("%s", contextText) } pdf.SetFont("simfang", "", 13) pdf.SetX(margin) pdf.SetY(y) pdf.Cell(&gopdf.Rect{W: gopdf.PageSizeA4.W - margin*2, H: lineHeight}, warningText) y += lineHeight * 1.2 } y += 15 } // 遍历所有仪器 for _, inst := range instruments { pdf.SetLineWidth(1) pdf.SetStrokeColor(0, 0, 0) pdf.Line(margin, y, gopdf.PageSizeA4.W-margin, y) y += 15 // 1. 基本信息区块 sectionStyle() pdf.SetX(margin) pdf.SetY(y) pdf.SetTextColor(0, 0, 255) pdf.Cell(nil, "▍ 基本信息 ("+inst.Series+" "+inst.Instrument+")") y += lineHeight formattedTime := inst.Time if inst.Time != "" { if t, err := time.Parse(time.RFC3339, inst.Time); err == nil { formattedTime = t.Format("2006-01-02") } else if t, err := time.Parse("2006-01-02T15:04:05Z", inst.Time); err == nil { formattedTime = t.Format("2006-01-02") } } basicInfo := []struct { Label string Value string }{ {"出厂日期:", formattedTime}, {"入库日期:", ""}, {"当次累计工作时间:", inst.WorkTimes + "小时"}, {"累计工作时间:", inst.WorkTime + "小时"}, {"所属部门:", inst.Dept}, {"固件版本号:", inst.Version}, } colWidth := (gopdf.PageSizeA4.W - margin*2 - colGap) / 2 labelWidth := 140.0 valueWidth := colWidth - labelWidth for i := 0; i < len(basicInfo); i += 2 { if checkPageBreak(lineHeight * 2) { pdf.AddPage() y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) pdf.SetFont("simfang", "", 12) } // 第一列 pdf.SetX(margin) pdf.SetY(y) pdf.SetFont("simfang", "", 12) pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: labelWidth, H: lineHeight}, basicInfo[i].Label) pdf.SetX(margin + labelWidth) pdf.SetTextColor(0, 0, 0) if basicInfo[i].Value == "" || basicInfo[i].Value == "null" || strings.TrimSpace(basicInfo[i].Value) == "" { pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: valueWidth, H: lineHeight}, "无数据") } else { pdf.Cell(&gopdf.Rect{W: valueWidth, H: lineHeight}, basicInfo[i].Value) } // 第二列 if i+1 < len(basicInfo) { pdf.SetX(margin + colWidth + colGap) pdf.SetY(y) pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: labelWidth, H: lineHeight}, basicInfo[i+1].Label) pdf.SetX(margin + colWidth + colGap + labelWidth) pdf.SetTextColor(0, 0, 0) if basicInfo[i+1].Value == "" { pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: valueWidth, H: lineHeight}, "无数据") } else { pdf.Cell(&gopdf.Rect{W: valueWidth, H: lineHeight}, basicInfo[i+1].Value) } } y += lineHeight } y += sectionGap // 2. 质检记录 sectionStyle() pdf.SetX(margin) pdf.SetY(y) pdf.SetTextColor(0, 0, 255) pdf.Cell(nil, "▍ 产品质检记录") y += lineHeight if inst.QualityData.ProcessRecord == "" && inst.QualityData.ProcessInspection == "" && inst.QualityData.FinalInspection == "" { if checkPageBreak(lineHeight) { pdf.AddPage() y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) } pdf.SetFont("simfang", "", 12) pdf.SetTextColor(0, 0, 0) pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, "暂无质检记录") y += lineHeight } else { qcItems := []struct { Label string Value string }{ {"生产过程记录:", inst.QualityData.ProcessRecord}, {"生产过程检验:", inst.QualityData.ProcessInspection}, {"成品检验记录:", inst.QualityData.FinalInspection}, } for _, item := range qcItems { // 计算文本行数 lines, _ := pdf.SplitText(item.Value, gopdf.PageSizeA4.W-margin*2-labelWidth) // 检查是否需要分页 if checkPageBreak(lineHeight) { pdf.AddPage() y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) } // 标签 pdf.SetX(margin) pdf.SetY(y) pdf.SetFont("simfang", "", 12) pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: labelWidth, H: lineHeight}, item.Label) // 值 pdf.SetX(margin + labelWidth) pdf.SetTextColor(0, 0, 0) if item.Value == "" { pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: valueWidth, H: lineHeight}, "无数据") y += lineHeight } else { for j, line := range lines { if j > 0 { y += lineHeight pdf.SetX(margin + labelWidth) pdf.SetY(y) } else { pdf.SetY(y) } pdf.Cell(&gopdf.Rect{W: gopdf.PageSizeA4.W - margin*2 - labelWidth, H: lineHeight}, line) } y += lineHeight } } } y += sectionGap // 3. 仪器施工汇总 sectionStyle() pdf.SetX(margin) pdf.SetY(y) pdf.SetTextColor(0, 0, 255) pdf.Cell(nil, "▍ 仪器施工汇总") y += lineHeight // 表格参数 colWidths := []float64{80, 60, 60, 60, 60, 60, 50, 110} headers := []string{"井名", "入井状态", "工作井深", "最高温度", "最高压强", "仪器状况", "上井人", "链接"} if len(inst.WorkMessList) == 0 { // 没有上井记录时显示提示信息 if y > pageHeight-lineHeight*2 { pdf.AddPage() y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) } pdf.SetFont("simfang", "", 12) pdf.SetTextColor(0, 0, 0) // 灰色表示无数据 pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, "暂无上井记录") y += lineHeight } else { // 计算总宽度 totalWidth := 0.0 for _, width := range colWidths { totalWidth += width } // 表头高度 headerHeight := lineHeight + cellPadding*2 // 绘制表头背景(整个表头作为一个矩形) pdf.SetFillColor(57, 99, 156) pdf.RectFromUpperLeftWithStyle(margin, y, totalWidth, headerHeight, "F") // 设置表头样式 tableHeaderStyle() pdf.SetTextColor(255, 255, 255) startX := margin currX := startX for i, width := range colWidths { // 表头居中 text := headers[i] textWidth, _ := pdf.MeasureTextWidth(text) textX := currX + (width-textWidth)/2 pdf.SetX(textX) pdf.SetY(y + cellPadding) pdf.Cell(nil, text) // 修改:使用nil而不是指定宽度 // 绘制黑色列分隔线(只在列之间绘制) if i < len(colWidths)-1 { pdf.SetLineWidth(0.2) pdf.SetStrokeColor(0, 0, 0) // 黑色分隔线 pdf.Line(currX+width, y, currX+width, y+headerHeight) } currX += width } // 绘制表头外边框(黑色,确保与内容表格对齐) pdf.SetLineWidth(0.5) pdf.SetStrokeColor(0, 0, 0) // 黑色边框 pdf.RectFromUpperLeftWithStyle(margin, y, totalWidth, headerHeight, "D") y += headerHeight // 绘制表格内容 tableCellStyle() for _, work := range inst.WorkMessList { // 准备行数据 rowData := []string{ work.WellName, work.SampleField, work.ValueInterval + "米", work.GlobalMax1 + "℃", work.GlobalMax2 + "MPa", work.Content, work.PersonnelList, work.Link, } // 处理空数据 for i := range rowData { if rowData[i] == "" || rowData[i] == "℃" || rowData[i] == "MPa" || rowData[i] == "米" { rowData[i] = "无数据" } } // 计算最大行数 maxLines := 1 cellLines := make([][]string, len(colWidths)) for i, width := range colWidths { lines, _ := pdf.SplitText(rowData[i], width-cellPadding*2) cellLines[i] = lines if len(lines) > maxLines { maxLines = len(lines) } } // 计算行高 rowHeight := lineHeight*float64(maxLines) + cellPadding*2 // 检查是否需要换页(只考虑行高度) if y+rowHeight > pageHeight-margin-5 { // 保留5mm底部间距 pdf.AddPage() y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) pdf.SetFont("simfang", "", 12) } // 绘制行内容 currX = startX for i, width := range colWidths { // 绘制单元格边框 pdf.SetLineWidth(0.1) pdf.SetStrokeColor(0, 0, 0) pdf.RectFromUpperLeftWithStyle(currX, y, width, rowHeight, "D") // 绘制多行文本 lines := cellLines[i] // 计算垂直居中位置 totalTextHeight := lineHeight * float64(len(lines)) startTextY := y + (rowHeight-totalTextHeight)/2 for j, line := range lines { // 计算水平居中位置 textWidth, _ := pdf.MeasureTextWidth(line) textX := currX + (width-textWidth)/2 // 边界检查,防止文本溢出 if textX < currX+cellPadding { textX = currX + cellPadding } else if textX+textWidth > currX+width-cellPadding { textX = currX + width - textWidth - cellPadding } pdf.SetX(textX) pdf.SetY(startTextY + float64(j)*lineHeight) pdf.SetTextColor(0, 0, 0) pdf.Cell(nil, line) // 关键修改:使用nil而不是指定宽度 } currX += width } y += rowHeight } } y += sectionGap // 4. 维保记录表格 sectionStyle() pdf.SetX(margin) pdf.SetY(y) pdf.SetTextColor(0, 0, 255) pdf.Cell(nil, "▍ 维保记录") y += lineHeight if len(inst.GetLcmRespData) == 0 { // 无数据提示(保持不变) if y > pageHeight-lineHeight { pdf.AddPage() y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) } pdf.SetFont("simfang", "", 12) pdf.SetTextColor(0, 0, 0) pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, "暂无维保记录") y += lineHeight } else { // 表格参数 colWidths := []float64{120, 80, 80, 140, 120} headers := []string{"维保时间", "维保等级", "维保人员", "维保内容", "链接"} headerHeight := lineHeight + cellPadding*2 // 计算总宽度 totalWidth := 0.0 for _, width := range colWidths { totalWidth += width } // 绘制表头背景(整个表头作为一个矩形) pdf.SetFillColor(57, 99, 156) pdf.RectFromUpperLeftWithStyle(margin, y, totalWidth, headerHeight, "F") // 设置表头样式 tableHeaderStyle() pdf.SetTextColor(255, 255, 255) startX := margin currX := startX for i, width := range colWidths { // 表头居中 text := headers[i] textWidth, _ := pdf.MeasureTextWidth(text) textX := currX + (width-textWidth)/2 pdf.SetX(textX) pdf.SetY(y + cellPadding) pdf.Cell(&gopdf.Rect{W: width, H: lineHeight}, text) // 绘制黑色列分隔线(只在列之间绘制) if i < len(colWidths)-1 { pdf.SetLineWidth(0.2) pdf.SetStrokeColor(0, 0, 0) // 黑色分隔线 pdf.Line(currX+width, y, currX+width, y+headerHeight) } currX += width } // 绘制表头外边框(黑色,确保与内容表格对齐) pdf.SetLineWidth(0.5) pdf.SetStrokeColor(0, 0, 0) // 黑色边框 pdf.RectFromUpperLeftWithStyle(margin, y, totalWidth, headerHeight, "D") y += headerHeight // 绘制表格内容 tableCellStyle() for _, repair := range inst.GetLcmRespData { // 准备行数据 rowData := []string{ repair.Time, repair.Repair_level, repair.Applicanter, repair.Note, repair.Link, } // 处理空数据 for i := range rowData { if rowData[i] == "" { rowData[i] = "无数据" } } // 计算最大行数 maxLines := 1 cellLines := make([][]string, len(colWidths)) for i, width := range colWidths { lines, _ := pdf.SplitText(rowData[i], width-cellPadding*2) cellLines[i] = lines if len(lines) > maxLines { maxLines = len(lines) } } rowHeight := lineHeight*float64(maxLines) + cellPadding*2 // 检查是否需要换页(只考虑行高度) if y+rowHeight > pageHeight-5 { // 保留5mm底部间距 pdf.AddPage() y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) pdf.SetFont("simfang", "", 12) } // 绘制行 currX = startX for i, width := range colWidths { pdf.SetLineWidth(0.1) pdf.SetStrokeColor(0, 0, 0) pdf.RectFromUpperLeftWithStyle(currX, y, width, rowHeight, "D") lines := cellLines[i] // 计算垂直居中位置 totalTextHeight := lineHeight * float64(len(lines)) startTextY := y + (rowHeight-totalTextHeight)/2 for j, line := range lines { // 计算水平居中位置 textWidth, _ := pdf.MeasureTextWidth(line) textX := currX + (width-textWidth)/2 // 水平居中 pdf.SetX(textX) pdf.SetY(startTextY + float64(j)*lineHeight) // 垂直居中 pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: width, H: lineHeight}, line) } currX += width } y += rowHeight } } y += sectionGap } // 保存PDF beginTime := time.Now().UnixNano() filename = fmt.Sprintf("./authfile/%d.pdf", beginTime) if err := pdf.WritePdf(filename); err != nil { logs.Error("PDF保存失败:", err) return "" } return strconv.FormatInt(beginTime, 10) + ".pdf" } func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename string) { respJSON, err := json.Marshal(resp) if err != nil { logs.Error("Tool_warning数据JSON序列化错误:", err) } fmt.Println("Tool_warning JSON:", string(respJSON)) // 解析JSON数据 var instruments []InstrumentMessRespdata if err := json.Unmarshal(fullData, &instruments); err != nil { logs.Error("JSON解析错误:", err) return "" } // 初始化PDF pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4}) // 加载中文字体 if err := pdf.AddTTFFont("simfang", "./simsun.ttf"); err != nil { logs.Error("加载字体错误:", err) return "" } // 基础样式参数 margin := 28.0 // 页边距 lineHeight := 22.0 // 行高 sectionGap := 20.0 // 段落间距 colGap := 15.0 // 列间距 cellPadding := 5.0 // 表格单元格内边距 pageHeight := gopdf.PageSizeA4.H - margin*2 minBottomMargin := 10.0 // 最小底部间距 y := margin // 添加页码的函数 addPageNumber := func(pageNum int) { // 保存当前状态 currentY := pdf.GetY() currentX := pdf.GetX() // 设置页码样式 pdf.SetFont("simfang", "", 12) pdf.SetTextColor(0, 0, 0) pdf.SetX(gopdf.PageSizeA4.W - margin - 30) pdf.SetY(gopdf.PageSizeA4.H - margin/1.5) pdf.Cell(nil, fmt.Sprintf("Page %d", pageNum)) // 恢复位置 pdf.SetY(currentY) pdf.SetX(currentX) } // 样式函数 titleStyle := func() { pdf.SetFont("simfang", "", 18) pdf.SetTextColor(0, 0, 0) } sectionStyle := func() { pdf.SetFont("simfang", "", 14) pdf.SetTextColor(30, 30, 150) } tableHeaderStyle := func() { pdf.SetFont("simfang", "", 12) pdf.SetTextColor(255, 255, 255) pdf.SetFillColor(57, 99, 156) } tableCellStyle := func() { pdf.SetFont("simfang", "", 11) pdf.SetTextColor(0, 0, 0) pdf.SetFillColor(255, 255, 255) } // 辅助函数:检查是否需要换页 checkPageBreak := func(requiredHeight float64) bool { return y+requiredHeight > pageHeight-minBottomMargin } // 使用示例 if checkPageBreak(lineHeight * 2) { pdf.AddPage() y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) pdf.SetFont("simfang", "", 12) } // 生成PDF报告 pdf.AddPage() // 添加第一页的页码 addPageNumber(pdf.GetNumberOfPages()) // 获取井名 var wellName string if len(instruments) > 0 { wellName = instruments[0].WellName } // 主标题 titleStyle() pdf.SetX(margin) pdf.SetY(y) titleWidth := gopdf.PageSizeA4.W - margin*2 var titleOption gopdf.CellOption titleOption.Align = gopdf.Center pdf.CellWithOption(&gopdf.Rect{W: titleWidth, H: lineHeight}, wellName, titleOption) y += lineHeight * 1.8 // 风险提示部分 if len(resp) > 0 { pdf.SetFont("simfang", "B", 12) pdf.SetTextColor(0, 0, 0) pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, "Risk Warning For This Well") y += lineHeight * 1.5 reportTime := time.Now().Format("2006-01-02 15:04:05") pdf.SetFont("simfang", "", 12) pdf.SetTextColor(0, 0, 0) // pdf.SetX(margin) // pdf.SetY(y) // pdf.Cell(nil, fmt.Sprintf("Well Name:%s\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tReport Time:%s", wellName, reportTime)) // y += lineHeight * 1.2 // pdf.Line(margin, y, gopdf.PageSizeA4.W-margin, y) // y += 10 pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, fmt.Sprintf("Well Name: %s", wellName)) // 计算Report Time的位置 timeWidth := 200.0 // 预估时间文本宽度 timeX := gopdf.PageSizeA4.W - margin - timeWidth pdf.SetX(timeX) pdf.Cell(nil, fmt.Sprintf("Report Time: %s", reportTime)) y += lineHeight * 1.2 pdf.Line(margin, y, gopdf.PageSizeA4.W-margin, y) y += 10 pdf.SetFont("simfang", "B", 16) pdf.SetTextColor(220, 20, 60) pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, "Risk Warning:") y += lineHeight * 1.2 for _, warning := range resp { if checkPageBreak(lineHeight * 1.2) { pdf.AddPage() y = margin + 15 // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) } fmt.Println("Time---------------------[] ", warning.Time) var contextText string var warningText string if warning.Flag == 0 { contextText = "Normal" warningText = fmt.Sprintf("%s %s %s", warning.Series+" ", warning.Instrument, contextText) pdf.SetTextColor(0, 255, 0) } else { contextText = warning.Time + " " + warning.Context pdf.SetTextColor(200, 0, 0) warningText = fmt.Sprintf("%s", contextText) } pdf.SetFont("simfang", "", 13) pdf.SetX(margin) pdf.SetY(y) pdf.Cell(&gopdf.Rect{W: gopdf.PageSizeA4.W - margin*2, H: lineHeight}, warningText) y += lineHeight * 1.2 } y += 15 } // 遍历所有仪器 for _, inst := range instruments { pdf.SetLineWidth(1) pdf.SetStrokeColor(0, 0, 0) pdf.Line(margin, y, gopdf.PageSizeA4.W-margin, y) y += 15 // 1. 基本信息区块 sectionStyle() pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, "▍ Basic Information ("+inst.Series+" "+inst.Instrument+")") y += lineHeight formattedTime := inst.Time if inst.Time != "" { if t, err := time.Parse(time.RFC3339, inst.Time); err == nil { formattedTime = t.Format("2006-01-02") } else if t, err := time.Parse("2006-01-02T15:04:05Z", inst.Time); err == nil { formattedTime = t.Format("2006-01-02") } } basicInfo := []struct { Label string Value string }{ {"Date Of Manufacture:", formattedTime}, {"Date Of Warehousing:", ""}, {"Total Working Time:", inst.WorkTime + " h"}, {"Current Working Time:", inst.WorkTimes + " h"}, {"Department:", inst.Dept}, {"Firmware Version:", inst.Version}, } colWidth := (gopdf.PageSizeA4.W - margin*2 - colGap) / 2 labelWidth := 190.0 valueWidth := colWidth - labelWidth for i := 0; i < len(basicInfo); i += 2 { if checkPageBreak(lineHeight * 2) { pdf.AddPage() y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) pdf.SetFont("simfang", "", 12) } // 第一列 pdf.SetX(margin) pdf.SetY(y) pdf.SetFont("simfang", "", 12) pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: 130, H: lineHeight}, basicInfo[i].Label) pdf.SetX(margin + 130) pdf.SetTextColor(0, 0, 0) if basicInfo[i].Value == "" || basicInfo[i].Value == "null" || strings.TrimSpace(basicInfo[i].Value) == "" { pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: valueWidth, H: lineHeight}, "No data") } else { pdf.Cell(&gopdf.Rect{W: valueWidth, H: lineHeight}, basicInfo[i].Value) } // 第二列 if i+1 < len(basicInfo) { pdf.SetX(margin + colWidth + colGap) pdf.SetY(y) pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: 13, H: lineHeight}, basicInfo[i+1].Label) pdf.SetX(margin + colWidth + colGap + 130) pdf.SetTextColor(0, 0, 0) if basicInfo[i+1].Value == "" { pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: valueWidth, H: lineHeight}, "No data") } else { pdf.Cell(&gopdf.Rect{W: valueWidth, H: lineHeight}, basicInfo[i+1].Value) } } y += lineHeight } y += sectionGap // 2. 质检记录 sectionStyle() pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, "▍ Product Quality Inspection Record") y += lineHeight if inst.QualityData.ProcessRecord == "" && inst.QualityData.ProcessInspection == "" && inst.QualityData.FinalInspection == "" { if checkPageBreak(lineHeight) { pdf.AddPage() y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) } pdf.SetFont("simfang", "", 12) pdf.SetTextColor(0, 0, 0) pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, "No data") y += lineHeight } else { qcItems := []struct { Label string Value string }{ {"Production Process Record:", inst.QualityData.ProcessRecord}, {"Production Process Inspection:", inst.QualityData.ProcessInspection}, {"Final Inspection Display:", inst.QualityData.FinalInspection}, } for _, item := range qcItems { availableWidth := gopdf.PageSizeA4.W - margin*2 - labelWidth // 先设置字体再计算分割 pdf.SetFont("simfang", "", 12) lines, _ := pdf.SplitText(item.Value, availableWidth) fmt.Printf("DEBUG: %s - %d lines, text: '%s'\n", item.Label, len(lines), item.Value) itemHeight := lineHeight * float64(len(lines)) if len(lines) == 0 { itemHeight = lineHeight } if checkPageBreak(itemHeight) { pdf.AddPage() y = margin addPageNumber(pdf.GetNumberOfPages()) pdf.SetFont("simfang", "", 12) } // 绘制标签 pdf.SetXY(margin, y) pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: labelWidth, H: lineHeight}, item.Label) // 绘制值 if item.Value == "" { pdf.SetXY(margin+labelWidth, y) pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: availableWidth, H: lineHeight}, "No data") y += lineHeight } else { for i, line := range lines { pdf.SetXY(margin+labelWidth, y+float64(i)*lineHeight) pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: availableWidth, H: lineHeight}, line) } y += lineHeight * float64(len(lines)) } y += lineHeight * 0.3 // 项目间距 } } y += sectionGap // 3. 仪器施工汇总 sectionStyle() pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, "▍ Summary Of Instrument Construction") y += lineHeight // 表格参数 colWidths := []float64{80, 60, 60, 60, 60, 60, 50, 110} // 使用缩写避免换行问题 headers := []string{ "Well Name", "Status", "Depth", "Max Temp", "Max Press", "Situation", "Person", "Link", } if len(inst.WorkMessList) == 0 { // 没有上井记录时显示提示信息 if y > pageHeight-lineHeight*2 { pdf.AddPage() y = margin addPageNumber(pdf.GetNumberOfPages()) } pdf.SetFont("simfang", "", 10) pdf.SetTextColor(0, 0, 0) pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, "No Data") y += lineHeight } else { // 计算表头每列的最大行数 maxHeaderLines := 1 headerLines := make([][]string, len(colWidths)) for i, width := range colWidths { availableWidth := width - cellPadding*2 + 20 lines, _ := pdf.SplitText(headers[i], availableWidth) headerLines[i] = lines if len(lines) > maxHeaderLines { maxHeaderLines = len(lines) } } // 表头高度 headerHeight := lineHeight*float64(maxHeaderLines) + cellPadding*2 // 检查表头是否需要换页 if y+headerHeight > pageHeight-5 { pdf.AddPage() y = margin addPageNumber(pdf.GetNumberOfPages()) } // 计算总宽度(确保与内容表格一致) totalWidth := 0.0 for _, width := range colWidths { totalWidth += width } // 绘制表头背景(整个表头作为一个矩形) pdf.SetFillColor(57, 99, 156) pdf.RectFromUpperLeftWithStyle(margin, y, totalWidth, headerHeight, "F") // 设置表头样式 pdf.SetFont("simfang", "", 10) pdf.SetTextColor(255, 255, 255) startX := margin currX := startX for i, width := range colWidths { // 绘制多行表头文本(居中) lines := headerLines[i] // 计算垂直居中位置 totalTextHeight := lineHeight * float64(len(lines)) startTextY := y + (headerHeight-totalTextHeight)/2 for j, line := range lines { textWidth, _ := pdf.MeasureTextWidth(line) textX := currX + (width-textWidth)/2 pdf.SetX(textX) pdf.SetY(startTextY + float64(j)*lineHeight) pdf.Cell(&gopdf.Rect{W: width, H: lineHeight}, line) } // 绘制黑色列分隔线(只在列之间绘制) if i < len(colWidths)-1 { pdf.SetLineWidth(0.2) pdf.SetStrokeColor(0, 0, 0) // 改为黑色分隔线 pdf.Line(currX+width, y, currX+width, y+headerHeight) } currX += width } // 绘制表头外边框(黑色,确保与内容表格对齐) pdf.SetLineWidth(0.5) pdf.SetStrokeColor(0, 0, 0) // 改为黑色边框 pdf.RectFromUpperLeftWithStyle(margin, y, totalWidth, headerHeight, "D") y += headerHeight // 绘制表格内容 tableCellStyle() pdf.SetFont("simfang", "", 12) for _, work := range inst.WorkMessList { // 准备行数据 rowData := []string{ work.WellName, work.SampleField, work.ValueInterval + "m", work.GlobalMax1 + "℃", work.GlobalMax2 + "MPa", work.Content, work.PersonnelList, work.Link, } // 处理空数据 for i := range rowData { if rowData[i] == "" || rowData[i] == "℃" || rowData[i] == "MPa" || rowData[i] == "m" { rowData[i] = "No data" } } // 计算最大行数 maxLines := 1 cellLines := make([][]string, len(colWidths)) for i, width := range colWidths { // 增加可用宽度 availableWidth := width - cellPadding*2 + 5 lines, _ := pdf.SplitText(rowData[i], availableWidth) cellLines[i] = lines if len(lines) > maxLines { maxLines = len(lines) } } // 计算行高 rowHeight := lineHeight*float64(maxLines) + cellPadding*2 // 检查是否需要换页 if y+rowHeight > pageHeight-5 { pdf.AddPage() y = margin addPageNumber(pdf.GetNumberOfPages()) pdf.SetFont("simfang", "", 12) } // 绘制行背景(可选,使隔行变色更易读) if len(inst.WorkMessList)%2 == 0 { pdf.SetFillColor(255, 255, 255) pdf.RectFromUpperLeftWithStyle(margin, y, totalWidth, rowHeight, "F") } currX = startX for i, width := range colWidths { // 绘制多行文本 lines := cellLines[i] // 计算垂直居中位置 totalTextHeight := lineHeight * float64(len(lines)) startTextY := y + (rowHeight-totalTextHeight)/2 for j, line := range lines { // 计算水平居中位置 textWidth, _ := pdf.MeasureTextWidth(line) textX := currX + (width-textWidth)/2 // 水平居中 pdf.SetX(textX) pdf.SetY(startTextY + float64(j)*lineHeight) // 垂直居中 pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: width, H: lineHeight}, line) } // 绘制列分隔线 if i < len(colWidths)-1 { pdf.SetLineWidth(0.1) pdf.SetStrokeColor(0, 0, 0) pdf.Line(currX+width, y, currX+width, y+rowHeight) } currX += width } // 绘制行边框(确保与表头对齐) pdf.SetLineWidth(0.2) pdf.SetStrokeColor(0, 0, 0) pdf.RectFromUpperLeftWithStyle(margin, y, totalWidth, rowHeight, "D") y += rowHeight } } y += sectionGap // 4. 维保记录表格 sectionStyle() pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, "▍ Maintenance Record") y += lineHeight if len(inst.GetLcmRespData) == 0 { // 无数据提示(保持不变) if y > pageHeight-lineHeight { pdf.AddPage() y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) } pdf.SetFont("simfang", "", 12) pdf.SetTextColor(0, 0, 0) pdf.SetX(margin) pdf.SetY(y) pdf.Cell(nil, "No data") y += lineHeight } else { // 表格参数 colWidths := []float64{120, 80, 80, 140, 120} headers := []string{"Time", "Level", "Maintenance Person", "Maintenance Content", "Link"} // 计算表头每列的最大行数 maxHeaderLines := 1 headerLines := make([][]string, len(colWidths)) for i, width := range colWidths { availableWidth := width - cellPadding*2 + 20 lines, _ := pdf.SplitText(headers[i], availableWidth) headerLines[i] = lines if len(lines) > maxHeaderLines { maxHeaderLines = len(lines) } } // 表头高度 headerHeight := lineHeight*float64(maxHeaderLines) + cellPadding*2 // 检查表头是否需要换页 if y+headerHeight > pageHeight-5 { pdf.AddPage() y = margin addPageNumber(pdf.GetNumberOfPages()) } // 计算总宽度 totalWidth := 0.0 for _, width := range colWidths { totalWidth += width } // 绘制表头背景(整个表头作为一个矩形) pdf.SetFillColor(57, 99, 156) pdf.RectFromUpperLeftWithStyle(margin, y, totalWidth, headerHeight, "F") // 设置表头样式 tableHeaderStyle() pdf.SetTextColor(255, 255, 255) startX := margin currX := startX for i, width := range colWidths { // 绘制多行表头文本(居中) lines := headerLines[i] // 计算垂直居中位置 totalTextHeight := lineHeight * float64(len(lines)) startTextY := y + (headerHeight-totalTextHeight)/2 for j, line := range lines { textWidth, _ := pdf.MeasureTextWidth(line) textX := currX + (width-textWidth)/2 pdf.SetX(textX) pdf.SetY(startTextY + float64(j)*lineHeight) pdf.Cell(&gopdf.Rect{W: width, H: lineHeight}, line) } // 绘制黑色列分隔线(只在列之间绘制) if i < len(colWidths)-1 { pdf.SetLineWidth(0.2) pdf.SetStrokeColor(0, 0, 0) // 黑色分隔线 pdf.Line(currX+width, y, currX+width, y+headerHeight) } currX += width } // 绘制表头外边框(黑色,确保与内容表格对齐) pdf.SetLineWidth(0.5) pdf.SetStrokeColor(0, 0, 0) // 黑色边框 pdf.RectFromUpperLeftWithStyle(margin, y, totalWidth, headerHeight, "D") y += headerHeight // 绘制表格内容 tableCellStyle() pdf.SetFont("simfang", "", 12) for _, repair := range inst.GetLcmRespData { // 准备行数据 rowData := []string{ repair.Time, repair.Repair_level, repair.Applicanter, repair.Note, repair.Link, } // 处理空数据 for i := range rowData { if rowData[i] == "" { rowData[i] = "No data" } } // 计算最大行数 maxLines := 1 cellLines := make([][]string, len(colWidths)) for i, width := range colWidths { // 增加可用宽度 availableWidth := width - cellPadding*2 + 5 lines, _ := pdf.SplitText(rowData[i], availableWidth) cellLines[i] = lines if len(lines) > maxLines { maxLines = len(lines) } } // 计算行高 rowHeight := lineHeight*float64(maxLines) + cellPadding*2 // 检查是否需要换页 if y+rowHeight > pageHeight-5 { pdf.AddPage() y = margin addPageNumber(pdf.GetNumberOfPages()) pdf.SetFont("simfang", "", 12) } // 移除行背景色(删除隔行变色代码) // 绘制行内容 currX = startX for i, width := range colWidths { // 绘制多行文本 lines := cellLines[i] // 计算垂直居中位置 totalTextHeight := lineHeight * float64(len(lines)) startTextY := y + (rowHeight-totalTextHeight)/2 for j, line := range lines { // 计算水平居中位置 textWidth, _ := pdf.MeasureTextWidth(line) textX := currX + (width-textWidth)/2 // 水平居中 pdf.SetX(textX) pdf.SetY(startTextY + float64(j)*lineHeight) // 垂直居中 pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: width, H: lineHeight}, line) } // 绘制列分隔线(改为黑色) if i < len(colWidths)-1 { pdf.SetLineWidth(0.1) pdf.SetStrokeColor(0, 0, 0) // 改为黑色竖线 pdf.Line(currX+width, y, currX+width, y+rowHeight) } currX += width } // 绘制行边框(确保与表头对齐) pdf.SetLineWidth(0.2) pdf.SetStrokeColor(0, 0, 0) pdf.RectFromUpperLeftWithStyle(margin, y, totalWidth, rowHeight, "D") y += rowHeight } } y += sectionGap } // 保存PDF beginTime := time.Now().UnixNano() filename = fmt.Sprintf("./authfile/%d.pdf", beginTime) if err := pdf.WritePdf(filename); err != nil { logs.Error("PDF保存失败:", err) return "" } return strconv.FormatInt(beginTime, 10) + ".pdf" } func leftOneData(wellName string, IsMemory *bool) []VibrationStatData { var db string var cmdSql string var sql string var results []VibrationStatData rwLocker.RLock() // 初始化计数器 count104 := 0 count105 := 0 count106 := 0 fmt.Println("wellName---------", wellName) memory := false // 默认值 if IsMemory != nil { memory = *IsMemory // 使用传入值 } if v, ok := wellNamemap[wellName]; ok { rwLocker.RUnlock() db = v } else { rwLocker.RUnlock() return results // return empty slice if well not found } // 1. 检查数据库状态 needOffline := false masterConn, err := getOdbcConn("master") if err != nil { logs.Info("链接master库失败", err.Error()) fmt.Println("链接master库失败", err.Error()) } else { defer masterConn.Close() // 查询数据库状态 checkSql := fmt.Sprintf("SELECT state_desc FROM sys.databases WHERE name = '%s'", db) var status string err = masterConn.QueryRow(checkSql).Scan(&status) if err != nil { fmt.Println("查询数据库状态失败:", err.Error()) logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) onlineSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) _, err = masterConn.Exec(onlineSql) if err != nil { fmt.Println("设置在线失败:", err.Error()) logs.Info("设置在线失败:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为在线\n", db) needOffline = true } } else { fmt.Printf("数据库 %s 已在线,不需要操作\n", db) needOffline = false } } } conn, err := getOdbcConn(db) if err != nil { fmt.Println("振动粘滑数据未找到") return results // return empty slice if connection fails } if memory { sql = fmt.Sprintf("SELECT COALESCE([6875], 0) AS DEEP, CONVERT(varchar(19), CONVERT(datetime, [6874]), 120) AS TIME, CODE, CASE CODE WHEN 104 THEN [6878] WHEN 105 THEN [6881] WHEN 106 THEN [6885] END AS VALUE, CASE CODE WHEN 104 THEN [6887] WHEN 105 THEN [6888] WHEN 106 THEN [6889] END AS LEVEL FROM STICKMEMORY CROSS APPLY (VALUES (104), (105), (106)) AS Codes(CODE) ORDER BY CONVERT(datetime, [6874]) ASC") } else { sql = fmt.Sprintf("SELECT DISTINCT [4303] AS DEEP, [4304] AS TIME, [4305] AS CODE, [4306] AS VALUE, CASE WHEN [4305] in(104,105) THEN CASE WHEN [4306] < 0.5 THEN 0 WHEN [4306] >= 0.5 AND [4306] < 1 THEN 1 WHEN [4306] >= 1 AND [4306] < 2 THEN 2 WHEN [4306] >= 2 AND [4306] < 3 THEN 3 WHEN [4306] >= 3 AND [4306] < 5 THEN 4 WHEN [4306] >= 5 AND [4306] < 8 THEN 5 WHEN [4306] >= 8 AND [4306] < 15 THEN 6 WHEN [4306] >= 15 THEN 7 ELSE NULL END WHEN [4305] = 106 THEN CASE WHEN [4306] < 40 THEN 0 WHEN [4306] >= 40 AND [4306] < 60 THEN 1 WHEN [4306] >= 60 AND [4306] < 80 THEN 2 WHEN [4306] >= 80 AND [4306] < 100 THEN 3 WHEN [4306] >= 100 AND [4306] < 120 THEN 4 WHEN [4306] >= 120 AND [4306] < 150 THEN 5 WHEN [4306] >= 150 THEN 6 ELSE NULL END ELSE NULL END AS LEVEL FROM DECODETABLE WHERE [4305] IN (104, 105, 106) ORDER BY [4304] ASC;") } fmt.Println("执行的查询sql-----------------------------------", sql) fmt.Printf("执行SQL查询: %s\n", sql) rows, err := conn.Query(sql) if err != nil { logs.Info("Query Error", err.Error()) fmt.Println("Query Error", err.Error()) return results // return empty slice if query fails } defer rows.Close() fmt.Println("数据获取成功") for rows.Next() { var data VibrationStatData fmt.Println("数据获取成功111111111111") err := rows.Scan(&data.Deep, &data.Time, &data.Code, &data.Value, &data.Level) if err != nil { fmt.Println("Scan Error", err.Error()) continue } fmt.Printf("Code: %d, Value: %f, Level: %d\n", data.Code, data.Value, data.Level) // 统计各类CODE的数量 switch data.Code { case 104: count104++ case 105: count105++ case 106: count106++ } results = append(results, data) } // 2. 如果需要,最后设置数据库离线 if needOffline { masterConn2, err := getOdbcConn("master") if err != nil { logs.Info("连接master库失败", err.Error()) fmt.Println("连接master库失败", err.Error()) } else { defer masterConn2.Close() cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE WITH ROLLBACK IMMEDIATE", db) _, err = masterConn2.Exec(cmdSql) if err != nil { logs.Error("SET OFFLINE command execution error:", err.Error()) } } } return results // return the populated results } // code只可以只可以是104,105; 黏滑不可以用这个方法。 func convertToStatsData(vibrationData []VibrationStatData, code int) [][]string { // 按code过滤数据 var filteredData []VibrationStatData for _, data := range vibrationData { if data.Code == code { filteredData = append(filteredData, data) } } total := len(filteredData) // 定义区间范围和对应的Level值 ranges := []struct { name string levels []int // 包含的Level值 }{ {"0 - 2", []int{0, 1, 2}}, {"3 - 4", []int{3, 4}}, {"5 - 7", []int{5, 6, 7}}, {"7 included above", []int{7}}, // 7级及以上 } // 初始化结果 statsData := make([][]string, 0, len(ranges)+1) // 统计每个区间的数量 for _, r := range ranges { count := 0 for _, data := range filteredData { for _, l := range r.levels { if data.Level == l { count++ break } } } fmt.Println("total---", total) // 计算百分比 percentage := "0.00%" if total > 0 { p := float64(count) / float64(total) * 100 percentage = fmt.Sprintf("%.2f%%", p) } statsData = append(statsData, []string{ r.name, strconv.Itoa(count), percentage, }) } if total > 0 { statsData = append(statsData, []string{ "Total", strconv.Itoa(total), "100.00%", // 保持百分比格式一致 }) return statsData } // 添加总计行 statsData = append(statsData, []string{ "Total", strconv.Itoa(total), "0.00%", // 保持百分比格式一致 }) return statsData } // 振动粘滑106的数据处理 func convertStickSlipData(vibrationData []VibrationStatData) [][]string { // 定义等级区间分组 levelGroups := []struct { name string levels []int }{ {"0 - 2", []int{0, 1, 2}}, {"3 - 4", []int{3, 4}}, {"5 - 7", []int{5, 6, 7}}, {"7 included above", []int{7}}, //7级及以上 } // 先处理数据,确定每个值的Level并过滤Code=106 var validData []int // 存储有效的Level值 for _, data := range vibrationData { if data.Code == 106 { level := determineStickSlipLevel(data.Value) validData = append(validData, level) } } total := len(validData) // 动态计算总条数 // 初始化结果 result := make([][]string, 0, len(levelGroups)+1) // 统计每个分组的数量 for _, group := range levelGroups { count := 0 for _, level := range validData { for _, l := range group.levels { if level == l { count++ break } } } // 计算百分比 percentage := "0.00%" if total > 0 { percent := float64(count) / float64(total) * 100 percentage = fmt.Sprintf("%.2f%%", percent) } result = append(result, []string{ group.name, strconv.Itoa(count), percentage, }) } if total > 0 { result = append(result, []string{ "Total", strconv.Itoa(total), // 这里使用动态计算的total "100%", }) return result } // 添加总计行(使用动态计算的总数) result = append(result, []string{ "Total", strconv.Itoa(total), // 这里使用动态计算的total "0.00%", }) return result } // 数值到Level的转换规则 func determineStickSlipLevel(value float64) int { switch { case value < 40: return 0 case value < 60: return 1 case value < 80: return 2 case value < 100: return 3 case value < 120: return 4 case value < 150: return 5 default: return 6 } } func parseTime(timeStr string) (time.Time, error) { //2025/1/21 12:48 // 先尝试 RFC3339 格式 (带T的格式) t, err := time.Parse(time.RFC3339, timeStr) if err == nil { return t, nil } // 再尝试普通格式 (空格分隔) t, err = time.Parse("2006-01-02 15:04:05", timeStr) if err == nil { return t, nil } // 如果两种格式都失败,返回错误 return time.Time{}, fmt.Errorf("无法解析时间字符串: %s", timeStr) } func generateVibrationTable(vibrationData []VibrationStatData, code int) [][]string { // 1. 根据code过滤数据 filteredData := make([]VibrationStatData, 0) for _, data := range vibrationData { if data.Code == code { filteredData = append(filteredData, data) } } if len(filteredData) == 0 { return makeEmptyTable() } // 2. 数据排序(按时间升序) sort.Slice(filteredData, func(i, j int) bool { t1, _ := time.Parse(time.RFC3339, filteredData[i].Time) t2, _ := time.Parse(time.RFC3339, filteredData[j].Time) return t1.Before(t2) }) // 初始化统计 counts := make([]int, 8) // 出现次数 durations := make([]float64, 8) // 持续时间(分钟) totalDuration := 0.0 // 用于调试的总时间 // 3. 计算持续时间和计数 for i := 0; i < len(filteredData); i++ { current := filteredData[i] currentLevel := current.Level if currentLevel < 0 || currentLevel >= 8 { currentLevel = 0 // 确保等级在0-7范围内 } // 计数(每个点都计数) counts[currentLevel]++ // 计算当前点到下一个点的时间段(最后一个点不计算) if i < len(filteredData)-1 { // currentTime, err1 := time.Parse(time.RFC3339, current.Time) // nextTime, err2 := time.Parse(time.RFC3339, filteredData[i+1].Time) currentTime, err1 := parseTime(current.Time) nextTime, err2 := parseTime(filteredData[i+1].Time) if err1 == nil && err2 == nil { duration := nextTime.Sub(currentTime).Minutes() // 仅当时间间隔 <= 60分钟时才计入持续时间 if duration <= 60 { durations[currentLevel] += duration // 再累加 totalDuration += duration } } else { if err1 != nil { fmt.Printf("[ERROR] 解析当前时间失败: %v\n", err1) } if err2 != nil { fmt.Printf("[ERROR] 解析下一个时间失败: %v\n", err2) } } } } // 4. 构建结果表格 table := make([][]string, 8) for level := 0; level < 8; level++ { // 直接在 "Level" 后面添加两个空格 levelStr := fmt.Sprintf(" Level %d", level) // 注意这里有两个空格 // 使用固定宽度格式化 Level 和计数 col1 := fmt.Sprintf("%-8s %-6s", levelStr, fmt.Sprintf(" %d", counts[level])) col2 := formatDuration(durations[level]) col3 := "No Limit" if level >= 4 { col3 = calculateThreshold(level, durations[level]) } table[level] = []string{col1, col2, col3} } return table } func makeEmptyTable() [][]string { table := make([][]string, 8) levelCounts := make([]int, 8) for level := 0; level < 8; level++ { count := 0 if level <= 6 { count = levelCounts[level] } levelStr := fmt.Sprintf(" Level %d", level) col1 := fmt.Sprintf("%-8s %-6s", levelStr, fmt.Sprintf(" %d", count)) fmt.Println("col1--", col1) col2 := fmt.Sprintf("%4dmin %3dh", 0, 0) col3 := "No Limit" if level >= 4 { col3 = calculateThreshold(level, 0) } table[level] = []string{col1, col2, col3} } return table } func formatDuration(totalMinutes float64) string { rawMinutes := int(math.Round(totalMinutes)) rawHours := rawMinutes / 60 // 使用固定宽度格式化分钟和小时 minStr := fmt.Sprintf("%4dmin", rawMinutes) // 固定4位宽度(9999min) hourStr := fmt.Sprintf("%2dh", rawHours) // 固定2位宽度(99h) return minStr + " " + hourStr // 中间两个空格 } // 计算阈值百分比 func calculateThreshold(level int, totalMinutes float64) string { //四舍五入取整数,与右侧四舍五入保持一致。 roundedMinutes := math.Round(totalMinutes) // 计算百分比 var percentage float64 switch level { case 4: percentage = roundedMinutes / 180 * 100 default: // level 5,6,7 percentage = roundedMinutes / 20 * 100 } // 四舍五入到整数百分比 rounded := int(math.Round(percentage)) // 只处理负值情况(百分比不可能为负) if rounded < 0 { rounded = 0 } return fmt.Sprintf("%d%%", rounded) } func generateVibrationTableData(vibrationData []VibrationStatData) [][]string { // 初始化全零统计数组 (Level0-7) levelCounts := make([]int, 8) // 出现次数 levelDurations := make([]int, 8) // 持续时间(秒) parseTime := func(t string) time.Time { // 1. 先尝试 RFC3339 格式 (带T的格式) parsed, err := time.Parse(time.RFC3339, t) if err == nil { return parsed } // 2. 如果失败,尝试你指定的格式 "2006-01-02 15:04:05" parsed, err = time.Parse("2006-01-02 15:04:05", t) if err == nil { return parsed } // 3. 如果两种格式都失败,记录错误 fmt.Printf("!!! 时间解析失败: %s (错误: %v)\n", t, err) return time.Time{} // 返回零值 } // 筛选Code=106的数据 var filteredData []VibrationStatData for _, data := range vibrationData { if data.Code == 106 { filteredData = append(filteredData, data) } } // 仅当有数据时进行统计 if len(filteredData) > 0 { fmt.Println(">>> 开始处理有效振动数据") // 按时间排序 sort.Slice(filteredData, func(i, j int) bool { return filteredData[i].Time < filteredData[j].Time }) // 1. 先统计所有点的出现次数 for _, data := range filteredData { level := calculateLevel(data.Value) if level >= 0 && level <= 7 { levelCounts[level]++ } } // 2. 计算非终点的持续时间 for i := 0; i < len(filteredData)-1; i++ { current := filteredData[i] next := filteredData[i+1] t1 := parseTime(current.Time) t2 := parseTime(next.Time) if t1.IsZero() || t2.IsZero() { continue } // 计算时间差 duration := t2.Sub(t1) durationSec := int(duration.Seconds()) if durationSec > 3600 { fmt.Printf(">>> 跳过过长间隔: %s -> %s (间隔: %d秒)\n", current.Time, next.Time, durationSec) continue } level := calculateLevel(current.Value) if level >= 0 && level <= 7 { // 对于Level1特别详细记录 levelDurations[level] += durationSec } } } else { fmt.Println(">>> 无有效数据可处理") } // 构建结果表格 (总是8行) fmt.Println(">>> 开始构建结果表格(8行)...") table := make([][]string, 8) for level := 0; level < 8; level++ { // 第一列:Level和出现次数 count := 0 if level <= 6 { count = levelCounts[level] } levelStr := fmt.Sprintf(" Level %d", level) col1 := fmt.Sprintf("%-8s %-6s", levelStr, fmt.Sprintf(" %d", count)) // 第二列:持续时间转换 totalSeconds := 0 if level <= 6 { totalSeconds = levelDurations[level] } totalMinutes := totalSeconds / 60 totalHours := totalMinutes / 60 // 固定宽度格式化:分钟(4位) + "min" + 小时(4位) + "h" col2 := fmt.Sprintf("%4dmin %3dh", totalMinutes, totalHours) // 第三列:特殊级别处理 col3 := "No Limit" //特殊处理占位符,要不然打印的pdf格式就乱掉了。 switch level { case 6: percentage := float64(totalSeconds) / (300 * 60) * 100 if percentage >= 100 { col3 = fmt.Sprintf("%3.0f%%", percentage) // 100% -> "100%" } else if percentage >= 10 { col3 = fmt.Sprintf(" %2.0f%%", percentage) // 10-99% -> " 50%" } else { col3 = fmt.Sprintf(" %1.0f%%", percentage) // 0-9% -> " 0%" } case 7: col3 = " 0%" // 3位宽度保持对齐 } table[level] = []string{col1, col2, col3} fmt.Printf(">>> 构建表格行[Level%d]: [%s, %s, %s]\n", level, col1, col2, col3) } fmt.Println("【振动数据表生成完成】") return table } // func generateVibrationTableData(vibrationData []VibrationStatData) [][]string { // // 初始化全零统计数组 (Level0-7) // levelCounts := make([]int, 8) // 出现次数 // levelDurations := make([]int, 8) // 持续时间(秒) // // 正确的时间解析函数 (RFC3339格式) // parseTime := func(t string) time.Time { // parsed, err := time.Parse(time.RFC3339, t) // if err != nil { // return time.Time{} // 返回零值 // } // return parsed // } // // 筛选Code=106的数据 // var filteredData []VibrationStatData // for _, data := range vibrationData { // if data.Code == 106 { // filteredData = append(filteredData, data) // } // } // fmt.Println("Generating vibration table data...", filteredData) // // 仅当有数据时进行统计 // if len(filteredData) > 0 { // // 按时间排序 // sort.Slice(filteredData, func(i, j int) bool { // return filteredData[i].Time < filteredData[j].Time // }) // // 1. 先统计所有点的出现次数 // for _, data := range filteredData { // level := calculateLevel(data.Value) // if level >= 0 && level <= 7 { // levelCounts[level]++ // } // } // // 2. 计算非终点的持续时间 // for i := 0; i < len(filteredData)-1; i++ { // current := filteredData[i] // next := filteredData[i+1] // t1 := parseTime(current.Time) // t2 := parseTime(next.Time) // if t1.IsZero() || t2.IsZero() { // continue // } // durationSec := int(t2.Sub(t1).Seconds()) // level := calculateLevel(current.Value) // if level >= 0 && level <= 7 { // levelDurations[level] += durationSec // } // } // } // // 构建结果表格 (总是8行) // table := make([][]string, 8) // for level := 0; level < 8; level++ { // // 第一列:Level和出现次数 // count := 0 // if level <= 6 { // 确保level7的计数为0 // count = levelCounts[level] // } // col1 := fmt.Sprintf("Level%d %d", level, count) // // 第二列:持续时间转换 // totalSeconds := 0 // if level <= 6 { // 确保level7的持续时间为0 // totalSeconds = levelDurations[level] // } // minutes := totalSeconds / 60 // hours := minutes / 60 // remainingMinutes := minutes % 60 // col2 := fmt.Sprintf("%dmin %dh", remainingMinutes, hours) // // 第三列:特殊级别处理 // col3 := "No Limit" // switch level { // case 6: // percentage := float64(totalSeconds) / (300 * 60) * 100 // col3 = fmt.Sprintf("%.0f%%", percentage) // case 7: // col3 = "0%" // 强制level7显示0% // } // table[level] = []string{col1, col2, col3} // } // return table // } // 修正后的Level计算逻辑 func calculateLevel(value float64) int { switch { case value < 40: return 0 case value < 60: return 1 case value < 80: return 2 case value < 100: return 3 case value < 120: return 4 case value < 150: return 5 case value >= 150: // Level6 return 6 default: // Level7 (特殊安全阈值) return 7 } } // ExtractTimeDepthRange 从振动数据中提取时间范围和深度范围 func ExtractTimeDepthRange(vibrationData []VibrationStatData) TimeDepthRange { if len(vibrationData) == 0 { return TimeDepthRange{ FromTime: " ", ToTime: " ", MinDepth: 0, MaxDepth: 0, } } // 初始化第一个数据点 // firstTime, _ := time.Parse(time.RFC3339, vibrationData[0].Time) firstTime, _ := parseTime(vibrationData[0].Time) minTime, maxTime := firstTime, firstTime minDepth, maxDepth := vibrationData[0].Deep, vibrationData[0].Deep // 遍历所有数据点 for _, data := range vibrationData { // 解析时间 // t, err := time.Parse(time.RFC3339, data.Time) fmt.Println("data.Time", data.Time) t, err := parseTime(data.Time) if err != nil { continue // 跳过格式错误的数据 } // 更新时间范围 if t.Before(minTime) { minTime = t } if t.After(maxTime) { maxTime = t } // 更新深度范围 minDepth = math.Min(minDepth, data.Deep) maxDepth = math.Max(maxDepth, data.Deep) } // 格式化输出时间 timeFormat := "2006-01-02 15:04:05" return TimeDepthRange{ FromTime: minTime.Format(timeFormat), ToTime: maxTime.Format(timeFormat), MinDepth: math.Round(minDepth*10) / 10, // 保留1位小数 MaxDepth: math.Round(maxDepth*10) / 10, } } func get_vibration_report_pdf(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_tool_warning_pdf recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_vibration_req json.Unmarshal(reqdata, &req) var resp get_cmr_pdf_resp var baseinfo get_vibration_resp var filename string fmt.Println("IsMemory------------------", req.IsMemory) vibrationData := leftOneData(req.Wellname, &req.IsMemory) fmt.Println("vibrationData------------", vibrationData) timeDepth := ExtractTimeDepthRange(vibrationData) fmt.Println("timeDepth------------", timeDepth) statsData104 := convertToStatsData(vibrationData, 104) //左侧第一个表格数据 statsData105 := convertToStatsData(vibrationData, 105) //左侧第二个表格数据 statsData106 := convertStickSlipData(vibrationData) //左侧第三个表格数据 tableDataOne := generateVibrationTable(vibrationData, 104) tableDataTwo := generateVibrationTable(vibrationData, 105) tableDataThree := generateVibrationTableData(vibrationData) baseinfo = get_vibration_baseinfo(req.Wellname, req.OpUser) filename = export_vibration_pdf(baseinfo, timeDepth, statsData104, statsData105, statsData106, tableDataOne, tableDataTwo, tableDataThree) resp.FileId = fmt.Sprintf(`%v.pdf`, filename) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_tool_warning_pdf recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func export_tool_warning_pdf_en(opuser string, baseinfo get_srr_base_resp, data []Tool_warning, lcm_Data []GetLcmRespData) (filename string) { ps_info := get_ps_info(opuser) //W: 595, H: 842 page_W := gopdf.PageSizeA4.W page_H := gopdf.PageSizeA4.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var one_cm float64 = page_W / float64(21) var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 //var h_span float64 = 150 page_H = page_H - margin_top page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4.W}, "Instrument Status Report", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4.W / 2}, fmt.Sprintf("Report Time%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4.W / 2) - margin_left}, fmt.Sprintf(`Report NO.:%s+B0001`, baseinfo.Wellname), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4.W-margin_left, margin_top+60) //cal total pagenum var cur_page int = 1 var total_page int = 1 var total_page_len float64 total_page_len += 60 total_page_len += (1 * span) if len(data) > 0 { for i := 0; i < len(data); i++ { v := data[i] var s string = "" if v.Flag == 0 { s = fmt.Sprintf(`%s`, strings.ReplaceAll(v.Context, ":", "")) fmt.Println("v.Context ------", v.Context) } else { s = fmt.Sprintf(`%s %s:%s`, v.Time, v.Err_level, v.Context) } context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { total_page_len += span } } } total_page_len += (1.5 * span) for i := 0; i < len(lcm_Data); i++ { v := lcm_Data[i] s := fmt.Sprintf(`maintenance frequency:%s maintenance level:%s maintenance personnel:%s maintenance content:%s maintenance time:%s`, v.Repair_cnt, v.Repair_level, v.Applicanter, v.Note, v.Time) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { total_page_len += span } } total_page_len += (1.5 * span) page_num := total_page_len / (page_H - margin_top) fmt.Println(page_num) total_page = int(math.Ceil(page_num)) fmt.Println(total_page) var base float64 = margin_top + 60 base += span pdf.SetXY(margin_left, base) if len(data) > 0 { pdf.Text(fmt.Sprintf(`Risk warning:`)) } else { pdf.Text(fmt.Sprintf(`The instruments in this well are working normally.`)) } for i := 0; i < len(data); i++ { v := data[i] var s string = "" if v.Flag == 0 { s = fmt.Sprintf(`%s`, strings.ReplaceAll(v.Context, ":", "")) fmt.Println("v.Context ------", v.Context) } else { s = fmt.Sprintf(`%s %s:%s`, v.Time, v.Err_level, v.Context) } context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + base - page_H pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } pdf.Text(fmt.Sprintf(`%s`, context[j])) } } base += (span / 2) if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + (base - page_H) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + base - page_H pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Maintenance records: `)) for i := 0; i < len(lcm_Data); i++ { v := lcm_Data[i] s := fmt.Sprintf(`maintenance frequency:%s maintenance level:%s maintenance personnel:%s maintenance content:%s maintenance time:%s`, v.Repair_cnt, v.Repair_level, v.Applicanter, v.Note, v.Time) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + base - page_H pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } pdf.Text(fmt.Sprintf(`%s`, context[j])) } } base += (span / 2) if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + (base - page_H) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + base - page_H pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Upload Account:%s`, baseinfo.Uploadname)) pdf.SetXY(page_W/2-(1*margin_left), base) pdf.Text(fmt.Sprintf(`Print Account:%s`, opuser)) pdf.SetXY(page_W-(2*margin_left), base) pdf.Text(fmt.Sprintf(`V1.0.0`)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) //save beginTime := time.Now().UnixNano() pdf.WritePdf(fmt.Sprintf(`./authfile/%v.pdf`, beginTime)) filename = strconv.FormatInt(beginTime, 10) return } func get_tool_lcm_from_well(opuser string, wellname string) (data []GetLcmRespData) { ps_info := get_ps_info(opuser) var tool []tool_data sel_sql := fmt.Sprintf(`SELECT distinct [series],[instrument_id] FROM [analysis_result_mss] where [wellname]='%s' `, wellname) rows, err := sqlConn.Query(sel_sql) if err == nil { for rows.Next() { var v tool_data if err = rows.Scan(&v.Series, &v.InstrumentID); err == nil { tool = append(tool, v) } } rows.Close() } fmt.Println("10", tool) for i := 0; i < len(tool); i++ { selSql := fmt.Sprintf("select [repair_cnt],[repair_level],[repair_context],[time],[user] from [life_cycle_manager] where [sid]='%s' and [iid]='%s' order by time desc", tool[i].Series, tool[i].InstrumentID) rows, err := sqlConn.Query(selSql) if err == nil { for rows.Next() { var d GetLcmRespData if err = rows.Scan(&d.Repair_cnt, &d.Repair_level, &d.Note, &d.Time, &d.Applicanter); err != nil { logs.Error("getLcm scan Error", err.Error()) } else { if len(d.Time) >= 19 { d.Time = d.Time[:10] + " " + d.Time[11:19] d.Time = do_time_by_ps(d.Time, ps_info) } timeLayout := "2006-01-02 15:04:05" loc, _ := time.LoadLocation("Local") opTime, _ := time.ParseInLocation(timeLayout, d.Time, loc) if time.Since(opTime).Hours() < 12 { d.IfShowOp = true } else { d.IfShowOp = false } data = append(data, d) } } rows.Close() } } return } func export_tool_warning_pdf(opuser string, baseinfo get_srr_base_resp, data []Tool_warning, lcm_Data []GetLcmRespData) (filename string) { ps_info := get_ps_info(opuser) //W: 595, H: 842 page_W := gopdf.PageSizeA4.W page_H := gopdf.PageSizeA4.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var one_cm float64 = page_W / float64(21) var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 //var h_span float64 = 150 page_H = page_H - margin_top page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4.W}, "仪器状态报告", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4.W / 2}, fmt.Sprintf("报告时间:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4.W / 2) - margin_left}, fmt.Sprintf(`报告编号:%s+B0001`, baseinfo.Wellname), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4.W-margin_left, margin_top+60) //cal total pagenum var cur_page int = 1 var total_page int = 1 var total_page_len float64 total_page_len += 60 total_page_len += (1 * span) if len(data) > 0 { for i := 0; i < len(data); i++ { v := data[i] var s string = "" fmt.Println("v.Flag ------", v.Flag) if v.Flag == 0 { s = fmt.Sprintf(`%s`, strings.ReplaceAll(v.Context, ":", "")) fmt.Println("v.Context ------", v.Context) } else { s = fmt.Sprintf(`%s %s:%s`, v.Time, v.Err_level, v.Context) } fmt.Println("v.Context22222 ------", s) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { total_page_len += span } } } total_page_len += (1.5 * span) for i := 0; i < len(lcm_Data); i++ { v := lcm_Data[i] s := fmt.Sprintf(`维保次数:%s 维保等级:%s 维保人:%s 维保内容:%s 维保时间:%s`, v.Repair_cnt, v.Repair_level, v.Applicanter, v.Note, v.Time) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { total_page_len += span } } total_page_len += (1.5 * span) page_num := total_page_len / (page_H - margin_top) fmt.Println(page_num) total_page = int(math.Ceil(page_num)) fmt.Println(total_page) var base float64 = margin_top + 60 base += span pdf.SetXY(margin_left, base) if len(data) > 0 { pdf.Text(fmt.Sprintf(`风险预警:`)) } else { pdf.Text(fmt.Sprintf(`本口井未上传仪器。`)) } for i := 0; i < len(data); i++ { v := data[i] var s string = "" if v.Flag == 0 { s = fmt.Sprintf(`%s`, strings.ReplaceAll(v.Context, ":", "")) fmt.Println("v.Context ------", v.Context) } else { s = fmt.Sprintf(`%s %s:%s`, v.Time, v.Err_level, v.Context) } context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + base - page_H pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } pdf.Text(fmt.Sprintf(`%s`, context[j])) } } base += (span / 2) if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + (base - page_H) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + base - page_H pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`维保记录:`)) for i := 0; i < len(lcm_Data); i++ { v := lcm_Data[i] s := fmt.Sprintf(`维保次数:%s 维保等级:%s 维保人:%s 维保内容:%s 维保时间:%s`, v.Repair_cnt, v.Repair_level, v.Applicanter, v.Note, v.Time) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + base - page_H pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } pdf.Text(fmt.Sprintf(`%s`, context[j])) } } base += (span / 2) if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + (base - page_H) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top + base - page_H pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`上传账号:%s`, baseinfo.Uploadname)) pdf.SetXY(page_W/2-(1*margin_left), base) pdf.Text(fmt.Sprintf(`打印账号:%s`, opuser)) pdf.SetXY(page_W-(2*margin_left), base) pdf.Text(fmt.Sprintf(`V1.0.0`)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) //save beginTime := time.Now().UnixNano() pdf.WritePdf(fmt.Sprintf(`./authfile/%v.pdf`, beginTime)) filename = strconv.FormatInt(beginTime, 10) return } func get_tool_warning_info(user string, wellname string) (resp []Tool_warning) { logs.Info("get_tool_warning_infof方法--------------------------------", user) ps_info := get_ps_info(user) var db string wellSql := fmt.Sprintf(`SELECT WELLName from WellInformation where WELLNameSource = '%s'`, wellname) wellRow := sqlConn.QueryRow(wellSql) wellRow.Scan(&db) fmt.Println("db----------", db) // 1. 检查即将打开的db库是否在线 needOffline := false masterConn, err := getOdbcConn("master") if err != nil { logs.Info("连接master库失败", err.Error()) fmt.Println("连接master库失败", err.Error()) } else { defer masterConn.Close() // 查询数据库状态 checkSql := fmt.Sprintf("SELECT state_desc FROM sys.databases WHERE name = '%s'", db) var status string err = masterConn.QueryRow(checkSql).Scan(&status) if err != nil { fmt.Println("查询数据库状态失败:", err.Error()) logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) logs.Info("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) onlineSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) _, err = masterConn.Exec(onlineSql) if err != nil { fmt.Println("设置在线失败:", err.Error()) logs.Info("设置在线失败:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为在线\n", db) logs.Info("数据库 %s 已设置为在线\n", db) needOffline = true // 标记最后需要离线 } } else { fmt.Printf("数据库 %s 已在线,不需要操作\n", db) logs.Info("数据库 %s 已在线,不需要操作\n", db) needOffline = false // 不需要离线 } } } // 2. 连接目标数据库进行查询 conn, err := getOdbcConn(db) if err != nil { logs.Info("Connecting Error", err.Error()) return } defer conn.Close() sel_sql := fmt.Sprintf(`select DISTINCT [2327], [2328] from REPAIRANDMENT where [2327] IS NOT NULL`) rows, err := conn.Query(sel_sql) if err != nil { fmt.Println("仪器组合查询错误:", err.Error()) logs.Info("仪器组合查询错误:", err.Error()) return } defer rows.Close() // 获取仪器组合列表 type ToolPair struct { Series string Instrument string } var toolPairs []ToolPair for rows.Next() { var ( seriesPtr sql.NullString instrumentPtr sql.NullString ) err = rows.Scan(&seriesPtr, &instrumentPtr) if err != nil { fmt.Println("仪器组合行扫描错误:", err.Error()) logs.Info("仪器组合行扫描错误:", err.Error()) continue } toolPairs = append(toolPairs, ToolPair{ Series: seriesPtr.String, Instrument: instrumentPtr.String, }) } if err = rows.Err(); err != nil { fmt.Println("仪器组合遍历错误:", err.Error()) logs.Info("仪器组合遍历错误:", err.Error()) } // 3. 第二个查询:获取警告信息 warningSql := fmt.Sprintf(`SELECT [time], [err_level], [context] FROM [analysis_tool_warning] WHERE [wellname] = '%s' ORDER BY [time] DESC`, wellname) warningRows, err := sqlConn.Query(warningSql) if err != nil { fmt.Println("警告信息查询错误:", err.Error()) logs.Info("警告信息查询错误:", err.Error()) return } defer warningRows.Close() // 存储所有警告记录 var warnings []Tool_warning for warningRows.Next() { var w Tool_warning var ( timePtr sql.NullString errLevelPtr sql.NullString contextPtr sql.NullString ) err = warningRows.Scan(&timePtr, &errLevelPtr, &contextPtr) if err != nil { fmt.Println("警告信息行扫描错误:", err.Error()) logs.Info("警告信息行扫描错误:", err.Error()) continue } w.Time = timePtr.String w.Err_level = errLevelPtr.String w.Context = contextPtr.String warnings = append(warnings, w) fmt.Println("warnings------", warnings) } if err = warningRows.Err(); err != nil { fmt.Println("警告信息遍历错误:", err.Error()) logs.Info("警告信息遍历错误:", err.Error()) } fmt.Println("toolPairs----", toolPairs) // 处理结果:检查每个仪器组合是否出现在警告记录中 var data []Tool_warning for _, pair := range toolPairs { v := Tool_warning{ Series: pair.Series, Instrument: pair.Instrument, Flag: 0, // 默认flag=0 Context: pair.Series + " " + pair.Instrument + " 正常", } // 构建要查找的字符串格式:系列号 + 空格 + 仪器号 searchStr := pair.Series + " " + pair.Instrument // 在警告记录中查找匹配的context for _, warn := range warnings { if strings.Contains(warn.Context, searchStr) { // 找到匹配项,使用警告记录的信息 v.Time = warn.Time v.Err_level = warn.Err_level v.Context = warn.Context v.Flag = 1 // 设置flag=1 // 处理时间格式 if len(v.Time) >= 19 { originalTime := v.Time v.Time = v.Time[:10] + " " + v.Time[11:19] fmt.Printf("格式化时间: %s -> %s\n", originalTime, v.Time) convertedTime := do_time_by_ps(v.Time, ps_info) fmt.Printf("转换时间: %s -> %s\n", v.Time, convertedTime) v.Time = convertedTime } else { fmt.Printf("时间格式异常,长度不足19: %s\n", v.Time) } fmt.Println("ps_info.R1----------", ps_info.R1) // 压力单位转换 if ps_info.R1 == "2" { if strings.Contains(v.Context, "MPa") { fmt.Printf("压力单位转换(MPa->psi): %s\n", v.Context) bid := strings.Index(v.Context, "=") eid := strings.Index(v.Context, "(") if bid != -1 && eid != -1 && bid < eid { valueStr := v.Context[bid+1 : eid] f, err := strconv.ParseFloat(valueStr, 64) if err == nil { originalValue := f f = 145.038 * f f, _ = decimal.NewFromFloat(f).Round(2).Float64() newContext := v.Context[:bid+1] + fmt.Sprintf("%.02f", f) + v.Context[eid:] fmt.Printf("压力值转换: %.2f MPa -> %.2f psi\n", originalValue, f) v.Context = strings.ReplaceAll(newContext, "MPa", "psi") } else { fmt.Printf("解析压力值失败: %s\n", valueStr) } } else { fmt.Println("在内容中未找到有效的压力值位置") } } } // 温度单位转换 if ps_info.R2 == "2" { if strings.Contains(v.Context, "℃") { logs.Info(fmt.Sprintf("温度单位转换(℃->℉): %s", v.Context)) bid := strings.Index(v.Context, "=") eid := strings.Index(v.Context, "(") if bid != -1 && eid != -1 && bid < eid { valueStr := v.Context[bid+1 : eid] f, err := strconv.ParseFloat(valueStr, 64) if err == nil { originalValue := f f = 1.8*f + 32 f, _ = decimal.NewFromFloat(f).Round(2).Float64() newContext := v.Context[:bid+1] + fmt.Sprintf("%.02f", f) + v.Context[eid:] fmt.Printf("温度值转换: %.2f ℃ -> %.2f ℉\n", originalValue, f) v.Context = strings.ReplaceAll(newContext, "℃", "℉") } else { fmt.Printf("解析温度值失败: %s\n", valueStr) } } else { fmt.Println("在内容中未找到有效的温度值位置") } } } // 找到匹配后跳出循环 break } } data = append(data, v) } // 4. 如果需要,最后设置数据库离线 if needOffline { fmt.Println("连接master库设置数据库离线------") masterConn2, err := getOdbcConn("master") if err != nil { logs.Info("连接master库失败", err.Error()) fmt.Println("连接master库失败", err.Error()) } else { defer masterConn2.Close() fmt.Printf("准备将数据库 %s 设置为离线\n", db) logs.Info("准备将数据库 %s 设置为离线\n", db) cmdSql := fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE WITH ROLLBACK IMMEDIATE", db) _, err = masterConn2.Exec(cmdSql) if err != nil { fmt.Println("SET OFFLINE command execution error:", err.Error()) logs.Info("SET OFFLINE command execution error:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为离线\n", db) logs.Info("数据库 %s 已设置为离线\n", db) } } } if len(data) > 0 { resp = data fmt.Printf("成功返回 %d 条警告信息\n", len(data)) logs.Info("成功返回 %d 条警告信息\n", len(data)) } else { logs.Info("未查询到任何仪器组合") resp = []Tool_warning{} } return } func get_tool_info(wellname string) (resp []devToolata) { fmt.Println("get_tool_info--------------------------------") // 解析井名,支持 JSON 数组,兼容单个字符串 var wellNames []string if err := json.Unmarshal([]byte(wellname), &wellNames); err != nil { wellNames = []string{wellname} } if len(wellNames) == 0 { return []devToolata{} } // 构建井名 IN 条件(转义单引号防注入) var safeNames []string for _, name := range wellNames { safe := strings.ReplaceAll(name, "'", "''") safeNames = append(safeNames, "'"+safe+"'") } nameList := strings.Join(safeNames, ", ") // 总库一次性查询(使用 base_data 作为主表) // ORDER BY 井名升序,入井时间降序 detailSql := fmt.Sprintf(` SELECT b.product_name, r.[2327] AS series, r.[2328] AS instrument, r.[2321] AS 井名, w.入井时间, w.出井时间, w.上井人员, r.[2331] AS 累计工作时间, r.[2340] AS 本次工作时间, w.服务类型, CONCAT(e.所在地, CASE WHEN e.所在地 IS NOT NULL AND e.所在地 != '' AND e.其他字段 IS NOT NULL AND e.其他字段 != '' THEN ' ' ELSE '' END, e.其他字段) AS 所在地 FROM base_data b LEFT JOIN ( SELECT [2321], [2327], [2328], [2331], [2340], ROW_NUMBER() OVER (PARTITION BY [2327], [2328] ORDER BY [2323] DESC) AS rn FROM REPAIRANDMENT WHERE [2327] IS NOT NULL AND [2331] IS NOT NULL AND [2331] != '' AND [2340] IS NOT NULL AND [2340] != '' AND [2321] IN (%s) ) r ON b.series = r.[2327] AND b.instrument = r.[2328] AND r.rn = 1 LEFT JOIN ( SELECT [6841] AS 井名, [6844] AS 服务类型, [6845] AS 上井人员, [6848] AS 入井时间, [6849] AS 出井时间, ROW_NUMBER() OVER (PARTITION BY [6841] ORDER BY [6848] DESC) AS rn_w FROM WORKHOURS WHERE [6841] IN (%s) ) w ON r.[2321] = w.井名 AND w.rn_w = 1 LEFT JOIN ( SELECT [6800] AS 井名, [6803] AS 系列号, [6804] AS 编号, [6812] AS 所在地, [6813] AS 其他字段, ROW_NUMBER() OVER (PARTITION BY [6800], [6803], [6804] ORDER BY CASE WHEN [6812] IS NOT NULL AND [6812] != '' THEN 0 ELSE 1 END) AS rn_e FROM EQUIPMENTASSETS WHERE [6800] IN (%s) ) e ON r.[2321] = e.井名 AND b.series = e.系列号 AND b.instrument = e.编号 AND e.rn_e = 1 WHERE r.[2321] IS NOT NULL ORDER BY 井名 ASC, w.入井时间 DESC `, nameList, nameList, nameList) fmt.Println("========= 总库查询SQL =========") fmt.Println(detailSql) fmt.Println("================================") rows, err := sqlConn.Query(detailSql) if err != nil { fmt.Println("总库查询失败:", err.Error()) return []devToolata{} } defer rows.Close() toolSet := make(map[string]*devToolata) // 用于去重,保留最新入井时间 for rows.Next() { var ( productName sql.NullString series, instrument, wellname sql.NullString inTime, outTime, engineer sql.NullString totalWork, currentWork, serviceType sql.NullString location sql.NullString ) err := rows.Scan( &productName, &series, &instrument, &wellname, &inTime, &outTime, &engineer, &totalWork, ¤tWork, &serviceType, &location, ) if err != nil { logs.Info("行扫描失败:", err.Error()) continue } key := series.String + "|" + instrument.String if existing, ok := toolSet[key]; ok { // 已存在,保留入井时间更晚的记录(字符串比较,要求时间格式可字典序) if inTime.Valid && (existing.InTime == "" || existing.InTime < inTime.String) { existing.ProductName = productName.String existing.WellName = wellname.String existing.InTime = inTime.String existing.OutTime = outTime.String existing.Engineer = engineer.String existing.TotalWorkTime = totalWork.String existing.CurrentWorkTime = currentWork.String existing.ServiceType = serviceType.String existing.Location = location.String } } else { tool := &devToolata{ Series: series.String, Instrument: instrument.String, ProductName: productName.String, WellName: wellname.String, Location: location.String, InTime: inTime.String, OutTime: outTime.String, Engineer: engineer.String, TotalWorkTime: totalWork.String, CurrentWorkTime: currentWork.String, ServiceType: serviceType.String, } toolSet[key] = tool } } if err = rows.Err(); err != nil { fmt.Println("遍历结果集出错:", err.Error()) } // 转为切片 for _, v := range toolSet { resp = append(resp, *v) } // 排序:井名升序,入井时间降序(string 直接比较) sort.Slice(resp, func(i, j int) bool { if resp[i].WellName != resp[j].WellName { return resp[i].WellName < resp[j].WellName } // 井名相同,按入井时间降序(最新的在前) // 空字符串视为最小值,排在最后 if resp[i].InTime == resp[j].InTime { return false } if resp[i].InTime == "" { return false } if resp[j].InTime == "" { return true } return resp[i].InTime > resp[j].InTime }) if resp == nil { resp = []devToolata{} } // 打印最终返回信息 jsonBytes, err := json.MarshalIndent(resp, "", " ") if err != nil { fmt.Printf("JSON序列化失败,直接打印: %+v\n", resp) } else { fmt.Println("最终返回信息:") fmt.Println(string(jsonBytes)) } return } func splitEngineers(engineerStr string) []string { if engineerStr == "" { return []string{} } // 统一替换为英文逗号 replacer := strings.NewReplacer( ",", ",", "、", ",", " ", ",", ";", ",", ";", ",", "|", ",", "/", ",", " ", ",", // 多个空格 ) normalized := replacer.Replace(engineerStr) parts := strings.Split(normalized, ",") result := make([]string, 0, len(parts)) for _, p := range parts { trimmed := strings.TrimSpace(p) if trimmed != "" { result = append(result, trimmed) } } return result } func get_tool_info_test(wellname []string) (resp []devToolata) { // 1. 判断 wellname 是否为空 if len(wellname) == 0 { fmt.Println("警告:wellname 数组为空") logs.Info("警告:wellname 数组为空") return resp } // 2. 构建 SQL 查询 var sql string if len(wellname) == 1 { sql = fmt.Sprintf(` SELECT TOP 1 [2327], [2328], [2321], [2331], [2340] FROM REPAIRANDMENT WHERE [2321] = '%s' AND [2327] IS NOT NULL AND [2328] IS NOT NULL AND [2331] IS NOT NULL AND [2340] IS NOT NULL ORDER BY [2323] DESC `, wellname[0]) } else { // 多个井名 - 子查询 + UNION ALL for i, name := range wellname { if i > 0 { sql += " UNION ALL " } sql += fmt.Sprintf(` SELECT * FROM ( SELECT TOP 1 [2327], [2328], [2321], [2331], [2340] FROM REPAIRANDMENT WHERE [2321] = '%s' AND [2327] IS NOT NULL AND [2328] IS NOT NULL AND [2331] IS NOT NULL AND [2340] IS NOT NULL ORDER BY [2323] DESC ) AS T%d`, name, i+1) } } fmt.Println("执行的 SQL:", sql) rows, err := sqlConn.Query(sql) if err != nil { fmt.Println("仪器组合查询错误:", err.Error()) logs.Info("仪器组合查询错误:", err.Error()) return } defer rows.Close() // 3. 处理每条仪器组合记录 for rows.Next() { var ( series string instrument string wellName string totalWorkTime string currentWorkTime string ) err = rows.Scan(&series, &instrument, &wellName, &totalWorkTime, ¤tWorkTime) if err != nil { fmt.Println("仪器组合行扫描错误:", err.Error()) logs.Info("仪器组合行扫描错误:", err.Error()) continue } if series == "" || instrument == "" || wellName == "" { fmt.Println("跳过包含空值的记录") continue } // 获取仪器名称 productName := getProductNameBySeries(series) // 获取所在地 location := getLocationByWellName(wellName) // 获取该井的所有工时记录(可能多条) workHoursList := getWorkHoursInfoList(wellName) if len(workHoursList) == 0 { // 没有工时记录,生成一条占位记录(所有字段为空) workHoursList = []WorkHoursRecord{{InTime: "", OutTime: "", Engineer: "", ServiceType: ""}} } // 对每条工时记录,分别生成输出(并拆分工程师) for _, wh := range workHoursList { // 拆分工程师字段(支持中英文分隔符) engineers := splitEngineers(wh.Engineer) // 基础数据(不含工程师字段,方便复用) baseTool := devToolata{ WellName: wellName, Instrument: instrument, ProductName: productName, Series: series, InTime: formatDateTime(wh.InTime), OutTime: formatDateTime(wh.OutTime), CurrentWorkTime: currentWorkTime, TotalWorkTime: totalWorkTime, Location: location, ServiceType: wh.ServiceType, Engineer: "", // 临时为空 } if len(engineers) == 0 { // 没有工程师,直接添加一条空工程师记录 baseTool.Engineer = "" resp = append(resp, baseTool) } else { // 每个工程师生成一条独立记录 for _, eng := range engineers { newTool := baseTool newTool.Engineer = eng resp = append(resp, newTool) } } } } if err = rows.Err(); err != nil { fmt.Println("仪器组合遍历错误:", err.Error()) logs.Info("仪器组合遍历错误:", err.Error()) } fmt.Printf("共查询到仪器组合记录(拆分后共 %d 条)\n", len(resp)) return resp } // 根据 Series 查询 product_name func getProductNameBySeries(series string) string { if series == "" { return "" } query := fmt.Sprintf(`SELECT product_name FROM base_data WHERE series = '%s'`, series) var productName string err := sqlConn.QueryRow(query).Scan(&productName) if err != nil { if err == sql.ErrNoRows { fmt.Printf("未找到 series=%s 对应的产品名称\n", series) } else { fmt.Printf("查询产品名称失败, series=%s, error=%s\n", series, err.Error()) logs.Info(fmt.Sprintf("查询产品名称失败, series=%s, error=%s", series, err.Error())) } return "" } return productName } // 从 WORKHOURS 表查询信息 func getWorkHoursInfoList(wellName string) []WorkHoursRecord { if wellName == "" { return nil } // 使用参数化查询防止 SQL 注入 query := ` SELECT [6848], [6849], [6845], [6844] FROM ( SELECT DISTINCT [6841], [6848], [6849], [6845], [6844] FROM WORKHOURS WHERE [6841] = @p1 AND [6848] IS NOT NULL AND [6849] IS NOT NULL AND [6845] IS NOT NULL AND [6844] IS NOT NULL ) AS t ORDER BY [6841] DESC, [6848] DESC, [6845], [6849], [6844] DESC ` rows, err := sqlConn.Query(query, wellName) // 参数化查询 if err != nil { fmt.Printf("查询 WORKHOURS 表错误, wellName=%s, error=%s\n", wellName, err.Error()) logs.Info(fmt.Sprintf("查询 WORKHOURS 表错误, wellName=%s, error=%s", wellName, err.Error())) return nil } defer rows.Close() var records []WorkHoursRecord for rows.Next() { var inTime, outTime, engineer, serviceType string if err := rows.Scan(&inTime, &outTime, &engineer, &serviceType); err != nil { fmt.Println("扫描 WORKHOURS 记录错误:", err.Error()) continue } records = append(records, WorkHoursRecord{ InTime: inTime, OutTime: outTime, Engineer: engineer, ServiceType: serviceType, }) } return records } // 从 EQUIPMENTASSETS 表查询 Location func getLocationByWellName(wellName string) string { if wellName == "" { return "" } query := fmt.Sprintf(` SELECT TOP 1 [6811] FROM EQUIPMENTASSETS WHERE [6800] = '%s' AND [6811] IS NOT NULL `, wellName) fmt.Printf("查询 EQUIPMENTASSETS 表 SQL: %s\n", query) var location string err := sqlConn.QueryRow(query).Scan(&location) if err != nil { if err == sql.ErrNoRows { fmt.Printf("未找到井名 %s 的 EQUIPMENTASSETS 记录\n", wellName) } else { fmt.Printf("查询 EQUIPMENTASSETS 表错误, wellName=%s, error=%s\n", wellName, err.Error()) logs.Info(fmt.Sprintf("查询 EQUIPMENTASSETS 表错误, wellName=%s, error=%s", wellName, err.Error())) } return "" } return location } func get_tool_warning_info_en(user string, wellname string) (resp []Tool_warning) { ps_info := get_ps_info(user) var db string wellSql := fmt.Sprintf(`SELECT WELLName from WellInformation where WELLNameSource = '%s'`, wellname) wellRow := sqlConn.QueryRow(wellSql) wellRow.Scan(&db) fmt.Println("db----------", db) // 1. 检查数据库状态 needOffline := false masterConn, err := getOdbcConn("master") if err != nil { logs.Info("链接master库失败", err.Error()) fmt.Println("链接master库失败", err.Error()) } else { defer masterConn.Close() // 查询数据库状态 checkSql := fmt.Sprintf("SELECT state_desc FROM sys.databases WHERE name = '%s'", db) var status string err = masterConn.QueryRow(checkSql).Scan(&status) if err != nil { fmt.Println("查询数据库状态失败:", err.Error()) logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) onlineSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) _, err = masterConn.Exec(onlineSql) if err != nil { fmt.Println("设置在线失败:", err.Error()) logs.Info("设置在线失败:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为在线\n", db) needOffline = true } } else { fmt.Printf("数据库 %s 已在线,不需要操作\n", db) needOffline = false } } } // 2. 连接目标数据库进行查询 conn, err := getOdbcConn(db) if err != nil { logs.Info("Connecting Error", err.Error()) } defer conn.Close() sel_sql := fmt.Sprintf(`select DISTINCT [2327], [2328] from REPAIRANDMENT where [2327] IS NOT NULL`) rows, err := conn.Query(sel_sql) if err != nil { fmt.Println("仪器组合查询错误:", err.Error()) logs.Info("仪器组合查询错误:", err.Error()) return } defer rows.Close() // 获取仪器组合列表 type ToolPair struct { Series string Instrument string } var toolPairs []ToolPair for rows.Next() { var ( seriesPtr sql.NullString instrumentPtr sql.NullString ) err = rows.Scan(&seriesPtr, &instrumentPtr) if err != nil { fmt.Println("仪器组合行扫描错误:", err.Error()) logs.Info("仪器组合行扫描错误:", err.Error()) continue } toolPairs = append(toolPairs, ToolPair{ Series: seriesPtr.String, Instrument: instrumentPtr.String, }) } if err = rows.Err(); err != nil { fmt.Println("仪器组合遍历错误:", err.Error()) logs.Info("仪器组合遍历错误:", err.Error()) } // 第二个查询:获取警告信息 warningSql := fmt.Sprintf(`SELECT [time], [err_level], [context_en] FROM [analysis_tool_warning] WHERE [wellname] = '%s' ORDER BY [time] DESC`, wellname) fmt.Println("第二个查询:获取警告信息warningSql:-----------------", warningSql) logs.Info("第二个查询:获取警告信息warningSql:-----------------", warningSql) warningRows, err := sqlConn.Query(warningSql) if err != nil { fmt.Println("警告信息查询错误:", err.Error()) logs.Info("警告信息查询错误:", err.Error()) return } defer warningRows.Close() fmt.Println("警告信息:-----------------", warningRows) logs.Info("警告信息:-----------------", warningRows) // 存储所有警告记录 var warnings []Tool_warning for warningRows.Next() { var w Tool_warning var ( timePtr sql.NullString errLevelPtr sql.NullString contextPtr sql.NullString ) err = warningRows.Scan(&timePtr, &errLevelPtr, &contextPtr) if err != nil { fmt.Println("警告信息行扫描错误:", err.Error()) logs.Info("警告信息行扫描错误:", err.Error()) continue } w.Time = timePtr.String w.Err_level = errLevelPtr.String w.Context = contextPtr.String warnings = append(warnings, w) } fmt.Println("warnings----------------------:", warnings) if err = warningRows.Err(); err != nil { fmt.Println("警告信息遍历错误:", err.Error()) logs.Info("警告信息遍历错误:", err.Error()) } // 处理结果:检查每个仪器组合是否出现在警告记录中 var data []Tool_warning for _, pair := range toolPairs { v := Tool_warning{ Series: pair.Series, Instrument: pair.Instrument, Flag: 0, // 默认flag=0 Context: pair.Series + " " + pair.Instrument + " Normal", } // 构建要查找的字符串格式:系列号 + 空格 + 仪器号 searchStr := pair.Series + " " + pair.Instrument // 在警告记录中查找匹配的context for _, warn := range warnings { if strings.Contains(warn.Context, searchStr) { // 找到匹配项,使用警告记录的信息 v.Time = warn.Time v.Err_level = warn.Err_level v.Context = warn.Context v.Flag = 1 // 设置flag=1 // 处理时间格式 if len(v.Time) >= 19 { originalTime := v.Time v.Time = v.Time[:10] + " " + v.Time[11:19] fmt.Printf("格式化时间: %s -> %s\n", originalTime, v.Time) convertedTime := do_time_by_ps(v.Time, ps_info) fmt.Printf("转换时间: %s -> %s\n", v.Time, convertedTime) v.Time = convertedTime } else { fmt.Printf("时间格式异常,长度不足19: %s\n", v.Time) } // 压力单位转换 if ps_info.R1 == "2" { if strings.Contains(v.Context, "MPa") { fmt.Printf("压力单位转换(MPa->psi): %s\n", v.Context) bid := strings.Index(v.Context, "=") eid := strings.Index(v.Context, "(") if bid != -1 && eid != -1 && bid < eid { valueStr := v.Context[bid+1 : eid] f, err := strconv.ParseFloat(valueStr, 64) if err == nil { originalValue := f f = 145.038 * f f, _ = decimal.NewFromFloat(f).Round(2).Float64() newContext := v.Context[:bid+1] + fmt.Sprintf("%.02f", f) + v.Context[eid:] fmt.Printf("压力值转换: %.2f MPa -> %.2f psi\n", originalValue, f) v.Context = strings.ReplaceAll(newContext, "MPa", "psi") } else { fmt.Printf("解析压力值失败: %s\n", valueStr) } } else { fmt.Println("在内容中未找到有效的压力值位置") } } } // 温度单位转换 if ps_info.R2 == "2" { if strings.Contains(v.Context, "℃") { logs.Info(fmt.Sprintf("温度单位转换(℃->℉): %s", v.Context)) bid := strings.Index(v.Context, "=") eid := strings.Index(v.Context, "(") if bid != -1 && eid != -1 && bid < eid { valueStr := v.Context[bid+1 : eid] f, err := strconv.ParseFloat(valueStr, 64) if err == nil { originalValue := f f = 1.8*f + 32 f, _ = decimal.NewFromFloat(f).Round(2).Float64() newContext := v.Context[:bid+1] + fmt.Sprintf("%.02f", f) + v.Context[eid:] fmt.Printf("温度值转换: %.2f ℃ -> %.2f ℉\n", originalValue, f) v.Context = strings.ReplaceAll(newContext, "℃", "℉") } else { fmt.Printf("解析温度值失败: %s\n", valueStr) } } else { fmt.Println("在内容中未找到有效的温度值位置") } } } // 找到匹配后跳出循环 break } } data = append(data, v) } // 3. 如果需要,最后设置数据库离线 if needOffline { masterConn2, err := getOdbcConn("master") if err != nil { logs.Info("连接master库失败", err.Error()) fmt.Println("连接master库失败", err.Error()) } else { defer masterConn2.Close() cmdSql := fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE WITH ROLLBACK IMMEDIATE", db) _, err = masterConn2.Exec(cmdSql) if err != nil { logs.Error("SET OFFLINE command execution error:", err.Error()) } } } logs.Info("总共处理 %d 条仪器组合\n", len(data)) if len(data) > 0 { resp = data fmt.Printf("成功返回 %d 条警告信息\n", len(data)) logs.Info("成功返回 %d 条警告信息\n", len(data)) } else { logs.Info("未查询到任何仪器组合") resp = []Tool_warning{} } return } func get_tool_warning_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_tool_warning_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_tool_warning_req json.Unmarshal(reqdata, &req) var resp get_tool_warning_resp resp.Data = get_tool_warning_info_en(req.OpUser, req.Wellname) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_tool_warning_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_tool_warning(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_tool_warning recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_tool_warning_req json.Unmarshal(reqdata, &req) var resp get_tool_warning_resp resp.Data = get_tool_warning_info(req.OpUser, req.Wellname) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_tool_warning recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_srr_pdf(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_srr_pdf recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_cmr_pdf_req json.Unmarshal(reqdata, &req) var resp get_cmr_pdf_resp var baseinfo get_srr_base_resp var state []Srr_state var events []Srr_event var filename string baseinfo = get_srr_baseinfo(req.Wellname) state = get_srr_state_info(req.OpUser, req.Wellname) events = get_srr_event_info(req.OpUser, req.Wellname) filename = export_srr_pdf(req.OpUser, req.Flag, baseinfo, state, events) fmt.Println("filename", filename) resp.FileId = fmt.Sprintf(`%v.pdf`, filename) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_srr_pdf recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_srr_pdf_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_srr_pdf_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_cmr_pdf_req json.Unmarshal(reqdata, &req) var resp get_cmr_pdf_resp var baseinfo get_srr_base_resp var state []Srr_state var events []Srr_event var filename string baseinfo = get_srr_baseinfo(req.Wellname) state = get_srr_state_info(req.OpUser, req.Wellname) events = get_srr_event_info_en(req.OpUser, req.Wellname) filename = export_srr_pdf_en(req.OpUser, req.Flag, baseinfo, state, events) resp.FileId = fmt.Sprintf(`%v.pdf`, filename) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_srr_pdf_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_srr_pdf_page_cnt_en(opuser string, baseinfo get_srr_base_resp, state []Srr_state, event []Srr_event) (page_cnt int) { ps_info := get_ps_info(opuser) //cal total pagenum var cur_page int = 1 var total_page int = 1 //total_page = get_srr_pdf_page_cnt_en(opuser, baseinfo, state, event) //fmt.Println("现场人员记录报告:", total_page) //W: 595, H: 842 page_W := gopdf.PageSizeA4.W page_H := gopdf.PageSizeA4.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var one_cm float64 = page_W / float64(21) var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 var h_span float64 = 150 page_H = page_H - margin_top page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4.W}, "On Site Personnel Record Report", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4.W / 2}, fmt.Sprintf("Report Time:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4.W / 2) - margin_left}, fmt.Sprintf(`Report NO.:%s+C0001`, baseinfo.Wellname), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4.W-margin_left, margin_top+60) var base float64 = margin_top + 60 base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Well name:%s`, baseinfo.Wellname)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Upload user:%s`, baseinfo.Uploadname)) base += (span / 2) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Construction personnel filling in information:`)) if len(state) > 0 { base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+535, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+370, base, margin_left+370, base+span) pdf.Line(margin_left+470, base, margin_left+470, base+span) pdf.Line(margin_left+535, base, margin_left+535, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Start Time", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "End Time", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 130}, "Service staff", option) pdf.SetXY(margin_left+370, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "State", option) pdf.SetXY(margin_left+470, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 65}, "RIH Times", option) base += span pdf.Line(margin_left, base, margin_left+535, base) } pdf.SetFont("simfang", "", 12) for i := 0; i < len(state); i++ { v := state[i] /*if len(v.Bt) >= 19 { v.Bt = v.Bt[:16] } if len(v.Et) >= 19 { v.Et = v.Et[:16] } */ if base+span > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+535, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+370, base, margin_left+370, base+span) pdf.Line(margin_left+470, base, margin_left+470, base+span) pdf.Line(margin_left+535, base, margin_left+535, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Start Time", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "End Time", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 130}, "Service staff", option) pdf.SetXY(margin_left+370, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "State", option) pdf.SetXY(margin_left+470, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 65}, "RIH Times", option) base += span pdf.Line(margin_left, base, margin_left+535, base) } else { pdf.SetXY(margin_left*1, base) } var max_h int = 1 context1, _ := pdf.SplitTextWithWordWrap(v.Servicer, 130) if len(context1) > int(max_h) { max_h = len(context1) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+535, base) pdf.Line(margin_left, base, margin_left, base+(float64(max_h)*span)) pdf.Line(margin_left+120, base, margin_left+120, base+(float64(max_h)*span)) pdf.Line(margin_left+240, base, margin_left+240, base+(float64(max_h)*span)) pdf.Line(margin_left+370, base, margin_left+370, base+(float64(max_h)*span)) pdf.Line(margin_left+470, base, margin_left+470, base+(float64(max_h)*span)) pdf.Line(margin_left+535, base, margin_left+535, base+(float64(max_h)*span)) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 120}, v.Bt, option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 120}, v.Et, option) for k := 0; k < len(context1); k++ { pdf.SetXY(margin_left+240, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 130}, context1[k], option) } //pdf.SetXY(margin_left+240, base) //pdf.CellWithOption(&gopdf.Rect{H: span, W: 130}, v.Servicer, option) pdf.SetXY(margin_left+370, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 100}, v.State, option) pdf.SetXY(margin_left+470, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 65}, v.Drilling_time, option) base += (float64(max_h) * span) pdf.Line(margin_left, base, margin_left+535, base) } pdf.SetFont("simfang", "", 14) base += (span / 2) if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //参考信息 base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Reference Information:`)) base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`IP+Port:%s`, baseinfo.Ip)) pdf.SetXY(margin_left+(1.5*h_span), base) pdf.Text(fmt.Sprintf(`area:%s`, baseinfo.Location)) if len(event) > 0 { if base+span+span > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+360, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+360, base, margin_left+360, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Start Time", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "End Time", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Event", option) base += span pdf.Line(margin_left, base, margin_left+360, base) } pdf.SetFont("simfang", "", 12) for i := 0; i < len(event); i++ { ev := event[i] /* if len(ev.Bt) >= 19 { ev.Bt = ev.Bt[:16] } if len(ev.Et) >= 19 { ev.Et = ev.Et[:16] } */ if base+span > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+360, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+360, base, margin_left+360, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Start Time", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "End Time", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Event", option) base += span pdf.Line(margin_left, base, margin_left+360, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+360, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+360, base, margin_left+360, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Bt, option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Et, option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Event_name, option) base += span pdf.Line(margin_left, base, margin_left+360, base) } pdf.SetFont("simfang", "", 14) base += (span / 2) if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Upload Account:%s`, baseinfo.Uploadname)) pdf.SetXY(page_W/2-(1*margin_left), base) pdf.Text(fmt.Sprintf(`Print Account:%s`, opuser)) pdf.SetXY(page_W-(2*margin_left), base) pdf.Text(fmt.Sprintf(`V1.0.0`)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) page_cnt = cur_page return } func get_srr_pdf_page_cnt(opuser string, flag bool, baseinfo get_srr_base_resp, state []Srr_state, event []Srr_event) (page_cnt int) { ps_info := get_ps_info(opuser) //cal total pagenum var cur_page int = 1 var total_page int = 1 //total_page = get_srr_pdf_page_cnt(opuser, baseinfo, state, event) //fmt.Println("现场人员记录报告:", total_page) //W: 595, H: 842 page_W := gopdf.PageSizeA4.W page_H := gopdf.PageSizeA4.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var one_cm float64 = page_W / float64(21) var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 var h_span float64 = 150 page_H = page_H - margin_top page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4.W}, "现场人员记录报告", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4.W / 2}, fmt.Sprintf("报告时间:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4.W / 2) - margin_left}, fmt.Sprintf(`报告编号:%s+C0001`, baseinfo.Wellname), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4.W-margin_left, margin_top+60) var base float64 = margin_top + 60 base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`井号:%s`, baseinfo.Wellname)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`登录上传账号:%s`, baseinfo.Uploadname)) base += (span / 2) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`施工人员填报信息:`)) if len(state) > 0 { base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+515, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+370, base, margin_left+370, base+span) pdf.Line(margin_left+470, base, margin_left+470, base+span) pdf.Line(margin_left+515, base, margin_left+515, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "开始时间", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "结束时间", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 130}, "姓名", option) pdf.SetXY(margin_left+370, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "状态", option) pdf.SetXY(margin_left+470, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 45}, "钻次", option) base += span pdf.Line(margin_left, base, margin_left+515, base) } pdf.SetFont("simfang", "", 12) for i := 0; i < len(state); i++ { v := state[i] /*if len(v.Bt) >= 19 { v.Bt = v.Bt[:16] } if len(v.Et) >= 19 { v.Et = v.Et[:16] } */ if base+span > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+515, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+370, base, margin_left+370, base+span) pdf.Line(margin_left+470, base, margin_left+470, base+span) pdf.Line(margin_left+515, base, margin_left+515, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "开始时间", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "结束时间", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 130}, "姓名", option) pdf.SetXY(margin_left+370, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "状态", option) pdf.SetXY(margin_left+470, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 45}, "钻次", option) base += span pdf.Line(margin_left, base, margin_left+515, base) } else { pdf.SetXY(margin_left*1, base) } var max_h int = 1 context1, _ := pdf.SplitTextWithWordWrap(v.Servicer, 130) if len(context1) > int(max_h) { max_h = len(context1) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+515, base) pdf.Line(margin_left, base, margin_left, base+(float64(max_h)*span)) pdf.Line(margin_left+120, base, margin_left+120, base+(float64(max_h)*span)) pdf.Line(margin_left+240, base, margin_left+240, base+(float64(max_h)*span)) pdf.Line(margin_left+370, base, margin_left+370, base+(float64(max_h)*span)) pdf.Line(margin_left+470, base, margin_left+470, base+(float64(max_h)*span)) pdf.Line(margin_left+515, base, margin_left+515, base+(float64(max_h)*span)) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 120}, v.Bt, option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 120}, v.Et, option) for k := 0; k < len(context1); k++ { pdf.SetXY(margin_left+240, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 130}, context1[k], option) } pdf.SetXY(margin_left+390, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 100}, v.State, option) pdf.SetXY(margin_left+470, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 45}, v.Drilling_time, option) base += (float64(max_h) * span) pdf.Line(margin_left, base, margin_left+515, base) } pdf.SetFont("simfang", "", 14) base += (span / 2) if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //参考信息 base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`参考信息:`)) base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`IP+端口:%s`, baseinfo.Ip)) pdf.SetXY(margin_left+(1.5*h_span), base) pdf.Text(fmt.Sprintf(`地区:%s`, baseinfo.Location)) if flag && len(event) > 0 { if base+span+span > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+360, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+360, base, margin_left+360, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "开始时间", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "结束时间", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "事件", option) base += span pdf.Line(margin_left, base, margin_left+360, base) } if flag { pdf.SetFont("simfang", "", 12) for i := 0; i < len(event); i++ { ev := event[i] /* if len(ev.Bt) >= 19 { ev.Bt = ev.Bt[:16] } if len(ev.Et) >= 19 { ev.Et = ev.Et[:16] } */ if base+span > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+360, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+360, base, margin_left+360, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "开始时间", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "结束时间", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "事件", option) base += span pdf.Line(margin_left, base, margin_left+360, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+360, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+360, base, margin_left+360, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Bt, option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Et, option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Event_name, option) base += span pdf.Line(margin_left, base, margin_left+360, base) } } pdf.SetFont("simfang", "", 14) base += (span / 2) if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`上传账号:%s`, baseinfo.Uploadname)) pdf.SetXY(page_W/2-(1*margin_left), base) pdf.Text(fmt.Sprintf(`打印账号:%s`, opuser)) pdf.SetXY(page_W-(2*margin_left), base) pdf.Text(fmt.Sprintf(`V1.0.0`)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) page_cnt = cur_page return } func export_srr_pdf_en(opuser string, flag bool, baseinfo get_srr_base_resp, state []Srr_state, event []Srr_event) (filename string) { ps_info := get_ps_info(opuser) //cal total pagenum var cur_page int = 1 var total_page int = 1 total_page = get_srr_pdf_page_cnt_en(opuser, baseinfo, state, event) fmt.Println("现场人员记录报告:", total_page) //W: 595, H: 842 page_W := gopdf.PageSizeA4.W page_H := gopdf.PageSizeA4.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var one_cm float64 = page_W / float64(21) var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 var h_span float64 = 150 page_H = page_H - margin_top page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4.W}, "On Site Personnel Record Report", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4.W / 2}, fmt.Sprintf("Report Time:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4.W / 2) - margin_left}, fmt.Sprintf(`Report NO.:%s+C0001`, baseinfo.Wellname), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4.W-margin_left, margin_top+60) var base float64 = margin_top + 60 base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Well name:%s`, baseinfo.Wellname)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Upload user:%s`, baseinfo.Uploadname)) base += (span / 2) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Construction personnel filling in information:`)) if len(state) > 0 { base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+535, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+370, base, margin_left+370, base+span) pdf.Line(margin_left+470, base, margin_left+470, base+span) pdf.Line(margin_left+535, base, margin_left+535, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Start Time", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "End Time", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 130}, "Service staff", option) pdf.SetXY(margin_left+370, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "State", option) pdf.SetXY(margin_left+470, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 65}, "RIH Times", option) base += span pdf.Line(margin_left, base, margin_left+535, base) } pdf.SetFont("simfang", "", 12) for i := 0; i < len(state); i++ { v := state[i] /*if len(v.Bt) >= 19 { v.Bt = v.Bt[:16] } if len(v.Et) >= 19 { v.Et = v.Et[:16] } */ if base+span > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetFont("simfang", "", 14) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+535, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+370, base, margin_left+370, base+span) pdf.Line(margin_left+470, base, margin_left+470, base+span) pdf.Line(margin_left+535, base, margin_left+535, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Start Time", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "End Time", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 130}, "Service staff", option) pdf.SetXY(margin_left+370, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "State", option) pdf.SetXY(margin_left+470, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 65}, "RIH Times", option) base += span pdf.Line(margin_left, base, margin_left+535, base) } else { pdf.SetXY(margin_left*1, base) } var max_h int = 1 context1, _ := pdf.SplitTextWithWordWrap(v.Servicer, 130) if len(context1) > int(max_h) { max_h = len(context1) } pdf.SetFont("simfang", "", 12) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+535, base) pdf.Line(margin_left, base, margin_left, base+(float64(max_h)*span)) pdf.Line(margin_left+120, base, margin_left+120, base+(float64(max_h)*span)) pdf.Line(margin_left+240, base, margin_left+240, base+(float64(max_h)*span)) pdf.Line(margin_left+370, base, margin_left+370, base+(float64(max_h)*span)) pdf.Line(margin_left+470, base, margin_left+470, base+(float64(max_h)*span)) pdf.Line(margin_left+535, base, margin_left+535, base+(float64(max_h)*span)) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 120}, v.Bt, option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 120}, v.Et, option) for k := 0; k < len(context1); k++ { pdf.SetXY(margin_left+240, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 130}, context1[k], option) } //pdf.SetXY(margin_left+240, base) //pdf.CellWithOption(&gopdf.Rect{H: span, W: 130}, v.Servicer, option) pdf.SetXY(margin_left+370, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 100}, v.State, option) pdf.SetXY(margin_left+470, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 65}, v.Drilling_time, option) base += (float64(max_h) * span) pdf.Line(margin_left, base, margin_left+535, base) } pdf.SetFont("simfang", "", 14) base += (span / 2) if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //参考信息 base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Reference Information:`)) base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`IP+Port:%s`, baseinfo.Ip)) pdf.SetXY(margin_left+(1.5*h_span), base) pdf.Text(fmt.Sprintf(`area:%s`, baseinfo.Location)) if flag { if len(event) > 0 { if base+span+span > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+360, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+360, base, margin_left+360, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Start Time", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "End Time", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Event", option) base += span pdf.Line(margin_left, base, margin_left+360, base) } pdf.SetFont("simfang", "", 12) for i := 0; i < len(event); i++ { ev := event[i] /* if len(ev.Bt) >= 19 { ev.Bt = ev.Bt[:16] } if len(ev.Et) >= 19 { ev.Et = ev.Et[:16] } */ if base+span > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetFont("simfang", "", 14) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+360, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+360, base, margin_left+360, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Start Time", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "End Time", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Event", option) base += span pdf.Line(margin_left, base, margin_left+360, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetFont("simfang", "", 12) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+360, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+360, base, margin_left+360, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Bt, option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Et, option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Event_name, option) base += span pdf.Line(margin_left, base, margin_left+360, base) } } pdf.SetFont("simfang", "", 14) base += (span / 2) if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Upload Account:%s`, baseinfo.Uploadname)) pdf.SetXY(page_W/2-(1*margin_left), base) pdf.Text(fmt.Sprintf(`Print Account:%s`, opuser)) pdf.SetXY(page_W-(2*margin_left), base) pdf.Text(fmt.Sprintf(`V1.0.0`)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) //save beginTime := time.Now().UnixNano() pdf.WritePdf(fmt.Sprintf(`./authfile/%v.pdf`, beginTime)) filename = strconv.FormatInt(beginTime, 10) return } func export_srr_pdf(opuser string, flag bool, baseinfo get_srr_base_resp, state []Srr_state, event []Srr_event) (filename string) { ps_info := get_ps_info(opuser) //cal total pagenum var cur_page int = 1 var total_page int = 1 total_page = get_srr_pdf_page_cnt(opuser, flag, baseinfo, state, event) fmt.Println("现场人员记录报告:", total_page) //W: 595, H: 842 page_W := gopdf.PageSizeA4.W page_H := gopdf.PageSizeA4.H //使用 gopdf 库创建一个新的 A4 页面大小的 PDF 文档。 pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } //定义边距、字号、行间距等参数。 //设置页面高度和宽度,用于后续排版。 var one_cm float64 = page_W / float64(21) var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 var h_span float64 = 150 page_H = page_H - margin_top page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) //添加标题“现场人员记录报告”。 //添加报告时间和报告编号。 pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4.W}, "现场人员记录报告", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4.W / 2}, fmt.Sprintf("报告时间:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4.W / 2) - margin_left}, fmt.Sprintf(`报告编号:%s+C0001`, baseinfo.Wellname), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4.W-margin_left, margin_top+60) var base float64 = margin_top + 60 base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`井号:%s`, baseinfo.Wellname)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`登录上传账号:%s`, baseinfo.Uploadname)) base += (span / 2) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`施工人员填报信息:`)) if len(state) > 0 { base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+515, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+370, base, margin_left+370, base+span) pdf.Line(margin_left+470, base, margin_left+470, base+span) pdf.Line(margin_left+515, base, margin_left+515, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "开始时间", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "结束时间", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 130}, "姓名", option) pdf.SetXY(margin_left+370, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "状态", option) pdf.SetXY(margin_left+470, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 45}, "钻次", option) base += span pdf.Line(margin_left, base, margin_left+515, base) } pdf.SetFont("simfang", "", 12) for i := 0; i < len(state); i++ { v := state[i] if base+span > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetFont("simfang", "", 14) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+515, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+370, base, margin_left+370, base+span) pdf.Line(margin_left+470, base, margin_left+470, base+span) pdf.Line(margin_left+515, base, margin_left+515, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "开始时间", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "结束时间", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 130}, "姓名", option) pdf.SetXY(margin_left+370, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "状态", option) pdf.SetXY(margin_left+470, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 45}, "钻次", option) base += span pdf.Line(margin_left, base, margin_left+515, base) } else { pdf.SetXY(margin_left*1, base) } var max_h int = 1 context1, _ := pdf.SplitTextWithWordWrap(v.Servicer, 130) if len(context1) > int(max_h) { max_h = len(context1) } pdf.SetFont("simfang", "", 12) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+515, base) pdf.Line(margin_left, base, margin_left, base+(float64(max_h)*span)) pdf.Line(margin_left+120, base, margin_left+120, base+(float64(max_h)*span)) pdf.Line(margin_left+240, base, margin_left+240, base+(float64(max_h)*span)) pdf.Line(margin_left+370, base, margin_left+370, base+(float64(max_h)*span)) pdf.Line(margin_left+470, base, margin_left+470, base+(float64(max_h)*span)) pdf.Line(margin_left+515, base, margin_left+515, base+(float64(max_h)*span)) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 120}, v.Bt, option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 120}, v.Et, option) for k := 0; k < len(context1); k++ { pdf.SetXY(margin_left+240, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 130}, context1[k], option) } pdf.SetXY(margin_left+370, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 100}, v.State, option) pdf.SetXY(margin_left+470, base) pdf.CellWithOption(&gopdf.Rect{H: span * float64(max_h), W: 45}, v.Drilling_time, option) base += (float64(max_h) * span) pdf.Line(margin_left, base, margin_left+515, base) } pdf.SetFont("simfang", "", 14) base += (span / 2) if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`参考信息:`)) base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`IP+端口:%s`, baseinfo.Ip)) pdf.SetXY(margin_left+(1.5*h_span), base) pdf.Text(fmt.Sprintf(`地区:%s`, baseinfo.Location)) //参考信息 if flag { if len(event) > 0 { if base+span+span > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+360, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+360, base, margin_left+360, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "开始时间", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "结束时间", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "事件", option) base += span pdf.Line(margin_left, base, margin_left+360, base) } pdf.SetFont("simfang", "", 12) for i := 0; i < len(event); i++ { ev := event[i] if base+span > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+360, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+360, base, margin_left+360, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "开始时间", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "结束时间", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "事件", option) base += span pdf.Line(margin_left, base, margin_left+360, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+360, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+360, base, margin_left+360, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Bt, option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Et, option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Event_name, option) base += span pdf.Line(margin_left, base, margin_left+360, base) } } pdf.SetFont("simfang", "", 14) base += (span / 2) if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`上传账号:%s`, baseinfo.Uploadname)) pdf.SetXY(page_W/2-(1*margin_left), base) pdf.Text(fmt.Sprintf(`打印账号:%s`, opuser)) pdf.SetXY(page_W-(2*margin_left), base) pdf.Text(fmt.Sprintf(`V1.0.0`)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) //save beginTime := time.Now().UnixNano() pdf.WritePdf(fmt.Sprintf(`./authfile/%v.pdf`, beginTime)) filename = strconv.FormatInt(beginTime, 10) return } // 右侧三个的最后一行 func calculateTotalRow(tableData [][]string) []string { totalCount := 0 totalMinutes := 0 totalHours := 0 for _, row := range tableData { // 解析第一列:计数 levelParts := strings.Fields(row[0]) if len(levelParts) >= 2 { count, err := strconv.Atoi(levelParts[len(levelParts)-1]) if err == nil { totalCount += count } } // 解析第二列:时长 durationParts := strings.Fields(row[1]) if len(durationParts) >= 2 { // 分钟部分 - 直接累计 minStr := strings.TrimSuffix(durationParts[0], "min") minutes, err := strconv.Atoi(minStr) if err == nil { totalMinutes += minutes } // 小时部分 - 直接累计(不再转换为分钟) hourStr := strings.TrimSuffix(durationParts[1], "h") hours, err := strconv.Atoi(hourStr) if err == nil { totalHours += hours // 新增一个totalHours变量来累计小时 } } } formattedLevel := fmt.Sprintf("%-9s", " Total") // 固定占9字符宽度 formattedCount := fmt.Sprintf(" %-5d", totalCount) // 空格+数字,占6字符宽度 col1 := formattedLevel + " " + formattedCount // 中间加2个空格 // 分钟部分固定7字符宽度(最大99999min) minPart := fmt.Sprintf("%7s", fmt.Sprintf("%dmin", totalMinutes)) // 从分钟计算小时(向下取整) totalHours2 := totalMinutes / 60 // 小时部分处理:当小时数为一位数时左对齐 hourPart := fmt.Sprintf("%dh", totalHours2) if totalHours2 < 10 { hourPart = fmt.Sprintf("%-3s", " "+hourPart) // 一位数时左对齐 } else { hourPart = fmt.Sprintf("%3s", hourPart) // 多位数时右对齐 } col2 := minPart + " " + hourPart // 中间加2个空格 return []string{col1, col2, ""} // formattedLevel := fmt.Sprintf("%-9s", " Total") // 固定占9字符宽度 // formattedCount := fmt.Sprintf(" %-5d", totalCount) // 空格+数字,占6字符宽度 // col1 := formattedLevel + " " + formattedCount // 中间加2个空格 // // 分钟部分固定7字符宽度(最大99999min) // minPart := fmt.Sprintf("%7s", fmt.Sprintf("%dmin", totalMinutes)) // // 小时部分处理:当小时数为一位数时左对齐 // hourPart := fmt.Sprintf("%dh", totalHours) // if totalHours < 10 { // hourPart = fmt.Sprintf("%-3s", " "+hourPart) // 一位数时左对齐 // } else { // hourPart = fmt.Sprintf("%3s", hourPart) // 多位数时右对齐 // } // col2 := minPart + " " + hourPart // 中间加2个空格 // return []string{col1, col2, ""} } func export_vibration_pdf(baseinfo get_vibration_resp, vibrationData TimeDepthRange, statsData [][]string, axialData [][]string, stickSlipData [][]string, tableDataOne [][]string, tableDataTwo [][]string, tableDataThree [][]string) (filename string) { pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4}) pdf.AddPage() // 加载中文字体(使用仿宋字体) err := pdf.AddTTFFont("simfang", "./simsun.ttf") // err := pdf.AddTTFFont("simfang", "D:\\deescloud\\deesCloudServer\\simsun.ttf") if err != nil { fmt.Printf("没有找到字体文件") logs.Error(err.Error()) return } // 计算页边距 var margin_top float64 = 2.54 * (gopdf.PageSizeA4.H / float64(29.7)) * 0.5 // 上边距(2.54cm) var margin_left float64 = 1.91 * (gopdf.PageSizeA4.W / float64(21)) * 0.5 // 左边距(1.91cm) // 添加标题 "Vibration Report"(左对齐,字号24) pdf.SetFont("simfang", "", 24) pdf.SetTextColor(0, 0, 255) // 蓝色字体 var option gopdf.CellOption option.Align = gopdf.Left pdf.SetXY(margin_left, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4.W}, "Vibration Report", option) // 添加黑色横线(1像素宽度) lineY := margin_top + 30 + 15 pdf.SetLineWidth(2) pdf.SetStrokeColor(0, 0, 0) lineStartX := margin_left lineEndX := gopdf.PageSizeA4.W - margin_left pdf.Line(lineStartX, lineY, lineEndX, lineY) // 添加四个字段在一行(字号14) fieldY := lineY + 7 pdf.SetFont("simfang", "", 10) //设置下面四个字体颜色 option.Align = gopdf.Center pdf.SetTextColor(0, 0, 0) // RGB: 黑色 // 计算每个字段的宽度 // 计算每个字段的宽度(总宽度减去左右增加的30间距) totalWidth := gopdf.PageSizeA4.W - 2*(margin_left) colWidth := totalWidth / 4 // Well Num: 1 pdf.SetXY(margin_left, fieldY) // 井名 pdf.CellWithOption(&gopdf.Rect{H: 20, W: colWidth}, "Well Name: "+baseinfo.Wellname, option) // Well Team: 2 pdf.SetXY(margin_left+colWidth, fieldY) // 井队 pdf.CellWithOption(&gopdf.Rect{H: 20, W: colWidth}, "Well Team: "+baseinfo.WellTeam, option) // Tabulator: 3 pdf.SetXY(margin_left+2*colWidth, fieldY) //制表人 pdf.CellWithOption(&gopdf.Rect{H: 20, W: colWidth}, "Tabulator: "+baseinfo.OpUser, option) // Auditor: 4 pdf.SetXY(margin_left+3*colWidth, fieldY) //审核人 pdf.CellWithOption(&gopdf.Rect{H: 20, W: colWidth}, "Auditor: ", option) // 添加两行数据(距离上方四个字段40像素,全部集中在左半边) dataY := fieldY + 40 leftSectionWidth := (gopdf.PageSizeA4.W - 2*margin_left) / 2 // 左半边宽度 fieldSpacing := 0.0 // 字段间间距 fieldWidth := (leftSectionWidth - fieldSpacing) / 2 // 每个字段宽度 pdf.SetFont("simfang", "", 10) // 第一行数据(两个字段) pdf.SetXY(50, dataY) fromLabel := "Data From:" fromLabelWidth, _ := pdf.MeasureTextWidth(fromLabel) fromText := fmt.Sprintf("%s %s", fromLabel, vibrationData.FromTime) pdf.CellWithOption(&gopdf.Rect{H: 12, W: fieldWidth}, fromText, option) // Min Depth字段 pdf.SetXY(50+fieldWidth+fieldSpacing, dataY) pdf.CellWithOption(&gopdf.Rect{H: 12, W: fieldWidth}, fmt.Sprintf("Min Depth(m): %.1f", vibrationData.MinDepth), option) toLabel := "To:" toLabelWidth, _ := pdf.MeasureTextWidth(toLabel) // 计算对齐位置:使用相同的起始X坐标,但通过标签宽度差调整 alignOffset := fromLabelWidth - toLabelWidth pdf.SetXY(33+alignOffset, dataY+15) pdf.CellWithOption(&gopdf.Rect{H: 12, W: fieldWidth}, fmt.Sprintf("%s %s", toLabel, vibrationData.ToTime), option) // Max Depth字段 pdf.SetXY(50+fieldWidth+fieldSpacing, dataY+15) pdf.CellWithOption(&gopdf.Rect{H: 12, W: fieldWidth}, fmt.Sprintf("Max Depth(m): %.1f", vibrationData.MaxDepth), option) //====================================新增左侧表格=========================================== statsTableStartY := dataY + 60 // 页面尺寸和边距 pageWidth := 595.28 // A4页面宽度 leftMargin := 50.0 // 左边距 rightMargin := 50.0 // 右边距 // 计算左侧区域宽度(页面宽度的一半) totalAvailableWidth := pageWidth - leftMargin - rightMargin leftHalfWidth := totalAvailableWidth / 2 // 每列宽度(三列等分左侧区域) colLeftWidth := leftHalfWidth / 3 statsColWidths := []float64{colLeftWidth, colLeftWidth, colLeftWidth} // 绘制表头(居中对齐) pdf.SetFont("simfang", "", 10) statsHeaders := []string{"Lateral(SEVXYX)", "Times", "Percentage"} // 计算表格在左侧区域居中的起始X坐标 tableTotalWidth := colLeftWidth * 3 tableLeftStartX := leftMargin + (leftHalfWidth-tableTotalWidth)/2 // 表头文本 currentLeftX := tableLeftStartX for i, header := range statsHeaders { pdf.SetXY(currentLeftX, statsTableStartY) cellOpt := gopdf.CellOption{Align: gopdf.Center} pdf.CellWithOption(&gopdf.Rect{ H: 15, W: statsColWidths[i], }, header, cellOpt) currentLeftX += statsColWidths[i] } // 绘制数据行(全部居中对齐) pdf.SetFont("simfang", "", 9) for rowIdx, row := range statsData { rowY := statsTableStartY + 15 + float64(rowIdx)*12 currentLeftX = tableLeftStartX // 特殊处理 "7 included above" 这一行 if row[0] == "7 included above" { // 1. 绘制淡蓝色背景 pdf.SetFillColor(173, 216, 230) // 淡蓝色 pdf.Rectangle(currentLeftX, rowY, currentLeftX+tableTotalWidth, rowY+12, "F", 0, 0) // 2. 绘制黑色边框 pdf.SetLineWidth(0.5) pdf.SetStrokeColor(0, 0, 0) // 黑色 pdf.Rectangle(currentLeftX, rowY, currentLeftX+tableTotalWidth, rowY+12, "D", 0, 0) // 3. 调整文字位置,增加 padding padding := 2.0 // 文字向下偏移 2pt,避免紧贴边框 textY := rowY + padding // 新的 Y 坐标 for colIdx, cell := range row { pdf.SetXY(currentLeftX, textY) // 使用调整后的 Y 坐标 cellOpt := gopdf.CellOption{Align: gopdf.Center} pdf.SetTextColor(0, 0, 0) // 单元格高度减少 padding,避免文字超出 pdf.CellWithOption(&gopdf.Rect{ H: 12 - padding, // 高度减少,保持垂直居中 W: statsColWidths[colIdx], }, cell, cellOpt) currentLeftX += statsColWidths[colIdx] } } else { // 其他行正常绘制(不变) for colIdx, cell := range row { pdf.SetXY(currentLeftX, rowY) cellOpt := gopdf.CellOption{Align: gopdf.Center} pdf.CellWithOption(&gopdf.Rect{ H: 12, W: statsColWidths[colIdx], }, cell, cellOpt) currentLeftX += statsColWidths[colIdx] } } // 重置文字颜色(不变) pdf.SetTextColor(0, 0, 0) } // =====================================新增Axial表格=========================================== axialTableStartY := statsTableStartY + 15 + float64(len(statsData))*12 + 20 // 在第一个表格下方20像素处 // 绘制表头 pdf.SetFont("simfang", "", 10) axialHeaders := []string{"Axial(SEVZX)", "Times", "Percentage"} // 绘制表头文本 currentLeftX = tableLeftStartX for i, header := range axialHeaders { pdf.SetXY(currentLeftX, axialTableStartY) cellOpt := gopdf.CellOption{Align: gopdf.Center} pdf.CellWithOption(&gopdf.Rect{ H: 15, W: statsColWidths[i], }, header, cellOpt) currentLeftX += statsColWidths[i] } // 绘制数据行 pdf.SetFont("simfang", "", 9) for rowIdx, row := range axialData { rowY := axialTableStartY + 15 + float64(rowIdx)*12 currentLeftX = tableLeftStartX if row[0] == "7 included above" { // 淡蓝色背景 pdf.SetFillColor(173, 216, 230) pdf.Rectangle(currentLeftX, rowY, currentLeftX+tableTotalWidth, rowY+12, "F", 0, 0) // 黑色边框 pdf.SetLineWidth(0.5) pdf.SetStrokeColor(0, 0, 0) pdf.Rectangle(currentLeftX, rowY, currentLeftX+tableTotalWidth, rowY+12, "D", 0, 0) padding := 2.0 textY := rowY + padding for colIdx, cell := range row { pdf.SetXY(currentLeftX, textY) cellOpt := gopdf.CellOption{Align: gopdf.Center} pdf.SetTextColor(0, 0, 0) pdf.CellWithOption(&gopdf.Rect{ H: 12 - padding, W: statsColWidths[colIdx], }, cell, cellOpt) currentLeftX += statsColWidths[colIdx] } } else { for colIdx, cell := range row { pdf.SetXY(currentLeftX, rowY) cellOpt := gopdf.CellOption{Align: gopdf.Center} pdf.CellWithOption(&gopdf.Rect{ H: 12, W: statsColWidths[colIdx], }, cell, cellOpt) currentLeftX += statsColWidths[colIdx] } } pdf.SetTextColor(0, 0, 0) } // =====================================新增Stick Slip表格===================================== stickSlipTableStartY := axialTableStartY + 15 + float64(len(axialData))*12 + 20 // 在Axial表格下方20像素处 // 绘制表头 pdf.SetFont("simfang", "", 10) stickSlipHeaders := []string{"Stick Slip(SSLIPX)", "Times", "Percentage"} // 绘制表头文本 currentLeftX = tableLeftStartX for i, header := range stickSlipHeaders { pdf.SetXY(currentLeftX, stickSlipTableStartY) cellOpt := gopdf.CellOption{Align: gopdf.Center} pdf.CellWithOption(&gopdf.Rect{ H: 15, W: statsColWidths[i], }, header, cellOpt) currentLeftX += statsColWidths[i] } // 绘制数据行 pdf.SetFont("simfang", "", 9) for rowIdx, row := range stickSlipData { rowY := stickSlipTableStartY + 15 + float64(rowIdx)*12 currentLeftX = tableLeftStartX if row[0] == "7 included above" { // 淡蓝色背景 pdf.SetFillColor(173, 216, 230) pdf.Rectangle(currentLeftX, rowY, currentLeftX+tableTotalWidth, rowY+12, "F", 0, 0) // 黑色边框 pdf.SetLineWidth(0.5) pdf.SetStrokeColor(0, 0, 0) pdf.Rectangle(currentLeftX, rowY, currentLeftX+tableTotalWidth, rowY+12, "D", 0, 0) padding := 2.0 textY := rowY + padding for colIdx, cell := range row { pdf.SetXY(currentLeftX, textY) cellOpt := gopdf.CellOption{Align: gopdf.Center} pdf.SetTextColor(0, 0, 0) pdf.CellWithOption(&gopdf.Rect{ H: 12 - padding, W: statsColWidths[colIdx], }, cell, cellOpt) currentLeftX += statsColWidths[colIdx] } } else { for colIdx, cell := range row { pdf.SetXY(currentLeftX, rowY) cellOpt := gopdf.CellOption{Align: gopdf.Center} pdf.CellWithOption(&gopdf.Rect{ H: 12, W: statsColWidths[colIdx], }, cell, cellOpt) currentLeftX += statsColWidths[colIdx] } } pdf.SetTextColor(0, 0, 0) } // =====================================新增振动限制表格======================================= vibrationLimitsStartY := stickSlipTableStartY + 15 + float64(len(stickSlipData))*12 + 20 // 振动限制表格数据 vibrationLimitsData := [][]string{ {"Lateral/Axial", "4", "3 h"}, {"Lateral/Axial", "5,6,7", "20 min"}, {"Stick/Slip", "6", "5 h"}, {"Stick/Slip", "7", "1 h"}, } // 计算垂直居中偏移量 calcVerticalOffset := func(cellHeight, fontSize float64) float64 { // 假设字体高度约为字体大小的0.7倍(经验值) textHeight := fontSize * 0.7 baselineOffset := textHeight * 0.3 return (cellHeight-textHeight)/2 + baselineOffset - 4 } // 绘制表格标题 - 更大的字体 titleFontSize := 20.0 // 进一步增大标题字体 pdf.SetFont("simfang", "", titleFontSize) pdf.SetTextColor(0, 0, 0) titleYT := vibrationLimitsStartY titleHeightT := 28.0 // 增加标题高度 titleOffset := calcVerticalOffset(titleHeightT, titleFontSize) pdf.SetXY(tableLeftStartX, titleYT+titleOffset-4) cellOpt := gopdf.CellOption{Align: gopdf.Center} pdf.CellWithOption(&gopdf.Rect{H: titleHeightT, W: tableTotalWidth}, "Vibration Limits", cellOpt) // 绘制标题边框 pdf.SetLineWidth(1) pdf.RectFromUpperLeft(tableLeftStartX, titleYT, tableTotalWidth, titleHeightT) // 绘制表头 - 增大表头字体 headerFontSize := 14.0 // 进一步增大表头字体 headerYT := titleYT + titleHeightT headerHeightT := 22.0 // 增加表头高度 pdf.SetFont("simfang", "", headerFontSize) vibrationLimitsHeaders := []string{"Type", "Level", "Max Time"} // 列宽保持不变 limitsColWidths := []float64{ tableTotalWidth * 0.4, tableTotalWidth * 0.3, tableTotalWidth * 0.3, } // 绘制表头文本 - 确保居中 currentLeftX = tableLeftStartX for i, header := range vibrationLimitsHeaders { headerOffset := calcVerticalOffset(headerHeightT, headerFontSize) pdf.SetXY(currentLeftX, headerYT+headerOffset) cellOpt := gopdf.CellOption{Align: gopdf.Center} pdf.CellWithOption(&gopdf.Rect{ H: headerHeightT, W: limitsColWidths[i], }, header, cellOpt) currentLeftX += limitsColWidths[i] } // 绘制表头边框 pdf.SetLineWidth(1) pdf.SetStrokeColor(0, 0, 0) pdf.RectFromUpperLeft(tableLeftStartX, headerYT, tableTotalWidth, headerHeightT) // 添加垂直线 pdf.Line(tableLeftStartX+limitsColWidths[0], headerYT, tableLeftStartX+limitsColWidths[0], headerYT+headerHeightT) pdf.Line(tableLeftStartX+limitsColWidths[0]+limitsColWidths[1], headerYT, tableLeftStartX+limitsColWidths[0]+limitsColWidths[1], headerYT+headerHeightT) // 绘制数据行 - 增大字体并确保全部居中 dataFontSize := 13.0 // 进一步增大数据字体 pdf.SetFont("simfang", "", dataFontSize) rowHeightT := 18.0 // 增加行高 for rowIdx, row := range vibrationLimitsData { rowY := headerYT + headerHeightT + float64(rowIdx)*rowHeightT // 绘制行边框 pdf.RectFromUpperLeft(tableLeftStartX, rowY, tableTotalWidth, rowHeightT) // 添加垂直线 pdf.Line(tableLeftStartX+limitsColWidths[0], rowY, tableLeftStartX+limitsColWidths[0], rowY+rowHeightT) pdf.Line(tableLeftStartX+limitsColWidths[0]+limitsColWidths[1], rowY, tableLeftStartX+limitsColWidths[0]+limitsColWidths[1], rowY+rowHeightT) // 绘制单元格内容 - 所有列居中 currentLeftX = tableLeftStartX for colIdx, cell := range row { // 计算垂直居中位置 rowOffset := calcVerticalOffset(rowHeightT, dataFontSize) pdf.SetXY(currentLeftX, rowY+rowOffset) cellOpt := gopdf.CellOption{Align: gopdf.Center} pdf.CellWithOption(&gopdf.Rect{ H: rowHeightT, W: limitsColWidths[colIdx], }, cell, cellOpt) currentLeftX += limitsColWidths[colIdx] } } // 绘制底部边框 bottomY := headerYT + headerHeightT + float64(len(vibrationLimitsData))*rowHeightT pdf.Line(tableLeftStartX, bottomY, tableLeftStartX+tableTotalWidth, bottomY) //====================================新增右侧表格Lateral Vibration=========================================== // 表格参数设置 tableOption := gopdf.CellOption{Align: gopdf.Center} // 新增居中设置 tableStartX := 50 + leftSectionWidth + 20 tableStartY := dataY colWidths := []float64{80, 80, 60} // SEVXYX/Times | Time | Limit totalTableWidth := colWidths[0] + colWidths[1] + colWidths[2] // 1. 绘制标题区域 pdf.SetFont("simfang", "", 14) pdf.SetTextColor(0, 0, 0) titleY := tableStartY titleHeight := 20.0 // 绘制标题文本(居中) pdf.SetXY(tableStartX, titleY+2) pdf.CellWithOption(&gopdf.Rect{H: titleHeight, W: totalTableWidth}, "Lateral Vibration", option) // 绘制标题边框 pdf.SetLineWidth(1) //边框线宽度 pdf.Line(tableStartX, titleY, tableStartX+totalTableWidth, titleY) // 顶部边框 pdf.Line(tableStartX, titleY+titleHeight, tableStartX+totalTableWidth, titleY+titleHeight) // 底部边框 pdf.Line(tableStartX, titleY, tableStartX, titleY+titleHeight) // 左边框 pdf.Line(tableStartX+totalTableWidth, titleY, tableStartX+totalTableWidth, titleY+titleHeight) // 右边框 // 2. 绘制表头区域 headerY := titleY + titleHeight headerHeight := 15.0 pdf.SetFont("simfang", "", 10) Yheaders := []string{"SEVXYX Times", "Time", "Limit"} // 绘制表头文本 - 使用tableOption currentX := tableStartX for i := 0; i < len(Yheaders); i++ { pdf.SetXY(currentX, headerY+2) // 修改这里:使用tableOption替代option pdf.CellWithOption(&gopdf.Rect{H: headerHeight, W: colWidths[i]}, Yheaders[i], tableOption) currentX += colWidths[i] } // 3. 计算表格主体高度 rowHeight := 12.0 tableBodyHeight := float64(len(tableDataOne)) * rowHeight // 6. 绘制数据行 pdf.SetFont("simfang", "", 9) for rowIdx, row := range tableDataOne { rowY := headerY + headerHeight + float64(rowIdx)*rowHeight // 根据等级设置背景色 switch rowIdx { case 0, 1, 2, 3: // Level0, Level1, Level2 - 绿色背景 pdf.SetFillColor(144, 238, 144) // 浅绿色 case 4, 5: // Level3, Level4 - 黄色背景 pdf.SetFillColor(255, 255, 0) // 浅黄色 case 6, 7: // Level5, Level6 - 红色背景 pdf.SetFillColor(255, 99, 71) // 浅红色 default: // Level7和其他 - 默认白色 pdf.SetFillColor(148, 0, 211) //紫色 } // 绘制行背景(矩形填充) pdf.Rectangle(tableStartX+0.8, rowY, tableStartX+totalTableWidth-0.7, rowY+rowHeight, "F", 0, 0) // 重置文本颜色(确保文本可读) pdf.SetTextColor(0, 0, 0) // 黑色文本 // 绘制单元格内容 currentX := tableStartX for colIdx, cell := range row { pdf.SetXY(currentX, rowY) pdf.CellWithOption(&gopdf.Rect{H: rowHeight, W: colWidths[colIdx]}, cell, tableOption) currentX += colWidths[colIdx] } } // 4. 绘制外边框(从表头开始) pdf.Line(tableStartX, headerY, tableStartX, headerY+headerHeight+tableBodyHeight) // 左边框 pdf.Line(tableStartX+totalTableWidth, headerY, tableStartX+totalTableWidth, headerY+headerHeight+tableBodyHeight) // 右边框 pdf.Line(tableStartX, headerY+headerHeight+tableBodyHeight, tableStartX+totalTableWidth, headerY+headerHeight+tableBodyHeight) // 底部边框 // 5. 绘制垂直分隔线(从表头开始) currentX = tableStartX for i := 0; i < len(colWidths)-1; i++ { currentX += colWidths[i] // pdf.Line(currentX, headerY, currentX, headerY+headerHeight+tableBodyHeight) // 垂直分隔线 pdf.Line(currentX, headerY, currentX, headerY+headerHeight) } pdf.Line(tableStartX, headerY+headerHeight-0.8, tableStartX+totalTableWidth, headerY+headerHeight) // 7. 添加汇总行(Total行) totalRowY := headerY + headerHeight + float64(len(tableDataOne))*rowHeight // 计算Total行Y坐标 // 设置文字居中 // 绘制Total行文字内容 currentX = tableStartX for colIdx, cell := range calculateTotalRow(tableDataOne) { //计算Total总条数总时长 pdf.SetXY(currentX, totalRowY+1) pdf.CellWithOption(&gopdf.Rect{H: rowHeight, W: colWidths[colIdx]}, cell, tableOption) currentX += colWidths[colIdx] } pdf.Line(tableStartX, totalRowY, tableStartX, totalRowY+rowHeight) pdf.Line(tableStartX+colWidths[0], totalRowY, tableStartX+colWidths[0], totalRowY+rowHeight) pdf.Line(tableStartX+colWidths[0]+colWidths[1], totalRowY, tableStartX+colWidths[0]+colWidths[1], totalRowY+rowHeight) pdf.Line(tableStartX, totalRowY, tableStartX+colWidths[0]+colWidths[1], totalRowY) pdf.Line(tableStartX, totalRowY+rowHeight, tableStartX+colWidths[0]+colWidths[1], totalRowY+rowHeight) secondTableStartY := totalRowY + rowHeight + 20 //====================================新增右侧表格AXial Vibration=========================================== pdf.SetFont("simfang", "", 14) pdf.SetTextColor(0, 0, 0) secondTitleY := secondTableStartY // 绘制标题文本(居中) - 修改为"AXial Vibration" pdf.SetXY(tableStartX, secondTitleY+2) pdf.CellWithOption(&gopdf.Rect{H: titleHeight, W: totalTableWidth}, "AXial Vibration", option) // 绘制标题边框 pdf.SetLineWidth(1) pdf.Line(tableStartX, secondTitleY, tableStartX+totalTableWidth, secondTitleY) pdf.Line(tableStartX, secondTitleY+titleHeight, tableStartX+totalTableWidth, secondTitleY+titleHeight) pdf.Line(tableStartX, secondTitleY, tableStartX, secondTitleY+titleHeight) pdf.Line(tableStartX+totalTableWidth, secondTitleY, tableStartX+totalTableWidth, secondTitleY+titleHeight) //绘制表头区域 secondHeaderY := secondTitleY + titleHeight pdf.SetFont("simfang", "", 10) Zheaders := []string{"SEVZX Times", "Time", "Limit"} // 绘制表头文本(与第一个表格相同) currentX = tableStartX for i := 0; i < len(Zheaders); i++ { pdf.SetXY(currentX, secondHeaderY+2) pdf.CellWithOption(&gopdf.Rect{H: headerHeight, W: colWidths[i]}, Zheaders[i], option) currentX += colWidths[i] } pdf.SetFont("simfang", "", 9) for rowIdx, row := range tableDataTwo { rowY := secondHeaderY + headerHeight + float64(rowIdx)*rowHeight // 根据行索引确定背景色(假设行索引对应等级) switch rowIdx { case 0, 1, 2: // Level0, Level1, Level2 - 绿色背景 pdf.SetFillColor(144, 238, 144) // 浅绿色 case 3, 4: // Level3, Level4 - 黄色背景 pdf.SetFillColor(255, 255, 0) // 浅黄色 case 5, 6, 7: // Level5, Level6 - 红色背景 pdf.SetFillColor(255, 99, 71) // 浅红色 default: // Level7和其他 - 默认白色 pdf.SetFillColor(148, 0, 211) //紫色 } // 绘制行背景(先填充矩形) pdf.Rectangle(tableStartX+0.8, rowY, tableStartX+totalTableWidth-0.7, rowY+rowHeight, "F", 0, 0) // 重置文本颜色为黑色确保可读性 pdf.SetTextColor(0, 0, 0) // 绘制单元格内容 currentX = tableStartX for colIdx, cell := range row { pdf.SetXY(currentX, rowY) pdf.CellWithOption(&gopdf.Rect{H: rowHeight, W: colWidths[colIdx]}, cell, option) currentX += colWidths[colIdx] } } //绘制外边框 pdf.Line(tableStartX, secondHeaderY, tableStartX, secondHeaderY+headerHeight+tableBodyHeight) pdf.Line(tableStartX+totalTableWidth, secondHeaderY, tableStartX+totalTableWidth, secondHeaderY+headerHeight+tableBodyHeight) pdf.Line(tableStartX, secondHeaderY+headerHeight+tableBodyHeight, tableStartX+totalTableWidth, secondHeaderY+headerHeight+tableBodyHeight) //绘制垂直分隔线 currentX = tableStartX for i := 0; i < len(colWidths)-1; i++ { currentX += colWidths[i] pdf.Line(currentX, secondHeaderY, currentX, secondHeaderY+headerHeight) } pdf.Line(tableStartX, secondHeaderY+headerHeight-0.8, tableStartX+totalTableWidth, secondHeaderY+headerHeight) // 2.6 添加汇总行(Total行) secondTotalRowY := secondHeaderY + headerHeight + float64(len(tableDataTwo))*rowHeight // 绘制Total行文字内容(与第一个表格相同) currentX = tableStartX for colIdx, cell := range calculateTotalRow(tableDataTwo) { pdf.SetXY(currentX, secondTotalRowY+1) pdf.CellWithOption(&gopdf.Rect{H: rowHeight, W: colWidths[colIdx]}, cell, option) currentX += colWidths[colIdx] } // 绘制Total行的边框线 pdf.Line(tableStartX, secondTotalRowY, tableStartX, secondTotalRowY+rowHeight) pdf.Line(tableStartX+colWidths[0], secondTotalRowY, tableStartX+colWidths[0], secondTotalRowY+rowHeight) pdf.Line(tableStartX+colWidths[0]+colWidths[1], secondTotalRowY, tableStartX+colWidths[0]+colWidths[1], secondTotalRowY+rowHeight) pdf.Line(tableStartX, secondTotalRowY, tableStartX+colWidths[0]+colWidths[1], secondTotalRowY) pdf.Line(tableStartX, secondTotalRowY+rowHeight, tableStartX+colWidths[0]+colWidths[1], secondTotalRowY+rowHeight) // 计算第三个表格的起始Y坐标(第二个表格底部+20像素间距) thirdTableStartY := secondTotalRowY + rowHeight + 20 //====================================新增右侧表格Stick Slip=========================================== // 3. 绘制第三个表格(Stick Slip) // 3.1 绘制标题区域 pdf.SetFont("simfang", "", 14) pdf.SetTextColor(0, 0, 0) thirdTitleY := thirdTableStartY // 绘制标题文本(居中) - 修改为"Stick Slip" pdf.SetXY(tableStartX, thirdTitleY+2) pdf.CellWithOption(&gopdf.Rect{H: titleHeight, W: totalTableWidth}, "Stick Slip", option) // 绘制标题边框 pdf.SetLineWidth(1) pdf.Line(tableStartX, thirdTitleY, tableStartX+totalTableWidth, thirdTitleY) pdf.Line(tableStartX, thirdTitleY+titleHeight, tableStartX+totalTableWidth, thirdTitleY+titleHeight) pdf.Line(tableStartX, thirdTitleY, tableStartX, thirdTitleY+titleHeight) pdf.Line(tableStartX+totalTableWidth, thirdTitleY, tableStartX+totalTableWidth, thirdTitleY+titleHeight) // 3.2 绘制表头区域 thirdHeaderY := thirdTitleY + titleHeight pdf.SetFont("simfang", "", 10) Seaders := []string{"SSLIPX Times", "Time", "Limit"} // 绘制表头文本(与前两个表格相同) currentX = tableStartX for i := 0; i < len(Seaders); i++ { pdf.SetXY(currentX, thirdHeaderY+2) pdf.CellWithOption(&gopdf.Rect{H: headerHeight, W: colWidths[i]}, Seaders[i], option) currentX += colWidths[i] } // 3.5 绘制数据行(与前两个表格数据相同) pdf.SetFont("simfang", "", 9) for rowIdx, row := range tableDataThree { rowY := thirdHeaderY + headerHeight + float64(rowIdx)*rowHeight // 根据行索引设置背景色(0=Level0, 1=Level1...) switch rowIdx { case 0, 1, 2: // Level0, Level1, Level2 - 绿色背景 pdf.SetFillColor(144, 238, 144) // 浅绿色 case 3, 4: // Level3, Level4 - 黄色背景 pdf.SetFillColor(255, 255, 0) // 浅黄色 case 5, 6: // Level5, Level6 - 红色背景 pdf.SetFillColor(255, 99, 71) // 浅红色 default: // Level7和其他 - 默认紫色 pdf.SetFillColor(148, 0, 211) //紫色 } pdf.Line(tableStartX, thirdHeaderY+headerHeight-0.8, tableStartX+totalTableWidth, thirdHeaderY+headerHeight) pdf.Rectangle(tableStartX+0.8, rowY, tableStartX+totalTableWidth-0.7, rowY+rowHeight, "F", 0, 0) // 确保文本为黑色 pdf.SetTextColor(0, 0, 0) // 绘制单元格内容 currentX = tableStartX for colIdx, cell := range row { pdf.SetXY(currentX, rowY) pdf.CellWithOption(&gopdf.Rect{H: rowHeight, W: colWidths[colIdx]}, cell, option) currentX += colWidths[colIdx] } } // 3.3 绘制外边框 pdf.Line(tableStartX, thirdHeaderY, tableStartX, thirdHeaderY+headerHeight+tableBodyHeight) pdf.Line(tableStartX+totalTableWidth, thirdHeaderY, tableStartX+totalTableWidth, thirdHeaderY+headerHeight+tableBodyHeight) pdf.Line(tableStartX, thirdHeaderY+headerHeight+tableBodyHeight, tableStartX+totalTableWidth, thirdHeaderY+headerHeight+tableBodyHeight) // 3.4 绘制垂直分隔线 currentX = tableStartX for i := 0; i < len(colWidths)-1; i++ { currentX += colWidths[i] pdf.Line(currentX, thirdHeaderY, currentX, thirdHeaderY+headerHeight) } // 3.6 添加汇总行(Total行) thirdTotalRowY := thirdHeaderY + headerHeight + float64(len(tableDataThree))*rowHeight fmt.Println("tableDataThree:", tableDataThree) // 绘制Total行文字内容(与前两个表格相同) currentX = tableStartX for colIdx, cell := range calculateTotalRow(tableDataThree) { pdf.SetXY(currentX, thirdTotalRowY+1) pdf.CellWithOption(&gopdf.Rect{H: rowHeight, W: colWidths[colIdx]}, cell, option) currentX += colWidths[colIdx] } // 绘制Total行的边框线 pdf.Line(tableStartX, thirdTotalRowY, tableStartX, thirdTotalRowY+rowHeight) pdf.Line(tableStartX+colWidths[0], thirdTotalRowY, tableStartX+colWidths[0], thirdTotalRowY+rowHeight) pdf.Line(tableStartX+colWidths[0]+colWidths[1], thirdTotalRowY, tableStartX+colWidths[0]+colWidths[1], thirdTotalRowY+rowHeight) pdf.Line(tableStartX, thirdTotalRowY, tableStartX+colWidths[0]+colWidths[1], thirdTotalRowY) pdf.Line(tableStartX, thirdTotalRowY+rowHeight, tableStartX+colWidths[0]+colWidths[1], thirdTotalRowY+rowHeight) // 保存PDF文件 beginTime := time.Now().UnixNano() pdf.WritePdf(fmt.Sprintf(`./authfile/%v.pdf`, beginTime)) // pdf.WritePdf(fmt.Sprintf(`D:\\deescloud\\deesCloudServer\\authfile\\%v.pdf`, beginTime)) filename = strconv.FormatInt(beginTime, 10) return } func get_srr_event_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_srr_event recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_srr_event_req json.Unmarshal(reqdata, &req) var resp get_srr_event_resp resp.Data = get_srr_event_info_en(req.OpUser, req.Wellname) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_srr_event recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_srr_event(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_srr_event recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_srr_event_req json.Unmarshal(reqdata, &req) var resp get_srr_event_resp resp.Data = get_srr_event_info(req.OpUser, req.Wellname) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_srr_event recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_srr_event_info_en(user string, wellname string) (resp []Srr_event) { ps_info := get_ps_info(user) db, err := getWellDBName(wellname) if err != nil { logs.Error(fmt.Sprintf(`get_srr_event_info get db err:%s`, err.Error())) return } conn, err := getOdbcConn(db) if err != nil { return } defer conn.Close() var data []Srr_event var cnt int sel_sql := fmt.Sprintf(`select distinct [6823],[6824] FROM [PUMPSTATUS] order by [6823] desc`) rows, err := conn.Query(sel_sql) if err == nil { for rows.Next() { var v Srr_event if err = rows.Scan(&v.Bt, &v.Event_name); err != nil { logs.Error(fmt.Sprintf(`get_srr_event_info scan upload err:%s`, err.Error())) } else { if len(v.Bt) >= 19 { v.Bt = v.Bt[:10] + " " + v.Bt[11:19] v.Bt = do_time_by_ps(v.Bt, ps_info) } if v.Event_name == "0" { v.Event_name = "stop pump" } else if v.Event_name == "1" { v.Event_name = "pump on" } //fmt.Println(cnt, data) if cnt > 0 { v.Et = data[cnt-1].Bt } data = append(data, v) cnt++ } } rows.Close() } resp = data return } func get_srr_event_info(user string, wellname string) (resp []Srr_event) { ps_info := get_ps_info(user) db, err := getWellDBName(wellname) if err != nil { logs.Error(fmt.Sprintf(`get_srr_event_info get db err:%s`, err.Error())) return } conn, err := getOdbcConn(db) if err != nil { return } defer conn.Close() var data []Srr_event var cnt int sel_sql := fmt.Sprintf(`select distinct [6823],[6824] FROM [PUMPSTATUS] order by [6823] desc`) rows, err := conn.Query(sel_sql) if err == nil { for rows.Next() { var v Srr_event if err = rows.Scan(&v.Bt, &v.Event_name); err != nil { logs.Error(fmt.Sprintf(`get_srr_event_info scan upload err:%s`, err.Error())) } else { if len(v.Bt) >= 19 { v.Bt = v.Bt[:10] + " " + v.Bt[11:19] v.Bt = do_time_by_ps(v.Bt, ps_info) } if v.Event_name == "0" { v.Event_name = "停泵" } else if v.Event_name == "1" { v.Event_name = "开泵" } //fmt.Println(cnt, data) if cnt > 0 { v.Et = data[cnt-1].Bt } data = append(data, v) cnt++ } } rows.Close() } resp = data return } func get_srr_state(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_srr_state recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_srr_state_req json.Unmarshal(reqdata, &req) var resp get_srr_state_resp resp.Data = get_srr_state_info(req.OpUser, req.Wellname) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_srr_state recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } // func get_srr_state_info(user string, wellname string) (resp []Srr_state) { // ps_info := get_ps_info(user) // db, err := getWellDBName(wellname) // if err != nil { // logs.Error(fmt.Sprintf(`get_srr_state_info get db err:%s`, err.Error())) // return // } // conn, err := getOdbcConn(db) // if err != nil { // return // } // defer conn.Close() // var data []Srr_state // var cnt int // sel_sql := fmt.Sprintf(`select distinct [5202],[5203],[5205],[5219] FROM [EQUIPMENTRECORDS] order by [5219] desc`) // rows, err := conn.Query(sel_sql) // if err == nil { // for rows.Next() { // var v Srr_state // if err = rows.Scan(&v.Servicer, &v.State, &v.Drilling_time, &v.Bt); err != nil { // logs.Error(fmt.Sprintf(`get_srr_state_info scan upload err:%s`, err.Error())) // } else { // if len(v.Bt) >= 19 { // v.Bt = v.Bt[:10] + " " + v.Bt[11:19] // v.Bt = do_time_by_ps(v.Bt, ps_info) // } // if v.Drilling_time == "0" { // v.Drilling_time = "" // } // //fmt.Println(cnt, data) // //将时间设为上一条时间、2025-06-17,去掉这个逻辑。 // if cnt > 0 { // v.Et = data[cnt-1].Bt // } // data = append(data, v) // cnt++ // } // } // rows.Close() // } // resp = data // return // } func get_srr_state_info(user string, wellname string) (resp []Srr_state) { ps_info := get_ps_info(user) db, err := getWellDBName(wellname) if err != nil { logs.Error(fmt.Sprintf(`get_srr_state_info get db err:%s`, err.Error())) return } conn, err := getOdbcConn(db) if err != nil { return } defer conn.Close() var data []Srr_state var cnt int sel_sql := fmt.Sprintf(`SELECT [5202], [5203], [5205], MIN([5219]) AS sd, MAX([5219]) AS ed FROM [EQUIPMENTRECORDS] GROUP BY [5202], [5203], [5205] ORDER BY MAX([5219]) DESC`) rows, err := conn.Query(sel_sql) if err == nil { for rows.Next() { var v Srr_state if err = rows.Scan(&v.Servicer, &v.State, &v.Drilling_time, &v.Bt, &v.Et); err != nil { logs.Error(fmt.Sprintf(`get_srr_state_info scan upload err:%s`, err.Error())) } else { if len(v.Bt) >= 19 { v.Bt = v.Bt[:10] + " " + v.Bt[11:19] v.Bt = do_time_by_ps(v.Bt, ps_info) } if len(v.Et) >= 19 { v.Et = v.Et[:10] + " " + v.Et[11:19] v.Et = do_time_by_ps(v.Et, ps_info) } if v.Drilling_time == "0" { v.Drilling_time = "" } //fmt.Println(cnt, data) //将时间设为上一条时间、2025-06-17,去掉这个逻辑。 // if cnt > 0 { // v.Et = data[cnt-1].Bt // } data = append(data, v) cnt++ } } rows.Close() } resp = data return } func get_location_fromip(ip string) (location string) { searcher, err := xdb.NewWithBuffer(cBuff) if err != nil { fmt.Printf("failed to create searcher: %s\n", err.Error()) return } defer searcher.Close() region, err := searcher.SearchByStr(ip) if err != nil { fmt.Printf("failed to SearchIP(%s): %s\n", ip, err) return } // 分割字符串,并过滤掉 "0" parts := strings.Split(region, "|") var filteredParts []string for _, part := range parts { if part != "0" && part != "" { // 过滤掉 "0" 和空字符串 filteredParts = append(filteredParts, part) } } // 重新组合成 "国家|省份|城市" 格式 location = strings.Join(filteredParts, "|") return location = region return } func get_srr_baseinfo(wellname string) (resp get_srr_base_resp) { sel_sql := fmt.Sprintf(`select COALESCE([IPADDR],''),COALESCE([ClOUDACCOUNT],'') FROM [WellInformation] where [WELLNameSource]='%s' `, wellname) rows, err := sqlConn.Query(sel_sql) if err == nil { for rows.Next() { if err = rows.Scan(&resp.Ip, &resp.Uploadname); err != nil { logs.Error(fmt.Sprintf(`get_srr_baseinfo scan upload err:%s`, err.Error())) } } rows.Close() } resp.Wellname = wellname if resp.Ip != "" { ip_index := strings.Index(resp.Ip, ":") resp.Location = get_location_fromip(resp.Ip[:ip_index]) } return } func get_vibration_baseinfo(wellname string, opUser string) (resp get_vibration_resp) { sel_sql := fmt.Sprintf(`select WELLName FROM [WellInformation] where [WELLNameSource]='%s' `, wellname) rows, err := sqlConn.Query(sel_sql) if err == nil { for rows.Next() { if err = rows.Scan(&resp.WellNameSource); err != nil { fmt.Println("Scan 错误:", err) } } rows.Close() } // 查询工程服务数据 result_sql := fmt.Sprintf(`select data FROM [analysis_result_engineerin_service] where [wellname]='%s'`, wellname) resultRows := sqlConn.QueryRow(result_sql) var jsonStr string if err := resultRows.Scan(&jsonStr); err == nil { // 解析JSON数据到临时map var data map[string]interface{} if err := json.Unmarshal([]byte(jsonStr), &data); err == nil { // 提取DrillingCrewName并赋值给WellTeam if drillingCrewName, ok := data["DrillingCrewName"].(string); ok { resp.WellTeam = drillingCrewName } } } resp.Wellname = wellname resp.Uploadname = wellname resp.OpUser = opUser return resp } func get_srr_base(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_srr_baseinfo recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_srr_base_req json.Unmarshal(reqdata, &req) var resp get_srr_base_resp resp = get_srr_baseinfo(req.Wellname) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_srr_baseinfo recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_cmr_pdf_page_cnt_en(opuser string, cmr_info Cmr, data1 []Cmr_input_record_ex, data2 []Cmr_input_record_ex, data3 []Cmr_input_record_ex) (page_cnt int) { ps_info := get_ps_info(opuser) //W: 595, H: 842 page_W := gopdf.PageSizeA4.W page_H := gopdf.PageSizeA4.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 var h_span float64 = 150 page_context_H := page_H - margin_top var one_cm float64 = page_W / float64(21) page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4.W}, "Construction Management Report", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4.W / 2}, fmt.Sprintf("Report Time:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4.W / 2) - margin_left}, fmt.Sprintf(`Report NO.:%s+A0001`, cmr_info.Wellname), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4.W-margin_left, margin_top+60) //cal total pagenum var cur_page int = 1 var total_page int = 1 //total_page = get_cmr_pdf_page_cnt_en(opuser, cmr_info, data1, data2, data3) //fmt.Println("施工管理报告总页码:", total_page) var base float64 = margin_top + 60 base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Working hours:%sh Waiting hours:%sh`, cmr_info.Total_work_time, cmr_info.Total_wait_time)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Rig crew leader:%s Name of safety officer:%s`, cmr_info.Well_captain, cmr_info.Safety_officer_name)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Phone:%s Latitude and longitude:%s`, cmr_info.Safety_officer_phone, cmr_info.Lon_lat)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Phone of hospital:%s Phone of fire station:%s`, cmr_info.Hosp_phone, cmr_info.Fire_phone)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Phone of police station:%s Location:%s`, cmr_info.Police_phone, cmr_info.Gl)) base += span pdf.SetXY(margin_left, base) pdf.Text("Instrument Management Information:") for i := 0; i < len(cmr_info.Device_data); i++ { v := cmr_info.Device_data[i] s := fmt.Sprintf(`Instrument series No.:%s Instrument serial No.:%s Total working hours:%sh Location:%s Person in charge:%s`, v.Sid, v.Iid, v.Accrued_work_time, v.Location, v.Director) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2.5*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1.5, base) } else { pdf.SetXY(margin_left*1.5, base) } pdf.Text(fmt.Sprintf(`%s`, context[j])) } } base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text("Equipment and usage of solid control equipment:") context, _ := pdf.SplitTextWithWordWrap(cmr_info.Well_device, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1.5, base) } else { pdf.SetXY(margin_left*1.5, base) } pdf.Text(fmt.Sprintf(`%s`, context[j])) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text("Design Data:") base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Wellhead coordinates:(X)%s;(Y)%s`, cmr_info.X, cmr_info.Y)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Geomagnetic parameters:Magnetic declination:%s°;DIP:%s°;MT:%sμT`, cmr_info.Declination, cmr_info.DIP, cmr_info.MT)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Planned closure azimuth(CLsA):%s °; Planned TVD:%sm`, cmr_info.CLsA, cmr_info.TVD)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Planned measured depth:%sm; Planned max inclination:%s ° `, cmr_info.Design_depth, cmr_info.Design_deviation)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Planned horizontal section length:%sm`, cmr_info.Design_hlength)) base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text("Geological Information:") s := fmt.Sprintf(`Target layer:%s`, cmr_info.Target_stratum) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`%s`, s)) /*context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for i := 0; i < len(context); i++ { base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`%s`, context[i])) }*/ base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Reservoir thickness:%s`, cmr_info.Reservoir_thickness)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Range of gamma(API):%s`, cmr_info.Gamma_range)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Formation resistivity:%s`, cmr_info.CHFR)) base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //钻次 for i := 0; i < len(cmr_info.Drilling_data); i++ { dv := cmr_info.Drilling_data[i] base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`RIH Times%s`, dv.Drilling_num)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Service staff:%s`, dv.Servicer)) //s := "钻具组合:LHE5616C(003)-LHE5614(021)-LHE5626B(AZ)-LHE5613(电池组)-LHE6514(363)-LHE5613(电池组)-LHE6514(506)-LHE5618(AN)-LHE6514(531)-LHE7315F(AA)" s := fmt.Sprintf(`BHA: %s`, dv.BHA) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2.5*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } s = fmt.Sprintf(`Tool assembly: %s`, dv.ToolCombination) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2.5*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Waiting hours:%sh In Hole hours:%sh`, dv.Wait_time, dv.Work_time)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Depth when tool entry:%sm Depth when tool outlet:%sm`, dv.In_depth, dv.Out_depth)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Current Total Drilled Footage:%sm`, dv.Footage)) s = fmt.Sprintf(`Reason of POOH:%s`, dv.Reason) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } s = fmt.Sprintf(`Next steps plan:%s`, dv.Next_step) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } } if len(cmr_info.Drilling_data) > 0 { base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) } //工况信息 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Working Condition Information:`)) cmr_info.T1 = do_time_by_ps(cmr_info.T1, ps_info) cmr_info.T2 = do_time_by_ps(cmr_info.T2, ps_info) cmr_info.T3 = do_time_by_ps(cmr_info.T3, ps_info) cmr_info.T4 = do_time_by_ps(cmr_info.T4, ps_info) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } s = fmt.Sprintf(`%s Well Depth Max:%sm`, cmr_info.T1, cmr_info.Max_depth) pdf.Text(s) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } s = fmt.Sprintf(`%s Max. TVD:%sm`, cmr_info.T2, cmr_info.Max_tvd) pdf.Text(s) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } maxTemp, _ := decimal.NewFromFloat(float64(cmr_info.Max_temp)).Round(2).Float64() if ps_info.R2 == "2" { maxTemp, _ = decimal.NewFromFloat(float64(1.8*maxTemp + 32)).Round(2).Float64() } cmr_info.Max_temp = float32(maxTemp) if ps_info.R2 == "1" { s = fmt.Sprintf(`%s Max. Temperature:%v℃`, cmr_info.T3, cmr_info.Max_temp) } else { s = fmt.Sprintf(`%s Max. Temperature:%v℉`, cmr_info.T3, cmr_info.Max_temp) } pdf.Text(s) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } s = fmt.Sprintf(`%s Max. Vibration:%sg`, cmr_info.T4, cmr_info.Max_vibrate) pdf.Text(s) base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //每日录入信息 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Daily Input Of Information:`)) if len(data1) > 0 { if base+span+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+200, base, margin_left+200, base+span) pdf.Line(margin_left+260, base, margin_left+260, base+span) pdf.Line(margin_left+320, base, margin_left+320, base+span) pdf.Line(margin_left+520, base, margin_left+520, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "Time", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, "MD(m)", option) pdf.SetXY(margin_left+200, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, "TVD(m)", option) pdf.SetXY(margin_left+260, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, "INC(°)", option) pdf.SetXY(margin_left+320, base) if ps_info.R2 == "1" { pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, "Circulation Temperature(℃)", option) } else { pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, "Circulation Temperature(℉)", option) } base += span pdf.Line(margin_left, base, margin_left+520, base) } for i := 0; i < len(data1); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+200, base, margin_left+200, base+span) pdf.Line(margin_left+260, base, margin_left+260, base+span) pdf.Line(margin_left+320, base, margin_left+320, base+span) pdf.Line(margin_left+520, base, margin_left+520, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "Time", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, "MD(m)", option) pdf.SetXY(margin_left+200, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, "TVD(m)", option) pdf.SetXY(margin_left+260, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, "INC(°)", option) pdf.SetXY(margin_left+320, base) if ps_info.R2 == "1" { pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, "Circulation Temperature(℃)", option) } else { pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, "Circulation Temperature(℉)", option) } base += span pdf.Line(margin_left, base, margin_left+520, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+200, base, margin_left+200, base+span) pdf.Line(margin_left+260, base, margin_left+260, base+span) pdf.Line(margin_left+320, base, margin_left+320, base+span) pdf.Line(margin_left+520, base, margin_left+520, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) //data1[i].Time = do_time_by_ps(data1[i].Time, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, data1[i].Time, option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, data1[i].V1, option) pdf.SetXY(margin_left+200, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, data1[i].V2, option) pdf.SetXY(margin_left+260, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, data1[i].V3, option) pdf.SetXY(margin_left+320, base) f, _ := strconv.ParseFloat(data1[i].V4, 64) f, _ = decimal.NewFromFloat(float64(f)).Round(2).Float64() if ps_info.R2 == "2" { f, _ = decimal.NewFromFloat(float64(1.8*f + 32)).Round(2).Float64() } pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf("%.02f", f), option) base += span pdf.Line(margin_left, base, margin_left+520, base) } if len(data2) > 0 { if base+span+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+225, base, margin_left+225, base+span) pdf.Line(margin_left+280, base, margin_left+280, base+span) pdf.Line(margin_left+350, base, margin_left+350, base+span) pdf.Line(margin_left+520, base, margin_left+520, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "Time", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 85}, "Vibration(g)", option) pdf.SetXY(margin_left+225, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 55}, "WOB(kN)", option) pdf.SetXY(margin_left+280, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 70}, "ROP(r/min)", option) pdf.SetXY(margin_left+350, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 170}, "Length of horizontal(m)", option) base += span pdf.Line(margin_left, base, margin_left+520, base) } for i := 0; i < len(data2); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+225, base, margin_left+225, base+span) pdf.Line(margin_left+280, base, margin_left+280, base+span) pdf.Line(margin_left+350, base, margin_left+350, base+span) pdf.Line(margin_left+520, base, margin_left+520, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "Time", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 85}, "Vibration(g)", option) pdf.SetXY(margin_left+225, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 55}, "WOB(kN)", option) pdf.SetXY(margin_left+280, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 70}, "ROP(r/min)", option) pdf.SetXY(margin_left+350, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 170}, "Length of horizontal(m)", option) base += span pdf.Line(margin_left, base, margin_left+520, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+225, base, margin_left+225, base+span) pdf.Line(margin_left+280, base, margin_left+280, base+span) pdf.Line(margin_left+350, base, margin_left+350, base+span) pdf.Line(margin_left+520, base, margin_left+520, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) //data2[i].Time = do_time_by_ps(data2[i].Time, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, data2[i].Time, option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 85}, data2[i].V1, option) pdf.SetXY(margin_left+225, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 55}, data2[i].V2, option) pdf.SetXY(margin_left+280, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 70}, data2[i].V3, option) pdf.SetXY(margin_left+350, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 170}, data2[i].V4, option) base += span pdf.Line(margin_left, base, margin_left+520, base) } if len(data3) > 0 { if base+span+span+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span+span) pdf.Line(margin_left+140, base, margin_left+140, base+span+span) pdf.Line(margin_left+230, base, margin_left+230, base+span+span) pdf.Line(margin_left+330, base, margin_left+330, base+span+span) pdf.Line(margin_left+420, base, margin_left+420, base+span+span) pdf.Line(margin_left+520, base, margin_left+520, base+span+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "Time", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "Mud Density", option) pdf.SetXY(margin_left+140, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "(g/cm^3)", option) pdf.SetXY(margin_left+230, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "Mud viscosity", option) pdf.SetXY(margin_left+230, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "(s)", option) pdf.SetXY(margin_left+330, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "Flow rate", option) pdf.SetXY(margin_left+330, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "(L/s)", option) pdf.SetXY(margin_left+420, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "Sand content", option) pdf.SetXY(margin_left+420, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "(%)", option) base += span + span pdf.Line(margin_left, base, margin_left+520, base) } for i := 0; i < len(data3); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span+span) pdf.Line(margin_left+140, base, margin_left+140, base+span+span) pdf.Line(margin_left+230, base, margin_left+230, base+span+span) pdf.Line(margin_left+330, base, margin_left+330, base+span+span) pdf.Line(margin_left+420, base, margin_left+420, base+span+span) pdf.Line(margin_left+520, base, margin_left+520, base+span+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "Time", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "Mud Density", option) pdf.SetXY(margin_left+140, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "(g/cm^3)", option) pdf.SetXY(margin_left+230, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "Mud viscosity", option) pdf.SetXY(margin_left+230, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "(s)", option) pdf.SetXY(margin_left+330, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "Flow rate", option) pdf.SetXY(margin_left+330, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "(L/s)", option) pdf.SetXY(margin_left+420, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "Sand content", option) pdf.SetXY(margin_left+420, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "(%)", option) base += span + span pdf.Line(margin_left, base, margin_left+520, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+230, base, margin_left+230, base+span) pdf.Line(margin_left+330, base, margin_left+330, base+span) pdf.Line(margin_left+420, base, margin_left+420, base+span) pdf.Line(margin_left+520, base, margin_left+520, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) //data3[i].Time = do_time_by_ps(data3[i].Time, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, data3[i].Time, option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, data3[i].V1, option) pdf.SetXY(margin_left+230, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, data3[i].V2, option) pdf.SetXY(margin_left+330, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, data3[i].V3, option) pdf.SetXY(margin_left+420, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, data3[i].V4, option) base += span pdf.Line(margin_left, base, margin_left+520, base) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //下步工况 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Next Working Condition:`)) context, _ = pdf.SplitTextWithWordWrap(cmr_info.Next_state, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //完钻信息 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Drilling Completion Information:`)) s = fmt.Sprintf(`Length of horizontal sections:%sm Total working time of the instrument:%sh Total Footage:%sm Drilling Rate:%s%%`, cmr_info.Hlength, cmr_info.Tool_work_time, cmr_info.Total_footage, cmr_info.Rate) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Drilling Completion Summary:`)) context, _ = pdf.SplitTextWithWordWrap(cmr_info.Well_report, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //参考信息 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Reference Information:`)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`IP+Port:%s`, cmr_info.IP)) pdf.SetXY(margin_left+(1.5*h_span), base) pdf.Text(fmt.Sprintf(`area:%s`, cmr_info.IP_addr)) for i := 0; i < len(cmr_info.Refer_Drilling_data); i++ { rv := cmr_info.Refer_Drilling_data[i] base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`RIH Times%s`, rv.Drilling_num)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Service staff:%s`, rv.Servicer)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Waiting hours:%sh`, rv.Wait_time)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`In Hole hours:%sh`, rv.Work_time)) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Upload Account:%s`, cmr_info.Upload_user)) pdf.SetXY(page_W/2-(1*margin_left), base) pdf.Text(fmt.Sprintf(`Print Account:%s`, opuser)) pdf.SetXY(page_W-(2*margin_left), base) pdf.Text(fmt.Sprintf(`V1.0.0`)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) page_cnt = cur_page return } func get_cmr_pdf_page_cnt(opuser string, cmr_info Cmr, data1 []Cmr_input_record_ex, data2 []Cmr_input_record_ex, data3 []Cmr_input_record_ex) (page_cnt int) { ps_info := get_ps_info(opuser) //W: 595, H: 842 page_W := gopdf.PageSizeA4.W page_H := gopdf.PageSizeA4.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 var h_span float64 = 150 page_context_H := page_H - margin_top var one_cm float64 = page_W / float64(21) page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4.W}, "施工管理报告", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4.W / 2}, fmt.Sprintf("报告时间:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4.W / 2) - margin_left}, fmt.Sprintf(`报告编号:%s+A0001`, cmr_info.Wellname), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4.W-margin_left, margin_top+60) //cal total pagenum var cur_page int = 1 var total_page int = 1 //total_page = get_cmr_pdf_page_cnt(opuser, cmr_info, data1, data2, data3) //fmt.Println("施工管理报告总页码:", total_page) var base float64 = margin_top + 60 base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`工作时长:%sh`, cmr_info.Total_work_time)) pdf.SetXY(margin_left+h_span, base) pdf.Text(fmt.Sprintf(`等待时长:%sh`, cmr_info.Total_wait_time)) pdf.SetXY(margin_left+(2*h_span), base) pdf.Text(fmt.Sprintf(`井队长:%s`, cmr_info.Well_captain)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`安全员姓名:%s`, cmr_info.Safety_officer_name)) pdf.SetXY(margin_left+h_span, base) pdf.Text(fmt.Sprintf(`电话:%s`, cmr_info.Safety_officer_phone)) pdf.SetXY(margin_left+(2*h_span), base) pdf.Text(fmt.Sprintf(`经纬度:%s`, cmr_info.Lon_lat)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`医院电话:%s`, cmr_info.Hosp_phone)) pdf.SetXY(margin_left+h_span, base) pdf.Text(fmt.Sprintf(`消防电话:%s`, cmr_info.Fire_phone)) pdf.SetXY(margin_left+(2*h_span), base) pdf.Text(fmt.Sprintf(`民警电话:%s`, cmr_info.Police_phone)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`地理位置:%s`, cmr_info.Gl)) base += span pdf.SetXY(margin_left, base) pdf.Text("仪器管理信息:") for i := 0; i < len(cmr_info.Device_data); i++ { v := cmr_info.Device_data[i] s := fmt.Sprintf(`仪器系列号:%s 仪器编码:%s 出厂累计工时:%sh 所在地:%s 负责人:%s`, v.Sid, v.Iid, v.Accrued_work_time, v.Location, v.Director) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2.5*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1.5, base) } else { pdf.SetXY(margin_left*1.5, base) } pdf.Text(fmt.Sprintf(`%s`, context[j])) } } base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text("井队固控设备配备和使用情况:") context, _ := pdf.SplitTextWithWordWrap(cmr_info.Well_device, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1.5, base) } else { pdf.SetXY(margin_left*1.5, base) } pdf.Text(fmt.Sprintf(`%s`, context[j])) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text("设计数据:") base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`井口坐标:(X)%s;(Y)%s`, cmr_info.X, cmr_info.Y)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`地磁参数:磁偏角:%s°;磁倾角:%s°;磁场强度:%sμT`, cmr_info.Declination, cmr_info.DIP, cmr_info.MT)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`设计闭合方位(CLsA):%s °; 设计垂深:%sm;设计井深:%sm`, cmr_info.CLsA, cmr_info.TVD, cmr_info.Design_depth)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`设计最大井斜:%s ° 设计水平段长度:%sm`, cmr_info.Design_deviation, cmr_info.Design_hlength)) base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text("地质信息:") s := fmt.Sprintf(`目的层:%s`, cmr_info.Target_stratum) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`%s`, s)) /*context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for i := 0; i < len(context); i++ { base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`%s`, context[i])) }*/ base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`储层厚度:%s`, cmr_info.Reservoir_thickness)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`伽马范围:%s`, cmr_info.Gamma_range)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`地层电阻率:%s`, cmr_info.CHFR)) base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //钻次 for i := 0; i < len(cmr_info.Drilling_data); i++ { dv := cmr_info.Drilling_data[i] base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`钻次%s`, dv.Drilling_num)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`人工:%s`, dv.Servicer)) //s := "钻具组合:LHE5616C(003)-LHE5614(021)-LHE5626B(AZ)-LHE5613(电池组)-LHE6514(363)-LHE5613(电池组)-LHE6514(506)-LHE5618(AN)-LHE6514(531)-LHE7315F(AA)" s := fmt.Sprintf(`钻具组合:%s`, dv.BHA) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2.5*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } s = fmt.Sprintf(`仪器组合:%s`, dv.ToolCombination) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2.5*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`等待时长:%sh`, dv.Wait_time)) pdf.SetXY(margin_left+h_span, base) pdf.Text(fmt.Sprintf(`入井时长:%sh`, dv.Work_time)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`入井井深:%sm`, dv.In_depth)) pdf.SetXY(margin_left+h_span, base) pdf.Text(fmt.Sprintf(`出井井深:%sm`, dv.Out_depth)) pdf.SetXY(margin_left+(2*h_span), base) pdf.Text(fmt.Sprintf(`本钻次进尺:%sm`, dv.Footage)) s = fmt.Sprintf(`起钻原因:%s`, dv.Reason) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } s = fmt.Sprintf(`下一步计划:%s`, dv.Next_step) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } } if len(cmr_info.Drilling_data) > 0 { base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) } //工况信息 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`工况信息:`)) cmr_info.T1 = do_time_by_ps(cmr_info.T1, ps_info) cmr_info.T2 = do_time_by_ps(cmr_info.T2, ps_info) cmr_info.T3 = do_time_by_ps(cmr_info.T3, ps_info) cmr_info.T4 = do_time_by_ps(cmr_info.T4, ps_info) s = fmt.Sprintf(`%s 最大井深:%sm %s 最大垂深:%sm`, cmr_info.T1, cmr_info.Max_depth, cmr_info.T2, cmr_info.Max_tvd) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } maxTemp, _ := decimal.NewFromFloat(float64(cmr_info.Max_temp)).Round(2).Float64() if ps_info.R2 == "2" { maxTemp, _ = decimal.NewFromFloat(float64(1.8*maxTemp + 32)).Round(2).Float64() } cmr_info.Max_temp = float32(maxTemp) if ps_info.R2 == "1" { s = fmt.Sprintf(`%s 最高温度:%v℃ %s 最大振动:%sg`, cmr_info.T3, cmr_info.Max_temp, cmr_info.T4, cmr_info.Max_vibrate) } else { s = fmt.Sprintf(`%s 最高温度:%v℉ %s 最大振动:%sg`, cmr_info.T3, cmr_info.Max_temp, cmr_info.T4, cmr_info.Max_vibrate) } context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //每日录入信息 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`每日录入信息:`)) if len(data1) > 0 { if base+span+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+215, base, margin_left+215, base+span) pdf.Line(margin_left+305, base, margin_left+305, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "时间", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, "测深(m)", option) pdf.SetXY(margin_left+215, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "垂深(m)", option) pdf.SetXY(margin_left+305, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "井斜(°)", option) pdf.SetXY(margin_left+405, base) if ps_info.R2 == "1" { pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, "循环温度(℃)", option) } else { pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, "循环温度(℉)", option) } base += span pdf.Line(margin_left, base, margin_left+505, base) } for i := 0; i < len(data1); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+215, base, margin_left+215, base+span) pdf.Line(margin_left+305, base, margin_left+305, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "时间", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, "测深(m)", option) pdf.SetXY(margin_left+215, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "垂深(m)", option) pdf.SetXY(margin_left+305, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "井斜(°)", option) pdf.SetXY(margin_left+405, base) if ps_info.R2 == "1" { pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, "循环温度(℃)", option) } else { pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, "循环温度(℉)", option) } base += span pdf.Line(margin_left, base, margin_left+505, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+215, base, margin_left+215, base+span) pdf.Line(margin_left+305, base, margin_left+305, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) //data1[i].Time = do_time_by_ps(data1[i].Time, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, data1[i].Time, option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, data1[i].V1, option) pdf.SetXY(margin_left+215, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, data1[i].V2, option) pdf.SetXY(margin_left+305, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, data1[i].V3, option) pdf.SetXY(margin_left+405, base) f, _ := strconv.ParseFloat(data1[i].V4, 64) f, _ = decimal.NewFromFloat(float64(f)).Round(2).Float64() if ps_info.R2 == "2" { f, _ = decimal.NewFromFloat(float64(1.8*f + 32)).Round(2).Float64() } pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, fmt.Sprintf("%.02f", f), option) base += span pdf.Line(margin_left, base, margin_left+505, base) } if len(data2) > 0 { if base+span+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+215, base, margin_left+215, base+span) pdf.Line(margin_left+305, base, margin_left+305, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "时间", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, "振动值(g)", option) pdf.SetXY(margin_left+215, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "钻压值(kN)", option) pdf.SetXY(margin_left+305, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "钻速值(r/min)", option) pdf.SetXY(margin_left+405, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, "水平段长度(m)", option) base += span pdf.Line(margin_left, base, margin_left+505, base) } for i := 0; i < len(data2); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+215, base, margin_left+215, base+span) pdf.Line(margin_left+305, base, margin_left+305, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "时间", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, "振动值(g)", option) pdf.SetXY(margin_left+215, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "钻压值(kN)", option) pdf.SetXY(margin_left+305, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "钻速值(r/min)", option) pdf.SetXY(margin_left+405, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, "水平段长度(m)", option) base += span pdf.Line(margin_left, base, margin_left+505, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+215, base, margin_left+215, base+span) pdf.Line(margin_left+305, base, margin_left+305, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) //data2[i].Time = do_time_by_ps(data2[i].Time, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, data2[i].Time, option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, data2[i].V1, option) pdf.SetXY(margin_left+215, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, data2[i].V2, option) pdf.SetXY(margin_left+305, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, data2[i].V3, option) pdf.SetXY(margin_left+405, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, data2[i].V4, option) base += span pdf.Line(margin_left, base, margin_left+505, base) } if len(data3) > 0 { if base+span+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+250, base, margin_left+250, base+span) pdf.Line(margin_left+330, base, margin_left+330, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "时间", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 110}, "泥浆密度(g/cm^3)", option) pdf.SetXY(margin_left+250, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 80}, "泥浆粘度(s)", option) pdf.SetXY(margin_left+330, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, "排量(L/s)", option) pdf.SetXY(margin_left+405, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "泥浆含沙量(%)", option) base += span pdf.Line(margin_left, base, margin_left+505, base) } for i := 0; i < len(data3); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+250, base, margin_left+250, base+span) pdf.Line(margin_left+330, base, margin_left+330, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "时间", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 110}, "泥浆密度(g/cm^3)", option) pdf.SetXY(margin_left+250, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 80}, "泥浆粘度(s)", option) pdf.SetXY(margin_left+330, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, "排量(L/s)", option) pdf.SetXY(margin_left+405, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "泥浆含沙量(%)", option) base += span pdf.Line(margin_left, base, margin_left+505, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+250, base, margin_left+250, base+span) pdf.Line(margin_left+330, base, margin_left+330, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) //data3[i].Time = do_time_by_ps(data3[i].Time, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, data3[i].Time, option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 110}, data3[i].V1, option) pdf.SetXY(margin_left+250, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 80}, data3[i].V2, option) pdf.SetXY(margin_left+330, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, data3[i].V3, option) pdf.SetXY(margin_left+405, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, data3[i].V4, option) base += span pdf.Line(margin_left, base, margin_left+505, base) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //下步工况 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`下步工况:`)) context, _ = pdf.SplitTextWithWordWrap(cmr_info.Next_state, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //完钻信息 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`完钻/完工信息:`)) s = fmt.Sprintf(`实际水平段长度:%sm 仪器总工作时间(纯钻时间):%sh 累计进尺:%sm 钻遇率:%s%%`, cmr_info.Hlength, cmr_info.Tool_work_time, cmr_info.Total_footage, cmr_info.Rate) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`完钻总结:`)) context, _ = pdf.SplitTextWithWordWrap(cmr_info.Well_report, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //参考信息 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`参考信息:`)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`IP+端口:%s`, cmr_info.IP)) pdf.SetXY(margin_left+(1.5*h_span), base) pdf.Text(fmt.Sprintf(`地区:%s`, cmr_info.IP_addr)) for i := 0; i < len(cmr_info.Refer_Drilling_data); i++ { rv := cmr_info.Refer_Drilling_data[i] base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`钻次%s`, rv.Drilling_num)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`人工:%s`, rv.Servicer)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`待命时长:%sh`, rv.Wait_time)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`工作时长:%sh`, rv.Work_time)) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`上传账号:%s`, cmr_info.Upload_user)) pdf.SetXY(page_W/2-(1*margin_left), base) pdf.Text(fmt.Sprintf(`打印账号:%s`, opuser)) pdf.SetXY(page_W-(2*margin_left), base) pdf.Text(fmt.Sprintf(`V1.0.0`)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) page_cnt = cur_page return } func export_pdf_en(opuser string, cmr_info Cmr, data1 []Cmr_input_record_ex, data2 []Cmr_input_record_ex, data3 []Cmr_input_record_ex) (filename string) { ps_info := get_ps_info(opuser) //W: 595, H: 842 page_W := gopdf.PageSizeA4.W page_H := gopdf.PageSizeA4.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 var h_span float64 = 150 page_context_H := page_H - margin_top var one_cm float64 = page_W / float64(21) page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4.W}, "Construction Management Report", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4.W / 2}, fmt.Sprintf("Report Time:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4.W / 2) - margin_left}, fmt.Sprintf(`Report NO.:%s+A0001`, cmr_info.Wellname), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4.W-margin_left, margin_top+60) //cal total pagenum var cur_page int = 1 var total_page int = 1 total_page = get_cmr_pdf_page_cnt_en(opuser, cmr_info, data1, data2, data3) fmt.Println("施工管理报告总页码:", total_page) var base float64 = margin_top + 60 base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Working hours:%sh Waiting hours:%sh`, cmr_info.Total_work_time, cmr_info.Total_wait_time)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Rig crew leader:%s Name of safety officer:%s`, cmr_info.Well_captain, cmr_info.Safety_officer_name)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Phone:%s Latitude and longitude:%s`, cmr_info.Safety_officer_phone, cmr_info.Lon_lat)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Phone of hospital:%s Phone of fire station:%s`, cmr_info.Hosp_phone, cmr_info.Fire_phone)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Phone of police station:%s Location:%s`, cmr_info.Police_phone, cmr_info.Gl)) base += span pdf.SetXY(margin_left, base) pdf.Text("Instrument Management Information:") for i := 0; i < len(cmr_info.Device_data); i++ { v := cmr_info.Device_data[i] s := fmt.Sprintf(`Instrument series No.:%s Instrument serial No.:%s Total working hours:%sh Location:%s Person in charge:%s`, v.Sid, v.Iid, v.Accrued_work_time, v.Location, v.Director) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2.5*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1.5, base) } else { pdf.SetXY(margin_left*1.5, base) } pdf.Text(fmt.Sprintf(`%s`, context[j])) } } base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text("Equipment and usage of solid control equipment:") context, _ := pdf.SplitTextWithWordWrap(cmr_info.Well_device, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1.5, base) } else { pdf.SetXY(margin_left*1.5, base) } pdf.Text(fmt.Sprintf(`%s`, context[j])) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text("Design Data:") base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Wellhead coordinates:(X)%s;(Y)%s`, cmr_info.X, cmr_info.Y)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Geomagnetic parameters:Magnetic declination:%s°;DIP:%s°;MT:%sμT`, cmr_info.Declination, cmr_info.DIP, cmr_info.MT)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Planned closure azimuth(CLsA):%s °; Planned TVD:%sm`, cmr_info.CLsA, cmr_info.TVD)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Planned measured depth:%sm; Planned max inclination:%s ° `, cmr_info.Design_depth, cmr_info.Design_deviation)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Planned horizontal section length:%sm`, cmr_info.Design_hlength)) base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text("Geological Information:") s := fmt.Sprintf(`Target layer:%s`, cmr_info.Target_stratum) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`%s`, s)) /*context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for i := 0; i < len(context); i++ { base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`%s`, context[i])) }*/ base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Reservoir thickness:%s`, cmr_info.Reservoir_thickness)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Range of gamma(API):%s`, cmr_info.Gamma_range)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Formation resistivity:%s`, cmr_info.CHFR)) base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //钻次 for i := 0; i < len(cmr_info.Drilling_data); i++ { dv := cmr_info.Drilling_data[i] base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`RIH Times%s`, dv.Drilling_num)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Service staff:%s`, dv.Servicer)) //s := "钻具组合:LHE5616C(003)-LHE5614(021)-LHE5626B(AZ)-LHE5613(电池组)-LHE6514(363)-LHE5613(电池组)-LHE6514(506)-LHE5618(AN)-LHE6514(531)-LHE7315F(AA)" s := fmt.Sprintf(`BHA: %s`, dv.BHA) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2.5*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } s = fmt.Sprintf(`Tool assembly: %s`, dv.ToolCombination) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2.5*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Waiting hours:%sh In Hole hours:%sh`, dv.Wait_time, dv.Work_time)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Depth when tool entry:%sm Depth when tool outlet:%sm`, dv.In_depth, dv.Out_depth)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`Current Total Drilled Footage:%sm`, dv.Footage)) s = fmt.Sprintf(`Reason of POOH:%s`, dv.Reason) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } s = fmt.Sprintf(`Next steps plan:%s`, dv.Next_step) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } } if len(cmr_info.Drilling_data) > 0 { base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) } //工况信息 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Working Condition Information:`)) cmr_info.T1 = do_time_by_ps(cmr_info.T1, ps_info) cmr_info.T2 = do_time_by_ps(cmr_info.T2, ps_info) cmr_info.T3 = do_time_by_ps(cmr_info.T3, ps_info) cmr_info.T4 = do_time_by_ps(cmr_info.T4, ps_info) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } s = fmt.Sprintf(`%s Well Depth Max:%sm`, cmr_info.T1, cmr_info.Max_depth) pdf.Text(s) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } s = fmt.Sprintf(`%s Max. TVD:%sm`, cmr_info.T2, cmr_info.Max_tvd) pdf.Text(s) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } maxTemp, _ := decimal.NewFromFloat(float64(cmr_info.Max_temp)).Round(2).Float64() if ps_info.R2 == "2" { maxTemp, _ = decimal.NewFromFloat(float64(1.8*maxTemp + 32)).Round(2).Float64() } cmr_info.Max_temp = float32(maxTemp) if ps_info.R2 == "1" { s = fmt.Sprintf(`%s Max. Temperature:%v℃`, cmr_info.T3, cmr_info.Max_temp) } else { s = fmt.Sprintf(`%s Max. Temperature:%v℉`, cmr_info.T3, cmr_info.Max_temp) } pdf.Text(s) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } s = fmt.Sprintf(`%s Max. Vibration:%sg`, cmr_info.T4, cmr_info.Max_vibrate) pdf.Text(s) base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //每日录入信息 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Daily Input Of Information:`)) if len(data1) > 0 { if base+span+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+200, base, margin_left+200, base+span) pdf.Line(margin_left+260, base, margin_left+260, base+span) pdf.Line(margin_left+320, base, margin_left+320, base+span) pdf.Line(margin_left+520, base, margin_left+520, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "Time", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, "MD(m)", option) pdf.SetXY(margin_left+200, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, "TVD(m)", option) pdf.SetXY(margin_left+260, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, "INC(°)", option) pdf.SetXY(margin_left+320, base) if ps_info.R2 == "1" { pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, "Circulation Temperature(℃)", option) } else { pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, "Circulation Temperature(℉)", option) } base += span pdf.Line(margin_left, base, margin_left+520, base) } for i := 0; i < len(data1); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+200, base, margin_left+200, base+span) pdf.Line(margin_left+260, base, margin_left+260, base+span) pdf.Line(margin_left+320, base, margin_left+320, base+span) pdf.Line(margin_left+520, base, margin_left+520, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "Time", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, "MD(m)", option) pdf.SetXY(margin_left+200, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, "TVD(m)", option) pdf.SetXY(margin_left+260, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, "INC(°)", option) pdf.SetXY(margin_left+320, base) if ps_info.R2 == "1" { pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, "Circulation Temperature(℃)", option) } else { pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, "Circulation Temperature(℉)", option) } base += span pdf.Line(margin_left, base, margin_left+520, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+200, base, margin_left+200, base+span) pdf.Line(margin_left+260, base, margin_left+260, base+span) pdf.Line(margin_left+320, base, margin_left+320, base+span) pdf.Line(margin_left+520, base, margin_left+520, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) data1[i].Time = do_time_by_ps(data1[i].Time, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, data1[i].Time, option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, data1[i].V1, option) pdf.SetXY(margin_left+200, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, data1[i].V2, option) pdf.SetXY(margin_left+260, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 60}, data1[i].V3, option) pdf.SetXY(margin_left+320, base) f, _ := strconv.ParseFloat(data1[i].V4, 64) f, _ = decimal.NewFromFloat(float64(f)).Round(2).Float64() if ps_info.R2 == "2" { f, _ = decimal.NewFromFloat(float64(1.8*f + 32)).Round(2).Float64() } pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf("%.02f", f), option) base += span pdf.Line(margin_left, base, margin_left+520, base) } if len(data2) > 0 { if base+span+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+225, base, margin_left+225, base+span) pdf.Line(margin_left+280, base, margin_left+280, base+span) pdf.Line(margin_left+350, base, margin_left+350, base+span) pdf.Line(margin_left+520, base, margin_left+520, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "Time", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 85}, "Vibration(g)", option) pdf.SetXY(margin_left+225, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 55}, "WOB(kN)", option) pdf.SetXY(margin_left+280, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 70}, "ROP(r/min)", option) pdf.SetXY(margin_left+350, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 170}, "Length of horizontal(m)", option) base += span pdf.Line(margin_left, base, margin_left+520, base) } for i := 0; i < len(data2); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+225, base, margin_left+225, base+span) pdf.Line(margin_left+280, base, margin_left+280, base+span) pdf.Line(margin_left+350, base, margin_left+350, base+span) pdf.Line(margin_left+520, base, margin_left+520, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "Time", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 85}, "Vibration(g)", option) pdf.SetXY(margin_left+225, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 55}, "WOB(kN)", option) pdf.SetXY(margin_left+280, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 70}, "ROP(r/min)", option) pdf.SetXY(margin_left+350, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 170}, "Length of horizontal(m)", option) base += span pdf.Line(margin_left, base, margin_left+520, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+225, base, margin_left+225, base+span) pdf.Line(margin_left+280, base, margin_left+280, base+span) pdf.Line(margin_left+350, base, margin_left+350, base+span) pdf.Line(margin_left+520, base, margin_left+520, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) data2[i].Time = do_time_by_ps(data2[i].Time, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, data2[i].Time, option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 85}, data2[i].V1, option) pdf.SetXY(margin_left+225, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 55}, data2[i].V2, option) pdf.SetXY(margin_left+280, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 70}, data2[i].V3, option) pdf.SetXY(margin_left+350, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 170}, data2[i].V4, option) base += span pdf.Line(margin_left, base, margin_left+520, base) } if len(data3) > 0 { if base+span+span+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span+span) pdf.Line(margin_left+140, base, margin_left+140, base+span+span) pdf.Line(margin_left+230, base, margin_left+230, base+span+span) pdf.Line(margin_left+330, base, margin_left+330, base+span+span) pdf.Line(margin_left+420, base, margin_left+420, base+span+span) pdf.Line(margin_left+520, base, margin_left+520, base+span+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "Time", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "Mud Density", option) pdf.SetXY(margin_left+140, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "(g/cm^3)", option) pdf.SetXY(margin_left+230, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "Mud viscosity", option) pdf.SetXY(margin_left+230, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "(s)", option) pdf.SetXY(margin_left+330, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "Flow rate", option) pdf.SetXY(margin_left+330, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "(L/s)", option) pdf.SetXY(margin_left+420, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "Sand content", option) pdf.SetXY(margin_left+420, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "(%)", option) base += span + span pdf.Line(margin_left, base, margin_left+520, base) } for i := 0; i < len(data3); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span+span) pdf.Line(margin_left+140, base, margin_left+140, base+span+span) pdf.Line(margin_left+230, base, margin_left+230, base+span+span) pdf.Line(margin_left+330, base, margin_left+330, base+span+span) pdf.Line(margin_left+420, base, margin_left+420, base+span+span) pdf.Line(margin_left+520, base, margin_left+520, base+span+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "Time", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "Mud Density", option) pdf.SetXY(margin_left+140, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "(g/cm^3)", option) pdf.SetXY(margin_left+230, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "Mud viscosity", option) pdf.SetXY(margin_left+230, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "(s)", option) pdf.SetXY(margin_left+330, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "Flow rate", option) pdf.SetXY(margin_left+330, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "(L/s)", option) pdf.SetXY(margin_left+420, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "Sand content", option) pdf.SetXY(margin_left+420, base+span) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "(%)", option) base += span + span pdf.Line(margin_left, base, margin_left+520, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+520, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+230, base, margin_left+230, base+span) pdf.Line(margin_left+330, base, margin_left+330, base+span) pdf.Line(margin_left+420, base, margin_left+420, base+span) pdf.Line(margin_left+520, base, margin_left+520, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) data3[i].Time = do_time_by_ps(data3[i].Time, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, data3[i].Time, option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, data3[i].V1, option) pdf.SetXY(margin_left+230, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, data3[i].V2, option) pdf.SetXY(margin_left+330, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, data3[i].V3, option) pdf.SetXY(margin_left+420, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, data3[i].V4, option) base += span pdf.Line(margin_left, base, margin_left+520, base) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //下步工况 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Next Working Condition:`)) context, _ = pdf.SplitTextWithWordWrap(cmr_info.Next_state, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //完钻信息 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Drilling Completion Information:`)) s = fmt.Sprintf(`Length of horizontal sections:%sm Total working time of the instrument:%sh Total Footage:%sm Drilling Rate:%s%%`, cmr_info.Hlength, cmr_info.Tool_work_time, cmr_info.Total_footage, cmr_info.Rate) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Drilling Completion Summary:`)) context, _ = pdf.SplitTextWithWordWrap(cmr_info.Well_report, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //参考信息 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Reference Information:`)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`IP+Port:%s`, cmr_info.IP)) pdf.SetXY(margin_left+(1.5*h_span), base) pdf.Text(fmt.Sprintf(`area:%s`, cmr_info.IP_addr)) for i := 0; i < len(cmr_info.Refer_Drilling_data); i++ { rv := cmr_info.Refer_Drilling_data[i] base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`RIH Times%s`, rv.Drilling_num)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Service staff:%s`, rv.Servicer)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Waiting hours:%sh`, rv.Wait_time)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`In Hole hours:%sh`, rv.Work_time)) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Upload Account:%s`, cmr_info.Upload_user)) pdf.SetXY(page_W/2-(1*margin_left), base) pdf.Text(fmt.Sprintf(`Print Account:%s`, opuser)) pdf.SetXY(page_W-(2*margin_left), base) pdf.Text(fmt.Sprintf(`V1.0.0`)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ //save beginTime := time.Now().UnixNano() pdf.WritePdf(fmt.Sprintf(`./authfile/%v.pdf`, beginTime)) filename = strconv.FormatInt(beginTime, 10) return } func export_pdf(opuser string, cmr_info Cmr, data1 []Cmr_input_record_ex, data2 []Cmr_input_record_ex, data3 []Cmr_input_record_ex) (filename string) { ps_info := get_ps_info(opuser) //W: 595, H: 842 page_W := gopdf.PageSizeA4.W page_H := gopdf.PageSizeA4.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 var h_span float64 = 150 page_context_H := page_H - margin_top var one_cm float64 = page_W / float64(21) page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4.W}, "施工管理报告", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4.W / 2}, fmt.Sprintf("报告时间:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4.W / 2) - margin_left}, fmt.Sprintf(`报告编号:%s+A0001`, cmr_info.Wellname), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4.W-margin_left, margin_top+60) //cal total pagenum var cur_page int = 1 var total_page int = 1 total_page = get_cmr_pdf_page_cnt(opuser, cmr_info, data1, data2, data3) fmt.Println("施工管理报告总页码:", total_page) var base float64 = margin_top + 60 base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`工作时长:%sh`, cmr_info.Total_work_time)) pdf.SetXY(margin_left+h_span, base) pdf.Text(fmt.Sprintf(`等待时长:%sh`, cmr_info.Total_wait_time)) pdf.SetXY(margin_left+(2*h_span), base) pdf.Text(fmt.Sprintf(`井队长:%s`, cmr_info.Well_captain)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`安全员姓名:%s`, cmr_info.Safety_officer_name)) pdf.SetXY(margin_left+h_span, base) pdf.Text(fmt.Sprintf(`电话:%s`, cmr_info.Safety_officer_phone)) pdf.SetXY(margin_left+(2*h_span), base) pdf.Text(fmt.Sprintf(`经纬度:%s`, cmr_info.Lon_lat)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`医院电话:%s`, cmr_info.Hosp_phone)) pdf.SetXY(margin_left+h_span, base) pdf.Text(fmt.Sprintf(`消防电话:%s`, cmr_info.Fire_phone)) pdf.SetXY(margin_left+(2*h_span), base) pdf.Text(fmt.Sprintf(`民警电话:%s`, cmr_info.Police_phone)) base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`地理位置:%s`, cmr_info.Gl)) base += span pdf.SetXY(margin_left, base) pdf.Text("仪器管理信息:") for i := 0; i < len(cmr_info.Device_data); i++ { v := cmr_info.Device_data[i] s := fmt.Sprintf(`仪器系列号:%s 仪器编码:%s 出厂累计工时:%sh 所在地:%s 负责人:%s`, v.Sid, v.Iid, v.Accrued_work_time, v.Location, v.Director) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2.5*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1.5, base) } else { pdf.SetXY(margin_left*1.5, base) } pdf.Text(fmt.Sprintf(`%s`, context[j])) } } base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text("井队固控设备配备和使用情况:") context, _ := pdf.SplitTextWithWordWrap(cmr_info.Well_device, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1.5, base) } else { pdf.SetXY(margin_left*1.5, base) } pdf.Text(fmt.Sprintf(`%s`, context[j])) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text("设计数据:") base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`井口坐标:(X)%s;(Y)%s`, cmr_info.X, cmr_info.Y)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`地磁参数:磁偏角:%s°;磁倾角:%s°;磁场强度:%sμT`, cmr_info.Declination, cmr_info.DIP, cmr_info.MT)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`设计闭合方位(CLsA):%s °; 设计垂深:%sm;设计井深:%sm`, cmr_info.CLsA, cmr_info.TVD, cmr_info.Design_depth)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`设计最大井斜:%s ° 设计水平段长度:%sm`, cmr_info.Design_deviation, cmr_info.Design_hlength)) base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text("地质信息:") s := fmt.Sprintf(`目的层:%s`, cmr_info.Target_stratum) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`%s`, s)) /*context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for i := 0; i < len(context); i++ { base += span pdf.SetXY(margin_left, base) pdf.Text(fmt.Sprintf(`%s`, context[i])) }*/ base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`储层厚度:%s`, cmr_info.Reservoir_thickness)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`伽马范围:%s`, cmr_info.Gamma_range)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`地层电阻率:%s`, cmr_info.CHFR)) base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //钻次 for i := 0; i < len(cmr_info.Drilling_data); i++ { dv := cmr_info.Drilling_data[i] base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`钻次%s`, dv.Drilling_num)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`人工:%s`, dv.Servicer)) //s := "钻具组合:LHE5616C(003)-LHE5614(021)-LHE5626B(AZ)-LHE5613(电池组)-LHE6514(363)-LHE5613(电池组)-LHE6514(506)-LHE5618(AN)-LHE6514(531)-LHE7315F(AA)" s := fmt.Sprintf(`钻具组合:%s`, dv.BHA) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2.5*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } s = fmt.Sprintf(`仪器组合:%s`, dv.ToolCombination) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2.5*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1.5, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`等待时长:%sh`, dv.Wait_time)) pdf.SetXY(margin_left+h_span, base) pdf.Text(fmt.Sprintf(`入井时长:%sh`, dv.Work_time)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`入井井深:%sm`, dv.In_depth)) pdf.SetXY(margin_left+h_span, base) pdf.Text(fmt.Sprintf(`出井井深:%sm`, dv.Out_depth)) pdf.SetXY(margin_left+(2*h_span), base) pdf.Text(fmt.Sprintf(`本钻次进尺:%sm`, dv.Footage)) s = fmt.Sprintf(`起钻原因:%s`, dv.Reason) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } s = fmt.Sprintf(`下一步计划:%s`, dv.Next_step) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for i := 0; i < len(context); i++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } else { if i == 0 { pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left*1, base) } } pdf.Text(fmt.Sprintf(`%s`, context[i])) } } if len(cmr_info.Drilling_data) > 0 { base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) } //工况信息 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`工况信息:`)) cmr_info.T1 = do_time_by_ps(cmr_info.T1, ps_info) cmr_info.T2 = do_time_by_ps(cmr_info.T2, ps_info) cmr_info.T3 = do_time_by_ps(cmr_info.T3, ps_info) cmr_info.T4 = do_time_by_ps(cmr_info.T4, ps_info) s = fmt.Sprintf(`%s 最大井深:%sm %s 最大垂深:%sm`, cmr_info.T1, cmr_info.Max_depth, cmr_info.T2, cmr_info.Max_tvd) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } maxTemp, _ := decimal.NewFromFloat(float64(cmr_info.Max_temp)).Round(2).Float64() if ps_info.R2 == "2" { maxTemp, _ = decimal.NewFromFloat(float64(1.8*maxTemp + 32)).Round(2).Float64() } cmr_info.Max_temp = float32(maxTemp) if ps_info.R2 == "1" { s = fmt.Sprintf(`%s 最高温度:%v℃ %s 最大振动:%sg`, cmr_info.T3, cmr_info.Max_temp, cmr_info.T4, cmr_info.Max_vibrate) } else { s = fmt.Sprintf(`%s 最高温度:%v℉ %s 最大振动:%sg`, cmr_info.T3, cmr_info.Max_temp, cmr_info.T4, cmr_info.Max_vibrate) } context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`每日录入信息:`)) if len(data1) > 0 { if base+span+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+215, base, margin_left+215, base+span) pdf.Line(margin_left+305, base, margin_left+305, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "时间", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, "测深(m)", option) pdf.SetXY(margin_left+215, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "垂深(m)", option) pdf.SetXY(margin_left+305, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "井斜(°)", option) pdf.SetXY(margin_left+405, base) if ps_info.R2 == "1" { pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, "循环温度(℃)", option) } else { pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, "循环温度(℉)", option) } base += span pdf.Line(margin_left, base, margin_left+505, base) } for i := 0; i < len(data1); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+215, base, margin_left+215, base+span) pdf.Line(margin_left+305, base, margin_left+305, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "时间", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, "测深(m)", option) pdf.SetXY(margin_left+215, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "垂深(m)", option) pdf.SetXY(margin_left+305, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "井斜(°)", option) pdf.SetXY(margin_left+405, base) if ps_info.R2 == "1" { pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, "循环温度(℃)", option) } else { pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, "循环温度(℉)", option) } base += span pdf.Line(margin_left, base, margin_left+505, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+215, base, margin_left+215, base+span) pdf.Line(margin_left+305, base, margin_left+305, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) fmt.Println(data1[i].Time) data1[i].Time = do_time_by_ps(data1[i].Time, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, data1[i].Time, option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, data1[i].V1, option) pdf.SetXY(margin_left+215, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, data1[i].V2, option) pdf.SetXY(margin_left+305, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, data1[i].V3, option) pdf.SetXY(margin_left+405, base) f, _ := strconv.ParseFloat(data1[i].V4, 64) f, _ = decimal.NewFromFloat(float64(f)).Round(2).Float64() if ps_info.R2 == "2" { f, _ = decimal.NewFromFloat(float64(1.8*f + 32)).Round(2).Float64() } pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, fmt.Sprintf("%.02f", f), option) base += span pdf.Line(margin_left, base, margin_left+505, base) } if len(data2) > 0 { if base+span+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+215, base, margin_left+215, base+span) pdf.Line(margin_left+305, base, margin_left+305, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "时间", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, "振动值(g)", option) pdf.SetXY(margin_left+215, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "钻压值(kN)", option) pdf.SetXY(margin_left+305, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "钻速值(r/min)", option) pdf.SetXY(margin_left+405, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, "水平段长度(m)", option) base += span pdf.Line(margin_left, base, margin_left+505, base) } for i := 0; i < len(data2); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+215, base, margin_left+215, base+span) pdf.Line(margin_left+305, base, margin_left+305, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "时间", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, "振动值(g)", option) pdf.SetXY(margin_left+215, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, "钻压值(kN)", option) pdf.SetXY(margin_left+305, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "钻速值(r/min)", option) pdf.SetXY(margin_left+405, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, "水平段长度(m)", option) base += span pdf.Line(margin_left, base, margin_left+505, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+215, base, margin_left+215, base+span) pdf.Line(margin_left+305, base, margin_left+305, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) data2[i].Time = do_time_by_ps(data2[i].Time, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, data2[i].Time, option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, data2[i].V1, option) pdf.SetXY(margin_left+215, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 90}, data2[i].V2, option) pdf.SetXY(margin_left+305, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, data2[i].V3, option) pdf.SetXY(margin_left+405, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 105}, data2[i].V4, option) base += span pdf.Line(margin_left, base, margin_left+505, base) } if len(data3) > 0 { if base+span+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+250, base, margin_left+250, base+span) pdf.Line(margin_left+330, base, margin_left+330, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "时间", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 110}, "泥浆密度(g/cm^3)", option) pdf.SetXY(margin_left+250, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 80}, "泥浆粘度(s)", option) pdf.SetXY(margin_left+330, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, "排量(L/s)", option) pdf.SetXY(margin_left+405, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "泥浆含沙量(%)", option) base += span pdf.Line(margin_left, base, margin_left+505, base) } for i := 0; i < len(data3); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+250, base, margin_left+250, base+span) pdf.Line(margin_left+330, base, margin_left+330, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, "时间", option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 110}, "泥浆密度(g/cm^3)", option) pdf.SetXY(margin_left+250, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 80}, "泥浆粘度(s)", option) pdf.SetXY(margin_left+330, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, "排量(L/s)", option) pdf.SetXY(margin_left+405, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "泥浆含沙量(%)", option) base += span pdf.Line(margin_left, base, margin_left+505, base) } else { pdf.SetXY(margin_left*1, base) } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+505, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+140, base, margin_left+140, base+span) pdf.Line(margin_left+250, base, margin_left+250, base+span) pdf.Line(margin_left+330, base, margin_left+330, base+span) pdf.Line(margin_left+405, base, margin_left+405, base+span) pdf.Line(margin_left+505, base, margin_left+505, base+span) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) data3[i].Time = do_time_by_ps(data3[i].Time, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 140}, data3[i].Time, option) pdf.SetXY(margin_left+140, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 110}, data3[i].V1, option) pdf.SetXY(margin_left+250, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 80}, data3[i].V2, option) pdf.SetXY(margin_left+330, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 75}, data3[i].V3, option) pdf.SetXY(margin_left+405, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, data3[i].V4, option) base += span pdf.Line(margin_left, base, margin_left+505, base) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //下步工况 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`下步工况:`)) context, _ = pdf.SplitTextWithWordWrap(cmr_info.Next_state, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //完钻信息 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`完钻/完工信息:`)) s = fmt.Sprintf(`实际水平段长度:%sm 仪器总工作时间(纯钻时间):%sh 累计进尺:%sm 钻遇率:%s%%`, cmr_info.Hlength, cmr_info.Tool_work_time, cmr_info.Total_footage, cmr_info.Rate) context, _ = pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`完钻总结:`)) context, _ = pdf.SplitTextWithWordWrap(cmr_info.Well_report, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(context[j]) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) //参考信息 base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`参考信息:`)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`IP+端口:%s`, cmr_info.IP)) pdf.SetXY(margin_left+(1.5*h_span), base) pdf.Text(fmt.Sprintf(`地区:%s`, cmr_info.IP_addr)) for i := 0; i < len(cmr_info.Refer_Drilling_data); i++ { rv := cmr_info.Refer_Drilling_data[i] base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`钻次%s`, rv.Drilling_num)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`人工:%s`, rv.Servicer)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`待命时长:%sh`, rv.Wait_time)) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`工作时长:%sh`, rv.Work_time)) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`上传账号:%s`, cmr_info.Upload_user)) pdf.SetXY(page_W/2-(1*margin_left), base) pdf.Text(fmt.Sprintf(`打印账号:%s`, opuser)) pdf.SetXY(page_W-(2*margin_left), base) pdf.Text(fmt.Sprintf(`V1.0.0`)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ //save beginTime := time.Now().UnixNano() pdf.WritePdf(fmt.Sprintf(`./authfile/%v.pdf`, beginTime)) filename = strconv.FormatInt(beginTime, 10) return } func get_cmr_pdf_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_cmr_pdf_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_cmr_pdf_req json.Unmarshal(reqdata, &req) var resp get_cmr_pdf_resp var cmr_data Cmr var filename string var data1, data2, data3 []Cmr_input_record_ex selSql := fmt.Sprintf("select [data] from [analysis_es] where [wellname]='%s' ", req.Wellname) row, err := sqlConn.Query(selSql) if err != nil { logs.Info("get_cmr_pdf Query Error", err.Error()) goto exit } for row.Next() { var s string if err := row.Scan(&s); err == nil { json.Unmarshal([]byte(s), &cmr_data) if len(cmr_data.Device_data) == 0 { cmr_data.Device_data = []Device{} } if len(cmr_data.Drilling_data) == 0 { cmr_data.Drilling_data = []Drilling{} } if len(cmr_data.Refer_Drilling_data) == 0 { cmr_data.Refer_Drilling_data = []Drilling{} } } else { logs.Info("get_cmr_pdf Query Error", err.Error()) } } row.Close() cmr_data.Wellname = req.Wellname data1, data2, data3 = get_cmr_record_data_ex(req.Wellname) filename = export_pdf_en(req.OpUser, cmr_data, data1, data2, data3) resp.FileId = fmt.Sprintf(`%v.pdf`, filename) exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_cmr_pdf_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_cmr_pdf(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_cmr_pdf recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_cmr_pdf_req json.Unmarshal(reqdata, &req) var resp get_cmr_pdf_resp var cmr_data Cmr var filename string var data1, data2, data3 []Cmr_input_record_ex selSql := fmt.Sprintf("select [data] from [analysis_es] where [wellname]='%s' ", req.Wellname) row, err := sqlConn.Query(selSql) if err != nil { logs.Info("get_cmr_pdf Query Error", err.Error()) goto exit } for row.Next() { var s string if err := row.Scan(&s); err == nil { json.Unmarshal([]byte(s), &cmr_data) if len(cmr_data.Device_data) == 0 { cmr_data.Device_data = []Device{} } if len(cmr_data.Drilling_data) == 0 { cmr_data.Drilling_data = []Drilling{} } if len(cmr_data.Refer_Drilling_data) == 0 { cmr_data.Refer_Drilling_data = []Drilling{} } } else { logs.Info("get_cmr_pdf Query Error", err.Error()) } } row.Close() cmr_data.Wellname = req.Wellname data1, data2, data3 = get_cmr_record_data_ex(req.Wellname) filename = export_pdf(req.OpUser, cmr_data, data1, data2, data3) resp.FileId = fmt.Sprintf(`%v.pdf`, filename) exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_cmr_pdf recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_cmr_record_data_ex(wellname string) (data1 []Cmr_input_record_ex, data2 []Cmr_input_record_ex, data3 []Cmr_input_record_ex) { var well_database string sel_sql := fmt.Sprintf(`select [WELLName] from [WellInformation] where [WELLNameSource]='%s'`, wellname) rows, err := sqlConn.Query(sel_sql) if err == nil { for rows.Next() { if err = rows.Scan(&well_database); err != nil { logs.Error("get_cmr_record_data_ex scan database err:", err.Error()) } } rows.Close() } if well_database == "" { return } conn, err := getOdbcConn(well_database) if err != nil { return } defer conn.Close() selSql := fmt.Sprintf("select distinct [6752],[6775],[6776],[6778],[6779] from [ENGINEERSERVICES] order by [6752] ") rows1, err := conn.Query(selSql) if err != nil { logs.Info("get_cmr_record_data_ex Query Error", err.Error()) return } var old_depth, old_tvd, old_deviation, old_temp string for rows1.Next() { var v Cmr_input_record_ex var depth string var tvd string var deviation string var temp string if err := rows1.Scan(&v.Time, &depth, &tvd, &deviation, &temp); err == nil { if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] } /*v.Context = fmt.Sprintf(`%s 当前测深:%sm 当前垂深:%sm 当前井斜:%s° 当前循环温度:%s℃`, v.Time, depth, tvd, deviation, temp) */ //fmt.Println("old:", old_depth, old_tvd, old_deviation, old_temp) //fmt.Println("new:", depth, tvd, deviation, temp) if old_depth == depth && old_deviation == deviation && old_temp == temp && old_tvd == tvd { continue } v.V1 = depth v.V2 = tvd v.V3 = deviation v.V4 = temp data1 = append(data1, v) old_depth = depth old_tvd = tvd old_deviation = deviation old_temp = temp } else { logs.Info("get_cmr_record_data_ex Query Error", err.Error()) } } rows1.Close() sort.Slice(data1, func(i, j int) bool { return data1[i].Time > data1[j].Time }) selSql = fmt.Sprintf("select distinct [6752],[6777],[6780],[6781],[6782] from [ENGINEERSERVICES] order by [6752] ") rows1, err = conn.Query(selSql) if err != nil { logs.Info("get_cmr_record_data_ex Query Error", err.Error()) return } var old_vibrate, old_WOB, old_drilling_rate, old_hlen string for rows1.Next() { var v Cmr_input_record_ex var vibrate string var WOB string var drilling_rate string var hlen string if err := rows1.Scan(&v.Time, &vibrate, &WOB, &drilling_rate, &hlen); err == nil { if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] } /*v.Context = fmt.Sprintf(`%s 振动值:%s 钻压值:%sKN 钻速值:%srpm 水平段长度:%sm`, v.Time, vibrate, WOB, drilling_rate, hlen) */ if old_vibrate == vibrate && old_WOB == WOB && old_drilling_rate == drilling_rate && old_hlen == hlen { continue } v.V1 = vibrate v.V2 = WOB v.V3 = drilling_rate v.V4 = hlen data2 = append(data2, v) old_vibrate = vibrate old_WOB = WOB old_drilling_rate = drilling_rate old_hlen = hlen } else { logs.Info("get_cmr_record_data_ex Query Error", err.Error()) } } rows1.Close() sort.Slice(data2, func(i, j int) bool { return data2[i].Time > data2[j].Time }) selSql = fmt.Sprintf("select distinct [5209],[5210],[5211],[5212],[5219] from [EQUIPMENTRECORDS] where [5219] is not null order by [5219] ") rows1, err = conn.Query(selSql) if err != nil { logs.Info("get_cmr_record_data Query Error", err.Error()) return } var old_s1, old_s2, old_s3, old_s4 float32 for rows1.Next() { var v Cmr_input_record_ex var s1, s2, s3, s4 float32 if err := rows1.Scan(&s1, &s2, &s3, &s4, &v.Time); err == nil { if s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001 { continue } if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] } /*v.Context = fmt.Sprintf(`%s 泥浆密度:%sg/cm3 泥浆粘度:%sS 排量:%sL/S 泥浆含沙量:%s%%`, v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) */ if old_s1 == s1 && old_s2 == s2 && old_s3 == s3 && old_s4 == s4 { continue } v.V1 = fmt.Sprintf("%.02f", s1) v.V2 = fmt.Sprintf("%.02f", s2) v.V3 = fmt.Sprintf("%.02f", s3) v.V4 = fmt.Sprintf("%.02f", s4) data3 = append(data3, v) old_s1 = s1 old_s2 = s2 old_s3 = s3 old_s4 = s4 } else { logs.Info("get_cmr Query Error", err.Error()) } } rows1.Close() sort.Slice(data3, func(i, j int) bool { return data3[i].Time > data3[j].Time }) return } func get_cmr_record_data_en(user string, wellname string) (resp []Cmr_input_record) { ps_info := get_ps_info(user) var well_database string sel_sql := fmt.Sprintf(`select [WELLName] from [WellInformation] where [WELLNameSource]='%s'`, wellname) rows, err := sqlConn.Query(sel_sql) if err == nil { for rows.Next() { if err = rows.Scan(&well_database); err != nil { logs.Error("get_cmr_record_data_en scan database err:", err.Error()) } } rows.Close() } if well_database == "" { return } conn, err := getOdbcConn(well_database) if err != nil { return } defer conn.Close() // ============== Part 1: Measured Depth Data ============== selSql := `SELECT DISTINCT [6752], [6775], [6776], [6778], [6779] FROM [ENGINEERSERVICES] WHERE NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) ORDER BY [6752]` rows1, err := conn.Query(selSql) if err != nil { logs.Info("get_cmr_record_data_en Query Error (depth)", err.Error()) return } var old_depth, old_tvd, old_deviation, old_temp string depthDateMap := make(map[string]bool) // different dates for depth data depthCountMap := make(map[string]int) // count per date depthTimeMap := make(map[string][]string) // existing time points per date for rows1.Next() { var v Cmr_input_record var depth string var tvd string var deviation string var temp string var originalTime string if err := rows1.Scan(&originalTime, &depth, &tvd, &deviation, &temp); err == nil { v.Time = originalTime if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } // record date if len(v.Time) >= 10 { dateOnly := v.Time[:10] depthDateMap[dateOnly] = true if len(originalTime) >= 19 { timeOnly := originalTime[11:19] depthTimeMap[dateOnly] = append(depthTimeMap[dateOnly], timeOnly) } } // deduplicate: skip consecutive identical values if depth == old_depth && old_tvd == tvd && old_deviation == deviation && old_temp == temp { continue } // format context (English) if ps_info.R2 == "1" { v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℃`, v.Time, depth, tvd, deviation, temp) } else { f, _ := strconv.ParseFloat(temp, 64) f = 1.8*f + 32 v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℉`, v.Time, depth, tvd, deviation, fmt.Sprintf("%.02f", f)) } resp = append(resp, v) // count if len(v.Time) >= 10 { dateOnly := v.Time[:10] depthCountMap[dateOnly]++ } old_depth = depth old_deviation = deviation old_temp = temp old_tvd = tvd } else { logs.Info("get_cmr_record_data_en scan error (depth)", err.Error()) } } rows1.Close() // Print depth data statistics (English) fmt.Println("\n========== Measured Depth Data ==========") fmt.Printf("Depth data covers %d days\n", len(depthDateMap)) if len(depthDateMap) > 0 { fmt.Println("Date list and record counts:") dates := make([]string, 0, len(depthDateMap)) for date := range depthDateMap { dates = append(dates, date) } sort.Strings(dates) for _, date := range dates { fmt.Printf("%s: %d records\n", date, depthCountMap[date]) } } // Check and supplement depth data for dates with less than 2 records fmt.Println("\nChecking depth data for dates with <2 records and supplementing...") needDepthDates := make([]string, 0) for date := range depthDateMap { if depthCountMap[date] < 2 { needDepthDates = append(needDepthDates, date) } } if len(needDepthDates) > 0 { fmt.Printf("Found %d date(s) with less than 2 depth records\n", len(needDepthDates)) sort.Strings(needDepthDates) for _, supplementDate := range needDepthDates { currentCount := depthCountMap[supplementDate] if currentCount == 0 { fmt.Printf("Date %s has 0 records, adding earliest and latest one each\n", supplementDate) start := supplementDate + " 00:00:00" end := supplementDate + " 23:59:59" // earliest sqlEarliest := fmt.Sprintf(` SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) ORDER BY [6752] ASC`, start, end) rowsE, err := conn.Query(sqlEarliest) if err == nil { for rowsE.Next() { var v Cmr_input_record var d, tvd, dev, tmp string var ot string if err := rowsE.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } if ps_info.R2 == "1" { v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℃`, v.Time, d, tvd, dev, tmp) } else { f, _ := strconv.ParseFloat(tmp, 64) f = 1.8*f + 32 v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℉`, v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) } // deduplicate dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" Added earliest: %s\n", v.Time) } } } rowsE.Close() } // latest sqlLatest := fmt.Sprintf(` SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) ORDER BY [6752] DESC`, start, end) rowsL, err := conn.Query(sqlLatest) if err == nil { for rowsL.Next() { var v Cmr_input_record var d, tvd, dev, tmp string var ot string if err := rowsL.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } if ps_info.R2 == "1" { v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℃`, v.Time, d, tvd, dev, tmp) } else { f, _ := strconv.ParseFloat(tmp, 64) f = 1.8*f + 32 v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℉`, v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) } dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" Added latest: %s\n", v.Time) } } } rowsL.Close() } } else if currentCount == 1 { fmt.Printf("Date %s has 1 record, determining supplement based on time...\n", supplementDate) times := depthTimeMap[supplementDate] if len(times) > 0 { timeStr := times[0] // "HH:MM:SS" parts := strings.Split(timeStr, ":") if len(parts) == 3 { hour, _ := strconv.Atoi(parts[0]) start := supplementDate + " 00:00:00" end := supplementDate + " 23:59:59" if hour < 12 { // supplement latest sqlLatest := fmt.Sprintf(` SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) ORDER BY [6752] DESC`, start, end) rowsL, err := conn.Query(sqlLatest) if err == nil { for rowsL.Next() { var v Cmr_input_record var d, tvd, dev, tmp string var ot string if err := rowsL.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } if ps_info.R2 == "1" { v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℃`, v.Time, d, tvd, dev, tmp) } else { f, _ := strconv.ParseFloat(tmp, 64) f = 1.8*f + 32 v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℉`, v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) } dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" Added latest: %s\n", v.Time) } } } rowsL.Close() } } else { // supplement earliest sqlEarliest := fmt.Sprintf(` SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) ORDER BY [6752] ASC`, start, end) rowsE, err := conn.Query(sqlEarliest) if err == nil { for rowsE.Next() { var v Cmr_input_record var d, tvd, dev, tmp string var ot string if err := rowsE.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } if ps_info.R2 == "1" { v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℃`, v.Time, d, tvd, dev, tmp) } else { f, _ := strconv.ParseFloat(tmp, 64) f = 1.8*f + 32 v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℉`, v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) } dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" Added earliest: %s\n", v.Time) } } } rowsE.Close() } } } } } } // sorting will be done at the end } // ============== Part 2: Vibration / WOB Data ============== selSql = "SELECT DISTINCT [6752],[6777],[6780],[6781],[6782] FROM [ENGINEERSERVICES] WHERE NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) ORDER BY [6752]" rows1, err = conn.Query(selSql) if err != nil { logs.Info("get_cmr_record_data_en Query Error (vibration)", err.Error()) return } var old_vibrate, old_WOB, old_drilling_rate, old_hlen string vibrateDateMap := make(map[string]bool) vibrateCountMap := make(map[string]int) vibrateTimeMap := make(map[string][]string) for rows1.Next() { var v Cmr_input_record var vibrate, WOB, drilling_rate, hlen string var originalTime string if err := rows1.Scan(&originalTime, &vibrate, &WOB, &drilling_rate, &hlen); err == nil { v.Time = originalTime if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } if len(v.Time) >= 10 { dateOnly := v.Time[:10] vibrateDateMap[dateOnly] = true if len(originalTime) >= 19 { timeOnly := originalTime[11:19] vibrateTimeMap[dateOnly] = append(vibrateTimeMap[dateOnly], timeOnly) } } v.Context = fmt.Sprintf(`%s Vibration: %sg WOB: %skN ROP: %sr/min Length of horizontal section: %sm`, v.Time, vibrate, WOB, drilling_rate, hlen) if old_vibrate == vibrate && old_WOB == WOB && old_drilling_rate == drilling_rate && old_hlen == hlen { continue } resp = append(resp, v) if len(v.Time) >= 10 { dateOnly := v.Time[:10] vibrateCountMap[dateOnly]++ } old_vibrate = vibrate old_WOB = WOB old_drilling_rate = drilling_rate old_hlen = hlen } else { logs.Info("get_cmr_record_data_en scan error (vibration)", err.Error()) } } rows1.Close() // Print vibration data statistics fmt.Println("\n========== Vibration/WOB Data ==========") fmt.Printf("Vibration data covers %d days\n", len(vibrateDateMap)) if len(vibrateDateMap) > 0 { fmt.Println("Date list and record counts:") dates := make([]string, 0, len(vibrateDateMap)) for date := range vibrateDateMap { dates = append(dates, date) } sort.Strings(dates) for _, date := range dates { fmt.Printf("%s: %d records\n", date, vibrateCountMap[date]) } } // Supplement vibration data fmt.Println("\nChecking vibration data for dates with <2 records and supplementing...") needVibrateDates := make([]string, 0) for date := range vibrateDateMap { if vibrateCountMap[date] < 2 { needVibrateDates = append(needVibrateDates, date) } } if len(needVibrateDates) > 0 { fmt.Printf("Found %d date(s) with less than 2 vibration records\n", len(needVibrateDates)) sort.Strings(needVibrateDates) for _, supplementDate := range needVibrateDates { currentCount := vibrateCountMap[supplementDate] if currentCount == 0 { fmt.Printf("Date %s has 0 records, adding earliest and latest one each\n", supplementDate) start := supplementDate + " 00:00:00" end := supplementDate + " 23:59:59" // earliest sqlEarliest := fmt.Sprintf(` SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) ORDER BY [6752] ASC`, start, end) rowsE, err := conn.Query(sqlEarliest) if err == nil { for rowsE.Next() { var v Cmr_input_record var vib, wob, dr, hl string var ot string if err := rowsE.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s Vibration: %sg WOB: %skN ROP: %sr/min Length of horizontal section: %sm`, v.Time, vib, wob, dr, hl) dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" Added earliest: %s\n", v.Time) } } } rowsE.Close() } // latest sqlLatest := fmt.Sprintf(` SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) ORDER BY [6752] DESC`, start, end) rowsL, err := conn.Query(sqlLatest) if err == nil { for rowsL.Next() { var v Cmr_input_record var vib, wob, dr, hl string var ot string if err := rowsL.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s Vibration: %sg WOB: %skN ROP: %sr/min Length of horizontal section: %sm`, v.Time, vib, wob, dr, hl) dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" Added latest: %s\n", v.Time) } } } rowsL.Close() } } else if currentCount == 1 { fmt.Printf("Date %s has 1 record, determining supplement based on time...\n", supplementDate) times := vibrateTimeMap[supplementDate] if len(times) > 0 { timeStr := times[0] parts := strings.Split(timeStr, ":") if len(parts) == 3 { hour, _ := strconv.Atoi(parts[0]) start := supplementDate + " 00:00:00" end := supplementDate + " 23:59:59" if hour < 12 { sqlLatest := fmt.Sprintf(` SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) ORDER BY [6752] DESC`, start, end) rowsL, err := conn.Query(sqlLatest) if err == nil { for rowsL.Next() { var v Cmr_input_record var vib, wob, dr, hl string var ot string if err := rowsL.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s Vibration: %sg WOB: %skN ROP: %sr/min Length of horizontal section: %sm`, v.Time, vib, wob, dr, hl) dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" Added latest: %s\n", v.Time) } } } rowsL.Close() } } else { sqlEarliest := fmt.Sprintf(` SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) ORDER BY [6752] ASC`, start, end) rowsE, err := conn.Query(sqlEarliest) if err == nil { for rowsE.Next() { var v Cmr_input_record var vib, wob, dr, hl string var ot string if err := rowsE.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s Vibration: %sg WOB: %skN ROP: %sr/min Length of horizontal section: %sm`, v.Time, vib, wob, dr, hl) dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" Added earliest: %s\n", v.Time) } } } rowsE.Close() } } } } } } } // ============== Part 3: Mud Data ============== selSql = "SELECT DISTINCT [5209],[5210],[5211],[5212],[5219] FROM [EQUIPMENTRECORDS] WHERE NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) ORDER BY [5219]" rows1, err = conn.Query(selSql) if err != nil { logs.Info("get_cmr_record_data_en Query Error (mud)", err.Error()) return } var old_s1, old_s2, old_s3, old_s4 float32 mudDateMap := make(map[string]bool) mudCountMap := make(map[string]int) mudTimeMap := make(map[string][]string) for rows1.Next() { var v Cmr_input_record var s1, s2, s3, s4 float32 var originalTime string if err := rows1.Scan(&s1, &s2, &s3, &s4, &originalTime); err == nil { v.Time = originalTime if len(v.Time) >= 19 { originalTimeForStat := v.Time v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) if len(v.Time) >= 10 { dateOnly := v.Time[:10] mudDateMap[dateOnly] = true if len(originalTimeForStat) >= 19 { timeOnly := originalTimeForStat[11:19] mudTimeMap[dateOnly] = append(mudTimeMap[dateOnly], timeOnly) } } } if s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001 { continue } if old_s1 == s1 && old_s2 == s2 && old_s3 == s3 && old_s4 == s4 { continue } v.Context = fmt.Sprintf(`%s Mud density: %sg/cm³ Mud viscosity: %ss Flow rate: %sL/s Sand content: %s%%`, v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) resp = append(resp, v) if len(v.Time) >= 10 { dateOnly := v.Time[:10] mudCountMap[dateOnly]++ } old_s1 = s1 old_s2 = s2 old_s3 = s3 old_s4 = s4 } else { logs.Info("get_cmr_record_data_en scan error (mud)", err.Error()) } } rows1.Close() // Print mud data statistics fmt.Println("\n========== Mud Data ==========") fmt.Printf("Mud data covers %d days\n", len(mudDateMap)) if len(mudDateMap) > 0 { fmt.Println("Date list and record counts:") dates := make([]string, 0, len(mudDateMap)) for date := range mudDateMap { dates = append(dates, date) } sort.Strings(dates) for _, date := range dates { fmt.Printf("%s: %d records\n", date, mudCountMap[date]) } } // Supplement mud data fmt.Println("\nChecking mud data for dates with <2 records and supplementing...") needMudDates := make([]string, 0) for date := range mudDateMap { if mudCountMap[date] < 2 { needMudDates = append(needMudDates, date) } } if len(needMudDates) > 0 { fmt.Printf("Found %d date(s) with less than 2 mud records\n", len(needMudDates)) sort.Strings(needMudDates) for _, supplementDate := range needMudDates { currentCount := mudCountMap[supplementDate] if currentCount == 0 { fmt.Printf("Date %s has 0 records, adding earliest and latest one each\n", supplementDate) start := supplementDate + " 00:00:00" end := supplementDate + " 23:59:59" // earliest sqlEarliest := fmt.Sprintf(` SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] FROM [EQUIPMENTRECORDS] WHERE [5219] BETWEEN '%s' AND '%s' AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) ORDER BY [5219] ASC`, start, end) rowsE, err := conn.Query(sqlEarliest) if err == nil { for rowsE.Next() { var v Cmr_input_record var s1, s2, s3, s4 float32 var ot string if err := rowsE.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s Mud density: %sg/cm³ Mud viscosity: %ss Flow rate: %sL/s Sand content: %s%%`, v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { resp = append(resp, v) fmt.Printf(" Added earliest: %s\n", v.Time) } } } rowsE.Close() } // latest sqlLatest := fmt.Sprintf(` SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] FROM [EQUIPMENTRECORDS] WHERE [5219] BETWEEN '%s' AND '%s' AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) ORDER BY [5219] DESC`, start, end) rowsL, err := conn.Query(sqlLatest) if err == nil { for rowsL.Next() { var v Cmr_input_record var s1, s2, s3, s4 float32 var ot string if err := rowsL.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s Mud density: %sg/cm³ Mud viscosity: %ss Flow rate: %sL/s Sand content: %s%%`, v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { resp = append(resp, v) fmt.Printf(" Added latest: %s\n", v.Time) } } } rowsL.Close() } } else if currentCount == 1 { fmt.Printf("Date %s has 1 record, determining supplement based on time...\n", supplementDate) times := mudTimeMap[supplementDate] if len(times) > 0 { timeStr := times[0] parts := strings.Split(timeStr, ":") if len(parts) == 3 { hour, _ := strconv.Atoi(parts[0]) start := supplementDate + " 00:00:00" end := supplementDate + " 23:59:59" if hour < 12 { // supplement latest sqlLatest := fmt.Sprintf(` SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] FROM [EQUIPMENTRECORDS] WHERE [5219] BETWEEN '%s' AND '%s' AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) ORDER BY [5219] DESC`, start, end) rowsL, err := conn.Query(sqlLatest) if err == nil { for rowsL.Next() { var v Cmr_input_record var s1, s2, s3, s4 float32 var ot string if err := rowsL.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s Mud density: %sg/cm³ Mud viscosity: %ss Flow rate: %sL/s Sand content: %s%%`, v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { resp = append(resp, v) fmt.Printf(" Added latest: %s\n", v.Time) } } } rowsL.Close() } } else { // supplement earliest sqlEarliest := fmt.Sprintf(` SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] FROM [EQUIPMENTRECORDS] WHERE [5219] BETWEEN '%s' AND '%s' AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) ORDER BY [5219] ASC`, start, end) rowsE, err := conn.Query(sqlEarliest) if err == nil { for rowsE.Next() { var v Cmr_input_record var s1, s2, s3, s4 float32 var ot string if err := rowsE.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s Mud density: %sg/cm³ Mud viscosity: %ss Flow rate: %sL/s Sand content: %s%%`, v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { resp = append(resp, v) fmt.Printf(" Added earliest: %s\n", v.Time) } } } rowsE.Close() } } } } } } } // Final sort by time descending sort.Slice(resp, func(i, j int) bool { return resp[i].Time > resp[j].Time }) fmt.Printf("\nAll data processed. Final record count: %d\n", len(resp)) return } // func get_cmr_record_data_en(user string, wellname string) (resp []Cmr_input_record) { // ps_info := get_ps_info(user) // var well_database string // sel_sql := fmt.Sprintf(`select [WELLName] from [WellInformation] where [WELLNameSource]='%s'`, wellname) // rows, err := sqlConn.Query(sel_sql) // if err == nil { // for rows.Next() { // if err = rows.Scan(&well_database); err != nil { // logs.Error("get_cmr_record_data scan database err:", err.Error()) // } // } // rows.Close() // } // if well_database == "" { // return // } // conn, err := getOdbcConn(well_database) // if err != nil { // return // } // defer conn.Close() // selSql := fmt.Sprintf("select distinct [6752],[6775],[6776],[6778],[6779] from [ENGINEERSERVICES] order by [6752] ") // rows1, err := conn.Query(selSql) // if err != nil { // logs.Info("get_cmr_record_data Query Error", err.Error()) // return // } // var old_depth, old_tvd, old_deviation, old_temp string // for rows1.Next() { // var v Cmr_input_record // var depth string // var tvd string // var deviation string // var temp string // if err := rows1.Scan(&v.Time, &depth, &tvd, &deviation, &temp); err == nil { // if len(v.Time) >= 19 { // v.Time = v.Time[:10] + " " + v.Time[11:19] // v.Time = do_time_by_ps(v.Time, ps_info) // } // if depth == old_depth && old_tvd == tvd && old_deviation == deviation && old_temp == temp { // continue // } // if ps_info.R2 == "1" { // v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℃`, // v.Time, depth, tvd, deviation, temp) // } else { // f, _ := strconv.ParseFloat(temp, 64) // f = float64(1.8*f + 32) // v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℉`, // v.Time, depth, tvd, deviation, fmt.Sprintf("%.02f", f)) // } // resp = append(resp, v) // old_depth = depth // old_deviation = deviation // old_temp = temp // old_tvd = tvd // } else { // logs.Info("get_cmr Query Error", err.Error()) // } // } // rows1.Close() // selSql = fmt.Sprintf("select distinct [6752],[6777],[6780],[6781],[6782] from [ENGINEERSERVICES] order by [6752] ") // rows1, err = conn.Query(selSql) // if err != nil { // logs.Info("get_cmr_record_data Query Error", err.Error()) // return // } // var old_vibrate, old_WOB, old_drilling_rate, old_hlen string // for rows1.Next() { // var v Cmr_input_record // var vibrate string // var WOB string // var drilling_rate string // var hlen string // if err := rows1.Scan(&v.Time, &vibrate, &WOB, &drilling_rate, &hlen); err == nil { // if len(v.Time) >= 19 { // v.Time = v.Time[:10] + " " + v.Time[11:19] // v.Time = do_time_by_ps(v.Time, ps_info) // } // v.Context = fmt.Sprintf(`%s Vibration: %sg WOB: %skN ROP: %sr/min Length of horizontal section: %sm`, // v.Time, vibrate, WOB, drilling_rate, hlen) // if old_vibrate == vibrate && old_WOB == WOB && old_drilling_rate == drilling_rate && old_hlen == hlen { // continue // } // resp = append(resp, v) // old_vibrate = vibrate // old_WOB = WOB // old_drilling_rate = drilling_rate // old_hlen = hlen // } else { // logs.Info("get_cmr Query Error", err.Error()) // } // } // rows1.Close() // selSql = fmt.Sprintf("select distinct [5209],[5210],[5211],[5212],[5219] from [EQUIPMENTRECORDS] where [5219] is not null order by [5219] ") // rows1, err = conn.Query(selSql) // if err != nil { // logs.Info("get_cmr_record_data Query Error", err.Error()) // return // } // var old_s1, old_s2, old_s3, old_s4 float32 // for rows1.Next() { // var v Cmr_input_record // var s1, s2, s3, s4 float32 // if err := rows1.Scan(&s1, &s2, &s3, &s4, &v.Time); err == nil { // if s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001 { // continue // } // if old_s1 == s1 && old_s2 == s2 && old_s3 == s3 && old_s4 == s4 { // continue // } // if len(v.Time) >= 19 { // v.Time = v.Time[:10] + " " + v.Time[11:19] // v.Time = do_time_by_ps(v.Time, ps_info) // } // v.Context = fmt.Sprintf(`%s Mud density: %sg/cm^3 Mud viscosity: %ss Flow rate: %sL/s Sand content: %s%%`, // v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), // fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) // resp = append(resp, v) // old_s1 = s1 // old_s2 = s2 // old_s3 = s3 // old_s4 = s4 // } else { // logs.Info("get_cmr Query Error", err.Error()) // } // } // rows1.Close() // sort.Slice(resp, func(i, j int) bool { // return resp[i].Time > resp[j].Time // }) // return // } // func get_cmr_record_data(user string, wellname string) (resp []Cmr_input_record) { // ps_info := get_ps_info(user) // var well_database string // sel_sql := fmt.Sprintf(`select [WELLName] from [WellInformation] where [WELLNameSource]='%s'`, wellname) // rows, err := sqlConn.Query(sel_sql) // if err == nil { // for rows.Next() { // if err = rows.Scan(&well_database); err != nil { // logs.Error("get_cmr_record_data scan database err:", err.Error()) // } // } // rows.Close() // } // if well_database == "" { // return // } // conn, err := getOdbcConn(well_database) // if err != nil { // return // } // defer conn.Close() // selSql := fmt.Sprintf("select distinct [6752],[6775],[6776],[6778],[6779] from [ENGINEERSERVICES] order by [6752] ") // rows1, err := conn.Query(selSql) // if err != nil { // logs.Info("get_cmr_record_data Query Error", err.Error()) // return // } // var old_depth, old_tvd, old_deviation, old_temp string // for rows1.Next() { // var v Cmr_input_record // var depth string // var tvd string // var deviation string // var temp string // if err := rows1.Scan(&v.Time, &depth, &tvd, &deviation, &temp); err == nil { // if len(v.Time) >= 19 { // v.Time = v.Time[:10] + " " + v.Time[11:19] // v.Time = do_time_by_ps(v.Time, ps_info) // } // if depth == old_depth && old_tvd == tvd && old_deviation == deviation && old_temp == temp { // continue // } // if ps_info.R2 == "1" { // v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℃`, // v.Time, depth, tvd, deviation, temp) // } else { // f, _ := strconv.ParseFloat(temp, 64) // f = float64(1.8*f + 32) // v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℉`, // v.Time, depth, tvd, deviation, fmt.Sprintf("%.02f", f)) // } // resp = append(resp, v) // old_depth = depth // old_deviation = deviation // old_temp = temp // old_tvd = tvd // } else { // logs.Info("get_cmr Query Error", err.Error()) // } // } // rows1.Close() // selSql = fmt.Sprintf("select distinct [6752],[6777],[6780],[6781],[6782] from [ENGINEERSERVICES] order by [6752] ") // rows1, err = conn.Query(selSql) // if err != nil { // logs.Info("get_cmr_record_data Query Error", err.Error()) // return // } // var old_vibrate, old_WOB, old_drilling_rate, old_hlen string // for rows1.Next() { // var v Cmr_input_record // var vibrate string // var WOB string // var drilling_rate string // var hlen string // if err := rows1.Scan(&v.Time, &vibrate, &WOB, &drilling_rate, &hlen); err == nil { // if len(v.Time) >= 19 { // v.Time = v.Time[:10] + " " + v.Time[11:19] // v.Time = do_time_by_ps(v.Time, ps_info) // } // v.Context = fmt.Sprintf(`%s 振动值: %sg 钻压值: %skN 钻速值: %sr/min 水平段长度: %sm`, // v.Time, vibrate, WOB, drilling_rate, hlen) // if old_vibrate == vibrate && old_WOB == WOB && old_drilling_rate == drilling_rate && old_hlen == hlen { // continue // } // resp = append(resp, v) // old_vibrate = vibrate // old_WOB = WOB // old_drilling_rate = drilling_rate // old_hlen = hlen // } else { // logs.Info("get_cmr Query Error", err.Error()) // } // } // rows1.Close() // selSql = fmt.Sprintf("select distinct [5209],[5210],[5211],[5212],[5219] from [EQUIPMENTRECORDS] where [5219] is not null order by [5219] ") // rows1, err = conn.Query(selSql) // fmt.Println("selSql---------", selSql) // if err != nil { // logs.Info("get_cmr_record_data Query Error", err.Error()) // return // } // var old_s1, old_s2, old_s3, old_s4 float32 // for rows1.Next() { // var v Cmr_input_record // var s1, s2, s3, s4 float32 // if err := rows1.Scan(&s1, &s2, &s3, &s4, &v.Time); err == nil { // if s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001 { // continue // } // if old_s1 == s1 && old_s2 == s2 && old_s3 == s3 && old_s4 == s4 { // continue // } // if len(v.Time) >= 19 { // v.Time = v.Time[:10] + " " + v.Time[11:19] // v.Time = do_time_by_ps(v.Time, ps_info) // } // v.Context = fmt.Sprintf(`%s 泥浆密度: %sg/cm^3 泥浆粘度: %ss 排量: %sL/s 泥浆含沙量: %s%%`, // v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), // fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) // resp = append(resp, v) // old_s1 = s1 // old_s2 = s2 // old_s3 = s3 // old_s4 = s4 // } else { // logs.Info("get_cmr Query Error", err.Error()) // } // } // rows1.Close() // sort.Slice(resp, func(i, j int) bool { // return resp[i].Time > resp[j].Time // }) // return // } func get_cmr_record_data(user string, wellname string) (resp []Cmr_input_record) { ps_info := get_ps_info(user) var well_database string sel_sql := fmt.Sprintf(`select [WELLName] from [WellInformation] where [WELLNameSource]='%s'`, wellname) rows, err := sqlConn.Query(sel_sql) if err == nil { for rows.Next() { if err = rows.Scan(&well_database); err != nil { logs.Error("get_cmr_record_data scan database err:", err.Error()) } } rows.Close() } if well_database == "" { return } conn, err := getOdbcConn(well_database) if err != nil { return } defer conn.Close() // ============== 第一部分:测深数据 ============== selSql := `SELECT DISTINCT [6752], [6775], [6776], [6778], [6779] FROM [ENGINEERSERVICES] WHERE NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) ORDER BY [6752]` rows1, err := conn.Query(selSql) if err != nil { logs.Info("get_cmr_record_data Query Error", err.Error()) return } var old_depth, old_tvd, old_deviation, old_temp string depthDateMap := make(map[string]bool) // 测深数据不同日期 depthCountMap := make(map[string]int) // 测深数据每个日期已有数量 depthTimeMap := make(map[string][]string) // 测深数据每个日期已有的时间点(用于判断) for rows1.Next() { var v Cmr_input_record var depth string var tvd string var deviation string var temp string var originalTime string if err := rows1.Scan(&originalTime, &depth, &tvd, &deviation, &temp); err == nil { v.Time = originalTime if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } // 统计日期 if len(v.Time) >= 10 { dateOnly := v.Time[:10] depthDateMap[dateOnly] = true // 记录原始时间点 if len(originalTime) >= 19 { timeOnly := originalTime[11:19] depthTimeMap[dateOnly] = append(depthTimeMap[dateOnly], timeOnly) } } // 去重:连续相同值跳过 if depth == old_depth && old_tvd == tvd && old_deviation == deviation && old_temp == temp { continue } // 格式化上下文 if ps_info.R2 == "1" { v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℃`, v.Time, depth, tvd, deviation, temp) } else { f, _ := strconv.ParseFloat(temp, 64) f = float64(1.8*f + 32) v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℉`, v.Time, depth, tvd, deviation, fmt.Sprintf("%.02f", f)) } resp = append(resp, v) // 统计数量 if len(v.Time) >= 10 { dateOnly := v.Time[:10] depthCountMap[dateOnly]++ } old_depth = depth old_deviation = deviation old_temp = temp old_tvd = tvd } else { logs.Info("get_cmr Query Error", err.Error()) } } rows1.Close() // 打印测深数据统计 fmt.Println("\n========== 测深数据 ==========") fmt.Printf("测深数据共有 %d 天的数据\n", len(depthDateMap)) if len(depthDateMap) > 0 { fmt.Println("测深数据日期列表及数据条数:") dates := make([]string, 0, len(depthDateMap)) for date := range depthDateMap { dates = append(dates, date) } sort.Strings(dates) for _, date := range dates { fmt.Printf("%s: %d 条\n", date, depthCountMap[date]) } } // 检查并补充测深数据 fmt.Println("\n检查测深数据条数少于2的日期并补充...") needDepthDates := make([]string, 0) for date := range depthDateMap { if depthCountMap[date] < 2 { needDepthDates = append(needDepthDates, date) } } if len(needDepthDates) > 0 { fmt.Printf("测深数据发现 %d 个日期少于2条\n", len(needDepthDates)) sort.Strings(needDepthDates) for _, supplementDate := range needDepthDates { currentCount := depthCountMap[supplementDate] if currentCount == 0 { fmt.Printf("日期 %s 有0条,补充最早和最晚各1条\n", supplementDate) start := supplementDate + " 00:00:00" end := supplementDate + " 23:59:59" // 最早一条 sqlEarliest := fmt.Sprintf(` SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) ORDER BY [6752] ASC`, start, end) rowsE, err := conn.Query(sqlEarliest) if err == nil { for rowsE.Next() { var v Cmr_input_record var d, tvd, dev, tmp string var ot string if err := rowsE.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } if ps_info.R2 == "1" { v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℃`, v.Time, d, tvd, dev, tmp) } else { f, _ := strconv.ParseFloat(tmp, 64) f = 1.8*f + 32 v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℉`, v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) } // 去重检查 dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" 已添加最早: %s\n", v.Time) } } } rowsE.Close() } // 最晚一条 sqlLatest := fmt.Sprintf(` SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) ORDER BY [6752] DESC`, start, end) rowsL, err := conn.Query(sqlLatest) if err == nil { for rowsL.Next() { var v Cmr_input_record var d, tvd, dev, tmp string var ot string if err := rowsL.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } if ps_info.R2 == "1" { v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℃`, v.Time, d, tvd, dev, tmp) } else { f, _ := strconv.ParseFloat(tmp, 64) f = 1.8*f + 32 v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℉`, v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) } dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" 已添加最晚: %s\n", v.Time) } } } rowsL.Close() } } else if currentCount == 1 { fmt.Printf("日期 %s 有1条,根据时间判断补充...\n", supplementDate) // 获取已有时间点 times := depthTimeMap[supplementDate] if len(times) > 0 { timeStr := times[0] // "HH:MM:SS" parts := strings.Split(timeStr, ":") if len(parts) == 3 { hour, _ := strconv.Atoi(parts[0]) start := supplementDate + " 00:00:00" end := supplementDate + " 23:59:59" if hour < 12 { // 补充最晚 sqlLatest := fmt.Sprintf(` SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) ORDER BY [6752] DESC`, start, end) rowsL, err := conn.Query(sqlLatest) if err == nil { for rowsL.Next() { var v Cmr_input_record var d, tvd, dev, tmp string var ot string if err := rowsL.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } if ps_info.R2 == "1" { v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℃`, v.Time, d, tvd, dev, tmp) } else { f, _ := strconv.ParseFloat(tmp, 64) f = 1.8*f + 32 v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℉`, v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) } dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" 已添加最晚: %s\n", v.Time) } } } rowsL.Close() } } else { // 补充最早 sqlEarliest := fmt.Sprintf(` SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) ORDER BY [6752] ASC`, start, end) rowsE, err := conn.Query(sqlEarliest) if err == nil { for rowsE.Next() { var v Cmr_input_record var d, tvd, dev, tmp string var ot string if err := rowsE.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } if ps_info.R2 == "1" { v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℃`, v.Time, d, tvd, dev, tmp) } else { f, _ := strconv.ParseFloat(tmp, 64) f = 1.8*f + 32 v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℉`, v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) } dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" 已添加最早: %s\n", v.Time) } } } rowsE.Close() } } } } } } // 重新排序(后面统一排序) } selSql = "select distinct [6752],[6777],[6780],[6781],[6782] from [ENGINEERSERVICES] WHERE NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) order by [6752]" rows1, err = conn.Query(selSql) if err != nil { logs.Info("get_cmr_record_data Query Error", err.Error()) return } var old_vibrate, old_WOB, old_drilling_rate, old_hlen string vibrateDateMap := make(map[string]bool) vibrateCountMap := make(map[string]int) vibrateTimeMap := make(map[string][]string) for rows1.Next() { var v Cmr_input_record var vibrate, WOB, drilling_rate, hlen string var originalTime string if err := rows1.Scan(&originalTime, &vibrate, &WOB, &drilling_rate, &hlen); err == nil { v.Time = originalTime if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } if len(v.Time) >= 10 { dateOnly := v.Time[:10] vibrateDateMap[dateOnly] = true if len(originalTime) >= 19 { timeOnly := originalTime[11:19] vibrateTimeMap[dateOnly] = append(vibrateTimeMap[dateOnly], timeOnly) } } v.Context = fmt.Sprintf(`%s 振动值: %sg 钻压值: %skN 钻速值: %sr/min 水平段长度: %sm`, v.Time, vibrate, WOB, drilling_rate, hlen) if old_vibrate == vibrate && old_WOB == WOB && old_drilling_rate == drilling_rate && old_hlen == hlen { continue } resp = append(resp, v) if len(v.Time) >= 10 { dateOnly := v.Time[:10] vibrateCountMap[dateOnly]++ } old_vibrate = vibrate old_WOB = WOB old_drilling_rate = drilling_rate old_hlen = hlen } else { logs.Info("get_cmr Query Error", err.Error()) } } rows1.Close() // 打印振动数据统计 fmt.Println("\n========== 振动/钻压数据 ==========") fmt.Printf("振动数据共有 %d 天的数据\n", len(vibrateDateMap)) if len(vibrateDateMap) > 0 { fmt.Println("振动数据日期列表及数据条数:") dates := make([]string, 0, len(vibrateDateMap)) for date := range vibrateDateMap { dates = append(dates, date) } sort.Strings(dates) for _, date := range dates { fmt.Printf("%s: %d 条\n", date, vibrateCountMap[date]) } } // 补充振动数据 fmt.Println("\n检查振动数据条数少于2的日期并补充...") needVibrateDates := make([]string, 0) for date := range vibrateDateMap { if vibrateCountMap[date] < 2 { needVibrateDates = append(needVibrateDates, date) } } if len(needVibrateDates) > 0 { fmt.Printf("振动数据发现 %d 个日期少于2条\n", len(needVibrateDates)) sort.Strings(needVibrateDates) for _, supplementDate := range needVibrateDates { currentCount := vibrateCountMap[supplementDate] if currentCount == 0 { fmt.Printf("日期 %s 有0条,补充最早和最晚各1条\n", supplementDate) start := supplementDate + " 00:00:00" end := supplementDate + " 23:59:59" // 最早 sqlEarliest := fmt.Sprintf(` SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) ORDER BY [6752] ASC`, start, end) fmt.Println("sqlEarliest--------", sqlEarliest) rowsE, err := conn.Query(sqlEarliest) if err == nil { for rowsE.Next() { var v Cmr_input_record var vib, wob, dr, hl string var ot string if err := rowsE.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s 振动值: %sg 钻压值: %skN 钻速值: %sr/min 水平段长度: %sm`, v.Time, vib, wob, dr, hl) dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" 已添加最早: %s\n", v.Time) } } } rowsE.Close() } // 最晚 sqlLatest := fmt.Sprintf(` SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) ORDER BY [6752] DESC`, start, end) rowsL, err := conn.Query(sqlLatest) if err == nil { for rowsL.Next() { var v Cmr_input_record var vib, wob, dr, hl string var ot string if err := rowsL.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s 振动值: %sg 钻压值: %skN 钻速值: %sr/min 水平段长度: %sm`, v.Time, vib, wob, dr, hl) dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" 已添加最晚: %s\n", v.Time) } } } rowsL.Close() } } else if currentCount == 1 { fmt.Printf("日期 %s 有1条,根据时间判断补充...\n", supplementDate) times := vibrateTimeMap[supplementDate] if len(times) > 0 { timeStr := times[0] parts := strings.Split(timeStr, ":") if len(parts) == 3 { hour, _ := strconv.Atoi(parts[0]) start := supplementDate + " 00:00:00" end := supplementDate + " 23:59:59" if hour < 12 { sqlLatest := fmt.Sprintf(` SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) ORDER BY [6752] DESC`, start, end) rowsL, err := conn.Query(sqlLatest) if err == nil { for rowsL.Next() { var v Cmr_input_record var vib, wob, dr, hl string var ot string if err := rowsL.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s 振动值: %sg 钻压值: %skN 钻速值: %sr/min 水平段长度: %sm`, v.Time, vib, wob, dr, hl) dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" 已添加最晚: %s\n", v.Time) } } } rowsL.Close() } } else { sqlEarliest := fmt.Sprintf(` SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] FROM [ENGINEERSERVICES] WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) ORDER BY [6752] ASC`, start, end) rowsE, err := conn.Query(sqlEarliest) if err == nil { for rowsE.Next() { var v Cmr_input_record var vib, wob, dr, hl string var ot string if err := rowsE.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s 振动值: %sg 钻压值: %skN 钻速值: %sr/min 水平段长度: %sm`, v.Time, vib, wob, dr, hl) dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup { resp = append(resp, v) fmt.Printf(" 已添加最早: %s\n", v.Time) } } } rowsE.Close() } } } } } } } // ============== 第三部分:泥浆数据 ============== selSql = "select distinct [5209],[5210],[5211],[5212],[5219] from [EQUIPMENTRECORDS] WHERE NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) order by [5219]" rows1, err = conn.Query(selSql) fmt.Println("selSql---------", selSql) if err != nil { logs.Info("get_cmr_record_data Query Error", err.Error()) return } var old_s1, old_s2, old_s3, old_s4 float32 mudDateMap := make(map[string]bool) // 泥浆数据不同日期 mudCountMap := make(map[string]int) // 泥浆数据每个日期已有数量 mudTimeMap := make(map[string][]string) // 泥浆数据每个日期已有的时间点 for rows1.Next() { var v Cmr_input_record var s1, s2, s3, s4 float32 var originalTime string if err := rows1.Scan(&s1, &s2, &s3, &s4, &originalTime); err == nil { v.Time = originalTime // 记录原始时间用于统计 if len(v.Time) >= 19 { originalTimeForStat := v.Time v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) // 统计日期 if len(v.Time) >= 10 { dateOnly := v.Time[:10] mudDateMap[dateOnly] = true // 记录原始时间点 if len(originalTimeForStat) >= 19 { timeOnly := originalTimeForStat[11:19] mudTimeMap[dateOnly] = append(mudTimeMap[dateOnly], timeOnly) } } } if s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001 { continue } if old_s1 == s1 && old_s2 == s2 && old_s3 == s3 && old_s4 == s4 { continue } v.Context = fmt.Sprintf(`%s 泥浆密度: %sg/cm^3 泥浆粘度: %ss 排量: %sL/s 泥浆含沙量: %s%%`, v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) resp = append(resp, v) // 统计数量 if len(v.Time) >= 10 { dateOnly := v.Time[:10] mudCountMap[dateOnly]++ } old_s1 = s1 old_s2 = s2 old_s3 = s3 old_s4 = s4 } else { logs.Info("get_cmr Query Error", err.Error()) } } rows1.Close() // 打印泥浆数据统计 fmt.Println("\n========== 泥浆数据 ==========") fmt.Printf("泥浆数据共有 %d 天的数据\n", len(mudDateMap)) if len(mudDateMap) > 0 { fmt.Println("泥浆数据日期列表及数据条数:") dates := make([]string, 0, len(mudDateMap)) for date := range mudDateMap { dates = append(dates, date) } sort.Strings(dates) for _, date := range dates { fmt.Printf("%s: %d 条\n", date, mudCountMap[date]) } } // 补充泥浆数据 fmt.Println("\n检查泥浆数据条数少于2的日期并补充...") needMudDates := make([]string, 0) for date := range mudDateMap { if mudCountMap[date] < 2 { needMudDates = append(needMudDates, date) } } if len(needMudDates) > 0 { fmt.Printf("泥浆数据发现 %d 个日期少于2条\n", len(needMudDates)) sort.Strings(needMudDates) for _, supplementDate := range needMudDates { currentCount := mudCountMap[supplementDate] if currentCount == 0 { fmt.Printf("日期 %s 有0条,补充最早和最晚各1条\n", supplementDate) start := supplementDate + " 00:00:00" end := supplementDate + " 23:59:59" // 最早一条 sqlEarliest := fmt.Sprintf(` SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] FROM [EQUIPMENTRECORDS] WHERE [5219] BETWEEN '%s' AND '%s' AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) ORDER BY [5219] ASC`, start, end) rowsE, err := conn.Query(sqlEarliest) if err == nil { for rowsE.Next() { var v Cmr_input_record var s1, s2, s3, s4 float32 var ot string if err := rowsE.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s 泥浆密度: %sg/cm^3 泥浆粘度: %ss 排量: %sL/s 泥浆含沙量: %s%%`, v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) // 去重检查 dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { resp = append(resp, v) fmt.Printf(" 已添加最早: %s\n", v.Time) } } } rowsE.Close() } // 最晚一条 sqlLatest := fmt.Sprintf(` SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] FROM [EQUIPMENTRECORDS] WHERE [5219] BETWEEN '%s' AND '%s' AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) ORDER BY [5219] DESC`, start, end) rowsL, err := conn.Query(sqlLatest) if err == nil { for rowsL.Next() { var v Cmr_input_record var s1, s2, s3, s4 float32 var ot string if err := rowsL.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s 泥浆密度: %sg/cm^3 泥浆粘度: %ss 排量: %sL/s 泥浆含沙量: %s%%`, v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { resp = append(resp, v) fmt.Printf(" 已添加最晚: %s\n", v.Time) } } } rowsL.Close() } } else if currentCount == 1 { fmt.Printf("日期 %s 有1条,根据时间判断补充...\n", supplementDate) // 获取已有时间点 times := mudTimeMap[supplementDate] if len(times) > 0 { timeStr := times[0] // "HH:MM:SS" parts := strings.Split(timeStr, ":") if len(parts) == 3 { hour, _ := strconv.Atoi(parts[0]) start := supplementDate + " 00:00:00" end := supplementDate + " 23:59:59" if hour < 12 { // 补充最晚 sqlLatest := fmt.Sprintf(` SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] FROM [EQUIPMENTRECORDS] WHERE [5219] BETWEEN '%s' AND '%s' AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) ORDER BY [5219] DESC`, start, end) rowsL, err := conn.Query(sqlLatest) if err == nil { for rowsL.Next() { var v Cmr_input_record var s1, s2, s3, s4 float32 var ot string if err := rowsL.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s 泥浆密度: %sg/cm^3 泥浆粘度: %ss 排量: %sL/s 泥浆含沙量: %s%%`, v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { resp = append(resp, v) fmt.Printf(" 已添加最晚: %s\n", v.Time) } } } rowsL.Close() } } else { // 补充最早 sqlEarliest := fmt.Sprintf(` SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] FROM [EQUIPMENTRECORDS] WHERE [5219] BETWEEN '%s' AND '%s' AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) ORDER BY [5219] ASC`, start, end) rowsE, err := conn.Query(sqlEarliest) if err == nil { for rowsE.Next() { var v Cmr_input_record var s1, s2, s3, s4 float32 var ot string if err := rowsE.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { v.Time = ot if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } v.Context = fmt.Sprintf(`%s 泥浆密度: %sg/cm^3 泥浆粘度: %ss 排量: %sL/s 泥浆含沙量: %s%%`, v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) dup := false for _, item := range resp { if item.Time == v.Time && item.Context == v.Context { dup = true break } } if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { resp = append(resp, v) fmt.Printf(" 已添加最早: %s\n", v.Time) } } } rowsE.Close() } } } } } } } // 最后统一按时间倒序排序 sort.Slice(resp, func(i, j int) bool { return resp[i].Time > resp[j].Time }) fmt.Printf("\n所有数据处理完成,最终共有 %d 条数据记录\n", len(resp)) return } func get_cmr_record_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_cmr_record_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_cmr_record_req json.Unmarshal(reqdata, &req) data := get_cmr_record_data_en(req.OpUser, req.Wellname) for i := 0; i < len(data); i++ { data[i].Context = strings.ReplaceAll(data[i].Context, "%", "%%") //fmt.Println(data[i].Context) } var resp get_cmr_record_resp resp.Data = append(resp.Data, data...) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_cmr_record_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_cmr_record(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_cmr_record recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_cmr_record_req json.Unmarshal(reqdata, &req) data := get_cmr_record_data(req.OpUser, req.Wellname) for i := 0; i < len(data); i++ { data[i].Context = strings.ReplaceAll(data[i].Context, "%", "%%") // fmt.Println(data[i].Context) } var resp get_cmr_record_resp resp.Data = append(resp.Data, data...) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_cmr_record recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_cmr_data(op_user string, wellname string) (resp Cmr) { var cnt int ps_info := get_ps_info(op_user) selSql := fmt.Sprintf("select [data] from [analysis_es] where [wellname]='%s' ", wellname) row, err := sqlConn.Query(selSql) if err != nil { logs.Info("get_cmr_data Query Error", err.Error()) return } for row.Next() { var s string if err := row.Scan(&s); err == nil { cnt++ json.Unmarshal([]byte(s), &resp) if len(resp.Device_data) == 0 { resp.Device_data = []Device{} } if len(resp.Drilling_data) == 0 { resp.Drilling_data = []Drilling{} } if len(resp.Refer_Drilling_data) == 0 { resp.Refer_Drilling_data = []Drilling{} } resp.Next_state = strings.ReplaceAll(resp.Next_state, "%", "%%") if len(resp.T1) >= 19 { resp.T1 = do_time_by_ps(resp.T1, ps_info) } if len(resp.T2) >= 19 { resp.T2 = do_time_by_ps(resp.T2, ps_info) } if len(resp.T3) >= 19 { resp.T3 = do_time_by_ps(resp.T3, ps_info) } if len(resp.T4) >= 19 { resp.T4 = do_time_by_ps(resp.T4, ps_info) } maxTemp, _ := decimal.NewFromFloat(float64(resp.Max_temp)).Round(2).Float64() if ps_info.R2 == "2" { maxTemp, _ = decimal.NewFromFloat(float64(1.8*maxTemp + 32)).Round(2).Float64() } resp.Max_temp = float32(maxTemp) } else { logs.Info("get_cmr_data Query Error", err.Error()) } } row.Close() if cnt == 0 { resp.Device_data = []Device{} resp.Drilling_data = []Drilling{} resp.Refer_Drilling_data = []Drilling{} } return } func get_cmr(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_cmr recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_cmr_req json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp get_cmr_resp var cnt int selSql := fmt.Sprintf("select [data] from [analysis_es] where [wellname]='%s' ", req.Wellname) row, err := sqlConn.Query(selSql) if err != nil { logs.Info("get_cmr Query Error", err.Error()) goto exit } for row.Next() { var s string if err := row.Scan(&s); err == nil { cnt++ json.Unmarshal([]byte(s), &resp.Data) if len(resp.Data.Device_data) == 0 { resp.Data.Device_data = []Device{} } if len(resp.Data.Drilling_data) == 0 { resp.Data.Drilling_data = []Drilling{} } if len(resp.Data.Refer_Drilling_data) == 0 { resp.Data.Refer_Drilling_data = []Drilling{} } resp.Data.Next_state = strings.ReplaceAll(resp.Data.Next_state, "%", "%%") if len(resp.Data.T1) >= 19 { resp.Data.T1 = do_time_by_ps(resp.Data.T1, ps_info) } if len(resp.Data.T2) >= 19 { resp.Data.T2 = do_time_by_ps(resp.Data.T2, ps_info) } if len(resp.Data.T3) >= 19 { resp.Data.T3 = do_time_by_ps(resp.Data.T3, ps_info) } if len(resp.Data.T4) >= 19 { resp.Data.T4 = do_time_by_ps(resp.Data.T4, ps_info) } maxTemp, _ := decimal.NewFromFloat(float64(resp.Data.Max_temp)).Round(2).Float64() if ps_info.R2 == "2" { maxTemp, _ = decimal.NewFromFloat(float64(1.8*maxTemp + 32)).Round(2).Float64() } resp.Data.Max_temp = float32(maxTemp) } else { logs.Info("get_cmr Query Error", err.Error()) } } row.Close() if cnt == 0 { resp.Data.Device_data = []Device{} resp.Data.Drilling_data = []Drilling{} resp.Data.Refer_Drilling_data = []Drilling{} } exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_cmr recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func export_well_nb_pdf_en(user string, wellname string, data []Well_battery_info) (filename string) { ps_info := get_ps_info(user) //W: 595, H: 842 page_W := gopdf.PageSizeA4Landscape.W page_H := gopdf.PageSizeA4Landscape.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4Landscape}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 //var h_span float64 = 150 page_context_H := page_H - margin_top var one_cm float64 = page_W / float64(21) page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4Landscape.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4Landscape.W}, "Battery Usage Report", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4Landscape.W / 2}, fmt.Sprintf("Report Time:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4Landscape.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4Landscape.W / 2) - margin_left}, fmt.Sprintf(`Report NO.:%s+E0001`, wellname), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4Landscape.W-margin_left, margin_top+60) //cal total pagenum var cur_page int = 1 var total_page int = 1 total_page = get_nb_pdf_pagecnt_en(user, data) fmt.Println("电池使用报告总页码:", total_page) var base float64 = margin_top + 60 if base+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+700, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+400, base, margin_left+400, base+span) pdf.Line(margin_left+580, base, margin_left+580, base+span) pdf.Line(margin_left+700, base, margin_left+700, base+span) option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Device Series No", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Device Serial No", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 160}, "BAT Serial No", option) pdf.SetXY(margin_left+400, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, "PERIOD", option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "ACTIVE(h)", option) base += span pdf.Line(margin_left, base, margin_left+700, base) for i := 0; i < len(data); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+700, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+400, base, margin_left+400, base+span) pdf.Line(margin_left+580, base, margin_left+580, base+span) pdf.Line(margin_left+700, base, margin_left+700, base+span) option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Device Series No", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Device Serial No", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 160}, "BAT Serial No", option) pdf.SetXY(margin_left+400, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, "PERIOD", option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "ACTIVE(h)", option) base += span pdf.Line(margin_left, base, margin_left+700, base) } else { pdf.SetXY(margin_left*1, base) } var max_h int = 1 context1, _ := pdf.SplitTextWithWordWrap(data[i].Sid, 100) if len(context1) > int(max_h) { max_h = len(context1) } fmt.Println(context1) context2, _ := pdf.SplitTextWithWordWrap(data[i].Iid, 100) if len(context2) > int(max_h) { max_h = len(context2) } fmt.Println(context2) context3, _ := pdf.SplitTextWithWordWrap(data[i].Bcode, 200) if len(context3) > int(max_h) { max_h = len(context3) } fmt.Println(context3) fmt.Println("max:", max_h) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+700, base) pdf.Line(margin_left, base, margin_left, base+(float64(max_h)*span)) pdf.Line(margin_left+120, base, margin_left+120, base+(float64(max_h)*span)) pdf.Line(margin_left+240, base, margin_left+240, base+(float64(max_h)*span)) pdf.Line(margin_left+400, base, margin_left+400, base+(float64(max_h)*span)) pdf.Line(margin_left+580, base, margin_left+580, base+(float64(max_h)*span)) pdf.Line(margin_left+700, base, margin_left+700, base+(float64(max_h)*span)) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center for k := 0; k < len(context1); k++ { pdf.SetXY(margin_left, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, context1[k], option) } for k := 0; k < len(context2); k++ { pdf.SetXY(margin_left+120, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, context2[k], option) fmt.Println("context2:", context2[k]) } for k := 0; k < len(context3); k++ { pdf.SetXY(margin_left+240, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 160}, context3[k], option) } pdf.SetXY(margin_left+400, base) s := do_date_time_by_ps(data[i].Bt, ps_info) + "~" + do_date_time_by_ps(data[i].Et, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, s, option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, fmt.Sprintf(`%0.2f`, data[i].Uset), option) base += (float64(max_h) * span) pdf.Line(margin_left, base, margin_left+700, base) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4Landscape.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Print Account:%s`, user)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ //save beginTime := time.Now().UnixNano() pdf.WritePdf(fmt.Sprintf(`./authfile/%v.pdf`, beginTime)) filename = strconv.FormatInt(beginTime, 10) return } func export_well_nb_pdf(user string, wellname string, data []Well_battery_info) (filename string) { ps_info := get_ps_info(user) //W: 595, H: 842 page_W := gopdf.PageSizeA4Landscape.W page_H := gopdf.PageSizeA4Landscape.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4Landscape}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 //var h_span float64 = 150 page_context_H := page_H - margin_top var one_cm float64 = page_W / float64(21) page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4Landscape.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4Landscape.W}, "电池使用报告", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4Landscape.W / 2}, fmt.Sprintf("报告时间:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4Landscape.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4Landscape.W / 2) - margin_left}, fmt.Sprintf(`报告编号:%s+E0001`, wellname), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4Landscape.W-margin_left, margin_top+60) //cal total pagenum var cur_page int = 1 var total_page int = 1 total_page = get_nb_pdf_pagecnt(user, data) fmt.Println("电池使用报告总页码:", total_page) var base float64 = margin_top + 60 if base+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+700, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+100, base, margin_left+100, base+span) pdf.Line(margin_left+200, base, margin_left+200, base+span) pdf.Line(margin_left+400, base, margin_left+400, base+span) pdf.Line(margin_left+580, base, margin_left+580, base+span) pdf.Line(margin_left+700, base, margin_left+700, base+span) option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "设备系列号", option) pdf.SetXY(margin_left+100, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "设备序列号", option) pdf.SetXY(margin_left+200, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, "电池序列号 ", option) pdf.SetXY(margin_left+400, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, "使用区间", option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "有效时长(小时)", option) base += span pdf.Line(margin_left, base, margin_left+700, base) for i := 0; i < len(data); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+700, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+100, base, margin_left+100, base+span) pdf.Line(margin_left+200, base, margin_left+200, base+span) pdf.Line(margin_left+400, base, margin_left+400, base+span) pdf.Line(margin_left+580, base, margin_left+580, base+span) pdf.Line(margin_left+700, base, margin_left+700, base+span) option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "设备系列号", option) pdf.SetXY(margin_left+100, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "设备序列号", option) pdf.SetXY(margin_left+200, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, "电池序列号 ", option) pdf.SetXY(margin_left+400, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, "使用区间", option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "有效时长(小时)", option) base += span pdf.Line(margin_left, base, margin_left+700, base) } else { pdf.SetXY(margin_left*1, base) } var max_h int = 1 context1, _ := pdf.SplitTextWithWordWrap(data[i].Sid, 100) if len(context1) > int(max_h) { max_h = len(context1) } fmt.Println(context1) context2, _ := pdf.SplitTextWithWordWrap(data[i].Iid, 100) if len(context2) > int(max_h) { max_h = len(context2) } fmt.Println(context2) context3, _ := pdf.SplitTextWithWordWrap(data[i].Bcode, 200) if len(context3) > int(max_h) { max_h = len(context3) } fmt.Println(context3) fmt.Println("max:", max_h) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+600, base) pdf.Line(margin_left, base, margin_left, base+(float64(max_h)*span)) pdf.Line(margin_left+100, base, margin_left+100, base+(float64(max_h)*span)) pdf.Line(margin_left+200, base, margin_left+200, base+(float64(max_h)*span)) pdf.Line(margin_left+400, base, margin_left+400, base+(float64(max_h)*span)) pdf.Line(margin_left+580, base, margin_left+580, base+(float64(max_h)*span)) pdf.Line(margin_left+700, base, margin_left+700, base+(float64(max_h)*span)) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center for k := 0; k < len(context1); k++ { pdf.SetXY(margin_left, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, context1[k], option) } for k := 0; k < len(context2); k++ { pdf.SetXY(margin_left+100, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, context2[k], option) fmt.Println("context2:", context2[k]) } for k := 0; k < len(context3); k++ { pdf.SetXY(margin_left+200, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, context3[k], option) } pdf.SetXY(margin_left+400, base) s := do_date_time_by_ps(data[i].Bt, ps_info) + "~" + do_date_time_by_ps(data[i].Et, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, s, option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, fmt.Sprintf(`%0.2f`, data[i].Uset), option) base += (float64(max_h) * span) pdf.Line(margin_left, base, margin_left+700, base) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4Landscape.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`打印账号:%s`, user)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ //save beginTime := time.Now().UnixNano() pdf.WritePdf(fmt.Sprintf(`./authfile/%v.pdf`, beginTime)) filename = strconv.FormatInt(beginTime, 10) return } func get_well_nb_pdf_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_well_nb_pdf_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_nbpdf_req json.Unmarshal(reqdata, &req) var resp get_nbpdf_resp var filename string var data []Well_battery_info data = get_well_battery(req.OpUser, req.Wellname, req.BCode) filename = export_well_nb_pdf_en(req.OpUser, req.Wellname, data) resp.FileId = fmt.Sprintf(`%v.pdf`, filename) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_well_nb_pdf_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_well_nb_pdf(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_well_nb_pdf recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_nbpdf_req json.Unmarshal(reqdata, &req) var resp get_nbpdf_resp var filename string var data []Well_battery_info data = get_well_battery(req.OpUser, req.Wellname, req.BCode) filename = export_well_nb_pdf(req.OpUser, req.Wellname, data) resp.FileId = fmt.Sprintf(`%v.pdf`, filename) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_well_nb_pdf recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_nb_pdf_pagecnt(user string, data []Well_battery_info) (page_cnt int) { ps_info := get_ps_info(user) //W: 595, H: 842 page_W := gopdf.PageSizeA4Landscape.W page_H := gopdf.PageSizeA4Landscape.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4Landscape}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 //var h_span float64 = 150 page_context_H := page_H - margin_top var one_cm float64 = page_W / float64(21) page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4Landscape.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4Landscape.W}, "电池使用报告", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4Landscape.W / 2}, fmt.Sprintf("报告时间:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4Landscape.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4Landscape.W / 2) - margin_left}, fmt.Sprintf(`报告编号:E0001`), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4Landscape.W-margin_left, margin_top+60) //cal total pagenum var cur_page int = 1 var total_page int = 1 //total_page = get_nb_pdf_pagecnt(user, data) //fmt.Println("电池使用报告总页码:", total_page) var base float64 = margin_top + 60 if base+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+700, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+100, base, margin_left+100, base+span) pdf.Line(margin_left+200, base, margin_left+200, base+span) pdf.Line(margin_left+400, base, margin_left+400, base+span) pdf.Line(margin_left+580, base, margin_left+580, base+span) pdf.Line(margin_left+700, base, margin_left+700, base+span) option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "设备系列号", option) pdf.SetXY(margin_left+100, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "设备序列号", option) pdf.SetXY(margin_left+200, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, "电池序列号 ", option) pdf.SetXY(margin_left+400, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, "使用区间", option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "有效时长(小时)", option) base += span pdf.Line(margin_left, base, margin_left+700, base) for i := 0; i < len(data); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+700, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+100, base, margin_left+100, base+span) pdf.Line(margin_left+200, base, margin_left+200, base+span) pdf.Line(margin_left+400, base, margin_left+400, base+span) pdf.Line(margin_left+580, base, margin_left+580, base+span) pdf.Line(margin_left+700, base, margin_left+700, base+span) option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "设备系列号", option) pdf.SetXY(margin_left+100, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "设备序列号", option) pdf.SetXY(margin_left+200, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, "电池序列号 ", option) pdf.SetXY(margin_left+400, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, "使用区间", option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "有效时长(小时)", option) base += span pdf.Line(margin_left, base, margin_left+700, base) } else { pdf.SetXY(margin_left*1, base) } var max_h int = 1 context1, _ := pdf.SplitTextWithWordWrap(data[i].Sid, 100) if len(context1) > int(max_h) { max_h = len(context1) } fmt.Println(context1) context2, _ := pdf.SplitTextWithWordWrap(data[i].Iid, 100) if len(context2) > int(max_h) { max_h = len(context2) } fmt.Println(context2) context3, _ := pdf.SplitTextWithWordWrap(data[i].Bcode, 200) if len(context3) > int(max_h) { max_h = len(context3) } fmt.Println(context3) fmt.Println("max:", max_h) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+600, base) pdf.Line(margin_left, base, margin_left, base+(float64(max_h)*span)) pdf.Line(margin_left+100, base, margin_left+100, base+(float64(max_h)*span)) pdf.Line(margin_left+200, base, margin_left+200, base+(float64(max_h)*span)) pdf.Line(margin_left+400, base, margin_left+400, base+(float64(max_h)*span)) pdf.Line(margin_left+580, base, margin_left+580, base+(float64(max_h)*span)) pdf.Line(margin_left+700, base, margin_left+700, base+(float64(max_h)*span)) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center for k := 0; k < len(context1); k++ { pdf.SetXY(margin_left, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, context1[k], option) } for k := 0; k < len(context2); k++ { pdf.SetXY(margin_left+100, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, context2[k], option) fmt.Println("context2:", context2[k]) } for k := 0; k < len(context3); k++ { pdf.SetXY(margin_left+200, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, context3[k], option) } pdf.SetXY(margin_left+400, base) s := do_date_time_by_ps(data[i].Bt, ps_info) + "~" + do_date_time_by_ps(data[i].Et, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, s, option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, fmt.Sprintf(`%0.2f`, data[i].Uset), option) base += (float64(max_h) * span) pdf.Line(margin_left, base, margin_left+700, base) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4Landscape.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`打印账号:%s`, user)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) page_cnt = cur_page return } func get_nb_pdf_pagecnt_en(user string, data []Well_battery_info) (page_cnt int) { ps_info := get_ps_info(user) //W: 595, H: 842 page_W := gopdf.PageSizeA4Landscape.W page_H := gopdf.PageSizeA4Landscape.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4Landscape}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 //var h_span float64 = 150 page_context_H := page_H - margin_top var one_cm float64 = page_W / float64(21) page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4Landscape.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4Landscape.W}, "Battery Usage Report", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4Landscape.W / 2}, fmt.Sprintf("Report Time:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4Landscape.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4Landscape.W / 2) - margin_left}, fmt.Sprintf(`Report NO.:E0001`), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4Landscape.W-margin_left, margin_top+60) //cal total pagenum var cur_page int = 1 var total_page int = 1 //total_page = get_nb_pdf_pagecnt(user, data) //fmt.Println("电池使用报告总页码:", total_page) var base float64 = margin_top + 60 if base+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+700, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+400, base, margin_left+400, base+span) pdf.Line(margin_left+580, base, margin_left+580, base+span) pdf.Line(margin_left+700, base, margin_left+700, base+span) option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Device Series No", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Device Serial No", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 160}, "BAT Serial No", option) pdf.SetXY(margin_left+400, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, "PERIOD", option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "ACTIVE(h)", option) base += span pdf.Line(margin_left, base, margin_left+700, base) for i := 0; i < len(data); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+700, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+400, base, margin_left+400, base+span) pdf.Line(margin_left+580, base, margin_left+580, base+span) pdf.Line(margin_left+700, base, margin_left+700, base+span) option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Device Series No", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Device Serial No", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 160}, "BAT Serial No", option) pdf.SetXY(margin_left+400, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, "PERIOD", option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "ACTIVE(h)", option) base += span pdf.Line(margin_left, base, margin_left+700, base) } else { pdf.SetXY(margin_left*1, base) } var max_h int = 1 context1, _ := pdf.SplitTextWithWordWrap(data[i].Sid, 100) if len(context1) > int(max_h) { max_h = len(context1) } fmt.Println(context1) context2, _ := pdf.SplitTextWithWordWrap(data[i].Iid, 100) if len(context2) > int(max_h) { max_h = len(context2) } fmt.Println(context2) context3, _ := pdf.SplitTextWithWordWrap(data[i].Bcode, 200) if len(context3) > int(max_h) { max_h = len(context3) } fmt.Println(context3) fmt.Println("max:", max_h) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+700, base) pdf.Line(margin_left, base, margin_left, base+(float64(max_h)*span)) pdf.Line(margin_left+120, base, margin_left+120, base+(float64(max_h)*span)) pdf.Line(margin_left+240, base, margin_left+240, base+(float64(max_h)*span)) pdf.Line(margin_left+400, base, margin_left+400, base+(float64(max_h)*span)) pdf.Line(margin_left+580, base, margin_left+580, base+(float64(max_h)*span)) pdf.Line(margin_left+700, base, margin_left+700, base+(float64(max_h)*span)) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center for k := 0; k < len(context1); k++ { pdf.SetXY(margin_left, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, context1[k], option) } for k := 0; k < len(context2); k++ { pdf.SetXY(margin_left+120, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, context2[k], option) fmt.Println("context2:", context2[k]) } for k := 0; k < len(context3); k++ { pdf.SetXY(margin_left+240, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 160}, context3[k], option) } pdf.SetXY(margin_left+400, base) s := do_date_time_by_ps(data[i].Bt, ps_info) + "~" + do_date_time_by_ps(data[i].Et, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, s, option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, fmt.Sprintf(`%0.2f`, data[i].Uset), option) base += (float64(max_h) * span) pdf.Line(margin_left, base, margin_left+700, base) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4Landscape.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Print Account:%s`, user)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) page_cnt = cur_page return } func export_nb_pdf(user string, data []Well_battery_info) (filename string) { ps_info := get_ps_info(user) //W: 595, H: 842 page_W := gopdf.PageSizeA4Landscape.W page_H := gopdf.PageSizeA4Landscape.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4Landscape}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 //var h_span float64 = 150 page_context_H := page_H - margin_top var one_cm float64 = page_W / float64(21) page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4Landscape.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4Landscape.W}, "电池使用报告", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4Landscape.W / 2}, fmt.Sprintf("报告时间:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4Landscape.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4Landscape.W / 2) - margin_left}, fmt.Sprintf(`报告编号:E0001`), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4Landscape.W-margin_left, margin_top+60) //cal total pagenum var cur_page int = 1 var total_page int = 1 total_page = get_nb_pdf_pagecnt(user, data) fmt.Println("电池使用报告总页码:", total_page) var base float64 = margin_top + 60 if base+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+700, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+100, base, margin_left+100, base+span) pdf.Line(margin_left+200, base, margin_left+200, base+span) pdf.Line(margin_left+400, base, margin_left+400, base+span) pdf.Line(margin_left+580, base, margin_left+580, base+span) pdf.Line(margin_left+700, base, margin_left+700, base+span) option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "设备系列号", option) pdf.SetXY(margin_left+100, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "设备序列号", option) pdf.SetXY(margin_left+200, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, "电池序列号 ", option) pdf.SetXY(margin_left+400, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, "使用区间", option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "有效时长(小时)", option) base += span pdf.Line(margin_left, base, margin_left+700, base) for i := 0; i < len(data); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) //表头 pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+700, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+100, base, margin_left+100, base+span) pdf.Line(margin_left+200, base, margin_left+200, base+span) pdf.Line(margin_left+400, base, margin_left+400, base+span) pdf.Line(margin_left+580, base, margin_left+580, base+span) pdf.Line(margin_left+700, base, margin_left+700, base+span) option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "设备系列号", option) pdf.SetXY(margin_left+100, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, "设备序列号", option) pdf.SetXY(margin_left+200, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, "电池序列号 ", option) pdf.SetXY(margin_left+400, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, "使用区间", option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "有效时长(小时)", option) base += span pdf.Line(margin_left, base, margin_left+700, base) } else { pdf.SetXY(margin_left*1, base) } var max_h int = 1 context1, _ := pdf.SplitTextWithWordWrap(data[i].Sid, 100) if len(context1) > int(max_h) { max_h = len(context1) } fmt.Println(context1) context2, _ := pdf.SplitTextWithWordWrap(data[i].Iid, 100) if len(context2) > int(max_h) { max_h = len(context2) } fmt.Println(context2) context3, _ := pdf.SplitTextWithWordWrap(data[i].Bcode, 200) if len(context3) > int(max_h) { max_h = len(context3) } fmt.Println(context3) fmt.Println("max:", max_h) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+600, base) pdf.Line(margin_left, base, margin_left, base+(float64(max_h)*span)) pdf.Line(margin_left+100, base, margin_left+100, base+(float64(max_h)*span)) pdf.Line(margin_left+200, base, margin_left+200, base+(float64(max_h)*span)) pdf.Line(margin_left+400, base, margin_left+400, base+(float64(max_h)*span)) pdf.Line(margin_left+580, base, margin_left+580, base+(float64(max_h)*span)) pdf.Line(margin_left+700, base, margin_left+700, base+(float64(max_h)*span)) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center for k := 0; k < len(context1); k++ { pdf.SetXY(margin_left, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, context1[k], option) } for k := 0; k < len(context2); k++ { pdf.SetXY(margin_left+100, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 100}, context2[k], option) fmt.Println("context2:", context2[k]) } for k := 0; k < len(context3); k++ { pdf.SetXY(margin_left+200, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, context3[k], option) } pdf.SetXY(margin_left+400, base) s := do_date_time_by_ps(data[i].Bt, ps_info) + "~" + do_date_time_by_ps(data[i].Et, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, s, option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, fmt.Sprintf(`%0.2f`, data[i].Uset), option) base += (float64(max_h) * span) pdf.Line(margin_left, base, margin_left+700, base) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4Landscape.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`打印账号:%s`, user)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ //save beginTime := time.Now().UnixNano() pdf.WritePdf(fmt.Sprintf(`./authfile/%v.pdf`, beginTime)) filename = strconv.FormatInt(beginTime, 10) return } func export_nb_pdf_en(user string, data []Well_battery_info) (filename string) { ps_info := get_ps_info(user) //W: 595, H: 842 page_W := gopdf.PageSizeA4Landscape.W page_H := gopdf.PageSizeA4Landscape.H pdf := gopdf.GoPdf{} pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4Landscape}) pdf.AddPage() err := pdf.AddTTFFont("simfang", "./simsun.ttf") if err != nil { logs.Error(err.Error()) return } var margin_top float64 = 2.54 * (page_H / float64(29.7)) var margin_left float64 = 1.91 * (page_W / float64(21)) var span float64 = 20 //var h_span float64 = 150 page_context_H := page_H - margin_top var one_cm float64 = page_W / float64(21) page_F_x := page_W/2 - (0.2 * one_cm) page_F_y := gopdf.PageSizeA4Landscape.H - (margin_top / 2) pdf.SetFont("simfang", "", 22) var option gopdf.CellOption option.Align = gopdf.Center pdf.SetXY(0, margin_top) pdf.CellWithOption(&gopdf.Rect{H: 30, W: gopdf.PageSizeA4Landscape.W}, "Battery Usage Report", option) pdf.SetFont("simfang", "", 14) pdf.SetXY(margin_left, margin_top+40) option.Align = gopdf.Left pdf.CellWithOption(&gopdf.Rect{H: 40, W: gopdf.PageSizeA4Landscape.W / 2}, fmt.Sprintf("Report Time:%s", do_time_by_ps(time.Now().Format(loc), ps_info)), option) pdf.SetXY(gopdf.PageSizeA4Landscape.W/2, margin_top+40) option.Align = gopdf.Right pdf.CellWithOption(&gopdf.Rect{H: 40, W: (gopdf.PageSizeA4Landscape.W / 2) - margin_left}, fmt.Sprintf(`Report NO.:E0001`), option) pdf.SetLineWidth(0.1) pdf.Line(margin_left, margin_top+60, gopdf.PageSizeA4Landscape.W-margin_left, margin_top+60) //cal total pagenum var cur_page int = 1 var total_page int = 1 total_page = get_nb_pdf_pagecnt_en(user, data) fmt.Println("电池使用报告总页码:", total_page) var base float64 = margin_top + 60 if base+span+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) } else { pdf.SetXY(margin_left*1, base) } base += span pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+700, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+400, base, margin_left+400, base+span) pdf.Line(margin_left+580, base, margin_left+580, base+span) pdf.Line(margin_left+700, base, margin_left+700, base+span) option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Device Series No", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Device Serial No", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 160}, "BAT Serial No", option) pdf.SetXY(margin_left+400, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, "PERIOD", option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "ACTIVE(h)", option) base += span pdf.Line(margin_left, base, margin_left+700, base) for i := 0; i < len(data); i++ { if base+span > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left*1, base) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+700, base) pdf.Line(margin_left, base, margin_left, base+span) pdf.Line(margin_left+120, base, margin_left+120, base+span) pdf.Line(margin_left+240, base, margin_left+240, base+span) pdf.Line(margin_left+400, base, margin_left+400, base+span) pdf.Line(margin_left+580, base, margin_left+580, base+span) pdf.Line(margin_left+700, base, margin_left+700, base+span) option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Device Series No", option) pdf.SetXY(margin_left+120, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "Device Serial No", option) pdf.SetXY(margin_left+240, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 160}, "BAT Serial No", option) pdf.SetXY(margin_left+400, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, "PERIOD", option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "ACTIVE(h)", option) base += span pdf.Line(margin_left, base, margin_left+700, base) } else { pdf.SetXY(margin_left*1, base) } var max_h int = 1 context1, _ := pdf.SplitTextWithWordWrap(data[i].Sid, 100) if len(context1) > int(max_h) { max_h = len(context1) } fmt.Println(context1) context2, _ := pdf.SplitTextWithWordWrap(data[i].Iid, 100) if len(context2) > int(max_h) { max_h = len(context2) } fmt.Println(context2) context3, _ := pdf.SplitTextWithWordWrap(data[i].Bcode, 200) if len(context3) > int(max_h) { max_h = len(context3) } fmt.Println(context3) fmt.Println("max:", max_h) pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+700, base) pdf.Line(margin_left, base, margin_left, base+(float64(max_h)*span)) pdf.Line(margin_left+120, base, margin_left+120, base+(float64(max_h)*span)) pdf.Line(margin_left+240, base, margin_left+240, base+(float64(max_h)*span)) pdf.Line(margin_left+400, base, margin_left+400, base+(float64(max_h)*span)) pdf.Line(margin_left+580, base, margin_left+580, base+(float64(max_h)*span)) pdf.Line(margin_left+700, base, margin_left+700, base+(float64(max_h)*span)) var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center for k := 0; k < len(context1); k++ { pdf.SetXY(margin_left, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, context1[k], option) } for k := 0; k < len(context2); k++ { pdf.SetXY(margin_left+120, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, context2[k], option) fmt.Println("context2:", context2[k]) } for k := 0; k < len(context3); k++ { pdf.SetXY(margin_left+240, base+(span*float64(k))) pdf.CellWithOption(&gopdf.Rect{H: span, W: 160}, context3[k], option) } pdf.SetXY(margin_left+400, base) s := do_date_time_by_ps(data[i].Bt, ps_info) + "~" + do_date_time_by_ps(data[i].Et, ps_info) pdf.CellWithOption(&gopdf.Rect{H: span, W: 180}, s, option) pdf.SetXY(margin_left+580, base) pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, fmt.Sprintf(`%0.2f`, data[i].Uset), option) base += (float64(max_h) * span) pdf.Line(margin_left, base, margin_left+700, base) } base += (span / 2) if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top } pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, gopdf.PageSizeA4Landscape.W-margin_left, base) base += span if base > page_context_H { pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ pdf.AddPage() base = margin_top pdf.SetXY(margin_left, base) } else { pdf.SetXY(margin_left, base) } pdf.Text(fmt.Sprintf(`Print Account:%s`, user)) pdf.SetXY(page_F_x, page_F_y) pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) cur_page++ //save beginTime := time.Now().UnixNano() pdf.WritePdf(fmt.Sprintf(`./authfile/%v.pdf`, beginTime)) filename = strconv.FormatInt(beginTime, 10) return } func get_well_battery(user string, wellname string, bcode string) (data []Well_battery_info) { ps_info := get_ps_info(user) well_map := make(map[string]string) if _, ok := spe_user[user]; ok { well_data, _ := getWellData(true) for i := 0; i < len(well_data); i++ { well_map[well_data[i].WellNameSource] = well_data[i].Cloud_account } } var selSql string if wellname != "" { selSql = fmt.Sprintf("select [wellname],[sid],[iid],[b_code],[bt],[et],[use_t],[op_flag],[ClOUDACCOUNT] from [analysis_battery_well] where [wellname]='%s' order by [bt] desc", wellname) } else if bcode != "" { likestr := "%" + bcode + "%" selSql = fmt.Sprintf("select [wellname],[sid],[iid],[b_code],[bt],[et],[use_t],[op_flag],[ClOUDACCOUNT] from [analysis_battery_well] where b_code like '%s' order by [bt] desc", likestr) } else { selSql = fmt.Sprintf("select [wellname],[sid],[iid],[b_code],[bt],[et],[use_t],[op_flag],[ClOUDACCOUNT] from [analysis_battery_well] order by [bt] desc") } row, err := sqlConn.Query(selSql) if err != nil { logs.Error("get_well_battery Query Error", err.Error()) return } defer row.Close() for row.Next() { var d Well_battery_info if err := row.Scan(&d.WellName, &d.Sid, &d.Iid, &d.Bcode, &d.Bt, &d.Et, &d.Uset, &d.Flag, &d.Cloud_account); err == nil { if spe_name, ok := spe_user[user]; ok { if well_map[d.WellName] != spe_name { continue } } d.Bt = do_date_time_by_ps(d.Bt, ps_info) d.Et = do_date_time_by_ps(d.Et, ps_info) data = append(data, d) } else { logs.Error(err.Error()) } } return } func get_nb_pdf_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_nb_pdf recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_nbpdf_req json.Unmarshal(reqdata, &req) var resp get_nbpdf_resp var filename string var data []Well_battery_info data = get_well_battery(req.OpUser, req.Wellname, req.BCode) filename = export_nb_pdf_en(req.OpUser, data) resp.FileId = fmt.Sprintf(`%v.pdf`, filename) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_nb_pdf recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_nb_pdf(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_nb_pdf recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_nbpdf_req json.Unmarshal(reqdata, &req) var resp get_nbpdf_resp var filename string var data []Well_battery_info data = get_well_battery(req.OpUser, req.Wellname, req.BCode) filename = export_nb_pdf(req.OpUser, data) resp.FileId = fmt.Sprintf(`%v.pdf`, filename) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_nb_pdf recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_nb_warning_csv_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_nb_warning_csv_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_nb_csv_req json.Unmarshal(reqdata, &req) var resp get_nb_csv_resp var b_data []battery_info selSql := fmt.Sprintf("select [battery_sid],[battery_code],[use_t] from [analysis_battery] order by ID desc ") row, err := sqlConn.Query(selSql) if err != nil { logs.Info("get_nb_warning_csv_en Query Error", err.Error()) goto write_csv } for row.Next() { var d battery_info if err := row.Scan(&d.Bid, &d.Bcode, &d.Uset); err == nil { if d.Uset > float32(300) { b_data = append(b_data, d) } } else { logs.Info("Query Error", err.Error()) } } row.Close() write_csv: var data [][]string var w *csv.Writer filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { logs.Error(err.Error()) goto exit } defer f.Close() data = append(data, []string{"Battery Series No.", "Battery Serial No.", "Used Time(h)"}) for i := 0; i < len(b_data); i++ { v := b_data[i] data = append(data, []string{v.Bid, v.Bcode, fmt.Sprintf("%.2f", v.Uset)}) } f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM w = csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_nb_warning_csv_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_nb_warning_csv(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_nb_warning_csv recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_nb_csv_req json.Unmarshal(reqdata, &req) var resp get_nb_csv_resp var b_data []battery_info selSql := fmt.Sprintf("select [battery_sid],[battery_code],[use_t] from [analysis_battery] order by ID desc ") row, err := sqlConn.Query(selSql) if err != nil { logs.Info("get_nb_warning_csv Query Error", err.Error()) goto write_csv } for row.Next() { var d battery_info if err := row.Scan(&d.Bid, &d.Bcode, &d.Uset); err == nil { if d.Uset > float32(300) { b_data = append(b_data, d) } } else { logs.Info("Query Error", err.Error()) } } row.Close() write_csv: var data [][]string var w *csv.Writer filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { logs.Error(err.Error()) goto exit } defer f.Close() data = append(data, []string{"电池系列号", "电池序列号", "已使用时间"}) for i := 0; i < len(b_data); i++ { v := b_data[i] data = append(data, []string{v.Bid, v.Bcode, fmt.Sprintf("%.2f", v.Uset)}) } f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM w = csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_nb_warning_csv recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_nb_csv_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_nb_csv_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_nb_csv_req json.Unmarshal(reqdata, &req) var resp get_nb_csv_resp var b_data []battery_info selSql := fmt.Sprintf("select [battery_sid],[battery_code],[use_t] from [analysis_battery] order by ID desc ") row, err := sqlConn.Query(selSql) if err != nil { logs.Info("get_nb_csv_en Query Error", err.Error()) goto write_csv } for row.Next() { var d battery_info if err := row.Scan(&d.Bid, &d.Bcode, &d.Uset); err == nil { b_data = append(b_data, d) } else { logs.Info("Query Error", err.Error()) } } row.Close() write_csv: var data [][]string var w *csv.Writer filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { logs.Error(err.Error()) goto exit } defer f.Close() data = append(data, []string{"Battery Series No.", "Battery Serial No.", "Used Time(h)"}) for i := 0; i < len(b_data); i++ { v := b_data[i] data = append(data, []string{v.Bid, v.Bcode, fmt.Sprintf("%.2f", v.Uset)}) } f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM w = csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_nb_csv_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_nb_csv(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_nb_csv recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_nb_csv_req json.Unmarshal(reqdata, &req) var resp get_nb_csv_resp var b_data []battery_info selSql := fmt.Sprintf("select [battery_sid],[battery_code],[use_t] from [analysis_battery] order by ID desc ") row, err := sqlConn.Query(selSql) if err != nil { logs.Info("get_nb_csv Query Error", err.Error()) goto write_csv } for row.Next() { var d battery_info if err := row.Scan(&d.Bid, &d.Bcode, &d.Uset); err == nil { b_data = append(b_data, d) } else { logs.Info("Query Error", err.Error()) } } row.Close() write_csv: var data [][]string var w *csv.Writer filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { logs.Error(err.Error()) goto exit } defer f.Close() data = append(data, []string{"电池系列号", "电池序列号", "已使用时间"}) for i := 0; i < len(b_data); i++ { v := b_data[i] data = append(data, []string{v.Bid, v.Bcode, fmt.Sprintf("%.2f", v.Uset)}) } f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM w = csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_nb_csv recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func collect_all_nb() { m := make(map[string]bool) var data []battery_info sel_sql := fmt.Sprintf(`select distinct [b_code],[bt] from [analysis_battery_well] order by [bt] desc`) rows, err := sqlConn.Query(sel_sql) if err != nil { logs.Error("collect_all_nb err:", err.Error()) return } for rows.Next() { var v battery_info var s string if err = rows.Scan(&v.Bcode, &s); err == nil { if _, ok := m[v.Bcode]; ok { } else { m[v.Bcode] = true data = append(data, v) } } } rows.Close() for i := 0; i < len(data); i++ { sel_sql := fmt.Sprintf(`select [use_t] from [analysis_battery_well] where [b_code]='%s' `, data[i].Bcode) rows1, err := sqlConn.Query(sel_sql) if err != nil { logs.Error("collect_all_nb err:", err.Error()) continue } var use_t float32 for rows1.Next() { var f float32 if err = rows1.Scan(&f); err == nil { use_t += f } } rows1.Close() data[i].Uset = use_t } b_life_map := make(map[string]float32) for i := 0; i < len(data); i++ { sel_sql := fmt.Sprintf(`select [b_life] from [analysis_battery_well] where [b_code]='%s' and [b_life]>0 `, data[i].Bcode) rows1, err := sqlConn.Query(sel_sql) if err != nil { logs.Error("collect_all_nb err:", err.Error()) continue } var f float32 for rows1.Next() { if err = rows1.Scan(&f); err == nil { } } rows1.Close() b_life_map[data[i].Bcode] = f } //电池寿命 for i := 0; i < len(data); i++ { bcode := data[i].Bcode bcode_arr := strings.Split(bcode, "/") var t_sql string for j := 0; j < len(bcode_arr); j++ { if t_sql == "" { t_sql = fmt.Sprintf(` [b_code]='%s' `, bcode_arr[j]) } else { t_sql += fmt.Sprintf(` or [b_code]='%s' `, bcode_arr[j]) } } sel_sql := fmt.Sprintf(`select [b_life] from [battery_life] where %s `, t_sql) fmt.Println(sel_sql) rows1, err := sqlConn.Query(sel_sql) if err != nil { logs.Error("collect_all_nb err:", err.Error()) continue } var b_life string var f_blife float64 for rows1.Next() { if err = rows1.Scan(&b_life); err == nil { life, _ := strconv.ParseFloat(b_life, 64) f_blife += life } } rows1.Close() data[i].B_life = fmt.Sprintf(`%0.2f`, f_blife) if data[i].Bcode == "3534" { fmt.Println("blife", f_blife) } if int(f_blife) == 0 { if _, ok := b_life_map[bcode]; ok { f_blife = float64(b_life_map[bcode]) if int(f_blife) == 0 { f_blife = 200 } } else { f_blife = 200 } data[i].B_life = fmt.Sprintf(`%0.2f`, f_blife*float64(len(bcode_arr))) if data[i].Bcode == "3534" { fmt.Println("blife", f_blife) } } if f_blife*float64(len(bcode_arr)) > 0 { //life, _ := strconv.ParseFloat(data[i].B_life, 64) if float32(f_blife*float64(len(bcode_arr)))-data[i].Uset > 0 { data[i].Remaining_t = float32(f_blife*float64(len(bcode_arr))) - data[i].Uset } } } remove_sql := fmt.Sprintf(`delete from [analysis_battery] where ID>0`) sqlConn.Exec(remove_sql) for i := 0; i < len(data); i++ { insert_sql := fmt.Sprintf(`INSERT INTO [analysis_battery] ([battery_sid] ,[battery_code] ,[use_t] ,[remaining_t] ,[b_life]) VALUES ('%s' ,'%s' ,%v,%v,'%s')`, data[i].Bid, data[i].Bcode, data[i].Uset, data[i].Remaining_t, data[i].B_life) _, err = sqlConn.Exec(insert_sql) if err != nil { logs.Error(fmt.Sprintf(`%s err:%s`, insert_sql, err.Error())) } } } func get_dring_inout_seconds(conn *sql.DB, bt string, et string) (total_seconds int64) { var err error var row *sql.Rows var sqlstr string if et != "" { sqlstr = fmt.Sprintf("select COALESCE([5203],''),COALESCE([5219],'') from EQUIPMENTRECORDS where [5203] !='' and [5219] !='' and ([5219] >= '%s' and [5219]<= '%s' ) order by [5219] asc", bt, et) } else { sqlstr = fmt.Sprintf("select COALESCE([5203],''),COALESCE([5219],'') from EQUIPMENTRECORDS where [5203] !='' and [5219] !='' and [5219] >= '%s' order by [5219] asc", bt) } row, err = conn.Query(sqlstr) if err != nil { logs.Info("Query Error", err.Error()) return } defer row.Close() timelayout := "2006-01-02 15:04:05" loc, _ := time.LoadLocation("Local") var old_state, old_time string for row.Next() { var d GetMhSRespData if err := row.Scan(&d.WorkState, &d.SaveTime); err == nil { //fmt.Println("savetime:", d.SaveTime) d.SaveTime = d.SaveTime[:10] + " " + d.SaveTime[11:19] if d.SaveTime == "1900-01-01 00:00:00" { d.SaveTime = "" } else { d.SaveTime = d.SaveTime[:10] + " " + d.SaveTime[11:19] } if old_state == "下钻" || old_state == "起钻" { oldTime, _ := time.ParseInLocation(timelayout, old_time, loc) lastTime, _ := time.ParseInLocation(timelayout, d.SaveTime, loc) total_seconds += int64(lastTime.Sub(oldTime).Seconds()) } old_state = d.WorkState old_time = d.SaveTime } else { logs.Info("scan Error", err.Error()) } } return } func collect_well_nb_ex() { well_map := make(map[string]wellData) well_data, _ := getWellData(false) for i := 0; i < len(well_data); i++ { well_map[well_data[i].WellNameSource] = well_data[i] } var wellnames []string sel_sql := fmt.Sprintf(`select distinct [6700],[6703] from [BATTERYRECORD] where [6703] > '2024-01-02 00:00:00' order by [6703] desc`) rows, err := sqlConn.Query(sel_sql) if err != nil { logs.Error("collect_well_nb err:", err.Error()) return } for rows.Next() { var v string var t string if err = rows.Scan(&v, &t); err == nil { wellnames = append(wellnames, v) } } rows.Close() for i := 0; i < len(wellnames); i++ { var data []Well_battery_info wellname := wellnames[i] sel_sql := fmt.Sprintf(`select distinct [6703],[6704],[6705],[6707] from [BATTERYRECORD] where [6700]='%s' and [6703] > '2024-01-02 00:00:00' order by [6703] asc `, wellname) rows1, err := sqlConn.Query(sel_sql) if err != nil { logs.Error("collect_well_nb err:", err.Error()) continue } filter_map := make(map[string]bool) for rows1.Next() { var save_time, sid, iid, bcode string if err = rows1.Scan(&save_time, &sid, &iid, &bcode); err == nil { if len(save_time) >= 19 { save_time = save_time[:10] + " " + save_time[11:19] if _, ok := filter_map[bcode+save_time[:10]]; ok { for i := 0; i < len(data); i++ { if data[i].Bcode+data[i].Bt[:10] == bcode+save_time[:10] { data[i].Bt = save_time data[i].Sid = sid data[i].Iid = iid } } continue } else { filter_map[bcode+save_time[:10]] = true } } if len(data) > 0 { if data[len(data)-1].Bt[:10] != save_time[:10] { for i := 0; i < len(data); i++ { if data[i].Et == "" { data[i].Et = save_time } } } } var d Well_battery_info d.WellName = wellname d.Sid = sid d.Iid = iid d.Bcode = bcode d.Bt = save_time d.Flag = 0 if _, ok := well_map[wellname]; ok { d.Cloud_account = well_map[wellname].Cloud_account d.Service_type = well_map[wellname].Service_type } data = append(data, d) } } rows1.Close() if wellname == "吉深4-9平04" { js_data, _ := json.Marshal(data) fmt.Println(string(js_data)) } //按解码数据算使用时间 //timeLayout := "2006-01-02 15:04:05" //loc, _ := time.LoadLocation("Local") var well_db string if _, ok := well_map[wellname]; ok { well_db = well_map[wellname].WellName } if well_db != "" { conn, err := getOdbcConn(well_db) if err != nil { logs.Info("exportWellHistory Connecting Error", err.Error()) continue } for j := 0; j < len(data); j++ { var et_sql string if data[j].Et != "" { et_sql = fmt.Sprintf(`select distinct [4304] from [DECODETABLE] where [4304] is not null and [4304]>'%s' and [4304]<'%s' order by [4304] asc`, data[j].Bt, data[j].Et) } else { et_sql = fmt.Sprintf(`select distinct [4304] from [DECODETABLE] where [4304] is not null and [4304]>'%s' order by [4304] asc`, data[j].Bt) } var t_escapeSecond int64 rows, err := conn.Query(et_sql) if err == nil { //oneHoueSecondes := 3600 timelayout := "2006-01-02 15:04:05" loc, _ := time.LoadLocation("Local") var cnt int var lastTime time.Time var et string for rows.Next() { if err = rows.Scan(&et); err == nil { var t string if len(et) >= 19 { t = et[:10] + " " + et[11:19] } if cnt == 0 { t_escapeSecond += get_dring_inout_seconds(conn, data[j].Bt, t) lastTime, _ = time.ParseInLocation(timelayout, t, loc) } else { endT, _ := time.ParseInLocation(timelayout, t, loc) ts := endT.Unix() - lastTime.Unix() if ts < int64(3600*3) { t_escapeSecond += ts } else { t_escapeSecond += get_dring_inout_seconds(conn, lastTime.Format(timelayout), t) } lastTime = endT } cnt++ } } rows.Close() var t string if len(et) >= 19 { t = et[:10] + " " + et[11:19] t_escapeSecond += get_dring_inout_seconds(conn, t, data[j].Et) } } data[j].Uset = float32(t_escapeSecond) / 3600 } conn.Close() remove_sql := fmt.Sprintf(`delete from [analysis_battery_well] where [wellname]='%s' and [op_flag]!=1`, wellname) sqlConn.Exec(remove_sql) for k := 0; k < len(data); k++ { if data[k].Uset < 0.001 { continue } insert_sql := fmt.Sprintf(`INSERT INTO [analysis_battery_well] ([wellname] ,[sid] ,[iid] ,[b_code] ,[bt] ,[et] ,[use_t] ,[op_flag] ,[ClOUDACCOUNT] ,[service_type]) VALUES ('%s' ,'%s' ,'%s' ,'%s' ,'%s' ,'%s' ,%v ,%d ,'%s',%d)`, data[k].WellName, data[k].Sid, data[k].Iid, data[k].Bcode, data[k].Bt, data[k].Et, data[k].Uset, data[k].Flag, data[k].Cloud_account, data[k].Service_type) fmt.Println(insert_sql) _, err = sqlConn.Exec(insert_sql) if err != nil { logs.Error(fmt.Sprintf(`%s err:%s`, insert_sql, err.Error())) } } } } } func collect_well_nb() { well_map := make(map[string]wellData) well_data, _ := getWellData(true) for i := 0; i < len(well_data); i++ { well_map[well_data[i].WellNameSource] = well_data[i] } var wellnames []string sel_sql := fmt.Sprintf(`select distinct [6700] from [BATTERYRECORD] where [6703] > '2024-06-27 00:00:00' `) rows, err := sqlConn.Query(sel_sql) if err != nil { logs.Error("collect_well_nb err:", err.Error()) return } for rows.Next() { var v string //var t string if err = rows.Scan(&v); err == nil { wellnames = append(wellnames, v) } } rows.Close() for i := 0; i < len(wellnames); i++ { var data []Well_battery_info wellname := wellnames[i] sel_sql := fmt.Sprintf(`select distinct [6703],[6704],[6705],[6707],[6711] from [BATTERYRECORD] where [6700]='%s' and [6703] > '2024-06-27 00:00:00' order by [6703] asc `, wellname) rows1, err := sqlConn.Query(sel_sql) if err != nil { logs.Error("collect_well_nb err:", err.Error()) continue } for rows1.Next() { var save_time, sid, iid, bcode, old_bcode string if err = rows1.Scan(&save_time, &sid, &iid, &bcode, &old_bcode); err == nil { if len(save_time) >= 19 { save_time = save_time[:10] + " " + save_time[11:19] } if old_bcode != "" { for j := len(data) - 1; j >= 0; j-- { if old_bcode == data[j].Bcode { if data[j].Et == "" { data[j].Et = save_time } } } var d Well_battery_info d.WellName = wellname d.Sid = sid d.Iid = iid d.Bcode = bcode d.Bt = save_time //time.Now().Format("2006-01-02 15:04:05") d.Flag = 0 if _, ok := well_map[wellname]; ok { d.Cloud_account = well_map[wellname].Cloud_account d.Service_type = well_map[wellname].Service_type } data = append(data, d) } else { var if_exist bool for j := len(data) - 1; j >= 0; j-- { if bcode == data[j].Bcode { if_exist = true if data[j].Et == "" { if sid != data[j].Sid || iid != data[j].Iid { data[j].Et = save_time var d Well_battery_info d.WellName = wellname d.Sid = sid d.Iid = iid d.Bcode = bcode d.Bt = save_time d.Flag = 0 if _, ok := well_map[wellname]; ok { d.Cloud_account = well_map[wellname].Cloud_account d.Service_type = well_map[wellname].Service_type } data = append(data, d) } } else { var d Well_battery_info d.WellName = wellname d.Sid = sid d.Iid = iid d.Bcode = bcode d.Bt = save_time d.Flag = 0 if _, ok := well_map[wellname]; ok { d.Cloud_account = well_map[wellname].Cloud_account d.Service_type = well_map[wellname].Service_type } data = append(data, d) } break } } if !if_exist { var d Well_battery_info d.WellName = wellname d.Sid = sid d.Iid = iid d.Bcode = bcode d.Bt = save_time d.Flag = 0 if _, ok := well_map[wellname]; ok { d.Cloud_account = well_map[wellname].Cloud_account d.Service_type = well_map[wellname].Service_type } data = append(data, d) } } } } rows1.Close() if wellname == "吉深4-9平04" { js_data, _ := json.Marshal(data) fmt.Println(string(js_data)) } //按解码数据算使用时间 //timeLayout := "2006-01-02 15:04:05" //loc, _ := time.LoadLocation("Local") var well_db string if _, ok := well_map[wellname]; ok { well_db = well_map[wellname].WellName } if well_db != "" { conn, err := getOdbcConn(well_db) if err != nil { logs.Info("exportWellHistory Connecting Error", err.Error()) continue } for j := 0; j < len(data); j++ { var et_sql string if data[j].Et != "" { et_sql = fmt.Sprintf(`select distinct [4304] from [DECODETABLE] where [4304] is not null and [4304]>'%s' and [4304]<'%s' order by [4304] asc`, data[j].Bt, data[j].Et) } else { et_sql = fmt.Sprintf(`select distinct [4304] from [DECODETABLE] where [4304] is not null and [4304]>'%s' order by [4304] asc`, data[j].Bt) } var t_escapeSecond int64 rows, err := conn.Query(et_sql) if err == nil { //oneHoueSecondes := 3600 timelayout := "2006-01-02 15:04:05" loc, _ := time.LoadLocation("Local") var cnt int var lastTime time.Time var et string for rows.Next() { if err = rows.Scan(&et); err == nil { var t string if len(et) >= 19 { t = et[:10] + " " + et[11:19] } if cnt == 0 { lastTime, _ = time.ParseInLocation(timelayout, t, loc) } else { endT, _ := time.ParseInLocation(timelayout, t, loc) ts := endT.Unix() - lastTime.Unix() if ts < int64(1800) { t_escapeSecond += ts } lastTime = endT } cnt++ } } rows.Close() } data[j].Uset = float32(t_escapeSecond) / 3600 } conn.Close() remove_sql := fmt.Sprintf(`delete from [analysis_battery_well] where [wellname]='%s' and [op_flag]!=1`, wellname) sqlConn.Exec(remove_sql) for k := 0; k < len(data); k++ { if data[k].Uset < 0.001 { continue } insert_sql := fmt.Sprintf(`INSERT INTO [analysis_battery_well] ([wellname] ,[sid] ,[iid] ,[b_code] ,[bt] ,[et] ,[use_t] ,[op_flag] ,[ClOUDACCOUNT] ,[service_type]) VALUES ('%s' ,'%s' ,'%s' ,'%s' ,'%s' ,'%s' ,%v ,%d ,'%s',%d)`, data[k].WellName, data[k].Sid, data[k].Iid, data[k].Bcode, data[k].Bt, data[k].Et, data[k].Uset, data[k].Flag, data[k].Cloud_account, data[k].Service_type) fmt.Println(insert_sql) _, err = sqlConn.Exec(insert_sql) if err != nil { logs.Error(fmt.Sprintf(`%s err:%s`, insert_sql, err.Error())) } } } } } func collect_well_nb_1() { well_map := make(map[string]wellData) well_data, _ := getWellData(true) for i := 0; i < len(well_data); i++ { well_map[well_data[i].WellNameSource] = well_data[i] } var wellnames []string sel_sql := fmt.Sprintf(`select distinct [6700] from [BATTERYRECORD] where [6703] > '2024-06-27 00:00:00' `) rows, err := sqlConn.Query(sel_sql) if err != nil { logs.Error("collect_well_nb err:", err.Error()) return } for rows.Next() { var v string //var t string if err = rows.Scan(&v); err == nil { wellnames = append(wellnames, v) } } rows.Close() //获取电池编号 var data []Well_battery_info for i := 0; i < len(wellnames); i++ { wellname := wellnames[i] sel_sql := fmt.Sprintf(`select distinct [6707] from [BATTERYRECORD] where [6700]='%s' and [6703] > '2024-06-27 00:00:00' `, wellname) rows1, err := sqlConn.Query(sel_sql) if err != nil { logs.Error("collect_well_nb err:", err.Error()) continue } for rows1.Next() { var bcode string if err = rows1.Scan(&bcode); err == nil { var d Well_battery_info d.WellName = wellname d.Bcode = bcode d.Flag = 0 if _, ok := well_map[wellname]; ok { d.Cloud_account = well_map[wellname].Cloud_account d.Service_type = well_map[wellname].Service_type } data = append(data, d) } } rows1.Close() } //计算电池的开始结束时间 for i := 0; i < len(data); i++ { v := data[i] sel_sql := fmt.Sprintf(`select distinct [6703],[6704],[6705] from [BATTERYRECORD] where [6700]='%s' and [6707] = '%s' order by [6703] asc`, v.WellName, v.Bcode) rows1, err := sqlConn.Query(sel_sql) if err != nil { logs.Error("collect_well_nb err:", err.Error()) continue } for rows1.Next() { var bt, sid, iid string if err = rows1.Scan(&bt, &sid, &iid); err == nil { if len(bt) >= 19 { bt = bt[:10] + " " + bt[11:19] data[i].Bt = bt } data[i].Sid = sid data[i].Iid = iid break } } rows1.Close() sel_sql = fmt.Sprintf(`select distinct [6703] from [BATTERYRECORD] where [6700]='%s' and [6711] = '%s' `, v.WellName, v.Bcode) rows1, err = sqlConn.Query(sel_sql) if err != nil { logs.Error("collect_well_nb err:", err.Error()) continue } for rows1.Next() { var et string if err = rows1.Scan(&et); err == nil { if len(et) >= 19 { et = et[:10] + " " + et[11:19] if et >= data[i].Bt { data[i].Et = et } } } } rows1.Close() } //电池时间计算 for j := 0; j < len(data); j++ { v := data[j] js_data, _ := json.Marshal(v) logs.Info(fmt.Sprintf(`wellname:%s `, string(js_data))) var well_db string if _, ok := well_map[v.WellName]; ok { well_db = well_map[v.WellName].WellName } if well_db != "" { conn, err := getOdbcConn(well_db) if err != nil { logs.Info("exportWellHistory Connecting Error", err.Error()) continue } var et_sql string if data[j].Et != "" { et_sql = fmt.Sprintf(`select distinct [4304] from [DECODETABLE] where [4304] is not null and [4304]>'%s' and [4304]<'%s' order by [4304] asc`, data[j].Bt, data[j].Et) } else { et_sql = fmt.Sprintf(`select distinct [4304] from [DECODETABLE] where [4304] is not null and [4304]>'%s' order by [4304] asc`, data[j].Bt) } var t_escapeSecond int64 rows, err := conn.Query(et_sql) if err == nil { //oneHoueSecondes := 3600 timelayout := "2006-01-02 15:04:05" loc, _ := time.LoadLocation("Local") var cnt int var lastTime time.Time var et string for rows.Next() { if err = rows.Scan(&et); err == nil { var t string if len(et) >= 19 { t = et[:10] + " " + et[11:19] } if cnt == 0 { t_seconds := get_dring_inout_seconds(conn, data[j].Bt, t) t_escapeSecond += t_seconds //logs.Info(fmt.Sprintf(`wellname %s 开始:%s 结束:%s 用时:%d`, v.WellName, data[j].Bt, t, t_seconds)) lastTime, _ = time.ParseInLocation(timelayout, t, loc) } else { endT, _ := time.ParseInLocation(timelayout, t, loc) ts := endT.Unix() - lastTime.Unix() if ts < int64(3600*3) { t_escapeSecond += ts } else { t_seconds := get_dring_inout_seconds(conn, lastTime.Format(timelayout), t) t_escapeSecond += t_seconds //logs.Info(fmt.Sprintf(`wellname %s 开始:%s 结束:%s 用时:%d`, v.WellName, lastTime.Format(timelayout), t, t_seconds)) } lastTime = endT } cnt++ } } rows.Close() var t string if len(et) >= 19 { t = et[:10] + " " + et[11:19] t_seconds := get_dring_inout_seconds(conn, t, data[j].Et) t_escapeSecond += t_seconds //logs.Info(fmt.Sprintf(`wellname %s 开始:%s 结束:%s 用时:%d`, v.WellName, t, data[j].Et, t_seconds)) } var sel_sql string if et != "" { sel_sql = fmt.Sprintf(`select top 1 [5213] from [EQUIPMENTRECORDS] where [5219]<'%s'`, t) } else { sel_sql = fmt.Sprintf(`select top 1 [5213] from [EQUIPMENTRECORDS] order by [5219] desc`) } rows_1, err := conn.Query(sel_sql) if err == nil { for rows_1.Next() { var s string if err = rows_1.Scan(&s); err == nil { if strings.Contains(s, "伽马") { if strings.Contains(s, "下座键") { data[j].B_life = 180 } else if strings.Contains(s, "上悬挂") { data[j].B_life = 220 } else { data[j].B_life = 200 } } else { if strings.Contains(s, "下座键") { data[j].B_life = 200 } else if strings.Contains(s, "上悬挂") { data[j].B_life = 250 } else { data[j].B_life = 200 } } } } rows_1.Close() } } data[j].Uset = float32(t_escapeSecond) / 3600 logs.Info(fmt.Sprintf(`wellname:%s ust %v`, data[j].WellName, data[j].Uset)) conn.Close() } else { logs.Info(fmt.Sprintf(`no wellname:%s`, v.WellName)) } } //存储 for i := 0; i < len(data); i++ { remove_sql := fmt.Sprintf(`delete from [analysis_battery_well] where [wellname]='%s' and [op_flag]!=1`, data[i].WellName) sqlConn.Exec(remove_sql) } for k := 0; k < len(data); k++ { if data[k].Uset < 0.001 { continue } if data[k].WellName == "ManS7-H7井" && data[k].Bcode == "LHE6113-1586/1589" { data[k].Uset = 355 } insert_sql := fmt.Sprintf(`INSERT INTO [analysis_battery_well] ([wellname] ,[sid] ,[iid] ,[b_code] ,[bt] ,[et] ,[use_t] ,[op_flag] ,[ClOUDACCOUNT] ,[service_type],[b_life]) VALUES ('%s' ,'%s' ,'%s' ,'%s' ,'%s' ,'%s' ,%v ,%d ,'%s',%d,%v)`, data[k].WellName, data[k].Sid, data[k].Iid, data[k].Bcode, data[k].Bt, data[k].Et, data[k].Uset, data[k].Flag, data[k].Cloud_account, data[k].Service_type, data[k].B_life) fmt.Println(insert_sql) _, err = sqlConn.Exec(insert_sql) if err != nil { logs.Error(fmt.Sprintf(`%s err:%s`, insert_sql, err.Error())) } } } func collect_nb_g() { tick := time.NewTicker(time.Hour * 1) fmt.Println("battery collect begin") collect_well_nb_1() collect_all_nb() fmt.Println("battery collect end") for { select { case <-tick.C: collect_well_nb_1() collect_all_nb() fmt.Println("battery collect end") case <-ch_battery_info: collect_well_nb_1() collect_all_nb() fmt.Println("battery collect end") case <-ch_battery_notify: collect_all_nb() fmt.Println("battery collect end") default: time.Sleep(time.Second * 1) } } } func remove_nb_his(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("remove_nb_his recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req remove_nb_his_req json.Unmarshal(reqdata, &req) var selSql string var resp CommonResp b := checkUserIfOnline(req.OpUser) if !b { resp.Ret = -1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } selSql = fmt.Sprintf(`DELETE FROM [analysis_battery_well] where ID=%d`, req.ID) _, err := sqlConn.Exec(selSql) if err != nil { logs.Error("remove_nb_his exec Error", err.Error()) return } var bv battery_info bv.Bcode = req.Bcode bv.Bid = req.Bid ch_battery_info <- bv jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("remove_nb_his recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func update_nb_his(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("update_nb_his recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req update_nb_his_req json.Unmarshal(reqdata, &req) var selSql string var resp CommonResp b := checkUserIfOnline(req.OpUser) if !b { resp.Ret = -1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } if req.Bt > req.Et { resp.Ret = 1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } req.Bt = strings.ReplaceAll(req.Bt, "/", "-") req.Et = strings.ReplaceAll(req.Et, "/", "-") selSql = fmt.Sprintf(` UPDATE [analysis_battery_well] SET [wellname] = '%s' ,[sid] = '%s' ,[iid] = '%s' ,[b_code] = '%s' ,[bt] = '%s' ,[et] = '%s' ,[use_t] = %v ,[op_flag] = %d where ID=%d`, req.Wellname, req.Sid, req.Iid, req.Bcode, req.Bt, req.Et, req.Uset, 1, req.ID) fmt.Println(selSql) _, err := sqlConn.Exec(selSql) if err != nil { logs.Error("update_nb_his exec Error", err.Error()) return } var bv battery_info bv.Bcode = req.Bcode bv.Bid = req.Bid bv.Uset = req.Uset bv.WellName = req.Wellname ch_battery_info <- bv jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("update_nb_his recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func add_nb_his(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("add_nb_his recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req add_nb_his_req json.Unmarshal(reqdata, &req) var selSql string var resp CommonResp b := checkUserIfOnline(req.OpUser) if !b { resp.Ret = -1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } if req.Bt > req.Et { resp.Ret = 1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } selSql = fmt.Sprintf(`INSERT INTO [analysis_battery_well] ([wellname] ,[sid] ,[iid] ,[b_code] ,[bt] ,[et] ,[use_t] ,[op_flag]) VALUES ('%s' ,'%s' ,'%s' ,'%s' ,'%s' ,'%s' ,%v ,%d)`, req.Wellname, req.Sid, req.Iid, req.Bcode, req.Bt, req.Et, req.Uset, 1) _, err := sqlConn.Exec(selSql) if err != nil { logs.Error("add_nb_his exec Error", err.Error()) return } var bv battery_info bv.Bcode = req.Bcode bv.Bid = req.Bid bv.Uset = req.Uset bv.WellName = req.Wellname ch_battery_info <- bv jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("add_nb_his recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_nb_his_ex(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_nb_his_ex recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_nb_his_ex_req json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var selSql string var cntSql string var whereSql string var ifWhere bool if spe_name, ok := spe_user[req.OpUser]; ok { whereSql = fmt.Sprintf(` [ClOUDACCOUNT] = '%s'`, spe_name) ifWhere = true } if req.Wellname != "" { if ifWhere { whereSql += fmt.Sprintf(` and [wellname] = '%s' `, req.Wellname) } else { whereSql += fmt.Sprintf(` [wellname] = '%s' `, req.Wellname) } ifWhere = true } if req.Checked { if ifWhere { whereSql += fmt.Sprintf(` and [service_type] = 1 `) } else { whereSql += fmt.Sprintf(` [service_type] = 1 `) } ifWhere = true } if ifWhere { selSql = fmt.Sprintf("select top %d [ID],[wellname],[sid],[iid],[b_code],[bt],[et],[use_t],[op_flag] from [analysis_battery_well] where [ID] not in (select top %d [ID] from [analysis_battery_well] where %s order by [bt] desc) and %s order by [bt] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID],[wellname],[sid],[iid],[b_code],[bt],[et],[use_t],[op_flag] from [analysis_battery_well] where [ID] not in (select top %d [ID] from [analysis_battery_well] order by [bt] desc) order by [bt] desc", req.Count, (req.Index-1)*req.Count) } if ifWhere { cntSql = fmt.Sprintf("select count([ID]) from [analysis_battery_well] where %s", whereSql) } else { cntSql = fmt.Sprintf("select count([ID]) from [analysis_battery_well]") } cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("get_nb count Query Error", err.Error()) return } row, err := sqlConn.Query(selSql) if err != nil { logs.Error("get_nb_his_ex Query Error", err.Error()) return } defer row.Close() var resp get_nb_his_resp resp.Total = cnt for row.Next() { var d battery_his_info if err := row.Scan(&d.ID, &d.Wellname, &d.Sid, &d.Iid, &d.Bcode, &d.Bt, &d.Et, &d.Uset, &d.Flag); err == nil { d.Bt = do_date_time_by_ps(d.Bt, ps_info) d.Et = do_date_time_by_ps(d.Et, ps_info) resp.Data = append(resp.Data, d) } else { logs.Error(err.Error()) } } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_nb_his_ex recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_nb_his_en(response http.ResponseWriter, request *http.Request) { /*beginTime := time.Now().UnixNano() logs.Info("get_nb_his_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_nb_his_req json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var selSql string var whereSql string if req.Bid == "" || req.Bcode == "" { logs.Error("get_nb_his param is null") return } whereSql += fmt.Sprintf(` [6706] = '%s'`, req.Bid) whereSql += fmt.Sprintf(` and [6707] = '%s' `, req.Bcode) selSql = fmt.Sprintf("select [ID],[6700],[6703],[6704],[6705],[6706],[6707],[6708],[6709],[6710] from [BATTERYRECORD] where %s order by [6703] desc", whereSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("get_nb_his_en Query Error", err.Error()) return } defer row.Close() var resp get_nb_his_resp for row.Next() { var d battery_his_info var action_code int if err := row.Scan(&d.ID, &d.Wellname, &d.Time, &d.Sid, &d.Iid, &d.Bid, &d.Bcode, &action_code, &d.Uset, &d.Flag); err == nil { //fmt.Println(d.Uset) //fmt.Println(d.Time) if len(d.Time) >= 19 { d.Time = d.Time[:10] + " " + d.Time[11:19] d.Time = do_time_by_ps(d.Time, ps_info) } if action_code == 1 { d.Action = "power on" } else { d.Action = "power off" } resp.Data = append(resp.Data, d) } else { logs.Error(err.Error()) } } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_nb_his_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) */ } func get_nb_his(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_nb_his recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_nb_his_req json.Unmarshal(reqdata, &req) well_map := make(map[string]string) if _, ok := spe_user[req.OpUser]; ok { well_data, _ := getWellData(true) for i := 0; i < len(well_data); i++ { well_map[well_data[i].WellNameSource] = well_data[i].Cloud_account } } ps_info := get_ps_info(req.OpUser) var selSql string var whereSql string if req.Bcode == "" { logs.Error("get_nb_his param is null") return } whereSql += fmt.Sprintf(` [b_code] = '%s'`, req.Bcode) selSql = fmt.Sprintf("select [ID],[wellname],[sid],[iid],[b_code],[bt],[et],[use_t],[op_flag] from [analysis_battery_well] where %s order by [bt] desc", whereSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("get_nb_his Query Error", err.Error()) return } defer row.Close() var resp get_nb_his_resp for row.Next() { var d battery_his_info // var action_code int if err := row.Scan(&d.ID, &d.Wellname, &d.Sid, &d.Iid, &d.Bcode, &d.Bt, &d.Et, &d.Uset, &d.Flag); err == nil { //fmt.Println(d.Uset) //fmt.Println(d.Time) if spe_name, ok := spe_user[req.OpUser]; ok { if well_map[d.Wellname] != spe_name { continue } } d.Bt = do_date_time_by_ps(d.Bt, ps_info) d.Et = do_date_time_by_ps(d.Et, ps_info) /*if len(d.Time) >= 19 { d.Time = d.Time[:10] + " " + d.Time[11:19] d.Time = do_time_by_ps(d.Time, ps_info) } if action_code == 1 { d.Action = "上电" } else { d.Action = "断电" }*/ resp.Data = append(resp.Data, d) } else { logs.Error(err.Error()) } } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_nb_his recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_nb(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_nb recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_nb_req json.Unmarshal(reqdata, &req) var selSql string var cntSql string var whereSql string var ifWhere bool if req.Sid != "" { wellnamesource := "%" + req.Sid + "%" whereSql += fmt.Sprintf(` [battery_sid] like '%s'`, wellnamesource) ifWhere = true } if req.Code != "" { likestr := "%" + req.Code + "%" if ifWhere { whereSql += fmt.Sprintf(` and [battery_code] like '%s' `, likestr) } else { whereSql += fmt.Sprintf(` [battery_code] like '%s' `, likestr) } ifWhere = true } if ifWhere { selSql = fmt.Sprintf("select top %d [ID] ,[battery_sid],[battery_code],[use_t] ,[remaining_t],[b_life] from [analysis_battery] where [ID] not in (select top %d [ID] from [analysis_battery] where %s order by [ID] asc) and %s order by [ID] asc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID] ,[battery_sid],[battery_code],[use_t] ,[remaining_t],[b_life] from [analysis_battery] where [ID] not in (select top %d [ID] from [analysis_battery] order by [ID] asc) order by [ID] asc", req.Count, (req.Index-1)*req.Count) } if ifWhere { cntSql = fmt.Sprintf("select count([ID]) from [analysis_battery] where %s", whereSql) } else { cntSql = fmt.Sprintf("select count([ID]) from [analysis_battery]") } cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("get_nb count Query Error", err.Error()) return } //fmt.Println(selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("get_nb Query Error", err.Error()) return } defer row.Close() var resp get_nb_resp for row.Next() { var d battery_info var id int if err := row.Scan(&id, &d.Bid, &d.Bcode, &d.Uset, &d.Remaining_t, &d.B_life); err == nil { //fmt.Println(d.Uset) if d.B_life != "" && d.B_life != "-0.00" { if d.Remaining_t > 0 { d.Remaining_t1 = fmt.Sprintf(`%0.2f`, (d.Remaining_t/(d.Remaining_t+d.Uset))*100) } } else if d.B_life == "-0.00" { d.B_life = "0.00" } resp.Data = append(resp.Data, d) } else { logs.Error(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_nb recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func userAuth(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("userAuth recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req PostUserReq var resp addUserByDeesResp var err error reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) userinfo, err := getUserInfo(req.Username) fmt.Println(userinfo) if err != nil { resp.Ret = -1 logs.Error("userAuth::getUserInfo err:", err.Error()) goto exit } if req.Password != userinfo.Password { resp.Ret = -1 goto exit } exit: jdata, _ := json.Marshal(resp) fmt.Println(string(jdata)) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("userAuth recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getNotify_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("getNotify_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req getNotifyReq json.Unmarshal(reqdata, &req) var resp getNotifyResp var whereSql string if req.UserName != "" && req.UserName != "刘世界" && req.UserName != "孙青山" { likeid := "%" + req.UserName + "%" whereSql = fmt.Sprintf(`where [username] like '%s' or uppername like '%s'`, likeid, likeid) } selSql := fmt.Sprintf(`select [warning] from [warning_en] %s`, whereSql) //fmt.Println(selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error(fmt.Sprintf("getNotify_en db query err:%s", err.Error())) jdata, _ := json.Marshal(resp) response.Write(jdata) return } for row.Next() { var v string if err = row.Scan(&v); err == nil { resp.Data += v + " " } } row.Close() jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("getNotify_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getNotify(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("getNotify recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req getNotifyReq json.Unmarshal(reqdata, &req) var resp getNotifyResp var whereSql string if req.UserName != "" && req.UserName != "刘世界" && req.UserName != "孙青山" { likeid := "%" + req.UserName + "%" whereSql = fmt.Sprintf(`where [username] like '%s' or uppername like '%s'`, likeid, likeid) } selSql := fmt.Sprintf(`select [warning] from [warning] %s`, whereSql) //fmt.Println(selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error(fmt.Sprintf("getNotify db query err:%s", err.Error())) jdata, _ := json.Marshal(resp) response.Write(jdata) return } for row.Next() { var v string if err = row.Scan(&v); err == nil { resp.Data += v + " " } } row.Close() jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("getNotify recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getLcmMss(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getLcmMss recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetLcmMssReq json.Unmarshal(reqdata, &req) var resp GetLcmMssResp well_map := make(map[string]string) well_data, _ := getWellData(true) for i := 0; i < len(well_data); i++ { well_map[well_data[i].WellNameSource] = well_data[i].Welloperator } var whereSql string = " where [if_available] !=1" if req.Series != "" { whereSql += fmt.Sprintf(` and series ='%s'`, req.Series) } if req.Instrument_id != "" { whereSql += fmt.Sprintf(` and instrument_id ='%s'`, req.Instrument_id) } selCountSql := fmt.Sprintf(`select count([ID]) from [analysis_result_mss] %s`, whereSql) rcnt, err := getRecordCount(sqlConn, selCountSql) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", selCountSql, err.Error())) jdata, _ := json.Marshal(resp) response.Write(jdata) return } query_cnt := req.Index * req.Count var cnt int if query_cnt > rcnt { cnt = rcnt + req.Count - query_cnt } else { cnt = req.Count } orderBySql := " order by saveTime desc" selSql := fmt.Sprintf(`select top %d [ID],[wellname],[workTime],[totalWorkTime],[total_footage] from [analysis_result_mss]`, cnt) if whereSql != "" { selSql += whereSql } selSql += fmt.Sprintf(` and ID not in (select top %v ID from analysis_result_mss %s %s)`, (req.Index-1)*req.Count, whereSql, orderBySql) selSql += orderBySql fmt.Println(selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error(fmt.Sprintf("getLcmMss db query err:%s", err.Error())) jdata, _ := json.Marshal(resp) response.Write(jdata) return } for row.Next() { var id int var v GetLcmMssRespData if err = row.Scan(&id, &v.WellName, &v.WorkTime, &v.TotalWorkTime, &v.TotalFootage); err == nil { tf, _ := decimal.NewFromFloat32(v.TotalFootage).Round(2).Float64() v.TotalFootage = float32(tf) resp.Data = append(resp.Data, v) } } row.Close() for i := 0; i < len(resp.Data); i++ { v := resp.Data[i] var op_user string if _, ok := well_map[v.WellName]; ok { op_user = well_map[v.WellName] } //fmt.Println(v.WellName, op_user) cmr_data := get_cmr_data(req.OpUser, v.WellName) if len(cmr_data.Drilling_data) == 0 { resp.Data[i].Service_personnel = op_user } else { num, _ := strconv.Atoi(cmr_data.Drilling_data[0].Drilling_num) for j := 1; j < len(cmr_data.Drilling_data); j++ { t_num, _ := strconv.Atoi(cmr_data.Drilling_data[j].Drilling_num) if t_num > num { num = t_num } } resp.Data[i].Service_personnel = cmr_data.Drilling_data[num].Servicer } } resp.Total = rcnt jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getLcmMss recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func postLcmDevice(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("postLcmDevice recv req begin", time.Now().Format("2006-01-02 15:04:05")) //var opContent string var sqlstr string var resp CommonResp var id int var err error reqdata, _ := ioutil.ReadAll(request.Body) var req postLcmDeviceReq json.Unmarshal(reqdata, &req) b := checkUserIfOnline(req.OpUser) if !b { resp.Ret = -1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } id, _ = strconv.Atoi(req.ID) if (req.OperType == 2 || req.OperType == 3) && id == 0 { logs.Info("update lcm device req id ==0") resp.Ret = -1 goto exit } if req.OperType == 1 || req.OperType == 2 { if req.Series == "" && req.InstrumentID == "" { logs.Info("add or update lcm device req Series InstrumentID is null") resp.Ret = -1 goto exit } } //check series InstrumentID if req.OperType == 1 { sqlstr = fmt.Sprintf("select count(ID) from [life_cycle_manager_device] where [sid]='%s' and [iid]='%s'", req.Series, req.InstrumentID) fmt.Println(sqlstr) rcnt, err := getRecordCount(sqlConn, sqlstr) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", sqlstr, err.Error())) resp.Ret = -1 goto exit } if rcnt > 0 { resp.Ret = 1 //exist same record goto exit } } else if req.OperType == 2 { sqlstr = fmt.Sprintf("select count(ID) from [life_cycle_manager_device] where [sid]='%s' and [iid]='%s' and [ID] !=%s", req.Series, req.InstrumentID, req.ID) fmt.Println(sqlstr) rcnt, err := getRecordCount(sqlConn, sqlstr) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", sqlstr, err.Error())) resp.Ret = -1 goto exit } if rcnt > 0 { resp.Ret = 1 //exist same record goto exit } } req.Op_time = time.Now().Format("2006-01-02 15:04:05") if req.OperType == 1 { //add //opContent = fmt.Sprintf("新增授权信息:仪器系列号:%s, 编码:%s, 授权到期时间:%s", req.Series, req.InstrumentID, req.Expire_date) sqlstr = fmt.Sprintf(`INSERT INTO [life_cycle_manager_device] ([sid],[iid],[ver],[op_user],[op_time]) VALUES('%s','%s','%s','%s','%s')`, req.Series, req.InstrumentID, req.Ver, req.Op_User, req.Op_time) } else if req.OperType == 2 { //update //opContent = fmt.Sprintf("修改授权信息:仪器系列号:%s, 编码:%s, 授权到期时间:%s", req.Series, req.InstrumentID, req.Expire_date) sqlstr = fmt.Sprintf(`UPDATE [life_cycle_manager_device] SET [sid] = '%s',[iid] = '%s',[ver] = '%s',[op_user] = '%s',[op_time] = '%s' WHERE ID=%d`, req.Series, req.InstrumentID, req.Ver, req.Op_User, req.Op_time, id) } else if req.OperType == 3 { //opContent = fmt.Sprintf("删除授权信息:仪器系列号:%s, 编码:%s, 授权到期时间:%s", req.Series, req.InstrumentID, req.Expire_date) sqlstr = fmt.Sprintf(`DELETE FROM [life_cycle_manager_device] WHERE ID=%d`, id) } else { resp.Ret = -1 goto exit } fmt.Println(sqlstr) _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Info("postLcmDevice Exec Error:", err.Error()) resp.Ret = -1 goto exit } resp.Ret = 0 exit: if resp.Ret == 0 { if req.OperType == 1 || req.OperType == 2 { go func(req_ postLcmDeviceReq) { selSql := fmt.Sprintf(`select count(ID) from [analysis_result_mss] where [series]='%s' and [instrument_id]='%s' and [workTime]>1000`, req_.Series, req_.InstrumentID) fmt.Println(selSql) cnt, err := getRecordCount(sqlConn, selSql) if err == nil { if cnt > 0 { updateSql := fmt.Sprintf(`UPDATE [life_cycle_manager_device] SET [if_warning] = %d WHERE [sid] = '%s' and [iid] = '%s'`, 1, req_.Series, req_.InstrumentID) sqlConn.Exec(updateSql) } } }(req) } } /* if resp.Ret == 0 { opTime := time.Now().Format("2006-01-02 15:04:05") sqlstr := fmt.Sprintf(`INSERT INTO [user_op_history] ([username],[time],[op_type],[op_text]) VALUES ('%s','%s',%d,'%s')`, req.OpUser, opTime, 2, opContent) _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Error("postAuth insert user_op_history err:", err.Error()) } }*/ jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("postLcmDevice recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getLcmDevice(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getLcmDevice recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req getLcmDeviceReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp GetLcmDeviceResp var selSql string var cntSql string var err error var whereSql string var ifWhere bool if req.BeginTime != "" { whereSql = fmt.Sprintf(` [op_time]>'%s'`, req.BeginTime) ifWhere = true } if req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and [op_time]<'%s'`, req.EndTime) } else { whereSql = fmt.Sprintf(` [op_time]<'%s'`, req.EndTime) } ifWhere = true } if req.Sid != "" { likeid := "%" + req.Sid + "%" if ifWhere { whereSql += fmt.Sprintf(` and [sid] like '%s'`, likeid) } else { whereSql = fmt.Sprintf(` [sid] like '%s'`, likeid) } ifWhere = true } if req.Iid != "" { likeid := "%" + req.Iid + "%" if ifWhere { whereSql += fmt.Sprintf(` and [iid] like '%s'`, likeid) } else { whereSql = fmt.Sprintf(` [iid] like '%s'`, likeid) } ifWhere = true } cntSql = fmt.Sprintf("select count([ID]) from [life_cycle_manager_device]") if ifWhere { cntSql += " where" + whereSql } resp.Total, err = getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getLcm count Query Error", err.Error()) return } if ifWhere { selSql = fmt.Sprintf("select top %d [ID],[sid],[iid],[ver],[op_user],[op_time],COALESCE([if_warning],'') from [life_cycle_manager_device] where ID not in (select top %d ID from [life_cycle_manager_device] where %s order by op_time desc) and %s order by op_time desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID],[sid],[iid],[ver],[op_user],[op_time],COALESCE([if_warning],'') from [life_cycle_manager_device] where ID not in (select top %d ID from [life_cycle_manager_device] order by op_time desc) order by op_time desc", req.Count, (req.Index-1)*req.Count) } fmt.Println(selSql) rows, err := sqlConn.Query(selSql) if err != nil { logs.Error("getLcm Query Error", err.Error()) return } for rows.Next() { var d GetLcmDeviceRespData var ifwarning int if err = rows.Scan(&d.ID, &d.Series, &d.InstrumentID, &d.Ver, &d.OpUser, &d.Op_time, &ifwarning); err != nil { logs.Error("getLcm scan Error", err.Error()) } else { if len(d.Op_time) >= 19 { d.Op_time = d.Op_time[:10] + " " + d.Op_time[11:19] d.Op_time = do_time_by_ps(d.Op_time, ps_info) } if ifwarning == 1 { d.IfWarning = true } else { d.IfWarning = false } resp.Data = append(resp.Data, d) } } rows.Close() jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getLcmDevice recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func postLcm_ex(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("postLcm recv req begin", time.Now().Format("2006-01-02 15:04:05")) //var opContent string var sqlstr string var resp CommonResp var id int var err error reqdata, _ := ioutil.ReadAll(request.Body) var req postLcmReq_ex json.Unmarshal(reqdata, &req) b := checkUserIfOnline(req.OpUser) if !b { resp.Ret = -1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } id, _ = strconv.Atoi(req.ID) if (req.OperType == 2 || req.OperType == 3) && id == 0 { logs.Info("update lcm req id ==0") resp.Ret = -1 goto exit } if req.OperType == 1 || req.OperType == 2 { if req.Series == "" && req.InstrumentID == "" { logs.Info("add or update lcm req Series InstrumentID is null") resp.Ret = -1 goto exit } } if req.OperType == 2 { sqlstr = fmt.Sprintf("select count(ID) from [life_cycle_manager_ex] where [sid]='%s' and [iid]='%s' and [ID] =%s", req.Series, req.InstrumentID, req.ID) fmt.Println(sqlstr) rcnt, err := getRecordCount(sqlConn, sqlstr) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", sqlstr, err.Error())) resp.Ret = -1 goto exit } if rcnt == 0 { resp.Ret = 1 //no record goto exit } } req.Time = time.Now().Format("2006-01-02 15:04:05") if req.OperType == 1 { //add //opContent = fmt.Sprintf("新增授权信息:仪器系列号:%s, 编码:%s, 授权到期时间:%s", req.Series, req.InstrumentID, req.Expire_date) sqlstr = fmt.Sprintf(`INSERT INTO [life_cycle_manager_ex] ([sid],[iid],[note],[time],[op_user]) VALUES('%s','%s','%s','%s','%s')`, req.Series, req.InstrumentID, req.Note, req.Time, req.Op_user) } else if req.OperType == 2 { //update //opContent = fmt.Sprintf("修改授权信息:仪器系列号:%s, 编码:%s, 授权到期时间:%s", req.Series, req.InstrumentID, req.Expire_date) sqlstr = fmt.Sprintf(`UPDATE [life_cycle_manager_ex] SET [sid] = '%s',[iid] = '%s',[note] = '%s',[time] = '%s',[op_user]='%s' WHERE ID=%d`, req.Series, req.InstrumentID, req.Note, req.Time, req.Op_user, id) } else if req.OperType == 3 { //opContent = fmt.Sprintf("删除授权信息:仪器系列号:%s, 编码:%s, 授权到期时间:%s", req.Series, req.InstrumentID, req.Expire_date) sqlstr = fmt.Sprintf(`DELETE FROM [life_cycle_manager_ex] WHERE ID=%d`, id) } else { resp.Ret = -1 goto exit } fmt.Println(sqlstr) _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Info("postLcm Exec Error:", err.Error()) resp.Ret = -1 goto exit } resp.Ret = 0 exit: /* if resp.Ret == 0 { opTime := time.Now().Format("2006-01-02 15:04:05") sqlstr := fmt.Sprintf(`INSERT INTO [user_op_history] ([username],[time],[op_type],[op_text]) VALUES ('%s','%s',%d,'%s')`, req.OpUser, opTime, 2, opContent) _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Error("postAuth insert user_op_history err:", err.Error()) } }*/ jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("postLcm recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getLcm_ex(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getLcm recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req getLcmReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp GetLcmResp_ex var selSql string var cntSql string var err error var whereSql string var ifWhere bool if req.BeginTime != "" { whereSql = fmt.Sprintf(` time>'%s'`, req.BeginTime) ifWhere = true } if req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and time<'%s'`, req.EndTime) } else { whereSql = fmt.Sprintf(` time<'%s'`, req.EndTime) } ifWhere = true } if req.Sid != "" { likeid := "%" + req.Sid + "%" if ifWhere { whereSql += fmt.Sprintf(` and [sid] like '%s'`, likeid) } else { whereSql = fmt.Sprintf(` [sid] like '%s'`, likeid) } ifWhere = true } if req.Iid != "" { likeid := "%" + req.Iid + "%" if ifWhere { whereSql += fmt.Sprintf(` and [iid] like '%s'`, likeid) } else { whereSql = fmt.Sprintf(` [iid] like '%s'`, likeid) } ifWhere = true } cntSql = fmt.Sprintf("select count([ID]) from [life_cycle_manager_ex]") if ifWhere { cntSql += " where" + whereSql } resp.Total, err = getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getLcm count Query Error", err.Error()) return } if ifWhere { selSql = fmt.Sprintf("select top %d [ID],[sid],[iid],[note],[time],[op_user] from [life_cycle_manager_ex] where ID not in (select top %d ID from [life_cycle_manager_ex] where %s order by time desc) and %s order by time desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID],[sid],[iid],[note],[time],[op_user] from [life_cycle_manager_ex] where ID not in (select top %d ID from [life_cycle_manager_ex] order by time desc) order by time desc", req.Count, (req.Index-1)*req.Count) } fmt.Println(selSql) rows, err := sqlConn.Query(selSql) if err != nil { logs.Error("getLcm Query Error", err.Error()) return } for rows.Next() { var d GetLcmRespData_ex if err = rows.Scan(&d.ID, &d.Series, &d.InstrumentID, &d.Note, &d.Time, &d.Op_user); err != nil { logs.Error("getLcm scan Error", err.Error()) } else { if len(d.Time) >= 19 { d.Time = d.Time[:10] + " " + d.Time[11:19] d.Time = do_time_by_ps(d.Time, ps_info) } timeLayout := "2006-01-02 15:04:05" loc, _ := time.LoadLocation("Local") opTime, _ := time.ParseInLocation(timeLayout, d.Time, loc) if time.Since(opTime).Hours() < 12 { d.IfShowOp = true } else { d.IfShowOp = false } resp.Data = append(resp.Data, d) } } rows.Close() jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getLcm recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func postLcm(response http.ResponseWriter, request *http.Request) { fmt.Println("新增维保记录---------------------------") beginTime := time.Now().UnixNano() fmt.Println("postLcm recv req begin", time.Now().Format("2006-01-02 15:04:05")) //var opContent string var sqlstr string var resp CommonResp var id int var err error var repair_cnt int var repair_level int reqdata, _ := ioutil.ReadAll(request.Body) var req postLcmReq json.Unmarshal(reqdata, &req) b := checkUserIfOnline(req.OpUser) fmt.Println(b) if !b { resp.Ret = -1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } id, _ = strconv.Atoi(req.ID) if (req.OperType == 2 || req.OperType == 3) && id == 0 { logs.Info("update lcm req id ==0") resp.Ret = -1 goto exit } if req.OperType == 1 || req.OperType == 2 { if req.Series == "" && req.InstrumentID == "" { logs.Info("add or update lcm req Series InstrumentID is null") resp.Ret = -1 goto exit } } if req.OperType == 2 { sqlstr = fmt.Sprintf("select count(ID) from [life_cycle_manager] where [sid]='%s' and [iid]='%s' and [ID] =%s", req.Series, req.InstrumentID, req.ID) fmt.Println(sqlstr) rcnt, err := getRecordCount(sqlConn, sqlstr) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", sqlstr, err.Error())) resp.Ret = -1 goto exit } if rcnt == 0 { resp.Ret = 1 //no record goto exit } } repair_cnt, _ = strconv.Atoi(req.Repair_cnt) repair_level, _ = strconv.Atoi(req.Repair_level) req.Time = time.Now().Format("2006-01-02 15:04:05") fmt.Println(" req.OperType--------------", req.OperType) if req.OperType == 1 { //add //opContent = fmt.Sprintf("新增授权信息:仪器系列号:%s, 编码:%s, 授权到期时间:%s", req.Series, req.InstrumentID, req.Expire_date) sqlstr = fmt.Sprintf(`INSERT INTO [life_cycle_manager] ([sid],[iid],[repair_cnt],[repair_level],[repair_context],[time],[user]) VALUES('%s','%s',%d,%d,'%s','%s','%s')`, req.Series, req.InstrumentID, repair_cnt, repair_level, req.Note, req.Time, req.Applicanter) } else if req.OperType == 2 { //update //opContent = fmt.Sprintf("修改授权信息:仪器系列号:%s, 编码:%s, 授权到期时间:%s", req.Series, req.InstrumentID, req.Expire_date) sqlstr = fmt.Sprintf(`UPDATE [life_cycle_manager] SET [sid] = '%s',[iid] = '%s',[repair_cnt] = %d,[repair_level] = %d,[repair_context] = '%s',[time] = '%s',[user]='%s' WHERE ID=%d`, req.Series, req.InstrumentID, repair_cnt, repair_level, req.Note, req.Time, req.Applicanter, id) } else if req.OperType == 3 { //opContent = fmt.Sprintf("删除授权信息:仪器系列号:%s, 编码:%s, 授权到期时间:%s", req.Series, req.InstrumentID, req.Expire_date) sqlstr = fmt.Sprintf(`DELETE FROM [life_cycle_manager] WHERE ID=%d`, id) } else { resp.Ret = -1 goto exit } fmt.Println("维保记录sql-------------------", sqlstr) _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Info("postLcm Exec Error:", err.Error()) resp.Ret = -1 goto exit } resp.Ret = 0 exit: /* if resp.Ret == 0 { opTime := time.Now().Format("2006-01-02 15:04:05") sqlstr := fmt.Sprintf(`INSERT INTO [user_op_history] ([username],[time],[op_type],[op_text]) VALUES ('%s','%s',%d,'%s')`, req.OpUser, opTime, 2, opContent) _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Error("postAuth insert user_op_history err:", err.Error()) } }*/ jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("postLcm recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getLcm(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getLcm recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req getLcmReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp GetLcmResp var selSql string var cntSql string var err error var whereSql string var ifWhere bool if req.BeginTime != "" { whereSql = fmt.Sprintf(` time>'%s'`, req.BeginTime) ifWhere = true } if req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and time<'%s'`, req.EndTime) } else { whereSql = fmt.Sprintf(` time<'%s'`, req.EndTime) } ifWhere = true } if req.Sid != "" { likeid := "%" + req.Sid + "%" if ifWhere { whereSql += fmt.Sprintf(` and [sid] like '%s'`, likeid) } else { whereSql = fmt.Sprintf(` [sid] like '%s'`, likeid) } ifWhere = true } if req.Iid != "" { likeid := "%" + req.Iid + "%" if ifWhere { whereSql += fmt.Sprintf(` and [iid] like '%s'`, likeid) } else { whereSql = fmt.Sprintf(` [iid] like '%s'`, likeid) } ifWhere = true } cntSql = fmt.Sprintf("select count([ID]) from [life_cycle_manager]") if ifWhere { cntSql += " where" + whereSql } resp.Total, err = getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getLcm count Query Error", err.Error()) return } if ifWhere { selSql = fmt.Sprintf("select top %d [ID],[sid],[iid],[repair_cnt],[repair_level],[repair_context],[time],[user] from [life_cycle_manager] where ID not in (select top %d ID from [life_cycle_manager] where %s order by time desc) and %s order by time desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID],[sid],[iid],[repair_cnt],[repair_level],[repair_context],[time],[user] from [life_cycle_manager] where ID not in (select top %d ID from [life_cycle_manager] order by time desc) order by time desc", req.Count, (req.Index-1)*req.Count) } fmt.Println(selSql) rows, err := sqlConn.Query(selSql) if err != nil { logs.Error("getLcm Query Error", err.Error()) return } for rows.Next() { var d GetLcmRespData if err = rows.Scan(&d.ID, &d.Series, &d.InstrumentID, &d.Repair_cnt, &d.Repair_level, &d.Note, &d.Time, &d.Applicanter); err != nil { logs.Error("getLcm scan Error", err.Error()) } else { if len(d.Time) >= 19 { d.Time = d.Time[:10] + " " + d.Time[11:19] d.Time = do_time_by_ps(d.Time, ps_info) } timeLayout := "2006-01-02 15:04:05" loc, _ := time.LoadLocation("Local") opTime, _ := time.ParseInLocation(timeLayout, d.Time, loc) if time.Since(opTime).Hours() < 12 { d.IfShowOp = true } else { d.IfShowOp = false } resp.Data = append(resp.Data, d) } } rows.Close() jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getLcm recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getWellAnalysisResult_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("getWellAnalysisResult recv req begin", time.Now().Format("2006-01-02 15:04:05")) var resp getWellAnalysisResultResp var selSql string var cntSql string var err error cntSql = fmt.Sprintf("select count([ID]) from [WellInformation] where [stats]=0 ") resp.WellOffline, err = getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getWellAnalysisResult count Query Error", err.Error()) return } selSql = fmt.Sprintf("select [WELLNameSource] from [WellInformation] where [stats]=1") rows, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellAnalysisResult Query Error", err.Error()) return } for rows.Next() { var wellname string if err = rows.Scan(&wellname); err != nil { logs.Error("getWellAnalysisResult scan Error", err.Error()) } else { resp.WellInline++ selSql = fmt.Sprintf(`select [well_type] from [well_type_t] where [well_name]='%s'`, wellname) typeRows, err := sqlConn.Query(selSql) if err == nil { for typeRows.Next() { var t int if err = typeRows.Scan(&t); err == nil { if t&16 == 16 { resp.Gamma2++ } else if t&8 == 8 { resp.Gamma1++ } else if t&4 == 4 { resp.Resistivity++ } else if t&2 == 2 { resp.Near_bit++ } else if t&1 == 1 { resp.MWD_cnt++ } } else { logs.Error("getWellAnalysisResult scan Error", err.Error()) } } typeRows.Close() } selSql = fmt.Sprintf(`SELECT distinct [b_code] FROM [analysis_battery_well] where wellname='%s'`, wellname) code_rows, err := sqlConn.Query(selSql) if err == nil { var codes []string var code string for code_rows.Next() { if err = code_rows.Scan(&code); err == nil { codes = append(codes, code) } } code_rows.Close() var context string for i := 0; i < len(codes); i++ { selSql = fmt.Sprintf(`SELECT [use_t] FROM [analysis_battery] where [battery_code]='%s'`, codes[i]) t_rows, err := sqlConn.Query(selSql) if err == nil { for t_rows.Next() { var t string if err = t_rows.Scan(&t); err == nil { if context == "" { context = fmt.Sprintf(`Battery code:%s Use time(h): %s`, codes[i], t) } else { context += fmt.Sprintf(` Battery code:%s Use time(h): %s`, codes[i], t) } } } t_rows.Close() } } if context != "" { if resp.Context == "" { resp.Context = fmt.Sprintf(`Wellname:%s %s`, wellname, context) } else { resp.Context += fmt.Sprintf(` Wellname:%s %s`, wellname, context) } } } } } rows.Close() jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("getWellAnalysisResult recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getWellAnalysisResult(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("getWellAnalysisResult recv req begin", time.Now().Format("2006-01-02 15:04:05")) var resp getWellAnalysisResultResp var selSql string var cntSql string var err error cntSql = fmt.Sprintf("select count([ID]) from [WellInformation] where [stats]=0 ") resp.WellOffline, err = getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getWellAnalysisResult count Query Error", err.Error()) return } selSql = fmt.Sprintf("select [WELLNameSource] from [WellInformation] where [stats]=1") rows, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellAnalysisResult Query Error", err.Error()) return } for rows.Next() { var wellname string if err = rows.Scan(&wellname); err != nil { logs.Error("getWellAnalysisResult scan Error", err.Error()) } else { resp.WellInline++ selSql = fmt.Sprintf(`select [well_type] from [well_type_t] where [well_name]='%s'`, wellname) typeRows, err := sqlConn.Query(selSql) if err == nil { for typeRows.Next() { var t int if err = typeRows.Scan(&t); err == nil { if t&16 == 16 { resp.Gamma2++ } else if t&8 == 8 { resp.Gamma1++ } else if t&4 == 4 { resp.Resistivity++ } else if t&2 == 2 { resp.Near_bit++ } else if t&1 == 1 { resp.MWD_cnt++ } } else { logs.Error("getWellAnalysisResult scan Error", err.Error()) } } typeRows.Close() } selSql = fmt.Sprintf(`SELECT distinct [b_code] FROM [analysis_battery_well] where wellname='%s'`, wellname) code_rows, err := sqlConn.Query(selSql) if err == nil { var codes []string var code string for code_rows.Next() { if err = code_rows.Scan(&code); err == nil { codes = append(codes, code) } } code_rows.Close() var context string for i := 0; i < len(codes); i++ { selSql = fmt.Sprintf(`SELECT [use_t] FROM [analysis_battery] where [battery_code]='%s'`, codes[i]) t_rows, err := sqlConn.Query(selSql) if err == nil { for t_rows.Next() { var t string if err = t_rows.Scan(&t); err == nil { if context == "" { context = fmt.Sprintf(`电池编码:%s 使用时间(h): %s`, codes[i], t) } else { context += fmt.Sprintf(` 电池编码:%s 使用时间(h): %s`, codes[i], t) } } } t_rows.Close() } } if context != "" { if resp.Context == "" { resp.Context = fmt.Sprintf(`井:%s %s`, wellname, context) } else { resp.Context += fmt.Sprintf(` 井:%s %s`, wellname, context) } } } } } rows.Close() jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("getWellAnalysisResult recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getUserLoginCntCsv(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getUserLoginCntCsv recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req getUserLoginCntCsvReq var filename string var file *xlsx.File var resp getUserLoginCntCsvResp reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) selSql := `select [username] from [user_op_history] where [op_type]=1 ` if req.SearchUser != "" { like := "%" + req.SearchUser + "%" selSql += fmt.Sprintf(` and [username] like '%s'`, like) } if req.BeginTime != "" && req.EndTime != "" { selSql += fmt.Sprintf(` and [time]>'%s' and [time]<'%s'`, req.BeginTime, req.EndTime) } selSql += " order by [username] desc" rdRow, err := sqlConn.Query(selSql) if err != nil { logs.Error("getUserLoginCntCsv query err:", err.Error()) return } m := make(map[string]int) for rdRow.Next() { var v string if err = rdRow.Scan(&v); err == nil { if _, ok := m[v]; ok { m[v] += 1 } else { m[v] = 1 } } else { logs.Error("getUserLoginCntCsv scan err:", err.Error()) } } rdRow.Close() file = xlsx.NewFile() sheet, err := file.AddSheet("sheet1") if err != nil { logs.Error("file add sheet err:", err.Error()) } style := xlsx.NewStyle() font := *xlsx.NewFont(11, "宋体") style.Font = font alignment := xlsx.Alignment{ Horizontal: "center", Vertical: "center", } style.Alignment = alignment style.ApplyAlignment = true row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = "用户名" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "登录次数" for k, v := range m { row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = k cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = strconv.Itoa(v) } filename = fmt.Sprintf(`%v.xlsx`, beginTime) err = file.Save("./authfile/" + filename) if err != nil { logs.Error("xlsx save err:", err.Error()) } resp.FileId = filename jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { logs.Error("getUserLoginCntCsv err:", err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getUserLoginCntCsv recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getUserLoginCnt(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getUserLoginCnt recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req getUserLoginCntReq var resp getUserLoginCntResp reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) selSql := `select [username] from [user_op_history] where [op_type]=1 ` if req.SearchUser != "" { like := "%" + req.SearchUser + "%" selSql += fmt.Sprintf(` and [username] like '%s'`, like) } if req.BeginTime != "" && req.EndTime != "" { selSql += fmt.Sprintf(` and [time]>'%s' and [time]<'%s'`, req.BeginTime, req.EndTime) } selSql += " order by [username] desc" rdRow, err := sqlConn.Query(selSql) if err != nil { logs.Error("getUserLoginCnt query err:", err.Error()) return } var data []getUserLoginCntRespD m := make(map[string]int) for rdRow.Next() { var v string if err = rdRow.Scan(&v); err == nil { if index, ok := m[v]; ok { data[index].LoginCnt++ } else { var d getUserLoginCntRespD d.UserName = v d.LoginCnt = 1 d.OpText = "登录云平台系统" data = append(data, d) m[v] = len(data) - 1 } } else { logs.Error("getUserLoginCnt scan err:", err.Error()) } } rdRow.Close() bIndex := req.Count * (req.Index - 1) eIndex := req.Count * req.Index for i := 0; i < len(data); i++ { if i >= bIndex && i < eIndex { resp.Data = append(resp.Data, data[i]) } } resp.Total = len(data) jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { logs.Error("getUserLoginCnt err:", err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getUserLoginCnt recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getEsCsv_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getEsCsv_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req getEsCsvReq var filename string var file *xlsx.File var resp getExCsvResp reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) wellnames := get_es_well_name(req) wellname_map := make(map[string]string) for i := 0; i < len(wellnames); i++ { wellname_map[wellnames[i]] = wellnames[i] } ps_info := get_ps_info(req.OpUser) selSql := `select [create_time],[data] from [analysis_result_engineerin_service]` var ifWhere bool var whereSql string if req.Wellname != "" { like := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` where [wellname] like '%s'`, like) ifWhere = true } if req.BeginTime != "" && req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and [create_time]>'%s' and [create_time]<'%s'`, req.BeginTime, req.EndTime) } else { whereSql += fmt.Sprintf(` where [create_time]>'%s' and [create_time]<'%s'`, req.BeginTime, req.EndTime) ifWhere = true } } if spe_name, ok := spe_user[req.OpUser]; ok { if ifWhere { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } else { whereSql += fmt.Sprintf(` where [ClOUDACCOUNT]='%s' `, spe_name) } ifWhere = true } if ifWhere { selSql += whereSql } selSql += " order by [create_time] desc" rdRow, err := sqlConn.Query(selSql) if err != nil { logs.Error("getEsCsv_en query err:", err.Error()) return } var data []EngineeringServices for rdRow.Next() { var d EngineeringServices var v string var create_time string if err = rdRow.Scan(&create_time, &v); err == nil { if len(create_time) >= 19 { create_time = create_time[:10] + " " + create_time[11:19] create_time = do_time_by_ps(create_time, ps_info) } err = json.Unmarshal([]byte(v), &d) if err == nil { d.wellCreateTime = create_time if _, ok := wellname_map[d.Wellname]; ok { data = append(data, d) } } } else { logs.Error("getEsCsv_en scan err:", err.Error()) } } rdRow.Close() file = xlsx.NewFile() sheet, err := file.AddSheet("sheet1") if err != nil { logs.Error("file add sheet err:", err.Error()) } style := xlsx.NewStyle() font := *xlsx.NewFont(11, "宋体") style.Font = font alignment := xlsx.Alignment{ Horizontal: "right", Vertical: "center", } style.Alignment = alignment style.ApplyAlignment = true row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = "Well Name" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Service Location" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Service Type" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Customer" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Rig Name" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Well Team Company" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Well Type" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Personnel" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Work Status" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Special Comments" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Planned Measured Depth(m)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Planned Max Inclination(°)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Planned Azimuth(°)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Longitude & Latitude Coordinates(°)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Nominal Value" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Horizontal Section Length(m)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Drilling Rate Of Near-bit(%)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Trip Number" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Tool Mounting Offset(°)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Drill Assembly Offset(°)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Mud Type" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Mud Density(g/cm^3)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Viscosity(s)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Flow Rate(L/s)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Sand Content(%)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Mud Motor Bend Angle(°)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Circulation Hours(h)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Initial Depth(m)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Total Footage(m)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "BHA" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Tool Assembly" cell1 = row.AddCell() cell1.SetStyle(style) if ps_info.R2 == "1" { cell1.Value = "Max Temperature(℃)" } else { cell1.Value = "Max Temperature(℉)" } cell1 = row.AddCell() cell1.SetStyle(style) if ps_info.R1 == "1" { cell1.Value = "Max Bottomhole Pressure(MPa)" } else { cell1.Value = "Max Bottomhole Pressure(psi)" } cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Well Creation Time" for i := 0; i < len(data); i++ { v := data[i] row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = v.Wellname cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Locale cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.ServiceType cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.ClientName cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.DrillingCrewName cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.DrillingCrewCompany cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Welltype cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.OpUser cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.WorkState cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.SpecialNote cell1 = row.AddCell() cell1.SetStyle(style) designDepth, _ := strconv.ParseFloat(v.DesignDepth, 64) designDepth, _ = decimal.NewFromFloat(designDepth).Round(2).Float64() v.DesignDepth = strconv.FormatFloat(designDepth, 'f', 2, 64) cell1.Value = v.DesignDepth cell1 = row.AddCell() cell1.SetStyle(style) wellDeviation, _ := strconv.ParseFloat(v.WellDeviation, 64) wellDeviation, _ = decimal.NewFromFloat(wellDeviation).Round(2).Float64() v.WellDeviation = strconv.FormatFloat(wellDeviation, 'f', 2, 64) cell1.Value = v.WellDeviation cell1 = row.AddCell() cell1.SetStyle(style) designOrientation, _ := strconv.ParseFloat(v.DesignOrientation, 64) designOrientation, _ = decimal.NewFromFloat(designOrientation).Round(2).Float64() v.DesignOrientation = strconv.FormatFloat(designOrientation, 'f', 2, 64) cell1.Value = v.DesignOrientation cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.LongitudeLatitude cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.GTBTDIP cell1 = row.AddCell() cell1.SetStyle(style) length_of_horizontal_section, _ := strconv.ParseFloat(v.Length_of_horizontal_section, 64) length_of_horizontal_section, _ = decimal.NewFromFloat(length_of_horizontal_section).Round(2).Float64() v.Length_of_horizontal_section = strconv.FormatFloat(length_of_horizontal_section, 'f', 2, 64) cell1.Value = v.Length_of_horizontal_section cell1 = row.AddCell() cell1.SetStyle(style) rate, _ := strconv.ParseFloat(v.Rate, 64) rate, _ = decimal.NewFromFloat(rate).Round(2).Float64() v.Rate = strconv.FormatFloat(rate, 'f', 2, 64) cell1.Value = v.Rate cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.DrillingTimes cell1 = row.AddCell() cell1.SetStyle(style) instrument_angle_difference, _ := strconv.ParseFloat(v.Instrument_angle_difference, 64) instrument_angle_difference, _ = decimal.NewFromFloat(instrument_angle_difference).Round(2).Float64() v.Instrument_angle_difference = strconv.FormatFloat(instrument_angle_difference, 'f', 2, 64) cell1.Value = v.Instrument_angle_difference cell1 = row.AddCell() cell1.SetStyle(style) angle_difference_of_drilling_tool, _ := strconv.ParseFloat(v.Angle_difference_of_drilling_tool, 64) angle_difference_of_drilling_tool, _ = decimal.NewFromFloat(angle_difference_of_drilling_tool).Round(2).Float64() v.Angle_difference_of_drilling_tool = strconv.FormatFloat(angle_difference_of_drilling_tool, 'f', 2, 64) cell1.Value = v.Angle_difference_of_drilling_tool cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.MudType cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.02f", v.MudDensity) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.02f", v.MudViscosity) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.02f", v.OutputVolume) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.02f", v.Sediment_concentration) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.02f", v.Screw_curvature) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.02f", v.LoopTime) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.02f", v.EntryWellDepth) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.01f", v.TotalFootage) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.BHA cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.InstrumentCombination cell1 = row.AddCell() cell1.SetStyle(style) maxTemp, _ := decimal.NewFromFloat(float64(v.MaxTemp)).Round(2).Float64() if ps_info.R2 == "2" { maxTemp, _ = decimal.NewFromFloat(float64(1.8*maxTemp + 32)).Round(2).Float64() } v.MaxTemp = float32(maxTemp) cell1.Value = fmt.Sprintf("%.02f", v.MaxTemp) cell1 = row.AddCell() cell1.SetStyle(style) maxPressure, _ := decimal.NewFromFloat(float64(v.MaxPressure)).Round(2).Float64() if ps_info.R1 == "2" { maxPressure, _ = decimal.NewFromFloat(float64(145.038 * maxPressure)).Round(2).Float64() } v.MaxPressure = float32(maxPressure) cell1.Value = fmt.Sprintf("%.02f", v.MaxPressure) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.wellCreateTime } filename = fmt.Sprintf(`%v.xlsx`, beginTime) err = file.Save("./authfile/" + filename) if err != nil { logs.Error("xlsx save err:", err.Error()) } resp.FileId = filename jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { logs.Error("getEsCsv_en err:", err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getEsCsv_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_es_well_name(req getEsCsvReq) (resp []string) { var selSql string var whereSql string var ifWhere bool if req.BeginTime != "" && req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime>'%s' and CreateTableTime<'%s'`, req.BeginTime, req.EndTime) } else { whereSql += fmt.Sprintf(` CreateTableTime>'%s' and CreateTableTime<'%s'`, req.BeginTime, req.EndTime) } ifWhere = true } if ifWhere { whereSql += fmt.Sprintf(` and [es_flag]=1 `) } else { whereSql += fmt.Sprintf(` [es_flag]=1 `) } ifWhere = true selSql = fmt.Sprintf("select [WELLNameSource] from [WellInformation] where %s", whereSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx Query Error", err.Error()) return } defer row.Close() for row.Next() { var d wellExData if err := row.Scan(&d.WellNameSource); err == nil { resp = append(resp, d.WellNameSource) } else { fmt.Println(err.Error()) } } return } func getEsCsv(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getEsCsv recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req getEsCsvReq var filename string var file *xlsx.File var resp getExCsvResp reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) wellnames := get_es_well_name(req) wellname_map := make(map[string]string) for i := 0; i < len(wellnames); i++ { wellname_map[wellnames[i]] = wellnames[i] } selSql := `select [create_time],[data] from [analysis_result_engineerin_service]` var ifWhere bool var whereSql string if req.Wellname != "" { like := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` where [wellname] like '%s'`, like) ifWhere = true } if req.BeginTime != "" && req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and [create_time]>'%s' and [create_time]<'%s'`, req.BeginTime, req.EndTime) } else { whereSql += fmt.Sprintf(` where [create_time]>'%s' and [create_time]<'%s'`, req.BeginTime, req.EndTime) ifWhere = true } } if spe_name, ok := spe_user[req.OpUser]; ok { if ifWhere { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } else { whereSql += fmt.Sprintf(` where [ClOUDACCOUNT]='%s' `, spe_name) } ifWhere = true } if ifWhere { selSql += whereSql } selSql += " order by [create_time] desc" rdRow, err := sqlConn.Query(selSql) if err != nil { logs.Error("getEsCsv query err:", err.Error()) return } var data []EngineeringServices for rdRow.Next() { var d EngineeringServices var v string var create_time string if err = rdRow.Scan(&create_time, &v); err == nil { if len(create_time) >= 19 { create_time = create_time[:10] + " " + create_time[11:19] create_time = do_time_by_ps(create_time, ps_info) } err = json.Unmarshal([]byte(v), &d) if err == nil { d.wellCreateTime = create_time if _, ok := wellname_map[d.Wellname]; ok { data = append(data, d) } } } else { logs.Error("getEsCsv scan err:", err.Error()) } } rdRow.Close() file = xlsx.NewFile() sheet, err := file.AddSheet("sheet1") if err != nil { logs.Error("file add sheet err:", err.Error()) } style := xlsx.NewStyle() font := *xlsx.NewFont(11, "宋体") style.Font = font alignment := xlsx.Alignment{ Horizontal: "right", Vertical: "center", } style.Alignment = alignment style.ApplyAlignment = true row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = "项目名称" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "服务地点" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "服务类型" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "客户名称" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "井队名称" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "井队所属公司" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "井型" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "服务人员" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "工作状态" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "特殊状态说明" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "设计井深(m)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "设计最大井斜(°)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "设计方位(°)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "经纬度坐标(°)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "井位标称值" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "水平段长度(m)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "近钻头钻遇率(%)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "钻次" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "仪器角差(°)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "钻具角差(°)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "泥浆类型" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "泥浆密度(g/cm^3)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "粘度(s)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "排量(L/s)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "含沙量(%)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "螺杆弯度(°)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "循环时间(h)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "入井井深(m)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "总进尺(m)" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "钻具组合" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "仪器组合" cell1 = row.AddCell() cell1.SetStyle(style) if ps_info.R2 == "1" { cell1.Value = "最大温度(℃)" } else { cell1.Value = "最大温度(℉)" } cell1 = row.AddCell() cell1.SetStyle(style) if ps_info.R1 == "1" { cell1.Value = "最大井底压力(MPa)" } else { cell1.Value = "最大井底压力(psi)" } cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "井创建时间" for i := 0; i < len(data); i++ { v := data[i] row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = v.Wellname cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Locale cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.ServiceType cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.ClientName cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.DrillingCrewName cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.DrillingCrewCompany cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Welltype cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.OpUser cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.WorkState cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.SpecialNote cell1 = row.AddCell() cell1.SetStyle(style) designDepth, _ := strconv.ParseFloat(v.DesignDepth, 64) designDepth, _ = decimal.NewFromFloat(designDepth).Round(2).Float64() v.DesignDepth = strconv.FormatFloat(designDepth, 'f', 2, 64) cell1.Value = v.DesignDepth cell1 = row.AddCell() cell1.SetStyle(style) wellDeviation, _ := strconv.ParseFloat(v.WellDeviation, 64) wellDeviation, _ = decimal.NewFromFloat(wellDeviation).Round(2).Float64() v.WellDeviation = strconv.FormatFloat(wellDeviation, 'f', 2, 64) cell1.Value = v.WellDeviation cell1 = row.AddCell() cell1.SetStyle(style) designOrientation, _ := strconv.ParseFloat(v.DesignOrientation, 64) designOrientation, _ = decimal.NewFromFloat(designOrientation).Round(2).Float64() v.DesignOrientation = strconv.FormatFloat(designOrientation, 'f', 2, 64) cell1.Value = v.DesignOrientation cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.LongitudeLatitude cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.GTBTDIP cell1 = row.AddCell() cell1.SetStyle(style) length_of_horizontal_section, _ := strconv.ParseFloat(v.Length_of_horizontal_section, 64) length_of_horizontal_section, _ = decimal.NewFromFloat(length_of_horizontal_section).Round(2).Float64() v.Length_of_horizontal_section = strconv.FormatFloat(length_of_horizontal_section, 'f', 2, 64) cell1.Value = v.Length_of_horizontal_section cell1 = row.AddCell() cell1.SetStyle(style) rate, _ := strconv.ParseFloat(v.Rate, 64) rate, _ = decimal.NewFromFloat(rate).Round(2).Float64() v.Rate = strconv.FormatFloat(rate, 'f', 2, 64) cell1.Value = v.Rate cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.DrillingTimes cell1 = row.AddCell() cell1.SetStyle(style) instrument_angle_difference, _ := strconv.ParseFloat(v.Instrument_angle_difference, 64) instrument_angle_difference, _ = decimal.NewFromFloat(instrument_angle_difference).Round(2).Float64() v.Instrument_angle_difference = strconv.FormatFloat(instrument_angle_difference, 'f', 2, 64) cell1.Value = v.Instrument_angle_difference cell1 = row.AddCell() cell1.SetStyle(style) angle_difference_of_drilling_tool, _ := strconv.ParseFloat(v.Angle_difference_of_drilling_tool, 64) angle_difference_of_drilling_tool, _ = decimal.NewFromFloat(angle_difference_of_drilling_tool).Round(2).Float64() v.Angle_difference_of_drilling_tool = strconv.FormatFloat(angle_difference_of_drilling_tool, 'f', 2, 64) cell1.Value = v.Angle_difference_of_drilling_tool cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.MudType cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.02f", v.MudDensity) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.02f", v.MudViscosity) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.02f", v.OutputVolume) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.02f", v.Sediment_concentration) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.02f", v.Screw_curvature) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.02f", v.LoopTime) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.02f", v.EntryWellDepth) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = fmt.Sprintf("%.01f", v.TotalFootage) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.BHA cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.InstrumentCombination cell1 = row.AddCell() cell1.SetStyle(style) maxTemp, _ := decimal.NewFromFloat(float64(v.MaxTemp)).Round(2).Float64() if ps_info.R2 == "2" { maxTemp, _ = decimal.NewFromFloat(float64(1.8*maxTemp + 32)).Round(2).Float64() } v.MaxTemp = float32(maxTemp) cell1.Value = fmt.Sprintf("%.02f", v.MaxTemp) cell1 = row.AddCell() cell1.SetStyle(style) maxPressure, _ := decimal.NewFromFloat(float64(v.MaxPressure)).Round(2).Float64() if ps_info.R1 == "2" { maxPressure, _ = decimal.NewFromFloat(float64(145.038 * maxPressure)).Round(2).Float64() } v.MaxPressure = float32(maxPressure) cell1.Value = fmt.Sprintf("%.02f", v.MaxPressure) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.wellCreateTime } filename = fmt.Sprintf(`%v.xlsx`, beginTime) err = file.Save("./authfile/" + filename) if err != nil { logs.Error("xlsx save err:", err.Error()) } resp.FileId = filename jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { logs.Error("getEsCsv err:", err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getEsCsv recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getEs(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getEs recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req getEsReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var data EngineeringServices var row *sql.Rows var err error var resp string var selSql string var whereSql string if req.Wellname != "" { //wellname := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` [wellname]='%s'`, req.Wellname) } else { goto exit } selSql = fmt.Sprintf("select [data] from [analysis_result_engineerin_service] where %s", whereSql) fmt.Println(selSql) row, err = sqlConn.Query(selSql) if err != nil { logs.Error("getEs Query Error", err.Error()) return } defer row.Close() for row.Next() { if err := row.Scan(&resp); err == nil { json.Unmarshal([]byte(resp), &data) designDepth, _ := strconv.ParseFloat(data.DesignDepth, 64) designDepth, _ = decimal.NewFromFloat(designDepth).Round(2).Float64() data.DesignDepth = strconv.FormatFloat(designDepth, 'f', 2, 64) wellDeviation, _ := strconv.ParseFloat(data.WellDeviation, 64) wellDeviation, _ = decimal.NewFromFloat(wellDeviation).Round(2).Float64() data.WellDeviation = strconv.FormatFloat(wellDeviation, 'f', 2, 64) designOrientation, _ := strconv.ParseFloat(data.DesignOrientation, 64) designOrientation, _ = decimal.NewFromFloat(designOrientation).Round(2).Float64() data.DesignOrientation = strconv.FormatFloat(designOrientation, 'f', 2, 64) length_of_horizontal_section, _ := strconv.ParseFloat(data.Length_of_horizontal_section, 64) length_of_horizontal_section, _ = decimal.NewFromFloat(length_of_horizontal_section).Round(2).Float64() data.Length_of_horizontal_section = strconv.FormatFloat(length_of_horizontal_section, 'f', 2, 64) rate, _ := strconv.ParseFloat(data.Rate, 64) rate, _ = decimal.NewFromFloat(rate).Round(2).Float64() data.Rate = strconv.FormatFloat(rate, 'f', 2, 64) instrument_angle_difference, _ := strconv.ParseFloat(data.Instrument_angle_difference, 64) instrument_angle_difference, _ = decimal.NewFromFloat(instrument_angle_difference).Round(2).Float64() data.Instrument_angle_difference = strconv.FormatFloat(instrument_angle_difference, 'f', 2, 64) angle_difference_of_drilling_tool, _ := strconv.ParseFloat(data.Angle_difference_of_drilling_tool, 64) angle_difference_of_drilling_tool, _ = decimal.NewFromFloat(angle_difference_of_drilling_tool).Round(2).Float64() data.Angle_difference_of_drilling_tool = strconv.FormatFloat(angle_difference_of_drilling_tool, 'f', 2, 64) maxPressure, _ := decimal.NewFromFloat(float64(data.MaxPressure)).Round(2).Float64() if ps_info.R1 == "2" { maxPressure, _ = decimal.NewFromFloat(float64(145.038 * maxPressure)).Round(2).Float64() } data.MaxPressure = float32(maxPressure) maxTemp, _ := decimal.NewFromFloat(float64(data.MaxTemp)).Round(2).Float64() if ps_info.R2 == "2" { maxTemp, _ = decimal.NewFromFloat(float64(1.8*maxTemp + 32)).Round(2).Float64() } data.MaxTemp = float32(maxTemp) jdata, _ := json.Marshal(data) resp = string(jdata) } else { fmt.Println(err.Error()) } } exit: fmt.Fprintf(response, resp) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getEs recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_well_history_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getWellEx1_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_well_ex1_req json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var selSql string var cntSql string var whereSql string var ifWhere bool if req.Wellname != "" { wellnamesource := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` WELLNameSource like '%s'`, wellnamesource) ifWhere = true } if req.BeginTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime>'%s' `, req.BeginTime) } else { whereSql += fmt.Sprintf(` CreateTableTime>'%s' `, req.BeginTime) } ifWhere = true } if req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime<'%s'`, req.EndTime) } else { whereSql += fmt.Sprintf(` CreateTableTime<'%s'`, req.EndTime) } ifWhere = true } if req.Checked { if ifWhere { whereSql += fmt.Sprintf(` and service_type=1`) } else { whereSql += fmt.Sprintf(` service_type=1`) } ifWhere = true } if spe_name, ok := spe_user[req.OpUser]; ok { if ifWhere { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } else { whereSql += fmt.Sprintf(` [ClOUDACCOUNT]='%s' `, spe_name) } ifWhere = true } /*if ifWhere { whereSql += fmt.Sprintf(` and [es_flag]=1 `) } else { whereSql += fmt.Sprintf(` [es_flag]=1 `) } ifWhere = true*/ if ifWhere { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime],[tool_status_warning] desc) and %s order by [CreateTableTime] desc ,[tool_status_warning] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime],[tool_status_warning] desc) order by [CreateTableTime] desc ,[tool_status_warning] desc", req.Count, (req.Index-1)*req.Count) } if ifWhere { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation] where %s", whereSql) } else { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation]") } cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getWellEx1_en count Query Error", err.Error()) return } row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx1_en Query Error", err.Error()) return } defer row.Close() var resp GetWellExResp for row.Next() { var d wellExData var id int var wellstate int var rt_falg int if err := row.Scan(&id, &d.WellNameSource, &wellstate, &d.Welltime, &d.Welloperator, &rt_falg); err == nil { if len(d.Welltime) >= 19 { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) } if wellstate == 1 { d.Wellstate = "online" } else { d.Wellstate = "offline" } d.Welloperator = strings.Trim(d.Welloperator, " ") if rt_falg == 1 { d.Rt_flag = true } resp.Data = append(resp.Data, d) } else { fmt.Println(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getWellEx1_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_well_history(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("getWellEx1 recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_well_ex1_req json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var selSql string var cntSql string var whereSql string var ifWhere bool // 始终 JOIN well_type_t 表,以便获取每口井的类型信息 joinSql := ` LEFT JOIN [well_type_t] ON [WellInformation].[WELLNameSource] = [well_type_t].[well_name] ` if req.Wellname != "" { wellnamesource := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` WellInformation.WELLNameSource like '%s'`, wellnamesource) ifWhere = true } if req.BeginTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and WellInformation.CreateTableTime>'%s' `, req.BeginTime) } else { whereSql += fmt.Sprintf(` WellInformation.CreateTableTime>'%s' `, req.BeginTime) } ifWhere = true } if req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and WellInformation.CreateTableTime<'%s'`, req.EndTime) } else { whereSql += fmt.Sprintf(` WellInformation.CreateTableTime<'%s'`, req.EndTime) } ifWhere = true } if req.Checked { if ifWhere { whereSql += fmt.Sprintf(` and WellInformation.service_type=1`) } else { whereSql += fmt.Sprintf(` WellInformation.service_type=1`) } ifWhere = true } if req.If_warn { if ifWhere { whereSql += fmt.Sprintf(` and WellInformation.tool_status_warning=1`) } else { whereSql += fmt.Sprintf(` WellInformation.tool_status_warning=1`) } ifWhere = true } // 类型筛选条件(仅在 req.Type != 0 时添加) if req.Type != 0 { typeCondition := fmt.Sprintf(` (well_type_t.well_type & %d) != 0 and well_type_t.if_available != 1`, req.Type) if ifWhere { whereSql += fmt.Sprintf(` and %s`, typeCondition) } else { whereSql += fmt.Sprintf(` %s`, typeCondition) } ifWhere = true } if spe_name, ok := spe_user[req.OpUser]; ok { if ifWhere { whereSql += fmt.Sprintf(` and WellInformation.ClOUDACCOUNT='%s' `, spe_name) } else { whereSql += fmt.Sprintf(` WellInformation.ClOUDACCOUNT='%s' `, spe_name) } ifWhere = true } // 构建分页查询 SQL(查询时带上 well_type 字段) if ifWhere { selSql = fmt.Sprintf(` SELECT WellInformation.[ID], WellInformation.[WELLNameSource], WellInformation.[stats], WellInformation.[CreateTableTime], COALESCE(WellInformation.[Operator],''), WellInformation.[rt_flag], COALESCE(WellInformation.[ClOUDACCOUNT],''), WellInformation.[tool_status_warning], COALESCE(well_type_t.well_type, 0) as well_type FROM [WellInformation] %s WHERE %s ORDER BY WellInformation.[CreateTableTime] DESC, WellInformation.[tool_status_warning] DESC OFFSET %d ROWS FETCH NEXT %d ROWS ONLY`, joinSql, whereSql, (req.Index-1)*req.Count, req.Count) } else { selSql = fmt.Sprintf(` SELECT WellInformation.[ID], WellInformation.[WELLNameSource], WellInformation.[stats], WellInformation.[CreateTableTime], COALESCE(WellInformation.[Operator],''), WellInformation.[rt_flag], COALESCE(WellInformation.[ClOUDACCOUNT],''), WellInformation.[tool_status_warning], COALESCE(well_type_t.well_type, 0) as well_type FROM [WellInformation] %s ORDER BY WellInformation.[CreateTableTime] DESC, WellInformation.[tool_status_warning] DESC OFFSET %d ROWS FETCH NEXT %d ROWS ONLY`, joinSql, (req.Index-1)*req.Count, req.Count) } // 构建计数 SQL if ifWhere { cntSql = fmt.Sprintf(` SELECT COUNT(WellInformation.[ID]) FROM [WellInformation] %s WHERE %s`, joinSql, whereSql) } else { cntSql = fmt.Sprintf(`SELECT COUNT([ID]) FROM [WellInformation]`) } cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getWellEx1 count Query Error", err.Error()) return } fmt.Println(selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx1 Query Error", err.Error()) return } defer row.Close() var resp GetWellExResp for row.Next() { var d wellExData var id int var wellstate int var rt_flag sql.NullInt64 var tsw sql.NullInt64 var wellType int // 存储类型位掩码 if err := row.Scan(&id, &d.WellNameSource, &wellstate, &d.Welltime, &d.Welloperator, &rt_flag, &d.Upload_user, &tsw, &wellType); err == nil { if len(d.Welltime) >= 19 { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) } if wellstate == 1 { d.Wellstate = "在线" } else { d.Wellstate = "离线" } d.Welloperator = strings.Trim(d.Welloperator, " ") if rt_flag.Valid { if rt_flag.Int64 == 1 { d.Rt_flag = true } } if tsw.Valid && tsw.Int64 == 1 { d.Tool_state_warning = true } // 转换类型位掩码为中文字符串 d.TypeName = convertWellTypeToName(wellType) resp.Data = append(resp.Data, d) } else { fmt.Println(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("getWellEx1 recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } // 类型转换函数 func convertWellTypeToName(wellType int) string { var t string if wellType&(1<<0) != 0 { t = "测斜" } if wellType&(1<<1) != 0 { if t != "" { t += "," + "近钻头" } else { t = "近钻头" } } if wellType&(1<<2) != 0 { if t != "" { t += "," + "电阻率" } else { t = "电阻率" } } if wellType&(1<<3) != 0 { if t != "" { t += "," + "探管式方位伽马" } else { t = "探管式方位伽马" } } if wellType&(1<<4) != 0 { if t != "" { t += "," + "钻铤式方位伽马" } else { t = "钻铤式方位伽马" } } if wellType&(1<<5) != 0 { if t != "" { t += "," + "自然伽马" } else { t = "自然伽马" } } if wellType&(1<<6) != 0 { if t != "" { t += "," + "工程参数" } else { t = "工程参数" } } if wellType&(1<<7) != 0 { if t != "" { t += "," + "振动粘滑" } else { t = "振动粘滑" } } return t } func getWellEx1_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getWellEx1_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_well_ex1_req json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var selSql string var cntSql string var whereSql string var ifWhere bool if req.Wellname != "" { wellnamesource := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` WELLNameSource like '%s'`, wellnamesource) ifWhere = true } if req.BeginTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime>'%s' `, req.BeginTime) } else { whereSql += fmt.Sprintf(` CreateTableTime>'%s' `, req.BeginTime) } ifWhere = true } if req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime<'%s'`, req.EndTime) } else { whereSql += fmt.Sprintf(` CreateTableTime<'%s'`, req.EndTime) } ifWhere = true } if req.Checked { if ifWhere { whereSql += fmt.Sprintf(` and service_type=1`) } else { whereSql += fmt.Sprintf(` service_type=1`) } ifWhere = true } if spe_name, ok := spe_user[req.OpUser]; ok { if ifWhere { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } else { whereSql += fmt.Sprintf(` [ClOUDACCOUNT]='%s' `, spe_name) } ifWhere = true } // if ifWhere { // selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) // } else { // selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) // } if ifWhere { selSql = fmt.Sprintf(` SELECT [ID],[WELLNameSource],[stats],[CreateTableTime], COALESCE([Operator],''),[rt_flag], COALESCE([ClOUDACCOUNT],''),ISNULL([tool_status_warning], 1) AS [tool_status_warning] FROM [WellInformation] WHERE %s ORDER BY [CreateTableTime] DESC, [tool_status_warning] DESC OFFSET %d ROWS FETCH NEXT %d ROWS ONLY`, whereSql, (req.Index-1)*req.Count, req.Count) } else { selSql = fmt.Sprintf(` SELECT [ID],[WELLNameSource],[stats],[CreateTableTime], COALESCE([Operator],''),[rt_flag], COALESCE([ClOUDACCOUNT],''),ISNULL([tool_status_warning], 1) AS [tool_status_warning] FROM [WellInformation] ORDER BY [CreateTableTime] DESC, [tool_status_warning] DESC OFFSET %d ROWS FETCH NEXT %d ROWS ONLY`, (req.Index-1)*req.Count, req.Count) } if ifWhere { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation] where %s", whereSql) } else { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation]") } cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getWellEx1_en count Query Error", err.Error()) return } fmt.Println("selSql-------", selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx1_en Query Error", err.Error()) return } defer row.Close() var resp GetWellExResp for row.Next() { var d wellExData var id int var wellstate int var rt_falg int var tsw int if err := row.Scan(&id, &d.WellNameSource, &wellstate, &d.Welltime, &d.Welloperator, &rt_falg, &d.Upload_user, &tsw); err == nil { if len(d.Welltime) >= 19 { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) } if wellstate == 1 { d.Wellstate = "online" } else { d.Wellstate = "offline" } d.Welloperator = strings.Trim(d.Welloperator, " ") if rt_falg == 1 { d.Rt_flag = true } resp.Data = append(resp.Data, d) } else { fmt.Println(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getWellEx1_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getWellEx1(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("getWellEx1 recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_well_ex1_req json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var selSql string var cntSql string var whereSql string var ifWhere bool if req.Wellname != "" { wellnamesource := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` WELLNameSource like '%s'`, wellnamesource) ifWhere = true } if req.BeginTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime>'%s' `, req.BeginTime) } else { whereSql += fmt.Sprintf(` CreateTableTime>'%s' `, req.BeginTime) } ifWhere = true } if req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime<'%s'`, req.EndTime) } else { whereSql += fmt.Sprintf(` CreateTableTime<'%s'`, req.EndTime) } ifWhere = true } if req.Checked { if ifWhere { whereSql += fmt.Sprintf(` and service_type=1`) } else { whereSql += fmt.Sprintf(` service_type=1`) } ifWhere = true } if req.If_warn { if ifWhere { whereSql += fmt.Sprintf(` and [tool_status_warning]=1`) } else { whereSql += fmt.Sprintf(` [tool_status_warning]=1`) } ifWhere = true } if spe_name, ok := spe_user[req.OpUser]; ok { if ifWhere { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } else { whereSql += fmt.Sprintf(` [ClOUDACCOUNT]='%s' `, spe_name) } ifWhere = true } if ifWhere { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),ISNULL([tool_status_warning], 1) AS [tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),ISNULL([tool_status_warning], 1) AS [tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) } if ifWhere { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation] where %s", whereSql) } else { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation]") } cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getWellEx1 count Query Error", err.Error()) return } fmt.Println("selSql-------", selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx1 Query Error", err.Error()) return } defer row.Close() var resp GetWellExResp for row.Next() { var d wellExData var id int var wellstate int var rt_flag int var tsw int if err := row.Scan(&id, &d.WellNameSource, &wellstate, &d.Welltime, &d.Welloperator, &rt_flag, &d.Upload_user, &tsw); err == nil { if len(d.Welltime) >= 19 { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) } if wellstate == 1 { d.Wellstate = "在线" } else { d.Wellstate = "离线" } d.Welloperator = strings.Trim(d.Welloperator, " ") if rt_flag == 1 { d.Rt_flag = true } if tsw == 1 { d.Tool_state_warning = true } resp.Data = append(resp.Data, d) } else { fmt.Println(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("getWellEx1 recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_well_tool(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_well_tool recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_well_ex1_req json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var selSql string var cntSql string var whereSql string var ifWhere bool if req.Wellname != "" { wellnamesource := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` WELLNameSource like '%s'`, wellnamesource) ifWhere = true } if req.BeginTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime>'%s' `, req.BeginTime) } else { whereSql += fmt.Sprintf(` CreateTableTime>'%s' `, req.BeginTime) } ifWhere = true } if req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime<'%s'`, req.EndTime) } else { whereSql += fmt.Sprintf(` CreateTableTime<'%s'`, req.EndTime) } ifWhere = true } if req.Checked { if ifWhere { whereSql += fmt.Sprintf(` and service_type=1`) } else { whereSql += fmt.Sprintf(` service_type=1`) } ifWhere = true } if req.If_warn { if ifWhere { whereSql += fmt.Sprintf(` and [tool_status_warning]=1`) } else { whereSql += fmt.Sprintf(` [tool_status_warning]=1`) } ifWhere = true } if spe_name, ok := spe_user[req.OpUser]; ok { if ifWhere { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } else { whereSql += fmt.Sprintf(` [ClOUDACCOUNT]='%s' `, spe_name) } ifWhere = true } if ifWhere { whereSql += fmt.Sprintf(` and [es_flag]=1 `) } else { whereSql += fmt.Sprintf(` [es_flag]=1 `) } ifWhere = true if ifWhere { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),COALESCE([tool_status_warning], 0) from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),COALESCE([tool_status_warning], 0) from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) } if ifWhere { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation] where %s", whereSql) } else { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation]") } logs.Info("getWellEx1 count Query ", cntSql) cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getWellEx1 count Query Error", err.Error()) return } logs.Info("getWellEx1 selSql Query ", selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx1 Query Error", err.Error()) return } defer row.Close() var resp GetWellExResp for row.Next() { var d wellExData var id int var wellstate int var rt_flag int var tsw int if err := row.Scan(&id, &d.WellNameSource, &wellstate, &d.Welltime, &d.Welloperator, &rt_flag, &d.Upload_user, &tsw); err == nil { if len(d.Welltime) >= 19 { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) } if wellstate == 1 { d.Wellstate = "在线" } else { d.Wellstate = "离线" } d.Welloperator = strings.Trim(d.Welloperator, " ") if rt_flag == 1 { d.Rt_flag = true } if tsw == 1 { d.Tool_state_warning = true } resp.Data = append(resp.Data, d) } else { fmt.Println(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_well_tool recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_well_dev_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("get_well_dev_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_well_ex1_req json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var selSql string var cntSql string var whereSql string var ifWhere bool if req.Wellname != "" { wellnamesource := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` WELLNameSource like '%s'`, wellnamesource) ifWhere = true } if req.BeginTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime>'%s' `, req.BeginTime) } else { whereSql += fmt.Sprintf(` CreateTableTime>'%s' `, req.BeginTime) } ifWhere = true } if req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime<'%s'`, req.EndTime) } else { whereSql += fmt.Sprintf(` CreateTableTime<'%s'`, req.EndTime) } ifWhere = true } if req.Checked { if ifWhere { whereSql += fmt.Sprintf(` and service_type=1`) } else { whereSql += fmt.Sprintf(` service_type=1`) } ifWhere = true } if spe_name, ok := spe_user[req.OpUser]; ok { if ifWhere { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } else { whereSql += fmt.Sprintf(` [ClOUDACCOUNT]='%s' `, spe_name) } ifWhere = true } if ifWhere { whereSql += fmt.Sprintf(` and [dev_flag]=1 `) } else { whereSql += fmt.Sprintf(` [dev_flag]=1 `) } ifWhere = true if ifWhere { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) } if ifWhere { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation] where %s", whereSql) } else { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation]") } cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getWellEx1_en count Query Error", err.Error()) return } row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx1_en Query Error", err.Error()) return } defer row.Close() var resp GetWellExResp for row.Next() { var d wellExData var id int var wellstate int var rt_falg int if err := row.Scan(&id, &d.WellNameSource, &wellstate, &d.Welltime, &d.Welloperator, &rt_falg); err == nil { if len(d.Welltime) >= 19 { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) } if wellstate == 1 { d.Wellstate = "online" } else { d.Wellstate = "offline" } d.Welloperator = strings.Trim(d.Welloperator, " ") if rt_falg == 1 { d.Rt_flag = true } resp.Data = append(resp.Data, d) } else { fmt.Println(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("get_well_dev_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_well_dev(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_well_dev recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_well_ex1_req json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var selSql string var cntSql string var whereSql string var ifWhere bool if req.Wellname != "" { wellnamesource := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` WELLNameSource like '%s'`, wellnamesource) ifWhere = true } if req.BeginTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime>'%s' `, req.BeginTime) } else { whereSql += fmt.Sprintf(` CreateTableTime>'%s' `, req.BeginTime) } ifWhere = true } if req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime<'%s'`, req.EndTime) } else { whereSql += fmt.Sprintf(` CreateTableTime<'%s'`, req.EndTime) } ifWhere = true } if req.Checked { if ifWhere { whereSql += fmt.Sprintf(` and service_type=1`) } else { whereSql += fmt.Sprintf(` service_type=1`) } ifWhere = true } if req.If_warn { if ifWhere { whereSql += fmt.Sprintf(` and [tool_status_warning]=1`) } else { whereSql += fmt.Sprintf(` [tool_status_warning]=1`) } ifWhere = true } if spe_name, ok := spe_user[req.OpUser]; ok { if ifWhere { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } else { whereSql += fmt.Sprintf(` [ClOUDACCOUNT]='%s' `, spe_name) } ifWhere = true } if ifWhere { whereSql += fmt.Sprintf(` and [dev_flag]=1 `) } else { whereSql += fmt.Sprintf(` [dev_flag]=1 `) } ifWhere = true if ifWhere { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),[tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),[tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) } if ifWhere { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation] where %s", whereSql) } else { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation]") } cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getWellEx1 count Query Error", err.Error()) return } fmt.Println("selSql----", selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx1 Query Error", err.Error()) return } defer row.Close() var resp GetWellExResp for row.Next() { var d wellExData var id int var wellstate int var rt_flag int var tsw int if err := row.Scan(&id, &d.WellNameSource, &wellstate, &d.Welltime, &d.Welloperator, &rt_flag, &d.Upload_user, &tsw); err == nil { if len(d.Welltime) >= 19 { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) } if wellstate == 1 { d.Wellstate = "在线" } else { d.Wellstate = "离线" } d.Welloperator = strings.Trim(d.Welloperator, " ") if rt_flag == 1 { d.Rt_flag = true } if tsw == 1 { d.Tool_state_warning = true } resp.Data = append(resp.Data, d) } else { fmt.Println(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_well_dev recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_well_cmp_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("get_well_cmp_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_well_ex1_req json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var selSql string var cntSql string var whereSql string var ifWhere bool if req.Wellname != "" { wellnamesource := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` WELLNameSource like '%s'`, wellnamesource) ifWhere = true } if req.BeginTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime>'%s' `, req.BeginTime) } else { whereSql += fmt.Sprintf(` CreateTableTime>'%s' `, req.BeginTime) } ifWhere = true } if req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime<'%s'`, req.EndTime) } else { whereSql += fmt.Sprintf(` CreateTableTime<'%s'`, req.EndTime) } ifWhere = true } if req.Checked { if ifWhere { whereSql += fmt.Sprintf(` and service_type=1`) } else { whereSql += fmt.Sprintf(` service_type=1`) } ifWhere = true } if spe_name, ok := spe_user[req.OpUser]; ok { if ifWhere { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } else { whereSql += fmt.Sprintf(` [ClOUDACCOUNT]='%s' `, spe_name) } ifWhere = true } if ifWhere { whereSql += fmt.Sprintf(` and [es_flag]=1 `) } else { whereSql += fmt.Sprintf(` [es_flag]=1 `) } ifWhere = true if ifWhere { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),[tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),[tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) } if ifWhere { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation] where %s", whereSql) } else { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation]") } cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getWellEx1_en count Query Error", err.Error()) return } fmt.Println("selSql----------", selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx1_en Query Error", err.Error()) return } defer row.Close() var resp GetWellExResp for row.Next() { var d wellExData var id int var wellstate int var rt_flag int var tsw int if err := row.Scan(&id, &d.WellNameSource, &wellstate, &d.Welltime, &d.Welloperator, &rt_flag, &d.Upload_user, &tsw); err == nil { if len(d.Welltime) >= 19 { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) } if wellstate == 1 { d.Wellstate = "online" } else { d.Wellstate = "offline" } d.Welloperator = strings.Trim(d.Welloperator, " ") if rt_flag == 1 { d.Rt_flag = true } resp.Data = append(resp.Data, d) } else { fmt.Println(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("get_well_cmp_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_well_cmp(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("get_well_cmp recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req get_well_ex1_req json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var selSql string var cntSql string var whereSql string var ifWhere bool if req.Wellname != "" { wellnamesource := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` WELLNameSource like '%s'`, wellnamesource) ifWhere = true } if req.BeginTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime>'%s' `, req.BeginTime) } else { whereSql += fmt.Sprintf(` CreateTableTime>'%s' `, req.BeginTime) } ifWhere = true } if req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime<'%s'`, req.EndTime) } else { whereSql += fmt.Sprintf(` CreateTableTime<'%s'`, req.EndTime) } ifWhere = true } if req.Checked { if ifWhere { whereSql += fmt.Sprintf(` and service_type=1`) } else { whereSql += fmt.Sprintf(` service_type=1`) } ifWhere = true } if req.If_warn { if ifWhere { whereSql += fmt.Sprintf(` and [tool_status_warning]=1`) } else { whereSql += fmt.Sprintf(` [tool_status_warning]=1`) } ifWhere = true } if spe_name, ok := spe_user[req.OpUser]; ok { if ifWhere { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } else { whereSql += fmt.Sprintf(` [ClOUDACCOUNT]='%s' `, spe_name) } ifWhere = true } if ifWhere { whereSql += fmt.Sprintf(` and [es_flag]=1 `) } else { whereSql += fmt.Sprintf(` [es_flag]=1 `) } ifWhere = true if ifWhere { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),[tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),[tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) } if ifWhere { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation] where %s", whereSql) } else { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation]") } cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getWellEx1 count Query Error", err.Error()) return } fmt.Println("selSql-------", selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx1 Query Error", err.Error()) return } defer row.Close() var resp GetWellExResp for row.Next() { var d wellExData var id int var wellstate int var rt_flag int var tsw int if err := row.Scan(&id, &d.WellNameSource, &wellstate, &d.Welltime, &d.Welloperator, &rt_flag, &d.Upload_user, &tsw); err == nil { if len(d.Welltime) >= 19 { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) } if wellstate == 1 { d.Wellstate = "在线" } else { d.Wellstate = "离线" } d.Welloperator = strings.Trim(d.Welloperator, " ") if rt_flag == 1 { d.Rt_flag = true } if tsw == 1 { d.Tool_state_warning = true } resp.Data = append(resp.Data, d) } else { fmt.Println(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("get_well_cmp recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_well_es_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getWellEx_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetWellExReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var selSql string var cntSql string var whereSql string var ifWhere bool if req.Wellname != "" { wellnamesource := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` WELLNameSource like '%s'`, wellnamesource) ifWhere = true } if req.BeginTime != "" && req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime>'%s' and CreateTableTime<'%s'`, req.BeginTime, req.EndTime) } else { whereSql += fmt.Sprintf(` CreateTableTime>'%s' and CreateTableTime<'%s'`, req.BeginTime, req.EndTime) } ifWhere = true } if spe_name, ok := spe_user[req.OpUser]; ok { if ifWhere { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } else { whereSql += fmt.Sprintf(` [ClOUDACCOUNT]='%s' `, spe_name) } ifWhere = true } if ifWhere { whereSql += fmt.Sprintf(` and [es_flag]=1 `) } else { whereSql += fmt.Sprintf(` [es_flag]=1 `) } ifWhere = true if ifWhere { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[es_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[es_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) } if ifWhere { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation] where %s", whereSql) } else { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation]") } cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getWellEx_en count Query Error", err.Error()) return } row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx_en Query Error", err.Error()) return } defer row.Close() var resp GetWellExResp for row.Next() { var d wellExData var id int var wellstate int var es_flag int if err := row.Scan(&id, &d.WellNameSource, &wellstate, &d.Welltime, &d.Welloperator, &es_flag); err == nil { if len(d.Welltime) >= 19 { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) } if wellstate == 1 { d.Wellstate = "online" } else { d.Wellstate = "offline" } d.Welloperator = strings.Trim(d.Welloperator, " ") if es_flag == 1 { d.Es_flag = true } resp.Data = append(resp.Data, d) } else { fmt.Println(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() //fmt.Println(1e6) fmt.Println(fmt.Sprintf("getWellEx_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_well_es(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getWellEx recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetWellExReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var selSql string var cntSql string var whereSql string var ifWhere bool if req.Wellname != "" { wellnamesource := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` WELLNameSource like '%s'`, wellnamesource) ifWhere = true } if req.BeginTime != "" && req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime>'%s' and CreateTableTime<'%s'`, req.BeginTime, req.EndTime) } else { whereSql += fmt.Sprintf(` CreateTableTime>'%s' and CreateTableTime<'%s'`, req.BeginTime, req.EndTime) } ifWhere = true } if spe_name, ok := spe_user[req.OpUser]; ok { if ifWhere { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } else { whereSql += fmt.Sprintf(` [ClOUDACCOUNT]='%s' `, spe_name) } ifWhere = true } if ifWhere { whereSql += fmt.Sprintf(` and [es_flag]=1 `) } else { whereSql += fmt.Sprintf(` [es_flag]=1 `) } ifWhere = true if ifWhere { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[es_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[es_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) } if ifWhere { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation] where %s", whereSql) } else { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation]") } cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getWellEx count Query Error", err.Error()) return } row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx Query Error", err.Error()) return } defer row.Close() var resp GetWellExResp for row.Next() { var d wellExData var id int var wellstate int var es_flag int if err := row.Scan(&id, &d.WellNameSource, &wellstate, &d.Welltime, &d.Welloperator, &es_flag); err == nil { if len(d.Welltime) >= 19 { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) } if wellstate == 1 { d.Wellstate = "在线" } else { d.Wellstate = "离线" } d.Welloperator = strings.Trim(d.Welloperator, " ") if es_flag == 1 { d.Es_flag = true } resp.Data = append(resp.Data, d) } else { fmt.Println(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() //fmt.Println(1e6) fmt.Println(fmt.Sprintf("getWellEx recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getWellEx_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getWellEx_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetWellExReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var selSql string var cntSql string var whereSql string var ifWhere bool if req.Wellname != "" { wellnamesource := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` WELLNameSource like '%s'`, wellnamesource) ifWhere = true } if req.BeginTime != "" && req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime>'%s' and CreateTableTime<'%s'`, req.BeginTime, req.EndTime) } else { whereSql += fmt.Sprintf(` CreateTableTime>'%s' and CreateTableTime<'%s'`, req.BeginTime, req.EndTime) } ifWhere = true } if spe_name, ok := spe_user[req.OpUser]; ok { if ifWhere { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } else { whereSql += fmt.Sprintf(` [ClOUDACCOUNT]='%s' `, spe_name) } ifWhere = true } if ifWhere { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[es_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[es_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) } if ifWhere { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation] where %s", whereSql) } else { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation]") } cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getWellEx_en count Query Error", err.Error()) return } row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx_en Query Error", err.Error()) return } defer row.Close() var resp GetWellExResp for row.Next() { var d wellExData var id int var wellstate int var es_flag int if err := row.Scan(&id, &d.WellNameSource, &wellstate, &d.Welltime, &d.Welloperator, &es_flag); err == nil { if len(d.Welltime) >= 19 { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) } if wellstate == 1 { d.Wellstate = "online" } else { d.Wellstate = "offline" } d.Welloperator = strings.Trim(d.Welloperator, " ") if es_flag == 1 { d.Es_flag = true } resp.Data = append(resp.Data, d) } else { fmt.Println(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() //fmt.Println(1e6) fmt.Println(fmt.Sprintf("getWellEx_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getWellEx(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getWellEx recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetWellExReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var selSql string var cntSql string var whereSql string var ifWhere bool if req.Wellname != "" { wellnamesource := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` WELLNameSource like '%s'`, wellnamesource) ifWhere = true } if req.BeginTime != "" && req.EndTime != "" { if ifWhere { whereSql += fmt.Sprintf(` and CreateTableTime>'%s' and CreateTableTime<'%s'`, req.BeginTime, req.EndTime) } else { whereSql += fmt.Sprintf(` CreateTableTime>'%s' and CreateTableTime<'%s'`, req.BeginTime, req.EndTime) } ifWhere = true } if spe_name, ok := spe_user[req.OpUser]; ok { if ifWhere { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } else { whereSql += fmt.Sprintf(` [ClOUDACCOUNT]='%s' `, spe_name) } ifWhere = true } if ifWhere { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[es_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[es_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) } if ifWhere { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation] where %s", whereSql) } else { cntSql = fmt.Sprintf("select count([ID]) from [WellInformation]") } cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error("getWellEx count Query Error", err.Error()) return } row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx Query Error", err.Error()) return } defer row.Close() var resp GetWellExResp for row.Next() { var d wellExData var id int var wellstate int var es_flag int if err := row.Scan(&id, &d.WellNameSource, &wellstate, &d.Welltime, &d.Welloperator, &es_flag); err == nil { if len(d.Welltime) >= 19 { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) } if wellstate == 1 { d.Wellstate = "在线" } else { d.Wellstate = "离线" } d.Welloperator = strings.Trim(d.Welloperator, " ") if es_flag == 1 { d.Es_flag = true } resp.Data = append(resp.Data, d) } else { fmt.Println(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() //fmt.Println(1e6) fmt.Println(fmt.Sprintf("getWellEx recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_tool_WarningCsv(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("get_tool_WarningCsv recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req MssExportReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) // ps_info := get_ps_info(req.OpUser) filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { fmt.Println(err) return } defer f.Close() var data [][]string data = append(data, []string{"仪器系列号", "仪器编码", "出厂总工时", "维保次数"}) var whereSql string = " where [if_available] !=1 " if req.Wellname != "" { whereSql += " and wellname like '%" + req.Wellname + "%'" } if req.Series != "" { whereSql += " and series like '%" + req.Series + "%'" } if req.Instrument_id != "" { whereSql += " and instrument_id like '%" + req.Instrument_id + "%'" } if req.Checked { likeid := fmt.Sprintf(" and [service_type]=1") whereSql += likeid } if spe_name, ok := spe_user[req.OpUser]; ok { likeid := fmt.Sprintf(" and [ClOUDACCOUNT]='%s' ", spe_name) whereSql += likeid } t3, _ := time.ParseDuration("-1h") m3 := time.Now().Add(t3 * 720 * 3) beginT := m3.Format("2006-01-02 15:04:05") whereSql += fmt.Sprintf(` and [saveTime] > '%s'`, beginT) var selSql string selSql = fmt.Sprintf(`select [series],[instrument_id],[totalWorkTime],[repairCnt] from [analysis_result_mss] %s order by [saveTime] desc`, whereSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error(fmt.Sprintf("get_tool_WarningCsv db query err:%s", err.Error())) goto exit } for row.Next() { var v GetMssRespData if err = row.Scan(&v.Series, &v.InstrumentID, &v.TotalWorkTime, &v.RepairCnt); err == nil { total_wt, _ := strconv.Atoi(v.TotalWorkTime) repaired_cnt, _ := strconv.Atoi(v.RepairCnt) if total_wt/1000 > (repaired_cnt + 2) { //v.SaveTime = do_time_by_ps(v.SaveTime, ps_info) data = append(data, []string{v.Series, v.InstrumentID, v.TotalWorkTime, v.RepairCnt}) } } } row.Close() exit: f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码 w := csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() var resp MhExportResp resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { fmt.Println(err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("get_tool_WarningCsv recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getSeriesWarningCsv_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getSeriesWarningCsv_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) var filename string var file *xlsx.File var resp GetAuthPosCsvResp var req getSeriesWarningCsv_req reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) well_map := make(map[string]string) if _, ok := spe_user[req.OpUser]; ok { well_data, _ := getWellData(true) for i := 0; i < len(well_data); i++ { well_map[well_data[i].WellNameSource] = well_data[i].Cloud_account } } selSql := `select [wellname],[series],[instrument_id],[grade],[type],[warning_time],[special],[is_invalid],[dev_name],[default_warning_time],[ver],[lst_ver] from [analysis_result_warning] order by ID` rdRow, err := sqlConn.Query(selSql) if err != nil { logs.Error("getSeriesWarningCsv_en query err:", err.Error()) return } var data []SeriesWarning for rdRow.Next() { var d SeriesWarning if err = rdRow.Scan(&d.Wellname, &d.Series, &d.InstrumentID, &d.Grade, &d.Type, &d.Warning_time, &d.Special, &d.IsInvalid, &d.DevName, &d.DefWarningTime, &d.Ver, &d.LstVer); err == nil { data = append(data, d) } else { logs.Error("getSeriesWarningCsv_en scan err:", err.Error()) } } rdRow.Close() file = xlsx.NewFile() sheet, err := file.AddSheet("sheet1") if err != nil { logs.Error("file add sheet err:", err.Error()) } style := xlsx.NewStyle() font := *xlsx.NewFont(11, "宋体") style.Font = font alignment := xlsx.Alignment{ Horizontal: "right", Vertical: "center", } style.Alignment = alignment style.ApplyAlignment = true row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = "Well name" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Instrument Series No." cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Instrument Serial No." cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Current Working Time" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Instrument Name" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Maintenance level" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Warning time" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Special condition warning" for i := 0; i < len(data); i++ { v := data[i] if spe_name, ok := spe_user[req.OpUser]; ok { if well_map[v.Wellname] != spe_name { continue } } row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = v.Wellname cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Series cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.InstrumentID cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = strconv.Itoa(v.Warning_time) cell1 = row.AddCell() cell1.SetStyle(style) if v.DevName == "近钻头发射短节" { cell1.Value = "Transmiter of Near-bit" } else if v.DevName == "近钻头接收短节" { cell1.Value = "Receiver of Near-bit" } else if v.DevName == "无线通信短节" { cell1.Value = "Wireless communicaiton sub" } else if v.DevName == "工程参数" { cell1.Value = "DDM" } else if v.DevName == "探管" { cell1.Value = "Probe" } else if v.DevName == "伽马" { cell1.Value = "Gamma" } else if v.DevName == "脉冲器" { cell1.Value = "Pulser" } else { cell1.Value = "" } cell1 = row.AddCell() cell1.SetStyle(style) if v.Grade == 2 { cell1.Value = "Secondary maintenance" } else if v.Grade == 3 { cell1.Value = "three-level maintenance" } else if v.Grade == 4 { cell1.Value = "Level IV maintenance" } cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = strconv.Itoa(v.DefWarningTime) cell1 = row.AddCell() cell1.SetStyle(style) v.Special = "" cell1.Value = v.Special } endT := time.Now().Format("2006-01-02 15:04:05") t3, _ := time.ParseDuration("-1h") m3 := time.Now().Add(t3 * 720) beginT := m3.Format("2006-01-02 15:04:05") selSql = fmt.Sprintf(`SELECT [wellname],[series],[instrument_id],[ver],[lastVer] FROM [analysis_result_mss] where [if_available]=0 and saveTime > '%s' and saveTime< '%s' and [ver]!='' and [lastVer] !='' and [ver] < [lastVer] order by [saveTime] desc`, beginT, endT) fmt.Println(selSql) rows, err := sqlConn.Query(selSql) if err == nil { sheet.AddRow() sheet.AddRow() row := sheet.AddRow() cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Well name" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Series No." cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Instrument No." cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Version Number" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Latest Version Number" m := make(map[string]bool) for rows.Next() { var wellname, sid, iid, ver, lstVer string if rows.Scan(&wellname, &sid, &iid, &ver, &lstVer); err == nil { if spe_name, ok := spe_user[req.OpUser]; ok { if well_map[wellname] != spe_name { continue } } if _, ok := m[sid+iid]; !ok { m[sid+iid] = true } else { continue } row := sheet.AddRow() cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = wellname row = sheet.AddRow() cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = sid cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = iid cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = ver cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = lstVer } } rows.Close() } filename = fmt.Sprintf(`%v.xlsx`, beginTime) err = file.Save("./authfile/" + filename) if err != nil { logs.Error("xlsx save err:", err.Error()) } resp.FileId = filename jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { logs.Error("getSeriesWarningCsv_en err:", err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getSeriesWarningCsv_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getSeriesWarningCsv(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getSeriesWarningCsv recv req begin", time.Now().Format("2006-01-02 15:04:05")) var filename string var file *xlsx.File var resp GetAuthPosCsvResp var req getSeriesWarningCsv_req reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) well_map := make(map[string]string) if _, ok := spe_user[req.OpUser]; ok { well_data, _ := getWellData(true) for i := 0; i < len(well_data); i++ { well_map[well_data[i].WellNameSource] = well_data[i].Cloud_account } } selSql := `select [wellname],[series],[instrument_id],[grade],[type],[warning_time],[special],[is_invalid],[dev_name],[default_warning_time],[ver],[lst_ver] from [analysis_result_warning] order by ID` rdRow, err := sqlConn.Query(selSql) if err != nil { logs.Error("getSeriesWarningCsv query err:", err.Error()) return } var data []SeriesWarning for rdRow.Next() { var d SeriesWarning if err = rdRow.Scan(&d.Wellname, &d.Series, &d.InstrumentID, &d.Grade, &d.Type, &d.Warning_time, &d.Special, &d.IsInvalid, &d.DevName, &d.DefWarningTime, &d.Ver, &d.LstVer); err == nil { data = append(data, d) } else { logs.Error("getSeriesWarningCsv scan err:", err.Error()) } } rdRow.Close() file = xlsx.NewFile() sheet, err := file.AddSheet("sheet1") if err != nil { logs.Error("file add sheet err:", err.Error()) } style := xlsx.NewStyle() font := *xlsx.NewFont(11, "宋体") style.Font = font alignment := xlsx.Alignment{ Horizontal: "right", Vertical: "center", } style.Alignment = alignment style.ApplyAlignment = true row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = "井名称" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "仪器系列号" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "仪器编码" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "工作时间" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "仪器名称" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "维保等级" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "预警时间" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "特殊条件预警" for i := 0; i < len(data); i++ { v := data[i] if spe_name, ok := spe_user[req.OpUser]; ok { if well_map[v.Wellname] != spe_name { continue } } row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = v.Wellname cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Series cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.InstrumentID cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = strconv.Itoa(v.Warning_time) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.DevName cell1 = row.AddCell() cell1.SetStyle(style) if v.Grade == 2 { cell1.Value = "二级维保" } else if v.Grade == 3 { cell1.Value = "三级维保" } else if v.Grade == 4 { cell1.Value = "四级维保" } cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = strconv.Itoa(v.DefWarningTime) cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Special } endT := time.Now().Format("2006-01-02 15:04:05") t3, _ := time.ParseDuration("-1h") m3 := time.Now().Add(t3 * 720) beginT := m3.Format("2006-01-02 15:04:05") selSql = fmt.Sprintf(`SELECT [wellname],[series],[instrument_id],[ver],[lastVer] FROM [analysis_result_mss] where [if_available]=0 and saveTime > '%s' and saveTime< '%s' and [ver]!='' and [lastVer] !='' and [ver] < [lastVer] order by [saveTime] desc`, beginT, endT) fmt.Println(selSql) rows, err := sqlConn.Query(selSql) if err == nil { sheet.AddRow() sheet.AddRow() row := sheet.AddRow() cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "井名称" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "仪器系列号" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "仪器编码" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "固件当前版本" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "固件最新版本" m := make(map[string]bool) for rows.Next() { var wellname, sid, iid, ver, lstVer string if rows.Scan(&wellname, &sid, &iid, &ver, &lstVer); err == nil { if spe_name, ok := spe_user[req.OpUser]; ok { if well_map[wellname] != spe_name { continue } } if _, ok := m[sid+iid]; !ok { m[sid+iid] = true } else { continue } row := sheet.AddRow() cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = wellname cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = sid cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = iid cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = ver cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = lstVer } } rows.Close() } filename = fmt.Sprintf(`%v.xlsx`, beginTime) err = file.Save("./authfile/" + filename) if err != nil { logs.Error("xlsx save err:", err.Error()) } resp.FileId = filename jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { logs.Error("getSeriesWarningCsv err:", err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getSeriesWarningCsv recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getAuthHisPos(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getAuthHisPos recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req getAuthHisPosReq json.Unmarshal(reqdata, &req) ifLogin := checkIsAuthUserOnline(req.OpUser, req.OpUserUuid) if !ifLogin { return } var data getAuthHisPosResp var whereSql string var ifWhere bool if req.SID != "" { likeid := "%" + req.SID + "%" whereSql += fmt.Sprintf(` [series] like '%s'`, likeid) ifWhere = true } if req.IID != "" { likeid := "%" + req.IID + "%" if ifWhere { whereSql += fmt.Sprintf(` and [instrument_id] like '%s'`, likeid) } else { whereSql += fmt.Sprintf(` [instrument_id] like '%s'`, likeid) } ifWhere = true } cntSql := fmt.Sprintf(`SELECT count([ID]) FROM [analysis_result_authorize]`) if ifWhere { cntSql += " where" + whereSql } rcnt, _ := getRecordCount(sqlConn, cntSql) query_cnt := req.Index * req.Count var cnt int if query_cnt > rcnt { cnt = rcnt + req.Count - query_cnt } else { cnt = req.Count } var selSql string if ifWhere { selSql = fmt.Sprintf(`SELECT top %d [ID],[series],[instrument_id],[auth_date],[expire_date],[longitude],[latitude],[auth_mark],[authorizer],[report_longitude],[report_latitude],[wellname],[x],[y] FROM [analysis_result_authorize] where ID not in (select top %d [ID] from analysis_result_authorize where %s order by auth_date desc) and %s order by auth_date desc`, cnt, (req.Index-1)*req.Count, whereSql, whereSql) } else { selSql = fmt.Sprintf(`SELECT top %d [ID],[series],[instrument_id],[auth_date],[expire_date],[longitude],[latitude],[auth_mark],[authorizer],[report_longitude],[report_latitude],[wellname],[x],[y] FROM [analysis_result_authorize] where ID not in (select top %d [ID] from analysis_result_authorize order by auth_date desc) order by auth_date desc`, cnt, (req.Index-1)*req.Count) } fmt.Println(selSql) rows, err := sqlConn.Query(selSql) if err != nil { logs.Error("getAuthorizePosCsv query err:", err.Error()) return } for rows.Next() { var d getAuthHisPosRespD var id int var ReportLongitude float64 var ReportLatitude float64 var x float64 var y float64 if err = rows.Scan(&id, &d.Series, &d.InstrumentID, &d.Auth_date, &d.Expire_date, &d.Longitude, &d.Latitude, &d.Auth_Mark, &d.Authorizer, &d.ReportLongitude, &d.ReportLatitude, &d.WellName, &d.ReportLongitudeX, &d.ReportLatitudeY); err == nil { ReportLongitude, _ = strconv.ParseFloat(d.ReportLongitude, 64) rlong, _ := decimal.NewFromFloat(ReportLongitude).Round(2).Float64() d.ReportLongitude = fmt.Sprintf("%.02f", rlong) ReportLatitude, _ = strconv.ParseFloat(d.ReportLatitude, 64) rla, _ := decimal.NewFromFloat(ReportLatitude).Round(2).Float64() d.ReportLatitude = fmt.Sprintf("%.02f", rla) x, _ = strconv.ParseFloat(d.ReportLongitudeX, 64) tx, _ := decimal.NewFromFloat(x).Round(2).Float64() d.ReportLongitudeX = fmt.Sprintf("%.02f", tx) y, _ = strconv.ParseFloat(d.ReportLatitudeY, 64) ty, _ := decimal.NewFromFloat(y).Round(2).Float64() d.ReportLatitudeY = fmt.Sprintf("%.02f", ty) data.Data = append(data.Data, d) } else { logs.Error("getAuthHisPos scan err:", err.Error()) } } rows.Close() data.Total = rcnt jresp, _ := json.Marshal(data) _, err = response.Write(jresp) if err != nil { logs.Error("getAuthHisPos err:", err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getAuthHisPos recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getAuthorizePosCsv(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getAuthorizePosCsv recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req getAuthorizePosCsvReq json.Unmarshal(reqdata, &req) var data []GetAuthPosData var whereSql string var ifWhere bool if req.SID != "" { likeid := "%" + req.SID + "%" whereSql += fmt.Sprintf(` [series] like '%s'`, likeid) ifWhere = true } if req.IID != "" { likeid := "%" + req.IID + "%" if ifWhere { whereSql += fmt.Sprintf(` and [instrument_id] like '%s'`, likeid) } else { whereSql += fmt.Sprintf(` [instrument_id] like '%s'`, likeid) } ifWhere = true } selSql := `SELECT [series],[instrument_id],[auth_date],[expire_date],[longitude],[latitude],[auth_mark],[authorizer],[report_longitude],[report_latitude],[wellname],[x],[y] FROM [analysis_result_authorize]` if ifWhere { selSql += " where " + whereSql } selSql += " order by ID desc" rows, err := sqlConn.Query(selSql) if err != nil { logs.Error("getAuthorizePosCsv query err:", err.Error()) return } for rows.Next() { var d GetAuthPosData var ReportLongitude float64 var ReportLatitude float64 var x float64 var y float64 if err = rows.Scan(&d.Series, &d.InstrumentID, &d.Auth_date, &d.Expire_date, &d.Longitude, &d.Latitude, &d.Auth_Mark, &d.Authorizer, &d.ReportLongitude, &d.ReportLatitude, &d.WellName, &d.ReportLongitudeX, &d.ReportLatitudeY); err == nil { ReportLongitude, _ = strconv.ParseFloat(d.ReportLongitude, 64) rlong, _ := decimal.NewFromFloat(ReportLongitude).Round(2).Float64() d.ReportLongitude = fmt.Sprintf("%.02f", rlong) ReportLatitude, _ = strconv.ParseFloat(d.ReportLatitude, 64) rla, _ := decimal.NewFromFloat(ReportLatitude).Round(2).Float64() d.ReportLatitude = fmt.Sprintf("%.02f", rla) x, _ = strconv.ParseFloat(d.ReportLongitudeX, 64) tx, _ := decimal.NewFromFloat(x).Round(2).Float64() d.ReportLongitudeX = fmt.Sprintf("%.02f", tx) y, _ = strconv.ParseFloat(d.ReportLatitudeY, 64) ty, _ := decimal.NewFromFloat(y).Round(2).Float64() d.ReportLatitudeY = fmt.Sprintf("%.02f", ty) data = append(data, d) } else { logs.Error("getAuthorizePosCsv scan err:", err.Error()) } } rows.Close() file := xlsx.NewFile() sheet, err := file.AddSheet("sheet1") if err != nil { logs.Error("file add sheet err:", err.Error()) } style := xlsx.NewStyle() font := *xlsx.NewFont(11, "宋体") style.Font = font alignment := xlsx.Alignment{ Horizontal: "center", Vertical: "center", } style.Alignment = alignment style.ApplyAlignment = true row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = "仪器系列号" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "仪器编码" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "授权时间" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "到期时间" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "授权经度" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "授权纬度" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "使用经度" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "使用纬度" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "井名" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "大地坐标X" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "大地坐标X" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "工作字" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "授权人" for i := 0; i < len(data); i++ { v := data[i] row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = v.Series cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.InstrumentID cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Auth_date cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Expire_date cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Longitude cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Latitude cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.ReportLongitude cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.ReportLatitude cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.WellName cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.ReportLongitudeX cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.ReportLatitudeY cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Auth_Mark cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Authorizer } filename := fmt.Sprintf(`%v.xlsx`, beginTime) err = file.Save("./authfile/" + filename) if err != nil { logs.Error("xlsx save err:", err.Error()) } var resp GetAuthPosCsvResp resp.FileId = filename jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { logs.Error("getFaultRateCsv err:", err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getFaultRateCsv recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getWellDBName(wellname string) (dbname string, err error) { var row *sql.Rows sqlstr := fmt.Sprintf("select [WELLName] from [WellInformation] where [WELLNameSource]='%s'", wellname) row, err = sqlConn.Query(sqlstr) if err != nil { logs.Info("getWellDBName Query Error", err.Error()) return } for row.Next() { if err := row.Scan(&dbname); err == nil { } else { logs.Info("getWellDBName scan Error", err.Error()) } } row.Close() return } func getWellWorkingCondition(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getWellWorkingCondition recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req getWellWorkingConditionReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) selSql := fmt.Sprintf(`SELECT [data] FROM [analysis_result_engineerin_service] where [wellname]='%s'`, req.WellName) row, err := sqlConn.Query(selSql) if err != nil { fmt.Println("Query Error", err) logs.Error("getWellWorkingCondition err:", err.Error()) return } var data EngineeringServices for row.Next() { var s string if err := row.Scan(&s); err == nil { json.Unmarshal([]byte(s), &data) designDepth, _ := strconv.ParseFloat(data.DesignDepth, 64) designDepth, _ = decimal.NewFromFloat(designDepth).Round(2).Float64() data.DesignDepth = strconv.FormatFloat(designDepth, 'f', 2, 64) wellDeviation, _ := strconv.ParseFloat(data.WellDeviation, 64) wellDeviation, _ = decimal.NewFromFloat(wellDeviation).Round(2).Float64() data.WellDeviation = strconv.FormatFloat(wellDeviation, 'f', 2, 64) designOrientation, _ := strconv.ParseFloat(data.DesignOrientation, 64) designOrientation, _ = decimal.NewFromFloat(designOrientation).Round(2).Float64() data.DesignOrientation = strconv.FormatFloat(designOrientation, 'f', 2, 64) length_of_horizontal_section, _ := strconv.ParseFloat(data.Length_of_horizontal_section, 64) length_of_horizontal_section, _ = decimal.NewFromFloat(length_of_horizontal_section).Round(2).Float64() data.Length_of_horizontal_section = strconv.FormatFloat(length_of_horizontal_section, 'f', 2, 64) rate, _ := strconv.ParseFloat(data.Rate, 64) rate, _ = decimal.NewFromFloat(rate).Round(2).Float64() data.Rate = strconv.FormatFloat(rate, 'f', 2, 64) instrument_angle_difference, _ := strconv.ParseFloat(data.Instrument_angle_difference, 64) instrument_angle_difference, _ = decimal.NewFromFloat(instrument_angle_difference).Round(2).Float64() data.Instrument_angle_difference = strconv.FormatFloat(instrument_angle_difference, 'f', 2, 64) angle_difference_of_drilling_tool, _ := strconv.ParseFloat(data.Angle_difference_of_drilling_tool, 64) angle_difference_of_drilling_tool, _ = decimal.NewFromFloat(angle_difference_of_drilling_tool).Round(2).Float64() data.Angle_difference_of_drilling_tool = strconv.FormatFloat(angle_difference_of_drilling_tool, 'f', 2, 64) maxPressure, _ := decimal.NewFromFloat(float64(data.MaxPressure)).Round(2).Float64() if ps_info.R1 == "2" { maxPressure, _ = decimal.NewFromFloat(float64(145.038 * maxPressure)).Round(2).Float64() } data.MaxPressure = float32(maxPressure) maxTemp, _ := decimal.NewFromFloat(float64(data.MaxTemp)).Round(2).Float64() if ps_info.R2 == "2" { maxTemp, _ = decimal.NewFromFloat(float64(1.8*maxTemp + 32)).Round(2).Float64() } data.MaxTemp = float32(maxTemp) } else { logs.Error("getWellWorkingCondition err:", err.Error()) } } row.Close() var resp wellWorkingCondition resp.Es = data dbname, err := getWellDBName(req.WellName) if err == nil { conn, err := getOdbcConn(dbname) if err == nil { selsql := "SELECT top 1 [1006],[1007],[1008],[1009] FROM [WELLBASETABLE] where [1006] is not null order by ID desc" llrows, err := conn.Query(selsql) if err != nil { logs.Error(err.Error()) conn.Close() goto exit } for llrows.Next() { var ll, la, x, y string if err = llrows.Scan(&y, &x, &ll, &la); err != nil { logs.Error(err.Error()) } else { //fmt.Println(ll) resp.ReportLatitude = la //resp.ReportLatitudeY = y resp.ReportLongitude = ll //resp.ReportLongitudeX = x } } llrows.Close() selsql = "SELECT top 1 [6756],[6757] FROM [ENGINEERSERVICES] where [6756] is not null order by ID desc" xyrows, err := conn.Query(selsql) if err != nil { logs.Error(err.Error()) conn.Close() goto exit } for xyrows.Next() { var x, y string if err = xyrows.Scan(&x, &y); err != nil { logs.Error(err.Error()) } else { resp.ReportLatitudeY = y resp.ReportLongitudeX = x } } xyrows.Close() conn.Close() } } exit: resp.Es.Wellname = req.WellName jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getWellWorkingCondition recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMsSettingByUser(user string) (resp getMsSettingResp) { selSql := fmt.Sprintf(`SELECT [ID],[old_series_num],[new_series_num] FROM [user_ms_setting] where [user]='%s'`, user) fmt.Println(selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getMsSettingByUser query err:", err.Error()) } else { for row.Next() { var v msSetting if err := row.Scan(&v.ID, &v.Series_num, &v.Series_num_new); err != nil { logs.Error("getMsSettingByUser scan err:", err.Error()) } else { resp.Data = append(resp.Data, v) } } row.Close() } return } func postMsSetting(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("postMsSetting recv req begin", time.Now().Format("2006-01-02 15:04:05")) var err error var resp postMsSettingResp var req postMsSettingReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) var execSql string if req.Oper_type == 1 { execSql = fmt.Sprintf(`INSERT INTO [user_ms_setting]([user],[old_series_num],[new_series_num]) VALUES ('%s','%s','%s')`, req.User, req.Series_num, req.Series_num_new) } else if req.Oper_type == 2 { execSql = fmt.Sprintf(`UPDATE [user_ms_setting] SET [old_series_num] = '%s',[new_series_num] = '%s' WHERE [ID] = %v`, req.Series_num, req.Series_num_new, req.ID) } else if req.Oper_type == 3 { execSql = fmt.Sprintf(`delete from user_ms_setting where ID=%v`, req.ID) } else { goto exit } _, err = sqlConn.Exec(execSql) if err != nil { resp.Ret = -1 logs.Error("postMsSetting err:", err.Error()) } exit: jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("postMsSetting recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMsSetting(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMsSetting recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req getMsSettingReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) var resp getMsSettingResp resp = getMsSettingByUser(req.User) jdata, _ := json.Marshal(resp) fmt.Println(string(jdata)) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMsSetting recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMsSeriesMapNewSeries(data []msSetting) map[string]string { m := make(map[string]string) for i := 0; i < len(data); i++ { v := data[i] oldSeries := strings.Split(v.Series_num, ",") for j := 0; j < len(oldSeries); j++ { m[oldSeries[j]] = v.Series_num_new } } return m } func getSeriesMapNewSeries(mhSetting getMhSettingResp) map[string]string { m := make(map[string]string) if mhSetting.Series_num != "" && mhSetting.Series_num_new != "" { series_arr := strings.Split(mhSetting.Series_num, ";") series_new_arr := strings.Split(mhSetting.Series_num_new, ";") fmt.Println("series_arr:", series_arr) fmt.Println("series_new_arr:", series_new_arr) for i := 0; i < len(series_arr); i++ { v := series_arr[i] oldSeries := strings.Split(v, ",") for j := 0; j < len(oldSeries); j++ { m[oldSeries[j]] = series_new_arr[i] } } } return m } func getFrSettingByUser(user string) (resp getMsSettingResp) { selSql := fmt.Sprintf(`SELECT [ID],[old_series_num],[new_series_num] FROM [user_fr_setting] where [user]='%s'`, user) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getFrSettingByUser query err:", err.Error()) } else { for row.Next() { var v msSetting if err := row.Scan(&v.ID, &v.Series_num, &v.Series_num_new); err != nil { logs.Error("getFrSettingByUser scan err:", err.Error()) } else { resp.Data = append(resp.Data, v) } } row.Close() } return } func GetFrSetting(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("GetFrSetting recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req getMhSettingReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) var resp getMsSettingResp resp = getFrSettingByUser(req.User) jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("GetFrSetting recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func postFrSetting(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("UpdateFrSetting recv req begin", time.Now().Format("2006-01-02 15:04:05")) var err error var resp postMsSettingResp var req postMsSettingReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) var execSql string if req.Oper_type == 1 { execSql = fmt.Sprintf(`INSERT INTO [user_fr_setting]([user],[old_series_num],[new_series_num]) VALUES ('%s','%s','%s')`, req.User, req.Series_num, req.Series_num_new) } else if req.Oper_type == 2 { execSql = fmt.Sprintf(`UPDATE [user_fr_setting] SET [old_series_num] = '%s',[new_series_num] = '%s' WHERE [ID] = %v`, req.Series_num, req.Series_num_new, req.ID) } else if req.Oper_type == 3 { execSql = fmt.Sprintf(`delete from user_fr_setting where [ID]=%v`, req.ID) } else { goto exit } _, err = sqlConn.Exec(execSql) if err != nil { resp.Ret = -1 logs.Error("UpdateFrSetting err:", err.Error()) } exit: jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("UpdateFrSetting recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMhSettingByUser(user string) (resp getMhSettingResp) { selSql := fmt.Sprintf(`SELECT [old_series_num],[new_series_num] FROM [user_mh_setting] where [user]='%s'`, user) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getMhSettingByUser query err:", err.Error()) } else { for row.Next() { if err := row.Scan(&resp.Series_num, &resp.Series_num_new); err != nil { logs.Error("getMhSettingByUser scan err:", err.Error()) } } row.Close() } return } func GetMhSetting(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("GetMhSetting recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req getMhSettingReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) var resp getMhSettingResp resp = getMhSettingByUser(req.User) jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("GetMhSetting recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func UpdateMhSetting(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("UpdateMhSetting recv req begin", time.Now().Format("2006-01-02 15:04:05")) var resp updateMhSettingResp var req updateMhSettingReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) series_arr := strings.Split(req.Series_num, ";") series_new_arr := strings.Split(req.Series_num_new, ";") if len(series_arr) != len(series_new_arr) { resp.Ret = 1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } addSql := fmt.Sprintf(`INSERT INTO [user_mh_setting]([user],[old_series_num],[new_series_num]) VALUES ('%s','%s','%s')`, req.User, req.Series_num, req.Series_num_new) updateSql := fmt.Sprintf(`UPDATE [user_mh_setting] SET [old_series_num] = '%s',[new_series_num] = '%s' WHERE [user] = '%s'`, req.Series_num, req.Series_num_new, req.User) _, err := sqlConn.Exec(addSql) if err != nil { _, err = sqlConn.Exec(updateSql) if err != nil { resp.Ret = -1 logs.Error("UpdateMhSetting err:", err.Error()) } } jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("UpdateMhSetting recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMtAnalysisCsv_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMtAnalysisCsv_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req get_page_setting_req reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) /* filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { logs.Error("getMtAnalysisCsv err:", err.Error()) return } defer f.Close()*/ var data []mt //data = append(data, []string{"仪器系列号", "仪器编码", "当前累计工作时间", "故障次数", "上传时间", "出厂累计工作时间"}) sqlstr := `SELECT [series_num],[instrument_id],[work_time],[repair_cnt],[save_time],[total_worktime] FROM [mt_analysis_result] where [if_available] !=1 order by [series_num] asc` //sqlstr := `SELECT [series_num],[instrument_id],[work_time],[repair_cnt],[save_time],[total_worktime] FROM [mt_analysis_result] order by [series_num] asc` rdRow, err := sqlConn.Query(sqlstr) if err != nil { logs.Error("getMtAnalysisCsv_en query err:", err.Error()) return } for rdRow.Next() { var v mt if err = rdRow.Scan(&v.Series, &v.Instrument_id, &v.WorkTime, &v.RepairCnt, &v.SaveTime, &v.TotalWorkTime); err == nil { //fmt.Println(v) v.SaveTime = do_time_by_ps(v.SaveTime, ps_info) data = append(data, v) } else { logs.Error("getMtAnalysisCsv_en scan err:", err.Error()) } } rdRow.Close() file := xlsx.NewFile() sheet, err := file.AddSheet("sheet1") if err != nil { logs.Error("file add sheet err:", err.Error()) } style := xlsx.NewStyle() font := *xlsx.NewFont(11, "宋体") style.Font = font row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = "Instrument Series No." cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Instrument Serial No." cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Current accumulated working time" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Maintenance Times" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Upload time" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Accumulated working time before delivery" for i := 0; i < len(data); i++ { v := data[i] row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = v.Series cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Instrument_id cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.WorkTime cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.RepairCnt cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.SaveTime cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.TotalWorkTime } filename := fmt.Sprintf(`%v.xlsx`, beginTime) err = file.Save("./authfile/" + filename) if err != nil { logs.Error("xlsx save err:", err.Error()) } /* f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码 w := csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush()*/ var resp MhExportResp resp.FileId = filename jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { fmt.Println(err.Error()) logs.Error("getMtAnalysisCsv_en err:", err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMtAnalysisCsv_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMtAnalysisCsv(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMtAnalysisCsv recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req get_page_setting_req reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) /* filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { logs.Error("getMtAnalysisCsv err:", err.Error()) return } defer f.Close()*/ var data []mt //data = append(data, []string{"仪器系列号", "仪器编码", "当前累计工作时间", "故障次数", "上传时间", "出厂累计工作时间"}) sqlstr := `SELECT [series_num],[instrument_id],[work_time],[repair_cnt],[save_time],[total_worktime] FROM [mt_analysis_result] where [if_available] !=1 order by [series_num] asc` //sqlstr := `SELECT [series_num],[instrument_id],[work_time],[repair_cnt],[save_time],[total_worktime] FROM [mt_analysis_result] order by [series_num] asc` rdRow, err := sqlConn.Query(sqlstr) if err != nil { logs.Error("getMtAnalysisCsv query err:", err.Error()) return } for rdRow.Next() { var v mt if err = rdRow.Scan(&v.Series, &v.Instrument_id, &v.WorkTime, &v.RepairCnt, &v.SaveTime, &v.TotalWorkTime); err == nil { //fmt.Println(v) v.SaveTime = do_time_by_ps(v.SaveTime, ps_info) data = append(data, v) } else { logs.Error("getMtAnalysisCsv scan err:", err.Error()) } } rdRow.Close() file := xlsx.NewFile() sheet, err := file.AddSheet("sheet1") if err != nil { logs.Error("file add sheet err:", err.Error()) } style := xlsx.NewStyle() font := *xlsx.NewFont(11, "宋体") style.Font = font row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = "仪器系列号" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "仪器编码" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "当前累计工作时间" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "故障次数" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "上传时间" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "出厂累计工作时间" for i := 0; i < len(data); i++ { v := data[i] row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = v.Series cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Instrument_id cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.WorkTime cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.RepairCnt cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.SaveTime cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.TotalWorkTime } filename := fmt.Sprintf(`%v.xlsx`, beginTime) err = file.Save("./authfile/" + filename) if err != nil { logs.Error("xlsx save err:", err.Error()) } /* f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码 w := csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush()*/ var resp MhExportResp resp.FileId = filename jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { fmt.Println(err.Error()) logs.Error("getMtAnalysisCsv err:", err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMtAnalysisCsv recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func exportTestType_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("exportTestType_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req exportWellTestTypeReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp getWellTestTypeResp selSql := `SELECT [well_name],[well_type],[well_create_time] FROM [well_type_t]` var whereSql string = " where [if_available] !=1" if req.Wellname != "" { likeid := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` and well_name like '%s'`, likeid) } if req.Type != 0 { whereSql += fmt.Sprintf(` and well_type&%d !=0`, req.Type) } if req.BeginTime != "" && req.EndTime != "" { whereSql += fmt.Sprintf(` and [well_create_time]>'%s' and [well_create_time]<'%s'`, req.BeginTime, req.EndTime) } if spe_name, ok := spe_user[req.OpUser]; ok { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } whereSql += ` order by [well_create_time] desc` selSql += whereSql fmt.Println(selSql) rows, err := sqlConn.Query(selSql) if err != nil { return } for rows.Next() { var d wellTestType if err = rows.Scan(&d.Wellname, &d.Type, &d.WellCreateTime); err == nil { n, _ := strconv.Atoi(d.Type) var t string if n&(1<<0) != 0 { t = "Inclination" } if n&(1<<1) != 0 { if t != "" { t += "," + "Near-bit" } else { t = "Near-bit" } } if n&(1<<2) != 0 { if t != "" { t += "," + "LWD" } else { t = "LWD" } } if n&(1<<3) != 0 { if t != "" { t += "," + "Probe-based Azimuth Gamma" } else { t = "Probe-based Azimuth Gamma" } } if n&(1<<4) != 0 { if t != "" { t += "," + "Collar-based Azimuth Gamma" } else { t = "Collar-based Azimuth Gamma" } } if n&(1<<5) != 0 { if t != "" { t += "," + "Natural Gamma" } else { t = "Natural Gamma" } } if n&(1<<6) != 0 { if t != "" { t += "," + "DDM" } else { t = "DDM" } } d.Type = t d.WellCreateTime = do_time_by_ps(d.WellCreateTime, ps_info) resp.Data = append(resp.Data, d) } } rows.Close() file := xlsx.NewFile() sheet, err := file.AddSheet("sheet1") if err != nil { logs.Error("file add sheet err:", err.Error()) } style := xlsx.NewStyle() font := *xlsx.NewFont(11, "宋体") style.Font = font row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = "Well Name" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Type" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "Upload Time" for i := 0; i < len(resp.Data); i++ { v := resp.Data[i] row := sheet.AddRow() cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = v.Wellname cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Type cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.WellCreateTime } filename := fmt.Sprintf(`%v.xlsx`, beginTime) err = file.Save("./authfile/" + filename) if err != nil { logs.Error("exportTestType_en xlsx save err:", err.Error()) } var res MhExportResp res.FileId = filename jdata, _ := json.Marshal(res) fmt.Println(string(jdata)) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("exportTestType_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func exportTestType(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("exportTestType recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req exportWellTestTypeReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp getWellTestTypeResp selSql := `SELECT [well_name],[well_type],[well_create_time] FROM [well_type_t]` var whereSql string = " where [if_available] !=1" if req.Wellname != "" { likeid := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` and well_name like '%s'`, likeid) } if req.Type != 0 { whereSql += fmt.Sprintf(` and well_type&%d !=0`, req.Type) } if req.BeginTime != "" && req.EndTime != "" { whereSql += fmt.Sprintf(` and [well_create_time]>'%s' and [well_create_time]<'%s'`, req.BeginTime, req.EndTime) } if spe_name, ok := spe_user[req.OpUser]; ok { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } whereSql += ` order by [well_create_time] desc` selSql += whereSql fmt.Println(selSql) rows, err := sqlConn.Query(selSql) if err != nil { return } for rows.Next() { var d wellTestType if err = rows.Scan(&d.Wellname, &d.Type, &d.WellCreateTime); err == nil { n, _ := strconv.Atoi(d.Type) var t string if n&(1<<0) != 0 { t = "测斜" } if n&(1<<1) != 0 { if t != "" { t += "," + "近钻头" } else { t = "近钻头" } } if n&(1<<2) != 0 { if t != "" { t += "," + "电阻率" } else { t = "电阻率" } } if n&(1<<3) != 0 { if t != "" { t += "," + "探管式方位伽马" } else { t = "探管式方位伽马" } } if n&(1<<4) != 0 { if t != "" { t += "," + "钻铤式方位伽马" } else { t = "钻铤式方位伽马" } } if n&(1<<5) != 0 { if t != "" { t += "," + "自然伽马" } else { t = "自然伽马" } } if n&(1<<6) != 0 { if t != "" { t += "," + "工程参数" } else { t = "工程参数" } } d.Type = t d.WellCreateTime = do_time_by_ps(d.WellCreateTime, ps_info) resp.Data = append(resp.Data, d) } } rows.Close() file := xlsx.NewFile() sheet, err := file.AddSheet("sheet1") if err != nil { logs.Error("file add sheet err:", err.Error()) } style := xlsx.NewStyle() font := *xlsx.NewFont(11, "宋体") style.Font = font row := sheet.AddRow() //row.SetHeightCM(1) //设置每行的高度 cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = "井名称" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "井测试类型" cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = "井创建时间" for i := 0; i < len(resp.Data); i++ { v := resp.Data[i] row := sheet.AddRow() cell1 := row.AddCell() cell1.SetStyle(style) cell1.Value = v.Wellname cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.Type cell1 = row.AddCell() cell1.SetStyle(style) cell1.Value = v.WellCreateTime } filename := fmt.Sprintf(`%v.xlsx`, beginTime) err = file.Save("./authfile/" + filename) if err != nil { logs.Error("exportTestType xlsx save err:", err.Error()) } var res MhExportResp res.FileId = filename jdata, _ := json.Marshal(res) fmt.Println(string(jdata)) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("exportTestType recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getWellTestType_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getWellTestType_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req getWellTestTypeReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp getWellTestTypeResp var cnt int beginIndex := req.Count * (req.Index - 1) endIndex := req.Count*req.Index + 1 selSql := `SELECT [well_name],[well_type],[well_create_time] FROM [well_type_t]` var whereSql string = " where [if_available] !=1" if req.Wellname != "" { likeid := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` and well_name like '%s'`, likeid) } if req.Type != 0 { whereSql += fmt.Sprintf(` and well_type&%d !=0`, req.Type) } if req.BeginTime != "" && req.EndTime != "" { whereSql += fmt.Sprintf(` and [well_create_time]>'%s' and [well_create_time]<'%s'`, req.BeginTime, req.EndTime) } if spe_name, ok := spe_user[req.OpUser]; ok { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } whereSql += ` order by [well_create_time] desc` selSql += whereSql fmt.Println(selSql) rows, err := sqlConn.Query(selSql) if err != nil { goto exit } for rows.Next() { var d wellTestType if err = rows.Scan(&d.Wellname, &d.Type, &d.WellCreateTime); err == nil { cnt++ if cnt > beginIndex && cnt < endIndex { n, _ := strconv.Atoi(d.Type) var t string if n&(1<<0) != 0 { t = "Inclination" } if n&(1<<1) != 0 { if t != "" { t += "," + "Near-bit" } else { t = "Near-bit" } } if n&(1<<2) != 0 { if t != "" { t += "," + "LWD" } else { t = "LWD" } } if n&(1<<3) != 0 { if t != "" { t += "," + "Probe-based Azimuth Gamma" } else { t = "Probe-based Azimuth Gamma" } } if n&(1<<4) != 0 { if t != "" { t += "," + "Collar-based Azimuth Gamma" } else { t = "Collar-based Azimuth Gamma" } } if n&(1<<5) != 0 { if t != "" { t += "," + "Natural Gamma" } else { t = "Natural Gamma" } } if n&(1<<6) != 0 { if t != "" { t += "," + "DDM" } else { t = "DDM" } } if n&(1<<7) != 0 { if t != "" { t += "," + "VSS" } else { t = "VSS" } } d.Type = t d.WellCreateTime = do_time_by_ps(d.WellCreateTime, ps_info) resp.Data = append(resp.Data, d) } } } rows.Close() resp.Total = cnt exit: jdata, _ := json.Marshal(resp) fmt.Println(string(jdata)) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getWellTestType_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getWellTestType(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getWellTestType recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req getWellTestTypeReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp getWellTestTypeResp var cnt int beginIndex := req.Count * (req.Index - 1) endIndex := req.Count*req.Index + 1 selSql := `SELECT [well_name],[well_type],[well_create_time] FROM [well_type_t]` var whereSql string = " where [if_available] !=1" if req.Wellname != "" { likeid := "%" + req.Wellname + "%" whereSql += fmt.Sprintf(` and well_name like '%s'`, likeid) } if req.Type != 0 { whereSql += fmt.Sprintf(` and well_type&%d !=0`, req.Type) } if req.BeginTime != "" && req.EndTime != "" { whereSql += fmt.Sprintf(` and [well_create_time]>'%s' and [well_create_time]<'%s'`, req.BeginTime, req.EndTime) } if spe_name, ok := spe_user[req.OpUser]; ok { whereSql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } whereSql += ` order by [well_create_time] desc` selSql += whereSql fmt.Println(selSql) rows, err := sqlConn.Query(selSql) if err != nil { goto exit } for rows.Next() { var d wellTestType if err = rows.Scan(&d.Wellname, &d.Type, &d.WellCreateTime); err == nil { cnt++ if cnt > beginIndex && cnt < endIndex { n, _ := strconv.Atoi(d.Type) var t string if n&(1<<0) != 0 { t = "测斜" } if n&(1<<1) != 0 { if t != "" { t += "," + "近钻头" } else { t = "近钻头" } } if n&(1<<2) != 0 { if t != "" { t += "," + "电阻率" } else { t = "电阻率" } } if n&(1<<3) != 0 { if t != "" { t += "," + "探管式方位伽马" } else { t = "探管式方位伽马" } } if n&(1<<4) != 0 { if t != "" { t += "," + "钻铤式方位伽马" } else { t = "钻铤式方位伽马" } } if n&(1<<5) != 0 { if t != "" { t += "," + "自然伽马" } else { t = "自然伽马" } } if n&(1<<6) != 0 { if t != "" { t += "," + "工程参数" } else { t = "工程参数" } } if n&(1<<7) != 0 { if t != "" { t += "," + "振动粘滑" } else { t = "振动粘滑" } } d.Type = t d.WellCreateTime = do_time_by_ps(d.WellCreateTime, ps_info) resp.Data = append(resp.Data, d) } } } rows.Close() resp.Total = cnt exit: jdata, _ := json.Marshal(resp) fmt.Println(string(jdata)) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getWellTestType recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getFaultRateCsv_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getFaultRateCsv_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req faultRateExportReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) frSetting := getFrSettingByUser(req.Op_user) m := getMsSeriesMapNewSeries(frSetting.Data) var t_arr []faultRate mIndex := make(map[string]int) //series new nama index filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { fmt.Println(err) return } defer f.Close() var data [][]string data = append(data, []string{"Instrument Series No.", "Maintenance Times", "Total foot(10,000m)", "Failure Rate(maintenance frequency/10,000m)"}) selSql := `SELECT [series_num],[fault_cnt],[depth],[fault_rate] FROM [fault_rate_analysis_result] order by [series_num]` row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getFaultRateCsv query err:", err.Error()) goto exit } for row.Next() { var d faultRate if err = row.Scan(&d.Series, &d.RepairCnt, &d.TotalFootage, &d.Rate); err == nil { var ifdo bool = true if req.Series != "" { ifdo = strings.Contains(d.Series, req.Series) } if !ifdo { continue } if series_new_name, ok := m[d.Series]; ok { if index, ok := mIndex[series_new_name]; ok { t_arr[index].RepairCnt += d.RepairCnt //prevTotalDep, _ := strconv.ParseFloat(t_arr[index].TotalFootage, 64) curDep, _ := strconv.ParseFloat(d.TotalFootage, 64) t_arr[index].tfootage += curDep /*t_arr[index].TotalFootage = fmt.Sprintf("%.4f", prevTotalDep/float64(10000)) //strconv.FormatFloat(prevTotalDep/float64(10000), 'f', -1, 64) if t_arr[index].RepairCnt != 0 { rate := prevTotalDep / float64(t_arr[index].RepairCnt*10000) t_arr[index].Rate = fmt.Sprintf("%.4f", rate) } else { t_arr[index].Rate = t_arr[index].TotalFootage }*/ } else { d.Series = series_new_name prevTotalDep, _ := strconv.ParseFloat(d.TotalFootage, 64) d.tfootage = prevTotalDep t_arr = append(t_arr, d) mIndex[series_new_name] = len(t_arr) - 1 } } else { /*if d.TotalFootage != "0" { prevTotalDep, _ := strconv.ParseFloat(d.TotalFootage, 64) prevTotalDep = prevTotalDep / float64(10000) d.TotalFootage = fmt.Sprintf("%.4f", prevTotalDep) }*/ prevTotalDep, _ := strconv.ParseFloat(d.TotalFootage, 64) d.tfootage = prevTotalDep t_arr = append(t_arr, d) } } else { logs.Error("getFaultRateCsv scan err:", err.Error()) } } row.Close() for i := 0; i < len(t_arr); i++ { v := t_arr[i] if v.tfootage > float64(0) { v.TotalFootage = fmt.Sprintf("%.4f", v.tfootage/float64(10000)) if v.tfootage != 0 { rate := float64(v.RepairCnt*10000) / v.tfootage rate, _ = decimal.NewFromFloat(rate).Round(4).Float64() if rate < float64(0.0001) { v.Rate = "0" } else { v.Rate = fmt.Sprintf("%v", rate) } } else { v.Rate = "0" } } else { v.TotalFootage = "0" v.Rate = "0" } data = append(data, []string{v.Series, strconv.Itoa(v.RepairCnt), v.TotalFootage, v.Rate}) } exit: f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码 w := csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() var resp MhExportResp resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { fmt.Println(err.Error()) logs.Error("getFaultRateCsv err:", err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getFaultRateCsv recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getFaultRateCsv(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getFaultRateCsv recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req faultRateExportReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) frSetting := getFrSettingByUser(req.Op_user) m := getMsSeriesMapNewSeries(frSetting.Data) var t_arr []faultRate mIndex := make(map[string]int) //series new nama index filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { fmt.Println(err) return } defer f.Close() var data [][]string data = append(data, []string{"仪器系列号", "维修次数", "总进尺(万米)", "故障率"}) selSql := `SELECT [series_num],[fault_cnt],[depth],[fault_rate] FROM [fault_rate_analysis_result] order by [series_num]` row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getFaultRateCsv query err:", err.Error()) goto exit } for row.Next() { var d faultRate if err = row.Scan(&d.Series, &d.RepairCnt, &d.TotalFootage, &d.Rate); err == nil { var ifdo bool = true if req.Series != "" { ifdo = strings.Contains(d.Series, req.Series) } if !ifdo { continue } if series_new_name, ok := m[d.Series]; ok { if index, ok := mIndex[series_new_name]; ok { t_arr[index].RepairCnt += d.RepairCnt //prevTotalDep, _ := strconv.ParseFloat(t_arr[index].TotalFootage, 64) curDep, _ := strconv.ParseFloat(d.TotalFootage, 64) t_arr[index].tfootage += curDep /*t_arr[index].TotalFootage = fmt.Sprintf("%.4f", prevTotalDep/float64(10000)) //strconv.FormatFloat(prevTotalDep/float64(10000), 'f', -1, 64) if t_arr[index].RepairCnt != 0 { rate := prevTotalDep / float64(t_arr[index].RepairCnt*10000) t_arr[index].Rate = fmt.Sprintf("%.4f", rate) } else { t_arr[index].Rate = t_arr[index].TotalFootage }*/ } else { d.Series = series_new_name prevTotalDep, _ := strconv.ParseFloat(d.TotalFootage, 64) d.tfootage = prevTotalDep t_arr = append(t_arr, d) mIndex[series_new_name] = len(t_arr) - 1 } } else { /*if d.TotalFootage != "0" { prevTotalDep, _ := strconv.ParseFloat(d.TotalFootage, 64) prevTotalDep = prevTotalDep / float64(10000) d.TotalFootage = fmt.Sprintf("%.4f", prevTotalDep) }*/ prevTotalDep, _ := strconv.ParseFloat(d.TotalFootage, 64) d.tfootage = prevTotalDep t_arr = append(t_arr, d) } } else { logs.Error("getFaultRateCsv scan err:", err.Error()) } } row.Close() for i := 0; i < len(t_arr); i++ { v := t_arr[i] if v.tfootage > float64(0) { v.TotalFootage = fmt.Sprintf("%.4f", v.tfootage/float64(10000)) if v.tfootage != 0 { rate := float64(v.RepairCnt*10000) / v.tfootage rate, _ = decimal.NewFromFloat(rate).Round(4).Float64() if rate < float64(0.0001) { v.Rate = "0" } else { v.Rate = fmt.Sprintf("%v", rate) } } else { v.Rate = "0" } } else { v.TotalFootage = "0" v.Rate = "0" } data = append(data, []string{v.Series, strconv.Itoa(v.RepairCnt), v.TotalFootage, v.Rate}) } exit: f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码 w := csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() var resp MhExportResp resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { fmt.Println(err.Error()) logs.Error("getFaultRateCsv err:", err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getFaultRateCsv recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getFaultRate(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getFaultRate recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req getFaultRateReq json.Unmarshal(reqdata, &req) frSetting := getFrSettingByUser(req.Op_user) m := getMsSeriesMapNewSeries(frSetting.Data) var t_arr []faultRate mIndex := make(map[string]int) //series new nama index var resp getFaultRateResp beginIndex := req.Count * (req.Index - 1) endIndex := req.Count * req.Index var rds []faultRate selSql := `SELECT [series_num],[fault_cnt],[depth],[fault_rate] FROM [fault_rate_analysis_result] order by [series_num]` row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getFaultRate query err:", err.Error()) goto exit } for row.Next() { var v faultRate if err = row.Scan(&v.Series, &v.RepairCnt, &v.TotalFootage, &v.Rate); err == nil { if req.Series != "" { b := strings.Contains(v.Series, req.Series) if !b { continue } } if series_new_name, ok := m[v.Series]; ok { if index, ok := mIndex[series_new_name]; ok { rds[index].RepairCnt += v.RepairCnt //prevTotalDep, _ := strconv.ParseFloat(rds[index].TotalFootage, 64) curDep, _ := strconv.ParseFloat(v.TotalFootage, 64) //prevTotalDep += curDep rds[index].tfootage += curDep /*if prevTotalDep > float64(0) { rds[index].TotalFootage = fmt.Sprintf("%.4f", prevTotalDep/float64(10000)) //strconv.FormatFloat(prevTotalDep/float64(10000), 'f', -1, 64) if rds[index].RepairCnt != 0 { rate := prevTotalDep / float64(rds[index].RepairCnt*10000) //rds[index].Rate = fmt.Sprintf("%.4f", rate) rate, _ = decimal.NewFromFloat(rate).Round(4).Float64() if rate < float64(0.0001) { rds[index].Rate = "0" } else { rds[index].Rate = fmt.Sprintf("%v", rate) } } } else { rds[index].Rate = "0" }*/ } else { v.Series = series_new_name prevTotalDep, _ := strconv.ParseFloat(v.TotalFootage, 64) v.tfootage = prevTotalDep rds = append(rds, v) mIndex[series_new_name] = len(rds) - 1 } } else { /*if v.TotalFootage != "0" { prevTotalDep, _ := strconv.ParseFloat(v.TotalFootage, 64) prevTotalDep = prevTotalDep / float64(10000) v.TotalFootage = fmt.Sprintf("%.4f", prevTotalDep) }*/ prevTotalDep, _ := strconv.ParseFloat(v.TotalFootage, 64) v.tfootage = prevTotalDep rds = append(rds, v) } } else { logs.Error("getFaultRate scan err:", err.Error()) } } row.Close() for i := 0; i < len(rds); i++ { d := rds[i] if d.tfootage > float64(0) { d.TotalFootage = fmt.Sprintf("%.4f", d.tfootage/float64(10000)) if d.tfootage != 0 { rate := float64(d.RepairCnt*10000) / d.tfootage rate, _ = decimal.NewFromFloat(rate).Round(1).Float64() if rate < float64(0.1) { d.Rate = "0" } else { d.Rate = fmt.Sprintf("%v", rate) } } else { d.Rate = "0" } } else { d.Rate = "0" d.TotalFootage = "0" } t_arr = append(t_arr, d) } for i := beginIndex; i < endIndex; i++ { fmt.Println(i) if i >= len(t_arr) { break } resp.Data = append(resp.Data, t_arr[i]) } resp.Total = len(t_arr) exit: jdata, _ := json.Marshal(resp) fmt.Println(string(jdata)) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getFaultRate recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getTsDetails_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getTsDetails_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetTsReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp GetTsResp var likeid string if req.WellName != "" { likeid = "wellname = '" + req.WellName + "'" } if req.Series != "" { if likeid == "" { likeid = "series_num like '%" + req.Series + "%'" } else { likeid += " and series_num like '%" + req.Series + "%'" } } if req.Instrument_id != "" { if likeid == "" { likeid = "Instrument_id like '%" + req.Instrument_id + "%'" } else { likeid += " and Instrument_id like '%" + req.Instrument_id + "%'" } } var selSql string var selCntSql string if likeid == "" { selCntSql = fmt.Sprintf(`select count(ID) from temp_analysis_result where [if_available] !=1`) selSql = fmt.Sprintf("select top %v [ID],[wellname],[series_num],[instrument_id],[temp_section],[work_time],[bt] from temp_analysis_result where ID not in (select top %v ID from temp_analysis_result where [if_available] !=1 order by [ID] asc) and [if_available] !=1 order by [ID] asc", req.Count, (req.Index-1)*req.Count) } else { selCntSql = fmt.Sprintf(`select count(ID) from temp_analysis_result where %s and [if_available] !=1`, likeid) selSql = fmt.Sprintf("select top %v [ID],[wellname],[series_num],[instrument_id],[temp_section],[work_time],[bt] from temp_analysis_result where ID not in (select top %v ID from temp_analysis_result where %s and [if_available] !=1 order by [ID] asc) and %s and [if_available] !=1 order by [ID] asc", req.Count, (req.Index-1)*req.Count, likeid, likeid) } resp.Total, _ = getRecordCount(sqlConn, selCntSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getTsDetails_en err:", err.Error()) goto exit } for row.Next() { var id int var d tsData if err = row.Scan(&id, &d.WellName, &d.Series, &d.InstrumentID, &d.TempSection, &d.WorkTime, &d.BeginTime); err == nil { d.WorkTime = strings.Replace(d.WorkTime, "小时", "h ", -1) d.WorkTime = strings.Replace(d.WorkTime, "分钟", "m ", -1) d.WorkTime = strings.Replace(d.WorkTime, "秒", "s", -1) d.BeginTime = do_time_by_ps(d.BeginTime, ps_info) if ps_info.R2 == "2" { s := strings.Split(d.TempSection, "~") if len(s) == 2 { bt, _ := strconv.Atoi(s[0]) et, _ := strconv.Atoi(s[1]) var f1, f2 float32 f1 = float32(bt)*1.8 + 32 f2 = float32(et)*1.8 + 32 d.TempSection = fmt.Sprintf("%.02f", f1) + "~" + fmt.Sprintf("%.02f", f2) } } else { s := strings.Split(d.TempSection, "~") if len(s) == 2 { bt, _ := strconv.Atoi(s[0]) et, _ := strconv.Atoi(s[1]) d.TempSection = fmt.Sprintf("%.02f", float32(bt)) + "~" + fmt.Sprintf("%.02f", float32(et)) } } resp.Data = append(resp.Data, d) } } row.Close() exit: jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getTsDetails_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getTsDetails(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getTsDetails recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetTsReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp GetTsResp var likeid string if req.WellName != "" { likeid = "wellname = '" + req.WellName + "'" } if req.Series != "" { if likeid == "" { likeid = "series_num like '%" + req.Series + "%'" } else { likeid += " and series_num like '%" + req.Series + "%'" } } if req.Instrument_id != "" { if likeid == "" { likeid = "Instrument_id like '%" + req.Instrument_id + "%'" } else { likeid += " and Instrument_id like '%" + req.Instrument_id + "%'" } } var selSql string var selCntSql string if likeid == "" { selCntSql = fmt.Sprintf(`select count(ID) from temp_analysis_result where [if_available] !=1`) selSql = fmt.Sprintf("select top %v [ID],[wellname],[series_num],[instrument_id],[temp_section],[work_time],[bt] from temp_analysis_result where ID not in (select top %v ID from temp_analysis_result where [if_available] !=1 order by [ID] asc) and [if_available] !=1 order by [ID] asc", req.Count, (req.Index-1)*req.Count) } else { selCntSql = fmt.Sprintf(`select count(ID) from temp_analysis_result where %s and [if_available] !=1`, likeid) selSql = fmt.Sprintf("select top %v [ID],[wellname],[series_num],[instrument_id],[temp_section],[work_time],[bt] from temp_analysis_result where ID not in (select top %v ID from temp_analysis_result where %s and [if_available] !=1 order by [ID] asc) and %s and [if_available] !=1 order by [ID] asc", req.Count, (req.Index-1)*req.Count, likeid, likeid) } resp.Total, _ = getRecordCount(sqlConn, selCntSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getTs err:", err.Error()) goto exit } for row.Next() { var id int var d tsData if err = row.Scan(&id, &d.WellName, &d.Series, &d.InstrumentID, &d.TempSection, &d.WorkTime, &d.BeginTime); err == nil { d.BeginTime = do_time_by_ps(d.BeginTime, ps_info) if ps_info.R2 == "2" { s := strings.Split(d.TempSection, "~") if len(s) == 2 { bt, _ := strconv.Atoi(s[0]) et, _ := strconv.Atoi(s[1]) var f1, f2 float32 f1 = float32(bt)*1.8 + 32 f2 = float32(et)*1.8 + 32 d.TempSection = fmt.Sprintf("%.02f", f1) + "~" + fmt.Sprintf("%.02f", f2) } } else { s := strings.Split(d.TempSection, "~") if len(s) == 2 { bt, _ := strconv.Atoi(s[0]) et, _ := strconv.Atoi(s[1]) d.TempSection = fmt.Sprintf("%.02f", float32(bt)) + "~" + fmt.Sprintf("%.02f", float32(et)) } } resp.Data = append(resp.Data, d) } } row.Close() exit: jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getTsDetails recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getTsCsv_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getTsCsv_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req TsExportReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { fmt.Println(err) return } defer f.Close() var context1 string var data [][]string if ps_info.R2 == "2" { context1 = "Temperature Interval(℉)" } else { context1 = "Temperature Interval(℃)" } data = append(data, []string{"Well Name", "Instrument Series No.", "Instrument Serial No.", context1, "Start time", "Working time(s)"}) var likeid string if req.WellName != "" { likeid = "wellname = '" + req.WellName + "'" } if req.Series != "" { if likeid == "" { likeid = "series_num like '%" + req.Series + "%'" } else { likeid += " and series_num like '%" + req.Series + "%'" } } if req.Instrument_id != "" { if likeid == "" { likeid = "Instrument_id like '%" + req.Instrument_id + "%'" } else { likeid += " and Instrument_id like '%" + req.Instrument_id + "%'" } } if spe_name, ok := spe_user[req.OpUser]; ok { if likeid == "" { likeid = fmt.Sprintf(` [ClOUDACCOUNT]='%s' `, spe_name) } else { likeid += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } } var selSql string if likeid == "" { selSql = fmt.Sprintf(`select [wellname],[series_num],[instrument_id],[temp_section],[bt],[seconds] from temp_analysis_result where [if_available] !=1`) } else { selSql = fmt.Sprintf(`select [wellname],[series_num],[instrument_id],[temp_section],[bt],[seconds] from temp_analysis_result where %s and [if_available] !=1`, likeid) } row, err := sqlConn.Query(selSql) if err != nil { logs.Error("export tmp db query err:", err.Error()) goto exit } for row.Next() { var d tsData if err = row.Scan(&d.WellName, &d.Series, &d.InstrumentID, &d.TempSection, &d.BeginTime, &d.wt); err == nil { if ps_info.R2 == "2" { s := strings.Split(d.TempSection, "~") if len(s) == 2 { bt, _ := strconv.Atoi(s[0]) et, _ := strconv.Atoi(s[1]) var f1, f2 float32 f1 = float32(bt)*1.8 + 32 f2 = float32(et)*1.8 + 32 d.TempSection = fmt.Sprintf("%.02f", f1) + "~" + fmt.Sprintf("%.02f", f2) } } else { s := strings.Split(d.TempSection, "~") if len(s) == 2 { bt, _ := strconv.Atoi(s[0]) et, _ := strconv.Atoi(s[1]) d.TempSection = fmt.Sprintf("%.02f", float32(bt)) + "~" + fmt.Sprintf("%.02f", float32(et)) } } d.BeginTime = do_time_by_ps(d.BeginTime, ps_info) data = append(data, []string{d.WellName, d.Series, d.InstrumentID, d.TempSection, d.BeginTime, strconv.Itoa(d.wt)}) } } row.Close() exit: f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码 w := csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() var resp MhExportResp resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { fmt.Println(err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getTsCsv_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getTsCsv(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getTsCsv recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req TsExportReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { fmt.Println(err) return } defer f.Close() var context1 string var data [][]string if ps_info.R2 == "2" { context1 = "温度区间(℉)" } else { context1 = "温度区间(℃)" } data = append(data, []string{"井名称", "仪器系列号", "仪器编码", context1, "开始时间", "工作时长(s)"}) var likeid string if req.WellName != "" { likeid = "wellname = '" + req.WellName + "'" } if req.Series != "" { if likeid == "" { likeid = "series_num like '%" + req.Series + "%'" } else { likeid += " and series_num like '%" + req.Series + "%'" } } if req.Instrument_id != "" { if likeid == "" { likeid = "Instrument_id like '%" + req.Instrument_id + "%'" } else { likeid += " and Instrument_id like '%" + req.Instrument_id + "%'" } } if spe_name, ok := spe_user[req.OpUser]; ok { if likeid == "" { likeid = fmt.Sprintf(` [ClOUDACCOUNT]='%s' `, spe_name) } else { likeid += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } } var selSql string if likeid == "" { selSql = fmt.Sprintf(`select [wellname],[series_num],[instrument_id],[temp_section],[bt],[seconds] from temp_analysis_result where [if_available] !=1`) } else { selSql = fmt.Sprintf(`select [wellname],[series_num],[instrument_id],[temp_section],[bt],[seconds] from temp_analysis_result where %s and [if_available] !=1`, likeid) } row, err := sqlConn.Query(selSql) if err != nil { logs.Error("export tmp db query err:", err.Error()) goto exit } for row.Next() { var d tsData if err = row.Scan(&d.WellName, &d.Series, &d.InstrumentID, &d.TempSection, &d.BeginTime, &d.wt); err == nil { if ps_info.R2 == "2" { s := strings.Split(d.TempSection, "~") if len(s) == 2 { bt, _ := strconv.Atoi(s[0]) et, _ := strconv.Atoi(s[1]) var f1, f2 float32 f1 = float32(bt)*1.8 + 32 f2 = float32(et)*1.8 + 32 d.TempSection = fmt.Sprintf("%.02f", f1) + "~" + fmt.Sprintf("%.02f", f2) } } else { s := strings.Split(d.TempSection, "~") if len(s) == 2 { bt, _ := strconv.Atoi(s[0]) et, _ := strconv.Atoi(s[1]) d.TempSection = fmt.Sprintf("%.02f", float32(bt)) + "~" + fmt.Sprintf("%.02f", float32(et)) } } d.BeginTime = do_time_by_ps(d.BeginTime, ps_info) data = append(data, []string{d.WellName, d.Series, d.InstrumentID, d.TempSection, d.BeginTime, strconv.Itoa(d.wt)}) } } row.Close() exit: f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码 w := csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() var resp MhExportResp resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { fmt.Println(err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getTsCsv recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getTs(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getTs recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetTsReq json.Unmarshal(reqdata, &req) beingIndex := req.Count * (req.Index - 1) endIndex := req.Count * req.Index cnt := 0 var resp GetTsResp var likeid string if req.WellName != "" { likeid = "wellname = '" + req.WellName + "'" } if req.Series != "" { if likeid == "" { likeid = "series_num like '%" + req.Series + "%'" } else { likeid += " and series_num like '%" + req.Series + "%'" } } if req.Instrument_id != "" { if likeid == "" { likeid = "Instrument_id like '%" + req.Instrument_id + "%'" } else { likeid += " and Instrument_id like '%" + req.Instrument_id + "%'" } } if spe_name, ok := spe_user[req.OpUser]; ok { if likeid == "" { likeid = fmt.Sprintf(` [ClOUDACCOUNT]='%s' `, spe_name) } else { likeid += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } } var selSql string var selCntSql string if likeid == "" { selCntSql = fmt.Sprintf(`select count([wellname]) from (select distinct [wellname],[series_num],[instrument_id] from temp_analysis_result where [if_available] !=1)t`) //selSql = fmt.Sprintf("select top %v [wellname],[series_num],[instrument_id] from (select distinct top %v [wellname],[series_num],[instrument_id] from temp_analysis_result where [if_available] !=1 order by [wellname] asc)t order by [wellname] desc", req.Count, req.Index*req.Count) selSql = fmt.Sprintf("select distinct [wellname],[series_num],[instrument_id] from temp_analysis_result where [if_available] !=1 order by [wellname] desc") } else { selCntSql = fmt.Sprintf(`select count([wellname]) from (select distinct [wellname],[series_num],[instrument_id] from temp_analysis_result where %s and [if_available] !=1)t`, likeid) //selSql = fmt.Sprintf("select top %v [wellname],[series_num],[instrument_id] from (select distinct top %v [wellname],[series_num],[instrument_id] from temp_analysis_result where %s and [if_available] !=1 order by [wellname] asc)t order by [wellname] desc", req.Count, req.Index*req.Count, likeid) selSql = fmt.Sprintf("select distinct [wellname],[series_num],[instrument_id] from temp_analysis_result where %s and [if_available] !=1 order by [wellname] desc", likeid) } resp.Total, _ = getRecordCount(sqlConn, selCntSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getTs err:", err.Error()) goto exit } for row.Next() { //var id int var d tsData if err = row.Scan(&d.WellName, &d.Series, &d.InstrumentID); err == nil { if cnt >= beingIndex && cnt < endIndex { resp.Data = append(resp.Data, d) } cnt++ } } row.Close() exit: jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getTs recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func checkWellnameIfAvaliable(wellname string) (available int) { data := []rune(wellname) for i := 0; i < len(data); i++ { if data[i] <= 0x7f { available = 0 } else if data[i] >= 0x4e00 && data[i] <= 0x9fa5 { available = 0 } else { available = 1 break } } return } func checkInstrumentIDIfAvaliable(instrument_id string) (available int) { data := []rune(instrument_id) for i := 0; i < len(data); i++ { //0-9 a-z A-Z 空格 if (data[i] >= 0x30 && data[i] <= 0x39) || (data[i] >= 0x41 && data[i] <= 0x5A) || (data[i] >= 0x61 && data[i] <= 0x7A) || data[i] == 0x20 { available = 0 } else { available = 1 break } } return } func checkSeriesIfAvailable(seriesID string) (available int) { if len(seriesID) < 3 { available = 1 return } data := []rune(seriesID) str := data[:3] if string(str) != "LHE" { available = 1 return } for i := 3; i < len(data); i++ { //0-9 a-z A-Z if (data[i] >= 0x30 && data[i] <= 0x39) || (data[i] >= 0x41 && data[i] <= 0x5A) || (data[i] >= 0x61 && data[i] <= 0x7A) { available = 0 } else { available = 1 break } } return } func getMssCsv_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMssCsv_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req MssExportReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { fmt.Println(err) return } defer f.Close() var data [][]string data = append(data, []string{"Well Name", "Instrument Series No.", "Instrument Serial No.", "Saved Time", "Total Working Time(h)", "Current Working Time(h)", "Maintenance Times", "Current firmware version", "Latest firmware version"}) var whereSql string = " where [if_available] !=1 " if req.Wellname != "" { whereSql += " and wellname like '%" + req.Wellname + "%'" } if req.Series != "" { whereSql += " and series like '%" + req.Series + "%'" } if req.Instrument_id != "" { whereSql += " and instrument_id like '%" + req.Instrument_id + "%'" } if req.Checked { likeid := fmt.Sprintf(" and [service_type]=1") whereSql += likeid } if spe_name, ok := spe_user[req.OpUser]; ok { likeid := fmt.Sprintf(" and [ClOUDACCOUNT]='%s' ", spe_name) whereSql += likeid } var selSql string selSql = fmt.Sprintf(`select [wellname],[series],[instrument_id],[saveTime],[workTime],[totalWorkTime],[repairCnt],[ver],[lastVer] from [analysis_result_mss] %s order by [saveTime] desc`, whereSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error(fmt.Sprintf("getMssCsv_en db query err:%s", err.Error())) goto exit } for row.Next() { var v GetMssRespData if err = row.Scan(&v.WellName, &v.Series, &v.InstrumentID, &v.SaveTime, &v.WorkTime, &v.TotalWorkTime, &v.RepairCnt, &v.Ver, &v.LastVer); err == nil { v.SaveTime = do_time_by_ps(v.SaveTime, ps_info) data = append(data, []string{v.WellName, v.Series, v.InstrumentID, v.SaveTime, v.TotalWorkTime, v.WorkTime, v.RepairCnt, v.Ver, v.LastVer}) } } row.Close() exit: f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码 w := csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() var resp MhExportResp resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { fmt.Println(err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMssCsv_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_ps_info(user string) (ps_info page_setting_req) { if _, ok := pageSetting[user]; ok { ps_info = pageSetting[user] } else { ps_info.R1 = "1" ps_info.R2 = "1" ps_info.R3 = "1" } return } func getMssCsv(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMssCsv recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req MssExportReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { fmt.Println(err) return } defer f.Close() var data [][]string data = append(data, []string{"井名称", "仪器系列号", "仪器编码", "保存时间", "出厂总工时", "当次总工时", "故障次数", "固件版本信息", "最新固件版本信息"}) var whereSql string = " where [if_available] !=1 " if req.Wellname != "" { whereSql += " and wellname like '%" + req.Wellname + "%'" } if req.Series != "" { whereSql += " and series like '%" + req.Series + "%'" } if req.Instrument_id != "" { whereSql += " and instrument_id like '%" + req.Instrument_id + "%'" } if req.Checked { likeid := fmt.Sprintf(" and [service_type]=1") whereSql += likeid } if spe_name, ok := spe_user[req.OpUser]; ok { likeid := fmt.Sprintf(" and [ClOUDACCOUNT]='%s' ", spe_name) whereSql += likeid } var selSql string selSql = fmt.Sprintf(`select [wellname],[series],[instrument_id],[saveTime],[workTime],[totalWorkTime],[repairCnt],[ver],[lastVer] from [analysis_result_mss] %s order by [saveTime] desc`, whereSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error(fmt.Sprintf("getMssCsv db query err:%s", err.Error())) goto exit } for row.Next() { var v GetMssRespData if err = row.Scan(&v.WellName, &v.Series, &v.InstrumentID, &v.SaveTime, &v.WorkTime, &v.TotalWorkTime, &v.RepairCnt, &v.Ver, &v.LastVer); err == nil { v.SaveTime = do_time_by_ps(v.SaveTime, ps_info) data = append(data, []string{v.WellName, v.Series, v.InstrumentID, v.SaveTime, v.TotalWorkTime, v.WorkTime, v.RepairCnt, v.Ver, v.LastVer}) } } row.Close() exit: f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码 w := csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() var resp MhExportResp resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { fmt.Println(err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMssCsv recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMss_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMss recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetMssReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp GetMssResp var whereSql string = " where [if_available] !=1 and lastVer is not null and lastVer != '' " if req.WellName != "" { whereSql += " and wellname like '%" + req.WellName + "%'" } if req.Series != "" { whereSql += " and series like '%" + req.Series + "%'" } if req.Instrument_id != "" { whereSql += " and instrument_id like '%" + req.Instrument_id + "%'" } if req.Checked { likeid := fmt.Sprintf(" and [service_type]=1") whereSql += likeid } if spe_name, ok := spe_user[req.OpUser]; ok { likeid := fmt.Sprintf(" and [ClOUDACCOUNT]='%s' ", spe_name) whereSql += likeid } selCountSql := fmt.Sprintf(`select count([ID]) from [analysis_result_mss] %s`, whereSql) rcnt, err := getRecordCount(sqlConn, selCountSql) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", selCountSql, err.Error())) jdata, _ := json.Marshal(resp) response.Write(jdata) return } query_cnt := req.Index * req.Count var cnt int if query_cnt > rcnt { cnt = rcnt + req.Count - query_cnt } else { cnt = req.Count } orderBySql := " order by saveTime desc" selSql := fmt.Sprintf(`select top %d [ID],[wellname],[series],[instrument_id],[saveTime],[ver],[lastVer],[workTime],[totalWorkTime],[state],[repairCnt] from [analysis_result_mss]`, cnt) if whereSql != "" { selSql += whereSql } selSql += fmt.Sprintf(`and lastVer is not null and lastVer != '' and ID not in (select top %v ID from analysis_result_mss %s %s)`, (req.Index-1)*req.Count, whereSql, orderBySql) selSql += orderBySql fmt.Println(selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error(fmt.Sprintf("getMss db query err:%s", err.Error())) jdata, _ := json.Marshal(resp) response.Write(jdata) return } var rds []GetMssRespData timeLayout := "2006-01-02 15:04:05" loc, _ := time.LoadLocation("Local") for row.Next() { var id int var v GetMssRespData if err = row.Scan(&id, &v.WellName, &v.Series, &v.InstrumentID, &v.SaveTime, &v.Ver, &v.LastVer, &v.WorkTime, &v.TotalWorkTime, &v.State, &v.RepairCnt); err == nil { if v.State == "在线" { v.State = "online" } else { v.State = "offline" } opTime, _ := time.ParseInLocation(timeLayout, v.SaveTime, loc) if time.Now().Sub(opTime).Hours() < 24*30 { wt, _ := strconv.Atoi(v.WorkTime) if wt > 1000 { v.Warn_type = "1" } else { if strings.Contains(v.Ver, "A") || strings.Contains(v.Ver, "a") || strings.Contains(v.LastVer, "B") || strings.Contains(v.LastVer, "b") { } else { if v.Ver != "" && v.LastVer != "" && v.Ver < v.LastVer { v.Warn_type = "2" } } } } v.SaveTime = do_time_by_ps(v.SaveTime, ps_info) rds = append(rds, v) } } row.Close() resp.Total = rcnt resp.Data = append(resp.Data, rds...) jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMss recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMss(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMss recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetMssReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp GetMssResp var whereSql string = " where [if_available] !=1 and lastVer is not null and lastVer != '' " if req.WellName != "" { whereSql += " and wellname like '%" + req.WellName + "%'" } if req.Series != "" { whereSql += " and series like '%" + req.Series + "%'" } if req.Instrument_id != "" { whereSql += " and instrument_id like '%" + req.Instrument_id + "%'" } if req.Checked { likeid := fmt.Sprintf(" and [service_type]=1") whereSql += likeid } if spe_name, ok := spe_user[req.OpUser]; ok { likeid := fmt.Sprintf(" and [ClOUDACCOUNT]='%s' ", spe_name) whereSql += likeid } selCountSql := fmt.Sprintf(`select count([ID]) from [analysis_result_mss] %s`, whereSql) logs.Info("getMss selCountSql------- : ", selCountSql) rcnt, err := getRecordCount(sqlConn, selCountSql) logs.Info("getMss select data : ", rcnt) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", selCountSql, err.Error())) jdata, _ := json.Marshal(resp) response.Write(jdata) return } query_cnt := req.Index * req.Count var cnt int logs.Info("getMss query_cnt : ", query_cnt) logs.Info("getMss rcnt : ", rcnt) if query_cnt > rcnt { cnt = rcnt + req.Count - query_cnt } else { cnt = req.Count } logs.Info("getMss cnt : ", cnt) orderBySql := " order by saveTime desc" selSql := fmt.Sprintf(`select top %d [ID],[wellname],[series],[instrument_id],[saveTime],[ver],[lastVer],[workTime],[totalWorkTime],[state],[repairCnt] from [analysis_result_mss]`, cnt) if whereSql != "" { selSql += whereSql } selSql += fmt.Sprintf(`and lastVer is not null and lastVer != '' and ID not in (select top %v ID from analysis_result_mss %s %s)`, (req.Index-1)*req.Count, whereSql, orderBySql) selSql += orderBySql logs.Info("getMss select data : ", selSql) fmt.Println(selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error(fmt.Sprintf("getMss db query err:%s", err.Error())) jdata, _ := json.Marshal(resp) response.Write(jdata) return } var rds []GetMssRespData timeLayout := "2006-01-02 15:04:05" loc, _ := time.LoadLocation("Local") for row.Next() { var id int var v GetMssRespData if err = row.Scan(&id, &v.WellName, &v.Series, &v.InstrumentID, &v.SaveTime, &v.Ver, &v.LastVer, &v.WorkTime, &v.TotalWorkTime, &v.State, &v.RepairCnt); err == nil { opTime, _ := time.ParseInLocation(timeLayout, v.SaveTime, loc) if time.Now().Sub(opTime).Hours() < 24*30 { wt, _ := strconv.Atoi(v.WorkTime) if wt > 1000 { v.Warn_type = "1" } else { if strings.Contains(v.Ver, "A") || strings.Contains(v.Ver, "a") || strings.Contains(v.LastVer, "B") || strings.Contains(v.LastVer, "b") { } else { if v.Ver != "" && v.LastVer != "" && v.Ver < v.LastVer { v.Warn_type = "2" } } } } v.SaveTime = do_time_by_ps(v.SaveTime, ps_info) rds = append(rds, v) } } row.Close() resp.Total = rcnt resp.Data = append(resp.Data, rds...) jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMss recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMsCsv_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMsCsv_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req MsExportReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { fmt.Println(err) return } defer f.Close() //ms setting mhSetting := getMsSettingByUser(req.Op_user) m := getMsSeriesMapNewSeries(mhSetting.Data) var t_arr []GetMsRespData mIndex := make(map[string]int) //series new nama index var data [][]string data = append(data, []string{"Instrument Series No.", "Maintenance Times", "Total Working Time(h)", "MTBF"}) var selRds []GetMsRespData selSql := fmt.Sprintf(`SELECT [series_num],[fault_cnt],[total_worktime],[mf] FROM [mtbf_analysis_result] where [if_available] !=1 order by series_num`) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getMsCsv_en select data err:", err.Error()) goto exit } for row.Next() { var d GetMsRespData if err = row.Scan(&d.Series, &d.RepairCnt, &d.TotalTime, &d.MtbfTime); err == nil { selRds = append(selRds, d) } } row.Close() for i := 0; i < len(selRds); i++ { if series_new_name, ok := m[selRds[i].Series]; !ok { t_arr = append(t_arr, selRds[i]) } else { if index, ok := mIndex[series_new_name]; ok { t_arr[index].RepairCnt += selRds[i].RepairCnt t_arr[index].TotalTime += selRds[i].TotalTime if t_arr[index].RepairCnt != 0 { t_arr[index].MtbfTime = t_arr[index].TotalTime / t_arr[index].RepairCnt } else { t_arr[index].MtbfTime = t_arr[index].TotalTime } } else { selRds[i].Series = series_new_name t_arr = append(t_arr, selRds[i]) mIndex[series_new_name] = len(t_arr) - 1 } } } for _, v := range t_arr { b := strings.Contains(v.Series, req.SerierNum) if b { data = append(data, []string{v.Series, strconv.Itoa(v.RepairCnt), strconv.Itoa(v.TotalTime), strconv.Itoa(v.MtbfTime)}) } } exit: f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码 w := csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() var resp MhExportResp resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { fmt.Println(err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMsCsv_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMsCsv(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMsCsv recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req MsExportReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { fmt.Println(err) return } defer f.Close() //ms setting mhSetting := getMsSettingByUser(req.Op_user) m := getMsSeriesMapNewSeries(mhSetting.Data) var t_arr []GetMsRespData mIndex := make(map[string]int) //series new nama index var data [][]string data = append(data, []string{"系列号", "维修次数", "总工作时间(h)", "MTBF时间(h)"}) var selRds []GetMsRespData selSql := fmt.Sprintf(`SELECT [series_num],[fault_cnt],[total_worktime],[mf] FROM [mtbf_analysis_result] where [if_available] !=1 order by series_num`) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getMsCsv select data err:", err.Error()) goto exit } for row.Next() { var d GetMsRespData if err = row.Scan(&d.Series, &d.RepairCnt, &d.TotalTime, &d.MtbfTime); err == nil { selRds = append(selRds, d) } } row.Close() for i := 0; i < len(selRds); i++ { if series_new_name, ok := m[selRds[i].Series]; !ok { t_arr = append(t_arr, selRds[i]) } else { if index, ok := mIndex[series_new_name]; ok { t_arr[index].RepairCnt += selRds[i].RepairCnt t_arr[index].TotalTime += selRds[i].TotalTime if t_arr[index].RepairCnt != 0 { t_arr[index].MtbfTime = t_arr[index].TotalTime / t_arr[index].RepairCnt } else { t_arr[index].MtbfTime = t_arr[index].TotalTime } } else { selRds[i].Series = series_new_name t_arr = append(t_arr, selRds[i]) mIndex[series_new_name] = len(t_arr) - 1 } } } for _, v := range t_arr { b := strings.Contains(v.Series, req.SerierNum) if b { data = append(data, []string{v.Series, strconv.Itoa(v.RepairCnt), strconv.Itoa(v.TotalTime), strconv.Itoa(v.MtbfTime)}) } } exit: f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码 w := csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() var resp MhExportResp resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { fmt.Println(err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMsCsv recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMs(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMs recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetMsReq json.Unmarshal(reqdata, &req) var resp GetMsResp beginIndex := req.Count * (req.Index - 1) endIndex := req.Count * req.Index //ms setting mhSetting := getMsSettingByUser(req.Op_user) m := getMsSeriesMapNewSeries(mhSetting.Data) var t_arr []GetMsRespData mIndex := make(map[string]int) //series new nama index var rds []GetMsRespData var selRds []GetMsRespData selSql := fmt.Sprintf(`SELECT [series_num],[fault_cnt],[total_worktime],[mf] FROM [mtbf_analysis_result] where [if_available] !=1 order by series_num`) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getMs select data err:", err.Error()) goto exit } for row.Next() { var d GetMsRespData if err = row.Scan(&d.Series, &d.RepairCnt, &d.TotalTime, &d.MtbfTime); err == nil { selRds = append(selRds, d) } } row.Close() for i := 0; i < len(selRds); i++ { if series_new_name, ok := m[selRds[i].Series]; !ok { t_arr = append(t_arr, selRds[i]) } else { if index, ok := mIndex[series_new_name]; ok { t_arr[index].RepairCnt += selRds[i].RepairCnt t_arr[index].TotalTime += selRds[i].TotalTime if t_arr[index].RepairCnt != 0 { t_arr[index].MtbfTime = t_arr[index].TotalTime / t_arr[index].RepairCnt } else { t_arr[index].MtbfTime = t_arr[index].TotalTime } } else { selRds[i].Series = series_new_name t_arr = append(t_arr, selRds[i]) mIndex[series_new_name] = len(t_arr) - 1 } } } if req.SearchValue == "" { rds = append(rds, t_arr...) } else { for i := 0; i < len(t_arr); i++ { b := strings.Contains(t_arr[i].Series, req.SearchValue) if b { rds = append(rds, t_arr[i]) } } } for i := beginIndex; i < endIndex; i++ { if i >= len(rds) { break } resp.Data = append(resp.Data, rds[i]) } resp.Total = len(rds) exit: jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMs recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMhSCsv_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMhSCsv_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req MhExportReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp MhExportResp var db string var cmdSql string var conn *sql.DB var err error var sqlstr string var row *sql.Rows var mhdata []GetMhSRespData var filename string var data [][]string var f *os.File var w *csv.Writer needOffline := false masterConn, err := getOdbcConn("master") if err != nil { logs.Info("链接master库失败", err.Error()) fmt.Println("链接master库失败", err.Error()) } else { defer masterConn.Close() // 查询数据库状态 checkSql := fmt.Sprintf("SELECT state_desc FROM sys.databases WHERE name = '%s'", db) var status string err = masterConn.QueryRow(checkSql).Scan(&status) if err != nil { fmt.Println("查询数据库状态失败:", err.Error()) logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) onlineSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) _, err = masterConn.Exec(onlineSql) if err != nil { fmt.Println("设置在线失败:", err.Error()) logs.Info("设置在线失败:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为在线\n", db) needOffline = true } } else { fmt.Printf("数据库 %s 已在线,不需要操作\n", db) needOffline = false } } } rwLocker.RLock() if v, ok := wellNamemap[req.Wellname]; ok { rwLocker.RUnlock() db = v } else { logs.Info(fmt.Sprintf("wellsourcename: %s not exist!", req.Wellname)) rwLocker.RUnlock() goto write_csv } conn, err = getOdbcConn(db) if err != nil { logs.Info("Connecting Error", err.Error()) goto write_csv } defer conn.Close() sqlstr = fmt.Sprintf("select [5200],COALESCE([5202],''),[5203],COALESCE([5219],''),COALESCE([5204],'') from EQUIPMENTRECORDS where [5203] !='' and [5200] !='' order by [5219] desc") row, err = conn.Query(sqlstr) if err != nil { logs.Info("Query Error", err.Error()) goto write_csv } defer row.Close() for row.Next() { var d GetMhSRespData if err := row.Scan(&d.WellName, &d.WellOper, &d.WorkState, &d.SaveTime, &d.Note); err == nil { d.SaveTime = d.SaveTime[:10] + " " + d.SaveTime[11:19] if d.SaveTime == "1900-01-01 00:00:00" { d.SaveTime = "" } if d.SaveTime != "" && len(d.SaveTime) >= 19 { d.SaveTime = do_time_by_ps(d.SaveTime, ps_info) } mhdata = append(mhdata, d) } else { logs.Info("scan Error", err.Error()) } } write_csv: filename = fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err = os.Create(filename) if err != nil { fmt.Println(err) goto exit } defer f.Close() data = append(data, []string{"Well Name", "Users", "Service Status", "Saved Time", "Special Case"}) for i := 0; i < len(mhdata); i++ { data = append(data, []string{mhdata[i].WellName, mhdata[i].WellOper, mhdata[i].WorkState, mhdata[i].SaveTime, mhdata[i].Note}) } f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM w = csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) if needOffline { masterConn2, err := getOdbcConn("master") if err != nil { logs.Info("连接master库失败", err.Error()) fmt.Println("连接master库失败", err.Error()) } else { defer masterConn2.Close() cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE WITH ROLLBACK IMMEDIATE", db) _, err = masterConn2.Exec(cmdSql) if err != nil { logs.Error("SET OFFLINE command execution error:", err.Error()) } } } exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMhSCsv_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMhSCsv(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMhSCsv recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req MhExportReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp MhExportResp var db string var cmdSql string var conn *sql.DB var err error var sqlstr string var row *sql.Rows var mhdata []GetMhSRespData var filename string var data [][]string var f *os.File var w *csv.Writer needOffline := false masterConn, err := getOdbcConn("master") if err != nil { logs.Info("链接master库失败", err.Error()) fmt.Println("链接master库失败", err.Error()) } else { defer masterConn.Close() // 查询数据库状态 checkSql := fmt.Sprintf("SELECT state_desc FROM sys.databases WHERE name = '%s'", db) var status string err = masterConn.QueryRow(checkSql).Scan(&status) if err != nil { fmt.Println("查询数据库状态失败:", err.Error()) logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) onlineSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) _, err = masterConn.Exec(onlineSql) if err != nil { fmt.Println("设置在线失败:", err.Error()) logs.Info("设置在线失败:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为在线\n", db) needOffline = true } } else { fmt.Printf("数据库 %s 已在线,不需要操作\n", db) needOffline = false } } } rwLocker.RLock() if v, ok := wellNamemap[req.Wellname]; ok { rwLocker.RUnlock() db = v } else { logs.Info(fmt.Sprintf("wellsourcename: %s not exist!", req.Wellname)) rwLocker.RUnlock() goto write_csv } conn, err = getOdbcConn(db) if err != nil { logs.Info("Connecting Error", err.Error()) goto write_csv } defer conn.Close() sqlstr = fmt.Sprintf("select [5200],COALESCE([5202],''),[5203],COALESCE([5219],''),COALESCE([5204],'') from EQUIPMENTRECORDS where [5203] !='' and [5200] !='' order by [5219] desc") row, err = conn.Query(sqlstr) if err != nil { logs.Info("Query Error", err.Error()) goto write_csv } defer row.Close() for row.Next() { var d GetMhSRespData if err := row.Scan(&d.WellName, &d.WellOper, &d.WorkState, &d.SaveTime, &d.Note); err == nil { d.SaveTime = d.SaveTime[:10] + " " + d.SaveTime[11:19] if d.SaveTime == "1900-01-01 00:00:00" { d.SaveTime = "" } if d.SaveTime != "" && len(d.SaveTime) >= 19 { d.SaveTime = do_time_by_ps(d.SaveTime, ps_info) } mhdata = append(mhdata, d) } else { logs.Info("scan Error", err.Error()) } } write_csv: filename = fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err = os.Create(filename) if err != nil { fmt.Println(err) goto exit } defer f.Close() data = append(data, []string{"井名称", "操作人员", "工作状态", "保存时间", "特殊情况"}) for i := 0; i < len(mhdata); i++ { data = append(data, []string{mhdata[i].WellName, mhdata[i].WellOper, mhdata[i].WorkState, mhdata[i].SaveTime, mhdata[i].Note}) } f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM w = csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) if needOffline { masterConn2, err := getOdbcConn("master") if err != nil { logs.Info("连接master库失败", err.Error()) fmt.Println("连接master库失败", err.Error()) } else { defer masterConn2.Close() cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE WITH ROLLBACK IMMEDIATE", db) _, err = masterConn2.Exec(cmdSql) if err != nil { logs.Error("SET OFFLINE command execution error:", err.Error()) } } } exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getWellHistory recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMhS(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMhS recv req begin", time.Now().Format("2006-01-02 15:04:05")) var conn *sql.DB var err error var req CommonReq var resp GetMhSResp resp.Data = []GetMhSRespData{} reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) var ps_info page_setting_req if _, ok := pageSetting[req.OpUser]; ok { ps_info = pageSetting[req.OpUser] } else { ps_info.R1 = "1" ps_info.R2 = "1" ps_info.R3 = "1" } var cmdSql string var db string var sqlstr string var rcnt int var row *sql.Rows needOffline := false masterConn, err := getOdbcConn("master") if err != nil { logs.Info("链接master库失败", err.Error()) fmt.Println("链接master库失败", err.Error()) } else { defer masterConn.Close() // 查询数据库状态 checkSql := fmt.Sprintf("SELECT state_desc FROM sys.databases WHERE name = '%s'", db) var status string err = masterConn.QueryRow(checkSql).Scan(&status) if err != nil { fmt.Println("查询数据库状态失败:", err.Error()) logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) logs.Info("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) onlineSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) _, err = masterConn.Exec(onlineSql) if err != nil { fmt.Println("设置在线失败:", err.Error()) logs.Info("设置在线失败:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为在线\n", db) needOffline = true } } else { fmt.Printf("数据库 %s 已在线,不需要操作\n", db) needOffline = false } } } rwLocker.RLock() if v, ok := wellNamemap[req.Id]; ok { rwLocker.RUnlock() db = v } else { logs.Info(fmt.Sprintf("wellsourcename: %s not exist!", req.Id)) rwLocker.RUnlock() goto exit } conn, err = getOdbcConn(db) if err != nil { logs.Info("Connecting Error", err.Error()) goto exit } defer conn.Close() sqlstr = "select count(ID) from [EQUIPMENTRECORDS] where [5203] !='' and [5200] !='' " rcnt, err = getRecordCount(conn, sqlstr) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", sqlstr, err.Error())) goto exit } sqlstr = fmt.Sprintf("select top %v [5200],COALESCE([5202],''),COALESCE([5203],''),COALESCE([5219],''),COALESCE([5204],'') from EQUIPMENTRECORDS where ID not in (select top %v id from EQUIPMENTRECORDS where [5203] !='' and [5200] !='' order by [5219] desc) and [5203] !='' and [5200] !='' order by [5219] desc", req.Count, (req.Index-1)*req.Count) row, err = conn.Query(sqlstr) if err != nil { logs.Info("Query Error", err.Error()) goto exit } defer row.Close() for row.Next() { var d GetMhSRespData if err := row.Scan(&d.WellName, &d.WellOper, &d.WorkState, &d.SaveTime, &d.Note); err == nil { //fmt.Println("savetime:", d.SaveTime) d.SaveTime = d.SaveTime[:10] + " " + d.SaveTime[11:19] if d.SaveTime == "1900-01-01 00:00:00" { d.SaveTime = "" } else { d.SaveTime = d.SaveTime[:10] + " " + d.SaveTime[11:19] d.SaveTime = do_time_by_ps(d.SaveTime, ps_info) } resp.Data = append(resp.Data, d) } else { logs.Info("scan Error", err.Error()) } } resp.Total = rcnt goto exit exit: jdata, _ := json.Marshal(resp) _, err = response.Write(jdata) if err != nil { logs.Error("getMhS:", err.Error()) } if needOffline { masterConn2, err := getOdbcConn("master") if err != nil { logs.Info("连接master库失败", err.Error()) fmt.Println("连接master库失败", err.Error()) } else { defer masterConn2.Close() cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE WITH ROLLBACK IMMEDIATE", db) _, err = masterConn2.Exec(cmdSql) if err != nil { logs.Error("SET OFFLINE command execution error:", err.Error()) } } } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMhS recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMhCsv_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMhCsv_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req MhExportReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { fmt.Println(err) return } defer f.Close() var data [][]string data = append(data, []string{"Well Name", "Users", "Service Status", "Upload Time", "Start Time Of Drilling", "End Time Of Drilling", "Working Time"}) whereSql := " where [if_available]!=1" if req.Wellname != "" { likeid := " and [wellname] like '%" + req.Wellname + "%'" whereSql += likeid } if req.BeginTime != "" || req.EndTime != "" { likeid := fmt.Sprintf(" and [wellBeginTime]>'%s' and [wellEndTime]<'%s'", req.BeginTime, req.EndTime) whereSql += likeid } if !req.IfAll { likeid := fmt.Sprintf(" and [wellBeginTime]!='' and [welloper]!='' ") whereSql += likeid } if req.Checked { likeid := fmt.Sprintf(" and [service_type]=1") whereSql += likeid } if spe_name, ok := spe_user[req.OpUser]; ok { likeid := fmt.Sprintf(" and [ClOUDACCOUNT]='%s' ", spe_name) whereSql += likeid } whereSql += " order by [wellCreateTime] desc" selSql := fmt.Sprintf("select [wellname],[wellCreateTime],[welloper],[state],[wellBeginTime],[wellEndTime],[wellWorkTime] from [analysis_result_mh] %s", whereSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getMhCsv query:", selSql, " err:", err.Error()) goto exit } for row.Next() { var v GetMhRespData if row.Scan(&v.WellName, &v.WellCreateT, &v.WellOper, &v.State, &v.WellBeginT, &v.WellEndT, &v.WellWorkT); err == nil { v.WellWorkT = strings.Replace(v.WellWorkT, "天", "d", -1) v.WellWorkT = strings.Replace(v.WellWorkT, "小时", "hrs", -1) v.WellCreateT = do_time_by_ps(v.WellCreateT, ps_info) v.WellBeginT = do_time_by_ps(v.WellBeginT, ps_info) v.WellEndT = do_time_by_ps(v.WellEndT, ps_info) data = append(data, []string{v.WellName, v.WellOper, v.State, v.WellCreateT, v.WellBeginT, v.WellEndT, v.WellWorkT}) } else { logs.Error("getMhCsv scan err:", err.Error()) } } row.Close() exit: f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM w := csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() var resp MhExportResp resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { fmt.Println(err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMhCsv_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMhCsv(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMhCsv recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req MhExportReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { fmt.Println(err) return } defer f.Close() var data [][]string data = append(data, []string{"井名称", "操作人员", "施工状态", "开始上传时间", "上井数据起始时间", "上井数据结束时间", "工作时间"}) whereSql := " where [if_available]!=1" if req.Wellname != "" { likeid := " and [wellname] like '%" + req.Wellname + "%'" whereSql += likeid } if req.BeginTime != "" || req.EndTime != "" { likeid := fmt.Sprintf(" and [wellBeginTime]>'%s' and [wellEndTime]<'%s'", req.BeginTime, req.EndTime) whereSql += likeid } if !req.IfAll { likeid := fmt.Sprintf(" and [wellBeginTime]!='' and [welloper]!='' ") whereSql += likeid } if req.Checked { likeid := fmt.Sprintf(" and [service_type]=1") whereSql += likeid } if spe_name, ok := spe_user[req.OpUser]; ok { likeid := fmt.Sprintf(" and [ClOUDACCOUNT]='%s' ", spe_name) whereSql += likeid } whereSql += " order by [wellCreateTime] desc" selSql := fmt.Sprintf("select [wellname],[wellCreateTime],[welloper],[state],[wellBeginTime],[wellEndTime],[wellWorkTime] from [analysis_result_mh] %s", whereSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getMhCsv query:", selSql, " err:", err.Error()) goto exit } for row.Next() { var v GetMhRespData if row.Scan(&v.WellName, &v.WellCreateT, &v.WellOper, &v.State, &v.WellBeginT, &v.WellEndT, &v.WellWorkT); err == nil { v.WellCreateT = do_time_by_ps(v.WellCreateT, ps_info) v.WellBeginT = do_time_by_ps(v.WellBeginT, ps_info) v.WellEndT = do_time_by_ps(v.WellEndT, ps_info) data = append(data, []string{v.WellName, v.WellOper, v.State, v.WellCreateT, v.WellBeginT, v.WellEndT, v.WellWorkT}) } else { logs.Error("getMhCsv scan err:", err.Error()) } } row.Close() exit: f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM w := csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() var resp MhExportResp resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { fmt.Println(err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMhCsv recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMh_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMh_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) var rds []GetMhRespData var err error var req GetMhReq var resp GetMhResp resp.Data = []GetMhRespData{} reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) //fmt.Println(req) whereSql := " where [if_available]!=1" if req.Id != "" { likeid := " and [wellname] like '%" + req.Id + "%'" whereSql += likeid } if req.BeginTime != "" || req.EndTime != "" { likeid := fmt.Sprintf(" and [wellBeginTime]>'%s' and [wellEndTime]<'%s'", req.BeginTime, req.EndTime) whereSql += likeid } if !req.IfAll { likeid := fmt.Sprintf(" and [wellBeginTime]!='' and [welloper]!='' ") whereSql += likeid } if req.Checked { likeid := fmt.Sprintf(" and [service_type]=1") whereSql += likeid } if spe_name, ok := spe_user[req.OpUser]; ok { likeid := fmt.Sprintf(" and [ClOUDACCOUNT]='%s' ", spe_name) whereSql += likeid } whereSql += " order by [wellCreateTime] desc" beginIndex := req.Count * (req.Index - 1) endIndex := req.Count * req.Index selSql := fmt.Sprintf("select [wellname],[wellCreateTime],[welloper],[state],[wellBeginTime],[wellEndTime],[wellWorkTime] from [analysis_result_mh] %s", whereSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getMh_en query:", selSql, " err:", err.Error()) goto exit } for row.Next() { var v GetMhRespData if row.Scan(&v.WellName, &v.WellCreateT, &v.WellOper, &v.State, &v.WellBeginT, &v.WellEndT, &v.WellWorkT); err == nil { v.WellWorkT = strings.Replace(v.WellWorkT, "天", "d ", -1) v.WellWorkT = strings.Replace(v.WellWorkT, "小时", "hrs", -1) v.WellCreateT = do_time_by_ps(v.WellCreateT, ps_info) v.WellBeginT = do_time_by_ps(v.WellBeginT, ps_info) v.WellEndT = do_time_by_ps(v.WellEndT, ps_info) rds = append(rds, v) } else { logs.Error("getMh_en scan err:", err.Error()) } } row.Close() for i := 0; i < len(rds); i++ { if i >= beginIndex && i < endIndex { resp.Data = append(resp.Data, rds[i]) } } resp.Total = len(rds) goto exit exit: jdata, _ := json.Marshal(resp) _, err = response.Write(jdata) if err != nil { logs.Error("getMh_en:", err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMh_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMh(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMh recv req begin", time.Now().Format("2006-01-02 15:04:05")) var rds []GetMhRespData var err error var req GetMhReq var resp GetMhResp resp.Data = []GetMhRespData{} reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) //fmt.Println(req) whereSql := " where [if_available]!=1" if req.Id != "" { likeid := " and [wellname] like '%" + req.Id + "%'" whereSql += likeid } if req.BeginTime != "" || req.EndTime != "" { likeid := fmt.Sprintf(" and [wellBeginTime]>'%s' and [wellEndTime]<'%s'", req.BeginTime, req.EndTime) whereSql += likeid } if !req.IfAll { likeid := fmt.Sprintf(" and [wellBeginTime]!='' and [welloper]!='' ") whereSql += likeid } if req.Checked { likeid := fmt.Sprintf(" and [service_type]=1") whereSql += likeid } if spe_name, ok := spe_user[req.OpUser]; ok { likeid := fmt.Sprintf(" and [ClOUDACCOUNT]='%s' ", spe_name) whereSql += likeid } whereSql += " order by [wellCreateTime] desc" beginIndex := req.Count * (req.Index - 1) endIndex := req.Count * req.Index selSql := fmt.Sprintf("select [wellname],[wellCreateTime],[welloper],[state],[wellBeginTime],[wellEndTime],[wellWorkTime] from [analysis_result_mh] %s", whereSql) fmt.Println("getMh--sql---", selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getMh query:", selSql, " err:", err.Error()) goto exit } for row.Next() { var v GetMhRespData if row.Scan(&v.WellName, &v.WellCreateT, &v.WellOper, &v.State, &v.WellBeginT, &v.WellEndT, &v.WellWorkT); err == nil { v.WellCreateT = do_time_by_ps(v.WellCreateT, ps_info) v.WellBeginT = do_time_by_ps(v.WellBeginT, ps_info) v.WellEndT = do_time_by_ps(v.WellEndT, ps_info) rds = append(rds, v) } else { logs.Error("getMh scan err:", err.Error()) } } row.Close() for i := 0; i < len(rds); i++ { if i >= beginIndex && i < endIndex { resp.Data = append(resp.Data, rds[i]) } } resp.Total = len(rds) goto exit exit: jdata, _ := json.Marshal(resp) _, err = response.Write(jdata) if err != nil { logs.Error("getMh:", err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMh recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getUserLevel(userPosition string) (level int) { level = 4 if lv, ok := userLevelMap[userPosition]; ok { level = lv } else { level = -1 } return } // 菜单 func getMenu(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("getMenu recv req begin", time.Now().Format("2006-01-02 15:04:05")) var err error var req GetMenuReq var resp GetMenuResp var menu GetMenuRespData var mItem menuItem var userInfo GetUsersRespdata var userPositionLevel int reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ifOnline := checkUserIfOnline(req.UserName) if !ifOnline { goto exit } userInfo, err = getUserInfo(req.UserName) if err != nil { goto exit } userPositionLevel = getUserLevel(userInfo.Userrole) if userPositionLevel < 0 || userPositionLevel > 4 { goto exit } menu.Title = "测井数据" menu.Index = "1" //menu.Class = "el-icon-s-data" //menu.SvgData.First = "M992.256 960 960 960 960 576.192C960 540.032 931.072 512 895.424 512l-126.784 0C732.352 512 704 540.736 704 576.192L704 960l-64 0L640 64.448C640 28.736 611.072 0 575.424 0L448.576 0C412.352 0 384 28.864 384 64.448L384 960 320 960 320 319.744C320 284.48 291.072 256 255.424 256L128.576 256C92.352 256 64 284.544 64 319.744L64 960 31.744 960C14.464 960 0 974.336 0 992 0 1009.152 14.208 1024 31.744 1024l960.448 0C1009.536 1024 1024 1009.664 1024 992 1024 974.848 1009.792 960 992.256 960z" menu.SvgData.First = "M960 896H128v-64h832v64zM320 768H256V384h64v384z m256 0H512V192h64v576z m256 0h-64V512h64v256z" menu.Key = menu.Index mItem.Index = "/info" mItem.Title = "测井实时数据" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/history" mItem.Title = "测井历史数据" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/wt" mItem.Title = "测井类型统计" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/es" mItem.Title = "测井工程服务" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) resp.MenuData = append(resp.MenuData, menu) menu.Title = "工时统计管理" menu.Index = "4" //menu.Class = "el-icon-menu" menu.SvgData.First = "M512 177c-193.3 0-350 156.7-350 350s156.7 350 350 350 350-156.7 350-350-156.7-350-350-350z m0 623.4c-150.8 0-273.4-122.7-273.4-273.4S361.2 253.6 512 253.6 785.4 376.2 785.4 527 662.8 800.4 512 800.4z" menu.SvgData.Second = "M680.7 536.9H527.9V357.6c0-15.1-12.3-27.3-27.4-27.3-15.1 0-27.3 12.2-27.3 27.3v230.2c0 15.1 12.2 27.4 27.3 27.4 3.5 0 6.8-0.7 9.8-1.9 0.8 0.1 1.6 0.3 2.5 0.3h167.8c21.1 0 38.3-17.1 38.3-38.3 0.1-21.2-17-38.4-38.2-38.4z" menu.Key = menu.Index menu.Items = []menuItem{} mItem.Index = "/mh" mItem.Title = "全部井仪器井下工时统计" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) if userPositionLevel != 4 { if _, ok := spe_user[req.UserName]; !ok { mItem.Index = "/up_off_well" mItem.Title = "人员工时核算统计" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) } } mItem.Index = "/mhs" mItem.Title = "单井施工信息查询" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) if userPositionLevel == 0 || userPositionLevel == 1 { mItem.Index = "/cmp" mItem.Title = "施工管理报表" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) } if userPositionLevel == 0 || userPositionLevel == 1 { mItem.Index = "/srr" mItem.Title = "现场记录报表" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) } resp.MenuData = append(resp.MenuData, menu) if userPositionLevel == 0 || userPositionLevel == 1 || userPositionLevel == 4 { menu.Title = "维保统计管理" menu.Index = "5" //menu.Class = "el-icon-menu" menu.SvgData.First = "M512 78.769231L157.538462 157.538462v590.76923l354.461538 196.923077 354.461538-196.923077V157.538462l-354.461538-78.769231z m259.938462 614.006154l-259.938462 144.541538-259.938462-144.541538V233.550769l259.938462-57.895384 259.938462 57.895384v459.224616z" menu.SvgData.Second = "M458.830769 405.267692l-0.787692-107.913846c-40.96 19.692308-68.923077 61.833846-68.529231 110.670769 0.393846 34.264615 14.178462 65.378462 37.021539 87.827693 12.996923 12.996923 28.356923 23.236923 46.473846 29.538461V681.353846c0 10.24 6.301538 20.48 12.996923 27.175385s16.147692 11.027692 26.387692 11.027692c20.48 0 39.778462-18.116923 39.384616-38.203077l0.393846-153.206154c51.987692-14.178462 85.858462-61.833846 85.464615-118.547692-0.393846-34.264615-14.178462-65.378462-37.021538-87.827692-9.846154-9.846154-20.873846-17.723077-33.083077-24.024616l0.787692 107.913846-54.350769 31.113847-55.138462-31.507693z" menu.Key = menu.Index menu.Items = []menuItem{} mItem.Index = "/ms" mItem.Title = "仪器MTBF统计" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/fr" mItem.Title = "万米故障率统计" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/mss" mItem.Title = "仪器维保信息统计" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) if userPositionLevel != 4 { mItem.Index = "/tools" mItem.Title = "仪器预警报告" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) } if userPositionLevel != 4 { if userPositionLevel == 0 || userInfo.UserDepartment == "维保部" { mItem.Index = "/lcm" mItem.Title = "仪器生命周期管理" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) } mItem.Index = "/nb" mItem.Title = "电池统计" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/nbs" mItem.Title = "电池信息查询" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) } if userPositionLevel != 4 { mItem.Index = "/dev" mItem.Title = "设备资产管理" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) } resp.MenuData = append(resp.MenuData, menu) } if userPositionLevel == 0 || userPositionLevel == 1 || userPositionLevel == 4 { menu.Title = "温度统计管理" menu.Index = "6" //menu.Class = "el-icon-menu" //menu.Class = "temperature" menu.SvgData.First = "M511.9 63.9C264.8 63.9 63.7 265 63.7 512.2s201 448.2 448.2 448.2 448.2-201.1 448.2-448.2-201-448.3-448.2-448.3z m0 836.7c-214.2 0-388.4-174.2-388.4-388.4s174.3-388.4 388.4-388.4S900.4 298 900.4 512.2 726.1 900.6 511.9 900.6z" menu.SvgData.Second = "M359.9 321.2c-42.3 0-76.5 31.7-76.5 76.5 0 44.7 34.1 76.5 76.5 76.5 41.8 0 76-31.7 76-76.5s-34.1-76.5-76-76.5z m0 117.8c-22.6 0-38-16.8-38-41.4 0-24 15.4-41.4 38-41.4s38 17.3 38 41.4c0 24.6-15.4 41.4-38 41.4zM629.3 641c-56.3 0-92.8-46.6-92.8-124.1 0-76 39.9-122.2 94.7-122.2 26.5 0 45.7 10.1 63.5 27.9l39.4-44.3c-23.1-24-59.6-45.7-103.9-45.7-91.9 0-166.9 68.8-166.9 187.1 0 118.8 72.6 183.2 165 183.2 44.7 0 82.7-17.8 112-52.4l-39.9-43.3C681.7 627.6 660 641 629.3 641z" menu.Key = menu.Index menu.Items = []menuItem{} mItem.Index = "/ts" mItem.Title = "仪器温度区间统计" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) resp.MenuData = append(resp.MenuData, menu) } /*menu.Title = "系统管理" menu.Index = "7" menu.SvgData.First = "M511.7 705.7c26.7 0 51.9-5.1 75.7-15.2 23.7-10.1 44.3-24.1 61.9-41.9 17.5-17.9 31.2-38.4 41.4-61.9 10-23.5 15.1-48.6 15.1-75.4 0-26.8-5.1-51.9-15.1-75.3-10.1-23.5-23.9-44-41.4-61.5s-38.1-31.3-61.9-41.4c-23.7-10.1-49-15.2-75.7-15.2-26.7 0-51.8 5-75.2 15.2-23.5 10.1-44 23.9-61.4 41.5-17.5 17.5-31.3 38.1-41.4 61.5-10 23.4-15.1 48.5-15.1 75.3 0 26.8 5.1 51.9 15.1 75.4 10.1 23.4 23.9 44.1 41.4 61.9 17.5 17.9 37.9 31.8 61.4 41.9 23.3 10 48.4 15.1 75.2 15.1z m413.7-80.2c1.1 7.1 0.8 15.7-0.9 25.8-1.8 10.1-4.7 20.4-8.9 30.7s-9.2 19.7-15.1 28.1c-5.9 8.3-12.4 14.3-19.6 17.9-7.1 3.6-13.4 5.4-18.6 5.4-5.4 0-11.3-1.1-17.8-3.5-5.9-1.8-13.4-3.3-22.3-4.9-8.9-1.5-18-1.9-27.2-0.9-9.2 0.8-18.4 2.8-27.5 5.7-9.2 3-17.1 8.1-23.6 15.2-14.2 14.9-22.5 31.8-24.9 50.7-2.3 19 0.3 37.1 8 54.4 5.9 11.9 5.1 23.8-2.6 35.7-3.6 4.7-9.3 9.7-17 14.6-7.7 5.1-16.2 9.7-25.3 13.9-9.2 4.2-18.8 7.5-28.9 9.8-10.1 2.4-19 3.5-26.7 3.5-5.4 0-10.4-2-15.1-6.2-4.7-4.2-7.9-8.6-9.7-13.4h-0.8c-6.5-18.4-17.7-34.3-33.4-47.7-15.8-13.4-33.9-20.1-54.7-20.1-20.2 0-38.4 6.7-54.7 20.1-16.3 13.4-27.7 29-34.3 46.8-3 7.1-7.4 12.3-13.4 15.6-5.9 3.2-12.4 4.9-19.6 4.9-8.3 0-17.6-1.5-28-4.4-10.4-3.1-20.8-6.7-31.2-11.1-10.4-4.4-19.8-9.6-28.1-15.6-8.3-5.9-14.5-11.9-18.6-17.9-3-4.2-4.6-9-4.9-14.6-0.3-5.6 1.9-13.5 6.7-23.6 6.5-13.7 9.1-29.3 7.6-46.8-1.5-17.5-9.1-33.7-22.7-48.6-8.3-8.9-18.4-14.6-30.2-17.4-11.9-2.7-23.2-3.7-33.8-3.1-12.4 0.6-25.2 3-38.2 7.1-8.3 2.3-16.6 1.7-24.9-1.9-6.5-2.4-12.6-7.9-18.3-16.5-5.7-8.6-10.7-18.1-15.1-28.5-4.5-10.4-7.9-21.1-10.3-32.1-2.4-11-3-20-1.8-27.1 1.9-13.1 7.8-21.4 17.9-25 17.8-7.1 33.8-18.8 48-35.2 14.3-16.3 21.4-34.6 21.4-54.8 0-20.8-7.1-38.9-21.4-54.4-14.3-15.4-30.2-26.7-48-33.8-5.4-1.8-9.8-6.1-13.4-13-3.5-6.9-5.4-13.9-5.4-20.9 0-7.7 1.2-16.3 3.6-25.8 2.4-9.5 5.5-18.7 9.4-27.7 3.8-8.9 8.3-17 13.4-24.5 5-7.4 10.5-12.9 16.5-16.5 4.7-3 9.4-4.2 13.8-3.5 4.4 0.6 9.4 1.8 14.7 3.5 17.8 7.1 36.3 9.4 55.6 6.7 19.3-2.7 36.3-11.1 51.2-25.4 7.1-7.1 12.3-15.8 15.6-26.3 3.2-10.4 5.4-20.7 6.2-30.7 0.8-10.1 0.8-19.3 0-27.6-0.9-8.3-1.6-14.3-2.2-17.9-1.2-3.6-2.2-7.7-3.2-12.5-0.8-4.7-0.4-8.9 1.4-12.4 3.5-8.3 9.9-15.6 19.1-21.9 9.2-6.2 19.1-11.4 29.9-15.6 10.8-4.2 21-7.3 31.2-9.4 10-2 18.1-3.1 24-3.1 7.7 0 13.8 2.5 18.3 7.6s7.6 10.3 9.4 15.6c6.5 16 17.2 30.2 32.1 42.3 14.8 12.1 32.4 18.2 52.5 18.2 20.8 0 39.1-5.8 55.2-17.4 16-11.6 27.3-26.3 33.8-44.2 2.4-4.7 6.1-9.6 11.2-14.7 5-5 10.2-7.6 15.5-7.6 8.3 0 17.4 1.2 27.2 3.5 9.7 2.4 19.4 5.6 28.9 9.8 9.5 4.2 18.3 9.4 26.2 16s14.4 13.7 19.1 21.4c3 4.7 3.9 9.9 2.7 15.6-1.1 5.6-2.4 9.7-3.6 12-7.7 17.2-10 35.4-7 54.4 3 19.1 11.6 35.7 25.8 49.9 14.3 14.3 31.7 22.1 52.5 23.6s40.1-1.9 57.9-10.3c4.7-3 10.5-4.2 17.3-3.5 6.9 0.6 12.6 3.2 17.3 8 8.9 8.3 16.7 20.9 23.6 37.9 6.9 16.9 11.4 34 13.8 51.2 1.1 10.1-0.5 18-4.9 23.6-4.5 5.6-9.1 9.4-13.8 11.1-18.4 6.6-34.1 18-47.2 34.3-13.4 16.9-19.9 35.4-19.9 56.2 0 20.3 5.5 37.9 16.4 53.1 10.9 15.2 25.4 26 43.2 32.5 4.2 2.4 7.7 4.8 10.7 7.1 6.2 5.3 10.6 12.2 12.9 20.5z" menu.SvgData.Second = "" menu.Key = menu.Index menu.Items = []menuItem{} mItem.Index = "/ps" mItem.Title = "显示设置" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) resp.MenuData = append(resp.MenuData, menu) */ //if userInfo.Userrole == "系统管理员" || userInfo.Userrole == "授权管理员" { if userPositionLevel == 0 || userPositionLevel == 2 { menu.Title = "仪器授权管理" menu.Index = "2" //menu.Class = "el-icon-lock" menu.SvgData.First = "M821.396 110.344H202.188c-68.398 0-123.85 55.452-123.85 123.843v464.41c0 68.391 55.452 123.843 123.85 123.843h619.208c68.397 0 123.843-55.452 123.843-123.843v-464.41c-0.001-68.391-55.446-123.843-123.843-123.843z m61.917 588.253c0 34.133-27.78 61.92-61.918 61.92H202.188c-34.136 0-61.925-27.787-61.925-61.92v-464.41c0-34.136 27.789-61.921 61.925-61.921h619.208c34.138 0 61.918 27.786 61.918 61.921v464.41zM728.519 853.401H295.064c-17.109 0-30.959 13.845-30.959 30.959 0 17.111 13.85 30.959 30.959 30.959h433.454c17.111 0 30.959-13.848 30.959-30.959 0.001-17.114-13.847-30.959-30.958-30.959z" menu.SvgData.Second = "M687.035 297.407l-170.163-62.314a14.71 14.71 0 0 0-10.161 0l-170.163 62.314c-6.284 2.299-10.525 8.618-10.525 15.725v192.325c4.781 112.866 173.074 182.014 180.205 184.914a14.86 14.86 0 0 0 5.563 1.091c1.877 0 3.751-0.362 5.564-1.091 7.131-2.9 175.419-72.048 180.204-185.67v-191.57c0.001-7.107-4.241-13.425-10.524-15.724z m-45.446 121.001L510.217 549.75c-6.047 6.046-13.968 9.073-21.89 9.073s-15.843-3.027-21.89-9.073l-87.559-87.562c-12.099-12.093-12.099-31.715 0-43.78 12.093-12.092 31.681-12.092 43.779 0l65.669 65.669 109.483-109.48c12.064-12.096 31.688-12.096 43.778 0 12.096 12.096 12.096 31.719 0.002 43.811z" menu.Key = menu.Index menu.Items = []menuItem{} mItem.Index = "/auth" mItem.Title = "仪器授权" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/authll" mItem.Title = "仪器历史经纬" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) resp.MenuData = append(resp.MenuData, menu) } //if userInfo.Userrole == "系统管理员" { if userPositionLevel == 0 { menu.Title = "用户管理" menu.Index = "3" //menu.Class = "el-icon-user" menu.SvgData.First = "M955.456 765.12a41.792 41.792 0 0 0-34.368-32.64 8.256 8.256 0 0 1-6.08-3.904 8.256 8.256 0 0 1-0.384-7.104 41.856 41.856 0 0 0-11.136-45.696 165.76 165.76 0 0 0-60.096-34.56 41.728 41.728 0 0 0-45.056 13.12c-1.216 1.472-3.328 3.264-6.336 3.264s-5.12-1.728-6.336-3.264a41.6 41.6 0 0 0-45.056-13.184 166.4 166.4 0 0 0-60.224 34.624 41.728 41.728 0 0 0-11.136 45.632 8.064 8.064 0 0 1-0.384 7.104 8.256 8.256 0 0 1-6.08 3.904 41.728 41.728 0 0 0-34.304 32.64 166.72 166.72 0 0 0 0 68.928c3.584 16.96 17.28 29.952 34.432 32.64 1.92 0.32 4.544 1.216 6.08 3.904a8.256 8.256 0 0 1 0.384 7.104 41.6 41.6 0 0 0 11.136 45.696c17.344 15.616 37.568 27.2 60.096 34.56a41.728 41.728 0 0 0 45.056-13.056c1.216-1.472 3.328-3.264 6.336-3.264s5.12 1.728 6.336 3.264a41.728 41.728 0 0 0 45.056 13.12c22.528-7.296 42.688-18.88 59.968-34.432 12.8-11.52 17.216-29.696 11.136-45.76a8.192 8.192 0 0 1 0.384-7.168 8.256 8.256 0 0 1 6.08-3.904 41.728 41.728 0 0 0 34.496-32.64 166.144 166.144 0 0 0 0-68.928z m-40.832 60.288a49.92 49.92 0 0 0-35.904 24.256 49.92 49.92 0 0 0-3.264 42.752 123.584 123.584 0 0 1-44.992 25.792 49.92 49.92 0 0 0-38.528-18.432 49.664 49.664 0 0 0-38.528 18.432 125.44 125.44 0 0 1-45.056-25.856 49.728 49.728 0 0 0-39.04-66.944 123.712 123.712 0 0 1 0-51.776 49.92 49.92 0 0 0 35.648-24.256 49.92 49.92 0 0 0 3.328-42.624c12.928-11.648 28.224-20.416 45.12-25.92a49.92 49.92 0 0 0 38.528 18.432c15.68 0 29.44-7.296 38.592-18.432 16.896 5.504 32.128 14.272 45.056 25.856a49.728 49.728 0 0 0 39.04 66.944 122.624 122.624 0 0 1 0 51.776z" menu.SvgData.Second = "M791.936 736.96c-34.496 0-62.592 28.096-62.592 62.592s28.096 62.592 62.592 62.592 62.592-28.096 62.592-62.592-28.096-62.592-62.592-62.592z m0 83.456a20.864 20.864 0 1 1 0-41.728 20.864 20.864 0 0 1 0 41.728zM670.336 588.736c0.256 0.128 0.512 0.064 0.768 0.128l1.472 0.512 0.064-0.256a35.392 35.392 0 0 0 22.912-67.008l-0.384-0.064c-8.512-3.392-17.472-6.144-26.304-9.088a247.424 247.424 0 0 0 104.192-201.472 248.192 248.192 0 1 0-496.384 0c0 83.072 41.216 156.224 103.936 201.28-175.68 57.984-304.832 218.368-315.776 410.688 0 0.128 0.256 0.192 0.256 0.256a35.328 35.328 0 0 0 68.608 13.504c1.344-3.456 1.536-7.04 1.728-10.56l0.256-0.192a390.016 390.016 0 0 1 389.248-366.336c51.264 0 100.032 10.176 144.832 28.16 0.192 0.192 0.32 0.384 0.576 0.448zM347.648 311.424a177.28 177.28 0 1 1 354.56 0 177.28 177.28 0 0 1-354.56 0z" menu.Key = menu.Index menu.Items = []menuItem{} mItem.Index = "/user" mItem.Title = "用户信息" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/uh" mItem.Title = "用户操作记录" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) resp.MenuData = append(resp.MenuData, menu) } exit: jdata, _ := json.Marshal(resp) _, err = response.Write(jdata) if err != nil { logs.Error("getMenu:", err.Error()) } endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("getMenu recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getMenu_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getMenu recv req begin", time.Now().Format("2006-01-02 15:04:05")) var err error var req GetMenuReq var resp GetMenuResp var menu GetMenuRespData var mItem menuItem var userInfo GetUsersRespdata var userPositionLevel int reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) ifOnline := checkUserIfOnline(req.UserName) if !ifOnline { goto exit } userInfo, err = getUserInfo(req.UserName) if err != nil { goto exit } userPositionLevel = getUserLevel(userInfo.Userrole) if userPositionLevel < 0 || userPositionLevel > 4 { goto exit } menu.Title = "Logging Data" menu.Index = "1" //menu.Class = "el-icon-s-data" //menu.SvgData.First = "M992.256 960 960 960 960 576.192C960 540.032 931.072 512 895.424 512l-126.784 0C732.352 512 704 540.736 704 576.192L704 960l-64 0L640 64.448C640 28.736 611.072 0 575.424 0L448.576 0C412.352 0 384 28.864 384 64.448L384 960 320 960 320 319.744C320 284.48 291.072 256 255.424 256L128.576 256C92.352 256 64 284.544 64 319.744L64 960 31.744 960C14.464 960 0 974.336 0 992 0 1009.152 14.208 1024 31.744 1024l960.448 0C1009.536 1024 1024 1009.664 1024 992 1024 974.848 1009.792 960 992.256 960z" menu.SvgData.First = "M960 896H128v-64h832v64zM320 768H256V384h64v384z m256 0H512V192h64v576z m256 0h-64V512h64v256z" menu.Key = menu.Index mItem.Index = "/info" mItem.Title = "Real Time Data" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/history" mItem.Title = "Historical Data" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/wt" mItem.Title = "Type Of Logging Service" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/es" mItem.Title = "Engineering Information" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) resp.MenuData = append(resp.MenuData, menu) menu.Title = "Construction Management" menu.Index = "4" //menu.Class = "el-icon-menu" menu.SvgData.First = "M512 177c-193.3 0-350 156.7-350 350s156.7 350 350 350 350-156.7 350-350-156.7-350-350-350z m0 623.4c-150.8 0-273.4-122.7-273.4-273.4S361.2 253.6 512 253.6 785.4 376.2 785.4 527 662.8 800.4 512 800.4z" menu.SvgData.Second = "M680.7 536.9H527.9V357.6c0-15.1-12.3-27.3-27.4-27.3-15.1 0-27.3 12.2-27.3 27.3v230.2c0 15.1 12.2 27.4 27.3 27.4 3.5 0 6.8-0.7 9.8-1.9 0.8 0.1 1.6 0.3 2.5 0.3h167.8c21.1 0 38.3-17.1 38.3-38.3 0.1-21.2-17-38.4-38.2-38.4z" menu.Key = menu.Index menu.Items = []menuItem{} mItem.Index = "/mh" mItem.Title = "Works Schedule" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/mhs" mItem.Title = "Construction State" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) if userPositionLevel == 0 || userPositionLevel == 1 { mItem.Index = "/cmp" mItem.Title = "Construction Management Report" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/srr" mItem.Title = "Construction Record Report" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) } resp.MenuData = append(resp.MenuData, menu) if userPositionLevel == 0 || userPositionLevel == 1 || userPositionLevel == 4 { menu.Title = "Maintenance Management" menu.Index = "5" //menu.Class = "el-icon-menu" menu.SvgData.First = "M512 78.769231L157.538462 157.538462v590.76923l354.461538 196.923077 354.461538-196.923077V157.538462l-354.461538-78.769231z m259.938462 614.006154l-259.938462 144.541538-259.938462-144.541538V233.550769l259.938462-57.895384 259.938462 57.895384v459.224616z" menu.SvgData.Second = "M458.830769 405.267692l-0.787692-107.913846c-40.96 19.692308-68.923077 61.833846-68.529231 110.670769 0.393846 34.264615 14.178462 65.378462 37.021539 87.827693 12.996923 12.996923 28.356923 23.236923 46.473846 29.538461V681.353846c0 10.24 6.301538 20.48 12.996923 27.175385s16.147692 11.027692 26.387692 11.027692c20.48 0 39.778462-18.116923 39.384616-38.203077l0.393846-153.206154c51.987692-14.178462 85.858462-61.833846 85.464615-118.547692-0.393846-34.264615-14.178462-65.378462-37.021538-87.827692-9.846154-9.846154-20.873846-17.723077-33.083077-24.024616l0.787692 107.913846-54.350769 31.113847-55.138462-31.507693z" menu.Key = menu.Index menu.Items = []menuItem{} mItem.Index = "/ms" mItem.Title = "MTBF" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/fr" mItem.Title = "Failure Rate Per 10,000m" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/mss" mItem.Title = "Instrument Maintenance" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) if userPositionLevel != 4 { if userPositionLevel == 0 || userInfo.UserDepartment == "维保部" { mItem.Index = "/lcm" mItem.Title = "Life Cycle Management" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) } mItem.Index = "/nb" mItem.Title = "Battery Record" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) /*mItem.Index = "/nbs" mItem.Title = "Battery Code Query" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem)*/ } if userPositionLevel != 4 { mItem.Index = "/tools" mItem.Title = "Instrument Fault Warning Report" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/dev" mItem.Title = "Equipment Asset Management Report" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) } resp.MenuData = append(resp.MenuData, menu) } if userPositionLevel == 0 || userPositionLevel == 1 || userPositionLevel == 4 { menu.Title = "Temperature Statistical" menu.Index = "6" //menu.Class = "el-icon-menu" //menu.Class = "temperature" menu.SvgData.First = "M511.9 63.9C264.8 63.9 63.7 265 63.7 512.2s201 448.2 448.2 448.2 448.2-201.1 448.2-448.2-201-448.3-448.2-448.3z m0 836.7c-214.2 0-388.4-174.2-388.4-388.4s174.3-388.4 388.4-388.4S900.4 298 900.4 512.2 726.1 900.6 511.9 900.6z" menu.SvgData.Second = "M359.9 321.2c-42.3 0-76.5 31.7-76.5 76.5 0 44.7 34.1 76.5 76.5 76.5 41.8 0 76-31.7 76-76.5s-34.1-76.5-76-76.5z m0 117.8c-22.6 0-38-16.8-38-41.4 0-24 15.4-41.4 38-41.4s38 17.3 38 41.4c0 24.6-15.4 41.4-38 41.4zM629.3 641c-56.3 0-92.8-46.6-92.8-124.1 0-76 39.9-122.2 94.7-122.2 26.5 0 45.7 10.1 63.5 27.9l39.4-44.3c-23.1-24-59.6-45.7-103.9-45.7-91.9 0-166.9 68.8-166.9 187.1 0 118.8 72.6 183.2 165 183.2 44.7 0 82.7-17.8 112-52.4l-39.9-43.3C681.7 627.6 660 641 629.3 641z" menu.Key = menu.Index menu.Items = []menuItem{} mItem.Index = "/ts" mItem.Title = "Instrument Usage Temperature" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) resp.MenuData = append(resp.MenuData, menu) } /*menu.Title = "System Management" menu.Index = "7" menu.SvgData.First = "M511.7 705.7c26.7 0 51.9-5.1 75.7-15.2 23.7-10.1 44.3-24.1 61.9-41.9 17.5-17.9 31.2-38.4 41.4-61.9 10-23.5 15.1-48.6 15.1-75.4 0-26.8-5.1-51.9-15.1-75.3-10.1-23.5-23.9-44-41.4-61.5s-38.1-31.3-61.9-41.4c-23.7-10.1-49-15.2-75.7-15.2-26.7 0-51.8 5-75.2 15.2-23.5 10.1-44 23.9-61.4 41.5-17.5 17.5-31.3 38.1-41.4 61.5-10 23.4-15.1 48.5-15.1 75.3 0 26.8 5.1 51.9 15.1 75.4 10.1 23.4 23.9 44.1 41.4 61.9 17.5 17.9 37.9 31.8 61.4 41.9 23.3 10 48.4 15.1 75.2 15.1z m413.7-80.2c1.1 7.1 0.8 15.7-0.9 25.8-1.8 10.1-4.7 20.4-8.9 30.7s-9.2 19.7-15.1 28.1c-5.9 8.3-12.4 14.3-19.6 17.9-7.1 3.6-13.4 5.4-18.6 5.4-5.4 0-11.3-1.1-17.8-3.5-5.9-1.8-13.4-3.3-22.3-4.9-8.9-1.5-18-1.9-27.2-0.9-9.2 0.8-18.4 2.8-27.5 5.7-9.2 3-17.1 8.1-23.6 15.2-14.2 14.9-22.5 31.8-24.9 50.7-2.3 19 0.3 37.1 8 54.4 5.9 11.9 5.1 23.8-2.6 35.7-3.6 4.7-9.3 9.7-17 14.6-7.7 5.1-16.2 9.7-25.3 13.9-9.2 4.2-18.8 7.5-28.9 9.8-10.1 2.4-19 3.5-26.7 3.5-5.4 0-10.4-2-15.1-6.2-4.7-4.2-7.9-8.6-9.7-13.4h-0.8c-6.5-18.4-17.7-34.3-33.4-47.7-15.8-13.4-33.9-20.1-54.7-20.1-20.2 0-38.4 6.7-54.7 20.1-16.3 13.4-27.7 29-34.3 46.8-3 7.1-7.4 12.3-13.4 15.6-5.9 3.2-12.4 4.9-19.6 4.9-8.3 0-17.6-1.5-28-4.4-10.4-3.1-20.8-6.7-31.2-11.1-10.4-4.4-19.8-9.6-28.1-15.6-8.3-5.9-14.5-11.9-18.6-17.9-3-4.2-4.6-9-4.9-14.6-0.3-5.6 1.9-13.5 6.7-23.6 6.5-13.7 9.1-29.3 7.6-46.8-1.5-17.5-9.1-33.7-22.7-48.6-8.3-8.9-18.4-14.6-30.2-17.4-11.9-2.7-23.2-3.7-33.8-3.1-12.4 0.6-25.2 3-38.2 7.1-8.3 2.3-16.6 1.7-24.9-1.9-6.5-2.4-12.6-7.9-18.3-16.5-5.7-8.6-10.7-18.1-15.1-28.5-4.5-10.4-7.9-21.1-10.3-32.1-2.4-11-3-20-1.8-27.1 1.9-13.1 7.8-21.4 17.9-25 17.8-7.1 33.8-18.8 48-35.2 14.3-16.3 21.4-34.6 21.4-54.8 0-20.8-7.1-38.9-21.4-54.4-14.3-15.4-30.2-26.7-48-33.8-5.4-1.8-9.8-6.1-13.4-13-3.5-6.9-5.4-13.9-5.4-20.9 0-7.7 1.2-16.3 3.6-25.8 2.4-9.5 5.5-18.7 9.4-27.7 3.8-8.9 8.3-17 13.4-24.5 5-7.4 10.5-12.9 16.5-16.5 4.7-3 9.4-4.2 13.8-3.5 4.4 0.6 9.4 1.8 14.7 3.5 17.8 7.1 36.3 9.4 55.6 6.7 19.3-2.7 36.3-11.1 51.2-25.4 7.1-7.1 12.3-15.8 15.6-26.3 3.2-10.4 5.4-20.7 6.2-30.7 0.8-10.1 0.8-19.3 0-27.6-0.9-8.3-1.6-14.3-2.2-17.9-1.2-3.6-2.2-7.7-3.2-12.5-0.8-4.7-0.4-8.9 1.4-12.4 3.5-8.3 9.9-15.6 19.1-21.9 9.2-6.2 19.1-11.4 29.9-15.6 10.8-4.2 21-7.3 31.2-9.4 10-2 18.1-3.1 24-3.1 7.7 0 13.8 2.5 18.3 7.6s7.6 10.3 9.4 15.6c6.5 16 17.2 30.2 32.1 42.3 14.8 12.1 32.4 18.2 52.5 18.2 20.8 0 39.1-5.8 55.2-17.4 16-11.6 27.3-26.3 33.8-44.2 2.4-4.7 6.1-9.6 11.2-14.7 5-5 10.2-7.6 15.5-7.6 8.3 0 17.4 1.2 27.2 3.5 9.7 2.4 19.4 5.6 28.9 9.8 9.5 4.2 18.3 9.4 26.2 16s14.4 13.7 19.1 21.4c3 4.7 3.9 9.9 2.7 15.6-1.1 5.6-2.4 9.7-3.6 12-7.7 17.2-10 35.4-7 54.4 3 19.1 11.6 35.7 25.8 49.9 14.3 14.3 31.7 22.1 52.5 23.6s40.1-1.9 57.9-10.3c4.7-3 10.5-4.2 17.3-3.5 6.9 0.6 12.6 3.2 17.3 8 8.9 8.3 16.7 20.9 23.6 37.9 6.9 16.9 11.4 34 13.8 51.2 1.1 10.1-0.5 18-4.9 23.6-4.5 5.6-9.1 9.4-13.8 11.1-18.4 6.6-34.1 18-47.2 34.3-13.4 16.9-19.9 35.4-19.9 56.2 0 20.3 5.5 37.9 16.4 53.1 10.9 15.2 25.4 26 43.2 32.5 4.2 2.4 7.7 4.8 10.7 7.1 6.2 5.3 10.6 12.2 12.9 20.5z" menu.SvgData.Second = "" menu.Key = menu.Index menu.Items = []menuItem{} mItem.Index = "/ps" mItem.Title = "Display Settings" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) resp.MenuData = append(resp.MenuData, menu) */ //if userInfo.Userrole == "系统管理员" || userInfo.Userrole == "授权管理员" { if userPositionLevel == 0 || userPositionLevel == 2 { menu.Title = "Authorization Management" menu.Index = "2" //menu.Class = "el-icon-lock" menu.SvgData.First = "M821.396 110.344H202.188c-68.398 0-123.85 55.452-123.85 123.843v464.41c0 68.391 55.452 123.843 123.85 123.843h619.208c68.397 0 123.843-55.452 123.843-123.843v-464.41c-0.001-68.391-55.446-123.843-123.843-123.843z m61.917 588.253c0 34.133-27.78 61.92-61.918 61.92H202.188c-34.136 0-61.925-27.787-61.925-61.92v-464.41c0-34.136 27.789-61.921 61.925-61.921h619.208c34.138 0 61.918 27.786 61.918 61.921v464.41zM728.519 853.401H295.064c-17.109 0-30.959 13.845-30.959 30.959 0 17.111 13.85 30.959 30.959 30.959h433.454c17.111 0 30.959-13.848 30.959-30.959 0.001-17.114-13.847-30.959-30.958-30.959z" menu.SvgData.Second = "M687.035 297.407l-170.163-62.314a14.71 14.71 0 0 0-10.161 0l-170.163 62.314c-6.284 2.299-10.525 8.618-10.525 15.725v192.325c4.781 112.866 173.074 182.014 180.205 184.914a14.86 14.86 0 0 0 5.563 1.091c1.877 0 3.751-0.362 5.564-1.091 7.131-2.9 175.419-72.048 180.204-185.67v-191.57c0.001-7.107-4.241-13.425-10.524-15.724z m-45.446 121.001L510.217 549.75c-6.047 6.046-13.968 9.073-21.89 9.073s-15.843-3.027-21.89-9.073l-87.559-87.562c-12.099-12.093-12.099-31.715 0-43.78 12.093-12.092 31.681-12.092 43.779 0l65.669 65.669 109.483-109.48c12.064-12.096 31.688-12.096 43.778 0 12.096 12.096 12.096 31.719 0.002 43.811z" menu.Key = menu.Index menu.Items = []menuItem{} mItem.Index = "/auth" mItem.Title = "Instrument Authorization" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/authll" mItem.Title = "Instrument Historical Use Of Long And Lat" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) resp.MenuData = append(resp.MenuData, menu) } //if userInfo.Userrole == "系统管理员" { if userPositionLevel == 0 { menu.Title = "User Management" menu.Index = "3" //menu.Class = "el-icon-user" menu.SvgData.First = "M955.456 765.12a41.792 41.792 0 0 0-34.368-32.64 8.256 8.256 0 0 1-6.08-3.904 8.256 8.256 0 0 1-0.384-7.104 41.856 41.856 0 0 0-11.136-45.696 165.76 165.76 0 0 0-60.096-34.56 41.728 41.728 0 0 0-45.056 13.12c-1.216 1.472-3.328 3.264-6.336 3.264s-5.12-1.728-6.336-3.264a41.6 41.6 0 0 0-45.056-13.184 166.4 166.4 0 0 0-60.224 34.624 41.728 41.728 0 0 0-11.136 45.632 8.064 8.064 0 0 1-0.384 7.104 8.256 8.256 0 0 1-6.08 3.904 41.728 41.728 0 0 0-34.304 32.64 166.72 166.72 0 0 0 0 68.928c3.584 16.96 17.28 29.952 34.432 32.64 1.92 0.32 4.544 1.216 6.08 3.904a8.256 8.256 0 0 1 0.384 7.104 41.6 41.6 0 0 0 11.136 45.696c17.344 15.616 37.568 27.2 60.096 34.56a41.728 41.728 0 0 0 45.056-13.056c1.216-1.472 3.328-3.264 6.336-3.264s5.12 1.728 6.336 3.264a41.728 41.728 0 0 0 45.056 13.12c22.528-7.296 42.688-18.88 59.968-34.432 12.8-11.52 17.216-29.696 11.136-45.76a8.192 8.192 0 0 1 0.384-7.168 8.256 8.256 0 0 1 6.08-3.904 41.728 41.728 0 0 0 34.496-32.64 166.144 166.144 0 0 0 0-68.928z m-40.832 60.288a49.92 49.92 0 0 0-35.904 24.256 49.92 49.92 0 0 0-3.264 42.752 123.584 123.584 0 0 1-44.992 25.792 49.92 49.92 0 0 0-38.528-18.432 49.664 49.664 0 0 0-38.528 18.432 125.44 125.44 0 0 1-45.056-25.856 49.728 49.728 0 0 0-39.04-66.944 123.712 123.712 0 0 1 0-51.776 49.92 49.92 0 0 0 35.648-24.256 49.92 49.92 0 0 0 3.328-42.624c12.928-11.648 28.224-20.416 45.12-25.92a49.92 49.92 0 0 0 38.528 18.432c15.68 0 29.44-7.296 38.592-18.432 16.896 5.504 32.128 14.272 45.056 25.856a49.728 49.728 0 0 0 39.04 66.944 122.624 122.624 0 0 1 0 51.776z" menu.SvgData.Second = "M791.936 736.96c-34.496 0-62.592 28.096-62.592 62.592s28.096 62.592 62.592 62.592 62.592-28.096 62.592-62.592-28.096-62.592-62.592-62.592z m0 83.456a20.864 20.864 0 1 1 0-41.728 20.864 20.864 0 0 1 0 41.728zM670.336 588.736c0.256 0.128 0.512 0.064 0.768 0.128l1.472 0.512 0.064-0.256a35.392 35.392 0 0 0 22.912-67.008l-0.384-0.064c-8.512-3.392-17.472-6.144-26.304-9.088a247.424 247.424 0 0 0 104.192-201.472 248.192 248.192 0 1 0-496.384 0c0 83.072 41.216 156.224 103.936 201.28-175.68 57.984-304.832 218.368-315.776 410.688 0 0.128 0.256 0.192 0.256 0.256a35.328 35.328 0 0 0 68.608 13.504c1.344-3.456 1.536-7.04 1.728-10.56l0.256-0.192a390.016 390.016 0 0 1 389.248-366.336c51.264 0 100.032 10.176 144.832 28.16 0.192 0.192 0.32 0.384 0.576 0.448zM347.648 311.424a177.28 177.28 0 1 1 354.56 0 177.28 177.28 0 0 1-354.56 0z" menu.Key = menu.Index menu.Items = []menuItem{} mItem.Index = "/user" mItem.Title = "User Information" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) mItem.Index = "/uh" mItem.Title = "Operation Records" mItem.Key = mItem.Index menu.Items = append(menu.Items, mItem) resp.MenuData = append(resp.MenuData, menu) } exit: jdata, _ := json.Marshal(resp) _, err = response.Write(jdata) if err != nil { logs.Error("getMenu:", err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getMenu recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func checkFileExpired() { t := time.NewTicker(time.Minute * 3) for { select { case <-t.C: modelePath, err := ModulePath.GetModuleCurrentPath() if err != nil { fmt.Println("GetModuleCurrentPath() failed err:", err.Error()) return } fileInfoList, err := ioutil.ReadDir(modelePath + "/authfile") if err != nil { fmt.Println("ioutil.ReadDir err:", err.Error()) } for i := range fileInfoList { index := strings.Index(fileInfoList[i].Name(), ".") filename := fileInfoList[i].Name()[:index] //filename := strings.TrimSuffix(fileInfoList[i].Name(), ".auf") //fmt.Println(filename) //打印当前文件或目录下的文件或目录名 t, err := strconv.ParseInt(filename, 10, 64) if err == nil { t = t / 1e9 if time.Now().Unix()-t > 60 { os.Remove(modelePath + "/authfile/" + fileInfoList[i].Name()) } } else { //logs.Error("checkFileExpired err:", err.Error()) } } default: time.Sleep(time.Minute * 1) } } } // func getDeesAuthDb(response http.ResponseWriter, request *http.Request) { // beginTime := time.Now().UnixNano() // logs.Info("开始处理授权数据库请求", time.Now().Format("2006-01-02 15:04:05")) // var req []getDeesAuthDbReq // reqdata, err := ioutil.ReadAll(request.Body) // if err != nil { // logs.Info("读取请求体失败:", err.Error()) // http.Error(response, "请求体读取错误", http.StatusBadRequest) // return // } // logs.Info("接收到的请求数据:", string(reqdata)) // err = json.Unmarshal(reqdata, &req) // if err != nil { // logs.Info("JSON解析失败:", err.Error()) // http.Error(response, "JSON解析错误", http.StatusBadRequest) // return // } // var authTime []GetDeesAuthResp // logs.Info(fmt.Sprintf("共收到%d个授权查询请求", len(req))) // // 查询过期时间 // for i := 0; i < len(req); i++ { // sqlstr := fmt.Sprintf("select [6500],[6501],[6502],[6503],[6504],[6505],[6506],[6507],[6508],[6509],[6510] from AUTHINFO where [6500]='%s' and [6501]='%s'", // req[i].Series, req[i].InstrumentID) // logs.Info("执行SQL查询:", sqlstr) // row, err := sqlConn.Query(sqlstr) // if err != nil { // logs.Info("数据库查询错误", err.Error()) // http.Error(response, "数据库查询错误", http.StatusInternalServerError) // return // } // var d GetDeesAuthResp // for row.Next() { // if err := row.Scan(&d.Series, &d.InstrumentID, &d.Auth_date, &d.Expire_date, &d.Area_code, &d.Country, // &d.Longitude, &d.Latitude, &d.Auth_count, &d.Auth_Mark, &d.Authorizer); err == nil { // // 格式化日期时间 // d.Auth_date = d.Auth_date[:10] + " " + d.Auth_date[11:19] // d.Expire_date = d.Expire_date[:10] + " " + d.Expire_date[11:19] // authTime = append(authTime, d) // logs.Info(fmt.Sprintf("找到授权记录 - 系列号: %s, 设备ID: %s", d.Series, d.InstrumentID)) // } else { // logs.Info("数据行扫描错误", err.Error()) // } // } // row.Close() // } // if len(authTime) == 0 { // logs.Info("没有找到任何授权记录") // http.Error(response, "未找到授权记录", http.StatusNotFound) // return // } // // 保存授权文件 // filename := fmt.Sprintf("./authfile/%v.auf", beginTime) // logs.Info("创建授权文件:", filename) // db, err := sql.Open("sqlite3", filename) // if err != nil { // logs.Info("打开SQLite数据库失败:", err.Error()) // http.Error(response, "数据库创建失败", http.StatusInternalServerError) // return // } // defer db.Close() // _, err = db.Exec("CREATE TABLE `AUTHINFO` (`Series` TEXT,`InstrumentID` TEXT,`AUTH_DATE` TEXT,`EXP_DATE` TEXT,`LONG` TEXT,`LAT` TEXT,`FUNCODE` TEXT);") // if err != nil { // logs.Info("创建表失败:", err.Error()) // } // // 加密并插入数据 // key := []byte("&#%*#") // ksize := len(key) // logs.Info(fmt.Sprintf("开始加密并存储%d条授权记录", len(authTime))) // for i := 0; i < len(authTime); i++ { // // 加密各个字段 // encryptField := func(original, series, instrumentID string) string { // data := fmt.Sprintf(`%s@@%s@@%s`, series, instrumentID, original) // edata := []byte(data) // for i := 0; i < len(edata); i++ { // edata[i] = edata[i] ^ key[i%ksize] // } // return string(edata) // } // authTime[i].Expire_date = encryptField(authTime[i].Expire_date, authTime[i].Series, authTime[i].InstrumentID) // authTime[i].Longitude = encryptField(authTime[i].Longitude, authTime[i].Series, authTime[i].InstrumentID) // authTime[i].Latitude = encryptField(authTime[i].Latitude, authTime[i].Series, authTime[i].InstrumentID) // authTime[i].Auth_Mark = encryptField(authTime[i].Auth_Mark, authTime[i].Series, authTime[i].InstrumentID) // // 加密单独字段 // encryptSingle := func(original string) string { // edata := []byte(original) // for i := 0; i < len(edata); i++ { // edata[i] = edata[i] ^ key[i%ksize] // } // return string(edata) // } // authTime[i].Series = encryptSingle(authTime[i].Series) // authTime[i].InstrumentID = encryptSingle(authTime[i].InstrumentID) // authTime[i].Auth_date = encryptSingle(authTime[i].Auth_date) // // 插入数据 // stmt, err := db.Prepare("INSERT INTO AUTHINFO(Series, InstrumentID, AUTH_DATE, EXP_DATE, LONG, LAT, FUNCODE) values(?,?,?,?,?,?,?)") // if err != nil { // logs.Info("准备SQL语句失败:", err.Error()) // continue // } // _, err = stmt.Exec(authTime[i].Series, authTime[i].InstrumentID, authTime[i].Auth_date, // authTime[i].Expire_date, authTime[i].Longitude, authTime[i].Latitude, authTime[i].Auth_Mark) // if err != nil { // logs.Info("执行SQL插入失败:", err.Error()) // } else { // logs.Info(fmt.Sprintf("成功插入记录 - 序号: %d", i+1)) // } // stmt.Close() // } // // 返回响应 // var resp getDeesAuthDbResp // resp.FileId = strconv.FormatInt(beginTime, 10) // jresp, _ := json.Marshal(resp) // logs.Info("返回文件ID:", resp.FileId) // _, err = response.Write(jresp) // if err != nil { // logs.Info("写入响应失败:", err.Error()) // } // endTime := time.Now().UnixNano() // elapsedTime := (endTime - beginTime) / 1e6 // logs.Info(fmt.Sprintf("请求处理完成, 耗时: %v 毫秒", elapsedTime)) // } func getDeesAuthDb(response http.ResponseWriter, request *http.Request) { //response.Header().Set("content-type", "application/octet-stream") logs.Info("下载授权文件") beginTime := time.Now().UnixNano() fmt.Println("getDeesAuthDb recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req []getDeesAuthDbReq reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) var authTime []GetDeesAuthResp //sel expire time for i := 0; i < len(req); i++ { sqlstr := fmt.Sprintf("select [6500],[6501],[6502],[6503],[6504],[6505],[6506],[6507],[6508],[6509],[6510] from AUTHINFO where [6500]='%s' and [6501]='%s' ", req[i].Series, req[i].InstrumentID) fmt.Println(sqlstr) logs.Info("查询的授权sql:", sqlstr) row, err := sqlConn.Query(sqlstr) if err != nil { logs.Info("Query Error", err.Error()) return } var d GetDeesAuthResp for row.Next() { if err := row.Scan(&d.Series, &d.InstrumentID, &d.Auth_date, &d.Expire_date, &d.Area_code, &d.Country, &d.Longitude, &d.Latitude, &d.Auth_count, &d.Auth_Mark, &d.Authorizer); err == nil { d.Auth_date = d.Auth_date[:10] + " " + d.Auth_date[11:19] d.Expire_date = d.Expire_date[:10] + " " + d.Expire_date[11:19] authTime = append(authTime, d) } else { logs.Info("Query Error", err.Error()) } } row.Close() } //fmt.Println(authTime) //save auth file // filename := fmt.Sprintf("./authfile/%v.auf", beginTime) filename := fmt.Sprintf("D:\\deescloud\\deesCloudServer\\authfile\\%v.auf", beginTime) logs.Info("创建授权文件:", filename) db, err := sql.Open("sqlite3", filename) if err != nil { fmt.Println("open sqlite failed, err:", err.Error()) logs.Info("数据库创建失败", err.Error()) } defer db.Close() db.Exec("CREATE TABLE `AUTHINFO` (`Series` TEXT,`InstrumentID` TEXT,`AUTH_DATE` TEXT,`EXP_DATE` TEXT,`LONG` TEXT,`LAT` TEXT,`FUNCODE` TEXT);") for i := 0; i < len(authTime); i++ { logs.Info("开始加密--------------------") //加密 key := []byte("&#%*#") ksize := len(key) authExpireTime := fmt.Sprintf(`%s@@%s@@%s`, authTime[i].Series, authTime[i].InstrumentID, authTime[i].Expire_date) //fmt.Println(authExpireTime) var edata []byte = []byte(authExpireTime) for i := 0; i < len(edata); i++ { edata[i] = edata[i] ^ key[i%ksize] } authTime[i].Expire_date = string(edata) lon := fmt.Sprintf(`%s@@%s@@%s`, authTime[i].Series, authTime[i].InstrumentID, authTime[i].Longitude) edata = []byte(lon) for i := 0; i < len(edata); i++ { edata[i] = edata[i] ^ key[i%ksize] } authTime[i].Longitude = string(edata) lat := fmt.Sprintf(`%s@@%s@@%s`, authTime[i].Series, authTime[i].InstrumentID, authTime[i].Latitude) edata = []byte(lat) for i := 0; i < len(edata); i++ { edata[i] = edata[i] ^ key[i%ksize] } authTime[i].Latitude = string(edata) func_code := fmt.Sprintf(`%s@@%s@@%s`, authTime[i].Series, authTime[i].InstrumentID, authTime[i].Auth_Mark) edata = []byte(func_code) for i := 0; i < len(edata); i++ { edata[i] = edata[i] ^ key[i%ksize] } authTime[i].Auth_Mark = string(edata) edata = []byte(authTime[i].Series) for i := 0; i < len(edata); i++ { edata[i] = edata[i] ^ key[i%ksize] } authTime[i].Series = string(edata) edata = []byte(authTime[i].InstrumentID) for i := 0; i < len(edata); i++ { edata[i] = edata[i] ^ key[i%ksize] } authTime[i].InstrumentID = string(edata) edata = []byte(authTime[i].Auth_date) for i := 0; i < len(edata); i++ { edata[i] = edata[i] ^ key[i%ksize] } authTime[i].Auth_date = string(edata) //插入数据 stmt, err := db.Prepare("INSERT INTO AUTHINFO(Series, InstrumentID, AUTH_DATE,EXP_DATE,LONG,LAT,FUNCODE) values(?,?,?,?,?,?,?)") logs.Info("准备SQL语句:") if err != nil { logs.Info("准备SQL语句失败:", err.Error()) fmt.Println("insert sqlite failed, err:", err.Error()) } res, err := stmt.Exec(authTime[i].Series, authTime[i].InstrumentID, authTime[i].Auth_date, authTime[i].Expire_date, authTime[i].Longitude, authTime[i].Latitude, authTime[i].Auth_Mark) if err != nil { fmt.Println("exec sqlite failed, err:", err.Error()) } id, err := res.LastInsertId() if err != nil { fmt.Println("LastInsertId sqlite failed, err:", err.Error()) } fmt.Println(id) stmt.Close() } var resp getDeesAuthDbResp resp.FileId = strconv.FormatInt(beginTime, 10) logs.Info("返回文件ID:", resp.FileId) jresp, _ := json.Marshal(resp) _, err = response.Write(jresp) if err != nil { fmt.Println(err.Error()) } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getDeesAuthDb recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } // dees query interface func getDeesAuth(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getDeesAuth recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetDeesAuthReq json.Unmarshal(reqdata, &req) sql := fmt.Sprintf("select [6500],[6501],[6502],[6503],[6504],[6505],[6506],[6507],[6508],[6509],[6510] from AUTHINFO where [6500]='%s' and [6501]='%s' ", req.Series, req.InstrumentID) fmt.Println(sql) row, err := sqlConn.Query(sql) if err != nil { logs.Info("Query Error", err.Error()) return } defer row.Close() var d GetDeesAuthResp for row.Next() { if err := row.Scan(&d.Series, &d.InstrumentID, &d.Auth_date, &d.Expire_date, &d.Area_code, &d.Country, &d.Longitude, &d.Latitude, &d.Auth_count, &d.Auth_Mark, &d.Authorizer); err == nil { d.Auth_date = d.Auth_date[:10] + " " + d.Auth_date[11:19] d.Expire_date = d.Expire_date[:10] + " " + d.Expire_date[11:19] if d.Longitude == "0" { d.Longitude = "" } if d.Latitude == "0" { d.Latitude = "" } if d.Area_code == "0" { d.Area_code = "" } } else { logs.Info("Query Error", err.Error()) } } jdata, _ := json.Marshal(d) fmt.Fprintf(response, string(jdata)) fmt.Println(string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getDeesAuth recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func batchAuth(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("postAuth recv req begin", time.Now().Format("2006-01-02 15:04:05")) var opContent string var sqlstr string var resp CommonResp var err error reqdata, _ := ioutil.ReadAll(request.Body) fmt.Println(string(reqdata)) var req batchAuthReq json.Unmarshal(reqdata, &req) reqJson, _ := json.Marshal(req) fmt.Println(string(reqJson)) b := checkIsAuthUserOnline(req.OpUser, req.OpUserUuid) if !b { resp.Ret = -1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } for i := 0; i < len(req.Data); i++ { v := req.Data[i] authCnt, _ := strconv.Atoi(v.Auth_count) authCnt++ auth_date := time.Now().Format("2006-01-02 15:04:05") req.Auth_date = auth_date sqlstr = fmt.Sprintf(`UPDATE [AUTHINFO] SET [6502] = '%s',[6503] = '%s',[6508] = %d,[6510] = '%s',[6511] = '%s',[6512] = '%s' WHERE [6500] = '%s' and [6501] = '%s'`, auth_date, req.Expire_date, authCnt, req.Authorizer, req.Applicanter, req.Note, v.Series, v.InstrumentID) fmt.Println(sqlstr) _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Info("batchAuth Exec Error:", err.Error()) resp.Ret = -1 goto exit } } resp.Ret = 0 exit: if resp.Ret == 0 { for i := 0; i < len(req.Data); i++ { v := req.Data[i] opContent = fmt.Sprintf("修改授权信息:仪器系列号:%s, 编码:%s, 授权过期时间:%s", v.Series, v.InstrumentID, req.Expire_date) //opTime := time.Now().Format("2006-01-02 15:04:05") sqlstr := fmt.Sprintf(`INSERT INTO [user_op_history] ([username],[time],[op_type],[op_text]) VALUES ('%s','%s',%d,'%s')`, req.OpUser, req.Auth_date, 2, opContent) _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Error("postAuth insert user_op_history err:", err.Error()) } } go func(req_ batchAuthReq) { for i := 0; i < len(req_.Data); i++ { v := req_.Data[i] updateSql := fmt.Sprintf(`UPDATE [analysis_result_authorize] SET [auth_date] = '%s',[expire_date] = '%s',[authorizer] = '%s' WHERE [series] = '%s' and [instrument_id] = '%s'`, req_.Auth_date, req_.Expire_date, req_.Authorizer, v.Series, v.InstrumentID) _, err = sqlConn.Exec(updateSql) if err != nil { logs.Error("update authorize result to db err:", err.Error()) } } }(req) } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("postAuth recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func postAuth(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("postAuth recv req begin", time.Now().Format("2006-01-02 15:04:05")) var opContent string var sqlstr string var resp CommonResp var id int var authCnt int var err error reqdata, _ := ioutil.ReadAll(request.Body) var req PostAuthReq json.Unmarshal(reqdata, &req) b := checkIsAuthUserOnline(req.OpUser, req.OpUserUuid) if !b { resp.Ret = -1 jdata, _ := json.Marshal(resp) response.Write(jdata) return } id, _ = strconv.Atoi(req.ID) if (req.OperType == 2 || req.OperType == 3) && id == 0 { logs.Info("update authinfo req id ==0") resp.Ret = -1 goto exit } if req.OperType == 1 || req.OperType == 2 { if req.Series == "" && req.InstrumentID == "" { logs.Info("add or update authinfo req Series InstrumentID is null") resp.Ret = -1 goto exit } } //check series InstrumentID if req.OperType == 1 { sqlstr = fmt.Sprintf("select count(ID) from [AUTHINFO] where [6500]='%s' and [6501]='%s'", req.Series, req.InstrumentID) fmt.Println(sqlstr) rcnt, err := getRecordCount(sqlConn, sqlstr) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", sqlstr, err.Error())) resp.Ret = -1 goto exit } if rcnt > 0 { resp.Ret = 1 //exist same record goto exit } } else if req.OperType == 2 { sqlstr = fmt.Sprintf("select count(ID) from [AUTHINFO] where [6500]='%s' and [6501]='%s' and [ID] !=%s", req.Series, req.InstrumentID, req.ID) fmt.Println(sqlstr) rcnt, err := getRecordCount(sqlConn, sqlstr) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", sqlstr, err.Error())) resp.Ret = -1 goto exit } if rcnt > 0 { resp.Ret = 1 //exist same record goto exit } } if req.Area_code == "" { req.Area_code = "0" } if req.Longitude == "" { req.Longitude = "0" } if req.Latitude == "" { req.Latitude = "0" } if req.Auth_Mark == "" { req.Auth_Mark = "0" } authCnt, _ = strconv.Atoi(req.Auth_count) authCnt++ req.Auth_date = time.Now().Format("2006-01-02 15:04:05") if req.OperType == 1 { //add req.Expire_date = time.Now().Add(time.Hour * 24 * 366).Format("2006-01-02 15:04:05") opContent = fmt.Sprintf("新增授权信息:仪器系列号:%s, 编码:%s, 授权到期时间:%s", req.Series, req.InstrumentID, req.Expire_date) sqlstr = fmt.Sprintf(`INSERT INTO [AUTHINFO] ([6500],[6501],[6502],[6503],[6504],[6505],[6506],[6507],[6508],[6509],[6510],[6511],[6512]) VALUES ('%s','%s','%s','%s',%s,'%s','%s','%s',%d,'%s','%s','%s','%s')`, req.Series, req.InstrumentID, req.Auth_date, req.Expire_date, req.Area_code, req.Country, req.Longitude, req.Latitude, authCnt, req.Auth_Mark, req.Authorizer, req.Applicanter, req.Note) } else if req.OperType == 2 { //update opContent = fmt.Sprintf("修改授权信息:仪器系列号:%s, 编码:%s, 授权到期时间:%s", req.Series, req.InstrumentID, req.Expire_date) sqlstr = fmt.Sprintf(`UPDATE [AUTHINFO] SET [6500] = '%s',[6501] = '%s',[6502] = '%s',[6503] = '%s',[6504] = %s,[6505] = '%s',[6506] = '%s',[6507] = '%s',[6508] = %d,[6509] = '%s',[6510] = '%s',[6511] = '%s',[6512] = '%s' WHERE ID=%d`, req.Series, req.InstrumentID, req.Auth_date, req.Expire_date, req.Area_code, req.Country, req.Longitude, req.Latitude, authCnt, req.Auth_Mark, req.Authorizer, req.Applicanter, req.Note, id) } else if req.OperType == 3 { opContent = fmt.Sprintf("删除授权信息:仪器系列号:%s, 编码:%s, 授权到期时间:%s", req.Series, req.InstrumentID, req.Expire_date) sqlstr = fmt.Sprintf(`DELETE FROM [AUTHINFO] WHERE ID=%d`, id) } else { resp.Ret = -1 goto exit } fmt.Println(sqlstr) _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Info("postAuth Exec Error:", err.Error()) resp.Ret = -1 goto exit } resp.Ret = 0 exit: if resp.Ret == 0 { opTime := time.Now().Format("2006-01-02 15:04:05") sqlstr := fmt.Sprintf(`INSERT INTO [user_op_history] ([username],[time],[op_type],[op_text]) VALUES ('%s','%s',%d,'%s')`, req.OpUser, opTime, 2, opContent) _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Error("postAuth insert user_op_history err:", err.Error()) } go func(req_ PostAuthReq) { mark, _ := strconv.Atoi(req_.Auth_Mark) if req_.OperType == 1 { //add cntSql := fmt.Sprintf("SELECT top 1 [ID] FROM [analysis_result_authorize] order by ID desc") cnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error(fmt.Sprintf(`getRecordCount %s err %s`, cntSql, err.Error())) return } id := cnt + 1 insertSql := fmt.Sprintf(`INSERT INTO [analysis_result_authorize] ([ID],[series],[instrument_id],[auth_date],[expire_date],[longitude],[latitude],[auth_mark],[authorizer]) VALUES(%d,'%s','%s','%s','%s','%s','%s',%d,'%s')`, id, req_.Series, req_.InstrumentID, req_.Auth_date, req_.Expire_date, req_.Longitude, req_.Latitude, mark, req_.Authorizer) _, err = sqlConn.Exec(insertSql) if err != nil { logs.Error("insert authorize result to db err:", err.Error()) } } else if req_.OperType == 2 { //update updateSql := fmt.Sprintf(`UPDATE [analysis_result_authorize] SET [auth_date] = '%s',[expire_date] = '%s',[longitude] = '%s',[latitude] = '%s',[auth_mark] = %d,[authorizer] = '%s' WHERE [series] = '%s' and [instrument_id] = '%s'`, req_.Auth_date, req_.Expire_date, req_.Longitude, req_.Latitude, mark, req_.Authorizer, req_.Series, req_.InstrumentID) _, err = sqlConn.Exec(updateSql) if err != nil { logs.Error("update authorize result to db err:", err.Error()) } } else if req_.OperType == 3 { //del delSql := fmt.Sprintf(`DELETE FROM [analysis_result_authorize] WHERE [series] = '%s' and [instrument_id] = '%s' `, req_.Series, req_.InstrumentID) _, err = sqlConn.Exec(delSql) if err != nil { logs.Error("del authorize result to db err:", err.Error()) } } }(req) } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("postAuth recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getAuth(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getAuth recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req getAuthReq json.Unmarshal(reqdata, &req) b := checkIsAuthUserOnline(req.OpUser, req.OpUserUuid) if !b { var resp GetAuthResp jdata, _ := json.Marshal(resp) response.Write(jdata) return } var sql string var sqlCnt string = "select count(ID) from [AUTHINFO]" var sqlCntWhere string var ifWhere bool if req.Id != "" { likeStr := "%" + req.Id + "%" sqlCntWhere += fmt.Sprintf(" [6500] like '%s'", likeStr) ifWhere = true } if req.Iid != "" { likeStr := "%" + req.Iid + "%" if sqlCntWhere != "" { sqlCntWhere += fmt.Sprintf(" and [6501] like '%s'", likeStr) } else { sqlCntWhere += fmt.Sprintf(" [6501] like '%s'", likeStr) } ifWhere = true } if ifWhere { sqlCnt += " where" + sqlCntWhere } rcnt, err := getRecordCount(sqlConn, sqlCnt) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", sql, err.Error())) return } if !ifWhere { sql = fmt.Sprintf("select top %v [ID],[6500],[6501],[6502],[6503],[6504],[6505],[6506],[6507],[6508],[6509],[6510],ISNULL([6511],'') as [6511],ISNULL([6512],'') as [6512] from AUTHINFO where ID not in (select top %v ID from AUTHINFO order by [6502] desc) order by [6502] desc", req.Count, (req.Index-1)*req.Count) } else { sql = fmt.Sprintf("select top %v [ID],[6500],[6501],[6502],[6503],[6504],[6505],[6506],[6507],[6508],[6509],[6510],ISNULL([6511],'') as [6511],ISNULL([6512],'') as [6512] from AUTHINFO where %s and ID not in (select top %v ID from AUTHINFO where %s order by [6502] desc) order by [6502] desc", req.Count, sqlCntWhere, (req.Index-1)*req.Count, sqlCntWhere) } fmt.Println(sql) row, err := sqlConn.Query(sql) if err != nil { logs.Info("Query Error", err.Error()) return } defer row.Close() var resp GetAuthResp resp.Total = rcnt for row.Next() { var d GetAuthRespData //var Longitude float64 //var Latitude float64 if err := row.Scan(&d.ID, &d.Series, &d.InstrumentID, &d.Auth_date, &d.Expire_date, &d.Area_code, &d.Country, &d.Longitude, &d.Latitude, &d.Auth_count, &d.Auth_Mark, &d.Authorizer, &d.Applicanter, &d.Note); err == nil { //d.Longitude = strconv.FormatFloat(Longitude, 'G', 8, 32) //d.Latitude = strconv.FormatFloat(Latitude, 'G', 8, 32) //fmt.Println(Longitude, Latitude) //Longitude, _ = strconv.ParseFloat(d.Longitude, 64) //fmt.Println(Longitude) d.Auth_date = d.Auth_date[:10] + " " + d.Auth_date[11:19] d.Expire_date = d.Expire_date[:10] + " " + d.Expire_date[11:19] if d.Longitude == "0" { d.Longitude = "" } if d.Latitude == "0" { d.Latitude = "" } if d.Area_code == "0" { d.Area_code = "" } resp.Data = append(resp.Data, d) } else { logs.Info("Query Error", err.Error()) } } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) //fmt.Println(string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getAuth recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func checkIsAuthUserOnline(username string, op_uuid string) bool { deesUserStatMaplck.RLock() if v, ok := deesUserStatMap[username]; ok { deesUserStatMaplck.RUnlock() v.RLock() refreshTime := v.RefreshTime userrole := v.UserRole uuid := v.Uuid v.RUnlock() if int64(time.Since(refreshTime).Seconds()) > int64(refreshSpan+1) { return false } if userrole != "系统管理员" && userrole != "授权管理员" { return false } if op_uuid != uuid { return false } return true } else { deesUserStatMaplck.RUnlock() return false } } func checkIsSysUserOnline(username string, op_uuid string) bool { deesUserStatMaplck.RLock() if v, ok := deesUserStatMap[username]; ok { deesUserStatMaplck.RUnlock() v.RLock() refreshTime := v.RefreshTime userrole := v.UserRole uuid := v.Uuid v.RUnlock() if int64(time.Since(refreshTime).Seconds()) > int64(refreshSpan+1) { return false } if userrole != "系统管理员" { return false } if op_uuid != uuid { return false } return true } else { deesUserStatMaplck.RUnlock() return false } } // 判断用户是否在线 func checkUserIfOnline(username string) bool { deesUserStatMaplck.RLock() if v, ok := deesUserStatMap[username]; ok { deesUserStatMaplck.RUnlock() v.RLock() refreshTime := v.RefreshTime v.RUnlock() if int64(time.Since(refreshTime).Seconds()) > int64(refreshSpan+1) { return false } return true } else { deesUserStatMaplck.RUnlock() return false } } func getUuid() string { return uuid.NewV4().String() } func refreshUser(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("refreshUser recv req begin", time.Now().Format("2006-01-02 15:04:05")) var resp CommonResp reqdata, _ := ioutil.ReadAll(request.Body) var req RefreshUserReq json.Unmarshal(reqdata, &req) deesUserStatMaplck.RLock() if v, ok := deesUserStatMap[req.Username]; ok { deesUserStatMaplck.RUnlock() v.Lock() if v.Uuid == req.Uuid { if time.Now().Before(v.ExpireTime) { v.RefreshTime = time.Now() v.ExpireTime = time.Now().Add(ExpireTimeSpan) } else { resp.Ret = -1 } //fmt.Println(fmt.Sprintf("refreshTime:%v expiretime:%v", v.RefreshTime.Format("2006-01-02 15:04:05"), v.ExpireTime.Format("2006-01-02 15:04:05"))) v.Unlock() } else { v.Unlock() resp.Ret = -1 //fmt.Println("uuid:", v.Uuid) //fmt.Println("req.uuid", req.Uuid) } } else { deesUserStatMaplck.RUnlock() resp.Ret = -1 } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("refreshUser recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func LoginOut(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("LoginOut recv req begin", time.Now().Format("2006-01-02 15:04:05")) var resp CommonResp reqdata, _ := ioutil.ReadAll(request.Body) var req LoginOutReq json.Unmarshal(reqdata, &req) /* deesUserStatMaplck.Lock() if _, ok := deesUserStatMap[req.Username]; ok { delete(deesUserStatMap, req.Username) } deesUserStatMaplck.Unlock() */ resp.Ret = 0 jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("LoginOut recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func Login(response http.ResponseWriter, request *http.Request) { fmt.Println("登录接口----------------") beginTime := time.Now().UnixNano() logs.Info("Login recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req LoginReq var resp LoginResp var err error var uuid string reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) if req.Username == "" || req.Password == "" { resp.Ret = -1 jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) return } if t, ok := Overdue_account[req.Username]; ok { //fmt.Println(t) Overdue_t := convert_2_time(t) //fmt.Println(Overdue_t, time.Now()) if time.Now().Sub(Overdue_t).Seconds() > 0 { resp.Ret = 2 resp.Err_text = "用户时间已到期,请联系管理员。" jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) return } } userinfo, err := getUserInfo(req.Username) //fmt.Println(userinfo) if err != nil { resp.Ret = -1 logs.Error("login::getUserInfo err:", err.Error()) goto exit } if userinfo.Userid == 0 { resp.Ret = -1 jdata, _ := json.Marshal(req) logs.Error(fmt.Sprintf("无该用户信息:%s", string(jdata))) goto exit } deesUserStatMaplck.RLock() if v, ok := deesUserStatMap[req.Username]; ok { deesUserStatMaplck.RUnlock() v.RLock() uuid = v.Uuid if time.Now().Before(v.ExpireTime) { refreshTime := v.RefreshTime v.RUnlock() if int64(time.Since(refreshTime).Seconds()) <= refreshSpan { if userinfo.Userrole != "访客" { resp.Ret = 1 goto exit } else { goto checkPassword } } //online user nojust refresh //... } else { v.RUnlock() } uuid = getUuid() } else { deesUserStatMaplck.RUnlock() uuid = getUuid() } checkPassword: if req.Password != userinfo.Password { resp.Ret = -1 goto exit } exit: if resp.Ret == 0 { resp.Level = getUserLevel(userinfo.Userrole) if userinfo.UserDepartment == "维保部" || userinfo.UserDepartment == "维保事业部" { resp.DID = 1 } //refresh user state var v DeesUserStat v.Username = req.Username v.RefreshTime = time.Now() v.ExpireTime = time.Now().Add(ExpireTimeSpan) v.Uuid = uuid v.UserRole = userinfo.Userrole resp.Uuid = uuid deesUserStatMaplck.Lock() deesUserStatMap[req.Username] = &v deesUserStatMaplck.Unlock() if userinfo.Userrole != "访客" { loginTime := time.Now().Format("2006-01-02 15:04:05") cnt := userinfo.Cnt + 1 sqlstr := fmt.Sprintf(`UPDATE [userinfo] SET [cnt] =%d,[login_time]='%s' WHERE username = '%s'`, cnt, loginTime, userinfo.Username) _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Error("update userinfo cnt err:", err.Error()) } else { sqlstr = fmt.Sprintf(`INSERT INTO [user_op_history] ([username],[time],[op_type],[op_text]) VALUES ('%s','%s',%d,'%s')`, userinfo.Username, loginTime, 1, "登录云平台系统") _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Error("insert user_op_history err:", err.Error()) } } } } resp.Url = "main.html" jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() logs.Info(fmt.Sprintf("Login recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } // register user func registerUser(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("registerUser recv req begin", time.Now().Format("2006-01-02 15:04:05")) var err error var sqlstr string var resp CommonResp reqdata, _ := ioutil.ReadAll(request.Body) var req PostUserReq json.Unmarshal(reqdata, &req) if req.Username == "" || req.Password == "" { resp.Ret = -1 jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) return } req.Role = "访客" //check user for same username var cnt int row, err := sqlConn.Query(fmt.Sprintf(`select ID from userinfo where [username] = '%s'`, req.Username)) if err != nil { logs.Error(fmt.Sprintf("registerUser get user cnt err:%v", err.Error())) resp.Ret = -1 goto exit } for row.Next() { cnt++ } row.Close() if cnt > 0 { resp.Ret = 1 //user exist goto exit } sqlstr = fmt.Sprintf(`INSERT INTO [userinfo] ([username],[password],[role],[department]) VALUES ('%s','%s','%s','%s')`, req.Username, req.Password, req.Role, req.Department) fmt.Println(sqlstr) _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Info("registerUser Exec Error:", err.Error()) resp.Ret = -1 goto exit } resp.Ret = 0 exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("registerUser recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } // dees add user interface func addUserByDees(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("addUserByDees recv req begin", time.Now().Format("2006-01-02 15:04:05")) var err error var sqlstr string var resp addUserByDeesResp reqdata, _ := ioutil.ReadAll(request.Body) /* key := []byte("&#%*#") ksize := len(key) for i := 0; i < len(reqdata); i++ { reqdata[i] = reqdata[i] ^ key[i%ksize] } */ var req PostUserReq json.Unmarshal(reqdata, &req) req.Role = "访客" //check user for same username var cnt int row, err := sqlConn.Query(fmt.Sprintf(`select ID from userinfo where [username] = '%s'`, req.Username)) if err != nil { logs.Error(fmt.Sprintf("addUserByDees get user cnt err:%v", err.Error())) resp.Ret = -1 goto exit } for row.Next() { cnt++ } row.Close() if cnt > 0 { req.OperType = 2 resp.Ret = 1 goto exit } else { req.OperType = 1 } if req.OperType == 1 { //add sqlstr = fmt.Sprintf(`INSERT INTO [userinfo] ([username],[password],[role],[department]) VALUES ('%s','%s','%s','%s')`, req.Username, req.Password, req.Role, req.Department) } else if req.OperType == 2 { //update sqlstr = fmt.Sprintf(`UPDATE [userinfo] SET [password] = '%s',[role] = '%s',[department] = '%s' WHERE [username] = '%s'`, req.Password, req.Role, req.Department, req.Username) } fmt.Println(sqlstr) _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Info("addUserByDees Exec Error:", err.Error()) resp.Ret = -1 goto exit } resp.Ret = 0 exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("addUserByDees recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func postUser(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("postUser recv req begin", time.Now().Format("2006-01-02 15:04:05")) var opContent string var opType int var err error var sqlstr string var resp PostUserResp reqdata, _ := ioutil.ReadAll(request.Body) var req PostUserReq json.Unmarshal(reqdata, &req) b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid) if !b { resp.Ret = -1 goto exit } if (req.OperType == 2 || req.OperType == 3) && req.Id == 0 { logs.Info("update userinfo req id ==0") resp.Ret = -1 goto exit } //check user for same username if req.OperType == 1 { var cnt int row, err := sqlConn.Query(fmt.Sprintf(`select ID from userinfo where [username] = '%s'`, req.Username)) if err != nil { logs.Error(fmt.Sprintf("postUser get user cnt err:%v", err.Error())) resp.Ret = -1 goto exit } for row.Next() { cnt++ } row.Close() if cnt > 0 { resp.Ret = 1 goto exit } } if req.OperType == 1 { //add opType = 10001 opContent = fmt.Sprintf(`新增用户%s`, req.Username) sqlstr = fmt.Sprintf(`INSERT INTO [userinfo] ([username],[password],[role],[department]) VALUES ('%s','%s','%s','%s')`, req.Username, req.Password, req.Role, req.Department) } else if req.OperType == 2 { //update opType = 10002 opContent = fmt.Sprintf(`修改用户%s`, req.Username) sqlstr = fmt.Sprintf(`UPDATE [userinfo] SET [username] = '%s',[password] = '%s',[role] = '%s',[department] = '%s' WHERE ID=%d`, req.Username, req.Password, req.Role, req.Department, req.Id) } else if req.OperType == 3 { opType = 10003 opContent = fmt.Sprintf(`删除用户%s`, req.Username) sqlstr = fmt.Sprintf(`DELETE FROM [dbo].[userinfo] WHERE ID=%d`, req.Id) } else { resp.Ret = -1 goto exit } fmt.Println(sqlstr) _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Info("postUser Exec Error:", err.Error()) resp.Ret = -1 goto exit } resp.Ret = 0 exit: if resp.Ret == 0 { opTime := time.Now().Format("2006-01-02 15:04:05") sqlstr := fmt.Sprintf(`INSERT INTO [user_op_history] ([username],[time],[op_type],[op_text]) VALUES ('%s','%s',%d,'%s')`, req.OpUser, opTime, opType, opContent) _, err = sqlConn.Exec(sqlstr) if err != nil { logs.Error("postUser insert user_op_history err:", err.Error()) } } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("postUser recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getUserInfo(username string) (d GetUsersRespdata, err error) { var sql string sql = fmt.Sprintf("select [ID],[username],[password],[role],[department],COALESCE([cnt],0),COALESCE([login_time],'') from userinfo where username = '%s'", username) //fmt.Println(sql) row, err := sqlConn.Query(sql) if err != nil { logs.Info("getUserInfo Query Error", err.Error()) return } defer row.Close() for row.Next() { if err = row.Scan(&d.Userid, &d.Username, &d.Password, &d.Userrole, &d.UserDepartment, &d.Cnt, &d.LoginTime); err == nil { } else { logs.Info("Query Error", err.Error()) } } return } func getUserOpHistory(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getUserOpHistory recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req getUserOpHistoryReq var resp getUserOpHistoryResp var sqlstr string var rcnt int var cntRow *sql.Rows var rdRow *sql.Rows var err error reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid) if !b { goto exit } if req.SearchUser == "" && req.BeginTime == "" { sqlstr = "select count(ID) from [user_op_history]" } else if req.SearchUser != "" && req.BeginTime == "" { likeStr := "%" + req.SearchUser + "%" sqlstr = fmt.Sprintf("select count(ID) from [user_op_history] where username like '%s'", likeStr) } else if req.SearchUser == "" && req.BeginTime != "" { sqlstr = fmt.Sprintf("select count(ID) from [user_op_history] where [time]>'%s' and [time] <'%s'", req.BeginTime, req.EndTime) } else { likeStr := "%" + req.SearchUser + "%" sqlstr = fmt.Sprintf("select count(ID) from [user_op_history] where [username] like '%s' and [time]>'%s' and [time] <'%s'", likeStr, req.BeginTime, req.EndTime) } fmt.Println(sqlstr) cntRow, err = sqlConn.Query(sqlstr) if err != nil { logs.Error(fmt.Sprintf("getUserOpHistory query %s err:%v", sqlstr, err.Error())) goto exit } for cntRow.Next() { if err = cntRow.Scan(&rcnt); err != nil { logs.Error(fmt.Sprintf("getUserOpHistory scan %s err:%v", sqlstr, err.Error())) goto exit } } defer cntRow.Close() resp.Total = rcnt if req.SearchUser == "" && req.BeginTime == "" { sqlstr = fmt.Sprintf("select top %v [username],[time],[op_text] from user_op_history where ID not in (select top %v ID from user_op_history order by ID desc) order by ID desc", req.Count, (req.Index-1)*req.Count) } else if req.SearchUser != "" && req.BeginTime == "" { likeStr := "%" + req.SearchUser + "%" sqlstr = fmt.Sprintf("select top %v [username],[time],[op_text] from user_op_history where username like '%s' and ID not in (select top %v ID from user_op_history where username like '%s' order by ID desc) order by ID desc", req.Count, likeStr, (req.Index-1)*req.Count, likeStr) } else if req.SearchUser == "" && req.BeginTime != "" { sqlstr = fmt.Sprintf("select top %v [username],[time],[op_text] from user_op_history where [time] >'%s' and [time] <'%s' and ID not in (select top %v ID from user_op_history where [time] >'%s' and [time] <'%s' order by ID desc) order by ID desc", req.Count, req.BeginTime, req.EndTime, (req.Index-1)*req.Count, req.BeginTime, req.EndTime) } else { likeStr := "%" + req.SearchUser + "%" sqlstr = fmt.Sprintf("select top %v [username],[time],[op_text] from user_op_history where username like '%s' and [time] >'%s' and [time] <'%s' and ID not in (select top %v ID from user_op_history where username like '%s' and [time] >'%s' and [time] <'%s' order by ID desc) order by ID desc", req.Count, likeStr, req.BeginTime, req.EndTime, (req.Index-1)*req.Count, likeStr, req.BeginTime, req.EndTime) } fmt.Println(sqlstr) rdRow, err = sqlConn.Query(sqlstr) if err != nil { logs.Error(fmt.Sprintf("getUserOpHistory Query err:%v", err.Error())) goto exit } defer rdRow.Close() for rdRow.Next() { var d getUserOpHistoryRespData if err := rdRow.Scan(&d.UserName, &d.Time, &d.OpText); err == nil { resp.Data = append(resp.Data, d) } else { logs.Error("getUserOpHistory scan Error", err.Error()) } } exit: jdata, _ := json.Marshal(resp) response.Write(jdata) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getUserOpHistory recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getUsers(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getUsers recv req begin", time.Now().Format("2006-01-02 15:04:05")) var req getUsersReq var resp GetUsersResp var sqlstr string var rcnt int var cntRow *sql.Rows var rdRow *sql.Rows var rows *sql.Rows var err error var selSql string m := make(map[string]int) reqdata, _ := ioutil.ReadAll(request.Body) json.Unmarshal(reqdata, &req) b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid) if !b { goto exit } selSql = `select [username] from [user_op_history] where [op_type]=1 ` if req.Id != "" { like := "%" + req.Id + "%" selSql += fmt.Sprintf(` and [username] like '%s'`, like) } selSql += " order by [username] desc" rows, err = sqlConn.Query(selSql) if err != nil { logs.Error("getUsers query err:", err.Error()) goto exit } for rows.Next() { var v string if err = rows.Scan(&v); err == nil { if _, ok := m[v]; ok { m[v]++ } else { m[v] = 1 } } else { logs.Error("getUsers scan err:", err.Error()) } } rows.Close() if req.Id == "" { sqlstr = "select count(ID) from [userinfo]" } else { likeStr := "%" + req.Id + "%" sqlstr = fmt.Sprintf("select count(ID) from [userinfo] where username like '%s'", likeStr) } fmt.Println(sqlstr) cntRow, err = sqlConn.Query(sqlstr) if err != nil { logs.Error(fmt.Sprintf("getUsers query %s err:%v", sqlstr, err.Error())) goto exit } for cntRow.Next() { if err = cntRow.Scan(&rcnt); err != nil { logs.Error(fmt.Sprintf("getUsers scan %s err:%v", sqlstr, err.Error())) goto exit } } defer cntRow.Close() resp.Total = rcnt if req.Id == "" { sqlstr = fmt.Sprintf("select top %v [ID],[username],[password],[role],COALESCE([department],''),COALESCE([cnt],0),COALESCE([login_time],'') from userinfo where ID not in (select top %v ID from userinfo order by ID asc) order by ID asc", req.Count, (req.Index-1)*req.Count) } else { likeStr := "%" + req.Id + "%" sqlstr = fmt.Sprintf("select top %v [ID],[username],[password],[role],COALESCE([department],''),COALESCE([cnt],0),COALESCE([login_time],'') from userinfo where username like '%s' and ID not in (select top %v ID from userinfo where username like '%s' order by ID asc) order by ID asc", req.Count, likeStr, (req.Index-1)*req.Count, likeStr) } fmt.Println(sqlstr) rdRow, err = sqlConn.Query(sqlstr) if err != nil { logs.Error(fmt.Sprintf("getUsers Query err:%v", err.Error())) goto exit } defer rdRow.Close() for rdRow.Next() { var d GetUsersRespdata if err := rdRow.Scan(&d.Userid, &d.Username, &d.Password, &d.Userrole, &d.UserDepartment, &d.Cnt, &d.LoginTime); err == nil { if cnt, ok := m[d.Username]; ok { d.Cnt = cnt } resp.Data = append(resp.Data, d) } else { logs.Error("getUsers scan Error", err.Error()) } } exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getUsers recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func wsGetWellRealTimeData(lang string, id string, user string, ioCh chan []GetHisWellRespdata, exitCh chan struct{}) { updateWellNameLocker.RLock() if time.Now().Unix()-lastUpdateTime.Unix() > 60 { updateWellNameLocker.RUnlock() updateWellNameLocker.Lock() lastUpdateTime = time.Now() updateWellNameLocker.Unlock() initWellnamesMap() } else { updateWellNameLocker.RUnlock() } var cmdSql string var db string rwLocker.RLock() if v, ok := wellNamemap[id]; ok { rwLocker.RUnlock() db = v } else { logs.Info(fmt.Sprintf("wsGetWellRealTimeData wellsourcename: %s not exist!", id)) rwLocker.RUnlock() return } // 1. 检查数据库状态 needOffline := false masterConn, err := getOdbcConn("master") if err != nil { logs.Info("链接master库失败", err.Error()) fmt.Println("链接master库失败", err.Error()) } else { defer masterConn.Close() // 查询数据库状态 checkSql := fmt.Sprintf("SELECT state_desc FROM sys.databases WHERE name = '%s'", db) var status string err = masterConn.QueryRow(checkSql).Scan(&status) if err != nil { fmt.Println("查询数据库状态失败:", err.Error()) logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) onlineSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) _, err = masterConn.Exec(onlineSql) if err != nil { fmt.Println("设置在线失败:", err.Error()) logs.Info("设置在线失败:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为在线\n", db) needOffline = true } } else { fmt.Printf("数据库 %s 已在线,不需要操作\n", db) needOffline = false } } } conn, err := getOdbcConn(db) if err != nil { fmt.Println("wsGetWellRealTimeData sql open db err:", err.Error()) logs.Error("wsGetWellRealTimeData sql open db err:", err.Error()) return } defer conn.Close() var beginTime string selSql := fmt.Sprintf("select distinct top %v [4301],[4303],[4304],[4305],[4306],[4307] from DECODETABLE order by [4304] desc", 1) beginRow, err := conn.Query(selSql) if err != nil { logs.Error(fmt.Sprintf("wsGetWellRealTimeData query %s err:%s", selSql, err.Error())) beginTime = time.Now().Format("2006-01-02 15:04:05") } else { var cnt int for beginRow.Next() { cnt++ var d GetHisWellRespdata d.Wellname = id var paraname int var decodeValue float64 if err := beginRow.Scan(&d.Wellnum, &d.WellDepth, &d.Time, ¶name, &decodeValue, &d.Precision); err == nil { beginTime = d.Time[:10] + " " + d.Time[11:19] } else { logs.Error(fmt.Sprintf("wsGetWellRealTimeData scan %s err:%s", selSql, err.Error())) beginTime = time.Now().Format("2006-01-02 15:04:05") } } beginRow.Close() if cnt == 0 { beginTime = time.Now().Format("2006-01-02 15:04:05") } } tick := time.NewTicker(time.Second * 5) for { select { case <-tick.C: var selSql string selSql = fmt.Sprintf("select distinct [4301],[4303],[4304],[4305],[4306],[4307],[4311] from DECODETABLE where [4304]>'%s' order by [4304] asc", beginTime) fmt.Println(selSql) row, err := conn.Query(selSql) if err != nil { logs.Info("wsGetWellRealTimeData Query Error", err.Error()) break } var cnt = 0 var resp []GetHisWellRespdata for row.Next() { var d GetHisWellRespdata d.Wellname = id var paraname int var decodeValue float64 if err := row.Scan(&d.Wellnum, &d.WellDepth, &d.Time, ¶name, &decodeValue, &d.Precision, &d.IfWarning); err == nil { if paraname == 5 || paraname == 6 || (paraname >= 39 && paraname <= 44) { decodeValue, _ = decimal.NewFromFloat(decodeValue).Round(4).Float64() d.DecodeValue = fmt.Sprintf("%.04f", decodeValue) } else { decodeValue, _ = decimal.NewFromFloat(decodeValue).Round(2).Float64() d.DecodeValue = fmt.Sprintf("%.02f", decodeValue) } if lang == "en" { if v, ok := wellParaNameMap_en[paraname]; ok { d.Paraname = v } else { d.Paraname = strconv.Itoa(paraname) } if u, ok := wellParaUnitMap_en[int(paraname)]; ok { /*if u == "Mpa" { u = "psi" d.DecodeValue = fmt.Sprintf("%.02f", 145.038*decodeValue) } else if u == "℃" { u = "℉" d.DecodeValue = fmt.Sprintf("%.02f", 1.8*decodeValue+32) }*/ d.Unit = u } else { d.Unit = "" } } else { if v, ok := wellParaNameMap[paraname]; ok { d.Paraname = v } else { d.Paraname = strconv.Itoa(paraname) } if u, ok := wellParaUnitMap[paraname]; ok { d.Unit = u } else { d.Unit = "" } } d.Time = d.Time[:10] + " " + d.Time[11:19] resp = append(resp, d) /*if cnt == 0 { beginTime = d.Time }*/ beginTime = d.Time cnt++ } else { logs.Info("wsGetWellRealTimeData Query Error", err.Error()) } } row.Close() ioCh <- resp case <-exitCh: goto exit } } exit: // 2. 如果需要,最后设置数据库离线 if needOffline { masterConn2, err := getOdbcConn("master") if err != nil { logs.Info("连接master库失败", err.Error()) fmt.Println("连接master库失败", err.Error()) } else { defer masterConn2.Close() cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE WITH ROLLBACK IMMEDIATE", db) _, err = masterConn2.Exec(cmdSql) if err != nil { logs.Error("SET OFFLINE command execution error:", err.Error()) } } } } func getWellRealTimeData_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getWellRealTimeData_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req getWellRealTimeData_req json.Unmarshal(reqdata, &req) var cnt int var resp getWellRealTimeDataResp var cmdSql string var db string rwLocker.RLock() if v, ok := wellNamemap[req.Id]; ok { rwLocker.RUnlock() db = v } else { logs.Info(fmt.Sprintf("wellsourcename: %s not exist!", req.Id)) rwLocker.RUnlock() resp.Fw.Time = "00:00:00" resp.Fw.Value = "0" resp.Jx.Time = "00:00:00" resp.Jx.Value = "0" jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) return } // 1. 检查数据库状态 needOffline := false masterConn, err := getOdbcConn("master") if err != nil { logs.Info("链接master库失败", err.Error()) fmt.Println("链接master库失败", err.Error()) } else { defer masterConn.Close() // 查询数据库状态 checkSql := fmt.Sprintf("SELECT state_desc FROM sys.databases WHERE name = '%s'", db) var status string err = masterConn.QueryRow(checkSql).Scan(&status) if err != nil { fmt.Println("查询数据库状态失败:", err.Error()) logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) onlineSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) _, err = masterConn.Exec(onlineSql) if err != nil { fmt.Println("设置在线失败:", err.Error()) logs.Info("设置在线失败:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为在线\n", db) needOffline = true } } else { fmt.Printf("数据库 %s 已在线,不需要操作\n", db) needOffline = false } } } conn, err := getOdbcConn(db) if err != nil { logs.Info("Connecting Error", err.Error()) resp.Fw.Time = "00:00:00" resp.Fw.Value = "0" resp.Jx.Time = "00:00:00" resp.Jx.Value = "0" jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) return } defer conn.Close() sql := fmt.Sprintf("select distinct top %v [4301],[4303],[4304],[4305],[4306],[4307],[4311] from DECODETABLE order by [4304] desc", req.Count) row, err := conn.Query(sql) if err != nil { logs.Info("Query Error", err.Error()) resp.Fw.Time = "00:00:00" resp.Fw.Value = "0" resp.Jx.Time = "00:00:00" resp.Jx.Value = "0" jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) return } ps_info := get_ps_info(req.OpUser) for row.Next() { var d GetHisWellRespdata d.Wellname = req.Id //var id int var paraname int var decodeValue float64 if err := row.Scan(&d.Wellnum, &d.WellDepth, &d.Time, ¶name, &decodeValue, &d.Precision, &d.IfWarning); err == nil { if paraname == 5 || paraname == 6 || (paraname >= 39 && paraname <= 44) { decodeValue, _ = decimal.NewFromFloat(decodeValue).Round(4).Float64() d.DecodeValue = fmt.Sprintf("%.04f", decodeValue) } else { decodeValue, _ = decimal.NewFromFloat(decodeValue).Round(2).Float64() d.DecodeValue = fmt.Sprintf("%.02f", decodeValue) } if v, ok := wellParaNameMap_en[paraname]; ok { d.Paraname = v } else { d.Paraname = strconv.Itoa(paraname) } if u, ok := wellParaUnitMap_en[paraname]; ok { if u == "Mpa" && ps_info.R1 == "2" { u = "psi" d.DecodeValue = fmt.Sprintf("%.02f", 145.038*decodeValue) } else if u == "℃" && ps_info.R2 == "2" { u = "℉" d.DecodeValue = fmt.Sprintf("%.02f", 1.8*decodeValue+32) } d.Unit = u } else { d.Unit = "" } d.Time = d.Time[:10] + " " + d.Time[11:19] d.Time = do_time_by_ps(d.Time, ps_info) resp.Data = append(resp.Data, d) cnt++ } else { logs.Info("Query Error", err.Error()) } } row.Close() resp.Total = cnt if len(resp.Data) > 0 { v := resp.Data[0] timeLayout := "2006-01-02 15:04:05" loc, _ := time.LoadLocation("Local") t, _ := time.ParseInLocation(timeLayout, v.Time, loc) if t.Sub(time.Now()).Seconds() > 3600*1 { resp.Time_warn = 1 } } //get jx fw //get jx selSql := fmt.Sprintf(`select distinct top 1 [4304],[4306] from DECODETABLE where [4305]=1 or [4305]=68 order by [4304] desc`) jxRow, err := conn.Query(selSql) if err == nil { for jxRow.Next() { var time string var dv float32 if err = jxRow.Scan(&time, &dv); err == nil { if len(time) >= 19 { resp.Jx.Time = time[11:19] } else { resp.Jx.Time = "00:00:00" } resp.Jx.Value = fmt.Sprintf("%.02f", dv) } } jxRow.Close() } //get fw selSql = fmt.Sprintf(`select distinct top 1 [4304],[4306] from DECODETABLE where [4305]=2 or [4305]=69 order by [4304] desc`) fwRow, err := conn.Query(selSql) if err == nil { for fwRow.Next() { var time string var dv float32 if err = fwRow.Scan(&time, &dv); err == nil { if len(time) >= 19 { resp.Fw.Time = time[11:19] } else { resp.Fw.Time = "00:00:00" } resp.Fw.Value = fmt.Sprintf("%.02f", dv) } } fwRow.Close() } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) // 2. 如果需要,最后设置数据库离线 if needOffline { masterConn2, err := getOdbcConn("master") if err != nil { logs.Info("连接master库失败", err.Error()) fmt.Println("连接master库失败", err.Error()) } else { defer masterConn2.Close() cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE WITH ROLLBACK IMMEDIATE", db) _, err = masterConn2.Exec(cmdSql) if err != nil { logs.Error("SET OFFLINE command execution error:", err.Error()) } } } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getWellRealTimeData_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func do_time_by_ps(t string, ps_info page_setting_req) (t0 string) { //一月Jan,二月Feb,三月Mar,四月Apr,五月May,六月June,七月July, //八月Aug,九月Sep,十月Oct,十一月Nov,十二月Dec if ps_info.R3 == "1" { if len(t) < 19 { return } s := t[:10] s_arr := strings.Split(s, "-") if len(s_arr) == 3 { month := s_arr[1] if ps_info.Month { if _, ok := month_en_name[s_arr[1]]; ok { month = month_en_name[s_arr[1]] } } t0 = s_arr[0] + "-" + month + "-" + s_arr[2] + " " + t[11:19] } } else if ps_info.R3 == "2" { if len(t) < 19 { return } s := t[:10] s_arr := strings.Split(s, "-") if len(s_arr) == 3 { month := s_arr[1] if ps_info.Month { if _, ok := month_en_name[s_arr[1]]; ok { month = month_en_name[s_arr[1]] } } t0 = month + "-" + s_arr[2] + "-" + s_arr[0] + " " + t[11:19] } } else if ps_info.R3 == "3" { if len(t) < 19 { return } s := t[:10] s_arr := strings.Split(s, "-") if len(s_arr) == 3 { month := s_arr[1] if ps_info.Month { if _, ok := month_en_name[s_arr[1]]; ok { month = month_en_name[s_arr[1]] } } t0 = s_arr[2] + "/" + month + "/" + s_arr[0] + " " + t[11:19] } } else { if len(t) < 19 { return } s := t[:10] s_arr := strings.Split(s, "-") if len(s_arr) == 3 { month := s_arr[1] if ps_info.Month { if _, ok := month_en_name[s_arr[1]]; ok { month = month_en_name[s_arr[1]] } } t0 = s_arr[0] + "-" + month + "-" + s_arr[2] + " " + t[11:19] } } return } func do_date_time_by_ps(t string, ps_info page_setting_req) (t0 string) { if ps_info.R3 == "1" { if len(t) < 10 { return } s := t[:10] s_arr := strings.Split(s, "-") if len(s_arr) == 3 { month := s_arr[1] if ps_info.Month { if _, ok := month_en_name[s_arr[1]]; ok { month = month_en_name[s_arr[1]] } } t0 = s_arr[0] + "-" + month + "-" + s_arr[2] } } else if ps_info.R3 == "2" { if len(t) < 10 { return } s := t[:10] s_arr := strings.Split(s, "-") if len(s_arr) == 3 { month := s_arr[1] if ps_info.Month { if _, ok := month_en_name[s_arr[1]]; ok { month = month_en_name[s_arr[1]] } } t0 = month + "-" + s_arr[2] + "-" + s_arr[0] } } else if ps_info.R3 == "3" { if len(t) < 10 { return } s := t[:10] s_arr := strings.Split(s, "-") if len(s_arr) == 3 { month := s_arr[1] if ps_info.Month { if _, ok := month_en_name[s_arr[1]]; ok { month = month_en_name[s_arr[1]] } } t0 = s_arr[2] + "/" + month + "/" + s_arr[0] } } else { if len(t) < 10 { return } s := t[:10] s_arr := strings.Split(s, "-") if len(s_arr) == 3 { month := s_arr[1] if ps_info.Month { if _, ok := month_en_name[s_arr[1]]; ok { month = month_en_name[s_arr[1]] } } t0 = s_arr[0] + "-" + month + "-" + s_arr[2] } } return } func getWellRealTimeData(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getWellRealTimeData recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req getWellRealTimeData_req json.Unmarshal(reqdata, &req) var cnt int var resp getWellRealTimeDataResp var db string var cmdSql string rwLocker.RLock() if v, ok := wellNamemap[req.Id]; ok { rwLocker.RUnlock() db = v } else { logs.Info(fmt.Sprintf("wellsourcename: %s not exist!", req.Id)) rwLocker.RUnlock() resp.Fw.Time = "00:00:00" resp.Fw.Value = "0" resp.Jx.Time = "00:00:00" resp.Jx.Value = "0" jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) return } // 1. 检查数据库状态 needOffline := false masterConn, err := getOdbcConn("master") if err != nil { logs.Info("链接master库失败", err.Error()) fmt.Println("链接master库失败", err.Error()) } else { defer masterConn.Close() // 查询数据库状态 checkSql := fmt.Sprintf("SELECT state_desc FROM sys.databases WHERE name = '%s'", db) var status string err = masterConn.QueryRow(checkSql).Scan(&status) if err != nil { fmt.Println("查询数据库状态失败:", err.Error()) logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) onlineSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) _, err = masterConn.Exec(onlineSql) if err != nil { fmt.Println("设置在线失败:", err.Error()) logs.Info("设置在线失败:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为在线\n", db) needOffline = true } } else { fmt.Printf("数据库 %s 已在线,不需要操作\n", db) needOffline = false } } } conn, err := getOdbcConn(db) if err != nil { logs.Info("Connecting Error", err.Error()) resp.Fw.Time = "00:00:00" resp.Fw.Value = "0" resp.Jx.Time = "00:00:00" resp.Jx.Value = "0" jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) return } defer conn.Close() sql := fmt.Sprintf("select distinct top %v [4301],[4303],[4304],[4305],[4306],[4307],[4311] from DECODETABLE order by [4304] desc", req.Count) row, err := conn.Query(sql) if err != nil { logs.Info("Query Error", err.Error()) resp.Fw.Time = "00:00:00" resp.Fw.Value = "0" resp.Jx.Time = "00:00:00" resp.Jx.Value = "0" jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) return } ps_info := get_ps_info(req.OpUser) for row.Next() { var d GetHisWellRespdata d.Wellname = req.Id //var id int var paraname int var decodeValue float64 if err := row.Scan(&d.Wellnum, &d.WellDepth, &d.Time, ¶name, &decodeValue, &d.Precision, &d.IfWarning); err == nil { if paraname == 5 || paraname == 6 || (paraname >= 39 && paraname <= 44) { decodeValue, _ = decimal.NewFromFloat(decodeValue).Round(4).Float64() d.DecodeValue = fmt.Sprintf("%.04f", decodeValue) } else { decodeValue, _ = decimal.NewFromFloat(decodeValue).Round(2).Float64() d.DecodeValue = fmt.Sprintf("%.02f", decodeValue) } if v, ok := wellParaNameMap[paraname]; ok { d.Paraname = v } else { d.Paraname = strconv.Itoa(paraname) } if u, ok := wellParaUnitMap[paraname]; ok { if u == "MPa" && ps_info.R1 == "2" { u = "psi" d.DecodeValue = fmt.Sprintf("%.02f", 145.038*decodeValue) } else if u == "℃" && ps_info.R2 == "2" { u = "℉" d.DecodeValue = fmt.Sprintf("%.02f", 1.8*decodeValue+32) } d.Unit = u } else { d.Unit = "" } d.Time = d.Time[:10] + " " + d.Time[11:19] d.Time = do_time_by_ps(d.Time, ps_info) resp.Data = append(resp.Data, d) cnt++ } else { logs.Info("Query Error", err.Error()) } } row.Close() resp.Total = cnt if len(resp.Data) > 0 { v := resp.Data[0] timeLayout := "2006-01-02 15:04:05" loc, _ := time.LoadLocation("Local") t, _ := time.ParseInLocation(timeLayout, v.Time, loc) if t.Sub(time.Now()).Seconds() > 3600*1 { resp.Time_warn = 1 } } //get jx fw //get jx selSql := fmt.Sprintf(`select distinct top 1 [4304],[4306] from DECODETABLE where [4305]=1 or [4305]=68 order by [4304] desc`) jxRow, err := conn.Query(selSql) if err == nil { for jxRow.Next() { var time string var dv float32 if err = jxRow.Scan(&time, &dv); err == nil { if len(time) >= 19 { resp.Jx.Time = time[11:19] } else { resp.Jx.Time = "00:00:00" } resp.Jx.Value = fmt.Sprintf("%.02f", dv) } } jxRow.Close() } //get fw selSql = fmt.Sprintf(`select distinct top 1 [4304],[4306] from DECODETABLE where [4305]=2 or [4305]=69 order by [4304] desc`) fwRow, err := conn.Query(selSql) if err == nil { for fwRow.Next() { var time string var dv float32 if err = fwRow.Scan(&time, &dv); err == nil { if len(time) >= 19 { resp.Fw.Time = time[11:19] } else { resp.Fw.Time = "00:00:00" } resp.Fw.Value = fmt.Sprintf("%.02f", dv) } } fwRow.Close() } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) // 2. 如果需要,最后设置数据库离线 if needOffline { masterConn2, err := getOdbcConn("master") if err != nil { logs.Info("连接master库失败", err.Error()) fmt.Println("连接master库失败", err.Error()) } else { defer masterConn2.Close() cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE WITH ROLLBACK IMMEDIATE", db) _, err = masterConn2.Exec(cmdSql) if err != nil { logs.Error("SET OFFLINE command execution error:", err.Error()) } } } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getWellRealTimeData recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getWellData(ifDesc bool) (data []wellData, err error) { var sqlstr string if ifDesc { sqlstr = "select [WELLNameSource],[WELLName],[stats],[CreateTableTime],COALESCE([IPADDR],''),COALESCE([Operator],''),COALESCE([ClOUDACCOUNT],''),COALESCE([service_type],'') from [WellInformation] order by [CreateTableTime] desc" } else { sqlstr = "select [WELLNameSource],[WELLName],[stats],[CreateTableTime],COALESCE([IPADDR],''),COALESCE([Operator],''),COALESCE([ClOUDACCOUNT],''),COALESCE([service_type],'') from [WellInformation] order by [CreateTableTime] asc" } row, err := sqlConn.Query(sqlstr) if err != nil { logs.Info("getWellData Query Error", err.Error()) return } var count int for row.Next() { var d wellData if err := row.Scan(&d.WellNameSource, &d.WellName, &d.Wellstate, &d.Welltime, &d.Wellip, &d.Welloperator, &d.Cloud_account, &d.Service_type); err == nil { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] if d.Welltime == "1900-01-01 00:00:00" { d.Welltime = "" } data = append(data, d) } count++ } fmt.Println("count-----------------", count) fmt.Println("data-----------------", data) row.Close() return } func getWellNames(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getWellNames recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req getSeriesWarningCsv_req json.Unmarshal(reqdata, &req) data, _ := getWellData(true) fmt.Println("len(data)---------------", len(data)) //30s更新 var ifUpdate bool updateWellNameLocker.RLock() if len(wellNamemap) == 0 || time.Now().Unix()-lastUpdateTime.Unix() > 30 { updateWellNameLocker.RUnlock() ifUpdate = true updateWellNameLocker.Lock() lastUpdateTime = time.Now() updateWellNameLocker.Unlock() } else { updateWellNameLocker.RUnlock() } if ifUpdate { rwLocker.Lock() } var resp []GetWellNamesResp var counti int for i := 0; i < len(data); i++ { counti++ var d GetWellNamesResp if spe_name, ok := spe_user[req.OpUser]; ok { if data[i].Cloud_account != spe_name { continue } } d.Value = data[i].WellNameSource d.Label = d.Value resp = append(resp, d) if ifUpdate { wellNamemap[d.Label] = data[i].WellName } } fmt.Println("counti---------------", counti) if ifUpdate { rwLocker.Unlock() } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getWellNames recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getRecordCount(conn *sql.DB, sql string) (cnt int, err error) { //查询记录总数 row, err := conn.Query(sql) if err != nil { logs.Info("getRecordCount Query Error", err.Error()) return } defer row.Close() for row.Next() { if err = row.Scan(&cnt); err == nil { } else { logs.Info("Query Error", err.Error()) } } return } func exportWellHistory_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("exportWellHistory_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetHisWellReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp exportWellHisResp var conn *sql.DB var err error var cmdSql string var db string var row *sql.Rows var selSql string var whereSql string var ifwhere bool var hisData []wellHistoryData needOffline := false masterConn, err := getOdbcConn("master") if err != nil { logs.Info("链接master库失败", err.Error()) fmt.Println("链接master库失败", err.Error()) } else { defer masterConn.Close() // 查询数据库状态 checkSql := fmt.Sprintf("SELECT state_desc FROM sys.databases WHERE name = '%s'", db) var status string err = masterConn.QueryRow(checkSql).Scan(&status) if err != nil { fmt.Println("查询数据库状态失败:", err.Error()) logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) onlineSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) _, err = masterConn.Exec(onlineSql) if err != nil { fmt.Println("设置在线失败:", err.Error()) logs.Info("设置在线失败:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为在线\n", db) needOffline = true } } else { fmt.Printf("数据库 %s 已在线,不需要操作\n", db) needOffline = false } } } rwLocker.RLock() if v, ok := wellNamemap[req.Id]; ok { rwLocker.RUnlock() db = v } else { logs.Info(fmt.Sprintf("exportWellHistory_en wellsourcename: %s not exist!", req.Id)) rwLocker.RUnlock() goto write_csv } conn, err = getOdbcConn(db) if err != nil { logs.Info("exportWellHistory_en Connecting Error", err.Error()) goto write_csv } defer conn.Close() if req.BeginTime != "" { whereSql = fmt.Sprintf("where [4304]>'%s' ", req.BeginTime) ifwhere = true } if req.EndTime != "" { if ifwhere { whereSql += fmt.Sprintf(` and [4304]<'%s'`, req.EndTime) } else { whereSql = fmt.Sprintf("where [4304]<'%s'", req.EndTime) } } selSql = fmt.Sprintf("select distinct [4301],[4303],[4304],[4305],[4306],[4307] from DECODETABLE ") selSql += whereSql if req.IfAsc { //asc ascSql := " order by [4304] asc" selSql += ascSql } else { descSql := " order by [4304] desc" //desc selSql += descSql } fmt.Println("exportWellHistory sql:", selSql) row, err = conn.Query(selSql) if err != nil { logs.Info("exportWellHistory_en Query Error", err.Error()) goto write_csv } defer row.Close() for row.Next() { var d wellHistoryData d.Wellname = req.Id var paraname int var decodeValue float64 if err := row.Scan(&d.Wellnum, &d.WellDepth, &d.Time, ¶name, &decodeValue, &d.Precision); err == nil { if paraname == 5 || paraname == 6 || (paraname >= 39 && paraname <= 44) { decodeValue, _ = decimal.NewFromFloat(decodeValue).Round(4).Float64() d.DecodeValue = fmt.Sprintf("%.04f", decodeValue) } else { decodeValue, _ = decimal.NewFromFloat(decodeValue).Round(2).Float64() d.DecodeValue = fmt.Sprintf("%.02f", decodeValue) } if v, ok := wellParaNameMap_en[int(paraname)]; ok { d.Paraname = v } else { d.Paraname = strconv.Itoa(int(paraname)) } if u, ok := wellParaUnitMap_en[int(paraname)]; ok { if u == "MPa" && ps_info.R1 == "2" { u = "psi" d.DecodeValue = fmt.Sprintf("%.02f", 145.038*decodeValue) } else if u == "℃" && ps_info.R2 == "2" { u = "℉" d.DecodeValue = fmt.Sprintf("%.02f", 1.8*decodeValue+32) } d.Unit = u } else { d.Unit = "" } d.Time = d.Time[:10] + " " + d.Time[11:19] d.Time = do_time_by_ps(d.Time, ps_info) hisData = append(hisData, d) } else { logs.Info("Query Error", err.Error()) } } if needOffline { masterConn2, err := getOdbcConn("master") if err != nil { logs.Info("连接master库失败", err.Error()) fmt.Println("连接master库失败", err.Error()) } else { defer masterConn2.Close() cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE WITH ROLLBACK IMMEDIATE", db) _, err = masterConn2.Exec(cmdSql) if err != nil { logs.Error("SET OFFLINE command execution error:", err.Error()) } } } write_csv: var data [][]string var w *csv.Writer filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { logs.Error(err.Error()) goto exit } defer f.Close() data = append(data, []string{"Time", "Depth", "Parameters", "Decoding value", "Unit", "Accuracy"}) for i := 0; i < len(hisData); i++ { v := hisData[i] data = append(data, []string{v.Time, fmt.Sprintf("%.3f", v.WellDepth), v.Paraname, v.DecodeValue, v.Unit, fmt.Sprintf("%.2f", v.Precision)}) } f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM w = csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("exportWellHistory recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func exportWellHistory(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("exportWellHistory recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetHisWellReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp exportWellHisResp var conn *sql.DB var err error var db string var cmdSql string var row *sql.Rows var selSql string var whereSql string var ifwhere bool var hisData []wellHistoryData needOffline := false masterConn, err := getOdbcConn("master") if err != nil { logs.Info("链接master库失败", err.Error()) fmt.Println("链接master库失败", err.Error()) } else { defer masterConn.Close() // 查询数据库状态 checkSql := fmt.Sprintf("SELECT state_desc FROM sys.databases WHERE name = '%s'", db) var status string err = masterConn.QueryRow(checkSql).Scan(&status) if err != nil { fmt.Println("查询数据库状态失败:", err.Error()) logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) onlineSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) _, err = masterConn.Exec(onlineSql) if err != nil { fmt.Println("设置在线失败:", err.Error()) logs.Info("设置在线失败:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为在线\n", db) needOffline = true } } else { fmt.Printf("数据库 %s 已在线,不需要操作\n", db) needOffline = false } } } rwLocker.RLock() if v, ok := wellNamemap[req.Id]; ok { rwLocker.RUnlock() db = v } else { logs.Info(fmt.Sprintf("exportWellHistory wellsourcename: %s not exist!", req.Id)) rwLocker.RUnlock() goto write_csv } conn, err = getOdbcConn(db) if err != nil { logs.Info("exportWellHistory Connecting Error", err.Error()) goto write_csv } defer conn.Close() if req.BeginTime != "" { whereSql = fmt.Sprintf("where [4304]>'%s' ", req.BeginTime) ifwhere = true } if req.EndTime != "" { if ifwhere { whereSql += fmt.Sprintf(` and [4304]<'%s'`, req.EndTime) } else { whereSql = fmt.Sprintf("where [4304]<'%s'", req.EndTime) } } selSql = fmt.Sprintf("select distinct [4301],[4303],[4304],[4305],[4306],[4307],[4311] from DECODETABLE ") selSql += whereSql if req.IfAsc { //asc ascSql := " order by [4304] asc" selSql += ascSql } else { descSql := " order by [4304] desc" //desc selSql += descSql } fmt.Println("exportWellHistory sql:", selSql) row, err = conn.Query(selSql) if err != nil { logs.Info("exportWellHistory Query Error", err.Error()) goto write_csv } defer row.Close() for row.Next() { var d wellHistoryData d.Wellname = req.Id var paraname int var decodeValue float64 if err := row.Scan(&d.Wellnum, &d.WellDepth, &d.Time, ¶name, &decodeValue, &d.Precision, &d.IfWarning); err == nil { if paraname == 5 || paraname == 6 || (paraname >= 39 && paraname <= 44) { decodeValue, _ = decimal.NewFromFloat(decodeValue).Round(4).Float64() d.DecodeValue = fmt.Sprintf("%.04f", decodeValue) } else { decodeValue, _ = decimal.NewFromFloat(decodeValue).Round(2).Float64() d.DecodeValue = fmt.Sprintf("%.02f", decodeValue) } if v, ok := wellParaNameMap[int(paraname)]; ok { d.Paraname = v } else { d.Paraname = strconv.Itoa(int(paraname)) } if u, ok := wellParaUnitMap[int(paraname)]; ok { if u == "MPa" && ps_info.R1 == "2" { u = "psi" d.DecodeValue = fmt.Sprintf("%.02f", 145.038*decodeValue) } else if u == "℃" && ps_info.R2 == "2" { u = "℉" d.DecodeValue = fmt.Sprintf("%.02f", 1.8*decodeValue+32) } d.Unit = u } else { d.Unit = "" } d.Time = d.Time[:10] + " " + d.Time[11:19] d.Time = do_time_by_ps(d.Time, ps_info) hisData = append(hisData, d) } else { logs.Info("Query Error", err.Error()) } } if needOffline { masterConn2, err := getOdbcConn("master") if err != nil { logs.Info("连接master库失败", err.Error()) fmt.Println("连接master库失败", err.Error()) } else { defer masterConn2.Close() cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE WITH ROLLBACK IMMEDIATE", db) _, err = masterConn2.Exec(cmdSql) if err != nil { logs.Error("SET OFFLINE command execution error:", err.Error()) } } } write_csv: var data [][]string var w *csv.Writer filename := fmt.Sprintf(`./authfile/%v.csv`, beginTime) f, err := os.Create(filename) if err != nil { logs.Error(err.Error()) goto exit } defer f.Close() data = append(data, []string{"时间", "井深", "参数名", "解码值", "单位", "精度", "备注"}) for i := 0; i < len(hisData); i++ { v := hisData[i] if v.IfWarning == 1 { data = append(data, []string{v.Time, fmt.Sprintf("%.3f", v.WellDepth), v.Paraname, v.DecodeValue, v.Unit, fmt.Sprintf("%.2f", v.Precision), "误码"}) } else { data = append(data, []string{v.Time, fmt.Sprintf("%.3f", v.WellDepth), v.Paraname, v.DecodeValue, v.Unit, fmt.Sprintf("%.2f", v.Precision), ""}) } } f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM w = csv.NewWriter(f) //创建一个新的写入文件流 w.WriteAll(data) w.Flush() resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) exit: jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("exportWellHistory recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getWellHistory_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getWellHistory_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetHisWellReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp GetHisWellResp var db string var cmdSql string rwLocker.RLock() if v, ok := wellNamemap[req.Id]; ok { rwLocker.RUnlock() db = v } else { logs.Info(fmt.Sprintf("wellsourcename: %s not exist!", req.Id)) rwLocker.RUnlock() jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) return } fmt.Println() // 1. 检查数据库状态 needOffline := false masterConn, err := getOdbcConn("master") if err != nil { logs.Info("链接master库失败", err.Error()) fmt.Println("链接master库失败", err.Error()) } else { defer masterConn.Close() // 查询数据库状态 checkSql := fmt.Sprintf("SELECT state_desc FROM sys.databases WHERE name = '%s'", db) var status string err = masterConn.QueryRow(checkSql).Scan(&status) if err != nil { fmt.Println("查询数据库状态失败:", err.Error()) logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) onlineSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) _, err = masterConn.Exec(onlineSql) if err != nil { fmt.Println("设置在线失败:", err.Error()) logs.Info("设置在线失败:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为在线\n", db) needOffline = true } } else { fmt.Printf("数据库 %s 已在线,不需要操作\n", db) needOffline = false } } } conn, err := getOdbcConn(db) if err != nil { logs.Info("getWellHistory_en Connecting Error", err.Error()) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) return } defer conn.Close() var cntSql string var selSql string var whereSql string var ifwhere bool if req.BeginTime != "" { whereSql = fmt.Sprintf("where [4304]>'%s' ", req.BeginTime) ifwhere = true } if req.EndTime != "" { if ifwhere { whereSql += fmt.Sprintf(` and [4304]<'%s'`, req.EndTime) } else { whereSql = fmt.Sprintf("where [4304]<'%s'", req.EndTime) } } if req.IfVip { if ifwhere { whereSql += fmt.Sprintf(` and [4305] in ('104','105','106')`) } else { whereSql = fmt.Sprintf(" where[4305] in ('104','105','106')") } } cntSql = fmt.Sprintf("select count(*) from (select distinct [4301],[4303],[4304],[4305],[4306],[4307],[4311] from DECODETABLE %s)t", whereSql) rcnt, err := getRecordCount(conn, cntSql) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", cntSql, err.Error())) return } query_cnt := req.Index * req.Count var cnt int if query_cnt > rcnt { cnt = rcnt + req.Count - query_cnt } else { cnt = req.Count } selSql = fmt.Sprintf("select top %v [4301],[4303],[4304],[4305],[4306],[4307],[4311] from ( select distinct top %v [4301],[4303],[4304],[4305],[4306],[4307],[4311] from DECODETABLE ", cnt, req.Index*req.Count) selSql += whereSql ascSql := " order by [4304] asc" descSql := " order by [4304] desc" if req.IfAsc { //asc selSql += ascSql + ")t " + whereSql + descSql } else { //desc selSql += descSql + ")t " + whereSql + ascSql } fmt.Println("getWellHistory sql:", selSql) row, err := conn.Query(selSql) if err != nil { logs.Info("Query Error", err.Error()) return } defer row.Close() var data []GetHisWellRespdata resp.Total = rcnt for row.Next() { var d GetHisWellRespdata d.Wellname = req.Id var paraname int var decodeValue float64 if err := row.Scan(&d.Wellnum, &d.WellDepth, &d.Time, ¶name, &decodeValue, &d.Precision, &d.IfWarning); err == nil { if paraname == 5 || paraname == 6 || (paraname >= 39 && paraname <= 44) { decodeValue, _ = decimal.NewFromFloat(decodeValue).Round(4).Float64() d.DecodeValue = fmt.Sprintf("%.04f", decodeValue) } else { decodeValue, _ = decimal.NewFromFloat(decodeValue).Round(2).Float64() d.DecodeValue = fmt.Sprintf("%.02f", decodeValue) } if v, ok := wellParaNameMap_en[int(paraname)]; ok { d.Paraname = v } else { d.Paraname = strconv.Itoa(int(paraname)) } if u, ok := wellParaUnitMap_en[int(paraname)]; ok { if u == "MPa" && ps_info.R1 == "2" { u = "psi" d.DecodeValue = fmt.Sprintf("%.02f", 145.038*decodeValue) } else if u == "℃" && ps_info.R2 == "2" { u = "℉" d.DecodeValue = fmt.Sprintf("%.02f", 1.8*decodeValue+32) } d.Unit = u } else { d.Unit = "" } d.Time = d.Time[:10] + " " + d.Time[11:19] d.Time = do_time_by_ps(d.Time, ps_info) data = append(data, d) } else { logs.Info("Query Error", err.Error()) } } if len(data) > 0 { for i := len(data) - 1; ; { resp.Data = append(resp.Data, data[i]) i-- if i < 0 { break } } } if len(resp.Data) > 0 { v := resp.Data[0] timeLayout := "2006-01-02 15:04:05" loc, _ := time.LoadLocation("Local") t, _ := time.ParseInLocation(timeLayout, v.Time, loc) if t.Sub(time.Now()).Seconds() > 3600*1 { resp.Time_warn = 1 } } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) // 2. 如果需要,最后设置数据库离线 if needOffline { masterConn2, err := getOdbcConn("master") if err != nil { logs.Info("连接master库失败", err.Error()) fmt.Println("连接master库失败", err.Error()) } else { defer masterConn2.Close() cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE WITH ROLLBACK IMMEDIATE", db) _, err = masterConn2.Exec(cmdSql) if err != nil { logs.Error("SET OFFLINE command execution error:", err.Error()) } } } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getWellHistory_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getWellHistory(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("getWellHistory recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetHisWellReq json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var resp GetHisWellResp var db string var cmdSql string rwLocker.RLock() if v, ok := wellNamemap[req.Id]; ok { rwLocker.RUnlock() db = v } else { logs.Info(fmt.Sprintf("wellsourcename: %s not exist!", req.Id)) rwLocker.RUnlock() jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) return } logs.Info("getWellHistory db:", db) // 1. 检查数据库状态 needOffline := false masterConn, err := getOdbcConn("master") if err != nil { logs.Info("链接master库失败", err.Error()) fmt.Println("链接master库失败", err.Error()) } else { defer masterConn.Close() // 查询数据库状态 checkSql := fmt.Sprintf("SELECT state_desc FROM sys.databases WHERE name = '%s'", db) var status string err = masterConn.QueryRow(checkSql).Scan(&status) if err != nil { fmt.Println("查询数据库状态失败:", err.Error()) logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) onlineSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) _, err = masterConn.Exec(onlineSql) if err != nil { fmt.Println("设置在线失败:", err.Error()) logs.Info("设置在线失败:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为在线\n", db) needOffline = true } } else { fmt.Printf("数据库 %s 已在线,不需要操作\n", db) needOffline = false } } } conn, err := getOdbcConn(db) if err != nil { logs.Info("getWellHistory Connecting Error", err.Error()) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) return } defer conn.Close() var cntSql string var selSql string var whereSql string var ifwhere bool if req.BeginTime != "" { whereSql = fmt.Sprintf("where [4304]>'%s' ", req.BeginTime) ifwhere = true } if req.EndTime != "" { if ifwhere { whereSql += fmt.Sprintf(` and [4304]<'%s'`, req.EndTime) } else { whereSql = fmt.Sprintf("where [4304]<'%s'", req.EndTime) } } if req.EndTime != "" { if ifwhere { whereSql += fmt.Sprintf(` and [4304]<'%s'`, req.EndTime) } else { whereSql = fmt.Sprintf("where [4304]<'%s'", req.EndTime) } } if req.IfVip { if ifwhere { whereSql += fmt.Sprintf(` and [4305] in ('104','105','106')`) } else { whereSql = fmt.Sprintf(" where[4305] in ('104','105','106')") } } cntSql = fmt.Sprintf("select count(*) from (select distinct [4301],[4303],[4304],[4305],[4306],[4307],[4311] from DECODETABLE %s)t", whereSql) rcnt, err := getRecordCount(conn, cntSql) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", cntSql, err.Error())) return } query_cnt := req.Index * req.Count var cnt int if query_cnt > rcnt { cnt = rcnt + req.Count - query_cnt } else { cnt = req.Count } selSql = fmt.Sprintf("select top %v [4301],[4303],[4304],[4305],[4306],[4307],[4311] from ( select distinct top %v [4301],[4303],[4304],[4305],[4306],[4307],[4311] from DECODETABLE ", cnt, req.Index*req.Count) selSql += whereSql ascSql := " order by [4304] asc" descSql := " order by [4304] desc" if req.IfAsc { //asc selSql += ascSql + ")t " + whereSql + descSql } else { //desc selSql += descSql + ")t " + whereSql + ascSql } fmt.Println("getWellHistory sql:", selSql) logs.Info("getWellHistory sql:", selSql) row, err := conn.Query(selSql) if err != nil { logs.Info("Query Error", err.Error()) return } defer row.Close() var data []GetHisWellRespdata resp.Total = rcnt for row.Next() { var d GetHisWellRespdata d.Wellname = req.Id var paraname int var decodeValue float64 if err := row.Scan(&d.Wellnum, &d.WellDepth, &d.Time, ¶name, &decodeValue, &d.Precision, &d.IfWarning); err == nil { if paraname == 5 || paraname == 6 || (paraname >= 39 && paraname <= 44) { decodeValue, _ = decimal.NewFromFloat(decodeValue).Round(4).Float64() d.DecodeValue = fmt.Sprintf("%.04f", decodeValue) } else { decodeValue, _ = decimal.NewFromFloat(decodeValue).Round(2).Float64() d.DecodeValue = fmt.Sprintf("%.02f", decodeValue) } if v, ok := wellParaNameMap[int(paraname)]; ok { d.Paraname = v } else { d.Paraname = strconv.Itoa(int(paraname)) } if u, ok := wellParaUnitMap[int(paraname)]; ok { if u == "MPa" && ps_info.R1 == "2" { u = "psi" d.DecodeValue = fmt.Sprintf("%.02f", 145.038*decodeValue) } else if u == "℃" && ps_info.R2 == "2" { u = "℉" d.DecodeValue = fmt.Sprintf("%.02f", 1.8*decodeValue+32) } d.Unit = u } else { d.Unit = "" } d.Time = d.Time[:10] + " " + d.Time[11:19] d.Time = do_time_by_ps(d.Time, ps_info) data = append(data, d) } else { logs.Info("Query Error", err.Error()) } } if len(data) > 0 { for i := len(data) - 1; ; { resp.Data = append(resp.Data, data[i]) i-- if i < 0 { break } } } if len(resp.Data) > 0 { v := resp.Data[0] timeLayout := "2006-01-02 15:04:05" loc, _ := time.LoadLocation("Local") t, _ := time.ParseInLocation(timeLayout, v.Time, loc) if t.Sub(time.Now()).Seconds() > 3600*1 { resp.Time_warn = 1 } } jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) // 2. 如果需要,最后设置数据库离线 if needOffline { masterConn2, err := getOdbcConn("master") if err != nil { logs.Info("连接master库失败", err.Error()) fmt.Println("连接master库失败", err.Error()) } else { defer masterConn2.Close() cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE WITH ROLLBACK IMMEDIATE", db) _, err = masterConn2.Exec(cmdSql) if err != nil { logs.Error("SET OFFLINE command execution error:", err.Error()) } } } endTime := time.Now().UnixNano() fmt.Println(fmt.Sprintf("getWellHistory recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } // 获取在线井 func getWell_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("getWell_en recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetWellData json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var where_sql string = " where [stats]=1" if req.Id != "" { wellnamesource := "%" + req.Id + "%" where_sql += fmt.Sprintf(` and WELLNameSource like '%s' `, wellnamesource) } if spe_name, ok := spe_user[req.OpUser]; ok { where_sql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } sql := fmt.Sprintf(`select [ID],[WELLNameSource],[WELLName],[stats],[CreateTableTime],COALESCE([IPADDR],''),COALESCE([Operator],'') from [WellNameInformation].[dbo].[WellInformation] %s order by [CreateTableTime] desc`, where_sql) fmt.Println(sql) row, err := sqlConn.Query(sql) if err != nil { fmt.Println("Query Error", err) return } defer row.Close() index := req.Index - 1 var resp GetWellDataResp cnt := 0 for row.Next() { var d wellData var wellState int if err := row.Scan(&d.WellID, &d.WellNameSource, &d.WellName, &wellState, &d.Welltime, &d.Wellip, &d.Welloperator); err == nil { if cnt >= index*req.Count && cnt < (index+1)*req.Count { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) if wellState == 1 { d.Wellstate = "online" } else { d.Wellstate = "offline" } d.Welloperator = strings.Trim(d.Welloperator, " ") d.Rt_flag = get_rt_flag(d) d.Es_flag = get_es_flag(d) resp.Data = append(resp.Data, d) } cnt++ } else { fmt.Println(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() //fmt.Println(1e6) logs.Info(fmt.Sprintf("getWell_en recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func get_rt_flag(req wellData) (flag bool) { conn, err := getOdbcConn(req.WellName) if err != nil { return } defer conn.Close() sqlStr := fmt.Sprintf(`select count([ID]) from [DECODETABLE]`) rows, err := conn.Query(sqlStr) if err == nil { for rows.Next() { var cnt int if err = rows.Scan(&cnt); err == nil { if cnt > 0 { flag = true } } } rows.Close() } return } func get_es_flag(req wellData) (flag bool) { sqlStr := fmt.Sprintf(`select [data] from [analysis_result_engineerin_service] where [wellname]='%s'`, req.WellNameSource) rows, err := sqlConn.Query(sqlStr) if err == nil { for rows.Next() { var es EngineeringServices var s string if err = rows.Scan(&s); err == nil { json.Unmarshal([]byte(s), &es) if es.OpUser != "" { flag = true } } } rows.Close() } return } func getWell(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() logs.Info("getWell recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req GetWellData json.Unmarshal(reqdata, &req) ps_info := get_ps_info(req.OpUser) var where_sql string = " where [stats]=1" if req.Id != "" { wellnamesource := "%" + req.Id + "%" where_sql += fmt.Sprintf(` and WELLNameSource like '%s' `, wellnamesource) } if spe_name, ok := spe_user[req.OpUser]; ok { where_sql += fmt.Sprintf(` and [ClOUDACCOUNT]='%s' `, spe_name) } sql := fmt.Sprintf(`select [ID],[WELLNameSource],[WELLName],[stats],[CreateTableTime],COALESCE([IPADDR],''),COALESCE([Operator],'') from [WellNameInformation].[dbo].[WellInformation] %s order by [CreateTableTime] desc`, where_sql) fmt.Println(sql) row, err := sqlConn.Query(sql) if err != nil { fmt.Println("Query Error", err) return } defer row.Close() index := req.Index - 1 var resp GetWellDataResp cnt := 0 for row.Next() { var d wellData var wellState int if err := row.Scan(&d.WellID, &d.WellNameSource, &d.WellName, &wellState, &d.Welltime, &d.Wellip, &d.Welloperator); err == nil { if cnt >= index*req.Count && cnt < (index+1)*req.Count { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) if wellState == 1 { d.Wellstate = "在线" } else { d.Wellstate = "离线" } d.Welloperator = strings.Trim(d.Welloperator, " ") d.Rt_flag = get_rt_flag(d) d.Es_flag = get_es_flag(d) resp.Data = append(resp.Data, d) } cnt++ } else { fmt.Println(err.Error()) } } resp.Total = cnt jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) endTime := time.Now().UnixNano() //fmt.Println(1e6) logs.Info(fmt.Sprintf("getWell recv req end, use time: %v ms", (endTime-beginTime)/1e6)) } func getInstrumentMess(response http.ResponseWriter, request *http.Request) { // 解析请求数据 reqdata, err := ioutil.ReadAll(request.Body) if err != nil { http.Error(response, "读取请求体失败", http.StatusBadRequest) return } var req InstrumentMess if err := json.Unmarshal(reqdata, &req); err != nil { http.Error(response, "无效的 JSON 格式", http.StatusBadRequest) return } // 使用工具函数获取数据 resp, err := getInstrumentMessUtil(req) fmt.Println("resp---------------", resp) if err != nil { fmt.Println("获取仪器信息失败:", err) http.Error(response, "获取仪器信息失败", http.StatusInternalServerError) return } // 返回 JSON 响应 response.Header().Set("Content-Type", "application/json") if err := json.NewEncoder(response).Encode(resp); err != nil { fmt.Println("JSON 编码错误:", err) http.Error(response, "返回结果编码失败", http.StatusInternalServerError) } } func getInstrumentMess_en(response http.ResponseWriter, request *http.Request) { } func getInstrumentMessUtil(req InstrumentMess) (*InstrumentMessRespdata, error) { // 查询仪器所在的所有井 sqlWellData := fmt.Sprintf(`SELECT DISTINCT wi.WELLNameSource , wi.WELLName ,wi.id FROM WellInformation wi JOIN REPAIRANDMENT r ON wi.WELLNameSource = r.[2321] WHERE r.[2327] = '%s' AND r.[2328] = '%s' ORDER BY id desc`, req.Series, req.Instrument) fmt.Println("查询仪器所在的所有井------------", sqlWellData) logs.Info("查询仪器所在的所有井------------", sqlWellData) wellRow, err := sqlConn.Query(sqlWellData) if err != nil { fmt.Println("查询错误:", err) return nil, err } defer wellRow.Close() var wellInfos []get_vibration_resp for wellRow.Next() { var wellInfo get_vibration_resp if err := wellRow.Scan(&wellInfo.WellNameSource, &wellInfo.Wellname, &wellInfo.ID); err == nil { wellInfos = append(wellInfos, wellInfo) } } // 查询维保表信息 sqlQuery := fmt.Sprintf(` SELECT DISTINCT TOP 1 ID, [2321], [2327], [2328], [2339], FORMAT([2329], 'yyyy-MM-ddTHH:mm:ssZ') AS Time, COALESCE([2340], '') AS [2340], CASE WHEN COALESCE([2331], 0) < COALESCE([2340], 0) THEN COALESCE([2340], '') ELSE COALESCE([2331], '') END AS [2331] FROM REPAIRANDMENT WHERE [2321] = '%s' AND [2327] = '%s' AND [2328] = '%s' ORDER BY ID DESC`, req.WellName, req.Series, req.Instrument) fmt.Println("查询维保表信息------------", sqlQuery) logs.Info("查询维保表信息------------", sqlQuery) var db string wellSql := fmt.Sprintf(`SELECT WELLName from WellInformation where WELLNameSource = '%s'`, req.WellName) dbData := sqlConn.QueryRow(wellSql) dbData.Scan(&db) fmt.Println("db----------", db) logs.Info("db----------", db) // 1. 检查数据库状态 needOffline := false masterConn, err := getOdbcConn("master") if err != nil { logs.Info("链接master库失败", err.Error()) fmt.Println("链接master库失败", err.Error()) } else { defer masterConn.Close() // 查询数据库状态 checkSql := fmt.Sprintf("SELECT state_desc FROM sys.databases WHERE name = '%s'", db) var status string err = masterConn.QueryRow(checkSql).Scan(&status) if err != nil { fmt.Println("查询数据库状态失败:", err.Error()) logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) onlineSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) _, err = masterConn.Exec(onlineSql) if err != nil { fmt.Println("设置在线失败:", err.Error()) logs.Info("设置在线失败:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为在线\n", db) needOffline = true } } else { fmt.Printf("数据库 %s 已在线,不需要操作\n", db) needOffline = false } } } conn, err := getOdbcConn(db) row, err := conn.Query(sqlQuery) if err != nil { fmt.Println("查询错误:", err) return nil, err } defer row.Close() // 创建响应对象并填充数据 resp := &InstrumentMessRespdata{} if row.Next() { if err := row.Scan( &resp.ID, &resp.WellName, &resp.Series, &resp.Instrument, &resp.Version, &resp.Time, &resp.WorkTimes, &resp.WorkTime, ); err != nil { fmt.Println("解析错误:", err) return nil, err } } querySQL := fmt.Sprintf(`SELECT COALESCE(process_record, '') as process_record ,COALESCE(process_inspection, '') as process_inspection ,COALESCE(final_inspection, '') as final_inspection FROM t_quality_inspection WHERE well_name = '%s' AND series = '%s' AND instrument = '%s'`, req.WellName, req.Series, req.Instrument) var respData QualityDataResp fmt.Println("querySQL-----------------", querySQL) logs.Info("querySQL-----------------", querySQL) err = sqlConn.QueryRow(querySQL).Scan( &respData.ProcessRecord, &respData.ProcessInspection, &respData.FinalInspection, ) resp.QualityData = respData //仪器施工汇总 resp.WorkMessList = workMess(wellInfos, req.Flag, req.Content, req.Series, req.Instrument) //维保情况 resp.GetLcmRespData = getMaintenanceMess(req.Series, req.Instrument, req.Opuser) //仪器所在部门 resp.Dept = get_DeptMess(req.Series, req.Instrument) //仪器工作状态 resp.Content = req.Content // 2. 如果需要,最后设置数据库离线 if needOffline { logs.Info("开始关库,数据库名: %s", db) masterConn2, err := getOdbcConn("master") if err != nil { logs.Error("连接master库失败, 数据库名: %s, 错误信息: %v", db, err) fmt.Printf("连接master库失败, 数据库名: %s, 错误信息: %v\n", db, err) } else { defer masterConn2.Close() cmdSql := fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE WITH ROLLBACK IMMEDIATE", db) _, err = masterConn2.Exec(cmdSql) if err != nil { logs.Error("关闭数据库失败, 数据库名: %s, 错误信息: %v", db, err) fmt.Printf("关闭数据库失败, 数据库名: %s, 错误信息: %v\n", db, err) } else { logs.Info("关闭数据库成功, 数据库名: %s", db) fmt.Printf("关闭数据库成功, 数据库名: %s\n", db) } } } return resp, nil } func workMess(wellInfos []get_vibration_resp, flag string, content string, series string, instrument string) []WellMessRespdata { fmt.Println("仪器施工汇总开始------------------------------------", wellInfos) fmt.Println("series------------------------------------", series) fmt.Println("instrument------------------------------------", instrument) var results []WellMessRespdata if len(wellInfos) == 0 { fmt.Println("wellInfos 是空的,没有数据可打印") return results } var db string // 循环打印每个 WellNameSource workMessSql := `SELECT MAX(id) AS id, [5200] AS WellName, ( SELECT TOP 1 [5203] FROM [EQUIPMENTRECORDS] ORDER BY ID DESC ) AS SampleField, CONVERT(VARCHAR(50), MIN([5217])) + '-' + CONVERT(VARCHAR(50), MAX([5217])) AS ValueInterval, MAX([5220]) AS GlobalMax1, MAX([5221]) AS GlobalMax2, ( SELECT TOP 1 [5202] FROM [dbo].[EQUIPMENTRECORDS] t2 WHERE t2.[5200] = t1.[5200] and t2.[5200] IS NOT NULL ORDER BY t2.ID DESC ) AS PersonnelList FROM [dbo].[EQUIPMENTRECORDS] t1` for _, well := range wellInfos { qsql := workMessSql + fmt.Sprintf(` WHERE [5200] = '%s' GROUP BY [5200] `, well.WellNameSource) wellSql := fmt.Sprintf(`SELECT WELLName from WellInformation where WELLNameSource = '%s'`, well.WellNameSource) wellRow := sqlConn.QueryRow(wellSql) wellRow.Scan(&db) if strings.HasPrefix(db, "LH2020-") || strings.HasPrefix(db, "LH2021-") || strings.HasPrefix(db, "LH2022-") || strings.HasPrefix(db, "LH2023-") || strings.HasPrefix(db, "LH2024-") { conn, err := getOdbcConn("master") if err != nil { logs.Info("链接master库失败", err.Error()) fmt.Println("链接master库失败", err.Error()) } defer conn.Close() cmdSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) _, err = conn.Exec(cmdSql) } // 第一个查询:获取仪器组合 conn, err := getOdbcConn(db) if err != nil { fmt.Println("查询失败", err.Error()) continue } defer conn.Close() fmt.Println("qsql--------------------", qsql) logs.Info("qsql--------------------", qsql) rows, err := conn.Query(qsql) if err != nil { fmt.Println("查询工作状态出错", err.Error()) logs.Info("查询工作状态出错", err.Error()) continue } defer rows.Close() var itemCount int for rows.Next() { itemCount++ var item WellMessRespdata var id, wellName, sampleField, valueInterval, personnelList, globalMax1, globalMax2 string //先扫描工作数据 if err := rows.Scan(&id, &wellName, &sampleField, &valueInterval, &globalMax1, &globalMax2, &personnelList); err != nil { continue } //查询上传文件数据 queryUploadSql := fmt.Sprintf(`SELECT id, file_name, create_user, create_time, well_file_id, type,real_file_name FROM t_file WHERE type='tool_detail_instrument' AND well_file_id='%s' AND series = '%s' AND instrument = '%s' AND file_name IS NOT NULL`, id, series, instrument) uploadRows, err := sqlConn.Query(queryUploadSql) if err != nil { fmt.Printf("查询上传数据失败: %v\n", err) logs.Info("查询上传数据失败: %v\n", err) continue } //查询上传链接 linkId := fmt.Sprintf(`SELECT DISTINCT link FROM t_file WHERE type='tool_detail_instrument' AND well_file_id='%s' AND series = '%s' AND instrument = '%s'`, id, series, instrument) fmt.Println("linkId--------", linkId) logs.Info("查询上传链接", linkId) row, err := sqlConn.Query(linkId) if err != nil { fmt.Printf("查询链接失败: %v\n", err) logs.Info("查询链接失败: %v\n", err) } // 处理查询结果并打印 var link string if row.Next() { err := row.Scan(&link) if err != nil { fmt.Printf("扫描链接行失败: %v\n", err) } } else { fmt.Println("未查询到链接") } row.Close() var uploadData []uploadRes for uploadRows.Next() { var res uploadRes if err := uploadRows.Scan( &res.ID, &res.FileName, &res.CreateUser, &res.CreateTime, &res.WellFileId, &res.Types, &res.RealFileName, ); err != nil { fmt.Printf("扫描上传数据行失败: %v\n", err) continue } uploadData = append(uploadData, res) } uploadRows.Close() // 3. 填充数据 fmt.Printf("扫描到的值 - ID: %s, WellName: %s, SampleField: %s, ValueInterval: %s, GlobalMax1: %s, GlobalMax2: %s, PersonnelList: %s\n", id, wellName, sampleField, valueInterval, globalMax1, globalMax2, personnelList) // 去掉personnelList开头的第一个逗号 if len(personnelList) > 0 && personnelList[0] == ',' { personnelList = personnelList[1:] } item.ID = id item.WellName = wellName item.SampleField = sampleField item.ValueInterval = valueInterval item.GlobalMax1 = globalMax1 item.GlobalMax2 = globalMax2 item.PersonnelList = personnelList item.Data = uploadData // 添加上传数据 item.Link = link //添加上传链接 if flag == "0" { item.Content = "正常" } else { item.Content = content } item.Flag = flag results = append(results, item) logs.Info("results---------", results) fmt.Println("results---------", results) } if itemCount == 0 { fmt.Println("未查询到数据") logs.Info("未查询到数据11111111111") } } fmt.Println("仪器施工汇总结束------------------------------------") return results } func getMaintenanceMess(series string, instrument string, opuser string) []GetLcmRespData { logs.Info("维保情况开始------------------------------------") fmt.Println("维保情况开始------------------------------------") var result []GetLcmRespData ps_info := get_ps_info(opuser) var whereSql string var ifWhere bool if series != "" { likeid := "%" + series + "%" if ifWhere { whereSql += fmt.Sprintf(` and [sid] like '%s'`, likeid) } else { whereSql = fmt.Sprintf(` [sid] like '%s'`, likeid) } ifWhere = true } if instrument != "" { likeid := "%" + instrument + "%" if ifWhere { whereSql += fmt.Sprintf(` and [iid] like '%s'`, likeid) } else { whereSql = fmt.Sprintf(` [iid] like '%s'`, likeid) } ifWhere = true } // 默认查询所有记录,可以根据需要添加分页逻辑 selSql := "select [ID],[sid],[iid],[repair_cnt],[repair_level],[repair_context],[time],[user] from [life_cycle_manager]" if ifWhere { selSql += " where" + whereSql } selSql += " order by time desc" fmt.Println("查询维保情况sql=====", selSql) logs.Info("查询维保情况sql=====", selSql) conn, err := getOdbcConn("WellNameInformation") rows, err := conn.Query(selSql) if err != nil { logs.Error("查询维保情况 Query Error", err.Error()) return result } defer rows.Close() for rows.Next() { var d GetLcmRespData if err = rows.Scan(&d.ID, &d.Series, &d.InstrumentID, &d.Repair_cnt, &d.Repair_level, &d.Note, &d.Time, &d.Applicanter); err != nil { logs.Error("getLcm scan Error", err.Error()) fmt.Println("getLcm scan Error", err.Error()) continue } queryUploadSql := fmt.Sprintf(`SELECT id, file_name, create_user, create_time, well_file_id, type ,real_file_name FROM t_file WHERE type='tool_detail_repair' AND file_name IS NOT NULL AND well_file_id= '%s'`, d.ID) uploadRows, err := sqlConn.Query(queryUploadSql, sql.Named("wellFileId", d.ID)) if err != nil { fmt.Printf("查询上传数据失败: %v\n", err) logs.Info("查询上传数据失败: %v\n", err) continue } var uploadData []uploadRes for uploadRows.Next() { var res uploadRes if err := uploadRows.Scan( &res.ID, &res.FileName, &res.CreateUser, &res.CreateTime, &res.WellFileId, &res.Types, &res.RealFileName, ); err != nil { fmt.Printf("扫描上传数据行失败: %v\n", err) continue } uploadData = append(uploadData, res) } if len(uploadData) == 0 { fmt.Println("uploadData 是空的,没有查询到文件数据") } else { fmt.Printf("uploadData 内容: %+v\n", uploadData) } uploadRows.Close() //查询上传链接 queryLinkUploadSql := fmt.Sprintf(`SELECT DISTINCT link FROM t_file WHERE type='tool_detail_repair' AND well_file_id= '%s'`, d.ID) row, err := sqlConn.Query(queryLinkUploadSql) if err != nil { fmt.Printf("查询链接失败: %v\n", err) } var link string if row.Next() { err := row.Scan(&link) if err != nil { fmt.Printf("扫描链接行失败: %v\n", err) } else { fmt.Printf("查询到的链接: %s\n", link) } } else { fmt.Println("未查询到链接") } row.Close() // 处理时间格式 if len(d.Time) >= 19 { d.Time = d.Time[:10] + " " + d.Time[11:19] d.Time = do_time_by_ps(d.Time, ps_info) } // 判断是否显示操作按钮(12小时内) timeLayout := "2006-01-02 15:04:05" loc, _ := time.LoadLocation("Local") opTime, err := time.ParseInLocation(timeLayout, d.Time, loc) if err == nil { d.IfShowOp = time.Since(opTime).Hours() < 12 } else { d.IfShowOp = false } d.Data = uploadData d.Link = link result = append(result, d) } return result } func get_DeptMess(series string, instrument string) string { query := fmt.Sprintf(`SELECT DISTINCT COALESCE(u.department + N' ', N'') AS dept FROM [EQUIPMENTASSETS] e LEFT JOIN [userinfo] u ON e.[6813] = u.username WHERE e.[6803] = '%s' AND e.[6804] = '%s' AND e.[6813] IS NOT NULL;`, series, instrument) fmt.Println("执行的SQL语句: ------------- ", query) // 执行查询(使用参数防止SQL注入) rows, err := sqlConn.Query(query, sql.Named("series", series), sql.Named("instrument", instrument)) if err != nil { fmt.Println("查询错误:", err) return "" } defer rows.Close() // 存储所有结果的字符串 var results []string for rows.Next() { var deptInfo string if err := rows.Scan(&deptInfo); err != nil { fmt.Println("数据解析错误:", err) continue } results = append(results, deptInfo) } // 检查遍历过程中是否有错误 if err := rows.Err(); err != nil { fmt.Println("行遍历错误:", err) return "" } // 处理结果并返回 switch len(results) { case 0: return "" case 1: return results[0] // 只有一条结果时直接返回 default: // 多条结果时用分号连接 return strings.TrimSpace(strings.Join(results, "\n")) } } func saveLinkData(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("saveLinkData recv req begin", time.Now().Format("2006-01-02 15:04:05")) // 设置响应头为JSON格式 response.Header().Set("Content-Type", "application/json") // 读取并解析请求体 reqdata, err := ioutil.ReadAll(request.Body) if err != nil { fmt.Println("读取请求体失败:", err) response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code": 1, "msg": "无效的请求数据"}`)) return } var req LinkDataReq if err := json.Unmarshal(reqdata, &req); err != nil { fmt.Println("解析JSON失败:", err) response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code": 1, "msg": "无效的JSON数据"}`)) return } // 检查必填字段 if req.WellName == "" || req.Series == "" || req.Instrument == "" { response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code": 1, "msg": "缺少必要参数"}`)) return } querySQL := fmt.Sprintf(`SELECT id FROM t_file WHERE well_name = '%s' AND series = '%s' AND instrument = '%s' AND well_file_id = '%s'`, req.WellName, req.Series, req.Instrument, req.ID) row := sqlConn.QueryRow(querySQL) var id string err = row.Scan(&id) // 根据查询结果执行插入或更新 if err != nil { if err == sql.ErrNoRows { fmt.Println("记录不存在,执行插入") // 记录不存在,执行插入 err = insertFileRecord(req.ID, "", "", req.OpUser, req.Type, req.Series, req.Instrument, req.WellName, req.Link) } else { // 查询出错 fmt.Println("查询数据失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code": 1, "msg": "数据库查询失败"}`)) return } } else { fmt.Println("记录存在,执行更新") // 记录存在,执行更新 err = updateFileRecord(id, req.Link, "", req.OpUser, req.Type, req.Series, req.Instrument, req.WellName, req.Link) } // 处理操作结果 if err != nil { fmt.Println("数据库操作失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code": 1, "msg": "保存数据失败"}`)) return } // 返回成功响应 successResponse := map[string]interface{}{ "code": 0, "msg": "数据保存成功", } jsonResponse, _ := json.Marshal(successResponse) response.Write(jsonResponse) fmt.Println("saveLinkData recv req end", time.Now().Format("2006-01-02 15:04:05"), "cost:", (time.Now().UnixNano()-beginTime)/1e6, "ms") } // 设备资产管理,设备页签的列表接口。 func get_dev_list(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("get_dev_list recv req begin", time.Now().Format("2006-01-02 15:04:05")) response.Header().Set("Content-Type", "application/json") // 读取请求体(支持 JSON 格式参数) reqdata, err := ioutil.ReadAll(request.Body) if err != nil { fmt.Println("读取请求体失败:", err) response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code": 1, "msg": "无效的请求数据"}`)) return } var req devData if err := json.Unmarshal(reqdata, &req); err != nil { fmt.Println("解析JSON失败:", err) response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code": 1, "msg": "无效的JSON数据"}`)) return } // 分页参数(默认第1页,每页50条) page := 1 pageSize := 50 if req.Index > 0 { page = req.Index } if req.Count > 0 { pageSize = req.Count } // 转义函数 escape := func(s string) string { return strings.ReplaceAll(s, "'", "''") } // 辅助函数:构建 IN 子句 buildIn := func(values []string, col string) string { if len(values) == 0 { return "" } quoted := make([]string, len(values)) for i, v := range values { quoted[i] = "'" + escape(v) + "'" } return fmt.Sprintf("%s IN (%s)", col, strings.Join(quoted, ",")) } // 构建 WHERE 条件 var whereParts []string // 使用 IN 子句 if parts := buildIn(req.Serial, "series"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(req.Number, "instrument"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(req.WellName, "well_name"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(req.Engineer, "engineer"); parts != "" { whereParts = append(whereParts, parts) } if req.InTimeStart != "" { whereParts = append(whereParts, fmt.Sprintf("in_time >= '%s'", escape(req.InTimeStart))) } if req.InTimeEnd != "" { whereParts = append(whereParts, fmt.Sprintf("in_time <= '%s'", escape(req.InTimeEnd))) } // 构建 WHERE 子句 whereSQL := "" if len(whereParts) > 0 { whereSQL = " WHERE " + strings.Join(whereParts, " AND ") } // 查询总数 countSQL := `SELECT COUNT(*) FROM ( SELECT DISTINCT product_name, series, instrument, well_name, person_in_time, person_out_time, in_time, out_time, engineer, total_work_time, current_work_time, service_type, location FROM base_worktime_data` + whereSQL + ` ) t` var totalCount int64 err = sqlConn.QueryRow(countSQL).Scan(&totalCount) if err != nil { fmt.Println("get_dev_list查询总数失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code": 1, "msg": "数据库查询失败"}`)) return } // 查询数据(分页) offset := (page - 1) * pageSize dataSQL := fmt.Sprintf(` SELECT DISTINCT product_name, series, instrument, well_name, person_in_time, person_out_time, in_time, out_time, engineer, total_work_time, current_work_time, service_type, location FROM base_worktime_data%s ORDER BY in_time DESC OFFSET %d ROWS FETCH NEXT %d ROWS ONLY `, whereSQL, offset, pageSize) fmt.Println("get_dev_list-sql----", dataSQL) rows, err := sqlConn.Query(dataSQL) if err != nil { fmt.Println("查询设备列表失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code": 1, "msg": "数据库查询失败"}`)) return } defer rows.Close() // 初始化为空切片,而不是 nil resp := make([]devRespData, 0) for rows.Next() { var d devRespData var ( productName, serial, number sql.NullString wellName, pinTimeRaw, poutTimeRaw, inTimeRaw, outTimeRaw sql.NullString engineer, totalWorkTime, currentWorkTime sql.NullString serviceType, location sql.NullString ) err := rows.Scan( &productName, &serial, &number, &wellName, &pinTimeRaw, &poutTimeRaw, &inTimeRaw, &outTimeRaw, &engineer, &totalWorkTime, ¤tWorkTime, &serviceType, &location, ) if err != nil { fmt.Println("扫描数据失败:", err) continue } d.ProductName = productName.String d.Serial = serial.String d.Number = number.String d.WellName = wellName.String d.PInTime = formatDateTime(pinTimeRaw.String) d.POutTime = formatDateTime(poutTimeRaw.String) d.InTime = formatDateTime(inTimeRaw.String) d.OutTime = formatDateTime(outTimeRaw.String) d.Engineer = engineer.String d.TotalWorkTime = totalWorkTime.String d.CurrentWorkTime = currentWorkTime.String d.ServiceType = serviceType.String d.Location = location.String resp = append(resp, d) } if err = rows.Err(); err != nil { fmt.Println("遍历数据失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code": 1, "msg": "数据库查询失败"}`)) return } // 返回数据(包含总数,便于前端分页) responseData := map[string]interface{}{ "code": 0, "msg": "操作成功", "data": resp, "total": totalCount, } jsonResponse, err := json.Marshal(responseData) if err != nil { response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code": 1, "msg": "生成响应失败"}`)) return } response.Write(jsonResponse) fmt.Println("get_dev_list recv req end", time.Now().Format("2006-01-02 15:04:05"), "cost:", (time.Now().UnixNano()-beginTime)/1e6, "ms") } func export_Seir_detail(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() // 1. 解析 JSON Body 参数 body, err := ioutil.ReadAll(request.Body) if err != nil { fmt.Println("读取请求体失败:", err) response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code":1,"msg":"读取请求参数失败"}`)) return } defer request.Body.Close() var reqData SeirDetailReqData err = json.Unmarshal(body, &reqData) if err != nil { fmt.Println("解析JSON失败:", err) response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code":1,"msg":"请求参数格式错误"}`)) return } // 数组条件 seriesList := reqData.Series instrumentList := reqData.Instrument productNameList := reqData.ProductName wellNameList := reqData.WellName engineerList := reqData.Engineer locationList := reqData.Location serviceTypeList := reqData.ServiceType // 时间范围 startTime := reqData.StartTime endTime := reqData.EndTime // 分页 page := reqData.Index if page <= 0 { page = 1 } pageSize := reqData.Count if pageSize <= 0 { pageSize = 10000 } if pageSize > 50000 { pageSize = 50000 } // 辅助函数:转义单引号(防止SQL注入) escape := func(s string) string { return strings.ReplaceAll(s, "'", "''") } // 辅助函数:构建 IN 子句 buildIn := func(values []string, col string) string { if len(values) == 0 { return "" } quoted := make([]string, len(values)) for i, v := range values { quoted[i] = "'" + escape(v) + "'" } return fmt.Sprintf("%s IN (%s)", col, strings.Join(quoted, ",")) } // 动态构建 WHERE 条件 var whereParts []string if parts := buildIn(seriesList, "series"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(instrumentList, "instrument"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(productNameList, "product_name"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(wellNameList, "well_name"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(engineerList, "engineer"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(locationList, "location"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(serviceTypeList, "service_type"); parts != "" { whereParts = append(whereParts, parts) } if startTime != "" { whereParts = append(whereParts, "in_time >= '"+escape(startTime)+"'") } if endTime != "" { whereParts = append(whereParts, "in_time <= '"+escape(endTime)+"'") } whereClause := "" if len(whereParts) > 0 { whereClause = " WHERE " + strings.Join(whereParts, " AND ") } // 2. 查询总记录数 countSQL := "SELECT COUNT(*) FROM base_worktime_data" + whereClause fmt.Println("countSQL:", countSQL) var totalCount int64 err = sqlConn.QueryRow(countSQL).Scan(&totalCount) if err != nil { fmt.Println("查询总数失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"查询数据失败"}`)) return } // 3. 查询数据(带分页) dataSQL := "SELECT series, instrument, product_name,person_in_time, person_out_time,in_time, out_time, service_type, location, total_work_time, current_work_time, well_name, engineer" + " FROM base_worktime_data" + whereClause + fmt.Sprintf(" ORDER BY id ") fmt.Println("dataSQL:", dataSQL) logs.Info("仪器为单位sql:", dataSQL) rows, err := sqlConn.Query(dataSQL) if err != nil { fmt.Println("查询数据失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"查询数据失败"}`)) return } defer rows.Close() var allTools []devToolata for rows.Next() { var tool devToolata err := rows.Scan( &tool.Series, &tool.Instrument, &tool.ProductName, &tool.PInTime, &tool.POutTime, &tool.InTime, &tool.OutTime, &tool.ServiceType, &tool.Location, &tool.TotalWorkTime, &tool.CurrentWorkTime, &tool.WellName, &tool.Engineer, ) if err != nil { fmt.Println("扫描数据失败:", err) continue } allTools = append(allTools, tool) } // 4. 生成 Excel 文件 file := xlsx.NewFile() sheet, err := file.AddSheet("工具明细") if err != nil { fmt.Println("创建sheet失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"生成文件失败"}`)) return } // 样式 style := xlsx.NewStyle() font := *xlsx.NewFont(11, "宋体") style.Font = font alignment := xlsx.Alignment{Horizontal: "center", Vertical: "center"} style.Alignment = alignment style.ApplyAlignment = true // 表头 headers := []string{ "序列号", "仪器名称", "编码", "井名称", "人员上井时间", "人员离井时间", "仪器入井时间", "仪器出井时间", "仪器工程师", "仪器本次使用时长(h)", "仪器累计使用时长(h)", "所在地", } headerRow := sheet.AddRow() for _, h := range headers { cell := headerRow.AddCell() cell.SetStyle(style) cell.Value = h } // 数据行 for _, tool := range allTools { values := []string{ tool.Series, tool.ProductName, tool.Instrument, tool.WellName, formatDateTime(tool.PInTime), formatDateTime(tool.POutTime), formatDateTime(tool.InTime), formatDateTime(tool.OutTime), tool.Engineer, tool.CurrentWorkTime, tool.TotalWorkTime, tool.Location, } row := sheet.AddRow() for _, v := range values { cell := row.AddCell() cell.SetStyle(style) cell.Value = v } } // 5. 保存文件 err = os.MkdirAll("./authfile", 0755) if err != nil { fmt.Println("创建导出目录失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"创建目录失败"}`)) return } filename := fmt.Sprintf("井上仪器明细清单(仪器)_%s.xlsx", time.Now().Format("20060102150405")) filePath := fmt.Sprintf("./authfile/%s", filename) err = file.Save(filePath) if err != nil { fmt.Println("保存Excel文件失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"保存文件失败"}`)) return } // 6. 返回响应 type exportResp struct { FileId string `json:"fileId"` TotalCount int64 `json:"totalCount"` ExportRows int `json:"exportRows"` } resp := exportResp{ FileId: filename, TotalCount: totalCount, ExportRows: len(allTools), } jresp, _ := json.Marshal(resp) response.Header().Set("Content-Type", "application/json") response.Write(jresp) fmt.Println("export_Seir_detail recv req end", time.Now().Format("2006-01-02 15:04:05"), "cost:", (time.Now().UnixNano()-beginTime)/1e6, "ms") } func export_Seir_detail_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() // 1. 解析 JSON Body 参数 body, err := ioutil.ReadAll(request.Body) if err != nil { fmt.Println("读取请求体失败:", err) response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code":1,"msg":"Request parameter format error."}`)) return } defer request.Body.Close() var reqData SeirDetailReqData err = json.Unmarshal(body, &reqData) if err != nil { fmt.Println("解析JSON失败:", err) response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code":1,"msg":"Request parameter format error."}`)) return } // 数组条件 seriesList := reqData.Series instrumentList := reqData.Instrument productNameList := reqData.ProductName wellNameList := reqData.WellName engineerList := reqData.Engineer locationList := reqData.Location serviceTypeList := reqData.ServiceType // 时间范围 startTime := reqData.StartTime endTime := reqData.EndTime // 分页 page := reqData.Index if page <= 0 { page = 1 } pageSize := reqData.Count if pageSize <= 0 { pageSize = 10000 } if pageSize > 50000 { pageSize = 50000 } // 辅助函数:转义单引号(防止SQL注入) escape := func(s string) string { return strings.ReplaceAll(s, "'", "''") } // 辅助函数:构建 IN 子句 buildIn := func(values []string, col string) string { if len(values) == 0 { return "" } quoted := make([]string, len(values)) for i, v := range values { quoted[i] = "'" + escape(v) + "'" } return fmt.Sprintf("%s IN (%s)", col, strings.Join(quoted, ",")) } // 动态构建 WHERE 条件 var whereParts []string if parts := buildIn(seriesList, "series"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(instrumentList, "instrument"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(productNameList, "product_name"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(wellNameList, "well_name"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(engineerList, "engineer"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(locationList, "location"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(serviceTypeList, "service_type"); parts != "" { whereParts = append(whereParts, parts) } if startTime != "" { whereParts = append(whereParts, "in_time >= '"+escape(startTime)+"'") } if endTime != "" { whereParts = append(whereParts, "in_time <= '"+escape(endTime)+"'") } whereClause := "" if len(whereParts) > 0 { whereClause = " WHERE " + strings.Join(whereParts, " AND ") } // 2. 查询总记录数 countSQL := "SELECT COUNT(*) FROM base_worktime_data" + whereClause fmt.Println("countSQL:", countSQL) var totalCount int64 err = sqlConn.QueryRow(countSQL).Scan(&totalCount) if err != nil { fmt.Println("查询总数失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"Failed to retrieve data from the database."}`)) return } // 3. 查询数据(带分页) dataSQL := "SELECT series, instrument, product_name, person_in_time ,person_out_time,in_time, out_time, service_type, location, total_work_time, current_work_time, well_name, engineer" + " FROM base_worktime_data" + whereClause + fmt.Sprintf(" ORDER BY id ") fmt.Println("dataSQL:", dataSQL) logs.Info("仪器为单位sql:", dataSQL) rows, err := sqlConn.Query(dataSQL) if err != nil { fmt.Println("查询数据失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"Failed to retrieve data from the database."}`)) return } defer rows.Close() var allTools []devToolata for rows.Next() { var tool devToolata err := rows.Scan( &tool.Series, &tool.Instrument, &tool.ProductName, &tool.PInTime, &tool.POutTime, &tool.InTime, &tool.OutTime, &tool.ServiceType, &tool.Location, &tool.TotalWorkTime, &tool.CurrentWorkTime, &tool.WellName, &tool.Engineer, ) if err != nil { fmt.Println("Scan data failed.:", err) continue } allTools = append(allTools, tool) } // 4. 生成 Excel 文件 file := xlsx.NewFile() sheet, err := file.AddSheet("Tool Details") if err != nil { fmt.Println("创建sheet失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"Failed to generate file."}`)) return } // 样式 style := xlsx.NewStyle() font := *xlsx.NewFont(11, "宋体") style.Font = font alignment := xlsx.Alignment{Horizontal: "center", Vertical: "center"} style.Alignment = alignment style.ApplyAlignment = true // 表头 headers := []string{ "Serial No.", "instrument name", "Code", "Well Name", "Person On-Site Time", "Person Out-Site Time", "In Hold Time", "Out Hold Time", "Engineer", "Current Duration (h)", "Total Duration(h)", "Location", } headerRow := sheet.AddRow() for _, h := range headers { cell := headerRow.AddCell() cell.SetStyle(style) cell.Value = h } // 数据行 for _, tool := range allTools { values := []string{ tool.Series, tool.ProductName, tool.Instrument, tool.WellName, formatDateTime(tool.PInTime), formatDateTime(tool.POutTime), formatDateTime(tool.InTime), formatDateTime(tool.OutTime), tool.Engineer, tool.CurrentWorkTime, tool.TotalWorkTime, tool.Location, } row := sheet.AddRow() for _, v := range values { cell := row.AddCell() cell.SetStyle(style) cell.Value = v } } // 5. 保存文件 err = os.MkdirAll("./authfile", 0755) if err != nil { fmt.Println("创建导出目录失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"Failed to create directory."}`)) return } filename := fmt.Sprintf("Well Site Instrument Details List (Instrument)_%s.xlsx", time.Now().Format("20060102150405")) filePath := fmt.Sprintf("./authfile/%s", filename) err = file.Save(filePath) if err != nil { fmt.Println("保存Excel文件失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"Failed to save file."}`)) return } // 6. 返回响应 type exportResp struct { FileId string `json:"fileId"` TotalCount int64 `json:"totalCount"` ExportRows int `json:"exportRows"` } resp := exportResp{ FileId: filename, TotalCount: totalCount, ExportRows: len(allTools), } jresp, _ := json.Marshal(resp) response.Header().Set("Content-Type", "application/json") response.Write(jresp) fmt.Println("export_Seir_detail recv req end", time.Now().Format("2006-01-02 15:04:05"), "cost:", (time.Now().UnixNano()-beginTime)/1e6, "ms") } // 格式化 ISO 8601 时间为 "2006-01-02 15:04:05" func formatDateTime(iso string) string { if iso == "" { return "" } // 尝试解析 RFC3339 t, err := time.Parse(time.RFC3339, iso) if err == nil { if t.Year() <= 1900 { return "" } return t.Format("2006-01-02 15:04:05") } // 尝试解析 "2006-01-02 15:04:05" 格式 t, err = time.Parse("2006-01-02 15:04:05", iso) if err == nil { if t.Year() <= 1900 { return "" } return t.Format("2006-01-02 15:04:05") } // 如果 iso 本身就是 "1900-01-01 00:00:00" 等 if strings.HasPrefix(iso, "1900-01-01") { return "" } return iso // 其他情况返回原值 } func export_Well_detail(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() // 1. 解析 JSON Body 参数 body, err := ioutil.ReadAll(request.Body) if err != nil { fmt.Println("读取请求体失败:", err) response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code":1,"msg":"读取请求参数失败"}`)) return } defer request.Body.Close() var reqData WellDetailReqData err = json.Unmarshal(body, &reqData) if err != nil { fmt.Println("解析JSON失败:", err) response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code":1,"msg":"请求参数格式错误"}`)) return } // 打印日志验证 fmt.Println("wellNameList--------", reqData.Wellname) fmt.Println("serial:", reqData.Serial) fmt.Println("number:", reqData.Number) fmt.Println("engineer:", reqData.Engineer) fmt.Println("in_time_start:", reqData.InTimeStart) fmt.Println("in_time_end:", reqData.InTimeEnd) // if reqData.InTimeStart == "" { // response.WriteHeader(http.StatusOK) // response.Write([]byte(`{"code":1,"msg":"请填写入井开始时间"}`)) // return // } // 数组条件(从 reqData 中获取) seriesList := reqData.Serial instrumentList := reqData.Number wellNameList := reqData.Wellname engineerList := reqData.Engineer serviceType := reqData.ServiceType // 时间范围 startTime := reqData.InTimeStart endTime := reqData.InTimeEnd // 分页(从 reqData 中获取) page := reqData.Index if page <= 0 { page = 1 } pageSize := reqData.Count if pageSize <= 0 { pageSize = 10000 } if pageSize > 50000 { pageSize = 50000 } // 辅助函数:转义单引号(防止SQL注入) escape := func(s string) string { return strings.ReplaceAll(s, "'", "''") } // 辅助函数:构建 IN 子句 buildIn := func(values []string, col string) string { if len(values) == 0 { return "" } quoted := make([]string, len(values)) for i, v := range values { quoted[i] = "'" + escape(v) + "'" } return fmt.Sprintf("%s IN (%s)", col, strings.Join(quoted, ",")) } // 动态构建 WHERE 条件 var whereParts []string if parts := buildIn(seriesList, "series"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(instrumentList, "instrument"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(wellNameList, "well_name"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(engineerList, "engineer"); parts != "" { whereParts = append(whereParts, parts) } if serviceType != "" { whereParts = append(whereParts, fmt.Sprintf("service_type = '%s'", escape(serviceType))) } if startTime != "" { whereParts = append(whereParts, "in_time >= '"+escape(startTime)+"'") } if endTime != "" { whereParts = append(whereParts, "in_time <= '"+escape(endTime)+"'") } whereClause := "" if len(whereParts) > 0 { whereClause = " WHERE " + strings.Join(whereParts, " AND ") } // 2. 查询总记录数 countSQL := "SELECT COUNT(*) FROM base_worktime_data" + whereClause fmt.Println("countSQL:", countSQL) var totalCount int64 err = sqlConn.QueryRow(countSQL).Scan(&totalCount) if err != nil { fmt.Println("查询总数失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"查询数据失败"}`)) return } // 3. 查询数据(带分页) // 注意:ORDER BY 必须存在,这里假设表有 id 列,请根据实际调整 dataSQL := "SELECT well_name, series, instrument, product_name, person_in_time, person_out_time, in_time, out_time, engineer, current_work_time, total_work_time, location" + " FROM base_worktime_data" + whereClause + fmt.Sprintf(" ORDER BY id ") fmt.Println("井为单位sql", dataSQL) logs.Info("井为单位sql:", dataSQL) rows, err := sqlConn.Query(dataSQL) if err != nil { fmt.Println("查询数据失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"查询数据失败"}`)) return } defer rows.Close() var allTools []devToolata for rows.Next() { var tool devToolata err := rows.Scan( &tool.WellName, // 井名称 &tool.Series, // 序列号 &tool.Instrument, // 仪器名称 &tool.ProductName, // 编码 &tool.PInTime, // 人员上井时间 &tool.POutTime, // 人员离井时间 &tool.InTime, // 仪器入井时间 &tool.OutTime, // 仪器出井时间 &tool.Engineer, // 仪器工程师 &tool.CurrentWorkTime, // 仪器本次使用时长 &tool.TotalWorkTime, // 仪器累计使用时长(h) &tool.Location, // 所在地 ) if err != nil { fmt.Println("扫描数据失败:", err) continue } allTools = append(allTools, tool) } // 4. 生成 Excel 文件 file := xlsx.NewFile() sheet, err := file.AddSheet("工具明细") if err != nil { fmt.Println("创建sheet失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"生成文件失败"}`)) return } // 样式 style := xlsx.NewStyle() font := *xlsx.NewFont(11, "宋体") style.Font = font alignment := xlsx.Alignment{Horizontal: "center", Vertical: "center"} style.Alignment = alignment style.ApplyAlignment = true // 表头 headers := []string{ "井名称", "序列号", "仪器名称", "编码", "人员上井时间", "人员离井时间", "仪器入井时间", "仪器出井时间", "仪器工程师", "仪器本次使用时长", "仪器累计使用时长(h)", "所在地", } headerRow := sheet.AddRow() for _, h := range headers { cell := headerRow.AddCell() cell.SetStyle(style) cell.Value = h } // 数据行 for _, tool := range allTools { values := []string{ tool.WellName, tool.Series, tool.ProductName, tool.Instrument, formatDateTime(tool.PInTime), formatDateTime(tool.POutTime), formatDateTime(tool.InTime), formatDateTime(tool.OutTime), tool.Engineer, tool.CurrentWorkTime, tool.TotalWorkTime, tool.Location, } row := sheet.AddRow() for _, v := range values { cell := row.AddCell() cell.SetStyle(style) cell.Value = v } } // 5. 保存文件 err = os.MkdirAll("./authfile", 0755) if err != nil { fmt.Println("创建导出目录失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"创建目录失败"}`)) return } filename := fmt.Sprintf("井上仪器明细清单(井位)_%s.xlsx", time.Now().Format("20060102150405")) filePath := fmt.Sprintf("./authfile/%s", filename) err = file.Save(filePath) if err != nil { fmt.Println("保存Excel文件失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"保存文件失败"}`)) return } // 6. 返回响应 type exportResp struct { FileId string `json:"fileId"` TotalCount int64 `json:"totalCount"` ExportRows int `json:"exportRows"` } resp := exportResp{ FileId: filename, TotalCount: totalCount, ExportRows: len(allTools), } jresp, _ := json.Marshal(resp) response.Header().Set("Content-Type", "application/json") response.Write(jresp) fmt.Println("export_Well_detail recv req end", time.Now().Format("2006-01-02 15:04:05"), "cost:", (time.Now().UnixNano()-beginTime)/1e6, "ms") } func export_Well_detail_en(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() // 1. 解析 JSON Body 参数 body, err := ioutil.ReadAll(request.Body) if err != nil { fmt.Println("读取请求体失败:", err) response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code":1,"msg":"Failed to read request parameters."}`)) return } defer request.Body.Close() var reqData WellDetailReqData err = json.Unmarshal(body, &reqData) if err != nil { fmt.Println("解析JSON失败:", err) response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code":1,"msg":"Invalid request parameter format."}`)) return } // 打印日志验证 fmt.Println("wellNameList--------", reqData.Wellname) fmt.Println("serial:", reqData.Serial) fmt.Println("number:", reqData.Number) fmt.Println("engineer:", reqData.Engineer) fmt.Println("in_time_start:", reqData.InTimeStart) fmt.Println("in_time_end:", reqData.InTimeEnd) // if reqData.InTimeStart == "" { // response.WriteHeader(http.StatusOK) // response.Write([]byte(`{"code":1,"msg":"请填写入井开始时间"}`)) // return // } // 数组条件(从 reqData 中获取) seriesList := reqData.Serial instrumentList := reqData.Number wellNameList := reqData.Wellname engineerList := reqData.Engineer serviceType := reqData.ServiceType // 时间范围 startTime := reqData.InTimeStart endTime := reqData.InTimeEnd // 分页(从 reqData 中获取) page := reqData.Index if page <= 0 { page = 1 } pageSize := reqData.Count if pageSize <= 0 { pageSize = 10000 } if pageSize > 50000 { pageSize = 50000 } // 辅助函数:转义单引号(防止SQL注入) escape := func(s string) string { return strings.ReplaceAll(s, "'", "''") } // 辅助函数:构建 IN 子句 buildIn := func(values []string, col string) string { if len(values) == 0 { return "" } quoted := make([]string, len(values)) for i, v := range values { quoted[i] = "'" + escape(v) + "'" } return fmt.Sprintf("%s IN (%s)", col, strings.Join(quoted, ",")) } // 动态构建 WHERE 条件 var whereParts []string if parts := buildIn(seriesList, "series"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(instrumentList, "instrument"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(wellNameList, "well_name"); parts != "" { whereParts = append(whereParts, parts) } if parts := buildIn(engineerList, "engineer"); parts != "" { whereParts = append(whereParts, parts) } if serviceType != "" { whereParts = append(whereParts, fmt.Sprintf("service_type = '%s'", escape(serviceType))) } if startTime != "" { whereParts = append(whereParts, "in_time >= '"+escape(startTime)+"'") } if endTime != "" { whereParts = append(whereParts, "in_time <= '"+escape(endTime)+"'") } whereClause := "" if len(whereParts) > 0 { whereClause = " WHERE " + strings.Join(whereParts, " AND ") } // 2. 查询总记录数 countSQL := "SELECT COUNT(*) FROM base_worktime_data" + whereClause fmt.Println("countSQL:", countSQL) var totalCount int64 err = sqlConn.QueryRow(countSQL).Scan(&totalCount) if err != nil { fmt.Println("查询总数失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"Failed to query data."}`)) return } // 3. 查询数据(带分页) // 注意:ORDER BY 必须存在,这里假设表有 id 列,请根据实际调整 dataSQL := "SELECT well_name, series, instrument, product_name, person_in_time, person_out_time, in_time, out_time, engineer, current_work_time, total_work_time, location" + " FROM base_worktime_data" + whereClause + fmt.Sprintf(" ORDER BY id ") fmt.Println("井为单位sql", dataSQL) logs.Info("井为单位sql:", dataSQL) rows, err := sqlConn.Query(dataSQL) if err != nil { fmt.Println("查询数据失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"Failed to query data."}`)) return } defer rows.Close() var allTools []devToolata for rows.Next() { var tool devToolata err := rows.Scan( &tool.WellName, // 井名称 &tool.Series, // 序列号 &tool.Instrument, // 仪器名称 &tool.ProductName, // 编码 &tool.PInTime, // 人员上井时间 &tool.POutTime, // 人员离井时间 &tool.InTime, // 仪器入井时间 &tool.OutTime, // 仪器出井时间 &tool.Engineer, // 仪器工程师 &tool.CurrentWorkTime, // 仪器本次使用时长 &tool.TotalWorkTime, // 仪器累计使用时长(h) &tool.Location, // 所在地 ) if err != nil { fmt.Println("扫描数据失败:", err) continue } allTools = append(allTools, tool) } // 4. 生成 Excel 文件 file := xlsx.NewFile() sheet, err := file.AddSheet("工具明细") if err != nil { fmt.Println("创建sheet失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"Failed to generate file."}`)) return } // 样式 style := xlsx.NewStyle() font := *xlsx.NewFont(11, "宋体") style.Font = font alignment := xlsx.Alignment{Horizontal: "center", Vertical: "center"} style.Alignment = alignment style.ApplyAlignment = true // 表头 headers := []string{ "Well Name", "Serial No.", "Instrument Name", "Code", "In Time", "Out Time", "Instrument Engineer", "Current Duration (h)", "Total Duration (h)", "Location", } headerRow := sheet.AddRow() for _, h := range headers { cell := headerRow.AddCell() cell.SetStyle(style) cell.Value = h } // 数据行 for _, tool := range allTools { values := []string{ tool.WellName, tool.Series, tool.ProductName, tool.Instrument, formatDateTime(tool.PInTime), formatDateTime(tool.POutTime), formatDateTime(tool.InTime), formatDateTime(tool.OutTime), tool.Engineer, tool.CurrentWorkTime, tool.TotalWorkTime, tool.Location, } row := sheet.AddRow() for _, v := range values { cell := row.AddCell() cell.SetStyle(style) cell.Value = v } } // 5. 保存文件 err = os.MkdirAll("./authfile", 0755) if err != nil { fmt.Println("创建导出目录失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"Failed to create directory."}`)) return } filename := fmt.Sprintf("井上仪器明细清单(井位)_%s.xlsx", time.Now().Format("20060102150405")) filePath := fmt.Sprintf("./authfile/%s", filename) err = file.Save(filePath) if err != nil { fmt.Println("保存Excel文件失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"Failed to save file."}`)) return } // 6. 返回响应 type exportResp struct { FileId string `json:"fileId"` TotalCount int64 `json:"totalCount"` ExportRows int `json:"exportRows"` } resp := exportResp{ FileId: filename, TotalCount: totalCount, ExportRows: len(allTools), } jresp, _ := json.Marshal(resp) response.Header().Set("Content-Type", "application/json") response.Write(jresp) fmt.Println("export_Well_detail recv req end", time.Now().Format("2006-01-02 15:04:05"), "cost:", (time.Now().UnixNano()-beginTime)/1e6, "ms") } func getQueryWell(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() response.Header().Set("Content-Type", "application/json") // 定义结果结构 respData := DevQueryWellResp{} // 1. 查询井名称 rows, err := sqlConn.Query(` SELECT DISTINCT well_name FROM base_worktime_data WHERE well_name IS NOT NULL AND well_name != '' ORDER BY well_name `) if err != nil { response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"查询井名称失败"}`)) return } for rows.Next() { var name string rows.Scan(&name) respData.WellNames = append(respData.WellNames, name) } rows.Close() // 2. 查询系列号 rows, err = sqlConn.Query(` SELECT DISTINCT series FROM base_worktime_data WHERE series IS NOT NULL AND series != '' ORDER BY series `) if err != nil { response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"查询系列号失败"}`)) return } for rows.Next() { var s string rows.Scan(&s) respData.Series = append(respData.Series, s) } rows.Close() // 3. 查询仪器编号 rows, err = sqlConn.Query(` SELECT DISTINCT instrument FROM base_worktime_data WHERE instrument IS NOT NULL AND instrument != '' ORDER BY instrument `) if err != nil { response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"查询编号失败"}`)) return } for rows.Next() { var inst string rows.Scan(&inst) respData.Instruments = append(respData.Instruments, inst) } rows.Close() // 4. 查询所在地 rows, err = sqlConn.Query(` SELECT DISTINCT location FROM base_worktime_data WHERE location IS NOT NULL AND location != '' ORDER BY location `) if err != nil { response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"查询所在地失败"}`)) return } for rows.Next() { var loc string rows.Scan(&loc) respData.Locations = append(respData.Locations, loc) } rows.Close() // 5. 查询工程师 rows, err = sqlConn.Query(` SELECT DISTINCT engineer FROM base_worktime_data WHERE engineer IS NOT NULL AND engineer != '' ORDER BY engineer `) if err != nil { response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code":1,"msg":"查询工程师失败"}`)) return } for rows.Next() { var eng string rows.Scan(&eng) // 过滤掉纯数字的工程师名 isPureNum := true for _, ch := range eng { if ch < '0' || ch > '9' { isPureNum = false break } } if !isPureNum { respData.Engineers = append(respData.Engineers, eng) } } rows.Close() // 返回 JSON jsonResp, _ := json.Marshal(map[string]interface{}{ "code": 0, "msg": "操作成功", "data": respData, }) response.Write(jsonResp) fmt.Println("getQueryWell end, cost:", (time.Now().UnixNano()-beginTime)/1e6, "ms") } func addQualityData(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("addQualityData recv req begin", time.Now().Format("2006-01-02 15:04:05")) reqdata, _ := ioutil.ReadAll(request.Body) var req QualityData json.Unmarshal(reqdata, &req) // 确定要更新的字段名 var fieldName string switch req.Field { case "process_record": fieldName = "process_record" case "process_inspection": fieldName = "process_inspection" case "final_inspection": fieldName = "final_inspection" default: // 如果字段不匹配,返回错误 response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code": 1, "msg": "无效的字段类型"}`)) return } // 构建查询语句,检查记录是否存在 querySQL := fmt.Sprintf(`SELECT id FROM t_quality_inspection WHERE well_name = '%s' AND series = '%s' AND instrument = '%s'`, req.WellName, req.Series, req.Instrument) row := sqlConn.QueryRow(querySQL) // 使用QueryRow获取单行结果 var fieldValue sql.NullString // 使用NullString处理可能为NULL的情况 err := row.Scan(&fieldValue) var exists bool if err != nil { if err == sql.ErrNoRows { exists = false // 没有找到记录 } else { fmt.Println("查询质量检验数据失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code": 1, "msg": "数据库查询失败"}`)) return } } else { // 检查字段是否有值(非NULL且非空字符串) exists = fieldValue.Valid && fieldValue.String != "" } // 现在可以使用exists变量 fmt.Printf("字段 '%s' 是否有值: %t\n", req.Field, exists) // 获取当前时间 currentTime := time.Now().Format("2006-01-02 15:04:05") if exists { // 记录存在,执行更新操作 updateSQL := fmt.Sprintf(`UPDATE t_quality_inspection SET %s = '%s', update_time = '%s', update_user = '%s' WHERE well_name = '%s' AND series = '%s' AND instrument = '%s'`, fieldName, req.Value, currentTime, req.OpUser, req.WellName, req.Series, req.Instrument) fmt.Println("updateSQL----", updateSQL) _, err := sqlConn.Exec(updateSQL) if err != nil { fmt.Println("更新质量检验数据失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code": 1, "msg": "数据更新失败"}`)) return } } else { // 记录不存在,执行插入操作 insertSQL := fmt.Sprintf(`INSERT INTO t_quality_inspection (create_time, update_time, create_user, update_user, %s, well_name, series, instrument) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')`, fieldName, currentTime, currentTime, req.OpUser, req.OpUser, req.Value, req.WellName, req.Series, req.Instrument) fmt.Println("insertSQL----", insertSQL) _, err := sqlConn.Exec(insertSQL) if err != nil { fmt.Println("插入质量检验数据失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code": 1, "msg": "数据插入失败"}`)) return } } // 返回成功响应 responseData := map[string]interface{}{ "code": 0, "msg": "操作成功", "data": nil, } jsonResponse, _ := json.Marshal(responseData) response.Write(jsonResponse) fmt.Println("addQualityData recv req end", time.Now().Format("2006-01-02 15:04:05"), "cost:", (time.Now().UnixNano()-beginTime)/1e6, "ms") } func getQualityData(response http.ResponseWriter, request *http.Request) { // 读取并解析请求体 reqdata, err := ioutil.ReadAll(request.Body) if err != nil { response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code": 1, "msg": "读取请求体失败"}`)) return } var req QualityData if err := json.Unmarshal(reqdata, &req); err != nil { response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code": 1, "msg": "解析请求体失败"}`)) return } // 验证必填字段 if req.Series == "" || req.Instrument == "" || req.Field == "" { response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code": 1, "msg": "缺少必要参数"}`)) return } // 查询数据库 querySQL := fmt.Sprintf(`SELECT COALESCE(process_record, '') as process_record ,COALESCE(process_inspection, '') as process_inspection ,COALESCE(final_inspection, '') as final_inspection FROM t_quality_inspection WHERE well_name = '%s' AND series = '%s' AND instrument = '%s'`, req.WellName, req.Series, req.Instrument) var resp QualityDataResp fmt.Println("getQualityData-querySQL----", querySQL) err = sqlConn.QueryRow(querySQL).Scan( &resp.ProcessRecord, &resp.ProcessInspection, &resp.FinalInspection, ) if err != nil { if err == sql.ErrNoRows { fmt.Println("未查询到数据:", err) // 没有找到记录,返回空值 resp = QualityDataResp{} } else { // 数据库查询出错 fmt.Println("查询质量检验数据失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code": 1, "msg": "数据库查询失败"}`)) return } } // 构造响应 responseData := map[string]interface{}{ "code": 0, "msg": "操作成功", "data": resp, } jsonResponse, err := json.Marshal(responseData) if err != nil { response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code": 1, "msg": "生成响应失败"}`)) return } response.Header().Set("Content-Type", "application/json") response.Write(jsonResponse) } func upload(response http.ResponseWriter, request *http.Request) { beginTime := time.Now().UnixNano() fmt.Println("upload recv req begin", time.Now().Format("2006-01-02 15:04:05")) // 解析 multipart 表单,最大内存为 32MB err := request.ParseMultipartForm(32 << 20) if err != nil { logs.Error("解析表单失败:", err) response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code": 1, "msg": "解析表单失败"}`)) return } // 获取文件句柄和文件头 file, handler, err := request.FormFile("file") if err != nil { logs.Error("获取上传文件失败:", err) response.WriteHeader(http.StatusBadRequest) response.Write([]byte(`{"code": 1, "msg": "获取上传文件失败"}`)) return } defer file.Close() // 获取其他表单字段 id := request.FormValue("id") wellName := request.FormValue("wellName") opuser := request.FormValue("opuser") types := request.FormValue("type") series := request.FormValue("series") instrument := request.FormValue("instrument") // 创建保存文件的目录(如果不存在) saveDir := "./upload" if _, err := os.Stat(saveDir); os.IsNotExist(err) { os.MkdirAll(saveDir, 0755) } // 构造文件保存路径 filename := fmt.Sprintf("%s/%s", saveDir, handler.Filename) // 获取文件扩展名(如".txt") ext := filepath.Ext(handler.Filename) // 获取不带扩展名的文件名(包含路径) nameWithoutExt := filename[:len(filename)-len(ext)] // 生成时间戳 timestamp := time.Now().Format("20060102-150405") // 组合新文件名:原文件名_时间戳.扩展名 realFileName := fmt.Sprintf("%s_%s%s", nameWithoutExt, timestamp, ext) fmt.Println("realFileName------", realFileName) // 创建文件 f, err := os.Create(realFileName) if err != nil { fmt.Println("创建文件失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code": 1, "msg": "创建文件失败"}`)) return } defer f.Close() // 将上传的文件内容复制到新创建的文件中 _, err = io.Copy(f, file) if err != nil { logs.Error("保存文件失败:", err) response.WriteHeader(http.StatusInternalServerError) response.Write([]byte(`{"code": 1, "msg": "保存文件失败"}`)) return } querySQL := fmt.Sprintf(`SELECT DISTINCT link FROM t_file WHERE well_name = '%s' AND series = '%s' AND instrument = '%s'`, wellName, series, instrument) rowD := sqlConn.QueryRow(querySQL, sql.Named("wellName", wellName), sql.Named("series", series), sql.Named("instrument", instrument)) fmt.Println("查询link的值----------", querySQL) var LinkQuery string err = rowD.Scan(&LinkQuery) //不存在记录,则插入 err = insertFileRecord(id, filename, realFileName, opuser, types, series, instrument, wellName, LinkQuery) if err != nil { fmt.Println("插入文件记录失败:", err) } //查询最新的数据ID queryIdSql := fmt.Sprintf(`SELECT id FROM t_file WHERE real_file_name= '%s'`, realFileName) row, err := sqlConn.Query(queryIdSql) if err != nil { fmt.Printf("查询链接失败: %v\n", err) } var ids string if row.Next() { err := row.Scan(&ids) if err != nil { fmt.Printf("扫描链接行失败: %v\n", err) } else { fmt.Printf("查询到的链接: %s\n", ids) } } else { fmt.Println("未查询到链接") } row.Close() // 返回成功响应 responseData := map[string]interface{}{ "code": 0, "msg": "文件上传成功", "data": map[string]string{ "id": ids, "wellName": wellName, "opuser": opuser, "type": types, "filename": filename, "realFileName": realFileName, "fileSize": fmt.Sprintf("%d", handler.Size), }, } jsonResponse, _ := json.Marshal(responseData) response.Write(jsonResponse) fmt.Println("upload recv req end", time.Now().Format("2006-01-02 15:04:05"), "cost:", (time.Now().UnixNano()-beginTime)/1e6, "ms") } // insertFileRecord 插入文件记录到数据库的公共方法 func insertFileRecord(id string, filename string, realFileName string, opuser string, types string, series string, instrument string, wellName string, link string) error { fmt.Printf("insertFileRecord 参数:\n") fmt.Printf("id: %s\n", id) fmt.Printf("filename: %s\n", filename) fmt.Printf("realFileName: %s\n", realFileName) fmt.Printf("opuser: %s\n", opuser) fmt.Printf("types: %s\n", types) fmt.Printf("series: %s\n", series) fmt.Printf("instrument: %s\n", instrument) fmt.Printf("wellName: %s\n", wellName) fmt.Printf("link: %s\n", link) insert_sql := fmt.Sprintf(`INSERT INTO [t_file] ([well_file_id] ,[file_name] ,[create_user] ,[type] ,[create_time] ,[series] ,[instrument] ,[well_name] ,[link] ,[real_file_name]) VALUES ('%s' ,'%s' ,'%s','%s','%s','%s','%s','%s','%s','%s')`, id, filename, opuser, types, time.Now().Format("2006-01-02 15:04:05"), series, instrument, wellName, link, realFileName) _, err := sqlConn.Exec(insert_sql) fmt.Println("insert_sql------------------", insert_sql) return err } func updateFileRecord(id, filename, realFileName, opuser, types, series, instrument, wellName, link string) error { fmt.Println("updateFileRecordid-----------", id) // 构建基础SQL updateSQL := "UPDATE [t_file] SET " // 使用切片收集需要更新的字段和值 var setFields []string var args []interface{} // 只需要修改link字段 if link != "" { setFields = append(setFields, "[link] = @p1") args = append(args, link) } // 如果没有需要更新的字段,直接返回 if len(setFields) == 0 { return nil } // 添加更新时间 setFields = append(setFields, "[create_time] = @p"+strconv.Itoa(len(args)+1)) args = append(args, time.Now().Format("2006-01-02 15:04:05")) // 构建完整的SQL语句 updateSQL += strings.Join(setFields, ", ") // 构建WHERE条件(使用type, series, instrument, well_name) whereConditions := []string{} if id != "" { whereConditions = append(whereConditions, "[id] = @p"+strconv.Itoa(len(args)+1)) args = append(args, id) } if types != "" { whereConditions = append(whereConditions, "[type] = @p"+strconv.Itoa(len(args)+1)) args = append(args, types) } if series != "" { whereConditions = append(whereConditions, "[series] = @p"+strconv.Itoa(len(args)+1)) args = append(args, series) } if instrument != "" { whereConditions = append(whereConditions, "[instrument] = @p"+strconv.Itoa(len(args)+1)) args = append(args, instrument) } if wellName != "" { whereConditions = append(whereConditions, "[well_name] = @p"+strconv.Itoa(len(args)+1)) args = append(args, wellName) } // 如果没有WHERE条件,返回错误(避免更新全表) if len(whereConditions) == 0 { return fmt.Errorf("至少需要一个WHERE条件") } updateSQL += " WHERE " + strings.Join(whereConditions, " AND ") fmt.Println("执行的更新语句为----", updateSQL) fmt.Println("参数为----", args) // 执行更新 _, err := sqlConn.Exec(updateSQL, args...) return err } func download_ds_file(rw http.ResponseWriter, r *http.Request) { //获取请求参数 filename := r.FormValue("id") fmt.Println("filename------", filename) base_file_path := modelePath + "/upload/" if filename != "" { //设置响应头 header := rw.Header() header.Add("Content-Type", "application/octet-stream") //使用ioutil包读取文件 filepath := base_file_path + filename fmt.Println(filepath) b, _ := ioutil.ReadFile(filepath) //写入到响应流中 rw.Write(b) } } func delete_ds_file(response http.ResponseWriter, request *http.Request) { fmt.Println("删除文件") // 读取请求体 reqdata, err := ioutil.ReadAll(request.Body) if err != nil { http.Error(response, "Failed to read request body", http.StatusBadRequest) return } // 解析JSON请求 var req download_file_req if err := json.Unmarshal(reqdata, &req); err != nil { http.Error(response, "解析失败", http.StatusBadRequest) return } // 检查文件名是否为空 if req.ID == "" { // 假设download_file_req结构中有Id字段 http.Error(response, "id为空", http.StatusBadRequest) return } fmt.Println("req.Filename--------------", req.Filename) fmt.Println("req.RealFileName--------------", req.RealFileName) delete_sql := fmt.Sprintf(`DELETE FROM [t_file] WHERE [id] = '%s'`, req.ID) sqlConn.Exec(delete_sql) fmt.Println("delete_sql--------------", delete_sql) filename := req.Filename prefixes := []string{"./upload/", "upload/", "/upload/"} for _, prefix := range prefixes { filename = strings.TrimPrefix(filename, prefix) } base_file_path := modelePath + "/upload/" filepath := base_file_path + filename fmt.Println("filename--------------", filename) fmt.Println("base_file_path--------------", base_file_path) fmt.Println("filepath--------------", filepath) // 删除文件 err = os.Remove(filepath) if err != nil { if os.IsNotExist(err) { http.Error(response, "File not found", http.StatusNotFound) } else { http.Error(response, "Failed to delete file", http.StatusInternalServerError) } return } // 返回成功响应 response.WriteHeader(http.StatusOK) response.Write([]byte(`{"status": "success", "message": "File deleted successfully"}`)) } // 跨域测试 func test(response http.ResponseWriter, request *http.Request) { fmt.Println("recv test req") response.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域 response.Header().Add("Access-Control-Allow-Headers", "Content-Type") //header的类型 response.Header().Set("content-type", "application/json") //返回数据格式是json fmt.Fprintf(response, "3") }