package models

import (
	"context"
	"eta/eta_api/models/data_manage"
	"eta/eta_api/utils"
	"fmt"
	"sort"
	"strconv"
	"strings"
	"time"

	"github.com/beego/beego/v2/client/orm"
	"github.com/rdlucklib/rdluck_tools/paging"
)

type DataList struct {
	TradeCode    string  `orm:"column(TRADE_CODE)" description:"指标编码"`
	SecName      string  `orm:"column(SEC_NAME)" description:"指标名称"`
	Unit         string  `orm:"column(UNIT)" description:"单位"`
	Remark       string  `orm:"column(REMARK)" description:"备注"`
	Frequency    string  `description:"频度"`
	ClassifyId   int     `description:"分类id"`
	ClassifyName string  `description:"分类名称"`
	Dt           string  `orm:"column(DT)" description:"录入日期"`
	Close        float64 `orm:"column(CLOSE)" description:"录入值"`
	ModifyTime   string  `description:"修改时间"`
}

type DataListResp struct {
	List   []*DataList
	Paging *paging.PagingItem `description:"分页数据"`
}

func GetDataList(condition string, pars []interface{}, startSize, pageSize int) (items []*DataList, err error) {
	sql := `select a.TRADE_CODE,a.SEC_NAME,a.UNIT,a.frequency,a.classify_id,b.classify_name,c.DT,c.CLOSE,c.modify_time FROM edbdata AS c
                inner join edbinfo AS a ON a.TRADE_CODE=c.TRADE_CODE
                left join edbdata_classify AS b ON a.classify_id=b.classify_id
                where a.classify_id>0`
	if condition != "" {
		sql += condition
	}
	sql += ` order by c.DT desc limit ?,? `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
	return
}

func GetDataListCount(condition string, pars []interface{}) (count int, err error) {
	sql := ` select count(1) as count FROM edbdata AS c
                    inner join edbinfo AS a ON a.TRADE_CODE=c.TRADE_CODE    
                    left join edbdata_classify AS b ON a.classify_id=b.classify_id
                    where a.classify_id>0 `
	if condition != "" {
		sql += condition
	}
	o := orm.NewOrmUsingDB("edb")
	err = o.Raw(sql, pars).QueryRow(&count)
	return
}

type DataAddReq struct {
	TradeCode  string `description:"指标唯一编码"`
	CreateDate string `description:"创建日期"`
	Close      string `description:"录入值"`
}

type Edbdata struct {
	TradeCode  string    `orm:"column(TRADE_CODE);pk" description:"指标编码"`
	Dt         string    `orm:"column(DT)" description:"日期"`
	Close      string    `orm:"column(CLOSE)" description:"值"`
	ModifyTime time.Time `orm:"column(modify_time)" description:"修改时间"`
}

type EdbDataNextDateTime struct {
	TradeCode  string    `orm:"column(TRADE_CODE);pk" description:"指标编码"`
	Dt         string    `orm:"column(DT)" description:"日期"`
	Close      string    `orm:"column(CLOSE)" description:"值"`
	ModifyTime time.Time `orm:"column(modify_time)" description:"修改时间"`

	NextDateTime string `description:"下期日期"`
}

func GetDataInfo(tradeCode, creteDate string) (item *Edbdata, err error) {
	sql := " SELECT * FROM edbdata WHERE TRADE_CODE=? AND DT=? "
	o := orm.NewOrmUsingDB("edb")
	err = o.Raw(sql, tradeCode, creteDate).QueryRow(&item)
	return
}

func AddEdbdata(item *Edbdata) (lastId int64, err error) {
	o := orm.NewOrmUsingDB("edb")
	lastId, err = o.Insert(item)
	return
}

type DataEditReq struct {
	TradeCode     string      `description:"指标唯一编码"`
	CreateDate    string      `description:"创建日期"`
	Close         interface{} `description:"录入值"`
	OldCreateDate string      `description:"旧的录入日期"`
}

// BatchDataEditReq 批量修改指标
type BatchDataEditReq struct {
	OldCreateDate string        `description:"旧的录入日期"`
	CreateDate    string        `description:"新的录入日期"`
	List          []DataEditReq `description:"需要修改的数据"`
}

// 编辑数据
func EditEdbdata(item *Edbdata) (err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := ` UPDATE edbdata SET CLOSE = ?,modify_time=NOW() WHERE TRADE_CODE = ? AND DT = ? `
	_, err = o.Raw(sql, item.Close, item.TradeCode, item.Dt).Exec()
	return
}

type EdbdataDeleteRecord struct {
	Id         int       `orm:"column(id);pk"`
	TradeCode  string    `orm:"column(TRADE_CODE)" description:"指标编码"`
	Dt         string    `orm:"column(DT)" description:"日期"`
	Close      string    `orm:"column(CLOSE)" description:"值"`
	ModifyTime time.Time `orm:"column(modify_time)" description:"修改时间"`
	CreateTime time.Time
	SysUserId  int
}

func AddEdbdataDeleteRecord(item *EdbdataDeleteRecord) (lastId int64, err error) {
	o := orm.NewOrmUsingDB("edb")
	lastId, err = o.Insert(item)
	return
}

// DeleteEdbData 根据指标code和日期删除数据
func DeleteEdbData(tradeCode, dt string) (err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := ` DELETE FROM edbdata WHERE TRADE_CODE = ? AND DT = ? `
	_, err = o.Raw(sql, tradeCode, dt).Exec()
	return
}

// DeleteAllEdbData 根据指标code删除数据
func DeleteAllEdbData(tradeCode string) (err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := ` DELETE FROM edbdata WHERE TRADE_CODE = ? `
	_, err = o.Raw(sql, tradeCode).Exec()
	return
}

type Edbinfo struct {
	TradeCode    string  `orm:"column(TRADE_CODE);pk" description:"指标code"`
	SecName      string  `orm:"column(SEC_NAME);" description:"指标名称"`
	Unit         string  `orm:"column(UNIT);" description:"单位"`
	Remark       string  `orm:"column(REMARK);" description:"备注"`
	Frequency    string  `orm:"column(frequency)" description:"频度"`
	ClassifyId   int     `orm:"column(classify_id)" description:"分类id"`
	ClassifyName string  `orm:"-" description:"分类名称"`
	CreateDate   string  `orm:"column(create_date)" description:"创建时间"`
	UserId       int     `orm:"column(user_id)" description:"录入用户id"`
	UserName     string  `orm:"column(user_name)" description:"录入用户名称"`
	NoticeTime   string  `orm:"column(notice_time)" description:"通知时间"`
	Mobile       string  `orm:"column(mobile)" description:"录入者手机号"`
	Sort         int     `orm:"column(sort)" description:"排序"`
	ModifyTime   string  `description:"最近一次更新时间"`
	IsJoinEdb    int8    `description:"指标库是否已添加:0-否;1-是"`
	StartDate    string  `description:"数据开始日期"`
	EndDate      string  `description:"数据结束日期"`
	LatestValue  float64 `description:"指标最新值"`
}

func DeleteEdbinfoByTraceCodeList(tradeCodeList []string) (err error) {
	if len(tradeCodeList) == 0 {
		return
	}
	o := orm.NewOrmUsingDB("edb")
	err = o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
		var holder []string
		for range tradeCodeList {
			holder = append(holder, "?")
		}
		sql := ` DELETE FROM edbdata WHERE TRADE_CODE in (` + strings.Join(holder, ",") + `) `
		_, err := txOrm.Raw(sql, tradeCodeList).Exec()
		if err != nil {
			return err
		}
		sql = ` DELETE FROM edbinfo WHERE TRADE_CODE in (` + strings.Join(holder, ",") + `)`
		_, err = txOrm.Raw(sql, tradeCodeList).Exec()
		if err != nil {
			return err
		}
		return nil
	})
	return
}

func GetEdbinfoListCount(condition string, pars []interface{}, mobile string, roleType int) (count int, err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := ``
	if mobile != "" && roleType == 1 {
		sql = `SELECT COUNT(1) AS count FROM edbinfo AS a 
             INNER JOIN edbinfo_user AS c ON a.TRADE_CODE=c.TRADE_CODE AND c.mobile=?
             WHERE a.classify_id>0`

		if condition != "" {
			sql += condition
		}
		err = o.Raw(sql, mobile, pars).QueryRow(&count)
	} else {
		sql := `SELECT COUNT(1) AS count FROM edbinfo AS a WHERE a.classify_id>0`

		if condition != "" {
			sql += condition
		}
		err = o.Raw(sql, pars).QueryRow(&count)
	}
	return
}

type EdbinfoItem struct {
	TradeCode    string  `orm:"column(TRADE_CODE);pk" description:"指标code"`
	SecName      string  `orm:"column(SEC_NAME);" description:"指标名称"`
	Unit         string  `orm:"column(UNIT);" description:"单位"`
	Remark       string  `orm:"column(REMARK);" description:"备注"`
	Frequency    string  `description:"频度"`
	ClassifyId   int     `description:"分类id"`
	ClassifyName string  `description:"分类名称"`
	CreateDate   string  `description:"创建时间"`
	UserId       int     `description:"录入用户id"`
	UserName     string  `description:"录入用户名称"`
	NoticeTime   string  `description:"通知时间"`
	Mobile       string  `description:"录入者手机号"`
	ModifyTime   string  `description:"最近一次更新时间"`
	StartDate    string  `description:"数据开始日期"`
	EndDate      string  `description:"数据结束日期"`
	LatestValue  float64 `description:"指标最新值"`
}

func GetEdbinfoItemList(condition string, pars []interface{}, startSize, pageSize int, mobile string, roleType int) (items []*EdbinfoItem, err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := ``
	if mobile != "" && roleType == 1 {
		sql = ` SELECT DISTINCT a.*,b.classify_name FROM edbinfo AS a
                    LEFT JOIN edbdata_classify AS b ON a.classify_id=b.classify_id
                    INNER JOIN edbinfo_user AS c ON a.TRADE_CODE=c.TRADE_CODE AND c.mobile=?
                    WHERE a.classify_id>0`
		if condition != "" {
			sql += condition
		}
		sql += ` ORDER BY a.create_date DESC LIMIT ?,? `
		_, err = o.Raw(sql, mobile, pars, startSize, pageSize).QueryRows(&items)
	} else {
		sql = `SELECT DISTINCT a.*,b.classify_name FROM edbinfo AS a
                     LEFT JOIN edbdata_classify AS b on a.classify_id=b.classify_id
                     WHERE a.classify_id>0`
		if condition != "" {
			sql += condition
		}
		sql += ` ORDER BY a.create_date DESC LIMIT ?,? `
		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
	}
	return
}

// EdbParamsInfo 指标数据结构体
type EdbParamsInfo struct {
	Unit      string `orm:"column(UNIT);" description:"单位"`
	Frequency string `orm:"column(frequency);" description:"单位"`
}

// GetEdbUnitList 获取指标单位
func GetEdbUnitList() (items []*EdbParamsInfo, err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := `SELECT UNIT from edbinfo group by UNIT`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// GetEdbFrequencyList 获取指标频度
func GetEdbFrequencyList(classifyId, userId int) (items []*EdbParamsInfo, err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := `SELECT frequency from edbinfo a 
join edbdata b on a.TRADE_CODE=b.TRADE_CODE
 where classify_id = ? `
	if userId > 0 {
		sql += ` and a.user_id = ` + fmt.Sprint(userId) + ` `
	}
	sql += ` group by a.frequency`
	_, err = o.Raw(sql, classifyId).QueryRows(&items)
	return
}

type TargetListResp struct {
	List   []*EdbinfoItem
	Paging *paging.PagingItem `description:"分页数据"`
}

type EdbinfoAddReq struct {
	SecName    string `description:"指标名称"`
	Unit       string `description:"单位"`
	Frequency  string `description:"频度"`
	ClassifyId int    `description:"分类id"`
	NoticeTime string `description:"通知时间"`
}

// GetMaxTradeCode 获取指标最大trade_code
func GetMaxTradeCode() (max_trade_code string, err error) {
	sql := " SELECT MAX(TRADE_CODE) AS max_trade_code FROM edbinfo WHERE LEFT(TRADE_CODE,1)='W' "
	o := orm.NewOrmUsingDB("edb")
	err = o.Raw(sql).QueryRow(&max_trade_code)
	if (err != nil && err.Error() == utils.ErrNoRow()) || max_trade_code == `` {
		max_trade_code = "W00"
	}
	return
}

func GetEdbinfoBySecName(secName string) (item *Edbinfo, err error) {
	sql := `SELECT * FROM edbinfo WHERE SEC_NAME=? `
	o := orm.NewOrmUsingDB("edb")
	err = o.Raw(sql, secName).QueryRow(&item)
	return
}

func GetEdbinfoByTradeCode(tradeCode string) (item *Edbinfo, err error) {
	sql := `SELECT * FROM edbinfo WHERE TRADE_CODE=? `
	o := orm.NewOrmUsingDB("edb")
	err = o.Raw(sql, tradeCode).QueryRow(&item)
	return
}

func AddEdbinfo(tradeCode, secName, unit, remark, frequency, noticeTime string, classifyId int, userId int, userName string) (err error) {
	o := orm.NewOrmUsingDB("edb")
	currTime := time.Now().Format(utils.FormatDateTime)
	edbInfo := &Edbinfo{
		TradeCode:  tradeCode,
		SecName:    secName,
		Unit:       unit,
		Remark:     remark,
		Frequency:  frequency,
		ClassifyId: classifyId,
		CreateDate: currTime,
		UserId:     userId,
		UserName:   userName,
		NoticeTime: noticeTime,
		Mobile:     "",
		ModifyTime: currTime,
		IsJoinEdb:  0,
	}
	_, err = o.Insert(edbInfo)
	return
}

func AddEdbinfoUser(tradeCode, mobile string) (err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := `INSERT INTO edbinfo_user(TRADE_CODE, mobile) VALUES (?,?)`
	_, err = o.Raw(sql, tradeCode, mobile).Exec()
	return
}

type EdbinfoEditReq struct {
	TradeCode  string `description:"指标code"`
	SecName    string `description:"指标名称"`
	Unit       string `description:"单位"`
	Frequency  string `description:"频度"`
	ClassifyId int    `description:"分类id"`
	NoticeTime string `description:"通知时间"`
}

func EditEdbinfo(tradeCode, secName, unit, frequency, noticeTime string, classifyId int) (err error) {
	sql := `UPDATE edbinfo SET SEC_NAME= ?, UNIT = ?,classify_id=?,frequency=?,notice_time=?,create_date=NOW() WHERE TRADE_CODE=? `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, secName, unit, classifyId, frequency, noticeTime, tradeCode).Exec()
	return
}

func SearchTargetEntry(classifyId int, keyWord string) (items []*Edbinfo, err error) {
	where := ""
	pars := make([]interface{}, 0)
	sql := `SELECT * FROM edbinfo WHERE classify_id>0 AND classify_id=? `
	pars = append(pars, classifyId)
	if keyWord != "" {
		sql += `AND SEC_NAME LIKE ? `
		pars = utils.GetLikeKeywordPars(pars, keyWord, 1)
	}
	sql += where
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, pars...).QueryRows(&items)
	return
}

type SearchTargetListResp struct {
	List []*Edbinfo
}

type EdbdataClassify struct {
	ClassifyId   int
	ClassifyName string
	ParentId     int
	EdbInfoTotal int
	TradeCode    string
	UniqueCode   string
}

func GetEdbdataClassifyByClassifyName(classifyName string) (item *EdbdataClassify, err error) {
	sql := `SELECT * FROM edbdata_classify WHERE classify_name=? `
	o := orm.NewOrmUsingDB("edb")
	err = o.Raw(sql, classifyName).QueryRow(&item)
	return
}

type EdbdataClassifyList struct {
	ClassifyId   int
	ClassifyName string
	ParentId     int
	Child        []*EdbdataClassify
	TradeCode    string
	UniqueCode   string
}

func GetEdbdataClassify(userId int64) (items []*EdbdataClassifyList, err error) {
	var newItems []*EdbdataClassifyList
	o := orm.NewOrmUsingDB("edb")
	sql := ` SELECT classify_id,classify_name,parent_id FROM edbdata_classify WHERE parent_id=0 `
	_, err = o.Raw(sql).QueryRows(&newItems)
	if err != nil {
		return
	}
	classifyLen := len(newItems)

	// 获取子集分类
	var allChildItems []*EdbdataClassify
	if userId > 0 {
		userClassifyList, _ := GetManualUserClassify(int(userId))
		var userIdArr []int
		for _, v := range userClassifyList {
			userIdArr = append(userIdArr, v.ClassifyId)
		}
		num := len(userClassifyList)
		if num > 0 {
			childSql := "SELECT a.classify_id,a.classify_name,a.parent_id FROM edbdata_classify AS a WHERE a.is_show=1 and a.classify_id IN(" + utils.GetOrmInReplace(num) + ") ORDER BY a.create_time ASC "
			_, err = o.Raw(childSql, userIdArr).QueryRows(&allChildItems)
		}
	} else {
		childSql := "SELECT classify_id,classify_name,parent_id FROM edbdata_classify WHERE is_show=1 ORDER BY create_time ASC "
		_, err = o.Raw(childSql).QueryRows(&allChildItems)
	}
	if err != nil {
		return
	}

	for i := 0; i < classifyLen; i++ {
		var childItems []*EdbdataClassify
		parentId := newItems[i].ClassifyId
		for _, v := range allChildItems {
			if v.ParentId == parentId {
				childItems = append(childItems, v)
			}
		}
		newItems[i].Child = childItems
	}
	for _, v := range newItems {
		childLen := len(v.Child)
		if childLen > 0 {
			items = append(items, v)
		}
	}
	return
}

type ManualUserClassify struct {
	ManualUserClassifyId int `orm:"column(manual_user_classify_id);pk"`
	AdminId              int
	ClassifyId           int
	CreateTime           time.Time
}

func GetManualUserClassify(sysUserId int) (list []*ManualUserClassify, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := `SELECT * FROM manual_user_classify WHERE admin_id=? `
	_, err = o.Raw(sql, sysUserId).QueryRows(&list)
	return
}

type EdbdataClassifyResp struct {
	List []*EdbdataClassifyList
}

func GetTargetBySecName(secName string) (item *Edbinfo, err error) {
	sql := `SELECT * FROM edbinfo WHERE SEC_NAME=? `
	o := orm.NewOrmUsingDB("edb")
	err = o.Raw(sql, secName).QueryRow(&item)
	return
}

// 更新指标数据信息
func (edbinfo *Edbinfo) Update(cols []string) (err error) {
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Update(edbinfo, cols...)
	return
}

func ModifyTargetClassifyId(tradeCode string, classifyId int) (err error) {
	sql := `UPDATE edbinfo SET classify_id=? WHERE TRADE_CODE=? `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, classifyId, tradeCode).Exec()
	return
}

func GetTargetsDataCount(tradeCode, dt string) (count int, err error) {
	sql := `SELECT COUNT(1) AS count FROM edbdata WHERE TRADE_CODE=? AND DT=? `
	o := orm.NewOrmUsingDB("edb")
	err = o.Raw(sql, tradeCode, dt).QueryRow(&count)
	return
}

// GetTargetsDataList 根据code获取指标数据列表
func GetTargetsDataList(tradeCode string) (items []*Edbdata, err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := `SELECT * FROM edbdata WHERE TRADE_CODE=? ORDER BY DT ASC `
	_, err = o.Raw(sql, tradeCode).QueryRows(&items)
	return
}

func GetTargetsData(tradeCode, dt string) (item *Edbdata, err error) {
	sql := `SELECT * FROM edbdata WHERE TRADE_CODE=? AND DT=? `
	o := orm.NewOrmUsingDB("edb")
	err = o.Raw(sql, tradeCode, dt).QueryRow(&item)
	return
}

func ModifyTargetsDataByImport(tradeCode, dt, close string) (err error) {
	sql := `UPDATE  edbdata SET CLOSE=?,modify_time=NOW() WHERE  TRADE_CODE=? AND DT=? `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, close, tradeCode, dt).Exec()
	return
}

func AddTargetsDataByImport(tradeCode, dt, close string) (err error) {
	sql := `INSERT INTO edbdata(TRADE_CODE, DT,CLOSE, modify_time)VALUES(?,?,?,NOW()) `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, tradeCode, dt, close).Exec()
	return
}

type EdbdataImportResp struct {
	Status       int
	Msg          string
	SuccessCount int
	FailCount    int
	IndexCount   int `description:"指标数"`
}

func GetFailList(sysUserId int) (items []*EdbdataImportFail, err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := ` SELECT * FROM edbdata_import_fail WHERE sys_user_id=? `
	_, err = o.Raw(sql, sysUserId).QueryRows(&items)
	return
}

type DataListForExport struct {
	TradeCode    string `orm:"column(TRADE_CODE)" description:"指标code"`
	SecName      string `orm:"column(SEC_NAME)" description:"指标名称"`
	Unit         string `orm:"column(UNIT)" description:"单位"`
	Frequency    string `description:"频度"`
	ClassifyId   int    `description:"分类id"`
	NoticeTime   string `description:"通知时间"`
	ClassifyName string
	Dt           string  `orm:"column(DT)" description:"日期"`
	Close        float64 `orm:"column(CLOSE)" description:"值"`
}

func GetDataListForExport(startDate, endDate, frequency, keyWord string, classifyId int) (items []*DataListForExport, err error) {
	where := ``
	var pars []interface{}
	if keyWord != "" {
		where = ` AND SEC_NAME LIKE ? `
		pars = utils.GetLikeKeywordPars(pars, keyWord, 1)
	}
	if startDate != "" {
		where += ` AND create_date>=? `
		pars = append(pars, startDate)
	}
	if endDate != "" {
		where += ` AND create_date<=? `
		pars = append(pars, endDate)
	}
	if frequency != "" {
		where += ` AND frequency=? `
		pars = append(pars, frequency)
	}
	if classifyId > 0 {
		where += ` AND classify_id=? `
		pars = append(pars, classifyId)
	}

	sql := ` SELECT a.TRADE_CODE,a.SEC_NAME,a.UNIT,a.frequency,a.classify_id,b.classify_name,c.DT,c.CLOSE FROM edbdata AS c
                INNER JOIN edbinfo AS a ON a.TRADE_CODE=c.TRADE_CODE
                LEFT JOIN edbdata_classify AS b ON a.classify_id=b.classify_id
                WHERE a.classify_id>0 `
	if where != "" {
		sql += where
	}
	sql = sql + " ORDER BY c.DT DESC "
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}

type DataDeleteReq struct {
	TradeCode  string `description:"指标唯一编码"`
	CreateDate string `description:"数据录入日期"`
}

func DataDelete(tradeCode, createDate, close string, modifyTime time.Time, sysUserId int) (err error) {
	o := orm.NewOrmUsingDB("edb")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()
	recordSql := ` INSERT INTO edbdata_delete_record(TRADE_CODE,DT,CLOSE,modify_time,create_time,sys_user_id) 
                 VALUES(?,?,?,?,?,?)`
	_, err = to.Raw(recordSql, tradeCode, createDate, close, modifyTime, time.Now(), sysUserId).Exec()
	sql := ` DELETE FROM edbdata WHERE TRADE_CODE = ? AND DT = ? `
	_, err = to.Raw(sql, tradeCode, createDate).Exec()
	return
}

func GetTargetInfoCount(tradeCode string) (count int, err error) {
	sql := ` SELECT COUNT(1) AS count FROM edbdata AS c
           INNER JOIN edbinfo AS a ON a.TRADE_CODE=c.TRADE_CODE
           WHERE a.TRADE_CODE=? `
	o := orm.NewOrmUsingDB("edb")
	err = o.Raw(sql, tradeCode).QueryRow(&count)
	return
}

type TargetDeleteReq struct {
	TradeCode string `description:"指标唯一编码"`
}

func TargetDelete(tradeCode string) (err error) {
	o := orm.NewOrmUsingDB("edb")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()

	sql := " DELETE FROM edbinfo WHERE TRADE_CODE = ? "
	_, err = to.Raw(sql, tradeCode).Exec()

	sql = " DELETE FROM edbdata WHERE TRADE_CODE = ? "
	_, err = to.Raw(sql, tradeCode).Exec()

	return
}

type Researcher struct {
	AdminId     int    `description:"系统用户id"`
	AdminName   string `description:"系统用户名称"`
	RealName    string `description:"系统用户姓名"`
	Role        string `description:"系统用户角色"`
	Mobile      string `description:"手机号"`
	TargetCount int    `description:"指标数量"`
}

type ResearcherListResp struct {
	List []*Researcher
}

func GetResearcherEntry() (items []*Researcher, err error) {
	sql := ` SELECT admin_id,admin_name,real_name,mobile,0 as target_count FROM admin WHERE role_type=1 `
	o := orm.NewOrm()
	_, err = o.Raw(sql).QueryRows(&items)
	researchLen := len(items)
	edbO := orm.NewOrmUsingDB("edb")
	for i := 0; i < researchLen; i++ {
		var count int
		mobile := items[i].Mobile
		sqlCount := ` SELECT COUNT(DISTINCT a.TRADE_CODE) AS count FROM  edbinfo_user AS a
            INNER JOIN edbinfo AS b ON a.TRADE_CODE=b.TRADE_CODE
            WHERE a.mobile=? AND b.classify_id>0 `
		err = edbO.Raw(sqlCount, mobile).QueryRow(&count)
		items[i].TargetCount = count
	}
	return
}

func GetResearcherEntryByMobile(mobile string) (items []*Researcher, err error) {
	sql := ` SELECT admin_id,admin_name,real_name,mobile,0 as target_count FROM admin WHERE  role_type=1 `
	if mobile != "" {
		sql += ` AND mobile IN(` + mobile + `)`
	}
	o := orm.NewOrm()
	_, err = o.Raw(sql).QueryRows(&items)
	researchLen := len(items)
	edbO := orm.NewOrmUsingDB("edb")
	for i := 0; i < researchLen; i++ {
		var count int
		mobile := items[i].Mobile
		sqlCount := ` SELECT COUNT(DISTINCT a.TRADE_CODE) AS count FROM  edbinfo_user AS a
            INNER JOIN edbinfo AS b ON a.TRADE_CODE=b.TRADE_CODE
            WHERE a.mobile=? AND b.classify_id>0 `
		err = edbO.Raw(sqlCount, mobile).QueryRow(&count)
		items[i].TargetCount = count
	}
	return
}

type EdbinfoItems struct {
	TradeCode    string `orm:"column(TRADE_CODE);pk" description:"指标code"`
	SecName      string `orm:"column(SEC_NAME);" description:"指标名称"`
	Unit         string `orm:"column(UNIT);" description:"单位"`
	Remark       string `orm:"column(REMARK);" description:"备注"`
	Frequency    string `description:"频度"`
	ClassifyId   int    `description:"分类id"`
	ClassifyName string `description:"分类名称"`
	CreateDate   string `description:"创建时间"`
	UserId       int    `description:"录入用户id"`
	NoticeTime   string `description:"通知时间"`
	Mobile       string `description:"录入者手机号"`
	ModifyDate   string `description:"待更新日期"`
	Status       string `description:"状态:未完成/完成"`
}

type TargetItemsResp struct {
	List SortEdbInfo
}

type SortEdbInfo []EdbinfoItems

func GetTargetItems(mobile string, classifyId int) (lastItems SortEdbInfo, err error) {
	var items []*EdbinfoItems
	o := orm.NewOrmUsingDB("edb")
	//sql := ` SELECT *,'' modify_date,'' status FROM edbinfo AS a WHERE a.classify_id>0 `

	sql := ` SELECT *,'' modify_date,'' STATUS FROM edbinfo AS a 
            WHERE a.classify_id>0
             `
	if classifyId > 0 {
		sql += ` AND a.classify_id=` + strconv.Itoa(classifyId) + ``
	}
	sql += ` GROUP BY a.TRADE_CODE `

	//if classifyId > 0 {
	//	sql = ` SELECT *,'' modify_date,'' status FROM edbinfo AS a
	//        WHERE a.classify_id=` + strconv.Itoa(classifyId) + ` AND a.classify_id>0
	//         GROUP BY a.TRADE_CODE `
	//}

	sql = sql + ` ORDER BY CONVERT(a.SEC_NAME USING gbk )  COLLATE gbk_chinese_ci ASC `
	_, err = o.Raw(sql).QueryRows(&items)
	if err != nil {
		return
	}
	itemsLen := len(items)
	nowWeek := time.Now().Weekday().String()

	fmt.Println(nowWeek)
	finishEdbInfo := SortEdbInfo{}
	unFinishEdbInfo := SortEdbInfo{}

	for i := 0; i < itemsLen; i++ {
		noticeTime := items[i].NoticeTime
		frequency := items[i].Frequency
		tradeCode := items[i].TradeCode
		if noticeTime != "" {
			if frequency == "周度" {
				noticeArr := strings.Split(noticeTime, " ")
				noticeWeek := noticeArr[0]
				fmt.Println(noticeWeek)
				addDay := 0

				if nowWeek == "Sunday" {
					if noticeWeek == "周日" {
						addDay = 0
					} else if noticeWeek == "周一" {
						addDay = 1
					} else if noticeWeek == "周二" {
						addDay = 2
					} else if noticeWeek == "周三" {
						addDay = 3
					} else if noticeWeek == "周四" {
						addDay = 4
					} else if noticeWeek == "周五" {
						addDay = 5
					} else if noticeWeek == "周六" {
						addDay = 6
					} else {
						addDay = 0
					}
				} else if nowWeek == "Monday" {
					if noticeWeek == "周日" {
						addDay = 6
					} else if noticeWeek == "周一" {
						addDay = 0
					} else if noticeWeek == "周二" {
						addDay = 1
					} else if noticeWeek == "周三" {
						addDay = 2
					} else if noticeWeek == "周四" {
						addDay = 3
					} else if noticeWeek == "周五" {
						addDay = 4
					} else if noticeWeek == "周六" {
						addDay = 5
					} else {
						addDay = 0
					}
				} else if nowWeek == "Tuesday" {
					if noticeWeek == "周日" {
						addDay = 5
					} else if noticeWeek == "周一" {
						addDay = 6
					} else if noticeWeek == "周二" {
						addDay = 0
					} else if noticeWeek == "周三" {
						addDay = 1
					} else if noticeWeek == "周四" {
						addDay = 2
					} else if noticeWeek == "周五" {
						addDay = 3
					} else if noticeWeek == "周六" {
						addDay = 4
					} else {
						addDay = 0
					}
				} else if nowWeek == "Wednesday" {
					if noticeWeek == "周日" {
						addDay = 4
					} else if noticeWeek == "周一" {
						addDay = 5
					} else if noticeWeek == "周二" {
						addDay = 6
					} else if noticeWeek == "周三" {
						addDay = 0
					} else if noticeWeek == "周四" {
						addDay = 1
					} else if noticeWeek == "周五" {
						addDay = 2
					} else if noticeWeek == "周六" {
						addDay = 3
					} else {
						addDay = 0
					}
				} else if nowWeek == "Thursday" {
					if noticeWeek == "周日" {
						addDay = 3
					} else if noticeWeek == "周一" {
						addDay = 4
					} else if noticeWeek == "周二" {
						addDay = 5
					} else if noticeWeek == "周三" {
						addDay = 6
					} else if noticeWeek == "周四" {
						addDay = 0
					} else if noticeWeek == "周五" {
						addDay = 1
					} else if noticeWeek == "周六" {
						addDay = 2
					} else {
						addDay = 0
					}
				} else if nowWeek == "Friday" {
					if noticeWeek == "周日" {
						addDay = 2
					} else if noticeWeek == "周一" {
						addDay = 3
					} else if noticeWeek == "周二" {
						addDay = 4
					} else if noticeWeek == "周三" {
						addDay = 5
					} else if noticeWeek == "周四" {
						addDay = 6
					} else if noticeWeek == "周五" {
						addDay = 0
					} else if noticeWeek == "周六" {
						addDay = 1
					} else {
						addDay = 0
					}
				} else if nowWeek == "Saturday" {
					if noticeWeek == "周日" {
						addDay = 1
					} else if noticeWeek == "周一" {
						addDay = 2
					} else if noticeWeek == "周二" {
						addDay = 3
					} else if noticeWeek == "周三" {
						addDay = 4
					} else if noticeWeek == "周四" {
						addDay = 5
					} else if noticeWeek == "周五" {
						addDay = 6
					} else if noticeWeek == "周六" {
						addDay = 0
					} else {
						addDay = 0
					}
				}

				modifyDate := time.Now().AddDate(0, 0, addDay)
				modifyDateStr := modifyDate.Format(utils.FormatDate)
				items[i].ModifyDate = modifyDateStr

				modifyDateEndStr := modifyDate.AddDate(0, 0, -7).Format(utils.FormatDate)

				fmt.Println("addDay:", addDay)
				fmt.Println("modifyDateEndStr:", modifyDateEndStr)

				count := 0
				sqlCount := ` SELECT COUNT(1) AS num FROM edbdata WHERE TRADE_CODE=? AND DT >= ? AND DT <= ? `
				err = o.Raw(sqlCount, tradeCode, modifyDateEndStr, modifyDateStr).QueryRow(&count)
				if err != nil {
					return nil, err
				}
				if count > 0 {
					items[i].Status = "完成"
					finishEdbInfo = append(finishEdbInfo, *items[i])
				} else {
					items[i].Status = "未完成"
					unFinishEdbInfo = append(unFinishEdbInfo, *items[i])
				}
			} else if frequency == "日度" {
				items[i].Status = "完成"
				finishEdbInfo = append(finishEdbInfo, *items[i])
			} else if frequency == "月度" {
				myYear := time.Now().Year()
				myMonth := time.Now().Format("01")
				startDate, endDate := utils.GetMonthStartAndEnd(strconv.Itoa(myYear), myMonth)
				count := 0
				sqlCount := ` SELECT COUNT(1) AS num FROM edbdata WHERE TRADE_CODE=? AND DT >= ? AND DT <= ? `
				err = o.Raw(sqlCount, tradeCode, startDate, endDate).QueryRow(&count)
				if err != nil {
					return nil, err
				}
				if noticeTime != "" {
					var modifyDateStr string
					strArr := strings.Split(noticeTime, "日")
					myYear := time.Now().Year()
					myMonth := time.Now().Format("01")
					modifyDateStr = strconv.Itoa(myYear) + "-" + myMonth + "-" + strArr[0]
					items[i].ModifyDate = modifyDateStr
				}
				if count > 0 {
					items[i].Status = "完成"
					finishEdbInfo = append(finishEdbInfo, *items[i])
				} else {
					items[i].Status = "未完成"
					unFinishEdbInfo = append(unFinishEdbInfo, *items[i])
				}
			} else {
				items[i].Status = "完成"
				finishEdbInfo = append(finishEdbInfo, *items[i])
			}
		} else {
			if frequency == "月度" {
				myYear := time.Now().Year()
				myMonth := time.Now().Format("01")
				startDate, endDate := utils.GetMonthStartAndEnd(strconv.Itoa(myYear), myMonth)
				count := 0
				sqlCount := ` SELECT COUNT(1) AS num FROM edbdata WHERE TRADE_CODE=? AND DT >= ? AND DT <= ? `
				err = o.Raw(sqlCount, tradeCode, startDate, endDate).QueryRow(&count)
				if err != nil {
					return nil, err
				}
				if count > 0 {
					items[i].Status = "完成"
					finishEdbInfo = append(finishEdbInfo, *items[i])
				} else {
					items[i].Status = "未完成"
					unFinishEdbInfo = append(unFinishEdbInfo, *items[i])
				}
			} else {
				items[i].Status = "完成"
				finishEdbInfo = append(finishEdbInfo, *items[i])
			}
		}
	}
	sort.Sort(SortByModifyDate{finishEdbInfo})
	sort.Sort(SortByModifyDate{unFinishEdbInfo})
	lastItems = append(lastItems, unFinishEdbInfo...)
	lastItems = append(lastItems, finishEdbInfo...)
	return
}

// 获取此 slice 的长度
func (p SortEdbInfo) Len() int { return len(p) }

// 根据元素的状态降序排序
func (p SortEdbInfo) Less(i, j int) bool {
	return p[i].Status > p[j].Status
}

// 交换数据
func (p SortEdbInfo) Swap(i, j int) { p[i], p[j] = p[j], p[i] }

// 嵌套结构体  将继承 SortEdbInfo 的所有属性和方法
// 所以相当于SortByName 也实现了 Len() 和 Swap() 方法
type SortByStatus struct{ SortEdbInfo }

// 根据元素的姓名长度降序排序 (此处按照自己的业务逻辑写)
func (p SortByStatus) Less(i, j int) bool {
	return len(p.SortEdbInfo[i].Status) > len(p.SortEdbInfo[j].Status)
}

type SortByModifyDate struct{ SortEdbInfo }

// 根据元素的年龄降序排序 (此处按照自己的业务逻辑写)
func (p SortByModifyDate) Less(i, j int) bool {
	return p.SortEdbInfo[i].ModifyDate > p.SortEdbInfo[j].ModifyDate
}

type DataCheckResp struct {
	Status int    `description:"状态:1:该日期已存在数据,是否确认修改?,0:数据不存在"`
	Close  string `description:"值"`
}

type TargetCheckResp struct {
	Status int `description:"状态:1:该指标有关联数据,请先删除数据,0:指标不存在关联数据,可直接删除"`
}

type EdbdataExportList struct {
	TradeCode    string `orm:"column(TRADE_CODE);" description:"指标code"`
	SecName      string `orm:"column(SEC_NAME);" description:"指标名称"`
	Unit         string `orm:"column(UNIT);" description:"单位"`
	Remark       string `orm:"column(REMARK);" description:"备注"`
	Frequency    string `description:"频度"`
	ClassifyId   int    `description:"分类id"`
	ClassifyName string `description:"分类名称"`
	CreateDate   string `description:"创建时间"`
	Dt           string `orm:"column(Dt);" description:"最新一次录入时间"`
}

func GetEdbdataSecName(condition string, pars []interface{}) (items []*EdbdataExportList, err error) {
	//sql := `SELECT a.TRADE_CODE,a.SEC_NAME,a.frequency,a.UNIT,MAX(c.DT) AS Dt
	//	        FROM edbdata AS c
	//	        INNER JOIN edbinfo AS a ON a.TRADE_CODE=c.TRADE_CODE
	//	        INNER JOIN edbinfo_user AS d ON a.TRADE_CODE=d.TRADE_CODE
	//	        LEFT JOIN edbdata_classify AS b ON a.classify_id=b.classify_id
	//	        WHERE a.classify_id>0`
	sql := `SELECT a.TRADE_CODE,a.SEC_NAME,a.frequency,a.UNIT,MAX(c.DT) AS Dt,b.classify_name
		        FROM edbdata AS c
		        INNER JOIN edbinfo AS a ON a.TRADE_CODE=c.TRADE_CODE
		        LEFT JOIN edbdata_classify AS b ON a.classify_id=b.classify_id
		        WHERE a.classify_id>0`
	if condition != "" {
		sql += condition
	}
	sql += " GROUP BY a.TRADE_CODE ORDER BY a.TRADE_CODE ASC "
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}

func GetEdbDataFrequency(classifyId int) (items []*string, err error) {
	sql := `SELECT DISTINCT frequency FROM edbinfo where classify_id=? AND frequency IS NOT NULL ORDER BY FIELD(frequency,'日度','周度','月度','季度','半年度','年度') `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, classifyId).QueryRows(&items)
	return
}

// GetEdbDataFrequencyByClassifyIdList
// @Description: 根据分类列表获取所有的频度
// @author: Roc
// @datetime 2024-08-15 17:51:13
// @param classifyIdList []int
// @return items []*string
// @return err error
func GetEdbDataFrequencyByClassifyIdList(classifyIdList []int) (items []string, err error) {
	num := len(classifyIdList)
	if num <= 0 {
		return
	}
	sql := `SELECT DISTINCT frequency FROM edbinfo where classify_id in (` + utils.GetOrmInReplace(num) + `) AND frequency IS NOT NULL ORDER BY FIELD(frequency,'日度','周度','月度','季度','半年度','年度') `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, classifyIdList).QueryRows(&items)
	return
}

func GetEdbDataFrequencyByKeyord(keyword string) (items []string, err error) {
	sql := `SELECT DISTINCT frequency FROM edbinfo where SEC_NAME=? ORDER BY FIELD(frequency,'日度','周度','月度','季度','半年度','年度') `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, keyword).QueryRows(&items)
	return
}

type EdbdataList struct {
	Dt string `orm:"column(DT);" description:"录入时间"`
}

func GetEdbdataList(tradeCode string) (items []*EdbdataList, err error) {
	sql := ` SELECT  DT FROM edbdata WHERE TRADE_CODE IN(` + tradeCode + `)  GROUP BY DT ORDER BY DT DESC `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

type EdbdataItem struct {
	TradeCode string  `orm:"column(TRADE_CODE);" description:"指标code"`
	Dt        string  `orm:"column(DT);" description:"最新一次录入时间"`
	Close     float64 `orm:"column(CLOSE);" description:"值"`
}

func GetEdbdataValueByTradeCode(tradeCode, dt string) (item *EdbdataItem, err error) {
	sql := ` SELECT  TRADE_CODE,DT,CLOSE FROM edbdata WHERE TRADE_CODE=? AND DT=? `
	o := orm.NewOrmUsingDB("edb")
	err = o.Raw(sql, tradeCode, dt).QueryRow(&item)
	return
}

func GetEdbdataAllByTradeCode(tradeCode string) (items []*EdbdataItem, err error) {
	sql := ` SELECT * FROM edbdata WHERE TRADE_CODE=? `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, tradeCode).QueryRows(&items)
	return
}

func GetEdbdataClassifyByParentId(parentId int) (items []*EdbdataClassify, err error) {
	sql := ` SELECT * FROM edbdata_classify WHERE parent_id=? `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, parentId).QueryRows(&items)
	return
}

type LzPriceClassify struct {
	ProductName string
}

func GetLzPriceClassify() (items []*LzPriceClassify, err error) {
	sql := ` SELECT product_name  FROM longzhongpriceinfo GROUP BY product_name ORDER BY product_name DESC `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

type Longzhongpriceinfo struct {
	LongzhongpriceinfoId int `orm:"column(longzhongpriceinfo_id);pk"`
	Standard             string
	ModelName            string
	Unit                 string
	AreaName             string
	PriceType            string
	Memo                 string
	PriceId              string
	ProductName          string
	InfoType             string
	InfoTypeRemark       string
	MarketName           string
	ManufactureName      string
}

func GetLongzhongpriceinfoByClassifyName(productName string) (items []*Longzhongpriceinfo, err error) {
	sql := `SELECT * FROM longzhongpriceinfo WHERE product_name=? ORDER BY longzhongpriceinfo_id ASC `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, productName).QueryRows(&items)
	return
}

func GetLongzhongPriceDataMaxCount(productName string) (count int, err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := `SELECT MAX(t.num) AS count FROM (
				SELECT COUNT(1) AS num  FROM longzhongpriceinfo AS a
				INNER JOIN longzhongpricedata AS b ON a.longzhongpriceinfo_id=b.longzhongpriceinfo_id
				WHERE a.product_name=?
				GROUP BY a.product_name
			)AS t `
	err = o.Raw(sql, productName).QueryRow(&count)
	return
}

type LongzhongpricedataItems struct {
	LongzhongpricedataId int `orm:"column(longzhongpricedata_id);pk"`
	LongzhongpriceinfoId int
	PriceDate            string
	Memo                 string
	Price                float64
	CnyPrice             float64
	ZsyPrice             float64
	ZshPrice             float64
	LowPrice             float64
	HighPrice            float64
	RisePrice            float64
	TonPrice             float64
	PriceType            string
	UpdateDate           string
}

func GetLongzhongPriceDataById(lzPriceInfoId int) (items []*LongzhongpricedataItems, err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := ` SELECT DISTINCT a.longzhongpriceinfo_id,a.price_date,a.memo,a.price,a.cny_price,a.zsy_price,a.zsh_price,a.low_price,a.high_price,a.rise_price,a.ton_price,a.price_type,a.update_date  
			 FROM longzhongpricedata AS a
			 WHERE longzhongpriceinfo_id=? ORDER BY price_date DESC `
	_, err = o.Raw(sql, lzPriceInfoId).QueryRows(&items)
	return
}

func GetLzSurveyClassify() (items []*LzPriceClassify, err error) {
	sql := ` SELECT breed_name AS product_name  FROM longzhong_survey_product GROUP BY breed_name ORDER BY breed_name DESC `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

type LongzhongSurveyProduct struct {
	SurveyProductId      int `orm:"column(survey_product_id);pk"`
	ProjectQuotaId       int64
	BreedId              string
	BreedName            string
	QuotaId              string
	QuotaName            string
	UnitId               string
	UnitName             string
	SampleType           int64
	SampleId             string
	SampleName           string
	DeviceId             string
	Device               string
	ProductCraftId       string
	ProductCraft         string
	ProductLine          string
	InputMode            int64
	Frequency            int64
	InputValue           string
	TaskShouldFinishTime int
	CustomId             string
	CustomType           int64
	Custom               string
	QuotaSampleId        int64
	StartDate            string
	EndDate              string
	LzCode               string
}

func GetLongzhongSurveyProductByClassifyName(productName string) (items []*LongzhongSurveyProduct, err error) {
	sql := `SELECT * FROM longzhong_survey_product WHERE breed_name=? ORDER BY survey_product_id ASC `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, productName).QueryRows(&items)
	return
}

func GetLzSurveyProductByNameAndFrequency(productName string, frequency int) (items []*LongzhongSurveyProduct, err error) {

	sql := `SELECT * FROM longzhong_survey_product WHERE breed_name=? AND frequency=? ORDER BY survey_product_id ASC `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, productName, frequency).QueryRows(&items)
	return
}

func GetExportLzSurveyProductByBreedIds(breedIds []string) (items []*LongzhongSurveyProduct, err error) {
	if len(breedIds) == 0 {
		return
	}
	field := ` survey_product_id, breed_id, breed_name, sample_name, custom, quota_name, lz_code, frequency, unit_name, end_date, input_value `
	sql := `SELECT ` + field + ` FROM longzhong_survey_product WHERE breed_id IN (` + utils.GetOrmInReplace(len(breedIds)) + `) ORDER BY breed_id ASC, frequency ASC, survey_product_id ASC `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, breedIds).QueryRows(&items)
	return
}

func GetLzFrequency(productName string) (items []*int, err error) {
	sql := `SELECT DISTINCT frequency FROM longzhong_survey_product WHERE breed_name=? ORDER BY frequency`
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, productName).QueryRows(&items)
	return
}

// EdbInfoItem
type EdbInfoItem struct {
	TradeCode        string                 `orm:"column(TRADE_CODE);pk" description:"指标code"`
	SecName          string                 `orm:"column(SEC_NAME);" description:"指标名称"`
	Unit             string                 `orm:"column(UNIT);" description:"单位"`
	Remark           string                 `orm:"column(REMARK);" description:"备注"`
	Frequency        string                 `description:"频度"`
	ClassifyId       int                    `description:"分类id"`
	ClassifyName     string                 `description:"分类名称"`
	CreateDate       string                 `description:"创建时间"`
	UserId           int                    `description:"录入用户id"`
	UserName         string                 `description:"录入用户名称"`
	NoticeTime       string                 `description:"通知时间"`
	Mobile           string                 `description:"录入者手机号"`
	ModifyDate       string                 `description:"待更新日期"`
	ModifyTime       string                 `description:"最近一次更新时间"`
	Status           string                 `description:"状态:未完成/完成"`
	IsJoinEdb        int8                   `description:"指标库是否已添加:0-否;1-是"`
	StartDate        string                 `description:"数据开始日期"`
	EndDate          string                 `description:"数据结束日期"`
	LatestValue      float64                `description:"指标最新值"`
	DataList         []*Edbdata             `description:"指标数据列表"`
	NextDataTimeList []*EdbDataNextDateTime `description:"下期数据时间列表"`
}

// GetTargetItemList 获取指标列表数据
func GetTargetItemList(classifyId, edbShowType int, frequency, keyword, tradeCode string, classifyIdStrList []string) (items []*EdbInfoItem, err error) {
	o := orm.NewOrmUsingDB("edb")

	pars := make([]interface{}, 0)

	sql := ` SELECT a.*,'' modify_date,'' STATUS FROM edbinfo AS a `
	if edbShowType != 0 {
		sql = ` SELECT a.*,b.DT,'' modify_date,'' STATUS FROM edbinfo AS a 
left join edbdata b on a.TRADE_CODE=b.TRADE_CODE `
	}
	sql += ` WHERE a.classify_id>0 `

	//如果没有分类id集合列表,那么就没有数据了,不用往下执行了,直接返回好了
	if len(classifyIdStrList) <= 0 {
		return
	}
	if len(classifyIdStrList) > 0 {
		sql += ` AND a.classify_id in (` + strings.Join(classifyIdStrList, ",") + `)  `
	}
	if classifyId > 0 {
		sql += ` AND a.classify_id=` + strconv.Itoa(classifyId) + ` `
	}
	//频度
	if frequency != "" {
		sql += ` AND a.frequency="` + frequency + `" `
	}
	//关键字
	if keyword != "" {
		sql += ` AND (a.SEC_NAME like ?  or a.TRADE_CODE like ? )`
		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
	}
	//指定指标
	if tradeCode != "" {
		sql += ` AND a.TRADE_CODE = "` + tradeCode + `" `
	}
	//指标里面是否有数据
	switch edbShowType {
	case 1:
		sql += ` AND b.CLOSE is not null `
	case 2:
		sql += ` AND b.CLOSE is null `
	}
	sql += ` GROUP BY a.TRADE_CODE `

	sql = sql + ` ORDER BY CONVERT(a.SEC_NAME USING gbk )  COLLATE gbk_chinese_ci ASC `
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return

}

// GetLzItemList 模糊查询隆众数据库指标列表
func GetLzItemList(keyword string) (items []*data_manage.LongzhongSurveyProduct, err error) {
	o := orm.NewOrmUsingDB("edb")

	sql := "SELECT * FROM longzhong_survey_product WHERE CONCAT(sample_name,breed_name,custom,quota_name,lz_code) LIKE ?"
	_, err = o.Raw(sql, utils.GetLikeKeyword(keyword)).QueryRows(&items)

	return

}

type lzSurveyData struct {
	DataTime   string `orm:"column(data_time)" description:"日期"`
	InputValue string `orm:"column(input_value)" description:"值"`
}

// GetLzItemListByCode 根据code查询隆众数据列表
func GetLzItemListByCode(lzCode string) (items []*lzSurveyData, err error) {
	o := orm.NewOrmUsingDB("edb")

	sql := "SELECT * FROM longzhong_survey_data WHERE survey_product_id=? GROUP BY data_time DESC"
	_, err = o.Raw(sql, lzCode).QueryRows(&items)
	return
}

// GetEdbDataListByCodes 通过指标ID获取所有数据
func GetEdbDataListByCodes(tradeCode string) (items []*Edbdata, err error) {
	sql := ` SELECT  TRADE_CODE,DT,round(CLOSE,4) CLOSE,modify_time  FROM edbdata WHERE TRADE_CODE IN(` + tradeCode + `)  GROUP BY TRADE_CODE,DT ORDER BY DT DESC `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// TargetItemListResp 指标数据结构体
type TargetItemListResp struct {
	List          []*EdbInfoItem
	FrequencyList []string
}

// BatchDataDeleteReq 批量删除某日的指标数据请求结构体
type BatchDataDeleteReq struct {
	CreateDate    string   `description:"创建日期"`
	TradeCodeList []string `description:"指标唯一编码列表"`
}

// BatchDeleteEdbDataByDate 批量删除某日的指标数据
func BatchDeleteEdbDataByDate(tradeCodes, dt string, opUserId int) (err error) {
	o := orm.NewOrmUsingDB("edb")
	var list []*Edbdata
	sql := ` select * FROM edbdata WHERE TRADE_CODE in  (` + tradeCodes + `) AND DT = ? `
	_, err = o.Raw(sql, dt).QueryRows(&list)
	if err != nil {
		return
	}
	deleteRecordList := make([]*EdbdataDeleteRecord, 0)
	for _, edbDataInfo := range list {
		deleteRecord := &EdbdataDeleteRecord{
			TradeCode:  edbDataInfo.TradeCode,
			Dt:         edbDataInfo.Dt,
			Close:      edbDataInfo.Close,
			ModifyTime: time.Now(),
			CreateTime: time.Now(),
			SysUserId:  opUserId,
		}
		deleteRecordList = append(deleteRecordList, deleteRecord)
	}
	if len(deleteRecordList) > 0 {
		_, tmpErr := o.InsertMulti(len(deleteRecordList), deleteRecordList)
		if tmpErr != nil {
			err = tmpErr
			return
		}
	}
	sql = ` DELETE FROM edbdata WHERE TRADE_CODE in  (` + tradeCodes + `) AND DT = ? `
	_, err = o.Raw(sql, dt).Exec()
	return
}

// BatchDeleteEdbData 批量删除指标数据
func BatchDeleteEdbData(tradeCode string, opUserId int) (err error) {
	o := orm.NewOrmUsingDB("edb")
	var list []*Edbdata
	sql := ` select * FROM edbdata WHERE TRADE_CODE =  ? `
	_, err = o.Raw(sql, tradeCode).QueryRows(&list)
	if err != nil {
		return
	}
	deleteRecordList := make([]*EdbdataDeleteRecord, 0)
	for _, edbDataInfo := range list {
		deleteRecord := &EdbdataDeleteRecord{
			TradeCode:  edbDataInfo.TradeCode,
			Dt:         edbDataInfo.Dt,
			Close:      edbDataInfo.Close,
			ModifyTime: time.Now(),
			CreateTime: time.Now(),
			SysUserId:  opUserId,
		}
		deleteRecordList = append(deleteRecordList, deleteRecord)
	}
	_, err = o.InsertMulti(len(deleteRecordList), deleteRecordList)
	if err != nil {
		return
	}
	sql = ` DELETE FROM edbdata WHERE TRADE_CODE  = ? `
	_, err = o.Raw(sql, tradeCode).Exec()
	return
}

// GetEdbInfoCountByClassifyId 根据指标分类id获取当前分类下的指标数量
func GetEdbInfoCountByClassifyId(classifyId int) (count int, err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := `SELECT COUNT(1) AS count FROM ( SELECT a.*,b.CLOSE FROM edbinfo AS a 
             INNER JOIN edbdata AS b ON a.TRADE_CODE=b.TRADE_CODE
             WHERE a.classify_id=? group by a.TRADE_CODE) d `
	err = o.Raw(sql, classifyId).QueryRow(&count)
	return
}

// EdbInfoGroupCount 指标分类id获取当前分类下的指标数量
type EdbInfoGroupCount struct {
	Count      int
	ClassifyId int
}

// GetEdbInfoGroupCountByClassifyIds 根据指标分类id获取当前分类下的指标数量
func GetEdbInfoGroupCountByClassifyIds(classifyIdList []int) (list []*EdbInfoGroupCount, err error) {
	num := len(classifyIdList)
	if num <= 0 {
		return
	}
	o := orm.NewOrmUsingDB("edb")
	sql := `SELECT COUNT(1) AS count,classify_id FROM ( SELECT a.*,b.CLOSE FROM edbinfo AS a 
             INNER JOIN edbdata AS b ON a.TRADE_CODE=b.TRADE_CODE
             WHERE a.classify_id in (` + utils.GetOrmInReplace(num) + `) group by a.TRADE_CODE) d 
						 GROUP BY classify_id `
	_, err = o.Raw(sql, classifyIdList).QueryRows(&list)
	return
}

// GetExcelData 获取excel样式数据
func GetExcelData() (list []*data_manage.ExcelStyle, err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := `SELECT * FROM excel_style `
	_, err = o.Raw(sql).QueryRows(&list)
	return
}

// AddExcelData 添加excel样式数据
func AddExcelData(item *data_manage.ExcelStyle) (id int64, err error) {
	o := orm.NewOrmUsingDB("edb")
	id, err = o.Insert(item)
	return
}

type EdbdataFloat struct {
	TradeCode  string    `orm:"column(TRADE_CODE);pk" description:"指标编码"`
	Dt         string    `orm:"column(DT)" description:"日期"`
	Close      float64   `orm:"column(CLOSE)" description:"值"`
	ModifyTime time.Time `orm:"column(modify_time)" description:"修改时间"`
}

func GetTargetsDataFloat(tradeCode, dt string) (item *EdbdataFloat, err error) {
	sql := `SELECT * FROM edbdata WHERE TRADE_CODE=? AND DT=? `
	o := orm.NewOrmUsingDB("edb")
	err = o.Raw(sql, tradeCode, dt).QueryRow(&item)
	return
}

func ModifyEdbinfo(tradeCode, unit, frequency string, classifyId int) (err error) {
	sql := `UPDATE edbinfo SET UNIT = ?,frequency=?, classify_id=?, create_date=NOW() WHERE TRADE_CODE=? `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, unit, frequency, classifyId, tradeCode).Exec()
	return
}

func DeleteTargetsDataByImport(tradeCode, dt string) (err error) {
	sql := `DELETE FROM edbdata WHERE TRADE_CODE=? AND DT=? `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, tradeCode, dt).Exec()
	return
}

// GetEdbinfoListByCodeListGroupByUserId 根据指标code列表、用户分组获取指标信息
func GetEdbinfoListByCodeListGroupByUserId(edbCodeList []string) (items []*Edbinfo, err error) {
	num := len(edbCodeList)
	if num <= 0 {
		return
	}
	o := orm.NewOrmUsingDB("edb")
	sql := `SELECT * FROM edbinfo WHERE TRADE_CODE in (` + utils.GetOrmInReplace(num) + `) GROUP BY user_id `
	_, err = o.Raw(sql, edbCodeList).QueryRows(&items)
	return
}

// GetEdbinfoListByCodeListByCodeIdList
// @Description: 根据指标code列表获取列表信息
// @param edbCodeList
// @return items
// @return err
func GetEdbinfoListByCodeListByCodeIdList(edbCodeList []string) (items []*Edbinfo, err error) {
	num := len(edbCodeList)
	if num <= 0 {
		return
	}
	o := orm.NewOrmUsingDB("edb")
	sql := `SELECT * FROM edbinfo WHERE TRADE_CODE in (` + utils.GetOrmInReplace(num) + `) `
	_, err = o.Raw(sql, edbCodeList).QueryRows(&items)
	return
}

// GetEdbinfoListByCodeListByUserId
// @Description: 根据用户id列表获取指标列表信息
// @param userIdList
// @return items
// @return err
func GetEdbinfoListByCodeListByUserId(userIdList []int) (items []*Edbinfo, err error) {
	num := len(userIdList)
	if num <= 0 {
		return
	}
	o := orm.NewOrmUsingDB("edb")
	sql := `SELECT * FROM edbinfo WHERE user_id in (` + utils.GetOrmInReplace(num) + `) `
	_, err = o.Raw(sql, userIdList).QueryRows(&items)
	return
}

// ModifyEdbinfoUserIdByCodeList 根据指标code列表修改创建人
func ModifyEdbinfoUserIdByCodeList(edbCodeList []string, userId int, userName string) (err error) {
	num := len(edbCodeList)
	if num <= 0 {
		return
	}
	o := orm.NewOrmUsingDB("edb")
	sql := `UPDATE edbinfo SET user_id = ?,user_name = ? WHERE TRADE_CODE in (` + utils.GetOrmInReplace(num) + `) `
	_, err = o.Raw(sql, userId, userName, edbCodeList).Exec()
	return
}

// ModifyEdbinfoUserIdByOldUserId
// @Description:  根据旧用户id修改新用户id
// @author: Roc
// @datetime 2024-03-25 17:59:32
// @param oldUserId int
// @param userId int
// @return err error
func ModifyEdbinfoUserIdByOldUserId(oldUserIdList []int, userId int) (err error) {
	num := len(oldUserIdList)
	if num <= 0 {
		return
	}
	o := orm.NewOrmUsingDB("edb")
	sql := `UPDATE edbinfo SET user_id=? WHERE user_id in (` + utils.GetOrmInReplace(num) + `) `
	_, err = o.Raw(sql, userId, oldUserIdList).Exec()

	return
}

func GetEdbInfoAdminList() (list []int, err error) {
	sql := `SELECT user_id FROM edbinfo GROUP BY user_id `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql).QueryRows(&list)
	return
}

// GetAllChildManualEdbClassify
// @Description: 获取手工数据中所有的子分类
// @author: Roc
// @datetime 2024-07-16 13:27:28
// @return items []*EdbdataClassify
// @return err error
func GetAllChildManualEdbClassify() (items []*EdbdataClassify, err error) {
	o := orm.NewOrmUsingDB("edb")

	sql := ` SELECT classify_id,classify_name,parent_id FROM edbdata_classify WHERE parent_id > 0 `
	_, err = o.Raw(sql).QueryRows(&items)

	return
}

// GetChildManualEdbClassifyByIdList
// @Description: 获取手工数据中所有的子分类
// @author: Roc
// @datetime 2024-07-16 13:33:57
// @param idList []int
// @return items []*EdbdataClassify
// @return err error
func GetChildManualEdbClassifyByIdList(idList []int) (items []*EdbdataClassify, err error) {
	num := len(idList)
	if num <= 0 {
		return
	}
	o := orm.NewOrmUsingDB("edb")

	sql := ` SELECT classify_id,classify_name,parent_id FROM edbdata_classify WHERE classify_id in (` + utils.GetOrmInReplace(num) + `) `
	_, err = o.Raw(sql, idList).QueryRows(&items)

	return
}

// EdbinfoMaxMinDate
// @Description: 手工指标的最小最大日期
type EdbinfoMaxMinDate struct {
	MinDate string
	MaxDate string
}

// GetEdbdataMaxMinDate
// @Description: 获取手工指标的最小最大日期
// @author: Roc
// @datetime 2024-08-01 14:27:20
// @param tradeCode string
// @return item EdbinfoMaxMinDate
// @return err error
func GetEdbdataMaxMinDate(tradeCode string) (item EdbinfoMaxMinDate, err error) {
	o := orm.NewOrmUsingDB("edb")

	sql := ` SELECT MIN(DT) min_date,MAX(DT) max_date FROM edbdata WHERE TRADE_CODE = ? `
	err = o.Raw(sql, tradeCode).QueryRow(&item)

	return
}

// GetEdbdataLatestValue
// @Description: 获取手工数据的最新值
// @author: Roc
// @datetime 2024-08-02 10:33:22
// @param tradeCode string
// @return latestValue float64
// @return err error
func GetEdbdataLatestValue(tradeCode string) (latestValue float64, err error) {
	o := orm.NewOrmUsingDB("edb")

	sql := ` SELECT CLOSE FROM edbdata WHERE TRADE_CODE = ? ORDER BY DT DESC LIMIT 1`
	err = o.Raw(sql, tradeCode).QueryRow(&latestValue)

	return
}

// ModifyEdbinfoMaxMinDate
// @Description: 修改手工指标的最小最大日期
// @author: Roc
// @datetime 2024-08-01 15:33:45
// @param startDate string
// @param endDate string
// @param tradeCode string
// @return err error
func ModifyEdbinfoMaxMinDate(tradeCode, startDate, endDate string, latestValue float64) (err error) {
	o := orm.NewOrmUsingDB("edb")

	sql := ` UPDATE edbinfo SET start_date = ?, end_date = ?, latest_value = ? , modify_time = now() WHERE TRADE_CODE = ? `
	_, err = o.Raw(sql, startDate, endDate, latestValue, tradeCode).Exec()

	return
}