Browse Source

first commit

Xingyu Xian 6 months ago
commit
d128f7f12b
100 changed files with 12213 additions and 0 deletions
  1. 3 0
      .gitignore
  2. 28 0
      apiclient_key.pem
  3. 18 0
      config/dev.yaml
  4. 47 0
      config/init.go
  5. 6 0
      config/mail.json
  6. 36 0
      config/pro.yaml
  7. 28 0
      consts/error_code.go
  8. 27 0
      consts/invoice.go
  9. 20 0
      consts/platform.go
  10. 31 0
      consts/product.go
  11. 95 0
      consts/project.go
  12. 6 0
      consts/session.go
  13. 42 0
      core/escape.go
  14. 208 0
      core/signer.go
  15. 135 0
      db/Settle.go
  16. 21 0
      db/auto_default.go
  17. 146 0
      db/auto_task.go
  18. 93 0
      db/cooperate.go
  19. 319 0
      db/data.go
  20. 448 0
      db/default.go
  21. 217 0
      db/enterprise.go
  22. 299 0
      db/finish.go
  23. 43 0
      db/info_pricing_strategy.go
  24. 29 0
      db/init.go
  25. 242 0
      db/invoice.go
  26. 75 0
      db/job.go
  27. 291 0
      db/link.go
  28. 312 0
      db/logistics.go
  29. 101 0
      db/message.go
  30. 368 0
      db/number_info.go
  31. 59 0
      db/pay_record.go
  32. 195 0
      db/product.go
  33. 34 0
      db/product_photo.go
  34. 335 0
      db/project.go
  35. 32 0
      db/project_photo.go
  36. 69 0
      db/recruit_strategy.go
  37. 177 0
      db/s_project.go
  38. 281 0
      db/script.go
  39. 307 0
      db/sectask.go
  40. 39 0
      db/sectask_logistics.go
  41. 316 0
      db/selection.go
  42. 313 0
      db/sketch.go
  43. 16 0
      db/sketch_photo.go
  44. 73 0
      db/sub_account.go
  45. 32 0
      db/supplier.go
  46. 55 0
      db/supplier_income.go
  47. 63 0
      db/supplier_invoice.go
  48. 16 0
      db/supplier_withdraw.go
  49. 32 0
      db/talent_income.go
  50. 411 0
      db/task.go
  51. 24 0
      db/task_log.go
  52. 84 0
      db/terminate.go
  53. 73 0
      db/user.go
  54. 194 0
      db/workspace.go
  55. 24 0
      dockerfile
  56. 890 0
      docs/docs.go
  57. 862 0
      docs/swagger.json
  58. 566 0
      docs/swagger.yaml
  59. 41 0
      go.mod
  60. 317 0
      go.sum
  61. 60 0
      handler/CreateSecTaskLogistics.go
  62. 62 0
      handler/CreateSelection.go
  63. 61 0
      handler/GetSecTaskList.go
  64. 59 0
      handler/GetServiceFee.go
  65. 59 0
      handler/GetSpecialDataNumber.go
  66. 59 0
      handler/GetSpecialFinishData.go
  67. 59 0
      handler/GetSpecialInviteNumber.go
  68. 59 0
      handler/GetSpecialLinkNumber.go
  69. 59 0
      handler/GetSpecialReviewNumber.go
  70. 61 0
      handler/PassSecTaskCoop.go
  71. 62 0
      handler/PaySelection.go
  72. 61 0
      handler/RefuseSecTaskCoop.go
  73. 61 0
      handler/SettleSecTask.go
  74. 77 0
      handler/SpecialTaskDataList.go
  75. 76 0
      handler/SpecialTaskFinishData.go
  76. 65 0
      handler/SpecialTaskFinishDataList.go
  77. 73 0
      handler/SpecialTaskInviteList.go
  78. 73 0
      handler/SpecialTaskLinkList.go
  79. 71 0
      handler/SpecialTaskScriptList.go
  80. 74 0
      handler/SpecialTaskSketchList.go
  81. 60 0
      handler/UpdateSecTaskLogistics.go
  82. 62 0
      handler/UpdateSelection.go
  83. 60 0
      handler/WorkspaceDDLproject.go
  84. 59 0
      handler/accept_data.go
  85. 60 0
      handler/accept_link.go
  86. 90 0
      handler/accept_script.go
  87. 89 0
      handler/accept_sketch.go
  88. 61 0
      handler/addInvoiceRecord.go
  89. 52 0
      handler/addNewJob.go
  90. 71 0
      handler/addNewSubAccount.go
  91. 60 0
      handler/addReceiveAddress.go
  92. 60 0
      handler/addReceiveInfo.go
  93. 66 0
      handler/add_to_list.go
  94. 48 0
      handler/agree_enterprise_cooperate.go
  95. 49 0
      handler/base.go
  96. 75 0
      handler/code_login.go
  97. 72 0
      handler/createSpecialLogistics.go
  98. 56 0
      handler/create_supplier_invoice.go
  99. 49 0
      handler/create_supplier_withdraw.go
  100. 59 0
      handler/data_number_info.go

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+.idea/
+.vscode/
+output/

+ 28 - 0
apiclient_key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDiS0mOMU85JaH1
+nRsOU57TfKP+3ma7TiEe2jQNHhF1UUW8i1+Hc1NeLe7dh29J5aEa/isu0RG2LHjY
+P73dzPkarAdhmW3ETsbBVazUw7RfhbPawR6EjBArRAojqHLXdSTFeDM6LtmwbWD2
+JEjiBKyTMtsbnap4ubLhR03huPn8V20Hbq3Zg+U8T4XtnK7jrac2SqkuybKheRX8
+OzaefU/nYbxKwyTqKCanAs96ZTFuEceW9Utoa4jb4bqdVVhbc2P5gyyssKfYkfDj
+Pdr2X3vg11qq7bhjQ+xLgUiWwXlqnKY0eHxvx0Zdh5PWdh0oYZtbuHrkPPJaf4zu
+Zkre9VnXAgMBAAECggEASPlaWP5Ru+4E0n29UdtpZm3VPMVff5tsVtSq4GgH3Ts+
+L9UKE1X/Vmmdk9au7recQmYgatKE0ah5t9KmWbZVxmIfZzvhB+MXeRU1zM7nhb5K
+B4srWjcIp8sjMeiKUCy4lO10J5kgHiLHl9iPoEM9m6JUwg0QAipwIvGpjdbm1paH
+esqCyZ2+fyTypO1mkpPOOB6caGwePE0Ppd/U5woPKPS0H5JnBdKPWBh/XYkBigOl
+fMRjJg9BDGPjxI1Rt+F6S359fgfXZJV1m74YVL9HxgfKi+WHdDTtj0094NBqizCg
+goeLZbz6aWYbOBmpFHrK8F2i/pYU658KLCtjjpvnQQKBgQD6JJGRqqF1OLVsjJ+E
++8ts8IdC+OBYY9YHgLw5D2aFUrtJre9Fiktj0hupXPm+01kmc+5OupR3O/L8jhM6
++NTe3fmIzNLk72GeZsiWFrZCN0fKjts421wwyhBrqW/qZN66a1kYA7fvr0ToRjL1
+jLhTqu0a8BGRyaxbqlebo/5FkQKBgQDnl8MYmJoYpJ36WK3Bd1j/9eczDmRXf4RW
+kZjIOeXBN4zHZsvlFtMtcaZAw3Z1KPbM4ncuKwl+pc7oNUfOAU/IOiBEiZR7zSYG
+D8g+UoXfZzv5mFQQBSagfY4Q0bigG1Zt/QPMoN5setiG6BJ+bwN7WfXNjRjyaXtZ
+ovUUniFU5wKBgQDrvu0mcL6MIG7zp7Brf3bf6+w+lRmylBzRo2VBDZ+chTUXooJ/
+cm/M2ubQ/lwtmThLAjWVI0jq+qftl+TNzleo12DmqcsUkfrZc5sVwL/ytfDGGU7I
+TgybusQxA1YDfR9gZ+1msZJ3pSJ3GjnKq93IlK2zlo+oa34yQd8hQzRP0QKBgQDQ
+5TkbNHq6g7HjoJ2KBocGyd2zVeX4bpMGKuouoNq2v86CBh0gFMiDEyItBKIS59JF
+2Hg78qHr1M+e8IBGNzSpnJSCfb6rNM55ZT7vyCvs6QdWCaq5kIvY86dzUFhCQqZh
+K3mD2A8Itn4cobQcyzHOz8RBlmXMMo0Ku0xpPoE+PQKBgEFcy2wvv/saKJ+3t2Cw
+4ckwskhsQ2CizlAlTCNmBzou+IYfcg3VxS7P0EA/ViUXHTOx1pjhS977FLqJxe08
+FU7a3mIzzehJA0VnsZC6lzCqSRxdE4bcEs9Opw+sJS7abJKRU2QeZSJEChqAMUhJ
+3oP15BVjOfW79TL/hp8fRZAt
+-----END PRIVATE KEY-----

+ 18 - 0
config/dev.yaml

@@ -0,0 +1,18 @@
+mysql:
+  host: 1.92.142.62
+  port: 3306
+  user: root
+  password: Younggee_root_DB_123
+  database: youngmini
+
+redis:
+  host: 1.92.142.62
+  port: 6379
+  auth: younggeeRedis_123
+  database: 1
+
+server:
+  host: 0.0.0.0
+  port: 8688
+  session:
+    ttl: -1 # minute

+ 47 - 0
config/init.go

@@ -0,0 +1,47 @@
+package config
+
+import (
+	"fmt"
+	"io/ioutil"
+	"os"
+	"youngee_b_api/db"
+	"youngee_b_api/model/system_model"
+	"youngee_b_api/redis"
+	"youngee_b_api/service"
+
+	"gopkg.in/yaml.v2"
+)
+
+func Init() *system_model.Server {
+	config := new(system_model.Config)
+	env := getEnv()
+	configPath := fmt.Sprintf("./config/%s.yaml", env)
+
+	file, err := ioutil.ReadFile(configPath)
+	if err != nil {
+		panic(err)
+	}
+	//yaml文件内容影射到结构体中
+	err = yaml.Unmarshal(file, config)
+	if err != nil {
+		panic(err)
+	}
+	loadExternelConfig(config)
+	return config.Server
+}
+
+func loadExternelConfig(config *system_model.Config) {
+	db.Init(config.Mysql)
+	redis.Init(config.Redis)
+	service.LoginAuthInit(config.Server.Session)
+	service.SendCodeInit(config.Server.Session)
+	service.QrCodeInit(config.Server.Session)
+}
+
+func getEnv() string {
+	env := os.Getenv("youngee_env")
+	if env == "" {
+		env = "dev"
+	}
+	return env
+}

+ 6 - 0
config/mail.json

@@ -0,0 +1,6 @@
+{
+    "stmp_server": "smtp.qq.com",
+    "stmp_port": "587",
+    "stmp_user_name": "2467835131@qq.com",
+    "stmp_auth_token": "ptpajplrcfhneaaa"
+}

+ 36 - 0
config/pro.yaml

@@ -0,0 +1,36 @@
+# mysql:
+#   host: 192.168.0.165
+#   port: 3306
+#   user: test
+#   password: testDB_123
+#   database: youngmini
+#
+# redis:
+#   host: 139.9.53.143
+#   port: 6379
+#   auth: younggeeRedis_123
+#   database: 1
+#
+# server:
+#   host: 0.0.0.0
+#   port: 8688
+#   session:
+#     ttl: -1 #minute
+mysql:
+  host: 139.9.53.143
+  port: 3306
+  user: talent
+  password: talentDB_123
+  database: youngmini
+
+redis:
+  host: 139.9.53.143
+  port: 6379
+  auth: younggeeRedis_123
+  database: 1
+
+server:
+  host: 0.0.0.0
+  port: 8688
+  session:
+    ttl: -1 # minute

+ 28 - 0
consts/error_code.go

@@ -0,0 +1,28 @@
+package consts
+
+import "github.com/go-redis/redis/v8"
+
+var RedisNil = redis.Nil
+var errorCodeToastMap = map[int32]string{}
+
+const DefaultToast = ""
+
+const ErrorSuccess int32 = 0
+const ErrorNotLogin int32 = 4001
+const ErrorParamCheck int32 = 5001
+const ErrorInternal int32 = 5001
+
+func init() {
+	errorCodeToastMap[ErrorSuccess] = "请求成功"
+	errorCodeToastMap[ErrorNotLogin] = "请登录后操作"
+	errorCodeToastMap[ErrorParamCheck] = "参数有误"
+	errorCodeToastMap[ErrorInternal] = "网络错误"
+}
+
+func GetErrorToast(errorCode int32) string {
+	toast, contain := errorCodeToastMap[errorCode]
+	if contain {
+		return toast
+	}
+	return "网络错误,请稍后再试"
+}

+ 27 - 0
consts/invoice.go

@@ -0,0 +1,27 @@
+package consts
+
+var HeadTypeMap = map[string]string{
+	"1": "企业",
+	"2": "个人",
+}
+
+func GetHeadType(HeadType string) string {
+	toast, contain := HeadTypeMap[HeadType]
+	if contain {
+		return toast
+	}
+	return "未知"
+}
+
+var InvoiceTypeMap = map[string]string{
+	"1": "增值税专用发票",
+	"2": "增值税普通发票",
+}
+
+func GetInvoiceType(InvoiceType string) string {
+	toast, contain := InvoiceTypeMap[InvoiceType]
+	if contain {
+		return toast
+	}
+	return "未知"
+}

+ 20 - 0
consts/platform.go

@@ -0,0 +1,20 @@
+package consts
+
+var platformIconMap = map[int]string{
+	0: "https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/platformlogo/redbook.png",
+	1: "https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/platformlogo/redbook.png",
+	2: "https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/pingtai2.png",
+	3: "https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/lQLPDhrXwll1_OojIrB54K2_gW0cQQGOvh1TQE8B_34_35.png",
+	4: "https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/lQLPDhrXwll1_NcjI7AD0T3viYtxQwGOvh1SwG0A_35_35.png",
+	5: "https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/lQLPDhrXwll1_N8lJbAnowYY8vg2EwGOvh1MQAcA_37_37.png",
+	6: "https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/lQLPDhrXwll1_NomJrBzk2H1dD_6NwGOvh1TQE8A_38_38.png",
+	7: "https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/lQLPDhrXwll1_OglJrDwCzIdgTtsKQGOvh1TAG0A_38_37.png",
+}
+
+func GetPaltformIcon(platformId int) string {
+	icon, contain := platformIconMap[platformId]
+	if contain {
+		return icon
+	}
+	return ""
+}

+ 31 - 0
consts/product.go

@@ -0,0 +1,31 @@
+package consts
+
+var projectTypeMap = map[int64]string{
+	1:  "3C及电器",
+	2:  "食品饮料",
+	3:  "服装配饰",
+	4:  "医疗",
+	5:  "房地产",
+	6:  "家居建材",
+	7:  "教育培训",
+	8:  "出行旅游",
+	9:  "游戏",
+	10: "互联网平台",
+	11: "汽车",
+	12: "文体娱乐",
+	13: "影视传媒",
+	14: "线下店铺",
+	15: "软件服务",
+	16: "美妆",
+	17: "母婴宠物",
+	18: "日化",
+	19: "其他",
+}
+
+func GetProjectTypes(projectType int64) string {
+	toast, contain := projectTypeMap[projectType]
+	if contain {
+		return toast
+	}
+	return "未知"
+}

+ 95 - 0
consts/project.go

@@ -0,0 +1,95 @@
+package consts
+
+var projectStatusMap = map[int64]string{
+	1:  "创建中",
+	2:  "待审核",
+	3:  "审核通过",
+	4:  "招募中",
+	5:  "招募完毕",
+	6:  "待支付",
+	7:  "已支付",
+	8:  "失效",
+	9:  "执行中",
+	10: "已结案",
+}
+
+func GetProjectStatus(status int64) string {
+	toast, contain := projectStatusMap[status]
+	if contain {
+		return toast
+	}
+	return "未知"
+}
+
+var ProjectPlatformMap = map[int64]string{
+	1: "红book",
+	2: "抖音",
+	3: "微博",
+	4: "快手",
+	5: "b站",
+	6: "大众点评",
+	7: "知乎",
+}
+
+func GetProjectPlatform(status int64) string {
+	toast, contain := ProjectPlatformMap[status]
+	if contain {
+		return toast
+	}
+	return "未知"
+}
+
+var ProjectFormMap = map[int64]string{
+	1: "实体商品寄拍",
+	2: "虚拟产品测评",
+	3: "线下探店打卡",
+	4: "素材微原创",
+}
+
+func GetProjectForm(status int64) string {
+	toast, contain := ProjectFormMap[status]
+	if contain {
+		return toast
+	}
+	return "未知"
+}
+
+var ProjectContentTypeMap = map[int64]string{
+	1: "图文",
+	2: "视频",
+}
+
+func GetProjectContentType(status int64) string {
+	toast, contain := ProjectContentTypeMap[status]
+	if contain {
+		return toast
+	}
+	return "未知"
+}
+
+var ProjectTypeMap = map[int64]string{
+	1: "全流程项目",
+	2: "专项执行项目",
+}
+
+func GetProjectType(projectType int64) string {
+	toast, contain := ProjectTypeMap[projectType]
+	if contain {
+		return toast
+	}
+	return "未知"
+}
+
+var RechargeMethod = map[int64]string{
+	1: "对公转账",
+	2: "支付宝",
+	3: "微信",
+}
+
+func GetRechargeMethod(method int64) string {
+	toast, contain := RechargeMethod[method]
+	if contain {
+		return toast
+	}
+	return "未知"
+}

+ 6 - 0
consts/session.go

@@ -0,0 +1,6 @@
+package consts
+
+const SessionAuthSchema = "session_auth"
+const SessionRedisPrefix = "b_user:"
+const AuthSalt = "fa2tg4y"
+const BRole = "6"

+ 42 - 0
core/escape.go

@@ -0,0 +1,42 @@
+// based on https://github.com/golang/go/blob/master/src/net/url/url.go
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package core
+
+func shouldEscape(c byte) bool {
+	if 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' || c == '_' || c == '-' || c == '~' || c == '.' {
+		return false
+	}
+	return true
+}
+func escape(s string) string {
+	hexCount := 0
+	for i := 0; i < len(s); i++ {
+		c := s[i]
+		if shouldEscape(c) {
+			hexCount++
+		}
+	}
+
+	if hexCount == 0 {
+		return s
+	}
+
+	t := make([]byte, len(s)+2*hexCount)
+	j := 0
+	for i := 0; i < len(s); i++ {
+		switch c := s[i]; {
+		case shouldEscape(c):
+			t[j] = '%'
+			t[j+1] = "0123456789ABCDEF"[c>>4]
+			t[j+2] = "0123456789ABCDEF"[c&15]
+			j += 3
+		default:
+			t[j] = s[i]
+			j++
+		}
+	}
+	return string(t)
+}

+ 208 - 0
core/signer.go

@@ -0,0 +1,208 @@
+// HWS API Gateway Signature
+// based on https://github.com/datastream/aws/blob/master/signv4.go
+// Copyright (c) 2014, Xianjie
+
+package core
+
+import (
+	"bytes"
+	"crypto/hmac"
+	"crypto/sha256"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"sort"
+	"strings"
+	"time"
+)
+
+const (
+	BasicDateFormat     = "20060102T150405Z"
+	Algorithm           = "SDK-HMAC-SHA256"
+	HeaderXDate         = "X-Sdk-Date"
+	HeaderHost          = "host"
+	HeaderAuthorization = "Authorization"
+	HeaderContentSha256 = "X-Sdk-Content-Sha256"
+)
+
+func hmacsha256(key []byte, data string) ([]byte, error) {
+	h := hmac.New(sha256.New, []byte(key))
+	if _, err := h.Write([]byte(data)); err != nil {
+		return nil, err
+	}
+	return h.Sum(nil), nil
+}
+
+// Build a CanonicalRequest from a regular request string
+//
+// CanonicalRequest =
+//  HTTPRequestMethod + '\n' +
+//  CanonicalURI + '\n' +
+//  CanonicalQueryString + '\n' +
+//  CanonicalHeaders + '\n' +
+//  SignedHeaders + '\n' +
+//  HexEncode(Hash(RequestPayload))
+func CanonicalRequest(r *http.Request, signedHeaders []string) (string, error) {
+	var hexencode string
+	var err error
+	if hex := r.Header.Get(HeaderContentSha256); hex != "" {
+		hexencode = hex
+	} else {
+		data, err := RequestPayload(r)
+		if err != nil {
+			return "", err
+		}
+		hexencode, err = HexEncodeSHA256Hash(data)
+		if err != nil {
+			return "", err
+		}
+	}
+	return fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n%s", r.Method, CanonicalURI(r), CanonicalQueryString(r), CanonicalHeaders(r, signedHeaders), strings.Join(signedHeaders, ";"), hexencode), err
+}
+
+// CanonicalURI returns request uri
+func CanonicalURI(r *http.Request) string {
+	pattens := strings.Split(r.URL.Path, "/")
+	var uri []string
+	for _, v := range pattens {
+		uri = append(uri, escape(v))
+	}
+	urlpath := strings.Join(uri, "/")
+	if len(urlpath) == 0 || urlpath[len(urlpath)-1] != '/' {
+		urlpath = urlpath + "/"
+	}
+	return urlpath
+}
+
+// CanonicalQueryString
+func CanonicalQueryString(r *http.Request) string {
+	var keys []string
+	query := r.URL.Query()
+	for key := range query {
+		keys = append(keys, key)
+	}
+	sort.Strings(keys)
+	var a []string
+	for _, key := range keys {
+		k := escape(key)
+		sort.Strings(query[key])
+		for _, v := range query[key] {
+			kv := fmt.Sprintf("%s=%s", k, escape(v))
+			a = append(a, kv)
+		}
+	}
+	queryStr := strings.Join(a, "&")
+	r.URL.RawQuery = queryStr
+	return queryStr
+}
+
+// CanonicalHeaders
+func CanonicalHeaders(r *http.Request, signerHeaders []string) string {
+	var a []string
+	header := make(map[string][]string)
+	for k, v := range r.Header {
+		header[strings.ToLower(k)] = v
+	}
+	for _, key := range signerHeaders {
+		value := header[key]
+		if strings.EqualFold(key, HeaderHost) {
+			value = []string{r.Host}
+		}
+		sort.Strings(value)
+		for _, v := range value {
+			a = append(a, key+":"+strings.TrimSpace(v))
+		}
+	}
+	return fmt.Sprintf("%s\n", strings.Join(a, "\n"))
+}
+
+// SignedHeaders
+func SignedHeaders(r *http.Request) []string {
+	var a []string
+	for key := range r.Header {
+		a = append(a, strings.ToLower(key))
+	}
+	sort.Strings(a)
+	return a
+}
+
+// RequestPayload
+func RequestPayload(r *http.Request) ([]byte, error) {
+	if r.Body == nil {
+		return []byte(""), nil
+	}
+	b, err := ioutil.ReadAll(r.Body)
+	if err != nil {
+		return []byte(""), err
+	}
+	r.Body = ioutil.NopCloser(bytes.NewBuffer(b))
+	return b, err
+}
+
+// Create a "String to Sign".
+func StringToSign(canonicalRequest string, t time.Time) (string, error) {
+	hash := sha256.New()
+	_, err := hash.Write([]byte(canonicalRequest))
+	if err != nil {
+		return "", err
+	}
+	return fmt.Sprintf("%s\n%s\n%x",
+		Algorithm, t.UTC().Format(BasicDateFormat), hash.Sum(nil)), nil
+}
+
+// Create the HWS Signature.
+func SignStringToSign(stringToSign string, signingKey []byte) (string, error) {
+	hm, err := hmacsha256(signingKey, stringToSign)
+	return fmt.Sprintf("%x", hm), err
+}
+
+// HexEncodeSHA256Hash returns hexcode of sha256
+func HexEncodeSHA256Hash(body []byte) (string, error) {
+	hash := sha256.New()
+	if body == nil {
+		body = []byte("")
+	}
+	_, err := hash.Write(body)
+	return fmt.Sprintf("%x", hash.Sum(nil)), err
+}
+
+// Get the finalized value for the "Authorization" header. The signature parameter is the output from SignStringToSign
+func AuthHeaderValue(signature, accessKey string, signedHeaders []string) string {
+	return fmt.Sprintf("%s Access=%s, SignedHeaders=%s, Signature=%s", Algorithm, accessKey, strings.Join(signedHeaders, ";"), signature)
+}
+
+// Signature HWS meta
+type Signer struct {
+	Key    string
+	Secret string
+}
+
+// SignRequest set Authorization header
+func (s *Signer) Sign(r *http.Request) error {
+	var t time.Time
+	var err error
+	var dt string
+	if dt = r.Header.Get(HeaderXDate); dt != "" {
+		t, err = time.Parse(BasicDateFormat, dt)
+	}
+	if err != nil || dt == "" {
+		t = time.Now()
+		r.Header.Set(HeaderXDate, t.UTC().Format(BasicDateFormat))
+	}
+	signedHeaders := SignedHeaders(r)
+	canonicalRequest, err := CanonicalRequest(r, signedHeaders)
+	if err != nil {
+		return err
+	}
+	stringToSign, err := StringToSign(canonicalRequest, t)
+	if err != nil {
+		return err
+	}
+	signature, err := SignStringToSign(stringToSign, []byte(s.Secret))
+	if err != nil {
+		return err
+	}
+	authValue := AuthHeaderValue(signature, s.Key, signedHeaders)
+	r.Header.Set(HeaderAuthorization, authValue)
+	return nil
+}

+ 135 - 0
db/Settle.go

@@ -0,0 +1,135 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+	"reflect"
+	"strings"
+	"youngee_b_api/model/common_model"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/util"
+)
+
+// GetSpecialTaskSettleList 专项任务-查询上传链接的task list
+func GetSpecialTaskSettleList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.SpecialTaskSettleInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+
+		if tag == "settle_status" {
+			fmt.Printf("Data %+v", value.Interface() == int64(0))
+			if value.Interface() == int64(0) {
+				db = db.Where("task_stage = 15 and settle_status = 1")
+			} else {
+				db = db.Where("task_stage = 15 and settle_status = 2")
+			}
+			continue
+		} else if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetTaskSettleList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+
+	// 查询链接
+	db1 := GetReadDB(ctx)
+	// db1 = db1.Debug().Model(gorm_model.YounggeeDataInfo{})
+	var LinkInfos []gorm_model.YounggeeLinkInfo
+	db1 = db1.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id IN ? AND is_submit= 1 AND is_ok = 1", taskIds)
+	err := db1.Find(&LinkInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	LinkMap := make(map[string]gorm_model.YounggeeLinkInfo)
+	for _, LinkInfo := range LinkInfos {
+		LinkMap[LinkInfo.TaskID] = LinkInfo
+	}
+
+	// 查询数据
+	db2 := GetReadDB(ctx)
+	var DataInfos []gorm_model.YounggeeDataInfo
+	db2 = db2.Model(gorm_model.YounggeeDataInfo{}).Where("task_id IN ? AND is_submit= 1 AND is_ok = 1", taskIds)
+	err = db2.Find(&DataInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	DataMap := make(map[string]gorm_model.YounggeeDataInfo)
+	for _, DataInfo := range DataInfos {
+		DataMap[DataInfo.TaskID] = DataInfo
+	}
+	// 查询总数
+	var totalData int64
+	if err := db2.Count(&totalData).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	// 查询该页数据
+	limit := pageSize
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err = db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetTaskSettleList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskSettles []*http_model.SpecialTaskSettle
+	var taskSettles []*http_model.SpecialTaskSettleInfo
+	var newTaskSettles []*http_model.SpecialTaskSettleInfo
+	for _, taskId := range taskIds {
+		TaskSettle := new(http_model.SpecialTaskSettle)
+		TaskSettle.Talent = taskMap[taskId]
+		TaskSettle.Data = DataMap[taskId]
+		TaskSettle.Link = LinkMap[taskId]
+		TaskSettles = append(TaskSettles, TaskSettle)
+	}
+
+	taskSettles = pack.SpecialTaskSettleToTaskInfo(TaskSettles)
+
+	for _, v := range taskSettles {
+		if platform_nickname == "" {
+			newTaskSettles = append(newTaskSettles, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskSettles = append(newTaskSettles, v)
+		} else if strings.Contains(conv.MustString(v.TaskID, ""), platform_nickname) {
+			newTaskSettles = append(newTaskSettles, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskSettles, totalTask, nil
+}

+ 21 - 0
db/auto_default.go

@@ -0,0 +1,21 @@
+package db
+
+import (
+	"context"
+	log "github.com/sirupsen/logrus"
+	"youngee_b_api/model/gorm_model"
+)
+
+func GetLastAutoDefaultID() (int, error) {
+	db := GetReadDB(context.Background())
+	// 查找最后一个
+	LastDefault := gorm_model.InfoAutoDefaultHandle{}
+	result := db.Last(&LastDefault)
+	err := result.Error
+	if err != nil {
+		log.Println("DB GetLastAutoDefaultID:", err)
+		return 0, err
+	}
+	//fmt.Printf("auto task %+v %+v", result, LastTask)
+	return LastDefault.AutoDefaultID, nil
+}

+ 146 - 0
db/auto_task.go

@@ -0,0 +1,146 @@
+package db
+
+import (
+	"context"
+	"github.com/issue9/conv"
+	"time"
+	"youngee_b_api/model/gorm_model"
+
+	log "github.com/sirupsen/logrus"
+)
+
+func AutoUpdateStatus() error {
+	db := GetReadDB(context.Background())
+	// 查找所有到达招募截止时间的项目id
+	var projectIds []string
+	db = db.Debug().Model(gorm_model.ProjectInfo{}).Select("project_id").Where("project_status = 6").Find(&projectIds)
+	//fmt.Println("projectIds",projectIds)
+	if len(projectIds) != 0 {
+		for _, projectId := range projectIds {
+			db1 := GetReadDB(context.Background())
+			db1 = db1.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 1", projectId).Update("task_status", 3)
+		}
+	}
+	db1 := GetReadDB(context.Background())
+	// 更新招募中项目状态为待支付
+	err := db1.Debug().Model(gorm_model.ProjectInfo{}).
+		Where("project_status = ? AND recruit_ddl < ?", 4, time.Now()).Update("project_status", 6).Error
+	if err != nil {
+		log.Println("DB AutoUpdateStatus error :", err)
+		return err
+	}
+	return nil
+}
+
+func GetLastAutoTaskID() (int, error) {
+	db := GetReadDB(context.Background())
+	// 查找最后一个
+	LastTask := gorm_model.InfoAutoTask{}
+	result := db.Last(&LastTask)
+	err := result.Error
+	if err != nil {
+		log.Println("DB GetLastAutoTaskID:", err)
+		return 0, err
+	}
+	//fmt.Printf("auto task %+v %+v", result, LastTask)
+	return LastTask.AutoTaskID, nil
+}
+
+func AutoUpdateApplyTimes() error {
+	db := GetReadDB(context.Background())
+	// 查询task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTalentInfo{})
+	err := db.Where("1 = 1").Update("apply_num", 5).Error
+	if err != nil {
+		log.Println("DB AutoUpdateStatus error :", err)
+		return err
+	}
+	return nil
+}
+
+func AutoCompleteSelection() error {
+	db := GetReadDB(context.Background())
+	// 查询selection表,查询所有到截至时间的选品项目
+	var completedSelectionList []gorm_model.YounggeeSelectionInfo
+	err := db.Model(gorm_model.YounggeeSelectionInfo{}).Where("task_ddl < ?", time.Now()).Scan(&completedSelectionList).Error
+	if err != nil {
+		log.Println("DB AutoCompleteSelection error :", err)
+		return err
+	}
+	// 遍历结束选品列表
+	for _, v := range completedSelectionList {
+		if v.SelectionStatus == 6 { // 若处于执行中阶段
+			// 查询该选品下所有待结算任务
+			var settleSecTaskList []gorm_model.YounggeeSecTaskInfo
+			err = db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("selection_id = ? and task_stage = 9", v.SelectionID).Scan(&settleSecTaskList).Error
+			if err != nil {
+				log.Println("DB AutoCompleteSelection error :", err)
+				return err
+			}
+			// 结算选品
+			for _, w := range settleSecTaskList {
+				// 更新任务信息
+				updateSecTaskData := gorm_model.YounggeeSecTaskInfo{
+					TaskID:           w.TaskID,
+					TaskStage:        10,
+					AssignmentStatus: 5,
+					IsPayReward:      0,
+					IsPayPayment:     0,
+					CompleteDate:     time.Now(),
+				}
+				_, err = UpdateSecTask(context.Background(), updateSecTaskData)
+				if err != nil {
+					log.Println("DB AutoCompleteSelection error :", err)
+					return err
+				}
+
+				// 添加任务日志和达人消息
+				err = CreateTaskLog(context.Background(), w.TaskID, "结算时间")
+				if err != nil {
+					log.Println("DB AutoCompleteSelection error :", err)
+				}
+
+				err = CreateMessageBySecTaskId(context.Background(), 5, 1, w.TaskID)
+				if err != nil {
+					log.Println("DB AutoCompleteSelection error :", err)
+					return err
+				}
+			}
+
+			// 计算结算金额,并返还剩余冻结资金
+			var leftMoney float64 = conv.MustFloat64(v.EstimatedCost, 0) - conv.MustFloat64(v.SettlementAmount, 0)
+			_, err = UpdateEnterpriseBalance(context.Background(), v.EnterpriseID, 0, leftMoney, -leftMoney)
+			if err != nil {
+				log.Println("DB AutoCompleteSelection error :", err)
+				return err
+			}
+
+			// 更新选品阶段为已结案
+			updateSelectionInfo := gorm_model.YounggeeSelectionInfo{
+				SelectionID:     v.SelectionID,
+				SelectionStatus: 8,
+				FinishAt:        time.Now(),
+			}
+			err = UpdateSelection(context.Background(), updateSelectionInfo)
+			if err != nil {
+				log.Println("DB AutoCompleteSelection error :", err)
+				return err
+			}
+		} else { // 否则
+			// 更新选品阶段为失效,失效原因为逾期未支付
+			updateSelectionInfo := gorm_model.YounggeeSelectionInfo{
+				SelectionID:     v.SelectionID,
+				SelectionStatus: 7,
+				FailReason:      1,
+				FinishAt:        time.Now(),
+			}
+			err = UpdateSelection(context.Background(), updateSelectionInfo)
+			if err != nil {
+				log.Println("DB AutoCompleteSelection error :", err)
+				return err
+			}
+		}
+	}
+
+	return nil
+}

+ 93 - 0
db/cooperate.go

@@ -0,0 +1,93 @@
+package db
+
+import (
+	"context"
+	"github.com/sirupsen/logrus"
+	"time"
+	"youngee_b_api/model/gorm_model"
+)
+
+// CreateCooperateInfo 创建商家-服务商合作关系
+func CreateCooperateInfo(ctx context.Context, cooperateInfo *gorm_model.EnterpriseSupplierCooperate) error {
+	db := GetWriteDB(ctx)
+	err := db.Create(&cooperateInfo).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// GetCooperateInfoByIds 根据服务商ID和邀约状态在合作库中查找合作数据
+func GetCooperateInfoByIds(ctx context.Context, supplierId int, cooperateStatus int, pageSize, pageNum int64) ([]*gorm_model.EnterpriseSupplierCooperate, int64, error) {
+	db := GetReadDB(ctx)
+	whereCondition := gorm_model.EnterpriseSupplierCooperate{
+		SupplierId:      supplierId,
+		CooperateStatus: cooperateStatus,
+	}
+
+	// 1. 按条件过滤
+	db = db.Debug().Model(gorm_model.EnterpriseSupplierCooperate{}).Where(whereCondition)
+
+	// 2. 返回当前页数据并统计总数
+	var total int64
+	var cooperateInfp []*gorm_model.EnterpriseSupplierCooperate
+	if err := db.Count(&total).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetCooperateInfoByIds] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	limit := pageSize
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err := db.Order("enterprise_id desc").Limit(int(limit)).Offset(int(offset)).Find(&cooperateInfp).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetCooperateInfoByIds] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	return cooperateInfp, total, nil
+}
+
+// UpdateCooperateInfo 更新合作关系状态
+func UpdateCooperateInfo(ctx context.Context, cooperateId int, cooperateStatus int) error {
+	db := GetWriteDB(ctx)
+	whereCondition := gorm_model.EnterpriseSupplierCooperate{CooperateId: cooperateId}
+
+	if cooperateStatus == 2 {
+		var cooperateInfo *gorm_model.EnterpriseSupplierCooperate
+		cooperateInfo = &gorm_model.EnterpriseSupplierCooperate{}
+		cooperateInfo.CooperateStatus = cooperateStatus
+		var currentTime time.Time
+		currentTime = time.Now()
+		cooperateInfo.AgreeTime = &currentTime
+		err := db.Model(&gorm_model.YounggeeJob{}).Where(whereCondition).Updates(cooperateInfo).Error
+		if err != nil {
+			return err
+		}
+	} else if cooperateStatus == 3 {
+		var cooperateInfo *gorm_model.EnterpriseSupplierCooperate
+		cooperateInfo = &gorm_model.EnterpriseSupplierCooperate{}
+		cooperateInfo.CooperateStatus = cooperateStatus
+		var currentTime time.Time
+		currentTime = time.Now()
+		cooperateInfo.AgreeTime = &currentTime
+		err := db.Model(&gorm_model.YounggeeJob{}).Where(whereCondition).Updates(cooperateInfo).Error
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+// FindCooperateInfoBySupplierAndEnterprise 查找服务商-商家是否建立合作关系
+func FindCooperateInfoBySupplierAndEnterprise(ctx context.Context, supplierId int, enterpriseId string) (int64, error) {
+	db := GetReadDB(ctx)
+	whereCondition := gorm_model.EnterpriseSupplierCooperate{
+		EnterpriseId: enterpriseId,
+		SupplierId:   supplierId,
+	}
+	db = db.Debug().Model(gorm_model.EnterpriseSupplierCooperate{}).Where(whereCondition)
+	var total int64
+	if err := db.Count(&total).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetCooperateInfoByIds] error query mysql total, err:%+v", err)
+		return 0, err
+	}
+	return total, nil
+}

+ 319 - 0
db/data.go

@@ -0,0 +1,319 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"reflect"
+	"strings"
+	"time"
+	"youngee_b_api/model/common_model"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/util"
+
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+)
+
+// GetTaskDataList 查询上传数据的task list
+func GetTaskDataList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.TaskDataInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+
+		if tag == "data_status" {
+			fmt.Printf("Data %+v", value.Interface() == int64(0))
+			if value.Interface() == int64(0) {
+				db = db.Where("task_stage = 14")
+			} else {
+				db = db.Where("task_stage > 14 and task_stage <> 16")
+			}
+			continue
+		} else if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" || tag == "strategy_id" {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetTaskDataList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+
+	// 查询链接
+	db1 := GetReadDB(ctx)
+	// db1 = db1.Debug().Model(gorm_model.YounggeeDataInfo{})
+	var LinkInfos []gorm_model.YounggeeLinkInfo
+	db1 = db1.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id IN ? AND is_submit= 1 AND is_ok = 1", taskIds)
+	err := db1.Find(&LinkInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	LinkMap := make(map[string]gorm_model.YounggeeLinkInfo)
+	for _, LinkInfo := range LinkInfos {
+		LinkMap[LinkInfo.TaskID] = LinkInfo
+	}
+
+	db2 := GetReadDB(ctx)
+	// db2 = db1.Debug().Model(gorm_model.YounggeeDataInfo{})
+
+	var DataInfos []gorm_model.YounggeeDataInfo
+	db2 = db2.Model(gorm_model.YounggeeDataInfo{}).Where("task_id IN ? AND is_submit = 1", taskIds)
+	fmt.Printf("conditions %+v", conditions)
+	if conditions.DataStatus == int64(0) {
+		db2 = db2.Where("is_review = 0")
+	} else {
+		db2 = db2.Where("is_ok = 1")
+	}
+	err = db2.Find(&DataInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	DataMap := make(map[string]gorm_model.YounggeeDataInfo)
+	for _, DataInfo := range DataInfos {
+		DataMap[DataInfo.TaskID] = DataInfo
+	}
+	// 查询总数
+	var totalData int64
+	if err := db2.Count(&totalData).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	var misNum int64
+	if totalData > totalTask {
+		misNum = totalData - totalTask
+	} else {
+		misNum = totalTask - totalData
+	}
+	logrus.Println("totalData,totalTalent,misNum:", totalData, totalTask, misNum)
+
+	// 查询该页数据
+	limit := pageSize + misNum
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err = db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetTaskDataList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskDatas []*http_model.TaskData
+	var taskDatas []*http_model.TaskDataInfo
+	var newTaskDatas []*http_model.TaskDataInfo
+	for _, taskId := range taskIds {
+		TaskData := new(http_model.TaskData)
+		TaskData.Talent = taskMap[taskId]
+		TaskData.Data = DataMap[taskId]
+		TaskData.Link = LinkMap[taskId]
+		TaskDatas = append(TaskDatas, TaskData)
+	}
+
+	taskDatas = pack.TaskDataToTaskInfo(TaskDatas)
+
+	for _, v := range taskDatas {
+		if platform_nickname == "" {
+			newTaskDatas = append(newTaskDatas, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskDatas = append(newTaskDatas, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platform_nickname) {
+			newTaskDatas = append(newTaskDatas, v)
+		} else {
+			totalTask--
+		}
+	}
+	// return fulltaskData, total, nil
+	return newTaskDatas, totalTask, nil
+}
+
+// DataOpinion 提交意见
+func DataOpinion(ctx context.Context, TaskID string, ReviseOpinion string) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YounggeeDataInfo{}).Where("task_id = ? and is_review = 0", TaskID).Updates(map[string]interface{}{"revise_opinion": ReviseOpinion, "reject_at": time.Now(), "is_review": 1}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Data db] Update YounggeeDataInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", TaskID).Updates(gorm_model.YoungeeTaskInfo{DataStatus: 3}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Data db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", TaskID).Updates(gorm_model.YoungeeTaskInfo{TaskStage: 13}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Data db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+// AcceptData 同意数据-结案
+func AcceptData(ctx context.Context, TaskIDs []string) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YounggeeDataInfo{}).Where("task_id in ?  and is_review = 0", TaskIDs).Updates(map[string]interface{}{"is_ok": 1, "is_review": 1, "agree_at": time.Now()}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Data db] Update YounggeeDataInfo error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+// GetSpecialTaskDataList 专项任务-查询上传数据的task list
+func GetSpecialTaskDataList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.SpecialTaskDataInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+
+		if tag == "data_status" {
+			fmt.Printf("Data %+v", value.Interface() == int64(0))
+			if value.Interface() == int64(0) {
+				db = db.Where("task_stage = 14")
+			} else {
+				db = db.Where("task_stage > 14 and task_stage <> 16")
+			}
+			continue
+		} else if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetTaskDataList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+
+	// 查询链接
+	db1 := GetReadDB(ctx)
+	// db1 = db1.Debug().Model(gorm_model.YounggeeDataInfo{})
+	var LinkInfos []gorm_model.YounggeeLinkInfo
+	db1 = db1.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id IN ? AND is_submit= 1 AND is_ok = 1", taskIds)
+	err := db1.Find(&LinkInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	LinkMap := make(map[string]gorm_model.YounggeeLinkInfo)
+	for _, LinkInfo := range LinkInfos {
+		LinkMap[LinkInfo.TaskID] = LinkInfo
+	}
+
+	db2 := GetReadDB(ctx)
+	// db2 = db1.Debug().Model(gorm_model.YounggeeDataInfo{})
+
+	var DataInfos []gorm_model.YounggeeDataInfo
+	db2 = db2.Model(gorm_model.YounggeeDataInfo{}).Where("task_id IN ? AND is_submit = 1", taskIds)
+	fmt.Printf("conditions %+v", conditions)
+	if conditions.DataStatus == int64(0) {
+		db2 = db2.Where("is_review = 0")
+	} else {
+		db2 = db2.Where("is_ok = 1")
+	}
+	err = db2.Find(&DataInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	DataMap := make(map[string]gorm_model.YounggeeDataInfo)
+	for _, DataInfo := range DataInfos {
+		DataMap[DataInfo.TaskID] = DataInfo
+	}
+	// 查询总数
+	var totalData int64
+	if err := db2.Count(&totalData).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	var misNum int64
+	if totalData > totalTask {
+		misNum = totalData - totalTask
+	} else {
+		misNum = totalTask - totalData
+	}
+	logrus.Println("totalData,totalTalent,misNum:", totalData, totalTask, misNum)
+
+	// 查询该页数据
+	limit := pageSize + misNum
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err = db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetTaskDataList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskDatas []*http_model.SpecialTaskData
+	var taskDatas []*http_model.SpecialTaskDataInfo
+	var newTaskDatas []*http_model.SpecialTaskDataInfo
+	for _, taskId := range taskIds {
+		TaskData := new(http_model.SpecialTaskData)
+		TaskData.Talent = taskMap[taskId]
+		TaskData.Data = DataMap[taskId]
+		TaskData.Link = LinkMap[taskId]
+		TaskDatas = append(TaskDatas, TaskData)
+	}
+
+	taskDatas = pack.SpecialTaskDataToTaskInfo(TaskDatas)
+
+	for _, v := range taskDatas {
+		if platform_nickname == "" {
+			newTaskDatas = append(newTaskDatas, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskDatas = append(newTaskDatas, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platform_nickname) {
+			newTaskDatas = append(newTaskDatas, v)
+		} else {
+			totalTask--
+		}
+	}
+	// return fulltaskData, total, nil
+	return newTaskDatas, totalTask, nil
+}

+ 448 - 0
db/default.go

@@ -0,0 +1,448 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"reflect"
+	"strings"
+	"youngee_b_api/model/common_model"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/util"
+
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+)
+
+func GetTaskDefaultReviewList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.TaskDefaultReviewInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if tag == "default_status" {
+			fmt.Printf("default %+v", value.Interface() == int64(0))
+			if value.Interface() == int64(0) {
+				db = db.Where("cur_default_type = 1")
+			} else if value.Interface() == int64(1) {
+				db = db.Where("cur_default_type = 3")
+			} else if value.Interface() == int64(2) {
+				db = db.Where("cur_default_type = 5")
+			}
+			continue
+		} else if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" || tag == "strategy_id" {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+	db1 := GetReadDB(ctx)
+	var DefaultReviewInfos []gorm_model.YoungeeContractInfo
+	db1 = db1.Model(gorm_model.YoungeeContractInfo{}).Where("task_id IN ? AND (default_status = 1 OR default_status = 4)", taskIds)
+	err := db1.Find(&DefaultReviewInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	DefaultReviewMap := make(map[string]gorm_model.YoungeeContractInfo)
+	for _, DefaultReviewInfo := range DefaultReviewInfos {
+		DefaultReviewMap[DefaultReviewInfo.TaskID] = DefaultReviewInfo
+	}
+	// 查询总数
+	var totalDefaultReview int64
+	if err := db1.Count(&totalDefaultReview).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	// 查询该页数据
+	limit := pageSize
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err = db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskDefaultReviews []*http_model.TaskDefaultReview
+	var taskDefaultReviews []*http_model.TaskDefaultReviewInfo
+	var newTaskDefaultReviews []*http_model.TaskDefaultReviewInfo
+	for _, taskId := range taskIds {
+		TaskDefaultReview := new(http_model.TaskDefaultReview)
+		TaskDefaultReview.Talent = taskMap[taskId]
+		TaskDefaultReview.Default = DefaultReviewMap[taskId]
+		TaskDefaultReviews = append(TaskDefaultReviews, TaskDefaultReview)
+	}
+
+	taskDefaultReviews = pack.TaskDefaultReviewToTaskInfo(TaskDefaultReviews)
+
+	for _, v := range taskDefaultReviews {
+		if platform_nickname == "" {
+			newTaskDefaultReviews = append(newTaskDefaultReviews, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskDefaultReviews = append(newTaskDefaultReviews, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platform_nickname) {
+			newTaskDefaultReviews = append(newTaskDefaultReviews, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskDefaultReviews, totalTask, nil
+}
+
+func GetTaskDefaultDataList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.TaskDefaultDataInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if tag == "default_status" {
+			if value.Interface() == int64(3) {
+				db = db.Where("cur_default_type = 7")
+			} else if value.Interface() == int64(2) {
+				db = db.Where("cur_default_type = 5")
+			} else if value.Interface() == int64(1) {
+				db = db.Where("cur_default_type = 3")
+			} else if value.Interface() == int64(0) {
+				db = db.Where("cur_default_type = 1")
+			}
+			continue
+		} else if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" || tag == "strategy_id" {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+	db1 := GetReadDB(ctx)
+	db1 = db1.Debug().Model(gorm_model.YoungeeContractInfo{})
+
+	var DefaultDataInfos []gorm_model.YoungeeContractInfo
+	db1 = db1.Model(gorm_model.YoungeeContractInfo{}).Where("task_id IN ? AND (default_status = 1 OR default_status = 4)", taskIds)
+	err := db1.Find(&DefaultDataInfos).Error
+	DefaultDataMap := make(map[string]gorm_model.YoungeeContractInfo)
+	for _, DefaultDataInfo := range DefaultDataInfos {
+		DefaultDataMap[DefaultDataInfo.TaskID] = DefaultDataInfo
+	}
+
+	var LinkInfos []gorm_model.YounggeeLinkInfo
+	db2 := GetReadDB(ctx)
+	db2 = db2.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id IN ? AND is_ok = 1", taskIds).Find(&LinkInfos)
+	LinkMap := make(map[string]gorm_model.YounggeeLinkInfo)
+	for _, LinkInfo := range LinkInfos {
+		LinkMap[LinkInfo.TaskID] = LinkInfo
+	}
+
+	// 查询总数
+	var totalDefaultData int64
+	if err := db2.Count(&totalDefaultData).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	var misNum int64
+	if totalDefaultData > totalTask {
+		misNum = totalDefaultData - totalTask
+	} else {
+		misNum = totalTask - totalDefaultData
+	}
+	logrus.Println("totalDefaultData,totalTalent,misNum:", totalDefaultData, totalTask, misNum)
+
+	// 查询该页数据
+	limit := pageSize + misNum
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err = db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskDefaultDatas []*http_model.TaskDefaultData
+	var taskDefaultDatas []*http_model.TaskDefaultDataInfo
+	var newTaskDefaultDatas []*http_model.TaskDefaultDataInfo
+	for _, taskId := range taskIds {
+		TaskDefaultData := new(http_model.TaskDefaultData)
+		TaskDefaultData.Talent = taskMap[taskId]
+		TaskDefaultData.Default = DefaultDataMap[taskId]
+		TaskDefaultData.Link = LinkMap[taskId]
+		TaskDefaultDatas = append(TaskDefaultDatas, TaskDefaultData)
+	}
+
+	taskDefaultDatas = pack.TaskDefaultDataToTaskInfo(TaskDefaultDatas)
+
+	for _, v := range taskDefaultDatas {
+		if platform_nickname == "" {
+			newTaskDefaultDatas = append(newTaskDefaultDatas, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskDefaultDatas = append(newTaskDefaultDatas, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platform_nickname) {
+			newTaskDefaultDatas = append(newTaskDefaultDatas, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskDefaultDatas, totalTask, nil
+}
+
+func GetTaskTerminatingList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.TaskTerminatingInfo, int64, error) {
+	db := GetReadDB(ctx)
+
+	var taskIds1 []string
+	var totalTerminating int64
+	var TerminatingInfos []gorm_model.YoungeeContractInfo
+	db = db.Model(gorm_model.YoungeeContractInfo{})
+	err := db.Where("default_status = 3 AND project_id=?", projectID).Find(&TerminatingInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	TerminatingMap := make(map[string]gorm_model.YoungeeContractInfo)
+	for _, TerminatingInfo := range TerminatingInfos {
+		taskIds1 = append(taskIds1, TerminatingInfo.TaskID)
+		TerminatingMap[TerminatingInfo.TaskID] = TerminatingInfo
+	}
+
+	if err := db.Count(&totalTerminating).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	db1 := GetReadDB(ctx)
+	// 查询Task表信息
+	db1 = db1.Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2 and task_id in ?", taskIds1)
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if tag == "default_status" {
+			if value.Interface() == int64(4) {
+				db1 = db1.Where("cur_default_type = 9")
+			}
+			continue
+		} else if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" || tag == "strategy_id" {
+				db1 = db1.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	// db1 = db1.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db1.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db1.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+	var misNum int64
+	if totalTerminating > totalTask {
+		misNum = totalTerminating - totalTask
+	} else {
+		misNum = totalTask - totalTerminating
+	}
+	logrus.Println("totalTerminating,totalTalent,misNum:", totalTerminating, totalTask, misNum)
+
+	// 查询该页数据
+	limit := pageSize + misNum
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err = db1.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskTerminatings []*http_model.TaskTerminating
+	var taskTerminatings []*http_model.TaskTerminatingInfo
+	var newTaskTerminatings []*http_model.TaskTerminatingInfo
+	for _, taskId := range taskIds {
+		TaskTerminating := new(http_model.TaskTerminating)
+		TaskTerminating.Talent = taskMap[taskId]
+		TaskTerminating.Default = TerminatingMap[taskId]
+		TaskTerminatings = append(TaskTerminatings, TaskTerminating)
+	}
+
+	taskTerminatings = pack.TaskTerminatingToTaskInfo(TaskTerminatings)
+
+	for _, v := range taskTerminatings {
+		if platform_nickname == "" {
+			newTaskTerminatings = append(newTaskTerminatings, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskTerminatings = append(newTaskTerminatings, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platform_nickname) {
+			newTaskTerminatings = append(newTaskTerminatings, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskTerminatings, totalTask, nil
+}
+
+func GetTaskTerminatedList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.TaskTerminatedInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if tag == "default_status" {
+			fmt.Printf("default %+v", value.Interface() == int64(0))
+			if value.Interface() == int64(5) {
+				db = db.Where("complete_status = 4")
+			}
+			continue
+		} else if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" || tag == "strategy_id" {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetTaskTerminatedList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+	db1 := GetReadDB(ctx)
+	db1 = db1.Debug().Model(gorm_model.YoungeeContractInfo{})
+
+	var TerminatedInfos []gorm_model.YoungeeContractInfo
+	db1 = db1.Model(gorm_model.YoungeeContractInfo{}).Where("task_id IN ? AND (default_status = 1 OR default_status = 5)", taskIds)
+	err := db1.Find(&TerminatedInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetTaskTerminatedList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	TerminatedMap := make(map[string]gorm_model.YoungeeContractInfo)
+	for _, TerminatedInfo := range TerminatedInfos {
+		TerminatedMap[TerminatedInfo.TaskID] = TerminatedInfo
+	}
+	// 查询总数
+	var totalTerminated int64
+	if err := db1.Count(&totalTerminated).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetTaskTerminatedList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	// 查询该页数据
+	limit := pageSize
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err = db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetTaskTerminatedList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskTerminateds []*http_model.TaskTerminated
+	var taskTerminateds []*http_model.TaskTerminatedInfo
+	var newTaskTerminateds []*http_model.TaskTerminatedInfo
+	for _, taskId := range taskIds {
+		TaskTerminated := new(http_model.TaskTerminated)
+		TaskTerminated.Talent = taskMap[taskId]
+		TaskTerminated.Default = TerminatedMap[taskId]
+		TaskTerminateds = append(TaskTerminateds, TaskTerminated)
+	}
+
+	taskTerminateds = pack.TaskTerminatedToTaskInfo(TaskTerminateds)
+
+	for _, v := range taskTerminateds {
+		if platform_nickname == "" {
+			newTaskTerminateds = append(newTaskTerminateds, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskTerminateds = append(newTaskTerminateds, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platform_nickname) {
+			newTaskTerminateds = append(newTaskTerminateds, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskTerminateds, totalTask, nil
+}

+ 217 - 0
db/enterprise.go

@@ -0,0 +1,217 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"github.com/issue9/conv"
+	"log"
+	"strconv"
+	"time"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/util"
+
+	"gorm.io/gorm"
+)
+
+func CreateEnterprise(ctx context.Context, newEnterprise gorm_model.Enterprise) (*string, error) {
+	db := GetReadDB(ctx)
+	err := db.Create(&newEnterprise).Error
+	if err != nil {
+		return nil, err
+	}
+	return &newEnterprise.EnterpriseID, nil
+}
+
+// GetEnterpriseByUID 用户ID查找
+func GetEnterpriseByUID(ctx context.Context, userID int64) (*gorm_model.Enterprise, error) {
+	db := GetReadDB(ctx)
+	enterprise := gorm_model.Enterprise{}
+	err := db.Where("user_id = ?", userID).First(&enterprise).Error
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			return nil, nil
+		} else {
+			return nil, err
+		}
+	}
+	return &enterprise, nil
+}
+
+// GetEnterpriseByEnterpriseID 企业ID查找
+func GetEnterpriseByEnterpriseID(ctx context.Context, EnterpriseID string) (*gorm_model.Enterprise, error) {
+	db := GetReadDB(ctx)
+	enterprise := gorm_model.Enterprise{}
+	err := db.Where("enterprise_id = ?", EnterpriseID).First(&enterprise).Error
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			return nil, nil
+		} else {
+			return nil, err
+		}
+	}
+	return &enterprise, nil
+}
+
+// GetEnterpriseBalance 获取企业可用余额等信息
+func GetEnterpriseBalance(ctx context.Context, EnterpriseID string) (*http_model.EnterpriseBalanceData, error) {
+	db := GetReadDB(ctx)
+	enterprise := gorm_model.Enterprise{}
+	err := db.Where("enterprise_id = ?", EnterpriseID).First(&enterprise).Error
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			return nil, nil
+		} else {
+			return nil, err
+		}
+	}
+	var Invoicing float64
+	var BillableAmount float64
+	db1 := GetReadDB(ctx)
+	db1.Model(gorm_model.YounggeeInvoiceRecord{}).Select("sum(invoice_amount) as Invoicing").
+		Where("enterprise_id = ? AND status = 1", EnterpriseID).Find(&Invoicing)
+	Invoicing, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", Invoicing), 64)
+	db2 := GetReadDB(ctx)
+	db2.Model(gorm_model.YounggeeRechargeRecord{}).Select("sum(recharge_amount) as BillableAmount").
+		Where("enterprise_id = ? AND status = 2 AND invoice_status = 2", EnterpriseID).Find(&BillableAmount)
+	BillableAmount, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", BillableAmount), 64)
+	db3 := GetReadDB(ctx)
+	var Recharging float64
+	db3.Model(gorm_model.YounggeeRechargeRecord{}).Select("sum(recharge_amount) as Recharging").
+		Where("enterprise_id = ? AND status = 1 AND invoice_status = 1", EnterpriseID).Find(&Recharging)
+	Recharging, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", Recharging), 64)
+	res := &http_model.EnterpriseBalanceData{
+		Balance:          enterprise.Balance,
+		FrozenBalance:    enterprise.FrozenBalance,
+		AvailableBalance: enterprise.AvailableBalance,
+		Recharging:       Recharging,
+		BillableAmount:   BillableAmount,
+		Invoicing:        Invoicing,
+	}
+	return res, nil
+}
+
+// 支付-修改企业账户余额
+func UpdateEnterpriseBalance(ctx context.Context, EnterpriseID string, balance float64, availableBalance float64, frozenBalance float64) (*float64, error) {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.Enterprise{}).Where("enterprise_id", EnterpriseID).
+		Updates(map[string]interface{}{"balance": gorm.Expr("balance + ?", balance), "available_balance": gorm.Expr("available_balance + ?", availableBalance), "frozen_balance": gorm.Expr("frozen_balance + ?", frozenBalance)}).Error
+	if err != nil {
+		return nil, err
+	}
+	enterprise := gorm_model.Enterprise{}
+	err = db.Model(gorm_model.Enterprise{}).Where("enterprise_id", EnterpriseID).Scan(&enterprise).Error
+	if err != nil {
+		return nil, err
+	}
+
+	return &enterprise.Balance, nil
+}
+
+func MakeRechargeId(ctx context.Context, EnterpriseID string) string {
+	db := GetReadDB(ctx)
+	// 1、年月日
+	year := time.Now().Year()
+	month := time.Now().Month()
+	day := time.Now().Day()
+	yearData, _ := util.GetDayNum("year", year)
+	monthData, _ := util.GetDayNum("month", int(month))
+	dayData, _ := util.GetDayNum("day", day)
+	sum := 0
+	sum += dayData + monthData
+	leap := 0
+	if (yearData%400 == 0) || ((yearData%4 == 0) && (yearData%100 != 0)) {
+		leap = 1
+	}
+	if (leap == 1) && (monthData > 2) {
+		sum += 1
+	}
+	last := ""
+	rechargeIdPrefix := "8" + EnterpriseID[len(EnterpriseID)-2:] + conv.MustString(sum)
+	var rechargeIdLast string
+	err := db.Model(gorm_model.YounggeeRechargeRecord{}).Select("recharge_id").Where("recharge_id like ?", rechargeIdPrefix+"%").
+		Last(&rechargeIdLast).Error
+	if err != nil {
+		last = "0"
+	} else {
+		last = rechargeIdLast[len(rechargeIdLast)-2:]
+	}
+	var lastInt int
+	lastInt = conv.MustInt(last)
+	if lastInt+1 < 10 {
+		last = "0" + conv.MustString(conv.MustInt(last)+1)
+	} else {
+		last = conv.MustString(conv.MustInt(last) + 1)
+	}
+	return rechargeIdPrefix + last
+}
+
+func RechargeAmount(ctx context.Context, EnterpriseID string, Amount float64, phone string) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.Enterprise{}).Where("enterprise_id", EnterpriseID).
+		Updates(map[string]interface{}{"balance": gorm.Expr("balance + ?", Amount), "available_balance": gorm.Expr("available_balance + ?", Amount)}).Error
+	if err != nil {
+		return err
+	}
+	//enterprise := gorm_model.Enterprise{}
+	//err = db.Model(gorm_model.Enterprise{}).Where("enterprise_id", EnterpriseID).Scan(&enterprise).Error
+	//if err != nil {
+	//	return err
+	//}
+	rechargeId := MakeRechargeId(ctx, EnterpriseID)
+	err = db.Model(gorm_model.YounggeeRechargeRecord{}).Create(&gorm_model.YounggeeRechargeRecord{
+		RechargeID:         rechargeId,
+		RechargeAmount:     Amount,
+		EnterpriseID:       EnterpriseID,
+		Status:             2,
+		InvoiceStatus:      2,
+		CommitAt:           time.Now(),
+		RechargeMethod:     3,
+		TransferVoucherUrl: "--",
+		Phone:              phone,
+		ConfirmAt:          time.Now(),
+	}).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func TransferToPublic(ctx context.Context, Amount float64, phone string, EnterpriseID string, transferVoucherUrl string) error {
+	db := GetReadDB(ctx)
+	rechargeId := MakeRechargeId(ctx, EnterpriseID)
+	fmt.Println("Amount:", Amount)
+	err := db.Model(gorm_model.YounggeeRechargeRecord{}).Create(&gorm_model.YounggeeRechargeRecord{
+		RechargeID:         rechargeId,
+		RechargeAmount:     Amount,
+		EnterpriseID:       EnterpriseID,
+		Status:             1,
+		InvoiceStatus:      1,
+		CommitAt:           time.Now(),
+		Phone:              phone,
+		RechargeMethod:     1,
+		TransferVoucherUrl: transferVoucherUrl,
+		ConfirmAt:          time.Now(),
+	}).Error
+	if err != nil {
+		return err
+	}
+	db1 := GetReadDB(ctx)
+	err = db1.Model(gorm_model.Enterprise{}).Where("enterprise_id = ?", EnterpriseID).Updates(
+		map[string]interface{}{"recharging": gorm.Expr("recharging + ?", Amount)}).Error
+	if err != nil {
+		log.Println("[TransferToPublic] recharging modify failed:", err)
+		return err
+	}
+	return nil
+}
+
+func UpdateEnterprise(ctx context.Context, EnterpriseID string, BusinessName string) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.Enterprise{}).Where("enterprise_id=?", EnterpriseID).Update("business_name", BusinessName).Error
+	if err != nil {
+		fmt.Println("Update Enterprise Failed!")
+		return err
+	}
+	return nil
+}

+ 299 - 0
db/finish.go

@@ -0,0 +1,299 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"reflect"
+	"strings"
+	"youngee_b_api/model/common_model"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/util"
+
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+	"github.com/tidwall/gjson"
+)
+
+func GetTaskFinishList(ctx context.Context, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.TaskFinishInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2 and task_stage = 15")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" || tag == "strategy_id" {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+	db1 := GetReadDB(ctx)
+	db1 = db1.Debug().Model(gorm_model.YounggeeDataInfo{})
+
+	var DataInfos []gorm_model.YounggeeDataInfo
+	db1 = db1.Model(gorm_model.YounggeeDataInfo{}).Where("task_id IN ? AND is_ok = 1", taskIds)
+	err := db1.Find(&DataInfos).Error
+	DataMap := make(map[string]gorm_model.YounggeeDataInfo)
+	for _, DataInfo := range DataInfos {
+		DataMap[DataInfo.TaskID] = DataInfo
+	}
+
+	var LinkInfos []gorm_model.YounggeeLinkInfo
+	db2 := GetReadDB(ctx)
+	db2 = db2.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id IN ? AND is_ok = 1", taskIds).Find(&LinkInfos)
+	LinkMap := make(map[string]gorm_model.YounggeeLinkInfo)
+	for _, LinkInfo := range LinkInfos {
+		LinkMap[LinkInfo.TaskID] = LinkInfo
+	}
+
+	// 查询总数
+	var totalData int64
+	if err := db2.Count(&totalData).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	var misNum int64
+	if totalData > totalTask {
+		misNum = totalData - totalTask
+	} else {
+		misNum = totalTask - totalData
+	}
+	logrus.Println("totalData,totalTalent,misNum:", totalData, totalTask, misNum)
+
+	// 查询该页数据
+	limit := pageSize + misNum
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err = db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskFinishs []*http_model.TaskFinish
+	var taskDatas []*http_model.TaskFinishInfo
+	var newTaskFinishs []*http_model.TaskFinishInfo
+	for _, taskId := range taskIds {
+		TaskFinish := new(http_model.TaskFinish)
+		TaskFinish.Talent = taskMap[taskId]
+		TaskFinish.Data = DataMap[taskId]
+		TaskFinish.Link = LinkMap[taskId]
+		TaskFinishs = append(TaskFinishs, TaskFinish)
+	}
+
+	taskDatas = pack.TaskFinishToTaskInfo(TaskFinishs)
+
+	for _, v := range taskDatas {
+		if platform_nickname == "" {
+			newTaskFinishs = append(newTaskFinishs, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskFinishs = append(newTaskFinishs, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platform_nickname) {
+			newTaskFinishs = append(newTaskFinishs, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskFinishs, totalTask, nil
+}
+
+func GetFinishData(ctx context.Context, projectID string) ([]*gorm_model.RecruitStrategy, error) {
+	finishRecruitStrategy := []*gorm_model.RecruitStrategy{}
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	err := db.Debug().Model(gorm_model.RecruitStrategy{}).Where("project_id = ?", projectID).Scan(&finishRecruitStrategy).Order("strategy_id").Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	return finishRecruitStrategy, nil
+}
+
+func GetSpecialTaskFinishList(ctx context.Context, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.SpecialTaskFinishDataInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2 and task_stage = 15")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" || tag == "strategy_id" {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+	db1 := GetReadDB(ctx)
+	db1 = db1.Debug().Model(gorm_model.YounggeeDataInfo{})
+
+	var DataInfos []gorm_model.YounggeeDataInfo
+	db1 = db1.Model(gorm_model.YounggeeDataInfo{}).Where("task_id IN ? AND is_ok = 1", taskIds)
+	err := db1.Find(&DataInfos).Error
+	DataMap := make(map[string]gorm_model.YounggeeDataInfo)
+	for _, DataInfo := range DataInfos {
+		DataMap[DataInfo.TaskID] = DataInfo
+	}
+
+	var LinkInfos []gorm_model.YounggeeLinkInfo
+	db2 := GetReadDB(ctx)
+	db2 = db2.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id IN ? AND is_ok = 1", taskIds).Find(&LinkInfos)
+	LinkMap := make(map[string]gorm_model.YounggeeLinkInfo)
+	for _, LinkInfo := range LinkInfos {
+		LinkMap[LinkInfo.TaskID] = LinkInfo
+	}
+
+	// 查询总数
+	var totalData int64
+	if err := db2.Count(&totalData).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	var misNum int64
+	if totalData > totalTask {
+		misNum = totalData - totalTask
+	} else {
+		misNum = totalTask - totalData
+	}
+	logrus.Println("totalData,totalTalent,misNum:", totalData, totalTask, misNum)
+
+	// 查询该页数据
+	limit := pageSize + misNum
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err = db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskFinishs []*http_model.SpecialTaskFinishData
+	var taskDatas []*http_model.SpecialTaskFinishDataInfo
+	var newTaskFinishs []*http_model.SpecialTaskFinishDataInfo
+	for _, taskId := range taskIds {
+		TaskFinish := new(http_model.SpecialTaskFinishData)
+		TaskFinish.Talent = taskMap[taskId]
+		TaskFinish.Data = DataMap[taskId]
+		TaskFinish.Link = LinkMap[taskId]
+		TaskFinishs = append(TaskFinishs, TaskFinish)
+	}
+
+	taskDatas = pack.SpecialTaskFinishDataToTaskInfo(TaskFinishs)
+
+	for _, v := range taskDatas {
+		if platform_nickname == "" {
+			newTaskFinishs = append(newTaskFinishs, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskFinishs = append(newTaskFinishs, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platform_nickname) {
+			newTaskFinishs = append(newTaskFinishs, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskFinishs, totalTask, nil
+}
+
+func GetSpecialFinishDataNumber(ctx context.Context, projectId string) (*http_model.GetSpecialFinishDataData, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2 and task_stage = 15 and project_id = ?",projectId)
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSpecialFinishDataNumber] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+	db1 := GetReadDB(ctx)
+	db1 = db1.Debug().Model(gorm_model.YounggeeDataInfo{})
+
+	var DataInfos []gorm_model.YounggeeDataInfo
+	db1 = db1.Model(gorm_model.YounggeeDataInfo{}).Where("task_id IN ? AND is_ok = 1", taskIds)
+	err := db1.Find(&DataInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSpecialFinishDataNumber] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	DataMap := make(map[string]gorm_model.YounggeeDataInfo)
+	for _, DataInfo := range DataInfos {
+		DataMap[DataInfo.TaskID] = DataInfo
+	}
+
+	taskFinishData := http_model.GetSpecialFinishDataData{
+		FinishNumber:  totalTask,
+		FanNumber:     0,
+		PlayNumber:    0,
+		LikeNumber:    0,
+		CommentNumber: 0,
+		CollectNumber: 0,
+	}
+	for _, taskId := range taskIds {
+		fans := conv.MustString(gjson.Get(taskMap[taskId].TalentPlatformInfoSnap, "fans_count"))
+		taskFinishData.FanNumber += conv.MustInt(fans)
+		taskFinishData.PlayNumber += DataMap[taskId].PlayNumber
+		taskFinishData.LikeNumber += DataMap[taskId].LikeNumber
+		taskFinishData.CollectNumber += DataMap[taskId].CollectNumber
+		taskFinishData.CommentNumber += DataMap[taskId].CommentNumber
+	}
+	return &taskFinishData, nil
+}

+ 43 - 0
db/info_pricing_strategy.go

@@ -0,0 +1,43 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"youngee_b_api/model/gorm_model"
+
+	log "github.com/sirupsen/logrus"
+)
+
+func GetPricingStrategy(ctx context.Context, fansLow int64, fansUp int64, feeForm int64, platForm int64) (*gorm_model.InfoPricingStrategy, error) {
+	db := GetReadDB(context.Background())
+	var PricingStrategys []gorm_model.InfoPricingStrategy
+	whereStr := fmt.Sprintf("fee_form = %d and platform = %d and fans_low <= %d and fans_up > %d", feeForm, platForm, fansLow, fansLow)
+	orStr := fmt.Sprintf("fee_form = %d and platform = %d and fans_low < %d and fans_up >= %d", feeForm, platForm, fansUp, fansUp)
+	orStr1 := fmt.Sprintf("fee_form = %d and platform = %d and fans_low >= %d and fans_up <= %d", feeForm, platForm, fansLow, fansUp)
+	orStr2 := fmt.Sprintf("fee_form = %d and platform = %d and fans_low <= %d and fans_up >= %d", feeForm, platForm, fansLow, fansUp)
+	err := db.Model(gorm_model.InfoPricingStrategy{}).Where(whereStr).Or(orStr).Or(orStr1).Or(orStr2).Scan(&PricingStrategys).Error
+	if err != nil {
+		log.Println("DB GetLastAutoDefaultID:", err)
+		return nil, err
+	}
+	fmt.Printf("PricingStrategys%+v \n", PricingStrategys)
+	PricingStrategy := gorm_model.InfoPricingStrategy{}
+	if feeForm == 1 {
+		var maxCharge float64 = 0
+		for _, v := range PricingStrategys {
+			if v.ServiceCharge >= maxCharge {
+				maxCharge = v.ServiceCharge
+				PricingStrategy = v
+			}
+		}
+	} else {
+		var maxRate int64 = 0
+		for _, v := range PricingStrategys {
+			if v.ServiceRate >= maxRate {
+				maxRate = v.ServiceRate
+				PricingStrategy = v
+			}
+		}
+	}
+	return &PricingStrategy, nil
+}

+ 29 - 0
db/init.go

@@ -0,0 +1,29 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"youngee_b_api/model/system_model"
+
+	"gorm.io/driver/mysql"
+	"gorm.io/gorm"
+)
+
+var client *gorm.DB
+
+func Init(config *system_model.Mysql) {
+	dsn := "%v:%v@tcp(%v:%v)/%v?charset=utf8mb4&parseTime=True&loc=Local"
+	dsn = fmt.Sprintf(dsn, config.User, config.Password, config.Host, config.Port, config.Database)
+	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
+	if err != nil {
+		panic(err)
+	}
+	client = db
+}
+
+func GetReadDB(ctx context.Context) *gorm.DB {
+	return client.WithContext(ctx)
+}
+func GetWriteDB(ctx context.Context) *gorm.DB {
+	return client.WithContext(ctx)
+}

+ 242 - 0
db/invoice.go

@@ -0,0 +1,242 @@
+package db
+
+import (
+	context "context"
+	"encoding/json"
+	"fmt"
+	"time"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/util"
+
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+)
+
+func AddReceiveAddress(ctx context.Context, enterpriseId string, req *http_model.AddReceiveAddressRequest) error {
+	db := GetReadDB(ctx)
+	return db.Debug().Model(gorm_model.YounggeeInvoiceAddress{}).Create(&gorm_model.YounggeeInvoiceAddress{
+		EnterpriseID: enterpriseId,
+		Name:         req.ReceiveName,
+		RegionCode:   req.RegionCode,
+		Address:      req.ReceiveAddress,
+		Phone:        req.ReceivePhone,
+		UpdateAt:     time.Now(),
+	}).Error
+}
+
+func AddReceiveInfo(ctx context.Context, enterpriseId string, req *http_model.AddReceiveInfoRequest) error {
+	db := GetReadDB(ctx)
+	return db.Debug().Model(gorm_model.YounggeeInvoiceInfo{}).Create(&gorm_model.YounggeeInvoiceInfo{
+		EnterpriseID:      enterpriseId,
+		HeadType:          consts.GetHeadType(req.HeadType),
+		InvoiceHeader:     req.InvoiceHead,
+		InvoiceType:       consts.GetInvoiceType(req.InvoiceType),
+		TaxCode:           req.TaxNum,
+		Bank:              req.BaseBank,
+		BankCardNumber:    req.BaseBankCardNum,
+		RegisteredAddress: req.EnterpriseAddress,
+		RegisteredPhone:   req.EnterprisePhone,
+		UpdateAt:          time.Now(),
+	}).Error
+}
+
+func GetReceiveAddress(ctx context.Context, enterpriseId string) (*http_model.ReceiveAddressData, error) {
+	db := GetReadDB(ctx)
+	var InvoiceAddress []*gorm_model.YounggeeInvoiceAddress
+	db = db.Debug().Model(gorm_model.YounggeeInvoiceAddress{}).Where(
+		"enterprise_id = ?",
+		enterpriseId,
+	)
+	db = db.Order("update_at desc").Find(&InvoiceAddress)
+	var receiveAddress http_model.ReceiveAddressData
+	for _, v := range InvoiceAddress {
+		ReceiveAddressPreview := new(http_model.ReceiveAddressPreview)
+		ReceiveAddressPreview.AddressID = v.AddressID
+		ReceiveAddressPreview.ReceiveName = v.Name
+		ReceiveAddressPreview.AddressPhone = v.Phone
+		ReceiveAddressPreview.Address = v.Address
+		ReceiveAddressPreview.RegionCode = v.RegionCode
+		receiveAddress.ReceiveAddressPreview = append(receiveAddress.ReceiveAddressPreview, ReceiveAddressPreview)
+	}
+	return &receiveAddress, nil
+}
+
+func GetReceiveInfo(ctx context.Context, enterpriseId string) (*http_model.ReceiveInfoData, error) {
+	db := GetReadDB(ctx)
+	var InvoiceInfo []*gorm_model.YounggeeInvoiceInfo
+	db = db.Debug().Model(gorm_model.YounggeeInvoiceInfo{}).Where(
+		"enterprise_id = ?",
+		enterpriseId,
+	)
+	db = db.Order("update_at desc").Find(&InvoiceInfo)
+	var ReceiveInfoData http_model.ReceiveInfoData
+	for _, v := range InvoiceInfo {
+		ReceiveInfoPreview := new(http_model.ReceiveInfoPreview)
+		ReceiveInfoPreview.InvoiceHead = v.InvoiceHeader
+		ReceiveInfoPreview.InvoiceID = v.InvoiceID
+		ReceiveInfoPreview.HeadType = v.HeadType
+		ReceiveInfoPreview.InvoiceType = v.InvoiceType
+		ReceiveInfoPreview.EnterprisePhone = v.RegisteredPhone
+		ReceiveInfoPreview.TaxNum = v.TaxCode
+		ReceiveInfoPreview.BaseBank = v.Bank
+		ReceiveInfoPreview.BaseBankCardNum = v.BankCardNumber
+		ReceiveInfoPreview.EnterpriseAddress = v.RegisteredAddress
+		ReceiveInfoData.ReceiveInfoPreview = append(ReceiveInfoData.ReceiveInfoPreview, ReceiveInfoPreview)
+	}
+	return &ReceiveInfoData, nil
+}
+
+func OperateReceiveInfo(ctx context.Context, enterpriseId string, req *http_model.OperateReceiveInfoRequest) error {
+	db := GetReadDB(ctx)
+	if req.OperateType == 2 {
+		return db.Debug().Delete(&gorm_model.YounggeeInvoiceInfo{}, req.InvoiceId).Error
+	}
+	return db.Debug().Model(gorm_model.YounggeeInvoiceInfo{}).Where("enterprise_id = ? AND invoice_id = ?", enterpriseId, req.InvoiceId).Updates(
+		&gorm_model.YounggeeInvoiceInfo{
+			HeadType:          consts.GetHeadType(req.HeadType),
+			InvoiceHeader:     req.InvoiceHead,
+			InvoiceType:       consts.GetInvoiceType(req.InvoiceType),
+			TaxCode:           req.TaxNum,
+			Bank:              req.BaseBank,
+			BankCardNumber:    req.BaseBankCardNum,
+			RegisteredAddress: req.EnterpriseAddress,
+			RegisteredPhone:   req.EnterprisePhone,
+			UpdateAt:          time.Now(),
+		}).Error
+}
+
+func OperateReceiveAddress(ctx context.Context, enterpriseId string, req *http_model.OperateReceiveAddressRequest) error {
+	db := GetReadDB(ctx)
+	if req.OperateType == 2 {
+		return db.Debug().Delete(&gorm_model.YounggeeInvoiceAddress{}, req.AddressID).Error
+	}
+	return db.Debug().Model(gorm_model.YounggeeInvoiceAddress{}).Where("enterprise_id = ? AND address_id = ?", enterpriseId, req.AddressID).Updates(
+		&gorm_model.YounggeeInvoiceAddress{
+			Name:       req.ReceiveName,
+			RegionCode: req.RegionCode,
+			Address:    req.ReceiveAddress,
+			Phone:      req.ReceivePhone,
+			UpdateAt:   time.Now(),
+		}).Error
+}
+
+func AddInvoiceRecord(ctx context.Context, enterpriseId string, req *http_model.AddInvoiceRecordRequest) error {
+	invoiceInfo := gorm_model.YounggeeInvoiceInfo{}
+	//fmt.Println("req:", req)
+	//fmt.Println("invoice_id", req.InvoiceID)
+	db1 := GetReadDB(ctx)
+	db1.Debug().Model(gorm_model.YounggeeInvoiceInfo{}).Where("invoice_id = ?", req.InvoiceID).First(&invoiceInfo)
+	invoiceInfoToJson, _ := json.Marshal(invoiceInfo)
+	addressInfo := gorm_model.YounggeeInvoiceAddress{}
+	db2 := GetReadDB(ctx)
+	db2.Debug().Model(gorm_model.YounggeeInvoiceAddress{}).Where("address_id = ?", req.AddressID).First(&addressInfo)
+	addressInfoToJson, _ := json.Marshal(addressInfo)
+
+	req.RechargeIds = util.RemoveStrRepByMap(req.RechargeIds)
+	for _, rechargeId := range req.RechargeIds {
+		rechargeId1 := rechargeId
+		rechargeInfo := gorm_model.YounggeeRechargeRecord{}
+		fmt.Println("rechargeId1:", rechargeId1)
+		db3 := GetReadDB(ctx)
+		db3.Model(gorm_model.YounggeeRechargeRecord{}).Where("recharge_id = ?", rechargeId1).Find(&rechargeInfo)
+		db := GetReadDB(ctx)
+		err := db.Debug().Model(gorm_model.YounggeeInvoiceRecord{}).Create(&gorm_model.YounggeeInvoiceRecord{
+			BillingID:     GetBillingId(ctx, enterpriseId),
+			EnterpriseID:  enterpriseId,
+			InvoiceAmount: rechargeInfo.RechargeAmount,
+			InvoiceSnap:   string(invoiceInfoToJson),
+			AddressSnap:   string(addressInfoToJson),
+			Status:        1,
+			InvoiceType:   invoiceInfo.InvoiceType,
+			Phone:         invoiceInfo.RegisteredPhone,
+			SubmitAt:      time.Now(),
+		}).Error
+		if err != nil {
+			return err
+		}
+	}
+	db3 := GetReadDB(ctx)
+	return db3.Debug().Model(gorm_model.YounggeeRechargeRecord{}).Where("recharge_id IN ?", req.RechargeIds).Updates(gorm_model.YounggeeRechargeRecord{
+		InvoiceStatus: 3,
+	}).Error
+}
+
+func GetBillingId(ctx context.Context, enterpriseId string) string {
+	db := GetReadDB(ctx)
+	// 1、年月日
+	year := time.Now().Year()
+	month := time.Now().Month()
+	day := time.Now().Day()
+	yearData, _ := util.GetDayNum("year", year)
+	monthData, _ := util.GetDayNum("month", int(month))
+	dayData, _ := util.GetDayNum("day", day)
+	sum := 0
+	sum += dayData + monthData
+	leap := 0
+	if (yearData%400 == 0) || ((yearData%4 == 0) && (yearData%100 != 0)) {
+		leap = 1
+	}
+	if (leap == 1) && (monthData > 2) {
+		sum += 1
+	}
+	last := ""
+	billingIdPrefix := "9" + conv.MustString(enterpriseId)[len(conv.MustString(enterpriseId))-2:] + conv.MustString(sum)
+	var billingIdLast string
+	err := db.Model(gorm_model.YounggeeInvoiceRecord{}).Select("billing_id").Where("billing_id like ?", billingIdPrefix+"%").
+		Last(&billingIdLast).Error
+	if err != nil {
+		last = "0"
+	} else {
+		last = billingIdLast[len(billingIdLast)-2:]
+	}
+	var lastInt int
+	lastInt = conv.MustInt(last)
+	if lastInt+1 < 10 {
+		last = "0" + conv.MustString(conv.MustInt(last)+1)
+	} else {
+		last = conv.MustString(conv.MustInt(last) + 1)
+	}
+	return billingIdPrefix + last
+}
+func GetInvoiceRecords(ctx context.Context, req *http_model.GetInvoiceRecordRequest, enterpriseID string) (*http_model.InvoiceRecordsData, error) {
+	db := GetReadDB(ctx)
+	var invoiceRecords []*gorm_model.YounggeeInvoiceRecord
+	db = db.Debug().Model(gorm_model.YounggeeInvoiceRecord{}).Where("status = 2 and enterprise_id = ?", enterpriseID)
+	if req.BillingAt != "" {
+		db = db.Where("billing_at like ?", req.BillingAt+"%")
+	}
+	err := db.Order("billing_at desc").Find(&invoiceRecords).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetInvoiceRecords] error query mysql limit, err:%+v", err)
+		return nil, err
+	}
+	// var enterpriseIds []string
+	// for _, invoiceRecord := range invoiceRecords {
+	// 	enterpriseIds = append(enterpriseIds, invoiceRecord.EnterpriseID)
+	// }
+	// util.RemoveStrRepByMap(enterpriseIds)
+	// enterpriseIdToUserInfoMap := make(map[string]gorm_model.Enterprise)
+	// db1 := GetReadDB(ctx)
+	// for _, v := range enterpriseIds {
+	// 	enterpriseInfo := gorm_model.Enterprise{}
+	// 	db1.Model(gorm_model.Enterprise{}).Where("enterprise_id = ?", v).Find(&enterpriseInfo)
+	// 	enterpriseIdToUserInfoMap[v] = enterpriseInfo
+	// }
+	var InvoiceRecords []*http_model.InvoiceRecordsPreviews
+	for _, invoiceRecord := range invoiceRecords {
+		InvoiceRecord := new(http_model.InvoiceRecordsPreviews)
+		InvoiceRecord.BillingId = invoiceRecord.BillingID
+		InvoiceRecord.InvoiceInfo = invoiceRecord.InvoiceSnap
+		InvoiceRecord.AddressInfo = invoiceRecord.AddressSnap
+		InvoiceRecord.InvoiceType = invoiceRecord.InvoiceType
+		InvoiceRecord.Amount = invoiceRecord.InvoiceAmount
+		InvoiceRecord.ShipmentNumber = invoiceRecord.ShipmentNumber
+		InvoiceRecord.BillingAt = conv.MustString(invoiceRecord.BillingAt, "")[:19]
+		InvoiceRecords = append(InvoiceRecords, InvoiceRecord)
+	}
+	var InvoiceRecordsData http_model.InvoiceRecordsData
+	InvoiceRecordsData.InvoiceRecordsPreviews = InvoiceRecords
+	return &InvoiceRecordsData, nil
+}

+ 75 - 0
db/job.go

@@ -0,0 +1,75 @@
+package db
+
+import (
+	"context"
+	"youngee_b_api/model/gorm_model"
+)
+
+// CreateJob 新建岗位
+func CreateJob(ctx context.Context, job gorm_model.YounggeeJob) error {
+	db := GetWriteDB(ctx)
+	err := db.Create(&job).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// UpdateJob 更新岗位
+func UpdateJob(ctx context.Context, job gorm_model.YounggeeJob) error {
+	db := GetWriteDB(ctx)
+	whereCondition := gorm_model.YounggeeJob{JobId: job.JobId}
+	err := db.Model(&gorm_model.YounggeeJob{}).Where(whereCondition).Updates(job).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// DeleteJob 删除岗位
+func DeleteJob(ctx context.Context, job gorm_model.YounggeeJob) error {
+	db := GetWriteDB(ctx)
+	whereCondition := gorm_model.YounggeeJob{JobId: job.JobId}
+	err := db.Where(whereCondition).Delete(&gorm_model.YounggeeJob{}).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// FindJobByEnterpriseId 按服务商ID查找岗位信息
+func FindJobByEnterpriseId(ctx context.Context, job gorm_model.YounggeeJob) ([]*gorm_model.YounggeeJob, error) {
+	db := GetReadDB(ctx)
+	var Jobs []*gorm_model.YounggeeJob
+	whereCondition := gorm_model.YounggeeJob{SupplierId: job.SupplierId}
+	err := db.Model(gorm_model.YounggeeJob{}).Where(whereCondition).Find(&Jobs).Error
+	if err != nil {
+		return nil, err
+	}
+	return Jobs, nil
+}
+
+// FindJobByJobId 按照岗位Id查找岗位信息
+func FindJobByJobId(ctx context.Context, jobId int) (*gorm_model.YounggeeJob, error) {
+	db := GetReadDB(ctx)
+	var Job *gorm_model.YounggeeJob
+	whereCondition := gorm_model.YounggeeJob{JobId: jobId}
+	err := db.Model(gorm_model.YounggeeJob{}).Where(whereCondition).Find(&Job).Error
+	if err != nil {
+		return nil, err
+	}
+	return Job, nil
+}
+
+/*
+func GetRewardStrategyBySelectionId(ctx context.Context, SelectionId string) ([]*gorm_model.RewardStrategy, error) {
+	db := GetReadDB(ctx)
+	var RewardStrategys []*gorm_model.RewardStrategy
+	err := db.Model(gorm_model.RewardStrategy{}).Where("selection_id = ?", SelectionId).Find(&RewardStrategys).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetRewardStrategyBySelectionId] error query, err:%+v", err)
+		return nil, err
+	}
+	return RewardStrategys, nil
+}
+*/

+ 291 - 0
db/link.go

@@ -0,0 +1,291 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"reflect"
+	"strings"
+	"time"
+	"youngee_b_api/model/common_model"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/util"
+
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+)
+
+// GetTaskLinkList 查询上传链接的task list
+func GetTaskLinkList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.TaskLinkInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if tag == "link_status" {
+			fmt.Printf("link %+v", value.Interface() == int64(0))
+			if value.Interface() == int64(0) {
+				db = db.Where("task_stage = 12")
+			} else {
+				db = db.Where("task_stage > 12 and task_stage <> 16")
+			}
+			continue
+		} else if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" || tag == "strategy_id" {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+	db1 := GetReadDB(ctx)
+	db1 = db1.Debug().Model(gorm_model.YounggeeLinkInfo{})
+
+	var LinkInfos []gorm_model.YounggeeLinkInfo
+	db1 = db1.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id IN ? AND is_submit=? ", taskIds, 1)
+	if conditions.LinkStatus == int64(0) {
+		db1 = db1.Where("is_review = 0").Find(&LinkInfos)
+	} else {
+		db1 = db1.Where("is_ok = 1").Find(&LinkInfos)
+	}
+	LinkMap := make(map[string]gorm_model.YounggeeLinkInfo)
+	for _, LinkInfo := range LinkInfos {
+		LinkMap[LinkInfo.TaskID] = LinkInfo
+	}
+	// 查询总数
+	var totalLink int64
+	if err := db1.Count(&totalLink).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	var misNum int64
+	if totalLink > totalTask {
+		misNum = totalLink - totalTask
+	} else {
+		misNum = totalTask - totalLink
+	}
+	logrus.Println("totalLink,totalTalent,misNum:", totalLink, totalTask, misNum)
+
+	// 查询该页数据
+	limit := pageSize + misNum
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err := db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskLinks []*http_model.TaskLink
+	var taskLinks []*http_model.TaskLinkInfo
+	var newTaskLinks []*http_model.TaskLinkInfo
+	for _, taskId := range taskIds {
+		TaskLink := new(http_model.TaskLink)
+		TaskLink.Talent = taskMap[taskId]
+		TaskLink.Link = LinkMap[taskId]
+		TaskLinks = append(TaskLinks, TaskLink)
+	}
+
+	taskLinks = pack.TaskLinkToTaskInfo(TaskLinks)
+
+	for _, v := range taskLinks {
+		if platform_nickname == "" {
+			newTaskLinks = append(newTaskLinks, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskLinks = append(newTaskLinks, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platform_nickname) {
+			newTaskLinks = append(newTaskLinks, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskLinks, totalTask, nil
+}
+
+// LinkOpinion 提交意见
+func LinkOpinion(ctx context.Context, TaskID string, ReviseOpinion string) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id = ? and is_review = 0", TaskID).Updates(map[string]interface{}{"revise_opinion": ReviseOpinion, "reject_at": time.Now(), "is_review": 1}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Link db] Update YounggeeLinkInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", TaskID).Updates(gorm_model.YoungeeTaskInfo{LinkStatus: 3}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Link db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", TaskID).Updates(gorm_model.YoungeeTaskInfo{TaskStage: 11}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Link db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+// AcceptLink 同意链接
+func AcceptLink(ctx context.Context, TaskIDs []string) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id in ?  and is_review = 0", TaskIDs).Updates(map[string]interface{}{"is_ok": 1, "is_review": 1, "agree_at": time.Now()}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Link db] Update YounggeeLinkInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{LinkStatus: 5}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Link db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{TaskStage: 13}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Link db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+// GetSpecialTaskLinkList 专项任务-查询上传链接的task list
+func GetSpecialTaskLinkList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.SpecialTaskLinkInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if tag == "link_status" {
+			fmt.Printf("link %+v", value.Interface() == int64(0))
+			if value.Interface() == int64(0) {
+				db = db.Where("task_stage = 12")
+			} else {
+				db = db.Where("task_stage > 12 and task_stage <> 16")
+			}
+			continue
+		} else if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+	db1 := GetReadDB(ctx)
+	db1 = db1.Debug().Model(gorm_model.YounggeeLinkInfo{})
+
+	var LinkInfos []gorm_model.YounggeeLinkInfo
+	db1 = db1.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id IN ? AND is_submit=? ", taskIds, 1)
+	if conditions.LinkStatus == int64(0) {
+		db1 = db1.Where("is_review = 0").Find(&LinkInfos)
+	} else {
+		db1 = db1.Where("is_ok = 1").Find(&LinkInfos)
+	}
+	LinkMap := make(map[string]gorm_model.YounggeeLinkInfo)
+	for _, LinkInfo := range LinkInfos {
+		LinkMap[LinkInfo.TaskID] = LinkInfo
+	}
+	// 查询总数
+	var totalLink int64
+	if err := db1.Count(&totalLink).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	var misNum int64
+	if totalLink > totalTask {
+		misNum = totalLink - totalTask
+	} else {
+		misNum = totalTask - totalLink
+	}
+	logrus.Println("totalLink,totalTalent,misNum:", totalLink, totalTask, misNum)
+
+	// 查询该页数据
+	limit := pageSize + misNum
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err := db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskLinks []*http_model.SpecialTaskLink
+	var taskLinks []*http_model.SpecialTaskLinkInfo
+	var newTaskLinks []*http_model.SpecialTaskLinkInfo
+	for _, taskId := range taskIds {
+		TaskLink := new(http_model.SpecialTaskLink)
+		TaskLink.Talent = taskMap[taskId]
+		TaskLink.Link = LinkMap[taskId]
+		TaskLinks = append(TaskLinks, TaskLink)
+	}
+
+	taskLinks = pack.SpecialTaskLinkToTaskInfo(TaskLinks)
+
+	for _, v := range taskLinks {
+		if platform_nickname == "" {
+			newTaskLinks = append(newTaskLinks, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskLinks = append(newTaskLinks, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platform_nickname) {
+			newTaskLinks = append(newTaskLinks, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskLinks, totalTask, nil
+}
+
+// GetLinkByTaskId 通过taskId查询链接信息
+func GetLinkByTaskId(ctx context.Context, taskIds string) ([]*gorm_model.YounggeeLinkInfo, error) {
+	db := GetReadDB(ctx)
+	var taskLink []*gorm_model.YounggeeLinkInfo
+	err := db.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id = ?", taskIds).Find(&taskLink).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Link db] Update YounggeeLinkInfo error,err:%+v", err)
+		return nil, err
+	}
+	return taskLink, nil
+}

+ 312 - 0
db/logistics.go

@@ -0,0 +1,312 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"reflect"
+	"strconv"
+	"strings"
+	"time"
+	"youngee_b_api/model/common_model"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/util"
+
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+	"github.com/tidwall/gjson"
+)
+
+// 新增
+func CreateLogistics(ctx context.Context, logistics gorm_model.YoungeeTaskLogistics, RecruitStrategyID int64) (*int64, error) {
+	db := GetReadDB(ctx)
+	err := db.Create(&logistics).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[logistics db] call CreateLogistics error,err:%+v", err)
+		return nil, err
+	}
+
+	return &logistics.LogisticsID, nil
+}
+
+// 修改接口
+func UpdateLogistics(ctx context.Context, logistics gorm_model.YoungeeTaskLogistics) (*int64, error) {
+	db := GetReadDB(ctx)
+	err := db.Model(&logistics).Where("task_id = ?", logistics.TaskID).Updates(logistics).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[logistics db] call UpdateLogistics error,err:%+v", err)
+		return nil, err
+	}
+	return &logistics.LogisticsID, nil
+}
+
+// 更改签收时间
+func SignForReceipt(ctx context.Context, taskID string) error {
+	db := GetReadDB(ctx)
+	t := time.Now()
+	err := db.Model(gorm_model.YoungeeTaskLogistics{}).Where("task_id = ?", taskID).Updates(gorm_model.YoungeeTaskLogistics{
+		Status:     1,
+		SignedTime: &t,
+	}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[logistics db] call UpdateLogistics error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+// 查询包含物流信息的task list
+func GetTaskLogisticsList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.TaskLogisticsInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+	db1 := GetReadDB(ctx)
+	db1 = db1.Debug().Model(gorm_model.YoungeeTaskLogistics{})
+
+	var logisticsInfos []gorm_model.YoungeeTaskLogistics
+	db1 = db1.Model(gorm_model.YoungeeTaskLogistics{}).Where("task_id IN ?", taskIds).Find(&logisticsInfos)
+	logisticsMap := make(map[string]gorm_model.YoungeeTaskLogistics)
+	for _, logisticsInfo := range logisticsInfos {
+		logisticsMap[logisticsInfo.TaskID] = logisticsInfo
+	}
+	// 查询总数
+	var totalLogistics int64
+	if err := db1.Count(&totalLogistics).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	var misNum int64
+	if totalLogistics > totalTask {
+		misNum = totalLogistics - totalTask
+	} else {
+		misNum = totalTask - totalLogistics
+	}
+	logrus.Println("totalLogistics,totalTalent,misNum:", totalLogistics, totalTask, misNum)
+
+	// 查询该页数据
+	limit := pageSize + misNum
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err := db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskLogisticss []*http_model.TaskLogistics
+	var taskLogisticss []*http_model.TaskLogisticsInfo
+	var newTaskLogisticss []*http_model.TaskLogisticsInfo
+	for _, taskId := range taskIds {
+		TaskLogistics := new(http_model.TaskLogistics)
+		TaskLogistics.Talent = taskMap[taskId]
+		TaskLogistics.Logistics = logisticsMap[taskId]
+		TalentPostAddrSnap := TaskLogistics.Talent.TalentPostAddrSnap
+		regionCode, _ := strconv.Atoi(conv.MustString(gjson.Get(TalentPostAddrSnap, "region_code")))
+		TaskLogistics.Region = GetRegion(ctx, regionCode)
+		TaskLogisticss = append(TaskLogisticss, TaskLogistics)
+	}
+
+	taskLogisticss = pack.TaskLogisticsToTaskInfo(TaskLogisticss)
+
+	for _, v := range taskLogisticss {
+		if platform_nickname == "" {
+			newTaskLogisticss = append(newTaskLogisticss, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskLogisticss = append(newTaskLogisticss, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platform_nickname) {
+			newTaskLogisticss = append(newTaskLogisticss, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskLogisticss, totalTask, nil
+}
+
+// 修改任务表的物流状态
+func ChangeLogisticsStatus(ctx context.Context, taskIds []string) error {
+	db := GetReadDB(ctx)
+	err := db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_id IN ?", taskIds).Update("logistics_status", 3).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[ChangeTaskStatus] error query mysql total, err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+func GetRegion(ctx context.Context, regionCode int) string {
+	db4 := GetReadDB(ctx)
+	var infoRegion *gorm_model.InfoRegion
+	fmt.Printf("regionCode: %+v", regionCode)
+	db4.Debug().Model(gorm_model.InfoRegion{}).Where("self_code = ?", regionCode).First(&infoRegion)
+
+	provinceCode := conv.MustString(regionCode, "")[0:2] + "0000"
+	var province *gorm_model.InfoRegion
+	db4.Debug().Model(gorm_model.InfoRegion{}).Where("self_code = ?", conv.MustInt(provinceCode, 0)).First(&province)
+
+	cityCode := conv.MustString(regionCode, "")[0:4] + "00"
+	var city *gorm_model.InfoRegion
+	db4.Debug().Model(gorm_model.InfoRegion{}).Where("self_code = ?", conv.MustInt(cityCode, 0)).First(&city)
+	fmt.Printf(province.RegionName + city.RegionName + infoRegion.RegionName)
+	return province.RegionName + city.RegionName + infoRegion.RegionName
+}
+
+// GetSpecialTaskLogisticsList 查询专项包含物流信息的task list
+func GetSpecialTaskLogisticsList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.SpecialTaskLogisticsInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2 and project_id = ?", projectID)
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platformNickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platformNickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSpecialTaskLogisticsList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+	db1 := GetReadDB(ctx)
+	db1 = db1.Debug().Model(gorm_model.YoungeeTaskLogistics{})
+
+	var logisticsInfos []gorm_model.YoungeeTaskLogistics
+	db1 = db1.Model(gorm_model.YoungeeTaskLogistics{}).Where("task_id IN ?", taskIds).Find(&logisticsInfos)
+	logisticsMap := make(map[string]gorm_model.YoungeeTaskLogistics)
+	for _, logisticsInfo := range logisticsInfos {
+		logisticsMap[logisticsInfo.TaskID] = logisticsInfo
+	}
+	// 查询总数
+	var totalLogistics int64
+	if err := db1.Count(&totalLogistics).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSpecialTaskLogisticsList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	// 查询该页数据
+	limit := pageSize
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err := db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSpecialTaskLogisticsList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskLogisticss []*http_model.SpecialTaskLogistics
+	var taskLogisticss []*http_model.SpecialTaskLogisticsInfo
+	var newTaskLogisticss []*http_model.SpecialTaskLogisticsInfo
+	for _, taskId := range taskIds {
+		TaskLogistics := new(http_model.SpecialTaskLogistics)
+		TaskLogistics.Talent = taskMap[taskId]
+		TaskLogistics.Logistics = logisticsMap[taskId]
+		TalentPostAddrSnap := TaskLogistics.Talent.TalentPostAddrSnap
+		regionCode, _ := strconv.Atoi(conv.MustString(gjson.Get(TalentPostAddrSnap, "region_code"), ""))
+		TaskLogistics.Region = GetRegion(ctx, regionCode)
+		TaskLogisticss = append(TaskLogisticss, TaskLogistics)
+	}
+	taskLogisticss = pack.SpecialTaskLogisticsToTaskInfo(TaskLogisticss)
+
+	for _, v := range taskLogisticss {
+		if platformNickname == "" {
+			newTaskLogisticss = append(newTaskLogisticss, v)
+		} else if strings.Contains(v.PlatformNickname, platformNickname) {
+			newTaskLogisticss = append(newTaskLogisticss, v)
+		} else if strings.Contains(v.TaskID, platformNickname) {
+			newTaskLogisticss = append(newTaskLogisticss, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskLogisticss, totalTask, nil
+}
+
+func GetSecTaskLogisticsList(ctx context.Context, secTaskList []*http_model.SecTaskInfo, taskStage int, productType int) ([]*http_model.SecTaskInfo, error) {
+	db := GetReadDB(ctx)
+	if taskStage != 6 { // 已发货
+		// 查询youngee_task_logistics中物流信息
+		var taskIds []string
+		taskMap := make(map[string]*http_model.SecTaskInfo)
+		for _, secTask := range secTaskList {
+			taskIds = append(taskIds, secTask.SecTaskId)
+			taskMap[secTask.SecTaskId] = secTask
+		}
+
+		var logisticsInfos []gorm_model.YoungeeTaskLogistics
+		err := db.Model(gorm_model.YoungeeTaskLogistics{}).Where("task_id IN ?", taskIds).Find(&logisticsInfos).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		logisticsMap := make(map[string]gorm_model.YoungeeTaskLogistics)
+		for _, logisticsInfo := range logisticsInfos {
+			logisticsMap[logisticsInfo.TaskID] = logisticsInfo
+		}
+		// 融合信息
+		for i, secTask := range secTaskList {
+			taskID := secTask.SecTaskId
+			secTaskList[i].CompanyName = logisticsMap[taskID].CompanyName
+			secTaskList[i].LogisticsNumber = logisticsMap[taskID].LogisticsNumber
+			secTaskList[i].ExplorestorePeriod = logisticsMap[taskID].ExplorestorePeriod
+			secTaskList[i].ExplorestoreStarttime = logisticsMap[taskID].ExplorestoreStarttime
+			secTaskList[i].ExplorestoreEndtime = logisticsMap[taskID].ExplorestoreEndtime
+		}
+	}
+
+	return secTaskList, nil
+}

+ 101 - 0
db/message.go

@@ -0,0 +1,101 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"time"
+	"youngee_b_api/model/gorm_model"
+
+	"github.com/sirupsen/logrus"
+)
+
+// 通过secTaskId查询talentId,插入新消息
+func CreateMessageBySecTaskId(ctx context.Context, messageId int, messageType int, taskId string) error {
+	db := GetReadDB(ctx)
+	taskInfo := gorm_model.YounggeeSecTaskInfo{}
+	err := db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id = ?", taskId).Find(&taskInfo).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error read mysql, err:%+v", err)
+		return err
+	}
+
+	db1 := GetReadDB(ctx)
+	var projectName string
+	err = db1.Model(gorm_model.YounggeeSelectionInfo{}).Select("selection_name").Where("selection_id = ?", taskInfo.SelectionID).Find(&projectName).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error read mysql, err:%+v", err)
+		return err
+	}
+	messageInfo := gorm_model.YounggeeMessageInfo{
+		MessageID:   messageId,
+		MessageType: messageType,
+		CreatedAt:   time.Now(),
+		TalentID:    taskInfo.TalentID,
+		ProjectName: projectName,
+		IsReaded:    0,
+		IsDeleted:   0,
+	}
+	db2 := GetReadDB(ctx)
+	err = db2.Model(gorm_model.YounggeeMessageInfo{}).Create(&messageInfo).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error create mysql, err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+// 通过taskId查询talentId,插入新消息
+func CreateMessageByTaskId(ctx context.Context, messageId int, messageType int, taskId string) error {
+	db := GetReadDB(ctx)
+	taskInfo := gorm_model.YoungeeTaskInfo{}
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Find(&taskInfo).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error read mysql, err:%+v", err)
+		return err
+	}
+
+	db1 := GetReadDB(ctx)
+	var projectName string
+	err = db1.Model(gorm_model.ProjectInfo{}).Select("project_name").Where("project_id = ?", taskInfo.ProjectID).Find(&projectName).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error read mysql, err:%+v", err)
+		return err
+	}
+	fmt.Printf("project_name: %+v, project_id: %+v\n", projectName, taskInfo.ProjectID)
+	messageInfo := gorm_model.YounggeeMessageInfo{
+		MessageID:   messageId,
+		MessageType: messageType,
+		CreatedAt:   time.Now(),
+		TalentID:    taskInfo.TalentID,
+		ProjectName: projectName,
+		IsReaded:    0,
+		IsDeleted:   0,
+	}
+	db2 := GetReadDB(ctx)
+	err = db2.Model(gorm_model.YounggeeMessageInfo{}).Create(&messageInfo).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error create mysql, err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+// 插入新消息
+func CreateMessage(ctx context.Context, messageId int, messageType int, talentId string, projectName string) error {
+	db := GetReadDB(ctx)
+	messageInfo := gorm_model.YounggeeMessageInfo{
+		MessageID:   messageId,
+		MessageType: messageType,
+		CreatedAt:   time.Now(),
+		TalentID:    talentId,
+		ProjectName: projectName,
+		IsReaded:    0,
+		IsDeleted:   0,
+	}
+	err := db.Model(gorm_model.YounggeeMessageInfo{}).Create(&messageInfo).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error create mysql, err:%+v", err)
+		return err
+	}
+	return nil
+}

+ 368 - 0
db/number_info.go

@@ -0,0 +1,368 @@
+package db
+
+import (
+	"context"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+
+	"github.com/sirupsen/logrus"
+)
+
+func GetLogisticsNumberInfo(ctx context.Context, projectId string, strategyIds []int64) (*http_model.GetLogisticsNumberInfoData, error) {
+	var LogisticsNumberInfoDataList http_model.GetLogisticsNumberInfoData
+
+	for _, strategyId := range strategyIds {
+		var LogisticsNumberInfoData http_model.LogisticsNumberInfo
+		LogisticsNumberInfoData.StrategyId = strategyId
+		db := GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err := db.Where("logistics_status = 1").Count(&LogisticsNumberInfoData.UndeliveredNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Where("logistics_status = 2").Count(&LogisticsNumberInfoData.DeliveredNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Where("logistics_status = 3").Count(&LogisticsNumberInfoData.SignedNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Count(&LogisticsNumberInfoData.DeliverNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+
+		LogisticsNumberInfoDataList.LogisticsNumberInfoList = append(LogisticsNumberInfoDataList.LogisticsNumberInfoList, &LogisticsNumberInfoData)
+	}
+	return &LogisticsNumberInfoDataList, nil
+}
+
+func GetReviewNumberInfo(ctx context.Context, projectId string, strategyIds []int64) (*http_model.GetReviewNumberInfoData, error) {
+	var ReviewNumberInfoDataList http_model.GetReviewNumberInfoData
+
+	for _, strategyId := range strategyIds {
+		var ReviewNumberInfoData http_model.ReviewNumberInfo
+		ReviewNumberInfoData.StrategyId = strategyId
+		db := GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err := db.Where("task_stage = 8").Count(&ReviewNumberInfoData.ScriptUnreviewNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Where("task_stage > 8").Count(&ReviewNumberInfoData.ScriptPassedNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Where("task_stage = 10").Count(&ReviewNumberInfoData.SketchUnreviewNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Where("task_stage > 10").Count(&ReviewNumberInfoData.SketchPassedNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Count(&ReviewNumberInfoData.ReviewNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+
+		ReviewNumberInfoDataList.ReviewNumberInfoList = append(ReviewNumberInfoDataList.ReviewNumberInfoList, &ReviewNumberInfoData)
+	}
+	return &ReviewNumberInfoDataList, nil
+}
+
+func GetLinkNumberInfo(ctx context.Context, projectId string, strategyIds []int64) (*http_model.GetLinkNumberInfoData, error) {
+	var LinkNumberInfoDataList http_model.GetLinkNumberInfoData
+
+	for _, strategyId := range strategyIds {
+		var LinkNumberInfoData http_model.LinkNumberInfo
+		LinkNumberInfoData.StrategyId = strategyId
+		db := GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err := db.Where("task_stage = 12").Count(&LinkNumberInfoData.LinkUnreviewNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Where("task_stage > 12").Count(&LinkNumberInfoData.LinkPassedNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Count(&LinkNumberInfoData.LinkNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+
+		LinkNumberInfoDataList.LinkNumberInfoList = append(LinkNumberInfoDataList.LinkNumberInfoList, &LinkNumberInfoData)
+	}
+	return &LinkNumberInfoDataList, nil
+}
+
+func GetDataNumberInfo(ctx context.Context, projectId string, strategyIds []int64) (*http_model.GetDataNumberInfoData, error) {
+	var DataNumberInfoDataList http_model.GetDataNumberInfoData
+
+	for _, strategyId := range strategyIds {
+		var DataNumberInfoData http_model.DataNumberInfo
+		DataNumberInfoData.StrategyId = strategyId
+		db := GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err := db.Where("task_stage = 14").Count(&DataNumberInfoData.DataUnreviewNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Where("task_stage = 15").Count(&DataNumberInfoData.DataPassedNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2 and task_stage < 15", projectId, strategyId)
+		err = db.Count(&DataNumberInfoData.DataNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+
+		DataNumberInfoDataList.DataNumberInfoList = append(DataNumberInfoDataList.DataNumberInfoList, &DataNumberInfoData)
+	}
+	return &DataNumberInfoDataList, nil
+}
+
+func GetDefaultNumberInfo(ctx context.Context, projectId string, strategyIds []int64) (*http_model.GetDefaultNumberInfoData, error) {
+	var DefaultNumberInfoDataList http_model.GetDefaultNumberInfoData
+
+	for _, strategyId := range strategyIds {
+		var DefaultNumberInfoData http_model.DefaultNumberInfo
+		DefaultNumberInfoData.StrategyId = strategyId
+		db := GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err := db.Where("complete_status <> 4").Count(&DefaultNumberInfoData.ShouldFinishNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Where("cur_default_type = 1").Count(&DefaultNumberInfoData.UnuploadScriptNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Where("cur_default_type = 3").Count(&DefaultNumberInfoData.UnuploadSketchNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Where("cur_default_type = 5").Count(&DefaultNumberInfoData.UnuploadLinkNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Where("cur_default_type = 7").Count(&DefaultNumberInfoData.UnuploadDataNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Where("complete_status = 4").Count(&DefaultNumberInfoData.TerminateNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+
+		DefaultNumberInfoDataList.DefaultNumberInfoList = append(DefaultNumberInfoDataList.DefaultNumberInfoList, &DefaultNumberInfoData)
+	}
+	return &DefaultNumberInfoDataList, nil
+}
+
+func GetFinishNumberInfo(ctx context.Context, projectId string, strategyIds []int64) (*http_model.GetFinishNumberInfoData, error) {
+	var FinishNumberInfoDataList http_model.GetFinishNumberInfoData
+
+	for _, strategyId := range strategyIds {
+		var FinishNumberInfoData http_model.FinishNumberInfo
+		FinishNumberInfoData.StrategyId = strategyId
+		db := GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err := db.Count(&FinishNumberInfoData.ShouldFinishNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ? and task_status = 2", projectId, strategyId)
+		err = db.Where("task_stage = 15").Count(&FinishNumberInfoData.FinishedNumber).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		FinishNumberInfoDataList.FinishNumberInfoList = append(FinishNumberInfoDataList.FinishNumberInfoList, &FinishNumberInfoData)
+	}
+	return &FinishNumberInfoDataList, nil
+}
+
+func GetSpecialInviteNumber(ctx context.Context, projectId string) (*http_model.GetSpecialInviteNumberData, error) {
+	var specialInviteNumberData http_model.GetSpecialInviteNumberData
+	db := GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_stage != 3", projectId)
+	err := db.Where("task_status <> 2").Count(&specialInviteNumberData.UnpassNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ?", projectId)
+	err = db.Where("task_status = 2").Count(&specialInviteNumberData.PassNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	return &specialInviteNumberData, nil
+}
+
+func GetSpecialReviewNumber(ctx context.Context, projectId string) (*http_model.GetSpecialReviewNumberData, error) {
+	var specialReviewNumber http_model.GetSpecialReviewNumberData
+	db := GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2", projectId)
+	err := db.Where("").Count(&specialReviewNumber.ReviewNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2", projectId)
+	err = db.Where("task_stage = 8").Count(&specialReviewNumber.ScriptUnreviewNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2", projectId)
+	err = db.Where("task_stage > 8").Count(&specialReviewNumber.ScriptPassedNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2", projectId)
+	err = db.Where("task_stage = 10").Count(&specialReviewNumber.SketchUnreviewNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2", projectId)
+	err = db.Where("task_stage > 10").Count(&specialReviewNumber.SketchPassedNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	return &specialReviewNumber, nil
+}
+
+func GetSpecialLinkNumber(ctx context.Context, projectId string) (*http_model.GetSpecialLinkNumberData, error) {
+	var specialLinkNumber http_model.GetSpecialLinkNumberData
+	db := GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2", projectId)
+	err := db.Where("").Count(&specialLinkNumber.LinkNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2", projectId)
+	err = db.Where("task_stage = 12").Count(&specialLinkNumber.LinkUnreviewNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2", projectId)
+	err = db.Where("task_stage > 12").Count(&specialLinkNumber.LinkPassedNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	return &specialLinkNumber, nil
+}
+
+func GetSpecialDataNumber(ctx context.Context, projectId string) (*http_model.GetSpecialDataNumberData, error) {
+	var specialDataNumber http_model.GetSpecialDataNumberData
+	db := GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2", projectId)
+	err := db.Where("").Count(&specialDataNumber.DataNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2", projectId)
+	err = db.Where("task_stage = 14").Count(&specialDataNumber.DataUnreviewNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2", projectId)
+	err = db.Where("task_stage > 14").Count(&specialDataNumber.DataPassedNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	return &specialDataNumber, nil
+}
+
+func GetSpecialLogisticNumber(ctx context.Context, projectId string) (*http_model.GetSpecialLogisticNumberData, error) {
+	var specialLogisticNumberData http_model.GetSpecialLogisticNumberData
+	db := GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_stage != 3", projectId)
+	err := db.Where("task_status = 2").Count(&specialLogisticNumberData.DeliverNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSpecialLogisticNumber] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2", projectId)
+	err = db.Where("logistics_status = 3").Count(&specialLogisticNumberData.SignedNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSpecialLogisticNumber] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2", projectId)
+	err = db.Where("logistics_status = 1").Count(&specialLogisticNumberData.UndeliveredNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSpecialLogisticNumber] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2", projectId)
+	err = db.Where("logistics_status = 2").Count(&specialLogisticNumberData.DeliveredNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSpecialLogisticNumber] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	return &specialLogisticNumberData, nil
+}
+
+func GetSpecialSettleNumber(ctx context.Context, projectId string) (*http_model.GetSpecialSettleNumberData, error) {
+	var specialSettleNumber http_model.GetSpecialSettleNumberData
+	db := GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2 and task_stage = 15", projectId)
+	err := db.Where("").Count(&specialSettleNumber.SettleNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSpecialSettleNumber] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2 and task_stage = 15 and settle_status = 1", projectId)
+	err = db.Where("task_stage = 14").Count(&specialSettleNumber.UnsettleNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSpecialSettleNumber] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	db = GetReadDB(ctx).Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2 and task_stage = 15 and settle_status = 2", projectId)
+	err = db.Where("task_stage > 14").Count(&specialSettleNumber.SettledNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSpecialSettleNumber] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	return &specialSettleNumber, nil
+}

+ 59 - 0
db/pay_record.go

@@ -0,0 +1,59 @@
+package db
+
+import (
+	"context"
+	"time"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+
+	"github.com/issue9/conv"
+
+	"github.com/sirupsen/logrus"
+)
+
+// CreatePayRecord 新增
+func CreatePayRecord(ctx context.Context, enterpriseId string, payment float64, balance float64, payType int64, projectId string) (*int64, error) {
+	db := GetReadDB(ctx)
+	payRecord := gorm_model.EnterprisePayRecord{
+		EnterpriseID: enterpriseId,
+		Payment:      payment,
+		Balance:      balance,
+		PayType:      payType,
+		PayAt:        time.Now(),
+		ProjectID:    projectId,
+	}
+	err := db.Create(&payRecord).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[logistics db] call CreatePayRecord error,err:%+v", err)
+		return nil, err
+	}
+
+	return &payRecord.ID, nil
+}
+
+func GetRechargeRecord(ctx context.Context, enterpriseID string, confirmAt string, method int) (*http_model.RechargeRecordPreview, error) {
+	db := GetReadDB(ctx)
+	// 根据企业id过滤
+	db = db.Debug().Model(gorm_model.YounggeeRechargeRecord{}).Where("enterprise_id = ? and status = 2", enterpriseID)
+	if method == 2 {
+		db = db.Debug().Model(gorm_model.YounggeeRechargeRecord{}).Where("invoice_status = 2")
+	}
+	if confirmAt != "" {
+		db = db.Where("confirm_at like ?", confirmAt+"%")
+	}
+	var rechargeRecords []gorm_model.YounggeeRechargeRecord
+	db = db.Order("confirm_at desc").Find(&rechargeRecords)
+	RechargeRecordPreview := http_model.RechargeRecordPreview{}
+	for _, rechargeRecord := range rechargeRecords {
+		RechargeRecordData := new(http_model.RechargeRecordData)
+		RechargeRecordData.RechargeId = rechargeRecord.RechargeID
+		RechargeRecordData.RechargeAmount = conv.MustString(rechargeRecord.RechargeAmount)
+		RechargeRecordData.RechargeAmountReal = conv.MustString(rechargeRecord.RechargeAmount)
+		RechargeRecordData.TransferVoucher = conv.MustString(rechargeRecord.TransferVoucherUrl)
+		RechargeRecordData.PayMethod = consts.GetRechargeMethod(rechargeRecord.RechargeMethod)
+		RechargeRecordData.ConfirmAt = conv.MustString(rechargeRecord.ConfirmAt)[0:19]
+		RechargeRecordPreview.RechargeRecordData = append(RechargeRecordPreview.RechargeRecordData, RechargeRecordData)
+	}
+	return &RechargeRecordPreview, nil
+}

+ 195 - 0
db/product.go

@@ -0,0 +1,195 @@
+package db
+
+import (
+	"context"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+
+	"gorm.io/gorm"
+)
+
+func CreateProduct(ctx context.Context, product gorm_model.YounggeeProduct) (*int64, error) {
+	db := GetReadDB(ctx)
+	err := db.Create(&product).Error
+	if err != nil {
+		return nil, err
+	}
+	return &product.ProductID, nil
+}
+
+func UpdateProduct(ctx context.Context, product gorm_model.YounggeeProduct) (*int64, error) {
+	db := GetReadDB(ctx)
+	err := db.Model(&product).Updates(product).Error
+	if err != nil {
+		return nil, err
+	}
+	return &product.ProductID, nil
+}
+
+func GetProductByEnterpriseID(ctx context.Context, enterpriseID string) ([]gorm_model.YounggeeProduct, error) {
+	db := GetReadDB(ctx)
+	products := []gorm_model.YounggeeProduct{}
+	err := db.Where("enterprise_id = ?", enterpriseID).Find(&products).Error
+	if err != nil {
+		return nil, err
+	}
+	return products, nil
+}
+
+func GetProductByID(ctx context.Context, productID int64) (*gorm_model.YounggeeProduct, error) {
+	db := GetReadDB(ctx)
+	product := &gorm_model.YounggeeProduct{}
+	err := db.First(&product, productID).Error
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			return nil, nil
+		} else {
+			return nil, err
+		}
+	}
+	return product, nil
+}
+
+func GetProductIDByName(ctx context.Context, brandName string, productName string) (*int64, error) {
+	db := GetReadDB(ctx)
+	product := &gorm_model.YounggeeProduct{}
+	err := db.Where("product_name = ? AND brand_name = ?", productName, brandName).First(&product).Error
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			return nil, nil
+		} else {
+			return nil, err
+		}
+	}
+	return &product.ProductID, nil
+}
+
+func GetProductInfoBySelectionId(ctx context.Context, selectionId string) (*gorm_model.YounggeeProduct, error) {
+	db := GetReadDB(ctx)
+	productId := 0
+	err := db.Model(gorm_model.YounggeeSelectionInfo{}).Select("product_id").Where("selection_id = ?", selectionId).Find(&productId).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProductInfo] error query mysql, err:%+v", err)
+		return nil, err
+	}
+	productInfo := gorm_model.YounggeeProduct{}
+	err = db.Model(gorm_model.YounggeeProduct{}).Where("product_id = ?", productId).Find(&productInfo).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProductInfo] error query mysql, err:%+v", err)
+		return nil, err
+	}
+	return &productInfo, nil
+}
+
+func GetProductPhotoInfoBySelectionId(ctx context.Context, selectionId string) ([]*gorm_model.YounggeeProductPhoto, error) {
+	db := GetReadDB(ctx)
+	productId := 0
+	err := db.Model(gorm_model.YounggeeSelectionInfo{}).Select("product_id").Where("selection_id = ?", selectionId).Find(&productId).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProductInfo] error query mysql, err:%+v", err)
+		return nil, err
+	}
+	var productPhotoInfo []*gorm_model.YounggeeProductPhoto
+	err = db.Model(gorm_model.YounggeeProductPhoto{}).Where("product_id = ?", productId).Find(&productPhotoInfo).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProductInfo] error query mysql, err:%+v", err)
+		return nil, err
+	}
+	return productPhotoInfo, nil
+}
+
+func GetAllProduct(ctx context.Context, req *http_model.GetAllProductRequest, enterpriseID string) ([]*http_model.ProjectBriefInfo, int64, error) {
+	var ProjectBriefInfos []*http_model.ProjectBriefInfo
+	db := GetReadDB(ctx)
+	var projectInfos []*gorm_model.ProjectInfo
+	db = db.Debug().Model(gorm_model.ProjectInfo{}).Where("project_status>2")
+	if req.Platform != 0 {
+		db = db.Model(gorm_model.ProjectInfo{}).Where("project_platform = ?", req.Platform)
+	}
+	if req.FeeForm != 0 {
+		db = db.Model(gorm_model.ProjectInfo{}).Where("fee_form = ?", req.FeeForm)
+	}
+	if req.ProjectForm != 0 {
+		db = db.Model(gorm_model.ProjectInfo{}).Where("project_form = ?", req.ProjectForm)
+	}
+	// 查询总数
+	var total int64
+	if err := db.Count(&total).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetAllProduct] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	// 查询该页数据
+	limit := req.PageSize
+	offset := req.PageSize * req.PageNum // assert pageNum start with 0
+	err := db.Order("submit_at desc").Limit(int(limit)).Offset(int(offset)).Find(&projectInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSelectionList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	projectIdToRecruitStrategy := make(map[string][]*gorm_model.RecruitStrategy)
+	platformToPlatformIcon := make(map[int64]string)
+	projectIdToSignNum := make(map[string]int64)
+	for _, projectInfo := range projectInfos {
+		var RecruitStrategys []*gorm_model.RecruitStrategy
+		db1 := GetReadDB(ctx)
+		err := db1.Debug().Model(gorm_model.RecruitStrategy{}).Where("project_id = ?", projectInfo.ProjectID).Find(&RecruitStrategys).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetAllProduct] error query RecruitStrategys, err:%+v", err)
+			return nil, 0, err
+		}
+		projectIdToRecruitStrategy[projectInfo.ProjectID] = RecruitStrategys
+	}
+	for _, projectInfo := range projectInfos {
+		PlatformIcon := ""
+		db1 := GetReadDB(ctx)
+		err := db1.Debug().Model(gorm_model.InfoThirdPlatform{}).Select("platform_icon").Where("platform_id = ?", projectInfo.ProjectPlatform).Find(&PlatformIcon).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetAllProduct] error query PlatformIcon, err:%+v", err)
+			return nil, 0, err
+		}
+		platformToPlatformIcon[projectInfo.ProjectPlatform] = PlatformIcon
+	}
+	for _, projectInfo := range projectInfos {
+		var SignNum int64
+		db1 := GetReadDB(ctx)
+		err := db1.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ?", projectInfo.ProjectID).Count(&SignNum).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetAllProduct] error query SignNum, err:%+v", err)
+			return nil, 0, err
+		}
+		projectIdToSignNum[projectInfo.ProjectID] = SignNum
+	}
+	for _, projectInfo := range projectInfos {
+		ProjectBriefInfo := new(http_model.ProjectBriefInfo)
+		ProjectBriefInfo.ProjectID = projectInfo.ProjectID
+		ProjectBriefInfo.ProjectForm = projectInfo.ProjectForm
+		ProjectBriefInfo.ProjectName = projectInfo.ProjectName
+		ProjectBriefInfo.ProductSnap = projectInfo.ProductSnap
+		ProjectBriefInfo.ProductPhotoSnap = projectInfo.ProductPhotoSnap
+		ProjectBriefInfo.Platform = consts.GetProjectPlatform(projectInfo.ProjectPlatform)
+		ProjectBriefInfo.PlatformIcon = platformToPlatformIcon[projectInfo.ProjectPlatform]
+		ProjectBriefInfo.RecruitStrategys = projectIdToRecruitStrategy[projectInfo.ProjectID]
+		ProjectBriefInfo.SignNum = projectIdToSignNum[projectInfo.ProjectID]
+		ProjectBriefInfos = append(ProjectBriefInfos, ProjectBriefInfo)
+	}
+	return ProjectBriefInfos, total, nil
+}
+
+func GetProductType(ctx context.Context, selectionId string) (*int, error) {
+	db := GetReadDB(ctx)
+	var productId int
+	err := db.Model(gorm_model.YounggeeSelectionInfo{}).Select("product_id").Where("selection_id = ?", selectionId).Find(&productId).Error
+	if err != nil || productId == 0 {
+		logrus.WithContext(ctx).Errorf("[GetProductType] error query mysql, err:%+v", err)
+		return nil, err
+	}
+	var productType int
+	err = db.Model(gorm_model.YounggeeProduct{}).Select("product_type").Where("product_id = ?", productId).Find(&productType).Error
+	if err != nil || productType == 0 {
+		logrus.WithContext(ctx).Errorf("[GetProductType] error query mysql, err:%+v", err)
+		return nil, err
+	}
+	return &productType, nil
+}

+ 34 - 0
db/product_photo.go

@@ -0,0 +1,34 @@
+package db
+
+import (
+	"context"
+	"youngee_b_api/model/gorm_model"
+)
+
+func CreateProductPhoto(ctx context.Context, productPhotos []gorm_model.YounggeeProductPhoto) error {
+	db := GetReadDB(ctx)
+	err := db.Create(&productPhotos).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func GetProductPhotoByProductID(ctx context.Context, productID int64) ([]gorm_model.YounggeeProductPhoto, error) {
+	db := GetReadDB(ctx)
+	productPhotos := []gorm_model.YounggeeProductPhoto{}
+	err := db.Where("product_id = ?", productID).Find(&productPhotos).Error
+	if err != nil {
+		return nil, err
+	}
+	return productPhotos, nil
+}
+
+func DeleteProductPhotoByProductID(ctx context.Context, productID int64) error {
+	db := GetReadDB(ctx)
+	err := db.Where("product_id = ?", productID).Delete(&gorm_model.YounggeeProductPhoto{}).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}

+ 335 - 0
db/project.go

@@ -0,0 +1,335 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"reflect"
+	"strings"
+	"time"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/common_model"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/util"
+
+	"github.com/issue9/conv"
+
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+	"gorm.io/gorm"
+)
+
+func CreateProject(ctx context.Context, projectInfo gorm_model.ProjectInfo) (*string, error) {
+	db := GetWriteDB(ctx)
+	err := db.Create(&projectInfo).Error
+	if err != nil {
+		return nil, err
+	}
+	return &projectInfo.ProjectID, nil
+}
+func UpdateProject(ctx context.Context, project gorm_model.ProjectInfo) (*string, error) {
+	db := GetReadDB(ctx)
+	err := db.Model(&project).Updates(project).Error
+	if err != nil {
+		return nil, err
+	}
+	return &project.ProjectID, nil
+}
+
+func DeleteProject(ctx context.Context, projectID string) (*string, error) {
+	db := GetReadDB(ctx)
+	err := db.Where("project_id = ?", projectID).Delete(&gorm_model.ProjectInfo{}).Error
+	if err != nil {
+		return nil, err
+	}
+	return &projectID, nil
+}
+
+func GetFullProjectList(ctx context.Context, pageSize, pageNum int32, condition *common_model.ProjectCondition) ([]*gorm_model.ProjectInfo, int64, error) {
+	db := GetReadDB(ctx)
+
+	// 根据企业id过滤
+	db = db.Debug().Model(gorm_model.ProjectInfo{}).Where("project_status =4")
+
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(condition).Elem()
+	conditionValue := reflect.ValueOf(condition).Elem()
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if (tag == "project_id" || tag == "project_name") && !util.IsBlank(value) {
+			db = db.Where(fmt.Sprintf("project_id like '%%%v%%' or project_name like '%%%v%%'", value.Interface(), value.Interface()))
+		} else if tag == "updated_at" && value.Interface() != "0" {
+			//db = db.Where(fmt.Sprintf("%s > ?", tag), value.Interface())
+			db = db.Where(fmt.Sprintf("updated_at like '%s%%'", value.Interface()))
+		} else if !util.IsBlank(value) && tag != "updated_at" {
+			db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+		}
+	}
+
+	// 查询总数
+	var total int64
+	var fullProjects []*gorm_model.ProjectInfo
+	if err := db.Count(&total).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetFullProjectList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	// 查询该页数据
+	limit := pageSize
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err := db.Order("updated_at desc").Limit(int(limit)).Offset(int(offset)).Find(&fullProjects).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetFullProjectList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	return fullProjects, total, nil
+}
+
+func GetProjectDraftList(ctx context.Context, enterpriseID string, pageSize, pageNum int32, condition *common_model.ProjectCondition) ([]*gorm_model.ProjectInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 根据企业id过滤
+	db = db.Debug().Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ?", enterpriseID)
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(condition).Elem()
+	conditionValue := reflect.ValueOf(condition).Elem()
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if (tag == "project_id" || tag == "project_name") && !util.IsBlank(value) {
+			db = db.Where(fmt.Sprintf("project_id like '%%%v%%' or project_name like '%%%v%%'", value.Interface(), value.Interface()))
+		} else if tag == "updated_at" && value.Interface() != "0" {
+			//db = db.Where(fmt.Sprintf("%s > ?", tag), value.Interface())
+			db = db.Where(fmt.Sprintf("updated_at like '%s%%'", value.Interface()))
+		} else if !util.IsBlank(value) && tag != "updated_at" {
+			db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+		}
+	}
+	// 查询总数
+	var total int64
+	var projectDrafts []*gorm_model.ProjectInfo
+	if err := db.Count(&total).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectDraftList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	// 查询该页数据
+	limit := pageSize
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err := db.Order("updated_at desc").Limit(int(limit)).Offset(int(offset)).Find(&projectDrafts).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectDraftList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	return projectDrafts, total, nil
+}
+
+func GetProjectTaskList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TaskConditions) ([]*http_model.ProjectTaskInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{})
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if !util.IsBlank(value) && tag != "platform_nickname" {
+			db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+		} else if tag == "platform_nickname" {
+			platform_nickname = fmt.Sprintf("%v", value.Interface())
+			continue
+		}
+	}
+
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询该页数据
+	limit := pageSize
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err := db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var taskDatas []*http_model.ProjectTaskInfo
+	var newTaskDatas []*http_model.ProjectTaskInfo
+
+	taskDatas = pack.TaskAccountToTaskInfo(taskInfos)
+
+	for _, v := range taskDatas {
+		if platform_nickname == "" {
+			newTaskDatas = append(newTaskDatas, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskDatas = append(newTaskDatas, v)
+		} else if strings.Contains(v.TaskID, platform_nickname) {
+			newTaskDatas = append(newTaskDatas, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskDatas, totalTask, nil
+}
+
+func GetProjectDetail(ctx context.Context, projectID string) (*gorm_model.ProjectInfo, error) {
+	db := GetReadDB(ctx)
+	var ProjectDetail *gorm_model.ProjectInfo
+	//fmt.Printf("项目ID:%+v", projectID)
+	err := db.Where("project_id = ?", projectID).First(&ProjectDetail).Error
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			return nil, nil
+		} else {
+			return nil, err
+		}
+	}
+	//fmt.Printf("项目详情:%+v", ProjectDetail)
+	return ProjectDetail, nil
+}
+
+func GetProjectPhoto(ctx context.Context, ProjectID string) ([]gorm_model.ProjectPhoto, error) {
+	db := GetReadDB(ctx)
+	ProjectPhoto := []gorm_model.ProjectPhoto{}
+	err := db.Where("project_id=?", ProjectID).Find(&ProjectPhoto).Error
+	if err != nil {
+		return nil, err
+	}
+	return ProjectPhoto, nil
+}
+
+func GetRecruitStrategys(ctx context.Context, ProjectID string) ([]gorm_model.RecruitStrategy, error) {
+	db := GetReadDB(ctx)
+	RecruitStrategys := []gorm_model.RecruitStrategy{}
+	err := db.Where("project_id=?", ProjectID).Find(&RecruitStrategys).Error
+	if err != nil {
+		return nil, err
+	}
+	return RecruitStrategys, nil
+}
+
+func UpdateProjectStatus(ctx context.Context, projectId string, status int64) error {
+	db := GetReadDB(ctx)
+	t := time.Now()
+	err := db.Model(gorm_model.ProjectInfo{}).
+		Where("project_id = ?", projectId).Updates(gorm_model.ProjectInfo{ProjectStatus: status, PayAt: &t}).Error
+	if err != nil {
+		log.Println("DB UpdateProjectStatus error :", err)
+		return err
+	}
+	return nil
+}
+
+func GetFeeDetail(ctx context.Context, enterpriseID string, EndTime string) (*http_model.FeeDetailPreview, error) {
+	db := GetReadDB(ctx)
+	// 根据企业id过滤
+	db = db.Debug().Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ? AND project_status = 10", enterpriseID)
+	if EndTime != "" {
+		db = db.Where("updated_at like ?", EndTime+"%")
+	}
+	var projectInfos []gorm_model.ProjectInfo
+	db = db.Order("updated_at desc").Find(&projectInfos)
+	FeeDetailPreview := http_model.FeeDetailPreview{}
+	for _, projectInfo := range projectInfos {
+		FeeDetailData := new(http_model.FeeDetailData)
+		FeeDetailData.ProjectID = projectInfo.ProjectID
+		FeeDetailData.ProjectName = projectInfo.ProjectName
+		FeeDetailData.ProjectType = consts.GetProjectType(projectInfo.ProjectType)
+		FeeDetailData.Payment = conv.MustString(projectInfo.PaymentAmount, "")
+		FeeDetailData.UpdatedAt = conv.MustString(projectInfo.UpdatedAt)[0:19]
+		FeeDetailPreview.FeeDetailData = append(FeeDetailPreview.FeeDetailData, FeeDetailData)
+	}
+	return &FeeDetailPreview, nil
+}
+
+func SetProjectFinish(ctx context.Context, projectId string) error {
+	db := GetReadDB(ctx)
+	var finishedNum int64
+	var unfinishedNum int64
+	db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2 AND task_stage < 15", projectId).Count(&unfinishedNum)
+	db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Count(&finishedNum)
+	if unfinishedNum == 0 && finishedNum != 0 {
+		// 2. 释放企业账户因项目冻结的资金
+		// 1) 计算剩余资金
+		db1 := GetReadDB(ctx)
+		var allPayment float64
+		var realPayment float64
+		err := db1.Model(gorm_model.YoungeeTaskInfo{}).
+			Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Pluck("COALESCE(SUM(all_payment), 0) as allPayment", &allPayment).Error
+		if err != nil {
+			log.Println("DB GetAutoCaseCloseTask error in data:", err)
+			return err
+		}
+		err = db1.Model(gorm_model.YoungeeTaskInfo{}).Select("sum(real_payment) as realPayment").
+			Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Pluck("COALESCE(SUM(real_payment), 0) as realPayment", &realPayment).Error
+		if err != nil {
+			log.Println("DB GetAutoCaseCloseTask error in data:", err)
+			return err
+		}
+		fmt.Println("企业应支付金额总计:", allPayment, "实际支付总计:", realPayment)
+		db2 := GetReadDB(ctx)
+		var enterpriseID int64
+		db2.Model(gorm_model.ProjectInfo{}).Select("enterprise_id").Where("project_id = ?", projectId).Find(&enterpriseID)
+		// 	2). 释放剩余资金
+		err = db1.Model(gorm_model.Enterprise{}).Where("enterprise_id = ?", enterpriseID).Updates(
+			map[string]interface{}{
+				"frozen_balance":    gorm.Expr("frozen_balance - ?", allPayment),
+				"balance":           gorm.Expr("balance - ?", realPayment),
+				"available_balance": gorm.Expr("available_balance + ?", allPayment-realPayment)}).Error
+		if err != nil {
+			log.Println("DB GetAutoCaseCloseTask error in data:", err)
+			return err
+		}
+
+		// 1. 更新项目状态为已结束
+		t := time.Now()
+		err = db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", projectId).Updates(gorm_model.ProjectInfo{ProjectStatus: 10, PaymentAmount: realPayment, FinishAt: &t}).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Project db] Update ProjectInfo error,err:%+v", err)
+			return err
+		}
+	}
+	return nil
+}
+
+func SetSpecialProjectFinish(ctx context.Context, projectId string) error {
+	db := GetReadDB(ctx)
+	var finishedNum int64
+	var unfinishedNum int64
+	db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2 AND task_stage < 15", projectId).Count(&unfinishedNum)
+	db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Count(&finishedNum)
+	if unfinishedNum == 0 && finishedNum != 0 {
+		// 1. 更新项目状态为已结束
+		t := time.Now()
+		err := db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", projectId).Updates(gorm_model.ProjectInfo{ProjectStatus: 10, FinishAt: &t}).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Project db] Update ProjectInfo error,err:%+v", err)
+			return err
+		}
+	}
+	return nil
+}
+
+func GetCreatingNumber(ctx context.Context, enterpriseID string) (*int64, error) {
+	db := GetReadDB(ctx)
+	var creatingNumber int64
+	err := db.Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ? and project_status = 1", enterpriseID).Count(&creatingNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Project db] Update ProjectInfo error,err:%+v", err)
+		return nil, err
+	}
+	return &creatingNumber, nil
+}

+ 32 - 0
db/project_photo.go

@@ -0,0 +1,32 @@
+package db
+
+import (
+	"context"
+	"youngee_b_api/model/gorm_model"
+)
+
+func CreateProjectPhoto(ctx context.Context, projectPhotos []gorm_model.ProjectPhoto) error {
+	db := GetReadDB(ctx)
+	err := db.Create(&projectPhotos).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+func DeleteProjectPhotoByProjecttID(ctx context.Context, productID string) error {
+	db := GetReadDB(ctx)
+	err := db.Where("project_id = ?", productID).Delete(&gorm_model.ProjectPhoto{}).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func DeletePhotoUrl(ctx context.Context, photoUrl string) error {
+	db := GetReadDB(ctx)
+	err := db.Where("photo_url = ?", photoUrl).Delete(&gorm_model.YounggeeProductPhoto{}).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}

+ 69 - 0
db/recruit_strategy.go

@@ -0,0 +1,69 @@
+package db
+
+import (
+	"context"
+	"github.com/sirupsen/logrus"
+	"gorm.io/gorm"
+	"youngee_b_api/model/gorm_model"
+)
+
+func CreateRecruitStrategy(ctx context.Context, recruitStrategys []gorm_model.RecruitStrategy) error {
+	db := GetReadDB(ctx)
+	err := db.Create(&recruitStrategys).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func DeleteRecruitStrategyByProjectID(ctx context.Context, projectID string) error {
+	db := GetReadDB(ctx)
+	err := db.Where("project_id = ?", projectID).Delete(&gorm_model.RecruitStrategy{}).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func CalculateSelectedNumberByRecruitStrategyID(ctx context.Context, recruitstrategyID int64, AddNumber int64) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.RecruitStrategy{}).Where("recruit_strategy_id = ?", recruitstrategyID).
+		Updates(map[string]interface{}{"selected_number": gorm.Expr("selected_number + ?", AddNumber), "waiting_number": gorm.Expr("waiting_number + ?", AddNumber)}).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func UpdateLogisticsNumber(ctx context.Context, RecruitStrategyID int64, delivered_value int64, waiting_value int64, signed_value int64) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.RecruitStrategy{}).Where("recruit_strategy_id = ?", RecruitStrategyID).
+		Updates(map[string]interface{}{"delivered_number": gorm.Expr("delivered_number + ?", delivered_value), "waiting_number": gorm.Expr("waiting_number + ?", waiting_value), "signed_number": gorm.Expr("signed_number + ?", signed_value)}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[logistics db] call CreateLogistics error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+func GetRecruitStrategyIdByTS(ctx context.Context, projectId string, strategyID int64) (*int64, error) {
+	db := GetReadDB(ctx)
+	RecruitStrategy := &gorm_model.RecruitStrategy{}
+	err := db.Model(gorm_model.RecruitStrategy{}).Where("project_id = ? AND strategy_id = ?", projectId, strategyID).Scan(RecruitStrategy).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[logistics db] call GetRecruitStrategyIdByTS error,err:%+v", err)
+		return nil, err
+	}
+	return &RecruitStrategy.RecruitStrategyID, nil
+}
+
+func GetRecruitStrategyByProjectId(ctx context.Context, projectId string) ([]gorm_model.RecruitStrategy, error) {
+	db := GetReadDB(ctx)
+	RecruitStrategys := []gorm_model.RecruitStrategy{}
+	err := db.Model(gorm_model.RecruitStrategy{}).Where("project_id = ? AND strategy_type = ?", projectId, 1).Scan(&RecruitStrategys).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[logistics db] call GetRecruitStrategyByProjectId error,err:%+v", err)
+		return nil, err
+	}
+	return RecruitStrategys, nil
+}

+ 177 - 0
db/s_project.go

@@ -0,0 +1,177 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"github.com/sirupsen/logrus"
+	"reflect"
+	"youngee_b_api/model/common_model"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/util"
+)
+
+// CreateSProject 新建服务商加入商单后的种草任务
+func CreateSProject(ctx context.Context, newSProject gorm_model.SProjectInfo) (int, error) {
+	db := GetWriteDB(ctx)
+	err := db.Create(&newSProject).Error
+	if err != nil {
+		return 0, err
+	}
+	return newSProject.SProjectId, nil
+}
+
+// GetSProjectList 根据服务商ID和其他附加条件查询种草任务列表
+func GetSProjectList(ctx context.Context, supplierId int, pageSize, pageNum int32, condition *common_model.SProjectCondition) ([]*gorm_model.SProjectInfo, int64, error) {
+	db := GetReadDB(ctx)
+
+	// 1. 根据服务商id过滤
+	db = db.Debug().Model(gorm_model.SProjectInfo{}).Where("supplier_id = ? and project_status <> 1", supplierId)
+
+	// 2. 根据SProjectCondition条件过滤
+	conditionType := reflect.TypeOf(condition).Elem()
+	conditionValue := reflect.ValueOf(condition).Elem()
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if (tag == "project_id" || tag == "project_name") && !util.IsBlank(value) {
+			db = db.Where(fmt.Sprintf("project_id like '%%%v%%' or project_name like '%%%v%%'", value.Interface(), value.Interface()))
+		} else if !util.IsBlank(value) && tag != "updated_at" {
+			db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+		}
+	}
+
+	// 3. 确定查询总数和返回当前页数据
+	var total int64
+	var SProjects []*gorm_model.SProjectInfo
+	if err := db.Count(&total).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetFullProjectList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	limit := pageSize
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err := db.Order("s_project_id desc").Limit(int(limit)).Offset(int(offset)).Find(&SProjects).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetFullProjectList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	return SProjects, total, nil
+}
+
+// GetSProjectDetail 查询服务商种草任务详情
+func GetSProjectDetail(ctx context.Context, sProjectId int) (*gorm_model.SProjectInfo, error) {
+	db := GetReadDB(ctx)
+	var sProjectInfo *gorm_model.SProjectInfo
+	// 1. 根据服务商种草任务id过滤
+	err := db.Model(gorm_model.SProjectInfo{}).Where("s_project_id = ?", sProjectId).Find(&sProjectInfo).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSProjectDetail] error query mysql, err:%+v", err)
+		return nil, err
+	}
+	return sProjectInfo, nil
+}
+
+// GetSSpecialProjectList 根据服务商ID和其他附加条件查询定向种草任务列表
+func GetSSpecialProjectList(ctx context.Context, supplierId int, pageSize, pageNum int32, condition *common_model.SSpecialProjectCondition) ([]*gorm_model.SProjectInfo, int64, error) {
+	db := GetReadDB(ctx)
+
+	// 1. 根据服务商id过滤
+	db = db.Debug().Model(gorm_model.SProjectInfo{}).Where("supplier_id = ? and project_status <> 1", supplierId)
+
+	// 2. 根据SProjectCondition条件过滤
+	conditionType := reflect.TypeOf(condition).Elem()
+	conditionValue := reflect.ValueOf(condition).Elem()
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if (tag == "project_id" || tag == "project_name") && !util.IsBlank(value) {
+			db = db.Where(fmt.Sprintf("project_id like '%%%v%%' or project_name like '%%%v%%'", value.Interface(), value.Interface()))
+		} else if !util.IsBlank(value) && tag != "updated_at" {
+			db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+		}
+	}
+
+	// 3. 确定查询总数和返回当前页数据
+	var total int64
+	var SProjects []*gorm_model.SProjectInfo
+	if err := db.Count(&total).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetFullProjectList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	limit := pageSize
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err := db.Order("s_project_id desc").Limit(int(limit)).Offset(int(offset)).Find(&SProjects).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetFullProjectList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	return SProjects, total, nil
+}
+
+// UpdateSProjectStatus 更新SProject信息
+func UpdateSProjectStatus(ctx context.Context, newSProject *http_model.SpecialSProjectAddToListRequest) error {
+	db := GetWriteDB(ctx)
+	whereCondition := gorm_model.SProjectInfo{SProjectId: newSProject.SProjectId}
+	sProjectInfo := gorm_model.SProjectInfo{
+		SProjectStatus: newSProject.SProjectStatus,
+		SubAccountId:   newSProject.SubAccountId,
+		OperatorType:   newSProject.OperatorType,
+	}
+	err := db.Model(&gorm_model.SProjectInfo{}).Where(whereCondition).Updates(sProjectInfo).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// CreateSpecialStrategy 创建定向种草任务服务商修改后的招募策略
+func CreateSpecialStrategy(ctx context.Context, recruitStrategy []gorm_model.RecruitStrategy) error {
+	db := GetWriteDB(ctx)
+	err := db.Create(&recruitStrategy).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// UpdateSProjectStrategyStatus 修改SProject的招募策略修改标志
+func UpdateSProjectStrategyStatus(ctx context.Context, req *http_model.SpecialAddStrategyRequest) error {
+	db := GetWriteDB(ctx)
+	whereCondition := gorm_model.SProjectInfo{SProjectId: req.SProjectId}
+	sProjectInfo := gorm_model.SProjectInfo{
+		CreateStrategyId:   req.CreateStrategyId,
+		StrategyStatus:     1,
+		CreateStrategyType: req.CreateStrategyType,
+	}
+	err := db.Model(&gorm_model.SProjectInfo{}).Where(whereCondition).Updates(sProjectInfo).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// GetFullSProjectBillList 查询公开种草任务账单列表
+func GetFullSProjectBillList(ctx context.Context, supplierId int, ProjectPlatform int, projectStatus int, pageSize, pageNum int32) ([]*gorm_model.SProjectInfo, int64, error) {
+	db := GetReadDB(ctx)
+
+	// 1. 根据服务商id过滤
+	db = db.Debug().Model(gorm_model.SProjectInfo{}).Where("supplier_id = ? and project_status = ? and project_platform = ?", supplierId, projectStatus, ProjectPlatform)
+
+	// 2. 确定查询总数和返回当前页数据
+	var total int64
+	var SProjects []*gorm_model.SProjectInfo
+	if err := db.Count(&total).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetFullProjectList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	limit := pageSize
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err := db.Order("s_project_id desc").Limit(int(limit)).Offset(int(offset)).Find(&SProjects).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetFullProjectList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	return SProjects, total, nil
+}

+ 281 - 0
db/script.go

@@ -0,0 +1,281 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"reflect"
+	"strings"
+	"time"
+	"youngee_b_api/model/common_model"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/util"
+
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+)
+
+// GetTaskScriptList 查询上传脚本的task list
+func GetTaskScriptList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.TaskScriptInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if tag == "script_status" {
+			fmt.Printf("script %+v", value.Interface() == int64(2))
+			if value.Interface() == int64(2) {
+				db = db.Where("task_stage = 8")
+			} else {
+				db = db.Where("task_stage > 8 and task_stage <> 16")
+			}
+			continue
+		} else if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" || tag == "strategy_id" {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+	db1 := GetReadDB(ctx)
+	db1 = db1.Debug().Model(gorm_model.YounggeeScriptInfo{})
+
+	var ScriptInfos []gorm_model.YounggeeScriptInfo
+	db1 = db1.Model(gorm_model.YounggeeScriptInfo{}).Where("task_id IN ? AND is_submit=? ", taskIds, 1)
+	if conditions.ScriptStatus == int64(2) {
+		db1 = db1.Where("is_review = 0").Find(&ScriptInfos)
+	} else {
+		db1 = db1.Where("is_ok = 1").Find(&ScriptInfos)
+	}
+	ScriptMap := make(map[string]gorm_model.YounggeeScriptInfo)
+	for _, ScriptInfo := range ScriptInfos {
+		ScriptMap[ScriptInfo.TaskID] = ScriptInfo
+	}
+	// 查询总数
+	var totalScript int64
+	if err := db1.Count(&totalScript).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	var misNum int64
+	if totalScript > totalTask {
+		misNum = totalScript - totalTask
+	} else {
+		misNum = totalTask - totalScript
+	}
+	logrus.Println("totalScript,totalTalent,misNum:", totalScript, totalTask, misNum)
+
+	// 查询该页数据
+	limit := pageSize + misNum
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err := db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskScripts []*http_model.TaskScript
+	var taskScripts []*http_model.TaskScriptInfo
+	var newTaskScripts []*http_model.TaskScriptInfo
+	for _, taskId := range taskIds {
+		TaskScript := new(http_model.TaskScript)
+		TaskScript.Talent = taskMap[taskId]
+		TaskScript.Script = ScriptMap[taskId]
+		TaskScripts = append(TaskScripts, TaskScript)
+	}
+
+	taskScripts = pack.TaskScriptToTaskInfo(TaskScripts)
+
+	for _, v := range taskScripts {
+		if platform_nickname == "" {
+			newTaskScripts = append(newTaskScripts, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskScripts = append(newTaskScripts, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platform_nickname) {
+			newTaskScripts = append(newTaskScripts, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskScripts, totalTask, nil
+}
+
+// ScriptOpinion 提交意见
+func ScriptOpinion(ctx context.Context, TaskID string, ReviseOpinion string) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YounggeeScriptInfo{}).Where("task_id = ? and is_review = 0", TaskID).Updates(map[string]interface{}{"revise_opinion": ReviseOpinion, "reject_at": time.Now(), "is_review": 1}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Script db] Update YounggeeScriptInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", TaskID).Updates(gorm_model.YoungeeTaskInfo{ScriptStatus: 3}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Script db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", TaskID).Updates(gorm_model.YoungeeTaskInfo{TaskStage: 7}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Script db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+// AcceptScript 同意脚本
+func AcceptScript(ctx context.Context, TaskIDs []string) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YounggeeScriptInfo{}).Where("task_id in ?  and is_review = 0", TaskIDs).Updates(map[string]interface{}{"is_ok": 1, "is_review": 1, "agree_at": time.Now()}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Script db] Update YounggeeScriptInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{ScriptStatus: 5}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Script db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{TaskStage: 9}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Script db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+// GetSpecialTaskScriptList 专项任务-查询上传脚本的task list
+func GetSpecialTaskScriptList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.SpecialTaskScriptInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if tag == "script_status" {
+			fmt.Printf("script %+v", value.Interface() == int64(2))
+			if value.Interface() == int64(2) {
+				db = db.Where("task_stage = 8")
+			} else {
+				db = db.Where("task_stage > 8 and task_stage <> 16")
+			}
+			continue
+		} else if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+	db1 := GetReadDB(ctx)
+	db1 = db1.Debug().Model(gorm_model.YounggeeScriptInfo{})
+
+	var ScriptInfos []gorm_model.YounggeeScriptInfo
+	db1 = db1.Model(gorm_model.YounggeeScriptInfo{}).Where("task_id IN ? AND is_submit=? ", taskIds, 1)
+	if conditions.ScriptStatus == int64(2) {
+		db1 = db1.Where("is_review = 0").Find(&ScriptInfos)
+	} else {
+		db1 = db1.Where("is_ok = 1").Find(&ScriptInfos)
+	}
+	ScriptMap := make(map[string]gorm_model.YounggeeScriptInfo)
+	for _, ScriptInfo := range ScriptInfos {
+		ScriptMap[ScriptInfo.TaskID] = ScriptInfo
+	}
+	// 查询总数
+	var totalScript int64
+	if err := db1.Count(&totalScript).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	var misNum int64
+	if totalScript > totalTask {
+		misNum = totalScript - totalTask
+	} else {
+		misNum = totalTask - totalScript
+	}
+	logrus.Println("totalScript,totalTalent,misNum:", totalScript, totalTask, misNum)
+
+	// 查询该页数据
+	limit := pageSize + misNum
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err := db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskScripts []*http_model.SpecialTaskScript
+	var taskScripts []*http_model.SpecialTaskScriptInfo
+	var newTaskScripts []*http_model.SpecialTaskScriptInfo
+	for _, taskId := range taskIds {
+		TaskScript := new(http_model.SpecialTaskScript)
+		TaskScript.Talent = taskMap[taskId]
+		TaskScript.Script = ScriptMap[taskId]
+		TaskScripts = append(TaskScripts, TaskScript)
+	}
+
+	taskScripts = pack.SpecialTaskScriptToTaskInfo(TaskScripts)
+
+	for _, v := range taskScripts {
+		if platform_nickname == "" {
+			newTaskScripts = append(newTaskScripts, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskScripts = append(newTaskScripts, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platform_nickname) {
+			newTaskScripts = append(newTaskScripts, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskScripts, totalTask, nil
+}

+ 307 - 0
db/sectask.go

@@ -0,0 +1,307 @@
+package db
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+	"github.com/tidwall/gjson"
+	"gorm.io/gorm"
+	"strings"
+	"time"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+)
+
+func GetSecTaskById(ctx context.Context, secTaskId string) (*gorm_model.YounggeeSecTaskInfo, error) {
+	db := GetWriteDB(ctx)
+	secTaskInfo := gorm_model.YounggeeSecTaskInfo{}
+	whereCondition := gorm_model.YounggeeSecTaskInfo{TaskID: secTaskId}
+	result := db.Where(&whereCondition).First(&secTaskInfo)
+	if result.Error != nil {
+		if errors.Is(result.Error, gorm.ErrRecordNotFound) {
+			return nil, nil
+		} else {
+			return nil, result.Error
+		}
+	}
+	return &secTaskInfo, nil
+}
+
+func GetSecTaskList(ctx context.Context, selectionId string, taskStatus int, searchValue string, pageSize, pageNum int64) ([]*http_model.SecTaskInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// var taskStages []int
+	var freeStages []int
+	var rewardStages []int
+	switch taskStatus {
+	case 3:
+		// 待选
+		freeStages = []int{1}
+		break
+	case 4:
+		// 申请成功
+		freeStages = []int{3, 4, 5}
+		break
+	case 6:
+		// 待发货
+		freeStages = []int{3}
+		break
+	case 7:
+		// 已发货
+		freeStages = []int{4}
+		break
+	case 8:
+		// 已收货
+		freeStages = []int{5}
+	case 9:
+		// 待领悬赏
+		rewardStages = []int{1}
+		break
+	case 10:
+		// 已领悬赏
+		rewardStages = []int{2}
+		break
+	case 11:
+		// 返回全部 使用场景-绑定免费领样策略
+		freeStages = []int{0, 1, 2, 3, 4, 5}
+		rewardStages = []int{0, 1}
+	}
+	fmt.Println("task_stages: ", freeStages, rewardStages)
+	if len(freeStages) == 0 {
+		// 根据悬赏阶段筛选
+		db = db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("selection_id = ? and reward_stage in ?", selectionId, rewardStages)
+	} else {
+		// 根据免费领样阶段筛选
+		db = db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("selection_id = ? and free_stage in ?", selectionId, freeStages)
+	}
+	// 查询总数
+	var total int64
+	var secTaskInfoList []*gorm_model.YounggeeSecTaskInfo
+	if err := db.Count(&total).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSelectionList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	// 查询该页数据
+	limit := pageSize
+	offset := pageSize * (pageNum - 1) // assert pageNum start with 0
+	err := db.Order("create_date desc").Limit(int(limit)).Offset(int(offset)).Find(&secTaskInfoList).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSelectionList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	fmt.Printf("secTaskInfoList:%+v", secTaskInfoList)
+	newSecTaskInfoList := pack.GormSecTaskListToHttpSecTaskList(secTaskInfoList)
+	fmt.Printf("newSecTaskInfoList:%+v", newSecTaskInfoList)
+
+	//for i, secTask := range newSecTaskInfoList {
+	//	if secTask.RegionCode != 0 {
+	//		newSecTaskInfoList[i].DetailAddr = GetRegion(ctx, secTask.RegionCode) + newSecTaskInfoList[i].DetailAddr
+	//	}
+	//}
+	var resSecTaskInfoList []*http_model.SecTaskInfo
+	if searchValue != "" {
+		for _, v := range newSecTaskInfoList {
+			if strings.Contains(v.SecTaskId, searchValue) {
+				resSecTaskInfoList = append(resSecTaskInfoList, v)
+			} else if strings.Contains(v.PlatformNickname, searchValue) {
+				resSecTaskInfoList = append(resSecTaskInfoList, v)
+			} else {
+				total--
+			}
+		}
+	} else {
+		resSecTaskInfoList = newSecTaskInfoList
+	}
+	fmt.Println("resSecTaskInfoList: ", &resSecTaskInfoList)
+	return resSecTaskInfoList, total, nil
+}
+
+func PassSecTaskCoop(ctx context.Context, selectionId string, taskIds []string) (bool, error) {
+	db := GetWriteDB(ctx)
+	// 1. 校验
+	var count int64
+	fmt.Println("task_ids: ", taskIds)
+	err := db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id IN ? AND free_stage = 1", taskIds).Count(&count).Error
+
+	fmt.Println("count: ", count)
+	if err != nil {
+		return false, err
+	}
+	if int64(len(taskIds)) == 0 || count != int64(len(taskIds)) {
+		return false, errors.New("任务id有误")
+	}
+
+	// 2. 查询任务对应达人id(用于生成达人消息)
+	var talentIds []string
+	err = db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id IN ?", taskIds).Select("talent_id").Find(&talentIds).Error
+	if err != nil {
+		return false, err
+	}
+	// 3. 查询任务对应选品名称(用于生成达人消息)
+	var selection gorm_model.YounggeeSelectionInfo
+	err = db.Model(gorm_model.YounggeeSelectionInfo{}).Where("selection_id = ?", selectionId).Find(&selection).Error
+	if err != nil {
+		return false, err
+	}
+	if int64(selection.RemainNum) < count {
+		if int64(len(taskIds)) == 0 || count != int64(len(taskIds)) {
+			return true, errors.New("剩余选品数量不足")
+		}
+	}
+
+	err = db.Transaction(func(tx *gorm.DB) error {
+		// 2. 修改任务状态和任务阶段
+		// 若选品不提供样品,则直接跳转执行阶段,否则进入发货阶段
+		if selection.SampleMode == 3 {
+			updateData := gorm_model.YounggeeSecTaskInfo{
+				TaskStatus:       2,
+				TaskStage:        8,
+				SelectDate:       time.Now(),
+				LogisticsStatus:  3,
+				AssignmentStatus: 1,
+			}
+			err = tx.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id IN ? AND task_stage = 3", taskIds).Updates(updateData).Error
+			if err != nil {
+				return err
+			}
+		} else {
+			// 免费领样
+			updateData := gorm_model.YounggeeSecTaskInfo{
+				TaskStatus:      2,
+				TaskStage:       6,
+				SelectDate:      time.Now(),
+				LogisticsStatus: 1,
+				FreeStage:       3,
+			}
+			err = tx.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id IN ? AND free_stage = 1", taskIds).Updates(updateData).Error
+			if err != nil {
+				return err
+			}
+		}
+		// 3. 更新选品剩余数量
+		err = tx.Model(gorm_model.YounggeeSelectionInfo{}).Where("selection_id = ?", selectionId).Updates(
+			map[string]interface{}{"remain_num": gorm.Expr("remain_num - ?", 1)}).Error
+		if err != nil {
+			return err
+		}
+
+		// 4. 生成达人消息
+		for _, talendId := range talentIds {
+			err = CreateMessage(ctx, 1, 1, talendId, selection.SelectionName)
+			if err != nil {
+				return err
+			}
+		}
+		// 返回 nil 提交事务
+		return nil
+	})
+	if err != nil {
+		return false, err
+	}
+	return true, nil
+}
+
+func RefuseSecTaskCoop(ctx context.Context, taskIds []string) (bool, error) {
+	db := GetWriteDB(ctx)
+	// 1. 校验
+	var count int64
+	err := db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id IN ? AND free_stage = 1", taskIds).Count(&count).Error
+	if err != nil {
+		return false, err
+	}
+	if count != int64(len(taskIds)) {
+		return false, errors.New("任务id有误")
+	}
+
+	// 查询任务对应达人id
+	var talentIds []string
+	err = db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id IN ?", taskIds).Select("talent_id").Find(&talentIds).Error
+	if err != nil {
+		return false, err
+	}
+
+	err = db.Transaction(func(tx *gorm.DB) error {
+		// 2. 修改任务状态和任务阶段
+		updateData := gorm_model.YounggeeSecTaskInfo{
+			TaskStatus:     3,
+			TaskStage:      5,
+			CompleteDate:   time.Now(),
+			CompleteStatus: 3,
+			FreeStage:      2,
+		}
+		err = tx.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id IN ? AND free_stage = 1", taskIds).Updates(updateData).Error
+		if err != nil {
+			return err
+		}
+
+		// 返回 nil 提交事务
+		return nil
+	})
+	if err != nil {
+		return false, err
+	}
+	return true, nil
+}
+
+func UpdateSecTask(ctx context.Context, updateData gorm_model.YounggeeSecTaskInfo) (bool, error) {
+	db := GetWriteDB(ctx)
+	whereCondition := gorm_model.YounggeeSecTaskInfo{
+		TaskID: updateData.TaskID,
+	}
+	err := db.Where(whereCondition).Updates(&updateData).Error
+	if err != nil {
+		return false, err
+	}
+	return true, nil
+}
+
+func GetSecTaskSettleList(ctx context.Context, secTaskList []*http_model.SecTaskInfo, selectionId string, taskStatus int) ([]*http_model.SecTaskInfo, error) {
+	db := GetWriteDB(ctx)
+	whereCondition := gorm_model.YounggeeSelectionInfo{
+		SelectionID: selectionId,
+	}
+	selectionInfo := gorm_model.YounggeeSelectionInfo{}
+	err := db.Model(gorm_model.YounggeeSelectionInfo{}).Where(whereCondition).Scan(&selectionInfo).Error
+	if err != nil {
+		return nil, err
+	}
+
+	// 获取返现金额、悬赏金额
+	fmt.Println("selectionInfo.ProductSnap: ", selectionInfo.ProductSnap)
+	price := conv.MustString(gjson.Get(selectionInfo.ProductSnap, "ProductPrice"), "")
+	for i, _ := range secTaskList {
+		secTaskList[i].TaskReward = selectionInfo.TaskReward
+		secTaskList[i].ReturnMoney = price
+	}
+
+	// 获取作业信息
+	var taskIds []string
+	taskMap := make(map[string]*http_model.SecTaskInfo)
+	for _, secTask := range secTaskList {
+		taskIds = append(taskIds, secTask.SecTaskId)
+		taskMap[secTask.SecTaskId] = secTask
+	}
+
+	var assignmentInfos []gorm_model.YounggeeAssignmentInfo
+	err = db.Model(gorm_model.YounggeeAssignmentInfo{}).Where("task_id IN ?", taskIds).Find(&assignmentInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	assignmentMap := make(map[string]gorm_model.YounggeeAssignmentInfo)
+	for _, assignmentInfo := range assignmentInfos {
+		assignmentMap[assignmentInfo.TaskID] = assignmentInfo
+	}
+	// 融合信息
+	for i, secTask := range secTaskList {
+		taskID := secTask.SecTaskId
+		secTaskList[i].AssignmentLink = assignmentMap[taskID].LinkUrl
+		secTaskList[i].DataScreenshot = assignmentMap[taskID].PhotoUrl
+		secTaskList[i].CreateDate = conv.MustString(assignmentMap[taskID].CreateAt, "")
+	}
+
+	return secTaskList, nil
+}

+ 39 - 0
db/sectask_logistics.go

@@ -0,0 +1,39 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"youngee_b_api/model/gorm_model"
+)
+
+func CreateSecTaskLogistics(ctx context.Context, logistics gorm_model.YoungeeTaskLogistics) (*int64, error) {
+	db := GetWriteDB(ctx)
+	err := db.Create(&logistics).Error
+	if err != nil {
+		return nil, err
+	}
+
+	return &logistics.LogisticsID, nil
+}
+
+func UpdateSecTaskLogistics(ctx context.Context, updateData gorm_model.YoungeeTaskLogistics) (*int64, error) {
+	db := GetWriteDB(ctx)
+	fmt.Println("logistics_id: ", updateData.LogisticsID)
+	fmt.Println("updateData: ", updateData)
+	err := db.Model(gorm_model.YoungeeTaskLogistics{}).Where("logistics_id", updateData.LogisticsID).Updates(&updateData).Error
+	if err != nil {
+		return nil, err
+	}
+
+	return &updateData.LogisticsID, nil
+}
+
+func GetLogistics(ctx context.Context, secTaskId string) (*gorm_model.YoungeeTaskLogistics, error) {
+	db := GetWriteDB(ctx)
+	logistics := gorm_model.YoungeeTaskLogistics{}
+	err := db.Model(gorm_model.YoungeeTaskLogistics{}).Where("task_id", secTaskId).First(&logistics).Error
+	if err != nil {
+		return nil, err
+	}
+	return &logistics, nil
+}

+ 316 - 0
db/selection.go

@@ -0,0 +1,316 @@
+package db
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+	"gorm.io/gorm"
+	"reflect"
+	"strings"
+	"youngee_b_api/model/common_model"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/util"
+)
+
+func CreateSelection(ctx context.Context, selectionInfo gorm_model.YounggeeSelectionInfo) error {
+	db := GetWriteDB(ctx)
+	err := db.Create(&selectionInfo).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func UpdateSelection(ctx context.Context, selectionInfo gorm_model.YounggeeSelectionInfo) error {
+	db := GetWriteDB(ctx)
+	whereCondition := gorm_model.YounggeeSelectionInfo{SelectionID: selectionInfo.SelectionID}
+	err := db.Model(&gorm_model.YounggeeSelectionInfo{}).Where(whereCondition).Updates(selectionInfo).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func DeleteSelection(ctx context.Context, SelectionId string) error {
+	db := GetReadDB(ctx)
+	err := db.Where("selection_id = ?", SelectionId).Delete(&gorm_model.YounggeeSelectionInfo{}).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func GetSelectionById(ctx context.Context, selectionId string) (*gorm_model.YounggeeSelectionInfo, error) {
+	db := GetWriteDB(ctx)
+	selectionInfo := gorm_model.YounggeeSelectionInfo{}
+	whereCondition := gorm_model.YounggeeSelectionInfo{SelectionID: selectionId}
+	result := db.Where(&whereCondition).First(&selectionInfo)
+	if result.Error != nil {
+		if errors.Is(result.Error, gorm.ErrRecordNotFound) {
+			return nil, nil
+		} else {
+			return nil, result.Error
+		}
+	}
+	return &selectionInfo, nil
+}
+
+func GetSelectionByEnterpiseIdAndProductId(ctx context.Context, enterpriseId string, productId int) (*gorm_model.YounggeeSelectionInfo, error) {
+	db := GetWriteDB(ctx)
+	selectionInfo := gorm_model.YounggeeSelectionInfo{}
+	whereCondition := gorm_model.YounggeeSelectionInfo{EnterpriseID: enterpriseId, ProductID: productId}
+	result := db.Where(&whereCondition).First(&selectionInfo)
+	if result.Error != nil {
+		if errors.Is(result.Error, gorm.ErrRecordNotFound) {
+			return nil, nil
+		} else {
+			return nil, result.Error
+		}
+	}
+	return &selectionInfo, nil
+}
+
+func GetSelectionList(ctx context.Context, enterpriseID string, pageSize, pageNum int64, conditions *common_model.SelectionConditions) ([]*gorm_model.YounggeeSelectionInfo, int64, error) {
+	db := GetReadDB(ctx)
+	db = db.Debug().Model(gorm_model.YounggeeSelectionInfo{}).Where("enterprise_id = ?", enterpriseID)
+
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	fmt.Printf("状态内容:%v %v", conditionType, conditionValue)
+	selectionStatus := ""
+	searchValue := ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		fmt.Printf("Tag:%v %v", tag, field.Name)
+		value := conditionValue.FieldByName(field.Name)
+		if tag == "selection_status" {
+			selectionStatus = fmt.Sprintf("%v", conv.MustInt(value.Interface()))
+			db = db.Where("selection_status = ?", selectionStatus)
+		} else if tag == "search_value" {
+			searchValue = fmt.Sprintf("%v", value.Interface())
+		} else if tag == "submit_at" && value.Interface() != "" {
+			db = db.Where(fmt.Sprintf("submit_at like '%s%%'", value.Interface()))
+		} else if tag == "task_ddl" && value.Interface() != "" {
+			db = db.Where(fmt.Sprintf("task_ddl like '%s%%'", value.Interface()))
+		} else if !util.IsBlank(value) && tag != "task_ddl" && tag != "submit_at" && tag != "search_value" {
+			db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+		}
+	}
+	// 查询总数
+	var total int64
+	var selectionInfos []*gorm_model.YounggeeSelectionInfo
+	if err := db.Count(&total).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSelectionList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	// 查询该页数据
+	limit := pageSize
+	offset := pageSize * pageNum // assert pageNum start with 0\
+	fmt.Printf("选品状态:%v", selectionStatus)
+	if selectionStatus == "1" {
+		err := db.Order("updated_at desc").Limit(int(limit)).Offset(int(offset)).Find(&selectionInfos).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetSelectionList] error query mysql total, err:%+v", err)
+			return nil, 0, err
+		}
+	} else {
+		err := db.Order("task_ddl desc").Limit(int(limit)).Offset(int(offset)).Find(&selectionInfos).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetSelectionList] error query mysql total, err:%+v", err)
+			return nil, 0, err
+		}
+	}
+	var newSelectionInfos []*gorm_model.YounggeeSelectionInfo
+	for _, v := range selectionInfos {
+		fmt.Printf("查询选品列表 %+v\n", v)
+		if searchValue == "" {
+			newSelectionInfos = append(newSelectionInfos, v)
+		} else if strings.Contains(v.SelectionID, searchValue) {
+			newSelectionInfos = append(newSelectionInfos, v)
+		} else if strings.Contains(v.SelectionName, searchValue) {
+			newSelectionInfos = append(newSelectionInfos, v)
+		} else {
+			total--
+		}
+	}
+	return newSelectionInfos, total, nil
+}
+
+func GetSelectionBriefInfo(ctx context.Context, selectionId string) ([]*gorm_model.YounggeeSecBrief, error) {
+	db := GetReadDB(ctx)
+	var selectionBriefInfos []*gorm_model.YounggeeSecBrief
+	err := db.Model(gorm_model.YounggeeSecBrief{}).Where("selection_id = ?", selectionId).Find(&selectionBriefInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSelectionBriefInfo] error query mysql, err:%+v", err)
+		return nil, err
+	}
+	return selectionBriefInfos, nil
+}
+
+func GetSelectionExampleInfo(ctx context.Context, selectionId string) ([]*gorm_model.YounggeeSecExample, error) {
+	db := GetReadDB(ctx)
+	var selectionExampleInfos []*gorm_model.YounggeeSecExample
+	err := db.Model(gorm_model.YounggeeSecExample{}).Where("selection_id = ?", selectionId).Find(&selectionExampleInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSelectionExampleInfo] error query, err:%+v", err)
+		return nil, err
+	}
+	return selectionExampleInfos, nil
+}
+
+func PaySelection(ctx context.Context, enterpriseId string, payMoney float64, selectionId string) error {
+	db := GetWriteDB(ctx)
+	err := db.Transaction(func(tx *gorm.DB) error {
+		// 1. 冻结账户余额
+		whereCondition := gorm_model.Enterprise{
+			EnterpriseID: enterpriseId,
+		}
+		updateData := map[string]interface{}{
+			"frozen_balance":    gorm.Expr("frozen_balance + ?", payMoney),
+			"available_balance": gorm.Expr("available_balance - ?", payMoney)}
+		if err := tx.Model(gorm_model.Enterprise{}).Where(whereCondition).Updates(updateData).Error; err != nil {
+			return err
+		}
+
+		// 2. 更新选品项目状态
+		whereCondition1 := gorm_model.YounggeeSelectionInfo{SelectionID: selectionId, SelectionStatus: 4}
+		updateData1 := gorm_model.YounggeeSelectionInfo{SelectionStatus: 6}
+		if err := tx.Model(gorm_model.YounggeeSelectionInfo{}).Where(whereCondition1).Updates(updateData1).Error; err != nil {
+			return err
+		}
+
+		// 返回 nil 提交事务
+		return nil
+	})
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func CreateSecBrief(ctx context.Context, briefInfo gorm_model.YounggeeSecBrief) error {
+	db := GetWriteDB(ctx)
+	err := db.Create(&briefInfo).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func DeleteSecBriefBySelectionId(ctx context.Context, selectionId string) error {
+	db := GetWriteDB(ctx)
+	deleteCondition := gorm_model.YounggeeSecBrief{
+		SelectionID: selectionId,
+	}
+	err := db.Where(deleteCondition).Delete(gorm_model.YounggeeSecBrief{}).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func CreateSecExample(ctx context.Context, ExampleInfo gorm_model.YounggeeSecExample) error {
+	db := GetWriteDB(ctx)
+	err := db.Create(&ExampleInfo).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func DeleteSecExampleBySelectionId(ctx context.Context, selectionId string) error {
+	db := GetWriteDB(ctx)
+	deleteCondition := gorm_model.YounggeeSecExample{
+		SelectionID: selectionId,
+	}
+	err := db.Where(deleteCondition).Delete(gorm_model.YounggeeSecExample{}).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// 更新选品结算金额
+func UpdateSelectionSettleMoney(ctx context.Context, selectionID string, payMoney float64) (bool, error) {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YounggeeSelectionInfo{}).Where("selection_id", selectionID).
+		Updates(map[string]interface{}{"settlement_amount": gorm.Expr("settlement_amount + ?", payMoney)}).Error
+	if err != nil {
+		return false, err
+	}
+
+	return true, nil
+}
+
+func GetSelectionInfoList(ctx context.Context, pageNum, pageSize int64, conditions http_model.SelectionSquareCondition) ([]*http_model.SelectionBriefInfo, int64, error) {
+	db := GetReadDB(ctx)
+	db = db.Debug().Model(gorm_model.YounggeeSelectionInfo{}).Where("selection_status>2")
+	fmt.Println("conditions: ", conditions)
+
+	conditionType := reflect.TypeOf(&conditions).Elem()
+	conditionValue := reflect.ValueOf(&conditions).Elem()
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if tag == "product_type" {
+			continue
+		} else {
+			if value.Interface().(int16) != 0 {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	// 查询总数
+	var total int64
+	var selectionInfos []*gorm_model.YounggeeSelectionInfo
+	if err := db.Count(&total).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSelectionList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	limit := pageSize
+	offset := pageSize * pageNum // assert pageNum start with 0\
+	tempList := []*gorm_model.YounggeeSelectionInfo{}
+	if conditions.ProductType == 0 {
+		// 查询该页数据
+		err := db.Order("task_ddl desc").Limit(int(limit)).Offset(int(offset)).Find(&selectionInfos).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetSelectionList] error query mysql total, err:%+v", err)
+			return nil, 0, err
+		}
+
+		tempList = selectionInfos
+	} else {
+		err := db.Order("task_ddl desc").Find(&selectionInfos).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetSelectionList] error query mysql total, err:%+v", err)
+			return nil, 0, err
+		}
+		total = 0
+		var num int64 = 0
+		//fmt.Println("offset: ", offset)
+		for _, v := range selectionInfos {
+			var p gorm_model.YounggeeProduct
+			_ = json.Unmarshal([]byte(v.ProductSnap), &p)
+			if p.ProductType == int64(conditions.ProductType) {
+				total++
+				//fmt.Println("total++", total)
+				if total > offset && num < pageSize {
+					//fmt.Println("num++", num)
+					num++
+					tempList = append(tempList, v)
+				}
+			}
+		}
+	}
+
+	newSelectionInfos := pack.GormSelectionListToSelectionBriefInfoList(tempList)
+	return newSelectionInfos, total, nil
+}

+ 313 - 0
db/sketch.go

@@ -0,0 +1,313 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"reflect"
+	"strings"
+	"time"
+	"youngee_b_api/model/common_model"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/util"
+
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+)
+
+// GetTaskSketchList 查询上传初稿的task list
+func GetTaskSketchList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.TaskSketchInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if tag == "sketch_status" {
+			fmt.Printf("sketch %+v", value.Interface() == int64(0))
+			if value.Interface() == int64(0) {
+				db = db.Where("task_stage = 10")
+			} else {
+				db = db.Where("task_stage > 10 and task_stage <> 16")
+			}
+			continue
+		} else if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" || tag == "strategy_id" {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+	db1 := GetReadDB(ctx)
+	db1 = db1.Debug().Model(gorm_model.YounggeeSketchInfo{})
+
+	var SketchInfos []gorm_model.YounggeeSketchInfo
+	db1 = db1.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id IN ? AND is_submit=? ", taskIds, 1)
+	if conditions.SketchStatus == int64(0) {
+		db1 = db1.Where("is_review = 0").Find(&SketchInfos)
+	} else {
+		db1 = db1.Where("is_ok = 1").Find(&SketchInfos)
+	}
+	fmt.Printf("初稿查询:%+v", SketchInfos)
+	SketchMap := make(map[string]gorm_model.YounggeeSketchInfo)
+	for _, SketchInfo := range SketchInfos {
+		SketchMap[SketchInfo.TaskID] = SketchInfo
+	}
+	// 查询总数
+	var totalSketch int64
+	if err := db1.Count(&totalSketch).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	var misNum int64
+	if totalSketch > totalTask {
+		misNum = totalSketch - totalTask
+	} else {
+		misNum = totalTask - totalSketch
+	}
+	logrus.Println("totalSketch,totalTalent,misNum:", totalSketch, totalTask, misNum)
+
+	// 查询该页数据
+	limit := pageSize + misNum
+	offset := pageSize * pageNum // assert pageNum start with 0
+	//fmt.Printf("limit %+v  offset %+v \n", limit, offset)
+	err := db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	var TaskSketches []*http_model.TaskSketch
+	var taskSketches []*http_model.TaskSketchInfo
+	var newTaskSketches []*http_model.TaskSketchInfo
+	for _, taskId := range taskIds {
+		TaskSketch := new(http_model.TaskSketch)
+		TaskSketch.Talent = taskMap[taskId]
+		TaskSketch.Sketch = SketchMap[taskId]
+		TaskSketches = append(TaskSketches, TaskSketch)
+	}
+
+	taskSketches = pack.TaskSketchToTaskInfo(TaskSketches)
+
+	for _, v := range taskSketches {
+		if platform_nickname == "" {
+			newTaskSketches = append(newTaskSketches, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskSketches = append(newTaskSketches, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platform_nickname) {
+			newTaskSketches = append(newTaskSketches, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskSketches, totalTask, nil
+}
+
+// SketchOption 提交意见
+func SketchOption(ctx context.Context, TaskID string, ReviseOpinion string) error {
+	db := GetReadDB(ctx)
+	fmt.Printf("初稿意见 %d %+v", TaskID, ReviseOpinion)
+	err := db.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id = ? and is_review = 0", TaskID).Updates(map[string]interface{}{"revise_opinion": ReviseOpinion, "reject_at": time.Now(), "is_review": 1}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Sketch db] call RevisieOption error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", TaskID).Updates(gorm_model.YoungeeTaskInfo{SketchStatus: 3}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Sketch db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", TaskID).Updates(gorm_model.YoungeeTaskInfo{TaskStage: 9}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Sketch db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+// AcceptSketch 同意初稿
+func AcceptSketch(ctx context.Context, TaskIDs []string) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id in ? and is_review = 0", TaskIDs).Updates(map[string]interface{}{"is_ok": 1, "is_review": 1, "agree_at": time.Now()}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Sketch db] Update YounggeeSketchInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{SketchStatus: 5}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Sketch db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{TaskStage: 11}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Sketch db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+// FindPhoto
+func FindSketchInfo(ctx context.Context, TaskID string) (*gorm_model.YounggeeSketchInfo, error) {
+	db := GetReadDB(ctx)
+	var SketchInfo gorm_model.YounggeeSketchInfo
+	err := db.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id = ? and is_ok = 1", TaskID).Find(&SketchInfo).Error
+	if err != nil {
+		return nil, err
+	}
+	return &SketchInfo, nil
+}
+
+// FindPhoto
+func FindPhoto(ctx context.Context, SketchID int64) ([]gorm_model.YounggeeSketchPhoto, error) {
+	db := GetReadDB(ctx)
+	var SketchPhotos []gorm_model.YounggeeSketchPhoto
+	err := db.Model(gorm_model.YounggeeSketchPhoto{}).Where("sketch_id=?", SketchID).Find(&SketchPhotos).Error
+	if err != nil {
+		return nil, err
+	}
+	return SketchPhotos, nil
+
+}
+
+// GetSpecialTaskSketchList 专项任务-查询上传初稿的task list
+func GetSpecialTaskSketchList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.SpecialTaskSketchInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询Task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_status = 2")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platform_nickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if tag == "sketch_status" {
+			fmt.Printf("sketch %+v", value.Interface() == int64(0))
+			if value.Interface() == int64(0) {
+				db = db.Where("task_stage = 10")
+			} else {
+				db = db.Where("task_stage > 10 and task_stage <> 16")
+			}
+			continue
+		} else if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platform_nickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	// 查询任务id
+	var taskIds []string
+	taskMap := make(map[string]gorm_model.YoungeeTaskInfo)
+	for _, taskInfo := range taskInfos {
+		taskIds = append(taskIds, taskInfo.TaskID)
+		taskMap[taskInfo.TaskID] = taskInfo
+	}
+	db1 := GetReadDB(ctx)
+	db1 = db1.Debug().Model(gorm_model.YounggeeSketchInfo{})
+
+	var SketchInfos []gorm_model.YounggeeSketchInfo
+	db1 = db1.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id IN ? AND is_submit=? ", taskIds, 1)
+	if conditions.SketchStatus == int64(0) {
+		db1 = db1.Where("is_review = 0").Find(&SketchInfos)
+	} else {
+		db1 = db1.Where("is_ok = 1").Find(&SketchInfos)
+	}
+	//fmt.Printf("初稿查询:%+v", SketchInfos)
+	SketchMap := make(map[string]gorm_model.YounggeeSketchInfo)
+	for _, SketchInfo := range SketchInfos {
+		SketchMap[SketchInfo.TaskID] = SketchInfo
+	}
+	// 查询总数
+	var totalSketch int64
+	if err := db1.Count(&totalSketch).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTalentList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+
+	//// 查询该页数据
+	//limit := pageSize
+	//offset := pageSize * pageNum // assert pageNum start with 0
+	//err := db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+	//
+	//if err != nil {
+	//	logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+	//	return nil, 0, err
+	//}
+
+	var TaskSketches []*http_model.SpecialTaskSketch
+	var taskSketches []*http_model.SpecialTaskSketchInfo
+	var newTaskSketches []*http_model.SpecialTaskSketchInfo
+	for _, taskId := range taskIds {
+		TaskSketch := new(http_model.SpecialTaskSketch)
+		TaskSketch.Talent = taskMap[taskId]
+		TaskSketch.Sketch = SketchMap[taskId]
+		TaskSketches = append(TaskSketches, TaskSketch)
+	}
+
+	taskSketches = pack.SpecialTaskSketchToTaskInfo(TaskSketches)
+
+	for _, v := range taskSketches {
+		if platform_nickname == "" {
+			newTaskSketches = append(newTaskSketches, v)
+		} else if strings.Contains(v.PlatformNickname, platform_nickname) {
+			newTaskSketches = append(newTaskSketches, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platform_nickname) {
+			newTaskSketches = append(newTaskSketches, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskSketches, totalTask, nil
+}
+
+// FindSketchInfoByTaskId 根据种草子任务ID查找初稿信息
+func FindSketchInfoByTaskId(ctx context.Context, TaskID string) ([]*gorm_model.YounggeeSketchInfo, error) {
+	db := GetReadDB(ctx)
+	var sketchInfo []*gorm_model.YounggeeSketchInfo
+	err := db.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id = ?", TaskID).Find(&sketchInfo).Error
+	if err != nil {
+		return nil, err
+	}
+	return sketchInfo, nil
+}

+ 16 - 0
db/sketch_photo.go

@@ -0,0 +1,16 @@
+package db
+
+import (
+	"context"
+	"youngee_b_api/model/gorm_model"
+)
+
+func GetSketchPhotoBySketchID(ctx context.Context, productID int64) ([]gorm_model.YounggeeSketchPhoto, error) {
+	db := GetReadDB(ctx)
+	SketchPhotos := []gorm_model.YounggeeSketchPhoto{}
+	err := db.Where("product_id = ?", productID).Find(&SketchPhotos).Error
+	if err != nil {
+		return nil, err
+	}
+	return SketchPhotos, nil
+}

+ 73 - 0
db/sub_account.go

@@ -0,0 +1,73 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"youngee_b_api/model/gorm_model"
+)
+
+// CreateSubAccount 新建子账号
+func CreateSubAccount(ctx context.Context, account gorm_model.YounggeeSubAccount) error {
+	db := GetWriteDB(ctx)
+	err := db.Create(&account).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// UpdateSubAccount 更新子账号
+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
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// DeleteSubAccount 删除子账号
+func DeleteSubAccount(ctx context.Context, account gorm_model.YounggeeSubAccount) error {
+	db := GetWriteDB(ctx)
+	whereCondition := gorm_model.YounggeeSubAccount{SubAccountId: account.SubAccountId}
+	err := db.Where(whereCondition).Delete(&gorm_model.YounggeeSubAccount{}).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// FindSubAccountByPhone 根据手机号码查询子账号
+func FindSubAccountByPhone(ctx context.Context, phone string) (*gorm_model.YounggeeSubAccount, error) {
+	db := GetReadDB(ctx)
+	var total int64
+	var subAccount *gorm_model.YounggeeSubAccount
+	whereCondition := gorm_model.YounggeeSubAccount{PhoneNumber: phone, SubAccountType: 3}
+	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
+}
+
+// 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
+}

+ 32 - 0
db/supplier.go

@@ -0,0 +1,32 @@
+package db
+
+import (
+	"context"
+	"gorm.io/gorm"
+	"youngee_b_api/model/gorm_model"
+)
+
+// CreateSupplier 新建服务商
+func CreateSupplier(ctx context.Context, newSupplier gorm_model.YoungeeSupplier) (*int, error) {
+	db := GetWriteDB(ctx)
+	err := db.Create(&newSupplier).Error
+	if err != nil {
+		return nil, err
+	}
+	return &newSupplier.SupplierId, nil
+}
+
+// GetSupplierByUserID 用户ID查找服务商信息
+func GetSupplierByUserID(ctx context.Context, userID int64) (*gorm_model.YoungeeSupplier, error) {
+	db := GetReadDB(ctx)
+	var supplierInfo *gorm_model.YoungeeSupplier
+	err := db.Where("user_id = ?", userID).First(&supplierInfo).Error
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			return nil, nil
+		} else {
+			return nil, err
+		}
+	}
+	return supplierInfo, nil
+}

+ 55 - 0
db/supplier_income.go

@@ -0,0 +1,55 @@
+package db
+
+import (
+	"context"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+)
+
+// GetSupplierIncomeList 查询服务商收入列表
+func GetSupplierIncomeList(ctx context.Context, reqData *http_model.FullSProjectIncomeListRequest) ([]*gorm_model.YounggeeSupplierIncome, int64, error) {
+	db := GetReadDB(ctx)
+
+	// 1. 根据基本信息过滤
+	db = db.Debug().Model(gorm_model.YounggeeSupplierIncome{}).Where("supplier_id = ? and income_status = ?", reqData.SupplierId, reqData.IncomeStatus)
+
+	// 2. 确定查询总数和返回当前页数据
+	var total int64
+	var SupplierIncomeList []*gorm_model.YounggeeSupplierIncome
+	if err := db.Count(&total).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSupplierIncomeList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	limit := reqData.PageSize
+	offset := reqData.PageSize * reqData.PageNum // assert pageNum start with 0
+	err := db.Order("s_project_id desc").Limit(int(limit)).Offset(int(offset)).Find(&SupplierIncomeList).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSupplierIncomeList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	return SupplierIncomeList, total, nil
+}
+
+// UpdateSupplierIncomeStatus 修改服务商收入状态
+func UpdateSupplierIncomeStatus(ctx context.Context, incomeIds []int, incomeStatus int) error {
+	// 1. 建立数据库连接并修改
+	db := GetReadDB(ctx)
+	if err := db.Debug().Model(&gorm_model.YounggeeSupplierIncome{}).Where("income_id IN ?", incomeIds).
+		Updates(gorm_model.YounggeeSupplierIncome{IncomeStatus: incomeStatus}).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[ChangeTaskStatus]2 error query mysql total, err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+// GetIncomeInfoByIncomeId 根据income_id查询收入信息
+func GetIncomeInfoByIncomeId(ctx context.Context, incomeId int) (*gorm_model.YounggeeSupplierIncome, error) {
+	db := GetReadDB(ctx)
+	var incomeInfo *gorm_model.YounggeeSupplierIncome
+	err := db.Model(&gorm_model.YounggeeSupplierIncome{}).Where("income_id = ?", incomeId).Find(&incomeInfo).Error
+	if err != nil {
+		return nil, err
+	}
+	return incomeInfo, nil
+}

+ 63 - 0
db/supplier_invoice.go

@@ -0,0 +1,63 @@
+package db
+
+import (
+	"context"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/model/gorm_model"
+)
+
+// CreateSupplierInvoice 创建服务商发票
+func CreateSupplierInvoice(ctx context.Context, req *gorm_model.YounggeeSupplierInvoice) error {
+	db := GetWriteDB(ctx)
+	err := db.Create(&req).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// UpdateSupplierInvoice 更新服务商发票
+func UpdateSupplierInvoice(ctx context.Context, req *gorm_model.YounggeeSupplierInvoice) error {
+	db := GetWriteDB(ctx)
+	whereCondition := gorm_model.YounggeeSupplierInvoice{InvoiceId: req.InvoiceId}
+	err := db.Model(&gorm_model.YounggeeSupplierInvoice{}).Where(whereCondition).Updates(req).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// GetIncomeIdsByInvoiceId 根据invoice_id取得income_ids
+func GetIncomeIdsByInvoiceId(ctx context.Context, invoiceId int) (string, error) {
+	db := GetWriteDB(ctx)
+	var invoiceInfo *gorm_model.YounggeeSupplierInvoice
+	err := db.Model(gorm_model.YounggeeSupplierInvoice{}).Where("invoice_id = ?", invoiceId).Find(&invoiceInfo).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetSProjectDetail] error query mysql, err:%+v", err)
+		return "", err
+	}
+	return invoiceInfo.IncomeIds, nil
+}
+
+// GetInvoiceListBySupplierId 根据invoice_status和supplier_id获取发票信息列表
+func GetInvoiceListBySupplierId(ctx context.Context, supplierId int, invoiceStatus int, withdrawStatus int, pageSize int32, pageNum int32) ([]*gorm_model.YounggeeSupplierInvoice, int64, error) {
+	db := GetWriteDB(ctx)
+	// 1. 根据服务商id过滤
+	db = db.Debug().Model(gorm_model.YounggeeSupplierInvoice{}).Where("supplier_id = ? and invoice_status = ? and withdraw_status = ?", supplierId, invoiceStatus, withdrawStatus)
+
+	// 2. 确定查询总数和返回当前页数据
+	var total int64
+	var invoiceList []*gorm_model.YounggeeSupplierInvoice
+	if err := db.Count(&total).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetFullProjectList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	limit := pageSize
+	offset := pageSize * pageNum // assert pageNum start with 0
+	err := db.Order("invoice_id desc").Limit(int(limit)).Offset(int(offset)).Find(&invoiceList).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetFullProjectList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	return invoiceList, total, nil
+}

+ 16 - 0
db/supplier_withdraw.go

@@ -0,0 +1,16 @@
+package db
+
+import (
+	"context"
+	"youngee_b_api/model/gorm_model"
+)
+
+// CreateSupplierWithdraw 查询服务商收入列表
+func CreateSupplierWithdraw(ctx context.Context, supplierWithdraw []*gorm_model.YounggeeSupplierWithdraw) error {
+	db := GetWriteDB(ctx)
+	err := db.Create(&supplierWithdraw).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}

+ 32 - 0
db/talent_income.go

@@ -0,0 +1,32 @@
+package db
+
+import (
+	"context"
+	"github.com/issue9/conv"
+	"gorm.io/gorm"
+	"youngee_b_api/model/gorm_model"
+)
+
+func CreateIncome(ctx context.Context, income gorm_model.YounggeeTalentIncome, tx *gorm.DB) error {
+	if tx != nil {
+		err := tx.Create(&income).Error
+		if err != nil {
+			return err
+		}
+		err = tx.Model(gorm_model.YoungeeTalentInfo{}).Where("id = ?", income.TalentID).Updates(map[string]interface{}{"income": gorm.Expr("income + ?", conv.MustFloat64(income.Income)), "canwithdraw": gorm.Expr("canwithdraw + ?", conv.MustFloat64(income.Income))}).Error
+		if err != nil {
+			return err
+		}
+	} else {
+		db := GetWriteDB(ctx)
+		err := db.Create(&income).Error
+		if err != nil {
+			return err
+		}
+		err = db.Model(gorm_model.YoungeeTalentInfo{}).Where("id = ?", income.TalentID).Updates(map[string]interface{}{"income": gorm.Expr("income + ?", conv.MustFloat64(income.Income)), "canwithdraw": gorm.Expr("canwithdraw + ?", conv.MustFloat64(income.Income))}).Error
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}

+ 411 - 0
db/task.go

@@ -0,0 +1,411 @@
+package db
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"reflect"
+	"strconv"
+	"strings"
+	"time"
+	"youngee_b_api/model/common_model"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/util"
+
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+	"github.com/tidwall/gjson"
+	"gorm.io/gorm"
+)
+
+func GetTaskList(ctx context.Context, projectID string) ([]gorm_model.YoungeeTaskInfo, error) {
+	db := GetReadDB(ctx)
+	tasks := []gorm_model.YoungeeTaskInfo{}
+
+	err := db.Where("project_id=? and task_status = 2", projectID).Find(&tasks).Error
+	if err != nil {
+		return nil, err
+	}
+	return tasks, nil
+}
+
+func UpdateLogisticsStatus(ctx context.Context, taskID string, status int64) error {
+
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskID).Update("logistics_status", status).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[task db] call UpdateLogisticsStatus error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+func UpdateLogisticsDate(ctx context.Context, taskID string) error {
+
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskID).Update("delivery_date", time.Now()).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[task db] call UpdateLogisticsDate error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+func GetProjectIdByTaskId(ctx context.Context, taskID string) (*string, error) {
+	db := GetReadDB(ctx)
+	task := &gorm_model.YoungeeTaskInfo{}
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskID).Scan(task).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[task db] call UpdateLogisticsStatus error,err:%+v", err)
+		return nil, err
+	}
+	return &task.ProjectID, nil
+}
+
+func ChangeTaskStatus(ctx context.Context, taskIds []string, supplierStatus int) ([]int64, error) {
+	db := GetReadDB(ctx)
+	// taskSta, err := strconv.Atoi(taskStatus)
+	taskSta := supplierStatus
+
+	if err := db.Debug().Model(&gorm_model.YoungeeTaskInfo{}).Where("task_id IN ?", taskIds).
+		Updates(gorm_model.YoungeeTaskInfo{SupplierStatus: taskSta}).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[ChangeTaskStatus]2 error query mysql total, err:%+v", err)
+		return nil, err
+	}
+
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	err := db.Debug().Model(&gorm_model.YoungeeTaskInfo{}).Where("task_id IN ?", taskIds).Find(&taskInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[ChangeTaskStatus]3 error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	var recruitStrategysIDs []int64
+	recruitStrategys := gorm_model.RecruitStrategy{}
+	for _, taskInfo := range taskInfos {
+		err2 := db.Debug().Model(gorm_model.RecruitStrategy{}).Where("s_project_id=? AND strategy_id=?", taskInfo.SProjectId, taskInfo.StrategyID).Scan(&recruitStrategys).Error
+		if err2 != nil {
+			logrus.WithContext(ctx).Errorf("[ChangeTaskStatus]4 error query mysql total, err:%+v", err2)
+			return nil, err2
+		}
+		recruitStrategysIDs = append(recruitStrategysIDs, recruitStrategys.RecruitStrategyID)
+	}
+	return recruitStrategysIDs, nil
+}
+
+func ChangeSpecialTaskStatus(ctx context.Context, taskIds []string, supplierStatus int) error {
+	db := GetReadDB(ctx)
+	if err := db.Debug().Model(&gorm_model.YoungeeTaskInfo{}).Where("task_id IN ?", taskIds).
+		Updates(gorm_model.YoungeeTaskInfo{SupplierStatus: supplierStatus}).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[ChangeTaskStatus]2 error query mysql total, err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+func UpdateTaskSelectAtByProjectId(ctx context.Context, projectID string, taskStatus int64) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id=? and task_status = ?", projectID, taskStatus).Update("select_date", time.Now()).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[UpdateTaskStage]2 error query mysql total, err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+func UpdateTaskStageByProjectId(ctx context.Context, projectID string, taskStatus int64, taskStage int64) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id=? and task_status = ?", projectID, taskStatus).Update("task_stage", taskStage).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[UpdateTaskStage]2 error query mysql total, err:%+v", err)
+		return err
+	}
+	return nil
+}
+func UpdateTaskStageByTaskId(ctx context.Context, taskID string, taskStatus int64, taskStage int64) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id=? and task_status = ?", taskID, taskStatus).Update("task_stage", taskStage).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[UpdateTaskStageByTaskId]2 error query mysql total, err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+func GetUnfinishedTaskNumber(ctx context.Context, projectID string) (*int64, error) {
+	var unFinishedTaskNumber int64
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2 and task_stage < 15", projectID).Count(&unFinishedTaskNumber).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Data db] Find YounggeeTaskInfo error,err:%+v", err)
+		return nil, err
+	}
+	return &unFinishedTaskNumber, nil
+}
+
+// SetTaskFinish 任务结案
+func SetTaskFinish(ctx context.Context, TaskIDs []string) error {
+	db := GetReadDB(ctx)
+	// 1. 修改任务表,更新任务阶段为已结案,结案方式为正常结束,数据状态为已通过,
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{DataStatus: 5, TaskStage: 15, CompleteStatus: 2, WithdrawStatus: 2, CompleteDate: time.Now()}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Task db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+
+	for _, v := range TaskIDs {
+		// 查询task_info
+		db = GetReadDB(ctx)
+		taskInfo := gorm_model.YoungeeTaskInfo{}
+		err1 := db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", v).Scan(&taskInfo).Error
+		if err1 != nil {
+			logrus.WithContext(ctx).Errorf("[Task db] Find YoungeeTaskInfo error,err:%+v", err)
+			return err1
+		}
+		//查询project_info
+		projectInfo := gorm_model.ProjectInfo{}
+		err1 = db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", taskInfo.ProjectID).Scan(&projectInfo).Error
+		if err1 != nil {
+			logrus.WithContext(ctx).Errorf("[Task db] Find ProjectInfo error,err:%+v", err)
+			return err1
+		}
+		// 查询data_info
+		db = GetReadDB(ctx)
+		dataInfo := gorm_model.YounggeeDataInfo{}
+		err1 = db.Model(gorm_model.YounggeeDataInfo{}).Where("task_id = ? and is_ok = 1", v).Scan(&dataInfo).Error
+		if err1 != nil {
+			logrus.WithContext(ctx).Errorf("[Task db] Find YounggeeDataInfo error,err:%+v", err)
+			return err1
+		}
+
+		// 2. 创建任务收益
+		var productStruct gorm_model.YounggeeProduct
+		if err = json.Unmarshal([]byte(projectInfo.ProductSnap), &productStruct); err != nil {
+			fmt.Println("Error:", err)
+			return err
+		}
+		var productPhotoStruct []gorm_model.YounggeeProductPhoto
+		if err = json.Unmarshal([]byte(projectInfo.ProductPhotoSnap), &productPhotoStruct); err != nil {
+			fmt.Println("Error:", err)
+			return err
+		}
+		var mainPhoto = ""
+		for _, w := range productPhotoStruct {
+			if w.Symbol == 1 {
+				mainPhoto = w.PhotoUrl
+			}
+		}
+
+		t := time.Now()
+		income := gorm_model.YounggeeTalentIncome{
+			TalentID:       taskInfo.TalentID,
+			ProjectID:      taskInfo.ProjectID,
+			TaskID:         taskInfo.TaskID,
+			Type:           1,
+			BrandName:      productStruct.BrandName,
+			TaskName:       projectInfo.ProjectName,
+			PhotoUrl:       mainPhoto,
+			Income:         strconv.FormatFloat(taskInfo.SettleAmount, 'f', 10, 32),
+			IncomeType:     1,
+			WithdrawStatus: 1,
+			IncomeAt:       &t,
+			WithdrawAt:     nil,
+		}
+		err = CreateIncome(ctx, income, nil)
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
+			return err
+		}
+
+		// 3. 修改招募策略表,更新粉丝量、播放量、点赞数、收藏数、评论数、总支付、结案数量
+		// 更新招募策略
+		db = GetReadDB(ctx)
+		db = db.Model(gorm_model.RecruitStrategy{}).Where("project_id = ? and strategy_id = ?", taskInfo.ProjectID, taskInfo.StrategyID)
+		fansCount, _ := strconv.Atoi(conv.MustString(gjson.Get(taskInfo.TalentPlatformInfoSnap, "fans_count")))
+		err = db.Updates(map[string]interface{}{
+			"fan_number":     gorm.Expr("fan_number + ?", fansCount),
+			"play_number":    gorm.Expr("play_number + ?", dataInfo.PlayNumber),
+			"like_number":    gorm.Expr("like_number + ?", dataInfo.LikeNumber),
+			"collect_number": gorm.Expr("collect_number + ?", dataInfo.CollectNumber),
+			"comment_number": gorm.Expr("comment_number + ?", dataInfo.CommentNumber),
+			"finish_number":  gorm.Expr("finish_number + 1"),
+			"total_offer":    gorm.Expr("total_offer + ?", taskInfo.RealPayment)}).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Task db] Update YounggeeDataInfo error,err:%+v", err)
+			return err
+		}
+	}
+	return nil
+}
+
+// SetTaskFinish 专项任务结案
+func SetSpecialTaskFinish(ctx context.Context, TaskIDs []string) error {
+	db := GetReadDB(ctx)
+	// 1. 修改任务表,更新任务阶段为已结案,结案方式为正常结束,数据状态为已通过,
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{DataStatus: 5, TaskStage: 15, CompleteStatus: 2, WithdrawStatus: 2, CompleteDate: time.Now()}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Task db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+func GetSpecialTaskInviteList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.SpecialTaskInviteInfo, int64, error) {
+	db := GetReadDB(ctx)
+	// 查询task表信息
+	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_stage != 3")
+	// 根据Project条件过滤
+	conditionType := reflect.TypeOf(conditions).Elem()
+	conditionValue := reflect.ValueOf(conditions).Elem()
+	var platformNickname string = ""
+	for i := 0; i < conditionType.NumField(); i++ {
+		field := conditionType.Field(i)
+		tag := field.Tag.Get("condition")
+		value := conditionValue.FieldByName(field.Name)
+		if tag == "task_status" {
+			fmt.Printf("link %+v", value.Interface() == int64(0))
+			if value.Interface() == int64(0) {
+				db = db.Where("task_status <> 2")
+			} else {
+				db = db.Where("task_status = 2")
+			}
+			continue
+		} else if !util.IsBlank(value) {
+			if tag == "platform_nickname" {
+				platformNickname = fmt.Sprintf("%v", value.Interface())
+				continue
+			} else if tag == "project_id" {
+				db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
+			}
+		}
+	}
+	var taskInfos []gorm_model.YoungeeTaskInfo
+	db = db.Model(gorm_model.YoungeeTaskInfo{})
+	// 查询总数
+	var totalTask int64
+	if err := db.Count(&totalTask).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, 0, err
+	}
+	db.Order("task_id").Find(&taskInfos)
+
+	talentInfoTophoneMap := make(map[string]string)
+	for _, taskInfo := range taskInfos {
+		if _, ok := talentInfoTophoneMap[taskInfo.TalentID]; !ok {
+			phone := GetPhoneFromTalentId(ctx, taskInfo.TalentID)
+			talentInfoTophoneMap[taskInfo.TalentID] = phone
+		}
+	}
+
+	//// 查询该页数据
+	//limit := pageSize
+	//offset := pageSize * pageNum // assert pageNum start with 0
+	//err := db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
+	//if err != nil {
+	//	logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+	//	return nil, 0, err
+	//}
+
+	var taskDatas []*http_model.SpecialTaskInviteInfo
+	var newTaskDatas []*http_model.SpecialTaskInviteInfo
+
+	taskDatas = pack.YoungeeTaskInfoToSpecialTaskInviteInfo(taskInfos)
+
+	for _, v := range taskDatas {
+		if platformNickname == "" {
+			newTaskDatas = append(newTaskDatas, v)
+		} else if strings.Contains(v.PlatformNickname, platformNickname) {
+			newTaskDatas = append(newTaskDatas, v)
+		} else if strings.Contains(conv.MustString(v.TaskID), platformNickname) {
+			newTaskDatas = append(newTaskDatas, v)
+		} else {
+			totalTask--
+		}
+	}
+	return newTaskDatas, totalTask, nil
+}
+
+func GetPhoneFromTalentId(ctx context.Context, talentId string) string {
+	db := GetReadDB(ctx)
+	var Phone string
+	db.Model(&gorm_model.YoungeeTalentInfo{}).Select("talent_phone_number").Where("id = ?", talentId).Find(&Phone)
+	return Phone
+}
+
+func SetTalentIncome(ctx context.Context, TaskIDs []string) error {
+	db := GetReadDB(ctx)
+	var TaskInfoList []gorm_model.YoungeeTaskInfo
+	fmt.Println("收入", TaskIDs)
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).Scan(&TaskInfoList).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Task db] Update SetTalentIncome error,err:%+v", err)
+		return err
+	}
+	for _, taskInfo := range TaskInfoList {
+		err := db.Model(gorm_model.YoungeeTalentInfo{}).Where("id = ?", taskInfo.TalentID).Updates(map[string]interface{}{
+			"income":      gorm.Expr("income + ?", taskInfo.SettleAmount),
+			"canwithdraw": gorm.Expr("canwithdraw + ?", taskInfo.SettleAmount)}).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Task db] Update SetTalentIncome error,err:%+v", err)
+			return err
+		}
+	}
+	return nil
+}
+
+// 获取任务ids
+func GetTaskIds(ctx context.Context, projectId string) ([]string, error) {
+	db := GetReadDB(ctx)
+	var taskIds []string
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Select("task_id").Where("project_id = ? and task_status = 2", projectId).Find(&taskIds).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error read mysql, err:%+v", err)
+		return nil, err
+	}
+
+	return taskIds, nil
+}
+
+func UpdateTask(ctx context.Context, updateData gorm_model.YoungeeTaskInfo, tx *gorm.DB) (bool, error) {
+	db := GetWriteDB(ctx)
+	whereCondition := gorm_model.YoungeeTaskInfo{
+		TaskID: updateData.TaskID,
+	}
+	if tx != nil {
+		err := tx.Where(whereCondition).Updates(&updateData).Error
+		if err != nil {
+			return false, err
+		}
+	} else {
+		err := db.Where(whereCondition).Updates(&updateData).Error
+		if err != nil {
+			return false, err
+		}
+	}
+	return true, nil
+}
+
+// CountTaskNumByStrategyId 根据招募策略查找对应的种草子任务数量
+func CountTaskNumByStrategyId(ctx context.Context, projectId string, strategyId int64) (int64, error) {
+	db := GetReadDB(ctx)
+	var taskNum int64
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and strategy_id = ?", projectId, strategyId).Count(&taskNum).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error read mysql, err:%+v", err)
+		return 0, err
+	}
+	return taskNum, nil
+}
+
+// GetTaskByTaskId 根据task_id查询子任务详细信息
+func GetTaskByTaskId(ctx context.Context, taskId string) (*gorm_model.YoungeeTaskInfo, error) {
+	db := GetReadDB(ctx)
+	var taskInfo *gorm_model.YoungeeTaskInfo
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Find(&taskInfo).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error read mysql, err:%+v", err)
+		return nil, err
+	}
+	return taskInfo, nil
+}

+ 24 - 0
db/task_log.go

@@ -0,0 +1,24 @@
+package db
+
+import (
+	"context"
+	"time"
+	"youngee_b_api/model/gorm_model"
+
+	"github.com/sirupsen/logrus"
+)
+
+func CreateTaskLog(ctx context.Context, taskId string, log string) error {
+	db := GetReadDB(ctx)
+	taskLog := gorm_model.YounggeeTaskLog{
+		TaskID:  taskId,
+		Content: log,
+		LogAt:   time.Now(),
+	}
+	err := db.Model(gorm_model.YounggeeTaskLog{}).Create(&taskLog).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Sketch db] Insert YounggeeTaskLog error,err:%+v", err)
+		return err
+	}
+	return nil
+}

+ 84 - 0
db/terminate.go

@@ -0,0 +1,84 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"gorm.io/gorm"
+	"log"
+	"time"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/util"
+
+	"github.com/sirupsen/logrus"
+)
+
+// Terminate 批量提交解约申请
+func Terminate(ctx context.Context, TaskIDs []string, projectIds []string) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YoungeeContractInfo{}).Where("task_id in ?  and (default_status = 1 or default_status = 4)", TaskIDs).
+		Updates(map[string]interface{}{"default_status": 3, "terminate_at": time.Now()}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Data db] Update YoungeeContractInfo error,err:%+v", err)
+		return err
+	}
+	dbc := GetReadDB(ctx)
+	errCurDef := dbc.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).
+		Updates(map[string]interface{}{"cur_default_type": 9}).Error
+	if errCurDef != nil {
+		logrus.WithContext(ctx).Errorf("[Data db] Update YoungeeTaskInfo error,err:%+v", errCurDef)
+		return errCurDef
+	}
+	projectIds = util.RemoveStrRepByMap(projectIds)
+	var unfinishedNum int64
+	for _, projectId := range projectIds {
+		err1 := db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2 AND task_stage < 15", projectId).Count(&unfinishedNum).Error
+		if err1 != nil {
+			logrus.WithContext(ctx).Errorf("[Data db] Count YoungeeTaskInfo error,err:%+v", err)
+			return err1
+		}
+		var finishedNum int64
+		db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Count(&finishedNum)
+		if unfinishedNum == 0 && finishedNum != 0 {
+			// 2. 释放企业账户因项目冻结的资金
+			// 1) 计算剩余资金
+			db1 := GetReadDB(ctx)
+			var allPayment float64
+			var realPayment float64
+			err = db1.Model(gorm_model.YoungeeTaskInfo{}).
+				Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Pluck("COALESCE(SUM(all_payment), 0) as allPayment", &allPayment).Error
+			if err != nil {
+				log.Println("DB GetAutoCaseCloseTask error in data:", err)
+				return err
+			}
+			err = db1.Model(gorm_model.YoungeeTaskInfo{}).Select("sum(real_payment) as realPayment").
+				Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Pluck("COALESCE(SUM(real_payment), 0) as realPayment", &realPayment).Error
+			if err != nil {
+				log.Println("DB GetAutoCaseCloseTask error in data:", err)
+				return err
+			}
+			fmt.Println("企业应支付金额总计:", allPayment, "实际支付总计:", realPayment)
+			db2 := GetReadDB(ctx)
+			var enterpriseID int64
+			db2.Model(gorm_model.ProjectInfo{}).Select("enterprise_id").Where("project_id = ?", projectId).Find(&enterpriseID)
+			// 	2). 释放剩余资金
+			err = db1.Model(gorm_model.Enterprise{}).Where("enterprise_id = ?", enterpriseID).Updates(
+				map[string]interface{}{
+					"frozen_balance":    gorm.Expr("frozen_balance - ?", allPayment),
+					"balance":           gorm.Expr("balance - ?", realPayment),
+					"available_balance": gorm.Expr("available_balance + ?", allPayment-realPayment)}).Error
+			if err != nil {
+				log.Println("DB GetAutoCaseCloseTask error in data:", err)
+				return err
+			}
+			// 1. 更新项目状态为已结束
+			t := time.Now()
+			err = db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", projectId).
+				Updates(map[string]interface{}{"project_status": 10, "payment_amount": realPayment, "finish_at": &t}).Error
+			if err != nil {
+				logrus.WithContext(ctx).Errorf("[Project db] Update ProjectInfo error,err:%+v", err)
+				return err
+			}
+		}
+	}
+	return nil
+}

+ 73 - 0
db/user.go

@@ -0,0 +1,73 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"gorm.io/gorm"
+	"youngee_b_api/model/gorm_model"
+)
+
+func CreateUser(ctx context.Context, user gorm_model.YounggeeUser) (*int64, error) {
+	db := GetReadDB(ctx)
+	err := db.Create(&user).Error
+	if err != nil {
+		return nil, err
+	}
+	return &user.ID, nil
+}
+
+// GetUserByPhone 查不到返回空 根据手机号在User表中查服务商用户数据
+func GetUserByPhone(ctx context.Context, phone string) (*gorm_model.YounggeeUser, error) {
+	db := GetReadDB(ctx)
+	user := &gorm_model.YounggeeUser{}
+	err := db.Model(user).Where("phone = ? AND role = 6", phone).First(user).Error
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			fmt.Println("record not found")
+			return nil, nil
+		}
+		return nil, err
+	}
+	return user, nil
+}
+
+// GetSubUserByPhone 根据手机号在user表中查找子账号用户
+func GetSubUserByPhone(ctx context.Context, phone string) (*gorm_model.YounggeeUser, error) {
+	db := GetReadDB(ctx)
+	user := &gorm_model.YounggeeUser{}
+	err := db.Model(user).Where("phone = ? AND role = 7", phone).First(user).Error
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			fmt.Println("record not found")
+			return nil, nil
+		}
+		return nil, err
+	}
+	return user, nil
+}
+
+// GetUserByID 查不到返回空
+func GetUserByID(ctx context.Context, ID int64) (*gorm_model.YounggeeUser, error) {
+	db := GetReadDB(ctx)
+	user := &gorm_model.YounggeeUser{}
+	err := db.Model(user).Where("id = ?", ID).First(user).Error
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			fmt.Println("record not found")
+			return nil, nil
+		}
+		return nil, err
+	}
+	return user, nil
+}
+
+func UpdateUser(ctx context.Context, UserID int64, UserName string, Email string) (*int64, error) {
+	db := GetReadDB(ctx)
+	user := &gorm_model.YounggeeUser{}
+	err := db.Model(user).Where("id = ?", UserID).Updates(map[string]interface{}{"UserName": UserName, "Email": Email}).Error
+	if err != nil {
+		fmt.Println("Update User Failed!")
+		return nil, err
+	}
+	return &UserID, nil
+}

+ 194 - 0
db/workspace.go

@@ -0,0 +1,194 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"time"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+)
+
+func GetWorkspaceNums(ctx context.Context, enterpriseID string) (*http_model.WorkspaceNums, error) {
+	var workspaceNums http_model.WorkspaceNums
+	var PaymentPending, DraftNum, RecruitingFullNum, ExecutionSpecNum, ExecutionFullNum int64
+	db := GetReadDB(ctx)
+	db = db.Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ?", enterpriseID)
+	db.Where("project_status = 1").Count(&DraftNum)
+
+	db1 := GetReadDB(ctx)
+	db1 = db1.Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ?", enterpriseID)
+	db1.Where("project_status = 4 AND project_type = 1").Count(&RecruitingFullNum)
+
+	db2 := GetReadDB(ctx)
+	db2 = db2.Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ?", enterpriseID)
+	db2.Where("project_status = 6").Count(&PaymentPending)
+	db3 := GetReadDB(ctx)
+	db3 = db3.Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ?", enterpriseID)
+	db3.Where("project_status = 9 AND project_type = 2").Count(&ExecutionSpecNum)
+
+	db4 := GetReadDB(ctx)
+	db4 = db4.Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ?", enterpriseID)
+	db4.Where("project_status = 9 AND project_type = 1").Count(&ExecutionFullNum)
+
+	var ProjectFunds float64
+	db5 := GetReadDB(ctx)
+	db5 = db5.Model(gorm_model.Enterprise{}).Select("frozen_balance").Where("enterprise_id = ?", enterpriseID).First(&ProjectFunds)
+
+	workspaceNums.PaymentPending = PaymentPending
+	workspaceNums.DraftNum = DraftNum
+	workspaceNums.RecruitingFullNum = RecruitingFullNum
+	workspaceNums.ExecutionSpecNum = ExecutionSpecNum
+	workspaceNums.ExecutionFullNum = ExecutionFullNum
+	workspaceNums.ProjectFunds = ProjectFunds
+	return &workspaceNums, nil
+}
+
+func GetWorkspaceDDLproject(ctx context.Context, enterpriseID string, pageSize, pageNum int64) (*http_model.WorkspaceDDLprojectdata, error) {
+	var projectInfos []gorm_model.ProjectInfo
+	//DDLproject := http_model.WorkspaceDDLprojectdata{}
+	db := GetReadDB(ctx)
+	ddl := conv.MustString(time.Now())[0:10] + "%"
+	db = db.Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ?", enterpriseID)
+	db = db.Where("project_status = 4 AND recruit_ddl like ?", ddl).Or("project_status = 6 AND auto_fail_at like ?", ddl).Or("project_status = 3 AND pass_at like ?", ddl).Or("project_status = 10 AND finish_at like ?", ddl)
+	// 查询总数
+	var total int64
+	if err := db.Count(&total).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[GetWorkspaceDDLproject db] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	// 查询该页数据
+	limit := pageSize
+	offset := pageSize * pageNum // assert pageNum start with 0
+	wsDDLprojectData := http_model.WorkspaceDDLprojectdata{}
+	err := db.Order("project_id").Limit(int(limit)).Offset(int(offset)).Find(&projectInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetWorkspaceDDLproject db] Find Pagesize DDLProjectInfo error,err:%+v", err)
+		return nil, err
+	}
+	wsDDLprojectData.Total = conv.MustString(total)
+	for _, projectInfo := range projectInfos {
+		DDLProjectPreview := new(http_model.DDLProjectPreview)
+		DDLProjectPreview.ProjectId = projectInfo.ProjectID
+		DDLProjectPreview.ProjectForm = conv.MustString(projectInfo.ProjectForm)
+		DDLProjectPreview.ProjectName = projectInfo.ProjectName
+		DDLProjectPreview.ProjectStatus = conv.MustString(projectInfo.ProjectStatus)
+		DDLProjectPreview.ProjectPlatform = conv.MustString(projectInfo.ProjectPlatform)
+		DDLProjectPreview.ProjectContentType = conv.MustString(projectInfo.ContentType)
+		DDLProjectPreview.RecruitDDL = conv.MustString(projectInfo.RecruitDdl)[0:19]
+		if projectInfo.AutoFailAt != nil {
+			DDLProjectPreview.AutoFailAt = conv.MustString(projectInfo.AutoFailAt)[0:19]
+		}
+		if projectInfo.PassAt != nil {
+			DDLProjectPreview.PassAt = conv.MustString(projectInfo.PassAt)[0:19]
+		}
+		if projectInfo.FinishAt != nil {
+			DDLProjectPreview.FinishAt = conv.MustString(projectInfo.FinishAt)[0:19]
+		}
+		DDLProjectPreview.RecruitNum = conv.MustString(projectInfo.RecruitNum)
+		wsDDLprojectData.DDLProjectPreview = append(wsDDLprojectData.DDLProjectPreview, DDLProjectPreview)
+	}
+	return &wsDDLprojectData, nil
+}
+
+func GetWorkspaceBarNums(ctx context.Context, enterpriseID string, projectType int64) (*http_model.WorkspaceBarNums, error) {
+	var workspaceNums http_model.WorkspaceBarNums
+	var DataPendingNum, LinkPendingNum, SketchPendingNum, ScriptPendingNum, AccSelecting, ShipmentPendingNum, ShippedNum int64
+	//fmt.Printf("TypeShow %+v", projectType)
+	//先查企业所属的全部项目
+	var RecruitingProjectIDs []string
+	db := GetReadDB(ctx)
+	fmt.Println("测试", projectType == 1)
+	if projectType == 1 {
+		fmt.Println("全流程", projectType)
+		db = db.Debug().Model(gorm_model.ProjectInfo{}).Select("project_id").Where("enterprise_id = ? AND project_type = ?  AND project_status = 4", enterpriseID, projectType).Find(&RecruitingProjectIDs)
+	} else {
+		fmt.Println("专项", projectType)
+		db = db.Debug().Model(gorm_model.ProjectInfo{}).Select("project_id").Where("enterprise_id = ? AND project_type = ?  AND project_status = 9", enterpriseID, projectType).Find(&RecruitingProjectIDs)
+	}
+	db1 := GetReadDB(ctx)
+	db1 = db1.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("project_id IN ?", RecruitingProjectIDs)
+	//在一个db上持续操作,会默认一直AND连接
+	fmt.Println("招募ID", RecruitingProjectIDs)
+	//1 招募中-待选
+	err := db1.Where("task_status = 1").Count(&AccSelecting).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetWorkspaceBarNums db] Find AccSelecting error,err:%+v", err)
+		return nil, err
+	}
+
+	//执行中都是状态9 再次过滤
+	var ExecutingProjectIDs []string
+
+	db = GetReadDB(ctx)
+	db = db.Debug().Model(gorm_model.ProjectInfo{}).Select("project_id").Where("enterprise_id = ? AND project_type = ?  AND project_status = 9", enterpriseID, projectType).Find(&ExecutingProjectIDs)
+	db1 = GetReadDB(ctx)
+	db1 = db1.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("project_id IN ?", ExecutingProjectIDs)
+
+	//2 数据待审
+	db1 = GetReadDB(ctx)
+	err = db1.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("project_id IN ? AND task_stage = 14", ExecutingProjectIDs).Count(&DataPendingNum).Error
+	//err = db1.Where("task_stage = 14").Count(&DataPendingNum).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetWorkspaceBarNums db] Find DataPendingNum error,err:%+v", err)
+		return nil, err
+	}
+
+	//3 链接待审
+	db1 = GetReadDB(ctx)
+	err = db1.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("project_id IN ? AND task_stage = 12", ExecutingProjectIDs).Count(&LinkPendingNum).Error
+	//err = db1.Where("task_stage = 12").Count(&LinkPendingNum).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetWorkspaceBarNums db] Find LinkPendingNum error,err:%+v", err)
+		return nil, err
+	}
+
+	//4 初稿待审
+	db1 = GetReadDB(ctx)
+	err = db1.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("project_id IN ? AND task_stage = 10", ExecutingProjectIDs).Count(&SketchPendingNum).Error
+	//err = db1.Where("task_stage = 10").Count(&SketchPendingNum).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetWorkspaceBarNums db] Find SketchPendingNum error,err:%+v", err)
+		return nil, err
+	}
+
+	//5 脚本待审
+	db1 = GetReadDB(ctx)
+	err = db1.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("project_id IN ? AND task_stage = 8", ExecutingProjectIDs).Count(&ScriptPendingNum).Error
+	//err = db1.Where("task_stage = 8").Count(&ScriptPendingNum).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetWorkspaceBarNums db] Find ScriptPendingNum error,err:%+v", err)
+		return nil, err
+	}
+
+	//6 待签收
+	db1 = GetReadDB(ctx)
+	err = db1.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("project_id IN ? AND task_status = 2  AND logistics_status = 2", ExecutingProjectIDs).Count(&ShippedNum).Error
+	//err = db1.Where("task_stage = 5").Count(&ShippedNum).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetWorkspaceBarNums db] Find ShippedNum error,err:%+v", err)
+		return nil, err
+	}
+
+	//7 待发货
+	db1 = GetReadDB(ctx)
+	err = db1.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("project_id IN ? AND task_status = 2 AND logistics_status = 1", ExecutingProjectIDs).Count(&ShipmentPendingNum).Error
+	//err = db1.Where("task_stage = 4").Count(&ShipmentPendingNum).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetWorkspaceBarNums db] Find ShipmentPendingNum error,err:%+v", err)
+		return nil, err
+	}
+
+	workspaceNums.DataPendingNum = DataPendingNum
+	workspaceNums.LinkPendingNum = LinkPendingNum
+	workspaceNums.SketchPendingNum = SketchPendingNum
+	workspaceNums.ScriptPendingNum = ScriptPendingNum
+	workspaceNums.AccSelecting = AccSelecting
+	workspaceNums.ShippedNum = ShippedNum
+	workspaceNums.ShipmentPendingNum = ShipmentPendingNum
+
+	fmt.Printf("work %+v", workspaceNums)
+	return &workspaceNums, nil
+}

+ 24 - 0
dockerfile

@@ -0,0 +1,24 @@
+FROM golang:1.17 as builder
+
+WORKDIR /go/src/app
+
+COPY . .
+
+
+RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
+
+ENV youngee_env pro
+
+RUN go env -w GO111MODULE=on
+
+RUN go env -w GOPROXY=https://goproxy.cn,direct
+
+RUN go mod tidy -compat=1.17
+
+RUN go build .
+
+EXPOSE 8600
+
+WORKDIR /go/src/app
+
+ENTRYPOINT ["./younggee_s_api"]

+ 890 - 0
docs/docs.go

@@ -0,0 +1,890 @@
+// Package docs GENERATED BY SWAG; DO NOT EDIT
+// This file was generated by swaggo/swag
+package docs
+
+import "github.com/swaggo/swag"
+
+const docTemplate = `{
+    "schemes": {{ marshal .Schemes }},
+    "swagger": "2.0",
+    "info": {
+        "description": "{{escape .Description}}",
+        "title": "{{.Title}}",
+        "contact": {},
+        "version": "{{.Version}}"
+    },
+    "host": "{{.Host}}",
+    "basePath": "{{.BasePath}}",
+    "paths": {
+        "/login": {
+            "post": {
+                "description": "输入手机号和验证码,并登录",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "login 登录",
+                "parameters": [
+                    {
+                        "description": "登录输入内容请求参数结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.CodeLoginRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "登录返回相应结构体",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/http_model.CommonResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/http_model.CodeLoginData"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/product/changeTaskStatus": {
+            "post": {
+                "description": "更改项目任务的状态",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "ProjectChangeTaskStatus 更改项目任务状态",
+                "parameters": [
+                    {
+                        "description": "更改项目任务状态的请求结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.ProjectChangeTaskStatusRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "更改项目任务状态相应结构体",
+                        "schema": {
+                            "$ref": "#/definitions/http_model.CommonResponse"
+                        }
+                    }
+                }
+            }
+        },
+        "/product/create": {
+            "post": {
+                "description": "企业创建商品,添加到商品库",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "CreateProduct 创建商品",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "登录TOKEN信息",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    },
+                    {
+                        "description": "创建商品请求结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.CreateProductRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "创建商品相应结构体",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/http_model.CommonResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/http_model.CreateProductData"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/product/find": {
+            "post": {
+                "description": "根据产品名称查询产品信息",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "findProduct 根据产品名称查询产品信息",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "登录TOKEN信息",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    },
+                    {
+                        "description": "发送产品id请求参数结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.FindProductRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "查询对应产品返回相应结构体",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/http_model.CommonResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/http_model.FindProductData"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/product/list": {
+            "post": {
+                "description": "展示企业的商品列表",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "ProjectList 商品列表",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "登录TOKEN信息",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    },
+                    {
+                        "description": "创建全部商品请求结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.FullProjectListRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "创建全部商品列表相应结构体",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/http_model.CommonResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/http_model.FullProjectListData"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/product/taskList": {
+            "post": {
+                "description": "展示某个项目的任务列表",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "ProjectTaskList 项目任务列表",
+                "parameters": [
+                    {
+                        "description": "查询项目的任务列表的请求结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.ProjectTaskListRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "查询项目的任务列表相应结构体",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/http_model.CommonResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/http_model.ProjectTaskListData"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/project/show": {
+            "post": {
+                "description": "企业查看执行中项目",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "CreateProduct 创建商品",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "登录TOKEN信息",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    },
+                    {
+                        "description": "查看项目请求结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.ShowProjectRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "查看项目相应结构体",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/http_model.CommonResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/http_model.ShowProjectData"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/sendCode": {
+            "post": {
+                "description": "发送验证码,每次发送到邮箱",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "sendCode 发送验证码",
+                "parameters": [
+                    {
+                        "description": "发送验证码请求参数结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.SendCodeRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "发送验证码请求相应结构体",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/http_model.CommonResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/http_model.SendCodeData"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        }
+    },
+    "definitions": {
+        "http_model.CodeLoginData": {
+            "type": "object",
+            "properties": {
+                "token": {
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.CodeLoginRequest": {
+            "type": "object",
+            "properties": {
+                "code": {
+                    "type": "string"
+                },
+                "phone": {
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.CommonResponse": {
+            "type": "object",
+            "properties": {
+                "data": {},
+                "message": {
+                    "type": "string"
+                },
+                "status": {
+                    "type": "integer"
+                }
+            }
+        },
+        "http_model.CreateProductData": {
+            "type": "object",
+            "properties": {
+                "product_id": {
+                    "description": "商品id",
+                    "type": "integer"
+                }
+            }
+        },
+        "http_model.CreateProductPhoto": {
+            "type": "object",
+            "properties": {
+                "photo_uid": {
+                    "type": "string"
+                },
+                "photo_url": {
+                    "description": "图片或视频url",
+                    "type": "string"
+                },
+                "symbol": {
+                    "description": "图片为主图或详情图标志位,1为主图,2为详情图,3为视频",
+                    "type": "integer"
+                }
+            }
+        },
+        "http_model.CreateProductRequest": {
+            "type": "object",
+            "properties": {
+                "brand_name": {
+                    "type": "string"
+                },
+                "product_detail": {
+                    "type": "string"
+                },
+                "product_id": {
+                    "type": "integer"
+                },
+                "product_name": {
+                    "description": "商品名称",
+                    "type": "string"
+                },
+                "product_photos": {
+                    "description": "商品图片列表",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/http_model.CreateProductPhoto"
+                    }
+                },
+                "product_price": {
+                    "description": "商品价值",
+                    "type": "integer"
+                },
+                "product_type": {
+                    "description": "商品类型",
+                    "type": "integer"
+                },
+                "product_url": {
+                    "description": "商品链接,可为电商网址、公司官网、大众点评的店铺地址等可以说明商品信息或者品牌信息的线上地址;",
+                    "type": "string"
+                },
+                "shop_address": {
+                    "description": "店铺地址,商品类型为线下品牌时需填写",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.FindProductData": {
+            "type": "object",
+            "properties": {
+                "brand_name": {
+                    "description": "品牌名称",
+                    "type": "string"
+                },
+                "enterprise_id": {
+                    "description": "所属企业id",
+                    "type": "integer"
+                },
+                "product_detail": {
+                    "type": "string"
+                },
+                "product_id": {
+                    "type": "integer"
+                },
+                "product_name": {
+                    "description": "商品名称",
+                    "type": "string"
+                },
+                "product_photos": {
+                    "description": "商品图片列表",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/http_model.ProductPhoto"
+                    }
+                },
+                "product_price": {
+                    "description": "商品价值",
+                    "type": "integer"
+                },
+                "product_type": {
+                    "description": "商品类型",
+                    "type": "integer"
+                },
+                "product_url": {
+                    "description": "商品链接,可为电商网址、公司官网、大众点评的店铺地址等可以说明商品信息或者品牌信息的线上地址;",
+                    "type": "string"
+                },
+                "shop_address": {
+                    "description": "店铺地址,商品类型为线下品牌时需填写",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.FindProductRequest": {
+            "type": "object",
+            "properties": {
+                "product_id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "http_model.FullProjectListData": {
+            "type": "object",
+            "properties": {
+                "full_project_pre_view": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/http_model.FullProjectPreview"
+                    }
+                },
+                "total": {
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.FullProjectListRequest": {
+            "type": "object",
+            "properties": {
+                "page_num": {
+                    "type": "integer"
+                },
+                "page_size": {
+                    "type": "integer"
+                },
+                "project_content_type": {
+                    "description": "内容形式",
+                    "type": "string"
+                },
+                "project_form": {
+                    "description": "项目形式",
+                    "type": "string"
+                },
+                "project_id": {
+                    "description": "项目ID",
+                    "type": "string"
+                },
+                "project_name": {
+                    "description": "项目名",
+                    "type": "string"
+                },
+                "project_platform": {
+                    "description": "项目平台",
+                    "type": "string"
+                },
+                "project_status": {
+                    "description": "项目状态",
+                    "type": "string"
+                },
+                "project_updated": {
+                    "description": "最后操作时间",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.FullProjectPreview": {
+            "type": "object",
+            "properties": {
+                "project_content_type": {
+                    "description": "ProjectFeeForms    []string ` + "`" + `json:\"project_fee_forms\"` + "`" + `    // 稿费形式",
+                    "type": "string"
+                },
+                "project_form": {
+                    "description": "项目形式",
+                    "type": "string"
+                },
+                "project_id": {
+                    "description": "项目ID",
+                    "type": "string"
+                },
+                "project_name": {
+                    "description": "项目名",
+                    "type": "string"
+                },
+                "project_platform": {
+                    "description": "项目平台",
+                    "type": "string"
+                },
+                "project_status": {
+                    "description": "项目状态",
+                    "type": "string"
+                },
+                "project_updated": {
+                    "description": "最后操作时间",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.ProductPhoto": {
+            "type": "object",
+            "properties": {
+                "photo_uid": {
+                    "type": "string"
+                },
+                "photo_url": {
+                    "description": "图片或视频url",
+                    "type": "string"
+                },
+                "symbol": {
+                    "description": "图片为主图或详情图标志位,1为主图,2为详情图,3为视频",
+                    "type": "integer"
+                }
+            }
+        },
+        "http_model.ProjectChangeTaskStatusRequest": {
+            "type": "object",
+            "properties": {
+                "taskIds": {
+                    "type": "array",
+                    "items": {
+                        "type": "string"
+                    }
+                },
+                "task_status": {
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.ProjectTaskListData": {
+            "type": "object",
+            "properties": {
+                "project_task_pre_view": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/http_model.ProjectTaskPreview"
+                    }
+                },
+                "total": {
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.ProjectTaskListRequest": {
+            "type": "object",
+            "properties": {
+                "page_num": {
+                    "type": "integer"
+                },
+                "page_size": {
+                    "type": "integer"
+                },
+                "platform_nickname": {
+                    "description": "账号昵称",
+                    "type": "string"
+                },
+                "project_id": {
+                    "description": "项目ID",
+                    "type": "string"
+                },
+                "strategy_id": {
+                    "description": "策略ID",
+                    "type": "string"
+                },
+                "task_id": {
+                    "description": "任务ID",
+                    "type": "string"
+                },
+                "task_status": {
+                    "description": "任务状态",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.ProjectTaskPreview": {
+            "type": "object",
+            "properties": {
+                "create_date": {
+                    "description": "创建时间",
+                    "type": "string"
+                },
+                "fans_count": {
+                    "description": "粉丝数",
+                    "type": "string"
+                },
+                "home_page_capture_url": {
+                    "description": "主页链接",
+                    "type": "string"
+                },
+                "platform_nickname": {
+                    "description": "账号昵称",
+                    "type": "string"
+                },
+                "strategy_id": {
+                    "description": "报名选择的招募策略id",
+                    "type": "string"
+                },
+                "talent_personal_info_snap": {
+                    "description": "达人个人信息快照",
+                    "type": "string"
+                },
+                "task_id": {
+                    "description": "任务ID",
+                    "type": "string"
+                },
+                "task_reward": {
+                    "description": "任务奖励金额",
+                    "type": "string"
+                },
+                "task_status": {
+                    "description": "任务状态",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.SendCodeData": {
+            "type": "object"
+        },
+        "http_model.SendCodeRequest": {
+            "type": "object",
+            "properties": {
+                "email": {
+                    "type": "string"
+                },
+                "phone": {
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.ShowProjectData": {
+            "type": "object",
+            "properties": {
+                "content_type": {
+                    "description": "内容形式,1代表图文,2代表视频",
+                    "type": "string"
+                },
+                "create_at": {
+                    "description": "创建时间",
+                    "type": "string"
+                },
+                "enterprise_id": {
+                    "description": "企业id",
+                    "type": "string"
+                },
+                "phone": {
+                    "description": "联系方式",
+                    "type": "string"
+                },
+                "product_id": {
+                    "description": "关联商品id",
+                    "type": "string"
+                },
+                "project_detail": {
+                    "description": "项目详情",
+                    "type": "string"
+                },
+                "project_form": {
+                    "description": "项目形式,1-4分别代表实体商品寄拍、虚拟产品测评、线下探店打卡、素材微原创",
+                    "type": "string"
+                },
+                "project_id": {
+                    "description": "项目id",
+                    "type": "string"
+                },
+                "project_name": {
+                    "description": "项目名称",
+                    "type": "string"
+                },
+                "project_photos": {
+                    "description": "项目图片",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/http_model.ShowProjectPhoto"
+                    }
+                },
+                "project_platform": {
+                    "description": "项目平台,1-7分别代表红book、抖音、微博、快手、b站、大众点评、知乎",
+                    "type": "string"
+                },
+                "project_status": {
+                    "description": "项目状态,1-7分别代表创建中、待审核、招募中、待支付、失效、执行中、已结案",
+                    "type": "string"
+                },
+                "project_type": {
+                    "description": "项目类型,1代表全流程项目,2代表专项项目",
+                    "type": "string"
+                },
+                "recruit_ddl": {
+                    "description": "招募截止时间",
+                    "type": "string"
+                },
+                "recruit_strategys": {
+                    "description": "定价策略",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/http_model.ShowRecruitStrategy"
+                    }
+                },
+                "talent_type": {
+                    "description": "达人类型",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.ShowProjectPhoto": {
+            "type": "object",
+            "properties": {
+                "photo_uid": {
+                    "type": "string"
+                },
+                "photo_url": {
+                    "description": "图片url",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.ShowProjectRequest": {
+            "type": "object",
+            "properties": {
+                "Project_id": {
+                    "description": "项目id",
+                    "type": "integer"
+                }
+            }
+        },
+        "http_model.ShowRecruitStrategy": {
+            "type": "object",
+            "properties": {
+                "fee_form": {
+                    "description": "稿费形式,1-3分别代表自报价、固定稿费、产品置换",
+                    "type": "string"
+                },
+                "followers_low": {
+                    "description": "达人粉丝数下限",
+                    "type": "string"
+                },
+                "followers_up": {
+                    "description": "达人粉丝数上限",
+                    "type": "string"
+                },
+                "offer": {
+                    "description": "报价",
+                    "type": "string"
+                },
+                "recruit_number": {
+                    "description": "招募数量",
+                    "type": "string"
+                },
+                "strategy_id": {
+                    "description": "策略id",
+                    "type": "string"
+                }
+            }
+        }
+    }
+}`
+
+// SwaggerInfo holds exported Swagger Info so clients can modify it
+var SwaggerInfo = &swag.Spec{
+	Version:          "",
+	Host:             "",
+	BasePath:         "",
+	Schemes:          []string{},
+	Title:            "",
+	Description:      "",
+	InfoInstanceName: "swagger",
+	SwaggerTemplate:  docTemplate,
+}
+
+func init() {
+	swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo)
+}

+ 862 - 0
docs/swagger.json

@@ -0,0 +1,862 @@
+{
+    "swagger": "2.0",
+    "info": {
+        "contact": {}
+    },
+    "paths": {
+        "/login": {
+            "post": {
+                "description": "输入手机号和验证码,并登录",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "login 登录",
+                "parameters": [
+                    {
+                        "description": "登录输入内容请求参数结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.CodeLoginRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "登录返回相应结构体",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/http_model.CommonResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/http_model.CodeLoginData"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/product/changeTaskStatus": {
+            "post": {
+                "description": "更改项目任务的状态",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "ProjectChangeTaskStatus 更改项目任务状态",
+                "parameters": [
+                    {
+                        "description": "更改项目任务状态的请求结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.ProjectChangeTaskStatusRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "更改项目任务状态相应结构体",
+                        "schema": {
+                            "$ref": "#/definitions/http_model.CommonResponse"
+                        }
+                    }
+                }
+            }
+        },
+        "/product/create": {
+            "post": {
+                "description": "企业创建商品,添加到商品库",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "CreateProduct 创建商品",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "登录TOKEN信息",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    },
+                    {
+                        "description": "创建商品请求结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.CreateProductRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "创建商品相应结构体",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/http_model.CommonResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/http_model.CreateProductData"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/product/find": {
+            "post": {
+                "description": "根据产品名称查询产品信息",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "findProduct 根据产品名称查询产品信息",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "登录TOKEN信息",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    },
+                    {
+                        "description": "发送产品id请求参数结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.FindProductRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "查询对应产品返回相应结构体",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/http_model.CommonResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/http_model.FindProductData"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/product/list": {
+            "post": {
+                "description": "展示企业的商品列表",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "ProjectList 商品列表",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "登录TOKEN信息",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    },
+                    {
+                        "description": "创建全部商品请求结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.FullProjectListRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "创建全部商品列表相应结构体",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/http_model.CommonResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/http_model.FullProjectListData"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/product/taskList": {
+            "post": {
+                "description": "展示某个项目的任务列表",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "ProjectTaskList 项目任务列表",
+                "parameters": [
+                    {
+                        "description": "查询项目的任务列表的请求结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.ProjectTaskListRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "查询项目的任务列表相应结构体",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/http_model.CommonResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/http_model.ProjectTaskListData"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/project/show": {
+            "post": {
+                "description": "企业查看执行中项目",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "CreateProduct 创建商品",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "登录TOKEN信息",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    },
+                    {
+                        "description": "查看项目请求结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.ShowProjectRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "查看项目相应结构体",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/http_model.CommonResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/http_model.ShowProjectData"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/sendCode": {
+            "post": {
+                "description": "发送验证码,每次发送到邮箱",
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "summary": "sendCode 发送验证码",
+                "parameters": [
+                    {
+                        "description": "发送验证码请求参数结构体",
+                        "name": "req",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/http_model.SendCodeRequest"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "发送验证码请求相应结构体",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/http_model.CommonResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/http_model.SendCodeData"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        }
+    },
+    "definitions": {
+        "http_model.CodeLoginData": {
+            "type": "object",
+            "properties": {
+                "token": {
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.CodeLoginRequest": {
+            "type": "object",
+            "properties": {
+                "code": {
+                    "type": "string"
+                },
+                "phone": {
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.CommonResponse": {
+            "type": "object",
+            "properties": {
+                "data": {},
+                "message": {
+                    "type": "string"
+                },
+                "status": {
+                    "type": "integer"
+                }
+            }
+        },
+        "http_model.CreateProductData": {
+            "type": "object",
+            "properties": {
+                "product_id": {
+                    "description": "商品id",
+                    "type": "integer"
+                }
+            }
+        },
+        "http_model.CreateProductPhoto": {
+            "type": "object",
+            "properties": {
+                "photo_uid": {
+                    "type": "string"
+                },
+                "photo_url": {
+                    "description": "图片或视频url",
+                    "type": "string"
+                },
+                "symbol": {
+                    "description": "图片为主图或详情图标志位,1为主图,2为详情图,3为视频",
+                    "type": "integer"
+                }
+            }
+        },
+        "http_model.CreateProductRequest": {
+            "type": "object",
+            "properties": {
+                "brand_name": {
+                    "type": "string"
+                },
+                "product_detail": {
+                    "type": "string"
+                },
+                "product_id": {
+                    "type": "integer"
+                },
+                "product_name": {
+                    "description": "商品名称",
+                    "type": "string"
+                },
+                "product_photos": {
+                    "description": "商品图片列表",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/http_model.CreateProductPhoto"
+                    }
+                },
+                "product_price": {
+                    "description": "商品价值",
+                    "type": "integer"
+                },
+                "product_type": {
+                    "description": "商品类型",
+                    "type": "integer"
+                },
+                "product_url": {
+                    "description": "商品链接,可为电商网址、公司官网、大众点评的店铺地址等可以说明商品信息或者品牌信息的线上地址;",
+                    "type": "string"
+                },
+                "shop_address": {
+                    "description": "店铺地址,商品类型为线下品牌时需填写",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.FindProductData": {
+            "type": "object",
+            "properties": {
+                "brand_name": {
+                    "description": "品牌名称",
+                    "type": "string"
+                },
+                "enterprise_id": {
+                    "description": "所属企业id",
+                    "type": "integer"
+                },
+                "product_detail": {
+                    "type": "string"
+                },
+                "product_id": {
+                    "type": "integer"
+                },
+                "product_name": {
+                    "description": "商品名称",
+                    "type": "string"
+                },
+                "product_photos": {
+                    "description": "商品图片列表",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/http_model.ProductPhoto"
+                    }
+                },
+                "product_price": {
+                    "description": "商品价值",
+                    "type": "integer"
+                },
+                "product_type": {
+                    "description": "商品类型",
+                    "type": "integer"
+                },
+                "product_url": {
+                    "description": "商品链接,可为电商网址、公司官网、大众点评的店铺地址等可以说明商品信息或者品牌信息的线上地址;",
+                    "type": "string"
+                },
+                "shop_address": {
+                    "description": "店铺地址,商品类型为线下品牌时需填写",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.FindProductRequest": {
+            "type": "object",
+            "properties": {
+                "product_id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "http_model.FullProjectListData": {
+            "type": "object",
+            "properties": {
+                "full_project_pre_view": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/http_model.FullProjectPreview"
+                    }
+                },
+                "total": {
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.FullProjectListRequest": {
+            "type": "object",
+            "properties": {
+                "page_num": {
+                    "type": "integer"
+                },
+                "page_size": {
+                    "type": "integer"
+                },
+                "project_content_type": {
+                    "description": "内容形式",
+                    "type": "string"
+                },
+                "project_form": {
+                    "description": "项目形式",
+                    "type": "string"
+                },
+                "project_id": {
+                    "description": "项目ID",
+                    "type": "string"
+                },
+                "project_name": {
+                    "description": "项目名",
+                    "type": "string"
+                },
+                "project_platform": {
+                    "description": "项目平台",
+                    "type": "string"
+                },
+                "project_status": {
+                    "description": "项目状态",
+                    "type": "string"
+                },
+                "project_updated": {
+                    "description": "最后操作时间",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.FullProjectPreview": {
+            "type": "object",
+            "properties": {
+                "project_content_type": {
+                    "description": "ProjectFeeForms    []string `json:\"project_fee_forms\"`    // 稿费形式",
+                    "type": "string"
+                },
+                "project_form": {
+                    "description": "项目形式",
+                    "type": "string"
+                },
+                "project_id": {
+                    "description": "项目ID",
+                    "type": "string"
+                },
+                "project_name": {
+                    "description": "项目名",
+                    "type": "string"
+                },
+                "project_platform": {
+                    "description": "项目平台",
+                    "type": "string"
+                },
+                "project_status": {
+                    "description": "项目状态",
+                    "type": "string"
+                },
+                "project_updated": {
+                    "description": "最后操作时间",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.ProductPhoto": {
+            "type": "object",
+            "properties": {
+                "photo_uid": {
+                    "type": "string"
+                },
+                "photo_url": {
+                    "description": "图片或视频url",
+                    "type": "string"
+                },
+                "symbol": {
+                    "description": "图片为主图或详情图标志位,1为主图,2为详情图,3为视频",
+                    "type": "integer"
+                }
+            }
+        },
+        "http_model.ProjectChangeTaskStatusRequest": {
+            "type": "object",
+            "properties": {
+                "taskIds": {
+                    "type": "array",
+                    "items": {
+                        "type": "string"
+                    }
+                },
+                "task_status": {
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.ProjectTaskListData": {
+            "type": "object",
+            "properties": {
+                "project_task_pre_view": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/http_model.ProjectTaskPreview"
+                    }
+                },
+                "total": {
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.ProjectTaskListRequest": {
+            "type": "object",
+            "properties": {
+                "page_num": {
+                    "type": "integer"
+                },
+                "page_size": {
+                    "type": "integer"
+                },
+                "platform_nickname": {
+                    "description": "账号昵称",
+                    "type": "string"
+                },
+                "project_id": {
+                    "description": "项目ID",
+                    "type": "string"
+                },
+                "strategy_id": {
+                    "description": "策略ID",
+                    "type": "string"
+                },
+                "task_id": {
+                    "description": "任务ID",
+                    "type": "string"
+                },
+                "task_status": {
+                    "description": "任务状态",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.ProjectTaskPreview": {
+            "type": "object",
+            "properties": {
+                "create_date": {
+                    "description": "创建时间",
+                    "type": "string"
+                },
+                "fans_count": {
+                    "description": "粉丝数",
+                    "type": "string"
+                },
+                "home_page_capture_url": {
+                    "description": "主页链接",
+                    "type": "string"
+                },
+                "platform_nickname": {
+                    "description": "账号昵称",
+                    "type": "string"
+                },
+                "strategy_id": {
+                    "description": "报名选择的招募策略id",
+                    "type": "string"
+                },
+                "talent_personal_info_snap": {
+                    "description": "达人个人信息快照",
+                    "type": "string"
+                },
+                "task_id": {
+                    "description": "任务ID",
+                    "type": "string"
+                },
+                "task_reward": {
+                    "description": "任务奖励金额",
+                    "type": "string"
+                },
+                "task_status": {
+                    "description": "任务状态",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.SendCodeData": {
+            "type": "object"
+        },
+        "http_model.SendCodeRequest": {
+            "type": "object",
+            "properties": {
+                "email": {
+                    "type": "string"
+                },
+                "phone": {
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.ShowProjectData": {
+            "type": "object",
+            "properties": {
+                "content_type": {
+                    "description": "内容形式,1代表图文,2代表视频",
+                    "type": "string"
+                },
+                "create_at": {
+                    "description": "创建时间",
+                    "type": "string"
+                },
+                "enterprise_id": {
+                    "description": "企业id",
+                    "type": "string"
+                },
+                "phone": {
+                    "description": "联系方式",
+                    "type": "string"
+                },
+                "product_id": {
+                    "description": "关联商品id",
+                    "type": "string"
+                },
+                "project_detail": {
+                    "description": "项目详情",
+                    "type": "string"
+                },
+                "project_form": {
+                    "description": "项目形式,1-4分别代表实体商品寄拍、虚拟产品测评、线下探店打卡、素材微原创",
+                    "type": "string"
+                },
+                "project_id": {
+                    "description": "项目id",
+                    "type": "string"
+                },
+                "project_name": {
+                    "description": "项目名称",
+                    "type": "string"
+                },
+                "project_photos": {
+                    "description": "项目图片",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/http_model.ShowProjectPhoto"
+                    }
+                },
+                "project_platform": {
+                    "description": "项目平台,1-7分别代表红book、抖音、微博、快手、b站、大众点评、知乎",
+                    "type": "string"
+                },
+                "project_status": {
+                    "description": "项目状态,1-7分别代表创建中、待审核、招募中、待支付、失效、执行中、已结案",
+                    "type": "string"
+                },
+                "project_type": {
+                    "description": "项目类型,1代表全流程项目,2代表专项项目",
+                    "type": "string"
+                },
+                "recruit_ddl": {
+                    "description": "招募截止时间",
+                    "type": "string"
+                },
+                "recruit_strategys": {
+                    "description": "定价策略",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/http_model.ShowRecruitStrategy"
+                    }
+                },
+                "talent_type": {
+                    "description": "达人类型",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.ShowProjectPhoto": {
+            "type": "object",
+            "properties": {
+                "photo_uid": {
+                    "type": "string"
+                },
+                "photo_url": {
+                    "description": "图片url",
+                    "type": "string"
+                }
+            }
+        },
+        "http_model.ShowProjectRequest": {
+            "type": "object",
+            "properties": {
+                "Project_id": {
+                    "description": "项目id",
+                    "type": "integer"
+                }
+            }
+        },
+        "http_model.ShowRecruitStrategy": {
+            "type": "object",
+            "properties": {
+                "fee_form": {
+                    "description": "稿费形式,1-3分别代表自报价、固定稿费、产品置换",
+                    "type": "string"
+                },
+                "followers_low": {
+                    "description": "达人粉丝数下限",
+                    "type": "string"
+                },
+                "followers_up": {
+                    "description": "达人粉丝数上限",
+                    "type": "string"
+                },
+                "offer": {
+                    "description": "报价",
+                    "type": "string"
+                },
+                "recruit_number": {
+                    "description": "招募数量",
+                    "type": "string"
+                },
+                "strategy_id": {
+                    "description": "策略id",
+                    "type": "string"
+                }
+            }
+        }
+    }
+}

+ 566 - 0
docs/swagger.yaml

@@ -0,0 +1,566 @@
+definitions:
+  http_model.CodeLoginData:
+    properties:
+      token:
+        type: string
+    type: object
+  http_model.CodeLoginRequest:
+    properties:
+      code:
+        type: string
+      phone:
+        type: string
+    type: object
+  http_model.CommonResponse:
+    properties:
+      data: {}
+      message:
+        type: string
+      status:
+        type: integer
+    type: object
+  http_model.CreateProductData:
+    properties:
+      product_id:
+        description: 商品id
+        type: integer
+    type: object
+  http_model.CreateProductPhoto:
+    properties:
+      photo_uid:
+        type: string
+      photo_url:
+        description: 图片或视频url
+        type: string
+      symbol:
+        description: 图片为主图或详情图标志位,1为主图,2为详情图,3为视频
+        type: integer
+    type: object
+  http_model.CreateProductRequest:
+    properties:
+      brand_name:
+        type: string
+      product_detail:
+        type: string
+      product_id:
+        type: integer
+      product_name:
+        description: 商品名称
+        type: string
+      product_photos:
+        description: 商品图片列表
+        items:
+          $ref: '#/definitions/http_model.CreateProductPhoto'
+        type: array
+      product_price:
+        description: 商品价值
+        type: integer
+      product_type:
+        description: 商品类型
+        type: integer
+      product_url:
+        description: 商品链接,可为电商网址、公司官网、大众点评的店铺地址等可以说明商品信息或者品牌信息的线上地址;
+        type: string
+      shop_address:
+        description: 店铺地址,商品类型为线下品牌时需填写
+        type: string
+    type: object
+  http_model.FindProductData:
+    properties:
+      brand_name:
+        description: 品牌名称
+        type: string
+      enterprise_id:
+        description: 所属企业id
+        type: integer
+      product_detail:
+        type: string
+      product_id:
+        type: integer
+      product_name:
+        description: 商品名称
+        type: string
+      product_photos:
+        description: 商品图片列表
+        items:
+          $ref: '#/definitions/http_model.ProductPhoto'
+        type: array
+      product_price:
+        description: 商品价值
+        type: integer
+      product_type:
+        description: 商品类型
+        type: integer
+      product_url:
+        description: 商品链接,可为电商网址、公司官网、大众点评的店铺地址等可以说明商品信息或者品牌信息的线上地址;
+        type: string
+      shop_address:
+        description: 店铺地址,商品类型为线下品牌时需填写
+        type: string
+    type: object
+  http_model.FindProductRequest:
+    properties:
+      product_id:
+        type: integer
+    type: object
+  http_model.FullProjectListData:
+    properties:
+      full_project_pre_view:
+        items:
+          $ref: '#/definitions/http_model.FullProjectPreview'
+        type: array
+      total:
+        type: string
+    type: object
+  http_model.FullProjectListRequest:
+    properties:
+      page_num:
+        type: integer
+      page_size:
+        type: integer
+      project_content_type:
+        description: 内容形式
+        type: string
+      project_form:
+        description: 项目形式
+        type: string
+      project_id:
+        description: 项目ID
+        type: string
+      project_name:
+        description: 项目名
+        type: string
+      project_platform:
+        description: 项目平台
+        type: string
+      project_status:
+        description: 项目状态
+        type: string
+      project_updated:
+        description: 最后操作时间
+        type: string
+    type: object
+  http_model.FullProjectPreview:
+    properties:
+      project_content_type:
+        description: ProjectFeeForms    []string `json:"project_fee_forms"`    //
+          稿费形式
+        type: string
+      project_form:
+        description: 项目形式
+        type: string
+      project_id:
+        description: 项目ID
+        type: string
+      project_name:
+        description: 项目名
+        type: string
+      project_platform:
+        description: 项目平台
+        type: string
+      project_status:
+        description: 项目状态
+        type: string
+      project_updated:
+        description: 最后操作时间
+        type: string
+    type: object
+  http_model.ProductPhoto:
+    properties:
+      photo_uid:
+        type: string
+      photo_url:
+        description: 图片或视频url
+        type: string
+      symbol:
+        description: 图片为主图或详情图标志位,1为主图,2为详情图,3为视频
+        type: integer
+    type: object
+  http_model.ProjectChangeTaskStatusRequest:
+    properties:
+      task_status:
+        type: string
+      taskIds:
+        items:
+          type: string
+        type: array
+    type: object
+  http_model.ProjectTaskListData:
+    properties:
+      project_task_pre_view:
+        items:
+          $ref: '#/definitions/http_model.ProjectTaskPreview'
+        type: array
+      total:
+        type: string
+    type: object
+  http_model.ProjectTaskListRequest:
+    properties:
+      page_num:
+        type: integer
+      page_size:
+        type: integer
+      platform_nickname:
+        description: 账号昵称
+        type: string
+      project_id:
+        description: 项目ID
+        type: string
+      strategy_id:
+        description: 策略ID
+        type: string
+      task_id:
+        description: 任务ID
+        type: string
+      task_status:
+        description: 任务状态
+        type: string
+    type: object
+  http_model.ProjectTaskPreview:
+    properties:
+      create_date:
+        description: 创建时间
+        type: string
+      fans_count:
+        description: 粉丝数
+        type: string
+      home_page_capture_url:
+        description: 主页链接
+        type: string
+      platform_nickname:
+        description: 账号昵称
+        type: string
+      strategy_id:
+        description: 报名选择的招募策略id
+        type: string
+      talent_personal_info_snap:
+        description: 达人个人信息快照
+        type: string
+      task_id:
+        description: 任务ID
+        type: string
+      task_reward:
+        description: 任务奖励金额
+        type: string
+      task_status:
+        description: 任务状态
+        type: string
+    type: object
+  http_model.SendCodeData:
+    type: object
+  http_model.SendCodeRequest:
+    properties:
+      email:
+        type: string
+      phone:
+        type: string
+    type: object
+  http_model.ShowProjectData:
+    properties:
+      content_type:
+        description: 内容形式,1代表图文,2代表视频
+        type: string
+      create_at:
+        description: 创建时间
+        type: string
+      enterprise_id:
+        description: 企业id
+        type: string
+      phone:
+        description: 联系方式
+        type: string
+      product_id:
+        description: 关联商品id
+        type: string
+      project_detail:
+        description: 项目详情
+        type: string
+      project_form:
+        description: 项目形式,1-4分别代表实体商品寄拍、虚拟产品测评、线下探店打卡、素材微原创
+        type: string
+      project_id:
+        description: 项目id
+        type: string
+      project_name:
+        description: 项目名称
+        type: string
+      project_photos:
+        description: 项目图片
+        items:
+          $ref: '#/definitions/http_model.ShowProjectPhoto'
+        type: array
+      project_platform:
+        description: 项目平台,1-7分别代表红book、抖音、微博、快手、b站、大众点评、知乎
+        type: string
+      project_status:
+        description: 项目状态,1-7分别代表创建中、待审核、招募中、待支付、失效、执行中、已结案
+        type: string
+      project_type:
+        description: 项目类型,1代表全流程项目,2代表专项项目
+        type: string
+      recruit_ddl:
+        description: 招募截止时间
+        type: string
+      recruit_strategys:
+        description: 定价策略
+        items:
+          $ref: '#/definitions/http_model.ShowRecruitStrategy'
+        type: array
+      talent_type:
+        description: 达人类型
+        type: string
+    type: object
+  http_model.ShowProjectPhoto:
+    properties:
+      photo_uid:
+        type: string
+      photo_url:
+        description: 图片url
+        type: string
+    type: object
+  http_model.ShowProjectRequest:
+    properties:
+      Project_id:
+        description: 项目id
+        type: integer
+    type: object
+  http_model.ShowRecruitStrategy:
+    properties:
+      fee_form:
+        description: 稿费形式,1-3分别代表自报价、固定稿费、产品置换
+        type: string
+      followers_low:
+        description: 达人粉丝数下限
+        type: string
+      followers_up:
+        description: 达人粉丝数上限
+        type: string
+      offer:
+        description: 报价
+        type: string
+      recruit_number:
+        description: 招募数量
+        type: string
+      strategy_id:
+        description: 策略id
+        type: string
+    type: object
+info:
+  contact: {}
+paths:
+  /login:
+    post:
+      consumes:
+      - application/json
+      description: 输入手机号和验证码,并登录
+      parameters:
+      - description: 登录输入内容请求参数结构体
+        in: body
+        name: req
+        required: true
+        schema:
+          $ref: '#/definitions/http_model.CodeLoginRequest'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 登录返回相应结构体
+          schema:
+            allOf:
+            - $ref: '#/definitions/http_model.CommonResponse'
+            - properties:
+                data:
+                  $ref: '#/definitions/http_model.CodeLoginData'
+              type: object
+      summary: login 登录
+  /product/changeTaskStatus:
+    post:
+      consumes:
+      - application/json
+      description: 更改项目任务的状态
+      parameters:
+      - description: 更改项目任务状态的请求结构体
+        in: body
+        name: req
+        required: true
+        schema:
+          $ref: '#/definitions/http_model.ProjectChangeTaskStatusRequest'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 更改项目任务状态相应结构体
+          schema:
+            $ref: '#/definitions/http_model.CommonResponse'
+      summary: ProjectChangeTaskStatus 更改项目任务状态
+  /product/create:
+    post:
+      consumes:
+      - application/json
+      description: 企业创建商品,添加到商品库
+      parameters:
+      - description: 登录TOKEN信息
+        in: header
+        name: Authorization
+        required: true
+        type: string
+      - description: 创建商品请求结构体
+        in: body
+        name: req
+        required: true
+        schema:
+          $ref: '#/definitions/http_model.CreateProductRequest'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 创建商品相应结构体
+          schema:
+            allOf:
+            - $ref: '#/definitions/http_model.CommonResponse'
+            - properties:
+                data:
+                  $ref: '#/definitions/http_model.CreateProductData'
+              type: object
+      summary: CreateProduct 创建商品
+  /product/find:
+    post:
+      consumes:
+      - application/json
+      description: 根据产品名称查询产品信息
+      parameters:
+      - description: 登录TOKEN信息
+        in: header
+        name: Authorization
+        required: true
+        type: string
+      - description: 发送产品id请求参数结构体
+        in: body
+        name: req
+        required: true
+        schema:
+          $ref: '#/definitions/http_model.FindProductRequest'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 查询对应产品返回相应结构体
+          schema:
+            allOf:
+            - $ref: '#/definitions/http_model.CommonResponse'
+            - properties:
+                data:
+                  $ref: '#/definitions/http_model.FindProductData'
+              type: object
+      summary: findProduct 根据产品名称查询产品信息
+  /product/list:
+    post:
+      consumes:
+      - application/json
+      description: 展示企业的商品列表
+      parameters:
+      - description: 登录TOKEN信息
+        in: header
+        name: Authorization
+        required: true
+        type: string
+      - description: 创建全部商品请求结构体
+        in: body
+        name: req
+        required: true
+        schema:
+          $ref: '#/definitions/http_model.FullProjectListRequest'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 创建全部商品列表相应结构体
+          schema:
+            allOf:
+            - $ref: '#/definitions/http_model.CommonResponse'
+            - properties:
+                data:
+                  $ref: '#/definitions/http_model.FullProjectListData'
+              type: object
+      summary: ProjectList 商品列表
+  /product/taskList:
+    post:
+      consumes:
+      - application/json
+      description: 展示某个项目的任务列表
+      parameters:
+      - description: 查询项目的任务列表的请求结构体
+        in: body
+        name: req
+        required: true
+        schema:
+          $ref: '#/definitions/http_model.ProjectTaskListRequest'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 查询项目的任务列表相应结构体
+          schema:
+            allOf:
+            - $ref: '#/definitions/http_model.CommonResponse'
+            - properties:
+                data:
+                  $ref: '#/definitions/http_model.ProjectTaskListData'
+              type: object
+      summary: ProjectTaskList 项目任务列表
+  /project/show:
+    post:
+      consumes:
+      - application/json
+      description: 企业查看执行中项目
+      parameters:
+      - description: 登录TOKEN信息
+        in: header
+        name: Authorization
+        required: true
+        type: string
+      - description: 查看项目请求结构体
+        in: body
+        name: req
+        required: true
+        schema:
+          $ref: '#/definitions/http_model.ShowProjectRequest'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 查看项目相应结构体
+          schema:
+            allOf:
+            - $ref: '#/definitions/http_model.CommonResponse'
+            - properties:
+                data:
+                  $ref: '#/definitions/http_model.ShowProjectData'
+              type: object
+      summary: CreateProduct 创建商品
+  /sendCode:
+    post:
+      consumes:
+      - application/json
+      description: 发送验证码,每次发送到邮箱
+      parameters:
+      - description: 发送验证码请求参数结构体
+        in: body
+        name: req
+        required: true
+        schema:
+          $ref: '#/definitions/http_model.SendCodeRequest'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 发送验证码请求相应结构体
+          schema:
+            allOf:
+            - $ref: '#/definitions/http_model.CommonResponse'
+            - properties:
+                data:
+                  $ref: '#/definitions/http_model.SendCodeData'
+              type: object
+      summary: sendCode 发送验证码
+swagger: "2.0"

+ 41 - 0
go.mod

@@ -0,0 +1,41 @@
+module youngee_b_api
+
+go 1.16
+
+require (
+	github.com/GUAIK-ORG/go-snowflake v0.0.0-20200116064823-220c4260e85f
+	github.com/gin-gonic/gin v1.7.7
+	github.com/google/uuid v1.3.0
+)
+
+require (
+	github.com/caixw/lib.go v0.0.0-20141220110639-1781da9139e0
+	github.com/go-openapi/swag v0.21.1 // indirect
+	github.com/go-playground/validator/v10 v10.10.1 // indirect
+	github.com/go-redis/redis/v8 v8.11.5
+	github.com/issue9/conv v1.2.2
+	github.com/jinzhu/now v1.1.5 // indirect
+	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/mailru/easyjson v0.7.7 // indirect
+	github.com/mattn/go-isatty v0.0.14 // indirect
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+	github.com/robfig/cron/v3 v3.0.1
+	github.com/satori/go.uuid v1.2.0
+	github.com/sirupsen/logrus v1.8.1
+	github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2
+	github.com/swaggo/gin-swagger v1.4.1
+	github.com/swaggo/swag v1.8.1
+	github.com/tidwall/gjson v1.14.1
+	github.com/ugorji/go v1.2.7 // indirect
+	github.com/wechatpay-apiv3/wechatpay-go v0.2.15
+	golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect
+	golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3 // indirect
+	golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12 // indirect
+	golang.org/x/tools v0.1.10 // 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
+	gopkg.in/yaml.v2 v2.4.0
+	gorm.io/driver/mysql v1.3.2
+	gorm.io/gorm v1.23.3
+)

+ 317 - 0
go.sum

@@ -0,0 +1,317 @@
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/GUAIK-ORG/go-snowflake v0.0.0-20200116064823-220c4260e85f h1:RDkg3pyE1qGbBpRWmvSN9RNZC5nUrOaEPiEpEb8y2f0=
+github.com/GUAIK-ORG/go-snowflake v0.0.0-20200116064823-220c4260e85f/go.mod h1:zA7AF9RTfpluCfz0omI4t5KCMaWHUMicsZoMccnaT44=
+github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
+github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
+github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
+github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
+github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
+github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
+github.com/agiledragon/gomonkey v2.0.2+incompatible h1:eXKi9/piiC3cjJD1658mEE2o3NjkJ5vDLgYjCQu0Xlw=
+github.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw=
+github.com/agiledragon/gomonkey/v2 v2.3.1 h1:k+UnUY0EMNYUFUAQVETGY9uUTxjMdnUkP0ARyJS1zzs=
+github.com/agiledragon/gomonkey/v2 v2.3.1/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY=
+github.com/caixw/lib.go v0.0.0-20141220110639-1781da9139e0 h1:MnIURgMAFAMyxAHu8h2TbnjxMMd7SKVCPyTZz5EfwNA=
+github.com/caixw/lib.go v0.0.0-20141220110639-1781da9139e0/go.mod h1:hQL8hyiiVE/BSo7gh13njx+DpvoPh/yE8/BkKKc62RA=
+github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
+github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/gin-contrib/gzip v0.0.3 h1:etUaeesHhEORpZMp18zoOhepboiWnFtXrBZxszWUn4k=
+github.com/gin-contrib/gzip v0.0.3/go.mod h1:YxxswVZIqOvcHEQpsSn+QF5guQtO1dCfy0shBPy4jFc=
+github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
+github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs=
+github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U=
+github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
+github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=
+github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
+github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M=
+github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
+github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
+github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU=
+github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
+github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
+github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
+github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
+github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
+github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
+github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
+github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
+github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
+github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
+github.com/go-playground/validator/v10 v10.10.1 h1:uA0+amWMiglNZKZ9FJRKUAe9U3RX91eVn1JYXMWt7ig=
+github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
+github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
+github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
+github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+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.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/issue9/assert/v2 v2.0.0 h1:vN7fr70g5ND6zM39tPZk/E4WCyjGMqApmFbujSTmEo0=
+github.com/issue9/assert/v2 v2.0.0/go.mod h1:rKr1eVGzXUhAo2af1thiKAhIA8uiSK9Wyn7mcZ4BzAg=
+github.com/issue9/conv v1.2.2 h1:DlvooVwcCgHxGxgVNSt4LFGxIVzWbMV8E2dmQlrGHNA=
+github.com/issue9/conv v1.2.2/go.mod h1:uDqE/xgXbZ5UjC2J5+HLIoguE0qOKGzv7EzLzkvoRPE=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
+github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
+github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
+github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
+github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
+github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/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/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
+github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
+github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
+github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
+github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
+github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
+github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
+github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
+github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE=
+github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U=
+github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
+github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
+github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
+github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
+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/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=
+github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
+github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
+github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2 h1:+iNTcqQJy0OZ5jk6a5NLib47eqXK8uYcPX+O4+cBpEM=
+github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w=
+github.com/swaggo/gin-swagger v1.4.1 h1:F2vJndw+Q+ZBOlsC6CaodqXJV3ZOf6hpg/4Y6MEx5BM=
+github.com/swaggo/gin-swagger v1.4.1/go.mod h1:hmJ1vPn+XjUvnbzjCdUAxVqgraxELxk8x5zAsjCE5mg=
+github.com/swaggo/swag v1.7.9/go.mod h1:gZ+TJ2w/Ve1RwQsA2IRoSOTidHz6DX+PIG8GWvbnoLU=
+github.com/swaggo/swag v1.8.1 h1:JuARzFX1Z1njbCGz+ZytBR15TFJwF2Q7fu8puJHhQYI=
+github.com/swaggo/swag v1.8.1/go.mod h1:ugemnJsPZm/kRwFUnzBlbHRd0JY9zE1M4F+uy2pAaPQ=
+github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo=
+github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
+github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
+github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
+github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
+github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo=
+github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
+github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
+github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
+github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
+github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
+github.com/wechatpay-apiv3/wechatpay-go v0.2.15 h1:WtlAK8GsLwTveS7c5W8Vd1m4rU1cJ0YW6tqBW2BlKH8=
+github.com/wechatpay-apiv3/wechatpay-go v0.2.15/go.mod h1:Ca9wvI7xFoIWiY163q1jzddarQBS+1NE17OM1ZV24nw=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 h1:tkVvjkPTB7pnW3jnid7kNyAMPVWllTNOf/qKDze4p9o=
+golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/mod v0.3.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.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o=
+golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
+golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
+golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3 h1:EN5+DfgmRMvRUrMGERW2gQl3Vc+Z7ZMnI/xdEpPSf0c=
+golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/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=
+golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12 h1:QyVthZKMsyaQwBTJE04jdNN0Pp5Fn9Qga0mrgxyERQM=
+golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
+golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20=
+golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
+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/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
+gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/mysql v1.3.2 h1:QJryWiqQ91EvZ0jZL48NOpdlPdMjdip1hQ8bTgo4H7I=
+gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U=
+gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
+gorm.io/gorm v1.23.3 h1:jYh3nm7uLZkrMVfA8WVNjDZryKfr7W+HTlInVgKFJAg=
+gorm.io/gorm v1.23.3/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=

+ 60 - 0
handler/CreateSecTaskLogistics.go

@@ -0,0 +1,60 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service/sectask_service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+)
+
+func WrapCreateSecTaskLogisticsHandler(ctx *gin.Context) {
+	handler := newCreateSecTaskLogisticsHandler(ctx)
+	baseRun(handler)
+}
+
+type CreateSecTaskLogistics struct {
+	ctx  *gin.Context
+	req  *http_model.CreateSecTaskLogisticsRequest
+	resp *http_model.CommonResponse
+}
+
+func (c CreateSecTaskLogistics) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c CreateSecTaskLogistics) getResponse() interface{} {
+	return c.resp
+}
+
+func (c CreateSecTaskLogistics) getRequest() interface{} {
+	return c.req
+}
+
+func (c CreateSecTaskLogistics) run() {
+	data := http_model.CreateSecTaskLogisticsRequest{}
+	data = *c.req
+	res, err := sectask_service.Logistics.Create(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[CreateSecTaskLogistics] call CreateSecTaskLogistics err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("CreateSecTaskLogistics fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功添加发货信息"
+	c.resp.Data = res
+}
+
+func (c CreateSecTaskLogistics) checkParam() error {
+	return nil
+}
+
+func newCreateSecTaskLogisticsHandler(ctx *gin.Context) *CreateSecTaskLogistics {
+	return &CreateSecTaskLogistics{
+		ctx:  ctx,
+		req:  http_model.NewCreateSecTaskLogisticsRequest(),
+		resp: http_model.NewCreateSecTaskLogisticsResponse(),
+	}
+}

+ 62 - 0
handler/CreateSelection.go

@@ -0,0 +1,62 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/middleware"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service/selection_service"
+	"youngee_b_api/util"
+)
+
+func WrapCreateSelectionHandler(ctx *gin.Context) {
+	handler := newCreateSelectionHandler(ctx)
+	baseRun(handler)
+}
+
+type CreateSelection struct {
+	ctx  *gin.Context
+	req  *http_model.CreateSelectionRequest
+	resp *http_model.CommonResponse
+}
+
+func (c CreateSelection) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c CreateSelection) getResponse() interface{} {
+	return c.resp
+}
+
+func (c CreateSelection) getRequest() interface{} {
+	return c.req
+}
+
+func (c CreateSelection) run() {
+	data := http_model.CreateSelectionRequest{}
+	data = *c.req
+	auth := middleware.GetSessionAuth(c.ctx)
+	enterpriseID := auth.EnterpriseID
+	res, err := selection_service.Selection.Create(c.ctx, data, enterpriseID)
+	if err != nil {
+		logrus.Errorf("[CreateSelection] call CreateSelection err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("CreateSelection fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功创建选品"
+	c.resp.Data = res
+}
+
+func (c CreateSelection) checkParam() error {
+	return nil
+}
+
+func newCreateSelectionHandler(ctx *gin.Context) *CreateSelection {
+	return &CreateSelection{
+		ctx:  ctx,
+		req:  http_model.NewCreateSelectionRequest(),
+		resp: http_model.NewCreateSelectionResponse(),
+	}
+}

+ 61 - 0
handler/GetSecTaskList.go

@@ -0,0 +1,61 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service/sectask_service"
+	"youngee_b_api/util"
+)
+
+func WrapGetSecTaskListHandler(ctx *gin.Context) {
+	handler := newGetSecTaskListHandler(ctx)
+	baseRun(handler)
+}
+
+type GetSecTaskList struct {
+	ctx  *gin.Context
+	req  *http_model.GetSecTaskListRequest
+	resp *http_model.CommonResponse
+}
+
+func (c GetSecTaskList) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c GetSecTaskList) getResponse() interface{} {
+	return c.resp
+}
+
+func (c GetSecTaskList) getRequest() interface{} {
+	return c.req
+}
+
+func (c GetSecTaskList) run() {
+	data := http_model.GetSecTaskListRequest{}
+	data = *c.req
+	//auth := middleware.GetSessionAuth(c.ctx)
+	//enterpriseID := auth.EnterpriseID
+	res, err := sectask_service.SelectionTask.GetList(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetSecTaskList] call GetSecTaskList err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("GetSecTaskList fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功查询选品任务"
+	c.resp.Data = res
+}
+
+func (c GetSecTaskList) checkParam() error {
+	return nil
+}
+
+func newGetSecTaskListHandler(ctx *gin.Context) *GetSecTaskList {
+	return &GetSecTaskList{
+		ctx:  ctx,
+		req:  http_model.NewGetSecTaskListRequest(),
+		resp: http_model.NewGetSecTaskListResponse(),
+	}
+}

+ 59 - 0
handler/GetServiceFee.go

@@ -0,0 +1,59 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+)
+
+func WrapGetServiceChargeHandler(ctx *gin.Context) {
+	handler := newGetServiceChargeHandler(ctx)
+	baseRun(handler)
+}
+
+func newGetServiceChargeHandler(ctx *gin.Context) *GetServiceChargeHandler {
+	return &GetServiceChargeHandler{
+		req:  http_model.NewGetServiceChargeRequest(),
+		resp: http_model.NewGetServiceChargeResponse(),
+		ctx:  ctx,
+	}
+}
+
+type GetServiceChargeHandler struct {
+	req  *http_model.GetServiceChargeRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *GetServiceChargeHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *GetServiceChargeHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *GetServiceChargeHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *GetServiceChargeHandler) run() {
+	data := http_model.GetServiceChargeRequest{}
+	data = *h.req
+	res, err := service.Project.GetServiceCharge(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetServiceChargeHandler] call GetServiceCharge err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		log.Info("GetServiceCharge fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = ""
+	h.resp.Data = res
+}
+
+func (h *GetServiceChargeHandler) checkParam() error {
+	return nil
+}

+ 59 - 0
handler/GetSpecialDataNumber.go

@@ -0,0 +1,59 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+)
+
+func WrapGetSpecialDataNumberHandler(ctx *gin.Context) {
+	handler := newGetSpecialDataNumberHandler(ctx)
+	baseRun(handler)
+}
+
+func newGetSpecialDataNumberHandler(ctx *gin.Context) *GetSpecialDataNumberHandler {
+	return &GetSpecialDataNumberHandler{
+		req:  http_model.NewGetSpecialDataNumberRequest(),
+		resp: http_model.NewGetSpecialDataNumberResponse(),
+		ctx:  ctx,
+	}
+}
+
+type GetSpecialDataNumberHandler struct {
+	req  *http_model.GetSpecialDataNumberRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *GetSpecialDataNumberHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *GetSpecialDataNumberHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *GetSpecialDataNumberHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *GetSpecialDataNumberHandler) run() {
+	data := http_model.GetSpecialDataNumberRequest{}
+	data = *h.req
+	res, err := service.Number.GetSpecialDataNumber(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetSpecialDataNumberHandler] call GetSpecialDataNumber err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		log.Info("GetSpecialDataNumber fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = ""
+	h.resp.Data = res
+}
+
+func (h *GetSpecialDataNumberHandler) checkParam() error {
+	return nil
+}

+ 59 - 0
handler/GetSpecialFinishData.go

@@ -0,0 +1,59 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+)
+
+func WrapGetSpecialFinishDataHandler(ctx *gin.Context) {
+	handler := newGetSpecialFinishDataHandler(ctx)
+	baseRun(handler)
+}
+
+func newGetSpecialFinishDataHandler(ctx *gin.Context) *GetSpecialFinishDataHandler {
+	return &GetSpecialFinishDataHandler{
+		req:  http_model.NewGetSpecialFinishDataRequest(),
+		resp: http_model.NewGetSpecialFinishDataResponse(),
+		ctx:  ctx,
+	}
+}
+
+type GetSpecialFinishDataHandler struct {
+	req  *http_model.GetSpecialFinishDataRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *GetSpecialFinishDataHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *GetSpecialFinishDataHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *GetSpecialFinishDataHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *GetSpecialFinishDataHandler) run() {
+	data := http_model.GetSpecialFinishDataRequest{}
+	data = *h.req
+	res, err := service.Number.GetSpecialFinishData(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetSpecialFinishDataHandler] call GetSpecialFinishData err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		log.Info("GetSpecialFinishData fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = ""
+	h.resp.Data = res
+}
+
+func (h *GetSpecialFinishDataHandler) checkParam() error {
+	return nil
+}

+ 59 - 0
handler/GetSpecialInviteNumber.go

@@ -0,0 +1,59 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+)
+
+func WrapGetSpecialInviteNumberHandler(ctx *gin.Context) {
+	handler := newGetSpecialInviteNumberHandler(ctx)
+	baseRun(handler)
+}
+
+func newGetSpecialInviteNumberHandler(ctx *gin.Context) *GetSpecialInviteNumberHandler {
+	return &GetSpecialInviteNumberHandler{
+		req:  http_model.NewGetSpecialInviteNumberRequest(),
+		resp: http_model.NewGetSpecialInviteNumberResponse(),
+		ctx:  ctx,
+	}
+}
+
+type GetSpecialInviteNumberHandler struct {
+	req  *http_model.GetSpecialInviteNumberRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *GetSpecialInviteNumberHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *GetSpecialInviteNumberHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *GetSpecialInviteNumberHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *GetSpecialInviteNumberHandler) run() {
+	data := http_model.GetSpecialInviteNumberRequest{}
+	data = *h.req
+	res, err := service.Number.GetSpecialInviteNumber(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetSpecialInviteNumberHandler] call GetSpecialInviteNumber err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		log.Info("GetSpecialInviteNumber fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = ""
+	h.resp.Data = res
+}
+
+func (h *GetSpecialInviteNumberHandler) checkParam() error {
+	return nil
+}

+ 59 - 0
handler/GetSpecialLinkNumber.go

@@ -0,0 +1,59 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+)
+
+func WrapGetSpecialLinkNumberHandler(ctx *gin.Context) {
+	handler := newGetSpecialLinkNumberHandler(ctx)
+	baseRun(handler)
+}
+
+func newGetSpecialLinkNumberHandler(ctx *gin.Context) *GetSpecialLinkNumberHandler {
+	return &GetSpecialLinkNumberHandler{
+		req:  http_model.NewGetSpecialLinkNumberRequest(),
+		resp: http_model.NewGetSpecialLinkNumberResponse(),
+		ctx:  ctx,
+	}
+}
+
+type GetSpecialLinkNumberHandler struct {
+	req  *http_model.GetSpecialLinkNumberRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *GetSpecialLinkNumberHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *GetSpecialLinkNumberHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *GetSpecialLinkNumberHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *GetSpecialLinkNumberHandler) run() {
+	data := http_model.GetSpecialLinkNumberRequest{}
+	data = *h.req
+	res, err := service.Number.GetSpecialLinkNumber(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetSpecialLinkNumberHandler] call GetSpecialLinkNumber err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		log.Info("GetSpecialLinkNumber fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = ""
+	h.resp.Data = res
+}
+
+func (h *GetSpecialLinkNumberHandler) checkParam() error {
+	return nil
+}

+ 59 - 0
handler/GetSpecialReviewNumber.go

@@ -0,0 +1,59 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+)
+
+func WrapGetSpecialReviewNumberHandler(ctx *gin.Context) {
+	handler := newGetSpecialReviewNumberHandler(ctx)
+	baseRun(handler)
+}
+
+func newGetSpecialReviewNumberHandler(ctx *gin.Context) *GetSpecialReviewNumberHandler {
+	return &GetSpecialReviewNumberHandler{
+		req:  http_model.NewGetSpecialReviewNumberRequest(),
+		resp: http_model.NewGetSpecialReviewNumberResponse(),
+		ctx:  ctx,
+	}
+}
+
+type GetSpecialReviewNumberHandler struct {
+	req  *http_model.GetSpecialReviewNumberRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *GetSpecialReviewNumberHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *GetSpecialReviewNumberHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *GetSpecialReviewNumberHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *GetSpecialReviewNumberHandler) run() {
+	data := http_model.GetSpecialReviewNumberRequest{}
+	data = *h.req
+	res, err := service.Number.GetSpecialReviewNumber(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetSpecialReviewNumberHandler] call GetSpecialReviewNumber err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		log.Info("GetSpecialReviewNumber fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = ""
+	h.resp.Data = res
+}
+
+func (h *GetSpecialReviewNumberHandler) checkParam() error {
+	return nil
+}

+ 61 - 0
handler/PassSecTaskCoop.go

@@ -0,0 +1,61 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service/sectask_service"
+	"youngee_b_api/util"
+)
+
+func WrapPassSecTaskCoopHandler(ctx *gin.Context) {
+	handler := newPassSecTaskCoopHandler(ctx)
+	baseRun(handler)
+}
+
+type PassSecTaskCoop struct {
+	ctx  *gin.Context
+	req  *http_model.PassSecTaskCoopRequest
+	resp *http_model.CommonResponse
+}
+
+func (c PassSecTaskCoop) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c PassSecTaskCoop) getResponse() interface{} {
+	return c.resp
+}
+
+func (c PassSecTaskCoop) getRequest() interface{} {
+	return c.req
+}
+
+func (c PassSecTaskCoop) run() {
+	data := http_model.PassSecTaskCoopRequest{}
+	data = *c.req
+	//auth := middleware.GetSessionAuth(c.ctx)
+	//enterpriseID := auth.EnterpriseID
+	res, err := sectask_service.SelectionTask.PassCoop(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[PassSecTaskCoop] call PassSecTaskCoop err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("PassSecTaskCoop fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功合作选品任务"
+	c.resp.Data = res
+}
+
+func (c PassSecTaskCoop) checkParam() error {
+	return nil
+}
+
+func newPassSecTaskCoopHandler(ctx *gin.Context) *PassSecTaskCoop {
+	return &PassSecTaskCoop{
+		ctx:  ctx,
+		req:  http_model.NewPassSecTaskCoopRequest(),
+		resp: http_model.NewPassSecTaskCoopResponse(),
+	}
+}

+ 62 - 0
handler/PaySelection.go

@@ -0,0 +1,62 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/middleware"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service/selection_service"
+	"youngee_b_api/util"
+)
+
+func WrapPaySelectionHandler(ctx *gin.Context) {
+	handler := newPaySelectionHandler(ctx)
+	baseRun(handler)
+}
+
+type PaySelection struct {
+	ctx  *gin.Context
+	req  *http_model.PaySelectionRequest
+	resp *http_model.CommonResponse
+}
+
+func (c PaySelection) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c PaySelection) getResponse() interface{} {
+	return c.resp
+}
+
+func (c PaySelection) getRequest() interface{} {
+	return c.req
+}
+
+func (c PaySelection) run() {
+	data := http_model.PaySelectionRequest{}
+	data = *c.req
+	auth := middleware.GetSessionAuth(c.ctx)
+	enterpriseID := auth.EnterpriseID
+	res, err := selection_service.Selection.Pay(c.ctx, data, enterpriseID)
+	if err != nil {
+		logrus.Errorf("[PaySelection] call PaySelection err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("PaySelection fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "支付成功"
+	c.resp.Data = res
+}
+
+func (c PaySelection) checkParam() error {
+	return nil
+}
+
+func newPaySelectionHandler(ctx *gin.Context) *PaySelection {
+	return &PaySelection{
+		ctx:  ctx,
+		req:  http_model.NewPaySelectionRequest(),
+		resp: http_model.NewPaySelectionResponse(),
+	}
+}

+ 61 - 0
handler/RefuseSecTaskCoop.go

@@ -0,0 +1,61 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service/sectask_service"
+	"youngee_b_api/util"
+)
+
+func WrapRefuseSecTaskCoopHandler(ctx *gin.Context) {
+	handler := newRefuseSecTaskCoopHandler(ctx)
+	baseRun(handler)
+}
+
+type RefuseSecTaskCoop struct {
+	ctx  *gin.Context
+	req  *http_model.RefuseSecTaskCoopRequest
+	resp *http_model.CommonResponse
+}
+
+func (c RefuseSecTaskCoop) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c RefuseSecTaskCoop) getResponse() interface{} {
+	return c.resp
+}
+
+func (c RefuseSecTaskCoop) getRequest() interface{} {
+	return c.req
+}
+
+func (c RefuseSecTaskCoop) run() {
+	data := http_model.RefuseSecTaskCoopRequest{}
+	data = *c.req
+	//auth := middleware.GetSessionAuth(c.ctx)
+	//enterpriseID := auth.EnterpriseID
+	res, err := sectask_service.SelectionTask.RefuseCoop(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[RefuseSecTaskCoop] call RefuseSecTaskCoop err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("RefuseSecTaskCoop fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功拒绝选品任务"
+	c.resp.Data = res
+}
+
+func (c RefuseSecTaskCoop) checkParam() error {
+	return nil
+}
+
+func newRefuseSecTaskCoopHandler(ctx *gin.Context) *RefuseSecTaskCoop {
+	return &RefuseSecTaskCoop{
+		ctx:  ctx,
+		req:  http_model.NewRefuseSecTaskCoopRequest(),
+		resp: http_model.NewRefuseSecTaskCoopResponse(),
+	}
+}

+ 61 - 0
handler/SettleSecTask.go

@@ -0,0 +1,61 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/middleware"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service/sectask_service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+)
+
+func WrapSettleSecTaskHandler(ctx *gin.Context) {
+	handler := newSettleSecTaskHandler(ctx)
+	baseRun(handler)
+}
+
+type SettleSecTask struct {
+	ctx  *gin.Context
+	req  *http_model.SettleSecTaskRequest
+	resp *http_model.CommonResponse
+}
+
+func (c SettleSecTask) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c SettleSecTask) getResponse() interface{} {
+	return c.resp
+}
+
+func (c SettleSecTask) getRequest() interface{} {
+	return c.req
+}
+
+func (c SettleSecTask) run() {
+	enterpriseID := middleware.GetSessionAuth(c.ctx).EnterpriseID
+	data := http_model.SettleSecTaskRequest{}
+	data = *c.req
+	res, err := sectask_service.SelectionTask.Settle(c.ctx, enterpriseID, data)
+	if err != nil {
+		logrus.Errorf("[SettleSecTask] call SettleSecTask err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("SettleSecTask fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Data = res
+}
+
+func (c SettleSecTask) checkParam() error {
+	return nil
+}
+
+func newSettleSecTaskHandler(ctx *gin.Context) *SettleSecTask {
+	return &SettleSecTask{
+		ctx:  ctx,
+		req:  http_model.NewSettleSecTaskRequest(),
+		resp: http_model.NewSettleSecTaskResponse(),
+	}
+}

+ 77 - 0
handler/SpecialTaskDataList.go

@@ -0,0 +1,77 @@
+package handler
+
+import (
+	"errors"
+	"fmt"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+)
+
+func WrapSpecialTaskDataListHandler(ctx *gin.Context) {
+	handler := newSpecialTaskDataListHandler(ctx)
+	baseRun(handler)
+}
+
+func newSpecialTaskDataListHandler(ctx *gin.Context) *SpecialTaskDataListHandler {
+	return &SpecialTaskDataListHandler{
+		req:  http_model.NewSpecialTaskDataListRequest(),
+		resp: http_model.NewSpecialTaskDataListResponse(),
+		ctx:  ctx,
+	}
+}
+
+type SpecialTaskDataListHandler struct {
+	req  *http_model.SpecialTaskDataListRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *SpecialTaskDataListHandler) getRequest() interface{} {
+	return h.req
+}
+
+func (h *SpecialTaskDataListHandler) getContext() *gin.Context {
+	return h.ctx
+}
+
+func (h *SpecialTaskDataListHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *SpecialTaskDataListHandler) run() {
+	conditions := pack.HttpSpecialTaskDataListRequestToCondition(h.req)
+	data, err := service.SpecialTask.GetSpecialTaskDataList(h.ctx, h.req.ProjectId, h.req.PageSize, h.req.PageNum, conditions)
+	if err != nil {
+		logrus.WithContext(h.ctx).Errorf("[TaskLogisticsListHandler] error GetProjectTaskList, err:%+v", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, consts.DefaultToast)
+		return
+	}
+	h.resp.Data = data
+}
+
+func (h *SpecialTaskDataListHandler) checkParam() error {
+	var errs []error
+	if h.req.PageNum < 0 || h.req.PageSize <= 0 {
+		errs = append(errs, errors.New("page param error"))
+	}
+	h.req.PageNum--
+	h.req.ProjectId = util.IsNull(h.req.ProjectId)
+	if _, err := conv.Int64(h.req.ProjectId); err != nil {
+		errs = append(errs, err)
+	}
+	h.req.DataStatus = util.IsNull(h.req.DataStatus)
+	if _, err := conv.Int64(h.req.DataStatus); err != nil {
+		errs = append(errs, err)
+	}
+	if len(errs) != 0 {
+		return fmt.Errorf("check param errs:%+v", errs)
+	}
+	return nil
+}

+ 76 - 0
handler/SpecialTaskFinishData.go

@@ -0,0 +1,76 @@
+package handler
+
+// import (
+// 	"errors"
+// 	"fmt"
+// 	"youngee_b_api/consts"
+// 	"youngee_b_api/model/http_model"
+// 	"youngee_b_api/pack"
+// 	"youngee_b_api/service"
+// 	"youngee_b_api/util"
+
+// 	"github.com/gin-gonic/gin"
+// 	"github.com/issue9/conv"
+// 	"github.com/sirupsen/logrus"
+// )
+
+// func WrapSpecialTaskFinishDataListHandler(ctx *gin.Context) {
+// 	handler := newSpecialTaskFinishDataListHandler(ctx)
+// 	baseRun(handler)
+// }
+
+// func newSpecialTaskFinishDataListHandler(ctx *gin.Context) *SpecialTaskFinishDataListHandler {
+// 	return &SpecialTaskFinishDataListHandler{
+// 		req:  http_model.NewSpecialTaskFinishDataListRequest(),
+// 		resp: http_model.NewSpecialTaskFinishDataListResponse(),
+// 		ctx:  ctx,
+// 	}
+// }
+
+// type SpecialTaskFinishDataListHandler struct {
+// 	req  *http_model.SpecialTaskFinishDataListRequest
+// 	resp *http_model.CommonResponse
+// 	ctx  *gin.Context
+// }
+
+// func (h *SpecialTaskFinishDataListHandler) getRequest() interface{} {
+// 	return h.req
+// }
+
+// func (h *SpecialTaskFinishDataListHandler) getContext() *gin.Context {
+// 	return h.ctx
+// }
+
+// func (h *SpecialTaskFinishDataListHandler) getResponse() interface{} {
+// 	return h.resp
+// }
+
+// func (h *SpecialTaskFinishDataListHandler) run() {
+// 	conditions := pack.HttpSpecialTaskFinishDataListRequestToCondition(h.req)
+// 	data, err := service.SpecialTask.GetSpecialTaskFinishDataList(h.ctx, h.req.ProjectId, h.req.PageSize, h.req.PageNum, conditions)
+// 	if err != nil {
+// 		logrus.WithContext(h.ctx).Errorf("[TaskLogisticsListHandler] error GetProjectTaskList, err:%+v", err)
+// 		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, consts.DefaultToast)
+// 		return
+// 	}
+// 	h.resp.Data = data
+// }
+// func (h *SpecialTaskFinishDataListHandler) checkParam() error {
+// 	var errs []error
+// 	if h.req.PageNum < 0 || h.req.PageSize <= 0 {
+// 		errs = append(errs, errors.New("page param error"))
+// 	}
+// 	h.req.PageNum--
+// 	h.req.ProjectId = util.IsNull(h.req.ProjectId)
+// 	if _, err := conv.Int64(h.req.ProjectId); err != nil {
+// 		errs = append(errs, err)
+// 	}
+// 	h.req.FinishDataStatus = util.IsNull(h.req.FinishDataStatus)
+// 	if _, err := conv.Int64(h.req.FinishDataStatus); err != nil {
+// 		errs = append(errs, err)
+// 	}
+// 	if len(errs) != 0 {
+// 		return fmt.Errorf("check param errs:%+v", errs)
+// 	}
+// 	return nil
+// }

+ 65 - 0
handler/SpecialTaskFinishDataList.go

@@ -0,0 +1,65 @@
+package handler
+
+import (
+	"errors"
+	"fmt"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+)
+
+func WrapSpecialTaskFinishDataListHandler(ctx *gin.Context) {
+	handler := newSpecialTaskFinishDataListHandler(ctx)
+	baseRun(handler)
+}
+
+func newSpecialTaskFinishDataListHandler(ctx *gin.Context) *SpecialTaskFinishDataListHandler {
+	return &SpecialTaskFinishDataListHandler{
+		req:  http_model.NewSpecialTaskFinishDataListRequest(),
+		resp: http_model.NewSpecialTaskFinishDataListResponse(),
+		ctx:  ctx,
+	}
+}
+
+type SpecialTaskFinishDataListHandler struct {
+	req  *http_model.SpecialTaskFinishDataListRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *SpecialTaskFinishDataListHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *SpecialTaskFinishDataListHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *SpecialTaskFinishDataListHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h *SpecialTaskFinishDataListHandler) run() {
+	conditions := pack.HttpSpecialTaskFinishDataListRequestToCondition(h.req)
+	data, err := service.SpecialTask.GetSpecialTaskFinishDataList(h.ctx, h.req.ProjectId, h.req.PageSize, h.req.PageNum, conditions)
+	if err != nil {
+		logrus.WithContext(h.ctx).Errorf("[TaskLogisticsListHandler] error GetProjectTaskList, err:%+v", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, consts.DefaultToast)
+		return
+	}
+	h.resp.Data = data
+}
+func (h *SpecialTaskFinishDataListHandler) checkParam() error {
+	var errs []error
+	if h.req.PageNum < 0 || h.req.PageSize <= 0 {
+		errs = append(errs, errors.New("page param error"))
+	}
+	h.req.PageNum--
+	h.req.ProjectId = util.IsNull(h.req.ProjectId)
+	if len(errs) != 0 {
+		return fmt.Errorf("check param errs:%+v", errs)
+	}
+	return nil
+}

+ 73 - 0
handler/SpecialTaskInviteList.go

@@ -0,0 +1,73 @@
+package handler
+
+import (
+	"errors"
+	"fmt"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+)
+
+func WrapSpecialTaskInviteListHandler(ctx *gin.Context) {
+	handler := newSpecialTaskInviteListHandler(ctx)
+	baseRun(handler)
+}
+
+func newSpecialTaskInviteListHandler(ctx *gin.Context) *SpecialTaskInviteListHandler {
+	return &SpecialTaskInviteListHandler{
+		req:  http_model.NewSpecialTaskInviteListRequest(),
+		resp: http_model.NewSpecialTaskInviteListResponse(),
+		ctx:  ctx,
+	}
+}
+
+type SpecialTaskInviteListHandler struct {
+	req  *http_model.SpecialTaskInviteListRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *SpecialTaskInviteListHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *SpecialTaskInviteListHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *SpecialTaskInviteListHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h *SpecialTaskInviteListHandler) run() {
+	conditions := pack.HttpSpecialTaskInviteListRequestToCondition(h.req)
+	data, err := service.SpecialTask.GetSpecialTaskInviteList(h.ctx, h.req.ProjectId, h.req.PageSize, h.req.PageNum, conditions)
+	if err != nil {
+		logrus.WithContext(h.ctx).Errorf("[TaskLogisticsListHandler] error GetProjectTaskList, err:%+v", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, consts.DefaultToast)
+		return
+	}
+	h.resp.Data = data
+}
+func (h *SpecialTaskInviteListHandler) checkParam() error {
+	var errs []error
+	if h.req.PageNum < 0 || h.req.PageSize <= 0 {
+		errs = append(errs, errors.New("page param error"))
+	}
+	h.req.PageNum--
+	h.req.ProjectId = util.IsNull(h.req.ProjectId)
+	if _, err := conv.Int64(h.req.ProjectId); err != nil {
+		errs = append(errs, err)
+	}
+	h.req.TaskStatus = util.IsNull(h.req.TaskStatus)
+	if _, err := conv.Int64(h.req.TaskStatus); err != nil {
+		errs = append(errs, err)
+	}
+	if len(errs) != 0 {
+		return fmt.Errorf("check param errs:%+v", errs)
+	}
+	return nil
+}

+ 73 - 0
handler/SpecialTaskLinkList.go

@@ -0,0 +1,73 @@
+package handler
+
+import (
+	"errors"
+	"fmt"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+)
+
+func WrapSpecialTaskLinkListHandler(ctx *gin.Context) {
+	handler := newSpecialTaskLinkListHandler(ctx)
+	baseRun(handler)
+}
+
+func newSpecialTaskLinkListHandler(ctx *gin.Context) *SpecialTaskLinkListHandler {
+	return &SpecialTaskLinkListHandler{
+		req:  http_model.NewSpecialTaskLinkListRequest(),
+		resp: http_model.NewSpecialTaskLinkListResponse(),
+		ctx:  ctx,
+	}
+}
+
+type SpecialTaskLinkListHandler struct {
+	req  *http_model.SpecialTaskLinkListRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *SpecialTaskLinkListHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *SpecialTaskLinkListHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *SpecialTaskLinkListHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h *SpecialTaskLinkListHandler) run() {
+	conditions := pack.HttpSpecialTaskLinkListRequestToCondition(h.req)
+	data, err := service.SpecialTask.GetSpecialTaskLinkList(h.ctx, h.req.ProjectId, h.req.PageSize, h.req.PageNum, conditions)
+	if err != nil {
+		logrus.WithContext(h.ctx).Errorf("[TaskLogisticsListHandler] error GetProjectTaskList, err:%+v", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, consts.DefaultToast)
+		return
+	}
+	h.resp.Data = data
+}
+func (h *SpecialTaskLinkListHandler) checkParam() error {
+	var errs []error
+	if h.req.PageNum < 0 || h.req.PageSize <= 0 {
+		errs = append(errs, errors.New("page param error"))
+	}
+	h.req.PageNum--
+	h.req.ProjectId = util.IsNull(h.req.ProjectId)
+	if _, err := conv.Int64(h.req.ProjectId); err != nil {
+		errs = append(errs, err)
+	}
+	h.req.LinkStatus = util.IsNull(h.req.LinkStatus)
+	if _, err := conv.Int64(h.req.LinkStatus); err != nil {
+		errs = append(errs, err)
+	}
+	if len(errs) != 0 {
+		return fmt.Errorf("check param errs:%+v", errs)
+	}
+	return nil
+}

+ 71 - 0
handler/SpecialTaskScriptList.go

@@ -0,0 +1,71 @@
+package handler
+
+import (
+	"errors"
+	"fmt"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+)
+
+func WrapSpecialTaskScriptListHandler(ctx *gin.Context) {
+	handler := newSpecialTaskScriptListHandler(ctx)
+	baseRun(handler)
+}
+
+func newSpecialTaskScriptListHandler(ctx *gin.Context) *SpecialTaskScriptListHandler {
+	return &SpecialTaskScriptListHandler{
+		req:  http_model.NewSpecialTaskScriptListRequest(),
+		resp: http_model.NewSpecialTaskScriptListResponse(),
+		ctx:  ctx,
+	}
+}
+
+type SpecialTaskScriptListHandler struct {
+	req  *http_model.SpecialTaskScriptListRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *SpecialTaskScriptListHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *SpecialTaskScriptListHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *SpecialTaskScriptListHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h *SpecialTaskScriptListHandler) run() {
+	conditions := pack.HttpSpecialTaskScriptListRequestToCondition(h.req)
+	data, err := service.SpecialTask.GetSpecialTaskScriptList(h.ctx, h.req.ProjectId, h.req.PageSize, h.req.PageNum, conditions)
+	if err != nil {
+		logrus.WithContext(h.ctx).Errorf("[TaskLogisticsListHandler] error GetProjectTaskList, err:%+v", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, consts.DefaultToast)
+		return
+	}
+	h.resp.Data = data
+}
+func (h *SpecialTaskScriptListHandler) checkParam() error {
+	var errs []error
+	if h.req.PageNum < 0 || h.req.PageSize <= 0 {
+		errs = append(errs, errors.New("page param error"))
+	}
+	h.req.PageNum--
+	h.req.ProjectId = util.IsNull(h.req.ProjectId)
+
+	h.req.ScriptStatus = util.IsNull(h.req.ScriptStatus)
+	if _, err := conv.Int64(h.req.ScriptStatus); err != nil {
+		errs = append(errs, err)
+	}
+	if len(errs) != 0 {
+		return fmt.Errorf("check param errs:%+v", errs)
+	}
+	return nil
+}

+ 74 - 0
handler/SpecialTaskSketchList.go

@@ -0,0 +1,74 @@
+package handler
+
+import (
+	"errors"
+	"fmt"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/pack"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/issue9/conv"
+	"github.com/sirupsen/logrus"
+)
+
+func WrapSpecialTaskSketchListHandler(ctx *gin.Context) {
+	handler := newSpecialTaskSketchListHandler(ctx)
+	baseRun(handler)
+}
+
+func newSpecialTaskSketchListHandler(ctx *gin.Context) *SpecialTaskSketchListHandler {
+	return &SpecialTaskSketchListHandler{
+		req:  http_model.NewSpecialTaskSketchListRequest(),
+		resp: http_model.NewSpecialTaskSketchListResponse(),
+		ctx:  ctx,
+	}
+}
+
+type SpecialTaskSketchListHandler struct {
+	req  *http_model.SpecialTaskSketchListRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *SpecialTaskSketchListHandler) getRequest() interface{} {
+	return h.req
+}
+
+func (h *SpecialTaskSketchListHandler) getContext() *gin.Context {
+	return h.ctx
+}
+
+func (h *SpecialTaskSketchListHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *SpecialTaskSketchListHandler) run() {
+	conditions := pack.HttpSpecialTaskSketchListRequestToCondition(h.req)
+	data, err := service.SpecialTask.GetSpecialTaskSketchList(h.ctx, h.req.ProjectId, h.req.PageSize, h.req.PageNum, conditions)
+	if err != nil {
+		logrus.WithContext(h.ctx).Errorf("[TaskLogisticsListHandler] error GetProjectTaskList, err:%+v", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, consts.DefaultToast)
+		return
+	}
+	h.resp.Data = data
+}
+
+func (h *SpecialTaskSketchListHandler) checkParam() error {
+	var errs []error
+	if h.req.PageNum < 0 || h.req.PageSize <= 0 {
+		errs = append(errs, errors.New("page param error"))
+	}
+	h.req.PageNum--
+	h.req.ProjectId = util.IsNull(h.req.ProjectId)
+	h.req.SketchStatus = util.IsNull(h.req.SketchStatus)
+	if _, err := conv.Int64(h.req.SketchStatus); err != nil {
+		errs = append(errs, err)
+	}
+	if len(errs) != 0 {
+		return fmt.Errorf("check param errs:%+v", errs)
+	}
+	return nil
+}

+ 60 - 0
handler/UpdateSecTaskLogistics.go

@@ -0,0 +1,60 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service/sectask_service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+)
+
+func WrapUpdateSecTaskLogisticsHandler(ctx *gin.Context) {
+	handler := newUpdateSecTaskLogisticsHandler(ctx)
+	baseRun(handler)
+}
+
+type UpdateSecTaskLogistics struct {
+	ctx  *gin.Context
+	req  *http_model.UpdateSecTaskLogisticsRequest
+	resp *http_model.CommonResponse
+}
+
+func (c UpdateSecTaskLogistics) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c UpdateSecTaskLogistics) getResponse() interface{} {
+	return c.resp
+}
+
+func (c UpdateSecTaskLogistics) getRequest() interface{} {
+	return c.req
+}
+
+func (c UpdateSecTaskLogistics) run() {
+	data := http_model.UpdateSecTaskLogisticsRequest{}
+	data = *c.req
+	res, err := sectask_service.Logistics.Update(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[UpdateSecTaskLogistics] call UpdateSecTaskLogistics err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("UpdateSecTaskLogistics fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功修改发货信息"
+	c.resp.Data = res
+}
+
+func (c UpdateSecTaskLogistics) checkParam() error {
+	return nil
+}
+
+func newUpdateSecTaskLogisticsHandler(ctx *gin.Context) *UpdateSecTaskLogistics {
+	return &UpdateSecTaskLogistics{
+		ctx:  ctx,
+		req:  http_model.NewUpdateSecTaskLogisticsRequest(),
+		resp: http_model.NewUpdateSecTaskLogisticsResponse(),
+	}
+}

+ 62 - 0
handler/UpdateSelection.go

@@ -0,0 +1,62 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/middleware"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service/selection_service"
+	"youngee_b_api/util"
+)
+
+func WrapUpdateSelectionHandler(ctx *gin.Context) {
+	handler := newUpdateSelectionHandler(ctx)
+	baseRun(handler)
+}
+
+type UpdateSelection struct {
+	ctx  *gin.Context
+	req  *http_model.UpdateSelectionRequest
+	resp *http_model.CommonResponse
+}
+
+func (c UpdateSelection) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c UpdateSelection) getResponse() interface{} {
+	return c.resp
+}
+
+func (c UpdateSelection) getRequest() interface{} {
+	return c.req
+}
+
+func (c UpdateSelection) run() {
+	data := http_model.UpdateSelectionRequest{}
+	data = *c.req
+	auth := middleware.GetSessionAuth(c.ctx)
+	enterpriseID := auth.EnterpriseID
+	res, err := selection_service.Selection.Update(c.ctx, data, enterpriseID)
+	if err != nil {
+		logrus.Errorf("[UpdateSelection] call UpdateSelection err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("UpdateSelection fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "选品更新成功"
+	c.resp.Data = res
+}
+
+func (c UpdateSelection) checkParam() error {
+	return nil
+}
+
+func newUpdateSelectionHandler(ctx *gin.Context) *UpdateSelection {
+	return &UpdateSelection{
+		ctx:  ctx,
+		req:  http_model.NewUpdateSelectionRequest(),
+		resp: http_model.NewUpdateSelectionResponse(),
+	}
+}

+ 60 - 0
handler/WorkspaceDDLproject.go

@@ -0,0 +1,60 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/db"
+	"youngee_b_api/middleware"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/util"
+)
+
+func WrapWorkspaceDDLprojectHandler(ctx *gin.Context) {
+	handler := newWorkspaceDDLprojectHandler(ctx)
+	baseRun(handler)
+}
+
+type WorkspaceDDLprojectHandler struct {
+	ctx  *gin.Context
+	req  *http_model.WorkspaceDDLprojectRequest
+	resp *http_model.CommonResponse
+}
+
+func (w WorkspaceDDLprojectHandler) getContext() *gin.Context {
+	return w.ctx
+}
+
+func (w WorkspaceDDLprojectHandler) getResponse() interface{} {
+	return w.resp
+}
+
+func (w WorkspaceDDLprojectHandler) getRequest() interface{} {
+	return w.req
+}
+
+func (w WorkspaceDDLprojectHandler) run() {
+	auth := middleware.GetSessionAuth(w.ctx)
+	enterpriseID := auth.EnterpriseID
+	data, err := db.GetWorkspaceDDLproject(w.ctx, enterpriseID, w.req.PageSize, w.req.PageNum)
+	if err != nil {
+		// 数据库查询失败,返回5001
+		logrus.Errorf("[WorkspaceDDLprojectHandler] call GetWorkspaceDDLproject err:%+v\n", err)
+		util.HandlerPackErrorResp(w.resp, consts.ErrorInternal, "")
+		logrus.Info("GetWorkspaceDDLproject fail,req:%+v", w.req)
+		return
+	}
+	w.resp.Data = data
+}
+
+func (w WorkspaceDDLprojectHandler) checkParam() error {
+	return nil
+}
+
+func newWorkspaceDDLprojectHandler(ctx *gin.Context) *WorkspaceDDLprojectHandler {
+	return &WorkspaceDDLprojectHandler{
+		ctx:  ctx,
+		req:  http_model.NewWorkspaceDDLprojectRequest(),
+		resp: http_model.NewWorkspaceDDLprojectResponse(),
+	}
+}

+ 59 - 0
handler/accept_data.go

@@ -0,0 +1,59 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+)
+
+func WrapAcceptDataHandler(ctx *gin.Context) {
+	handler := newAcceptDataHandler(ctx)
+	baseRun(handler)
+}
+
+func newAcceptDataHandler(ctx *gin.Context) *AcceptDataHandler {
+	return &AcceptDataHandler{
+		req:  http_model.NewAcceptDataRequest(),
+		resp: http_model.NewAcceptDataResponse(),
+		ctx:  ctx,
+	}
+}
+
+type AcceptDataHandler struct {
+	req  *http_model.AcceptDataRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *AcceptDataHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *AcceptDataHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *AcceptDataHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *AcceptDataHandler) run() {
+	data := http_model.AcceptDataRequest{}
+	data = *h.req
+	res, err := service.Data.AcceptData(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[ReviseOpinionHandler] call Create err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		log.Info("CreateProject fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = "成功通过数据"
+	h.resp.Data = res
+}
+
+func (h *AcceptDataHandler) checkParam() error {
+	return nil
+}

+ 60 - 0
handler/accept_link.go

@@ -0,0 +1,60 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+)
+
+func WrapAcceptLinkHandler(ctx *gin.Context) {
+	handler := newAcceptLinkHandler(ctx)
+	baseRun(handler)
+}
+
+func newAcceptLinkHandler(ctx *gin.Context) *AcceptLinkHandler {
+	return &AcceptLinkHandler{
+		req:  http_model.NewAcceptLinkRequest(),
+		resp: http_model.NewAcceptLinkResponse(),
+		ctx:  ctx,
+	}
+}
+
+type AcceptLinkHandler struct {
+	req  *http_model.AcceptLinkRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *AcceptLinkHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *AcceptLinkHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *AcceptLinkHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *AcceptLinkHandler) run() {
+	data := http_model.AcceptLinkRequest{}
+	data = *h.req
+	res, err := service.Link.AcceptLink(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[ReviseOpinionHandler] call Create err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		log.Info("CreateProject fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = "成功通过链接"
+	h.resp.Data = res
+	h.resp.Data = data
+}
+
+func (h *AcceptLinkHandler) checkParam() error {
+	return nil
+}

+ 90 - 0
handler/accept_script.go

@@ -0,0 +1,90 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+)
+
+func WrapAcceptScriptHandler(ctx *gin.Context) {
+	handler := newAcceptScriptHandler(ctx)
+	baseRun(handler)
+}
+
+func newAcceptScriptHandler(ctx *gin.Context) *AcceptScriptHandler {
+	return &AcceptScriptHandler{
+		req:  http_model.NewAcceptScriptRequest(),
+		resp: http_model.NewAcceptScriptResponse(),
+		ctx:  ctx,
+	}
+}
+
+type AcceptScriptHandler struct {
+	req  *http_model.AcceptScriptRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *AcceptScriptHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *AcceptScriptHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *AcceptScriptHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *AcceptScriptHandler) run() {
+	data := http_model.AcceptScriptRequest{}
+	data = *h.req
+	res, err := service.Script.AcceptScript(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[ReviseOpinionHandler] call Create err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		log.Info("CreateProject fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = "成功通过脚本"
+	h.resp.Data = res
+	h.resp.Data = data
+}
+
+/***
+func (h *AcceptScriptHandler) run() {
+	data := http_model.AcceptScriptRequest{}
+	data = *h.req
+	isRefuse := data.IsRefuse
+	if isRefuse== 0 {
+		fmt.Println("Create in")
+		res, err := service.Project.Create(h.ctx, data)
+		if err != nil {
+			logrus.Errorf("[AcceptScriptHandler] call Create err:%+v\n", err)
+			util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+			log.Info("CreateProject fail,req:%+v", h.req)
+			return
+		}
+		h.resp.Message = "成功添加修改意见"
+		h.resp.Data = res
+	} else {
+		res, err := service.Logistics.Update(h.ctx, data)
+		if err != nil {
+			logrus.Errorf("[AcceptScriptHandler] call Create err:%+v\n", err)
+			util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+			log.Info("CreateProject fail,req:%+v", h.req)
+			return
+		}
+		h.resp.Message = "成功修改物流信息"
+		h.resp.Data = res
+	}
+
+}
+***/
+func (h *AcceptScriptHandler) checkParam() error {
+	return nil
+}

+ 89 - 0
handler/accept_sketch.go

@@ -0,0 +1,89 @@
+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 WrapAcceptSketchHandler(ctx *gin.Context) {
+	handler := newAcceptSketchHandler(ctx)
+	baseRun(handler)
+}
+
+func newAcceptSketchHandler(ctx *gin.Context) *AcceptSketchHandler {
+	return &AcceptSketchHandler{
+		req:  http_model.NewAcceptSketchRequest(),
+		resp: http_model.NewAcceptSketchResponse(),
+		ctx:  ctx,
+	}
+}
+
+type AcceptSketchHandler struct {
+	req  *http_model.AcceptSketchRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *AcceptSketchHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *AcceptSketchHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *AcceptSketchHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *AcceptSketchHandler) run() {
+	data := http_model.AcceptSketchRequest{}
+	data = *h.req
+	res, err := service.Sketch.AcceptSketch(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[ReviseOpinionHandler] call Create err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		log.Info("CreateProject fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = "成功通过初稿"
+	h.resp.Data = res
+	h.resp.Data = data
+}
+
+/***
+func (h *AcceptSketchHandler) run() {
+	data := http_model.AcceptSketchRequest{}
+	data = *h.req
+	isRefuse := data.IsRefuse
+	if isRefuse== 0 {
+		fmt.Println("Create in")
+		res, err := service.Project.Create(h.ctx, data)
+		if err != nil {
+			logrus.Errorf("[AcceptSketchHandler] call Create err:%+v\n", err)
+			util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+			log.Info("CreateProject fail,req:%+v", h.req)
+			return
+		}
+		h.resp.Message = "成功添加修改意见"
+		h.resp.Data = res
+	} else {
+		res, err := service.Logistics.Update(h.ctx, data)
+		if err != nil {
+			logrus.Errorf("[AcceptSketchHandler] call Create err:%+v\n", err)
+			util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+			log.Info("CreateProject fail,req:%+v", h.req)
+			return
+		}
+		h.resp.Message = "成功修改物流信息"
+		h.resp.Data = res
+	}
+
+}
+***/
+func (h *AcceptSketchHandler) checkParam() error {
+	return nil
+}

+ 61 - 0
handler/addInvoiceRecord.go

@@ -0,0 +1,61 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/db"
+	"youngee_b_api/middleware"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/util"
+)
+
+func WrapAddInvoiceRecordHandler(ctx *gin.Context) {
+	handler := newAddInvoiceRecordHandler(ctx)
+	baseRun(handler)
+}
+
+type AddInvoiceRecordHandler struct {
+	ctx  *gin.Context
+	req  *http_model.AddInvoiceRecordRequest
+	resp *http_model.CommonResponse
+}
+
+func (a AddInvoiceRecordHandler) getContext() *gin.Context {
+	return a.ctx
+}
+
+func (a AddInvoiceRecordHandler) getResponse() interface{} {
+	return a.resp
+}
+
+func (a AddInvoiceRecordHandler) getRequest() interface{} {
+	return a.req
+}
+
+func (a AddInvoiceRecordHandler) run() {
+	auth := middleware.GetSessionAuth(a.ctx)
+	enterpriseID := auth.EnterpriseID
+	//fmt.Println("req", a.req)
+	err := db.AddInvoiceRecord(a.ctx, enterpriseID, a.req)
+	if err != nil {
+		// 数据库查询失败,返回5001
+		logrus.Errorf("[AddInvoiceRecordHandler] call AddInvoiceRecord err:%+v\n", err)
+		util.HandlerPackErrorResp(a.resp, consts.ErrorInternal, "")
+		logrus.Info("AddInvoiceRecord fail,req:%+v", a.req)
+		return
+	}
+	a.resp.Message = "开票成功"
+}
+
+func (a AddInvoiceRecordHandler) checkParam() error {
+	return nil
+}
+
+func newAddInvoiceRecordHandler(ctx *gin.Context) *AddInvoiceRecordHandler {
+	return &AddInvoiceRecordHandler{
+		ctx:  ctx,
+		req:  http_model.NewAddInvoiceRecordRequest(),
+		resp: http_model.NewAddInvoiceRecordResponse(),
+	}
+}

+ 52 - 0
handler/addNewJob.go

@@ -0,0 +1,52 @@
+package handler
+
+import (
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+)
+
+func WrapaddNewJobHandler(ctx *gin.Context) {
+	handler := newaddNewJobHandler(ctx)
+	baseRun(handler)
+}
+
+func newaddNewJobHandler(ctx *gin.Context) *AddNewJobHandler {
+	return &AddNewJobHandler{
+		req:  http_model.NewAddNewJobRequest(),
+		resp: http_model.NewAddNewJobResponse(),
+		ctx:  ctx,
+	}
+}
+
+type AddNewJobHandler struct {
+	req  *http_model.AddNewJobRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *AddNewJobHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *AddNewJobHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *AddNewJobHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h *AddNewJobHandler) run() {
+	// fmt.Println("AddNewJobHandler Running")
+	// fmt.Println("岗位信息:", h.req)
+	jobData := http_model.AddNewJobRequest{}
+	jobData = *h.req
+	err := service.Job.CreateJob(h.ctx, jobData)
+	if err != nil {
+		fmt.Println(err)
+	}
+	return
+}
+
+func (h *AddNewJobHandler) checkParam() error {
+	return nil
+}

+ 71 - 0
handler/addNewSubAccount.go

@@ -0,0 +1,71 @@
+package handler
+
+import (
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+)
+
+func WrapAddNewSubAccountHandler(ctx *gin.Context) {
+	handler := newAddNewSubAccountHandler(ctx)
+	baseRun(handler)
+}
+
+func newAddNewSubAccountHandler(ctx *gin.Context) *AddNewSubAccountHandler {
+	return &AddNewSubAccountHandler{
+		req:  http_model.NewAddSubAccountRequest(),
+		resp: http_model.NewAddSubAccountResponse(),
+		ctx:  ctx,
+	}
+}
+
+type AddNewSubAccountHandler struct {
+	req  *http_model.AddNewSubAccountRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *AddNewSubAccountHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *AddNewSubAccountHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *AddNewSubAccountHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h *AddNewSubAccountHandler) run() {
+	// fmt.Println("AddNewSubAccountHandler Running")
+	newSubAccount := http_model.AddNewSubAccountRequest{}
+	newSubAccount = *h.req
+	// 1. 验证码校验
+	tag, err := service.LoginAuth.SubAccountAuthCode(h.ctx, newSubAccount.PhoneNumber, newSubAccount.Code)
+	if err != nil {
+		fmt.Println(err)
+	}
+	// 2. 校验通过则创建样叽用户和子账号
+	if tag == "1" {
+		subAccountData, err := service.SubAccount.CreateSubAccount(h.ctx, newSubAccount)
+		respData := http_model.AddNewSubAccountData{
+			UserID:       int64(subAccountData.UserId),
+			SupplierId:   subAccountData.SupplierId,
+			SubAccountID: subAccountData.SubAccountId,
+		}
+		if err != nil {
+			fmt.Println(err)
+			h.resp.Message = "创建失败"
+		} else {
+			h.resp.Message = "成功创建子账号"
+			h.resp.Data = respData
+		}
+	} else {
+		// 验证码校验不通过的返回值
+		h.resp.Message = tag
+	}
+	return
+}
+
+func (h *AddNewSubAccountHandler) checkParam() error {
+	return nil
+}

+ 60 - 0
handler/addReceiveAddress.go

@@ -0,0 +1,60 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/db"
+	"youngee_b_api/middleware"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/util"
+)
+
+func WrapAddReceiveAddressHandler(ctx *gin.Context) {
+	handler := newAddReceiveAddressHandler(ctx)
+	baseRun(handler)
+}
+
+type AddReceiveAddressHandler struct {
+	ctx  *gin.Context
+	req  *http_model.AddReceiveAddressRequest
+	resp *http_model.CommonResponse
+}
+
+func (a AddReceiveAddressHandler) getContext() *gin.Context {
+	return a.ctx
+}
+
+func (a AddReceiveAddressHandler) getResponse() interface{} {
+	return a.resp
+}
+
+func (a AddReceiveAddressHandler) getRequest() interface{} {
+	return a.req
+}
+
+func (a AddReceiveAddressHandler) run() {
+	auth := middleware.GetSessionAuth(a.ctx)
+	enterpriseID := auth.EnterpriseID
+	err := db.AddReceiveAddress(a.ctx, enterpriseID, a.req)
+	if err != nil {
+		// 数据库查询失败,返回5001
+		logrus.Errorf("[AddReceiveAddressHandler] call AddReceiveAddress err:%+v\n", err)
+		util.HandlerPackErrorResp(a.resp, consts.ErrorInternal, "")
+		logrus.Info("AddReceiveAddress fail,req:%+v", a.req)
+		return
+	}
+	a.resp.Message = "新增收货地址成功"
+}
+
+func (a AddReceiveAddressHandler) checkParam() error {
+	return nil
+}
+
+func newAddReceiveAddressHandler(ctx *gin.Context) *AddReceiveAddressHandler {
+	return &AddReceiveAddressHandler{
+		ctx:  ctx,
+		req:  http_model.NewAddReceiveAddressRequest(),
+		resp: http_model.NewAddReceiveAddressResponse(),
+	}
+}

+ 60 - 0
handler/addReceiveInfo.go

@@ -0,0 +1,60 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/db"
+	"youngee_b_api/middleware"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/util"
+)
+
+func WrapAddReceiveInfoHandler(ctx *gin.Context) {
+	handler := newAddReceiveInfoHandler(ctx)
+	baseRun(handler)
+}
+
+type AddReceiveInfoHandler struct {
+	ctx  *gin.Context
+	req  *http_model.AddReceiveInfoRequest
+	resp *http_model.CommonResponse
+}
+
+func (a AddReceiveInfoHandler) getContext() *gin.Context {
+	return a.ctx
+}
+
+func (a AddReceiveInfoHandler) getResponse() interface{} {
+	return a.resp
+}
+
+func (a AddReceiveInfoHandler) getRequest() interface{} {
+	return a.req
+}
+
+func (a AddReceiveInfoHandler) run() {
+	auth := middleware.GetSessionAuth(a.ctx)
+	enterpriseID := auth.EnterpriseID
+	err := db.AddReceiveInfo(a.ctx, enterpriseID, a.req)
+	if err != nil {
+		// 数据库查询失败,返回5001
+		logrus.Errorf("[AddReceiveInfoHandler] call AddReceiveInfo err:%+v\n", err)
+		util.HandlerPackErrorResp(a.resp, consts.ErrorInternal, "")
+		logrus.Info("AddReceiveInfo fail,req:%+v", a.req)
+		return
+	}
+	a.resp.Message = "新增发票信息成功"
+}
+
+func (a AddReceiveInfoHandler) checkParam() error {
+	return nil
+}
+
+func newAddReceiveInfoHandler(ctx *gin.Context) *AddReceiveInfoHandler {
+	return &AddReceiveInfoHandler{
+		ctx:  ctx,
+		req:  http_model.NewAddReceiveInfoRequest(),
+		resp: http_model.NewAddReceiveInfoResponse(),
+	}
+}

+ 66 - 0
handler/add_to_list.go

@@ -0,0 +1,66 @@
+package handler
+
+import (
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+)
+
+func WrapAddToListHandler(ctx *gin.Context) {
+	handler := newAddToListHandler(ctx)
+	baseRun(handler)
+}
+
+func newAddToListHandler(ctx *gin.Context) *AddToListHandler {
+	return &AddToListHandler{
+		req:  http_model.NewAddToListRequest(),
+		resp: http_model.NewAddToListResponse(),
+		ctx:  ctx,
+	}
+}
+
+type AddToListHandler struct {
+	req  *http_model.AddToListRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *AddToListHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *AddToListHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *AddToListHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h *AddToListHandler) run() {
+	var data *http_model.AddToListRequest
+	data = h.req
+
+	// 1. 加入商单
+	createSProjectErr := service.SProject.CreateSProject(h.ctx, *data)
+	if createSProjectErr != nil {
+		h.resp.Status = 50000
+		h.resp.Message = "加入商单失败"
+		h.resp.Data = createSProjectErr
+		fmt.Println(createSProjectErr)
+	}
+
+	// 2. 创建合作关系
+	createCooperateErr := service.Cooperate.CreateCooperate(h.ctx, h.req.EnterpriseId, h.req.SupplierId, h.req.SubAccountId)
+	if createCooperateErr != nil {
+		fmt.Println(createCooperateErr)
+		h.resp.Status = 50000
+		h.resp.Message = "创建合作关系失败"
+		h.resp.Data = createCooperateErr
+	} else {
+		h.resp.Status = 20000
+		h.resp.Message = "加入商单成功"
+	}
+}
+
+func (h *AddToListHandler) checkParam() error {
+	return nil
+}

+ 48 - 0
handler/agree_enterprise_cooperate.go

@@ -0,0 +1,48 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+)
+
+func WrapAgreeCooperateHandler(ctx *gin.Context) {
+	handler := newAgreeCooperateHandler(ctx)
+	baseRun(handler)
+}
+
+func newAgreeCooperateHandler(ctx *gin.Context) *AgreeCooperateHandler {
+	return &AgreeCooperateHandler{
+		req:  http_model.NewAgreeCooperateRequest(),
+		resp: http_model.NewAgreeCooperateResponse(),
+		ctx:  ctx,
+	}
+}
+
+type AgreeCooperateHandler struct {
+	req  *http_model.AgreeCooperateRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *AgreeCooperateHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *AgreeCooperateHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *AgreeCooperateHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h *AgreeCooperateHandler) run() {
+	err := service.Cooperate.AgreeEnterpriseCooperate(h.ctx, h.req.CooperateId)
+	if err != nil {
+		h.resp.Data = err
+		h.resp.Message = "同意合作邀约失败"
+	} else {
+		h.resp.Message = "同意合作邀约成功"
+	}
+}
+func (h *AgreeCooperateHandler) checkParam() error {
+	return nil
+}

+ 49 - 0
handler/base.go

@@ -0,0 +1,49 @@
+package handler
+
+import (
+	"net/http"
+	"youngee_b_api/consts"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+)
+
+type BaseHandler interface {
+	getContext() *gin.Context
+	getResponse() interface{}
+	getRequest() interface{}
+	run()
+	checkParam() error
+}
+
+func baseRun(baseHandler BaseHandler) {
+	ctx := baseHandler.getContext()
+	method := ctx.Request.Method
+	req := baseHandler.getRequest()
+	var err error
+	if method == http.MethodPost || method == http.MethodPut {
+		err = ctx.ShouldBindJSON(req)
+	} else if method == http.MethodGet {
+		err = ctx.BindQuery(req)
+	}
+	if err != nil {
+		util.PackErrorResp(ctx, consts.ErrorParamCheck)
+		ctx.Abort()
+		logrus.Infof("[baseHandler] bind json error,err:%+v", err)
+		return
+	}
+	if err = baseHandler.checkParam(); err != nil {
+		util.PackErrorResp(ctx, consts.ErrorParamCheck)
+		ctx.Abort()
+		logrus.Infof("[baseHandler] checkParam error,err:%+v", err)
+		return
+	}
+	baseHandler.run()
+	if ctx.IsAborted() {
+		return
+	}
+	resp := baseHandler.getResponse()
+	ctx.JSON(http.StatusOK, resp)
+	logrus.Infof("[baseHandler] http success")
+}

+ 75 - 0
handler/code_login.go

@@ -0,0 +1,75 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+)
+
+/*
+// WrapSendCodeHandler
+// @BasePath /youngee/m/
+// Codelogin godoc
+// @Summary login 登录
+// @Schemes
+// @Description 输入手机号和验证码,并登录
+// @Accept json
+// @Produce json
+// @Param req body http_model.CodeLoginRequest true "登录输入内容请求参数结构体"
+// @Success 200 {object} http_model.CommonResponse{data=http_model.CodeLoginData} "登录返回相应结构体"
+// @Router /login [post]
+*/
+
+func WrapCodeLoginHandler(ctx *gin.Context) {
+	handler := newCodeLoginHandler(ctx)
+	baseRun(handler)
+}
+
+func newCodeLoginHandler(ctx *gin.Context) *CodeLoginHandler {
+	return &CodeLoginHandler{
+		req:  http_model.NewCodeLoginRequest(),
+		resp: http_model.NewCodeLoginResponse(),
+		ctx:  ctx,
+	}
+}
+
+type CodeLoginHandler struct {
+	req  *http_model.CodeLoginRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *CodeLoginHandler) getRequest() interface{} {
+	return h.req
+}
+
+func (h *CodeLoginHandler) getContext() *gin.Context {
+	return h.ctx
+}
+
+func (h *CodeLoginHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *CodeLoginHandler) run() {
+	msg, userData, err := service.LoginAuth.AuthCode(h.ctx, h.req.Phone, h.req.Code)
+	if err != nil {
+		logrus.Errorf("[CodeLoginHandler] call AuthCode err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, msg)
+		log.Info("login fail,req:%+v", h.req)
+		return
+	}
+	var data *http_model.CodeLoginData
+	data = userData
+	// h.resp.Message = "登陆成功"
+	h.resp.Data = data
+}
+
+func (h *CodeLoginHandler) checkParam() error {
+	return nil
+}

+ 72 - 0
handler/createSpecialLogistics.go

@@ -0,0 +1,72 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapCreateSpecialLogisticsHandler(ctx *gin.Context) {
+	handler := newCreateSpecialLogisticsHandler(ctx)
+	baseRun(handler)
+}
+
+type CreateSpecialLogistics struct {
+	ctx  *gin.Context
+	req  *http_model.CreateSpecialLogisticsRequest
+	resp *http_model.CommonResponse
+}
+
+func (c CreateSpecialLogistics) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c CreateSpecialLogistics) getResponse() interface{} {
+	return c.resp
+}
+
+func (c CreateSpecialLogistics) getRequest() interface{} {
+	return c.req
+}
+
+func (c CreateSpecialLogistics) run() {
+	data := http_model.CreateSpecialLogisticsRequest{}
+	data = *c.req
+	isUpdate := data.IsUpdate
+	if isUpdate == 0 {
+		res, err := service.Logistics.CreateSpecialLogistics(c.ctx, data)
+		if err != nil {
+			logrus.Errorf("[CreateSpecialLogistics] call Create err:%+v\n", err)
+			util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+			logrus.Info("CreateSpecialLogistics fail,req:%+v", c.req)
+			return
+		}
+		c.resp.Message = "成功添加物流信息"
+		c.resp.Data = res
+	} else {
+		res, err := service.Logistics.UpdateSpecialLogistics(c.ctx, data)
+		if err != nil {
+			logrus.Errorf("[CreateSpecialLogistics] call Create err:%+v\n", err)
+			util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+			logrus.Info("CreateSpecialLogistics fail,req:%+v", c.req)
+			return
+		}
+		c.resp.Message = "成功修改物流信息"
+		c.resp.Data = res
+	}
+}
+
+func (c CreateSpecialLogistics) checkParam() error {
+	return nil
+}
+
+func newCreateSpecialLogisticsHandler(ctx *gin.Context) *CreateSpecialLogistics {
+	return &CreateSpecialLogistics{
+		ctx:  ctx,
+		req:  http_model.NewCreateSpecialLogisticsRequest(),
+		resp: http_model.NewCreateSpecialLogisticsResponse(),
+	}
+}

+ 56 - 0
handler/create_supplier_invoice.go

@@ -0,0 +1,56 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+)
+
+func WrapCreateSupplierInvoiceHandler(ctx *gin.Context) {
+	handler := newCreateSupplierInvoiceHandler(ctx)
+	baseRun(handler)
+}
+
+func newCreateSupplierInvoiceHandler(ctx *gin.Context) *CreateSupplierInvoiceHandler {
+	return &CreateSupplierInvoiceHandler{
+		req:  http_model.NewCreateSupplierInvoiceRequest(),
+		resp: http_model.NewCreateSupplierInvoiceResponse(),
+		ctx:  ctx,
+	}
+}
+
+type CreateSupplierInvoiceHandler struct {
+	req  *http_model.CreateSupplierInvoiceRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *CreateSupplierInvoiceHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *CreateSupplierInvoiceHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *CreateSupplierInvoiceHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h *CreateSupplierInvoiceHandler) run() {
+	// 1. 合并收入回票
+	err := service.Supplier.CreateSupplierInvoice(h.ctx, h.req)
+	if err != nil {
+		h.resp.Data = err.Error()
+		h.resp.Message = "合并失败"
+	}
+
+	// 2. 修改收入状态
+	incomeErr := service.Supplier.UpdateSupplierIncomeStatus(h.ctx, h.req.IncomeIds, 2)
+	if incomeErr != nil {
+		h.resp.Data = incomeErr.Error()
+		h.resp.Message = "修改收入状态失败"
+	}
+	h.resp.Message = "合并修改成功"
+}
+
+func (h *CreateSupplierInvoiceHandler) checkParam() error {
+	return nil
+}

+ 49 - 0
handler/create_supplier_withdraw.go

@@ -0,0 +1,49 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+)
+
+func WrapCreateSupplierWithdrawHandler(ctx *gin.Context) {
+	handler := newCreateSupplierWithdrawHandler(ctx)
+	baseRun(handler)
+}
+
+func newCreateSupplierWithdrawHandler(ctx *gin.Context) *CreateSupplierWithdrawHandler {
+	return &CreateSupplierWithdrawHandler{
+		req:  http_model.NewCreateSupplierWithdrawRequest(),
+		resp: http_model.NewCreateSupplierWithdrawResponse(),
+		ctx:  ctx,
+	}
+}
+
+type CreateSupplierWithdrawHandler struct {
+	req  *http_model.CreateSupplierWithdrawRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *CreateSupplierWithdrawHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *CreateSupplierWithdrawHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *CreateSupplierWithdrawHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h *CreateSupplierWithdrawHandler) run() {
+	err := service.Supplier.CreateSupplierWithdraw(h.ctx, h.req)
+	if err != nil {
+		h.resp.Status = 40000
+		h.resp.Message = err.Error()
+		return
+	}
+	h.resp.Message = "成功添加"
+}
+
+func (h *CreateSupplierWithdrawHandler) checkParam() error {
+	return nil
+}

+ 59 - 0
handler/data_number_info.go

@@ -0,0 +1,59 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+)
+
+func WrapGetDataNumberInfoHandler(ctx *gin.Context) {
+	handler := newGetDataNumberInfoHandler(ctx)
+	baseRun(handler)
+}
+
+func newGetDataNumberInfoHandler(ctx *gin.Context) *GetDataNumberInfoHandler {
+	return &GetDataNumberInfoHandler{
+		req:  http_model.NewGetDataNumberInfoRequest(),
+		resp: http_model.NewGetDataNumberInfoResponse(),
+		ctx:  ctx,
+	}
+}
+
+type GetDataNumberInfoHandler struct {
+	req  *http_model.GetDataNumberInfoRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *GetDataNumberInfoHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *GetDataNumberInfoHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *GetDataNumberInfoHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *GetDataNumberInfoHandler) run() {
+	data := http_model.GetDataNumberInfoRequest{}
+	data = *h.req
+	res, err := service.Number.GetDataNumberInfo(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetDataNumberInfoHandler] call GetDataNumberInfo err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		log.Info("GetDataNumberInfo fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = ""
+	h.resp.Data = res
+}
+
+func (h *GetDataNumberInfoHandler) checkParam() error {
+	return nil
+}

Some files were not shown because too many files changed in this diff