From c262bbd5499d7cec80f03a518ef80d14a325b790 Mon Sep 17 00:00:00 2001 From: chenlin Date: Wed, 30 Oct 2024 15:27:07 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=B8=BA=E4=BA=86=E5=90=8C=E6=AD=A510/19?= =?UTF-8?q?=E5=8F=B7=E4=B9=8B=E5=89=8D=E7=9A=84=E6=95=B0=E6=8D=AE=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86excel=E5=AF=BC=E5=85=A5=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3=EF=BC=9B=202.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E9=80=9A=E7=9F=A5=EF=BC=8C=E5=92=8C=E7=AC=AC?= =?UTF-8?q?=E4=B8=89=E6=96=B9=E6=B8=A0=E9=81=93=E6=96=B9=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/apis/migumanage/migu_admin.go | 204 ++++++++++++++++++++++++ 1 file changed, 204 insertions(+) diff --git a/app/admin/apis/migumanage/migu_admin.go b/app/admin/apis/migumanage/migu_admin.go index 5db1b01..a4188c8 100644 --- a/app/admin/apis/migumanage/migu_admin.go +++ b/app/admin/apis/migumanage/migu_admin.go @@ -1,12 +1,15 @@ package migumanage import ( + "encoding/csv" "errors" "fmt" "github.com/gin-gonic/gin" "github.com/go-admin-team/go-admin-core/logger" "github.com/go-admin-team/go-admin-core/sdk/pkg/response" "go-admin/app/admin/models" + "go-admin/tools" + "io" "net/http" "strings" "time" @@ -1286,3 +1289,204 @@ func (e MiGuDeployService) AddProduct(c *gin.Context) { // // e.OK("", "删除成功") //} + +// ImportExcelToMgOrderHandler 处理Excel文件导入请求 +// @Summary 导入订单Excel文件 +// @Tags 2024-咪咕-管理后台 +// @Accept multipart/form-data +// @Produce json +// @Param file formData file true "Excel文件" +// @Success 200 {object} map[string]string{"message": "导入成功"} +// @Router /api/v1/admin/order/import [post] +func (e MiGuDeployService) ImportExcelToMgOrderHandler(c *gin.Context) { + err := e.MakeContext(c).MakeOrm().Errors + if err != nil { + e.Logger.Error(err) + response.Error(c, http.StatusInternalServerError, err, "创建上下文失败") + return + } + + // 从请求中获取文件 + file, err := c.FormFile("file") + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "无法读取文件"}) + return + } + + // 打开上传的文件 + fileStream, err := file.Open() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "无法打开文件"}) + return + } + defer fileStream.Close() + + // 创建 CSV 阅读器 + reader := csv.NewReader(fileStream) + reader.LazyQuotes = true + + // 跳过 CSV 文件的标题行 + if _, err := reader.Read(); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "无法读取CSV标题行"}) + return + } + + //nRow := 0 + // 逐行读取 CSV 并插入数据库 + for { + //nRow++ + row, err := reader.Read() + if err == io.EOF { + break + } + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "读取CSV文件失败"}) + return + } + + // 检查数据是否齐全 + if len(row) < 4 { + continue // 跳过数据不全的行 + } + + // 解析订阅时间 + subscribeTime, err := time.Parse("2006-01-02 15:04:05", row[3]) + if err != nil { + fmt.Printf("解析时间错误: %v\n", err) + continue + } + + const cutoffTimeStr = "2024-10-18 18:58:00" + cutoffTime, _ := time.Parse("2006-01-02 15:04:05", cutoffTimeStr) + // 判断是否超过截止时间 + if subscribeTime.After(cutoffTime) { + fmt.Printf("跳过超过截止时间的记录: %v\n", subscribeTime) + continue + } + + // 将时间转换为 UTC+08:00 + // 将时间往前推8小时 + localTime := subscribeTime.Add(-8 * time.Hour) + + // 创建MgOrder对象 + order := models.MgOrderCopy{ + ProductID: 1, + ChannelCode: "6015150807", + OrderSerial: models.GetExcelOrderSerial(e.Orm, subscribeTime), + SubscribeTime: &localTime, + PhoneNumber: row[0], + ChannelTradeNo: row[1], + ExternalOrderID: row[2], + State: 1, + } + + order.CreatedAt = localTime + order.UpdatedAt = localTime + order.SM4PhoneNumber, _ = tools.SM4Encrypt(models.SM4KEy, order.PhoneNumber) + + // 插入到数据库 + if err := e.Orm.Create(&order).Error; err != nil { + fmt.Printf("插入订单数据失败: %v\n", err) + continue + } + + fmt.Println("order is:", order) + //if nRow > 4 { + // break + //} + } + + // 返回成功消息 + c.JSON(http.StatusOK, gin.H{"message": "导入成功"}) +} + +// ImportExcelToMgOrderHandlerUpdate 处理Excel文件导入请求 +// @Summary 导入订单Excel退订文件 +// @Tags 2024-咪咕-管理后台 +// @Accept multipart/form-data +// @Produce json +// @Param file formData file true "Excel文件" +// @Success 200 {object} map[string]string{"message": "导入成功"} +// @Router /api/v1/admin/order/import_update [post] +func (e MiGuDeployService) ImportExcelToMgOrderHandlerUpdate(c *gin.Context) { + err := e.MakeContext(c).MakeOrm().Errors + if err != nil { + e.Logger.Error(err) + response.Error(c, http.StatusInternalServerError, err, "创建上下文失败") + return + } + + // 从请求中获取文件 + file, err := c.FormFile("file") + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "无法读取文件"}) + return + } + + // 打开上传的文件 + fileStream, err := file.Open() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "无法打开文件"}) + return + } + defer fileStream.Close() + + // 创建 CSV 阅读器 + reader := csv.NewReader(fileStream) + reader.LazyQuotes = true + + // 跳过 CSV 文件的标题行 + if _, err := reader.Read(); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "无法读取CSV标题行"}) + return + } + + //nRow := 0 + // 逐行读取 CSV 并插入数据库 + for { + //nRow++ + row, err := reader.Read() + if err == io.EOF { + break + } + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "读取CSV文件失败"}) + return + } + + // 检查数据是否齐全 + if len(row) < 3 { + continue // 跳过数据不全的行 + } + + // 将时间往前推8小时 + //localTime := subscribeTime.Add(-8 * time.Hour) + + if !(row[0] != "" && len(row[0]) == 11) { + continue + } + + if row[0] == "15812800163" { + fmt.Println("found phone number: 15812800163") + break + } + + unsubscribeTime, _ := models.ConvertStringToTime(row[2]) + + err = e.Orm.Table("mg_order_copy").Where("phone_number = ?", row[0]).Updates(map[string]interface{}{ + "state": models.UnsubscribeOK, + "unsubscribe_time": unsubscribeTime, + "updated_at": unsubscribeTime, + }).Error + if err != nil { + fmt.Println("CheckOrderState update mg_order err:", err.Error()) + continue + } + //if nRow > 4 { + // break + //} + } + + // 返回成功消息 + c.JSON(http.StatusOK, gin.H{"message": "导入成功"}) +}