diff --git a/main.go b/main.go index c6db775..863bb85 100644 --- a/main.go +++ b/main.go @@ -3577,6 +3577,8 @@ func get_tool_mess_pdf_en(response http.ResponseWriter, request *http.Request) { } 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) @@ -3607,7 +3609,7 @@ func GenerateInstrumentPDF(fullData []byte, resp []Tool_warning) (filename strin colGap := 15.0 // 列间距 cellPadding := 5.0 // 表格单元格内边距 pageHeight := gopdf.PageSizeA4.H - margin*2 - minBottomMargin := 10.0 // 最小底部间距 + minBottomMargin := 20.0 // 最小底部间距 y := margin // 添加页码的函数 @@ -3617,10 +3619,10 @@ func GenerateInstrumentPDF(fullData []byte, resp []Tool_warning) (filename strin currentX := pdf.GetX() // 设置页码样式 - pdf.SetFont("simfang", "", 10) + pdf.SetFont("simfang", "", 12) pdf.SetTextColor(0, 0, 0) pdf.SetX(gopdf.PageSizeA4.W - margin - 30) - pdf.SetY(gopdf.PageSizeA4.H - margin/2) + pdf.SetY(gopdf.PageSizeA4.H - margin/1.5) pdf.Cell(nil, fmt.Sprintf("第 %d 页", pageNum)) // 恢复位置 @@ -3659,9 +3661,10 @@ func GenerateInstrumentPDF(fullData []byte, resp []Tool_warning) (filename strin // 使用示例 if checkPageBreak(lineHeight * 2) { pdf.AddPage() - y = margin + y = margin + 10 // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) + pdf.SetFont("simfang", "", 12) } // 生成PDF报告 @@ -3697,9 +3700,22 @@ func GenerateInstrumentPDF(fullData []byte, resp []Tool_warning) (filename strin 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\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)) + 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 @@ -3710,7 +3726,6 @@ func GenerateInstrumentPDF(fullData []byte, resp []Tool_warning) (filename strin pdf.SetY(y) pdf.Cell(nil, "风险预警:") y += lineHeight * 1.2 - for _, warning := range resp { if checkPageBreak(lineHeight * 1.2) { pdf.AddPage() @@ -3718,17 +3733,19 @@ func GenerateInstrumentPDF(fullData []byte, resp []Tool_warning) (filename strin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) } - var contextText string + var warningText string + fmt.Println("打印--------------------- warning.Time----------", warning.Time) if warning.Flag == 0 { contextText = "正常" - pdf.SetTextColor(0, 128, 0) + // warningText = fmt.Sprintf("%s", contextText) + warningText = fmt.Sprintf("%s%s %s", warning.Series+" ", warning.Instrument, contextText) + pdf.SetTextColor(0, 255, 0) } else { - contextText = warning.Context pdf.SetTextColor(200, 0, 0) + contextText = warning.Time + " " + warning.Context + warningText = fmt.Sprintf("%s", contextText) } - - warningText := fmt.Sprintf("%s %s %s", warning.Series+" - ", warning.Instrument, contextText) pdf.SetFont("simfang", "", 13) pdf.SetX(margin) pdf.SetY(y) @@ -3750,7 +3767,7 @@ func GenerateInstrumentPDF(fullData []byte, resp []Tool_warning) (filename strin pdf.SetX(margin) pdf.SetY(y) pdf.SetTextColor(0, 0, 255) - pdf.Cell(nil, "▍ 基本信息 ("+inst.Series+" - "+inst.Instrument+")") + pdf.Cell(nil, "▍ 基本信息 ("+inst.Series+" "+inst.Instrument+")") y += lineHeight formattedTime := inst.Time @@ -3768,14 +3785,14 @@ func GenerateInstrumentPDF(fullData []byte, resp []Tool_warning) (filename strin }{ {"出厂日期:", formattedTime}, {"入库日期:", ""}, - {"当次累计工作时间:", inst.WorkTime + "小时"}, - {"累计工作时间:", inst.WorkTimes + "小时"}, + {"当次累计工作时间:", inst.WorkTimes + "小时"}, + {"累计工作时间:", inst.WorkTime + "小时"}, {"所属部门:", inst.Dept}, {"固件版本号:", inst.Version}, } colWidth := (gopdf.PageSizeA4.W - margin*2 - colGap) / 2 - labelWidth := 100.0 + labelWidth := 140.0 valueWidth := colWidth - labelWidth for i := 0; i < len(basicInfo); i += 2 { @@ -3784,6 +3801,7 @@ func GenerateInstrumentPDF(fullData []byte, resp []Tool_warning) (filename strin y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) + pdf.SetFont("simfang", "", 12) } // 第一列 @@ -3795,7 +3813,7 @@ func GenerateInstrumentPDF(fullData []byte, resp []Tool_warning) (filename strin pdf.SetX(margin + labelWidth) pdf.SetTextColor(0, 0, 0) - if basicInfo[i].Value == "" { + 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 { @@ -3906,7 +3924,7 @@ func GenerateInstrumentPDF(fullData []byte, resp []Tool_warning) (filename strin y += lineHeight // 表格参数 - colWidths := []float64{80, 60, 60, 60, 60, 60, 50, 100} + colWidths := []float64{80, 60, 60, 60, 60, 60, 50, 110} headers := []string{"井名", "入井状态", "工作井深", "最高温度", "最高压强", "仪器状况", "上井人", "链接"} if len(inst.WorkMessList) == 0 { @@ -4008,12 +4026,12 @@ func GenerateInstrumentPDF(fullData []byte, resp []Tool_warning) (filename strin rowHeight := lineHeight*float64(maxLines) + cellPadding*2 // 检查是否需要换页(只考虑行高度) - if y+rowHeight > pageHeight-5 { // 保留5mm底部间距 + if y+rowHeight > pageHeight-margin-5 { // 保留5mm底部间距 pdf.AddPage() y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) - // 注意:换页后不再绘制表头 + pdf.SetFont("simfang", "", 12) } // 绘制行内容 @@ -4162,7 +4180,7 @@ func GenerateInstrumentPDF(fullData []byte, resp []Tool_warning) (filename strin y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) - // 注意:换页后不再绘制表头 + pdf.SetFont("simfang", "", 12) } // 绘制行 @@ -4247,10 +4265,10 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st currentX := pdf.GetX() // 设置页码样式 - pdf.SetFont("simfang", "", 10) + pdf.SetFont("simfang", "", 12) pdf.SetTextColor(0, 0, 0) pdf.SetX(gopdf.PageSizeA4.W - margin - 30) - pdf.SetY(gopdf.PageSizeA4.H - margin/2) + pdf.SetY(gopdf.PageSizeA4.H - margin/1.5) pdf.Cell(nil, fmt.Sprintf("Page %d", pageNum)) // 恢复位置 @@ -4292,6 +4310,7 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) + pdf.SetFont("simfang", "", 12) } // 生成PDF报告 @@ -4321,15 +4340,28 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st pdf.SetTextColor(0, 0, 0) pdf.SetX(margin) pdf.SetY(y) - pdf.Cell(nil, "Risk warning for this well") + 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 num:%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\tReport time:%s", wellName, reportTime)) + 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 @@ -4348,17 +4380,19 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) } - + fmt.Println("Time---------------------[] ", warning.Time) var contextText string + var warningText string if warning.Flag == 0 { contextText = "Normal" - pdf.SetTextColor(0, 0, 0) + warningText = fmt.Sprintf("%s %s %s", warning.Series+" ", warning.Instrument, contextText) + pdf.SetTextColor(0, 255, 0) } else { - contextText = warning.Context + contextText = warning.Time + " " + warning.Context pdf.SetTextColor(200, 0, 0) + warningText = fmt.Sprintf("%s", contextText) } - warningText := fmt.Sprintf("%s %s %s", warning.Series+" - ", warning.Instrument, contextText) pdf.SetFont("simfang", "", 13) pdf.SetX(margin) pdf.SetY(y) @@ -4379,7 +4413,7 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st sectionStyle() pdf.SetX(margin) pdf.SetY(y) - pdf.Cell(nil, "▍ Basic information ("+inst.Series+" - "+inst.Instrument+")") + pdf.Cell(nil, "▍ Basic Information ("+inst.Series+" "+inst.Instrument+")") y += lineHeight formattedTime := inst.Time @@ -4395,12 +4429,12 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st Label string Value string }{ - {"Date of manufacture:", formattedTime}, - {"Date of warehouse:", ""}, - {"This work hour:", inst.WorkTime + "hour"}, - {"Work hour:", inst.WorkTimes + "hour"}, + {"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}, + {"Firmware Version:", inst.Version}, } colWidth := (gopdf.PageSizeA4.W - margin*2 - colGap) / 2 @@ -4413,6 +4447,7 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st y = margin // 添加新页的页码 addPageNumber(pdf.GetNumberOfPages()) + pdf.SetFont("simfang", "", 12) } // 第一列 @@ -4420,11 +4455,11 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st pdf.SetY(y) pdf.SetFont("simfang", "", 12) pdf.SetTextColor(0, 0, 0) - pdf.Cell(&gopdf.Rect{W: labelWidth, H: lineHeight}, basicInfo[i].Label) + pdf.Cell(&gopdf.Rect{W: 130, H: lineHeight}, basicInfo[i].Label) - pdf.SetX(margin + labelWidth) + pdf.SetX(margin + 130) pdf.SetTextColor(0, 0, 0) - if basicInfo[i].Value == "" { + 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 { @@ -4436,9 +4471,9 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st 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.Cell(&gopdf.Rect{W: 13, H: lineHeight}, basicInfo[i+1].Label) - pdf.SetX(margin + colWidth + colGap + labelWidth) + pdf.SetX(margin + colWidth + colGap + 130) pdf.SetTextColor(0, 0, 0) if basicInfo[i+1].Value == "" { pdf.SetTextColor(0, 0, 0) @@ -4456,7 +4491,7 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st sectionStyle() pdf.SetX(margin) pdf.SetY(y) - pdf.Cell(nil, "▍ Product Quality inspection record") + pdf.Cell(nil, "▍ Product Quality Inspection Record") y += lineHeight if inst.QualityData.ProcessRecord == "" && inst.QualityData.ProcessInspection == "" && inst.QualityData.FinalInspection == "" { @@ -4477,9 +4512,9 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st Label string Value string }{ - {"Production process record:", inst.QualityData.ProcessRecord}, - {"Production process inspection:", inst.QualityData.ProcessInspection}, - {"Final inspection display:", inst.QualityData.FinalInspection}, + {"Production Process Record:", inst.QualityData.ProcessRecord}, + {"Production Process Inspection:", inst.QualityData.ProcessInspection}, + {"Final Inspection Display:", inst.QualityData.FinalInspection}, } for _, item := range qcItems { @@ -4500,6 +4535,7 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st pdf.AddPage() y = margin addPageNumber(pdf.GetNumberOfPages()) + pdf.SetFont("simfang", "", 12) } // 绘制标签 @@ -4510,7 +4546,7 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st // 绘制值 if item.Value == "" { pdf.SetXY(margin+labelWidth, y) - pdf.SetTextColor(150, 150, 150) + pdf.SetTextColor(0, 0, 0) pdf.Cell(&gopdf.Rect{W: availableWidth, H: lineHeight}, "No data") y += lineHeight } else { @@ -4527,15 +4563,15 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st } y += sectionGap - // 3. 上井记录 + // 3. 仪器施工汇总 sectionStyle() pdf.SetX(margin) pdf.SetY(y) - pdf.Cell(nil, "▍ Summary of Instrument Construction") + pdf.Cell(nil, "▍ Summary Of Instrument Construction") y += lineHeight // 表格参数 - colWidths := []float64{80, 60, 60, 60, 60, 60, 50, 100} + colWidths := []float64{80, 60, 60, 60, 60, 60, 50, 110} // 使用缩写避免换行问题 headers := []string{ "Well Name", @@ -4545,7 +4581,7 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st "Max Press", "Situation", "Person", - "URL", + "Link", } if len(inst.WorkMessList) == 0 { @@ -4679,11 +4715,12 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st pdf.AddPage() y = margin addPageNumber(pdf.GetNumberOfPages()) + pdf.SetFont("simfang", "", 12) } // 绘制行背景(可选,使隔行变色更易读) if len(inst.WorkMessList)%2 == 0 { - pdf.SetFillColor(245, 245, 245) + pdf.SetFillColor(255, 255, 255) pdf.RectFromUpperLeftWithStyle(margin, y, totalWidth, rowHeight, "F") } @@ -4729,7 +4766,7 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st sectionStyle() pdf.SetX(margin) pdf.SetY(y) - pdf.Cell(nil, "▍ Maintenance record") + pdf.Cell(nil, "▍ Maintenance Record") y += lineHeight if len(inst.GetLcmRespData) == 0 { @@ -4749,7 +4786,7 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st } else { // 表格参数 colWidths := []float64{120, 80, 80, 140, 120} - headers := []string{"Time", "Level", "Maintenance person", "Maintenance content", "url"} + headers := []string{"Time", "Level", "Maintenance Person", "Maintenance Content", "Link"} // 计算表头每列的最大行数 maxHeaderLines := 1 @@ -4864,7 +4901,7 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st pdf.AddPage() y = margin addPageNumber(pdf.GetNumberOfPages()) - // 注意:换页后不再绘制表头 + pdf.SetFont("simfang", "", 12) } // 移除行背景色(删除隔行变色代码) @@ -4920,14 +4957,6 @@ func GenerateInstrumentPDF_EN(fullData []byte, resp []Tool_warning) (filename st return strconv.FormatInt(beginTime, 10) + ".pdf" } -// 辅助函数:获取最大值 -func max(a, b int) int { - if a > b { - return a - } - return b -} - func leftOneData(wellName string, IsMemory *bool) []VibrationStatData { var db string var cmdSql string @@ -4950,20 +4979,46 @@ func leftOneData(wellName string, IsMemory *bool) []VibrationStatData { rwLocker.RUnlock() return results // return empty slice if well not found } - 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") + + // 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 { - logs.Info("链接master库失败", err.Error()) - fmt.Println("链接master库失败", err.Error()) + 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 + } } - 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("振动粘滑数据未找到") @@ -5005,13 +5060,21 @@ func leftOneData(wellName string, IsMemory *bool) []VibrationStatData { results = append(results, data) } - if strings.HasPrefix(db, "LH2020-") || - strings.HasPrefix(db, "LH2021-") || - strings.HasPrefix(db, "LH2022-") || - strings.HasPrefix(db, "LH2023-") || - strings.HasPrefix(db, "LH2024-") { - cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE", db) - _, err = conn.Exec(cmdSql) + + // 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 @@ -5703,11 +5766,11 @@ func export_tool_warning_pdf_en(opuser string, baseinfo get_srr_base_resp, data 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.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.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) @@ -5723,7 +5786,7 @@ func export_tool_warning_pdf_en(opuser string, baseinfo get_srr_base_resp, data for i := 0; i < len(data); i++ { v := data[i] - s := fmt.Sprintf(`%s %s:%s`, + 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++ { @@ -6135,68 +6198,6 @@ func export_tool_warning_pdf(opuser string, baseinfo get_srr_base_resp, data []T return } -// func get_tool_warning_info(user string, wellname string) (resp []Tool_warning) { - -// ps_info := get_ps_info(user) - -// var data []Tool_warning -// sel_sql := fmt.Sprintf(`select [time],[err_level],[context] FROM [analysis_tool_warning] where [wellname]='%s' order by [time] desc`, wellname) -// rows, err := sqlConn.Query(sel_sql) -// fmt.Println("sel_sql-----------", sel_sql) -// if err == nil { -// for rows.Next() { -// var v Tool_warning -// if err = rows.Scan(&v.Time, &v.Err_level, &v.Context); err != nil { -// logs.Error(fmt.Sprintf(`get_tool_warning_info scan upload err:%s`, err.Error())) -// } else { -// 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.R1 == "2" { -// if strings.Contains(v.Context, "MPa") { -// bid := strings.Index(v.Context, "=") -// eid := strings.Index(v.Context, "(") - -// f, _ := strconv.ParseFloat(v.Context[bid+1:eid], 64) -// f, _ = decimal.NewFromFloat(float64(145.038 * f)).Round(2).Float64() - -// v.Context = v.Context[:bid+1] + fmt.Sprintf("%.02f", f) + v.Context[eid:] - -// v.Context = strings.ReplaceAll(v.Context, "MPa", "psi") -// } -// } - -// if ps_info.R2 == "2" { -// if strings.Contains(v.Context, "℃") { - -// bid := strings.Index(v.Context, "=") -// eid := strings.Index(v.Context, "(") - -// f, _ := strconv.ParseFloat(v.Context[bid+1:eid], 64) -// f, _ = decimal.NewFromFloat(float64(1.8*f + 32)).Round(2).Float64() - -// v.Context = v.Context[:bid+1] + fmt.Sprintf("%.02f", f) + v.Context[eid:] - -// v.Context = strings.ReplaceAll(v.Context, "℃", "℉") -// } -// } - -// data = append(data, v) -// } -// } -// rows.Close() -// } - -// if len(data) > 0 { -// resp = data -// } else { -// resp = []Tool_warning{} -// } - -// 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) @@ -6205,30 +6206,55 @@ func get_tool_warning_info(user string, wellname string) (resp []Tool_warning) { wellRow := sqlConn.QueryRow(wellSql) wellRow.Scan(&db) fmt.Println("db----------", 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) + // 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) + + // 如果是离线状态,设置为在线 + 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()) + return } defer conn.Close() + sel_sql := fmt.Sprintf(`select DISTINCT [2327], [2328] from REPAIRANDMENT where [2327] IS NOT NULL`) - logs.Info("第一个查询:获取仪器组合--------", sel_sql) - fmt.Println("第一个查询:获取仪器组合--------", sel_sql) rows, err := conn.Query(sel_sql) if err != nil { fmt.Println("仪器组合查询错误:", err.Error()) @@ -6268,13 +6294,11 @@ func get_tool_warning_info(user string, wellname string) (resp []Tool_warning) { 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) - fmt.Println("第二个查询:获取警告信息warningSql:-----------------", warningSql) - logs.Info("第二个查询:获取警告信息warningSql:-----------------", warningSql) warningRows, err := sqlConn.Query(warningSql) if err != nil { fmt.Println("警告信息查询错误:", err.Error()) @@ -6283,8 +6307,6 @@ func get_tool_warning_info(user string, wellname string) (resp []Tool_warning) { } defer warningRows.Close() - fmt.Println("警告信息:-----------------", warningRows) - logs.Info("警告信息:-----------------", warningRows) // 存储所有警告记录 var warnings []Tool_warning for warningRows.Next() { @@ -6307,7 +6329,6 @@ func get_tool_warning_info(user string, wellname string) (resp []Tool_warning) { w.Context = contextPtr.String warnings = append(warnings, w) } - fmt.Println("warnings----------------------:", warnings) if err = warningRows.Err(); err != nil { fmt.Println("警告信息遍历错误:", err.Error()) @@ -6326,18 +6347,15 @@ func get_tool_warning_info(user string, wellname string) (resp []Tool_warning) { // 构建要查找的字符串格式:系列号 + 空格 + 仪器号 searchStr := pair.Series + " " + pair.Instrument - fmt.Println("searchStr----------------------:", searchStr) // 在警告记录中查找匹配的context for _, warn := range warnings { - fmt.Println("warn.Context----------------------:", warn.Context) 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 - fmt.Println("warn.Context----------------------:", warn.Context) // 处理时间格式 if len(v.Time) >= 19 { originalTime := v.Time @@ -6415,7 +6433,27 @@ func get_tool_warning_info(user string, wellname string) (resp []Tool_warning) { } data = append(data, v) - fmt.Printf("处理后的数据: %+v\n", 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) + 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()) + } else { + fmt.Printf("数据库 %s 已设置为离线\n", db) + } + } } fmt.Printf("总共处理 %d 条仪器组合\n", len(data)) @@ -6432,62 +6470,247 @@ func get_tool_warning_info(user string, wellname string) (resp []Tool_warning) { return } -// func get_tool_warning_info_en(user string, wellname string) (resp []Tool_warning) { - +// 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) -// var data []Tool_warning -// sel_sql := fmt.Sprintf(`select [time],[err_level],[context_en] FROM [analysis_tool_warning] where [wellname]='%s' order by [time] desc`, wellname) -// rows, err := sqlConn.Query(sel_sql) -// if err == nil { -// for rows.Next() { -// var v Tool_warning -// if err = rows.Scan(&v.Time, &v.Err_level, &v.Context); err != nil { -// logs.Error(fmt.Sprintf(`get_tool_warning_info_en scan upload err:%s`, err.Error())) -// } else { -// 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.R1 == "2" { -// if strings.Contains(v.Context, "MPa") { -// bid := strings.Index(v.Context, "=") -// eid := strings.Index(v.Context, "(") - -// f, _ := strconv.ParseFloat(v.Context[bid+1:eid], 64) -// f, _ = decimal.NewFromFloat(float64(145.038 * f)).Round(2).Float64() - -// v.Context = v.Context[:bid+1] + fmt.Sprintf("%.02f", f) + v.Context[eid:] - -// v.Context = strings.ReplaceAll(v.Context, "MPa", "psi") -// } -// } - -// if ps_info.R2 == "2" { -// if strings.Contains(v.Context, "℃") { - -// bid := strings.Index(v.Context, "=") -// eid := strings.Index(v.Context, "(") - -// f, _ := strconv.ParseFloat(v.Context[bid+1:eid], 64) -// f, _ = decimal.NewFromFloat(float64(1.8*f + 32)).Round(2).Float64() - -// v.Context = v.Context[:bid+1] + fmt.Sprintf("%.02f", f) + v.Context[eid:] - -// v.Context = strings.ReplaceAll(v.Context, "℃", "℉") -// } -// } - -// data = append(data, v) -// } +// // 第一个查询:获取仪器组合 +// if strings.HasPrefix(db, "LH2020-") || +// strings.HasPrefix(db, "LH2021-") || +// strings.HasPrefix(db, "LH2022-") || +// strings.HasPrefix(db, "LH2023-") || +// strings.HasPrefix(db, "LH2025-") { +// conn, err := getOdbcConn("Master") +// if err != nil { +// logs.Info("链接master库失败", err.Error()) +// fmt.Println("链接master库失败", err.Error()) // } -// rows.Close() +// defer conn.Close() +// cmdSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) +// _, err = conn.Exec(cmdSql) +// } +// 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] +// 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) +// } + +// 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: "正常", +// } + +// // 构建要查找的字符串格式:系列号 + 空格 + 仪器号 +// 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) +// } + +// fmt.Println("连接master库------") + +// if strings.HasPrefix(db, "LH2020-") || +// strings.HasPrefix(db, "LH2021-") || +// strings.HasPrefix(db, "LH2022-") || +// strings.HasPrefix(db, "LH2023-") || +// strings.HasPrefix(db, "LH2025-") { +// masterConn, err := getOdbcConn("master") +// if err != nil { +// logs.Info("连接master库失败", err.Error()) +// fmt.Println("连接master库失败", err.Error()) +// } else { +// fmt.Println("连接master库----成功-准备执行关闭命令-") +// defer masterConn.Close() +// cmdSql := "ALTER DATABASE [LH2025-0165] SET OFFLINE WITH ROLLBACK IMMEDIATE" +// _, err = masterConn.Exec(cmdSql) +// if err != nil { +// fmt.Println("SET OFFLINE command execution error:", err.Error()) +// } +// } +// } + +// fmt.Printf("总共处理 %d 条仪器组合\n", len(data)) +// 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{} // } @@ -6501,21 +6724,47 @@ func get_tool_warning_info_en(user string, wellname string) (resp []Tool_warning wellRow := sqlConn.QueryRow(wellSql) wellRow.Scan(&db) fmt.Println("db----------", 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") + + // 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 { - logs.Info("链接master库失败", err.Error()) - fmt.Println("链接master库失败", err.Error()) + 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 + } } - defer conn.Close() - cmdSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) - _, err = conn.Exec(cmdSql) } + + // 2. 连接目标数据库进行查询 conn, err := getOdbcConn(db) if err != nil { @@ -6523,8 +6772,6 @@ func get_tool_warning_info_en(user string, wellname string) (resp []Tool_warning } defer conn.Close() sel_sql := fmt.Sprintf(`select DISTINCT [2327], [2328] from REPAIRANDMENT where [2327] IS NOT NULL`) - logs.Info("第一个查询:获取仪器组合--------", sel_sql) - fmt.Println("第一个查询:获取仪器组合--------", sel_sql) rows, err := conn.Query(sel_sql) if err != nil { fmt.Println("仪器组合查询错误:", err.Error()) @@ -6622,18 +6869,15 @@ func get_tool_warning_info_en(user string, wellname string) (resp []Tool_warning // 构建要查找的字符串格式:系列号 + 空格 + 仪器号 searchStr := pair.Series + " " + pair.Instrument - fmt.Println("searchStr----------------------:", searchStr) // 在警告记录中查找匹配的context for _, warn := range warnings { - fmt.Println("warn.Context----------------------:", warn.Context) 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 - fmt.Println("warn.Context----------------------:", warn.Context) // 处理时间格式 if len(v.Time) >= 19 { originalTime := v.Time @@ -6646,7 +6890,6 @@ func get_tool_warning_info_en(user string, wellname string) (resp []Tool_warning } 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") { @@ -6711,10 +6954,24 @@ func get_tool_warning_info_en(user string, wellname string) (resp []Tool_warning } data = append(data, v) - fmt.Printf("处理后的数据: %+v\n", v) } - fmt.Printf("总共处理 %d 条仪器组合\n", len(data)) + // 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 @@ -21500,13 +21757,13 @@ func get_well_tool(response http.ResponseWriter, request *http.Request) { } 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()) @@ -21780,7 +22037,7 @@ func get_well_dev(response http.ResponseWriter, request *http.Request) { 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()) @@ -21915,7 +22172,7 @@ func get_well_cmp_en(response http.ResponseWriter, request *http.Request) { 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()) @@ -26407,6 +26664,44 @@ func getMhSCsv_en(response http.ResponseWriter, request *http.Request) { 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() @@ -26417,20 +26712,7 @@ func getMhSCsv_en(response http.ResponseWriter, request *http.Request) { goto write_csv } - 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 { logs.Info("Connecting Error", err.Error()) @@ -26486,13 +26768,19 @@ write_csv: w.Flush() resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) - if strings.HasPrefix(db, "LH2020-") || - strings.HasPrefix(db, "LH2021-") || - strings.HasPrefix(db, "LH2022-") || - strings.HasPrefix(db, "LH2023-") || - strings.HasPrefix(db, "LH2024-") { - cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE", db) - _, err = conn.Exec(cmdSql) + 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) @@ -26531,6 +26819,44 @@ func getMhSCsv(response http.ResponseWriter, request *http.Request) { 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() @@ -26541,20 +26867,7 @@ func getMhSCsv(response http.ResponseWriter, request *http.Request) { goto write_csv } - 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 { logs.Info("Connecting Error", err.Error()) @@ -26610,14 +26923,22 @@ write_csv: w.Flush() resp.FileId = fmt.Sprintf(`%v.csv`, beginTime) - if strings.HasPrefix(db, "LH2020-") || - strings.HasPrefix(db, "LH2021-") || - strings.HasPrefix(db, "LH2022-") || - strings.HasPrefix(db, "LH2023-") || - strings.HasPrefix(db, "LH2024-") { - cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE", db) - _, err = conn.Exec(cmdSql) + + 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)) @@ -26655,6 +26976,44 @@ func getMhS(response http.ResponseWriter, request *http.Request) { 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) + + // 如果是离线状态,设置为在线 + 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() @@ -26664,20 +27023,6 @@ func getMhS(response http.ResponseWriter, request *http.Request) { rwLocker.RUnlock() goto exit } - 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 { logs.Info("Connecting Error", err.Error()) @@ -26730,13 +27075,19 @@ exit: if err != nil { logs.Error("getMhS:", err.Error()) } - if strings.HasPrefix(db, "LH2020-") || - strings.HasPrefix(db, "LH2021-") || - strings.HasPrefix(db, "LH2022-") || - strings.HasPrefix(db, "LH2023-") || - strings.HasPrefix(db, "LH2024-") { - cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE", db) - _, err = conn.Exec(cmdSql) + 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)) @@ -29165,20 +29516,46 @@ func wsGetWellRealTimeData(lang string, id string, user string, ioCh chan []GetH rwLocker.RUnlock() return } - 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") + + // 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 { - logs.Info("链接master库失败", err.Error()) - fmt.Println("链接master库失败", err.Error()) + 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 + } } - 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("wsGetWellRealTimeData sql open db err:", err.Error()) @@ -29307,16 +29684,23 @@ func wsGetWellRealTimeData(lang string, id string, user string, ioCh chan []GetH goto exit } } - if strings.HasPrefix(db, "LH2020-") || - strings.HasPrefix(db, "LH2021-") || - strings.HasPrefix(db, "LH2022-") || - strings.HasPrefix(db, "LH2023-") || - strings.HasPrefix(db, "LH2024-") { - cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE", db) - _, err = conn.Exec(cmdSql) - } 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) { @@ -29349,20 +29733,46 @@ func getWellRealTimeData_en(response http.ResponseWriter, request *http.Request) fmt.Fprintf(response, string(jdata)) return } - 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") + + // 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 { - logs.Info("链接master库失败", err.Error()) - fmt.Println("链接master库失败", err.Error()) + 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 + } } - defer conn.Close() - cmdSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) - _, err = conn.Exec(cmdSql) } + conn, err := getOdbcConn(db) if err != nil { logs.Info("Connecting Error", err.Error()) @@ -29498,14 +29908,23 @@ func getWellRealTimeData_en(response http.ResponseWriter, request *http.Request) jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) - if strings.HasPrefix(db, "LH2020-") || - strings.HasPrefix(db, "LH2021-") || - strings.HasPrefix(db, "LH2022-") || - strings.HasPrefix(db, "LH2023-") || - strings.HasPrefix(db, "LH2024-") { - cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE", db) - _, err = conn.Exec(cmdSql) + + // 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)) @@ -29701,20 +30120,45 @@ func getWellRealTimeData(response http.ResponseWriter, request *http.Request) { return } - 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") + // 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 { - logs.Info("链接master库失败", err.Error()) - fmt.Println("链接master库失败", err.Error()) + 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 + } } - defer conn.Close() - cmdSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) - _, err = conn.Exec(cmdSql) } + conn, err := getOdbcConn(db) if err != nil { logs.Info("Connecting Error", err.Error()) @@ -29851,13 +30295,20 @@ func getWellRealTimeData(response http.ResponseWriter, request *http.Request) { jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) - if strings.HasPrefix(db, "LH2020-") || - strings.HasPrefix(db, "LH2021-") || - strings.HasPrefix(db, "LH2022-") || - strings.HasPrefix(db, "LH2023-") || - strings.HasPrefix(db, "LH2024-") { - cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE", db) - _, err = conn.Exec(cmdSql) + // 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() @@ -29879,8 +30330,9 @@ func getWellData(ifDesc bool) (data []wellData, err error) { 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 { @@ -29892,10 +30344,18 @@ func getWellData(ifDesc bool) (data []wellData, err error) { data = append(data, d) } else { - logs.Info("getWellData Query Error", err.Error()) - } - } + if d.WellNameSource == "合H69-3井" { + fmt.Println("d.WellNameSource11111", d.WellNameSource) + } + fmt.Println("d.WellNameSource", d.WellNameSource) + logs.Info("getWellData Query Error", err.Error()) + fmt.Println("getWellData Query Error", err.Error()) + } + count++ + } + fmt.Println("count-----------------", count) + fmt.Println("data-----------------", data) row.Close() return @@ -29911,7 +30371,7 @@ func getWellNames(response http.ResponseWriter, request *http.Request) { json.Unmarshal(reqdata, &req) data, _ := getWellData(true) - + fmt.Println("len(data)---------------", len(data)) //30s更新 var ifUpdate bool @@ -29933,7 +30393,9 @@ func getWellNames(response http.ResponseWriter, request *http.Request) { } 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 { @@ -29950,7 +30412,7 @@ func getWellNames(response http.ResponseWriter, request *http.Request) { wellNamemap[d.Label] = data[i].WellName } } - + fmt.Println("counti---------------", counti) if ifUpdate { rwLocker.Unlock() } @@ -30007,6 +30469,44 @@ func exportWellHistory_en(response http.ResponseWriter, request *http.Request) { 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() @@ -30017,20 +30517,7 @@ func exportWellHistory_en(response http.ResponseWriter, request *http.Request) { goto write_csv } - 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 { logs.Info("exportWellHistory_en Connecting Error", err.Error()) @@ -30114,13 +30601,19 @@ func exportWellHistory_en(response http.ResponseWriter, request *http.Request) { logs.Info("Query Error", err.Error()) } } - if strings.HasPrefix(db, "LH2020-") || - strings.HasPrefix(db, "LH2021-") || - strings.HasPrefix(db, "LH2022-") || - strings.HasPrefix(db, "LH2023-") || - strings.HasPrefix(db, "LH2024-") { - cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE", db) - _, err = conn.Exec(cmdSql) + 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 @@ -30181,6 +30674,44 @@ func exportWellHistory(response http.ResponseWriter, request *http.Request) { 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() @@ -30191,20 +30722,7 @@ func exportWellHistory(response http.ResponseWriter, request *http.Request) { goto write_csv } - 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 { logs.Info("exportWellHistory Connecting Error", err.Error()) @@ -30288,13 +30806,19 @@ func exportWellHistory(response http.ResponseWriter, request *http.Request) { logs.Info("Query Error", err.Error()) } } - if strings.HasPrefix(db, "LH2020-") || - strings.HasPrefix(db, "LH2021-") || - strings.HasPrefix(db, "LH2022-") || - strings.HasPrefix(db, "LH2023-") || - strings.HasPrefix(db, "LH2024-") { - cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE", db) - _, err = conn.Exec(cmdSql) + 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 @@ -30364,21 +30888,46 @@ func getWellHistory_en(response http.ResponseWriter, request *http.Request) { return } fmt.Println() - // 这些库被设置为了离线状态,需要先设置为启用状态 - 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") + + // 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 { - logs.Info("链接master库失败", err.Error()) - fmt.Println("链接master库失败", err.Error()) + 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 + } } - defer conn.Close() - cmdSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) - _, err = conn.Exec(cmdSql) } + conn, err := getOdbcConn(db) if err != nil { logs.Info("getWellHistory_en Connecting Error", err.Error()) @@ -30427,7 +30976,7 @@ func getWellHistory_en(response http.ResponseWriter, request *http.Request) { cnt = req.Count } - selSql = fmt.Sprintf("select top %v [4301],[4303],[4304],[4305],[4306],[4307],[4311] from ( select top %v [4301],[4303],[4304],[4305],[4306],[4307],[4311] from DECODETABLE ", cnt, req.Index*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" @@ -30519,13 +31068,20 @@ func getWellHistory_en(response http.ResponseWriter, request *http.Request) { jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) - if strings.HasPrefix(db, "LH2020-") || - strings.HasPrefix(db, "LH2021-") || - strings.HasPrefix(db, "LH2022-") || - strings.HasPrefix(db, "LH2023-") || - strings.HasPrefix(db, "LH2024-") { - cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE", db) - _, err = conn.Exec(cmdSql) + // 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() @@ -30560,21 +31116,46 @@ func getWellHistory(response http.ResponseWriter, request *http.Request) { return } logs.Info("getWellHistory db:", 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") + + // 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 { - logs.Info("链接master库失败", err.Error()) - fmt.Println("链接master库失败", err.Error()) + 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 + } } - defer conn.Close() - cmdSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) - _, err = conn.Exec(cmdSql) } + conn, err := getOdbcConn(db) if err != nil { logs.Info("getWellHistory Connecting Error", err.Error()) @@ -30630,7 +31211,7 @@ func getWellHistory(response http.ResponseWriter, request *http.Request) { cnt = req.Count } - selSql = fmt.Sprintf("select top %v [4301],[4303],[4304],[4305],[4306],[4307],[4311] from ( select top %v [4301],[4303],[4304],[4305],[4306],[4307],[4311] from DECODETABLE ", cnt, req.Index*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" @@ -30723,13 +31304,20 @@ func getWellHistory(response http.ResponseWriter, request *http.Request) { jdata, _ := json.Marshal(resp) fmt.Fprintf(response, string(jdata)) - if strings.HasPrefix(db, "LH2020-") || - strings.HasPrefix(db, "LH2021-") || - strings.HasPrefix(db, "LH2022-") || - strings.HasPrefix(db, "LH2023-") || - strings.HasPrefix(db, "LH2024-") { - cmdSql = fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE", db) - _, err = conn.Exec(cmdSql) + // 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() @@ -30973,10 +31561,10 @@ func getInstrumentMess_en(response http.ResponseWriter, request *http.Request) { func getInstrumentMessUtil(req InstrumentMess) (*InstrumentMessRespdata, error) { // 查询仪器所在的所有井 - sqlWellData := fmt.Sprintf(`SELECT DISTINCT wi.WELLNameSource , wi.WELLName + 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'`, + WHERE r.[2327] = '%s' AND r.[2328] = '%s' ORDER BY id desc`, req.Series, req.Instrument) fmt.Println("查询仪器所在的所有井------------", sqlWellData) logs.Info("查询仪器所在的所有井------------", sqlWellData) @@ -30990,7 +31578,7 @@ func getInstrumentMessUtil(req InstrumentMess) (*InstrumentMessRespdata, error) var wellInfos []get_vibration_resp for wellRow.Next() { var wellInfo get_vibration_resp - if err := wellRow.Scan(&wellInfo.WellNameSource, &wellInfo.Wellname); err == nil { + if err := wellRow.Scan(&wellInfo.WellNameSource, &wellInfo.Wellname, &wellInfo.ID); err == nil { wellInfos = append(wellInfos, wellInfo) } } @@ -31019,20 +31607,46 @@ func getInstrumentMessUtil(req InstrumentMess) (*InstrumentMessRespdata, error) dbData.Scan(&db) fmt.Println("db----------", db) logs.Info("db----------", 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") + + // 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 { - logs.Info("链接master库失败", err.Error()) - fmt.Println("链接master库失败", err.Error()) + 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 + } } - defer conn.Close() - cmdSql := fmt.Sprintf("ALTER DATABASE [%s] SET ONLINE", db) - _, err = conn.Exec(cmdSql) } + conn, err := getOdbcConn(db) row, err := conn.Query(sqlQuery) @@ -31081,23 +31695,26 @@ func getInstrumentMessUtil(req InstrumentMess) (*InstrumentMessRespdata, error) //仪器工作状态 resp.Content = req.Content - // if strings.HasPrefix(db, "LH2020-") || - // strings.HasPrefix(db, "LH2021-") || - // strings.HasPrefix(db, "LH2022-") || - // strings.HasPrefix(db, "LH2023-") || - // strings.HasPrefix(db, "LH2024-") || - // strings.HasPrefix(db, "LH2025-") { - // logs.Info("开始关库,数据库名: %s", db) - // cmdSql := fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE", db) - // _, err = conn.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) - // } - // } + // 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 } @@ -31127,15 +31744,15 @@ func workMess(wellInfos []get_vibration_resp, flag string, content string, serie CONVERT(VARCHAR(50), MIN([5217])) + '-' + CONVERT(VARCHAR(50), MAX([5217])) AS ValueInterval, MAX([5220]) AS GlobalMax1, MAX([5221]) AS GlobalMax2, - CONVERT(VARCHAR(1000), ( - SELECT DISTINCT ',' + [5202] + ( + SELECT TOP 1 [5202] FROM [dbo].[EQUIPMENTRECORDS] t2 - WHERE t2.[5200] = t1.[5200] - FOR XML PATH('') - )) AS PersonnelList + 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) + qsql := workMessSql + fmt.Sprintf(` WHERE [5200] = '%s' GROUP BY [5200] `, well.WellNameSource) wellSql := fmt.Sprintf(`SELECT WELLName from WellInformation where WELLNameSource = '%s'`, well.WellNameSource) @@ -31406,7 +32023,7 @@ func getMaintenanceMess(series string, instrument string, opuser string) []GetLc func get_DeptMess(series string, instrument string) string { query := fmt.Sprintf(`SELECT DISTINCT - COALESCE(u.department + N',', N'') + COALESCE(e.[6813], N'') AS dept + COALESCE(u.department + N' ', N'') AS dept FROM [EQUIPMENTASSETS] e LEFT JOIN [userinfo] u ON e.[6813] = u.username WHERE e.[6803] = '%s' @@ -31452,7 +32069,7 @@ func get_DeptMess(series string, instrument string) string { return results[0] // 只有一条结果时直接返回 default: // 多条结果时用分号连接 - return strings.Join(results, "\n") + return strings.TrimSpace(strings.Join(results, "\n")) } } diff --git a/res.go b/res.go index cc37e3b..9d342eb 100644 --- a/res.go +++ b/res.go @@ -89,6 +89,7 @@ type Cmr_input_record struct { type get_vibration_resp struct { OpUser string `json:"opUser"` + ID string `json:"id"` Wellname string `json:"wellname"` //井名 WellNameSource string `json:"WELLNameSource"` //井名对应库 Uploadname string `json:"upload_name"`