user 11 hours ago
parent
commit
12758140eb

+ 167 - 0
controllers/admin/work/worker.go

@@ -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
+}

+ 6 - 32
models/mat_pick_work.go

@@ -1,36 +1,10 @@
 package models
 
 type MatPickWork struct {
-	ID                     int    `json:"id"`
-	SiteID                 int    `json:"site_id"`
-	PickID                 int    `json:"pick_id"`
-	WorkerID               int    `json:"worker_id"`
-	ManagerID              int    `json:"manager_id"`
-	RoomType               int    `json:"room_type"`
-	WorkerStartAt          int    `json:"worker_start_at"`
-	OrderStatus            int    `json:"order_status"`
-	ItemStatus             int    `json:"item_status"`
-	OrderAcceptanceAt      int    `json:"order_acceptance_at"`
-	ManagerConfirmAt       int    `json:"manager_confirm_at"`
-	WorkerConfirmAt        int    `json:"worker_confirm_at"`
-	ManagerStatus          int    `json:"manager_status"`
-	WorkerStatus           int    `json:"worker_status"`
-	Village                string `json:"village"`
-	PickName               string `json:"pick_name"`
-	ConfirmType            string `json:"confirm_type"`
-	StartTime              int    `json:"start_time"`
-	EndTime                int    `json:"end_time"`
-	Cycle                  int    `json:"cycle"`
-	CreatedAt              int    `json:"created_at"`
-	UpdatedAt              int    `json:"updated_at"`
-	DeletedAt              int    `json:"deleted_at"`
-	ExampleAt              string `json:"example_at"`
-	ExtensionDay           int    `json:"extension_day"`
-	Pictures               string `json:"pictures"`
-	Content                string `json:"content"`
-	AcceptanceFailedRemark string `json:"acceptance_failed_remark"`
-}
-
-func (MatPickWork) TableName() string {
-	return "zy_mat_pick_work"
+	ID              int    `json:"id"`
+	QualityAcceptId int    `json:"quality_accept_id"`
+	Name            string `json:"name"`
+	Content         string `json:"content"`
+	Photograph      string `json:"photograph"`
+	Days            int    `json:"days"`
 }

File diff suppressed because it is too large
+ 0 - 0
public/admin/index.html


File diff suppressed because it is too large
+ 0 - 0
public/admin/static/js/chunk-09887dd6.46aa5e98.js


File diff suppressed because it is too large
+ 0 - 0
public/admin/static/js/chunk-09c5235e.fc448362.js


File diff suppressed because it is too large
+ 0 - 0
public/admin/static/js/chunk-1eb0bf4c.1cbf3ec8.js


File diff suppressed because it is too large
+ 0 - 0
public/admin/static/js/chunk-5b9fcef3.ea96e8c4.js


File diff suppressed because it is too large
+ 0 - 0
public/admin/static/js/chunk-6e3c02ab.0b6ce8b1.js


File diff suppressed because it is too large
+ 0 - 0
public/admin/static/js/chunk-b40600b6.d7181331.js


File diff suppressed because it is too large
+ 0 - 0
public/admin/static/js/chunk-fd2a6af6.1d38ffc6.js


+ 3 - 0
routers/admin/admin.go

@@ -5,6 +5,7 @@ import (
 	"zhiyuan/controllers/admin/activity"
 	"zhiyuan/controllers/admin/activity/one"
 	"zhiyuan/controllers/admin/aftersale"
+	"zhiyuan/controllers/admin/work"
 	"zhiyuan/controllers/geo"
 	"zhiyuan/controllers/houses"
 	"zhiyuan/middlewares"
@@ -163,6 +164,8 @@ func InitAdminRouters(r *gin.Engine, router *gin.RouterGroup) {
 		db.Router(router, &models.WorkArrangeItem{}, "/workarrangeitem")
 		router.POST("/workarrangeitem/import", admin.WorkArrangeItemImport)
 
+		router.POST("/quality/import/:id", work.QualityImport)
+
 		db.Router(router, &models.Shop{}, "/shop")
 		db.Router(router, &models.Store{}, "/store")
 	}

+ 0 - 1
routers/admin/work.go

@@ -91,7 +91,6 @@ func InitWorkRouters(router *gin.RouterGroup) {
 	db.Router(router, &models.WorkSiteNodeModel{}, "/worksitenode")
 	db.Router(router, &models.WorkSiteNodeQualityAcceptModel{}, "/worksitenodequalityaccept")
 	router.POST("/worker/import", work.WorkerImport)
-
 	router.POST("/workreturnvisit/copy/:id", work.WorkReturnVisitCopy)
 	router.GET("/workreturnvisitstatist", work.WorkReturnVisitStatist)
 	router.POST("/workpkg/copy/:id", work.WorkWorkPkgCopy)

+ 102 - 1
views/admin/src/data/work/workqualityaccept.js

@@ -1,4 +1,67 @@
 
+import Vue from "vue";
+import DataDialog from "../../views/data/dialog";
+import { apiPost } from "@/api/api.js";
+import store from "./../../store";
+
+let Dialog = Vue.extend({
+  store,
+  render: function (h) {
+    return h("DataDialog", {
+      attrs: {
+        value: this.form,
+        data: this.datas,
+        visible: this.dialogVisible,
+        submit: true,
+      },
+      on: {
+        input: ($event) => {
+          this.form = $event;
+        },
+        change: ($event) => {
+          if (this.change) {
+            this.change($event);
+          }
+        },
+        submit: ($event) => {
+          if (this.submit) {
+            this.submit($event);
+          }
+        },
+        "update:visible": ($event) => {
+          this.dialogVisible = $event;
+        },
+      },
+    });
+  },
+  components: { DataDialog },
+  data() {
+    return {
+      dialogVisible: false,
+      form: {},
+      datas: {
+        name: "budget:customer",
+        label: "导入",
+        primary: "id",
+        fields: [
+          {
+            name: "file",
+            label: "数据",
+            type: "upload",
+            accept: ".excel,.xlsx",
+            required: true,
+          },
+        ],
+      },
+      change: null,
+    };
+  },
+});
+let dialog = new Dialog();
+dialog.$mount();
+
+
+
 export default {
     name: 'work:workqualityaccept',
     label: '质检',
@@ -19,6 +82,44 @@ export default {
       type: 'show',
       activeText: '',
       inactiveText: ''
-    }]
+    }],  
+    handles: [    {
+      name: "导入",
+      // require: (data, context) => checkPermission(["final:finalsitecontract:state"]) && (context.shop_ids.split(",").map(p => p ? parseInt(p) : 0).indexOf(data.shop_id) != -1 || data.designer_id == context.user.id),
+      handle: (data, context) => {
+        dialog.form = {
+          budget: data,
+        };
+        dialog.dialogVisible = true;
+        dialog.submit = (from) => {
+
+          context.$confirm("确认导入数据吗? ", "提示", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning",
+          })
+            .then(() => {
+              context.loading = true;
+              apiPost("/quality/import/" + data.id, from)
+                .then((res) => {
+                  console.log(res);
+                  context.loadList();
+                  context.$message({
+                    message: "操作成功",
+                    type: "success",
+                  });
+                  dialog.dialogVisible = false;
+                })
+                .catch((err) => {
+                  console.log(err);
+                  context.loading = false;
+                });
+
+              })
+
+
+        };
+      },
+    },]
   }
   

Some files were not shown because too many files changed in this diff