浏览代码

Merge remote-tracking branch 'origin/develop' into develop

lin-jim-leon 6 天之前
父节点
当前提交
4fa6c2a3aa
共有 56 个文件被更改,包括 1676 次插入174 次删除
  1. 31 0
      app/controller/task_controller.go
  2. 24 5
      app/dao/enterprise_dao.go
  3. 1 1
      app/dao/local_life_dao.go
  4. 3 3
      app/dao/project_dao.go
  5. 16 0
      app/dao/s_local_life_dao.go
  6. 16 0
      app/dao/s_project_dao.go
  7. 9 9
      app/dao/sec_task_info_dao.go
  8. 6 6
      app/dao/selection_info_dao.go
  9. 13 0
      app/dao/supplier_income_dao.go
  10. 36 0
      app/entity/data_info.go
  11. 37 0
      app/entity/link_info.go
  12. 1 0
      app/entity/local_life_info.go
  13. 1 0
      app/entity/project.go
  14. 1 0
      app/entity/project_task_info.go
  15. 4 2
      app/entity/s_local_life.go
  16. 4 3
      app/entity/s_project.go
  17. 0 46
      app/entity/sec_task_info.go
  18. 1 0
      app/entity/selection_info.go
  19. 1 0
      app/entity/selection_task_info.go
  20. 36 0
      app/entity/sketch_info.go
  21. 18 0
      app/entity/supplier_income.go
  22. 18 0
      app/entity/talent_delivery_address.go
  23. 158 0
      app/schedule/auto_task_execute.go
  24. 1 1
      app/schedule/auto_task_invalid.go
  25. 1 1
      app/schedule/auto_task_review.go
  26. 194 0
      app/schedule/auto_task_settle.go
  27. 1 1
      app/service/enterprise_service.go
  28. 2 2
      app/service/recharge_service.go
  29. 1 1
      app/service/selection_info_service.go
  30. 89 5
      app/service/task_info_service.go
  31. 16 0
      app/vo/re_logistics_export.go
  32. 24 0
      db/enterprise.go
  33. 31 1
      db/sub_account.go
  34. 11 0
      db/user.go
  35. 1 1
      dockerfile
  36. 二进制
      export_template.xlsx
  37. 11 8
      go.mod
  38. 31 8
      go.sum
  39. 1 2
      handler/delete_sub_account.go
  40. 58 0
      handler/get_account_info.go
  41. 58 0
      handler/get_contact_info.go
  42. 59 0
      handler/get_review_info.go
  43. 73 0
      handler/update_account_info.go
  44. 63 0
      handler/update_contact_info.go
  45. 12 4
      main.go
  46. 24 13
      model/gorm_model/enterprise.go
  47. 5 0
      model/gorm_model/sub_account.go
  48. 25 0
      model/http_model/get_account_info.go
  49. 22 0
      model/http_model/get_contact_info.go
  50. 23 0
      model/http_model/get_review_info.go
  51. 28 0
      model/http_model/update_account_info.go
  52. 26 0
      model/http_model/update_contact_info.go
  53. 18 13
      route/init.go
  54. 107 32
      service/enterprise.go
  55. 219 0
      service/login_auth.go
  56. 6 6
      service/sub_account.go

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

+ 24 - 5
app/dao/enterprise_dao.go

@@ -59,19 +59,38 @@ func (d EnterpriseDao) UpdateEnterpriseBalance(enterpriseId string, amount float
 }
 
 // 支付-更新账户余额、冻结金额
-func (d EnterpriseDao) UpdateEnterpriseBalanceAndFrozen(enterpriseId string, amount float64) (*string, error) {
+func (d EnterpriseDao) UpdateEnterpriseBalanceAndFrozen(enterpriseId string, needPay float64) (*string, error) {
 	var enterprise entity.Enterprise
 	var err error
 	err = Db.Debug().Model(&entity.Enterprise{}).Where("enterprise_id = ?", enterpriseId).Find(&enterprise).Error
 	if err != nil {
 		return nil, err
 	}
-	if enterprise.AvailableBalance < amount {
+	if enterprise.AvailableBalance < needPay {
 		return nil, errors.New("可用余额不足")
 	}
-	newBalance := enterprise.Balance - amount
-	newAvailableBalance := enterprise.AvailableBalance - amount
-	newFrozenBalance := enterprise.FrozenBalance + amount
+	newAvailableBalance := enterprise.AvailableBalance - needPay
+	newFrozenBalance := enterprise.FrozenBalance + needPay
+	err = Db.Model(&entity.Enterprise{}).Where("enterprise_id = ?", enterpriseId).Updates(entity.Enterprise{
+		AvailableBalance: newAvailableBalance,
+		FrozenBalance:    newFrozenBalance}).Error
+	if err != nil {
+		return nil, err
+	}
+	return &enterpriseId, nil
+}
+
+// 解冻-更新账户余额、冻结金额
+func (d EnterpriseDao) UpdateEnterpriseBalanceAndFrozen2(enterpriseId string, needPay float64, realPayments float64) (*string, error) {
+	var enterprise entity.Enterprise
+	var err error
+	err = Db.Model(&entity.Enterprise{}).Where("enterprise_id = ?", enterpriseId).Find(&enterprise).Error
+	if err != nil {
+		return nil, err
+	}
+	newBalance := enterprise.Balance - realPayments
+	newAvailableBalance := enterprise.AvailableBalance + (needPay - realPayments)
+	newFrozenBalance := enterprise.FrozenBalance - needPay
 	err = Db.Debug().Model(&entity.Enterprise{}).Where("enterprise_id = ?", enterpriseId).Updates(entity.Enterprise{
 		Balance:          newBalance,
 		AvailableBalance: newAvailableBalance,

+ 1 - 1
app/dao/local_life_dao.go

@@ -211,7 +211,7 @@ func (d LocalLifeDao) GetLocalDraftList(param *vo.LocalDraftParam) ([]vo.ReLocal
 // 获取公开本地生活中全部指定状态值的项目
 func (d LocalLifeDao) GetLocalLifeList(value int64, fieldName string) ([]*entity.LocalLifeInfo, error) {
 	var localLifeInfos []*entity.LocalLifeInfo
-	err := Db.Model(entity.LocalLifeInfo{}).Where(fmt.Sprintf("local_type = ? AND %s = ? ", fieldName), 1, value).Find(&localLifeInfos).Error
+	err := Db.Model(entity.LocalLifeInfo{}).Where(fmt.Sprintf("%s = ? ", fieldName), value).Find(&localLifeInfos).Error
 	if err != nil {
 		return nil, err
 	}

+ 3 - 3
app/dao/project_dao.go

@@ -218,7 +218,7 @@ func (d ProjectDAO) GetProjectDraftList(param *vo.ProjectDraftParam) ([]vo.RePro
 // 获取公开种草中全部指定状态值的项目
 func (d ProjectDAO) GetProjectList(value int64, fieldName string) ([]*entity.Project, error) {
 	var projectInfos []*entity.Project
-	err := Db.Model(entity.Project{}).Where(fmt.Sprintf("project_type = ? AND %s = ? ", fieldName), 1, value).Find(&projectInfos).Error
+	err := Db.Model(entity.Project{}).Where(fmt.Sprintf("%s = ? ", fieldName), value).Find(&projectInfos).Error
 	if err != nil {
 		return nil, err
 	}
@@ -318,7 +318,7 @@ func (d ProjectDAO) GetProjectFrozenList(enterpriseId string) ([]*entity.Project
 	var projects []*entity.Project
 	query := Db.Debug().Model(entity.Project{})
 	query.Select("project_id, product_id, enterprise_id, sub_account_id, project_platform, payment_amount, pay_at") // 冻结金额:payment_amount
-	err := query.Where(fmt.Sprintf("enterprise_id = ? AND (project_status between 7 and 8) "), enterpriseId).Find(&projects).Error
+	err := query.Where(fmt.Sprintf("enterprise_id = ? AND project_type = ? AND (project_status between 7 and 8) "), enterpriseId, 1).Find(&projects).Error
 	if err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return projects, nil
@@ -334,7 +334,7 @@ func (d ProjectDAO) GetProjectFrozenCancelList(enterpriseId string) ([]*entity.P
 	var projects []*entity.Project
 	query := Db.Debug().Model(entity.Project{})
 	query.Select("project_id, product_id, enterprise_id, sub_account_id, project_platform, settlement_amount, pay_at") // 解冻金额:settlement_amount
-	err := query.Where(fmt.Sprintf("enterprise_id = ? AND (project_status between 9 and 10) "), enterpriseId).Find(&projects).Error
+	err := query.Where(fmt.Sprintf("enterprise_id = ? AND project_type = ? AND (project_status between 9 and 10) "), enterpriseId, 1).Find(&projects).Error
 	if err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return projects, nil

+ 16 - 0
app/dao/s_local_dao.go → app/dao/s_local_life_dao.go

@@ -28,6 +28,22 @@ func (d SLocalLifeDao) GetSLocalLifeByStatus(localId string, status int64, page
 	return sLocalLifeInfos, total, nil
 }
 
+// 获取某个 local_id 任务涉及到的服务商
+func (d SLocalLifeDao) GetSLocalLifeByLocalId(localId string) ([]*entity.SLocalLifeInfo, error) {
+	var sLocalLifeInfos []*entity.SLocalLifeInfo
+	err := Db.Debug().Model(&entity.SLocalLifeInfo{}).Where("local_id = ?", localId).Select("s_local_id, local_id, supplier_id, service_charge_settle, supplier_type").Find(&sLocalLifeInfos).Error
+	return sLocalLifeInfos, err
+}
+
+// 更新任务
+func (d SLocalLifeDao) UpdateSLocalLife(sLocalLifeInfo entity.SLocalLifeInfo) error {
+	err := Db.Model(&entity.SLocalLifeInfo{}).Where("s_local_id = ?", sLocalLifeInfo.SLocalID).Updates(sLocalLifeInfo).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
 //// 检查给定的服务商是否在该商家库中
 //func (d SupplierDao) EnterpriseDatabaseCheck(enterpriseId string, supplierId int64) (bool, error) {
 //	var count int64

+ 16 - 0
app/dao/s_project_dao.go

@@ -28,6 +28,22 @@ func (d SProjectDao) GetSProjectByStatus(projectId string, status int64, page in
 	return sProjectInfos, total, nil
 }
 
+// 获取某个 project_id 任务涉及到的服务商
+func (d SProjectDao) GetSProjectByProjectId(projectId string) ([]*entity.SProjectInfo, error) {
+	var sProjectInfos []*entity.SProjectInfo
+	err := Db.Debug().Model(&entity.SProjectInfo{}).Where("project_id = ?", projectId).Select("s_project_id, project_id, supplier_id, service_charge_settle, supplier_type").Find(&sProjectInfos).Error
+	return sProjectInfos, err
+}
+
+// 更新任务
+func (d SProjectDao) UpdateSProject(sProject entity.SProjectInfo) error {
+	err := Db.Model(&entity.SProjectInfo{}).Where("s_project_id = ?", sProject.SProjectID).Updates(sProject).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
 //// 检查给定的服务商是否在该商家库中
 //func (d SupplierDao) EnterpriseDatabaseCheck(enterpriseId string, supplierId int64) (bool, error) {
 //	var count int64

+ 9 - 9
app/dao/sec_task_info_dao.go

@@ -4,31 +4,31 @@ import (
 	"youngee_b_api/app/entity"
 )
 
-type SecTaskInfoDao struct{}
+type SelectionTaskInfoDao struct{}
 
-func (s SecTaskInfoDao) CountBySelectionId(selectionId string) (int64, error) {
+func (s SelectionTaskInfoDao) CountBySelectionId(selectionId string) (int64, error) {
 	var count int64
-	err := Db.Model(&entity.SecTaskInfo{}).Where("selection_id = ?", selectionId).Count(&count).Error
+	err := Db.Model(&entity.SelectionTaskInfo{}).Where("selection_id = ?", selectionId).Count(&count).Error
 	return count, err
 }
 
 // 获取带货子任务中指定悬赏阶段的数据
-func (s SecTaskInfoDao) GetRewardDetailByRewardStage(selectionId string, rewardStage int64, order int64, page int, pageSize int) ([]*entity.SecTaskInfo, int64, error) {
-	secTaskInfos := []*entity.SecTaskInfo{}
+func (s SelectionTaskInfoDao) GetRewardDetailByRewardStage(selectionId string, rewardStage int64, order int64, page int, pageSize int) ([]*entity.SelectionTaskInfo, int64, error) {
+	selectionTaskInfos := []*entity.SelectionTaskInfo{}
 	var total int64
-	query := Db.Debug().Model(&entity.SecTaskInfo{}).Where("selection_id = ? AND reward_stage = ?", selectionId, rewardStage)
+	query := Db.Debug().Model(&entity.SelectionTaskInfo{}).Where("selection_id = ? AND reward_stage = ?", selectionId, rewardStage)
 	query.Count(&total)
 	query = query.Select("talent_id, sale_actual, withdraw_date")
 	offset := (page - 1) * pageSize
 	var err error
 	if order == 1 {
-		err = query.Order("withdraw_date asc").Offset(offset).Limit(pageSize).Find(&secTaskInfos).Error
+		err = query.Order("withdraw_date asc").Offset(offset).Limit(pageSize).Find(&selectionTaskInfos).Error
 	} else {
-		err = query.Order("withdraw_date desc").Offset(offset).Limit(pageSize).Find(&secTaskInfos).Error
+		err = query.Order("withdraw_date desc").Offset(offset).Limit(pageSize).Find(&selectionTaskInfos).Error
 	}
 	if err != nil {
 		return nil, 0, err
 	}
 
-	return secTaskInfos, total, nil
+	return selectionTaskInfos, total, nil
 }

+ 6 - 6
app/dao/selection_info_dao.go

@@ -306,7 +306,7 @@ func (d SelectionInfoDAO) GetSelectionToDo(enterpriseId string, subAccountId int
 				selectionIDs = append(selectionIDs, info.SelectionID)
 			}
 			if len(selectionIDs) > 0 {
-				err1 := Db.Model(&entity.SecTaskInfo{}).Where("selection_id in ? and task_status = ?", selectionIDs, 1).Count(&needProcess).Error // task_status=1待选
+				err1 := Db.Model(&entity.SelectionTaskInfo{}).Where("selection_id in ? and task_status = ?", selectionIDs, 1).Count(&needProcess).Error // task_status=1待选
 				if err1 != nil {
 					needProcess = 0
 				}
@@ -332,7 +332,7 @@ func (d SelectionInfoDAO) GetSelectionToDo(enterpriseId string, subAccountId int
 				selectionIDs = append(selectionIDs, info.SelectionID)
 			}
 			if len(selectionIDs) > 0 {
-				err1 := Db.Model(&entity.SecTaskInfo{}).Where("selection_id in ? and task_status = ?", selectionIDs, 1).Count(&needProcess).Error // task_status=1待选
+				err1 := Db.Model(&entity.SelectionTaskInfo{}).Where("selection_id in ? and task_status = ?", selectionIDs, 1).Count(&needProcess).Error // task_status=1待选
 				if err1 != nil {
 					needProcess = 0
 				}
@@ -370,11 +370,11 @@ func (d SelectionInfoDAO) GetLogisticsToDo(enterpriseId string, subAccountId int
 				selectionIDs = append(selectionIDs, info.SelectionID)
 			}
 			if len(selectionIDs) > 0 {
-				err1 := Db.Model(&entity.SecTaskInfo{}).Where("selection_id in ? and logistics_status = ?", selectionIDs, 1).Count(&needDelivery).Error // logistics_status=1待发货
+				err1 := Db.Model(&entity.SelectionTaskInfo{}).Where("selection_id in ? and logistics_status = ?", selectionIDs, 1).Count(&needDelivery).Error // logistics_status=1待发货
 				if err1 != nil {
 					needDelivery = 0
 				}
-				err2 := Db.Model(&entity.SecTaskInfo{}).Where("selection_id in ? and logistics_status = ?", selectionIDs, 2).Count(&needReceive).Error // logistics_status=2待签收
+				err2 := Db.Model(&entity.SelectionTaskInfo{}).Where("selection_id in ? and logistics_status = ?", selectionIDs, 2).Count(&needReceive).Error // logistics_status=2待签收
 				if err2 != nil {
 					needReceive = 0
 				}
@@ -396,11 +396,11 @@ func (d SelectionInfoDAO) GetLogisticsToDo(enterpriseId string, subAccountId int
 				selectionIDs = append(selectionIDs, info.SelectionID)
 			}
 			if len(selectionIDs) > 0 {
-				err1 := Db.Model(&entity.SecTaskInfo{}).Where("selection_id in ? and logistics_status = ?", selectionIDs, 1).Count(&needDelivery).Error // logistics_status=1待发货
+				err1 := Db.Model(&entity.SelectionTaskInfo{}).Where("selection_id in ? and logistics_status = ?", selectionIDs, 1).Count(&needDelivery).Error // logistics_status=1待发货
 				if err1 != nil {
 					needDelivery = 0
 				}
-				err2 := Db.Model(&entity.SecTaskInfo{}).Where("selection_id in ? and logistics_status = ?", selectionIDs, 2).Count(&needReceive).Error // logistics_status=2待签收
+				err2 := Db.Model(&entity.SelectionTaskInfo{}).Where("selection_id in ? and logistics_status = ?", selectionIDs, 2).Count(&needReceive).Error // logistics_status=2待签收
 				if err2 != nil {
 					needReceive = 0
 				}

+ 13 - 0
app/dao/supplier_income_dao.go

@@ -0,0 +1,13 @@
+package dao
+
+import (
+	"youngee_b_api/app/entity"
+)
+
+type SupplierIncomeDao struct{}
+
+// 创建服务商收入记录
+func (d SupplierIncomeDao) CreateSupplierIncome(supplierIncome entity.SupplierIncome) (int64, error) {
+	err := Db.Create(&supplierIncome).Error
+	return supplierIncome.IncomeID, err
+}

+ 36 - 0
app/entity/data_info.go

@@ -0,0 +1,36 @@
+// Code generated by sql2gorm. DO NOT EDIT.
+package entity
+
+import (
+	"time"
+)
+
+type DataInfo struct {
+	DataID            int64     `gorm:"column:data_id;primary_key;AUTO_INCREMENT"` // 脚本id
+	TaskID            string    `gorm:"column:task_id;NOT NULL"`                   // 任务id
+	PlayNumber        int64     `gorm:"column:play_number;NOT NULL"`               // 播放量/阅读量
+	LikeNumber        int64     `gorm:"column:like_number;NOT NULL"`               // 点赞数
+	CommentNumber     int64     `gorm:"column:comment_number;NOT NULL"`            // 评论数
+	CollectNumber     int64     `gorm:"column:collect_number;NOT NULL"`            // 收藏数
+	PhotoUrl          string    `gorm:"column:photo_url;NOT NULL"`                 // 数据截图url
+	ReviseOpinion     string    `gorm:"column:revise_opinion"`                     // 审核意见
+	IsSubmit          int64     `gorm:"column:is_submit;NOT NULL"`                 // 是否提交
+	IsReview          int64     `gorm:"column:is_review;default:0;NOT NULL"`       // 是否审核
+	IsOk              int64     `gorm:"column:is_ok;NOT NULL"`                     // 是否合格
+	CreateAt          time.Time `gorm:"column:create_at;NOT NULL"`                 // 创建时间
+	SubmitAt          time.Time `gorm:"column:submit_at"`                          // 提交时间
+	AgreeAt           time.Time `gorm:"column:agree_at"`                           // 同意时间
+	RejectAt          time.Time `gorm:"column:reject_at"`                          // 驳回时间
+	AutoAgreeAt       time.Time `gorm:"column:auto_agree_at"`                      // 结案自动处理时间
+	AutoDataBreakAt   time.Time `gorm:"column:auto_data_break_at"`                 // 结案违约自动处理时间
+	BOperator         string    `gorm:"column:b_operator"`                         // 操作人id
+	BOperatorType     int64     `gorm:"column:b_operator_type;default:0"`          // 商家操作人类型,1商家用户,2商家子账号,3管理后台
+	ForwardNumber     int64     `gorm:"column:forward_number;default:0;NOT NULL"`
+	DataMissingStatus int64     `gorm:"column:data_missing_status"` // 未传数据违约状态,0无违约,1有违约
+	TalentID          string    `gorm:"column:talent_id;NOT NULL"`
+	TaskType          int64     `gorm:"column:task_type;NOT NULL"` // 任务类型(1种草 2本地生活)
+}
+
+func (m *DataInfo) TableName() string {
+	return "younggee_data_info"
+}

+ 37 - 0
app/entity/link_info.go

@@ -0,0 +1,37 @@
+// Code generated by sql2gorm. DO NOT EDIT.
+package entity
+
+import (
+	"time"
+)
+
+// 种草任务链接信息
+type LinkInfo struct {
+	LinkID  int64  `gorm:"column:link_id;primary_key;AUTO_INCREMENT"` // 链接id
+	TaskID  string `gorm:"column:task_id;NOT NULL"`                   // 任务id
+	LinkUrl string `gorm:"column:link_url;NOT NULL"`                  // 上传链接url
+
+	PhotoUrl        string    `gorm:"column:photo_url;NOT NULL"`           // 上传截图url
+	ReviseOpinion   string    `gorm:"column:revise_opinion"`               // 审核意见
+	IsSubmit        int64     `gorm:"column:is_submit;NOT NULL"`           // 是否提交
+	IsReview        int64     `gorm:"column:is_review;default:0;NOT NULL"` // 是否审核
+	IsOk            int64     `gorm:"column:is_ok;NOT NULL"`               // 是否合格
+	CreateAt        time.Time `gorm:"column:create_at"`                    // 创建时间
+	SubmitAt        time.Time `gorm:"column:submit_at"`                    // 提交时间
+	AgreeAt         time.Time `gorm:"column:agree_at"`                     // 同意时间
+	RejectAt        time.Time `gorm:"column:reject_at"`                    // 驳回时间
+	AutoAgreeAt     time.Time `gorm:"column:auto_agree_at"`                // 发布审核自动处理时间
+	AutoDataBreakAt time.Time `gorm:"column:auto_data_break_at"`           // 结案违约自动处理时间
+	AutoLinkBreakAt time.Time `gorm:"column:auto_link_break_at"`           // 链接违约自动处理时间
+	BOperator       string    `gorm:"column:b_operator;NOT NULL"`          // 操作人id
+	BOperatorType   int64     `gorm:"column:b_operator_type;default:0"`    // 商家操作人类型,1商家用户,2商家子账号,3管理后台
+	//LinkType          int64       `gorm:"column:link_type;default:0;NOT NULL"` // 1、2分别表示种草和本地生活
+	PlatformID        int64  `gorm:"column:platform_id;NOT NULL"` // 平台id
+	TalentID          string `gorm:"column:talent_id;NOT NULL"`   // 达人id
+	LinkMissingStatus int64  `gorm:"column:link_missing_status"`  // 未发作品违约状态,0无违约,1有违约
+	TaskType          int64  `gorm:"column:task_type;NOT NULL"`   // 任务类型(1种草 2本地生活)
+}
+
+func (m *LinkInfo) TableName() string {
+	return "younggee_link_info"
+}

+ 1 - 0
app/entity/local_life_info.go

@@ -53,6 +53,7 @@ type LocalLifeInfo struct {
 	ExploredNum         int64     `gorm:"column:explored_num;default:0;NOT NULL"`           // 已探店
 	InvoiceStatus       int64     `gorm:"column:invoice_status;default:0;NOT NULL"`         // 开票状态(1开票中 2已开票)
 	NeedPay             float64   `gorm:"column:need_pay"`                                  // 待支付金额
+	SettleFlag          int64     `gorm:"column:settle_flag"`
 }
 
 func (m *LocalLifeInfo) TableName() string {

+ 1 - 0
app/entity/project.go

@@ -54,6 +54,7 @@ type Project struct {
 	DeliveryNum       int64     `gorm:"column:delivery_num"`
 	AfterDeliveryNum  int64     `gorm:"column:after_delivery_num"`
 	NeedPay           float64   `gorm:"column:need_pay"` // 待支付金额
+	SettleFlag        int64     `gorm:"column:settle_flag"`
 }
 
 func (m *Project) TableName() string {

+ 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 {

+ 4 - 2
app/entity/s_local.go → app/entity/s_local_life.go

@@ -22,8 +22,9 @@ type SLocalLifeInfo struct {
 	RecruitNum          int64     `gorm:"column:recruit_num"`                           // 已招募人数
 	SettleNum           int64     `gorm:"column:settle_num;default:0"`                  // 已结算人数
 	SubAccountID        int64     `gorm:"column:sub_account_id"`                        // 服务商子账号ID
-	ServiceCharge       string    `gorm:"column:service_charge"`                        // 服务商预估可赚服务费
-	ServiceChargeActual string    `gorm:"column:service_charge_actual"`                 // 服务商实际可赚服务费
+	ServiceCharge       float64   `gorm:"column:service_charge"`                        // 服务商预估可赚服务费
+	ServiceChargeActual float64   `gorm:"column:service_charge_actual"`                 // 服务商实际可赚服务费
+	ServiceChargeSettle float64   `gorm:"column:service_charge_settle"`                 // 服务商已结算服务费
 	OperatorType        int64     `gorm:"column:operator_type;default:0"`               // 添加商单操作人类型,1为服务商主账号,2为服务商子账号
 	SLocalStatus        int64     `gorm:"column:s_local_status;default:0"`              // 服务商本地生活任务状态,1待确认,2已确认,3已拒绝
 	StrategyStatus      int64     `gorm:"column:strategy_status;default:2"`             // 定向本地生活任务是否替换招募策略,1是,2否
@@ -34,6 +35,7 @@ type SLocalLifeInfo struct {
 	CreateStrategyType  int64     `gorm:"column:create_strategy_type"`                  // 服务商替换招募策略操作人类型:1服务商主账号,2子账号
 	ShareCode           string    `gorm:"column:share_code"`                            // 分享码url
 	FinishTime          time.Time `gorm:"column:finish_time"`                           // 结案时间
+	SupplierType        int64     `gorm:"column:supplier_type"`                         // 服务商类型,1个人,2企业
 }
 
 func (m *SLocalLifeInfo) TableName() string {

+ 4 - 3
app/entity/s_project.go

@@ -24,9 +24,9 @@ type SProjectInfo struct {
 	SettleNum           int64     `gorm:"column:settle_num;default:0"`               // 已结算人数
 	QuitNum             int64     `gorm:"column:quit_num;default:0"`                 // 已解约人数
 	SubAccountID        int64     `gorm:"column:sub_account_id;default:0"`           // 服务商子账号ID
-	ServiceCharge       string    `gorm:"column:service_charge;default:0.00"`        // 服务商预估可赚服务费
-	ServiceChargeActual string    `gorm:"column:service_charge_actual;default:0.00"` // 服务商实际可赚服务费
-	ServiceChargeSettle string    `gorm:"column:service_charge_settle"`              // 服务商已结算服务费
+	ServiceCharge       float64   `gorm:"column:service_charge;default:0.00"`        // 服务商预估可赚服务费
+	ServiceChargeActual float64   `gorm:"column:service_charge_actual;default:0.00"` // 服务商实际可赚服务费
+	ServiceChargeSettle float64   `gorm:"column:service_charge_settle"`              // 服务商已结算服务费
 	OperatorType        int64     `gorm:"column:operator_type;default:0"`            // 添加商单操作人类型,1为服务商主账号,2为服务商子账号
 	SProjectStatus      int64     `gorm:"column:s_project_status;default:0"`         // 服务商种草任务状态,1待确认,2已确认,3已拒绝
 	StrategyStatus      int64     `gorm:"column:strategy_status;default:0"`          // 定向种草任务是否替换招募策略
@@ -36,6 +36,7 @@ type SProjectInfo struct {
 	CreateStrategyID    int64     `gorm:"column:create_strategy_id"`                 // 服务商修改服务费操作人ID
 	CreateStrategyType  int64     `gorm:"column:create_strategy_type"`               // 服务商修改服务费操作人类型:1服务商主账号,2子账号
 	FinishTime          time.Time `gorm:"column:finish_time"`                        // 结案时间
+	SupplierType        int64     `gorm:"column:supplier_type"`                      // 服务商类型,1个人,2企业
 }
 
 func (m *SProjectInfo) TableName() string {

+ 0 - 46
app/entity/sec_task_info.go

@@ -1,46 +0,0 @@
-package entity
-
-// Code generated by sql2gorm. DO NOT EDIT.
-
-import (
-	"time"
-)
-
-type SecTaskInfo struct {
-	ID                     int64     `gorm:"column:id;primary_key"`              // 递增id
-	TaskID                 string    `gorm:"column:task_id"`                     // 选品任务id
-	SelectionID            string    `gorm:"column:selection_id"`                // 选品id
-	TalentID               string    `gorm:"column:talent_id"`                   // 达人id
-	AccountID              int64     `gorm:"column:account_id"`                  // 账号id
-	TalentPlatformInfoSnap string    `gorm:"column:talent_platform_info_snap"`   // 达人平台信息快照
-	TalentPersonalInfoSnap string    `gorm:"column:talent_personal_info_snap"`   // 达人个人信息快照
-	TalentPostAddrSnap     string    `gorm:"column:talent_post_addr_snap"`       // 收货地址快照
-	TaskReward             string    `gorm:"column:task_reward"`                 //  达人赏金
-	TalentPayment          string    `gorm:"column:talent_payment"`              // 达人垫付金额
-	IsPayPayment           int64     `gorm:"column:is_pay_payment"`              // 企业是否返样品钱
-	IsPayReward            int64     `gorm:"column:is_pay_reward"`               // 企业是否结算悬赏
-	TaskMode               int64     `gorm:"column:task_mode"`                   // 任务形式,1、2分别表示纯佣带货、悬赏任务
-	SampleMode             int64     `gorm:"column:sample_mode"`                 // 领样形式,1-3分别表示免费领样、垫付买样、不提供样品
-	TaskStatus             int64     `gorm:"column:task_status;default:1"`       // 任务状态 1待选 2已选 3落选
-	TaskStage              int64     `gorm:"column:task_stage"`                  // 任务阶段,详情见info_sec_task_stage表
-	CreateDate             time.Time `gorm:"column:create_date"`                 // 创建时间
-	SelectDate             time.Time `gorm:"column:select_date"`                 // 反选时间
-	DeliveryDate           time.Time `gorm:"column:delivery_date"`               // 发货时间
-	CompleteDate           time.Time `gorm:"column:complete_date"`               // 结束时间
-	WithdrawDate           time.Time `gorm:"column:withdraw_date"`               // 提现时间
-	CompleteStatus         int64     `gorm:"column:complete_status;default:1"`   // 结束方式 1未结束 2正常结束 3反选失败
-	LogisticsStatus        int64     `gorm:"column:logistics_status;default:1"`  // 发货状态 1 待发货 2已发货 3 已签收
-	AssignmentStatus       uint64    `gorm:"column:assignment_status;default:1"` // 作业上传状态 1-5分别代表待添加、已添加、待修改、已修改、已通过
-	UpdateAt               time.Time `gorm:"column:update_at"`                   // 更新时间
-	WithdrawStatus         int64     `gorm:"column:withdraw_status;default:1"`   // 提现状态,1-4分别代表不可提现、可提现、提现中、已提现
-	LeadTeamID             string    `gorm:"column:lead_team_id"`                // 作为团长的young之团id,对应younggee_talent_team中的team_id字段
-	TeamID                 string    `gorm:"column:team_id"`                     // 作为团员的young之团id,对应younggee_talent_team中的team_id字段
-	TeamIncome             int64     `gorm:"column:team_income"`                 // young之团团长现金收益
-	TeamPoint64            int64     `gorm:"column:team_point64"`                // young之团团长积分收益
-	SaleActual             int64     `gorm:"column:sale_actual"`                 // 实际带货量
-
-}
-
-func (m *SecTaskInfo) TableName() string {
-	return "younggee_sec_task_info"
-}

+ 1 - 0
app/entity/selection_info.go

@@ -46,6 +46,7 @@ type SelectionInfo struct {
 	EnrollNum        int64     `gorm:"column:enroll_num"`                    // 报名数量
 	ChooseNum        int64     `gorm:"column:choose_num"`                    // 已选数量
 	InvoiceStatus    int64     `gorm:"column:invoice_status"`                // 开票状态(1开票中 2已开票)
+	SettleFlag       int64     `gorm:"column:settle_flag"`
 }
 
 func (m *SelectionInfo) TableName() string {

+ 1 - 0
app/entity/selection_task_info.go

@@ -37,6 +37,7 @@ type SelectionTaskInfo struct {
 	TeamID                 string    `gorm:"column:team_id"`                     // 作为团员的young之团id,对应younggee_talent_team中的team_id字段
 	TeamIncome             int       `gorm:"column:team_income"`                 // young之团团长现金收益
 	TeamPoint              int       `gorm:"column:team_point"`                  // young之团团长积分收益
+	SaleActual             int64     `gorm:"column:sale_actual"`                 // 实际带货量
 }
 
 func (m *SelectionTaskInfo) TableName() string {

+ 36 - 0
app/entity/sketch_info.go

@@ -0,0 +1,36 @@
+// Code generated by sql2gorm. DO NOT EDIT.
+package entity
+
+import (
+	"time"
+)
+
+// 种草任务初稿信息
+type SketchInfo struct {
+	SketchID          int64     `gorm:"column:sketch_id;primary_key;AUTO_INCREMENT"` // 初稿id
+	TaskID            string    `gorm:"column:task_id;NOT NULL"`                     // 任务id
+	Title             string    `gorm:"column:title"`                                // 标题
+	Type              int64     `gorm:"column:type"`                                 // 初稿形式,1为图片,2为视频
+	Content           string    `gorm:"column:content"`                              // 正文
+	ReviseOpinion     string    `gorm:"column:revise_opinion"`                       // 反馈意见
+	IsSubmit          int64     `gorm:"column:is_submit;NOT NULL"`                   // 是否提交
+	IsReview          int64     `gorm:"column:is_review;default:0;NOT NULL"`         // 是否审核
+	IsOk              int64     `gorm:"column:is_ok;NOT NULL"`                       // 是否合格(0,不合格,1合格
+	CreateAt          time.Time `gorm:"column:create_at;NOT NULL"`                   // 创建时间
+	AgreeAt           time.Time `gorm:"column:agree_at"`                             // 同意时间
+	RejectAt          time.Time `gorm:"column:reject_at"`                            // 驳回时间
+	SubmitAt          time.Time `gorm:"column:submit_at"`                            // 提交时间
+	AutoAgreeAt       time.Time `gorm:"column:auto_agree_at"`                        // 初稿自动审核时间
+	AutoLinkBreakAt   time.Time `gorm:"column:auto_link_break_at"`                   // 链接违约自动处理时间
+	AutoSketchBreakAt time.Time `gorm:"column:auto_sketch_break_at"`                 // 初稿违约自动处理时间
+	BOperator         string    `gorm:"column:b_operator"`                           // 商家确定达人操作人ID
+
+	BOperatorType       int64  `gorm:"column:b_operator_type;default:0"` // 商家操作人类型,1商家用户,2商家子账号,3管理后台
+	TalentID            string `gorm:"column:talent_id;NOT NULL"`
+	SketchMissingStatus int64  `gorm:"column:sketch_missing_status"` // 未传初稿违约状态,0无违约,1有违约
+	TaskType            int64  `gorm:"column:task_type;NOT NULL"`    // 任务类型(1种草 2本地生活)
+}
+
+func (m *SketchInfo) TableName() string {
+	return "younggee_sketch_info"
+}

+ 18 - 0
app/entity/supplier_income.go

@@ -0,0 +1,18 @@
+package entity
+
+// Code generated by sql2gorm. DO NOT EDIT.
+
+type SupplierIncome struct {
+	IncomeID            int64   `gorm:"column:income_id;primary_key;AUTO_INCREMENT"` // 服务商收入表ID
+	SupplierID          int64   `gorm:"column:supplier_id"`                          // 服务商ID
+	SupplierType        int64   `gorm:"column:supplier_type"`                        // 服务商用户类型,1为个人PR,2为机构
+	SProjectID          int64   `gorm:"column:s_project_id"`                         // 服务商加入商单后的种草任务ID
+	SLocalLifeID        int64   `gorm:"column:s_local_life_id"`                      // 服务商加入商单后的本地生活ID
+	IncomeType          int64   `gorm:"column:income_type"`                          // 服务商收入类型,1种草,2带货,3本地生活
+	IncomeStatus        int64   `gorm:"column:income_status;default:1"`              // 收入状态:1可回发票,2待传发票,3平台确认中,4平台已确认,5可提现,6提现中,7平台确认中,8已提现(个人服务商>=5;企业服务商>=1)
+	ServiceChargeSettle float64 `gorm:"column:service_charge_settle"`                // 服务费已结算
+}
+
+func (m *SupplierIncome) TableName() string {
+	return "younggee_supplier_income"
+}

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

+ 158 - 0
app/schedule/auto_task_execute.go

@@ -0,0 +1,158 @@
+package schedule
+
+import (
+	"github.com/robfig/cron/v3"
+	"log"
+	"time"
+	"youngee_b_api/app/dao"
+	"youngee_b_api/app/entity"
+)
+
+func AutoTaskExecute() error {
+	// 新建一个定时任务对象
+	crontab := cron.New(cron.WithSeconds()) // 精确到秒
+	spec := "0 */10 * * * ?"                //cron表达式,每10分钟一次
+
+	// 添加定时任务
+	// 定时任务1  初稿未审稿自动执行
+	_, err1 := crontab.AddFunc(spec, AutoSketchExecuteTask)
+	if err1 != nil {
+		return err1
+	}
+	// 定时任务2  链接未质检自动执行
+	_, err2 := crontab.AddFunc(spec, AutoLinkExecuteTask)
+	if err2 != nil {
+		return err2
+	}
+	// 定时任务3  数据未质检自动执行
+	_, err3 := crontab.AddFunc(spec, AutoDataExecuteTask)
+	if err3 != nil {
+		return err3
+	}
+
+	// 启动定时器
+	crontab.Start()
+	// 定时任务是另起协程执行的,这里使用 select 简单阻塞.需要根据实际情况进行控制
+	//select {} //阻塞主线程停止
+	return nil
+}
+
+// 定时任务1  初稿未审稿自动执行
+func AutoSketchExecuteTask() {
+	log.Println("AutoSketchExecuteTask running Start, Time :", time.Now())
+	var sketchInfos []*entity.SketchInfo
+	err := dao.Db.Model(&entity.SketchInfo{}).Where("is_review = ? and is_ok = ?", 0, 0).Select("sketch_id, task_id, auto_agree_at, task_type").Find(&sketchInfos).Error
+	if err != nil {
+		log.Println(err.Error())
+		return
+	}
+	var sketchIds []int64
+	var projectTaskIds []string
+	var localTaskIds []string
+	for _, sketchInfo := range sketchInfos {
+		sketchId := sketchInfo.SketchID
+		if time.Now().After(sketchInfo.AutoAgreeAt) {
+			sketchIds = append(sketchIds, sketchId)
+			if sketchInfo.TaskType == 1 {
+				projectTaskIds = append(projectTaskIds, sketchInfo.TaskID)
+			} else if sketchInfo.TaskType == 2 {
+				localTaskIds = append(localTaskIds, sketchInfo.TaskID)
+			}
+		}
+	}
+	dao.Db.Model(&entity.SketchInfo{}).Where("sketch_id in ?", sketchIds).Updates(&entity.SketchInfo{
+		IsReview:      1,
+		IsOk:          1,
+		AgreeAt:       time.Now(),
+		BOperatorType: 1,
+	})
+	dao.Db.Model(&entity.ProjectTaskInfo{}).Where("task_id in ?", projectTaskIds).Updates(&entity.ProjectTaskInfo{
+		TaskStage:    11,
+		SketchStatus: 5,
+	})
+	dao.Db.Model(&entity.LocalLifeTaskInfo{}).Where("task_id in ?", localTaskIds).Updates(&entity.LocalLifeTaskInfo{
+		TaskStage:    11,
+		SketchStatus: 5,
+	})
+	log.Println("AutoSketchExecuteTask running End, Time :", time.Now())
+}
+
+// 定时任务2  链接未质检自动执行
+func AutoLinkExecuteTask() {
+	log.Println("AutoLinkExecuteTask running Start, Time :", time.Now())
+	var LinInfos []*entity.LinkInfo
+	err := dao.Db.Model(&entity.LinkInfo{}).Where("is_review = ? and is_ok = ?", 0, 0).Select("link_id, task_id, auto_agree_at, task_type").Find(&LinInfos).Error
+	if err != nil {
+		log.Println(err.Error())
+		return
+	}
+	var linkIds []int64
+	var projectTaskIds []string
+	var localTaskIds []string
+	for _, LinInfo := range LinInfos {
+		linkId := LinInfo.LinkID
+		if time.Now().After(LinInfo.AutoAgreeAt) {
+			linkIds = append(linkIds, linkId)
+			if LinInfo.TaskType == 1 {
+				projectTaskIds = append(projectTaskIds, LinInfo.TaskID)
+			} else if LinInfo.TaskType == 2 {
+				localTaskIds = append(localTaskIds, LinInfo.TaskID)
+			}
+		}
+	}
+	dao.Db.Model(&entity.LinkInfo{}).Where("link_id in ?", linkIds).Updates(&entity.LinkInfo{
+		IsReview:      1,
+		IsOk:          1,
+		AgreeAt:       time.Now(),
+		BOperatorType: 1,
+	})
+	dao.Db.Model(&entity.ProjectTaskInfo{}).Where("task_id in ?", projectTaskIds).Updates(&entity.ProjectTaskInfo{
+		TaskStage:  13,
+		LinkStatus: 5,
+	})
+	dao.Db.Model(&entity.LocalLifeTaskInfo{}).Where("task_id in ?", localTaskIds).Updates(&entity.LocalLifeTaskInfo{
+		TaskStage:  13,
+		LinkStatus: 5,
+	})
+	log.Println("AutoLinkExecuteTask running End, Time :", time.Now())
+}
+
+// 定时任务3  数据未质检自动执行
+func AutoDataExecuteTask() {
+	log.Println("AutoDataExecuteTask running Start, Time :", time.Now())
+	var dataInfos []*entity.DataInfo
+	err := dao.Db.Model(&entity.DataInfo{}).Where("is_review = ? and is_ok = ?", 0, 0).Select("data_id, task_id, auto_agree_at, task_type").Find(&dataInfos).Error
+	if err != nil {
+		log.Println(err.Error())
+		return
+	}
+	var dataIds []int64
+	var projectTaskIds []string
+	var localTaskIds []string
+	for _, dataInfo := range dataInfos {
+		dataId := dataInfo.DataID
+		if time.Now().After(dataInfo.AutoAgreeAt) {
+			dataIds = append(dataIds, dataId)
+			if dataInfo.TaskType == 1 {
+				projectTaskIds = append(projectTaskIds, dataInfo.TaskID)
+			} else if dataInfo.TaskType == 2 {
+				localTaskIds = append(localTaskIds, dataInfo.TaskID)
+			}
+		}
+	}
+	dao.Db.Model(&entity.DataInfo{}).Where("data_id in ?", dataIds).Updates(&entity.DataInfo{
+		IsReview:      1,
+		IsOk:          1,
+		AgreeAt:       time.Now(),
+		BOperatorType: 1,
+	})
+	dao.Db.Model(&entity.ProjectTaskInfo{}).Where("task_id in ?", projectTaskIds).Updates(&entity.ProjectTaskInfo{
+		TaskStage:  15,
+		DataStatus: 5,
+	})
+	dao.Db.Model(&entity.LocalLifeTaskInfo{}).Where("task_id in ?", localTaskIds).Updates(&entity.LocalLifeTaskInfo{
+		TaskStage:  15,
+		DataStatus: 5,
+	})
+	log.Println("AutoDataExecuteTask running End, Time :", time.Now())
+}

+ 1 - 1
app/schedule/auto_task_invalid.go

@@ -18,7 +18,7 @@ func AutoTaskInvalid() error {
 
 	// 添加定时任务
 	// 定时任务1  品牌种草失效自动处理
-	_, err1 := crontab.AddFunc(spec, AutoSelectionInvalidTask)
+	_, err1 := crontab.AddFunc(spec, AutoProjectInvalidTask)
 	if err1 != nil {
 		return err1
 	}

+ 1 - 1
app/schedule/auto_task_review.go

@@ -13,7 +13,7 @@ import (
 func AutoTaskReview() error {
 	// 新建一个定时任务对象
 	crontab := cron.New(cron.WithSeconds()) // 精确到秒
-	spec := "0 */1 * * * ?"                 //cron表达式,每5分钟一次
+	spec := "0 */1 * * * ?"                 //cron表达式,每1分钟一次
 	// "0 0 12 * * ?" 每天中午12点执行
 
 	// 添加定时任务

+ 194 - 0
app/schedule/auto_task_settle.go

@@ -0,0 +1,194 @@
+package schedule
+
+import (
+	"github.com/robfig/cron/v3"
+	"log"
+	"time"
+	"youngee_b_api/app/dao"
+	"youngee_b_api/app/entity"
+)
+
+func AutoTaskSettle() error {
+	// 新建一个定时任务对象
+	crontab := cron.New(cron.WithSeconds()) // 精确到秒
+	spec := "0 */1 * * * ?"                 //cron表达式,每5分钟一次
+
+	// 添加定时任务
+	// 定时任务1  电商带货结案与解冻处理
+	_, err2 := crontab.AddFunc(spec, AutoSelectionSettleTask)
+	if err2 != nil {
+		return err2
+	}
+	// 定时任务2  品牌种草结案与解冻处理
+	_, err1 := crontab.AddFunc(spec, AutoProjectSettleTask)
+	if err1 != nil {
+		return err1
+	}
+	// 定时任务3  本地生活结案与解冻处理
+	_, err3 := crontab.AddFunc(spec, AutoLocalLifeSettleTask)
+	if err3 != nil {
+		return err3
+	}
+
+	// 启动定时器
+	crontab.Start()
+	// 定时任务是另起协程执行的,这里使用 select 简单阻塞.需要根据实际情况进行控制
+	//select {} //阻塞主线程停止
+	return nil
+}
+
+// 定时任务1  电商带货结案与解冻处理
+func AutoSelectionSettleTask() {
+	log.Println("AutoSelectionSettleTask running Start, Time :", time.Now())
+	var selectionInfos []*entity.SelectionInfo
+	err1 := dao.Db.Model(&entity.SelectionInfo{}).Where("selection_status = ? and settle_flag = ? ", 8, 0).Select("selection_id, enterprise_id, estimated_cost, settlement_amount").Find(&selectionInfos).Error
+	if err1 != nil {
+		return
+	}
+	for _, selectionInfo := range selectionInfos {
+		selectionID := selectionInfo.SelectionID
+		// 解冻资金
+		_, err3 := dao.EnterpriseDao{}.UpdateEnterpriseBalanceAndFrozen2(selectionInfo.EnterpriseID, selectionInfo.EstimatedCost, selectionInfo.SettlementAmount)
+		if err3 != nil {
+			continue
+		}
+		// 更新任务状态
+		err4 := dao.SelectionInfoDAO{}.UpdateSelectionInfo(entity.SelectionInfo{SelectionID: selectionID, SettleFlag: 1})
+		if err4 != nil {
+			return
+		}
+	}
+	log.Println("AutoSelectionSettleTask running End, Time :", time.Now())
+}
+
+// 定时任务2  品牌种草结案与解冻处理
+func AutoProjectSettleTask() {
+	log.Println("AutoProjectSettleTask running Start, Time :", time.Now())
+	var projectInfos []*entity.Project
+	err1 := dao.Db.Model(&entity.Project{}).Where("project_status = ? and settle_flag = ? ", 8, 1).Select("project_id, project_type, enterprise_id, need_pay").Find(&projectInfos).Error
+	if err1 != nil {
+		return
+	}
+	// 对于所有子任务结案但未解冻的品牌种草项目进行处理
+	for _, projectInfo := range projectInfos {
+		projectId := projectInfo.ProjectId
+		// 只有公开任务需要冻结&解冻资金
+		if projectInfo.ProjectType == 1 {
+			// 1. 处理商家账户金额
+			var realPayments float64
+			var projectTaskInfos []*entity.ProjectTaskInfo
+			err2 := dao.Db.Model(&entity.ProjectTaskInfo{}).Where("project_id = ? and task_stage = ? ", projectId, 15).Select("real_payment").Find(&projectTaskInfos).Error
+			if err2 != nil {
+				continue
+			}
+			for _, projectTaskInfo := range projectTaskInfos {
+				realPayments += projectTaskInfo.RealPayment
+			}
+			// 解冻资金
+			_, err3 := dao.EnterpriseDao{}.UpdateEnterpriseBalanceAndFrozen2(projectInfo.EnterpriseID, projectInfo.NeedPay, realPayments)
+			if err3 != nil {
+				return
+			}
+		}
+		// 更新任务状态为结案
+		err4 := dao.ProjectDAO{}.UpdateProject(entity.Project{ProjectId: projectId, ProjectStatus: 10})
+		if err4 != nil {
+			return
+		}
+		// 2、处理涉及到的服务商账户金额
+		sProjectInfos, err5 := dao.SProjectDao{}.GetSProjectByProjectId(projectId)
+		if err5 != nil {
+			return
+		}
+		for _, sProjectInfo := range sProjectInfos {
+			var incomeStatus int64
+			if sProjectInfo.SupplierType == 1 {
+				incomeStatus = 5
+			} else {
+				incomeStatus = 1
+			}
+			_, err6 := dao.SupplierIncomeDao{}.CreateSupplierIncome(entity.SupplierIncome{
+				SupplierID:          sProjectInfo.SupplierID,
+				SupplierType:        sProjectInfo.SupplierType,
+				SProjectID:          sProjectInfo.SProjectID,
+				IncomeType:          1,
+				IncomeStatus:        incomeStatus,
+				ServiceChargeSettle: sProjectInfo.ServiceChargeSettle,
+			})
+			if err6 != nil {
+				return
+			}
+			err7 := dao.SProjectDao{}.UpdateSProject(entity.SProjectInfo{SProjectID: sProjectInfo.SProjectID, ProjectStatus: 10})
+			if err7 != nil {
+				return
+			}
+		}
+	}
+	log.Println("AutoProjectSettleTask running End, Time :", time.Now())
+}
+
+// 定时任务3  本地生活结案与解冻处理
+func AutoLocalLifeSettleTask() {
+	log.Println("AutoLocalLifeSettleTask running Start, Time :", time.Now())
+	var localLifeInfos []*entity.LocalLifeInfo
+	err1 := dao.Db.Model(&entity.LocalLifeInfo{}).Where("task_status = ? and settle_flag = ? ", 8, 1).Select("local_id, local_type, enterprise_id, need_pay").Find(&localLifeInfos).Error
+	if err1 != nil {
+		return
+	}
+	// 对于所有子任务结案但未解冻的本地生活项目进行处理
+	for _, localLifeInfo := range localLifeInfos {
+		localId := localLifeInfo.LocalID
+		// 只有公开任务需要冻结&解冻资金
+		if localLifeInfo.LocalType == 1 {
+			// 1. 处理商家账户金额
+			var realPayments float64
+			var localTaskInfos []*entity.LocalLifeTaskInfo
+			err2 := dao.Db.Model(&entity.LocalLifeTaskInfo{}).Where("local_id = ? and task_stage = ? ", localId, 15).Select("real_payment").Find(&localTaskInfos).Error
+			if err2 != nil {
+				continue
+			}
+			for _, localTaskInfo := range localTaskInfos {
+				realPayments += localTaskInfo.RealPayment
+			}
+			// 解冻资金
+			_, err3 := dao.EnterpriseDao{}.UpdateEnterpriseBalanceAndFrozen2(localLifeInfo.EnterpriseID, localLifeInfo.NeedPay, realPayments)
+			if err3 != nil {
+				continue
+			}
+		}
+		// 更新任务状态为结案
+		err4 := dao.LocalLifeDao{}.UpdateLocal(entity.LocalLifeInfo{LocalID: localId, TaskStatus: 10})
+		if err4 != nil {
+			return
+		}
+		// 2、处理涉及到的服务商账户金额
+		sLocalLifeInfos, err5 := dao.SLocalLifeDao{}.GetSLocalLifeByLocalId(localId)
+		if err5 != nil {
+			return
+		}
+		for _, sLocalLifeInfo := range sLocalLifeInfos {
+			var incomeStatus int64
+			if sLocalLifeInfo.SupplierType == 1 {
+				incomeStatus = 5
+			} else {
+				incomeStatus = 1
+			}
+			_, err6 := dao.SupplierIncomeDao{}.CreateSupplierIncome(entity.SupplierIncome{
+				SupplierID:          sLocalLifeInfo.SupplierID,
+				SupplierType:        sLocalLifeInfo.SupplierType,
+				SLocalLifeID:        sLocalLifeInfo.SLocalID,
+				IncomeType:          3,
+				IncomeStatus:        incomeStatus,
+				ServiceChargeSettle: sLocalLifeInfo.ServiceChargeSettle,
+			})
+			if err6 != nil {
+				return
+			}
+			err7 := dao.SLocalLifeDao{}.UpdateSLocalLife(entity.SLocalLifeInfo{SLocalID: sLocalLifeInfo.SLocalID, TaskStatus: 10})
+			if err7 != nil {
+				return
+			}
+		}
+	}
+	log.Println("AutoLocalLifeSettleTask running End, Time :", time.Now())
+}

+ 1 - 1
app/service/enterprise_service.go

@@ -82,7 +82,7 @@ func calcTakegoodsInfo(dates []time.Time, enterpriseId string) vo.ReWorkspaceTak
 				currentCommission += enterprise.EstimatedCost * enterprise.CommissionRate
 				currentOrder += enterprise.SampleNum - enterprise.RemainNum
 				// 出单数量
-				currentPerson, _ = (&dao.SecTaskInfoDao{}).CountBySelectionId(enterprise.SelectionID)
+				currentPerson, _ = (&dao.SelectionTaskInfoDao{}).CountBySelectionId(enterprise.SelectionID)
 				currentCommissionRate = enterprise.SettlementAmount / float64(currentPerson)
 			}
 			// 带货数据

+ 2 - 2
app/service/recharge_service.go

@@ -348,10 +348,10 @@ func (t RechargeService) FrozenInfoCount(param *vo.BalanceParam) map[string]int6
 	var blockReleaseNum2 int64
 	// 冻结中
 	dao.Db.Model(entity.SelectionInfo{}).Where(fmt.Sprintf("enterprise_id = ? AND (selection_status between 5 and 6) "), param.EnterpriseId).Count(&blockNum1)
-	dao.Db.Model(entity.Project{}).Where(fmt.Sprintf("enterprise_id = ? AND (project_status between 7 and 8) "), param.EnterpriseId).Count(&blockNum2)
+	dao.Db.Model(entity.Project{}).Where(fmt.Sprintf("enterprise_id = ? AND project_type = ? AND (project_status between 7 and 8) "), param.EnterpriseId, 1).Count(&blockNum2)
 	// 冻结解除
 	dao.Db.Model(entity.SelectionInfo{}).Where(fmt.Sprintf("enterprise_id = ? AND (selection_status between 7 and 8) "), param.EnterpriseId).Count(&blockReleaseNum1)
-	dao.Db.Model(entity.Project{}).Where(fmt.Sprintf("enterprise_id = ? AND (project_status between 9 and 10) "), param.EnterpriseId).Count(&blockReleaseNum2)
+	dao.Db.Model(entity.Project{}).Where(fmt.Sprintf("enterprise_id = ? AND project_type = ? AND (project_status between 9 and 10) "), param.EnterpriseId, 1).Count(&blockReleaseNum2)
 
 	res["blockNum"] = blockNum1 + blockNum2
 	res["blockReleaseNum"] = blockReleaseNum1 + blockReleaseNum2

+ 1 - 1
app/service/selection_info_service.go

@@ -900,7 +900,7 @@ func (s SelectionInfoService) CloseSelection(selectionId string) (string, error)
 	var needProcess int64
 	if selectionInfo.SelectionStatus == 6 {
 		// 达人未处理 or 物流待办
-		_ = dao.Db.Model(&entity.SecTaskInfo{}).Where("selection_id = ? and (task_status = ? or logistics_status != ?)", selectionId, 1, 3).Count(&needProcess).Error // task_status=1待选
+		_ = dao.Db.Model(&entity.SelectionTaskInfo{}).Where("selection_id = ? and (task_status = ? or logistics_status != ?)", selectionId, 1, 3).Count(&needProcess).Error // task_status=1待选
 	}
 	if selectionInfo.SelectionStatus == 2 || selectionInfo.SelectionStatus == 4 || needProcess > 0 {
 		// 存在待办不可结束

+ 89 - 5
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)
@@ -131,20 +215,20 @@ func (t TaskInfoService) SelectionRewardCashDetail(param *vo.SelectionRewardCash
 	}
 	rewardPoolAmount := selectionInfo.EstimatedCost
 	rewardPoolCashed := selectionInfo.TaskReward
-	secTaskInfos, total, err1 := dao.SecTaskInfoDao{}.GetRewardDetailByRewardStage(param.SelectionId, 2, param.Order, param.Page, param.PageSize)
+	selectionTaskInfos, total, err1 := dao.SelectionTaskInfoDao{}.GetRewardDetailByRewardStage(param.SelectionId, 2, param.Order, param.Page, param.PageSize)
 	if err1 != nil {
 		return nil, err1
 	}
 	var talentRewardMsgs []vo.TalentRewardMsg
-	for _, secTaskInfo := range secTaskInfos {
-		talentInfo, _ := dao.TalentInfoDao{}.SelectTalentInfo(secTaskInfo.TalentID)
+	for _, selectionTaskInfo := range selectionTaskInfos {
+		talentInfo, _ := dao.TalentInfoDao{}.SelectTalentInfo(selectionTaskInfo.TalentID)
 		talentRewardMsg := vo.TalentRewardMsg{
 			PhotoUrl: talentInfo.Avatar,
 			Nickname: talentInfo.TalentNickname,
 			Account:  talentInfo.TalentWxOpenid,
 			Gender:   talentInfo.Sex,
-			OrderNum: secTaskInfo.SaleActual,
-			CashTime: secTaskInfo.WithdrawDate.Format("2006-01-02 15:04:05"),
+			OrderNum: selectionTaskInfo.SaleActual,
+			CashTime: selectionTaskInfo.WithdrawDate.Format("2006-01-02 15:04:05"),
 		}
 		talentRewardMsgs = append(talentRewardMsgs, talentRewardMsg)
 	}

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

+ 24 - 0
db/enterprise.go

@@ -4,6 +4,7 @@ import (
 	"context"
 	"fmt"
 	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
 	"log"
 	"strconv"
 	"time"
@@ -215,3 +216,26 @@ func UpdateEnterprise(ctx context.Context, EnterpriseID string, BusinessName str
 	}
 	return nil
 }
+
+// CountEnterpriseUserByPhone 按照手机号码统计服务商数量
+func CountEnterpriseUserByPhone(ctx context.Context, phone string) (int64, error) {
+	db := GetReadDB(ctx)
+	var taskNum int64
+	err := db.Model(gorm_model.Enterprise{}).Where("phone = ?", phone).Count(&taskNum).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CountSupplierUserByPhone] error read mysql, err:%+v", err)
+		return 0, err
+	}
+	return taskNum, nil
+}
+
+// UpdateEnterpriseById 更新商家信息
+func UpdateEnterpriseById(ctx context.Context, enterpriseInfo *gorm_model.Enterprise) error {
+	db := GetWriteDB(ctx)
+	whereCondition := gorm_model.Enterprise{EnterpriseID: enterpriseInfo.EnterpriseID}
+	err := db.Model(&gorm_model.Enterprise{}).Where(whereCondition).Updates(enterpriseInfo).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}

+ 31 - 1
db/sub_account.go

@@ -3,6 +3,7 @@ package db
 import (
 	"context"
 	"fmt"
+	"github.com/sirupsen/logrus"
 	"youngee_b_api/model/gorm_model"
 )
 
@@ -17,7 +18,7 @@ func CreateSubAccount(ctx context.Context, account gorm_model.YounggeeSubAccount
 }
 
 // UpdateSubAccount 更新子账号
-func UpdateSubAccount(ctx context.Context, account gorm_model.YounggeeSubAccount) error {
+func UpdateSubAccount(ctx context.Context, account *gorm_model.YounggeeSubAccount) error {
 	db := GetWriteDB(ctx)
 	whereCondition := gorm_model.YounggeeSubAccount{SubAccountId: account.SubAccountId}
 	err := db.Model(&gorm_model.YounggeeSubAccount{}).Where(whereCondition).Updates(account).Error
@@ -70,3 +71,32 @@ func FindSubAccountByEnterpriseId(ctx context.Context, enterpriseId string, jobI
 	}
 	return subAccount, total, nil
 }
+
+// FindSubAccountById 根据Id查询子账号
+func FindSubAccountById(ctx context.Context, subAccountId int) (*gorm_model.YounggeeSubAccount, error) {
+	db := GetReadDB(ctx)
+	var total int64
+	var subAccount *gorm_model.YounggeeSubAccount
+	whereCondition := gorm_model.YounggeeSubAccount{SubAccountId: subAccountId, SubAccountType: 1}
+	err := db.Model(gorm_model.YounggeeSubAccount{}).Where(whereCondition).Find(&subAccount).Count(&total).Error
+	if err != nil {
+		return nil, err
+	}
+	// fmt.Println(total)
+	if total == 0 {
+		return nil, err
+	}
+	return subAccount, nil
+}
+
+// CountSubAccountUserByPhone 按照手机号码统计子账号数量
+func CountSubAccountUserByPhone(ctx context.Context, phone string) (int64, error) {
+	db := GetReadDB(ctx)
+	var taskNum int64
+	err := db.Model(gorm_model.YounggeeSubAccount{}).Where("phone_number = ? and sub_account_type = 1", phone).Count(&taskNum).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CountSubAccountUserByPhone] error read mysql, err:%+v", err)
+		return 0, err
+	}
+	return taskNum, nil
+}

+ 11 - 0
db/user.go

@@ -71,3 +71,14 @@ func UpdateUser(ctx context.Context, UserID int64, UserName string, Email string
 	}
 	return &UserID, nil
 }
+
+// UpdateUserById 更新User信息ById
+func UpdateUserById(ctx context.Context, userInfo *gorm_model.YounggeeUser) error {
+	db := GetWriteDB(ctx)
+	whereCondition := gorm_model.YounggeeUser{ID: userInfo.ID}
+	err := db.Model(&gorm_model.YounggeeUser{}).Where(whereCondition).Updates(userInfo).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}

+ 1 - 1
dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.17 as builder
+FROM golang:latest as builder
 
 WORKDIR /go/src/app  
 

二进制
export_template.xlsx


+ 11 - 8
go.mod

@@ -4,8 +4,6 @@ go 1.22.1
 
 toolchain go1.22.3
 
-// toolchain go1.22.3
-
 require (
 	github.com/GUAIK-ORG/go-snowflake v0.0.0-20200116064823-220c4260e85f
 	github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10
@@ -16,6 +14,7 @@ require (
 	github.com/google/uuid v1.3.0
 	github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.117
 	github.com/lin-jim-leon/kuaishou v0.4.0
+	github.com/xuri/excelize/v2 v2.9.0
 )
 
 require (
@@ -44,13 +43,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/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
+	golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
 	gopkg.in/ini.v1 v1.67.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 )
@@ -74,10 +79,8 @@ 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/net v0.23.0 // indirect
-	golang.org/x/sys v0.20.0 // indirect
-	golang.org/x/tools v0.6.0 // indirect
+	golang.org/x/crypto v0.28.0 // indirect
+	golang.org/x/sys v0.26.0 // 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

+ 31 - 8
go.sum

@@ -136,8 +136,9 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
 github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -190,6 +191,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 +211,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 +271,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=
@@ -283,17 +297,21 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf
 golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
 golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
 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/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ=
+golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E=
 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=
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
+golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -315,8 +333,9 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
 golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
 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=
@@ -326,6 +345,8 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
+golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -350,8 +371,9 @@ golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 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=
@@ -371,8 +393,9 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 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=
@@ -383,12 +406,12 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 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=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=

+ 1 - 2
handler/delete_sub_account.go

@@ -1,7 +1,6 @@
 package handler
 
 import (
-	"fmt"
 	"github.com/gin-gonic/gin"
 	"youngee_b_api/model/http_model"
 	"youngee_b_api/service"
@@ -40,7 +39,7 @@ func (h *DeleteSubAccountHandler) run() {
 	subAccountData = *h.req
 	err := service.SubAccount.DeleteSubAccount(h.ctx, subAccountData)
 	if err != nil {
-		fmt.Println(err)
+		// fmt.Println(err)
 		h.resp.Status = 40000
 		h.resp.Message = err.Error()
 		return

+ 58 - 0
handler/get_account_info.go

@@ -0,0 +1,58 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapGetAccountInfoHandler(ctx *gin.Context) {
+	handler := newGetAccountInfoHandler(ctx)
+	baseRun(handler)
+}
+
+func newGetAccountInfoHandler(ctx *gin.Context) *GetAccountInfoHandler {
+	return &GetAccountInfoHandler{
+		req:  http_model.NewGetAccountInfoRequest(),
+		resp: http_model.NewGetAccountInfoResponse(),
+		ctx:  ctx,
+	}
+}
+
+type GetAccountInfoHandler struct {
+	req  *http_model.GetAccountInfoRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *GetAccountInfoHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *GetAccountInfoHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *GetAccountInfoHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h *GetAccountInfoHandler) run() {
+	data, err := service.Enterprise.GetEnterpriseAccountInfo(h.ctx, h.req)
+	if err != nil {
+		logrus.Errorf("[GetEnterpriseAccountInfo] call SetSession err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, err.Error())
+		log.Info("GetEnterpriseAccountInfo fail,req:%+v", h.req)
+		h.resp.Message = err.Error()
+		h.resp.Status = 40000
+		return
+	}
+	h.resp.Data = data
+	h.resp.Status = 20000
+	h.resp.Message = "ok"
+}
+
+func (h *GetAccountInfoHandler) checkParam() error {
+	return nil
+}

+ 58 - 0
handler/get_contact_info.go

@@ -0,0 +1,58 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapGetContactInfoHandler(ctx *gin.Context) {
+	handler := newGetContactInfoHandler(ctx)
+	baseRun(handler)
+}
+
+func newGetContactInfoHandler(ctx *gin.Context) *GetContactInfoHandler {
+	return &GetContactInfoHandler{
+		req:  http_model.NewGetContactInfoRequest(),
+		resp: http_model.NewGetContactInfoResponse(),
+		ctx:  ctx,
+	}
+}
+
+type GetContactInfoHandler struct {
+	req  *http_model.GetContactInfoRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *GetContactInfoHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *GetContactInfoHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *GetContactInfoHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h *GetContactInfoHandler) run() {
+	data, err := service.Enterprise.GetEnterpriseContactInfo(h.ctx, h.req)
+	if err != nil {
+		logrus.Errorf("[FindSubAccountByEnterpriseId] call SetSession err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, err.Error())
+		log.Info("FindSubAccountByEnterpriseId fail,req:%+v", h.req)
+		h.resp.Message = err.Error()
+		h.resp.Status = 40000
+		return
+	}
+	h.resp.Data = data
+	h.resp.Status = 20000
+	h.resp.Message = "ok"
+}
+
+func (h *GetContactInfoHandler) checkParam() error {
+	return nil
+}

+ 59 - 0
handler/get_review_info.go

@@ -0,0 +1,59 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapGetReviewInfoHandler(ctx *gin.Context) {
+	handler := newGetReviewInfoHandler(ctx)
+	baseRun(handler)
+}
+
+func newGetReviewInfoHandler(ctx *gin.Context) *GetReviewInfoHandler {
+	return &GetReviewInfoHandler{
+		req:  http_model.NewGetReviewInfoRequest(),
+		resp: http_model.NewGetReviewInfoResponse(),
+		ctx:  ctx,
+	}
+}
+
+type GetReviewInfoHandler struct {
+	req  *http_model.GetReviewInfoRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *GetReviewInfoHandler) getRequest() interface{} {
+	return h.req
+}
+
+func (h *GetReviewInfoHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *GetReviewInfoHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h *GetReviewInfoHandler) run() {
+	data, err := service.Enterprise.GetEnterpriseReviewInfo(h.ctx, h.req)
+	if err != nil {
+		logrus.Errorf("[GetEnterpriseReviewInfo] call SetSession err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, err.Error())
+		log.Info("GetEnterpriseReviewInfo fail,req:%+v", h.req)
+		h.resp.Message = err.Error()
+		h.resp.Status = 40000
+		return
+	}
+	h.resp.Data = data
+	h.resp.Status = 20000
+	h.resp.Message = "ok"
+}
+
+func (h *GetReviewInfoHandler) checkParam() error {
+	return nil
+}

+ 73 - 0
handler/update_account_info.go

@@ -0,0 +1,73 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapUpdateAccountInfoHandler(ctx *gin.Context) {
+	handler := newUpdateAccountInfoHandler(ctx)
+	baseRun(handler)
+}
+
+func newUpdateAccountInfoHandler(ctx *gin.Context) *UpdateAccountInfoHandler {
+	return &UpdateAccountInfoHandler{
+		req:  http_model.NewUpdateAccountInfoRequest(),
+		resp: http_model.NewUpdateAccountInfoResponse(),
+		ctx:  ctx,
+	}
+}
+
+type UpdateAccountInfoHandler struct {
+	req  *http_model.UpdateAccountInfoRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *UpdateAccountInfoHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *UpdateAccountInfoHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *UpdateAccountInfoHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h *UpdateAccountInfoHandler) run() {
+	data, tag, err := service.LoginAuth.UpdateEnterpriseAccountInfo(h.ctx, h.req)
+	if err != nil {
+		logrus.Errorf("[UpdateSupplierAccountInfo] call SetSession err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, err.Error())
+		log.Info("UpdateSupplierAccountInfo fail,req:%+v", h.req)
+		h.resp.Message = err.Error()
+		h.resp.Status = 40000
+		return
+	}
+	if tag == 1 {
+		h.resp.Message = "验证码校验错误"
+		h.resp.Status = 34000
+		return
+	}
+	if tag == 2 {
+		h.resp.Message = "手机号已经被其他主账号绑定"
+		h.resp.Status = 35000
+		return
+	}
+	if tag == 3 {
+		h.resp.Message = "手机号已经被其他子账号绑定"
+		h.resp.Status = 36000
+		return
+	}
+	h.resp.Data = data
+	h.resp.Status = 20000
+	h.resp.Message = "ok"
+}
+
+func (h *UpdateAccountInfoHandler) checkParam() error {
+	return nil
+}

+ 63 - 0
handler/update_contact_info.go

@@ -0,0 +1,63 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapUpdateContactInfoHandler(ctx *gin.Context) {
+	handler := newUpdateContactInfoHandler(ctx)
+	baseRun(handler)
+}
+
+func newUpdateContactInfoHandler(ctx *gin.Context) *UpdateContactInfoHandler {
+	return &UpdateContactInfoHandler{
+		req:  http_model.NewUpdateContactInfoRequest(),
+		resp: http_model.NewUpdateContactInfoResponse(),
+		ctx:  ctx,
+	}
+}
+
+type UpdateContactInfoHandler struct {
+	req  *http_model.UpdateContactInfoRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *UpdateContactInfoHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *UpdateContactInfoHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *UpdateContactInfoHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h *UpdateContactInfoHandler) run() {
+	data, tag, err := service.LoginAuth.UpdateEnterpriseContactInfo(h.ctx, h.req)
+	if err != nil {
+		logrus.Errorf("[FindSubAccountByEnterpriseId] call SetSession err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, err.Error())
+		log.Info("FindSubAccountByEnterpriseId fail,req:%+v", h.req)
+		h.resp.Message = err.Error()
+		h.resp.Status = 40000
+		return
+	}
+	if tag == true && data == nil {
+		h.resp.Message = "验证码校验错误"
+		h.resp.Status = 34000
+		return
+	}
+	h.resp.Data = data
+	h.resp.Status = 20000
+	h.resp.Message = "ok"
+}
+
+func (h *UpdateContactInfoHandler) checkParam() error {
+	return nil
+}

+ 12 - 4
main.go

@@ -22,19 +22,27 @@ func main() {
 	addr := fmt.Sprintf("%v:%v", config.Host, config.Port)
 	err := service.AutoTask()
 	if err != nil {
-		log.Println("service AutoTask error:", err)
+		log.Println("service AutoTask error:", err.Error())
 	}
 	err1 := schedule.AutoTaskInvalid()
 	if err1 != nil {
-		log.Println("schedule AutoTaskInvalid error:", err1)
+		log.Println("schedule AutoTaskInvalid error:", err1.Error())
 	}
 	err2 := schedule.AutoTaskRecharge()
 	if err2 != nil {
-		log.Println("schedule AutoTaskRecharge error:", err2)
+		log.Println("schedule AutoTaskRecharge error:", err2.Error())
 	}
 	err3 := schedule.AutoTaskReview()
 	if err3 != nil {
-		log.Println("schedule AutoTaskReview error:", err3)
+		log.Println("schedule AutoTaskReview error:", err3.Error())
+	}
+	err4 := schedule.AutoTaskSettle()
+	if err4 != nil {
+		log.Println("schedule AutoTaskSettle error:", err4.Error())
+	}
+	err5 := schedule.AutoTaskExecute()
+	if err5 != nil {
+		log.Println("schedule AutoTaskExecute error:", err5.Error())
 	}
 	r.Run(addr) // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
 }

+ 24 - 13
model/gorm_model/enterprise.go

@@ -1,23 +1,34 @@
-// Code generated by sql2gorm. DO NOT EDIT.
 package gorm_model
 
 import (
 	"time"
 )
 
+// Enterprise 企业用户表
 type Enterprise struct {
-	EnterpriseID     string     `gorm:"column:enterprise_id"`     // 企业id,用户ID的生成规则为:1(企业用户代码)+分秒数字+四位随机数字
-	Industry         int64     `gorm:"column:industry"`          // 行业,1-14分别代表能源、化工、材料、机械设备/军工、企业服务/造纸印刷、运输设备、旅游酒店、媒体/信息通信服务、批发/零售、消费品、卫生保健/医疗、金融、建材/建筑/房地产、公共事业
-	BusinessName     string    `gorm:"column:business_name"`     // 公司或组织名称
-	UserID           int64     `gorm:"column:user_id"`           // 对应用户id
-	Balance          float64   `gorm:"column:balance"`           // 账户余额
-	FrozenBalance    float64   `gorm:"column:frozen_balance"`    // 冻结余额
-	AvailableBalance float64   `gorm:"column:available_balance"` // 可用余额
-	BillableAmount   float64   `gorm:"column:billable_amount"`   // 可开票金额
-	Invoicing        float64   `gorm:"column:invoicing"`         // 开票中金额
-	Recharging       float64   `gorm:"column:recharging"`        // 充值中金额
-	CreatedAt        time.Time `gorm:"column:created_at"`        // 创建时间
-	UpdatedAt        time.Time `gorm:"column:updated_at"`        // 更新时间
+	EnterpriseID     string    `gorm:"column:enterprise_id;primary_key"`      // 企业id,用户ID的生成规则为:1(企业用户代码)+分秒数字+四位随机数字
+	Industry         int64     `gorm:"column:industry"`                       // 行业,1-14分别代表能源、化工、材料、机械设备/军工、企业服务/造纸印刷、运输设备、旅游酒店、媒体/信息通信服务、批发/零售、消费品、卫生保健/医疗、金融、建材/建筑/房地产、公共事业
+	BusinessName     string    `gorm:"column:business_name"`                  // 公司或组织名称
+	TaxNumber        string    `gorm:"column:tax_number"`                     // 企业税号
+	Address          string    `gorm:"column:address"`                        // 公司注册地址
+	UserID           int64     `gorm:"column:user_id"`                        // 对应用户id
+	Balance          float64   `gorm:"column:balance"`                        // 账户余额
+	FrozenBalance    float64   `gorm:"column:frozen_balance"`                 // 冻结余额
+	AvailableBalance float64   `gorm:"column:available_balance"`              // 可用余额
+	BillableAmount   float64   `gorm:"column:billable_amount"`                // 可开票金额(3.0暂未用到)
+	Invoicing        float64   `gorm:"column:invoicing"`                      // 开票中金额(3.0暂未用到)
+	Recharging       float64   `gorm:"column:recharging"`                     // 充值中金额(3.0暂未用到)
+	CreatedAt        time.Time `gorm:"column:created_at"`                     // 创建时间
+	UpdatedAt        time.Time `gorm:"column:updated_at"`                     // 更新时间
+	AuthStatus       int       `gorm:"column:auth_status;default:0;NOT NULL"` // 商家认证状态,0未认证,1已认证
+	Avatar           string    `gorm:"column:avatar;NOT NULL"`                // 头像
+	Phone            string    `gorm:"column:phone;NOT NULL"`                 // 手机号
+	ContactPhone     string    `gorm:"column:contact_phone"`                  // 联系方式手机(不一定是绑定的手机号)
+	WechatNumber     string    `gorm:"column:wechat_number"`                  // 微信号
+	WechatQrCode     string    `gorm:"column:wechat_qr_code"`                 // 微信二维码
+	BusinessLicense  string    `gorm:"column:business_license"`               // 营业执照url
+	Usci             string    `gorm:"column:usci"`                           // 统一社会信用代码
+	EnterpriseName   string    `gorm:"column:enterprise_name"`                // 商家用户名称
 }
 
 func (m *Enterprise) TableName() string {

+ 5 - 0
model/gorm_model/sub_account.go

@@ -9,6 +9,11 @@ type YounggeeSubAccount struct {
 	AccountStatus  int    `gorm:"column:account_status"`                            // 账号状态,1为正常,2为停用
 	UserId         int    `gorm:"column:user_id"`                                   // 用户表中ID
 	SubAccountType int    `gorm:"column:sub_account_type"`                          // 子账号类型,1为商家端子账号,2为管理后台子账号
+	SupplierId     int    `gorm:"column:supplier_id"`                               // 所属服务商ID
+	Avatar         string `gorm:"column:avatar"`                                    // 头像
+	ContactPhone   string `gorm:"column:contact_phone"`                             // 联系电话
+	WechatNumber   string `gorm:"column:wechat_number"`                             // 微信号
+	WechatQRCode   string `gorm:"column:wechat_qr_code"`                            // 微信二维码url
 }
 
 func (m *YounggeeSubAccount) TableName() string {

+ 25 - 0
model/http_model/get_account_info.go

@@ -0,0 +1,25 @@
+package http_model
+
+type GetAccountInfoRequest struct {
+	EnterpriseId string `json:"enterprise_id"`  // 商家ID
+	SubAccountId int    `json:"sub_account_id"` // 子账号ID
+}
+
+type GetAccountInfoData struct {
+	Type           int    `json:"type"`             // 账号类型,1主账号,2子账号
+	Phone          string `json:"phone"`            // 绑定手机号
+	EnterpriseName string `json:"enterprise_name"`  // 商家名称
+	Avatar         string `json:"avatar"`           // 头像url
+	SubAccountName string `json:"sub_account_name"` // 子账号名称
+	JobName        string `json:"job_name"`         // 子账号岗位名称
+}
+
+func NewGetAccountInfoRequest() *GetAccountInfoRequest {
+	return new(GetAccountInfoRequest)
+}
+
+func NewGetAccountInfoResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(GetAccountInfoData)
+	return resp
+}

+ 22 - 0
model/http_model/get_contact_info.go

@@ -0,0 +1,22 @@
+package http_model
+
+type GetContactInfoRequest struct {
+	EnterpriseId string `json:"enterprise_id"`  // 商家ID
+	SubAccountId int    `json:"sub_account_id"` // 子账号ID
+}
+
+type GetContactInfoData struct {
+	ContactPhone string `json:"contact_phone"`  // 联系电话
+	WechatNumber string `json:"wechat_number"`  // 微信号
+	WechatQRCode string `json:"wechat_qr_code"` // 微信二维码
+}
+
+func NewGetContactInfoRequest() *GetContactInfoRequest {
+	return new(GetContactInfoRequest)
+}
+
+func NewGetContactInfoResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(GetContactInfoData)
+	return resp
+}

+ 23 - 0
model/http_model/get_review_info.go

@@ -0,0 +1,23 @@
+package http_model
+
+type GetReviewInfoRequest struct {
+	EnterpriseId string `json:"enterprise_id"` // 商家ID
+}
+
+type GetReviewInfoData struct {
+	ReviewType      int    `json:"review_type"`      // 认证方式,1营业执照认证,2其他
+	ReviewStatus    int    `json:"review_status"`    // 认证状态,1未认证,2已认证
+	USCI            string `json:"usci"`             // 统一社会信用代码
+	CompanyName     string `json:"company_name"`     // 公司名称
+	BusinessLicense string `json:"business_license"` // 营业执照url
+}
+
+func NewGetReviewInfoRequest() *GetReviewInfoRequest {
+	return new(GetReviewInfoRequest)
+}
+
+func NewGetReviewInfoResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(GetReviewInfoData)
+	return resp
+}

+ 28 - 0
model/http_model/update_account_info.go

@@ -0,0 +1,28 @@
+package http_model
+
+type UpdateAccountInfoRequest struct {
+	EnterpriseId   string `json:"enterprise_id"`    // 商家ID
+	SubAccountId   int    `json:"sub_account_id"`   // 子账号ID
+	Phone          string `json:"phone"`            // 绑定手机号
+	Code           string `json:"code"`             // 验证码
+	EnterpriseName string `json:"enterprise_name"`  // 商家名称
+	Avatar         string `json:"avatar"`           // 头像url
+	SubAccountName string `json:"sub_account_name"` // 子账号名称
+}
+
+type UpdateAccountInfoData struct {
+	Phone          string `json:"phone"`            // 绑定手机号
+	EnterpriseName string `json:"enterprise_name"`  // 商家名称
+	Avatar         string `json:"avatar"`           // 头像url
+	SubAccountName string `json:"sub_account_name"` // 子账号名称
+}
+
+func NewUpdateAccountInfoRequest() *UpdateAccountInfoRequest {
+	return new(UpdateAccountInfoRequest)
+}
+
+func NewUpdateAccountInfoResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(UpdateAccountInfoData)
+	return resp
+}

+ 26 - 0
model/http_model/update_contact_info.go

@@ -0,0 +1,26 @@
+package http_model
+
+type UpdateContactInfoRequest struct {
+	EnterpriseId string `json:"enterprise_id"`  // 商家ID
+	SubAccountId int    `json:"sub_account_id"` // 子账号ID
+	ContactPhone string `json:"contact_phone"`  // 联系电话
+	WechatNumber string `json:"wechat_number"`  // 微信号
+	WechatQRCode string `json:"wechat_qr_code"` // 微信二维码
+	Code         string `json:"code"`           // 验证码
+}
+
+type UpdateContactInfoData struct {
+	ContactPhone string `json:"contact_phone"`  // 联系电话
+	WechatNumber string `json:"wechat_number"`  // 微信号
+	WechatQRCode string `json:"wechat_qr_code"` // 微信二维码
+}
+
+func NewUpdateContactInfoRequest() *UpdateContactInfoRequest {
+	return new(UpdateContactInfoRequest)
+}
+
+func NewUpdateContactInfoResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(UpdateContactInfoData)
+	return resp
+}

+ 18 - 13
route/init.go

@@ -15,18 +15,23 @@ func InitRoute(r *gin.Engine) {
 	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
 	business := r.Group("/youngee")
 	{
-		//business.POST("/register", handler.WrapRegisterHandler)                   // 商家主账号注册
-		business.POST("/addNewSubAccount", handler.WrapAddNewSubAccountHandler)   // 商家子账号注册
-		business.POST("/findAllSubAccount", handler.WrapFindAllSubAccountHandler) // 查找商家全部所属子账号
-		business.POST("/deleteSubAccount", handler.WrapDeleteSubAccountHandler)   // 删除商家子账号
-		// business.POST("/updateSubAccount", handler.WrapUpdateSubAccountHandler)   // 修改商家子账号
-		business.POST("/findAllJob", handler.WrapFindAllJobHandler)   // 查找商家全部所属岗位
-		business.POST("/addNewJob", handler.WrapaddNewJobHandler)     // 商家新增岗位
-		business.POST("/updateJob", handler.WrapupdateJobHandler)     // 商家修改岗位
-		business.POST("/deleteJob", handler.WrapdeleteJobHandler)     // 商家删除岗位
-		business.POST("/sendCode", handler.WrapSendCodeHandler)       // 发送登录验证码
-		business.POST("/login", handler.WrapCodeLoginHandler)         // 商家登录
-		business.POST("/getUserInfo", handler.WrapGetUserInfoHandler) // 商家用户信息
+		business.POST("/register", handler.WrapRegisterHandler)                    // 商家主账号注册
+		business.POST("/sendCode", handler.WrapSendCodeHandler)                    // 发送登录验证码
+		business.POST("/login", handler.WrapCodeLoginHandler)                      // 商家登录
+		business.POST("/subAccount/create", handler.WrapAddNewSubAccountHandler)   // 商家子账号注册
+		business.POST("/subAccount/get", handler.WrapFindAllSubAccountHandler)     // 查找商家全部所属子账号
+		business.POST("/subAccount/delete", handler.WrapDeleteSubAccountHandler)   // 删除商家子账号
+		business.POST("/subAccount/update", handler.WrapFindAllSubAccountHandler)  // 修改商家子账号
+		business.POST("/job/get", handler.WrapFindAllJobHandler)                   // 查找商家全部所属岗位
+		business.POST("/job/create", handler.WrapaddNewJobHandler)                 // 商家新增岗位
+		business.POST("/job/update", handler.WrapupdateJobHandler)                 // 商家修改岗位
+		business.POST("/job/delete", handler.WrapdeleteJobHandler)                 // 商家删除岗位
+		business.POST("/getUserInfo", handler.WrapGetUserInfoHandler)              // 商家用户信息
+		business.POST("/accountInfo/get", handler.WrapGetAccountInfoHandler)       // 账号管理-账号信息查询
+		business.POST("/accountInfo/update", handler.WrapUpdateAccountInfoHandler) // 账号管理-账号信息更新
+		business.POST("/reviewInfo/get", handler.WrapGetReviewInfoHandler)         // 账号管理-认证信息查询
+		business.POST("/contactInfo/get", handler.WrapGetContactInfoHandler)       // 联系方式-查询
+		business.POST("/contactInfo/update", handler.WrapUpdateContactInfoHandler) // 联系方式-更新
 		business.GET("/test/ping", func(c *gin.Context) {
 			resp := http_model.CommonResponse{
 				Status:  20000,
@@ -180,7 +185,6 @@ func InitRoute(r *gin.Engine) {
 		workspace.POST("/warehouseInvite", controller.WorkspaceController{}.GetWarehouseInvite) // 合作待办-入库邀约
 		// 财务待办
 		workspace.POST("/finance", controller.WorkspaceController{}.GetFinance) // 财务待办-充值与发票
-
 	}
 	// 任务中心相关接口
 	task := r.Group("/youngee/b/task")
@@ -310,6 +314,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)                               // 创建物流信息
 

+ 107 - 32
service/enterprise.go

@@ -70,7 +70,7 @@ func (*enterprise) CreateEnterpriseUser(ctx context.Context, newEnterprise http_
 }
 
 func (*enterprise) CreateEnterprise(ctx context.Context, phone string) (*http_model.RegisterData, error) {
-	user := gorm_model.YounggeeUser{
+	userInfo := gorm_model.YounggeeUser{
 		Phone:         phone,
 		User:          "1001",
 		Username:      phone,
@@ -80,10 +80,10 @@ func (*enterprise) CreateEnterprise(ctx context.Context, phone string) (*http_mo
 		Email:         "",
 		LastLoginTime: time.Now().UTC().Local(),
 	}
-	userId, err := db.CreateUser(ctx, user)
-	if err != nil {
-		log.Infof("[CreateEnterpriseUser] fail,err:%+v", err)
-		return nil, err
+	userId, createUserErr := db.CreateUser(ctx, userInfo)
+	if createUserErr != nil {
+		log.Infof("[CreateEnterpriseUser] fail,err:%+v", createUserErr)
+		return nil, createUserErr
 	} else {
 		rand.Seed(time.Now().UnixNano())
 		th := conv.MustString(time.Now().Hour())
@@ -95,7 +95,7 @@ func (*enterprise) CreateEnterprise(ctx context.Context, phone string) (*http_mo
 			th = "0" + th
 		}
 		ShowEnterpriseID := "1" + th + tm + conv.MustString(rand.Intn(10000-1000)+1000)
-		enterprise := &gorm_model.Enterprise{
+		enterpriseInfo := &gorm_model.Enterprise{
 			EnterpriseID:     ShowEnterpriseID,
 			Industry:         1,
 			BusinessName:     phone,
@@ -103,11 +103,12 @@ func (*enterprise) CreateEnterprise(ctx context.Context, phone string) (*http_mo
 			Balance:          0,
 			FrozenBalance:    0,
 			AvailableBalance: 0,
+			Phone:            phone,
 		}
-		enterpriseId, err := db.CreateEnterprise(ctx, *enterprise)
-		if err != nil {
-			log.Infof("[CreateEnterpriseUser] fail,err:%+v", err)
-			return nil, err
+		enterpriseId, createEnterpriseErr := db.CreateEnterprise(ctx, *enterpriseInfo)
+		if createEnterpriseErr != nil {
+			log.Infof("[CreateEnterpriseUser] fail,err:%+v", createEnterpriseErr)
+			return nil, createEnterpriseErr
 		}
 		res := &http_model.RegisterData{
 			EnterpriseId: *enterpriseId,
@@ -117,30 +118,104 @@ func (*enterprise) CreateEnterprise(ctx context.Context, phone string) (*http_mo
 	}
 }
 
-// CreateEnterpriseSubUser ToDo
-// CreateEnterpriseSubUser 创建商家子账号
-func (*enterprise) CreateEnterpriseSubUser(ctx context.Context, newEnterprise http_model.RegisterRequest) (*http_model.RegisterData, error) {
-	// 1. 新建User
-	user := gorm_model.YounggeeUser{
-		Phone:         newEnterprise.Phone,
-		User:          "1001",
-		Username:      newEnterprise.BusinessName,
-		Password:      "1001",
-		RealName:      newEnterprise.RealName,
-		Role:          "3",
-		Email:         newEnterprise.Email,
-		LastLoginTime: time.Now().UTC().Local(),
+// GetEnterpriseAccountInfo 查询商家账号信息
+func (*enterprise) GetEnterpriseAccountInfo(ctx context.Context, req *http_model.GetAccountInfoRequest) (*http_model.GetAccountInfoData, error) {
+
+	var enterpriseUserInfo *http_model.GetAccountInfoData
+	enterpriseUserInfo = &http_model.GetAccountInfoData{}
+
+	if req.SubAccountId == 0 {
+		// 1. 商家主账号
+		enterpriseInfo, enterpriseInfoErr := db.GetEnterpriseByEnterpriseID(ctx, req.EnterpriseId)
+		if enterpriseInfoErr != nil {
+			log.Infof("[GetSupplierAccountInfo] fail,err:%+v", enterpriseInfoErr)
+			return nil, enterpriseInfoErr
+		}
+		if enterpriseInfo != nil {
+			enterpriseUserInfo.EnterpriseName = enterpriseInfo.EnterpriseName
+			enterpriseUserInfo.Type = 1
+			enterpriseUserInfo.Avatar = enterpriseInfo.Avatar
+			enterpriseUserInfo.Phone = enterpriseInfo.Phone
+		}
+	} else {
+		// 2. 商家子账号
+		subAccountInfo, subAccountInfoErr := db.FindSubAccountById(ctx, req.SubAccountId)
+		if subAccountInfoErr != nil {
+			log.Infof("[GetSupplierAccountInfo] fail,err:%+v", subAccountInfoErr)
+			return nil, subAccountInfoErr
+		}
+		if subAccountInfo != nil {
+			enterpriseUserInfo.SubAccountName = subAccountInfo.SubAccountName
+			enterpriseUserInfo.Type = 2
+			enterpriseUserInfo.Avatar = subAccountInfo.Avatar
+			enterpriseUserInfo.Phone = subAccountInfo.PhoneNumber
+			jobInfo, jobInfoErr := db.FindJobByJobId(ctx, subAccountInfo.JobId)
+			if jobInfoErr != nil {
+				log.Infof("[GetSupplierAccountInfo] fail,err:%+v", jobInfoErr)
+				return nil, subAccountInfoErr
+			}
+			if jobInfo != nil {
+				enterpriseUserInfo.JobName = jobInfo.JobName
+			}
+		}
 	}
-	userId, err := db.CreateUser(ctx, user)
+	return enterpriseUserInfo, nil
+}
 
-	// 2. 新建商家子账号
-	if err != nil {
-		log.Infof("[CreateEnterpriseUser] fail,err:%+v", err)
-		fmt.Println("User创建失败")
-		return nil, err
+// GetEnterpriseReviewInfo 查询商家认证信息
+func (*enterprise) GetEnterpriseReviewInfo(ctx context.Context, req *http_model.GetReviewInfoRequest) (*http_model.GetReviewInfoData, error) {
+
+	var enterpriseUserInfo *http_model.GetReviewInfoData
+	enterpriseUserInfo = &http_model.GetReviewInfoData{}
+
+	enterpriseInfo, enterpriseInfoErr := db.GetEnterpriseByEnterpriseID(ctx, req.EnterpriseId)
+	if enterpriseInfoErr != nil {
+		log.Infof("[GetEnterpriseByEnterpriseID] fail,err:%+v", enterpriseInfoErr)
+		return nil, enterpriseInfoErr
+	}
+	if enterpriseInfo != nil {
+		enterpriseUserInfo.ReviewType = 1
+		if enterpriseInfo.AuthStatus == 1 {
+			enterpriseUserInfo.ReviewStatus = 2
+		} else {
+			enterpriseUserInfo.ReviewStatus = 1
+		}
+		enterpriseUserInfo.BusinessLicense = enterpriseInfo.BusinessLicense
+		enterpriseUserInfo.USCI = enterpriseInfo.Usci
+		enterpriseUserInfo.CompanyName = enterpriseInfo.BusinessName
+	}
+	return enterpriseUserInfo, nil
+}
+
+// GetEnterpriseContactInfo 查询商家联系方式
+func (*enterprise) GetEnterpriseContactInfo(ctx context.Context, req *http_model.GetContactInfoRequest) (*http_model.GetContactInfoData, error) {
+
+	var contactInfo *http_model.GetContactInfoData
+	contactInfo = &http_model.GetContactInfoData{}
+	// 1. 商家主账号
+	if req.SubAccountId == 0 {
+		enterpriseInfo, enterpriseInfoErr := db.GetEnterpriseByEnterpriseID(ctx, req.EnterpriseId)
+		if enterpriseInfoErr != nil {
+			log.Infof("[enterpriseInfoErr] fail,err:%+v", enterpriseInfoErr)
+			return nil, enterpriseInfoErr
+		}
+		if enterpriseInfo != nil {
+			contactInfo.ContactPhone = enterpriseInfo.ContactPhone
+			contactInfo.WechatQRCode = enterpriseInfo.WechatQrCode
+			contactInfo.WechatNumber = enterpriseInfo.WechatNumber
+		}
 	} else {
-		fmt.Println("User创建成功,开始创建商家子账号")
-		fmt.Println(userId)
+		// 2. 商家子账号
+		subAccountInfo, subAccountInfoErr := db.FindSubAccountById(ctx, req.SubAccountId)
+		if subAccountInfoErr != nil {
+			log.Infof("[GetSupplierContactInfo] fail,err:%+v", subAccountInfoErr)
+			return nil, subAccountInfoErr
+		}
+		if subAccountInfo != nil {
+			contactInfo.ContactPhone = subAccountInfo.ContactPhone
+			contactInfo.WechatQRCode = subAccountInfo.WechatQRCode
+			contactInfo.WechatNumber = subAccountInfo.WechatNumber
+		}
 	}
-	return nil, err
+	return contactInfo, nil
 }

+ 219 - 0
service/login_auth.go

@@ -338,3 +338,222 @@ func (l *loginAuth) SubAccountAuthCode(ctx context.Context, req *http_model.AddN
 	}
 	return 0, nil
 }
+
+// UpdateEnterpriseAccountInfo 更新商家账号信息
+func (l *loginAuth) UpdateEnterpriseAccountInfo(ctx context.Context, req *http_model.UpdateAccountInfoRequest) (*http_model.UpdateAccountInfoData, int, error) {
+
+	var supplierUserInfo *http_model.UpdateAccountInfoData
+	supplierUserInfo = &http_model.UpdateAccountInfoData{}
+	supplierUserInfo.EnterpriseName = req.EnterpriseName
+	supplierUserInfo.Avatar = req.Avatar
+	supplierUserInfo.Phone = req.Phone
+	supplierUserInfo.SubAccountName = req.SubAccountName
+
+	if req.SubAccountId == 0 {
+		// 商家主账号
+		// 1. 若修改绑定手机号
+		if req.Phone != "" {
+			// 1.1. 校验验证码
+			vCode, err := l.getSessionCode(ctx, req.Phone)
+			if err != nil {
+				return nil, 0, err
+			}
+			if vCode != req.Code {
+				return nil, 1, nil
+			}
+			// 1.2. 手机号是否已经被其他主账号绑定
+			enterpriseNum, enterpriseNumErr := db.CountEnterpriseUserByPhone(ctx, req.Phone)
+			if enterpriseNumErr != nil {
+				// log.Infof("[GetSupplierAccountInfo] fail,err:%+v", supplierNumErr)
+				return nil, 0, enterpriseNumErr
+			}
+			if enterpriseNum != 0 {
+				return nil, 2, nil
+			}
+			// 1.3. 手机号是否被子账号绑定
+			subAccountNum, SubAccountErr := db.CountSubAccountUserByPhone(ctx, req.Phone)
+			if SubAccountErr != nil {
+				// log.Infof("[GetSupplierAccountInfo] fail,err:%+v", SubAccountErr)
+				return nil, 0, SubAccountErr
+			}
+			if subAccountNum != 0 {
+				return nil, 3, nil
+			}
+			// 1.4. 修改Enterprise信息
+			var enterpriseInfo *gorm_model.Enterprise
+			enterpriseInfo = &gorm_model.Enterprise{}
+			enterpriseInfo.EnterpriseID = req.EnterpriseId
+			enterpriseInfo.EnterpriseName = req.EnterpriseName
+			enterpriseInfo.Avatar = req.Avatar
+			enterpriseInfo.Phone = req.Phone
+			updateEnterpriseErr := db.UpdateEnterpriseById(ctx, enterpriseInfo)
+			if updateEnterpriseErr != nil {
+				// log.Infof("[GetSupplierAccountInfo] fail,err:%+v", updateEnterpriseErr)
+				return nil, 0, updateEnterpriseErr
+			}
+			// 1.5. 修改User表信息
+			enterpriseInfoQuery, enterpriseInfoQueryErr := db.GetEnterpriseByEnterpriseID(ctx, enterpriseInfo.EnterpriseID)
+			if enterpriseInfoQueryErr != nil {
+				// log.Infof("[GetSupplierAccountInfo] fail,err:%+v", supplierInfoQueryErr)
+				return nil, 0, enterpriseInfoQueryErr
+			}
+			if enterpriseInfoQuery != nil {
+				var userInfo *gorm_model.YounggeeUser
+				userInfo = &gorm_model.YounggeeUser{}
+				userInfo.ID = enterpriseInfoQuery.UserID
+				userInfo.Phone = enterpriseInfoQuery.Phone
+				userInfo.Username = enterpriseInfoQuery.Phone
+				updateUserInfoErr := db.UpdateUserById(ctx, userInfo)
+				if updateUserInfoErr != nil {
+					// log.Infof("[GetSupplierAccountInfo] fail,err:%+v", updateUserInfoErr)
+					return nil, 0, updateUserInfoErr
+				}
+			}
+
+		} else {
+			var enterpriseInfo *gorm_model.Enterprise
+			enterpriseInfo = &gorm_model.Enterprise{}
+			enterpriseInfo.EnterpriseID = req.EnterpriseId
+			enterpriseInfo.EnterpriseName = req.EnterpriseName
+			enterpriseInfo.Avatar = req.Avatar
+			enterpriseInfo.Phone = req.Phone
+			updateEnterpriseErr := db.UpdateEnterpriseById(ctx, enterpriseInfo)
+			if updateEnterpriseErr != nil {
+				// log.Infof("[GetSupplierAccountInfo] fail,err:%+v", updateEnterpriseErr)
+				return nil, 0, updateEnterpriseErr
+			}
+		}
+	} else {
+		// 商家子账号
+		var subAccountInfo *gorm_model.YounggeeSubAccount
+		subAccountInfo = &gorm_model.YounggeeSubAccount{}
+		subAccountInfo.SubAccountType = 3
+		subAccountInfo.EnterpriseId = req.EnterpriseId
+		subAccountInfo.SubAccountId = req.SubAccountId
+		subAccountInfo.SubAccountName = req.SubAccountName
+		subAccountInfo.Avatar = req.Avatar
+		subAccountInfo.PhoneNumber = req.Phone
+		updateSubAccountErr := db.UpdateSubAccount(ctx, subAccountInfo)
+		if updateSubAccountErr != nil {
+			// log.Infof("[GetSupplierAccountInfo] fail,err:%+v", updateSubAccountErr)
+			return nil, 0, updateSubAccountErr
+		}
+	}
+	return supplierUserInfo, 0, nil
+}
+
+// UpdateEnterpriseContactInfo 更新商家联系方式
+func (l *loginAuth) UpdateEnterpriseContactInfo(ctx context.Context, req *http_model.UpdateContactInfoRequest) (*http_model.UpdateContactInfoData, bool, error) {
+
+	var contactInfo *http_model.UpdateContactInfoData
+	contactInfo = &http_model.UpdateContactInfoData{}
+
+	// 主账号
+	if req.SubAccountId == 0 {
+		// 1. 若更新联系电话则需要验证码校验
+		if req.ContactPhone != "" {
+			vcode, err := l.getSessionCode(ctx, req.ContactPhone)
+			if err != nil {
+				return nil, false, err
+			}
+			// fmt.Printf("缓存的验证码 vcode: %v,实际填入的 code:%v", vcode, req.Code)
+			if vcode != req.Code {
+				// 验证码错误
+				return nil, true, err
+			}
+			var enterpriseInfo *gorm_model.Enterprise
+			enterpriseInfo = &gorm_model.Enterprise{}
+			enterpriseInfo.ContactPhone = req.ContactPhone
+			enterpriseInfo.EnterpriseID = req.EnterpriseId
+			updateEnterpriseErr := db.UpdateEnterpriseById(ctx, enterpriseInfo)
+			if updateEnterpriseErr != nil {
+				// log.Infof("[updateEnterpriseErr] fail,err:%+v", updateEnterpriseErr)
+				return nil, false, updateEnterpriseErr
+			}
+			contactInfo.ContactPhone = req.ContactPhone
+		}
+
+		// 2. 微信二维码更新
+		if req.WechatQRCode != "" {
+			var enterpriseInfo *gorm_model.Enterprise
+			enterpriseInfo = &gorm_model.Enterprise{}
+			enterpriseInfo.WechatQrCode = req.WechatQRCode
+			enterpriseInfo.EnterpriseID = req.EnterpriseId
+			updateEnterpriseErr := db.UpdateEnterpriseById(ctx, enterpriseInfo)
+			if updateEnterpriseErr != nil {
+				// log.Infof("[UpdateSupplierContactInfo] fail,err:%+v", updateEnterpriseErr)
+				return nil, false, updateEnterpriseErr
+			}
+			contactInfo.WechatQRCode = req.WechatQRCode
+
+		}
+
+		// 2. 微信号码更新
+		if req.WechatNumber != "" {
+			var enterpriseInfo *gorm_model.Enterprise
+			enterpriseInfo = &gorm_model.Enterprise{}
+			enterpriseInfo.WechatNumber = req.WechatNumber
+			enterpriseInfo.EnterpriseID = req.EnterpriseId
+			updateEnterpriseErr := db.UpdateEnterpriseById(ctx, enterpriseInfo)
+			if updateEnterpriseErr != nil {
+				// log.Infof("[UpdateSupplierContactInfo] fail,err:%+v", updateEnterpriseErr)
+				return nil, false, updateEnterpriseErr
+			}
+			contactInfo.WechatNumber = req.WechatNumber
+		}
+	} else {
+		// 子账号
+		// 1. 若更新联系电话则需要验证码校验
+		if req.ContactPhone != "" {
+			vcode, err := l.getSessionCode(ctx, req.ContactPhone)
+			if err != nil {
+				return nil, false, err
+			}
+			// fmt.Printf("缓存的验证码 vcode: %v,实际填入的 code:%v", vcode, req.Code)
+			if vcode != req.Code {
+				// 验证码错误
+				return nil, true, err
+			}
+			var subAccountInfo *gorm_model.YounggeeSubAccount
+			subAccountInfo = &gorm_model.YounggeeSubAccount{}
+			subAccountInfo.ContactPhone = req.ContactPhone
+			subAccountInfo.SubAccountId = req.SubAccountId
+			updateSupplierErr := db.UpdateSubAccount(ctx, subAccountInfo)
+			if updateSupplierErr != nil {
+				// log.Infof("[UpdateSupplierContactInfo] fail,err:%+v", updateSupplierErr)
+				return nil, false, updateSupplierErr
+			}
+			contactInfo.ContactPhone = req.ContactPhone
+		}
+
+		// 2. 微信二维码更新
+		if req.WechatQRCode != "" {
+			var subAccountInfo *gorm_model.YounggeeSubAccount
+			subAccountInfo = &gorm_model.YounggeeSubAccount{}
+			subAccountInfo.WechatQRCode = req.WechatQRCode
+			subAccountInfo.SubAccountId = req.SubAccountId
+			updateSupplierErr := db.UpdateSubAccount(ctx, subAccountInfo)
+			if updateSupplierErr != nil {
+				// log.Infof("[UpdateSupplierContactInfo] fail,err:%+v", updateSupplierErr)
+				return nil, false, updateSupplierErr
+			}
+			contactInfo.WechatQRCode = req.WechatQRCode
+
+		}
+
+		// 2. 微信号码更新
+		if req.WechatNumber != "" {
+			var subAccountInfo *gorm_model.YounggeeSubAccount
+			subAccountInfo = &gorm_model.YounggeeSubAccount{}
+			subAccountInfo.WechatNumber = req.WechatNumber
+			subAccountInfo.SubAccountId = req.SubAccountId
+			updateSupplierErr := db.UpdateSubAccount(ctx, subAccountInfo)
+			if updateSupplierErr != nil {
+				// log.Infof("[UpdateSupplierContactInfo] fail,err:%+v", updateSupplierErr)
+				return nil, false, updateSupplierErr
+			}
+			contactInfo.WechatNumber = req.WechatNumber
+		}
+	}
+	return contactInfo, true, nil
+}

+ 6 - 6
service/sub_account.go

@@ -52,12 +52,12 @@ func (*subaccount) CreateSubAccount(ctx context.Context, request *http_model.Add
 }
 
 // UpdateSubAccount 修改子账号信息
-func (*subaccount) UpdateSubAccount(ctx context.Context, request http_model.UpdateJobRequest) error {
-	var newSubAccount = gorm_model.YounggeeSubAccount{}
-	err := db.UpdateSubAccount(ctx, newSubAccount)
-	if err != nil {
-		return err
-	}
+func (*subaccount) UpdateSubAccount(ctx context.Context, request *http_model.UpdateJobRequest) error {
+	//var newSubAccount = gorm_model.YounggeeSubAccount{}
+	//err := db.UpdateSubAccount(ctx, newSubAccount)
+	//if err != nil {
+	//	return err
+	//}
 	return nil
 }