|
@@ -11,6 +11,7 @@ import (
|
|
|
"net/rpc"
|
|
|
"os"
|
|
|
qfwutil "qfw/util"
|
|
|
+ "qfw/util/image"
|
|
|
qrpc "qfw/util/rpc"
|
|
|
wf "qfw/weixinconfig"
|
|
|
"sync"
|
|
@@ -33,7 +34,7 @@ var client *util.Client
|
|
|
type DistinguishWork struct {
|
|
|
}
|
|
|
|
|
|
-func initDgWork() {
|
|
|
+func InitDgWork() {
|
|
|
client, _ = util.StartClient(processevent, wf.SysConfig.Msgserver, []int{util.SERVICE_DISTINGUISH}, 20)
|
|
|
client.ResetMyName("识别验证码")
|
|
|
}
|
|
@@ -41,24 +42,28 @@ func processevent(p *util.Packet) {
|
|
|
event := int(p.Event)
|
|
|
switch event {
|
|
|
case util.SERVICE_DISTINGUISH:
|
|
|
- log.Println("------从消息总线接收到了一个消息-----")
|
|
|
+ log.Println("------接收到消息的数据-----")
|
|
|
//写数据
|
|
|
if ret := make(map[string]interface{}); json.Unmarshal(p.GetBusinessData(), &ret) == nil {
|
|
|
flag, _ := ret["flag"].(bool)
|
|
|
if flag {
|
|
|
+ img, _ := ret["img"]
|
|
|
+ if img == nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
imgTmp, err := json.Marshal(ret["img"])
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
- var img []byte
|
|
|
- err = json.Unmarshal(imgTmp, &img)
|
|
|
+ var imgbyte []byte
|
|
|
+ err = json.Unmarshal(imgTmp, &imgbyte)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
obj := map[string]interface{}{
|
|
|
"from": p.From,
|
|
|
"msgId": p.Msgid,
|
|
|
- "img": img,
|
|
|
+ "img": imgbyte,
|
|
|
}
|
|
|
if len(workers) == 0 {
|
|
|
waitWorks = append(waitWorks, obj)
|
|
@@ -75,7 +80,7 @@ func processevent(p *util.Packet) {
|
|
|
//开始工作,记录工作人的相关数
|
|
|
func (a *DistinguishWork) Start(openId string) {
|
|
|
if client == nil {
|
|
|
- initDgWork()
|
|
|
+ InitDgWork()
|
|
|
}
|
|
|
for _, v := range workers {
|
|
|
if v["openId"] == openId {
|
|
@@ -88,6 +93,10 @@ func (a *DistinguishWork) Start(openId string) {
|
|
|
|
|
|
//结束工作,删除工作人
|
|
|
func (a *DistinguishWork) End(openId string) {
|
|
|
+ end(openId)
|
|
|
+}
|
|
|
+
|
|
|
+func end(openId string) {
|
|
|
deleteWorker(openId)
|
|
|
for k, v := range workers {
|
|
|
if v["openId"] == openId {
|
|
@@ -149,59 +158,106 @@ func deleteWorker(openId string) {
|
|
|
|
|
|
//进行一个任务
|
|
|
func toWork(o map[string]interface{}) {
|
|
|
- openId, obj, err := worked(o)
|
|
|
- if err == nil {
|
|
|
+ openId, obj, status := worked(o)
|
|
|
+ if openId == "" || status == 0 { //成功 || 该任务无效
|
|
|
return
|
|
|
}
|
|
|
- //如果任务在执行过程中出现异常,把该任务放入等待队列中,修改这个人的状态为空闲
|
|
|
- obj["status"] = "-1"
|
|
|
- waitWorks = append(waitWorks, obj)
|
|
|
+ if obj == nil || status == -1 {
|
|
|
+ deleteWorker(openId)
|
|
|
+ updateWorker(openId, status_rest)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ obj["status"] = status
|
|
|
+ errorCount := qfwutil.IntAll(obj["errorCount"])
|
|
|
+ if status == -2 {
|
|
|
+ errorCount++
|
|
|
+ if errorCount >= qfwutil.IntAll(wf.SysConfig.DistinguishWork["errorCount"]) { //没有超过失败次数
|
|
|
+ deleteWorker(openId)
|
|
|
+ updateWorker(openId, status_rest)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ obj["errorCount"] = errorCount
|
|
|
+ }
|
|
|
+ if status == -4 { //发送模板消息失败
|
|
|
+ end(openId)
|
|
|
+ toWork(obj)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //把该任务放入等待队列中第一个,修改这个人的状态为空闲
|
|
|
+ var waitWorksCopy []map[string]interface{}
|
|
|
+ waitWorksCopy = append(waitWorksCopy, obj)
|
|
|
+ for _, v := range waitWorks {
|
|
|
+ waitWorksCopy = append(waitWorksCopy, v)
|
|
|
+ }
|
|
|
+ waitWorks = waitWorksCopy
|
|
|
deleteWorker(openId)
|
|
|
updateWorker(openId, status_rest)
|
|
|
}
|
|
|
|
|
|
-func worked(o map[string]interface{}) (string, map[string]interface{}, error) {
|
|
|
+func worked(o map[string]interface{}) (string, map[string]interface{}, int) {
|
|
|
openId, obj := getWorker(o)
|
|
|
if openId == "" { //没有闲人
|
|
|
- return 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)
|
|
|
+ return openId, obj, -1
|
|
|
+ }
|
|
|
+ var name string
|
|
|
+ var err error
|
|
|
+ if imgName := obj["imgName"]; imgName != nil {
|
|
|
+ name, _ = imgName.(string)
|
|
|
+ } else {
|
|
|
+ //生成验证码图片
|
|
|
+ name, err = createImg(msgId, img)
|
|
|
+ obj["imgName"] = name
|
|
|
}
|
|
|
- from := obj["from"].(string)
|
|
|
- msgId := obj["msgId"].(string)
|
|
|
- img := obj["img"].([]byte)
|
|
|
- //生成验证码图片
|
|
|
- name, err := createImg(msgId, img)
|
|
|
if name == "" || err != nil {
|
|
|
log.Println("生成验证码图片出错:", err)
|
|
|
- return openId, obj, err
|
|
|
+ return openId, obj, -2
|
|
|
}
|
|
|
workering[openId] = []string{msgId, from}
|
|
|
//发送验证码图片
|
|
|
- var e error
|
|
|
+ var itm qrpc.News
|
|
|
+ itm.ToUser = openId
|
|
|
+
|
|
|
+ var als qrpc.Article
|
|
|
+ als.Title = wf.SysConfig.DistinguishWork["title"].(string)
|
|
|
+ als.Description = wf.SysConfig.DistinguishWork["description"].(string)
|
|
|
+ als.Url = wf.SysConfig.Qmxcdn + "/upload/spider/" + name
|
|
|
+ als.PicUrl = wf.SysConfig.Qmxcdn + "/upload/spider/" + name
|
|
|
+
|
|
|
+ itm.Articles = append(itm.Articles, als)
|
|
|
+
|
|
|
+ var status = 0
|
|
|
qfwutil.Try(func() {
|
|
|
client, err := rpc.DialHTTP("tcp", wf.SysConfig.Rpcserver)
|
|
|
defer client.Close()
|
|
|
if err != nil {
|
|
|
log.Println(err.Error())
|
|
|
- e = err
|
|
|
+ status = -3
|
|
|
return
|
|
|
}
|
|
|
var repl qrpc.RpcResult
|
|
|
- err = client.Call("WeiXinRpc.SendManagerNotifyMsg", &qrpc.NotifyMsg{
|
|
|
+ err = client.Call("WeiXinRpc.SendNews", itm, &repl)
|
|
|
+ /*err = client.Call("WeiXinRpc.SendManagerNotifyMsg", &qrpc.NotifyMsg{
|
|
|
Openid: openId,
|
|
|
Title: wf.SysConfig.DistinguishWork["title"],
|
|
|
Detail: wf.SysConfig.DistinguishWork["detail"],
|
|
|
Result: wf.SysConfig.DistinguishWork["result"],
|
|
|
Url: wf.SysConfig.Qmxcdn + "/upload/spider/" + name,
|
|
|
- }, &repl)
|
|
|
+ }, &repl)*/
|
|
|
if err != nil {
|
|
|
log.Println(err.Error())
|
|
|
- e = err
|
|
|
- return
|
|
|
+ status = -4
|
|
|
} else {
|
|
|
updateWorker(openId, status_waitReply)
|
|
|
}
|
|
|
}, func(e interface{}) {})
|
|
|
- return openId, obj, e
|
|
|
+ return openId, obj, status
|
|
|
}
|
|
|
|
|
|
//修改这个人的状态为等待回复
|
|
@@ -239,8 +295,12 @@ func getWorker(obj map[string]interface{}) (openId string, object map[string]int
|
|
|
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)
|
|
|
+ openId, _ = workers[workers_index]["openId"].(string)
|
|
|
if len(waitWorks) > 0 {
|
|
|
+ //把该任务加入等待队列
|
|
|
+ if obj != nil {
|
|
|
+ waitWorks = append(waitWorks, obj)
|
|
|
+ }
|
|
|
object = waitWorks[0]
|
|
|
//删除第一个
|
|
|
waitWorks = waitWorks[1:]
|
|
@@ -265,14 +325,28 @@ func createImg(msgId string, img []byte) (string, error) {
|
|
|
log.Println("创建验证码图片出错:", err)
|
|
|
return "", err
|
|
|
}
|
|
|
+ defer file.Close()
|
|
|
_, err = file.Write(img)
|
|
|
if err != nil {
|
|
|
log.Println("写入验证码图片出错:", err)
|
|
|
return "", err
|
|
|
}
|
|
|
- defer file.Close()
|
|
|
+ newName, e := image.MakeResize(path+"/"+name, 640, 320, 100, 0)
|
|
|
+ if e == nil {
|
|
|
+ //删除老文件
|
|
|
+ file.Close()
|
|
|
+ if e = os.Remove(path + "/" + name); e != nil {
|
|
|
+ return newName, nil
|
|
|
+ }
|
|
|
+ os.Rename(path+"/"+newName, path+"/"+name)
|
|
|
+ }
|
|
|
return name, nil
|
|
|
}
|
|
|
+
|
|
|
+func Distinguishworkinit(w http.ResponseWriter, r *http.Request) {
|
|
|
+ var distinguishWork DistinguishWork
|
|
|
+ distinguishWork.Start("o8-2pwHj1s_tv3nnRxrH9cD2ngkk")
|
|
|
+}
|
|
|
func Monitor(w http.ResponseWriter, r *http.Request) {
|
|
|
var h_p, h_w, h_wa string
|
|
|
for _, v := range workers {
|
|
@@ -282,8 +356,10 @@ func Monitor(w http.ResponseWriter, r *http.Request) {
|
|
|
h_w += fmt.Sprint(k) + ":" + fmt.Sprint(v) + "<br>"
|
|
|
}
|
|
|
for _, v := range waitWorks {
|
|
|
+ img := v["img"]
|
|
|
delete(v, "img")
|
|
|
h_wa += fmt.Sprint(v) + "<br>"
|
|
|
+ v["img"] = img
|
|
|
}
|
|
|
if h_p == "" {
|
|
|
h_p = "无"
|