renjiaojiao hace 3 meses
padre
commit
57d39af73f
Se han modificado 9 ficheros con 250 adiciones y 42 borrados
  1. 17 2
      config.yaml
  2. 31 9
      config/db.go
  3. 8 3
      controller/kbController.go
  4. 10 4
      go.mod
  5. 34 14
      go.sum
  6. 3 0
      main.go
  7. 94 0
      public/workChatSendMsg.go
  8. 13 10
      service/kbService.go
  9. 40 0
      timeTask/kbTask.go

+ 17 - 2
config.yaml

@@ -14,5 +14,20 @@ wechatWorkUrl: https://qyapi.weixin.qq.com/cgi-bin/webhook/send
 wechatWorkKey: 39d428d4-f35c-4651-a064-147c27e7bed0
 wechatRemind:
   - 15038701380
-workflowsUrl: https://dify.jydev.jianyu360.com/v1/workflows/run
-workflowsUser: abc-123
+workflowsUrl: https://dify.jydev.jianyu360.com/v1/workflows/run #Ai接口
+workflowsUser: abc-123
+workPrivateMsg:
+  agentid: 1000011  #固定应用id
+  wx_admin: RenJiaoJiao  #默认发送人
+  wx_corpid: wwb14539dddef4bf2c  #固定企业id
+  wx_secret: Yg4Or0DeRu8g36CoI2jR7EbyBbw8bTUFp-QtHi9JUCU  #固定密钥
+redisServer: workChat=172.20.45.129:1712
+project:
+  projectId: 784
+  todoColumnId: 3283
+  finishColumnId: 3286
+  swimlaneId: 1338
+userId:
+  rjj: RenJiaoJiao
+  jly: JiaLuYao
+timeTaskCron: 0 */5 * * * *

+ 31 - 9
config/db.go

@@ -2,6 +2,7 @@ package config
 
 import (
 	"app.yhyue.com/moapp/jybase/mysql"
+	"app.yhyue.com/moapp/jybase/redis"
 	"database/sql"
 	"fmt"
 	"gopkg.in/yaml.v3"
@@ -15,15 +16,20 @@ var Db *sql.DB
 var KbDb *mysql.Mysql
 
 type Config struct {
-	Port          string         `yaml:"port"`
-	Database      DatabaseConfig `yaml:"database"`
-	FilePath      string         `yaml:"filePath"`
-	WechatWorkUrl string         `yaml:"wechatWorkUrl"`
-	KbMySql       DatabaseConfig `yaml:"kbMySql"`
-	WechatWorkKey string         `yaml:"wechatWorkKey"`
-	WechatRemind  []string       `yaml:"wechatRemind"`
-	WorkflowsUrl  string         `yaml:"workflowsUrl"`
-	WorkflowsUser string         `yaml:"workflowsUser"`
+	Port           string            `yaml:"port"`
+	Database       DatabaseConfig    `yaml:"database"`
+	FilePath       string            `yaml:"filePath"`
+	WechatWorkUrl  string            `yaml:"wechatWorkUrl"`
+	KbMySql        DatabaseConfig    `yaml:"kbMySql"`
+	WechatWorkKey  string            `yaml:"wechatWorkKey"`
+	WechatRemind   []string          `yaml:"wechatRemind"`
+	WorkflowsUrl   string            `yaml:"workflowsUrl"`
+	WorkflowsUser  string            `yaml:"workflowsUser"`
+	WorkPrivateMsg WorkPrivateMsg    `yaml:"workPrivateMsg"`
+	RedisServer    string            `yaml:"redisServer"`
+	Project        Project           `yaml:"project"`
+	UserIdMap      map[string]string `yaml:"userId"`
+	TimeTaskCron   string            `yaml:"timeTaskCron"`
 }
 
 type DatabaseConfig struct {
@@ -34,6 +40,20 @@ type DatabaseConfig struct {
 	DBName   string `yaml:"dbname"`
 }
 
+type WorkPrivateMsg struct {
+	AgentID  int    `yaml:"agentid"`   // 固定应用id
+	WxAdmin  string `yaml:"wx_admin"`  // 默认发送人
+	WxCorpid string `yaml:"wx_corpid"` // 固定企业id
+	WxSecret string `yaml:"wx_secret"` // 固定密钥
+}
+
+type Project struct {
+	ProjectId      int `yaml:"projectId"`      // 项目ID
+	TodoColumnId   int `yaml:"todoColumnId"`   // 待办列ID
+	FinishColumnId int `yaml:"finishColumnId"` // 完成列ID
+	SwimlaneId     int `yaml:"swimlaneId"`     // 泳道ID
+}
+
 func LoadConfig() {
 	data, err := ioutil.ReadFile("./config.yaml")
 	if err != nil {
@@ -69,4 +89,6 @@ func InitDB() {
 		MaxIdleConns: 5,
 	}
 	KbDb.Init()
+
+	redis.InitRedis(SysConfig.RedisServer)
 }

+ 8 - 3
controller/kbController.go

@@ -3,6 +3,7 @@ package controller
 import (
 	cm "app.yhyue.com/moapp/jybase/common"
 	. "biBackService/config"
+	"biBackService/public"
 	"biBackService/service"
 	"encoding/json"
 	"fmt"
@@ -112,12 +113,12 @@ func WorkTaskSave(r *gin.Context) {
 		Title:       cm.ObjToString(param["title"]),
 		Description: cm.ObjToString(param["description"]),
 		Color_id:    "green",
-		Project_id:  784,
-		Column_id:   3283,
+		Project_id:  SysConfig.Project.ProjectId,
+		Column_id:   SysConfig.Project.TodoColumnId,
 		Position:    1,
 		Score:       0,
 		Creator_id:  kbUserId,
-		Swimlane_id: 1338,
+		Swimlane_id: SysConfig.Project.SwimlaneId,
 	}
 	err = task.WordTaskSave()
 	if err != nil {
@@ -170,3 +171,7 @@ func GetTitle(r *gin.Context) {
 	})
 	return
 }
+
+func WorkWeChatPrivateMsg(r *gin.Context) {
+	public.SendMsg("RenJiaoJiao", "您新建得工单已解决")
+}

+ 10 - 4
go.mod

@@ -1,6 +1,6 @@
 module biBackService
 
-go 1.22
+go 1.22.0
 
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20250403014436-53740a2395aa
@@ -8,6 +8,7 @@ require (
 	github.com/go-sql-driver/mysql v1.9.1
 	github.com/google/uuid v1.6.0
 	github.com/mozillazg/go-pinyin v0.20.0
+	github.com/robfig/cron v1.2.0
 	gopkg.in/yaml.v3 v3.0.1
 )
 
@@ -19,6 +20,7 @@ require (
 	github.com/cloudwego/iasm v0.2.0 // indirect
 	github.com/fsnotify/fsnotify v1.7.0 // indirect
 	github.com/gabriel-vasile/mimetype v1.4.3 // indirect
+	github.com/garyburd/redigo v1.6.2 // indirect
 	github.com/gin-contrib/sse v0.1.0 // indirect
 	github.com/go-playground/locales v0.14.1 // indirect
 	github.com/go-playground/universal-translator v0.18.1 // indirect
@@ -27,17 +29,20 @@ require (
 	github.com/goccy/go-json v0.10.2 // indirect
 	github.com/gogf/gf/v2 v2.7.0 // indirect
 	github.com/golang/snappy v0.0.1 // indirect
+	github.com/gomodule/redigo v1.8.9 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.1 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/klauspost/compress v1.13.6 // indirect
 	github.com/klauspost/cpuid/v2 v2.2.7 // indirect
+	github.com/kr/pretty v0.3.1 // indirect
 	github.com/leodido/go-urn v1.4.0 // indirect
 	github.com/mattn/go-isatty v0.0.20 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/pelletier/go-toml/v2 v2.2.2 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
+	github.com/rogpeppe/go-internal v1.13.1 // indirect
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/ugorji/go/codec v1.2.12 // indirect
 	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
@@ -45,15 +50,16 @@ require (
 	github.com/xdg-go/stringprep v1.0.2 // indirect
 	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
 	go.mongodb.org/mongo-driver v1.9.1 // indirect
-	go.opentelemetry.io/otel v1.14.0 // indirect
-	go.opentelemetry.io/otel/trace v1.14.0 // indirect
+	go.opentelemetry.io/otel v1.35.0 // indirect
+	go.opentelemetry.io/otel/trace v1.35.0 // indirect
 	golang.org/x/arch v0.8.0 // indirect
 	golang.org/x/crypto v0.23.0 // indirect
 	golang.org/x/net v0.25.0 // indirect
 	golang.org/x/sync v0.11.0 // indirect
-	golang.org/x/sys v0.20.0 // indirect
+	golang.org/x/sys v0.21.0 // indirect
 	golang.org/x/text v0.22.0 // indirect
 	google.golang.org/protobuf v1.34.1 // indirect
+	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
 	gorm.io/driver/mysql v1.0.5 // indirect
 	gorm.io/gorm v1.21.3 // indirect
 )

+ 34 - 14
go.sum

@@ -14,6 +14,7 @@ github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/
 github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
 github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
 github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
+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=
@@ -23,12 +24,14 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
 github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
 github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
 github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
+github.com/garyburd/redigo v1.6.2 h1:yE/pwKCrbLpLpQICzYTeZ7JsTA/C53wFTJHaEtRqniM=
+github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
 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.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
 github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
-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.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
@@ -50,9 +53,11 @@ github.com/gogf/gf/v2 v2.7.0 h1:CjxhbMiE7oqf6K8ZtGuKt3dQEwK4vL6LhiI+dI7tJGU=
 github.com/gogf/gf/v2 v2.7.0/go.mod h1:Qu8nimKt9aupJQcdUL85tWF4Mfxocz97zUt8UC4abVI=
 github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+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/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
-github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -72,11 +77,14 @@ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02
 github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
 github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
 github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
-github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 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.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 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.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
 github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
 github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
@@ -99,10 +107,16 @@ github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N
 github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
 github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
 github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 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 v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
+github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
+github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
+github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
+github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
 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/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
@@ -114,8 +128,9 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
-github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
 github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
@@ -132,12 +147,16 @@ github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
 go.mongodb.org/mongo-driver v1.9.1 h1:m078y9v7sBItkt1aaoe2YlvWEXcD263e1a4E1fBrJ1c=
 go.mongodb.org/mongo-driver v1.9.1/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
-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/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
+go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
+go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
+go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
+go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
+go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
 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/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.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
+go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
 golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
 golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
 golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
@@ -157,8 +176,8 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
-golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
+golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -170,8 +189,9 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
 google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
 google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/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/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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=

+ 3 - 0
main.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	"biBackService/controller"
+	"biBackService/timeTask"
 	"html/template"
 	"log"
 
@@ -34,7 +35,9 @@ func main() {
 	router.POST("/biBackService/kb/uploadFile", controller.UploadFile)
 	router.POST("/biBackService/kb/taskSave", controller.WorkTaskSave)
 	router.POST("/biBackService/kb/getTitle", controller.GetTitle)
+	router.POST("/biBackService/kb/workWeChatPrivateMsg", controller.WorkWeChatPrivateMsg)
 
+	timeTask.Task()
 	log.Println("服务器启动在", SysConfig.Port)
 	router.Run(SysConfig.Port)
 }

+ 94 - 0
public/workChatSendMsg.go

@@ -0,0 +1,94 @@
+package public
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/redis"
+	"biBackService/config"
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"log"
+	"net/http"
+)
+
+const (
+	TOKEN = "qywx_token"
+)
+
+type tokeObj struct {
+	Errcode      int    `json:"errcode"`
+	Errmsg       string `json:"errmsg"`
+	Access_token string `json:"access_token"`
+	Expires_in   int    `json:"expires_in"`
+}
+
+/*func SendInfo(key, msg string) {
+	if t, err := redis.Exists("workChat", key); !t && err == nil {
+		redis.Put("workChat", key, 1, 86400)
+		SendMsg("rr", "", msg)
+	}
+}*/
+
+func SendMsg(userid string, msg ...string) (bool, error) {
+	con := ""
+	if len(msg) == 1 {
+		con = msg[0]
+	}
+	m := map[string]interface{}{
+		"touser":  userid,
+		"msgtype": "text",
+		"agentid": config.SysConfig.WorkPrivateMsg.AgentID,
+		"text": map[string]string{
+			"content": con,
+		},
+	}
+	b, _ := json.Marshal(m)
+	reqUrl := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s", getToken())
+	//log.Println("发送url:", reqUrl)
+	res, err := http.Post(reqUrl, "application/json", bytes.NewReader(b))
+	if err != nil {
+		log.Print(err)
+	} else {
+		defer res.Body.Close()
+		bs, _ := ioutil.ReadAll(res.Body)
+		//log.Info(string(bs))
+		var respData map[string]interface{}
+		json.Unmarshal(bs, &respData)
+		log.Println("respData", respData)
+		if respData != nil && fmt.Sprintf("%v", respData["errcode"]) == "0" {
+			return true, nil
+		}
+	}
+	return false, err
+}
+
+func getToken() string {
+	token := common.InterfaceToStr(redis.Get("workChat", TOKEN))
+	if token == "" {
+		tokenUrl := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s", config.SysConfig.WorkPrivateMsg.WxCorpid, config.SysConfig.WorkPrivateMsg.WxSecret)
+		//log.Println("tokenUrl", tokenUrl)
+		res, err := http.Get(tokenUrl)
+		if err != nil {
+			log.Print(err)
+		} else {
+			defer res.Body.Close()
+			bs, err1 := ioutil.ReadAll(res.Body)
+			if err1 != nil {
+				log.Print(err1)
+			} else {
+				var tokes tokeObj
+				err2 := json.Unmarshal(bs, &tokes)
+				if err2 != nil {
+					log.Print(err2)
+				} else {
+					token = tokes.Access_token
+					if tokes.Expires_in > 1800 {
+						redis.Put("workChat", TOKEN, token, 1800)
+					}
+				}
+			}
+		}
+	}
+	return token
+}

+ 13 - 10
service/kbService.go

@@ -69,16 +69,19 @@ func CheckCreateUserAccount(name string) (accountId int, err error) {
 
 func (wt *WordTask) WordTaskSave() (err error) {
 	in := KbDb.Insert("tasks", map[string]interface{}{
-		"title":         wt.Title,
-		"description":   wt.Description,
-		"color_id":      wt.Color_id,
-		"project_id":    wt.Project_id,
-		"column_Id":     wt.Column_id,
-		"position":      wt.Position,
-		"score":         wt.Score,
-		"creator_id":    wt.Creator_id,
-		"swimlane_id":   wt.Swimlane_id,
-		"date_creation": time.Now().Unix(),
+		"title":             wt.Title,
+		"description":       wt.Description,
+		"color_id":          wt.Color_id,
+		"project_id":        wt.Project_id,
+		"column_Id":         wt.Column_id,
+		"position":          wt.Position,
+		"score":             wt.Score,
+		"creator_id":        wt.Creator_id,
+		"swimlane_id":       wt.Swimlane_id,
+		"date_creation":     time.Now().Unix(),
+		"date_modification": time.Now().Unix(),
+		"date_moved":        time.Now().Unix(),
+		"priority":          2,
 	})
 	if in < 0 {
 		return errors.New("创建任务失败")

+ 40 - 0
timeTask/kbTask.go

@@ -0,0 +1,40 @@
+package timeTask
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	. "biBackService/config"
+	"biBackService/public"
+	"fmt"
+	"github.com/robfig/cron"
+	"log"
+	"time"
+)
+
+func Task() {
+	cr := cron.New()
+	cr.AddFunc(SysConfig.TimeTaskCron, kbTaskWechatPrivateMsg)
+	cr.Start()
+	//select {}
+}
+
+func kbTaskWechatPrivateMsg() {
+	log.Println("start cron ......")
+	//查询已完成工单
+	fiveMinutesAgo := time.Now().Local().Add(-5 * time.Minute).Unix()
+	data := KbDb.SelectBySql("SELECT t.id,t.title,u.name,u.username FROM `tasks` t LEFT JOIN users u ON t.creator_id = u.id WHERE date_moved > ? AND date_moved <= NOW() AND t.column_id = ? AND t.project_id = ?", fiveMinutesAgo, SysConfig.Project.FinishColumnId, SysConfig.Project.ProjectId)
+	if data != nil && len(*data) > 0 {
+		for _, v := range *data {
+			log.Println("task id ", v["id"])
+			createUser := common.InterfaceToStr(v["username"])
+			title := common.InterfaceToStr(v["title"])
+			msg := fmt.Sprintf("您反馈的“%s”的问题已解决", title)
+			userId := SysConfig.UserIdMap[createUser]
+			//发送企业微信
+			ok, err := public.SendMsg(userId, msg)
+			if !ok && err != nil {
+				log.Printf("工单id:%v发送企业微信消息出错:%s", common.IntAll(v["id"]), err)
+			}
+		}
+	}
+	log.Println("定时任务完成.....")
+}