From 6ca4d2757a0489ffd3d32829a763704d83575f30 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期四, 11 七月 2024 21:52:58 +0800
Subject: [PATCH] 从指定路径excel获取产品编码和图片,传到文件服务器并保存的接口,用于嘉联为所有产品上传图片。

---
 controllers/other.go |  188 ++++++++++++++++++++++++++
 docs/swagger.yaml    |   47 ++++++
 docs/docs.go         |   67 +++++++++
 docs/swagger.json    |   67 +++++++++
 router/router.go     |    7 +
 5 files changed, 367 insertions(+), 9 deletions(-)

diff --git a/controllers/other.go b/controllers/other.go
new file mode 100644
index 0000000..49d715f
--- /dev/null
+++ b/controllers/other.go
@@ -0,0 +1,188 @@
+package controllers
+
+import (
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"github.com/xuri/excelize/v2"
+	"gorm.io/gorm"
+	"strings"
+	"wms/constvar"
+	"wms/extend/code"
+	"wms/extend/util"
+	"wms/models"
+	"wms/pkg/logx"
+	"wms/utils/upload"
+)
+
+type OtherController struct{}
+
+type saveProductImagesFromExcelRequest struct {
+	ExcelFilePath        string `json:"excelFilePath"`        //excel璺緞 鐢╠ocker cp浼犲埌瀹瑰櫒閲�
+	SheetIndex           int    `json:"sheetIndex"`           //绗嚑涓猻heet
+	ProductIdColumnIndex int    `json:"productIdColumnIndex"` //浜у搧ID鏄鍑犲垪(浠�0寮�濮�)
+	ImageColumn          string `json:"imageColumn"`          //鍥剧墖鎵�鍦ㄥ垪鍚�
+}
+
+// SaveProductImagesFromExcel
+// @Tags      鍏朵粬
+// @Summary   浠巈xcel涓幏鍙栦骇鍝佸浘鐗囧苟淇濆瓨
+// @Produce   application/json
+// @Param     object  body  saveProductImagesFromExcelRequest true  "灞炴�т俊鎭�"
+// @Param     Authorization	header string true "token"
+// @Success   200 {object} util.Response "鎴愬姛"
+// @Router    /api-wms/v1/other/saveProductImagesFromExcel [post]
+func (slf OtherController) SaveProductImagesFromExcel(c *gin.Context) {
+	var params saveProductImagesFromExcelRequest
+	if err := c.BindJSON(&params); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�:"+err.Error())
+		return
+	}
+	if params.ExcelFilePath == "" || params.ImageColumn == "" {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟缂哄け")
+		return
+	}
+
+	productImageMap, err := UploadProductImagesFromExcel(params.ExcelFilePath, params.SheetIndex, params.ProductIdColumnIndex, params.ImageColumn)
+	if err != nil {
+		logx.Errorf("SaveProductImagesFromExcel err:%v", err)
+		util.ResponseFormat(c, code.SaveFail, "鎿嶄綔澶辫触")
+		return
+	}
+
+	for productId, urls := range productImageMap {
+		if len(urls) == 0 {
+			continue
+		}
+		attachmentList := make([]*models.Attachment, 0)
+		materialAttachmentList := make([]*models.MaterialAttachment, 0)
+		for _, url := range urls {
+			attachmentList = append(attachmentList, &models.Attachment{
+				FileUrl:  url,
+				FileType: constvar.FileType_Picture,
+			})
+		}
+
+		err = models.WithTransaction(func(db *gorm.DB) error {
+			//淇濆瓨闄勪欢
+			if attachmentList, err = models.NewAttachmentSearch().CreateBatchWithResp(attachmentList); err != nil {
+				logx.Errorf("attachment create err: %v", err)
+				return err
+			}
+
+			//淇濆瓨鐗╂枡鍜岄檮浠舵槧灏�
+			for _, v := range attachmentList {
+				ma := &models.MaterialAttachment{MaterialID: productId, AttachmentID: v.Id}
+				materialAttachmentList = append(materialAttachmentList, ma)
+			}
+			if err := models.NewMaterialAttachmentSearch().SetOrm(db).CreateBatch(materialAttachmentList); err != nil {
+				return err
+			}
+			return nil
+		})
+		if err != nil {
+			logx.Errorf("SaveProductImagesFromExcel save db  err:%v, productId:%v, urls:%v", err, productId, urls)
+		}
+	}
+
+	util.ResponseFormat(c, code.Success, "淇濆瓨鎴愬姛")
+}
+
+// UploadProductImagesFromExcel 浠嶦xcel鏂囦欢涓笂浼犱骇鍝佸浘鐗�
+func UploadProductImagesFromExcel(filePath string, sheetIndex int, productIdColumn int, imageColumn string) (productImageMap map[string][]string, err error) {
+	productImageMap = make(map[string][]string)
+	// 鍔犺浇Excel鏂囦欢
+	f, err := excelize.OpenFile(filePath)
+	if err != nil {
+		logx.Errorf("Failed to open Excel file: %v", err)
+		return
+	}
+	defer f.Close()
+
+	// 鑾峰彇宸ヤ綔琛ㄥ悕绉�
+	sheetName := f.GetSheetName(sheetIndex)
+	// 璇诲彇宸ヤ綔琛ㄤ腑鐨勬墍鏈夎
+	rows, err := f.GetRows(sheetName)
+	if err != nil {
+		logx.Errorf("Failed to get rows from sheet:%v", err)
+		return
+	}
+
+	// 鑾峰彇鎸囧畾鍒楃殑鍚堝苟鍗曞厓鏍间俊鎭�
+	mergedCells, err := getColumnMergeCells(f, sheetName, imageColumn)
+	if err != nil {
+		logx.Errorf("Failed to get merged cells:%v", err)
+		return
+	}
+
+	mergeCellMap := make(map[string]excelize.MergeCell)
+	for _, cell := range mergedCells {
+		mergeCellMap[cell.GetStartAxis()] = cell
+	}
+
+	var imagePaths []string
+	// 閬嶅巻Excel琛岋紝璇诲彇鏁版嵁
+	for rowIndex, row := range rows[1:] { // 鍋囪绗竴琛屾槸鏍囬琛岋紝璺宠繃
+		if len(row) < 1 {
+			continue
+		}
+		productId := row[productIdColumn]
+		currentCell := fmt.Sprintf("%s%d", imageColumn, rowIndex+2)
+
+		// 妫�鏌ュ綋鍓嶅崟鍏冩牸鏄惁鍦ㄥ悎骞跺崟鍏冩牸涓�
+		if mergeCell, ok := mergeCellMap[currentCell]; ok {
+			imagePaths = make([]string, 0)
+			imageCell := mergeCell.GetStartAxis()
+
+			// 鑾峰彇鍥剧墖
+			pictures, err := f.GetPictures(sheetName, imageCell)
+			if err != nil {
+				logx.Errorf("Failed to get picture for cell %s: %v", imageCell, err)
+				continue
+			}
+
+			if len(pictures) == 0 {
+				logx.Errorf("No picture found for cell %s", imageCell)
+				continue
+			}
+
+			for k, picture := range pictures {
+				fileBytes := picture.File
+				fileName := fmt.Sprintf("image_%s_%d.png", imageCell, k+1)
+
+				// 淇濆瓨鍥剧墖鍒版湰鍦板苟鑾峰彇璺緞
+				imagePath, err := upload.UploadFileToSeaWeed(string(constvar.FileType_Picture), fileName, fileBytes)
+				if err != nil {
+					logx.Errorf("Failed to save image for product %s: %v\n", productId, err)
+					continue
+				}
+				imagePaths = append(imagePaths, imagePath)
+			}
+		}
+
+		if productId == "" {
+			continue
+		}
+
+		// imagePaths
+		productImageMap[productId] = imagePaths
+		logx.Infof("UploadProductImagesFromExcel Product ID: %s, Image Urls: %s\n", productId, imagePaths)
+	}
+	return productImageMap, nil
+}
+
+// getColumnMergeCells 鑾峰彇鎸囧畾鍒楃殑鍚堝苟鍗曞厓鏍�
+func getColumnMergeCells(f *excelize.File, sheetName string, targetColumn string) ([]excelize.MergeCell, error) {
+	// 鑾峰彇鎵�鏈夊悎骞跺崟鍏冩牸
+	mergeCells, err := f.GetMergeCells(sheetName)
+	if err != nil {
+		return nil, err
+	}
+
+	var columnMergeCells []excelize.MergeCell
+	for _, mergeCell := range mergeCells {
+		if strings.HasPrefix(mergeCell.GetStartAxis(), targetColumn) {
+			columnMergeCells = append(columnMergeCells, mergeCell)
+		}
+	}
+	return columnMergeCells, nil
+}
diff --git a/docs/docs.go b/docs/docs.go
index aee23f5..f46a305 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -2625,6 +2625,43 @@
                 }
             }
         },
+        "/api-wms/v1/other/saveProductImagesFromExcel": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鍏朵粬"
+                ],
+                "summary": "浠巈xcel涓幏鍙栦骇鍝佸浘鐗囧苟淇濆瓨",
+                "parameters": [
+                    {
+                        "description": "灞炴�т俊鎭�",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/controllers.saveProductImagesFromExcelRequest"
+                        }
+                    },
+                    {
+                        "type": "string",
+                        "description": "token",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "$ref": "#/definitions/util.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api-wms/v1/product/addDisuse": {
             "post": {
                 "produces": [
@@ -4395,6 +4432,27 @@
                 "WhetherTypeAlways",
                 "ReservationNever"
             ]
+        },
+        "controllers.saveProductImagesFromExcelRequest": {
+            "type": "object",
+            "properties": {
+                "excelFilePath": {
+                    "description": "excel璺緞 鐢╠ocker cp浼犲埌瀹瑰櫒閲�",
+                    "type": "string"
+                },
+                "imageColumn": {
+                    "description": "鍥剧墖鎵�鍦ㄥ垪鍚�",
+                    "type": "string"
+                },
+                "productIdColumnIndex": {
+                    "description": "浜у搧ID鏄鍑犲垪(浠�0寮�濮�)",
+                    "type": "integer"
+                },
+                "sheetIndex": {
+                    "description": "绗嚑涓猻heet",
+                    "type": "integer"
+                }
+            }
         },
         "gorm.DeletedAt": {
             "type": "object",
@@ -6333,9 +6391,9 @@
                     "description": "姣忛〉澶у皬",
                     "type": "integer"
                 },
-                "warehouseCode": {
-                    "description": "浠撳簱缂╁啓",
-                    "type": "string"
+                "warehouseId": {
+                    "description": "WarehouseCode string ` + "`" + `json:\"warehouseCode\"` + "`" + ` //浠撳簱缂╁啓",
+                    "type": "integer"
                 }
             }
         },
@@ -6373,6 +6431,9 @@
                 "unit": {
                     "description": "鍗曚綅",
                     "type": "string"
+                },
+                "warehouseCode": {
+                    "type": "string"
                 }
             }
         },
diff --git a/docs/swagger.json b/docs/swagger.json
index 76cdd10..e32dcf8 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -2614,6 +2614,43 @@
                 }
             }
         },
+        "/api-wms/v1/other/saveProductImagesFromExcel": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鍏朵粬"
+                ],
+                "summary": "浠巈xcel涓幏鍙栦骇鍝佸浘鐗囧苟淇濆瓨",
+                "parameters": [
+                    {
+                        "description": "灞炴�т俊鎭�",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/controllers.saveProductImagesFromExcelRequest"
+                        }
+                    },
+                    {
+                        "type": "string",
+                        "description": "token",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "$ref": "#/definitions/util.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api-wms/v1/product/addDisuse": {
             "post": {
                 "produces": [
@@ -4384,6 +4421,27 @@
                 "WhetherTypeAlways",
                 "ReservationNever"
             ]
+        },
+        "controllers.saveProductImagesFromExcelRequest": {
+            "type": "object",
+            "properties": {
+                "excelFilePath": {
+                    "description": "excel璺緞 鐢╠ocker cp浼犲埌瀹瑰櫒閲�",
+                    "type": "string"
+                },
+                "imageColumn": {
+                    "description": "鍥剧墖鎵�鍦ㄥ垪鍚�",
+                    "type": "string"
+                },
+                "productIdColumnIndex": {
+                    "description": "浜у搧ID鏄鍑犲垪(浠�0寮�濮�)",
+                    "type": "integer"
+                },
+                "sheetIndex": {
+                    "description": "绗嚑涓猻heet",
+                    "type": "integer"
+                }
+            }
         },
         "gorm.DeletedAt": {
             "type": "object",
@@ -6322,9 +6380,9 @@
                     "description": "姣忛〉澶у皬",
                     "type": "integer"
                 },
-                "warehouseCode": {
-                    "description": "浠撳簱缂╁啓",
-                    "type": "string"
+                "warehouseId": {
+                    "description": "WarehouseCode string `json:\"warehouseCode\"` //浠撳簱缂╁啓",
+                    "type": "integer"
                 }
             }
         },
@@ -6362,6 +6420,9 @@
                 "unit": {
                     "description": "鍗曚綅",
                     "type": "string"
+                },
+                "warehouseCode": {
+                    "type": "string"
                 }
             }
         },
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index 336f0d7..3504c9f 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -361,6 +361,21 @@
     - WhetherTypeAsk
     - WhetherTypeAlways
     - ReservationNever
+  controllers.saveProductImagesFromExcelRequest:
+    properties:
+      excelFilePath:
+        description: excel璺緞 鐢╠ocker cp浼犲埌瀹瑰櫒閲�
+        type: string
+      imageColumn:
+        description: 鍥剧墖鎵�鍦ㄥ垪鍚�
+        type: string
+      productIdColumnIndex:
+        description: 浜у搧ID鏄鍑犲垪(浠�0寮�濮�)
+        type: integer
+      sheetIndex:
+        description: 绗嚑涓猻heet
+        type: integer
+    type: object
   gorm.DeletedAt:
     properties:
       time:
@@ -1693,9 +1708,9 @@
       pageSize:
         description: 姣忛〉澶у皬
         type: integer
-      warehouseCode:
-        description: 浠撳簱缂╁啓
-        type: string
+      warehouseId:
+        description: WarehouseCode string `json:"warehouseCode"` //浠撳簱缂╁啓
+        type: integer
     type: object
   request.GetInventoryHistory:
     properties:
@@ -1720,6 +1735,8 @@
         type: string
       unit:
         description: 鍗曚綅
+        type: string
+      warehouseCode:
         type: string
     type: object
   request.GetList:
@@ -4038,6 +4055,30 @@
       summary: 缂栬緫閮ㄩ棬淇℃伅
       tags:
       - 閮ㄩ棬淇℃伅
+  /api-wms/v1/other/saveProductImagesFromExcel:
+    post:
+      parameters:
+      - description: 灞炴�т俊鎭�
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/controllers.saveProductImagesFromExcelRequest'
+      - description: token
+        in: header
+        name: Authorization
+        required: true
+        type: string
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 鎴愬姛
+          schema:
+            $ref: '#/definitions/util.Response'
+      summary: 浠巈xcel涓幏鍙栦骇鍝佸浘鐗囧苟淇濆瓨
+      tags:
+      - 鍏朵粬
   /api-wms/v1/product/addDisuse:
     post:
       parameters:
diff --git a/router/router.go b/router/router.go
index 815904d..5135e5a 100644
--- a/router/router.go
+++ b/router/router.go
@@ -239,5 +239,12 @@
 		sysCfgApi.GET("get", sysCfgCtl.GetSystemConfig) //鑾峰彇绯荤粺閰嶇疆
 	}
 
+	//鍏朵粬
+	otherCtl := new(controllers.OtherController)
+	otherApi := r.Group(urlPrefix + "/other")
+	{
+		otherApi.POST("saveProductImagesFromExcel", otherCtl.SaveProductImagesFromExcel) //浠庢寚瀹氳矾寰勭殑excel鑾峰彇浜у搧缂栧彿鍜屽浘鐗囷紝涓婁紶骞朵繚瀛�
+	}
+
 	return r
 }

--
Gitblit v1.8.0