Ver Fonte

API审核

Ethan há 5 meses atrás
pai
commit
5e9d5c4242
40 ficheiros alterados com 1707 adições e 316 exclusões
  1. 5 0
      app/config/review_config.json
  2. 32 0
      app/controller/account_controller.go
  3. 1 61
      app/controller/task_controller.go
  4. 34 0
      app/dao/local_life_brief_dao.go
  5. 34 0
      app/dao/local_life_material_dao.go
  6. 34 0
      app/dao/local_life_review_dao.go
  7. 3 3
      app/dao/product_photo_dao.go
  8. 34 0
      app/dao/project_review_dao.go
  9. 34 0
      app/dao/selection_review_dao.go
  10. 20 0
      app/entity/local_life_brief.go
  11. 21 0
      app/entity/local_life_material.go
  12. 1 0
      app/entity/project_brief.go
  13. 1 0
      app/entity/project_material.go
  14. 25 0
      app/entity/review_local_life.go
  15. 22 0
      app/entity/review_project.go
  16. 21 0
      app/entity/review_selection.go
  17. 1 0
      app/entity/sec_brief.go
  18. 1 0
      app/entity/sec_material.go
  19. 1 1
      app/schedule/auto_task_invalid.go
  20. 6 4
      app/schedule/auto_task_recharge.go
  21. 670 0
      app/schedule/auto_task_review.go
  22. 183 12
      app/service/local_life_service.go
  23. 135 2
      app/service/project_service.go
  24. 27 0
      app/service/review_service/business_license_check.go
  25. 42 12
      app/service/review_service/config.go
  26. 0 38
      app/service/review_service/content_check.go
  27. 0 36
      app/service/review_service/credentials_check.go
  28. 0 23
      app/service/review_service/document_check.go
  29. 0 23
      app/service/review_service/document_check_info.go
  30. 0 34
      app/service/review_service/image_check.go
  31. 165 0
      app/service/review_service/review_service.go
  32. 0 35
      app/service/review_service/video_check.go
  33. 0 23
      app/service/review_service/video_check_info.go
  34. 133 4
      app/service/selection_info_service.go
  35. 2 0
      app/vo/local_update_param.go
  36. 2 0
      app/vo/project_update_param.go
  37. 1 0
      app/vo/re_selection_detail.go
  38. 2 0
      app/vo/selection_info_update_param.go
  39. 8 4
      main.go
  40. 6 1
      route/init.go

+ 5 - 0
app/config/review_config.json

@@ -0,0 +1,5 @@
+{
+  "review_ak": "CNN8MCCSJFGHL1MXCJRF",
+  "review_sk": "91arFGHyO7RrzXnZIFSPcLSC6y4P4MTKtkq3qLIy",
+  "project_id": "CNN8MCCSJFGHL1MXCJRF"
+}

+ 32 - 0
app/controller/account_controller.go

@@ -0,0 +1,32 @@
+package controller
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/app/service/review_service"
+)
+
+type AccountController struct{}
+
+type IdentifyParam struct {
+	BusinessLicenseUrl string `json:"business_license_url"`
+}
+
+// 营业执照OCR识别
+func (t AccountController) OCRIdentify(c *gin.Context) {
+	param := &IdentifyParam{}
+	err := c.BindJSON(param)
+	if err != nil {
+		logrus.Errorf("Request bind err:%+v\n", err)
+		returnError(c, 40000, "参数错误")
+		return
+	}
+	reviewService := review_service.GetConfig()
+	resultMap, err := reviewService.CheckBusinessLicense(param.BusinessLicenseUrl)
+	if err != nil {
+		logrus.Errorf("[OCRIdentify] call Show err:%+v\n", err)
+		returnError(c, 40000, err.Error())
+		return
+	}
+	returnSuccess(c, 20000, resultMap)
+}

+ 1 - 61
app/controller/task_controller.go

@@ -4,7 +4,6 @@ import (
 	"github.com/gin-gonic/gin"
 	"github.com/sirupsen/logrus"
 	"youngee_b_api/app/service"
-	"youngee_b_api/app/service/review_service"
 	"youngee_b_api/app/vo"
 )
 
@@ -186,65 +185,6 @@ func (t TaskController) SelectionDel(c *gin.Context) {
 	returnSuccess(c, 20000, resultMap)
 }
 
-// 电商带货任务审核
-func (t TaskController) CheckSelectionInfo(c *gin.Context) {
-	//data := &vo.ContentCheckParam{}
-	//err := c.BindJSON(data)
-	//if err != nil {
-	//	logrus.Errorf("Request bind err:%+v\n", err)
-	//	returnError(c, 40000, "error")
-	//	return
-	//}
-	//res, err := service.ContentService{}.CheckContent(data)
-	//if err != nil {
-	//	logrus.Errorf("[CheckSelectionInfo] call Show err:%+v\n", err)
-	//	returnError(c, 40000, "error")
-	//	return
-	//}
-	//
-	//returnSuccess(c, 20000, *res)
-	data := &vo.ContentCheckParam{}
-	err := c.BindJSON(data)
-	if err != nil {
-		logrus.Errorf("Request bind err:%+v\n", err)
-		returnError(c, 40000, "参数错误")
-		return
-	}
-	sdk := review_service.Config(data.AK, data.SK, data.ProjectId)
-	res1, err1 := sdk.CheckContent(data.Text)
-	res2, err2 := sdk.CheckImage(data.Image)
-	res3, err3 := sdk.CheckDocument(data.Document, data.Format)
-	res4, err4 := sdk.CheckVideo(data.Video)
-	res5, err5 := sdk.CheckCredentials(data.Credentials)
-	if err1 != nil {
-		logrus.Errorf("[CheckSelectionInfo] call Show err:%+v\n", err)
-		returnError(c, 40000, res1)
-		return
-	}
-	if err2 != nil {
-		logrus.Errorf("[CheckSelectionInfo] call Show err:%+v\n", err)
-		returnError(c, 40000, res2)
-		return
-	}
-	if err3 != nil {
-		logrus.Errorf("[CheckSelectionInfo] call Show err:%+v\n", err)
-		returnError(c, 40000, res3)
-		return
-	}
-	if err4 != nil {
-		logrus.Errorf("[CheckSelectionInfo] call Show err:%+v\n", err)
-		returnError(c, 40000, res4)
-		return
-	}
-	if err5 != nil {
-		logrus.Errorf("[CheckSelectionInfo] call Show err:%+v\n", err)
-		returnError(c, 40000, res5)
-		return
-	}
-
-	returnSuccess(c, 20000, res3)
-}
-
 // 创建种草任务
 func (t TaskController) CreateProject(c *gin.Context) {
 	data := &vo.ProjectCreateParam{}
@@ -800,7 +740,7 @@ func (t TaskController) LocalLifeTaskList(c *gin.Context) {
 	returnSuccess(c, 20000, res)
 }
 
-// 删除种草任务
+// 删除本地生活任务
 func (t TaskController) LocalLifeDel(c *gin.Context) {
 	param := &vo.LocalSearchParam{}
 	err := c.BindJSON(param)

+ 34 - 0
app/dao/local_life_brief_dao.go

@@ -0,0 +1,34 @@
+package dao
+
+import (
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/app/entity"
+)
+
+type LocalLifeBriefDao struct{}
+
+func (p LocalLifeBriefDao) DeleteLocalBriefByLocalId(localId string) error {
+	err := Db.Where("local_id = ?", localId).Delete(entity.LocalLifeBrief{}).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (p LocalLifeBriefDao) CreateLocalBrief(briefInfo entity.LocalLifeBrief) error {
+	err := Db.Create(&briefInfo).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (p LocalLifeBriefDao) GetLocalBriefInfo(localId string) ([]*entity.LocalLifeBrief, error) {
+	var localBriefInfos []*entity.LocalLifeBrief
+	err := Db.Model(entity.LocalLifeBrief{}).Where("local_id = ?", localId).Order("created_at asc").Find(&localBriefInfos).Error
+	if err != nil {
+		logrus.Errorf("[GetLocalBriefInfo] error query mysql, err:%+v", err)
+		return nil, err
+	}
+	return localBriefInfos, nil
+}

+ 34 - 0
app/dao/local_life_material_dao.go

@@ -0,0 +1,34 @@
+package dao
+
+import (
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/app/entity"
+)
+
+type LocalLifeMaterialDao struct{}
+
+func (d LocalLifeMaterialDao) DeleteLocalMaterialByLocalId(localId string) error {
+	err := Db.Where("local_id = ?", localId).Delete(entity.LocalLifeMaterial{}).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d LocalLifeMaterialDao) CreateLocalMaterial(localMaterial entity.LocalLifeMaterial) error {
+	err := Db.Create(&localMaterial).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d LocalLifeMaterialDao) GetLocalMaterialInfo(localId string) ([]*entity.LocalLifeMaterial, error) {
+	var localMaterialInfos []*entity.LocalLifeMaterial
+	err := Db.Model(entity.LocalLifeMaterial{}).Where("local_id = ?", localId).Order("created_at asc").Find(&localMaterialInfos).Error
+	if err != nil {
+		logrus.Errorf("[GetLocalMaterialInfo] error query, err:%+v", err)
+		return nil, err
+	}
+	return localMaterialInfos, nil
+}

+ 34 - 0
app/dao/local_life_review_dao.go

@@ -0,0 +1,34 @@
+package dao
+
+import (
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/app/entity"
+)
+
+type LocalLifeReviewDao struct{}
+
+func (p LocalLifeReviewDao) Create(reviewInfo *entity.ReviewLocalLife) error {
+	err := Db.Create(&reviewInfo).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (p LocalLifeReviewDao) GetLocalReviewByStatus(status int64) ([]*entity.ReviewLocalLife, error) {
+	var reviewLocalLifes []*entity.ReviewLocalLife
+	err := Db.Model(entity.ReviewLocalLife{}).Where("status = ?", status).Find(&reviewLocalLifes).Error
+	if err != nil {
+		logrus.Errorf("[GetLocalReviewByStatus] error query mysql, err:%+v", err)
+		return nil, err
+	}
+	return reviewLocalLifes, nil
+}
+
+func (p LocalLifeReviewDao) UpdateLocalReview(reviewLocalLife *entity.ReviewLocalLife) error {
+	err := Db.Debug().Model(&entity.ReviewLocalLife{}).Where("id = ?", reviewLocalLife.ID).Updates(reviewLocalLife).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}

+ 3 - 3
app/dao/product_photo_dao.go

@@ -28,7 +28,7 @@ func (d ProductPhotoDAO) GetProductPhotoByProductID(productId int64) ([]entity.P
 // 获取所属商品的主图
 func (d ProductPhotoDAO) GetMainPhotoByProductID(productId int64) (string, error) {
 	var productPhoto entity.ProductPhoto
-	err := Db.Where("product_id = ? AND symbol = ?", productId, 1).First(&productPhoto).Error
+	err := Db.Where("product_id = ? AND symbol = ?", productId, 1).Find(&productPhoto).Error
 	if err != nil {
 		return "", err
 	}
@@ -48,7 +48,7 @@ func (d ProductPhotoDAO) GetProductPhotoByStoreID(storeId int64) ([]entity.Produ
 // 获取所属门店的主图
 func (d ProductPhotoDAO) GetMainPhotoByStoreID(storeId int64) (string, error) {
 	var productPhoto entity.ProductPhoto
-	err := Db.Where("store_id = ? AND symbol = ?", storeId, 1).First(&productPhoto).Error
+	err := Db.Where("store_id = ? AND symbol = ?", storeId, 1).Find(&productPhoto).Error
 	if err != nil {
 		return "", err
 	}
@@ -68,7 +68,7 @@ func (d ProductPhotoDAO) GetProductPhotoByTeamBuyingID(teamBuyingId int64) ([]en
 // 获取所属团购的主图
 func (d ProductPhotoDAO) GetMainPhotoByTeamBuyingID(teamBuyingId int64) (string, error) {
 	var productPhoto entity.ProductPhoto
-	err := Db.Where("team_buying_id = ? AND symbol = ?", teamBuyingId, 1).First(&productPhoto).Error
+	err := Db.Where("team_buying_id = ? AND symbol = ?", teamBuyingId, 1).Find(&productPhoto).Error
 	if err != nil {
 		return "", err
 	}

+ 34 - 0
app/dao/project_review_dao.go

@@ -0,0 +1,34 @@
+package dao
+
+import (
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/app/entity"
+)
+
+type ProjectReviewDao struct{}
+
+func (p ProjectReviewDao) Create(reviewInfo *entity.ReviewProject) error {
+	err := Db.Create(&reviewInfo).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (p ProjectReviewDao) GetProjectReviewByStatus(status int64) ([]*entity.ReviewProject, error) {
+	var reviewProjects []*entity.ReviewProject
+	err := Db.Model(entity.ReviewProject{}).Where("status = ?", status).Find(&reviewProjects).Error
+	if err != nil {
+		logrus.Errorf("[GetProjectReviewByStatus] error query mysql, err:%+v", err)
+		return nil, err
+	}
+	return reviewProjects, nil
+}
+
+func (p ProjectReviewDao) UpdateProjectReview(reviewProject *entity.ReviewProject) error {
+	err := Db.Debug().Model(&entity.ReviewProject{}).Where("id = ?", reviewProject.ID).Updates(reviewProject).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}

+ 34 - 0
app/dao/selection_review_dao.go

@@ -0,0 +1,34 @@
+package dao
+
+import (
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/app/entity"
+)
+
+type SelectionReviewDao struct{}
+
+func (p SelectionReviewDao) Create(reviewInfo *entity.ReviewSelection) error {
+	err := Db.Create(&reviewInfo).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (p SelectionReviewDao) GetSelectionReviewByStatus(status int64) ([]*entity.ReviewSelection, error) {
+	var reviewSelections []*entity.ReviewSelection
+	err := Db.Model(entity.ReviewSelection{}).Where("status = ?", status).Find(&reviewSelections).Error
+	if err != nil {
+		logrus.Errorf("[GetSelectionReviewByStatus] error query mysql, err:%+v", err)
+		return nil, err
+	}
+	return reviewSelections, nil
+}
+
+func (p SelectionReviewDao) UpdateSelectionReview(reviewSelection *entity.ReviewSelection) error {
+	err := Db.Debug().Model(&entity.ReviewSelection{}).Where("id = ?", reviewSelection.ID).Updates(reviewSelection).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}

+ 20 - 0
app/entity/local_life_brief.go

@@ -0,0 +1,20 @@
+// Code generated by sql2gorm. DO NOT EDIT.
+package entity
+
+import (
+	"time"
+)
+
+type LocalLifeBrief struct {
+	LocalBriefID int64     `gorm:"column:local_brief_id;primary_key;AUTO_INCREMENT"` // 手卡id
+	FileUrl      string    `gorm:"column:file_url"`                                  // 文件url
+	FileUid      string    `gorm:"column:file_uid"`                                  // 文件uid
+	LocalID      string    `gorm:"column:local_id"`                                  // 所属本地生活id
+	CreatedAt    time.Time `gorm:"column:created_at"`                                // 创建时间
+	FileName     string    `gorm:"column:file_name"`                                 // 文件名称
+	Type         int64     `gorm:"column:type;NOT NULL"`                             // 手卡类型(1图片 2文档)
+}
+
+func (m *LocalLifeBrief) TableName() string {
+	return "local_life_brief"
+}

+ 21 - 0
app/entity/local_life_material.go

@@ -0,0 +1,21 @@
+// Code generated by sql2gorm. DO NOT EDIT.
+package entity
+
+import (
+	"time"
+)
+
+// 本地生活补充素材
+type LocalLifeMaterial struct {
+	MaterialID int64     `gorm:"column:material_id;primary_key;AUTO_INCREMENT"` // 本地生活素材id
+	FileUrl    string    `gorm:"column:file_url"`                               // 文件url
+	FileUid    string    `gorm:"column:file_uid"`                               // 文件uid
+	LocalID    string    `gorm:"column:local_id"`                               // 所属本地生活id
+	CreatedAt  time.Time `gorm:"column:created_at"`                             // 创建时间
+	FileName   string    `gorm:"column:file_name"`                              // 文件名称
+	Type       int64     `gorm:"column:type;NOT NULL"`                          // 素材类型(1图片 2视频)
+}
+
+func (m *LocalLifeMaterial) TableName() string {
+	return "local_life_material"
+}

+ 1 - 0
app/entity/project_brief.go

@@ -12,6 +12,7 @@ type ProjectBrief struct {
 	FileUid        string    `gorm:"column:file_uid"`
 	ProjectID      string    `gorm:"column:project_id"` // 所属项目id
 	CreatedAt      time.Time `gorm:"column:created_at"` // 创建时间
+	Type           int64     `gorm:"column:type"`       // 手卡类型(1图片 2文档)
 }
 
 func (m *ProjectBrief) TableName() string {

+ 1 - 0
app/entity/project_material.go

@@ -9,6 +9,7 @@ type ProjectMaterial struct {
 	ProjectID  string    `gorm:"column:project_id"`                             // 所属项目id
 	CreatedAt  time.Time `gorm:"column:created_at"`                             // 创建时间
 	FileName   string    `gorm:"column:file_name"`                              // 文件名称
+	Type       int64     `gorm:"column:type"`                                   // 素材类型(1图片 2视频)
 }
 
 func (m *ProjectMaterial) TableName() string {

+ 25 - 0
app/entity/review_local_life.go

@@ -0,0 +1,25 @@
+// Code generated by sql2gorm. DO NOT EDIT.
+package entity
+
+type ReviewLocalLife struct {
+	ID                  int64  `gorm:"column:id;primary_key;AUTO_INCREMENT"`   // 自增id
+	LocalID             string `gorm:"column:local_id;NOT NULL"`               // 本地生活id
+	TaskName            string `gorm:"column:task_name;NOT NULL"`              // 任务标题
+	TaskDetail          string `gorm:"column:task_detail;NOT NULL"`            // 任务详情
+	StoreMainPhoto      string `gorm:"column:store_main_photo;NOT NULL"`       // 门店主图
+	StoreName           string `gorm:"column:store_name;NOT NULL"`             // 门店标题
+	StoreDetail         string `gorm:"column:store_detail;NOT NULL"`           // 门店详情
+	TeamBuyingMainPhoto string `gorm:"column:team_buying_main_photo;NOT NULL"` // 团购主图
+	TeamBuyingName      string `gorm:"column:team_buying_name;NOT NULL"`       // 团购标题
+	TeamBuyingDetail    string `gorm:"column:team_buying_detail;NOT NULL"`     // 团购详情
+	Images              string `gorm:"column:images"`                          // 图片集(,分隔)
+	Videos              string `gorm:"column:videos"`                          // 视频集(,分隔)
+	VideoJobIds         string `gorm:"column:video_job_ids"`
+	Documents           string `gorm:"column:documents"` // 文档集(,分隔)
+	DocumentJobIds      string `gorm:"column:document_job_ids"`
+	Status              int64  `gorm:"column:status;default:0;NOT NULL"` // 状态(0未提交 1待审核 2审核通过 3审核未通过 4失效)
+}
+
+func (m *ReviewLocalLife) TableName() string {
+	return "review_local_life"
+}

+ 22 - 0
app/entity/review_project.go

@@ -0,0 +1,22 @@
+// Code generated by sql2gorm. DO NOT EDIT.
+package entity
+
+type ReviewProject struct {
+	ID             int64  `gorm:"column:id;primary_key;AUTO_INCREMENT"` // 自增id
+	ProjectID      string `gorm:"column:project_id;NOT NULL"`           // 种草id
+	TaskName       string `gorm:"column:task_name;NOT NULL"`            // 任务标题
+	TaskDetail     string `gorm:"column:task_detail;NOT NULL"`          // 任务详情
+	ProductName    string `gorm:"column:product_name;NOT NULL"`         // 商品标题
+	ProductDetail  string `gorm:"column:product_detail;NOT NULL"`       // 商品详情(卖点总结)
+	MainPhoto      string `gorm:"column:main_photo;NOT NULL"`           // 商品主图
+	Images         string `gorm:"column:images"`                        // 图片集(,分隔)
+	Videos         string `gorm:"column:videos"`                        // 视频集(,分隔)
+	VideoJobIds    string `gorm:"column:video_job_ids"`
+	Documents      string `gorm:"column:documents"` // 文档集(,分隔)
+	DocumentJobIds string `gorm:"column:document_job_ids"`
+	Status         int64  `gorm:"column:status;default:0;NOT NULL"` // 状态(0未提交 1待审核 2审核通过 3审核未通过 4失效)
+}
+
+func (m *ReviewProject) TableName() string {
+	return "review_project"
+}

+ 21 - 0
app/entity/review_selection.go

@@ -0,0 +1,21 @@
+// Code generated by sql2gorm. DO NOT EDIT.
+package entity
+
+type ReviewSelection struct {
+	ID             int64  `gorm:"column:id;primary_key;AUTO_INCREMENT"` // 自增id
+	SelectionID    string `gorm:"column:selection_id;NOT NULL"`         // 带货id
+	TaskName       string `gorm:"column:task_name;NOT NULL"`            // 任务标题
+	ProductName    string `gorm:"column:product_name;NOT NULL"`         // 商品标题
+	ProductDetail  string `gorm:"column:product_detail;NOT NULL"`       // 商品详情(卖点总结)
+	MainPhoto      string `gorm:"column:main_photo;NOT NULL"`           // 商品主图
+	Images         string `gorm:"column:images"`                        // 图片集(,分隔)
+	Videos         string `gorm:"column:videos"`                        // 视频集(,分隔)
+	VideoJobIds    string `gorm:"column:video_job_ids"`
+	Documents      string `gorm:"column:documents"` // 文档集(,分隔)
+	DocumentJobIds string `gorm:"column:document_job_ids"`
+	Status         int64  `gorm:"column:status;default:0;NOT NULL"` // 状态(0未提交 1待审核 2审核通过 3审核未通过 4失效)
+}
+
+func (m *ReviewSelection) TableName() string {
+	return "review_selection"
+}

+ 1 - 0
app/entity/sec_brief.go

@@ -9,6 +9,7 @@ type SecBrief struct {
 	SelectionID    string    `gorm:"column:selection_id"`                                // 所属选品id
 	CreatedAt      time.Time `gorm:"column:created_at"`                                  // 创建时间
 	FileName       string    `gorm:"column:file_name"`                                   // 文件名称
+	Type           int64     `gorm:"column:type"`                                        // 手卡类型(1图片 2文档)
 }
 
 func (m *SecBrief) TableName() string {

+ 1 - 0
app/entity/sec_material.go

@@ -9,6 +9,7 @@ type SecMaterial struct {
 	SelectionID string    `gorm:"column:selection_id"`                           // 所属项目id
 	CreatedAt   time.Time `gorm:"column:created_at"`                             // 创建时间
 	FileName    string    `gorm:"column:file_name"`                              // 文件名称
+	Type        int64     `gorm:"column:type"`                                   // 素材类型(1图片 2视频)
 }
 
 func (m *SecMaterial) TableName() string {

+ 1 - 1
app/schedule/auto_task1.go → app/schedule/auto_task_invalid.go

@@ -10,7 +10,7 @@ import (
 	"youngee_b_api/app/entity"
 )
 
-func AutoTask1() error {
+func AutoTaskInvalid() error {
 	// 新建一个定时任务对象
 	crontab := cron.New(cron.WithSeconds()) // 精确到秒
 	spec := "0 */5 * * * ?"                 //cron表达式,每5分钟一次

+ 6 - 4
app/schedule/auto_task2.go → app/schedule/auto_task_recharge.go

@@ -9,7 +9,7 @@ import (
 	"youngee_b_api/app/service"
 )
 
-func AutoTask2() error {
+func AutoTaskRecharge() error {
 	// 新建一个定时任务对象
 	crontab := cron.New(cron.WithSeconds()) // 精确到秒
 	spec := "0 */2 * * * ?"                 //cron表达式
@@ -47,9 +47,11 @@ func AutoCheckWXRechargeTask() {
 			noPayIds = append(noPayIds, rechargeRecord.ID)
 		}
 	}
-	err2 := dao.RechargeRecordDao{}.UpdateRechargeFailedList(noPayIds)
-	if err2 != nil {
-		log.Println("UpdateRechargeFailedList", err2)
+	if len(noPayIds) > 0 {
+		err2 := dao.RechargeRecordDao{}.UpdateRechargeFailedList(noPayIds)
+		if err2 != nil {
+			log.Println("UpdateRechargeFailedList", err2)
+		}
 	}
 	log.Println("AutoCheckWXRechargeTask running End, Time :", time.Now())
 }

+ 670 - 0
app/schedule/auto_task_review.go

@@ -0,0 +1,670 @@
+package schedule
+
+import (
+	"github.com/robfig/cron/v3"
+	"log"
+	"strings"
+	"time"
+	"youngee_b_api/app/dao"
+	"youngee_b_api/app/entity"
+	"youngee_b_api/app/service/review_service"
+)
+
+func AutoTaskReview() error {
+	// 新建一个定时任务对象
+	crontab := cron.New(cron.WithSeconds()) // 精确到秒
+	spec := "0 */5 * * * ?"                 //cron表达式,每5分钟一次
+	// "0 0 12 * * ?" 每天中午12点执行
+
+	// 添加定时任务
+	// 定时任务1  品牌种草API自动审核
+	_, err1 := crontab.AddFunc(spec, AutoProjectReviewTask)
+	if err1 != nil {
+		return err1
+	}
+	// 定时任务2  电商带货API自动审核
+	_, err2 := crontab.AddFunc(spec, AutoSelectionReviewTask)
+	if err2 != nil {
+		return err2
+	}
+	// 定时任务3  本地生活API自动审核
+	_, err3 := crontab.AddFunc(spec, AutoLocalLifeReviewTask)
+	if err3 != nil {
+		return err3
+	}
+
+	// 启动定时器
+	crontab.Start()
+	// 定时任务是另起协程执行的,这里使用 select 简单阻塞.需要根据实际情况进行控制
+	//select {} //阻塞主线程停止
+	return nil
+}
+
+// 定时任务1  品牌种草API自动审核
+func AutoProjectReviewTask() {
+	log.Println("AutoProjectReviewTask running Start, Time :", time.Now())
+
+	var reviewProjects []*entity.ReviewProject
+	reviewProjects, _ = dao.ProjectReviewDao{}.GetProjectReviewByStatus(1)
+	reviewService := review_service.GetConfig()
+	for _, reviewProject := range reviewProjects {
+
+		if reviewProject.TaskName != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckContent(reviewProject.TaskName)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				_ = dao.ProjectReviewDao{}.UpdateProjectReview(&entity.ReviewProject{ID: reviewProject.ID, Status: 3})
+				continue
+			}
+		}
+
+		if reviewProject.TaskDetail != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckContent(reviewProject.TaskDetail)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				_ = dao.ProjectReviewDao{}.UpdateProjectReview(&entity.ReviewProject{ID: reviewProject.ID, Status: 3})
+				continue
+			}
+		}
+
+		if reviewProject.ProductName != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckContent(reviewProject.ProductName)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				_ = dao.ProjectReviewDao{}.UpdateProjectReview(&entity.ReviewProject{ID: reviewProject.ID, Status: 3})
+				continue
+			}
+		}
+
+		if reviewProject.ProductDetail != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckContent(reviewProject.ProductDetail)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				dao.ProjectReviewDao{}.UpdateProjectReview(&entity.ReviewProject{ID: reviewProject.ID, Status: 3})
+				continue
+			}
+		}
+
+		if reviewProject.MainPhoto != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckImage(reviewProject.MainPhoto)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				_ = dao.ProjectReviewDao{}.UpdateProjectReview(&entity.ReviewProject{ID: reviewProject.ID, Status: 3})
+				continue
+			}
+		}
+
+		images := strings.Split(reviewProject.Images, ",")
+		imageFlag := false
+		for _, image := range images {
+			if image != "" {
+				var suggestion *string
+				var reviewErr error
+				i := 3
+				for {
+					suggestion, reviewErr = reviewService.CheckImage(image)
+					if reviewErr == nil || i == 0 {
+						break
+					}
+					i -= 1
+				}
+				if reviewErr != nil || "pass" != *suggestion {
+					imageFlag = true
+					break
+				}
+			}
+		}
+		if imageFlag {
+			// 交给人工审核
+			_ = dao.ProjectReviewDao{}.UpdateProjectReview(&entity.ReviewProject{ID: reviewProject.ID, Status: 3})
+			continue
+		}
+
+		documentJobIds := strings.Split(reviewProject.DocumentJobIds, ",")
+		documentFlag := 0 // 0通过 1未通过 2正在运行
+		for _, documentJobId := range documentJobIds {
+			if documentJobId != "" {
+				var status *string
+				var suggestion *string
+				var reviewErr error
+				i := 3
+				for {
+					status, suggestion, reviewErr = reviewService.CheckDocumentInfo(documentJobId)
+					if reviewErr == nil || i == 0 {
+						break
+					}
+					i -= 1
+				}
+				if reviewErr == nil && "running" == *status {
+					documentFlag = 2
+					break
+				}
+				if reviewErr != nil || "failed" == *status || "pass" != *suggestion {
+					documentFlag = 1
+					break
+				}
+			}
+		}
+		if documentFlag == 2 {
+			continue
+		} else if documentFlag == 1 {
+			// 交给人工审核
+			_ = dao.ProjectReviewDao{}.UpdateProjectReview(&entity.ReviewProject{ID: reviewProject.ID, Status: 3})
+			continue
+		}
+
+		videoJobIds := strings.Split(reviewProject.VideoJobIds, ",")
+		videoFlag := 0 // 0通过 1未通过 2正在运行
+		for _, videoJobId := range videoJobIds {
+			if videoJobId != "" {
+				var status *string
+				var suggestion *string
+				var reviewErr error
+				i := 3
+				for {
+					status, suggestion, reviewErr = reviewService.CheckVideoInfo(videoJobId)
+					if reviewErr == nil || i == 0 {
+						break
+					}
+					i -= 1
+				}
+				if reviewErr == nil && "running" == *status {
+					videoFlag = 2
+					break
+				}
+				if reviewErr != nil || "failed" == *status || "pass" != *suggestion {
+					videoFlag = 1
+					break
+				}
+			}
+		}
+		if videoFlag == 2 {
+			continue
+		} else if videoFlag == 1 {
+			// 交给人工审核
+			_ = dao.ProjectReviewDao{}.UpdateProjectReview(&entity.ReviewProject{ID: reviewProject.ID, Status: 3})
+			continue
+		}
+
+		// 审核通过
+		_ = dao.ProjectReviewDao{}.UpdateProjectReview(&entity.ReviewProject{ID: reviewProject.ID, Status: 2})
+		_ = dao.ProjectDAO{}.UpdateProject(entity.Project{ProjectId: reviewProject.ProjectID, ProjectStatus: 4})
+	}
+
+	log.Println("AutoProjectReviewTask running End, Time :", time.Now())
+}
+
+// 定时任务2  电商带货API自动审核
+func AutoSelectionReviewTask() {
+	log.Println("AutoSelectionInvalidTask running Start, Time :", time.Now())
+
+	var reviewSelections []*entity.ReviewSelection
+	reviewSelections, _ = dao.SelectionReviewDao{}.GetSelectionReviewByStatus(1)
+	reviewService := review_service.GetConfig()
+	for _, reviewSelection := range reviewSelections {
+
+		if reviewSelection.TaskName != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckContent(reviewSelection.TaskName)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				_ = dao.SelectionReviewDao{}.UpdateSelectionReview(&entity.ReviewSelection{ID: reviewSelection.ID, Status: 3})
+				continue
+			}
+		}
+
+		if reviewSelection.ProductName != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckContent(reviewSelection.ProductName)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				_ = dao.SelectionReviewDao{}.UpdateSelectionReview(&entity.ReviewSelection{ID: reviewSelection.ID, Status: 3})
+				continue
+			}
+		}
+
+		if reviewSelection.ProductDetail != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckContent(reviewSelection.ProductDetail)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				dao.SelectionReviewDao{}.UpdateSelectionReview(&entity.ReviewSelection{ID: reviewSelection.ID, Status: 3})
+				continue
+			}
+		}
+
+		if reviewSelection.MainPhoto != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckImage(reviewSelection.MainPhoto)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				_ = dao.SelectionReviewDao{}.UpdateSelectionReview(&entity.ReviewSelection{ID: reviewSelection.ID, Status: 3})
+				continue
+			}
+		}
+
+		images := strings.Split(reviewSelection.Images, ",")
+		imageFlag := false
+		for _, image := range images {
+			if image != "" {
+				var suggestion *string
+				var reviewErr error
+				i := 3
+				for {
+					suggestion, reviewErr = reviewService.CheckImage(image)
+					if reviewErr == nil || i == 0 {
+						break
+					}
+					i -= 1
+				}
+				if reviewErr != nil || "pass" != *suggestion {
+					imageFlag = true
+					break
+				}
+			}
+		}
+		if imageFlag {
+			// 交给人工审核
+			_ = dao.SelectionReviewDao{}.UpdateSelectionReview(&entity.ReviewSelection{ID: reviewSelection.ID, Status: 3})
+			continue
+		}
+
+		documentJobIds := strings.Split(reviewSelection.DocumentJobIds, ",")
+		documentFlag := 0 // 0通过 1未通过 2正在运行
+		for _, documentJobId := range documentJobIds {
+			if documentJobId != "" {
+				var status *string
+				var suggestion *string
+				var reviewErr error
+				i := 3
+				for {
+					status, suggestion, reviewErr = reviewService.CheckDocumentInfo(documentJobId)
+					if reviewErr == nil || i == 0 {
+						break
+					}
+					i -= 1
+				}
+				if reviewErr == nil && "running" == *status {
+					documentFlag = 2
+					break
+				}
+				if reviewErr != nil || "failed" == *status || "pass" != *suggestion {
+					documentFlag = 1
+					break
+				}
+			}
+		}
+		if documentFlag == 2 {
+			continue
+		} else if documentFlag == 1 {
+			// 交给人工审核
+			_ = dao.SelectionReviewDao{}.UpdateSelectionReview(&entity.ReviewSelection{ID: reviewSelection.ID, Status: 3})
+			continue
+		}
+
+		videoJobIds := strings.Split(reviewSelection.VideoJobIds, ",")
+		videoFlag := 0 // 0通过 1未通过 2正在运行
+		for _, videoJobId := range videoJobIds {
+			if videoJobId != "" {
+				var status *string
+				var suggestion *string
+				var reviewErr error
+				i := 3
+				for {
+					status, suggestion, reviewErr = reviewService.CheckVideoInfo(videoJobId)
+					if reviewErr == nil || i == 0 {
+						break
+					}
+					i -= 1
+				}
+				if reviewErr == nil && "running" == *status {
+					videoFlag = 2
+					break
+				}
+				if reviewErr != nil || "failed" == *status || "pass" != *suggestion {
+					videoFlag = 1
+					break
+				}
+			}
+		}
+		if videoFlag == 2 {
+			continue
+		} else if videoFlag == 1 {
+			// 交给人工审核
+			_ = dao.SelectionReviewDao{}.UpdateSelectionReview(&entity.ReviewSelection{ID: reviewSelection.ID, Status: 3})
+			continue
+		}
+
+		// 审核通过
+		_ = dao.SelectionReviewDao{}.UpdateSelectionReview(&entity.ReviewSelection{ID: reviewSelection.ID, Status: 2})
+		_ = dao.SelectionInfoDAO{}.UpdateSelectionInfo(entity.SelectionInfo{SelectionID: reviewSelection.SelectionID, SelectionStatus: 4})
+	}
+
+	log.Println("AutoSelectionInvalidTask running End, Time :", time.Now())
+}
+
+// 定时任务3  本地生活API自动审核
+func AutoLocalLifeReviewTask() {
+	log.Println("AutoLocalLifeInvalidTask running Start, Time :", time.Now())
+
+	var reviewLocalLifes []*entity.ReviewLocalLife
+	reviewLocalLifes, _ = dao.LocalLifeReviewDao{}.GetLocalReviewByStatus(1)
+	reviewService := review_service.GetConfig()
+	for _, reviewLocalLife := range reviewLocalLifes {
+
+		if reviewLocalLife.TaskName != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckContent(reviewLocalLife.TaskName)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				_ = dao.LocalLifeReviewDao{}.UpdateLocalReview(&entity.ReviewLocalLife{ID: reviewLocalLife.ID, Status: 3})
+				continue
+			}
+		}
+
+		if reviewLocalLife.TaskDetail != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckContent(reviewLocalLife.TaskDetail)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				_ = dao.LocalLifeReviewDao{}.UpdateLocalReview(&entity.ReviewLocalLife{ID: reviewLocalLife.ID, Status: 3})
+				continue
+			}
+		}
+
+		if reviewLocalLife.StoreName != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckContent(reviewLocalLife.StoreName)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				_ = dao.LocalLifeReviewDao{}.UpdateLocalReview(&entity.ReviewLocalLife{ID: reviewLocalLife.ID, Status: 3})
+				continue
+			}
+		}
+		if reviewLocalLife.StoreDetail != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckContent(reviewLocalLife.StoreDetail)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				dao.LocalLifeReviewDao{}.UpdateLocalReview(&entity.ReviewLocalLife{ID: reviewLocalLife.ID, Status: 3})
+				continue
+			}
+		}
+		if reviewLocalLife.StoreMainPhoto != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckImage(reviewLocalLife.StoreMainPhoto)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				_ = dao.LocalLifeReviewDao{}.UpdateLocalReview(&entity.ReviewLocalLife{ID: reviewLocalLife.ID, Status: 3})
+				continue
+			}
+		}
+
+		if reviewLocalLife.TeamBuyingName != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckContent(reviewLocalLife.TeamBuyingName)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				_ = dao.LocalLifeReviewDao{}.UpdateLocalReview(&entity.ReviewLocalLife{ID: reviewLocalLife.ID, Status: 3})
+				continue
+			}
+		}
+		if reviewLocalLife.TeamBuyingDetail != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckContent(reviewLocalLife.TeamBuyingDetail)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				dao.LocalLifeReviewDao{}.UpdateLocalReview(&entity.ReviewLocalLife{ID: reviewLocalLife.ID, Status: 3})
+				continue
+			}
+		}
+		if reviewLocalLife.TeamBuyingMainPhoto != "" {
+			var suggestion *string
+			var reviewErr error
+			i := 3
+			for {
+				suggestion, reviewErr = reviewService.CheckImage(reviewLocalLife.TeamBuyingMainPhoto)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil || "pass" != *suggestion {
+				// 交给人工审核
+				_ = dao.LocalLifeReviewDao{}.UpdateLocalReview(&entity.ReviewLocalLife{ID: reviewLocalLife.ID, Status: 3})
+				continue
+			}
+		}
+
+		images := strings.Split(reviewLocalLife.Images, ",")
+		imageFlag := false
+		for _, image := range images {
+			if image != "" {
+				var suggestion *string
+				var reviewErr error
+				i := 3
+				for {
+					suggestion, reviewErr = reviewService.CheckImage(image)
+					if reviewErr == nil || i == 0 {
+						break
+					}
+					i -= 1
+				}
+				if reviewErr != nil || "pass" != *suggestion {
+					imageFlag = true
+					break
+				}
+			}
+		}
+		if imageFlag {
+			// 交给人工审核
+			_ = dao.LocalLifeReviewDao{}.UpdateLocalReview(&entity.ReviewLocalLife{ID: reviewLocalLife.ID, Status: 3})
+			continue
+		}
+
+		documentJobIds := strings.Split(reviewLocalLife.DocumentJobIds, ",")
+		documentFlag := 0 // 0通过 1未通过 2正在运行
+		for _, documentJobId := range documentJobIds {
+			if documentJobId != "" {
+				var status *string
+				var suggestion *string
+				var reviewErr error
+				i := 3
+				for {
+					status, suggestion, reviewErr = reviewService.CheckDocumentInfo(documentJobId)
+					if reviewErr == nil || i == 0 {
+						break
+					}
+					i -= 1
+				}
+				if reviewErr == nil && "running" == *status {
+					documentFlag = 2
+					break
+				}
+				if reviewErr != nil || "failed" == *status || "pass" != *suggestion {
+					documentFlag = 1
+					break
+				}
+			}
+		}
+		if documentFlag == 2 {
+			continue
+		} else if documentFlag == 1 {
+			// 交给人工审核
+			_ = dao.LocalLifeReviewDao{}.UpdateLocalReview(&entity.ReviewLocalLife{ID: reviewLocalLife.ID, Status: 3})
+			continue
+		}
+
+		videoJobIds := strings.Split(reviewLocalLife.VideoJobIds, ",")
+		videoFlag := 0 // 0通过 1未通过 2正在运行
+		for _, videoJobId := range videoJobIds {
+			if videoJobId != "" {
+				var status *string
+				var suggestion *string
+				var reviewErr error
+				i := 3
+				for {
+					status, suggestion, reviewErr = reviewService.CheckVideoInfo(videoJobId)
+					if reviewErr == nil || i == 0 {
+						break
+					}
+					i -= 1
+				}
+				if reviewErr == nil && "running" == *status {
+					videoFlag = 2
+					break
+				}
+				if reviewErr != nil || "failed" == *status || "pass" != *suggestion {
+					videoFlag = 1
+					break
+				}
+			}
+		}
+		if videoFlag == 2 {
+			continue
+		} else if videoFlag == 1 {
+			// 交给人工审核
+			_ = dao.LocalLifeReviewDao{}.UpdateLocalReview(&entity.ReviewLocalLife{ID: reviewLocalLife.ID, Status: 3})
+			continue
+		}
+
+		// 审核通过
+		_ = dao.LocalLifeReviewDao{}.UpdateLocalReview(&entity.ReviewLocalLife{ID: reviewLocalLife.ID, Status: 2})
+		_ = dao.LocalLifeDao{}.UpdateLocal(entity.LocalLifeInfo{LocalID: reviewLocalLife.LocalID, TaskStatus: 4})
+	}
+
+	log.Println("AutoLocalLifeInvalidTask running End, Time :", time.Now())
+}

+ 183 - 12
app/service/local_life_service.go

@@ -4,9 +4,11 @@ import (
 	"errors"
 	"github.com/sirupsen/logrus"
 	"reflect"
+	"strings"
 	"time"
 	"youngee_b_api/app/dao"
 	"youngee_b_api/app/entity"
+	"youngee_b_api/app/service/review_service"
 	"youngee_b_api/app/util"
 	"youngee_b_api/app/vo"
 )
@@ -175,20 +177,21 @@ func (s LocalLifeService) UpdateLocal(localUpdateParam *vo.LocalUpdateParam) (*s
 	// 4. 更新选品brief和示例(本地生活任务补充信息)
 	if localUpdateParam.LocalBrief != nil {
 		// 删除已有brief
-		err = dao.ProjectBriefDao{}.DeleteSecBriefBySelectionId(localLife.LocalID)
+		err = dao.LocalLifeBriefDao{}.DeleteLocalBriefByLocalId(localLife.LocalID)
 		if err != nil {
 			return nil, err
 		}
 		// 插入新的brief
 		for _, v := range localUpdateParam.LocalBrief {
-			brief := entity.ProjectBrief{
-				ProjectID: localLife.LocalID,
+			brief := entity.LocalLifeBrief{
+				LocalID:   localLife.LocalID,
 				FileUid:   v.FileUid,
 				FileName:  v.Name,
 				FileUrl:   v.FileUrl,
 				CreatedAt: time.Now(),
+				Type:      v.Type,
 			}
-			err = dao.ProjectBriefDao{}.CreateProjectBrief(brief)
+			err = dao.LocalLifeBriefDao{}.CreateLocalBrief(brief)
 			if err != nil {
 				return nil, err
 			}
@@ -197,20 +200,21 @@ func (s LocalLifeService) UpdateLocal(localUpdateParam *vo.LocalUpdateParam) (*s
 
 	if localUpdateParam.LocalMaterial != nil {
 		// 删除已有示例
-		err = dao.ProjectMaterialDao{}.DeleteProjectMaterialByProjectId(localLife.LocalID)
+		err = dao.LocalLifeMaterialDao{}.DeleteLocalMaterialByLocalId(localLife.LocalID)
 		if err != nil {
 			return nil, err
 		}
 		// 插入新的示例
 		for _, v := range localUpdateParam.LocalMaterial {
-			projectMaterial := entity.ProjectMaterial{
-				ProjectID: localLife.LocalID,
+			material := entity.LocalLifeMaterial{
+				LocalID:   localLife.LocalID,
 				FileUid:   v.FileUid,
 				FileName:  v.Name,
 				FileUrl:   v.FileUrl,
 				CreatedAt: time.Now(),
+				Type:      v.Type,
 			}
-			err = dao.ProjectMaterialDao{}.CreateProjectMaterial(projectMaterial)
+			err = dao.LocalLifeMaterialDao{}.CreateLocalMaterial(material)
 			if err != nil {
 				return nil, err
 			}
@@ -339,6 +343,7 @@ func (s LocalLifeService) UpdateLocalTarget(localUpdateParam *vo.LocalUpdatePara
 				FileName:  v.Name,
 				FileUrl:   v.FileUrl,
 				CreatedAt: time.Now(),
+				Type:      v.Type,
 			}
 			err = dao.ProjectBriefDao{}.CreateProjectBrief(brief)
 			if err != nil {
@@ -361,6 +366,7 @@ func (s LocalLifeService) UpdateLocalTarget(localUpdateParam *vo.LocalUpdatePara
 				FileName:  v.Name,
 				FileUrl:   v.FileUrl,
 				CreatedAt: time.Now(),
+				Type:      v.Type,
 			}
 			err = dao.ProjectMaterialDao{}.CreateProjectMaterial(projectMaterial)
 			if err != nil {
@@ -493,15 +499,180 @@ func (s LocalLifeService) GetLocalLifeDetail(localId string) (*vo.ReLocalDetail,
 // 本地生活提交审核
 func (s LocalLifeService) LocalLifeToReview(localUpdateParam *vo.LocalUpdateParam) (*string, error) {
 	localId := localUpdateParam.LocalID
+
+	local, err := dao.LocalLifeDao{}.GetLocalById(localId)
+	if err != nil {
+		logrus.Errorf("[projectInfoDB service] call GetProject error,err:%+v", err)
+		return nil, err
+	}
+
+	localName := local.LocalName    // 任务标题
+	localDetail := local.TaskDetail // 任务详情
+	store, err := dao.StoreDao{}.GetStoreByID(local.StoreID)
+	if err != nil {
+		return nil, err
+	}
+	storeName := store.StoreName     // 门店名称
+	storeDetail := store.StoreDetail // 门店特点
+	storeMainPhoto, err1 := dao.ProductPhotoDAO{}.GetMainPhotoByStoreID(store.StoreID)
+	if err1 != nil {
+		return nil, err1
+	}
+	teamBuying, err2 := dao.TeamBuyingDao{}.GetTeamBuyingByID(local.TeamBuyingId)
+	if err2 != nil {
+		return nil, err2
+	}
+	teamBuyingName := teamBuying.TeamBuyingName     // 团购标题
+	teamBuyingDetail := teamBuying.TeamBuyingDetail // 团购详情
+	teamBuyingMainPhoto, err3 := dao.ProductPhotoDAO{}.GetMainPhotoByTeamBuyingID(teamBuying.TeamBuyingID)
+	if err3 != nil {
+		return nil, err3
+	}
+	var images []string
+	var videos []string
+	var videoJobIds []string
+	var documents []string
+	var documentJobIds []string
+	reviewService := review_service.GetConfig()
+
+	storePhotos, err4 := dao.ProductPhotoDAO{}.GetProductPhotoByStoreID(local.StoreID)
+	if err4 != nil {
+		return nil, err4
+	}
+	for _, storePhoto := range storePhotos {
+		if storePhoto.Symbol == 2 || storePhoto.Symbol == 4 {
+			images = append(images, storePhoto.PhotoUrl)
+		} else if storePhoto.Symbol == 3 || storePhoto.Symbol == 5 {
+			var videoJobId *string
+			var reviewErr error
+			i := 10
+			for {
+				videoJobId, reviewErr = reviewService.CheckVideo(storePhoto.PhotoUrl)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil {
+				return nil, reviewErr
+			}
+			videos = append(videos, storePhoto.PhotoUrl)
+			videoJobIds = append(videoJobIds, *videoJobId)
+		}
+	}
+	teamBuyingPhotos, err5 := dao.ProductPhotoDAO{}.GetProductPhotoByTeamBuyingID(local.TeamBuyingId)
+	if err5 != nil {
+		return nil, err5
+	}
+	for _, teamBuyingPhoto := range teamBuyingPhotos {
+		if teamBuyingPhoto.Symbol == 2 || teamBuyingPhoto.Symbol == 4 {
+			images = append(images, teamBuyingPhoto.PhotoUrl)
+		} else if teamBuyingPhoto.Symbol == 3 || teamBuyingPhoto.Symbol == 5 {
+			var videoJobId *string
+			var reviewErr error
+			i := 10
+			for {
+				videoJobId, reviewErr = reviewService.CheckVideo(teamBuyingPhoto.PhotoUrl)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil {
+				return nil, reviewErr
+			}
+			videos = append(videos, teamBuyingPhoto.PhotoUrl)
+			videoJobIds = append(videoJobIds, *videoJobId)
+		}
+	}
+
+	localBriefInfos, err6 := dao.LocalLifeBriefDao{}.GetLocalBriefInfo(localId)
+	if err6 != nil {
+		return nil, err6
+	}
+	for _, localBriefInfo := range localBriefInfos {
+		if localBriefInfo.Type == 1 {
+			images = append(images, localBriefInfo.FileUrl)
+		} else if localBriefInfo.Type == 2 {
+			var documentJobId *string
+			var reviewErr error
+			i := 10
+			fileType := "pdf"
+			parts := strings.Split(localBriefInfo.FileName, ".")
+			if len(parts) > 1 {
+				fileType = parts[len(parts)-1]
+			}
+			for {
+				documentJobId, reviewErr = reviewService.CheckDocument(localBriefInfo.FileUrl, fileType)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil {
+				return nil, reviewErr
+			}
+			documents = append(documents, localBriefInfo.FileUrl)
+			documentJobIds = append(documentJobIds, *documentJobId)
+		}
+	}
+	localMaterials, err7 := dao.LocalLifeMaterialDao{}.GetLocalMaterialInfo(localId)
+	if err7 != nil {
+		return nil, err7
+	}
+	for _, localMaterial := range localMaterials {
+		if localMaterial.Type == 1 {
+			images = append(images, localMaterial.FileUrl)
+		} else if localMaterial.Type == 2 {
+			var videoJobId *string
+			var reviewErr error
+			i := 10
+			for {
+				videoJobId, reviewErr = reviewService.CheckVideo(localMaterial.FileUrl)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil {
+				return nil, reviewErr
+			}
+			videos = append(videos, localMaterial.FileUrl)
+			videoJobIds = append(videoJobIds, *videoJobId)
+		}
+	}
+
+	newReviewLocal := &entity.ReviewLocalLife{
+		LocalID:             localId,
+		TaskName:            localName,
+		TaskDetail:          localDetail,
+		StoreMainPhoto:      storeMainPhoto,
+		StoreName:           storeName,
+		StoreDetail:         storeDetail,
+		TeamBuyingMainPhoto: teamBuyingMainPhoto,
+		TeamBuyingName:      teamBuyingName,
+		TeamBuyingDetail:    teamBuyingDetail,
+		Images:              strings.Join(images, ","),
+		Videos:              strings.Join(videos, ","),
+		Documents:           strings.Join(documents, ","),
+		VideoJobIds:         strings.Join(videoJobIds, ","),
+		DocumentJobIds:      strings.Join(documentJobIds, ","),
+		Status:              1,
+	}
+	err8 := dao.LocalLifeReviewDao{}.Create(newReviewLocal)
+	if err8 != nil {
+		return nil, err8
+	}
+
 	t := time.Now()
 	updateLocal := entity.LocalLifeInfo{
 		LocalID:    localId,
 		TaskStatus: 2,
 		UpdatedAt:  t,
 	}
-	err := dao.LocalLifeDao{}.UpdateLocal(updateLocal)
-	if err != nil {
-		return nil, err
+	err9 := dao.LocalLifeDao{}.UpdateLocal(updateLocal)
+	if err9 != nil {
+		return nil, err9
 	}
 	return &localId, nil
 }
@@ -559,7 +730,7 @@ func (s LocalLifeService) GetLocalLifeTaskList(param *vo.LocalSearchParam) (vo.R
 func (s LocalLifeService) DeleteLocalLife(localId string) (*string, error) {
 	res, err := dao.LocalLifeDao{}.DeleteLocalLife(localId)
 	if err != nil {
-		logrus.Errorf("[localLifeDB service] call DeleteLocalLife error,err:%+v", err)
+		logrus.Errorf("[DeleteLocalLife service] call DeleteLocalLife error,err:%+v", err)
 		return res, err
 	}
 	return res, nil

+ 135 - 2
app/service/project_service.go

@@ -5,9 +5,11 @@ import (
 	"errors"
 	"github.com/sirupsen/logrus"
 	"reflect"
+	"strings"
 	"time"
 	"youngee_b_api/app/dao"
 	"youngee_b_api/app/entity"
+	"youngee_b_api/app/service/review_service"
 	"youngee_b_api/app/util"
 	"youngee_b_api/app/vo"
 )
@@ -189,6 +191,7 @@ func (s ProjectService) UpdateProject(projectUpdateParam *vo.ProjectUpdateParam)
 				FileName:  v.Name,
 				FileUrl:   v.FileUrl,
 				CreatedAt: time.Now(),
+				Type:      v.Type,
 			}
 			err = dao.ProjectBriefDao{}.CreateProjectBrief(brief)
 			if err != nil {
@@ -211,6 +214,7 @@ func (s ProjectService) UpdateProject(projectUpdateParam *vo.ProjectUpdateParam)
 				FileName:  v.Name,
 				FileUrl:   v.FileUrl,
 				CreatedAt: time.Now(),
+				Type:      v.Type,
 			}
 			err = dao.ProjectMaterialDao{}.CreateProjectMaterial(projectMaterial)
 			if err != nil {
@@ -340,6 +344,7 @@ func (s ProjectService) UpdateProjectTarget(projectUpdateParam *vo.ProjectUpdate
 				FileName:  v.Name,
 				FileUrl:   v.FileUrl,
 				CreatedAt: time.Now(),
+				Type:      v.Type,
 			}
 			err = dao.ProjectBriefDao{}.CreateProjectBrief(brief)
 			if err != nil {
@@ -361,6 +366,7 @@ func (s ProjectService) UpdateProjectTarget(projectUpdateParam *vo.ProjectUpdate
 				FileName:  v.Name,
 				FileUrl:   v.FileUrl,
 				CreatedAt: time.Now(),
+				Type:      v.Type,
 			}
 			err = dao.ProjectMaterialDao{}.CreateProjectMaterial(projectMaterial)
 			if err != nil {
@@ -472,14 +478,141 @@ func (s ProjectService) GetProjectDetail(projectId string) (*vo.ReProjectDetail,
 // 种草提交审核
 func (s ProjectService) ProjectToReview(projectUpdateParam *vo.ProjectUpdateParam) (*string, error) {
 	projectId := projectUpdateParam.ProjectID
+
+	project, err := dao.ProjectDAO{}.GetProjectById(projectId)
+	if err != nil {
+		logrus.Errorf("[projectInfoDB service] call GetProject error,err:%+v", err)
+		return nil, err
+	}
+
+	projectName := project.ProjectName     // 任务标题
+	projectDetail := project.ProjectDetail // 任务详情
+	product, err := dao.ProductDAO{}.GetProductByID(project.ProductID)
+	if err != nil {
+		return nil, err
+	}
+	productName := product.ProductName     // 商品标题
+	productDetail := product.ProductDetail // 卖点总结
+	mainPhoto, err1 := dao.ProductPhotoDAO{}.GetMainPhotoByProductID(project.ProductID)
+	if err1 != nil {
+		return nil, err1
+	}
+	var images []string
+	var videos []string
+	var videoJobIds []string
+	var documents []string
+	var documentJobIds []string
+	reviewService := review_service.GetConfig()
+
+	productPhotos, err2 := dao.ProductPhotoDAO{}.GetProductPhotoByProductID(project.ProductID)
+	if err2 != nil {
+		return nil, err2
+	}
+	for _, productPhoto := range productPhotos {
+		if productPhoto.Symbol == 2 || productPhoto.Symbol == 4 {
+			images = append(images, productPhoto.PhotoUrl)
+		} else if productPhoto.Symbol == 3 || productPhoto.Symbol == 5 {
+			var videoJobId *string
+			var reviewErr error
+			i := 10
+			for {
+				videoJobId, reviewErr = reviewService.CheckVideo(productPhoto.PhotoUrl)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil {
+				return nil, reviewErr
+			}
+			videos = append(videos, productPhoto.PhotoUrl)
+			videoJobIds = append(videoJobIds, *videoJobId)
+		}
+	}
+
+	projectBriefInfos, err := dao.ProjectBriefDao{}.GetProjectBriefInfo(projectId)
+	if err != nil {
+		return nil, err
+	}
+	for _, projectBriefInfo := range projectBriefInfos {
+		if projectBriefInfo.Type == 1 {
+			images = append(images, projectBriefInfo.FileUrl)
+		} else if projectBriefInfo.Type == 2 {
+			var documentJobId *string
+			var reviewErr error
+			i := 10
+			fileType := "pdf"
+			parts := strings.Split(projectBriefInfo.FileName, ".")
+			if len(parts) > 1 {
+				fileType = parts[len(parts)-1]
+			}
+			for {
+				documentJobId, reviewErr = reviewService.CheckDocument(projectBriefInfo.FileUrl, fileType)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil {
+				return nil, reviewErr
+			}
+			documents = append(documents, projectBriefInfo.FileUrl)
+			documentJobIds = append(documentJobIds, *documentJobId)
+		}
+	}
+	projectMaterials, err := dao.ProjectMaterialDao{}.GetProjectMaterialInfo(projectId)
+	if err != nil {
+		return nil, err
+	}
+	for _, projectMaterial := range projectMaterials {
+		if projectMaterial.Type == 1 {
+			images = append(images, projectMaterial.FileUrl)
+		} else if projectMaterial.Type == 2 {
+			var videoJobId *string
+			var reviewErr error
+			i := 10
+			for {
+				videoJobId, reviewErr = reviewService.CheckVideo(projectMaterial.FileUrl)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil {
+				return nil, reviewErr
+			}
+			videos = append(videos, projectMaterial.FileUrl)
+			videoJobIds = append(videoJobIds, *videoJobId)
+		}
+	}
+
+	newReviewProject := &entity.ReviewProject{
+		ProjectID:      projectId,
+		TaskName:       projectName,
+		TaskDetail:     projectDetail,
+		ProductName:    productName,
+		ProductDetail:  productDetail,
+		MainPhoto:      mainPhoto,
+		Images:         strings.Join(images, ","),
+		Videos:         strings.Join(videos, ","),
+		Documents:      strings.Join(documents, ","),
+		VideoJobIds:    strings.Join(videoJobIds, ","),
+		DocumentJobIds: strings.Join(documentJobIds, ","),
+		Status:         1,
+	}
+	err5 := dao.ProjectReviewDao{}.Create(newReviewProject)
+	if err5 != nil {
+		return nil, err5
+	}
+
 	t := time.Now()
 	updateProject := entity.Project{
 		ProjectId:     projectId,
 		ProjectStatus: 2,
 		UpdatedAt:     t,
 	}
-	err := dao.ProjectDAO{}.UpdateProject(updateProject)
-	if err != nil {
+	err6 := dao.ProjectDAO{}.UpdateProject(updateProject)
+	if err6 != nil {
 		return nil, err
 	}
 	return &projectId, nil

+ 27 - 0
app/service/review_service/business_license_check.go

@@ -0,0 +1,27 @@
+package review_service
+
+import (
+	"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ocr/v1/model"
+)
+
+func (c *Config) CheckBusinessLicense(businessLicenseUrl string) (map[string]string, error) {
+	request := &model.RecognizeBusinessLicenseRequest{}
+	request.Body = &model.BusinessLicenseRequestBody{
+		Url: &businessLicenseUrl,
+	}
+	response, err := c.OcrClient.RecognizeBusinessLicense(request)
+	if err != nil {
+		//if err.StatusCode == 400 {
+		//	return "false", err
+		//}
+		return nil, err
+	}
+	result := response.Result
+	registrationNumber := result.RegistrationNumber
+	companyName := result.Name
+	resultMap := make(map[string]string)
+	resultMap["registrationNumber"] = *registrationNumber
+	resultMap["companyName"] = *companyName
+
+	return resultMap, nil
+}

+ 42 - 12
app/service/review_service/config.go

@@ -1,23 +1,46 @@
 package review_service
 
 import (
+	"encoding/json"
 	"github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic"
 	moderation "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/moderation/v3"
 	moderationRegion "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/moderation/v3/region"
 	ocr "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ocr/v1"
 	ocrRegion "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ocr/v1/region"
+	"io/ioutil"
+	"log"
+	"sync"
 )
 
-type ReviewService struct {
-	client    *moderation.ModerationClient
-	ocrClient *ocr.OcrClient
-	projectId string
+type Config struct {
+	Ak        string                       `json:"review_ak"`
+	Sk        string                       `json:"review_sk"`
+	ProjectId string                       `json:"project_id"`
+	Client    *moderation.ModerationClient `json:"client"`
+	OcrClient *ocr.OcrClient               `json:"ocr_client"`
 }
 
-func Config(ak, sk, projectId string) *ReviewService {
+const configFile = "app/config/review_config.json"
+
+var configInstance *Config
+var once sync.Once
+
+// 加载配置文件
+func loadConfig() *Config {
+	data, err := ioutil.ReadFile(configFile)
+	if err != nil {
+		log.Fatalf("Failed to read config file: %v", err)
+	}
+
+	var config Config
+	err = json.Unmarshal(data, &config)
+	if err != nil {
+		log.Fatalf("Failed to parse config file: %v", err)
+	}
+
 	auth := basic.NewCredentialsBuilder().
-		WithAk(ak).
-		WithSk(sk).
+		WithAk(config.Ak).
+		WithSk(config.Sk).
 		//WithProjectId(projectId).
 		Build()
 
@@ -33,9 +56,16 @@ func Config(ak, sk, projectId string) *ReviewService {
 			WithCredential(auth).
 			Build())
 
-	return &ReviewService{
-		client:    client,
-		ocrClient: ocrClient,
-		projectId: projectId,
-	}
+	config.Client = client
+	config.OcrClient = ocrClient
+
+	return &config
+}
+
+// 获取配置的单例实例
+func GetConfig() *Config {
+	once.Do(func() {
+		configInstance = loadConfig()
+	})
+	return configInstance
 }

+ 0 - 38
app/service/review_service/content_check.go

@@ -1,38 +0,0 @@
-package review_service
-
-import (
-	"encoding/json"
-	"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/moderation/v3/model"
-)
-
-/*
-result.suggestion:
-
-	block:包含敏感信息,不通过
-	review:需要人工复检
-	pass:不包含敏感信息,通过
-*/
-func (s *ReviewService) CheckContent(text string) (string, error) {
-	request := &model.RunTextModerationRequest{}
-	request.EnterpriseProjectId = &s.projectId
-	eventType := "article"
-	listCategoriesbody := []string{
-		"terrorism", "porn", "ban", "abuse",
-	}
-	databody := model.TextDetectionDataReq{
-		Text: text,
-	}
-	request.Body = &model.TextDetectionReq{
-		Data:       &databody,
-		EventType:  &eventType,
-		Categories: &listCategoriesbody,
-	}
-	response, err := s.client.RunTextModeration(request)
-	if err != nil {
-		return "文本审核服务异常", err
-	}
-	result := response.Result
-	jsonData, err := json.Marshal(result)
-	jsonString := string(jsonData)
-	return jsonString, nil
-}

+ 0 - 36
app/service/review_service/credentials_check.go

@@ -1,36 +0,0 @@
-package review_service
-
-import (
-	"encoding/json"
-	"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ocr/v1/model"
-)
-
-func (s *ReviewService) CheckCredentials(credentialsUrl string) (string, error) {
-	request := &model.RecognizeBusinessLicenseRequest{}
-	request.Body = &model.BusinessLicenseRequestBody{
-		Url: &credentialsUrl,
-	}
-	response, err := s.ocrClient.RecognizeBusinessLicense(request)
-	if err != nil {
-		//if err.StatusCode == 400 {
-		//	return "false", err
-		//}
-		return "营业执照审核服务异常", err
-	}
-	result := response.Result
-	jsonData, err := json.Marshal(result)
-	jsonString := string(jsonData)
-	return jsonString, nil
-
-	//request := &model.CheckImageModerationRequest{}
-	//listCategoriesbody := []string{
-	//	"terrorism", "porn",
-	//}
-	//eventType := "head_image"
-	//request.Body = &model.ImageDetectionReq{
-	//	Url:        &imageUrl,
-	//	Categories: &listCategoriesbody,
-	//	EventType:  &eventType,
-	//}
-
-}

+ 0 - 23
app/service/review_service/document_check.go

@@ -1,23 +0,0 @@
-package review_service
-
-import (
-	"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/moderation/v3/model"
-)
-
-func (s *ReviewService) CheckDocument(documentUrl, format string) (string, error) {
-	request := &model.RunCreateDocumentModerationJobRequest{}
-	databody := &model.DocumentCreateRequestData{
-		Url:    documentUrl,
-		Format: format,
-	}
-	request.Body = &model.DocumentCreateRequest{
-		EventType: "default",
-		Data:      databody,
-	}
-	response, err := s.client.RunCreateDocumentModerationJob(request)
-	if err != nil {
-		return "文档审核服务异常", err
-	}
-	jobId := *response.JobId
-	return jobId, nil
-}

+ 0 - 23
app/service/review_service/document_check_info.go

@@ -1,23 +0,0 @@
-package review_service
-
-import (
-	"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/moderation/v3/model"
-)
-
-/*
-result.suggestion:
-
-	block:包含敏感信息,不通过
-	review:需要人工复检
-	pass:不包含敏感信息,通过
-*/
-func (s *ReviewService) CheckDocumentInfo(jobId string) (*model.DocumentQueryResponseResult, error) {
-	request := &model.RunQueryDocumentModerationJobRequest{}
-	request.JobId = jobId
-	response, err := s.client.RunQueryDocumentModerationJob(request)
-	if err != nil {
-		return nil, err
-	}
-	result := response.Result
-	return result, nil // 审核结果,当作业状态status为succeeded时存在。
-}

+ 0 - 34
app/service/review_service/image_check.go

@@ -1,34 +0,0 @@
-package review_service
-
-import (
-	"encoding/json"
-	"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/moderation/v3/model"
-)
-
-/*
-result.suggestion:
-
-	block:包含敏感信息,不通过
-	review:需要人工复检
-	pass:不包含敏感信息,通过
-*/
-func (s *ReviewService) CheckImage(imageUrl string) (string, error) {
-	request := &model.CheckImageModerationRequest{}
-	listCategoriesbody := []string{
-		"terrorism", "porn",
-	}
-	eventType := "head_image"
-	request.Body = &model.ImageDetectionReq{
-		Url:        &imageUrl,
-		Categories: &listCategoriesbody,
-		EventType:  &eventType,
-	}
-	response, err := s.client.CheckImageModeration(request)
-	if err != nil {
-		return "图片审核服务异常", err
-	}
-	result := response.Result
-	jsonData, err := json.Marshal(result)
-	jsonString := string(jsonData)
-	return jsonString, nil
-}

+ 165 - 0
app/service/review_service/review_service.go

@@ -0,0 +1,165 @@
+package review_service
+
+import (
+	"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/moderation/v3/model"
+)
+
+/*
+result.suggestion:
+
+	block:包含敏感信息,不通过
+	review:需要人工复检
+	pass:不包含敏感信息,通过
+*/
+func (c *Config) CheckContent(text string) (*string, error) {
+	request := &model.RunTextModerationRequest{}
+	request.EnterpriseProjectId = &c.ProjectId
+	eventType := "article"
+	listCategoriesbody := []string{
+		"terrorism", "porn", "ban", "abuse",
+	}
+	databody := model.TextDetectionDataReq{
+		Text: text,
+	}
+	request.Body = &model.TextDetectionReq{
+		Data:       &databody,
+		EventType:  &eventType,
+		Categories: &listCategoriesbody,
+	}
+	response, err := c.Client.RunTextModeration(request)
+	if err != nil {
+		res := "文本审核服务异常"
+		return &res, err
+	}
+	result := response.Result
+	suggestion := result.Suggestion
+
+	return suggestion, nil
+}
+
+/*
+result.suggestion:
+
+	block:包含敏感信息,不通过
+	review:需要人工复检
+	pass:不包含敏感信息,通过
+*/
+func (c *Config) CheckImage(imageUrl string) (*string, error) {
+	request := &model.CheckImageModerationRequest{}
+	listCategoriesbody := []string{
+		"terrorism", "porn",
+	}
+	eventType := "head_image"
+	request.Body = &model.ImageDetectionReq{
+		Url:        &imageUrl,
+		Categories: &listCategoriesbody,
+		EventType:  &eventType,
+	}
+	response, err := c.Client.CheckImageModeration(request)
+	if err != nil {
+		res := "图片审核服务异常"
+		return &res, err
+	}
+	result := response.Result
+	suggestion := result.Suggestion
+
+	return suggestion, nil
+}
+
+func (c *Config) CheckVideo(videoUrl string) (*string, error) {
+	request := &model.RunCreateVideoModerationJobRequest{}
+	var listAudioCategoriesbody = []model.VideoCreateRequestAudioCategories{
+		model.GetVideoCreateRequestAudioCategoriesEnum().PORN, model.GetVideoCreateRequestAudioCategoriesEnum().MOAN, model.GetVideoCreateRequestAudioCategoriesEnum().ABUSE,
+	}
+	var listImageCategoriesbody = []model.VideoCreateRequestImageCategories{
+		model.GetVideoCreateRequestImageCategoriesEnum().PORN, model.GetVideoCreateRequestImageCategoriesEnum().TERRORISM,
+	}
+	var eventType = model.GetVideoCreateRequestEventTypeEnum().DEFAULT
+	frameIntervalData := int32(2)
+	databody := &model.VideoCreateRequestData{
+		Url:           videoUrl,
+		FrameInterval: &frameIntervalData, // 截帧频率间隔
+	}
+	//callbackVideoCreateRequest := "http://xxx.xx.xxxx"
+	request.Body = &model.VideoCreateRequest{
+		AudioCategories: &listAudioCategoriesbody, // 视频中音频需要检测的风险类型
+		ImageCategories: &listImageCategoriesbody, // 视频中画面需要检测的风险类型
+		EventType:       &eventType,
+		Data:            databody,
+		//Callback:        &callbackVideoCreateRequest,
+	}
+	response, err := c.Client.RunCreateVideoModerationJob(request)
+	if err != nil {
+		res := "视频审核服务异常"
+		return &res, err
+	}
+	jobId := response.JobId
+
+	return jobId, nil
+}
+
+/*
+result.suggestion:
+
+	block:包含敏感信息,不通过
+	review:需要人工复检
+	pass:不包含敏感信息,通过
+*/
+func (c *Config) CheckVideoInfo(jobId string) (status *string, suggestion *string, err error) {
+	request := &model.RunQueryVideoModerationJobRequest{}
+	request.JobId = jobId
+	response, err := c.Client.RunQueryVideoModerationJob(request)
+	if err != nil {
+		return nil, nil, err
+	}
+	status1 := response.Status.Value()
+	if "succeeded" == status1 {
+		suggestion1 := response.Result.Suggestion.Value()
+		return &status1, &suggestion1, nil
+	} else {
+		return &status1, nil, nil
+	}
+}
+
+func (c *Config) CheckDocument(documentUrl, format string) (*string, error) {
+	request := &model.RunCreateDocumentModerationJobRequest{}
+	databody := &model.DocumentCreateRequestData{
+		Url:    documentUrl,
+		Format: format,
+	}
+	request.Body = &model.DocumentCreateRequest{
+		EventType: "default",
+		Data:      databody,
+	}
+	response, err := c.Client.RunCreateDocumentModerationJob(request)
+	if err != nil {
+		res := "文档审核服务异常"
+		return &res, err
+	}
+	jobId := response.JobId
+
+	return jobId, nil
+}
+
+/*
+result.suggestion:
+
+	block:包含敏感信息,不通过
+	review:需要人工复检
+	pass:不包含敏感信息,通过
+*/
+func (c *Config) CheckDocumentInfo(jobId string) (status *string, suggestion *string, err error) {
+	request := &model.RunQueryDocumentModerationJobRequest{}
+	request.JobId = jobId
+	response, err := c.Client.RunQueryDocumentModerationJob(request)
+	if err != nil {
+		return nil, nil, err
+	}
+	status = response.Status
+	if "succeeded" == *status {
+		suggestion = response.Result.Suggestion
+		return status, suggestion, nil
+	} else {
+		return status, nil, nil
+	}
+}

+ 0 - 35
app/service/review_service/video_check.go

@@ -1,35 +0,0 @@
-package review_service
-
-import (
-	"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/moderation/v3/model"
-)
-
-func (s *ReviewService) CheckVideo(videoUrl string) (string, error) {
-	request := &model.RunCreateVideoModerationJobRequest{}
-	var listAudioCategoriesbody = []model.VideoCreateRequestAudioCategories{
-		model.GetVideoCreateRequestAudioCategoriesEnum().PORN, model.GetVideoCreateRequestAudioCategoriesEnum().MOAN, model.GetVideoCreateRequestAudioCategoriesEnum().ABUSE,
-	}
-	var listImageCategoriesbody = []model.VideoCreateRequestImageCategories{
-		model.GetVideoCreateRequestImageCategoriesEnum().PORN, model.GetVideoCreateRequestImageCategoriesEnum().TERRORISM,
-	}
-	var eventType = model.GetVideoCreateRequestEventTypeEnum().DEFAULT
-	frameIntervalData := int32(2)
-	databody := &model.VideoCreateRequestData{
-		Url:           videoUrl,
-		FrameInterval: &frameIntervalData, // 截帧频率间隔
-	}
-	//callbackVideoCreateRequest := "http://xxx.xx.xxxx"
-	request.Body = &model.VideoCreateRequest{
-		AudioCategories: &listAudioCategoriesbody, // 视频中音频需要检测的风险类型
-		ImageCategories: &listImageCategoriesbody, // 视频中画面需要检测的风险类型
-		EventType:       &eventType,
-		Data:            databody,
-		//Callback:        &callbackVideoCreateRequest,
-	}
-	response, err := s.client.RunCreateVideoModerationJob(request)
-	if err != nil {
-		return "视频审核服务异常", err
-	}
-	jobId := *response.JobId
-	return jobId, nil
-}

+ 0 - 23
app/service/review_service/video_check_info.go

@@ -1,23 +0,0 @@
-package review_service
-
-import (
-	"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/moderation/v3/model"
-)
-
-/*
-result.suggestion:
-
-	block:包含敏感信息,不通过
-	review:需要人工复检
-	pass:不包含敏感信息,通过
-*/
-func (s *ReviewService) CheckVideoInfo(jobId string) (*model.VideoModerationResultResult, error) {
-	request := &model.RunQueryVideoModerationJobRequest{}
-	request.JobId = jobId
-	response, err := s.client.RunQueryVideoModerationJob(request)
-	if err != nil {
-		return nil, err
-	}
-	result := response.Result
-	return result, nil // 审核结果,当作业状态status为succeeded时存在。
-}

+ 133 - 4
app/service/selection_info_service.go

@@ -5,9 +5,11 @@ import (
 	"errors"
 	"github.com/sirupsen/logrus"
 	"reflect"
+	"strings"
 	"time"
 	"youngee_b_api/app/dao"
 	"youngee_b_api/app/entity"
+	"youngee_b_api/app/service/review_service"
 	"youngee_b_api/app/util"
 	"youngee_b_api/app/vo"
 )
@@ -202,6 +204,7 @@ func (s SelectionInfoService) UpdateSelectionInfo(selectionUpdateParam *vo.Selec
 				FileName:    v.Name,
 				FileUrl:     v.FileUrl,
 				CreatedAt:   time.Now(),
+				Type:        v.Type,
 			}
 			err = dao.SecBriefDao{}.CreateSecBrief(brief)
 			if err != nil {
@@ -224,6 +227,7 @@ func (s SelectionInfoService) UpdateSelectionInfo(selectionUpdateParam *vo.Selec
 				FileName:    v.Name,
 				FileUrl:     v.FileUrl,
 				CreatedAt:   time.Now(),
+				Type:        v.Type,
 			}
 			err = dao.SecMaterialDao{}.CreateSecMaterial(secMaterial)
 			if err != nil {
@@ -300,6 +304,7 @@ func (s SelectionInfoService) GetSelectionDetail(selectionId string) (*vo.ReSele
 		logrus.Errorf("[selectionInfoDB service] call GetSelection error,err:%+v", err)
 		return nil, err
 	}
+	reSelectionDetail.SelectionName = selection.SelectionName
 	// 系统信息
 	reSelectionDetail.SelectionId = selectionId
 	reSelectionDetail.SelectionStatus = selection.SelectionStatus
@@ -401,16 +406,140 @@ func (s SelectionInfoService) GetSelectionDetail(selectionId string) (*vo.ReSele
 }
 
 // 电商带货提交审核
-func (s SelectionInfoService) SelectionToReview(selectionUpdateParam *vo.SelectionInfoUpdateParam) (*string, error) {
-	selectionId := selectionUpdateParam.SelectionID
+func (s SelectionInfoService) SelectionToReview(param *vo.SelectionInfoUpdateParam) (*string, error) {
+	selectionId := param.SelectionID
+	selection, err := dao.SelectionInfoDAO{}.GetSelectionInfoById(selectionId)
+	if err != nil {
+		logrus.Errorf("[selectionInfoDB service] call GetSelection error,err:%+v", err)
+		return nil, err
+	}
+
+	selectionName := selection.SelectionName // 任务标题
+	product, err := dao.ProductDAO{}.GetProductByID(selection.ProductID)
+	if err != nil {
+		return nil, err
+	}
+	productName := product.ProductName     // 商品标题
+	productDetail := product.ProductDetail // 卖点总结
+	mainPhoto, err1 := dao.ProductPhotoDAO{}.GetMainPhotoByProductID(selection.ProductID)
+	if err1 != nil {
+		return nil, err1
+	}
+	var images []string
+	var videos []string
+	var videoJobIds []string
+	var documents []string
+	var documentJobIds []string
+	reviewService := review_service.GetConfig()
+
+	productPhotos, err2 := dao.ProductPhotoDAO{}.GetProductPhotoByProductID(selection.ProductID)
+	if err2 != nil {
+		return nil, err2
+	}
+	for _, productPhoto := range productPhotos {
+		if productPhoto.Symbol == 2 || productPhoto.Symbol == 4 {
+			images = append(images, productPhoto.PhotoUrl)
+		} else if productPhoto.Symbol == 3 || productPhoto.Symbol == 5 {
+			var videoJobId *string
+			var reviewErr error
+			i := 10
+			for {
+				videoJobId, reviewErr = reviewService.CheckVideo(productPhoto.PhotoUrl)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil {
+				return nil, reviewErr
+			}
+			videos = append(videos, productPhoto.PhotoUrl)
+			videoJobIds = append(videoJobIds, *videoJobId)
+		}
+	}
+
+	selectionBriefInfos, err := dao.SecBriefDao{}.GetSelectionBriefInfo(selectionId)
+	if err != nil {
+		return nil, err
+	}
+	for _, selectionBriefInfo := range selectionBriefInfos {
+		if selectionBriefInfo.Type == 1 {
+			images = append(images, selectionBriefInfo.FileUrl)
+		} else if selectionBriefInfo.Type == 2 {
+			var documentJobId *string
+			var reviewErr error
+			i := 10
+			fileType := "pdf"
+			parts := strings.Split(selectionBriefInfo.FileName, ".")
+			if len(parts) > 1 {
+				fileType = parts[len(parts)-1]
+			}
+			for {
+				documentJobId, reviewErr = reviewService.CheckDocument(selectionBriefInfo.FileUrl, fileType)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil {
+				return nil, reviewErr
+			}
+			documents = append(documents, selectionBriefInfo.FileUrl)
+			documentJobIds = append(documentJobIds, *documentJobId)
+		}
+	}
+	selectionMaterials, err := dao.SecMaterialDao{}.GetSelectionMaterialInfo(selectionId)
+	if err != nil {
+		return nil, err
+	}
+	for _, selectionMaterial := range selectionMaterials {
+		if selectionMaterial.Type == 1 {
+			images = append(images, selectionMaterial.FileUrl)
+		} else if selectionMaterial.Type == 2 {
+			var videoJobId *string
+			var reviewErr error
+			i := 10
+			for {
+				videoJobId, reviewErr = reviewService.CheckVideo(selectionMaterial.FileUrl)
+				if reviewErr == nil || i == 0 {
+					break
+				}
+				i -= 1
+			}
+			if reviewErr != nil {
+				return nil, reviewErr
+			}
+			videos = append(videos, selectionMaterial.FileUrl)
+			videoJobIds = append(videoJobIds, *videoJobId)
+		}
+	}
+
+	newReviewSelection := &entity.ReviewSelection{
+		SelectionID:    selectionId,
+		TaskName:       selectionName,
+		ProductName:    productName,
+		ProductDetail:  productDetail,
+		MainPhoto:      mainPhoto,
+		Images:         strings.Join(images, ","),
+		Videos:         strings.Join(videos, ","),
+		Documents:      strings.Join(documents, ","),
+		VideoJobIds:    strings.Join(videoJobIds, ","),
+		DocumentJobIds: strings.Join(documentJobIds, ","),
+		Status:         1,
+	}
+	err5 := dao.SelectionReviewDao{}.Create(newReviewSelection)
+	if err5 != nil {
+		return nil, err5
+	}
+
 	t := time.Now()
 	updateSelection := entity.SelectionInfo{
 		SelectionID:     selectionId,
 		SelectionStatus: 2,
 		UpdatedAt:       t,
 	}
-	err := dao.SelectionInfoDAO{}.UpdateSelectionInfo(updateSelection)
-	if err != nil {
+	err6 := dao.SelectionInfoDAO{}.UpdateSelectionInfo(updateSelection)
+	if err6 != nil {
 		return nil, err
 	}
 	return &selectionId, nil

+ 2 - 0
app/vo/local_update_param.go

@@ -28,12 +28,14 @@ type LocalBriefInfo struct {
 	FileUrl string `json:"file_url"`
 	FileUid string `json:"file_uid"`
 	Name    string `json:"name"`
+	Type    int64  `json:"type"` // 手卡类型(1图片 2文档)
 }
 
 type LocalMaterialInfo struct {
 	FileUrl string `json:"file_url"`
 	FileUid string `json:"file_uid"`
 	Name    string `json:"name"`
+	Type    int64  `json:"type"` // 素材类型(1图片 2视频)
 }
 
 // 招募策略

+ 2 - 0
app/vo/project_update_param.go

@@ -25,12 +25,14 @@ type ProjectBriefInfo struct {
 	FileUrl string `json:"file_url"`
 	FileUid string `json:"file_uid"`
 	Name    string `json:"name"`
+	Type    int64  `json:"type"` // 手卡类型(1图片 2文档)
 }
 
 type ProjectMaterialInfo struct {
 	FileUrl string `json:"file_url"`
 	FileUid string `json:"file_uid"`
 	Name    string `json:"name"`
+	Type    int64  `json:"type"` // 素材类型(1图片 2视频)
 }
 
 // 招募策略

+ 1 - 0
app/vo/re_selection_detail.go

@@ -5,6 +5,7 @@ import (
 )
 
 type ReSelectionDetail struct {
+	SelectionName string `json:"selection_name"` // 任务标题
 	// 系统信息
 	SelectionId       string  `json:"selectionId"`       // 项目id 生成规则:年(2位)+一年中的第几天(3位)+5位数随机数,雪花算法也可,生成10位订单号
 	SelectionStatus   int64   `json:"selectionStatus"`   // 项目状态,1-8分别代表创建中、待审核、审核通过、待支付、已支付、执行中、失效、已结案

+ 2 - 0
app/vo/selection_info_update_param.go

@@ -29,12 +29,14 @@ type SecBriefInfo struct {
 	FileUrl string `json:"file_url"`
 	FileUid string `json:"file_uid"`
 	Name    string `json:"name"`
+	Type    int64  `json:"type"` // 手卡类型(1图片 2文档)
 }
 
 type SecMaterialInfo struct {
 	FileUrl string `json:"file_url"`
 	FileUid string `json:"file_uid"`
 	Name    string `json:"name"`
+	Type    int64  `json:"type"` // 素材类型(1图片 2视频)
 }
 
 // 领样策略

+ 8 - 4
main.go

@@ -24,13 +24,17 @@ func main() {
 	if err != nil {
 		log.Println("service AutoTask error:", err)
 	}
-	err1 := schedule.AutoTask1()
+	err1 := schedule.AutoTaskInvalid()
 	if err1 != nil {
-		log.Println("schedule AutoTask1 error:", err1)
+		log.Println("schedule AutoTaskInvalid error:", err1)
 	}
-	err2 := schedule.AutoTask2()
+	err2 := schedule.AutoTaskRecharge()
 	if err2 != nil {
-		log.Println("schedule AutoTask2 error:", err2)
+		log.Println("schedule AutoTaskRecharge error:", err2)
+	}
+	err3 := schedule.AutoTaskReview()
+	if err3 != nil {
+		log.Println("schedule AutoTaskReview error:", err3)
 	}
 	r.Run(addr) // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
 }

+ 6 - 1
route/init.go

@@ -203,7 +203,6 @@ func InitRoute(r *gin.Engine) {
 		task.POST("/selection/toReview", controller.TaskController{}.SelectionToReview)         // 电商带货提交审核
 		task.POST("/selection/task/list", controller.TaskController{}.SelectionTaskList)        // 电商带货任务列表
 		task.POST("/selection/del", controller.TaskController{}.SelectionDel)                   // 删除带货任务
-		task.POST("/selection/check", controller.TaskController{}.CheckSelectionInfo)           // 电商带货任务审核
 		task.POST("/selection/data/talent", controller.TaskController{}.TalentDataDetail)       // 电商带货看数据-达人数据
 		task.POST("/selection/data/sample", controller.TaskController{}.SampleDataDetail)       // 电商带货看数据-领样数据
 		task.POST("/selection/data/selection", controller.TaskController{}.SelectionDataDetail) // 电商带货看数据-带货数据
@@ -296,5 +295,11 @@ func InitRoute(r *gin.Engine) {
 		store.POST("/teamBuying/update", controller.CooperationController{}.UpdateTeamBuying)    // 更新团购
 		store.POST("/teamBuying/del", controller.CooperationController{}.DeleteTeamBuying)       // 删除团购
 	}
+	// 账号管理
+	account := r.Group("/youngee/b/account")
+	{
+		account.Use(middleware.LoginAuthMiddleware)
+		account.POST("/businessLicense", controller.AccountController{}.OCRIdentify) // 营业执照OCR识别/认证
+	}
 
 }