package Task

import (
	"ColdVerify_local/conf"
	"ColdVerify_local/lib"
	"ColdVerify_local/logs"
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego/cache"
	orm2 "github.com/beego/beego/v2/client/orm"
	_ "github.com/go-sql-driver/mysql"
	"time"
)

// 模板
type Task struct {
	Id                  int    `orm:"column(ID);size(11);auto;pk"`
	T_Distributor_id    string `orm:"size(256);null"`       // 分销商id
	T_class             int    `orm:"size(200);default(0)"` // 分类id
	T_InfoCollection_id string `orm:"size(256);null"`       // 信息采集ID
	T_InfoTemplate_id   string `orm:"size(256);null"`       // 信息采集模版ID

	T_task_id                string `orm:"size(256);null"`     // 任务ID
	T_uuid                   string `orm:"size(256);null"`     // 用户 UUID
	T_name                   string `orm:"size(256);null"`     // 标题
	T_VerifyTemplate_class   string `orm:"size(256);null"`     // 模版id
	T_VerifyTemplate_id      string `orm:"size(256);null"`     // 模版id
	T_deadline               string `orm:"size(256);null"`     // 截止时间
	T_scheme                 string `orm:"size(256);null"`     // 实施方案 负责人UUID
	T_collection             string `orm:"size(256);null"`     // 数据采集 负责人UUID
	T_reporting              string `orm:"size(256);null"`     // 报告编写 负责人UUID
	T_delivery               string `orm:"size(256);null"`     // 交付审核 负责人UUID
	T_scheme_state           int    `orm:"size(2);default(0)"` // 实施方案 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
	T_collection_state       int    `orm:"size(2);default(0)"` // 数据采集 状态 0 未完成 1 数据来源已完成 2 数据来源处理中 3 已采集-无数据 4-APP已提交 5已通过(负责人) 6已退回(负责人)
	T_reporting_state        int    `orm:"size(2);default(0)"` // 报告编写 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
	T_delivery_state         int    `orm:"size(2);default(0)"` // 交付审核 状态 0 未完成 1 已完成 2 处理中
	T_marking_state          int    `orm:"size(2);default(0)"` // 验证标识 状态 0 未完成 1 已完成
	T_examining_report_state int    `orm:"size(2);default(0)"` // 检测报告 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
	T_original_record_state  int    `orm:"size(2);default(0)"` // 原始记录 状态 0 未完成 3 已通过(负责人) 4已退回(负责人) 5已提交
	T_record                 string `orm:"type(text)"`         // 领导备注

	T_VerifyDeviceDataStartTime string `orm:"size(256);null"` // 验证设备数据开始时间
	T_VerifyDeviceDataEndTime   string `orm:"size(256);null"` // 验证设备数据开始时间
	T_BindDeviceDataStartTime   string `orm:"size(256);null"` // 绑定设备数据开始时间
	T_BindDeviceDataEndTime     string `orm:"size(256);null"` // 绑定设备数据结束时间

	T_doc1           string `orm:"type(text);null"` // 封面
	T_pdf1           string `orm:"type(text);null"` // 验证方案
	T_pdf1_watermark string `orm:"type(text);null"` // 验证方案 带水印
	T_pdf1_signature string `orm:"type(text);null"` // 验证方案 带公章
	T_doc2           string `orm:"type(text);null"` // 报告
	T_pdf2           string `orm:"type(text);null"` // 验证报告
	T_pdf2_watermark string `orm:"type(text);null"` // 验证报告 带水印
	T_pdf2_signature string `orm:"type(text);null"` // 验证报告 带公章
	T_doc3           string `orm:"type(text);null"` // 证书
	T_pdf3           string `orm:"type(text);null"` // 证书
	T_pdf4           string `orm:"type(text);null"` // 验证标识
	T_pdf5           string `orm:"type(text);null"` // 检测报告
	T_pdf5_watermark string `orm:"type(text);null"` // 检测报告 带水印
	T_pdf6           string `orm:"type(text);null"` // 原始记录

	T_Show  int `orm:"size(2);default(1)"`   // 0 隐藏   1 公开
	T_Visit int `orm:"size(200);default(0)"` // 浏览量
	T_State int `orm:"size(2);default(1)"`   // 0 删除   1 正常

	T_step int `orm:"size(2);default(-1)"` // 验证步骤

	T_sn                        string `orm:"size(256);null"` // sn
	T_CalibrationExpirationTime string `orm:"size(256);null"` // 校准到期时间

	T_project        string `orm:"size(256);null"` // 项目 负责人UUID
	T_province       string `orm:"size(256);null"` // 省
	T_city           string `orm:"size(256);null"` // 市
	T_district       string `orm:"size(256);null"` // 区
	T_province_code  string `orm:"size(256);null"` // 省 code
	T_city_code      string `orm:"size(256);null"` // 市 code
	T_district_code  string `orm:"size(256);null"` // 区 code
	T_category       string `orm:"size(256);null"` // 类别
	T_device_type    string `orm:"size(256);null"` // 设备类型
	T_volume         string `orm:"size(256);null"` // 规格/容积
	T_verify_type    string `orm:"size(256);null"` // 验证类型
	T_subject_matter string `orm:"size(256);null"` // 标的物名称
	T_temp_range     string `orm:"size(256);null"` // 验证温度范围
	T_report_number  string `orm:"size(256);null"` // 报告编号
	T_report_type    string `orm:"size(256);null"` // 报告类型

	T_start_time    string  `orm:"size(256);null"` // 项目开始时间
	T_end_time      string  `orm:"size(256);null"` // 结束时间 报告审核通过时间
	T_time_interval float64 `orm:"size(256);null"` // 时间间隔 单位分钟
	T_reject_times  int     `orm:"size(256);null"` // 驳回次数 客户退回方案和报告时
	T_reject_record string  `orm:"type(text)"`     // 驳回记录

	// 方案
	T_scheme_start_time    string  `orm:"size(256);null"` // 验证方案开始时间 接收信息采集表的时间
	T_scheme_end_time      string  `orm:"size(256);null"` // 验证方案结束时间 负责人审核通过后最后一次上传时间
	T_scheme_time_interval float64 `orm:"size(256);null"` // 时间间隔 单位分钟
	T_scheme_overtime      float64 `orm:"size(256);null"` // 验证方案超时时间 单位分钟
	T_scheme_signature     string  `orm:"type(text)"`     // 验证方案客户签字确认图片
	T_scheme_return_times  int     `orm:"size(256);null"` // 验证方案退回次数
	T_scheme_audit_record  string  `orm:"type(text)"`     // 验证方案审核记录

	// 实施
	T_enter_area_time          string  `orm:"size(256);null"`  // 进场时间
	T_collection_start_time    string  `orm:"size(256);null"`  // 实施开始时间（app开始验证时间）
	T_collection_end_time      string  `orm:"size(256);null"`  // 实施结束时间 （审核通过后签字确认提交时间）
	T_collection_time_interval float64 `orm:"size(256);null"`  // 时间间隔 单位分钟
	T_collection_overtime      float64 `orm:"size(256);null"`  // 实施超时时间 单位分钟
	T_collection_signature     string  `orm:"type(text)"`      // 实施人员签字确认图片
	T_collection_return_times  int     `orm:"size(256);null"`  // 实施方案退回次数
	T_collection_audit_record  string  `orm:"type(text);null"` // 实施方案审核记录

	// 报告
	T_reporting_start_time    string  `orm:"size(256);null"`  // 验证报告开始时间 接收信息采集表的时间
	T_reporting_end_time      string  `orm:"size(256);null"`  // 验证报告结束时间 负责人审核通过前最后一次上传时间
	T_reporting_time_interval float64 `orm:"size(256);null"`  // 时间间隔 单位分钟
	T_reporting_overtime      float64 `orm:"size(256);null"`  // 验证报告超时时间 单位分钟
	T_reporting_signature     string  `orm:"type(text)"`      // 验证报告客户签字确认图片
	T_reporting_return_times  int     `orm:"size(256);null"`  // 验证报告退回次数
	T_reporting_audit_record  string  `orm:"type(text);null"` // 验证报告审核记录
	T_reporting_pass_time     string  `orm:"size(256);null"`  // 验证报告负责人通过时间

	// 检测报告
	T_examining_report_start_time    string  `orm:"size(256);null"`  // 检测报告开始时间 接收信息采集表的时间
	T_examining_report_end_time      string  `orm:"size(256);null"`  // 检测报告结束时间 负责人审核通过前最后一次上传时间
	T_examining_report_time_interval float64 `orm:"size(256);null"`  // 时间间隔 单位分钟
	T_examining_report_signature     string  `orm:"type(text)"`      // 检测报告客户签字确认图片
	T_examining_report_return_times  int     `orm:"size(256);null"`  // 检测报告退回次数
	T_examining_report_audit_record  string  `orm:"type(text);null"` // 检测报告审核记录

	// 原始记录
	T_original_record_start_time    string  `orm:"size(256);null"`  // 原始记录开始时间 接收信息采集表的时间
	T_original_record_end_time      string  `orm:"size(256);null"`  // 原始记录结束时间 负责人审核通过前最后一次上传时间
	T_original_record_time_interval float64 `orm:"size(256);null"`  // 时间间隔 单位分钟
	T_original_record_signature     string  `orm:"type(text)"`      // 原始记录客户签字确认图片
	T_original_record_return_times  int     `orm:"size(256);null"`  // 原始记录退回次数
	T_original_record_audit_record  string  `orm:"type(text);null"` // 原始记录审核记录

	T_device_quantity int `orm:"size(20);default(0)"`  //  终端数量 T_device_type=WZ 必填
	T_cnas            int `orm:"size(256);default(0)"` // 0-否 1-是

	T_cover  int    `orm:"size(20);default(0)"` // 是否覆盖询问
	T_backup string `orm:"size(256);null"`      // 历史数据记录

	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
}

var redisCache_Task cache.Cache

func init() {
	orm2.RegisterModel(new(Task))
	config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
		"redis_"+"Task", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
	logs.Println(config)
	var err error
	redisCache_Task, err = cache.NewCache("redis", config)
	if err != nil || redisCache_Task == nil {
		errMsg := "failed to init redis"
		logs.Println(errMsg, err)
	}
}

func Redis_Task_Get(key string) (r Task, is bool) {
	if redisCache_Task.IsExist(key) {
		logs.Println("找到key:", key)
		v := redisCache_Task.Get(key)
		json.Unmarshal(v.([]byte), &r)
		return r, true
	}
	logs.Println("没有 找到key:", key)
	return Task{}, false
}
func Redis_CalculateHumps_Set(key string, r CalculateHumps_R) (err error) {
	//json序列化
	str, err := json.Marshal(r)
	if err != nil {
		logs.Error(lib.FuncName(), err)
		return
	}
	err = redisCache_Task.Put(key, str, 30*time.Minute)
	if err != nil {
		logs.Println("set key:", key, ",value:", str, err)
	}
	return
}

func Redis_CalculateHumps_Get(key string) (r CalculateHumps_R, is bool) {
	if redisCache_Task.IsExist(key) {
		logs.Println("找到key:", key)
		v := redisCache_Task.Get(key)
		json.Unmarshal(v.([]byte), &r)
		return r, true
	}
	logs.Println("没有 找到key:", key)
	return CalculateHumps_R{}, false
}
func Redis_Task_Set(key string, r Task) (err error) {
	//json序列化
	str, err := json.Marshal(r)
	if err != nil {
		logs.Error(lib.FuncName(), err)
		return
	}
	err = redisCache_Task.Put(key, str, 24*time.Hour)
	if err != nil {
		logs.Println("set key:", key, ",value:", str, err)
	}
	return
}

func Read_Task(T_task_id string) (r Task, err error) {
	if task, is := Redis_Task_Get(T_task_id); is == true {
		return task, nil
	}

	serverOrm := orm2.NewOrmUsingDB(conf.Server_AliasName)

	qs := serverOrm.QueryTable(new(Task))
	//err := qs.Filter("T_task_id", T_task_id).Filter("T_State", 1).One(&r)
	err = qs.Filter("T_task_id", T_task_id).Filter("T_State", 1).One(&r)
	if err != nil {
		return r, err
	}

	Redis_Task_Set(T_task_id, r)
	return r, nil
}
