Jelajahi Sumber

Merge branch 'dev/v1.2.6_zxl' of moapp/message into feature/v1.2.6

zhangxinlei1996 1 tahun lalu
induk
melakukan
eb8b9d8c27
10 mengubah file dengan 662 tambahan dan 28 penghapusan
  1. 33 0
      config/config.go
  2. 1 0
      db/db.go
  3. 3 1
      etc/config.yaml
  4. 140 0
      etc/task.json
  5. 7 1
      go.mod
  6. 29 14
      go.sum
  7. 156 11
      handler/activity/task.go
  8. 13 0
      model/task.go
  9. 276 0
      services/activity/task/task.go
  10. 4 1
      services/init.go

+ 33 - 0
config/config.go

@@ -50,6 +50,7 @@ type msgConf struct {
 
 var (
 	PushConfig *pushConfig
+	TaskConf   *taskConf
 )
 
 type LotteryReceiveReq struct {
@@ -98,6 +99,36 @@ type OrderMonitorConfig struct {
 	}
 }
 
+type taskConf struct {
+	TaskStartTime int64         `json:"taskStartTime"` //限时活动开始时间
+	NewTask       []*TaskStruct `json:"newTask"`       //新手任务
+	OldTask       []*TaskStruct `json:"oldTask"`       //老用户限时任务
+	TaskDayTime   int64         `json:"taskDayTime"`   //活动时间
+}
+
+type TaskStruct struct {
+	Name        string `json:"name"`
+	Desc        string `json:"desc"`
+	PcHref      string `json:"pcHref"`
+	AppHref     string `json:"appHref"`
+	WxHref      string `json:"wxHref"`
+	Point       int    `json:"point"`
+	Icon        string `json:"icon"`
+	Type        string `json:"type"`
+	Distinguish int    `json:"distinguish"` // 0不用区分身份 1区分身份
+}
+
+type msgConf struct {
+	Title      string
+	Content    string
+	MsgType    int64
+	Link       string
+	Appid      string
+	AppPushUrl string
+	WxPushUrl  string
+	IosPushUrl string
+}
+
 //var Config *config
 
 func init() {
@@ -106,4 +137,6 @@ func init() {
 	//系统配置文件
 	//common.ReadConfig(&Config)
 	g.Cfg().GetAdapter().(*gcfg.AdapterFile).SetFileName("./etc/config.yaml")
+	//任务配置文件
+	common.ReadConfig("./etc/task.json", &TaskConf)
 }

+ 1 - 0
db/db.go

@@ -99,4 +99,5 @@ func init() {
 			Tidb.Init()
 		}
 	}
+
 }

+ 3 - 1
etc/config.yaml

@@ -26,7 +26,7 @@ nsq:
 #数据库配置
 databases:
   # redis配置
-  redis: main=192.168.3.206:1712,session=192.168.3.206:1712,newother=192.168.3.206:1712
+  redis: main=192.168.3.149:1712,session=192.168.3.149:1713,newother=192.168.3.149:1712
   # nsq操作日志库
   mogLog:
     address: 192.168.3.206:27090
@@ -59,6 +59,7 @@ databases:
 
 rpc:
   payrpc: 192.168.3.206:8601
+  pointrpc: 192.168.20.92:8205
 
 #其他配置
 newUserAward: #新用户注册奖励
@@ -143,3 +144,4 @@ orderMonitor:
       priceLimit: true  # 是否有实付金额限制
       priceStart: 30000 # 实付金额最低  单位 分
       priceEnd: 100000  # 实付金额最高 单位 分
+taskStartTime: 1698020000 #新手任务开始时间

+ 140 - 0
etc/task.json

@@ -0,0 +1,140 @@
+{
+	"taskStartTime":1698020000,
+	"newTask":[
+		{
+			"name":"绑定手机号",
+			"desc":"注册剑鱼标讯,完成手机号绑定",
+			"pcHref":"/home/work-bench/app/big/set-account-info",
+			"appHref":"/jyapp/account/phone/bind?mode=mergeBind",
+			"wxHref":"/front/account/phone/bind",
+			"point":50,
+			"icon":"",
+			"type":"bindPhone",
+			"distinguish":0
+		},
+		{
+			"name":"关注“剑鱼标讯”公众号",
+			"desc":"首次扫码,(或在微信中搜索公众号:剑鱼标讯)关注公众号",
+			"pcHref":"",
+			"appHref":"",
+			"wxHref":"",
+			"point":50,
+			"icon":"",
+			"type":"followWx",
+			"distinguish":0
+		},
+		{
+			"name":"首次绑定邮箱",
+			"desc":"填写正确的邮箱信息并完成邮箱验证",
+			"pcHref":"/home/work-bench/app/big/set-account-info",
+			"appHref":"",
+			"wxHref":"",
+			"point":50,
+			"icon":"",
+			"type":"bindMail",
+			"distinguish":0
+		},
+		{
+			"name":"填写公司信息",
+			"desc":"填写公司名称、职位、单位类型可获得",
+			"pcHref":"/home/work-bench/app/big/set-identity-info",
+			"appHref":"/jy_mobile/identity/company",
+			"wxHref":"/jy_mobile/identity/company",
+			"point":50,
+			"icon":"",
+			"type":"improveEntInfo",
+			"distinguish":0
+		},
+		{
+			"name":"完善业务类型",
+			"desc":"完善公司业务类型可获得",
+			"pcHref":"/home/work-bench/app/big/set-identity-info",
+			"appHref":"/jy_mobile/identity/business",
+			"wxHref":"/jy_mobile/identity/business",
+			"point":50,
+			"icon":"",
+			"type":"improveBusiness",
+			"distinguish":0
+		},
+		{
+			"name":"完成订阅",
+			"desc":"首次完成订阅关键词设置可获得",
+			"pcHref":"",
+			"appHref":"",
+			"wxHref":"",
+			"point":50,
+			"icon":"",
+			"type":"subscribeKeyWords",
+			"distinguish":1
+		},
+		{
+			"name":"关注企业",
+			"desc":"首次完成企业关注可获得",
+			"pcHref":"/jylab/entSearch/index.html",
+			"appHref":"/jy_mobile/#/search/middle/company",
+			"wxHref":"/jy_mobile/#/search/middle/company",
+			"point":50,
+			"icon":"",
+			"type":"followEnt",
+			"distinguish":1
+		},
+		{
+			"name":"关注项目",
+			"desc":"首次完成项目关注可获得",
+			"pcHref":"/jylab/supsearch/index.html",
+			"appHref":"/jy_mobile/#/search/middle/bidding",
+			"wxHref":"/jy_mobile/#/search/middle/bidding",
+			"point":50,
+			"icon":"",
+			"type":"followProject",
+			"distinguish":1
+		},
+		{
+			"name":"下载剑鱼标讯APP",
+			"desc":"首次扫码,(或在应用商店搜索APP:剑鱼标讯)下载APP",
+			"pcHref":"",
+			"appHref":"",
+			"wxHref":"",
+			"point":50,
+			"icon":"",
+			"type":"downloadApp",
+			"distinguish":0
+		}
+	],
+	"oldTask":[
+		{
+			"name":"首次绑定邮箱",
+			"desc":"填写正确的邮箱信息并完成邮箱验证",
+			"pcHref":"",
+			"appHref":"/jyapp/account/mail/bind",
+			"wxHref":"/front/account/mail/bind",
+			"point":50,
+			"icon":"",
+			"type":"bindMail",
+			"distinguish":0
+		},
+		{
+			"name":"填写公司信息",
+			"desc":"填写公司名称、职位、单位类型可获得",
+			"pcHref":"/home/work-bench/app/big/set-identity-info",
+			"appHref":"/jy_mobile/identity/company",
+			"wxHref":"/jy_mobile/identity/company",
+			"point":50,
+			"icon":"",
+			"type":"improveEntInfo",
+			"distinguish":0
+		},
+		{
+			"name":"完善业务类型",
+			"desc":"完善公司业务类型可获得",
+			"pcHref":"/home/work-bench/app/big/set-identity-info",
+			"appHref":"/jy_mobile/identity/business",
+			"wxHref":"/jy_mobile/identity/business",
+			"point":50,
+			"icon":"",
+			"type":"improveBusiness",
+			"distinguish":0
+		}
+	],
+	"taskDayTime":7
+}

+ 7 - 1
go.mod

@@ -6,10 +6,16 @@ require (
 	app.yhyue.com/moapp/MessageCenter v0.0.0-20230918064638-5cd2498053ae
 	app.yhyue.com/moapp/jyPoints v1.1.2-0.20231020023521-1a4b1bbf9736
 	app.yhyue.com/moapp/jy_docs v1.1.1-0.20231024064228-a0ce3483eaf1
-	app.yhyue.com/moapp/jybase v0.0.0-20230901064756-2fc66b18db40
+	app.yhyue.com/moapp/jybase v0.0.0-20231025021840-2f91c944ecdd
 	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20230911091604-2faa31032743
+	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/gogf/gf/v2 v2.0.6
+	github.com/gomodule/redigo v2.0.0+incompatible // indirect
 	github.com/nsqio/go-nsq v1.1.0
 	github.com/zeromicro/go-zero v1.5.6
+	go.opentelemetry.io/otel/exporters/jaeger v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/zipkin v1.15.1 // indirect
 	golang.org/x/net v0.17.0 // indirect
 )

+ 29 - 14
go.sum

@@ -11,8 +11,9 @@ app.yhyue.com/moapp/jybase v0.0.0-20220418104200-46c3fff161c7/go.mod h1:qNRA0sHu
 app.yhyue.com/moapp/jybase v0.0.0-20220420032112-668025915ee4/go.mod h1:qNRA0sHuYqcLoYoP8irpaWnW9YsXixe6obBIkwaXpD0=
 app.yhyue.com/moapp/jybase v0.0.0-20220421060131-a1001013ba46/go.mod h1:qNRA0sHuYqcLoYoP8irpaWnW9YsXixe6obBIkwaXpD0=
 app.yhyue.com/moapp/jybase v0.0.0-20230419121327-bedf77840ba6/go.mod h1:zB47XTeJvpcbtBRYgkQuxOICWNexiZfbUO+7aUf6mNs=
-app.yhyue.com/moapp/jybase v0.0.0-20230901064756-2fc66b18db40 h1:/FcBvpf/KW8g6GBfTkypVW1pGbNs+iNhDrUGUi+KNjc=
 app.yhyue.com/moapp/jybase v0.0.0-20230901064756-2fc66b18db40/go.mod h1:Hv9U/7oHRucqH315Tr1+d03NCvS9mOKPfk8pwwlOIwQ=
+app.yhyue.com/moapp/jybase v0.0.0-20231025021840-2f91c944ecdd h1:tKfHGqrDHvG9hMGEFvsLyFJM1I4l6S2cpKlSBGh6FVM=
+app.yhyue.com/moapp/jybase v0.0.0-20231025021840-2f91c944ecdd/go.mod h1:Hv9U/7oHRucqH315Tr1+d03NCvS9mOKPfk8pwwlOIwQ=
 app.yhyue.com/moapp/jyfs v0.0.0-20231024061508-480c270480d4/go.mod h1:61hzZ3dZHXL28BNl8BOgZsvM2S5UVY5YFzOkEUPrSu4=
 bp.jydev.jianyu360.cn/BP/jynsq v0.0.0-20220222052708-ebc43af90698/go.mod h1:ojo/AUH9Yr1wzarEjOaNMkj1Cet/9r8IgLyba64Z52E=
 bp.jydev.jianyu360.cn/BaseService/gateway v0.0.0-20220419090715-88ddb32961be/go.mod h1:Yj4oabIGItuMoF0BXYLz2XAnF581kxgXBrvlUtIJrkI=
@@ -859,8 +860,9 @@ github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl
 github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
 github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8=
 github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE=
-github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4=
 github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
+github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
+github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
@@ -963,8 +965,9 @@ github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHqu
 github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
 github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
+github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
+github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
 github.com/fullstorydev/grpcurl v1.8.7/go.mod h1:pVtM4qe3CMoLaIzYS8uvTuDj2jVYmXqMUkZeijnXp/E=
 github.com/fullstorydev/grpcurl v1.8.8/go.mod h1:TRM21TqPbPzHkA9DqSh94oI2g1pD2AFRhLhmGrSht+Q=
 github.com/garyburd/redigo v1.6.2 h1:yE/pwKCrbLpLpQICzYTeZ7JsTA/C53wFTJHaEtRqniM=
@@ -997,8 +1000,9 @@ github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg
 github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
 github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
+github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
@@ -1118,8 +1122,9 @@ github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW
 github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
 github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/gomodule/redigo v1.8.4/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
-github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=
 github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
+github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
+github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
@@ -1631,37 +1636,46 @@ go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnf
 go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
 go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
 go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM=
-go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM=
 go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU=
+go.opentelemetry.io/otel v1.15.1 h1:3Iwq3lfRByPaws0f6bU3naAqOR1n5IeDWd9390kWHa8=
+go.opentelemetry.io/otel v1.15.1/go.mod h1:mHHGEHVDLal6YrKMmk9LqC4a3sF5g+fHfrttQIB1NTc=
 go.opentelemetry.io/otel/exporters/jaeger v1.3.0/go.mod h1:KoYHi1BtkUPncGSRtCe/eh1ijsnePhSkxwzz07vU0Fc=
 go.opentelemetry.io/otel/exporters/jaeger v1.8.0/go.mod h1:GbWg+ng88rDtx+id26C34QLqw2erqJeAjsCx9AFeHfE=
-go.opentelemetry.io/otel/exporters/jaeger v1.14.0 h1:CjbUNd4iN2hHmWekmOqZ+zSCU+dzZppG8XsV+A3oc8Q=
 go.opentelemetry.io/otel/exporters/jaeger v1.14.0/go.mod h1:4Ay9kk5vELRrbg5z4cpP9EtmQRFap2Wb0woPG4lujZA=
-go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0 h1:/fXHZHGvro6MVqV34fJzDhi7sHGpX3Ej/Qjmfn003ho=
+go.opentelemetry.io/otel/exporters/jaeger v1.15.1 h1:x3SLvwli0OyAJapNcOIzf1xXBRBA+HD3elrMQmFfmXo=
+go.opentelemetry.io/otel/exporters/jaeger v1.15.1/go.mod h1:0Ck9b5oLL/bFZvfAEEqtrb1U0jZXjm5fWXMCOCG3vvM=
 go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0/go.mod h1:UFG7EBMRdXyFstOwH028U0sVf+AvukSGhF0g8+dmNG8=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.14.0 h1:TKf2uAs2ueguzLaxOCBXNpHxfO/aC7PAdDsSH0IbeRQ=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1 h1:XYDQtNzdb2T4uM1pku2m76eSMDJgqhJ+6KzkqgQBALc=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1/go.mod h1:uOTV75+LOzV+ODmL8ahRLWkFA3eQcSC2aAsbxIu4duk=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.14.0/go.mod h1:HrbCVv40OOLTABmOn1ZWty6CHXkU8DK/Urc43tHug70=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0 h1:ap+y8RXX3Mu9apKVtOkM6WSFESLM8K3wNQyOU8sWHcc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1 h1:tyoeaUh8REKay72DVYsSEBYV18+fGONe+YYPaOxgLoE=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1/go.mod h1:HUSnrjQQ19KX9ECjpQxufsF+3ioD3zISPMlauTPZu2g=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0/go.mod h1:5w41DY6S9gZrbjuq6Y+753e96WfPha5IcsOSZTtullM=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.14.0 h1:3jAYbRHQAqzLjd9I4tzxwJ8Pk/N6AqBcF6m1ZHrxG94=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1 h1:pIfoG5IAZFzp9EUlJzdSkpUwpaUAAnD+Ru1nBLTACIQ=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1/go.mod h1:poNKBqF5+nR/6ke2oGTDjHfksrsHDOHXAl2g4+9ONsY=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.14.0/go.mod h1:+N7zNjIJv4K+DeX67XXET0P+eIciESgaFDBqh+ZJFS4=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1 h1:pnJfHmVcCEBcH5lkM+npJF8cTAjV/d+9cXVNCs5P/ao=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1/go.mod h1:cC3Eu2V56zXY09YlijmqDhOUnL2jVL6KKJg4PGh++dU=
 go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.14.0 h1:sEL90JjOO/4yhquXl5zTAkLLsZ5+MycAgX99SDsxGc8=
 go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.14.0/go.mod h1:oCslUcizYdpKYyS9e8srZEqM6BB8fq41VJBjLAE6z1w=
 go.opentelemetry.io/otel/exporters/zipkin v1.3.0/go.mod h1:LxGGfHIYbvsFnrJtBcazb0yG24xHdDGrT/H6RB9r3+8=
 go.opentelemetry.io/otel/exporters/zipkin v1.8.0/go.mod h1:0uYAyCuGT67MFV9Z/Mmx93wGuugHw0FbxMc74fs3LNo=
-go.opentelemetry.io/otel/exporters/zipkin v1.14.0 h1:reEVE1upBF9tcujgvSqLJS0SrI7JQPaTKP4s4rymnSs=
 go.opentelemetry.io/otel/exporters/zipkin v1.14.0/go.mod h1:RcjvOAcvhzcufQP8aHmzRw1gE9g/VEZufDdo2w+s4sk=
+go.opentelemetry.io/otel/exporters/zipkin v1.15.1 h1:B6s/o48bx00ayJu7F+jIMJfhPTyxW+S8vthjTZMNBj0=
+go.opentelemetry.io/otel/exporters/zipkin v1.15.1/go.mod h1:EjjV7/YfYXG+khxCOfG6PPeRGoOmtcSusyW66qPqpRQ=
 go.opentelemetry.io/otel/sdk v1.0.0/go.mod h1:PCrDHlSy5x1kjezSdL37PhbFUMjrsLRshJ2zCzeXwbM=
 go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
 go.opentelemetry.io/otel/sdk v1.8.0/go.mod h1:uPSfc+yfDH2StDM/Rm35WE8gXSNdvCg023J6HeGNO0c=
-go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY=
 go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM=
+go.opentelemetry.io/otel/sdk v1.15.1 h1:5FKR+skgpzvhPQHIEfcwMYjCBr14LWzs3uSqKiQzETI=
+go.opentelemetry.io/otel/sdk v1.15.1/go.mod h1:8rVtxQfrbmbHKfqzpQkT5EzZMcbMBwTzNAggbEAM0KA=
 go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=
 go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
 go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
 go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4=
-go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M=
 go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8=
+go.opentelemetry.io/otel/trace v1.15.1 h1:uXLo6iHJEzDfrNC0L0mNjItIp06SyaBQxu5t3xMlngY=
+go.opentelemetry.io/otel/trace v1.15.1/go.mod h1:IWdQG/5N1x7f6YUlmdLeJvH9yxtuJAfc4VW5Agv9r/8=
 go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
 go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
 go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw=
@@ -2018,6 +2032,7 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220909162455-aba9fc2a8ff2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

+ 156 - 11
handler/activity/task.go

@@ -1,13 +1,23 @@
 package activity
 
 import (
+	"database/sql"
 	"fmt"
 	"log"
+	"net/rpc"
+	"strings"
 
+	"app.yhyue.com/moapp/message/config"
+
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
 	"app.yhyue.com/moapp/jybase/go-logger/logger"
+	jrpc "app.yhyue.com/moapp/jybase/rpc"
 	"app.yhyue.com/moapp/message/db"
 	"app.yhyue.com/moapp/message/model"
-	"app.yhyue.com/moapp/message/rpc"
+	mrpc "app.yhyue.com/moapp/message/rpc"
+	"github.com/gogf/gf/v2/os/gcfg"
+	"github.com/gogf/gf/v2/os/gctx"
 	"github.com/gogf/gf/v2/util/gconv"
 )
 
@@ -17,26 +27,161 @@ import (
 
 // Task 完成任务
 func Task(msg *model.Message) {
+	//活动时间
+	taskStartTime := gcfg.Instance().MustGet(gctx.New(), "taskStartTime", nil).Int64()
 	log.Println(msg.E_body)
 	num := gconv.Int64(msg.E_body["num"])
 	code := gconv.Int64(msg.E_body["code"]) //1005
-	types := gconv.Int64(msg.E_body["type"])
+	types := gconv.String(msg.E_body["type"])
 	baseUserId := gconv.Int64(msg.E_body["baseUserId"])
 	positionId := gconv.Int64(msg.E_body["positionId"])
+
+	now := date.NowFormat(date.Date_Full_Layout)
+	query := map[string]interface{}{
+		"type":    types,
+		"user_id": baseUserId,
+	}
+	//判断用户是否有任务
+	data, ok := db.Mgo.FindOne("user", map[string]interface{}{"base_user_id": baseUserId})
+	if data == nil || len(*data) == 0 || !ok {
+		logger.Info(fmt.Sprintf("未找到用户%s,无法增加积分%v。", msg.E_userId, code))
+		return
+	}
+	l_registedate := gconv.Int64((*data)["l_registedate"])
+	isNew := l_registedate > taskStartTime //是否注册时间处于新手任务开始时间
+	taskData := config.TaskConf.OldTask
+	if isNew {
+		taskData = config.TaskConf.NewTask
+	}
+	//判断用户是否有该任务
+	bl := false
+	for _, v := range taskData {
+		if bl {
+			continue
+		}
+		if v.Type == types {
+			bl = true
+		}
+	}
+	if !bl {
+		logger.Info(fmt.Sprintf("用户%s没有该任务%v,不再增加积分。", msg.E_userId, code))
+		return
+	}
+	//获取用户下所有的任务
+	taskMsgMap := map[string]string{}
+	success_status := 0
+	end_time := ""
+	taskAllMsg := db.Mysql.SelectBySql(`select a.task_id,a.name,a.status,a.type,b.success_status,b.end_time from integral_task_detail a
+						left join integral_task b on a.task_id =b.id 
+						where a.user_id =?`, baseUserId)
+	if taskAllMsg != nil && len(*taskAllMsg) > 0 {
+		//用户有任务
+		for _, v := range *taskAllMsg {
+			success_status = gconv.Int(v["success_status"])
+			end_time = gconv.String(v["end_time"])
+			if success_status == 1 {
+				logger.Info(fmt.Sprintf("用户%s已经完成挑战,默认任务完成%v,不再增加积分。", msg.E_userId, code))
+				return
+			}
+			task_id := gconv.Int64(v["task_id"])
+			typ := gconv.String(v["type"])
+			status := gconv.String(v["status"])
+			taskMsgMap[typ] = fmt.Sprintf("%v_%s", task_id, status)
+
+		}
+	}
 	//判断是否赠送过积分,送过则不送
 	if db.Mysql.CountBySql(`select count(1) from jypoints.integral_flow where userId =? and pointType =? and sort =1;`, msg.E_userId, code) > 0 {
 		logger.Info(fmt.Sprintf("用户%s已经增加过积分%v,不再增加积分。", msg.E_userId, code))
 		return
 	}
 	//增加积分
-	rpc.IntegralHarvest(msg.E_userId, num, code, msg.E_time)
-	//修改任务状态
-	db.Tidb.Update("integral_task_detail", map[string]interface{}{
-		"user_id":     baseUserId,
-		"position_id": positionId,
-		"type":        types,
-	}, map[string]interface{}{
-		"status": 1,
-	})
+	mrpc.IntegralHarvest(msg.E_userId, num, code, msg.E_time)
+	//判断任务状态
+	if taskMsgMap[types] == "" {
+		//如果等于空证明没有初始化
+		db.Tidb.ExecTx("创建任务", func(tx *sql.Tx) bool {
+			taskId := db.Tidb.InsertByTx(tx, "integral_task", map[string]interface{}{
+				"user_id":     baseUserId,
+				"position_id": positionId,
+				"type":        common.If(isNew, 2, 1),
+				"create_time": now,
+			})
+			//任务明细
+			for _, v := range taskData {
+				if v.Type == types {
+					db.Tidb.InsertByTx(tx, "integral_task_detail", map[string]interface{}{
+						"task_id":     taskId,
+						"user_id":     baseUserId,
+						"position_id": positionId,
+						"name":        v.Name,
+						"description": v.Desc,
+						"icon":        v.Icon,
+						"point":       v.Point,
+						"pc_href":     v.PcHref,
+						"wx_href":     v.WxHref,
+						"app_href":    v.AppHref,
+						"status":      1, //完成任务
+						"finish_time": now,
+						"create_time": now,
+						"type":        v.Type,
+					})
+				}
+			}
+			return true
+		})
+	} else {
+		//修改任务状态
+		taskId := ""
+		taskTypeArr := strings.Split(taskMsgMap[types], "_")
+		if len(taskTypeArr) > 1 {
+			taskId = taskTypeArr[0]
+			status := taskTypeArr[1]
+			if status == "0" {
+				db.Tidb.Update("integral_task_detail", query, map[string]interface{}{
+					"status": 1,
+				})
+				taskMsgMap[types] = fmt.Sprintf("%s_%v", taskId, 1)
+			}
+		}
+		//判断是否已经完成所有任务
+		if len(taskMsgMap) == len(taskData) && end_time != "" { //已初始化完所有任务
+			finishStatus := true
+			//
+			for _, v := range taskMsgMap {
+				vArr := strings.Split(v, "_")
+				status := vArr[1]
+				if status == "0" {
+					//有未完成任务 不增加积分
+					finishStatus = false
+				}
+			}
+			endtime, _ := time.Parse(date.Date_Full_Layout, end_time)
+			if finishStatus && success_status == 0 && time.Now().Before(endtime) {
+				//判断是否完成所有任务且开启确认挑战
+				mrpc.SubVipHarvest(msg.E_userId, 7, "")
+				db.Tidb.Update("integral_task", map[string]interface{}{"id": gconv.Int64(taskId)}, map[string]interface{}{
+					"success_status": 1,
+				})
+			}
+		}
+	}
+}
 
+//获取任务
+func GetTaskRpc(isNew bool) (p *jrpc.TaskDataResp) {
+	defer common.Catch()
+	var repl jrpc.TaskDataResp
+	client, err := rpc.DialHTTP("tcp", gcfg.Instance().MustGet(gctx.New(), "rpc.pointrpc").String())
+	if err != nil {
+		logger.Info("tcp err", err)
+		return &repl
+	}
+	defer client.Close()
+	err = client.Call("JyPointRpc.GetTask", jrpc.TaskData{IsNew: isNew}, &repl)
+	if err != nil {
+		logger.Info("JyPointRpc err:", err)
+		return &repl
+	}
+	return &repl
 }

+ 13 - 0
model/task.go

@@ -0,0 +1,13 @@
+package model
+
+const (
+	BindPhone         = "bindPhone"         //绑定手机号
+	FollowWx          = "followWx"          //关注微信
+	BindMail          = "bindMail"          //绑定邮箱
+	ImproveEntInfo    = "improveEntInfo"    //完善公司信息
+	ImproveBusiness   = "improveBusiness"   //完善业务类型
+	SubscribeKeyWords = "subscribeKeyWords" //首次订阅
+	FollowEnt         = "followEnt"         //关注企业
+	FollowProject     = "followProject"     //关注项目
+	DownloadApp       = "downloadApp"       //下载剑鱼app
+)

+ 276 - 0
services/activity/task/task.go

@@ -0,0 +1,276 @@
+package task
+
+import (
+	"database/sql"
+	"encoding/json"
+	"fmt"
+	"log"
+	"time"
+
+	"app.yhyue.com/moapp/message/config"
+	"app.yhyue.com/moapp/message/db"
+	"app.yhyue.com/moapp/message/model"
+
+	. "app.yhyue.com/moapp/jybase/api"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+
+	qu "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+
+	// "app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
+	"github.com/gogf/gf/v2/util/gconv"
+)
+
+type Task struct {
+	*xweb.Action
+	task             xweb.Mapper `xweb:"/task"`             //获取任务
+	confirmChallenge xweb.Mapper `xweb:"/confirmChallenge"` //确认挑战
+}
+
+type TaskInfo struct {
+	Name       string `json:"name"`
+	Desc       string `json:"desc"`
+	PcHref     string `json:"pcHref"`
+	AppHref    string `json:"appHref"`
+	WxHref     string `json:"wxHref"`
+	Point      int    `json:"point"`
+	Icon       string `json:"icon"`
+	Type       string `json:"type"`
+	Status     int    `json:"status"`
+	FinishTime string `json:"finishTime"`
+}
+
+//InitTask 初始化任务
+func (this *Task) InitTask(isNew bool) []*config.TaskStruct {
+	if isNew {
+		return config.TaskConf.NewTask
+	}
+	return config.TaskConf.OldTask
+}
+
+//Task  获取任务
+func (this *Task) Task() {
+	sessVal := this.Session().GetMultiple()
+	mgoUserId := gconv.String(sessVal["mgoUserId"])
+	userId := gconv.String(sessVal["userId"])
+	positionId := gconv.Int64(sessVal["positionId"])
+	baseUserId := gconv.Int64(sessVal["base_user_id"])
+	now := date.NowFormat(date.Date_Full_Layout)
+	//
+	rData, errMsg := func() (interface{}, error) {
+		info := map[string]interface{}{}
+		data := []*TaskInfo{}
+		dataM := map[string]*TaskInfo{}
+		//完成状态 0未开始/过期 1正在进行 2已完成
+		status := 0
+		//查询用户任务情况
+		taskDetail := db.Tidb.SelectBySql(`select * from integral_task_detail where user_id =?`, baseUserId)
+		if taskDetail != nil && len(*taskDetail) > 0 {
+			for _, v := range *taskDetail {
+				name := gconv.String(v["name"])
+				desc := gconv.String(v["description"])
+				pcHref := gconv.String(v["pc_href"])
+				appHref := gconv.String(v["app_href"])
+				wxHref := gconv.String(v["wx_href"])
+				point := gconv.Int(v["point"])
+				icon := gconv.String(v["icon"])
+				types := gconv.String(v["type"])
+				detailStatus := gconv.Int(v["status"])
+				finishTime := gconv.String(v["finish_time"])
+
+				tf := &TaskInfo{
+					Name:       name,
+					Desc:       desc,
+					PcHref:     pcHref,
+					AppHref:    appHref,
+					WxHref:     wxHref,
+					Point:      point,
+					Icon:       icon,
+					Type:       types,
+					Status:     detailStatus,
+					FinishTime: finishTime,
+				}
+				dataM[types] = tf
+			}
+		}
+		userMsg, ok := db.Mgo.FindById("user", mgoUserId, `{"l_registedate":1,"s_m_phone":1,"s_phone":1,"s_myemail":1,"s_nickname":1,"s_headimageurl":1,"s_password":1,"s_company":1,"s_unionid":1,"o_jy":1,"o_vipjy":1,"o_member_jy":1,"i_app_login_task":1}`)
+		if userMsg == nil || len(*userMsg) == 0 || !ok {
+			return nil, fmt.Errorf("未查询到用户")
+		}
+		//注册时间 判断是新手任务还是老用户限时任务
+		l_registedate := gconv.Int64((*userMsg)["l_registedate"])
+		isNew := l_registedate > config.TaskConf.TaskStartTime //是否注册时间处于新手任务开始时间
+		ts := this.InitTask(isNew)
+		//初始化任务
+		for _, v := range ts {
+			if dataM[v.Type] == nil {
+				dataM[v.Type] = &TaskInfo{
+					Name:    v.Name,
+					Desc:    v.Desc,
+					PcHref:  v.PcHref,
+					AppHref: v.AppHref,
+					WxHref:  v.WxHref,
+					Point:   v.Point,
+					Icon:    v.Icon,
+					Type:    v.Type,
+					Status:  0,
+				}
+			}
+		}
+		mail := gconv.String((*userMsg)["s_myemail"])
+		if !isNew {
+			//邮箱是否绑定
+			if mail != "" {
+				dataM[model.BindMail].Status = 1
+				dataM[model.BindMail].FinishTime = now
+				//TODO 老用户如果绑定邮箱赠送积分、并生成任务
+
+			}
+		}
+		//判断是否已经创建任务
+		integralTaskData := db.Tidb.SelectBySql(`select * from integral_task where user_id =? limit 1`, baseUserId)
+		if integralTaskData == nil || len(*integralTaskData) <= 0 {
+			db.Tidb.ExecTx("创建任务", func(tx *sql.Tx) bool {
+				taskId := db.Tidb.InsertByTx(tx, "integral_task", map[string]interface{}{
+					"user_id":     baseUserId,
+					"position_id": positionId,
+					"type":        qu.If(isNew, 2, 1),
+					"create_time": now,
+				})
+				fields := []string{"task_id", "user_id", "position_id", "name", "description", "icon", "point", "pc_href", "wx_href", "app_href", "status", "finish_time", "create_time", "type"}
+				args := []interface{}{}
+				//任务明细
+				for _, v := range dataM {
+					args = append(args, taskId, baseUserId, positionId, v.Name, v.Desc, v.Icon, v.Point, v.PcHref, v.WxHref, v.AppHref, v.Status, qu.If(v.FinishTime == "", nil, v.FinishTime), now, v.Type)
+				}
+				db.Tidb.InsertBatchByTx(tx, "integral_task_detail", fields, args)
+				return true
+			})
+		} else {
+			//部分初始化
+			taskId := gconv.Int64((*integralTaskData)[0]["id"])
+			fields := []string{"task_id", "user_id", "position_id", "name", "description", "icon", "point", "pc_href", "wx_href", "app_href", "status", "finish_time", "create_time", "type"}
+			args := []interface{}{}
+			for _, v := range dataM {
+				if v.Status == 0 {
+					if db.Tidb.CountBySql(`select count(1) from integral_task_detail where user_id =? and type =?`, baseUserId, v.Type) > 0 {
+						continue
+					}
+					//任务明细
+					args = append(args, taskId, baseUserId, positionId, v.Name, v.Desc, v.Icon, v.Point, v.PcHref, v.WxHref, v.AppHref, v.Status, qu.If(v.FinishTime == "", nil, v.FinishTime), now, v.Type)
+				}
+			}
+			if len(args) > 0 {
+				db.Tidb.InsertBatch("integral_task_detail", fields, args)
+			}
+			if (*integralTaskData)[0]["end_time"] != nil {
+				et := gconv.String((*integralTaskData)[0]["end_time"])
+				endtime, _ := time.Parse(date.Date_Full_Layout, et)
+				if time.Now().Before(endtime) {
+					//当前时间未超过结束时间
+					status = 1
+				}
+				info["endTime"] = et
+			}
+
+			success_status := gconv.Int((*integralTaskData)[0]["success_status"])
+			if success_status == 1 {
+				//已完成挑战
+				status = 2
+			}
+		}
+		for _, v := range dataM {
+			data = append(data, &TaskInfo{
+				Name:       v.Name,
+				Desc:       v.Desc,
+				PcHref:     v.PcHref,
+				AppHref:    v.AppHref,
+				WxHref:     v.WxHref,
+				Point:      v.Point,
+				Icon:       v.Icon,
+				Type:       v.Type,
+				Status:     v.Status,
+				FinishTime: v.FinishTime,
+			})
+		}
+		if isNew {
+			info["newbieTask"] = data
+			info["taskType"] = 2
+		} else {
+			info["limitedTask"] = data
+			info["taskType"] = 1
+		}
+		//查询完成状态
+		info["status"] = status
+		if status == 1 {
+			info["taskType"] = 0
+		}
+		return info, nil
+	}()
+	if errMsg != nil {
+		log.Printf("%s Task %s异常:%s\n", userId, errMsg.Error())
+	}
+	this.ServeJson(NewResult(rData, errMsg))
+}
+
+//EntSubscribe 判断企业是否订阅
+func EntSubscribe(entUserId, entId int64) int {
+	if entId > 0 {
+		//企业
+		data, ok := db.Mgo.FindOne("entniche_rule", map[string]interface{}{
+			"i_entid":  entId,
+			"i_userid": entUserId,
+		})
+		if data == nil || len(*data) <= 0 || !ok {
+			return 0
+		}
+		o_entniche := gconv.Map((*data)["o_entniche"])
+		a_items := gconv.Maps(o_entniche["a_items"])
+		for _, v := range a_items {
+			a_key := gconv.Maps(v["a_key"])
+			if len(a_key) > 0 {
+				return 1
+			}
+		}
+	}
+	return 0
+}
+
+func (this *Task) ConfirmChallenge() {
+	sessVal := this.Session().GetMultiple()
+	positionId := gconv.Int64(sessVal["positionId"])
+	baseUserId := gconv.Int64(sessVal["base_user_id"])
+	// userId := gconv.String(sessVal["mgoUserId"])
+
+	rData, errMsg := func() (interface{}, error) {
+		infoMap := map[string]interface{}{}
+		if string(this.Body()) == "" {
+			return map[string]interface{}{"status": -1}, fmt.Errorf(Error_msg_1001)
+		}
+		body := xweb.FilterXSS(string(this.Body()))
+		//接收参数
+		json.Unmarshal([]byte(body), &infoMap)
+		if len(infoMap) == 0 {
+			return map[string]interface{}{"status": -1}, fmt.Errorf(Error_msg_1002)
+		}
+		if gconv.Int(infoMap["challenge"]) == 1 {
+			dayLater := time.Now().Add(time.Duration(config.TaskConf.TaskDayTime) * time.Hour * 24)
+			endTime := time.Date(dayLater.Year(), dayLater.Month(), dayLater.Day(), 23, 59, 59, 0, dayLater.Location())
+			if db.Tidb.Update("integral_task", map[string]interface{}{
+				"position_id": positionId,
+				"user_id":     baseUserId,
+			}, map[string]interface{}{
+				"end_time": endTime,
+			}) {
+				//用户点击“确认挑战”给用户发消息
+				// go SendNewUserMsg(userId)
+				return map[string]interface{}{"status": 1}, nil
+			}
+		}
+		return map[string]interface{}{"status": 1}, nil
+	}()
+	if errMsg != nil {
+		log.Printf("%s UserAccount  ConfirmChallenge 异常:%s\n", baseUserId, errMsg.Error())
+	}
+	this.ServeJson(NewResult(rData, errMsg))
+}

+ 4 - 1
services/init.go

@@ -1,12 +1,14 @@
 package services
 
 import (
+	"time"
+
 	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
 	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
 	"app.yhyue.com/moapp/message/services/activity/award"
 	"app.yhyue.com/moapp/message/services/activity/bidderPlan"
+	"app.yhyue.com/moapp/message/services/activity/task"
 	_ "app.yhyue.com/moapp/message/services/filter"
-	"time"
 )
 
 func init() {
@@ -25,4 +27,5 @@ func init() {
 
 	xweb.AddAction(&award.AwardRouter{})
 	xweb.AddAction(&bidderPlan.Activity{})
+	xweb.AddAction(&task.Task{})
 }