浏览代码

导出达人物流数据

Ethan 1 周之前
父节点
当前提交
3482d85854

+ 31 - 0
app/controller/task_controller.go

@@ -3,6 +3,7 @@ package controller
 import (
 	"github.com/gin-gonic/gin"
 	"github.com/sirupsen/logrus"
+	"net/http"
 	"youngee_b_api/app/service"
 	"youngee_b_api/app/vo"
 )
@@ -926,6 +927,36 @@ func (t TaskController) LogisticsTalentList(c *gin.Context) {
 	returnSuccess(c, 20000, res)
 }
 
+// 导出种草达人物流数据
+func (t TaskController) LogisticsExport(c *gin.Context) {
+	param := &vo.LogisticsTalentParam{}
+	err := c.BindJSON(param)
+	if err != nil || "" == param.ProjectId {
+		logrus.Errorf("Request bind err:%+v\n", err)
+		returnError(c, 40000, "Parameter Error: "+err.Error())
+		return
+	}
+	f, err := service.TaskInfoService{}.LogisticsExport(param)
+	if err != nil {
+		logrus.Errorf("[LogisticsExport] call LogisticsExport err:%+v\n", err)
+		returnError(c, 40000, err.Error())
+		return
+	}
+	// 设置响应头,提示浏览器下载
+	c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
+	c.Header("Content-Disposition", "attachment; filename=export_data.xlsx")
+	c.Header("File-Name", "export_data.xlsx")
+	c.Header("Content-Transfer-Encoding", "binary")
+	c.Header("Expires", "0")
+	// 将生成的 Excel 文件写入响应体
+	if err := f.Write(c.Writer); err != nil {
+		c.String(http.StatusInternalServerError, "导出失败: %s", err.Error())
+		returnError(c, 40000, "导出失败")
+	}
+	_ = f.Close()
+	returnSuccess(c, 20000, nil)
+}
+
 // 种草待发货、待签收、已签收统计
 func (t TaskController) LogisticsTalentCount(c *gin.Context) {
 	param := &vo.LogisticsTalentParam{}

+ 1 - 0
app/entity/project_task_info.go

@@ -54,6 +54,7 @@ type ProjectTaskInfo struct {
 	TerminateOperator      string    `gorm:"column:terminate_operator"`
 	CancelOperatorType     int64     `gorm:"column:cancel_operator_type;default:0;NOT NULL"`
 	CancelOperator         string    `gorm:"column:cancel_operator"`
+	TalentName             string    `gorm:"column:talent_name"`
 }
 
 func (m *ProjectTaskInfo) TableName() string {

+ 18 - 0
app/entity/talent_delivery_address.go

@@ -0,0 +1,18 @@
+// Code generated by sql2gorm. DO NOT EDIT.
+package entity
+
+// 达人地址(物流)
+type TalentDeliveryAddress struct {
+	AddressID    int64  `gorm:"column:address_id;primary_key;AUTO_INCREMENT"`
+	TalentID     string `gorm:"column:talent_id"`                      // 达人id(youngee_talent_info表中的id)
+	RegionCode   int    `gorm:"column:region_code"`                    // 区域码,取info_region表中的self_code字段值
+	DetailAddr   string `gorm:"column:detail_addr"`                    // 详细地址
+	PhoneNumber  string `gorm:"column:phone_number"`                   // 联系电话
+	ReceiverName string `gorm:"column:receiver_name"`                  // 收货人名字
+	DefaultTag   int    `gorm:"column:default_tag;default:1;NOT NULL"` // 是否默认收货地址
+	DoorNum      string `gorm:"column:door_num"`                       // 门牌号
+}
+
+func (m *TalentDeliveryAddress) TableName() string {
+	return "youngee_talent_delivery_address"
+}

+ 3 - 3
app/schedule/auto_task_execute.go

@@ -51,7 +51,7 @@ func AutoSketchExecuteTask() {
 	var localTaskIds []string
 	for _, sketchInfo := range sketchInfos {
 		sketchId := sketchInfo.SketchID
-		if time.Now().After(sketchInfo.AgreeAt) {
+		if time.Now().After(sketchInfo.AutoAgreeAt) {
 			sketchIds = append(sketchIds, sketchId)
 			if sketchInfo.TaskType == 1 {
 				projectTaskIds = append(projectTaskIds, sketchInfo.TaskID)
@@ -91,7 +91,7 @@ func AutoLinkExecuteTask() {
 	var localTaskIds []string
 	for _, LinInfo := range LinInfos {
 		linkId := LinInfo.LinkID
-		if time.Now().After(LinInfo.AgreeAt) {
+		if time.Now().After(LinInfo.AutoAgreeAt) {
 			linkIds = append(linkIds, linkId)
 			if LinInfo.TaskType == 1 {
 				projectTaskIds = append(projectTaskIds, LinInfo.TaskID)
@@ -131,7 +131,7 @@ func AutoDataExecuteTask() {
 	var localTaskIds []string
 	for _, dataInfo := range dataInfos {
 		dataId := dataInfo.DataID
-		if time.Now().After(dataInfo.AgreeAt) {
+		if time.Now().After(dataInfo.AutoAgreeAt) {
 			dataIds = append(dataIds, dataId)
 			if dataInfo.TaskType == 1 {
 				projectTaskIds = append(projectTaskIds, dataInfo.TaskID)

+ 84 - 0
app/service/task_info_service.go

@@ -1,6 +1,11 @@
 package service
 
 import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"github.com/xuri/excelize/v2"
+	"strconv"
 	"youngee_b_api/app/dao"
 	"youngee_b_api/app/entity"
 	"youngee_b_api/app/vo"
@@ -102,6 +107,85 @@ func (t TaskInfoService) LogisticsTalentList(param *vo.LogisticsTalentParam) (*v
 	return &result, nil
 }
 
+// 导出种草达人物流数据
+func (t TaskInfoService) LogisticsExport(param *vo.LogisticsTalentParam) (*excelize.File, error) {
+	// 准备数据
+	var logisticsExports []*vo.LogisticsExport
+	param.Page = 1
+	param.PageSize = 1<<31 - 1
+	var projectTaskInfos []*entity.ProjectTaskInfo
+	var err error
+	projectId := param.ProjectId
+	if param.Status == 1 { // 待发货
+		projectTaskInfos, _, err = dao.ProjectTaskInfoDao{}.GetListByTaskStage(projectId, 4, "", param.Page, param.PageSize, param.Nickname)
+	} else if param.Status == 2 { // 待签收
+		projectTaskInfos, _, err = dao.ProjectTaskInfoDao{}.GetListByTaskStage(projectId, 5, param.DeliveryTime, param.Page, param.PageSize, param.Nickname)
+	} else if param.Status == 3 { // 已签收
+		projectTaskInfos, _, err = dao.ProjectTaskInfoDao{}.GetListByTaskStage(projectId, 6, "", param.Page, param.PageSize, param.Nickname)
+	}
+	if err != nil {
+		return nil, err
+	}
+	for _, projectTaskInfo := range projectTaskInfos {
+		var talentDeliveryAddress entity.TalentDeliveryAddress
+		err = json.Unmarshal([]byte(projectTaskInfo.TalentPostAddrSnap), &talentDeliveryAddress)
+		if err != nil {
+			fmt.Println("解析 JSON 失败:", err)
+			return nil, err
+		}
+		taskLogistics, err := dao.TaskLogisticsDao{}.SelectTaskLogistics(projectTaskInfo.TaskID)
+		if err != nil {
+			return nil, err
+		}
+		logisticsExport := &vo.LogisticsExport{
+			TalentId:        projectTaskInfo.TalentID,
+			TalentName:      projectTaskInfo.TalentName,
+			ReceiverName:    talentDeliveryAddress.ReceiverName,
+			PhoneNumber:     talentDeliveryAddress.PhoneNumber,
+			Province:        strconv.Itoa(talentDeliveryAddress.RegionCode),
+			City:            strconv.Itoa(talentDeliveryAddress.RegionCode),
+			County:          strconv.Itoa(talentDeliveryAddress.RegionCode),
+			DetailAddr:      talentDeliveryAddress.DetailAddr,
+			CompanyName:     taskLogistics.CompanyName,
+			LogisticsNumber: taskLogistics.LogisticsNumber,
+			Operator:        "",
+		}
+		if param.Status == 2 {
+			logisticsExport.Time = projectTaskInfo.DeliveryDate.Format("2006-01-02 15:04:05")
+		}
+		if param.Status == 3 {
+			logisticsExport.Time = projectTaskInfo.SignedTime.Format("2006-01-02 15:04:05")
+		}
+		logisticsExports = append(logisticsExports, logisticsExport)
+	}
+	// 打开 Excel 模板
+	templatePath := "export_template.xlsx"
+	f, err10 := excelize.OpenFile(templatePath)
+	if err10 != nil {
+		return nil, errors.New(fmt.Sprintf("加载模板失败: %s", err10))
+	}
+	// 写入数据
+	sheet := "Sheet1"
+	startRow := 2
+	for i, logisticsExport := range logisticsExports {
+		row := strconv.Itoa(startRow + i)
+		_ = f.SetCellValue(sheet, "A"+row, logisticsExport.TalentId)
+		_ = f.SetCellValue(sheet, "B"+row, logisticsExport.TalentName)
+		_ = f.SetCellValue(sheet, "C"+row, logisticsExport.ReceiverName)
+		_ = f.SetCellValue(sheet, "D"+row, logisticsExport.PhoneNumber)
+		_ = f.SetCellValue(sheet, "E"+row, logisticsExport.Province)
+		_ = f.SetCellValue(sheet, "F"+row, logisticsExport.City)
+		_ = f.SetCellValue(sheet, "G"+row, logisticsExport.County)
+		_ = f.SetCellValue(sheet, "H"+row, logisticsExport.DetailAddr)
+		_ = f.SetCellValue(sheet, "I"+row, logisticsExport.CompanyName)
+		_ = f.SetCellValue(sheet, "J"+row, logisticsExport.LogisticsNumber)
+		_ = f.SetCellValue(sheet, "K"+row, logisticsExport.Operator)
+		_ = f.SetCellValue(sheet, "L"+row, logisticsExport.Time)
+	}
+
+	return f, nil
+}
+
 // 种草待发货、待签收、已签收统计
 func (t TaskInfoService) LogisticsTalentCount(param *vo.LogisticsTalentParam) map[string]int64 {
 	res := make(map[string]int64)

+ 16 - 0
app/vo/re_logistics_export.go

@@ -0,0 +1,16 @@
+package vo
+
+type LogisticsExport struct {
+	TalentId        string
+	TalentName      string
+	ReceiverName    string
+	PhoneNumber     string
+	Province        string
+	City            string
+	County          string
+	DetailAddr      string
+	CompanyName     string
+	LogisticsNumber string
+	Operator        string
+	Time            string
+}

二进制
export_template.xlsx


+ 11 - 5
go.mod

@@ -44,13 +44,19 @@ require (
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/leodido/go-urn v1.2.1 // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
+	github.com/richardlehane/mscfb v1.0.4 // indirect
+	github.com/richardlehane/msoleps v1.0.4 // indirect
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/pretty v1.2.0 // indirect
 	github.com/tjfoc/gmsm v1.4.1 // indirect
 	github.com/ugorji/go/codec v1.2.7 // indirect
+	github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d // indirect
+	github.com/xuri/excelize/v2 v2.9.0 // indirect
+	github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 // indirect
 	go.mongodb.org/mongo-driver v1.12.0 // indirect
-	golang.org/x/net v0.23.0 // indirect
-	golang.org/x/text v0.15.0 // indirect
+	golang.org/x/net v0.30.0 // indirect
+	golang.org/x/text v0.19.0 // indirect
 	gopkg.in/ini.v1 v1.67.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 )
@@ -74,10 +80,10 @@ require (
 	github.com/swaggo/swag v1.8.1
 	github.com/tidwall/gjson v1.14.1
 	github.com/wechatpay-apiv3/wechatpay-go v0.2.15
-	golang.org/x/crypto v0.23.0 // indirect
+	golang.org/x/crypto v0.28.0 // indirect
 	//golang.org/x/net v0.23.0 // indirect
-	golang.org/x/sys v0.20.0 // indirect
-	golang.org/x/tools v0.6.0 // indirect
+	golang.org/x/sys v0.26.0 // indirect
+	golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
 	google.golang.org/protobuf v1.28.0 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df

+ 23 - 0
go.sum

@@ -190,6 +190,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
 github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
@@ -208,6 +210,11 @@ github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsK
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
+github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
+github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
+github.com/richardlehane/msoleps v1.0.4 h1:WuESlvhX3gH2IHcd8UqyCuFY5yiq/GR/yqaSM/9/g00=
+github.com/richardlehane/msoleps v1.0.4/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
 github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
 github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
 github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
@@ -263,6 +270,12 @@ github.com/wechatpay-apiv3/wechatpay-go v0.2.15/go.mod h1:Ca9wvI7xFoIWiY163q1jzd
 github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
 github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
 github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
+github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d h1:llb0neMWDQe87IzJLS4Ci7psK/lVsjIS2otl+1WyRyY=
+github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
+github.com/xuri/excelize/v2 v2.9.0 h1:1tgOaEq92IOEumR1/JfYS/eR0KHOCsRv/rYXXh6YJQE=
+github.com/xuri/excelize/v2 v2.9.0/go.mod h1:uqey4QBZ9gdMeWApPLdhm9x+9o2lq4iVmjiLfBS5hdE=
+github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 h1:hPVCafDV85blFTabnqKgNhDCkJX25eik94Si9cTER4A=
+github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -285,6 +298,8 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf
 golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
 golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
 golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
+golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
+golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@@ -317,6 +332,8 @@ golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
 golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
 golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
 golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
+golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
+golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -352,6 +369,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
 golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
+golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
@@ -373,6 +392,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
 golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
+golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -385,6 +406,8 @@ golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

+ 1 - 0
route/init.go

@@ -310,6 +310,7 @@ func InitRoute(r *gin.Engine) {
 		// 寄样管理
 		task.POST("/logistics/selection/talent/count", controller.TaskController{}.LogisticsSelectionTalentCount) // 带货待发货、待签收、已签收角标
 		task.POST("/logistics/talent/list", controller.TaskController{}.LogisticsTalentList)                      // 种草达人物流列表
+		task.POST("/logistics/export", controller.TaskController{}.LogisticsExport)                               // 导出种草达人物流数据
 		task.POST("/logistics/talent/count", controller.TaskController{}.LogisticsTalentCount)                    // 种草待发货、待签收、已签收角标
 		task.POST("/logistics/createLogistics", handler.WrapCreateLogisticsHandler)                               // 创建物流信息