baishaojie 1 年之前
父节点
当前提交
8a711cb6bc

+ 1 - 0
apiserver/dao/dao.go

@@ -64,6 +64,7 @@ func New(conf *config.Config) *Dao {
 	sqlDB.SetMaxIdleConns(10)
 	// SetConnMaxLifetime 设置了连接可复用的最大时间。
 	sqlDB.SetConnMaxLifetime(300 * time.Second)
+
 	D = &Dao{
 		DB: tx,
 	}

+ 1 - 0
apiserver/model/contract.go

@@ -61,6 +61,7 @@ type Contract struct {
 	Remark        string  `gorm:"column:remark"`
 	Specification string  `gorm:"column:specification"`
 	Unit          string  `gorm:"column:unit"`
+	IsToSap       int64   `gorm:"column:isToSap"`
 }
 
 func (c *Contract) TableName() string {

+ 33 - 0
apiserver/model/contractsaperr.go

@@ -1 +1,34 @@
 package model
+
+import "time"
+
+type ContractSapErr struct {
+	ID            int64     `gorm:"column:id;primary_key"`
+	ContractID    int       `gorm:"column:contractId"`
+	PastureID     int       `gorm:"column:pastureId"`
+	PastureName   string    `gorm:"column:pastureName"`
+	PartID        int       `gorm:"column:partId"`
+	PartName      string    `gorm:"column:partName"`
+	PartCode      string    `gorm:"column:partCode"`
+	Specification string    `gorm:"column:specification"`
+	Price         float64   `gorm:"column:price"`
+	BrandID       int       `gorm:"column:brandId"`
+	Brand         string    `gorm:"column:brand"`
+	InventoryType int       `gorm:"column:inventoryType"`
+	PlanAmount    string    `gorm:"column:planAmount"`
+	Remark        string    `gorm:"column:remark"`
+	Enable        int       `gorm:"column:enable"`
+	Unit          string    `gorm:"column:unit"`
+	IsZeroStock   int       `gorm:"column:isZeroStock"`
+	ChangeID      int       `gorm:"column:changeId"`
+	TaxCode       string    `gorm:"column:taxcode"`
+	IsToSap       int       `gorm:"column:isToSap"`
+	SapText       string    `gorm:"column:sapText"`
+	PushStatus    int       `gorm:"column:pushstatus"`
+	ContractCode  string    `gorm:"column:contractCode"`
+	CreateTime    time.Time `gorm:"column:createTime"`
+}
+
+func (ContractSapErr) TableName() string {
+	return "contractsaperr"
+}

+ 1 - 1
apiserver/model/http/asset.go

@@ -31,7 +31,7 @@ type Asset struct {
 	DepreciationYear string `json:"NDJAR"`  //折旧年限
 	Supplier         string `json:"LIFNR"`  //供应商
 	TransferFlag     string `json:"ORD44"`  //传输Y/不传输N ,删除X
-	ORD41            string `json:"ORD41"`  // 资产状态
+	ORD41            string `json:"ORD41"`  // 资产状态 A3 为报废
 
 	Segment string `json:"SEGMENT"` //细分	段
 	ORD42   string `json:"ORD42"`   //资产变动方式	出售/购入/其他/其他减少/其他增加/调拨/在建工程转入

+ 17 - 15
apiserver/model/http/sap.go

@@ -71,19 +71,21 @@ type SrmResp struct {
 }
 
 type ContractDataToASP struct {
-	MATNR string `json:"MATNR "` // 物料编码
-	LIFNR string `json:"LIFNR"`  // 供应商编码
-	EKORG string `json:"EKORG"`  // 采购组织
-	WERKS string `json:"WERKS"`  // 工厂
-	NETPR string `json:"NETPR"`  // 净价
-	WAERS string `json:"WAERS"`  // 货币
-	BPRME string `json:"BPRME"`  // 订单价格单位
-	PEINH string `json:"PEINH"`  // 订单价格
-	MWSKZ string `json:"MWSKZ"`  // 税代码
-	EKGRP string `json:"EKGRP"`  // 采购组
-	DATAB string `json:"DATAB"`  // 生效起始时间
-	DATBI string `json:"DATBI"`  // 生效结束时间
-	LOEKZ string `json:"LOEKZ"`  // 删除标识
-	ESOKZ string `json:"ESOKZ"`
-	MEINS string `json:"MEINS"` // 订单价格单位
+	MATNR        string `json:"MATNR"` // 物料编码
+	LIFNR        string `json:"LIFNR"` // 供应商编码
+	EKORG        string `json:"EKORG"` // 采购组织
+	WERKS        string `json:"WERKS"` // 工厂
+	NETPR        string `json:"NETPR"` // 净价
+	WAERS        string `json:"WAERS"` // 货币
+	BPRME        string `json:"BPRME"` // 订单价格单位
+	PEINH        string `json:"PEINH"` // 订单价格
+	MWSKZ        string `json:"MWSKZ"` // 税代码
+	EKGRP        string `json:"EKGRP"` // 采购组
+	DATAB        string `json:"DATAB"` // 生效起始时间
+	DATBI        string `json:"DATBI"` // 生效结束时间
+	LOEKZ        string `json:"LOEKZ"` // 删除标识
+	ESOKZ        string `json:"ESOKZ"`
+	MEINS        string `json:"MEINS"` // 订单价格单位
+	Code         string `json:"Code"`
+	PurchaseInfo string `json:"PurchaseInfo"`
 }

+ 199 - 27
apiserver/routers/api/db.go

@@ -4,6 +4,7 @@ import (
 	"database/sql"
 	"encoding/json"
 	"fmt"
+	"github.com/astaxie/beego/logs"
 	"io/ioutil"
 	"log"
 	"math"
@@ -270,6 +271,8 @@ func GetDataByName(c *gin.Context) {
 						}
 					}
 				}
+			} else if sqlnamestr == "UkdoneRatePasture" {
+
 			}
 			if err != nil {
 				logging.Error("GetDataByName  err: ", err)
@@ -1376,7 +1379,8 @@ func geteCow(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interfac
 	queryData := make(map[string]interface{})
 
 	receiveTime := parammaps.Get(strings.Trim("year", " ")).ValueStr()
-	pastureNames, _ := restful.MapStrList("SELECT `name` FROM pasture where `name` <> '现代牧业' order by sort")
+	pastureNames, _ := restful.MapStrList("SELECT `name` FROM pasture where `name` <> '现代牧业' and vendor = 1 and" +
+		" id not in(620,1238,1239,1240,1241,1242,1243,1244) order by sort ")
 	var pSumNow, pSumLast []map[string]string
 	rTime := ""
 	if sqlnamestr == "geteCowAllList" {
@@ -1433,7 +1437,7 @@ func geteCow(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interfac
 			}
 		}
 		if b {
-			lastYear = append(lastYear, "0.0000")
+			lastYear = append(lastYear, "0.00")
 		}
 		pasture = append(pasture, va["name"])
 		//pastureList = append(pastureList, va["name"])
@@ -1494,12 +1498,13 @@ func getpSumNow(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]inter
 	receiveTime := parammaps.Get(strings.Trim("receiveTime", " ")).ValueStr()
 	departmentName := parammaps.Get(strings.Trim("departmentName", " ")).ValueStr()
 	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)
+		pSumNow, _ = restful.MapStrList(sqlNow, rTime, rTime, receiveTime, receiveTime, departmentName, departmentName, departmentName, departmentName, departmentName, center, center)
 	} else {
 		pSumNow, _ = restful.MapStrList(sqlNow, rTime, rTime, receiveTime, center, center)
 	}
@@ -1513,7 +1518,7 @@ func getpSumNow(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]inter
 	receiveTime = strconv.Itoa(receiveTimei - 1)
 	var pSumLast []map[string]string
 	if sqlnamestr == "getpSumNow" {
-		pSumLast, _ = restful.MapStrList(sqlNow, rTime, rTime, receiveTime, departmentName, departmentName, departmentName, departmentName, departmentName, departmentName)
+		pSumLast, _ = restful.MapStrList(sqlNow, rTime, rTime, receiveTime, receiveTime, departmentName, departmentName, departmentName, departmentName, departmentName, center, center)
 	} else {
 		pSumLast, _ = restful.MapStrList(sqlNow, rTime, rTime, receiveTime)
 	}
@@ -2007,7 +2012,6 @@ func PostDataByNameOPEN(c *gin.Context) {
 // @Failure 400 {string} json "{"code":400,  "data":null,"msg":"请求参数错误"}"
 // @Failure 404 {string} json "{ "code": 404, "data":null,"msg":"请求参数错误"}"
 // @Router /data/PostDataByName  [POST]
-//
 func ExecDataByConfig(c *gin.Context) {
 	appG := app.Gin{C: c}
 	dataByte, _ := ioutil.ReadAll(c.Request.Body)
@@ -2864,26 +2868,26 @@ func ExecDataBySql(sqlstr string, params []interface{}) (interface{}, error) {
 // 		log.Default().Printf("params=%v", s_params...)
 // 		returnmsg, err := getDataBySql(sql, 0, 0, "4", s_params)
 
-// 		returnmsgmap, _ := returnmsg.(map[string]interface{})
-// 		returnmsgmap1, _ := returnmsgmap["list"].([]map[string]interface{})
-// 		if err != nil {
-// 			outentry["error_msg"] = err.Error()
-// 			error++
-// 			queryData = append(queryData, outentry)
-// 		} else if (len(returnmsgmap1) > 0) && (returnmsgmap1[0]["msg"] == "success") {
-// 			ok++
-// 		} else {
-// 			msg := geterrmsg(returnmsgmap1[0]["msg"].(string))
-// 			outentry["error_msg"] = msg
-// 			error++
-// 			queryData = append(queryData, outentry)
-// 		}
-// 	}
-// 	data["result"] = queryData
-// 	data["success"] = ok
-// 	data["err_count"] = error
-// 	appG.Response(http.StatusOK, e.SUCCESS, data)
-// }
+//			returnmsgmap, _ := returnmsg.(map[string]interface{})
+//			returnmsgmap1, _ := returnmsgmap["list"].([]map[string]interface{})
+//			if err != nil {
+//				outentry["error_msg"] = err.Error()
+//				error++
+//				queryData = append(queryData, outentry)
+//			} else if (len(returnmsgmap1) > 0) && (returnmsgmap1[0]["msg"] == "success") {
+//				ok++
+//			} else {
+//				msg := geterrmsg(returnmsgmap1[0]["msg"].(string))
+//				outentry["error_msg"] = msg
+//				error++
+//				queryData = append(queryData, outentry)
+//			}
+//		}
+//		data["result"] = queryData
+//		data["success"] = ok
+//		data["err_count"] = error
+//		appG.Response(http.StatusOK, e.SUCCESS, data)
+//	}
 func ImportExcel(c *gin.Context) {
 	appG := app.Gin{C: c}
 
@@ -2990,6 +2994,7 @@ func ImportExcel(c *gin.Context) {
 	data["err_count"] = error
 	appG.Response(http.StatusOK, e.SUCCESS, data)
 }
+
 func DownloadMailReport(context *gin.Context) {
 	dataByte, _ := ioutil.ReadAll(context.Request.Body)
 	fsion := gofasion.NewFasion(string(dataByte))
@@ -2998,7 +3003,7 @@ func DownloadMailReport(context *gin.Context) {
 	pastureId := fsion.Get("pastureId").ValueStr()
 	pastureName := fsion.Get("pastureName").ValueStr()
 	date := fsion.Get("date").ValueStr()
-	logging.Info("DownloadMailReport ", context.Keys, sqlnamestr, pastureName)
+
 	filepath := ""
 
 	if sqlnamestr == "DownloadMailReportJY" {
@@ -3059,7 +3064,7 @@ func PastureDepartment(c *gin.Context) {
 	appG.Response(http.StatusOK, e.SUCCESS, checkDeptList)
 }
 
-//{ 'label': '汶上', 'property': 'm1' }
+// { 'label': '汶上', 'property': 'm1' }
 // 资产标准管理
 func Equipment(c *gin.Context) {
 
@@ -3416,3 +3421,170 @@ func GetMtbfTable(c *gin.Context) {
 	data["userId"] = "99"
 	appG.Response(http.StatusOK, e.SUCCESS, data)
 }
+
+func GetPartsListSGv2(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	sqlnamestr := fsion.Get("name").ValueStr()
+	params := fsion.Get("parammaps")
+	pastureId := params.Get("pastureId").ValueStr()
+	pastureName := params.Get("pastureName").ValueStr()
+	partCode := params.Get("partCode").ValueStr()
+
+	sql, _ := restful.GetSqlByNameDBT(sqlnamestr, nil)
+	partList, err := restful.MapStrList(sql, partCode, pastureId, pastureId, partCode, pastureId, partCode, partCode)
+	if err != nil {
+		logs.Error(err)
+		appG.Response(http.StatusInternalServerError, e.ERROR, false)
+		return
+	}
+
+	pastureSql := `select id from pasture_bigcontract  where bigcontract_id in(select id from bigcontract 
+         where contractCode like concat("%",?,"%"))   and pasture_id = ?
+         union 
+         select  id from bigcontract  where contractCode like concat("%",?,"%") and pastureId = ? `
+	var prices []string
+	var priceExist []string
+	resp := make(map[string]string)
+
+	for _, part := range partList {
+		pastureBigcontract, err := restful.MapStrList(pastureSql, part["contractCode"], pastureId, part["contractCode"], pastureId)
+		if err != nil {
+			logs.Error(err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, false)
+			return
+		}
+		if len(pastureBigcontract) > 0 {
+			//partMap[part["contractCode"]] = true
+			priceExist = append(priceExist, part["price"])
+			part["price"] = ""
+			resp = part
+		} else {
+			//partMap[part["contractCode"]] = false
+			prices = append(prices, part["price"])
+		}
+	}
+
+	partMap := make(map[string]int64)
+	for i, p := range priceExist {
+		if _, ok := partMap[p]; !ok {
+			partMap[p] = partMap[p] + 1
+			if i == 0 {
+				resp["price"] = fmt.Sprintf("%s %s ", pastureName, p)
+			} else {
+				resp["price"] = fmt.Sprintf("%s ,%s %s ", resp["price"], pastureName, p)
+			}
+		}
+	}
+
+	for _, p := range prices {
+		if _, ok := partMap[p]; !ok {
+			partMap[p] = partMap[p] + 1
+			if len(resp["price"]) > 0 {
+				resp["price"] = fmt.Sprintf("%s ,现价格 %s ", resp["price"], p)
+			} else {
+				resp["price"] = fmt.Sprintf("现价格 %s ", p)
+			}
+		}
+	}
+
+	appG.Response(http.StatusOK, e.SUCCESS, map[string]interface{}{"list": []map[string]string{resp}})
+}
+
+func GetWaterAndElectricity(context *gin.Context) {
+	appG := app.Gin{C: context}
+	dataByte, _ := ioutil.ReadAll(context.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	//filename := context.Param("filename")
+	sqlnamestr := fsion.Get("name").ValueStr()
+	pastureName := fsion.Get("pastureId").ValueStr()
+	//pastureName := fsion.Get("pasture").ValueStr()
+	//date := fsion.Get("date").ValueStr()
+	parammap := fsion.Get("parammaps")
+	logging.Info("DownloadMailReport ", context.Keys, sqlnamestr, pastureName)
+	sqlnamesDepartment := []string{}
+	///"维修费","水费","电费","柴油费","水量","电量","柴油用量"
+	if pastureName == "现代牧业" {
+		sqlnamesDepartment = []string{
+			"getChooseWaterPrice",
+			"getChooseElectricityPrice",
+			"getChooseMonthiolPrice"}
+	} else {
+		sqlnamesDepartment = []string{
+			"getChooseWaterPriceByPasture",
+			"getChooseElectricityPriceByPasture",
+			"getChooseMonthiolPriceByPasture"}
+	}
+
+	//if pastureId == "现代牧业" {
+	//	sqlnames = []string{"getChooseEqMonthBudgetListSumAll", "getChooseMonthWX", "getChooseWaterPrice", "getChooseElectricityPrice", "getChooseMonthiolPrice",
+	//		"getChooseMonthWater", "getChooseMonthElectricity", "getChooseMonthOilT", "getLgnitionChargePrice", "getChooseBiomassPrice", "getChooseGasolinePrice",
+	//		"getChooseCoalPrice"}
+	//} else {
+	//	sqlnames = []string{"getChooseEqMonthBudgetListSumAllByPasture", "getChooseMonthWXByPasture", "getChooseWaterPriceByPasture", "getChooseElectricityPriceByPasture", "getChooseMonthiolPriceByPasture",
+	//		"getChooseMonthWaterByPasture", "getChooseMonthElectricityByPasture", "getChooseMonthOilTByPasture", "getLgnitionChargePriceByPasture", "getChooseBiomassPriceByPasture", "getChooseGasolinePriceByPasture",
+	//		"getChooseCoalPriceByPasture"}
+	//}
+
+	respMapList := make([]map[string]string, 0)
+
+	for _, sqlname := range sqlnamesDepartment {
+		valuesMap, err := restful.MapStr("SELECT sqlstr,params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", sqlname)
+		//parammap := make(map[string]interface{}, 0)
+
+		s_params := make([]interface{}, 0)
+		paramslist := strings.Split(valuesMap["params"], ",")
+		if len(paramslist) > 0 && valuesMap["params"] != "" {
+			for _, value := range paramslist {
+				if value == "pastureId" && parammap.Get("pastureId").ValueStr() == "" {
+					s_params = append(s_params, "现代牧业")
+					continue
+				}
+				s_params = append(s_params, parammap.Get(strings.Trim(value, " ")).ValueStr())
+			}
+		}
+		values, err := restful.MapStrList(valuesMap["sqlstr"], s_params...)
+		if err != nil {
+			fmt.Println(err)
+		} else {
+			for _, v := range values {
+				exist := false
+				for _, item := range respMapList {
+					if item["pastureName"] == v["pastureName"] {
+						exist = true
+						if sqlname == "getChooseWaterPrice" || sqlname == "getChooseWaterPriceByPasture" {
+							item["waterOneCowSumPrice"] = v["oneCowSumPrice"]
+							item["waterSumPrice"] = v["sumPrice"]
+						} else if sqlname == "getChooseElectricityPrice" || sqlname == "getChooseElectricityPriceByPasture" {
+							item["electricityOneCowSumPrice"] = v["oneCowSumPrice"]
+							item["electricitySumPrice"] = v["sumPrice"]
+						} else if sqlname == "getChooseMonthiolPrice" || sqlname == "getChooseMonthiolPriceByPasture" {
+							item["monthiolOneCowSumPrice"] = v["oneCowSumPrice"]
+							item["monthiolSumPrice"] = v["sumPrice"]
+						}
+						break
+					}
+				}
+				if !exist {
+					respMap := make(map[string]string, 0)
+					respMap["pastureName"] = v["pastureName"]
+					if sqlname == "getChooseWaterPrice" || sqlname == "getChooseWaterPriceByPasture" {
+						respMap["waterOneCowSumPrice"] = v["oneCowSumPrice"]
+						respMap["waterSumPrice"] = v["sumPrice"]
+					} else if sqlname == "getChooseElectricityPrice" || sqlname == "getChooseElectricityPriceByPasture" {
+						respMap["electricityOneCowSumPrice"] = v["oneCowSumPrice"]
+						respMap["electricitySumPrice"] = v["sumPrice"]
+					} else if sqlname == "getChooseMonthiolPrice" || sqlname == "getChooseMonthiolPriceByPasture" {
+						respMap["monthiolOneCowSumPrice"] = v["oneCowSumPrice"]
+						respMap["monthiolSumPrice"] = v["sumPrice"]
+					}
+					respMapList = append(respMapList, respMap)
+				}
+			}
+
+		}
+	}
+
+	appG.Response(http.StatusOK, e.SUCCESS, map[string]interface{}{"data": respMapList})
+}

+ 5 - 0
apiserver/routers/router.go

@@ -139,6 +139,11 @@ func InitRouter() *gin.Engine {
 		apiV1.POST("/Testpartitions", api.Testpartitions)
 		// eas 对接
 		apiV1.POST("/EasSync", api.EasSync)
+
+		apiV1.POST("/partslistSGv2", api.GetPartsListSGv2)
+
+		apiV1.POST("/waterandelectricity", api.GetWaterAndElectricity)
+
 	}
 	if setting.ServerSetting.NoAuth > 0 {
 

+ 10 - 3
apiserver/routers/sap.go

@@ -11,6 +11,7 @@ import (
 	"kpt.xdmy/apiserver/routers/restful"
 	"kpt.xdmy/apiserver/service"
 	"kpt.xdmy/pkg/logging"
+	"strconv"
 )
 
 func ProofList(c *gin.Context) {
@@ -136,8 +137,6 @@ func LaidProof(c *gin.Context) {
 
 //手动出库
 func UseProof(c *gin.Context) {
-	//p := new(http.ProofPartReq)
-	//c.Bind(&p)
 	dataByte, _ := ioutil.ReadAll(c.Request.Body)
 	fsion := gofasion.NewFasion(string(dataByte))
 	//parammaps := fsion.Get("list").Array()
@@ -259,12 +258,20 @@ func EquipmentExec(c *gin.Context) {
 		err = errors.Wrap(err, "AddManagement-error")
 		return
 	}
+	pastureIdstr := c.PostForm("pastureId")
+	//dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	//fsion := gofasion.NewFasion(string(dataByte))
+	//pastureId := fsion.Get("pastureId").ValueInt()
 
 	f, _ := file.Open()
 	xlsx1, err := excelize.OpenReader(f)
 	rows := xlsx1.GetRows("设备基础信息")
 
-	err = service.EquipmentExec(rows)
+	pastureId, err := strconv.Atoi(pastureIdstr)
+	if err != nil {
+		panic(err)
+	}
+	err = service.EquipmentExec(rows, pastureId)
 	if err != nil {
 		c.JSON(500, map[string]interface{}{"code": 500, "data": map[string]interface{}{"code": 0}, "msg": "fail"})
 		return

+ 99 - 17
apiserver/service/asset.go

@@ -138,6 +138,7 @@ func updateEQ(p *http.Asset) {
 		eq.Enable = 1
 		eq.CompanyCode = p.CompanyCode
 		eq.Depreciation = p.DepreciationYear
+
 		eq.SHStatus = 1
 		eq.Status = 17
 		eq.PurchaseDate = p.BuyDate
@@ -145,9 +146,8 @@ func updateEQ(p *http.Asset) {
 	}
 	eq.Yuanzhi = p.BuyValue
 	eq.Quantity = p.Quantity
-	eq.PastureId = pa.ID
 	eq.Salvage = p.Salvage
-	//eq.EntranceDate = p.BuyDate
+	eq.PastureId = pa.ID
 
 	dep := new(model.Department)
 	s.d.DB.Where("costCenter_code = ? ", p.CostCenter).First(&dep)
@@ -156,13 +156,16 @@ func updateEQ(p *http.Asset) {
 		eq.DepartmentName = dep.Name
 	}
 
-	if p.TransferFlag == "X" {
-		eq.Statue = 19
+	if p.ORD41 == "A3" {
+		eq.Status = 19
+	} else {
+		eq.Status = 17
 	}
 
-	if p.BuyValue == "" || p.BuyValue == "0" || p.BuyValue == "0.00 " {
-		return
-	}
+	//if p.BuyValue == "" || p.BuyValue == "0" || p.BuyValue == "0.00 " {
+	//	return
+	//}
+
 	fmt.Println(eq)
 	if oldeq.Id == 0 {
 		if e := s.d.DB.Where(model.Equipment{FinanceCode: eq.FinanceCode}).Assign(eq).FirstOrCreate(&eq).Error; e != nil {
@@ -172,7 +175,11 @@ func updateEQ(p *http.Asset) {
 			//assetChan <- nil
 		}
 	} else {
-		s.d.DB.Where(model.Equipment{FinanceCode: eq.FinanceCode}).Updates(&eq)
+		eq.Id = oldeq.Id
+		err := s.d.DB.Model(eq).Where("id = ? ", oldeq.Id).Updates(eq).Error
+		if err != nil {
+			log.Error(err)
+		}
 	}
 }
 
@@ -181,15 +188,14 @@ type Equipment struct {
 	PastureName string `gorm:"column:pastureName" json:"pastureName"`
 	EqName      string `gorm:"column:eqName" json:"eqName"`
 	//AssetCode        interface{} `gorm:"column:assetCode" json:"assetCode"`
-	EqClassName    string `gorm:"column:eqClassName" json:"eqClassName"`
-	Specification  string `gorm:"column:specification" json:"specification"`
-	DepartmentId   string `gorm:"column:departmentId" json:"departmentId"`
-	DepartmentName string `gorm:"column:departmentName" json:"departmentName"`
-	EntranceDate   string `gorm:"column:entranceDate" json:"entranceDate"`
-	Purpose        string `gorm:"column:purpose" json:"purpose"`
-	Yuanzhi        string `gorm:"column:yuanzhi" json:"yuanzhi"`
-	Id             int    `gorm:"column:id" json:"id"`
-	//EqCode           interface{} `gorm:"column:eqCode" json:"eqCode"`
+	EqClassName      string    `gorm:"column:eqClassName" json:"eqClassName"`
+	Specification    string    `gorm:"column:specification" json:"specification"`
+	DepartmentId     string    `gorm:"column:departmentId" json:"departmentId"`
+	DepartmentName   string    `gorm:"column:departmentName" json:"departmentName"`
+	EntranceDate     string    `gorm:"column:entranceDate" json:"entranceDate"`
+	Purpose          string    `gorm:"column:purpose" json:"purpose"`
+	Yuanzhi          string    `gorm:"column:yuanzhi" json:"yuanzhi"`
+	Id               int       `gorm:"column:id" json:"id"`
 	EqClassId        int       `gorm:"column:eqClassId" json:"eqClassId"`
 	FinanceCode      string    `gorm:"column:financeCode" json:"financeCode"`
 	ProName          string    `gorm:"column:proName" json:"proName"`
@@ -242,3 +248,79 @@ type Equipment struct {
 
 	SapCode string `gorm:"column:sapCode" json:"sapCode"`
 }
+
+func (t *Equipment) TableName() string {
+	return "equipment"
+}
+
+// 更新设备维修和保养费用
+func updateEqYearMaintainCostAndYearUpkeepCost(pastureId int, start, end string) {
+	//eqList := make([]model.Equipment, 0)
+	//s.d.DB.Raw(` select id from equipment where pastureid = ? `, pastureId).Find(&eqList)
+
+	//for _, eq := range eqList {
+	//更新设备维修费用
+	err := s.d.DB.Debug().Exec(`update equipment e  set yearMaintainCost = (
+SELECT
+	sum( p.sumPrice ) 
+FROM
+	bigpartuse bp
+	JOIN partuse p ON p.bigid = bp.id 
+WHERE
+	p.eqCode = e.eqCode  and bp.pastureId = ?
+AND
+IF
+	((
+		SELECT
+			count( 1 ) 
+		FROM
+			bigpartapply bpa 
+		WHERE
+			bpa.applyCode = bp.oddCode  and bpa.pastureId =  bp.pastureId
+			AND bpa.applyType = 1 
+			) > 0 or (select count(1) from bigoutsourcing bo where bo.outsourcingCode = bp.oddCode  ) >0,
+		1,
+	0 
+	) = 1 and  bp.receiveTime  between ? and ? and p.dflag =  0 ) where e.pastureId = ?`, pastureId, start, end, pastureId).Error
+	if err != nil {
+		log.Error(err)
+	}
+
+	//更新设备保养费用
+	err = s.d.DB.Debug().Exec(`update equipment e  set yearUpkeepCost = (
+SELECT
+	sum( p.sumPrice ) 
+FROM
+	bigpartuse bp
+	JOIN partuse p ON p.bigid = bp.id 
+WHERE
+	p.eqCode = e.eqCode  and bp.pastureId = ?
+AND
+IF
+	((
+		SELECT
+			count( 1 ) 
+		FROM
+			bigpartapply bpa 
+		WHERE
+			bpa.applyCode = bp.oddCode  and bpa.pastureId =  bp.pastureId
+			AND bpa.applyType = 2 
+			) > 0,
+		1,
+	0 
+	) = 1 and   bp.receiveTime   between ? and ?   and p.dflag =  0  ) where e.pastureId = ?`, pastureId, start, end, pastureId).Error
+	if err != nil {
+		log.Error(err)
+	}
+	//}
+	err = s.d.DB.Debug().Exec(`UPDATE equipment 
+SET leaveDate = DATE_ADD( DATE_FORMAT( entranceDate, '%Y-%m-%d' ), INTERVAL depreciation * 12 MONTH ) 
+WHERE
+ entranceDate IS NOT NULL 
+ AND entranceDate != ''  and entranceDate != '0000-00-00' and entranceDate != '00000000'  and entranceDate != 'null'
+ AND depreciation IS NOT NULL 
+ AND depreciation != ''    and pastureId = ? `, pastureId).Error
+	if err != nil {
+		log.Error(err)
+	}
+}

+ 37 - 7
apiserver/service/charge_off.go

@@ -95,9 +95,10 @@ func UpdateProof(p *model.ProofReq, tx *gorm.DB) error {
 		rowsNumbers = append(rowsNumbers, strconv.Itoa(rowsNumber))
 	}
 
-	if p.NumberType != 2 && p.NumberType != 1 {
+	if p.NumberType == 1 {
 		//for _, item := range p.ProofPart {
-		if e := tx.Table(tname).Where("bigid=? ", p.OrderNumberId).Where("  FIND_IN_SET(rowNumber,? ) ", strings.Join(rowsNumbers, ",")).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
@@ -107,7 +108,16 @@ func UpdateProof(p *model.ProofReq, tx *gorm.DB) error {
 		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 {
+	} else if p.NumberType == 3 {
+		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)
+		}
+		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 p.NumberType == 2 {
+
 		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)
@@ -152,6 +162,25 @@ func UpdateProof(p *model.ProofReq, tx *gorm.DB) error {
 				return err
 			}
 		}
+	} else if p.NumberType == 2 {
+		partRefundList := make([]*model.PartRefund, 0)
+		err := tx.Raw(`select * from partrefund where bigid = ?  and  FIND_IN_SET(rowNumber,? )  `, p.OrderNumberId, strings.Join(rowsNumbers, ",")).
+			Find(&partRefundList).Error
+		if err != nil {
+			log.Error(err)
+			return err
+		}
+
+		for _, part := range partRefundList {
+			err := tx.Exec(` update part_repertory pr set pr.reportery = pr.reportery + ?
+                       where pr.partCode = ? and pr.contractId = ? 
+                         and (select pastureid  from warehouse where id = pr.locationId  and status = 1  limit 1 ) =  (select pastureId from bigpartrefund where id = ? ) `,
+				part.RefundNumber, part.PartCode, part.ContractID, p.OrderNumberId).Error
+			if err != nil {
+				log.Error(err)
+				return err
+			}
+		}
 	}
 	return nil
 }
@@ -189,7 +218,7 @@ func (s *Service) laidProofList(p *model.ProofReq) (hrp *http.Response) {
 	p.ProofYear = bp.CreatDate.Format("2006")
 
 	parts := make([]model.PartLaid, 0)
-	if e = s.d.DB.Raw(` select * from partlaid where  bigid = ? order by rowNumber,id desc `, bp.ID).Order("rowNumber,id desc ").
+	if e = s.d.DB.Raw(` select * from partlaid where  bigid = ? and dflag != 1 order by rowNumber,id desc `, bp.ID).Order("rowNumber,id desc ").
 		Find(&parts).Error; e != nil || len(parts) == 0 {
 		hrp.Message = fmt.Sprintf("入库单明细查询报错或结果为空:bigid=%v error=%v,", bp.ID, e)
 		hrp.Msg = "fail"
@@ -257,7 +286,8 @@ func (s *Service) returnProofList(p *model.ProofReq) (hrp *http.Response) {
 	p.ProofYear = bp.CreateTime.Format("2006")
 
 	funds := []model.PartRefund{}
-	if e = s.d.DB.Order("rowNumber,id desc ").Find(&funds, model.PartRefund{BigID: bp.ID}).Error; e != nil || len(funds) == 0 {
+
+	if e = s.d.DB.Where(" bigId = ? ", bp.ID).Where(" dflag != 1 ").Order("rowNumber,id desc ").Find(&funds).Error; e != nil || len(funds) == 0 {
 		hrp.Message = fmt.Sprintf("PartRefund  query error  . bigid=%v error=%v,", bp.ID, e)
 		hrp.Msg = "fail"
 		return
@@ -314,7 +344,7 @@ func (s *Service) useProofList(p *model.ProofReq) (hrp *http.Response) {
 	p.ChargeDate = bp.ReceiveTime.Format("2006-01-02")
 	p.ProofYear = bp.ReceiveTime.Format("2006")
 	uses := make([]model.PartUse, 0)
-	if e = s.d.DB.Order("rowNumber,id desc ").Find(&uses, model.PartUse{BigID: bp.ID}).Error; e != nil || len(uses) == 0 {
+	if e = s.d.DB.Where("bigId = ?", bp.ID).Where(" dflag != 1 ").Order("rowNumber,id desc ").Find(&uses).Error; e != nil || len(uses) == 0 {
 		log.Error(e)
 		hrp.Message = fmt.Sprintf("PartUse bigid = %v ", bp.ID)
 		return
@@ -406,7 +436,7 @@ func (s *Service) quitProofList(p *model.ProofReq) (hrp *http.Response) {
 	p.ChargeDate = bp.QuitDate.Format("2006-01-02")
 	p.ProofYear = bp.QuitDate.Format("2006")
 	parts := make([]model.Partquit, 0)
-	if e = s.d.DB.Order("rowNumber,id desc ").Find(&parts, model.Partquit{BigID: bp.ID}).Error; e != nil || len(parts) == 0 {
+	if e = s.d.DB.Where("bigId = ?", bp.ID).Where(" dflag != 1 ").Order("rowNumber,id desc ").Find(&parts).Error; e != nil || len(parts) == 0 {
 		hrp.Message = fmt.Sprintf("partquit  bigid = %d ", bp.ID)
 		hrp.Msg = "fail"
 		return

+ 193 - 59
apiserver/service/contract.go

@@ -1,9 +1,11 @@
 package service
 
 import (
+	"encoding/json"
 	"fmt"
+	"kpt.xdmy/apiserver/config"
+	"strconv"
 	"strings"
-	"sync"
 	"time"
 
 	log "github.com/sirupsen/logrus"
@@ -12,19 +14,18 @@ import (
 )
 
 const (
-	ContractToAspUrl    = "http://192.168.61.117/SAPQ0/SRM/MM018/PurchaseInfo"
+	//ContractToAspUrl    = config.Conf.Http.Routing + "/SRM/MM018/PurchaseInfo"
 	ContractToAspDestID = "EQMAN"
 	ContractToAspBussTp = "MM018"
 	ContractLimit       = 10
 )
 
 var (
-	ContractCodeMap = make(map[string][]*model.PastureBigcontract, 0)
-	sapContractReq  = &http.SapContractReq{
+	sapContractReq = &http.SapContractReq{
 		Dest: &http.Dest{
 			DestID: ContractToAspDestID,
 			BussTp: ContractToAspBussTp,
-			Url:    ContractToAspUrl,
+			//Url:    ContractToAspUrl,
 		},
 		DATA: &http.ContractDataToASP{},
 	}
@@ -40,16 +41,30 @@ type ContractInfo struct {
 
 // GetBigContractData 获取主合同信息
 func GetBigContractData() []*model.BigContract {
-	bigContractData := make([]*model.BigContract, ContractLimit)
-	if err := s.d.DB.Where("isToSap = ?", 0).Limit(ContractLimit).Find(&bigContractData).Debug().Error; err != nil {
+	bigContractData := make([]*model.BigContract, 0)
+	if err := s.d.DB.Where("isToSap = ?", 0).Where("SHStatus = ?", 7).Find(&bigContractData).Debug().Error; err != nil {
 		log.Errorf("AutoContractToASP Error:%v", err)
 	}
+
+	for _, item := range bigContractData {
+		if item.SHStatus == 7 && item.SHtype == 3 && item.CGChargedate.UnixNano() > time.Now().AddDate(0, 0, -1).UnixNano() {
+			contractCodeSlice := strings.Split(item.ContractCode, "-")
+			contractCode := contractCodeSlice[0]
+			s.d.DB.Exec(`update contract  set isToSap = 0 where enable = 1 and bigid in(select id from bigContract where like ? )`, "%"+contractCode+"%")
+		}
+	}
+
 	return bigContractData
 }
 
 func GetPastureBigContract(contractCode string) ([]*model.PastureBigcontract, error) {
 	pastureBigContract := make([]*model.PastureBigcontract, 0)
-	SQL := fmt.Sprintf("SELECT * FROM pasture_bigcontract WHERE bigcontract_id IN (SELECT id FROM bigcontract WHERE contractCode LIKE '%s' AND enable = 1)", contractCode)
+	SQL := fmt.Sprintf("select  t.* from( "+
+		" select pastureId as pasture_id  ,enable    FROM bigcontract WHERE  contractCode LIKE '%s'   and SHStatus  = 7   GROUP BY pastureId "+
+		" union all "+
+		" SELECT pasture_id, enable FROM pasture_bigcontract WHERE bigcontract_id IN (SELECT id FROM bigcontract WHERE contractCode LIKE  '%s' AND enable = 1  and SHStatus  = 7  )  )t"+
+		" join pasture p on p.id = t.pasture_id  "+
+		" group by pasture_id", "%"+contractCode+"%", "%"+contractCode+"%")
 	if err := s.d.DB.Raw(SQL).Find(&pastureBigContract).Error; err != nil {
 		return nil, err
 	}
@@ -59,115 +74,234 @@ func GetPastureBigContract(contractCode string) ([]*model.PastureBigcontract, er
 
 // GetContractInfo 获取合同相关信息
 func GetContractInfo(bigContract *model.BigContract, pastureBigContract *model.PastureBigcontract) *ContractInfo {
-	wg := sync.WaitGroup{}
-	wg.Add(3)
+	//wg := sync.WaitGroup{}
+	//wg.Add(3)
 	contractInfo := &ContractInfo{}
 	// 获取牧场数据合同数据
-	go func() {
-		pasture := &model.Pasture{
-			ID: pastureBigContract.PastureId,
-		}
-		if err := s.d.DB.First(pasture).Error; err != nil {
-			log.Errorf("AutoContractToASP Pasture Err:%v,bigContractData:%v", err, bigContract)
-		}
-		contractInfo.Pasture = pasture
-		wg.Done()
-	}()
+	//go func() {
+	pasture := &model.Pasture{
+		ID: pastureBigContract.PastureId,
+	}
+	if err := s.d.DB.First(pasture).Error; err != nil {
+		log.Errorf("AutoContractToASP Pasture Err:%v,bigContractData:%v", err, bigContract)
+	}
+	contractInfo.Pasture = pasture
+	//	wg.Done()
+	//}()
 
 	// 获取合同子表数据
-	go func() {
-		contract := make([]*model.Contract, 0)
-		if err := s.d.DB.Where("bigId = ?", bigContract.ID).Find(&contract).Error; err != nil {
-			log.Errorf("AutoContractToASP contract Err:%v,bigContractData:%v", err, bigContract)
-		}
-		contractInfo.Contract = contract
-		wg.Done()
-	}()
+	//go func() {
+	contract := make([]*model.Contract, 0)
+	if err := s.d.DB.Debug().Where("bigId = ?", bigContract.ID).Where("isToSap = ? ", 0).Find(&contract).Error; err != nil {
+		log.Errorf("AutoContractToASP contract Err:%v,bigContractData:%v", err, bigContract)
+	}
+	contractInfo.Contract = contract
+	//	wg.Done()
+	//}()
 
 	// 获取供应商数据
-	go func() {
-		provider := &model.Provider{
-			ID: bigContract.ProviderID,
-		}
-		if err := s.d.DB.First(provider).Error; err != nil {
-			log.Errorf("AutoContractToASP Provider Err:%v,bigContractData:%v", err, bigContract)
-		}
-		contractInfo.Provider = provider
-		wg.Done()
-	}()
-	wg.Wait()
+	//go func() {
+	provider := &model.Provider{
+		ID: bigContract.ProviderID,
+	}
+	if err := s.d.DB.First(provider).Error; err != nil {
+		log.Errorf("AutoContractToASP Provider Err:%v,bigContractData:%v", err, bigContract)
+	}
+	contractInfo.Provider = provider
+	//	wg.Done()
+	//}()
+	//wg.Wait()
 	return contractInfo
 }
 
+// http://192.168.61.117/SAPQ0/SRM/MM018/PurchaseInfo
 // AutoContractToASP 合同信息自动同步到ASP
 func AutoContractToASP() {
+	sapContractReq.Url = config.Conf.Http.Routing + "/SRM/MM018/PurchaseInfo"
+
 	bigContractData := GetBigContractData()
+	ContractCodeMap := make(map[string][]*model.PastureBigcontract, 0)
+	errDataList := make(map[string][]*model.ContractSapErr, 0)
+	contractInfoList := make([]*ContractInfo, 0)
 	for _, bigContract := range bigContractData {
 		contractCode := bigContract.ContractCode
-		if strings.Contains(bigContract.ContractCode, "-") {
-			contractCodeSlice := strings.Split(bigContract.ContractCode, "-")
-			contractCode = contractCodeSlice[0]
-		}
-		if _, ok := ContractCodeMap[contractCode]; ok {
+		if bigContract.SHStatus != 7 {
 			continue
 		}
-		pastureBigContractSlice, err := GetPastureBigContract(contractCode)
-		if err != nil {
-			log.Errorf("AutoContractToASP pastureBigContractSlice Err:%v", err)
+
+		var count int64
+		s.d.DB.Debug().Table(new(model.BigContract).TableName()).Where("id =  ? ", bigContract.ID).Where("isToSap = ?", 0).Count(&count)
+		if count == 0 {
 			continue
 		}
-		for _, pastureBigContract := range pastureBigContractSlice {
-			// 获取合同相关数据集合
-			contractInfo := GetContractInfo(bigContract, pastureBigContract)
-			if len(contractInfo.Contract) == 0 || pastureBigContract.PastureId == 18 {
+
+		if strings.Contains(bigContract.ContractCode, "-") {
+			contractCodeSlice := strings.Split(bigContract.ContractCode, "-")
+			contractCode = contractCodeSlice[0]
+		}
+		var err error
+		pastureBigContractSlice := make([]*model.PastureBigcontract, 0)
+		if _, ok := ContractCodeMap[contractCode]; !ok {
+			pastureBigContractSlice, err = GetPastureBigContract(contractCode)
+			if err != nil {
+				log.Errorf("AutoContractToASP pastureBigContractSlice Err:%v", err)
 				continue
 			}
-			// 发送数据至SAP
-			PushContractDataToSAP(bigContract, contractInfo)
-			ContractCodeMap[contractCode] = append(ContractCodeMap[contractCode], pastureBigContract)
+			ContractCodeMap[contractCode] = append(ContractCodeMap[contractCode], pastureBigContractSlice...)
+			//if err := s.d.DB.Debug().Table(new(model.BigContract).TableName()).Where("contractCode like  ? ", "%"+contractCode+"%").Update("isToSap", 1).Error; err != nil {
+			//	log.Errorf("AutoContractToASP SQLUpdate Error:%v", err)
+			//}
 		}
-		if err = s.d.DB.Model(bigContract).Where("id = ?", bigContract.ID).Update("isToSap", 1).Error; err != nil {
+		if err := s.d.DB.Debug().Table(new(model.BigContract).TableName()).Where("id =  ? ", bigContract.ID).Update("isToSap", 1).Error; err != nil {
 			log.Errorf("AutoContractToASP SQLUpdate Error:%v", err)
 		}
+
+		if _, ok := ContractCodeMap[contractCode]; ok {
+
+			for _, pastureBigContract := range ContractCodeMap[contractCode] {
+				// 获取合同相关数据集合
+				contractInfo := GetContractInfo(bigContract, pastureBigContract)
+				if len(contractInfo.Contract) == 0 || pastureBigContract.PastureId == 18 {
+					continue
+				}
+
+				// 发送数据至SAP
+				errData := PushContractDataToSAP(bigContract, contractInfo, contractCode)
+				for _, data := range errData {
+					errDataList[contractCode] = append(errDataList[contractCode], data...)
+				}
+				contractInfoList = append(contractInfoList, contractInfo)
+				//go func(bigContract *model.BigContract, contractInfo *ContractInfo) {
+				//}(bigContract, contractInfo)
+				//ContractCodeMap[contractCode] = append(ContractCodeMap[contractCode], pastureBigContract)
+			}
+		}
+	}
+	now := time.Now()
+	for _, contractSapErr := range errDataList {
+		for _, c := range contractSapErr {
+			c.CreateTime = now
+			s.d.DB.Create(&c)
+		}
 	}
+
+	for _, contractInfo := range contractInfoList {
+		for _, c := range contractInfo.Contract {
+			if c.IsToSap == 0 {
+				if err := s.d.DB.Table("contract").Where("id = ?", c.ID).Update("isToSap", 1).Error; err != nil {
+					log.Errorf("AutoContractToASP SQLUpdate Error:%v", err)
+				}
+			}
+		}
+	}
+
 	log.Info("AutoContractToASP Success")
 }
 
 // PushContractDataToSAP 同步数据给SAP
-func PushContractDataToSAP(bigContract *model.BigContract, contractInfo *ContractInfo) {
+func PushContractDataToSAP(bigContract *model.BigContract, contractInfo *ContractInfo, contractCode string) map[string][]*model.ContractSapErr {
+	errMap := make(map[string][]*model.ContractSapErr, 0)
 	for _, contract := range contractInfo.Contract {
+		if contract.IsToSap == 1 {
+			continue
+		}
 		LOEKZ := ""
 		if contract.Enable == 0 {
 			LOEKZ = "X"
 		}
+
 		startTime, _ := time.ParseInLocation(time.RFC3339, bigContract.StartTime, loc)
 		stopTime, _ := time.ParseInLocation(time.RFC3339, bigContract.StopTime, loc)
 
+		astr := strconv.FormatFloat(contract.Price, 'f', -1, 64)
+		b := strings.Index(astr, ".")
+		per := ""
+		if len(astr[b+1:]) > 2 && b > 0 {
+			num, _ := strconv.ParseFloat(astr[b+1:], 64)
+			if num > 0 {
+				contract.Price = contract.Price * 1000
+				per = "1000"
+			}
+		}
+
+		var isZeroStock int
+		if bigContract.IsZeroStock == 1 {
+			isZeroStock = 2
+		} else {
+			isZeroStock = 0
+		}
+		//LOEKZ = "X"
 		contractDataToASP := &http.ContractDataToASP{
 			MATNR: contract.PartCode,
 			LIFNR: contractInfo.Provider.SapCode,
 			EKORG: contractInfo.Pasture.ParchaseOrganization,
 			WERKS: contractInfo.Pasture.FactoryCode,
 			WAERS: "CNY",
-			PEINH: fmt.Sprintf("%f", contract.Price),
-			NETPR: fmt.Sprintf("%f", contract.Price),
+			PEINH: per,
+			NETPR: fmt.Sprintf("%.2f", contract.Price),
 			MWSKZ: "J0",
 			EKGRP: contractInfo.Pasture.PurchasingGroup,
 			DATAB: startTime.Format("20060102"),
 			DATBI: stopTime.Format("20060102"),
 			LOEKZ: LOEKZ,
-			ESOKZ: fmt.Sprintf("%d", contract.IsZeroStock),
+			ESOKZ: fmt.Sprintf("%d", isZeroStock),
 			MEINS: contract.Unit,
+			Code:  bigContract.ContractCode,
 		}
 		sapContractReq.DATA = contractDataToASP
 
 		rp := &http.SapContractResp{}
+
+		rbyte, _ := json.Marshal(sapContractReq)
+		fmt.Println(string(rbyte))
 		if err := s.SyncSap(sapContractReq, rp, sapContractReq); err != nil {
 			log.Errorf("AutoContractToASP SyncSap Err:%v contract:%v", err, contract)
 			continue
 		}
+		log.Info(rp)
+
 		if rp.Dest.Status != "S" {
 			log.Errorf("AutoContractToASP SyncSap Error:%v,contract:%v", rp, contract)
+			contract.PastureID = contractInfo.Pasture.ID
+			errMap[contractCode] = append(errMap[contractCode], &model.ContractSapErr{
+				ContractID:    contract.ID,
+				PastureID:     contractInfo.Pasture.ID,
+				PastureName:   contractInfo.Pasture.Name,
+				PartID:        contract.PartID,
+				PartName:      contract.PartName,
+				PartCode:      contract.PartCode,
+				Specification: contract.Specification,
+				Price:         contract.Price,
+				BrandID:       contract.BrandID,
+				Brand:         contract.Brand,
+				InventoryType: contract.InventoryType,
+				PlanAmount:    contract.PlanAmount,
+				Remark:        contract.Remark,
+				Enable:        contract.Enable,
+				Unit:          contract.Unit,
+				IsZeroStock:   contract.IsZeroStock,
+				ChangeID:      contract.ChangeID,
+				SapText:       rp.MessText,
+				ContractCode:  contractCode,
+			})
+		}
+	}
+	return errMap
+}
+
+func RemoveRepeatedElement1(arr []string) (newArr []string) {
+	newArr = make([]string, 0)
+	for i := 0; i < len(arr); i++ {
+		repeat := false
+		for j := i + 1; j < len(arr); j++ {
+			if arr[i] == arr[j] {
+				repeat = true
+				break
+			}
+		}
+		if !repeat {
+			newArr = append(newArr, arr[i])
 		}
 	}
+	return
 }

+ 74 - 20
apiserver/service/job.go

@@ -17,10 +17,10 @@ func SapJobInit() {
 	spec := fmt.Sprintf("@every %v", duetimecst.Sub(duetimecst1))
 	c := cron.New()
 	c.AddFunc(spec, func() {
-		//AutoSapOrderJob()
-		//AutoSrmOrderJob()
-		//AutoSapReturnOrderJob()
-		//AutoSrmReturnOrderJob()
+		AutoSapOrderJob()
+		AutoSrmOrderJob()
+		AutoSapReturnOrderJob()
+		AutoSrmReturnOrderJob()
 	})
 	c.Start()
 	/*
@@ -28,17 +28,17 @@ func SapJobInit() {
 		t = time.Now()
 		var code string
 		pastureList := make([]*model.Pasture, 0)
-		err := s.d.DB.Table("pasture").Where("id in(367)").Find(&pastureList)
+		err := s.d.DB.Table("pasture").Where("vendor = 1").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.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-26" {
+			if t.AddDate(0, 0, i).Format("2006-01-02") == "2023-05-24" {
 				break
 			}
 			i++
@@ -47,6 +47,7 @@ func SapJobInit() {
 	c1 := cron.New()
 	c1.AddFunc("0 50 23 * * ?", func() {
 		fmt.Println(time.Now())
+		//更新设备维修和保养费用
 		var t time.Time
 		t = time.Now()
 		var code string
@@ -66,7 +67,12 @@ func SapJobInit() {
 	duetimecst1, _ = time.ParseInLocation("15:04:05", "00:00:00", time.Local)
 	spec1 := fmt.Sprintf("@every %v", duetimecst.Sub(duetimecst1))
 	c1.AddFunc(spec1, func() {
-		s.d.DB.Exec(`call createRUcode()`)
+		pastureList := make([]*model.Pasture, 0)
+		s.d.DB.Table("pasture").Where("vendor = 1").Find(&pastureList)
+		for _, pasture := range pastureList {
+			fmt.Println(pasture.ID)
+			s.d.DB.Exec(`call createRUcode(?)`, pasture.ID)
+		}
 	})
 
 	duetimecst, _ = time.ParseInLocation("15:04:05", "00:05:00", time.Local)
@@ -86,30 +92,78 @@ func SapJobInit() {
 	//	}
 	//	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)
-		//}
+		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 {
+			AutoFeeQuery(item.FactoryCode, item.ID)
+		}
+
+	})
+
+	//type aa struct {
+	//	Request string `json:"request" gorm:"column:request"`
+	//}
+	//list := make([]*aa, 0)
+	//s.d.DB.Raw("SELECT * FROM `eq`.`sapapilog` WHERE `name` LIKE '%MM018%'  group by request ").Find(&list)
+	//listMap := make(map[string]string, 0)
+	//for _, item := range list {
+	//	var obj map[string]interface{}
+	//	err := json.Unmarshal([]byte(item.Request), &obj)
+	//	if err != nil {
+	//		panic(err)
+	//	}
+	//
+	//	code, ok := obj["DATA"].(map[string]interface{})["Code"].(string)
+	//	if !ok {
+	//		panic("Code not found or not a string")
+	//	}
+	//
+	//	//var code string
+	//	//fmt.Println(code)
+	//	if strings.Contains(code, "-") {
+	//		contractCodeSlice := strings.Split(code, "-")
+	//		code = contractCodeSlice[0]
+	//	}
+	//	listMap[code] = code
+	//}
+	////fmt.Println(listMap)
+
+	//for _, code := range list1 {
+	//	//	//list1 = append(list1, item)
+	//	//	fmt.Println(item)
+	//	s.d.DB.Exec(`update  bigcontract set isToSap = 0  where  contractCode like ?`, "%"+code+"%")
+	//	//	s.d.DB.Exec(`update contract set isToSap = 0   where bigid in(select id from  bigcontract  where contractCode like ? )   and  enable = 1`, "%"+item+"%")
+	//}
+	//fmt.Println(list1)
+	//AutoContractToASP()
+	timeLocalSub, _ := time.ParseInLocation("15:04:05", "00:15:00", time.Local)
+	timeLocal, _ := time.ParseInLocation("15:04:05", "00:00:00", time.Local)
+	c1.AddFunc(fmt.Sprintf("@every %v", timeLocalSub.Sub(timeLocal)), func() {
+		AutoContractToASP()
+	})
 
+	c1.AddFunc("0 50 01 * * ?", func() {
+		//更新设备维修和保养费用
+		pastureList := make([]*model.Pasture, 0)
+		s.d.DB.Table("pasture").Where("vendor = 1 ").Where("id != 18 ").Find(&pastureList)
+		now := time.Now()
+		start := now.AddDate(-1, 0, 0).Format("2006-01-02")
+		end := now.Format("2006-01-02")
+		for _, pasture := range pastureList {
+			updateEqYearMaintainCostAndYearUpkeepCost(pasture.ID, start, end)
+		}
 	})
 
-	//timeLocalSub, _ := time.ParseInLocation("15:04:05", "00:01:00", time.Local)
-	//timeLocal, _ := time.ParseInLocation("15:04:05", "00:00:00", time.Local)
-	//c1.AddFunc(fmt.Sprintf("@every %v", timeLocalSub.Sub(timeLocal)), func() {
-	//	AutoContractToASP()
-	//})
 	c1.Start()
 }
 

+ 4 - 1
apiserver/service/material.go

@@ -359,7 +359,7 @@ func ProviderExec(rows [][]string) {
 
 }
 
-func EquipmentExec(rows [][]string) error {
+func EquipmentExec(rows [][]string, pastureId int) error {
 	errList := make([]map[string]interface{}, 0)
 	for i, v := range rows {
 		financeCode := v[13]
@@ -455,6 +455,9 @@ func EquipmentExec(rows [][]string) error {
 			fmt.Println(err)
 			return err
 		}
+		if pastureId != pasture.ID {
+			continue
+		}
 
 		err = s.d.DB.Exec(` update equipment set  eqCode = if(? = '',null,?),specification = ?,purpose = ?	
         ,depreciation=?,

+ 3 - 3
apiserver/service/report.go

@@ -10,7 +10,6 @@ import (
 	"time"
 )
 
-//
 func MaintainList(pastureName, eqClassIdStr string, startTime, endTime time.Time, offset, pagecount int) (int, []map[string]interface{}, error) {
 
 	//eqClassIdList := []string{}
@@ -322,10 +321,11 @@ func StartStopRecord(pastureId, eqName string, startTime, endTime time.Time, off
 	}
 
 	assetStt := make([]*model.AssetStt, 0)
-	err = s.d.DB.Raw(`select * from asset_stt ast  where ast.eqId in(?) 	and blockTime is not null  
+	err = s.d.DB.Raw(`select * from asset_stt ast  where ast.eqId in(?) 	and blockTime is not null    and enabledTime between ? and ?
 union all
 select t.* from (
- select * from asset_stt ast  where ast.eqId in(?) 	and blockTime is null     order by enabledTime desc limit 999999999) t  group by t.eqid`, eqIDList, eqIDList).Find(&assetStt).Error
+ select * from asset_stt ast  where ast.eqId in(?) 	and blockTime is null   and enabledTime between ? and ?   order by enabledTime desc limit 999999999) t  group by t.eqid`,
+		eqIDList, startTime, endTime, eqIDList, startTime, endTime).Find(&assetStt).Error
 	if err != nil {
 		return nil, err
 	}

+ 3 - 1
apiserver/service/sap.go

@@ -123,7 +123,6 @@ func (s *Service) AddSapTransferApiLog(req http.SapDest, resp *http.TransferResp
 }
 
 func (s *Service) SyncSap(r http.SapDest, rp interface{}, data interface{}) (err error) {
-	fmt.Println(r, rp)
 	req, e := s.http.NewRequest("POST", r.GetUrl(), data)
 	if e != nil {
 		return errors.Wrapf(e, "SyncSap")
@@ -133,7 +132,10 @@ func (s *Service) SyncSap(r http.SapDest, rp interface{}, data interface{}) (err
 	if err = s.http.Do(req, &rp); err != nil {
 		err = errors.Wrapf(err, "SyncSap")
 	}
+
+	//if r.GetUrl() != config.Conf.Http.Routing+"/SRM/MM018/PurchaseInfo" {
 	s.AddSapApiLog(r, rp, data, err)
+	//}
 	return
 }
 

+ 13 - 4
go.mod

@@ -17,10 +17,16 @@ require (
 	github.com/axetroy/go-fs v1.0.0
 	github.com/casbin/casbin v1.9.1
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
+	github.com/faabiosr/cachego v0.15.0
+	github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c // indirect
 	github.com/facebookgo/inject v0.0.0-20180706035515-f23751cae28b
+	github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect
+	github.com/facebookgo/structtag v0.0.0-20150214074306-217e25fb9691 // indirect
+	github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 // indirect
+	github.com/fastwego/dingding v1.0.0-beta.4
 	github.com/fastwego/offiaccount v1.0.1
 	github.com/fastwego/wxwork v1.0.0-beta.8
-	github.com/gin-gonic/gin v1.8.1
+	github.com/gin-gonic/gin v1.9.0
 	github.com/go-ini/ini v1.66.6
 	github.com/go-sql-driver/mysql v1.6.0
 	github.com/jacobsa/go-serial v0.0.0-20180131005756-15cf729a72d4
@@ -29,6 +35,7 @@ require (
 	github.com/json-iterator/go v1.1.12
 	github.com/k0kubun/pp/v3 v3.2.0
 	github.com/kardianos/service v1.2.1
+	github.com/liyue201/goqr v0.0.0-20200803022322-df443203d4ea
 	github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
 	github.com/patrickmn/go-cache v2.1.0+incompatible
 	github.com/pkg/errors v0.9.1
@@ -36,13 +43,15 @@ require (
 	github.com/robfig/cron/v3 v3.0.0
 	github.com/sirupsen/logrus v1.9.0
 	github.com/swaggo/files v1.0.1
-	github.com/swaggo/swag v1.8.3
+	github.com/swaggo/gin-swagger v1.6.0
+	github.com/swaggo/swag v1.8.12
 	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
+	golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
 	gorm.io/driver/mysql v1.3.5
+	gorm.io/driver/sqlserver v1.4.3
 	gorm.io/gorm v1.25.0
-	
-)
 
+)

+ 72 - 95
go.sum

@@ -16,9 +16,10 @@ github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go
 github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
 github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
 github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
+github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
 github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
+github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
-github.com/agiledragon/gomonkey/v2 v2.3.1/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
@@ -39,10 +40,16 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 github.com/bradfitz/gomemcache v0.0.0-20170208213004-1952afaa557d/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
 github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
+github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
+github.com/bytedance/sonic v1.8.0 h1:ea0Xadu+sHlu7x5O3gKhRpQ1IKiMrSiHttPF0ybECuA=
+github.com/bytedance/sonic v1.8.0/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
 github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
 github.com/casbin/casbin v1.9.1 h1:ucjbS5zTrmSLtH4XogqOG920Poe6QatdXtz1FEbApeM=
 github.com/casbin/casbin v1.9.1/go.mod h1:z8uPsfBJGUsnkagrt3G8QvjgTKFMBJ32UP8HpZllfog=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
 github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
 github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
 github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
@@ -60,9 +67,8 @@ github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5O
 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=
+github.com/faabiosr/cachego v0.15.0 h1:IqcDhvzMbL4a1c9Dek88DIWJYQ5HG//L0PKCReneOA4=
 github.com/faabiosr/cachego v0.15.0/go.mod h1:L2EomlU3/rUWjzFavY9Fwm8B4zZmX2X6u8kTMkETrwI=
-github.com/faabiosr/cachego v0.17.0 h1:VnlGadwy/69reG6X3KA+kAY5MB8czoiyWeeT01g6akI=
-github.com/faabiosr/cachego v0.17.0/go.mod h1:RxQt6jXFMVdz7aTB3fp+JBcdexuhJY602TdAXW3gm5s=
 github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0=
 github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64=
 github.com/facebookgo/inject v0.0.0-20180706035515-f23751cae28b h1:V6c4/dSTNhSaNn4c5ulbakfv277qCvs7byFYv7P83iQ=
@@ -87,8 +93,9 @@ github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d
 github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk=
 github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
 github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
-github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8=
 github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
+github.com/gin-gonic/gin v1.9.0 h1:OjyFBKICoexlu99ctXNR2gg+c5pKrKMuyjgARg9qeY8=
+github.com/gin-gonic/gin v1.9.0/go.mod h1:W1Me9+hsUSyj3CePGrd1/QrKJMSJ1Tu/0hFEH89961k=
 github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw=
 github.com/go-ini/ini v1.66.6 h1:h6k2Bb0HWS/BXXHCXj4QHjxPmlIU4NK+7MuLp9SD+4k=
 github.com/go-ini/ini v1.66.6/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
@@ -99,32 +106,33 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V
 github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
 github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=
 github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
-github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA=
-github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo=
+github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M=
 github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
-github.com/go-openapi/spec v0.20.6 h1:ich1RQ3WDbfoeTqTAb+5EIxNmpKVJZWBNah9RAT0jIQ=
-github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA=
 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=
 github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
-github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU=
-github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
-github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
 github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
-github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
 github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
-github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
 github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
 github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
-github.com/go-playground/validator/v10 v10.11.0 h1:0W+xRM511GY47Yy3bZUbJVitCNg2BOGlCyvTqsp/xIw=
-github.com/go-playground/validator/v10 v10.11.0/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
+github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU=
+github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s=
 github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
 github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-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/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA=
+github.com/goccy/go-json v0.10.0/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=
@@ -144,21 +152,17 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
 github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
 github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
 github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
 github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+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/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
-github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 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=
@@ -191,22 +195,21 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV
 github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE=
 github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
-github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 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=
+github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
 github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
-github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
-github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 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=
@@ -216,22 +219,20 @@ github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDu
 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=
 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
 github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8=
-github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/liyue201/goqr v0.0.0-20200803022322-df443203d4ea h1:uyJ13zfy6l79CM3HnVhDalIyZ4RJAyVfDrbnfFeJoC4=
 github.com/liyue201/goqr v0.0.0-20200803022322-df443203d4ea/go.mod h1:w4pGU9PkiX2hAWyF0yuHEHmYTQFAd6WHzp6+IY7JVjE=
 github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
 github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
-github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
-github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 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/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-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
+github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
 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=
@@ -249,7 +250,6 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY
 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=
@@ -262,19 +262,14 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108
 github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U=
-github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
-github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
-github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
-github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
 github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
 github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
 github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
-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/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
+github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
 github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
 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=
@@ -306,14 +301,12 @@ github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfm
 github.com/robfig/cron/v3 v3.0.0 h1:kQ6Cb7aHOHTSzNVNEhmp8EcWKLb4CbiMW9h9VyIhO4E=
 github.com/robfig/cron/v3 v3.0.0/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
 github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
 github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
-github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
-github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
+github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo=
 github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
-github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 h1:DAYUYH5869yV94zvCES9F51oYtN5oGlwjxJJz7ZCnik=
-github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
 github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s=
@@ -322,16 +315,15 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx
 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
 github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY=
 github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c h1:Ho+uVpkel/udgjbwB5Lktg9BtvJSh2DT0Hi6LPSyI2w=
 github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
-github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
-github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.2.3-0.20181224173747-660f15d67dbb/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
@@ -340,34 +332,31 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
-github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w=
+github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 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=
-github.com/swaggo/swag v1.8.3 h1:3pZSSCQ//gAH88lfmxM3Cd1+JCsxV8Md6f36b9hrZ5s=
-github.com/swaggo/swag v1.8.3/go.mod h1:jMLeXOOmYyjk8PvHTsXBdrubsNd9gUJTTCzL5iBnseg=
+github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M=
+github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo=
+github.com/swaggo/swag v1.8.12 h1:pctzkNPu0AlQP2royqX3apjKCQonAnf7KGoxeO4y64w=
+github.com/swaggo/swag v1.8.12/go.mod h1:lNfm6Gg+oAq3zRJQNEMBE66LIJKM44mxFqhEEgy2its=
 github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE=
 github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM=
-github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
 github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
 github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo=
 github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
-github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
 github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
+github.com/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU=
+github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
 github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs=
 github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM=
 github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
 github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
-github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
-github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
-github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
 github.com/xormplus/xorm v0.0.0-20210822100304-4e1d4fcc1e67 h1:POBVR/O5wPVI0u7ZZGqu+HFPVTYpZlSL3Uo/9g+he/w=
 github.com/xormplus/xorm v0.0.0-20210822100304-4e1d4fcc1e67/go.mod h1:+v6b10b4x5IcQmp1/Cbo9IqaknxVeuhQng+fhya6bdI=
 github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 h1:6932x8ltq1w4utjmfMPVj09jdMlkY0aiA6+Skbtl3/c=
@@ -376,39 +365,33 @@ github.com/xuri/excelize/v2 v2.6.1 h1:ICBdtw803rmhLN3zfvyEGH3cwSmZv+kde7LhTDT659
 github.com/xuri/excelize/v2 v2.6.1/go.mod h1:tL+0m6DNwSXj/sILHbQTYsLi9IF4TW59H2EF3Yrx1AU=
 github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 h1:OAmKAfT06//esDdpi/DZ8Qsdt4+M5+ltca05dA5bG2M=
 github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
-github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
-github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU=
 go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
-go.mongodb.org/mongo-driver v1.9.0/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
 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-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.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
-golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
+golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
+golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
 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/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/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=
+golang.org/x/mod v0.9.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=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 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=
@@ -418,22 +401,20 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/
 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-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=
 golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
+golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
 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/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
 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=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 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=
@@ -444,7 +425,6 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -461,8 +441,6 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
 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-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=
@@ -470,36 +448,34 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
 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.4.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 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
 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.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
 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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
 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=
-golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 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.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
+golang.org/x/text v0.6.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/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
+golang.org/x/text v0.8.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=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-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/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/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=
+golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
 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=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
@@ -509,8 +485,8 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi
 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
-google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
+google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -550,3 +526,4 @@ 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=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

+ 3 - 3
migration/v0001_alter_contract.sql

@@ -1,3 +1,3 @@
-ALTER TABLE `bigcontract`
-    ADD COLUMN `isToSap` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否同步至asp 0 未同步 1 已同步' ,
-    ADD INDEX idx_is_to_sap (`isToSap`);
+    ALTER TABLE `bigcontract`
+        ADD COLUMN `isToSap` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否同步至asp 0 未同步 1 已同步' ,
+        ADD INDEX idx_is_to_sap (`isToSap`);

+ 35 - 8
pkg/util/mail.go

@@ -2302,7 +2302,7 @@ func FileExists(path string) (bool, error) {
 	return false, err
 }
 
-//测试用的
+// 测试用的
 func Sssss() {
 	sqls := "SELECT bbd.`buyeCode`,p.`providerName`,bd.receiveAmount,bbd.`matchCode`,bd.`amount`,bd.`sumAmount`,bd.departmentName,pa.name pastureName," +
 		"bd.note,c.id,c.bigId,c.pastureId,ps.id partId,ifnull(ps.name,c.partName) partName,ifnull(ps.partCode,c.partCode) partCode," +
@@ -2364,23 +2364,37 @@ func DownloadEquipment(parammaps string) (string, error) {
 	f := excelize.NewFile()
 	Style, err := f.NewStyle("{\"Alignment\":{\"Vertical\": \"center\", \"Horizontal\":\"center\"}}")
 	columns := []string{"设备指标", "维修费", "水费", "电费", "柴油费", "水量", "电量", "柴油用量", "燃动费", "生物质颗粒", "汽油用量", "煤炭用量"}
+	columnsMap := make(map[string]string, 0)
+	columnsMap["设备指标"] = "万元"
+	columnsMap["维修费"] = "万元"
+	columnsMap["水费"] = "万元"
+	columnsMap["电费"] = "万元"
+	columnsMap["柴油费"] = "万元"
+	columnsMap["水量"] = "吨"
+	columnsMap["电量"] = "度"
+	columnsMap["柴油用量"] = "L"
+	//columnsMap["燃动费"]= "设备指标"
+	columnsMap["生物质颗粒"] = "吨"
+	columnsMap["汽油用量"] = "L"
+	columnsMap["煤炭用量"] = "吨"
+
 	//序号	牧场	 部门	预算	 内控	迄今内控 	迄今实际	 实际节约	实际达成率	单头牛预算	单头牛内控	单头牛迄今内控	单头牛迄今实际	单头牛实际节约
 	//columns1 := []string{"序号", "牧场", "部门", "预算", "内控", "迄今内控", "迄今实际", "实际节约", "实际达成率", "单头牛预算",
 	//	"单头牛内控", "单头牛迄今内控", "单头牛迄今实际", "单头牛实际节约"}
-	columns1 := []string{"序号", "牧场", "部门", "预算", "内控", "迄今内控", "迄今实际", "实际节约", "实际达成率", "单头牛迄今实际"}
+	columns1 := []string{"序号", "牧场", "部门", "预算", "迄今实际", "实际节约", "实际达成率", "单头牛迄今实际"}
 	letters := []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
 	for i, v := range columns {
 		f.NewSheet("Sheet" + strconv.Itoa(i+1))
 		f.SetSheetName("Sheet"+strconv.Itoa(i+1), v)
 		f.MergeCell(v, "A1", "C1")
-		f.MergeCell(v, "D1", "I1")
-		f.MergeCell(v, "J1", "J1")
+		f.MergeCell(v, "D1", "G1")
+		f.MergeCell(v, "H1", "H1")
 		f.SetCellValue(v, "A1", "设备指标")
 		f.SetCellValue(v, "D1", "设备指标")
-		f.SetCellValue(v, "J1", "单头牛指标")
+		f.SetCellValue(v, "H1", "单头牛指标")
 		f.SetCellStyle(v, "A1", "CS154", Style)
 		f.SetCellStyle(v, "D1", "CS154", Style)
-		f.SetCellStyle(v, "J1", "CS154", Style)
+		f.SetCellStyle(v, "H1", "CS154", Style)
 		f.SetColWidth(v, "A", "N", 20)
 		for i1, v1 := range columns1 {
 			f.SetCellValue(v, letters[i1]+"2", v1)
@@ -2426,9 +2440,15 @@ func DownloadEquipment(parammaps string) (string, error) {
 			fmt.Println(err)
 		} else {
 			for i, v := range values {
+				var columnName string
+				if columns[z] == "燃动费" {
+					columnName = columns[z]
+				} else {
+					columnName = fmt.Sprintf("%s(%s)", columns[z], columnsMap[columns[z]])
+				}
 				//value := []interface{}{columns[z], v["pastureName"], "全厂区", v["monthBudget"], v["monthLimit"], v["qmonthBudget"], v["sumPrice"],
 				//	v["asave"], v["realReason"], v["oneCowBudget"], v["oneCowLimit"], v["oneCowQmonthBudget"], v["oneCowSumPrice"], v["oneCowAsave"]}
-				value := []interface{}{columns[z], v["pastureName"], "全厂区", v["monthBudget"], v["monthLimit"], v["qmonthBudget"], v["sumPrice"],
+				value := []interface{}{columnName, v["pastureName"], "全厂区", v["monthBudget"], v["sumPrice"],
 					v["asave"], v["realReason"], v["oneCowSumPrice"]}
 				for a, b := range value {
 					f.SetCellValue("设备指标", letters[a]+strconv.Itoa(i+xx+3), b)
@@ -2492,9 +2512,16 @@ func DownloadEquipment(parammaps string) (string, error) {
 			fmt.Println(err)
 		} else {
 			for i, v := range values {
+
+				//var pastureName string
+				//if columns[z+1] == "燃动费" {
+				//	pastureName = v["pastureName"]
+				//} else {
+				//	pastureName = fmt.Sprintf("%s(%s)", v["pastureName"], columnsMap[columns[z+1]])
+				//}
 				//value := []interface{}{v["sort"], v["pastureName"], v["deptname"], v["monthBudget"], v["monthLimit"], v["qmonthBudget"], v["sumPrice"],
 				//	v["asave"], v["realReason"], v["oneCowBudget"], v["oneCowLimit"], v["oneCowQmonthBudget"], v["oneCowSumPrice"], v["oneCowAsave"]}
-				value := []interface{}{v["sort"], v["pastureName"], v["deptname"], v["monthBudget"], v["monthLimit"], v["qmonthBudget"], v["sumPrice"],
+				value := []interface{}{v["sort"], v["pastureName"], v["deptname"], v["monthBudget"], v["sumPrice"],
 					v["asave"], v["realReason"], v["oneCowSumPrice"]}
 				for a, b := range value {
 					f.SetCellValue(columnss[z], letters[a]+strconv.Itoa(i+3), b)

+ 20 - 1
sap.sql

@@ -161,4 +161,23 @@ CREATE TABLE `energy` (
                           `dtnyyl` decimal(12,2) DEFAULT NULL COMMENT '单头牛用油量(升/头日)',
                           PRIMARY KEY (`id`),
                           UNIQUE KEY `pastureId` (`pastureId`,`date`)
-) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ALTER TABLE `eq230508`.`bigpartrefund`
+    ADD COLUMN `sterilisation` tinyint(1) NOT NULL DEFAULT 0 COMMENT '冲销状态' AFTER `purchaseId`;
+
+ALTER TABLE `eq230508`.`partrefund`
+    ADD COLUMN `hasTicket` varchar(50) NULL AFTER `dflag`;