wangchuanjin пре 9 година
родитељ
комит
ff1dca03f1
3 измењених фајлова са 69 додато и 25 уклоњено
  1. 1 1
      weixin/src/main.go
  2. 67 23
      weixin/src/qfw/weixin/distinguishwork.go
  3. 1 1
      weixin/src/qfw/weixin/msgtxtchandler.go

+ 1 - 1
weixin/src/main.go

@@ -31,7 +31,7 @@ func init() {
 	//微信sdk配置
 	weixin.InitWeixinSdk()
 	//连接消息总线
-	weixin.InitDgWork()
+	go weixin.InitDgWork()
 }
 
 func main() {

+ 67 - 23
weixin/src/qfw/weixin/distinguishwork.go

@@ -9,6 +9,7 @@ import (
 	"image"
 	"image/color"
 	"io"
+	"io/ioutil"
 	"log"
 	"math/rand"
 	util "mfw/util"
@@ -56,9 +57,9 @@ func processevent(p *util.Packet) {
 	switch event {
 	case util.SERVICE_DISTINGUISH:
 		defer util.Catch()
-		log.Println("------接收到消息的数据-----")
 		//写数据
 		if ret := make(map[string]interface{}); json.Unmarshal(p.GetBusinessData(), &ret) == nil {
+			log.Println("验证码--接收到消息的数据msgId:", p.Msgid)
 			flag, _ := ret["flag"].(bool)
 			if flag {
 				img, _ := ret["img"]
@@ -85,6 +86,7 @@ func processevent(p *util.Packet) {
 					toWork(obj)
 				}
 			} else {
+				log.Println("验证码--超时处理msgId:", p.Msgid)
 				overtime(p.Msgid)
 			}
 		}
@@ -99,9 +101,11 @@ func (a *DistinguishWork) Start(openId string) {
 	}
 	for _, v := range workers {
 		if v["openId"] == openId {
+			log.Println("验证码--", openId, "已经在工作中,重复进入")
 			return
 		}
 	}
+	log.Println("验证码--", openId, "进入工作")
 	workers = append(workers, map[string]interface{}{"openId": openId, "status": status_rest})
 	toWork(nil)
 }
@@ -109,6 +113,7 @@ func (a *DistinguishWork) Start(openId string) {
 //结束工作,删除工作人
 func (a *DistinguishWork) End(openId string) {
 	defer util.Catch()
+	log.Println("验证码--", openId, "退出本次工作")
 	end(openId)
 }
 
@@ -159,15 +164,17 @@ func (a *DistinguishWork) Reply(openId, content string) {
 	defer util.Catch()
 	obj := workering[openId]
 	if obj == nil || len(obj) < 2 {
+		log.Println("验证码--本次回复msgId丢失")
 		return
 	}
+	log.Println("验证码--", openId, "回复内容:", content)
 	tmp := make(map[string]interface{})
 	tmp["content"] = content
 	tmp["msgId"] = obj[0]
 	client.WriteObj(obj[1], obj[0], util.EVENT_RECIVE_CALLBACK, util.SENDTO_TYPE_P2P, tmp)
 	deleteWorker(openId)
 	updateWorker(openId, status_rest)
-	time.AfterFunc(1*time.Second, func() {
+	time.AfterFunc(2*time.Second, func() {
 		toWork(nil)
 	})
 }
@@ -180,7 +187,7 @@ func deleteWorker(openId string) {
 //进行一个任务
 func toWork(o map[string]interface{}) {
 	openId, obj, status := worked(o)
-	if openId == "" || status == 0 { //成功 || 该任务无效
+	if status == 0 { //成功 || 该任务无效
 		return
 	}
 	if obj == nil || status == -1 {
@@ -199,11 +206,6 @@ func toWork(o map[string]interface{}) {
 		}
 		obj["errorCount"] = errorCount
 	}
-	if status == -4 { //发送模板消息失败
-		end(openId)
-		toWork(obj)
-		return
-	}
 	//把该任务放入等待队列中第一个,修改这个人的状态为空闲
 	var waitWorksCopy []map[string]interface{}
 	waitWorksCopy = append(waitWorksCopy, obj)
@@ -211,20 +213,26 @@ func toWork(o map[string]interface{}) {
 		waitWorksCopy = append(waitWorksCopy, v)
 	}
 	waitWorks = waitWorksCopy
+	//发送模板消息失败
+	if status == -4 {
+		end(openId)
+		toWork(obj)
+		return
+	}
 	deleteWorker(openId)
 	updateWorker(openId, status_rest)
 }
 
 func worked(o map[string]interface{}) (string, map[string]interface{}, int) {
 	openId, obj := getWorker(o)
-	if openId == "" { //没有闲人
+	if openId == "" || obj == nil { //没有闲人
 		return openId, obj, 0
 	}
 	from, ok := obj["from"].(string)
 	msgId, ok := obj["msgId"].(string)
 	img, ok := obj["img"].([]byte)
 	if !ok {
-		log.Println("获取到的数据不完整:", obj)
+		log.Println("验证码--获取到的数据不完整:", obj)
 		return openId, obj, -1
 	}
 	var name string
@@ -257,7 +265,7 @@ func worked(o map[string]interface{}) (string, map[string]interface{}, int) {
 		client, err := rpc.DialHTTP("tcp", wf.SysConfig.Rpcserver)
 		defer client.Close()
 		if err != nil {
-			log.Println(err.Error())
+			log.Println("验证码--", err.Error())
 			status = -3
 			return
 		}
@@ -271,7 +279,7 @@ func worked(o map[string]interface{}) (string, map[string]interface{}, int) {
 			Url:    wf.SysConfig.Qmxcdn + "/upload/spider/" + name,
 		}, &repl)*/
 		if err != nil {
-			log.Println(err.Error())
+			log.Println("验证码--", err.Error())
 			status = -4
 		} else {
 			updateWorker(openId, status_waitReply)
@@ -309,13 +317,17 @@ func getWorker(obj map[string]interface{}) (openId string, object map[string]int
 	}
 	tmp_length := len(tmp)
 	if tmp_length == 0 { //都在忙,没有闲人
-		waitWorks = append(waitWorks, obj)
+		if obj != nil {
+			waitWorks = append(waitWorks, obj)
+			log.Println("验证码--都在忙,没有闲人")
+		}
 		return
 	}
 	tmp_index := rand.New(rand.NewSource(time.Now().UnixNano())).Intn(tmp_length)
 	workers_index := tmp[tmp_index]
 	workers[workers_index]["status"] = status_working
 	openId, _ = workers[workers_index]["openId"].(string)
+	log.Println("验证码--获取到可以工作的人", openId)
 	if len(waitWorks) > 0 {
 		//把该任务加入等待队列
 		if obj != nil {
@@ -336,10 +348,11 @@ func createImg(msgId string, img []byte) (string, error) {
 	path := wf.SysConfig.Imgpath + "/upload/spider/"
 	fs, err := os.Open(path)
 	if err != nil && os.MkdirAll(path, 0700) != nil {
-		log.Println("创建文件夹出错:", err)
+		log.Println("验证码--创建文件夹出错:", err)
 		return "", err
 	}
 	defer fs.Close()
+	go delOldImg(path)
 	err = processImg(path, name, bytes.NewBuffer(img), img)
 	if err != nil {
 		return "", err
@@ -347,22 +360,53 @@ func createImg(msgId string, img []byte) (string, error) {
 	return name, nil
 }
 
+//删除过期的图片
+func delOldImg(path string) {
+	dir, err := ioutil.ReadDir(path)
+	if err != nil {
+		log.Println("验证码--读取文件夹出错")
+		return
+	}
+	now := time.Now()
+	todayStart := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
+	log.Println(todayStart)
+	log.Println(len(dir))
+	d := 0
+	s := 0
+	for _, file := range dir {
+		if file.IsDir() || file.Name() == bgImgName {
+			log.Println("-------")
+			continue
+		}
+		if file.ModTime().Before(todayStart) {
+			d++
+			log.Println(file.Name())
+			os.Remove(path + file.Name())
+		} else {
+			s++
+			log.Println(file.ModTime())
+		}
+	}
+	log.Println(d)
+	log.Println(s)
+}
+
 func processImg(path, name string, file io.Reader, img []byte) error {
 	b_image, err := imaging.Open(path + bgImgName)
 	if err != nil {
 		b_newImg := imaging.New(newsImagWidth, newsImagHeight, color.NRGBA{white, white, white, white})
 		err = imaging.Save(b_newImg, path+bgImgName)
 		if err != nil {
-			log.Println("创建背景图片出错!", err)
+			log.Println("验证码--创建背景图片出错!", err)
 		}
 		b_image, err = imaging.Open(path + bgImgName)
 		if err != nil {
-			log.Println("重新打开背景图片出错!", err)
+			log.Println("验证码--重新打开背景图片出错!", err)
 		}
 	}
 	config, _, err := image.DecodeConfig(file)
 	if err != nil {
-		log.Println("获取图片config出错!", err)
+		log.Println("验证码--获取图片config出错!", err)
 		return err
 	}
 	w := config.Width
@@ -372,35 +416,35 @@ func processImg(path, name string, file io.Reader, img []byte) error {
 	}
 	f, err := os.Create(path + name)
 	if err != nil {
-		log.Println("创建图片出错!", err)
+		log.Println("验证码--创建图片出错!", err)
 		return err
 	}
 	_, err = f.Write(img)
 	if err != nil {
-		log.Println("写入图片出错!", err)
+		log.Println("验证码--写入图片出错!", err)
 		return err
 	}
 	f.Close()
 	_file, err := imaging.Open(path + name)
 	if err != nil {
-		log.Println("打开图片出错!", err)
+		log.Println("验证码--打开图片出错!", err)
 		return err
 	}
 	if h > newsImagHeight {
 		err = imaging.Save(imaging.Resize(_file, 0, newsImagHeight, imaging.Lanczos), path+name)
 		if err != nil {
-			log.Println("缩放图片出错!", err)
+			log.Println("验证码--缩放图片出错!", err)
 			return err
 		}
 		_file, err = imaging.Open(path + name)
 		if err != nil {
-			log.Println("缩放之后重新打开图片出错!", err)
+			log.Println("验证码--缩放之后重新打开图片出错!", err)
 			return err
 		}
 	}
 	err = imaging.Save(imaging.PasteCenter(b_image, _file), path+name)
 	if err != nil {
-		log.Println("合并之后创建图片出错:", err)
+		log.Println("验证码--合并之后创建图片出错:", err)
 		return err
 	}
 	return nil

+ 1 - 1
weixin/src/qfw/weixin/msgtxtchandler.go

@@ -53,7 +53,7 @@ func MsgTxtHandler(w ResponseWriter, r *Request) {
 		})
 	} else if distinguishWork.IsWorking(openid) { //人工识别验证码工作中。。。
 		if r.Content == "结束识别验证码" {
-			w.ReplyText(wf.SysConfig.DistinguishWork["out"].(string))
+			w.PostText(wf.SysConfig.DistinguishWork["out"].(string))
 			distinguishWork.End(openid)
 		} else if distinguishWork.IsWaitReply(openid) {
 			w.PostText(wf.SysConfig.DistinguishWork["reply"].(string))