package controllers
import (
"ColdVerify_server/Nats/NatsServer"
"ColdVerify_server/conf"
"ColdVerify_server/lib"
"ColdVerify_server/lib/wx"
"ColdVerify_server/logs"
"ColdVerify_server/models/Account"
"ColdVerify_server/models/Certificate"
"ColdVerify_server/models/Device"
"ColdVerify_server/models/InfoCollection"
"ColdVerify_server/models/System"
"ColdVerify_server/models/Task"
"ColdVerify_server/models/VerifyTemplate"
"archive/zip"
"encoding/json"
"errors"
"fmt"
"image/color"
"io"
"math"
"os"
"os/exec"
"path/filepath"
"regexp"
"strings"
"sync"
"time"
"github.com/xuri/excelize/v2"
beego "github.com/beego/beego/v2/server/web"
"github.com/google/uuid"
"gonum.org/v1/plot"
"gonum.org/v1/plot/plotter"
"gonum.org/v1/plot/vg"
"gonum.org/v1/plot/vg/draw"
)
type TaskController struct {
beego.Controller
}
// 导入Excel创建任务并写入模版数据
func (c *TaskController) Import_Tasks() {
file, fileHeader, err := c.GetFile("file")
if err != nil {
c.Data["json"] = lib.JSONS{Code: 203, Msg: "读取上传文件失败!"}
c.ServeJSON()
return
}
defer file.Close()
// 保存上传的文件到临时位置,以便后续提取图片
lib.Create_Dir("./ofile/temp_excel")
tempExcelPath := fmt.Sprintf("./ofile/temp_excel/%d_%s", time.Now().Unix(), fileHeader.Filename)
err = c.SaveToFile("file", tempExcelPath)
if err != nil {
c.Data["json"] = lib.JSONS{Code: 203, Msg: "保存临时文件失败!"}
c.ServeJSON()
return
}
defer os.Remove(tempExcelPath) // 处理完成后删除临时文件
// 重新打开文件用于读取数据(必须使用文件路径,GetPicture 等功能依赖于完整文件)
f, err := excelize.OpenFile(tempExcelPath)
if err != nil {
c.Data["json"] = lib.JSONS{Code: 203, Msg: "Excel 文件解析失败!"}
c.ServeJSON()
return
}
defer func() {
_ = f.Close()
}()
sheetName := c.GetString("sheet")
if len(sheetName) == 0 {
sheets := f.GetSheetList()
if len(sheets) == 0 {
c.Data["json"] = lib.JSONS{Code: 203, Msg: "Excel 文件为空!"}
c.ServeJSON()
return
}
sheetName = sheets[0]
}
rows, err := f.GetRows(sheetName)
if err != nil {
c.Data["json"] = lib.JSONS{Code: 203, Msg: "读取 Excel 内容失败!"}
c.ServeJSON()
return
}
if len(rows) < 2 {
c.Data["json"] = lib.JSONS{Code: 203, Msg: "Excel 中缺少数据行!"}
c.ServeJSON()
return
}
headers := rows[0]
successIDs := make([]string, 0)
skippedRows := make([]int, 0)
failedRows := make([]string, 0)
// 从 Excel 文件中提取所有图片,建立 DISPIMG ID 到图片数据的映射
// pictureMap key格式: DISPIMG 中的 ID (例如 "ID_53A3119AC46541C694965B07E5E00F81")
pictureMap, err := c.extractPicturesFromExcel(tempExcelPath)
if err != nil {
logs.Warning(fmt.Sprintf("提取 Excel 图片失败: %v,将继续处理数据", err))
pictureMap = make(map[string][]byte)
}
logs.Info(fmt.Sprintf("共提取到 %d 个图片(ID映射)", len(pictureMap)))
// 缓存 InfoCollection,避免同一家公司重复查询或创建
infoCollectionCache := make(map[string]InfoCollection.InfoCollection)
for idx := 1; idx < len(rows); idx++ {
rowCells := rows[idx]
rowData := make(map[string]string, len(headers))
nonEmpty := false
for colIdx, header := range headers {
header = strings.TrimSpace(header)
if len(header) == 0 {
continue
}
value := ""
if colIdx < len(rowCells) {
value = strings.TrimSpace(rowCells[colIdx])
}
if len(value) > 0 {
nonEmpty = true
}
// 处理单元格内是图片的情况:只有value包含DISPIMG时才处理
if strings.Contains(value, "DISPIMG") {
logs.Info(fmt.Sprintf("单元格 %d:%d 包含DISPIMG,可能是图片: %s", idx+1, colIdx+1, value))
// 从 DISPIMG 公式中提取 ID
// 格式: =DISPIMG("ID_53A3119AC46541C694965B07E5E00F81",1) 或 DISPIMG("ID_...",1)
var picData []byte
var foundBy string
// 通过 ID 查找图片(pictureMap 现在使用 DISPIMG ID 作为 key)
dispimgIdRe := regexp.MustCompile(`DISPIMG\s*\(\s*"([^"]+)"`)
idMatches := dispimgIdRe.FindStringSubmatch(value)
if len(idMatches) > 1 {
imageId := idMatches[1]
logs.Info(fmt.Sprintf("从 DISPIMG 公式中提取到 ID: %s", imageId))
if data, exists := pictureMap[imageId]; exists && len(data) > 0 {
picData = data
foundBy = fmt.Sprintf("ID (%s)", imageId)
logs.Info(fmt.Sprintf("通过 ID %s 找到图片数据 (大小: %d 字节)", imageId, len(picData)))
} else {
logs.Warning(fmt.Sprintf("通过 ID %s 未找到图片数据,pictureMap 中有 %d 个图片", imageId, len(pictureMap)))
}
}
// 如果找到了图片数据,上传图片
if picData != nil && len(picData) > 0 {
imageURL, uploadErr := c.uploadImageData(picData, header)
if uploadErr == nil && len(imageURL) > 0 {
value = imageURL
nonEmpty = true
logs.Info(fmt.Sprintf("第%d行 %s 图片上传成功 (通过%s): %s", idx+1, header, foundBy, imageURL))
logs.Info(fmt.Sprintf("第%d行 %s 图片上传成功 (通过%s): %s", idx+1, header, foundBy, imageURL))
} else if uploadErr != nil {
logs.Error(fmt.Sprintf("第%d行 %s 上传单元格图片失败: %v", idx+1, header, uploadErr))
}
} else {
logs.Warning(fmt.Sprintf("第%d行 %s 包含DISPIMG但未找到对应图片数据", idx+1, header))
}
}
rowData[header] = value
}
if !nonEmpty {
continue
}
companyName := strings.TrimSpace(rowData["公司名称"])
taskName := strings.TrimSpace(rowData["任务名称"])
belongYear := strings.TrimSpace(rowData["所属年份"])
if len(companyName) == 0 || len(taskName) == 0 || len(belongYear) == 0 {
skippedRows = append(skippedRows, idx+1)
continue
}
taskID, err := c.importTaskRow(rowData, infoCollectionCache)
if err != nil {
failedRows = append(failedRows, fmt.Sprintf("第%d行: %v", idx+1, err))
continue
}
successIDs = append(successIDs, taskID)
}
msg := fmt.Sprintf("导入完成, 成功 %d 条, 跳过 %d 条, 失败 %d 条", len(successIDs), len(skippedRows), len(failedRows))
respData := map[string]interface{}{
"success_ids": successIDs,
"skipped_rows": skippedRows,
}
if len(failedRows) > 0 {
respData["failed_rows"] = failedRows
}
c.Data["json"] = lib.JSONS{Code: 200, Msg: msg, Data: respData}
c.ServeJSON()
}
func (c *TaskController) importTaskRow(row map[string]string, infoCollectionCache map[string]InfoCollection.InfoCollection) (string, error) {
templateName := strings.TrimSpace(row["模板名称"])
lastOpenBracket := strings.LastIndex(templateName, "[")
lastCloseBracket := strings.LastIndex(templateName, "]")
if lastOpenBracket == -1 || lastCloseBracket == -1 || lastOpenBracket >= lastCloseBracket {
return "", fmt.Errorf("模版名称中未找到模版ID")
}
templateID := templateName[lastOpenBracket+1 : lastCloseBracket]
if len(templateID) == 0 {
return "", fmt.Errorf("模版ID为空")
}
vt, ok := VerifyTemplate.Read_VerifyTemplate(templateID)
if !ok {
return "", fmt.Errorf("模版不存在: %s", templateID)
}
taskUID := strings.TrimSpace(row["唯一标识"])
if len(taskUID) == 0 {
return "", fmt.Errorf("唯一标识缺失")
}
existingTask, taskExists := Task.Read_Task_ByUid(taskUID)
companyName := strings.TrimSpace(row["公司名称"])
if len(companyName) == 0 {
return "", fmt.Errorf("公司名称缺失")
}
cachedUser, found, err := Account.GetCompanyFromCache(companyName)
if err != nil {
return "", fmt.Errorf("公司数据读取失败: %w", err)
}
var user Account.User
if !found {
newUser := Account.User{
T_name: companyName,
T_pass: Account.DefaultCompanyPasswordHash,
T_passstr: Account.DefaultCompanyPasswordPlain,
T_Show: 1,
T_State: 1,
T_pid: 0,
}
newID, ok := Account.Add_User(newUser)
if !ok {
return "", fmt.Errorf("自动创建公司失败")
}
if err := Account.UpdateUserPath(int(newID)); err != nil {
logs.Error("更新新公司路径失败:", err)
}
createdUser, is := Account.Read_User_ById(int(newID))
if !is {
return "", fmt.Errorf("获取新公司信息失败")
}
user = createdUser
Account.UpsertCompanyCache(user)
} else {
user = cachedUser
}
// 根据用户信息获取或创建 InfoCollection,并使用 map 做本次导入缓存,避免重复查询
cacheKey := user.T_uuid
if len(cacheKey) == 0 {
cacheKey = user.T_name
}
infoCollectionRecord, ok := infoCollectionCache[cacheKey]
if !ok {
record, err := InfoCollection.GetOrCreate_InfoCollection(user.T_uuid, user.T_name)
if err != nil {
return "", fmt.Errorf("自动创建信息采集失败: %w", err)
}
infoCollectionRecord = record
infoCollectionCache[cacheKey] = infoCollectionRecord
}
resolveAdminUUID := func(fieldName, fallback string, strict bool) (string, error) {
value, ok := row[fieldName]
if !ok || len(strings.TrimSpace(value)) == 0 {
return fallback, nil
}
admin, err := Account.EnsureAdminByName(strings.TrimSpace(value), "")
if err != nil {
if strict {
return "", err
}
logs.Error(fieldName+" 负责人处理失败:", err)
return fallback, nil
}
return admin.T_uuid, nil
}
taskName := strings.TrimSpace(row["任务名称"])
if len(taskName) == 0 {
return "", fmt.Errorf("任务名称缺失")
}
classPath := ""
if vt.T_class > 0 {
if cls, err := VerifyTemplate.Read_VerifyTemplateClass_ById(vt.T_class); err == nil {
p := cls.T_path
p = strings.Trim(p, "/")
p = strings.TrimPrefix(p, "0/")
classPath = p
}
}
schemeFallback := ""
collectionFallback := ""
reportingFallback := ""
deliveryFallback := ""
projectFallback := ""
categoryFallback := ""
deviceTypeFallback := ""
verifyTypeFallback := ""
if taskExists {
schemeFallback = existingTask.T_scheme
collectionFallback = existingTask.T_collection
reportingFallback = existingTask.T_reporting
deliveryFallback = existingTask.T_delivery
projectFallback = existingTask.T_project
categoryFallback = existingTask.T_category
deviceTypeFallback = existingTask.T_device_type
verifyTypeFallback = existingTask.T_verify_type
}
schemeUUID, err := resolveAdminUUID("实施方案", schemeFallback, false)
if err != nil {
return "", fmt.Errorf("实施方案负责人创建失败: %w", err)
}
collectionUUID, err := resolveAdminUUID("数据采集", collectionFallback, true)
if err != nil {
return "", fmt.Errorf("数据采集负责人创建失败: %w", err)
}
reportingUUID, err := resolveAdminUUID("报告编辑", reportingFallback, true)
if err != nil {
return "", fmt.Errorf("报告编辑负责人创建失败: %w", err)
}
deliveryUUID, err := resolveAdminUUID("交付审核", deliveryFallback, false)
if err != nil {
return "", fmt.Errorf("交付审核负责人创建失败: %w", err)
}
projectUUID, _ := resolveAdminUUID("项目负责人", projectFallback, false)
categoryValue := strings.TrimSpace(row["类别"])
if len(categoryValue) == 0 {
categoryValue = categoryFallback
}
deviceTypeValue := strings.TrimSpace(row["设备类型"])
if len(deviceTypeValue) == 0 {
deviceTypeValue = deviceTypeFallback
} else {
if mapped, ok := Task.DeviceTypeMap[deviceTypeValue]; ok {
deviceTypeValue = mapped
} else {
deviceTypeValue = deviceTypeValue
}
}
verifyTypeValue := strings.TrimSpace(row["验证类型"])
if len(verifyTypeValue) == 0 {
verifyTypeValue = verifyTypeFallback
}
belongYearValue := strings.TrimSpace(row["所属年份"])
infoCollectionID := infoCollectionRecord.T_InfoCollection_id
taskRecord := Task.Task{
T_Distributor_id: user.T_Distributor_id,
T_uuid: user.T_uuid,
T_name: taskName,
T_VerifyTemplate_id: templateID,
T_VerifyTemplate_class: classPath,
T_InfoCollection_id: infoCollectionID,
T_uid: taskUID,
T_scheme: schemeUUID,
T_collection: collectionUUID,
T_reporting: reportingUUID,
T_delivery: deliveryUUID,
T_project: projectUUID,
T_category: categoryValue,
T_device_type: deviceTypeValue,
T_verify_type: verifyTypeValue,
T_belong_year: belongYearValue,
}
var taskID string
if taskExists {
taskRecord.Id = existingTask.Id
taskRecord.T_task_id = existingTask.T_task_id
taskRecord.T_State = existingTask.T_State
if ok := Task.Update_Task(taskRecord, "T_Distributor_id", "T_uuid", "T_name", "T_VerifyTemplate_id", "T_VerifyTemplate_class", "T_uid", "T_scheme", "T_collection", "T_reporting", "T_delivery", "T_project", "T_category", "T_device_type", "T_verify_type", "T_belong_year"); !ok {
return "", fmt.Errorf("更新任务失败")
}
taskID = existingTask.T_task_id
} else {
dc := Device.DeviceClass{
T_uuid: user.T_uuid,
T_State: 1,
}
classID, ok := Device.Add_DeviceClass(dc)
if !ok {
return "", fmt.Errorf("创建分类失败")
}
taskRecord.T_class = int(classID)
taskRecord.T_State = 1
taskRecord.T_deadline = time.Now().AddDate(0, 2, 0).Format("2006-01-02")
if len(strings.TrimSpace(taskRecord.T_device_type)) > 0 {
number, err := Task.GenerateNextT_report_number(taskRecord.T_device_type)
if err != nil {
return "", fmt.Errorf("生成报告编号失败: %w", err)
}
taskRecord.T_report_number = number
}
if newID, ok := Task.Add_Task(taskRecord); !ok {
return "", fmt.Errorf("创建任务失败")
} else {
taskID = newID
}
}
mapList, _ := VerifyTemplate.Read_VerifyTemplateMap_List(templateID, 0, 0)
labelMap := make(map[string]VerifyTemplate.VerifyTemplateMap_R, len(mapList))
for _, m := range mapList {
labelMap[m.T_name] = m
}
dataList := make([]VerifyTemplate.VerifyTemplateMapData, 0, len(row))
for key, val := range row {
if vtm, exists := labelMap[key]; exists {
logs.Println("key:", key, "val:", val)
dataList = append(dataList, VerifyTemplate.VerifyTemplateMapData{
T_source: vtm.T_source,
T_task_id: taskID,
T_VerifyTemplate_id: templateID,
T_VerifyTemplateMap_id: vtm.T_id,
T_value: val,
T_Required: vtm.T_Required,
T_Construction: vtm.T_Construction,
T_flow_sort: vtm.T_flow_sort,
T_max_time: vtm.T_max_time,
T_min_time: vtm.T_min_time,
T_start_time: int64(vtm.T_start_time),
})
}
}
if len(dataList) > 0 {
if _, ok := VerifyTemplate.AddOrUpdate_VerifyTemplateMapData(dataList); !ok {
return "", fmt.Errorf("写入模版数据失败")
}
}
return taskID, nil
}
func (c *TaskController) extractPicturesFromExcel(filePath string) (map[string][]byte, error) {
filePath = strings.TrimSpace(filePath)
if len(filePath) == 0 {
return nil, fmt.Errorf("Excel 文件路径为空")
}
zipReader, err := zip.OpenReader(filePath)
if err != nil {
return nil, fmt.Errorf("打开 Excel 压缩包失败: %w", err)
}
defer zipReader.Close()
return c.extractWpsDispImgPictures(zipReader), nil
}
// extractWpsDispImgPictures 专门处理 WPS / _xlfn.DISPIMG 的图片提取逻辑
// 原理参考: `https://www.hushlll.top/?p=644`
// 1. 读取 xl/cellimages.xml,找到每个图片块中的 name="ID_xxx" 和 r:embed="rIdX"
// 2. 读取 xl/_rels/cellimages.xml.rels(或退回到 xl/drawings/_rels/drawing1.xml.rels),把 rId 映射到具体的图片路径(如 media/image1.jpg)
// 3. 从 ZIP 中按路径取出图片数据,建立 ID -> 图片数据 的映射
func (c *TaskController) extractWpsDispImgPictures(zipReader *zip.ReadCloser) map[string][]byte {
result := make(map[string][]byte)
if zipReader == nil || zipReader.File == nil {
return result
}
// 1. 找到 xl/cellimages.xml
var cellImagesFile *zip.File
for _, f := range zipReader.File {
if f != nil && f.Name == "xl/cellimages.xml" {
cellImagesFile = f
break
}
}
if cellImagesFile == nil {
// 非 WPS / 无 cellimages.xml 的情况,直接返回空
return result
}
rc, err := cellImagesFile.Open()
if err != nil {
logs.Warning(fmt.Sprintf("无法打开 xl/cellimages.xml: %v", err))
return result
}
cellImagesData, err := io.ReadAll(rc)
rc.Close()
if err != nil {
logs.Warning(fmt.Sprintf("无法读取 xl/cellimages.xml: %v", err))
return result
}
cellImagesContent := string(cellImagesData)
// 2. 读取关系文件:优先 xl/_rels/cellimages.xml.rels,找不到再尝试 xl/drawings/_rels/drawing1.xml.rels
var relsFile *zip.File
for _, f := range zipReader.File {
if f != nil && f.Name == "xl/_rels/cellimages.xml.rels" {
relsFile = f
break
}
}
if relsFile == nil {
for _, f := range zipReader.File {
if f != nil && f.Name == "xl/drawings/_rels/drawing1.xml.rels" {
relsFile = f
break
}
}
}
if relsFile == nil {
logs.Warning("未找到 cellimages 对应的关系文件 (cellimages.xml.rels / drawing1.xml.rels)")
return result
}
rc, err = relsFile.Open()
if err != nil {
logs.Warning(fmt.Sprintf("无法打开关系文件 %s: %v", relsFile.Name, err))
return result
}
relsData, err := io.ReadAll(rc)
rc.Close()
if err != nil {
logs.Warning(fmt.Sprintf("无法读取关系文件 %s: %v", relsFile.Name, err))
return result
}
relsContent := string(relsData)
// 2.1 解析关系文件,建立 rId -> Target 的映射
relsMap := make(map[string]string)
reRel := regexp.MustCompile(`Id="([^"]+)"[^>]*Target="([^"]+)"`)
for _, m := range reRel.FindAllStringSubmatch(relsContent, -1) {
if len(m) >= 3 {
id := m[1]
target := m[2]
relsMap[id] = target
}
}
if len(relsMap) == 0 {
logs.Warning(fmt.Sprintf("关系文件 %s 中未解析到任何图片关系", relsFile.Name))
return result
}
// 3. 从 cellimages.xml 中解析每个图片块
// 结构大致类似:
// ... ... ... ... ...
picBlocks := regexp.MustCompile(`(?s)]*>.*?`).FindAllString(cellImagesContent, -1)
if len(picBlocks) == 0 {
logs.Warning("xl/cellimages.xml 中未找到任何 图片块")
return result
}
nameRe := regexp.MustCompile(`name="(ID_[^"]+)"`)
embedRe := regexp.MustCompile(`r:embed="([^"]+)"`)
for _, block := range picBlocks {
nameMatch := nameRe.FindStringSubmatch(block)
if len(nameMatch) < 2 {
continue
}
imgID := nameMatch[1]
embedMatch := embedRe.FindStringSubmatch(block)
if len(embedMatch) < 2 {
logs.Warning(fmt.Sprintf("WPS 图片块中 ID %s 未找到 r:embed 属性", imgID))
continue
}
rId := embedMatch[1]
target, ok := relsMap[rId]
if !ok {
logs.Warning(fmt.Sprintf("在关系文件中未找到 rId=%s 对应的图片路径 (ID=%s)", rId, imgID))
continue
}
// 关系文件里的 Target 一般是 media/image1.jpg 或 ../media/image1.jpg
// 在 ZIP 中的真实路径应为 xl/
imagePathInZip := "xl/" + strings.TrimLeft(target, "/")
var imageFile *zip.File
for _, f := range zipReader.File {
if f != nil && f.Name == imagePathInZip {
imageFile = f
break
}
}
if imageFile == nil {
logs.Warning(fmt.Sprintf("在 ZIP 中未找到图片文件 %s (ID=%s, rId=%s)", imagePathInZip, imgID, rId))
continue
}
rcImg, err := imageFile.Open()
if err != nil {
logs.Warning(fmt.Sprintf("无法打开图片文件 %s: %v", imagePathInZip, err))
continue
}
imgData, err := io.ReadAll(rcImg)
rcImg.Close()
if err != nil {
logs.Warning(fmt.Sprintf("无法读取图片文件 %s: %v", imagePathInZip, err))
continue
}
if len(imgData) == 0 {
logs.Warning(fmt.Sprintf("图片文件 %s 为空,跳过 (ID=%s)", imagePathInZip, imgID))
continue
}
result[imgID] = imgData
logs.Info(fmt.Sprintf("WPS cellimages 建立映射: ID %s -> %s (大小: %d 字节)", imgID, imagePathInZip, len(imgData)))
}
logs.Info(fmt.Sprintf("通过 WPS cellimages 共解析出 %d 个 ID->图片 映射", len(result)))
return result
}
// 上传图片数据到七牛云
func (c *TaskController) uploadImageData(imageData []byte, headerName string) (string, error) {
if len(imageData) == 0 {
return "", fmt.Errorf("图片数据为空")
}
// 创建临时目录
tempDir := "./ofile/temp_images"
err := os.MkdirAll(tempDir, 0755)
if err != nil {
return "", fmt.Errorf("创建临时目录失败: %w", err)
}
// 根据图片数据的前几个字节判断图片格式
ext := ".png" // 默认扩展名
if len(imageData) >= 4 {
// PNG: 89 50 4E 47
if imageData[0] == 0x89 && imageData[1] == 0x50 && imageData[2] == 0x4E && imageData[3] == 0x47 {
ext = ".png"
} else if len(imageData) >= 2 {
// JPEG: FF D8
if imageData[0] == 0xFF && imageData[1] == 0xD8 {
ext = ".jpg"
} else if len(imageData) >= 6 {
// GIF: 47 49 46 38
if imageData[0] == 0x47 && imageData[1] == 0x49 && imageData[2] == 0x46 && imageData[3] == 0x38 {
ext = ".gif"
}
}
}
}
fileName := fmt.Sprintf("%s_%s_%d%s", headerName, uuid.New().String(), time.Now().Unix(), ext)
tempFilePath := filepath.Join(tempDir, fileName)
// 保存图片到临时文件
err = os.WriteFile(tempFilePath, imageData, 0644)
if err != nil {
return "", fmt.Errorf("保存图片失败: %w", err)
}
defer func() {
// 确保清理临时文件
if removeErr := os.Remove(tempFilePath); removeErr != nil {
logs.Error(fmt.Sprintf("删除临时文件失败: %s, 错误: %v", tempFilePath, removeErr))
}
}()
// 检查文件是否存在
fileInfo, err := os.Stat(tempFilePath)
if err != nil {
return "", fmt.Errorf("获取文件信息失败: %w", err)
}
// 上传到七牛云
qiniuFileName := fmt.Sprintf("UpImage/excel_import_%s_%d%s", uuid.New().String(), time.Now().Unix(), ext)
logs.Info(fmt.Sprintf("准备上传图片: %s, 大小: %d 字节, 目标: %s", tempFilePath, fileInfo.Size(), qiniuFileName))
imageURL, success := NatsServer.Qiniu_UploadFile(tempFilePath, qiniuFileName)
if !success {
logs.Error(fmt.Sprintf("上传图片到七牛云失败: 文件=%s, 大小=%d 字节, 目标=%s", tempFilePath, fileInfo.Size(), qiniuFileName))
return "", fmt.Errorf("上传图片到七牛云失败,文件大小: %d 字节", fileInfo.Size())
}
if imageURL == "" {
return "", fmt.Errorf("上传图片后未返回URL")
}
logs.Info(fmt.Sprintf("图片上传成功: %s -> %s", tempFilePath, imageURL))
return imageURL, nil
}
// 列表 -
func (c *TaskController) List() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
var r_jsons lib.R_JSONS
page, _ := c.GetInt("page")
if page < 1 {
page = 1
}
page_z, _ := c.GetInt("page_z")
if page_z < 1 {
page_z = conf.Page_size
}
T_name := c.GetString("T_name")
T_company := c.GetString("T_company") // 公司名称
T_uuid := c.GetString("T_uuid")
T_InfoCollection_id := c.GetString("T_InfoCollection_id")
T_scheme := c.GetString("T_scheme") // 实施方案 负责人UUID
T_collection := c.GetString("T_collection") // 数据采集 负责人UUID
T_reporting := c.GetString("T_reporting") // 报告编写 负责人UUID
T_delivery := c.GetString("T_delivery") // 交付审核 负责人UUID
T_scheme_state := c.GetString("T_scheme_state") // 实施方案 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
T_collection_state := c.GetString("T_collection_state") // 数据采集 状态 0 未完成 1 数据来源已完成 2 处理中 3 已采集-无数据 4-数据编辑已完成(已提交) 5已通过(负责人) 6已退回(负责人)
T_reporting_state := c.GetString("T_reporting_state") // 报告编写 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
T_delivery_state := c.GetString("T_delivery_state") // 交付审核 状态 0 未完成 1 已完成 2 处理中
T_marking_state := c.GetString("T_marking_state") // 验证标识 状态 0 未完成 1 已完成
CreateTime := c.GetString("CreateTime") // 任务添加时间
UserMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
var T_company_list []string
if len(T_company) > 0 {
T_company_list = Account.Read_User_T_uuid_ListByT_name(T_company)
}
var T_admin string
if User_r.T_power > 2 {
T_admin = User_r.T_uuid
}
// 经销商下管理员可查看自己经销商下所有的任务
// 经销商下其他角色只能查看分配给自己的任务
if len(User_r.T_Distributor_id) > 0 && User_r.T_power <= 2 {
T_admin = ""
}
var cnt int
List, cnt := Task.Read_Task_List(User_r.T_Distributor_id, T_uuid, T_admin, T_name, T_InfoCollection_id, T_scheme, T_collection, T_reporting, T_delivery,
T_scheme_state, T_collection_state, T_reporting_state, T_delivery_state, T_marking_state,
T_company_list, UserMap, AdminMap, CreateTime, page, page_z)
page_size := math.Ceil(float64(cnt) / float64(page_z))
r_jsons.List = List
r_jsons.Page = page
r_jsons.Page_size = int(page_size)
r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
r_jsons.Num = cnt
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
c.ServeJSON()
return
}
// 报告统计
func (c *TaskController) Stat() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
var r_jsons lib.R_JSONS
page, _ := c.GetInt("page")
if page < 1 {
page = 1
}
page_z, _ := c.GetInt("page_z")
if page_z < 1 {
page_z = conf.Page_size
}
T_name := c.GetString("T_name")
T_company := c.GetString("T_company") // 公司名称
T_uuid := c.GetString("T_uuid")
T_InfoCollection_id := c.GetString("T_InfoCollection_id")
T_project := c.GetString("T_project") // 项目 负责人UUID
T_scheme := c.GetString("T_scheme") // 实施方案 负责人UUID
T_collection := c.GetString("T_collection") // 数据采集 负责人UUID
T_reporting := c.GetString("T_reporting") // 报告编写 负责人UUID
T_delivery := c.GetString("T_delivery") // 交付审核 负责人UUID
T_scheme_state := c.GetString("T_scheme_state") // 实施方案 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
T_collection_state := c.GetString("T_collection_state") // 数据采集 状态 0 未完成 1 数据来源已完成 2 处理中 3 已采集-无数据 4-数据编辑已完成(已提交) 5已通过(负责人) 6已退回(负责人)
T_reporting_state := c.GetString("T_reporting_state") // 报告编写 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
T_delivery_state := c.GetString("T_delivery_state") // 交付审核 状态 0 未完成 1 已完成 2 处理中
T_marking_state := c.GetString("T_marking_state") // 验证标识 状态 0 未完成 1 已完成
CreateTime := c.GetString("CreateTime") // 任务添加时间
UserMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
var T_company_list []string
if len(T_company) > 0 {
T_company_list = Account.Read_User_T_uuid_ListByT_name(T_company)
}
var T_admin string
if User_r.T_power > 2 {
T_admin = User_r.T_uuid
}
var cnt int
List, cnt := Task.Read_Task_Stat(User_r.T_Distributor_id, T_uuid, T_admin, T_name, T_InfoCollection_id, T_project, T_scheme, T_collection, T_reporting, T_delivery,
T_scheme_state, T_collection_state, T_reporting_state, T_delivery_state, T_marking_state,
T_company_list, UserMap, AdminMap, CreateTime, page, page_z)
page_size := math.Ceil(float64(cnt) / float64(page_z))
r_jsons.List = List
r_jsons.Page = page
r_jsons.Page_size = int(page_size)
r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
r_jsons.Num = cnt
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
c.ServeJSON()
return
}
// 报告统计 - 导出excel
func (c *TaskController) Stat_Excel() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_name := c.GetString("T_name")
T_company := c.GetString("T_company") // 公司名称
T_uuid := c.GetString("T_uuid")
T_InfoCollection_id := c.GetString("T_InfoCollection_id")
T_project := c.GetString("T_project") // 项目 负责人UUID
T_scheme := c.GetString("T_scheme") // 实施方案 负责人UUID
T_collection := c.GetString("T_collection") // 数据采集 负责人UUID
T_reporting := c.GetString("T_reporting") // 报告编写 负责人UUID
T_delivery := c.GetString("T_delivery") // 交付审核 负责人UUID
T_scheme_state := c.GetString("T_scheme_state") // 实施方案 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
T_collection_state := c.GetString("T_collection_state") // 数据采集 状态 0 未完成 1 数据来源已完成 2 处理中 3 已采集-无数据 4-数据编辑已完成(已提交) 5已通过(负责人) 6已退回(负责人)
T_reporting_state := c.GetString("T_reporting_state") // 报告编写 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
T_delivery_state := c.GetString("T_delivery_state") // 交付审核 状态 0 未完成 1 已完成 2 处理中
T_marking_state := c.GetString("T_marking_state") // 验证标识 状态 0 未完成 1 已完成
CreateTime := c.GetString("CreateTime") // 任务添加时间
UserMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
var T_company_list []string
if len(T_company) > 0 {
T_company_list = Account.Read_User_T_uuid_ListByT_name(T_company)
}
var T_admin string
if User_r.T_power > 2 {
T_admin = User_r.T_uuid
}
List, _ := Task.Read_Task_Stat(User_r.T_Distributor_id, T_uuid, T_admin, T_name, T_InfoCollection_id, T_project, T_scheme, T_collection, T_reporting, T_delivery,
T_scheme_state, T_collection_state, T_reporting_state, T_delivery_state, T_marking_state,
T_company_list, UserMap, AdminMap, CreateTime, 0, 9999)
f := excelize.NewFile() // 设置单元格的值
line := 1
// 这里设置表头
f.MergeCell("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("A%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("B%d", line), fmt.Sprintf("B%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("C%d", line), fmt.Sprintf("C%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("D%d", line), fmt.Sprintf("D%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("E%d", line), fmt.Sprintf("E%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("F%d", line), fmt.Sprintf("F%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("G%d", line), fmt.Sprintf("G%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("H%d", line), fmt.Sprintf("H%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("I%d", line), fmt.Sprintf("I%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("J%d", line), fmt.Sprintf("J%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("K%d", line), fmt.Sprintf("K%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("L%d", line), fmt.Sprintf("L%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("M%d", line), fmt.Sprintf("M%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("N%d", line), fmt.Sprintf("N%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("O%d", line), fmt.Sprintf("O%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("P%d", line), fmt.Sprintf("P%d", line+1))
f.MergeCell("Sheet1", fmt.Sprintf("Q%d", line), fmt.Sprintf("U%d", line))
f.MergeCell("Sheet1", fmt.Sprintf("V%d", line), fmt.Sprintf("AA%d", line))
f.MergeCell("Sheet1", fmt.Sprintf("AB%d", line), fmt.Sprintf("AG%d", line))
f.MergeCell("Sheet1", fmt.Sprintf("AH%d", line), fmt.Sprintf("AM%d", line))
f.SetCellValue("Sheet1", fmt.Sprintf("Q%d", line), "信息表")
f.SetCellValue("Sheet1", fmt.Sprintf("V%d", line), "方案")
f.SetCellValue("Sheet1", fmt.Sprintf("AB%d", line), "实施")
f.SetCellValue("Sheet1", fmt.Sprintf("AH%d", line), "报告")
f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), "序号")
f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), "公司名称")
f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), "报告名称")
f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), "项目负责人")
f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), "地区")
f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), "类别")
f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), "设备类型")
f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), "规格/容积")
f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), "验证类型")
f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), "标的物名称")
f.SetCellValue("Sheet1", fmt.Sprintf("K%d", line), "验证温度范围")
f.SetCellValue("Sheet1", fmt.Sprintf("L%d", line), "报告编号")
f.SetCellValue("Sheet1", fmt.Sprintf("M%d", line), "项目开始时间")
f.SetCellValue("Sheet1", fmt.Sprintf("N%d", line), "项目用时")
f.SetCellValue("Sheet1", fmt.Sprintf("O%d", line), "驳回次数")
f.SetCellValue("Sheet1", fmt.Sprintf("P%d", line), "回款")
f.SetCellValue("Sheet1", fmt.Sprintf("Q%d", line+1), "编写人")
f.SetCellValue("Sheet1", fmt.Sprintf("R%d", line+1), "状态")
f.SetCellValue("Sheet1", fmt.Sprintf("S%d", line+1), "开始时间")
f.SetCellValue("Sheet1", fmt.Sprintf("T%d", line+1), "退回次数")
f.SetCellValue("Sheet1", fmt.Sprintf("U%d", line+1), "所需时间")
f.SetCellValue("Sheet1", fmt.Sprintf("V%d", line+1), "编写人")
f.SetCellValue("Sheet1", fmt.Sprintf("W%d", line+1), "状态")
f.SetCellValue("Sheet1", fmt.Sprintf("X%d", line+1), "开始时间")
f.SetCellValue("Sheet1", fmt.Sprintf("Y%d", line+1), "退回次数")
f.SetCellValue("Sheet1", fmt.Sprintf("Z%d", line+1), "所需时间")
f.SetCellValue("Sheet1", fmt.Sprintf("AA%d", line+1), "超时时间")
f.SetCellValue("Sheet1", fmt.Sprintf("AB%d", line+1), "编写人")
f.SetCellValue("Sheet1", fmt.Sprintf("AC%d", line+1), "状态")
f.SetCellValue("Sheet1", fmt.Sprintf("AD%d", line+1), "开始时间")
f.SetCellValue("Sheet1", fmt.Sprintf("AE%d", line+1), "退回次数")
f.SetCellValue("Sheet1", fmt.Sprintf("AF%d", line+1), "所需时间")
f.SetCellValue("Sheet1", fmt.Sprintf("AG%d", line+1), "超时时间")
f.SetCellValue("Sheet1", fmt.Sprintf("AH%d", line+1), "编写人")
f.SetCellValue("Sheet1", fmt.Sprintf("AI%d", line+1), "状态")
f.SetCellValue("Sheet1", fmt.Sprintf("AJ%d", line+1), "开始时间")
f.SetCellValue("Sheet1", fmt.Sprintf("AK%d", line+1), "退回次数")
f.SetCellValue("Sheet1", fmt.Sprintf("AL%d", line+1), "所需时间")
f.SetCellValue("Sheet1", fmt.Sprintf("AM%d", line+1), "超时时间")
f.SetCellValue("Sheet1", fmt.Sprintf("AN%d", line+1), "领导备注")
// 设置列宽
f.SetColWidth("Sheet1", "A", "A", 7)
f.SetColWidth("Sheet1", "B", "B", 20)
f.SetColWidth("Sheet1", "C", "C", 10)
f.SetColWidth("Sheet1", "D", "D", 10)
f.SetColWidth("Sheet1", "E", "E", 12)
f.SetColWidth("Sheet1", "F", "F", 8)
f.SetColWidth("Sheet1", "G", "G", 12)
f.SetColWidth("Sheet1", "H", "H", 14)
f.SetColWidth("Sheet1", "I", "I", 12)
f.SetColWidth("Sheet1", "J", "J", 12)
f.SetColWidth("Sheet1", "K", "K", 12)
f.SetColWidth("Sheet1", "L", "L", 12)
f.SetColWidth("Sheet1", "M", "M", 12)
f.SetColWidth("Sheet1", "N", "N", 12)
f.SetColWidth("Sheet1", "O", "O", 10)
f.SetColWidth("Sheet1", "P", "P", 8)
f.SetColWidth("Sheet1", "Q", "Q", 8)
f.SetColWidth("Sheet1", "R", "R", 8)
f.SetColWidth("Sheet1", "S", "S", 12)
f.SetColWidth("Sheet1", "T", "T", 10)
f.SetColWidth("Sheet1", "U", "U", 10)
f.SetColWidth("Sheet1", "V", "V", 8)
f.SetColWidth("Sheet1", "W", "W", 8)
f.SetColWidth("Sheet1", "X", "X", 12)
f.SetColWidth("Sheet1", "Y", "Y", 10)
f.SetColWidth("Sheet1", "Z", "Z", 12)
f.SetColWidth("Sheet1", "AA", "AA", 12)
f.SetColWidth("Sheet1", "AB", "AB", 8)
f.SetColWidth("Sheet1", "AC", "AC", 8)
f.SetColWidth("Sheet1", "AD", "AD", 12)
f.SetColWidth("Sheet1", "AE", "AE", 10)
f.SetColWidth("Sheet1", "AF", "AF", 12)
f.SetColWidth("Sheet1", "AG", "AG", 12)
f.SetColWidth("Sheet1", "AG", "AG", 10)
f.SetColWidth("Sheet1", "AH", "AH", 8)
f.SetColWidth("Sheet1", "AI", "AI", 8)
f.SetColWidth("Sheet1", "AJ", "AJ", 10)
f.SetColWidth("Sheet1", "AK", "AK", 12)
f.SetColWidth("Sheet1", "AL", "AL", 12)
f.SetColWidth("Sheet1", "AM", "AM", 12)
Style1, _ := f.NewStyle(
&excelize.Style{
Font: &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
Border: []excelize.Border{
{Type: "left", Color: "000000", Style: 1},
{Type: "top", Color: "000000", Style: 1},
{Type: "bottom", Color: "000000", Style: 1},
{Type: "right", Color: "000000", Style: 1},
},
})
f.SetCellStyle("Sheet1", "A1", "AM2", Style1)
f.SetRowHeight("Sheet1", 1, 25)
f.SetRowHeight("Sheet1", 2, 25)
line += 1
// 循环写入数据
for i, v := range List {
line++
f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), i+1)
f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.T_user_name)
f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.T_name)
f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.T_project_name)
f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), fmt.Sprintf("%s-%s-%s", v.T_province, v.T_city, v.T_district))
f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.T_category)
f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v.T_device_type)
f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v.T_volume)
f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), v.T_verify_type)
f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), v.T_subject_matter)
f.SetCellValue("Sheet1", fmt.Sprintf("K%d", line), v.T_temp_range)
f.SetCellValue("Sheet1", fmt.Sprintf("L%d", line), fmt.Sprintf("%s-%s", v.T_report_type, v.T_report_number))
f.SetCellValue("Sheet1", fmt.Sprintf("M%d", line), v.T_start_time)
f.SetCellValue("Sheet1", fmt.Sprintf("N%d", line), v.T_time_interval)
f.SetCellValue("Sheet1", fmt.Sprintf("O%d", line), v.T_reject_times)
returnedMoney := "否"
if v.InfoCollection.T_status == InfoCollection.InfoCollectionStatusReturnedMoney {
returnedMoney = "是"
}
f.SetCellValue("Sheet1", fmt.Sprintf("P%d", line), returnedMoney)
f.SetCellValue("Sheet1", fmt.Sprintf("Q%d", line), v.InfoCollection.T_submit_uuid_name)
f.SetCellValue("Sheet1", fmt.Sprintf("R%d", line), InfoCollection.InfoCollectionStatusMap[v.InfoCollection.T_State])
f.SetCellValue("Sheet1", fmt.Sprintf("S%d", line), v.InfoCollection.T_start_time)
f.SetCellValue("Sheet1", fmt.Sprintf("T%d", line), v.InfoCollection.T_return_times)
f.SetCellValue("Sheet1", fmt.Sprintf("U%d", line), v.InfoCollection.T_time_interval)
f.SetCellValue("Sheet1", fmt.Sprintf("V%d", line), v.T_scheme_name)
f.SetCellValue("Sheet1", fmt.Sprintf("W%d", line), Task.TaskSchemeStateMap[v.T_scheme_state])
f.SetCellValue("Sheet1", fmt.Sprintf("X%d", line), v.T_scheme_start_time)
f.SetCellValue("Sheet1", fmt.Sprintf("Y%d", line), v.T_scheme_return_times)
f.SetCellValue("Sheet1", fmt.Sprintf("Z%d", line), v.T_scheme_time_interval)
f.SetCellValue("Sheet1", fmt.Sprintf("AA%d", line), v.T_scheme_overtime)
f.SetCellValue("Sheet1", fmt.Sprintf("AB%d", line), v.T_collection_name)
f.SetCellValue("Sheet1", fmt.Sprintf("AC%d", line), Task.TaskCollectionStateMap[v.T_collection_state])
f.SetCellValue("Sheet1", fmt.Sprintf("AD%d", line), v.T_collection_start_time)
f.SetCellValue("Sheet1", fmt.Sprintf("AE%d", line), v.T_collection_return_times)
f.SetCellValue("Sheet1", fmt.Sprintf("AF%d", line), v.T_collection_time_interval)
f.SetCellValue("Sheet1", fmt.Sprintf("AG%d", line), v.T_collection_overtime)
f.SetCellValue("Sheet1", fmt.Sprintf("AH%d", line), v.T_reporting_name)
f.SetCellValue("Sheet1", fmt.Sprintf("AI%d", line), Task.TaskReportingStateMap[v.T_reporting_state])
f.SetCellValue("Sheet1", fmt.Sprintf("AJ%d", line), v.T_reporting_start_time)
f.SetCellValue("Sheet1", fmt.Sprintf("AK%d", line), v.T_reporting_return_times)
f.SetCellValue("Sheet1", fmt.Sprintf("AL%d", line), v.T_reporting_time_interval)
f.SetCellValue("Sheet1", fmt.Sprintf("AM%d", line), v.T_reporting_overtime)
f.SetCellValue("Sheet1", fmt.Sprintf("AN%d", line), v.T_record)
}
Style2, _ := f.NewStyle(
&excelize.Style{
Font: &excelize.Font{Size: 10, Family: "宋体"},
Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
Border: []excelize.Border{
{Type: "left", Color: "000000", Style: 1},
{Type: "top", Color: "000000", Style: 1},
{Type: "bottom", Color: "000000", Style: 1},
{Type: "right", Color: "000000", Style: 1},
},
})
f.SetCellStyle("Sheet1", "A2", fmt.Sprintf("AM%d", line), Style2)
StyleBlueFill, _ := f.NewStyle(
&excelize.Style{
Font: &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
Border: []excelize.Border{
{Type: "left", Color: "000000", Style: 1},
{Type: "top", Color: "000000", Style: 1},
{Type: "bottom", Color: "000000", Style: 1},
{Type: "right", Color: "000000", Style: 1},
},
Fill: excelize.Fill{Type: "pattern", Color: []string{"#DEE5F5"}, Pattern: 1},
})
// 粉色填充
StylePinkFill, _ := f.NewStyle(
&excelize.Style{
Font: &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
Border: []excelize.Border{
{Type: "left", Color: "000000", Style: 1},
{Type: "top", Color: "000000", Style: 1},
{Type: "bottom", Color: "000000", Style: 1},
{Type: "right", Color: "000000", Style: 1},
},
Fill: excelize.Fill{Type: "pattern", Color: []string{"#FBDFE2"}, Pattern: 1},
})
StyleOrangeFill, _ := f.NewStyle(
&excelize.Style{
Font: &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
Border: []excelize.Border{
{Type: "left", Color: "000000", Style: 1},
{Type: "top", Color: "000000", Style: 1},
{Type: "bottom", Color: "000000", Style: 1},
{Type: "right", Color: "000000", Style: 1},
},
Fill: excelize.Fill{Type: "pattern", Color: []string{"#FCE7D8"}, Pattern: 1},
})
StyleYellowFill, _ := f.NewStyle(
&excelize.Style{
Font: &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
Border: []excelize.Border{
{Type: "left", Color: "000000", Style: 1},
{Type: "top", Color: "000000", Style: 1},
{Type: "bottom", Color: "000000", Style: 1},
{Type: "right", Color: "000000", Style: 1},
},
Fill: excelize.Fill{Type: "pattern", Color: []string{"#FFF5D0"}, Pattern: 1},
})
StyleGreenFill, _ := f.NewStyle(
&excelize.Style{
Font: &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
Border: []excelize.Border{
{Type: "left", Color: "000000", Style: 1},
{Type: "top", Color: "000000", Style: 1},
{Type: "bottom", Color: "000000", Style: 1},
{Type: "right", Color: "000000", Style: 1},
},
Fill: excelize.Fill{Type: "pattern", Color: []string{"#E7F4DE"}, Pattern: 1},
})
f.SetCellStyle("Sheet1", "A1", "AM2", StyleBlueFill)
f.SetCellStyle("Sheet1", "Q1", "U1", StylePinkFill)
f.SetCellStyle("Sheet1", "V1", "AA1", StyleOrangeFill)
f.SetCellStyle("Sheet1", "AB1", "AG1", StyleYellowFill)
f.SetCellStyle("Sheet1", "AH1", "AM1", StyleGreenFill)
f.SetCellStyle("Sheet1", "AN1", "AN2", StyleBlueFill)
// 冻结1-2行
f.SetPanes("Sheet1", &excelize.Panes{
Freeze: true,
Split: false,
XSplit: 3,
YSplit: 2,
TopLeftCell: "A1",
ActivePane: "topRight",
})
lib.Create_Dir("./ofile")
timeStr := time.Now().Format("20060102150405")
// 保存文件
if err := f.SaveAs("ofile/" + timeStr + ".xlsx"); err != nil {
logs.Error(lib.FuncName(), err)
}
if !lib.Pload_qiniu("ofile/"+timeStr+".xlsx", "ofile/"+timeStr+".xlsx") {
c.Data["json"] = lib.JSONS{Code: 203, Msg: "oss!"}
c.ServeJSON()
return
}
//删除目录
err := os.Remove("ofile/" + timeStr + ".xlsx")
if err != nil {
logs.Error(lib.FuncName(), err)
}
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + timeStr + ".xlsx"}
c.ServeJSON()
return
}
// 导出唯一任务标识
func (c *TaskController) ExportTaskUid() {
// 验证登录
_, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_num, _ := c.GetInt("T_num")
if T_num <= 0 {
T_num = 10
}
if T_num > 1000 {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "单次最多生成1000个唯一标识"}
c.ServeJSON()
return
}
uidList := make([]string, 0, T_num)
exists := make(map[string]struct{}, T_num)
exportBatch := fmt.Sprintf("export_%d", time.Now().UnixNano())
for len(uidList) < T_num {
candidate := strings.ToUpper(strings.ReplaceAll(uuid.New().String(), "-", ""))
if len(candidate) > 16 {
candidate = candidate[:16]
}
if _, ok := exists[candidate]; ok {
continue
}
if _, found := Task.Read_Task_ByUid(candidate); found {
continue
}
if Task.TaskUidExists(candidate) {
continue
}
exists[candidate] = struct{}{}
uidList = append(uidList, candidate)
}
f := excelize.NewFile()
sheet := "Sheet1"
f.SetCellValue(sheet, "A1", "序号")
f.SetCellValue(sheet, "B1", "唯一标识")
for i, uid := range uidList {
row := i + 2
f.SetCellValue(sheet, fmt.Sprintf("A%d", row), i+1)
f.SetCellValue(sheet, fmt.Sprintf("B%d", row), uid)
}
f.SetColWidth(sheet, "A", "A", 12)
f.SetColWidth(sheet, "B", "B", 30)
lib.Create_Dir("./ofile")
fileName := fmt.Sprintf("task_uid_%d.xlsx", time.Now().Unix())
localPath := "ofile/" + fileName
if err := f.SaveAs(localPath); err != nil {
logs.Error("ExportTaskUid SaveAs error:", err)
c.Data["json"] = lib.JSONS{Code: 202, Msg: "生成Excel失败!"}
c.ServeJSON()
return
}
if !lib.Pload_qiniu(localPath, localPath) {
c.Data["json"] = lib.JSONS{Code: 203, Msg: "文件上传失败!"}
c.ServeJSON()
return
}
if err := os.Remove(localPath); err != nil {
logs.Error("ExportTaskUid remove temp file:", err)
}
if err := Task.SaveTaskUids(uidList, exportBatch); err != nil {
c.Data["json"] = lib.JSONS{Code: 204, Msg: "保存唯一标识失败!"}
c.ServeJSON()
return
}
url := "https://bzdcoldverifyoss.baozhida.cn/" + localPath
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
c.ServeJSON()
return
}
// 获取任务负责人列表
func (c *TaskController) GetTaskUserList() {
// 验证登录 User_is, User_r
_, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_type := c.GetString("T_type") // T_project项目 T_scheme方案 T_collection数据采集 T_reporting报告
list := Task.Get_Task_UserList(T_type)
AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
var User_list []Account.Admin_R
for _, v := range list {
if len(v) == 0 {
continue
}
User_list = append(User_list, Account.Admin_R{T_uuid: v, T_name: AdminMap[v]})
}
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: User_list}
c.ServeJSON()
return
}
// 列表 -
func (c *TaskController) UserTaskList() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
var r_jsons lib.R_JSONS
page, _ := c.GetInt("page")
if page < 1 {
page = 1
}
page_z, _ := c.GetInt("page_z")
if page_z < 1 {
page_z = conf.Page_size
}
T_name := c.GetString("T_name")
UserMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
var cnt int
List, cnt := Task.Read_UserTask_List(User_r.T_uuid, T_name, UserMap, AdminMap, page, page_z)
page_size := math.Ceil(float64(cnt) / float64(page_z))
r_jsons.List = List
r_jsons.Page = page
r_jsons.Page_size = int(page_size)
r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
r_jsons.Num = cnt
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
c.ServeJSON()
return
}
// 获取-
func (c *TaskController) Get() {
// 验证登录 User_is, User_r
_, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_task_id := c.GetString("T_task_id")
r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
// 添加浏览量
_ = Task.Add_Task_Visit(r)
r.T_Visit += 1
userMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
adminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Task.TaskToTask_Stat(r, userMap, adminMap)}
c.ServeJSON()
return
}
// 添加-
func (c *TaskController) Add() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
dc := Device.DeviceClass{
T_uuid: User_r.T_uuid,
T_State: 1,
}
T_class_id, is := Device.Add_DeviceClass(dc)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加分类失败!"}
c.ServeJSON()
return
}
System.Add_UserLogs_T(User_r.T_uuid, "分类管理", "添加", dc)
T_InfoCollection_id := c.GetString("T_InfoCollection_id") // 信息采集id
T_name := c.GetString("T_name")
T_uuid := c.GetString("T_uuid") // 用户uuid
T_VerifyTemplate_class := c.GetString("T_VerifyTemplate_class")
T_VerifyTemplate_id := c.GetString("T_VerifyTemplate_id")
T_deadline := c.GetString("T_deadline")
T_scheme := c.GetString("T_scheme")
T_collection := c.GetString("T_collection")
T_reporting := c.GetString("T_reporting")
T_delivery := c.GetString("T_delivery")
T_project := c.GetString("T_project") // 项目 负责人UUID
T_province := c.GetString("T_province") // 省
T_city := c.GetString("T_city") // 市
T_district := c.GetString("T_district") // 区
T_province_code := c.GetString("T_province_code") // 省 code
T_city_code := c.GetString("T_city_code") // 市 code
T_district_code := c.GetString("T_district_code") // 区 code
T_category := c.GetString("T_category") // 类别
T_device_type := c.GetString("T_device_type") // 设备类型
T_volume := c.GetString("T_volume") // 规格/容积
T_verify_type := c.GetString("T_verify_type") // 验证类型
T_subject_matter := c.GetString("T_subject_matter") // 标的物名称
T_temp_range := c.GetString("T_temp_range") // 验证温度范围
T_report_number := c.GetString("T_report_number") // 报告编号
T_report_type := c.GetString("T_report_type") // 报告类型
T_device_quantity, _ := c.GetInt("T_device_quantity") // 终端数量
T_cnas, _ := c.GetInt("T_cnas") // cnas实验室
// 查询信息采集信息
infoCollection, is := InfoCollection.Read_InfoCollection(T_InfoCollection_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取信息采集失败!"}
c.ServeJSON()
return
}
// 查询信息采集信息
user, is := Account.Read_User(T_uuid)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_uuid 错误!"}
c.ServeJSON()
return
}
var_ := Task.Task{
T_Distributor_id: user.T_Distributor_id,
T_InfoCollection_id: T_InfoCollection_id,
T_InfoTemplate_id: infoCollection.T_InfoTemplate_id,
T_start_time: infoCollection.T_start_time, // 项目开始时间使用信息采集开始时间
T_class: int(T_class_id),
T_uuid: T_uuid,
T_name: T_name,
T_VerifyTemplate_class: T_VerifyTemplate_class,
T_VerifyTemplate_id: T_VerifyTemplate_id,
T_deadline: T_deadline,
T_scheme: T_scheme,
T_collection: T_collection,
T_reporting: T_reporting,
T_delivery: T_delivery,
T_Show: 1,
T_State: 1,
T_project: T_project,
T_province: T_province,
T_city: T_city,
T_district: T_district,
T_province_code: T_province_code,
T_city_code: T_city_code,
T_district_code: T_district_code,
T_category: T_category,
T_device_type: T_device_type,
T_volume: T_volume,
T_verify_type: T_verify_type,
T_subject_matter: T_subject_matter,
T_temp_range: T_temp_range,
T_report_number: T_report_number,
T_report_type: T_report_type,
T_device_quantity: T_device_quantity,
T_cnas: T_cnas,
}
if T_report_number != "/" {
_, exist := Task.Read_TaskbyT_report_number(T_report_number)
if exist {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "报告编号已存在!"}
c.ServeJSON()
return
}
}
T_task_id, is := Task.Add_Task(var_)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
c.ServeJSON()
return
}
NatsServer.Create_Local_Table(T_task_id)
Task.Redis_Task_T_report_number_DelK(T_report_number) // 删除redis内的任务编号
// 通知
_, company_r := Account.Read_User_ByT_uuid(var_.T_uuid)
go wx.WxSend(var_.T_scheme, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
go wx.WxSend(var_.T_collection, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
go wx.WxSend(var_.T_reporting, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
go wx.WxSend(var_.T_delivery, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
// 同步信息采集表 --------
InfoCollection_Map_List := InfoCollection.Read_InfoTemplateMap_List_For_Data(var_.T_InfoTemplate_id)
InfoCollection_Data := InfoCollection.Read_InfoTemplateMapData_List(var_.T_InfoCollection_id, var_.T_InfoTemplate_id, InfoCollection_Map_List)
Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(var_.T_VerifyTemplate_id, 0, 0)
Data := VerifyTemplate.Read_VerifyTemplateMapData_List(0, T_task_id, var_.T_VerifyTemplate_id, Map_List)
InfoCollectionDataMap := make(map[string]string)
for _, data := range InfoCollection_Data {
InfoCollectionDataMap[data.T_name] = data.T_value
}
MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
for _, v := range Data {
if len(v.T_value) > 0 {
continue
}
if InfoCollectionDataMap[v.T_name] == "" {
continue
}
val := VerifyTemplate.VerifyTemplateMapData{
T_source: v.T_source,
T_task_id: T_task_id,
T_VerifyTemplate_id: var_.T_VerifyTemplate_id,
T_VerifyTemplateMap_id: v.T_VerifyTemplateMap_id,
T_flow_sort: v.T_flow_sort,
T_max_time: v.T_max_time,
T_min_time: v.T_min_time,
T_value: InfoCollectionDataMap[v.T_name],
}
MapDataList = append(MapDataList, val)
}
_, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData(MapDataList)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "同步信息采集表失败"}
c.ServeJSON()
return
}
// 同步信息采集表结束 --------
// 添加任务操作日志
Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "添加", var_)
System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "添加", var_)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_task_id}
c.ServeJSON()
return
}
// 接收信息采集
func (c *TaskController) ReceiptInfoCollection() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
// 修改信息采集状态为已接收
T_InfoCollection_id := c.GetString("T_InfoCollection_id")
//T_status,_ := c.GetInt("T_status")
infoCollection, is := InfoCollection.Read_InfoCollection(T_InfoCollection_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
if infoCollection.T_status != InfoCollection.InfoCollectionStatusSubmitted && infoCollection.T_status != InfoCollection.InfoCollectionStatusReceipt {
c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("当前状态为%s,禁止接收!", InfoCollection.InfoCollectionStatusMap[infoCollection.T_status])}
c.ServeJSON()
return
}
//infoCollection.T_status = InfoCollection.InfoCollectionStatusReceipt
//if len(infoCollection.T_end_time) == 0 {
// infoCollection.T_end_time = time.Now().Format("2006-01-02 15:04:05")
// infoCollection.T_time_interval, _ = lib.MinutesDifference(infoCollection.T_start_time, infoCollection.T_end_time)
//}
//if !InfoCollection.Update_InfoCollection(infoCollection, "T_status", "T_end_time", "T_time_interval") {
infoCollection.T_status = 3 // 已接收
if !InfoCollection.Update_InfoCollection(infoCollection, "T_status") {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
c.ServeJSON()
return
}
System.Add_UserLogs_T(User_r.T_uuid, "信息采集管理", "接收信息采集", infoCollection)
//if T_status == InfoCollection.InfoCollectionStatusReturn{
// // 通知 报告负责人审核
// _, company_r := Account.Read_User_ByT_uuid(infoCollection.T_uuid)
// System.Add_News(conf.VdelUuid, fmt.Sprintf("【%s-%s】信息采集 已退回", company_r.T_name, infoCollection.T_name), "")
// go wx.WxSend(conf.VdelUuid, fmt.Sprintf("【%s-%s】信息采集 已退回", company_r.T_name, infoCollection.T_name))
//
//}
// 修改任务管理实施方案开始时间
//T_task_id := c.GetString("T_task_id")
//task, is := Task.Read_Task(T_task_id)
//if !is {
// c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
// c.ServeJSON()
// return
//}
// 添加任务操作日志
//Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "接收信息采集", task)
//System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "接收信息采集", task)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 添加-
func (c *TaskController) AddData_Tool() {
T_uuid := "3e84dda9-9eec-42b9-9350-0894262fc8a1" // 用户uuid
T_name := c.GetString("T_name")
T_task_id := c.GetString("T_task_id")
T_task_id = strings.ToLower(T_task_id)
r, _ := Task.Read_Task(T_task_id)
if r.T_collection_state == 2 {
c.Data["json"] = lib.JSONS{Code: 200, Msg: "数据采集中..."}
c.ServeJSON()
return
}
if r.Id > 0 {
// 同步1.0数据
NatsServer.Sync1_TaskData(T_task_id)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_task_id}
c.ServeJSON()
return
}
dc := Device.DeviceClass{
T_uuid: T_uuid,
T_State: 1,
}
T_class_id, is := Device.Add_DeviceClass(dc)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加分类失败!"}
c.ServeJSON()
return
}
var_ := Task.Task{
T_task_id: T_task_id,
T_class: int(T_class_id),
T_uuid: T_uuid,
T_name: T_name,
T_Show: 1,
T_State: 1,
T_collection_state: 2,
}
_, is = Task.Add_Task_Tool(var_)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
c.ServeJSON()
return
}
// 创建本地表
NatsServer.Create_Local_Table(T_task_id)
// 同步1.0数据
NatsServer.Sync1_TaskData(T_task_id)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_task_id}
c.ServeJSON()
return
}
// 修改采集状态-
func (c *TaskController) UpCollectionState() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_collection_state, _ := c.GetInt("T_collection_state")
T_reason := c.GetString("T_reason") // 退回原因
T_task_id := c.GetString("T_task_id")
r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
_, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
r.T_collection_state = T_collection_state
clos := make([]string, 0)
clos = append(clos, "T_collection_state")
if T_collection_state == Task.TaskCollectionStateReturn {
r.T_collection_return_times += 1
clos = append(clos, "T_collection_return_times")
}
if T_collection_state == Task.TaskCollectionStateSubmitted ||
T_collection_state == Task.TaskCollectionStateReturn ||
T_collection_state == Task.TaskCollectionStatePass {
// 添加已提交状态验证报告记录
auditRecordJson, err := Task.Add_AuditRecord(r.T_collection_audit_record, "", User_r.T_uuid, T_collection_state, T_reason, "")
if err != nil {
return
}
r.T_collection_audit_record = auditRecordJson
clos = append(clos, "T_collection_audit_record")
}
if T_collection_state == Task.TaskCollectionStatePass {
// 数据编辑审核通过时间为验证报告开始时间
r.T_reporting_start_time = time.Now().Format("2006-01-02 15:04:05")
clos = append(clos, "T_reporting_start_time")
}
if !Task.Update_Task(r, clos...) {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
c.ServeJSON()
return
}
// 已退回(负责人)
if T_collection_state == Task.TaskCollectionStateReturn {
System.Add_News(r.T_collection, fmt.Sprintf("【%s-%s】数据编辑 %s,%s", company_r.T_name, r.T_name, Task.TaskCollectionStateMap[T_collection_state], T_reason), "")
go wx.WxSend(r.T_collection, fmt.Sprintf("【%s-%s】数据编辑 %s,%s", company_r.T_name, r.T_name, Task.TaskCollectionStateMap[T_collection_state], T_reason))
}
// 添加任务操作日志
Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "修改采集状态", r)
System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "修改采集状态", r)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
func (c *TaskController) UpDeliveryState() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_delivery_state, _ := c.GetInt("T_delivery_state")
T_task_id := c.GetString("T_task_id")
r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
r.T_delivery_state = T_delivery_state
if !Task.Update_Task(r, "T_delivery_state") {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
c.ServeJSON()
return
}
// 添加任务操作日志
Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "修改交付审核状态", r)
System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "修改交付审核状态", r)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 更新线上数据后台执行
func (c *TaskDataController) TaskData_Up_TaskData_Back() {
// 验证登录 User_is, User_r
_, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_task_id := c.GetString("T_task_id")
r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
// 通知 报告人员
_, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
infoCollection, _ := InfoCollection.Read_InfoCollection(r.T_InfoCollection_id)
System.Add_News(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】报告已完成,请及时通知客户审核", company_r.T_name, r.T_name), "")
go wx.WxSend(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】报告已完成,请及时通知客户审核", company_r.T_name, r.T_name))
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 修改-
func (c *TaskController) Up() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_name := c.GetString("T_name")
T_Show, T_Show_err := c.GetInt("T_Show")
T_VerifyTemplate_class := c.GetString("T_VerifyTemplate_class")
T_VerifyTemplate_id := c.GetString("T_VerifyTemplate_id")
T_deadline := c.GetString("T_deadline")
T_scheme := c.GetString("T_scheme")
T_collection := c.GetString("T_collection")
T_collection_state, _ := c.GetInt("T_collection_state")
T_collection_signature := c.GetString("T_collection_signature") // 完成编辑签字图片
T_reporting := c.GetString("T_reporting")
T_delivery := c.GetString("T_delivery")
T_record := c.GetString("T_record")
T_doc1 := c.GetString("T_doc1")
T_pdf1 := c.GetString("T_pdf1") // 方案
T_pdf1_stamp, _ := c.GetBool("T_pdf1_stamp") // 方案加盖公章
T_doc2 := c.GetString("T_doc2")
T_pdf2 := c.GetString("T_pdf2") // 证书
T_pdf2_stamp, _ := c.GetBool("T_pdf2_stamp") // 报告加盖公章
T_doc3 := c.GetString("T_doc3")
T_pdf3 := c.GetString("T_pdf3")
T_pdf4 := c.GetString("T_pdf4") // 验证标识
T_pdf5 := c.GetString("T_pdf5") // 检测报告
T_pdf6 := c.GetString("T_pdf6") // 原始记录
T_VerifyDeviceDataStartTime := c.GetString("T_VerifyDeviceDataStartTime") // 验证设备数据开始时间
T_VerifyDeviceDataEndTime := c.GetString("T_VerifyDeviceDataEndTime") // 验证设备数据开始时间
T_BindDeviceDataStartTime := c.GetString("T_BindDeviceDataStartTime") // 绑定设备数据开始时间
T_BindDeviceDataEndTime := c.GetString("T_BindDeviceDataEndTime") // 绑定设备数据结束时间
T_sn := c.GetString("T_sn") // T_sn
T_CalibrationExpirationTime := c.GetString("T_CalibrationExpirationTime") // 校准到期时间
T_project := c.GetString("T_project") // 项目 负责人UUID
T_province := c.GetString("T_province") // 省
T_city := c.GetString("T_city") // 市
T_district := c.GetString("T_district") // 区
T_province_code := c.GetString("T_province_code") // 省 code
T_city_code := c.GetString("T_city_code") // 市 code
T_district_code := c.GetString("T_district_code") // 区 code
T_category := c.GetString("T_category") // 类别
T_device_type := c.GetString("T_device_type") // 设备类型
T_volume := c.GetString("T_volume") // 规格/容积
T_verify_type := c.GetString("T_verify_type") // 验证类型
T_subject_matter := c.GetString("T_subject_matter") // 标的物名称
T_temp_range := c.GetString("T_temp_range") // 验证温度范围
T_report_number := c.GetString("T_report_number") // 报告编号
T_report_type := c.GetString("T_report_type") // 报告编号
T_device_quantity, _ := c.GetInt("T_device_quantity") // 报告编号
T_cnas, _ := c.GetInt("T_cnas") // cnas实验室
T_task_id := c.GetString("T_task_id")
r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
if len(T_report_number) > 0 && T_report_number != "/" {
t, exist := Task.Read_TaskbyT_report_number(T_report_number)
if exist && r.T_task_id != t.T_task_id {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "报告编号已存在!"}
c.ServeJSON()
return
}
}
// .......
clos := make([]string, 0)
if len(T_name) > 0 {
r.T_name = T_name
clos = append(clos, "T_name")
}
if T_Show_err == nil {
r.T_Show = T_Show
clos = append(clos, "T_Show")
}
if len(T_VerifyTemplate_class) > 0 {
r.T_VerifyTemplate_class = T_VerifyTemplate_class
clos = append(clos, "T_VerifyTemplate_class")
}
if len(T_VerifyTemplate_id) > 0 {
// 保存旧的 T_VerifyTemplate_id
old_T_VerifyTemplate_id := r.T_VerifyTemplate_id
// 判断旧的模版id与新模版id是否一致,如果不一致则复制旧模板数据到新模板
if old_T_VerifyTemplate_id != T_VerifyTemplate_id && len(old_T_VerifyTemplate_id) > 0 {
// 创建新任务对象用于复制数据
new_task := r
new_task.T_VerifyTemplate_id = T_VerifyTemplate_id
_, err := CopyMapData(r, new_task, 0)
if err != nil {
logs.Error("复制旧模板数据到新模板失败", err)
}
}
r.T_VerifyTemplate_id = T_VerifyTemplate_id
clos = append(clos, "T_VerifyTemplate_id")
}
if len(T_deadline) > 0 {
r.T_deadline = T_deadline
clos = append(clos, "T_deadline")
}
if len(T_scheme) > 0 {
r.T_scheme = T_scheme
clos = append(clos, "T_scheme")
}
if len(T_collection) > 0 {
r.T_collection = T_collection
clos = append(clos, "T_collection")
}
if len(T_reporting) > 0 {
r.T_reporting = T_reporting
clos = append(clos, "T_reporting")
}
if len(T_delivery) > 0 {
r.T_delivery = T_delivery
clos = append(clos, "T_delivery")
}
if len(T_record) > 0 {
r.T_record = T_record
clos = append(clos, "T_record")
}
// 完成编辑后设置实施结束时间
if T_collection_state == 4 {
r.T_collection_state = T_collection_state
clos = append(clos, "T_collection_state")
r.T_collection_signature = T_collection_signature
clos = append(clos, "T_collection_signature")
r.T_collection_end_time = time.Now().Format("2006-01-02 15:04:05")
clos = append(clos, "T_collection_end_time")
if len(r.T_collection_start_time) > 0 {
r.T_collection_time_interval, _ = lib.MinutesDifference(r.T_collection_start_time, r.T_collection_end_time)
// 扣除暂停时间
Task_Compute := Task.Read_TaskTime_Compute(r.T_task_id, 1)
if Task_Compute > 0 {
r.T_collection_time_interval -= float64(Task_Compute)
}
clos = append(clos, "T_collection_time_interval")
// 所需时间 > 超时时间
if r.T_collection_time_interval > Task.TaskCollectionTimeLimit && len(r.T_report_type) > 0 {
r.T_collection_overtime = r.T_collection_time_interval - Task.TaskCollectionTimeLimit // 超时时间
clos = append(clos, "T_collection_overtime")
}
// 通知 报告人员
_, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
System.Add_News(r.T_reporting, fmt.Sprintf("【%s-%s】数据采集 已提交", company_r.T_name, r.T_name), "")
go wx.WxSend(r.T_reporting, fmt.Sprintf("【%s-%s】数据采集 已提交", company_r.T_name, r.T_name))
}
// 添加已提交状态数据编辑记录
auditRecordJson, err := Task.Add_AuditRecord(r.T_collection_audit_record, "", User_r.T_uuid, r.T_collection_state, "", "")
if err == nil {
r.T_collection_audit_record = auditRecordJson
clos = append(clos, "T_collection_audit_record")
}
}
if len(T_doc1) > 0 {
r.T_doc1 = T_doc1
clos = append(clos, "T_doc1")
}
// 验证报告内容T_pdf1,上传后将 当前任务 验证方案 标志 为 5 (0未完成 1已完成(客户通过) 2已退回(客户) 3已通过(报告负责人) 4已退回(报告负责人) 5已提交)
// 上传后设置方案结束时间,计算所需时间和超时时间
if len(T_pdf1) > 0 {
r.T_pdf1 = T_pdf1
clos = append(clos, "T_pdf1")
//r.T_pdf1_watermark = GetWatermarkPdf(r,T_pdf1,"T_pdf1")
//clos = append(clos, "T_pdf1_watermark")
go GetWatermarkPdf(r, T_pdf1, T_pdf1_stamp, "T_pdf1")
r.T_scheme_state = 5
clos = append(clos, "T_scheme_state")
// 添加已提交状态验证方案记录
auditRecordJson, err := Task.Add_AuditRecord(r.T_scheme_audit_record, "", User_r.T_uuid, r.T_scheme_state, "", "")
if err != nil {
return
}
r.T_scheme_audit_record = auditRecordJson
clos = append(clos, "T_scheme_audit_record")
r.T_scheme_end_time = time.Now().Format("2006-01-02 15:04:05")
clos = append(clos, "T_scheme_end_time")
r.T_scheme_time_interval, _ = lib.MinutesDifference(r.T_scheme_start_time, r.T_scheme_end_time)
Task_Compute := Task.Read_TaskTime_Compute(r.T_task_id, 0)
if Task_Compute > 0 {
r.T_scheme_time_interval -= float64(Task_Compute)
}
clos = append(clos, "T_scheme_time_interval")
// 所需时间 > 超时时间
if r.T_scheme_time_interval > Task.TaskSchemeTimeLimit[r.T_report_type] && len(r.T_report_type) > 0 {
r.T_scheme_overtime = r.T_scheme_time_interval - Task.TaskSchemeTimeLimit[r.T_report_type] // 超时时间
if Task.TaskSchemeTimeLimit[r.T_report_type] == 0 {
r.T_scheme_overtime = 0
}
clos = append(clos, "T_scheme_overtime")
}
// 通知 实施人员进场
_, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
System.Add_News(r.T_collection, fmt.Sprintf("【%s-%s】验证方案 已提交", company_r.T_name, r.T_name), "")
go wx.WxSend(r.T_collection, fmt.Sprintf("【%s-%s】验证方案 已提交", company_r.T_name, r.T_name))
}
if len(T_doc2) > 0 {
r.T_doc2 = T_doc2
clos = append(clos, "T_doc2")
}
// 验证报告内容T_pdf2 ,上传后将 当前任务 报告编写 标志 为 1
// 上传后设置报告结束时间,计算所需时间和超时时间
if len(T_pdf2) > 0 {
r.T_pdf2 = T_pdf2
clos = append(clos, "T_pdf2")
//r.T_pdf2_watermark = GetWatermarkPdf(T_pdf2,"T_pdf1")
//clos = append(clos, "T_pdf2_watermark")
go GetWatermarkPdf(r, T_pdf2, T_pdf2_stamp, "T_pdf2")
r.T_reporting_state = 5
r.T_reporting_submit_time = time.Now().Format("2006-01-02 15:04:05")
clos = append(clos, "T_reporting_state", "T_reporting_submit_time")
// 添加已提交状态验证报告记录
auditRecordJson, err := Task.Add_AuditRecord(r.T_reporting_audit_record, "", User_r.T_uuid, r.T_reporting_state, "", "")
if err == nil {
r.T_reporting_audit_record = auditRecordJson
clos = append(clos, "T_reporting_audit_record")
r.T_reporting_end_time = time.Now().Format("2006-01-02 15:04:05")
clos = append(clos, "T_reporting_end_time")
if len(r.T_reporting_start_time) > 0 {
r.T_reporting_time_interval, _ = lib.MinutesDifference(r.T_reporting_start_time, r.T_reporting_end_time)
clos = append(clos, "T_reporting_time_interval")
// 扣除暂停时间
Task_Compute := Task.Read_TaskTime_Compute(r.T_task_id, 2)
if Task_Compute > 0 {
r.T_reporting_time_interval -= float64(Task_Compute)
}
clos = append(clos, "T_reporting_time_interval")
// 所需时间 > 超时时间
if r.T_reporting_time_interval > Task.TaskReportingTimeLimit[r.T_report_type] && len(r.T_report_type) > 0 {
r.T_reporting_overtime = r.T_reporting_time_interval - Task.TaskReportingTimeLimit[r.T_report_type] // 超时时间
if Task.TaskReportingTimeLimit[r.T_report_type] == 0 {
r.T_reporting_overtime = 0
}
clos = append(clos, "T_reporting_overtime")
}
}
}
// 通知 报告人员
_, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
System.Add_News(r.T_delivery, fmt.Sprintf("【%s-%s】验证报告 已提交", company_r.T_name, r.T_name), "")
go wx.WxSend(r.T_delivery, fmt.Sprintf("【%s-%s】验证报告 已提交", company_r.T_name, r.T_name))
}
if len(T_doc3) > 0 {
r.T_doc3 = T_doc3
clos = append(clos, "T_doc3")
}
if len(T_pdf3) > 0 {
r.T_pdf3 = T_pdf3
clos = append(clos, "T_pdf3")
}
// 验证标识内容T_pdf4 ,上传后将 当前任务 验证标识 标志 为 1
if len(T_pdf4) > 0 {
r.T_pdf4 = T_pdf4
clos = append(clos, "T_pdf4")
r.T_marking_state = 1
clos = append(clos, "T_marking_state")
}
if len(T_pdf5) > 0 {
r.T_pdf5 = T_pdf5
clos = append(clos, "T_pdf5")
r.T_examining_report_state = 1
clos = append(clos, "T_examining_report_state")
// 添加已提交状态 检测报告记录
auditRecordJson, err := Task.Add_AuditRecord(r.T_examining_report_audit_record, "", User_r.T_uuid, r.T_examining_report_state, "", "")
if err == nil {
r.T_examining_report_audit_record = auditRecordJson
clos = append(clos, "T_examining_report_audit_record")
r.T_examining_report_end_time = time.Now().Format("2006-01-02 15:04:05")
clos = append(clos, "T_examining_report_end_time")
if len(r.T_examining_report_start_time) > 0 {
r.T_examining_report_time_interval, _ = lib.MinutesDifference(r.T_examining_report_start_time, r.T_examining_report_end_time)
clos = append(clos, "T_examining_report_time_interval")
// 扣除暂停时间
Task_Compute := Task.Read_TaskTime_Compute(r.T_task_id, 3)
if Task_Compute > 0 {
r.T_examining_report_time_interval -= float64(Task_Compute)
}
clos = append(clos, "T_examining_report_time_interval")
}
}
// 通知 报告人员
_, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
System.Add_News(r.T_delivery, fmt.Sprintf("【%s-%s】检测报告 已提交", company_r.T_name, r.T_name), "")
go wx.WxSend(r.T_delivery, fmt.Sprintf("【%s-%s】检测报告 已提交", company_r.T_name, r.T_name))
}
if len(T_pdf6) > 0 {
r.T_pdf6 = T_pdf6
clos = append(clos, "T_pdf6")
r.T_examining_report_state = 1
clos = append(clos, "T_original_record_state")
// 添加已提交状态 原始记录 记录
auditRecordJson, err := Task.Add_AuditRecord(r.T_original_record_audit_record, "", User_r.T_uuid, r.T_original_record_state, "", "")
if err == nil {
r.T_original_record_audit_record = auditRecordJson
clos = append(clos, "T_original_record_audit_record")
r.T_original_record_end_time = time.Now().Format("2006-01-02 15:04:05")
clos = append(clos, "T_original_record_end_time")
if len(r.T_reporting_start_time) > 0 {
r.T_original_record_time_interval, _ = lib.MinutesDifference(r.T_original_record_start_time, r.T_original_record_end_time)
clos = append(clos, "T_original_record_time_interval")
// 扣除暂停时间
Task_Compute := Task.Read_TaskTime_Compute(r.T_task_id, 2)
if Task_Compute > 0 {
r.T_original_record_time_interval -= float64(Task_Compute)
}
clos = append(clos, "T_original_record_time_interval")
}
}
// 通知 报告人员
_, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
System.Add_News(r.T_delivery, fmt.Sprintf("【%s-%s】原始记录 已提交", company_r.T_name, r.T_name), "")
go wx.WxSend(r.T_delivery, fmt.Sprintf("【%s-%s】原始记录 已提交", company_r.T_name, r.T_name))
}
if len(T_VerifyDeviceDataStartTime) > 0 {
r.T_VerifyDeviceDataStartTime = T_VerifyDeviceDataStartTime
clos = append(clos, "T_VerifyDeviceDataStartTime")
}
if len(T_VerifyDeviceDataEndTime) > 0 {
r.T_VerifyDeviceDataEndTime = T_VerifyDeviceDataEndTime
clos = append(clos, "T_VerifyDeviceDataEndTime")
}
if len(T_BindDeviceDataStartTime) > 0 {
r.T_BindDeviceDataStartTime = T_BindDeviceDataStartTime
clos = append(clos, "T_BindDeviceDataStartTime")
}
if len(T_BindDeviceDataEndTime) > 0 {
r.T_BindDeviceDataEndTime = T_BindDeviceDataEndTime
clos = append(clos, "T_BindDeviceDataEndTime")
}
if len(T_sn) > 0 {
T_sn = strings.TrimSpace(T_sn)
r.T_sn = T_sn
clos = append(clos, "T_sn")
}
if len(T_CalibrationExpirationTime) > 0 {
r.T_CalibrationExpirationTime = T_CalibrationExpirationTime
clos = append(clos, "T_CalibrationExpirationTime")
}
// 从3.0获取校准时间
if len(T_sn) > 0 && len(T_CalibrationExpirationTime) == 0 {
go func(r Task.Task, T_sn, T_CalibrationExpirationTime string) {
NatsServer.Cold_UpdateDevice_CalibrationTime(T_sn, T_CalibrationExpirationTime)
device, err := NatsServer.Cold_ReadDeviceByT_sn(T_sn)
if err == nil {
if !device.T_CalibrationTime.IsZero() {
r.T_CalibrationExpirationTime = device.T_CalibrationTime.Format("2006-01-02")
clos = append(clos, "T_CalibrationExpirationTime")
Task.Update_Task(r, "T_CalibrationExpirationTime")
}
}
}(r, T_sn, T_CalibrationExpirationTime)
}
if len(T_project) > 0 {
r.T_project = T_project
clos = append(clos, "T_project")
}
if len(T_province) > 0 {
r.T_province = T_province
clos = append(clos, "T_province")
}
if len(T_city) > 0 {
r.T_city = T_city
clos = append(clos, "T_city")
}
if len(T_district) > 0 {
r.T_district = T_district
clos = append(clos, "T_district")
}
if len(T_province_code) > 0 {
r.T_province_code = T_province_code
clos = append(clos, "T_province_code")
}
if len(T_city_code) > 0 {
r.T_city_code = T_city_code
clos = append(clos, "T_city_code")
}
if len(T_district_code) > 0 {
r.T_district_code = T_district_code
clos = append(clos, "T_district_code")
}
if len(T_category) > 0 {
r.T_category = T_category
clos = append(clos, "T_category")
}
if len(T_device_type) > 0 {
r.T_device_type = T_device_type
clos = append(clos, "T_device_type")
}
if len(T_volume) > 0 {
r.T_volume = T_volume
clos = append(clos, "T_volume")
}
if len(T_verify_type) > 0 {
r.T_verify_type = T_verify_type
clos = append(clos, "T_verify_type")
}
if len(T_subject_matter) > 0 {
r.T_subject_matter = T_subject_matter
clos = append(clos, "T_subject_matter")
}
if len(T_temp_range) > 0 {
r.T_temp_range = T_temp_range
clos = append(clos, "T_temp_range")
}
if len(T_report_number) > 0 {
r.T_report_number = T_report_number
clos = append(clos, "T_report_number")
}
if len(T_report_type) > 0 {
r.T_report_type = T_report_type
clos = append(clos, "T_report_type")
}
if T_device_quantity > 0 {
r.T_device_quantity = T_device_quantity
clos = append(clos, "T_device_quantity")
}
r.T_cnas = T_cnas
clos = append(clos, "T_cnas")
if !Task.Update_Task(r, clos...) {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
c.ServeJSON()
return
}
// 添加任务操作日志
Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "修改", r)
System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "修改", r)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 修改-
func (c *TaskController) UpInfoCollection() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_task_id := c.GetString("T_task_id")
r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
T_InfoCollection_id := c.GetString("T_InfoCollection_id") // 信息采集id
// 查询信息采集信息
infoCollection, is := InfoCollection.Read_InfoCollection(T_InfoCollection_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取信息采集失败!"}
c.ServeJSON()
return
}
r.T_InfoCollection_id = T_InfoCollection_id
r.T_InfoTemplate_id = infoCollection.T_InfoTemplate_id
r.T_start_time = infoCollection.T_start_time // 项目开始时间使用信息采集开始时间
if !Task.Update_Task(r, "T_InfoCollection_id", "T_InfoTemplate_id", "T_start_time") {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
c.ServeJSON()
return
}
// 添加任务操作日志
Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "修改信息采集id", r)
System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "修改信息采集id", r)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 修改任务的公司
func (c *TaskController) UpdateTaskCompany() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_task_id := c.GetString("T_task_id")
new_T_uuid := c.GetString("T_uuid") // 新公司UUID
if len(T_task_id) == 0 {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 不能为空!"}
c.ServeJSON()
return
}
if len(new_T_uuid) == 0 {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_uuid 不能为空!"}
c.ServeJSON()
return
}
// 查询任务
task, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "任务不存在!"}
c.ServeJSON()
return
}
// 查询原公司信息
oldUser, is := Account.Read_User(task.T_uuid)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "原公司信息不存在!"}
c.ServeJSON()
return
}
// 查询新公司信息
newUser, is := Account.Read_User(new_T_uuid)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "新公司信息不存在!"}
c.ServeJSON()
return
}
// 查询信息采集
var infoCollection InfoCollection.InfoCollection
if len(task.T_InfoCollection_id) > 0 {
infoCollection, is = InfoCollection.Read_InfoCollection(task.T_InfoCollection_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "信息采集不存在!"}
c.ServeJSON()
return
}
} else {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "任务没有关联信息采集!"}
c.ServeJSON()
return
}
var newInfoCollection InfoCollection.InfoCollection
var newInfoCollectionId string
// 判断信息采集名称是否和原公司名称相同
if infoCollection.T_name == oldUser.T_name {
// 如果信息采集名称和原公司名称相同,查询新公司下与新公司同名的信息采集
newInfoCollection, is = InfoCollection.Read_InfoCollection_By_T_uuid_Name(new_T_uuid, newUser.T_name)
if !is {
// 如果不存在,创建新公司下的信息采集(使用新公司名称)
var err error
newInfoCollection, err = InfoCollection.GetOrCreate_InfoCollection(new_T_uuid, newUser.T_name)
if err != nil {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "创建信息采集失败: " + err.Error()}
c.ServeJSON()
return
}
}
newInfoCollectionId = newInfoCollection.T_InfoCollection_id
} else {
// 如果信息采集名称和原公司名称不相同,查询新公司下有没有同名的信息采集
newInfoCollection, is = InfoCollection.Read_InfoCollection_By_T_uuid_Name(new_T_uuid, infoCollection.T_name)
if !is {
// 如果不存在,创建新公司下的信息采集(使用原信息采集名称)
var err error
newInfoCollection, err = InfoCollection.GetOrCreate_InfoCollection(new_T_uuid, infoCollection.T_name)
if err != nil {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "创建信息采集失败: " + err.Error()}
c.ServeJSON()
return
}
}
newInfoCollectionId = newInfoCollection.T_InfoCollection_id
}
// 更新任务的公司和信息采集
task.T_uuid = new_T_uuid
task.T_InfoCollection_id = newInfoCollectionId
if newInfoCollection.T_InfoTemplate_id != "" {
task.T_InfoTemplate_id = newInfoCollection.T_InfoTemplate_id
}
// 更新新公司的分销商ID
if newUser.T_Distributor_id != "" {
task.T_Distributor_id = newUser.T_Distributor_id
}
// 更新任务
updateCols := []string{"T_uuid", "T_InfoCollection_id", "T_InfoTemplate_id"}
if newUser.T_Distributor_id != "" {
updateCols = append(updateCols, "T_Distributor_id")
}
if !Task.Update_Task(task, updateCols...) {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改任务失败!"}
c.ServeJSON()
return
}
// 添加任务操作日志
Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "修改任务公司", task)
System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "修改任务公司", task)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 保存电子签名pdf
func (c *TaskController) SaveElectronicSignaturePDF() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_pdf1 := c.GetString("T_pdf1") // 方案
T_pdf2 := c.GetString("T_pdf2") // 证书
T_task_id := c.GetString("T_task_id")
r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
// .......
clos := make([]string, 0)
// 验证报告内容T_pdf1,上传后将 当前任务 验证方案 标志 为 5 (0未完成 1已完成(客户通过) 2已退回(客户) 3已通过(报告负责人) 4已退回(报告负责人) 5已提交)
// 上传后设置方案结束时间,计算所需时间和超时时间
if len(T_pdf1) > 0 {
r.T_pdf1_elec_signature = T_pdf1
clos = append(clos, "T_pdf1")
go GetWatermarkPdf(r, T_pdf1, false, "T_pdf1")
}
// 验证报告内容T_pdf2 ,上传后将 当前任务 报告编写 标志 为 1
// 上传后设置报告结束时间,计算所需时间和超时时间
if len(T_pdf2) > 0 {
r.T_pdf1_elec_signature = T_pdf2
clos = append(clos, "T_pdf2")
go GetWatermarkPdf(r, T_pdf2, false, "T_pdf2")
}
if !Task.Update_Task(r, clos...) {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
c.ServeJSON()
return
}
// 添加任务操作日志
Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "保存电子签名方案/报告", r)
System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "保存电子签名方案/报告", r)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 修改验证方案状态
func (c *TaskController) UpSchemeState() {
Admin_r, Admin_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
User_r, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !Admin_is && !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
operate_uuid := ""
if Admin_is {
operate_uuid = Admin_r.T_uuid
}
if User_is {
operate_uuid = User_r.T_uuid
}
T_scheme_state, _ := c.GetInt("T_scheme_state") // 1 已完成(客户通过) 5已退回(客户) 3已通过(报告负责人) 4已退回(报告负责人)
T_reason := c.GetString("T_reason") // 退回原因
T_signature := c.GetString("T_signature") // 通过后客户签名图片链接
T_task_id := c.GetString("T_task_id")
r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
_, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
clos := make([]string, 0)
if T_scheme_state > 0 {
r.T_scheme_state = T_scheme_state
clos = append(clos, "T_scheme_state")
}
if len(T_signature) > 0 {
r.T_scheme_signature = T_signature
clos = append(clos, "T_scheme_signature")
}
if T_scheme_state == Task.TaskSchemeStateClientReturn || T_scheme_state == Task.TaskSchemeStateReturn {
r.T_scheme_return_times += 1
clos = append(clos, "T_scheme_return_times")
// 客户退回时新增驳回次数和驳回记录
if T_scheme_state == Task.TaskSchemeStateClientReturn {
r.T_reject_times += 1
var rejectRecordList []Task.AuditRecord
if len(r.T_reject_record) > 0 {
err := json.Unmarshal([]byte(r.T_reject_record), &rejectRecordList)
if err != nil {
logs.Error("JSON 反序列化失败:", err)
return
}
}
rejectRecordList = append(rejectRecordList, Task.AuditRecord{
T_uuid: User_r.T_uuid,
T_state: T_scheme_state,
T_reason: T_reason,
T_time: time.Now().Format("2006-01-02 15:04:05"),
T_type: "scheme",
})
rejectRecordJson, err := json.Marshal(rejectRecordList)
if err != nil {
logs.Error("JSON 反序列化失败:", err)
return
}
r.T_reject_record = string(rejectRecordJson)
clos = append(clos, "T_reject_times")
clos = append(clos, "T_reject_record")
}
}
auditRecordJson, err := Task.Add_AuditRecord(r.T_scheme_audit_record, User_r.T_uuid, Admin_r.T_uuid, T_scheme_state, T_reason, "")
if err != nil {
return
}
r.T_scheme_audit_record = auditRecordJson
clos = append(clos, "T_scheme_audit_record")
if !Task.Update_Task(r, clos...) {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
c.ServeJSON()
return
}
//AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
// 已提交
if T_scheme_state == Task.TaskSchemeStateSubmitted {
System.Add_News(r.T_collection, fmt.Sprintf("【%s-%s】验证方案 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state]), "")
go wx.WxSend(r.T_collection, fmt.Sprintf("【%s-%s】验证方案 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state]))
}
// 已通过
if T_scheme_state == Task.TaskSchemeStatePass {
infoCollection, _ := InfoCollection.Read_InfoCollection(r.T_InfoCollection_id)
System.Add_News(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】验证方案 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state]), "")
go wx.WxSend(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】验证方案 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state]))
}
// 已退回(负责人)
if T_scheme_state == Task.TaskSchemeStateReturn {
System.Add_News(r.T_scheme, fmt.Sprintf("【%s-%s】验证方案 %s,%s", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state], T_reason), "")
go wx.WxSend(r.T_scheme, fmt.Sprintf("【%s-%s】验证方案 %s,%s", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state], T_reason))
}
// 已退回(客户)
if T_scheme_state == Task.TaskSchemeStateClientReturn {
System.Add_News(r.T_scheme, fmt.Sprintf("!!!【%s-%s】验证方案 %s,%s", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state], T_reason), "")
go wx.WxSend(r.T_scheme, fmt.Sprintf("!!!【%s-%s】验证方案 %s,%s", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state], T_reason))
System.Add_News(conf.VdelUuid, fmt.Sprintf("!!!【%s-%s】验证方案 %s,%s", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state], T_reason), "")
go wx.WxSend(conf.VdelUuid, fmt.Sprintf("!!!【%s-%s】验证方案 %s,%s", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state], T_reason))
go wx.WxSend(conf.BoosUuid, fmt.Sprintf("!!!【%s-%s】验证方案 %s,%s", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state], T_reason))
}
// 添加任务操作日志
Task.Add_TaskLogs_T(operate_uuid, T_task_id, "任务管理", "修改验证方案状态", r)
System.Add_UserLogs_T(operate_uuid, "任务管理", "修改验证方案状态", r)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 修改验证报告状态
func (c *TaskController) UpReportingState() {
Admin_r, Admin_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
User_r, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !Admin_is && !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
operate_uuid := ""
if Admin_is {
operate_uuid = Admin_r.T_uuid
}
if User_is {
operate_uuid = User_r.T_uuid
}
T_reporting_state, _ := c.GetInt("T_reporting_state") // 1 已完成(客户通过) 5已退回(客户) 3已通过(报告负责人) 4已退回(报告负责人)
T_reason := c.GetString("T_reason") // 退回原因
T_signature := c.GetString("T_signature") // 通过后客户签名图片链接
T_task_id := c.GetString("T_task_id")
r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
//_, user_r := Account.Read_User_ByT_uuid(r.T_uuid)
clos := make([]string, 0)
if T_reporting_state > 0 {
r.T_reporting_state = T_reporting_state
clos = append(clos, "T_reporting_state")
}
if T_reporting_state == Task.TaskReportingStatePass {
r.T_reporting_pass_time = time.Now().Format("2006-01-02 15:04:05")
clos = append(clos, "T_reporting_pass_time")
}
if len(T_signature) > 0 {
r.T_reporting_signature = T_signature
clos = append(clos, "T_reporting_signature")
}
if T_reporting_state == Task.TaskReportingStateClientReturn || T_reporting_state == Task.TaskReportingStateReturn {
r.T_reporting_return_times += 1
clos = append(clos, "T_reporting_return_times")
// 客户退回时新增驳回次数和驳回记录
if T_reporting_state == Task.TaskReportingStateClientReturn {
r.T_reject_times += 1
var rejectRecordList []Task.AuditRecord
if len(r.T_reject_record) > 0 {
err := json.Unmarshal([]byte(r.T_reject_record), &rejectRecordList)
if err != nil {
logs.Error("JSON 反序列化失败:", err)
return
}
}
rejectRecordList = append(rejectRecordList, Task.AuditRecord{
T_uuid: User_r.T_uuid,
T_state: T_reporting_state,
T_reason: T_reason,
T_time: time.Now().Format("2006-01-02 15:04:05"),
T_type: "reporting",
})
rejectRecordJson, err := json.Marshal(rejectRecordList)
if err != nil {
logs.Error("JSON 反序列化失败:", err)
return
}
r.T_reject_record = string(rejectRecordJson)
clos = append(clos, "T_reject_times")
clos = append(clos, "T_reject_record")
}
}
auditRecordJson, err := Task.Add_AuditRecord(r.T_reporting_audit_record, User_r.T_uuid, Admin_r.T_uuid, T_reporting_state, T_reason, "")
if err != nil {
return
}
r.T_reporting_audit_record = auditRecordJson
clos = append(clos, "T_reporting_audit_record")
// 查询信息采集信息
infoCollection, is := InfoCollection.Read_InfoCollection(r.T_InfoCollection_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取信息采集失败!"}
c.ServeJSON()
return
}
// 验证报告客户审核通过后设置结束时间
if T_reporting_state == Task.TaskReportingStateClientPass {
r.T_end_time = time.Now().Format("2006-01-02 15:04:05")
r.T_time_interval, err = lib.MinutesDifference(infoCollection.T_start_time, r.T_end_time)
if err != nil {
logs.Error("UpReportingState:", err.Error())
}
clos = append(clos, "T_end_time")
clos = append(clos, "T_time_interval")
}
if !Task.Update_Task(r, clos...) {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
c.ServeJSON()
return
}
// 已通过
if T_reporting_state == Task.TaskReportingStatePass {
System.Add_News(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】验证报告 %s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state]), "")
go wx.WxSend(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】验证报告 %s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state]))
System.Add_News(r.T_reporting, fmt.Sprintf("【%s-%s】验证报告 %s,请及时 打印报告", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state]), "")
go wx.WxSend(r.T_reporting, fmt.Sprintf("【%s-%s】验证报告 %s,请及时 打印报告", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state]))
}
// 已退回
if T_reporting_state == Task.TaskReportingStateReturn {
System.Add_News(r.T_reporting, fmt.Sprintf("【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason), "")
go wx.WxSend(r.T_reporting, fmt.Sprintf("【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason))
}
// 已通过(客户) 通知销售
if T_reporting_state == Task.TaskReportingStateClientPass {
go wx.WxSend(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】 %s,请尽快安排客户回款", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state]))
}
if T_reporting_state == Task.TaskReportingStateClientReturn {
System.Add_News(r.T_scheme, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason), "")
go wx.WxSend(r.T_scheme, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason))
System.Add_News(r.T_collection, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason), "")
go wx.WxSend(r.T_collection, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason))
System.Add_News(r.T_reporting, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason), "")
go wx.WxSend(r.T_reporting, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason))
//System.Add_News(r.T_delivery, fmt.Sprintf("!!!【%s-%s】验证报告 %s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state]), "")
//go wx.WxSend(r.T_delivery, fmt.Sprintf("!!!【%s-%s】验证报告 %s", infoCollection.T_name, r.T_name,Task.TaskReportingStateMap[T_reporting_state]))
System.Add_News(conf.VdelUuid, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason), "")
go wx.WxSend(conf.VdelUuid, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason))
go wx.WxSend(conf.BoosUuid, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason))
}
// 添加任务操作日志
Task.Add_TaskLogs_T(operate_uuid, T_task_id, "任务管理", "修改验证报告状态", r)
System.Add_UserLogs_T(operate_uuid, "任务管理", "修改验证报告状态", r)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 修改检测报告状态
func (c *TaskController) UpExaminingReportState() {
Admin_r, Admin_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
User_r, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !Admin_is && !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
operate_uuid := ""
if Admin_is {
operate_uuid = Admin_r.T_uuid
}
if User_is {
operate_uuid = User_r.T_uuid
}
T_examining_report_state, _ := c.GetInt("T_examining_report_state") // 1 已完成(客户通过) 5已退回(客户) 3已通过(报告负责人) 4已退回(报告负责人)
T_reason := c.GetString("T_reason") // 退回原因
T_signature := c.GetString("T_signature") // 通过后客户签名图片链接
T_task_id := c.GetString("T_task_id")
r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
_, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
clos := make([]string, 0)
if T_examining_report_state > 0 {
r.T_examining_report_state = T_examining_report_state
clos = append(clos, "T_examining_report_state")
}
if len(T_signature) > 0 {
r.T_examining_report_signature = T_signature
clos = append(clos, "T_examining_report_signature")
}
if T_examining_report_state == Task.TaskExaminingReportStateClientReturn || T_examining_report_state == Task.TaskExaminingReportStateReturn {
r.T_examining_report_return_times += 1
clos = append(clos, "T_examining_report_return_times")
// 客户退回时新增驳回次数和驳回记录
if T_examining_report_state == Task.TaskExaminingReportStateClientReturn {
r.T_reject_times += 1
var rejectRecordList []Task.AuditRecord
if len(r.T_reject_record) > 0 {
err := json.Unmarshal([]byte(r.T_reject_record), &rejectRecordList)
if err != nil {
logs.Error("JSON 反序列化失败:", err)
return
}
}
rejectRecordList = append(rejectRecordList, Task.AuditRecord{
T_uuid: User_r.T_uuid,
T_state: T_examining_report_state,
T_reason: T_reason,
T_time: time.Now().Format("2006-01-02 15:04:05"),
T_type: "examining_report",
})
rejectRecordJson, err := json.Marshal(rejectRecordList)
if err != nil {
logs.Error("JSON 反序列化失败:", err)
return
}
r.T_reject_record = string(rejectRecordJson)
clos = append(clos, "T_reject_times")
clos = append(clos, "T_reject_record")
}
}
auditRecordJson, err := Task.Add_AuditRecord(r.T_examining_report_audit_record, User_r.T_uuid, Admin_r.T_uuid, T_examining_report_state, T_reason, "")
if err != nil {
return
}
r.T_examining_report_audit_record = auditRecordJson
clos = append(clos, "T_examining_report_audit_record")
if !Task.Update_Task(r, clos...) {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
c.ServeJSON()
return
}
// 已提交
if T_examining_report_state == Task.TaskExaminingReportStateSubmitted {
System.Add_News(r.T_collection, fmt.Sprintf("【%s-%s】检测报告 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state]), "")
go wx.WxSend(r.T_collection, fmt.Sprintf("【%s-%s】检测报告 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state]))
}
// 已通过
if T_examining_report_state == Task.TaskExaminingReportStatePass {
infoCollection, _ := InfoCollection.Read_InfoCollection(r.T_InfoCollection_id)
System.Add_News(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】检测报告 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state]), "")
go wx.WxSend(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】检测报告 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state]))
}
// 已退回(负责人)
if T_examining_report_state == Task.TaskExaminingReportStateReturn {
System.Add_News(r.T_scheme, fmt.Sprintf("【%s-%s】检测报告 %s,%s", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state], T_reason), "")
go wx.WxSend(r.T_scheme, fmt.Sprintf("【%s-%s】检测报告 %s,%s", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state], T_reason))
}
// 已退回(客户)
if T_examining_report_state == Task.TaskExaminingReportStateClientReturn {
System.Add_News(r.T_scheme, fmt.Sprintf("!!!【%s-%s】检测报告 %s,%s", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state], T_reason), "")
go wx.WxSend(r.T_scheme, fmt.Sprintf("!!!【%s-%s】检测报告 %s,%s", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state], T_reason))
System.Add_News(conf.VdelUuid, fmt.Sprintf("!!!【%s-%s】检测报告 %s,%s", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state], T_reason), "")
go wx.WxSend(conf.VdelUuid, fmt.Sprintf("!!!【%s-%s】检测报告 %s,%s", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state], T_reason))
go wx.WxSend(conf.BoosUuid, fmt.Sprintf("!!!【%s-%s】检测报告 %s,%s", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state], T_reason))
}
// 添加任务操作日志
Task.Add_TaskLogs_T(operate_uuid, T_task_id, "任务管理", "修改检测报告状态", r)
System.Add_UserLogs_T(operate_uuid, "任务管理", "修改检测报告状态", r)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 修改原始数据状态
func (c *TaskController) UpOriginalRecordState() {
Admin_r, Admin_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
User_r, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !Admin_is && !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
operate_uuid := ""
if Admin_is {
operate_uuid = Admin_r.T_uuid
}
if User_is {
operate_uuid = User_r.T_uuid
}
T_original_record_state, _ := c.GetInt("T_original_record_state") // 1 已完成(客户通过) 5已退回(客户) 3已通过(报告负责人) 4已退回(报告负责人)
T_reason := c.GetString("T_reason") // 退回原因
T_signature := c.GetString("T_signature") // 通过后客户签名图片链接
T_task_id := c.GetString("T_task_id")
r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
_, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
clos := make([]string, 0)
if T_original_record_state > 0 {
r.T_original_record_state = T_original_record_state
clos = append(clos, "T_original_record_state")
}
if len(T_signature) > 0 {
r.T_original_record_signature = T_signature
clos = append(clos, "T_original_record_signature")
}
if T_original_record_state == Task.TaskOriginalRecordStateReturn {
r.T_original_record_return_times += 1
clos = append(clos, "T_original_record_return_times")
}
auditRecordJson, err := Task.Add_AuditRecord(r.T_original_record_audit_record, User_r.T_uuid, Admin_r.T_uuid, T_original_record_state, T_reason, "")
if err != nil {
return
}
r.T_original_record_audit_record = auditRecordJson
clos = append(clos, "T_original_record_audit_record")
if !Task.Update_Task(r, clos...) {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
c.ServeJSON()
return
}
// 已提交
if T_original_record_state == Task.TaskOriginalRecordStateSubmitted {
System.Add_News(r.T_collection, fmt.Sprintf("【%s-%s】原始数据 %s", company_r.T_name, r.T_name, Task.TaskOriginalRecordStateMap[T_original_record_state]), "")
go wx.WxSend(r.T_collection, fmt.Sprintf("【%s-%s】原始数据 %s", company_r.T_name, r.T_name, Task.TaskOriginalRecordStateMap[T_original_record_state]))
}
// 已通过
if T_original_record_state == Task.TaskOriginalRecordStatePass {
infoCollection, _ := InfoCollection.Read_InfoCollection(r.T_InfoCollection_id)
System.Add_News(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】原始数据 %s", company_r.T_name, r.T_name, Task.TaskOriginalRecordStateMap[T_original_record_state]), "")
go wx.WxSend(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】原始数据 %s", company_r.T_name, r.T_name, Task.TaskOriginalRecordStateMap[T_original_record_state]))
}
// 已退回(负责人)
if T_original_record_state == Task.TaskOriginalRecordStateReturn {
System.Add_News(r.T_scheme, fmt.Sprintf("【%s-%s】原始数据 %s,%s", company_r.T_name, r.T_name, Task.TaskOriginalRecordStateMap[T_original_record_state], T_reason), "")
go wx.WxSend(r.T_scheme, fmt.Sprintf("【%s-%s】原始数据 %s,%s", company_r.T_name, r.T_name, Task.TaskOriginalRecordStateMap[T_original_record_state], T_reason))
}
// 添加任务操作日志
Task.Add_TaskLogs_T(operate_uuid, T_task_id, "任务管理", "修改原始数据状态", r)
System.Add_UserLogs_T(operate_uuid, "任务管理", "修改原始数据状态", r)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 进场 改成 方案开始
func (c *TaskController) EnterArea() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_task_id := c.GetString("T_task_id")
r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
// 方案开始
if len(r.T_scheme_start_time) == 0 {
r.T_scheme_start_time = time.Now().Format("2006-01-02 15:04:05")
Task.Update_Task(r, "T_scheme_start_time")
}
// 添加任务操作日志
Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "方案开始", r)
System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "方案开始", r)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 开始验证
func (c *TaskController) StartVerify() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_task_id := c.GetString("T_task_id")
T_time := c.GetString("T_time") // 进场时间
r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
if len(r.T_collection_start_time) == 0 {
r.T_collection_start_time = T_time
if !Task.Update_Task(r, "T_collection_start_time") {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改实施开始时间失败!"}
c.ServeJSON()
return
}
// 添加任务操作日志
Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "开始验证", r)
System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "开始验证", r)
}
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 删除-
func (c *TaskController) Del() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_task_id := c.GetString("T_task_id")
if r, is := Task.Read_Task(T_task_id); is {
if !Task.Delete_Task(r) {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
c.ServeJSON()
return
}
// 添加任务操作日志
Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "删除", r)
System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "删除", r)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
// 列表 -
func (c *TaskController) Logs_List() {
// 验证登录 User_is, User_r
_, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
var r_jsons lib.R_JSONS
page, _ := c.GetInt("page")
if page < 1 {
page = 1
}
page_z, _ := c.GetInt("page_z")
if page_z < 1 {
page_z = conf.Page_size
}
T_task_id := c.GetString("T_task_id")
AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
var cnt int
List, cnt := Task.Read_TaskLogs_List(T_task_id, AdminMap, page, page_z)
page_size := math.Ceil(float64(cnt) / float64(page_z))
r_jsons.List = List
r_jsons.Page = page
r_jsons.Page_size = int(page_size)
r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
r_jsons.Num = cnt
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
c.ServeJSON()
return
}
// 查询图片生成状态
func (c *TaskController) DeviceData_JPGState() {
T_task_id := c.GetString("T_task_id")
T_remark := c.GetString("T_remark")
jpg, is := Device.Redis_DeviceDataJPG_Get(T_task_id + T_remark)
if !is {
c.Data["json"] = lib.JSONS{Code: 1202, Msg: "暂无图片正在生成"}
c.ServeJSON()
return
}
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: jpg}
c.ServeJSON()
return
}
// 生成温度图片
func (c *TaskController) DeviceData_JPG() {
StartTime := c.GetString("StartTime")
if len(StartTime) > 0 {
_, ok := lib.TimeStrToTime(StartTime)
if !ok {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
c.ServeJSON()
return
}
}
EndTime := c.GetString("EndTime")
if len(EndTime) > 0 {
_, ok := lib.TimeStrToTime(EndTime)
if !ok {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
c.ServeJSON()
return
}
} else {
EndTime = time.Now().Format("2006-01-02 15:04:05")
}
T_remark := c.GetString("T_remark")
TemperatureMin, _ := c.GetFloat("TemperatureMin") // 最低温度
TemperatureMax, _ := c.GetFloat("TemperatureMax") // 最高温度
if TemperatureMin == 0 {
TemperatureMin = 2
}
if TemperatureMax == 0 {
TemperatureMax = 8
}
T_task_id := c.GetString("T_task_id")
Task_r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
c.ServeJSON()
return
}
if Task_r.T_collection_state == 2 {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
c.ServeJSON()
return
}
deviceClassList, _ := Device.Read_DeviceClassList_OrderList(Task_r.T_class, "", "", T_remark, 0, 9999)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_class 错误!"}
c.ServeJSON()
return
}
Device.Redis_DeviceDataJPG_Del(T_task_id + T_remark)
// 生成图片
go DeviceDataJPG(StartTime, EndTime, T_task_id, T_remark, deviceClassList, TemperatureMin, TemperatureMax)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// SyncInfoCollection 同步信息采集表
func (c *TaskController) SyncInfoCollection() {
T_task_id := c.GetString("T_task_id")
T_source, _ := c.GetInt("T_source")
task, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
// 获取信息采集表模版信息
InfoCollection_Map_List := InfoCollection.Read_InfoTemplateMap_List_For_Data(task.T_InfoTemplate_id)
InfoCollection_Data := InfoCollection.Read_InfoTemplateMapData_List(task.T_InfoCollection_id, task.T_InfoTemplate_id, InfoCollection_Map_List)
Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(task.T_VerifyTemplate_id, T_source, 0)
Data := VerifyTemplate.Read_VerifyTemplateMapData_List(T_source, T_task_id, task.T_VerifyTemplate_id, Map_List)
InfoCollectionDataMap := make(map[string]string)
for _, data := range InfoCollection_Data {
InfoCollectionDataMap[data.T_name] = data.T_value
}
MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
for _, v := range Data {
if len(v.T_value) > 0 {
continue
}
if InfoCollectionDataMap[v.T_name] == "" {
continue
}
val := VerifyTemplate.VerifyTemplateMapData{
T_source: T_source,
T_task_id: task.T_task_id,
T_VerifyTemplate_id: task.T_VerifyTemplate_id,
T_VerifyTemplateMap_id: v.T_VerifyTemplateMap_id,
T_flow_sort: v.T_flow_sort,
T_max_time: v.T_max_time,
T_min_time: v.T_min_time,
T_value: InfoCollectionDataMap[v.T_name],
}
MapDataList = append(MapDataList, val)
}
var ids []int64
ids, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData(MapDataList)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
c.ServeJSON()
return
}
c.Data["json"] = lib.JSONS{Data: ids, Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 退回记录列表
func (c *TaskController) AuditRecordList() {
// 验证登录 User_is, User_r
_, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_task_id := c.GetString("T_task_id")
T_type := c.GetString("T_type") // T_task任务 T_scheme方案 T_collection数据采集 T_reporting报告
//T_task 驳回记录
//T_scheme 实施方案状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
//T_collection 数据采集状态 0 未完成 1 数据来源已完成 2 处理中 3 已采集-无数据 4-数据编辑已完成(已提交) 5已通过(负责人) 6已退回(负责人)
//T_reporting 报告编写状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
T_state, _ := c.GetInt("T_state") // -1 获取全部
r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
var auditRecordList []Task.AuditRecord
switch T_type {
case "T_task":
T_state = -1
if len(r.T_reject_record) > 0 {
err := json.Unmarshal([]byte(r.T_reject_record), &auditRecordList)
if err != nil {
logs.Error("JSON 反序列化失败:", err)
return
}
}
case "T_scheme":
if len(r.T_scheme_audit_record) > 0 {
err := json.Unmarshal([]byte(r.T_scheme_audit_record), &auditRecordList)
if err != nil {
logs.Error("JSON 反序列化失败:", err)
return
}
}
case "T_collection":
if len(r.T_collection_audit_record) > 0 {
err := json.Unmarshal([]byte(r.T_collection_audit_record), &auditRecordList)
if err != nil {
logs.Error("JSON 反序列化失败:", err)
return
}
}
case "T_reporting":
if len(r.T_reporting_audit_record) > 0 {
err := json.Unmarshal([]byte(r.T_reporting_audit_record), &auditRecordList)
if err != nil {
logs.Error("JSON 反序列化失败:", err)
return
}
}
case "T_examining_report":
if len(r.T_examining_report_audit_record) > 0 {
err := json.Unmarshal([]byte(r.T_examining_report_audit_record), &auditRecordList)
if err != nil {
logs.Error("JSON 反序列化失败:", err)
return
}
}
case "T_original_record":
if len(r.T_original_record_audit_record) > 0 {
err := json.Unmarshal([]byte(r.T_original_record_audit_record), &auditRecordList)
if err != nil {
logs.Error("JSON 反序列化失败:", err)
return
}
}
}
AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
UserMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
var auditRecordList2 []Task.AuditRecord
// 返回全部
if T_state == -1 {
for i := 0; i < len(auditRecordList); i++ {
auditRecordList[i].T_admin_name = AdminMap[auditRecordList[i].T_admin]
auditRecordList[i].T_uuid_name = UserMap[auditRecordList[i].T_uuid]
auditRecordList2 = append(auditRecordList2, auditRecordList[i])
}
c.Data["json"] = lib.JSONS{Data: auditRecordList2, Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
if T_state == -2 {
for i := 0; i < len(auditRecordList); i++ {
if auditRecordList[i].T_state == 2 || auditRecordList[i].T_state == 4 {
auditRecordList[i].T_admin_name = AdminMap[auditRecordList[i].T_admin]
auditRecordList[i].T_uuid_name = UserMap[auditRecordList[i].T_uuid]
auditRecordList2 = append(auditRecordList2, auditRecordList[i])
}
}
c.Data["json"] = lib.JSONS{Data: auditRecordList2, Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
for i := 0; i < len(auditRecordList); i++ {
if auditRecordList[i].T_state == T_state {
auditRecordList[i].T_admin_name = AdminMap[auditRecordList[i].T_admin]
auditRecordList[i].T_uuid_name = UserMap[auditRecordList[i].T_uuid]
auditRecordList2 = append(auditRecordList2, auditRecordList[i])
}
}
c.Data["json"] = lib.JSONS{Data: auditRecordList2, Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 存档生成图片
func DeviceDataJPG(StartTime, EndTime, T_task_id, T_remark string, deviceList []Device.DeviceClassList, TemperatureMin, TemperatureMax float64) {
Device.Redis_DeviceDataJPG_Set(T_task_id+T_remark, Device.DeviceDataJPG{
State: 1,
Msg: "图片生成中",
Url: "",
})
msg := ""
state := 2
url := ""
if TemperatureMin == 0 {
TemperatureMin = 2
}
if TemperatureMax == 0 {
TemperatureMax = 8
}
var ymin, ymax float64
var xminT, xmaxT time.Time
if len(deviceList) > 0 {
ymin, ymax, xminT, xmaxT = Device.Read_DeviceData_T_Min_Max_Time_Min_Max(deviceList[0].T_sn, StartTime, EndTime)
}
// 创建一个新的绘图
p := plot.New()
// 设置绘图标题和标签
p.Title.Text = "温度折线图"
//p.Legend.ThumbnailWidth = 5 * vg.Inch
p.X.Label.Text = "时间"
p.Y.Label.Text = "温度"
var chData = make(chan int, 10)
var jobGroup sync.WaitGroup
var device = make([]Device.DeviceCount, len(deviceList))
// 创建温度线
for i := 0; i < len(deviceList); i++ {
chData <- 1
jobGroup.Add(1)
go func(index int) {
//go func(index int, wg *sync.WaitGroup, p *plot.Plot) {
defer func() {
<-chData // 完成时chan取出1个
jobGroup.Done() // 完成时将等待组值减1
}()
sn, id := deviceList[index].T_sn, deviceList[index].T_id
ymin_, ymax_, minTime_, maxTime_ := Device.Read_DeviceData_T_Min_Max_Time_Min_Max(sn, StartTime, EndTime)
if ymin > ymin_ {
ymin = ymin_
}
if ymax < ymax_ {
ymax = ymax_
}
if xminT.After(minTime_) && !minTime_.IsZero() {
xminT = minTime_
}
if xmaxT.Before(maxTime_) && !maxTime_.IsZero() {
xmaxT = maxTime_
}
r_maps, r_maps_num := Device.Read_DeviceSensorData_ById_List(sn, StartTime, EndTime, 0, 9999)
device[index] = Device.DeviceCount{
T_id: id,
T_sn: sn,
Num: r_maps_num,
}
if r_maps_num == 0 {
return
}
pts := make(plotter.XYs, len(r_maps))
for j, d := range r_maps {
t, _ := lib.TimeStrToTime(d.T_time)
pts[j].X = float64(t.Unix())
pts[j].Y = float64(d.T_t)
}
line, err := plotter.NewLine(pts)
if err != nil {
return
}
line.Color = randomColor(index)
p.Add(line)
}(i)
}
jobGroup.Wait()
xmin, xmax := float64(xminT.Unix()), float64(xmaxT.Unix())
// 添加最高,最低标准线 用红色虚线标识
p.Add(horizontalLine(xmin, xmax, TemperatureMin))
p.Add(horizontalLine(xmin, xmax, TemperatureMax))
if ymax < 8 {
ymax = 8
}
if ymin > 0 {
ymin = 0
}
p.Y.Min, p.Y.Max = ymin, ymax
p.X.Min, p.X.Max = xmin, xmax
p.Y.Tick.Marker = commaTicks{}
//p.X.Tick.Marker = plot.TimeTicks{Format: "2006-01-02 15:04:05"}
p.X.Tick.Marker = timeTicks{}
p.X.Tick.Label.Rotation = math.Pi / 5
p.X.Tick.Label.YAlign = draw.YCenter
p.X.Tick.Label.XAlign = draw.XRight
filename := "jpg" + time.Now().Format("20060102150405")
// 保存文件
if err := p.Save(10*vg.Inch, 4*vg.Inch, "ofile/"+filename+".jpg"); err != nil {
Device.Redis_DeviceDataJPG_Set(T_task_id+T_remark, Device.DeviceDataJPG{
State: 3,
Msg: "图片生成失败",
Url: url,
})
logs.Error(lib.FuncName(), "生成图片失败", err)
return
}
if !lib.Pload_qiniu("ofile/"+filename+".jpg", "ofile/"+filename+".jpg") {
Device.Redis_DeviceDataJPG_Set(T_task_id+T_remark, Device.DeviceDataJPG{
State: 3,
Msg: "图片上传七牛云失败",
Url: url,
})
logs.Error(lib.FuncName(), "上传七牛云失败")
return
}
//删除目录
os.Remove("ofile/" + filename + ".jpg")
msg = "图片生成成功"
url = "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + filename + ".jpg"
Device.Redis_DeviceDataJPG_Set(T_task_id+T_remark, Device.DeviceDataJPG{
State: state,
Msg: msg,
Url: url,
Device: device,
})
return
}
func horizontalLine(xmin, xmax, y float64) *plotter.Line {
pts := make(plotter.XYs, 2)
pts[0].X = xmin
pts[0].Y = y
pts[1].X = xmax
pts[1].Y = y
line, err := plotter.NewLine(pts)
if err != nil {
panic(any(err))
}
line.LineStyle.Dashes = []vg.Length{vg.Points(8), vg.Points(5), vg.Points(1), vg.Points(5)}
line.Color = color.RGBA{R: 255, A: 255}
return line
}
type timeTicks struct{}
func (timeTicks) Ticks(min, max float64) []plot.Tick {
tks := plot.TimeTicks{}.Ticks(min, max)
for i, t := range tks {
//if t.Label == "" { // Skip minor ticks, they are fine.
// continue
//}
tks[i].Label = time.Unix(int64(t.Value), 0).Format("2006-01-02 15:04:05")
}
return tks
}
type commaTicks struct{}
// Ticks computes the default tick marks, but inserts commas
// into the labels for the major tick marks.
func (commaTicks) Ticks(min, max float64) []plot.Tick {
tks := plot.DefaultTicks{}.Ticks(min, max)
for i, t := range tks {
//if t.Label == "" { // Skip minor ticks, they are fine.
// continue
//}
tks[i].Label = fmt.Sprintf("%.0f", t.Value)
}
return tks
}
// 生成随机颜色的辅助函数
func randomColor(i int) color.RGBA {
var colors []color.RGBA
colors = append(colors,
color.RGBA{R: 52, G: 152, B: 219, A: 255},
color.RGBA{R: 230, G: 126, B: 34, A: 255},
color.RGBA{R: 142, G: 68, B: 173, A: 255},
color.RGBA{R: 211, G: 84, B: 0, A: 255},
color.RGBA{R: 231, G: 76, B: 60, A: 255},
color.RGBA{R: 26, G: 188, B: 156, A: 255},
color.RGBA{R: 243, G: 156, B: 18, A: 255},
color.RGBA{R: 22, G: 160, B: 133, A: 255},
color.RGBA{R: 46, G: 204, B: 113, A: 255},
color.RGBA{R: 39, G: 174, B: 96, A: 255},
color.RGBA{R: 41, G: 128, B: 185, A: 255},
color.RGBA{R: 155, G: 89, B: 182, A: 255},
color.RGBA{R: 192, G: 57, B: 43, A: 255},
color.RGBA{R: 241, G: 196, B: 15, A: 255},
)
return colors[i%len(colors)]
}
// 获取加完水印的pdf
func GetWatermarkPdf_command(task Task.Task, pdfURL string, flag string) (pdf string) {
if len(pdfURL) == 0 {
return
}
currentDirectory := lib.GetCurrentDirectory()
scriptPath := currentDirectory + "/script"
pdf_file_out_name := uuid.New().String() + ".pdf"
pdfFilename := currentDirectory + "/ofile/" + uuid.New().String() + ".pdf"
pdf_file_out := currentDirectory + "/ofile/watermark" + pdf_file_out_name
watermark_pdf := currentDirectory + "/script/watermark.pdf"
// 执行Python脚本
cmd := exec.Command("python3", "add_watermark.py", pdfURL, pdfFilename, pdf_file_out, watermark_pdf)
cmd.Dir = scriptPath
// 获取命令输出
_, err := cmd.CombinedOutput()
if err != nil {
logs.Error("执行python脚本添加水印错误:", err)
return
}
lib.Pload_qiniu(pdf_file_out, pdf_file_out_name)
if !lib.Pload_qiniu(pdf_file_out, pdf_file_out) {
err = errors.New("上传水印pdf失败")
return
}
defer func() {
os.Remove(pdfFilename)
os.Remove(pdf_file_out)
}()
pdf = "https://bzdcoldverifyoss.baozhida.cn/" + pdf_file_out_name
switch flag {
case "T_pdf1":
task.T_pdf1_watermark = pdf
Task.Update_Task(task, "T_pdf1_watermark")
case "T_pdf2":
task.T_pdf2_watermark = pdf
Task.Update_Task(task, "T_pdf2_watermark")
}
return
}
func GetSignaturePdf_command(task Task.Task, pdfURL string, flag string) (pdf string) {
if len(pdfURL) == 0 {
return
}
currentDirectory := lib.GetCurrentDirectory()
scriptPath := currentDirectory + "/script"
pdf_file_out_name := uuid.New().String() + ".pdf"
pdfFilename := currentDirectory + "/ofile/" + uuid.New().String() + ".pdf"
pdf_file_out := currentDirectory + "/ofile/signature" + pdf_file_out_name
signature_img := currentDirectory + "/script/报告专用章.png"
// 执行Python脚本
cmd := exec.Command("python3", "add_signature.py", pdfURL, pdfFilename, signature_img, pdf_file_out)
cmd.Dir = scriptPath
// 获取命令输出
_, err := cmd.CombinedOutput()
if err != nil {
logs.Error("执行python脚本添加公章错误:", err)
return
}
_, err = os.Stat(pdf_file_out)
if os.IsNotExist(err) {
return ""
}
lib.Pload_qiniu(pdf_file_out, pdf_file_out_name)
if !lib.Pload_qiniu(pdf_file_out, pdf_file_out) {
err = errors.New("上传水印pdf失败")
return
}
defer func() {
os.Remove(pdfFilename)
os.Remove(pdf_file_out)
}()
pdf = "https://bzdcoldverifyoss.baozhida.cn/" + pdf_file_out_name
switch flag {
case "T_pdf1":
task.T_pdf1_signature = pdf
Task.Update_Task(task, "T_pdf1_signature")
case "T_pdf2":
task.T_pdf2_signature = pdf
Task.Update_Task(task, "T_pdf2_signature")
}
return
}
func GetWatermarkPdf(task Task.Task, pdfURL string, stamp bool, flag string) (pdf string) {
if len(pdfURL) == 0 {
return
}
// 添加公章 T_pdf5为CNAS实验室 ,不添加公章
var signaturePdf, watermarkPdf string
var err error
if flag != "T_pdf5" {
if stamp {
signaturePdf, err = lib.GetSignaturePdf(pdfURL)
if err != nil {
logs.Error("获取加报告章pdf失败:", err)
return
}
} else {
signaturePdf = pdfURL
}
}
// 添加水印
watermarkPdf, err = lib.GetWatermarkPdf(pdfURL)
if err != nil {
logs.Error("获取加水印pdf失败:", err)
return
}
switch flag {
case "T_pdf1":
task.T_pdf1_watermark = watermarkPdf
task.T_pdf1_signature = signaturePdf
Task.Update_Task(task, "T_pdf1_watermark", "T_pdf1_signature")
case "T_pdf2":
task.T_pdf2_watermark = watermarkPdf
task.T_pdf2_signature = signaturePdf
Task.Update_Task(task, "T_pdf2_watermark", "T_pdf2_signature")
case "T_pdf5":
task.T_pdf5_watermark = watermarkPdf
Task.Update_Task(task, "T_pdf5_watermark")
}
return
}
// 暂停申请
// 列表 -
func (c *TaskController) TaskTimeList() {
// 验证登录 User_is, User_r
_, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
var r_jsons lib.R_JSONS
T_task_id := c.GetString("T_task_id")
T_task_type, _ := c.GetInt("T_task_type", 0)
var cnt int64
List, cnt := Task.Read_TaskTime_List(T_task_id, T_task_type)
r_jsons.List = List
r_jsons.Num = int(cnt)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
c.ServeJSON()
return
}
// 添加-
func (c *TaskController) TaskTimeAdd() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
dc := Device.DeviceClass{
T_uuid: User_r.T_uuid,
T_State: 1,
}
System.Add_UserLogs_T(User_r.T_uuid, "任务暂停", "暂停申请", dc)
T_task_id := c.GetString("T_task_id")
T_task_type, _ := c.GetInt("T_task_type", 0) // 公司名称
T_aaa := c.GetString("T_aaa")
var_ := Task.TaskTime{
T_task_id: T_task_id,
T_task_type: T_task_type,
T_uuid: User_r.T_uuid,
T_remarks: T_aaa,
T_start_time: time.Now().Format("2006-01-02 15:04:05"),
}
List, _ := Task.Read_TaskTime_List(T_task_id, T_task_type)
if len(List) > 0 {
if len(List[len(List)-1].T_end_time) == 0 {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "上一个任务还没结束!"}
c.ServeJSON()
return
}
}
is := Task.Add_TaskTime(var_)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
c.ServeJSON()
return
}
// 添加任务操作日志
Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务暂停", "暂停申请", var_)
System.Add_UserLogs_T(User_r.T_uuid, "任务暂停", "暂停申请", var_)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_task_id}
c.ServeJSON()
return
}
// 添加-
func (c *TaskController) TaskTimeEnd() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
dc := Device.DeviceClass{
T_uuid: User_r.T_uuid,
T_State: 1,
}
System.Add_UserLogs_T(User_r.T_uuid, "任务暂停", "暂停结束", dc)
Id, _ := c.GetInt("Id", 0)
TaskTime_r, is := Task.Read_TaskTime_ById(Id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
TaskTime_r.T_end_time = time.Now().Format("2006-01-02 15:04:05")
is = Task.Update_TaskTime(TaskTime_r, "T_end_time")
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
c.ServeJSON()
return
}
// 添加任务操作日志
Task.Add_TaskLogs_T(User_r.T_uuid, TaskTime_r.T_task_id, "任务暂停", "暂停结束", TaskTime_r)
System.Add_UserLogs_T(User_r.T_uuid, "任务暂停", "暂停结束", TaskTime_r)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: TaskTime_r.T_task_id}
c.ServeJSON()
return
}
// 列表 - 统计排名
func (c *TaskController) StatisticalRanking() {
// 验证登录 User_is, User_r
_, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_power, _ := c.GetInt("T_power", 0) // 5 数据采集工程师 6 验证报告工程师
type Admin_T struct {
T_name string
T_scheme int // 实施方案
T_scheme_returnnum int // 退回
T_scheme_overnum int // 超时
T_scheme_log string // 日志
T_collection int // 数据采集
T_collection_returnnum int // 退回
T_collection_overnum int // 超时
T_collection_log string // 日志
T_reporting int // 报告编写
T_reporting_returnnum int // 退回
T_reporting_overnum int // 超时
T_reporting_log string // 日志
T_rejectdnum int // 驳回数量
}
var Admin_T_List []Admin_T
Admin_List := Account.Read_Admin_List_ALL_T_power(T_power)
for _, A := range Admin_List {
Admin_t := Admin_T{T_name: A.T_name}
// 方案
Task_List := Task.Read_UserTask_StatisticalRanking(A.T_uuid, "T_scheme") //T_scheme T_collection T_reporting
for _, T := range Task_List {
if len(T.T_scheme_end_time) > 0 {
if is, _ := lib.IsInCurrentMonth(T.T_scheme_end_time); !is {
continue // 不是本月
}
Admin_t.T_scheme += 1
Admin_t.T_scheme_log += T.T_name
// 退回
if T.T_scheme_return_times > 0 {
Admin_t.T_scheme_returnnum += T.T_scheme_return_times
Admin_t.T_scheme_log += " | 退回" + lib.To_string(int(T.T_scheme_return_times))
}
// 超时
if T.T_scheme_overtime > 0 {
Admin_t.T_scheme_overnum += 1
Admin_t.T_scheme_log += " | 超时" + lib.ConvertMinutesToDHM(int(T.T_scheme_overtime))
}
// 驳回
if T.T_reject_times > 0 {
Admin_t.T_rejectdnum += T.T_reject_times
Admin_t.T_scheme_log += " | 驳回" + lib.To_string(int(T.T_reject_times))
}
Admin_t.T_scheme_log += "\n"
}
}
// 实施
Task_List = Task.Read_UserTask_StatisticalRanking(A.T_uuid, "T_collection") //T_scheme T_collection T_reporting
for _, T := range Task_List {
if len(T.T_collection_end_time) > 0 {
if is, _ := lib.IsInCurrentMonth(T.T_collection_end_time); !is {
continue // 不是本月
}
Admin_t.T_collection += 1
Admin_t.T_collection_log += T.T_name
// 退回
if T.T_collection_return_times > 0 {
Admin_t.T_collection_returnnum += T.T_collection_return_times
Admin_t.T_collection_log += " | 退回" + lib.To_string(int(T.T_collection_return_times))
}
// 超时
if T.T_collection_overtime > 0 {
Admin_t.T_collection_overnum += 1
Admin_t.T_collection_log += " | 超时" + lib.ConvertMinutesToDHM(int(T.T_collection_overtime))
}
// 驳回
if T.T_reject_times > 0 {
Admin_t.T_rejectdnum += T.T_reject_times
Admin_t.T_collection_log += " | 驳回" + lib.To_string(int(T.T_reject_times))
}
Admin_t.T_collection_log += "\n"
}
}
// 报告
Task_List = Task.Read_UserTask_StatisticalRanking(A.T_uuid, "T_reporting") //T_scheme T_collection T_reporting
for _, T := range Task_List {
if len(T.T_reporting_end_time) > 0 {
if is, _ := lib.IsInCurrentMonth(T.T_reporting_end_time); !is {
continue // 不是本月
}
Admin_t.T_reporting += 1
Admin_t.T_reporting_log += T.T_name
// 退回
if T.T_reporting_return_times > 0 {
Admin_t.T_reporting_returnnum += T.T_reporting_return_times
Admin_t.T_reporting_log += " | 退回" + lib.To_string(int(T.T_reporting_return_times))
}
// 超时
if T.T_reporting_overtime > 0 {
Admin_t.T_reporting_overnum += 1
Admin_t.T_reporting_log += " | 超时" + lib.ConvertMinutesToDHM(int(T.T_reporting_overtime))
}
// 驳回
if T.T_reject_times > 0 {
Admin_t.T_rejectdnum += T.T_reject_times
Admin_t.T_reporting_log += " | 驳回" + lib.To_string(int(T.T_reject_times))
}
Admin_t.T_reporting_log += "\n"
}
}
Admin_T_List = append(Admin_T_List, Admin_t)
}
var r_jsons lib.R_JSONS
r_jsons.List = Admin_T_List
r_jsons.Page = 0
r_jsons.Page_size = 0
r_jsons.Pages = lib.Func_page(int64(0), int64(0))
r_jsons.Num = 0
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
c.ServeJSON()
return
}
// 复制-
func (c *TaskController) Copy() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_name := c.GetString("T_name")
T_task_id := c.GetString("T_task_id")
new_T_uuid := c.GetString("T_uuid") // 新增T_uuid参数
r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取信息采集失败!"}
c.ServeJSON()
return
}
// 确定使用的T_uuid
target_T_uuid := r.T_uuid
if len(new_T_uuid) > 0 && new_T_uuid != r.T_uuid {
target_T_uuid = new_T_uuid
}
dc := Device.DeviceClass{
T_uuid: target_T_uuid,
T_State: 1,
}
T_class_id, is := Device.Add_DeviceClass(dc)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加分类失败!"}
c.ServeJSON()
return
}
System.Add_UserLogs_T(User_r.T_uuid, "分类管理", "添加", dc)
// 查询信息采集信息
infoCollection, is := InfoCollection.Read_InfoCollection(r.T_InfoCollection_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取信息采集失败!"}
c.ServeJSON()
return
}
// 如果T_uuid不同,需要处理信息采集
target_InfoCollection_id := r.T_InfoCollection_id
if len(new_T_uuid) > 0 && new_T_uuid != r.T_uuid {
// 查询新的T_uuid是否有同名的信息采集
newInfoCollection, found := InfoCollection.Read_InfoCollection_By_T_uuid_Name(new_T_uuid, infoCollection.T_name)
if found {
// 如果有则使用该信息采集
target_InfoCollection_id = newInfoCollection.T_InfoCollection_id
infoCollection = newInfoCollection
} else {
// 如果没有则添加
// 获取原公司和新公司的名称
_, oldCompany := Account.Read_User_ByT_uuid(r.T_uuid)
_, newCompany := Account.Read_User_ByT_uuid(new_T_uuid)
infoCollectionName := infoCollection.T_name
// 如果信息采集名称与原公司名称相同,则添加的时候需要将名称更改为新的T_uuid的公司的名称
if infoCollection.T_name == oldCompany.T_name {
infoCollectionName = newCompany.T_name
}
// 先查询信息采集标题是否存在
existingInfoCollection, found := InfoCollection.Read_InfoCollection_By_T_uuid_Name(new_T_uuid, infoCollectionName)
if found {
// 如果存在则直接用
target_InfoCollection_id = existingInfoCollection.T_InfoCollection_id
infoCollection = existingInfoCollection
} else {
// 不存在才添加
// 创建新的信息采集
newInfoCollection := InfoCollection.InfoCollection{
T_uuid: new_T_uuid,
T_name: infoCollectionName,
T_InfoTemplate_class: infoCollection.T_InfoTemplate_class,
T_InfoTemplate_id: infoCollection.T_InfoTemplate_id,
T_status: 1,
T_State: 1,
T_start_time: infoCollection.T_start_time,
T_end_time: infoCollection.T_end_time,
T_time_interval: infoCollection.T_time_interval,
}
newInfoCollectionId, err := InfoCollection.Add_InfoCollection(newInfoCollection)
if err != nil {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加信息采集失败: " + err.Error()}
c.ServeJSON()
return
}
target_InfoCollection_id = newInfoCollectionId
// 重新读取新创建的信息采集以获取完整信息
infoCollection, is = InfoCollection.Read_InfoCollection(target_InfoCollection_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取新创建的信息采集失败!"}
c.ServeJSON()
return
}
}
}
}
var_ := Task.Task{
T_Distributor_id: r.T_Distributor_id,
T_InfoCollection_id: target_InfoCollection_id,
T_InfoTemplate_id: infoCollection.T_InfoTemplate_id,
T_start_time: infoCollection.T_start_time, // 项目开始时间使用信息采集开始时间
T_class: int(T_class_id),
T_uuid: target_T_uuid,
T_name: T_name,
T_VerifyTemplate_class: r.T_VerifyTemplate_class,
T_VerifyTemplate_id: r.T_VerifyTemplate_id,
T_deadline: time.Now().AddDate(0, 2, 0).Format("2006-01-02"),
T_scheme: r.T_scheme,
T_collection: r.T_collection,
T_reporting: r.T_reporting,
T_delivery: r.T_delivery,
T_Show: 1,
T_State: 1,
T_project: r.T_project,
T_province: r.T_province,
T_city: r.T_city,
T_district: r.T_district,
T_province_code: r.T_province_code,
T_city_code: r.T_city_code,
T_district_code: r.T_district_code,
T_category: r.T_category,
T_device_type: r.T_device_type,
T_volume: r.T_volume,
T_verify_type: r.T_verify_type,
T_subject_matter: T_name,
T_temp_range: r.T_temp_range,
T_report_type: r.T_report_type,
T_device_quantity: r.T_device_quantity,
T_cnas: r.T_cnas,
}
var_.T_report_number, _ = Task.GenerateNextT_report_number(var_.T_device_type)
T_paste_task_id, is := Task.Add_Task(var_)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
c.ServeJSON()
return
}
// 复制 DeviceClassList
err := CopyDeviceClassList(r, var_)
if err != nil {
logs.Error("复制设备列表失败", err)
}
// 自动填写备注
err = AutoFillDeviceClassRemark(T_paste_task_id)
if err != nil {
logs.Error("自动填写设备备注失败", err)
}
// 自动填写布点
err = AutoFillDeploy(T_paste_task_id, 0)
if err != nil {
logs.Error("自动填写布点失败", err)
}
// 检查必填项是否都有值
VerifyTemplate.Check_RequiredFields_HaveValue(T_paste_task_id)
NatsServer.Create_Local_Table(T_paste_task_id)
Task.Redis_Task_T_report_number_DelK(var_.T_report_number) // 删除redis内的任务编号
// 复制验证模版数据
Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(r.T_VerifyTemplate_id, 0, 0)
copy_task_Data := VerifyTemplate.Read_VerifyTemplateMapData_List(0, T_task_id, r.T_VerifyTemplate_id, Map_List)
Data := VerifyTemplate.Read_VerifyTemplateMapData_List(0, T_paste_task_id, r.T_VerifyTemplate_id, Map_List)
copyDataMap := make(map[string]string)
for _, data := range copy_task_Data {
copyDataMap[data.T_name] = data.T_value
}
MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
for _, v := range Data {
// 已有值则不复制
if len(v.T_value) > 0 {
continue
}
if copyDataMap[v.T_name] == "" {
continue
}
val := VerifyTemplate.VerifyTemplateMapData{
T_source: v.T_source,
T_task_id: T_paste_task_id,
T_VerifyTemplate_id: r.T_VerifyTemplate_id,
T_VerifyTemplateMap_id: v.T_VerifyTemplateMap_id,
T_Required: v.T_Required,
T_Construction: v.T_Construction,
T_flow_sort: v.T_flow_sort,
T_max_time: v.T_max_time,
T_min_time: v.T_min_time,
T_value: copyDataMap[v.T_name],
}
MapDataList = append(MapDataList, val)
}
_, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, 0, "复制", 0, 0, 1)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
c.ServeJSON()
return
}
System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "复制标签数据", MapDataList)
// 通知
_, company_r := Account.Read_User_ByT_uuid(var_.T_uuid)
go wx.WxSend(var_.T_scheme, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
go wx.WxSend(var_.T_collection, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
go wx.WxSend(var_.T_reporting, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
go wx.WxSend(var_.T_delivery, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
// 添加任务操作日志
Task.Add_TaskLogs_T(User_r.T_uuid, T_paste_task_id, "任务管理", "复制", var_)
System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "复制", var_)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_paste_task_id}
c.ServeJSON()
return
}
// 生成报告编号 设备类型+年+季度+递增编号
func (c *TaskController) GenT_report_number() {
// 验证登录 User_is, User_r
_, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_device_type := c.GetString("T_device_type")
number, err := Task.GenerateNextT_report_number(T_device_type)
if err != nil {
c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
c.ServeJSON()
return
}
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: number}
c.ServeJSON()
return
}
// 自动填写布点
func (c *TaskController) Auto_fill_deploy() {
// 验证登录 User_is, User_r
User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
if !User_is {
c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
c.ServeJSON()
return
}
T_task_id := c.GetString("T_task_id")
T_source, _ := c.GetInt("T_source")
task, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
verifyTemplate, is := VerifyTemplate.Read_VerifyTemplate(task.T_VerifyTemplate_id)
verifyTemplate_R := VerifyTemplate.VerifyTemplateToVerifyTemplate_R(verifyTemplate)
Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(task.T_VerifyTemplate_id, T_source, 0)
MapData := VerifyTemplate.Read_VerifyTemplateMapData_List(T_source, T_task_id, task.T_VerifyTemplate_id, Map_List)
T_deploy_list := verifyTemplate_R.T_deploy_list
//if len(T_deploy_list) == 0 {
// // 解析设备列表备注的布点
// deviceClassList := Device.Read_DeviceClassList_List_ByT_remark(task.T_class, "")
// for _, v := range deviceClassList {
// splitList := lib.SplitStringSeparator(v.T_remark, "|")
// for _, T_name := range splitList {
// T_deploy_list = append(T_deploy_list, VerifyTemplate.VerifyTemplateDeploy{T_name: T_name})
// }
// }
//}
// 循环查询布点
deployMap := make(map[string]string)
for _, deploy := range T_deploy_list {
deviceClassList := Device.Read_DeviceClassList_List_ByT_remark(task.T_class, deploy.T_name)
var snList []string
for _, v := range deviceClassList {
snList = append(snList, v.T_sn)
}
deployMap[deploy.T_name] = strings.Join(snList, "|")
}
MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
for _, v := range MapData {
if snList, ok := deployMap[v.T_name]; ok {
val := VerifyTemplate.VerifyTemplateMapData{
T_source: v.T_source,
T_task_id: task.T_task_id,
T_VerifyTemplate_id: task.T_VerifyTemplate_id,
T_VerifyTemplateMap_id: v.T_VerifyTemplateMap_id,
T_Required: v.T_Required,
T_Construction: v.T_Construction,
T_flow_sort: v.T_flow_sort,
T_max_time: v.T_max_time,
T_min_time: v.T_min_time,
T_value: snList,
T_start_time: v.T_start_time,
}
MapDataList = append(MapDataList, val)
}
}
ids, is := VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, T_source, User_r.T_uuid, 0, 0, 0)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
c.ServeJSON()
return
}
System.Add_UserLogs_T(User_r.T_uuid, "验证模版标签数据", "自动填写", ids)
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: ids}
c.ServeJSON()
return
}
// SyncVerifyTemplateMapData 根据标签名称同步模版数据
func (c *TaskController) SyncVerifyTemplateMapData() {
T_copy_task_id := c.GetString("T_copy_task_id")
T_paste_task_id := c.GetString("T_paste_task_id")
T_source, _ := c.GetInt("T_source")
copy_task, is := Task.Read_Task(T_copy_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
paste_task, is := Task.Read_Task(T_paste_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
c.ServeJSON()
return
}
copy_task_Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(copy_task.T_VerifyTemplate_id, 0, 0)
copy_task_Data := VerifyTemplate.Read_VerifyTemplateMapData_List(T_source, T_copy_task_id, copy_task.T_VerifyTemplate_id, copy_task_Map_List)
Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(paste_task.T_VerifyTemplate_id, 0, 0)
Data := VerifyTemplate.Read_VerifyTemplateMapData_List(T_source, T_paste_task_id, paste_task.T_VerifyTemplate_id, Map_List)
copyDataMap := make(map[string]string)
for _, data := range copy_task_Data {
copyDataMap[data.T_name] = data.T_value
}
MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
for _, v := range Data {
if len(v.T_value) > 0 {
continue
}
if copyDataMap[v.T_name] == "" {
continue
}
val := VerifyTemplate.VerifyTemplateMapData{
T_source: v.T_source,
T_task_id: paste_task.T_task_id,
T_VerifyTemplate_id: paste_task.T_VerifyTemplate_id,
T_VerifyTemplateMap_id: v.T_VerifyTemplateMap_id,
T_Required: v.T_Required,
T_Construction: v.T_Construction,
T_flow_sort: v.T_flow_sort,
T_max_time: v.T_max_time,
T_min_time: v.T_min_time,
T_value: copyDataMap[v.T_name],
}
MapDataList = append(MapDataList, val)
}
var ids []int64
ids, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, 0, "", 0, 0, 0)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
c.ServeJSON()
return
}
c.Data["json"] = lib.JSONS{Data: ids, Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
func (c *TaskController) TaskData_Stat() {
StartTime := c.GetString("StartTime")
if len(StartTime) > 0 {
_, ok := lib.TimeStrToTime(StartTime)
if !ok {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
c.ServeJSON()
return
}
}
EndTime := c.GetString("EndTime")
if len(EndTime) > 0 {
_, ok := lib.TimeStrToTime(EndTime)
if !ok {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
c.ServeJSON()
return
}
} else {
EndTime = time.Now().Format("2006-01-02 15:04:05")
}
T_remark := c.GetString("T_remark")
T_task_id := c.GetString("T_task_id")
Task_r, is := Task.Read_Task(T_task_id)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
c.ServeJSON()
return
}
if Task_r.T_collection_state == 2 {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
c.ServeJSON()
return
}
deviceList, _ := Device.Read_DeviceClassList_OrderList(Task_r.T_class, "", "", T_remark, 0, 9999)
if !is {
c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_class 错误!"}
c.ServeJSON()
return
}
var chData = make(chan int, 10)
var jobGroup sync.WaitGroup
var device = make([]Device.DeviceCount, len(deviceList))
// 创建温度线
for i := 0; i < len(deviceList); i++ {
chData <- 1
jobGroup.Add(1)
go func(index int) {
//go func(index int, wg *sync.WaitGroup, p *plot.Plot) {
defer func() {
<-chData // 完成时chan取出1个
jobGroup.Done() // 完成时将等待组值减1
}()
sn, id := deviceList[index].T_sn, deviceList[index].T_id
_, r_maps_num := Device.Read_DeviceSensorData_ById_List(sn, StartTime, EndTime, 0, 9999)
device[index] = Device.DeviceCount{
T_id: id,
T_sn: sn,
Num: r_maps_num,
}
if r_maps_num == 0 {
return
}
}(i)
}
jobGroup.Wait()
c.Data["json"] = lib.JSONS{Data: device, Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// SyncPDFWatermark 同步水印
func (c *TaskController) SyncPDFWatermark() {
List, _ := Task.Read_Task_List_For_Watermark("pdf1")
for _, task := range List {
GetWatermarkPdf_command(task, task.T_pdf1, "T_pdf1")
GetSignaturePdf_command(task, task.T_pdf1, "T_pdf1")
}
List2, _ := Task.Read_Task_List_For_Watermark("pdf2")
for _, task := range List2 {
GetWatermarkPdf_command(task, task.T_pdf2, "T_pdf2")
GetSignaturePdf_command(task, task.T_pdf2, "T_pdf2")
}
c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
c.ServeJSON()
return
}
// 复制设备列表
func CopyDeviceClassList(copy_task, paste_task Task.Task) error {
// 读取源任务的设备列表
copyList, _ := Device.Read_DeviceClassList_OrderList(copy_task.T_class, "", "", "", 0, 9999)
// 遍历源任务的设备列表,为每个设备创建新的 DeviceClassList 并添加到目标任务
for _, v := range copyList {
// 读取证书信息
var pdf Certificate.CertificatePdf
pdfList, _ := Certificate.Read_CertificatePdf_T_layout_no(v.T_id, "")
if len(pdfList) > 0 {
pdf = pdfList[0]
}
var_ := Device.DeviceClassList{
T_class: paste_task.T_class,
T_id: v.T_id,
T_sn: v.T_sn,
T_failure_time: pdf.T_failure_time,
T_pdf: pdf.T_pdf,
T_Certificate_sn: pdf.T_Certificate_sn,
T_remark: v.T_remark,
T_terminal: v.T_terminal,
T_State: 1,
}
_, is := Device.Add_DeviceClassList(var_)
if !is {
return fmt.Errorf("添加设备列表失败: %s", v.T_id)
}
}
return nil
}
// 自动填写设备备注
func AutoFillDeviceClassRemark(T_task_id string) error {
task, is := Task.Read_Task(T_task_id)
if !is {
return fmt.Errorf("读取任务失败: %s", T_task_id)
}
verifyTemplate, is := VerifyTemplate.Read_VerifyTemplate(task.T_VerifyTemplate_id)
if !is {
return fmt.Errorf("读取验证模板失败: %s", task.T_VerifyTemplate_id)
}
verifyTemplate_R := VerifyTemplate.VerifyTemplateToVerifyTemplate_R(verifyTemplate)
T_deploy_list := verifyTemplate_R.T_deploy_list
// 循环查询布点
deviceClassRemarkMap := make(map[int][]string)
deviceClassList := Device.Read_DeviceClassList_List_id_By_Terminal(task.T_class, false)
for _, deploy := range T_deploy_list {
if len(deploy.T_scope) > 0 {
dcl := FilterByRange(deviceClassList, deploy.T_scope)
for _, dc := range dcl {
deviceClassRemarkMap[dc.Id] = append(deviceClassRemarkMap[dc.Id], deploy.T_name)
}
}
}
for _, deviceClass := range deviceClassList {
if remark, ok := deviceClassRemarkMap[deviceClass.Id]; ok {
deviceClass.T_remark = strings.Join(remark, "|")
if !Device.Update_DeviceClassList(deviceClass, "T_remark") {
return fmt.Errorf("修改备注失败: %d", deviceClass.Id)
}
}
}
return nil
}
// 自动填写布点
func AutoFillDeploy(T_task_id string, T_source int) error {
task, is := Task.Read_Task(T_task_id)
if !is {
return fmt.Errorf("读取任务失败: %s", T_task_id)
}
verifyTemplate, is := VerifyTemplate.Read_VerifyTemplate(task.T_VerifyTemplate_id)
if !is {
return fmt.Errorf("读取验证模板失败: %s", task.T_VerifyTemplate_id)
}
verifyTemplate_R := VerifyTemplate.VerifyTemplateToVerifyTemplate_R(verifyTemplate)
Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(task.T_VerifyTemplate_id, T_source, 0)
MapData := VerifyTemplate.Read_VerifyTemplateMapData_List(T_source, T_task_id, task.T_VerifyTemplate_id, Map_List)
T_deploy_list := verifyTemplate_R.T_deploy_list
// 循环查询布点
deployMap := make(map[string]string)
for _, deploy := range T_deploy_list {
deviceClassList := Device.Read_DeviceClassList_List_ByT_remark(task.T_class, deploy.T_name)
var snList []string
for _, v := range deviceClassList {
snList = append(snList, v.T_sn)
}
deployMap[deploy.T_name] = strings.Join(snList, "|")
}
MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
for _, v := range MapData {
if snList, ok := deployMap[v.T_name]; ok {
val := VerifyTemplate.VerifyTemplateMapData{
T_source: v.T_source,
T_task_id: task.T_task_id,
T_VerifyTemplate_id: task.T_VerifyTemplate_id,
T_VerifyTemplateMap_id: v.T_VerifyTemplateMap_id,
T_Required: v.T_Required,
T_Construction: v.T_Construction,
T_flow_sort: v.T_flow_sort,
T_max_time: v.T_max_time,
T_min_time: v.T_min_time,
T_value: snList,
T_start_time: v.T_start_time,
}
MapDataList = append(MapDataList, val)
}
}
if len(MapDataList) > 0 {
_, is := VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, T_source, "", 0, 0, 0)
if !is {
return fmt.Errorf("保存布点数据失败")
}
}
return nil
}