| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989 | package apiimport (	"crypto/md5"	"encoding/hex"	"errors"	"fmt"	"image"	"image/gif"	"image/jpeg"	"image/png"	"io"	"mime/multipart"	"net/http"	"os"	"path"	"path/filepath"	"strconv"	"strings"	"tmr-watch/conf/setting"	"tmr-watch/http/handle/restful"	"tmr-watch/pkg/app"	"tmr-watch/pkg/e"	"tmr-watch/pkg/logging"	"github.com/astaxie/beego/logs"	"github.com/axetroy/go-fs"	"github.com/gin-gonic/gin"	"github.com/nfnt/resize"	"github.com/tealeg/xlsx")// 支持的图片后缀名var supportImageExtNames = []string{".jpg", ".jpeg", ".png", ".ico", ".svg", ".bmp", ".gif"}/**check a file is a image or not*/func isImage(extName string) bool {	for i := 0; i < len(supportImageExtNames); i++ {		if supportImageExtNames[i] == extName {			return true		}	}	return false}/**Handler the parse error*/func parseFormFail(context *gin.Context) {	context.JSON(http.StatusBadRequest, gin.H{		"msg":     "fail",		"message": "Can not parse form",	})}/**Upload file handler*/func UploadFile(context *gin.Context) {	appG := app.Gin{C: context}	dictId := context.Param("id")	dictName := context.Param("name")	logging.Info("UploadFile ", context.Keys, dictId, dictName)	var (		isSupportFile bool		maxUploadSize = setting.AppSetting.FileMaxSize   // 最大上传大小		allowTypes    = setting.AppSetting.FileAllowType // 可上传的文件类型		distPath      string                             // 最终的输出目录		err           error		file          *multipart.FileHeader		src           multipart.File		dist          *os.File	)	// Source	if file, err = context.FormFile("file"); err != nil {		parseFormFail(context)		return	}	sqlname := context.GetHeader("optname")	extname := path.Ext(file.Filename)	if len(allowTypes) != 0 {		for i := 0; i < len(allowTypes); i++ {			if allowTypes[i] == extname {				isSupportFile = true				break			}		}		if isSupportFile == false {			context.JSON(http.StatusBadRequest, gin.H{				"message": "不支持的文件类型: " + extname,			})			return		}	}	if file.Size > int64(maxUploadSize) {		context.JSON(http.StatusBadRequest, gin.H{			"message": "上传文件太大, 最大限制为(byte): " + strconv.Itoa(int(maxUploadSize)),		})		return	}	if src, err = file.Open(); err != nil {		// open the file fail...	}	defer src.Close()	hash := md5.New()	io.Copy(hash, src)	md5string := hex.EncodeToString(hash.Sum([]byte("")))	fileName := md5string + extname	// Destination	filePath := setting.CurrentPath + setting.AppSetting.FileSavePath + dictName + "/"	err = PathCheck(filePath) //检查路径并创建	if err != nil {		fmt.Println("PathCheck err", err)	}	distPath = path.Join(filePath, fileName)	if dist, err = os.Create(distPath); err != nil {		fmt.Println("Create err", err)	}	defer dist.Close()	//distPath = setting.CurrentPath + setting.AppSetting.FileSavePath +"/"+ fileName	if dist, err = os.Create(distPath); err != nil {		// create dist file fail...	}	defer dist.Close()	// FIXME: open 2 times	if src, err = file.Open(); err != nil {		//	}	// Copy	io.Copy(dist, src)	var execresult interface{}	params := context.Request.Form	if sqlname != "" {		sql, p := restful.GetSqlByNameDB(sqlname) //todo insertcustomdoc		if sql != "" {			s_params := make([]interface{}, 0)			paramslist := strings.Split(p, ",")			if len(paramslist) > 0 && p != "" {				for _, value := range paramslist {					fmt.Println("s_params value", s_params, value)					if strings.ToLower(strings.Trim(value, " ")) == "username" { //picpath, picname, username, newpicname						tempv := params.Get("jwt_username")						s_params = append(s_params, tempv)					} else if strings.ToLower(strings.Trim(value, " ")) == "docname" {						s_params = append(s_params, file.Filename)					} else if strings.ToLower(strings.Trim(value, " ")) == "newdocname" {						s_params = append(s_params, fileName)					} else if strings.ToLower(strings.Trim(value, " ")) == "docpath" {						s_params = append(s_params, dictName) //					} else if strings.ToLower(strings.Trim(value, " ")) == "dictid" {						s_params = append(s_params, dictId) //						fmt.Println("s_params", s_params, dictId)					} else if strings.ToLower(strings.Trim(value, " ")) == "filesize" {						s_params = append(s_params, file.Size) //					} else {						s_params = append(s_params, params.Get(strings.Trim(value, " ")))					}				}			}			execresult, err = execDataBySql(sql, s_params)			if err != nil {				fmt.Println("execDataBySql err", err)				appG.Response(http.StatusOK, e.ERROR, err.Error())			}		}	}	context.JSON(http.StatusOK, gin.H{		"hash":       md5string,		"filename":   fileName,		"origin":     file.Filename,		"size":       file.Size,		"execresult": execresult,	})}/**Upload image handler*/func UploaderImage(context *gin.Context) {	logging.Info("UploaderImage ", context.Keys)	var (		maxUploadSize = setting.AppSetting.ImageMaxSize // 最大上传大小		distPath      string                            // 最终的输出目录		err           error		file          *multipart.FileHeader		src           multipart.File		dist          *os.File	)	// Source	if file, err = context.FormFile("file"); err != nil {		parseFormFail(context)		return	}	sqlname := context.GetHeader("optname")	extname := strings.ToLower(path.Ext(file.Filename))	if isImage(extname) == false {		context.JSON(http.StatusBadRequest, gin.H{			"message": "不支持的上传文件类型: " + extname,		})		return	}	if file.Size > int64(maxUploadSize) {		context.JSON(http.StatusBadRequest, gin.H{			"message": "上传文件太大, 最大文件大小限制为(byte): " + strconv.Itoa(int(maxUploadSize)),		})		return	}	if src, err = file.Open(); err != nil {	}	defer src.Close()	hash := md5.New()	io.Copy(hash, src)	md5string := hex.EncodeToString(hash.Sum([]byte("")))	fileName := md5string + extname	//savePathDir := setting.CurrentPath+setting.AppSetting.ImageSavePath+fileName+"/"	//_,err = os.Stat(savePathDir)	//if err == nil {	//	fmt.Println(err)//todo 错误处理	//}	//if os.IsNotExist(err) {	//	err:=os.Mkdir(setting.CurrentPath+setting.AppSetting.ImageSavePath+fileName,os.ModePerm)	//	if err!=nil{	//		fmt.Println(err)	//	}//目录不存在则创建	//}	// Destination	picPath := setting.CurrentPath + setting.AppSetting.ImageSavePath + sqlname + "/"	err = PathCheck(picPath) //检查路径并创建	if err != nil {		fmt.Println("PathCheck err", err)	}	distPath = path.Join(picPath, fileName)	if dist, err = os.Create(distPath); err != nil {		fmt.Println("Create err", err)	}	defer dist.Close()	// FIXME: open 2 times	if src, err = file.Open(); err != nil {		//	}	defer src.Close()	// Copy	io.Copy(dist, src)	// 压缩缩略图	// 不管成功与否,都会进行下一步的返回	if _, err := thumbnailify(distPath, sqlname); err != nil {		logging.Error("thumbnailify_err", err)		picThumbnailPath := setting.CurrentPath + setting.AppSetting.ThumbnailSavePath + sqlname + "/"		println(picThumbnailPath)		err = PathCheck(picThumbnailPath) //检查路径并创建		distThumbnailPath := path.Join(picThumbnailPath, fileName)		println(distThumbnailPath)		distThumbnail, err := os.Create(distThumbnailPath)		if err != nil {			fmt.Println("CreateThumbnail err", err)		}		srcThumbnail, err := file.Open()		if err != nil {			//		}		io.Copy(distThumbnail, srcThumbnail)		distThumbnail.Close()		src.Close()	}	var execresult interface{}	params := context.Request.Form	if sqlname != "" {		sql, p := restful.GetSqlByNameDB(sqlname)		if sql != "" {			s_params := make([]interface{}, 0)			paramslist := strings.Split(p, ",")			if len(paramslist) > 0 && p != "" {				for _, value := range paramslist {					if strings.ToLower(strings.Trim(value, " ")) == "username" { //picpath, picname, username, newpicname						tempv := params.Get("jwt_username")						s_params = append(s_params, tempv)					} else if strings.ToLower(strings.Trim(value, " ")) == "picname" {						s_params = append(s_params, file.Filename)					} else if strings.ToLower(strings.Trim(value, " ")) == "newpicname" {						s_params = append(s_params, fileName)					} else if strings.ToLower(strings.Trim(value, " ")) == "picpath" {						s_params = append(s_params, sqlname) //全路径加文件名					} else {						s_params = append(s_params, params.Get(strings.Trim(value, " ")))					}				}			}			execresult, err = execDataBySql(sql, s_params)			if err != nil {				fmt.Println("execDataBySql err", err)			}		}	}	context.JSON(http.StatusOK, gin.H{		"hash":       md5string,		"filename":   fileName,		"origin":     file.Filename,		"size":       file.Size,		"execresult": execresult,	})}/**Upload image handler*/func UploaderTmrImage(context *gin.Context) {	logging.Info("UploaderTmrImage ", context.Keys)	var (		maxUploadSize = setting.AppSetting.ImageMaxSize // 最大上传大小		distPath      string                            // 最终的输出目录		err           error		file          *multipart.FileHeader		src           multipart.File		dist          *os.File	)	// Source	if file, err = context.FormFile("file"); err != nil {		parseFormFail(context)		return	}	pastureid := context.GetHeader("pastureid") //牧场id	projuctid := context.GetHeader("projuctid") // 主计划id	pfid := context.GetHeader("pfid")           // 配方id	optid := context.GetHeader("optid")         //子计划id	catchtime := context.GetHeader("catchtime") // 捕获时间	picclass := context.GetHeader("picclass")   // 图片分类	extname := strings.ToLower(path.Ext(file.Filename))	if isImage(extname) == false {		context.JSON(http.StatusBadRequest, gin.H{			"msg":     "fail",			"message": "不支持的上传文件类型: " + extname,		})		return	}	if file.Size > int64(maxUploadSize) {		context.JSON(http.StatusBadRequest, gin.H{			"msg":     "fail",			"message": "上传文件太大, 最大文件大小限制为(byte): " + strconv.Itoa(int(maxUploadSize)),		})		return	}	if src, err = file.Open(); err != nil {	}	defer src.Close()	hash := md5.New()	io.Copy(hash, src)	md5string := hex.EncodeToString(hash.Sum([]byte("")))	fileName := md5string + extname	//savePathDir := setting.CurrentPath+setting.AppSetting.ImageSavePath+fileName+"/"	//_,err = os.Stat(savePathDir)	//if err == nil {	//	fmt.Println(err)//todo 错误处理	//}	//if os.IsNotExist(err) {	//	err:=os.Mkdir(setting.CurrentPath+setting.AppSetting.ImageSavePath+fileName,os.ModePerm)	//	if err!=nil{	//		fmt.Println(err)	//	}//目录不存在则创建	//}	// Destination	picPath := setting.CurrentPath + setting.AppSetting.ImageSavePath + projuctid + "/"	err = PathCheck(picPath) //检查路径并创建	if err != nil {		fmt.Println("PathCheck err", err)	}	distPath = path.Join(picPath, fileName)	if dist, err = os.Create(distPath); err != nil {		fmt.Println("Create err", err)	}	defer dist.Close()	// FIXME: open 2 times	if src, err = file.Open(); err != nil {		//	}	defer src.Close()	// Copy	io.Copy(dist, src)	// 压缩缩略图	// 不管成功与否,都会进行下一步的返回	if _, err := thumbnailify(distPath, projuctid); err != nil {		logging.Error("thumbnailify_err", err)		picThumbnailPath := setting.CurrentPath + setting.AppSetting.ThumbnailSavePath + projuctid + "/"		println(picThumbnailPath)		err = PathCheck(picThumbnailPath) //检查路径并创建		distThumbnailPath := path.Join(picThumbnailPath, fileName)		println(distThumbnailPath)		distThumbnail, err := os.Create(distThumbnailPath)		if err != nil {			fmt.Println("CreateThumbnail err", err)		}		srcThumbnail, err := file.Open()		if err != nil {			//		}		io.Copy(distThumbnail, srcThumbnail)		distThumbnail.Close()		src.Close()	}	var execresult interface{}	params := context.Request.Form	sqlname := "insertcustompic"	if sqlname != "" {		sql, p := restful.GetSqlByNameDB(sqlname)		if sql != "" {			s_params := make([]interface{}, 0)			paramslist := strings.Split(p, ",")			if len(paramslist) > 0 && p != "" {				for _, value := range paramslist {					switch strings.ToLower(strings.Trim(value, " ")) {					case "username":						tempv := params.Get("jwt_username")						s_params = append(s_params, tempv)					case "picname":						s_params = append(s_params, file.Filename)					case "newpicname":						s_params = append(s_params, fileName)					case "picpath":						s_params = append(s_params, projuctid)					case "pastureid":						s_params = append(s_params, pastureid)					case "projuctid":						s_params = append(s_params, projuctid)					case "pfid":						s_params = append(s_params, pfid)					case "optid":						s_params = append(s_params, optid)					case "catchtime":						s_params = append(s_params, catchtime)					case "picclass":						s_params = append(s_params, picclass)					default:						s_params = append(s_params, params.Get(strings.Trim(value, " ")))					}				}			}			execresult, err = execDataBySql(sql, s_params)			if err != nil {				fmt.Println("execDataBySql err", err)			}		}	}	context.JSON(http.StatusOK, gin.H{		"msg":        "ok",		"hash":       md5string,		"filename":   fileName,		"origin":     file.Filename,		"size":       file.Size,		"execresult": execresult,	})}/**Get file raw*/func GetFileRaw(context *gin.Context) {	filename := context.Param("filename")	logging.Info("GetFileRaw ", context.Keys, filename)	filePath := path.Join(setting.CurrentPath, setting.AppSetting.FileSavePath, filename)	if isExistFile := fs.PathExists(filePath); isExistFile == false {		// if the path not found		http.NotFound(context.Writer, context.Request)		return	}	http.ServeFile(context.Writer, context.Request, filePath)}/**Download a file*/func DownloadFile(context *gin.Context) {	filename := context.Param("filename")	logging.Info("DownloadFile ", context.Keys, filename)	eqpic, _ := restful.Engine.SQL("SELECT * FROM eq_doc where id = ? ", filename).QueryString()	if eqpic == nil {		http.NotFound(context.Writer, context.Request)		return	}	originFilePath := path.Join(setting.CurrentPath, setting.AppSetting.FileSavePath, eqpic[0]["docpath"], eqpic[0]["newdocname"])	if fs.PathExists(originFilePath) == false {		// if the path not found		http.NotFound(context.Writer, context.Request)		return	}	http.ServeFile(context.Writer, context.Request, originFilePath)}/**Get Origin image*/func GetOriginImage(context *gin.Context) {	//appG := app.Gin{C: context}	filename := context.Param("filename")	logging.Info("GetOriginImage ", context.Keys, filename)	eqpic, _ := restful.Engine.SQL("SELECT * FROM eq_pic where id = ? ", filename).QueryString()	if eqpic == nil {		http.NotFound(context.Writer, context.Request)		return	}	originImagePath := path.Join(setting.CurrentPath, setting.AppSetting.ImageSavePath, eqpic[0]["picpath"], eqpic[0]["newpicname"])	if fs.PathExists(originImagePath) == false {		// if the path not found		http.NotFound(context.Writer, context.Request)		return	}	http.ServeFile(context.Writer, context.Request, originImagePath)	//appG.Response(http.StatusOK, e.SUCCESS, eqpic[0]["picname"])}/**Get thumbnail image*/func GetThumbnailImage(context *gin.Context) {	filename := context.Param("filename")	logging.Info("GetThumbnailImage ", context.Keys, filename)	eqpic, _ := restful.Engine.SQL("SELECT * FROM eq_pic where id = ? ", filename).QueryString()	if eqpic == nil {		http.NotFound(context.Writer, context.Request)		return	}	thumbnailImagePath := path.Join(setting.CurrentPath, setting.AppSetting.ThumbnailSavePath, eqpic[0]["picpath"], eqpic[0]["newpicname"])	originImagePath := path.Join(setting.CurrentPath, setting.AppSetting.ImageSavePath, filename)	if fs.PathExists(thumbnailImagePath) == false {		// if thumbnail image not exist, try to get origin image		if fs.PathExists(originImagePath) == true {			http.ServeFile(context.Writer, context.Request, originImagePath)			return		}		// if the path not found		http.NotFound(context.Writer, context.Request)		return	}	http.ServeFile(context.Writer, context.Request, thumbnailImagePath)}/**Generate thumbnail*/func thumbnailify(imagePath, subdirectory string) (outputPath string, err error) {	var (		file *os.File		img  image.Image	)	Filename := strings.ToLower(path.Base(imagePath))	extname := strings.ToLower(path.Ext(imagePath))	outputPath = setting.CurrentPath + setting.AppSetting.ThumbnailSavePath + subdirectory + "/" + Filename	err = PathCheck(setting.CurrentPath + setting.AppSetting.ThumbnailSavePath + subdirectory)	if err != nil {		fmt.Println("thumbnailify PathCheck err", err)	}	// 读取文件	if file, err = os.Open(imagePath); err != nil {		return	}	defer file.Close()	// decode jpeg into image.Image	switch extname {	case ".jpg", ".jpeg":		img, err = jpeg.Decode(file)		break	case ".png":		img, err = png.Decode(file)		break	case ".gif":		img, err = gif.Decode(file)		break	default:		err = errors.New("Unsupport file type" + extname)		return	}	if img == nil {		err = errors.New("Generate thumbnail fail...")		return	}	m := resize.Thumbnail(uint(setting.AppSetting.ThumbnailMaxWidth), uint(setting.AppSetting.ThumbnailMaxHeight), img, resize.Lanczos3)	out, err := os.Create(outputPath)	if err != nil {		return	}	defer out.Close()	// write new image to file	//decode jpeg/png/gif into image.Image	switch extname {	case ".jpg", ".jpeg":		jpeg.Encode(out, m, nil)		break	case ".png":		png.Encode(out, m)		break	case ".gif":		gif.Encode(out, m, nil)		break	default:		err = errors.New("Unsupport file type" + extname)		return	}	return}func UploadFiles(c *gin.Context) {	logging.Info("UploadFiles ", c.Keys)	appG := app.Gin{C: c}	err := c.Request.ParseMultipartForm(200000)	if err != nil {		appG.Response(http.StatusOK, e.ERROR_IMPORT_FAIL, err)		return	}	// 获取表单	form := c.Request.MultipartForm	// 获取参数upload后面的多个文件名,存放到数组files里面,	files := form.File["upload"]	// 遍历数组,每取出一个file就拷贝一次	for i, _ := range files {		file, err := files[i].Open()		defer file.Close()		if err != nil {			appG.Response(http.StatusOK, e.ERROR_IMPORT_FAIL, err)			return		}		fileName := files[i].Filename		fmt.Println(fileName)		out, err := os.Create(fileName)		defer out.Close()		if err != nil {			appG.Response(http.StatusOK, e.ERROR_IMPORT_FAIL, err)			return		}		_, err = io.Copy(out, file)		if err != nil {			appG.Response(http.StatusOK, e.ERROR_IMPORT_FAIL, err)			return		}		appG.Response(http.StatusOK, e.SUCCESS, "upload successful \n")	}}func PathCheck(path string) (err error) {	b, err := PathExists(path)	if err != nil {		fmt.Println("exist err", err)	}	if !b {		fmt.Println(path, "  目录不存在,重新创建")		err = os.Mkdir(path, 0777)		if err != nil {			fmt.Println("Mkdir err", err)		}	}	return}func PathExists(path string) (bool, error) {	_, err := os.Stat(path)	if err == nil {		return true, nil	}	if os.IsNotExist(err) {		return false, nil	}	return false, err}func GetBarfeedremainExcel(c *gin.Context) {	var file *xlsx.File	var sheet *xlsx.Sheet	var row *xlsx.Row	var cell *xlsx.Cell	redFont := xlsx.Font{		Bold:  true,		Name:  "宋体", // 字体名称		Size:  11,   // 字体大小		Color: "FF0000",	}	font := xlsx.Font{		Bold:  true,		Name:  "宋体", // 字体名称		Size:  11,   // 字体大小		Color: "000000",	}	style := xlsx.NewStyle()	style.ApplyBorder = true	border := *xlsx.NewBorder("thin", "thin", "thin", "thin")	style.Border = border	style.Alignment = xlsx.Alignment{		Horizontal: "center",		Vertical:   "center",		WrapText:   true,		// ShrinkToFit: true,	}	style.Font = font	style.ApplyBorder = true	style1 := xlsx.NewStyle()	style1.ApplyBorder = true	style1.Border = border	style1.Alignment = xlsx.Alignment{		Horizontal: "center",		Vertical:   "center",		WrapText:   true,		// ShrinkToFit: true,	}	style1.Font = redFont	style1.ApplyBorder = true	file = xlsx.NewFile()	sheet, _ = file.AddSheet("Sheet1")	sheet.SetColWidth(8, 8, 50)	// row = sheet.AddRow()	// cell = row.AddCell()	row = sheet.AddRow()	cell = row.AddCell()	cell.Value = "栏舍名称"	// cell.Merge(0, 1)	// style.Font = redFont	cell.SetStyle(style1)	cell = row.AddCell()	cell.SetValue("剩料量(kg)")	cell.SetStyle(style1)	cell = row.AddCell()	cell.SetValue("干物质")	// style.Font = font	// style.Font.Color = ""	cell.SetStyle(style)	cell = row.AddCell()	cell.SetValue("班次收集(一天/第一班/第二班/第三班)")	// style.Font.Color = "#FF0000"	// style.Font = redFont	cell.SetStyle(style1)	cell = row.AddCell()	// style.Font.Color = ""	cell.SetValue("收集时间")	cell.SetStyle(style1)	cell = row.AddCell()	cell.SetValue("原剩料所属时间")	cell.SetStyle(style)	cell = row.AddCell()	cell.SetValue("操作人")	cell.SetStyle(style1)	cell = row.AddCell()	cell.SetValue("转投栏舍")	cell.SetStyle(style)	cell = row.AddCell()	// cell.SetValue("")	// cell.SetStyle(style1)	// cell = row.AddCell()	// cell.SetValue("红色为必填项")	// cell.SetStyle(style1)	// cell = row.AddCell()	tx := restful.Engine.NewSession()	defer tx.Close()	dataList, err := tx.SQL(`select bname from bar  where pastureid = (select column_default  as pastureid   from    information_schema.COLUMNS 		WHERE table_name = 'recweight' AND table_schema = ? AND column_name = 'pastureid') order by sort ,id`, setting.DatabaseSetting.Name).Query().List()	if err != nil {		logs.Error("CronScheduled-error-1:", err)		return	}	for i, data := range dataList {		row = sheet.AddRow()		cell = row.AddCell()		cell.SetValue(data["bname"])		cell.SetStyle(style)		cell = row.AddCell()		if i == 0 {			cell.SetValue("100")			cell.SetStyle(style)			cell = row.AddCell()			cell.SetValue("10")			cell.SetStyle(style)			cell = row.AddCell()			cell.SetValue("第一班")			cell.SetStyle(style)			cell = row.AddCell()			// cell.SetStyle()			cell.SetValue("2024-01-01")			cell.SetStyle(style)			// style.Font.			cell = row.AddCell()			cell.SetValue("2024-01-01")			cell.SetStyle(style)			cell = row.AddCell()			cell.SetValue("管理员")			cell.SetStyle(style)			cell = row.AddCell()			cell.SetValue("")			cell.SetStyle(style1)			cell = row.AddCell()			// cell.SetValue("")			// cell.SetStyle(style1)			// cell = row.AddCell()			cell.SetValue(`注:1,红色为必填项,以上为示例数据,导入时请及时删除!			2,由于excel兼容性的问题,收集时间/原剩料所属时间,提交时会出现兼容性错误,需要在收集时间/原剩料所属时间的表头右击鼠标,设置单元格格式 选择“文本”格式 `)			cell.SetStyle(style1)			cell = row.AddCell()			// cell.SetValue("")			// cell.SetStyle(style1)			// cell = row.AddCell()			// cell.SetValue("注:由于excel兼容性的问题,收集时间/原剩料所属时间,提交时会出现兼容性错误,需要在收集时间/原剩料所属时间的表头右击鼠标,设置单元格格式 选择“文本”格式 ")			// cell.SetStyle(style1)			// cell = row.AddCell()		}	}	c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")	c.Header("Content-Disposition", "attachment; filename="+"栏舍剩料记录导入模板.xlsx")	c.Header("Content-Transfer-Encoding", "binary")	_ = file.Write(c.Writer)}func UploadFile1(c *gin.Context) {	appG := app.Gin{C: c}	pid := c.PostForm("pid")	sort := c.PostForm("sort")	isStart := c.PostForm("isStart")	file, err := appG.C.FormFile("file")	if err != nil {		logs.Error(err)		appG.Response(http.StatusInternalServerError, e.ERROR, err)		return	}	tx := restful.Engine.NewSession()	defer tx.Close()	fileInfoList, err := tx.SQL(` select startpicture,endpicture from downloadplandtl1_exec  where pid  = ? and sort = ?  `, pid, sort).Query().List()	if err != nil {		logs.Error(err)		appG.Response(http.StatusInternalServerError, e.ERROR, err)		return	}	if len(fileInfoList) > 0 {		filepath := ""		for _, fileinfo := range fileInfoList {			if isStart == "1" {				if _, ok := fileinfo["startpicture"]; ok {					filepath = fileinfo["startpicture"].(string)				}			} else {				if _, ok := fileinfo["endpicture"]; ok {					filepath = fileinfo["endpicture"].(string)				}			}		}		os.Remove(filepath)	}	basePath := "uploads/image/"	filename := basePath + filepath.Base(file.Filename)	if err := appG.C.SaveUploadedFile(file, filename); err != nil {		logs.Error(err)		appG.Response(http.StatusInternalServerError, e.ERROR, err)		return	}	// filename = basePath + filepath.Base(file.Filename)	if isStart == "1" {		_, err = tx.SQL(` update downloadplandtl1_exec  set startpicture = ? where  pid  = ? and sort = ?  `, filename, pid, sort).Execute()		if err != nil {			logs.Error(err)			appG.Response(http.StatusInternalServerError, e.ERROR, err)			return		}	} else {		_, err = tx.SQL(` update downloadplandtl1_exec  set endpicture = ? where  pid  = ? and sort = ?  `, filename, pid, sort).Execute()		if err != nil {			logs.Error(err)			appG.Response(http.StatusInternalServerError, e.ERROR, err)			return		}	}	appG.Response(http.StatusOK, e.SUCCESS, fmt.Sprintf("文件 %s 上传成功 ", file.Filename))}// func DownloadFile1(c *gin.Context) {// 	appG := app.Gin{C: c}// 	dataByte, _ := ioutil.ReadAll(c.Request.Body)// 	parammaps := gofasion.NewFasion(string(dataByte))// 	businessid := parammaps.Get("businessid").ValueStr()// 	tx := restful.Engine.NewSession()// 	defer tx.Close()// 	fileInfoList, err := tx.SQL(` select path from file  where businessid = ? `, businessid).Query().List()// 	if err != nil {// 		logs.Error(err)// 		appG.Response(http.StatusInternalServerError, e.ERROR, err)// 		return// 	}// 	filepath := ""// 	for _, fileinfo := range fileInfoList {// 		filepath = fileinfo["path"].(string)// 	}// 	c.File(filepath)// }
 |