Ver código fonte

sap5月需求提交

baishaojie 2 anos atrás
pai
commit
446217c778

+ 50 - 3
apiserver/dao/dao.go

@@ -2,15 +2,14 @@ package dao
 
 import (
 	"fmt"
+	"gorm.io/driver/sqlserver"
 	"os"
 	"time"
 
+	//_ "github.com/denisenkom/go-mssqldb"
 	"gorm.io/gorm/logger"
 	"gorm.io/gorm/schema"
 
-	// "github.com/xormplus/xorm"
-	// "github.com/xormplus/xorm"
-
 	"gorm.io/driver/mysql"
 	"gorm.io/gorm"
 
@@ -28,6 +27,12 @@ type Dao struct {
 	DB *gorm.DB
 }
 
+var SqlServerDB *SqlServer
+
+type SqlServer struct {
+	DB *gorm.DB
+}
+
 func New(conf *config.Config) *Dao {
 	newLogger := logger.New(
 		log.New(os.Stdout, "\r\n"), // io writer
@@ -65,6 +70,7 @@ func New(conf *config.Config) *Dao {
 
 	return D
 }
+
 func Setup() {
 	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local",
 		setting.DatabaseSetting.User,
@@ -82,3 +88,44 @@ func Setup() {
 		log.Fatal("dao  Setup ", err)
 	}
 }
+
+func NewSqlServer(conf *config.Config) *SqlServer {
+	sqlserverSourceName := fmt.Sprintf("server=%s;user id=%s;password=%s;database=%s;encrypt=disable", setting.SQlServerSetting.Host,
+		setting.SQlServerSetting.User, setting.SQlServerSetting.Password, setting.SQlServerSetting.Name)
+
+	newLogger := logger.New(
+		log.New(os.Stdout, "\r\n"), // io writer
+		logger.Config{
+			SlowThreshold:             time.Second,  // Slow SQL threshold
+			LogLevel:                  logger.Error, // Log level
+			IgnoreRecordNotFoundError: false,        // Ignore ErrRecordNotFound error for logger
+			Colorful:                  true,         // Disable color
+			// LogMode:
+		})
+	gc := &gorm.Config{
+		NamingStrategy: schema.NamingStrategy{
+			SingularTable: true,
+			NoLowerCase:   true,
+		},
+		//Logger: newLogger,
+		Logger: logger.Default.LogMode(logger.Silent),
+	}
+
+	db, err := gorm.Open(sqlserver.Open(sqlserverSourceName), gc)
+	tx := db.Session(&gorm.Session{Logger: newLogger})
+	if err != nil {
+		log.Error("model.Setup err: %v", err, conf.DB.DSN)
+	}
+	sqlDB, _ := db.DB()
+	// SetMaxOpenConns 设置打开数据库连接的最大数量。
+	sqlDB.SetMaxOpenConns(100)
+	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
+	sqlDB.SetMaxIdleConns(10)
+	// SetConnMaxLifetime 设置了连接可复用的最大时间。
+	sqlDB.SetConnMaxLifetime(300 * time.Second)
+	SqlServerDB = &SqlServer{
+		DB: tx,
+	}
+
+	return SqlServerDB
+}

+ 13 - 0
apiserver/model/cownum.go

@@ -0,0 +1,13 @@
+package model
+
+type Cownum struct {
+	Id       string `gorm:"column:ID"`
+	Date     string `gorm:"column:date"`
+	Farm     string `gorm:"column:farm"`
+	Totalcow int64  `gorm:"column:totalcow"`
+	Milkcow  int64  `gorm:"column:milkcow"`
+}
+
+func (p Cownum) TableName() string {
+	return "Table_cownum"
+}

+ 14 - 0
apiserver/model/feedsum.go

@@ -0,0 +1,14 @@
+package model
+
+type FeedSum struct {
+	CowNum    int64  `gorm:"column:cowNum"`
+	CowNumM   int64  `gorm:"column:cowNumM"`
+	FeedDay   string `gorm:"column:feedDay"`
+	Id        int64  `gorm:"column:id"`
+	PastureId int64  `gorm:"column:pastureId"`
+	SaleNum   int64  `gorm:"column:saleNum"`
+}
+
+func (t *FeedSum) TableName() string {
+	return "feed_sum"
+}

+ 17 - 0
apiserver/model/feequery.go

@@ -0,0 +1,17 @@
+package model
+
+type FeeQuery struct {
+	Id        int64  `gorm:"column:id"`
+	PastureId int64  `gorm:"column:pastureId"`
+	RBUKRS    string `gorm:"column:RBUKRS"`
+	WERKS     string `gorm:"column:WERKS"`
+	FYLX      string `gorm:"column:FYLX;comment:类型"`  //类型
+	GJAHR     string `gorm:"column:GJAHR;comment:年份"` //年份
+	POPER     int64  `gorm:"column:POPER;comment:日期"` //日期
+	HSL       string `gorm:"column:HSL;comment:金额"`   //金额
+	Date      string `gorm:"column:Date;comment:时间"`  //时间
+}
+
+func (t *FeeQuery) TableName() string {
+	return "feequery"
+}

+ 39 - 0
apiserver/model/http/feequery.go

@@ -0,0 +1,39 @@
+package http
+
+type FeeQueryReq struct {
+	Dest `json:"DEST"`
+	DATA struct {
+		GJAHR  string   `json:"GJAHR"`
+		TPOPER []TPOPER `json:"T_POPER"`
+		TWERKS []TWERKS `json:"T_WERKS"`
+		TFYLX  []TFYLX  `json:"T_FYLX"`
+	} `json:"DATA"`
+}
+
+type TPOPER struct {
+	POPER string `json:"POPER"`
+}
+
+type TWERKS struct {
+	WERKS string `json:"WERKS"`
+}
+
+type TFYLX struct {
+	FYLX string `json:"FYLX"`
+}
+
+type FeeQueryResp struct {
+	Dest Dest         `json:"DEST"`
+	Data FeeQueryDate `json:"DATA"`
+}
+type FeeQueryDate struct {
+	Items []*SapITEMS `json:"ITEMS"`
+}
+type SapITEMS struct {
+	RBUKRS string `json:"RBUKRS"`
+	WERKS  string `json:"WERKS"`
+	FYLX   string `json:"FYLX"`
+	GJAHR  string `json:"GJAHR"`
+	POPER  string `json:"POPER"`
+	HSL    string `json:"HSL"`
+}

+ 3 - 2
apiserver/routers/api/db.go

@@ -1491,14 +1491,15 @@ func getpSumNow(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]inter
 
 	receiveTime := parammaps.Get(strings.Trim("receiveTime", " ")).ValueStr()
 	departmentName := parammaps.Get(strings.Trim("departmentName", " ")).ValueStr()
-	pastureNames, _ := restful.MapStrList("SELECT `name` FROM pasture where `name` <> '现代牧业' order by sort")
+	center := parammaps.Get("center").ValueStr()
+	pastureNames, _ := restful.MapStrList("SELECT `name` FROM pasture where `name` <> '现代牧业' and (center = ? or ? = '' ) order by sort", center, center)
 	rTime := ""
 	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
 	var pSumNow []map[string]string
 	if sqlnamestr == "getpSumNow" {
 		pSumNow, _ = restful.MapStrList(sqlNow, rTime, rTime, receiveTime, departmentName, departmentName, departmentName, departmentName, departmentName, departmentName)
 	} else {
-		pSumNow, _ = restful.MapStrList(sqlNow, rTime, rTime, receiveTime)
+		pSumNow, _ = restful.MapStrList(sqlNow, rTime, rTime, receiveTime, center, center)
 	}
 	//pSumNow, _ := restful.MapStrList(sqlNow, rTime, rTime, receiveTime,departmentName,departmentName,departmentName,departmentName,departmentName,departmentName)
 	receiveTimei, _ := strconv.Atoi(receiveTime)

+ 7 - 1
apiserver/routers/mcs.go

@@ -73,7 +73,13 @@ func Test(c *gin.Context) {
 	dataByte, _ := ioutil.ReadAll(c.Request.Body)
 	fmt.Println(string(dataByte))
 
-	c.JSON(200, map[string]interface{}{"code": 200, "data": string(dataByte), "msg": "ok"})
+	//userlist := make([]map[string]string, 0)
+	data := []map[string]interface{}{
+		{"username": "admin", "id": 100, "create_time": "2023-12-01", "txt": "测试信息1123"},
+		{"username": "epans", "id": 200, "create_time": "2023-12-01", "txt": "测试信息1123"},
+		{"username": "derek", "id": 300, "create_time": "2023-12-01", "txt": "测试信息1123"},
+	}
+	c.JSON(200, map[string]interface{}{"code": 200, "userlist": data, "msg": "ok"})
 }
 
 type DingdingT struct {

+ 13 - 5
apiserver/service/charge_off.go

@@ -11,6 +11,8 @@ import (
 	"kpt.xdmy/apiserver/model"
 	"kpt.xdmy/apiserver/model/http"
 	"kpt.xdmy/pkg/util"
+	"strconv"
+	"strings"
 )
 
 // 凭证冲销
@@ -87,20 +89,26 @@ func UpdateProof(p *model.ProofReq, tx *gorm.DB) error {
 		tname = "partquit"
 	}
 
+	//strings.Join(p.RowsNumber, ",")
+	rowsNumbers := []string{}
+	for _, rowsNumber := range p.RowsNumber {
+		rowsNumbers = append(rowsNumbers, strconv.Itoa(rowsNumber))
+	}
+
 	if p.NumberType != 2 && p.NumberType != 1 {
 		//for _, item := range p.ProofPart {
-		if e := tx.Table(tname).Where("bigid=? ", p.OrderNumberId).Update("dflag", 1).Error; e != nil {
+		if e := tx.Table(tname).Where("bigid=? ", p.OrderNumberId).Where("  FIND_IN_SET(rowNumber,? ) ", strings.Join(rowsNumbers, ",")).Update("dflag", 1).Error; e != nil {
 			log.Errorln(e, p.OrderNumberId, p.RowsNumber)
 			tx.Rollback()
 			return e
 		}
 		//}
-
+		//select id,name from user where FIND_IN_SET(id,#{strlist})
 		if e := tx.Exec(fmt.Sprintf(` update big%s set sterilisation = 1  where id = ? `, tname), p.OrderNumberId).Error; e != nil {
 			log.Errorln(e, p.OrderNumberId, p.RowsNumber)
 		}
 	} else {
-		if e := tx.Table(tname).Where("bigid=? ", p.OrderNumberId).
+		if e := tx.Table(tname).Where("bigid=? ", p.OrderNumberId).Where("  FIND_IN_SET(rowNumber,? ) ", strings.Join(rowsNumbers, ",")).
 			Update("dflag", 1).Update("hasTicket", p.HasTicket).Error; e != nil {
 			log.Errorln(e, p.OrderNumberId, p.RowsNumber)
 		}
@@ -111,7 +119,7 @@ func UpdateProof(p *model.ProofReq, tx *gorm.DB) error {
 
 	if p.NumberType == 1 {
 		partlaidList := make([]*model.PartLaid, 0)
-		err := tx.Raw(`select * from partlaid where bigid = ? `, p.OrderNumberId).Find(&partlaidList).Error
+		err := tx.Raw(`select * from partlaid where bigid = ?  and  FIND_IN_SET(rowNumber,? )  `, p.OrderNumberId, strings.Join(rowsNumbers, ",")).Find(&partlaidList).Error
 		if err != nil {
 			log.Error(err)
 			return err
@@ -128,7 +136,7 @@ func UpdateProof(p *model.ProofReq, tx *gorm.DB) error {
 		}
 	} else if p.NumberType == 3 {
 		partUseList := make([]*model.PartUse, 0)
-		err := tx.Raw(`select * from partuse where bigid = ? `, p.OrderNumberId).Find(&partUseList).Error
+		err := tx.Raw(`select * from partuse where bigid = ?  and  FIND_IN_SET(rowNumber,? )  `, p.OrderNumberId, strings.Join(rowsNumbers, ",")).Find(&partUseList).Error
 		if err != nil {
 			log.Error(err)
 			return err

+ 43 - 0
apiserver/service/cownum_sqlserver/cownum.go

@@ -0,0 +1,43 @@
+package cownum_sqlserver
+
+import (
+	"fmt"
+	"github.com/sirupsen/logrus"
+	"kpt.xdmy/apiserver/dao"
+	"kpt.xdmy/apiserver/model"
+)
+
+//var s *Service
+
+func SyncCownum(s *dao.SqlServer, d *dao.Dao, date string) {
+
+	onlineCownumList := make([]*model.Cownum, 0)
+	err := s.DB.Table("Table_cownum").Where("date = ?", date).
+		Find(&onlineCownumList).Error
+	if err != nil {
+		logrus.Error("SyncCownum-1-error: ", err.Error())
+	}
+
+	for _, item := range onlineCownumList {
+		pasture := new(model.Pasture)
+		tx := d.DB.Table("pasture").Where(" name like concat('%',?,'%') ", item.Farm)
+
+		err := tx.First(pasture).Error
+		if err != nil {
+			logrus.Error("SyncCownum-2-error: ", err.Error())
+			continue
+		}
+		fmt.Println(pasture)
+		err = d.DB.Create(&model.FeedSum{
+			CowNum:    item.Totalcow,
+			CowNumM:   item.Milkcow,
+			FeedDay:   date,
+			PastureId: int64(pasture.ID),
+		}).Error
+		if err != nil {
+			logrus.Error("SyncCownum-3-error: ", err.Error())
+			//return
+		}
+	}
+
+}

+ 87 - 0
apiserver/service/feequery.go

@@ -0,0 +1,87 @@
+package service
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/k0kubun/pp/v3"
+	log "github.com/sirupsen/logrus"
+	"kpt.xdmy/apiserver/config"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/model/http"
+	"strconv"
+	"strings"
+	"time"
+)
+
+func AutoFeeQuery(werks string, pastureID int) {
+	r := new(http.FeeQueryReq)
+	rp := new(http.FeeQueryResp)
+	var e error
+
+	r.Url = fmt.Sprintf("%s/Common/FI009/FeeQuery", config.Conf.Http.Routing)
+	r.Dest.DestID = "EQMAN"
+	r.Dest.BussTp = "FI009"
+
+	r.DATA.GJAHR = time.Now().Format("2006")
+
+	r.DATA.TWERKS = append(r.DATA.TWERKS, http.TWERKS{WERKS: werks})
+	r.DATA.TFYLX = append(r.DATA.TFYLX, http.TFYLX{FYLX: "水费"},
+		http.TFYLX{FYLX: "电费"},
+		http.TFYLX{FYLX: "燃动费"},
+		http.TFYLX{FYLX: "柴油费"})
+
+	rbyte, _ := json.Marshal(r)
+	fmt.Println(string(rbyte))
+	if e = s.SyncSap(r, rp, rbyte); e == nil {
+		if rp.Dest.Status == "S" {
+			log.Infof("sap  FeeQuery  success sum=%d", len(rp.Data.Items))
+		} else {
+			log.Infof("sap FeeQuery fail", rp.Dest.MessText)
+			pp.Print(r)
+		}
+	} else {
+		log.Error(e)
+	}
+
+	for _, item := range rp.Data.Items {
+
+		if strings.Index(item.HSL, "-") > 0 {
+			item.HSL = fmt.Sprintf("-%s", strings.ReplaceAll(item.HSL, "-", ""))
+		}
+		poper, _ := strconv.ParseInt(item.POPER, 10, 64)
+		var n int64
+		s.d.DB.Table(new(model.FeeQuery).TableName()).Where("pastureId = ? ", pastureID).Where("FYLX = ? ", item.FYLX).
+			Where("GJAHR = ? ", item.GJAHR).Where("POPER = ? ", poper).Count(&n)
+
+		var dateStr string
+		if poper > 10 {
+			dateStr = fmt.Sprintf("%s-%d", item.GJAHR, poper)
+		} else {
+			dateStr = fmt.Sprintf("%s-0%d", item.GJAHR, poper)
+		}
+
+		date, err := time.Parse("2006-01", dateStr)
+		if err != nil {
+			log.Error(err)
+			return
+		}
+
+		if n == 0 {
+			err := s.d.DB.Table(new(model.FeeQuery).TableName()).Create(&model.FeeQuery{
+				PastureId: int64(pastureID),
+				RBUKRS:    item.RBUKRS,
+				WERKS:     item.WERKS,
+				FYLX:      item.FYLX,
+				GJAHR:     item.GJAHR,
+				POPER:     poper,
+				HSL:       item.HSL,
+				Date:      date.Format("2006-01"),
+			}).Error
+			fmt.Println(err)
+		} else {
+			s.d.DB.Exec(` update feequery set HSL = ? where pastureId = ? and FYLX = ? and GJAHR = ? and POPER = ? `, item.HSL,
+				pastureID, item.FYLX, item.GJAHR, poper)
+		}
+
+	}
+}

+ 50 - 20
apiserver/service/job.go

@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"github.com/robfig/cron"
 	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/service/cownum_sqlserver"
 	"time"
 )
 
@@ -22,27 +23,27 @@ func SapJobInit() {
 		AutoSrmReturnOrderJob()
 	})
 	c.Start()
+	/*
+		var t time.Time
+		t = time.Now()
+		var code string
+		pastureList := make([]*model.Pasture, 0)
+		err := s.d.DB.Table("pasture").Where("id in(367)").Find(&pastureList)
+		fmt.Println(err)
+		i := -120
+		for {
+			fmt.Println(i, t.AddDate(0, 0, i))
+			for _, pasture := range pastureList {
+				s.SapSupplier(t, pasture.CompanyCode, pasture.ID)
+				s.SapAsset(t.AddDate(0, 0, i), code, pasture.CompanyCode)
+			}
 
-	//var t time.Time
-	//t = time.Now()
-	//var code string
-	//pastureList := make([]*model.Pasture, 0)
-	//err := s.d.DB.Table("pasture").Where("id = 1381 ").Find(&pastureList)
-	//fmt.Println(err)
-	//i := -60
-	//for {
-	//	fmt.Println(i, t.AddDate(0, 0, i))
-	//	for _, pasture := range pastureList {
-	//		//s.SapSupplier(t, pasture.CompanyCode, pasture.ID)
-	//		s.SapAsset(t.AddDate(0, 0, i), code, pasture.CompanyCode)
-	//	}
-	//
-	//	if t.AddDate(0, 0, i).Format("2006-01-02") == "2023-04-13" {
-	//		break
-	//	}
-	//	i++
-	//}
-
+			if t.AddDate(0, 0, i).Format("2006-01-02") == "2023-04-26" {
+				break
+			}
+			i++
+		}
+	*/
 	c1 := cron.New()
 	c1.AddFunc("0 50 23 * * ?", func() {
 		fmt.Println(time.Now())
@@ -74,6 +75,35 @@ func SapJobInit() {
 	c1.AddFunc(spec2, func() {
 		s.d.DB.Exec(`call wxmsg()`)
 	})
+
+	//i := -10
+	//for {
+	//	now := time.Now().AddDate(0, 0, i).Format("2006-01-02")
+	//	fmt.Println(now)
+	//	cownum_sqlserver.SyncCownum(s.sqlserver, s.d, now)
+	//	if now == "2023-05-09" {
+	//		break
+	//	}
+	//	i++
+	//}
+	//pastureList := make([]*model.Pasture, 0)
+	//s.d.DB.Table("pasture").Where("vendor = 1 ").Where("factory_code  != '' ").Where("factory_code  is not null ").Find(&pastureList)
+	//for _, item := range pastureList {
+	//	//fmt.Println(item.FactoryCode, "a")
+	//	AutoFeeQuery(item.FactoryCode, item.ID)
+	//}
+
+	c1.AddFunc("0 10 16 * * ?", func() {
+		cownum_sqlserver.SyncCownum(s.sqlserver, s.d, time.Now().AddDate(0, 0, -1).Format("2006-01-02"))
+
+		//pastureList := make([]*model.Pasture, 0)
+		//s.d.DB.Table("pasture").Where("vendor = 1 ").Where("factory_code  != '' ").Where("factory_code  is not null ").Find(&pastureList)
+		//for _, item := range pastureList {
+		//	//fmt.Println(item.FactoryCode, "a")
+		//	AutoFeeQuery(item.FactoryCode, item.ID)
+		//}
+
+	})
 	c1.Start()
 }
 

+ 14 - 6
apiserver/service/service.go

@@ -2,6 +2,7 @@ package service
 
 import (
 	"fmt"
+	"gorm.io/gorm"
 	"time"
 
 	"kpt.xdmy/apiserver/config"
@@ -16,20 +17,23 @@ import (
 var nch chan error
 
 type Service struct {
-	c    *config.Config
-	d    *dao.Dao
-	http *http.Client
+	c         *config.Config
+	d         *dao.Dao
+	http      *http.Client
+	sqlserver *dao.SqlServer
 }
 
 func New(conf *config.Config) *Service {
 	c := http.NewClient(conf)
 	d := dao.New(conf)
+	sqlserver := dao.NewSqlServer(conf)
 	model.ModelInit(d)
 	// SapJobInit()
-
+	SyncTable(d.DB)
 	s = &Service{
-		d:    d,
-		http: c,
+		d:         d,
+		http:      c,
+		sqlserver: sqlserver,
 	}
 	return s
 }
@@ -70,3 +74,7 @@ func (s *Service) Xorm() {
 	log.Printf("xorm:%d", time.Now().Sub(st).Milliseconds())
 
 }
+
+func SyncTable(tx *gorm.DB) {
+	tx.AutoMigrate(&model.FeeQuery{})
+}

+ 18 - 11
cmd/conf/app.ini

@@ -71,8 +71,8 @@ EasUrl = http://60.174.151.11:6888
 
 
 [database]
-DsnDsn = eq:Xdmy@1234@tcp(192.168.61.42:3306)/eq?charset=utf8&parseTime=True&loc=Local
-; ####DsnDsn = root:kepaiteng!QAZ@tcp(222.73.129.15:31306)/eq230328?charset=utf8&parseTime=True&loc=Local
+; ####DsnDsn = eq:Xdmy@1234@tcp(192.168.61.42:3306)/eq?charset=utf8&parseTime=True&loc=Local
+DsnDsn = root:kepaiteng!QAZ@tcp(222.73.129.15:31306)/eq230508?charset=utf8&parseTime=True&loc=Local
 ; ####DsnDsn = eq:Xdmy@1234@tcp(192.168.63.42:3306)/eq?charset=utf8&parseTime=True&loc=Local
 ; ####DsnDsn = root:root@tcp(127.0.0.1:3309)/test?charset=utf8&parseTime=True&loc=Local
 ; ####DsnDsn = root:root@tcp(192.168.1.93:3326)/eqdev?charset=utf8&parseTime=True&loc=Local
@@ -80,16 +80,16 @@ DsnDsn = eq:Xdmy@1234@tcp(192.168.61.42:3306)/eq?charset=utf8&parseTime=True&loc
 
 Type = mysql
 #####本地
-#User = root
-#Password = kepaiteng!QAZ
-#Host = 222.73.129.15:31306
-#Name = eq230328
+User = root
+Password = kepaiteng!QAZ
+Host = 222.73.129.15:31306
+Name = eq230508
 
 #####线上
-User = eq
-Password = Xdmy@1234
-Host = 192.168.61.42:3306
-Name = eq
+#User = eq
+#Password = Xdmy@1234
+#Host = 192.168.61.42:3306
+#Name = eq
 TablePrefix =
 
 #####现代牧业测试线
@@ -113,4 +113,11 @@ DataBits = 8
 StopBits = 1
 ParityMode = 0    #PARITY_NONE  0	PARITY_ODD  1	PARITY_EVEN  2
 InterCharacterTimeout = 100
-MinimumReadSize = 0
+MinimumReadSize = 0
+
+
+[sqlserver]
+Host = 1.13.1.127
+User = lims
+Password = 123456
+Name = lims

+ 2 - 2
cmd/conf/conf.toml

@@ -1,7 +1,7 @@
 [db]
 #dsn = "root:root@tcp(127.0.0.1:3309)/test?charset=utf8&parseTime=True&loc=Local"
-#dsn = "root:kepaiteng!QAZ@tcp(222.73.129.15:31306)/eq230328?charset=utf8&parseTime=True&loc=Local"
-dsn = "eq:Xdmy@1234@tcp(192.168.61.42:3306)/eq?charset=utf8&parseTime=True&loc=Local"
+dsn = "root:kepaiteng!QAZ@tcp(222.73.129.15:31306)/eq230508?charset=utf8&parseTime=True&loc=Local"
+#dsn = "eq:Xdmy@1234@tcp(192.168.61.42:3306)/eq?charset=utf8&parseTime=True&loc=Local"
 #dsn = "eq:Xdmy@1234@tcp(192.168.63.42:3306)/eq?charset=utf8&parseTime=True&loc=Local"
 #dsn = "root:root@tcp(192.168.1.93:3326)/eqdev?charset=utf8&parseTime=True&loc=Local"
 

+ 3 - 3
cmd/main.go

@@ -3,6 +3,7 @@ package main
 import (
 	"flag"
 	"fmt"
+	"kpt.xdmy/apiserver/dao"
 	"log"
 	"net/http"
 	"os"
@@ -11,7 +12,6 @@ import (
 
 	"github.com/kardianos/service"
 	"kpt.xdmy/apiserver/config"
-	"kpt.xdmy/apiserver/dao"
 	"kpt.xdmy/apiserver/routers"
 	"kpt.xdmy/apiserver/routers/api"
 	pservice "kpt.xdmy/apiserver/service"
@@ -36,8 +36,8 @@ import (
 // @BasePath /
 func main() {
 	var path string
-	//path = "./"
-	path = "D:/catering/eam-go/cmd/"
+	path = "./"
+	//path = "D:/catering/eam-go/cmd/"
 	flag.Parse()
 	setting.Setup(path)
 	dao.Setup()

BIN
cmd/sh/eqserver


+ 7 - 4
go.mod

@@ -27,7 +27,7 @@ require (
 	github.com/jmoiron/sqlx v1.3.5
 	github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible
 	github.com/json-iterator/go v1.1.12
-	github.com/k0kubun/pp/v3 v3.1.0
+	github.com/k0kubun/pp/v3 v3.2.0
 	github.com/kardianos/service v1.2.1
 	github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
 	github.com/patrickmn/go-cache v2.1.0+incompatible
@@ -35,17 +35,18 @@ require (
 	github.com/robfig/cron v1.2.0
 	github.com/robfig/cron/v3 v3.0.0
 	github.com/sirupsen/logrus v1.9.0
-	github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a
+	github.com/swaggo/files v1.0.1
 	github.com/swaggo/swag v1.8.3
 	github.com/tealeg/xlsx v1.0.5
 	github.com/unknwon/com v1.0.1
 	github.com/xormplus/xorm v0.0.0-20210822100304-4e1d4fcc1e67
 	github.com/xuri/excelize/v2 v2.6.1
 	gorm.io/driver/mysql v1.3.5
-	gorm.io/gorm v1.23.8
+	gorm.io/gorm v1.25.0
 )
 
 require (
+	github.com/denisenkom/go-mssqldb v0.12.3 // indirect
 	github.com/faabiosr/cachego v0.17.0 // indirect
 	github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c // indirect
 	github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect
@@ -59,9 +60,11 @@ require (
 	github.com/liyue201/goqr v0.0.0-20200803022322-df443203d4ea // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/makiuchi-d/gozxing v0.1.1 // indirect
+	github.com/mattn/go-isatty v0.0.18 // indirect
 	github.com/pelletier/go-toml/v2 v2.0.2 // indirect
 	github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
 	github.com/swaggo/gin-swagger v1.5.3
-	golang.org/x/crypto v0.1.0 // indirect
+	golang.org/x/crypto v0.8.0 // indirect
 	golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
+	gorm.io/driver/sqlserver v1.4.3 // indirect
 )

+ 86 - 0
go.sum

@@ -2,6 +2,14 @@ github.com/360EntSecGroup-Skylar/excelize v1.4.1 h1:l55mJb6rkkaUzOpSsgEeKYtS6/0g
 github.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE=
 github.com/Anderson-Lu/gofasion v0.0.0-20190530065914-6a05b679ee48 h1:Y0um3nHCQDleEpQzahJAkT8mvKTlLqvjoIqZYIAJgAw=
 github.com/Anderson-Lu/gofasion v0.0.0-20190530065914-6a05b679ee48/go.mod h1:nJfnu9e1b/lczgULa3laeoUzeadR3ylEgYj8zpXO+Wc=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.2/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1/go.mod h1:gLa1CL2RNE4s7M3yopJ/p0iq5DdY6Yv5ZUt9MTRZOQM=
+github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8=
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w=
+github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1/go.mod h1:4qFor3D/HDsvBME35Xy9rwW9DecL+M2sNw1ybjPtwA0=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
 github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
@@ -48,8 +56,12 @@ github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGii
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/denisenkom/go-mssqldb v0.12.3 h1:pBSGx9Tq67pBOTLmxNuirNTeB8Vjmf886Kx+8Y+8shw=
+github.com/denisenkom/go-mssqldb v0.12.3/go.mod h1:k0mtMFOnU+AihqFxPMiF05rtiDrorD1Vrm1KEz5hxDo=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko=
+github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
 github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
 github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI=
 github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
@@ -119,6 +131,12 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me
 github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM=
 github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
+github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
+github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
+github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
+github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -142,15 +160,26 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg=
 github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
+github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
+github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=
 github.com/iancoleman/strcase v0.1.1/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=
 github.com/jacobsa/go-serial v0.0.0-20180131005756-15cf729a72d4 h1:G2ztCwXov8mRvP0ZfjE6nAlaCX2XbykaeHdbT6KwDz0=
 github.com/jacobsa/go-serial v0.0.0-20180131005756-15cf729a72d4/go.mod h1:2RvX5ZjVtsznNZPEt4xwJXNJrM3VTZoQf7V6gk0ysvs=
+github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
+github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
+github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
+github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
+github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc=
+github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
 github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
 github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
 github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
@@ -172,6 +201,8 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/k0kubun/pp/v3 v3.1.0 h1:ifxtqJkRZhw3h554/z/8zm6AAbyO4LLKDlA5eV+9O8Q=
 github.com/k0kubun/pp/v3 v3.1.0/go.mod h1:vIrP5CF0n78pKHm2Ku6GVerpZBJvscg48WepUYEk2gw=
+github.com/k0kubun/pp/v3 v3.2.0 h1:h33hNTZ9nVFNP3u2Fsgz8JXiF5JINoZfFq4SvKJwNcs=
+github.com/k0kubun/pp/v3 v3.2.0/go.mod h1:ODtJQbQcIRfAD3N+theGCV1m/CBxweERz2dapdz1EwA=
 github.com/kardianos/service v1.2.1 h1:AYndMsehS+ywIS6RB9KOlcXzteWUzxgMgBymJD7+BYk=
 github.com/kardianos/service v1.2.1/go.mod h1:CIMRFEJVL+0DS1a3Nx06NaMn4Dz63Ng6O7dl0qH0zVM=
 github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
@@ -185,6 +216,7 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
 github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDuKuq+uX4v1fulaMbA/7ZLLhjc85h7chZGBCQ=
 github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
 github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
@@ -203,13 +235,20 @@ github.com/makiuchi-d/gozxing v0.1.1 h1:xxqijhoedi+/lZlhINteGbywIrewVdVv2wl9r5O9
 github.com/makiuchi-d/gozxing v0.1.1/go.mod h1:eRIHbOjX7QWxLIDJoQuMLhuXg9LAuw6znsUtRkNw9DU=
 github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
 github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
+github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
 github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98=
+github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
 github.com/mattn/go-sqlite3 v1.6.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
 github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
 github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/microsoft/go-mssqldb v0.21.0 h1:p2rpHIL7TlSv1QrbXJUAcbyRKnIT0C9rRkH2E4OjLn8=
+github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -217,9 +256,11 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
 github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
+github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
@@ -245,6 +286,9 @@ github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZO
 github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw=
 github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI=
 github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
+github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
+github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ=
+github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
 github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -311,6 +355,8 @@ github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PK
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a h1:kAe4YSu0O0UFn1DowNo2MY5p6xzqtJ/wQ7LZynSvGaY=
 github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w=
+github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE=
+github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg=
 github.com/swaggo/gin-swagger v1.5.3 h1:8mWmHLolIbrhJJTflsaFoZzRBYVmEE7JZGIq08EiC0Q=
 github.com/swaggo/gin-swagger v1.5.3/go.mod h1:3XJKSfHjDMB5dBo/0rrTXidPmgLeqsX89Yp4uA50HpI=
 github.com/swaggo/swag v1.8.1/go.mod h1:ugemnJsPZm/kRwFUnzBlbHRd0JY9zE1M4F+uy2pAaPQ=
@@ -351,19 +397,29 @@ go.mongodb.org/mongo-driver v1.9.0/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCu
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20221005025214-4161e89ecf1b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
 golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
+golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
+golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
 golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 h1:LRtI4W37N+KFebI/qV0OFiLUv4GLOWeEW5hn/KEJvxE=
 golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -371,10 +427,13 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
+golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
@@ -383,6 +442,10 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
 golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
 golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0=
 golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
+golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -390,6 +453,7 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -405,27 +469,38 @@ golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
 golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -434,6 +509,9 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
@@ -442,6 +520,8 @@ golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
 golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
 golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -470,6 +550,7 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/mgo.v2 v2.0.0-20160818020120-3f83fa500528/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
 gopkg.in/redis.v4 v4.2.4/go.mod h1:8KREHdypkCEojGKQcjMqAODMICIVwZAONWq8RowTITA=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
@@ -489,5 +570,10 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gorm.io/driver/mysql v1.3.5 h1:iWBTVW/8Ij5AG4e0G/zqzaJblYkBI1VIL1LG2HUGsvY=
 gorm.io/driver/mysql v1.3.5/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c=
+gorm.io/driver/sqlserver v1.4.3 h1:ji91Zb/zS7NWrMRJBfoM9C0gyxCSh9anQoJApqEkiV8=
+gorm.io/driver/sqlserver v1.4.3/go.mod h1:6ytXpaVImPf267JVRZ74Hn+gZaBRUX/HkvYx+3aS+78=
 gorm.io/gorm v1.23.8 h1:h8sGJ+biDgBA1AD1Ha9gFCx7h8npU7AsLdlkX0n2TpE=
 gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
+gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=
+gorm.io/gorm v1.25.0 h1:+KtYtb2roDz14EQe4bla8CbQlmb9dN3VejSai3lprfU=
+gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=

+ 0 - 2
pkg/http/http.go

@@ -88,9 +88,7 @@ func (c *Client) Do(req *http.Request, res interface{}) (err error) {
 	defer resp.Body.Close()
 
 	bodyRes, err := ioutil.ReadAll(resp.Body)
-	// fmt.Println(string(bodyRes))
 	err = json.Unmarshal(bodyRes, &res)
-	// err = json.NewDecoder(resp.Body).Decode(res)
 	if err != nil {
 		err = log.Error("http decode ", e, req.URL, req.Body, resp.StatusCode)
 		return

+ 10 - 0
pkg/setting/setting.go

@@ -98,8 +98,17 @@ type Database struct {
 	Dsn           string
 }
 
+type SQlServer struct {
+	Host     string
+	User     string
+	Password string
+	Name     string
+}
+
 var DatabaseSetting = &Database{}
 
+var SQlServerSetting = &SQlServer{}
+
 var cfg *ini.File
 
 var CurrentPath string
@@ -145,6 +154,7 @@ func Setup(dir string) {
 	mapTo("server", ServerSetting)
 	mapTo("database", DatabaseSetting)
 	mapTo("comm", CommSetting)
+	mapTo("sqlserver", SQlServerSetting)
 
 	AppSetting.ImageMaxSize = AppSetting.ImageMaxSize * 1024 * 1024
 	ServerSetting.ReadTimeout = ServerSetting.ReadTimeout * time.Second

+ 15 - 14
pkg/util/wxwork.go

@@ -68,7 +68,7 @@ func CronWXwork() {
 	_, err = c.AddFunc("@every 2m0s", GetMsg)          //* * * * *,  从分钟开始
 	_, err = c.AddFunc("00 00 07 * * *", GetPartsInfo) //* * * * *,  每天七点
 	cronMaintainPush()
-	c.AddFunc("@every 3m0s", cronMaintainPush)
+	c.AddFunc("@every 2m0s", cronMaintainPush)
 
 	if err != nil {
 		println("cron5 err", err.Error())
@@ -247,7 +247,8 @@ func SendRun() {
 				}
 				value["dingdingCode"] = dingTalkUser.Userid
 			}
-
+			//306804033029907132
+			//306804033029907132
 			// 调用 api
 			if value["dingdingCode"] == "" {
 				continue
@@ -681,16 +682,16 @@ func cronMaintainPush() {
 			minute := (time.Now().Unix() - lastPushTime.Unix()) / 60
 			if minute >= int64((leveloneTime * 60)) {
 				pushData = append(pushData, map[string]string{"userid": levelonecode, "empId": levelone, "tel": onetel, "dingdingCode": onedingdingCode,
-					"msg": fmt.Sprintf("【维修督办】报修单号%s超时未维修完成。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n维修人:%s\n报修人:%s\n设备主管督办提醒,请至设备管理平台操作(若已处理请忽略)",
-						main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], strings.Join(empName, ","), main["requestername"])})
+					"msg": fmt.Sprintf("【维修督办】报修单号%s超时未维修完成。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n推送时间:%s\n维修人:%s\n报修人:%s\n设备主管督办提醒,请至设备管理平台操作(若已处理请忽略)",
+						main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], time.Now().Format("2006-01-02 15:04:05"), strings.Join(empName, ","), main["requestername"])})
 				tx.Exec(` insert into maintainpush(eqId,level,usercode,pushTime,maintainId)values(?,?,?,now(),?)`, main["eqId"], 1, levelonecode, main["id"])
 			}
 		} else {
 			minute := (time.Now().Unix() - requestTime.Unix()) / 60
 			if minute >= int64((leveloneTime * 60)) {
 				pushData = append(pushData, map[string]string{"userid": levelonecode, "empId": levelone, "tel": onetel, "dingdingCode": onedingdingCode,
-					"msg": fmt.Sprintf("【维修督办】报修单号%s超时未维修完成。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n维修人:%s\n报修人:%s\n设备主管督办提醒,请至设备管理平台操作(若已处理请忽略)",
-						main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], strings.Join(empName, ","), main["requestername"])})
+					"msg": fmt.Sprintf("【维修督办】报修单号%s超时未维修完成。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n推送时间:%s\n维修人:%s\n报修人:%s\n设备主管督办提醒,请至设备管理平台操作(若已处理请忽略)",
+						main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], time.Now().Format("2006-01-02 15:04:05"), strings.Join(empName, ","), main["requestername"])})
 				_, err := tx.Exec(` insert into maintainpush(eqId,level,usercode,pushTime,maintainId)values(?,?,?,now(),?)`, main["eqId"], 1, levelonecode, main["id"])
 				fmt.Println(err)
 			}
@@ -705,16 +706,16 @@ func cronMaintainPush() {
 			minute := (time.Now().Unix() - lastPushTime.Unix()) / 60
 			if minute >= int64((leveltwoTime * 60)) {
 				pushData = append(pushData, map[string]string{"userid": leveltwocode, "empId": leveltwo, "tel": twotel, "dingdingCode": twodingdingCode,
-					"msg": fmt.Sprintf("【维修督办】报修单号%s超时未维修完成。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n维修人:%s\n报修人:%s\n设备助理督办提醒,请至设备管理平台操作(若已处理请忽略)",
-						main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], strings.Join(empName, ","), main["requestername"])})
+					"msg": fmt.Sprintf("【维修督办】报修单号%s超时未维修完成。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n推送时间:%s\n维修人:%s\n报修人:%s\n设备助理督办提醒,请至设备管理平台操作(若已处理请忽略)",
+						main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], time.Now().Format("2006-01-02 15:04:05"), strings.Join(empName, ","), main["requestername"])})
 				tx.Exec(` insert into maintainpush(eqId,level,usercode,pushTime,maintainId)values(?,?,?,now(),?)`, main["eqId"], 2, leveltwocode, main["id"])
 			}
 		} else {
 			minute := (time.Now().Unix() - requestTime.Unix()) / 60
 			if minute >= int64((leveltwoTime * 60)) {
 				pushData = append(pushData, map[string]string{"userid": leveltwocode, "empId": leveltwo, "tel": twotel, "dingdingCode": twodingdingCode,
-					"msg": fmt.Sprintf("【维修督办】报修单号%s超时未维修完成。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n维修人:%s\n报修人:%s\n设备助理督办提醒,请至设备管理平台操作(若已处理请忽略)",
-						main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], strings.Join(empName, ","), main["requestername"])})
+					"msg": fmt.Sprintf("【维修督办】报修单号%s超时未维修完成。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n推送时间:%s\n维修人:%s\n报修人:%s\n设备助理督办提醒,请至设备管理平台操作(若已处理请忽略)",
+						main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], time.Now().Format("2006-01-02 15:04:05"), strings.Join(empName, ","), main["requestername"])})
 				tx.Exec(` insert into maintainpush(eqId,level,usercode,pushTime,maintainId)values(?,?,?,now(),?)`, main["eqId"], 2, leveltwocode, main["id"])
 			}
 		}
@@ -728,16 +729,16 @@ func cronMaintainPush() {
 			minute := (time.Now().Unix() - lastPushTime.Unix()) / 60
 			if minute >= int64((levelthreeTime * 60)) {
 				pushData = append(pushData, map[string]string{"userid": levelthreecode, "empId": levelthree, "tel": threetel, "dingdingCode": threedingdingCode,
-					"msg": fmt.Sprintf("【维修督办】报修单号%s超时未完成维修。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n维修人:%s\n报修人:%s\n牧场总经理督办提醒,请至设备管理平台操作(若已处理请忽略)",
-						main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], strings.Join(empName, ","), main["requestername"])})
+					"msg": fmt.Sprintf("【维修督办】报修单号%s超时未完成维修。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n推送时间:%s\n维修人:%s\n报修人:%s\n牧场总经理督办提醒,请至设备管理平台操作(若已处理请忽略)",
+						main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], time.Now().Format("2006-01-02 15:04:05"), strings.Join(empName, ","), main["requestername"])})
 				tx.Exec(` insert into maintainpush(eqId,level,usercode,pushTime,maintainId)values(?,?,?,now(),?)`, main["eqId"], 3, levelthreecode, main["id"])
 			}
 		} else {
 			minute := (time.Now().Unix() - requestTime.Unix()) / 60
 			if minute >= int64((levelthreeTime * 60)) {
 				pushData = append(pushData, map[string]string{"userid": levelthreecode, "empId": levelthree, "tel": threetel, "dingdingCode": threedingdingCode,
-					"msg": fmt.Sprintf("【维修督办】报修单号%s超时未完成维修。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n维修人:%s\n报修人:%s\n牧场总经理督办提醒,请至设备管理平台操作(若已处理请忽略)",
-						main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], strings.Join(empName, ","), main["requestername"])})
+					"msg": fmt.Sprintf("【维修督办】报修单号%s超时未完成维修。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n推送时间:%s\n维修人:%s\n报修人:%s\n牧场总经理督办提醒,请至设备管理平台操作(若已处理请忽略)",
+						main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], time.Now().Format("2006-01-02 15:04:05"), strings.Join(empName, ","), main["requestername"])})
 				tx.Exec(` insert into maintainpush(eqId,level,usercode,pushTime,maintainId)values(?,?,?,now(),?)`, main["eqId"], 3, levelthreecode, main["id"])
 			}
 		}