|
@@ -1,7 +1,14 @@
|
|
|
package work
|
|
|
|
|
|
import (
|
|
|
+ "encoding/json"
|
|
|
"fmt"
|
|
|
+ "github.com/gogf/gf/v2/util/gconv"
|
|
|
+ "io"
|
|
|
+ "log"
|
|
|
+ "net/http"
|
|
|
+ "os"
|
|
|
+ "path/filepath"
|
|
|
"strings"
|
|
|
"time"
|
|
|
"zhiyuan/models"
|
|
@@ -274,3 +281,163 @@ func WorkerImport(c *gin.Context) {
|
|
|
db.InsertModels(db.Type(models.Worker{}), datas)
|
|
|
app.Success(c, nil)
|
|
|
}
|
|
|
+
|
|
|
+type QuoteOrder2ImportFrom struct {
|
|
|
+ File string `json:"file"` // 注意:这里的 "file" 字段在 JSON 中是一个数组
|
|
|
+}
|
|
|
+type Files struct {
|
|
|
+ Name string `json:"name"`
|
|
|
+ UploadTime int64 `json:"upload_time"`
|
|
|
+ URL string `json:"url"`
|
|
|
+}
|
|
|
+
|
|
|
+func QualityImport(c *gin.Context) {
|
|
|
+
|
|
|
+ id := utils.ToInt(c.Param("id"))
|
|
|
+ if id <= 0 {
|
|
|
+ app.ErrorMsg(c, "id must be a number", nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ var form QuoteOrder2ImportFrom
|
|
|
+ if app.Bind(c, &form) != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 解析 JSON 数据
|
|
|
+ files := []Files{}
|
|
|
+ err := json.Unmarshal([]byte(form.File), &files)
|
|
|
+ if err != nil {
|
|
|
+ log.Fatalf("Error parsing JSON: %v", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 1. 下载到临时文件
|
|
|
+ file, err := downloadExcelFromURL(files[0].URL)
|
|
|
+ if err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+ // 确保程序结束后删除临时文件
|
|
|
+ defer os.Remove(file.Name())
|
|
|
+
|
|
|
+ wb, err := xlsx.OpenFile(file.Name())
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("读取错误", err.Error())
|
|
|
+ app.Error(c, err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ sh, ok := wb.Sheet["Sheet1"]
|
|
|
+ if !ok {
|
|
|
+ fmt.Println("Sheet does not exist")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ typeList := make([]models.WorkQualityAccept, 0)
|
|
|
+ db.GetModel(map[string]interface{}{}, &typeList)
|
|
|
+
|
|
|
+ datas := make([]map[string]interface{}, 0)
|
|
|
+ headers := make([]string, 0)
|
|
|
+
|
|
|
+ err = sh.ForEachRow(func(r *xlsx.Row) error {
|
|
|
+ if r.GetCoordinate() <= 0 {
|
|
|
+ err := r.ForEachCell(func(c *xlsx.Cell) error {
|
|
|
+ headers = append(headers, c.String())
|
|
|
+ return nil
|
|
|
+ })
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ var data models.MatPickWork
|
|
|
+ for i, header := range headers {
|
|
|
+ value := r.GetCell(i).String()
|
|
|
+ switch header {
|
|
|
+ case "分类":
|
|
|
+ qualityId := 0
|
|
|
+
|
|
|
+ if value == "" {
|
|
|
+ qualityId = id
|
|
|
+ } else {
|
|
|
+
|
|
|
+ if value == "泥工验收" {
|
|
|
+ qualityId = 1
|
|
|
+ } else if value == "真实交房验收" {
|
|
|
+ qualityId = 2
|
|
|
+ } else if value == "特殊交房验收" {
|
|
|
+ qualityId = 3
|
|
|
+ } else if value == "文明施工(形象)" {
|
|
|
+ qualityId = 5
|
|
|
+ } else if value == "放样" {
|
|
|
+ qualityId = 6
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ data.QualityAcceptId = qualityId
|
|
|
+ case "名称":
|
|
|
+ data.Name = value
|
|
|
+ case "内容":
|
|
|
+ data.Content = value
|
|
|
+ case "施工标准":
|
|
|
+ data.Photograph = value
|
|
|
+ case "工期":
|
|
|
+ data.Days = gconv.Int(value)
|
|
|
+ default:
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ da := map[string]interface{}{
|
|
|
+ "quality_accept_id": data.QualityAcceptId,
|
|
|
+ "name": data.Name,
|
|
|
+ "content": data.Content,
|
|
|
+ "photograph": data.Photograph,
|
|
|
+ "days": data.Days,
|
|
|
+ }
|
|
|
+ datas = append(datas, da)
|
|
|
+
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+ })
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.Error(c, err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Println("dddd", datas)
|
|
|
+ db.InsertModels(db.Type(models.WorkQualityAcceptItem{}), datas)
|
|
|
+ app.Success(c, nil)
|
|
|
+}
|
|
|
+
|
|
|
+// 从URL下载Excel到临时文件,返回*os.File
|
|
|
+func downloadExcelFromURL(url string) (*os.File, error) {
|
|
|
+ // 1. 发送HTTP请求获取Excel内容
|
|
|
+ resp, err := http.Get(url)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ defer resp.Body.Close()
|
|
|
+
|
|
|
+ // 检查响应状态
|
|
|
+ if resp.StatusCode != http.StatusOK {
|
|
|
+ return nil, os.ErrInvalid
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 创建临时文件(基于URL中的文件名生成临时文件名)
|
|
|
+ filename := filepath.Base(url)
|
|
|
+ tempFile, err := os.CreateTemp("./", "xlsx_"+filename+"_*.xlsx")
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 将下载的内容写入临时文件
|
|
|
+ _, err = io.Copy(tempFile, resp.Body)
|
|
|
+ if err != nil {
|
|
|
+ tempFile.Close()
|
|
|
+ os.Remove(tempFile.Name()) // 失败时清理临时文件
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ // 关闭临时文件(后续通过xlsx.OpenFile重新打开)
|
|
|
+ tempFile.Close()
|
|
|
+ return tempFile, nil
|
|
|
+}
|