|
@@ -2,9 +2,11 @@ package service
|
|
|
|
|
|
import (
|
|
|
"fmt"
|
|
|
+ "log"
|
|
|
qutil "qfw/util"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
+ "sync"
|
|
|
"time"
|
|
|
"util"
|
|
|
|
|
@@ -12,6 +14,12 @@ import (
|
|
|
"gopkg.in/mgo.v2/bson"
|
|
|
)
|
|
|
|
|
|
+type VIPLOCK struct {
|
|
|
+ Lock *sync.Mutex
|
|
|
+}
|
|
|
+
|
|
|
+var VIP_user_lock = map[string]*VIPLOCK{}
|
|
|
+
|
|
|
//完成支付数据交互接口
|
|
|
type AfterPay struct {
|
|
|
*xweb.Action
|
|
@@ -49,7 +57,7 @@ func (a *AfterPay) Modification() error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-//
|
|
|
+//快速导入普通订阅关键词
|
|
|
func (a *AfterPay) FastImport() error {
|
|
|
defer qutil.Catch()
|
|
|
userId, _ := a.GetSession("userId").(string)
|
|
@@ -60,15 +68,23 @@ func (a *AfterPay) FastImport() error {
|
|
|
// kws_index, _ := a.GetInteger("k_index")
|
|
|
classify_name := a.GetString("c_name")
|
|
|
if userId != "" {
|
|
|
+ var vip_lock = VIP_user_lock[userId]
|
|
|
+ if vip_lock == nil {
|
|
|
+ vip_lock = &VIPLOCK{}
|
|
|
+ vip_lock.Lock = &sync.Mutex{}
|
|
|
+ VIP_user_lock[userId] = vip_lock
|
|
|
+ }
|
|
|
+ vip_lock.Lock.Lock()
|
|
|
+ defer vip_lock.Lock.Unlock()
|
|
|
data, ok := util.MQFW.FindById("user", userId, `{"o_jy":1,"o_vipjy":1,"i_vip_fastimport":1}`)
|
|
|
if ok && data != nil && len(*data) > 0 {
|
|
|
o_jy, _ := (*data)["o_jy"].(map[string]interface{})
|
|
|
if o_jy["a_key"] != nil && len(o_jy["a_key"].([]interface{})) > 0 { //普通用户存在设置的关键词
|
|
|
_keys = qutil.ObjArrToMapArr(o_jy["a_key"].([]interface{})) //普通用户设置的关键词
|
|
|
o_vipjy, _ := (*data)["o_vipjy"].(map[string]interface{})
|
|
|
- if o_vipjy["a_items"] != nil {
|
|
|
+ if o_vipjy["a_items"] != nil && len(o_vipjy["a_items"].([]interface{})) > 0 {
|
|
|
a_items := o_vipjy["a_items"].([]interface{})
|
|
|
- for _, v := range a_items {
|
|
|
+ for k, v := range a_items {
|
|
|
tmp := qutil.ObjToMap(v.(map[string]interface{}))
|
|
|
a_key := (*tmp)["a_key"].([]interface{})
|
|
|
kwsCount = kwsCount + len(a_key)
|
|
@@ -76,6 +92,9 @@ func (a *AfterPay) FastImport() error {
|
|
|
// classify_index = k
|
|
|
// kws_index = len(a_key)
|
|
|
// }
|
|
|
+ if classify_name == (*tmp)["s_item"].(string) && k != classify_index {
|
|
|
+ classify_index = k
|
|
|
+ }
|
|
|
for _, n := range a_key {
|
|
|
ntmp := qutil.ObjToMap(n.(interface{}))
|
|
|
nkey := qutil.ObjArrToStringArr((*ntmp)["key"].([]interface{}))
|
|
@@ -87,6 +106,8 @@ func (a *AfterPay) FastImport() error {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ } else {
|
|
|
+ classify_index = 0
|
|
|
}
|
|
|
if len(_keys) > 0 {
|
|
|
if kwsCount >= 300 {
|
|
@@ -158,6 +179,14 @@ func (a *AfterPay) DirectSubKWS() error {
|
|
|
userId, _ := a.GetSession("userId").(string)
|
|
|
flag := "n"
|
|
|
if userId != "" {
|
|
|
+ var vip_lock = VIP_user_lock[userId]
|
|
|
+ if vip_lock == nil {
|
|
|
+ vip_lock = &VIPLOCK{}
|
|
|
+ vip_lock.Lock = &sync.Mutex{}
|
|
|
+ VIP_user_lock[userId] = vip_lock
|
|
|
+ }
|
|
|
+ vip_lock.Lock.Lock()
|
|
|
+ defer vip_lock.Lock.Unlock()
|
|
|
data, ok := util.MQFW.FindById("user", userId, `{"o_vipjy":1}`)
|
|
|
keys := a.GetString("keys")
|
|
|
var repleat = false
|
|
@@ -239,11 +268,19 @@ func (a *AfterPay) UpdateUserTips() error {
|
|
|
if userId != "" {
|
|
|
classify_index := a.GetString("classify_index")
|
|
|
kws_tips, _ := a.GetInteger("kws_tips")
|
|
|
- saveData := make(map[string]interface{})
|
|
|
- saveData["o_vipjy.a_items."+classify_index+".i_tips"] = kws_tips
|
|
|
- flag = util.MQFW.UpdateById("user", userId, map[string]interface{}{
|
|
|
- "$set": saveData,
|
|
|
- })
|
|
|
+ data, ok := util.MQFW.FindById("user", userId, `{"o_vipjy.a_items":1}`)
|
|
|
+ if ok && data != nil && len(*data) > 0 {
|
|
|
+ o_vipjy, _ := (*data)["o_vipjy"].(map[string]interface{})
|
|
|
+ a_items := o_vipjy["a_items"].([]interface{})
|
|
|
+ i, _ := strconv.Atoi(classify_index)
|
|
|
+ if i < len(a_items) {
|
|
|
+ saveData := make(map[string]interface{})
|
|
|
+ saveData["o_vipjy.a_items."+classify_index+".i_tips"] = kws_tips
|
|
|
+ flag = util.MQFW.UpdateById("user", userId, map[string]interface{}{
|
|
|
+ "$set": saveData,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
a.ServeJson(map[string]interface{}{
|
|
|
"flag": flag,
|
|
@@ -273,6 +310,14 @@ func (a *AfterPay) SetUserInfo() error {
|
|
|
userId, _ := a.GetSession("userId").(string)
|
|
|
var flag = false
|
|
|
if userId != "" {
|
|
|
+ var vip_lock = VIP_user_lock[userId]
|
|
|
+ if vip_lock == nil {
|
|
|
+ vip_lock = &VIPLOCK{}
|
|
|
+ vip_lock.Lock = &sync.Mutex{}
|
|
|
+ VIP_user_lock[userId] = vip_lock
|
|
|
+ }
|
|
|
+ vip_lock.Lock.Lock()
|
|
|
+ defer vip_lock.Lock.Unlock()
|
|
|
saveData := make(map[string]interface{})
|
|
|
//项目匹配
|
|
|
if a.GetString("pageType") == "projectMatch" {
|
|
@@ -303,97 +348,159 @@ func (a *AfterPay) SetUserInfo() error {
|
|
|
saveData["o_vipjy.s_email"] = s_email
|
|
|
saveData["o_vipjy.i_matchway"] = i_matchway
|
|
|
} else if a.GetString("pageType") == "keyWords" {
|
|
|
+ //保存关键词 多人同时操作导致或其他操作导致 分类索引或者关键词索引传值有误 会导致保存null值出现
|
|
|
+ //分类索引
|
|
|
classify_index := a.GetString("classify_index")
|
|
|
+ //分类名称
|
|
|
classify_name := strings.Trim(a.GetString("classify_name"), "")
|
|
|
+ //关键词索引
|
|
|
kws_index := a.GetString("kws_index")
|
|
|
+ //关键词名称
|
|
|
kws_name := strings.Trim(a.GetString("kws_name"), "")
|
|
|
+ //操作类型 SK:保存关键词; DK:删除关键词; SC:保存分类
|
|
|
actionType := a.GetString("actionType")
|
|
|
+ //附加词
|
|
|
addtion_kws := a.GetSlice("addition_kws")
|
|
|
+ //排除词
|
|
|
not_kws := a.GetSlice("not_kws")
|
|
|
+ //是否是首次添加关键词
|
|
|
kwscount := a.GetString("kwscount")
|
|
|
- if len([]rune(kws_name)) > 20 {
|
|
|
- kws_name = qutil.SubString(kws_name, 0, 20)
|
|
|
- }
|
|
|
- if kws_name != "" {
|
|
|
- var _kws []string
|
|
|
- for _, kn := range strings.Split(kws_name, " ") {
|
|
|
- if kn != "" {
|
|
|
- _kws = append(_kws, kn)
|
|
|
+ //关键词是否存在
|
|
|
+ canDel_k := false
|
|
|
+ //查询用vip关键词信息
|
|
|
+ data, ok := util.MQFW.FindById("user", userId, `{"o_vipjy.a_items":1}`)
|
|
|
+ if ok && data != nil && len(*data) > 0 {
|
|
|
+ o_vipjy, _ := (*data)["o_vipjy"].(map[string]interface{})
|
|
|
+ a_items := o_vipjy["a_items"].([]interface{})
|
|
|
+ i, _ := strconv.Atoi(classify_index)
|
|
|
+ j, _ := strconv.Atoi(kws_index)
|
|
|
+ var classifyArr map[string]interface{}
|
|
|
+ log.Println("前 i:", i, "-----", len(a_items))
|
|
|
+ for ak, av := range a_items {
|
|
|
+ //如果分类名称相同 则操作此分类
|
|
|
+ _av := qutil.ObjToMap(av)
|
|
|
+ if classify_name == qutil.ObjToString((*_av)["s_item"]) {
|
|
|
+ i = ak
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if i != len(a_items) && len(a_items) != 0 {
|
|
|
+ log.Println("后 i:", i, "-----", len(a_items))
|
|
|
+ //从前端获取的分类索引是否超出了库中分类的总量 如果是 则认为修改此VIP分类最后一位
|
|
|
+ if i > len(a_items) {
|
|
|
+ i = len(a_items) //- 1
|
|
|
+ //新增分类,新增关键词
|
|
|
+ kws_index = "0"
|
|
|
+ kwscount = "0"
|
|
|
+ } else {
|
|
|
+ //获取当前分类
|
|
|
+ classifyArr = a_items[i].(map[string]interface{})
|
|
|
+ //从前端获取的关键词索引大于库中当前分类中的关键词数组总量 则认为修改此分类中关键词组的最后一位
|
|
|
+ if j > len(classifyArr["a_key"].([]interface{})) {
|
|
|
+ kws_index = strconv.Itoa(len(classifyArr["a_key"].([]interface{})))
|
|
|
+ }
|
|
|
+ kwscount = "1"
|
|
|
}
|
|
|
+ } else {
|
|
|
+ //i == len(a_items) 新增分类,新增关键词
|
|
|
+ kws_index = "0"
|
|
|
+ kwscount = "0"
|
|
|
+ }
|
|
|
+ classify_index = strconv.Itoa(i)
|
|
|
+ if len([]rune(kws_name)) > 20 {
|
|
|
+ kws_name = qutil.SubString(kws_name, 0, 20)
|
|
|
}
|
|
|
- if actionType == "SK" && len(_kws) > 0 { //保存关键词
|
|
|
- if len(addtion_kws) > 0 {
|
|
|
- for i, addval := range addtion_kws {
|
|
|
- if len([]rune(addval)) > 20 {
|
|
|
- addval = qutil.SubString(addval, 0, 20)
|
|
|
+ if kws_name != "" {
|
|
|
+ var _kws []string
|
|
|
+ for _, kn := range strings.Split(kws_name, " ") {
|
|
|
+ if kn != "" {
|
|
|
+ _kws = append(_kws, kn)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if actionType == "SK" && len(_kws) > 0 { //保存关键词
|
|
|
+ //附加词处理 词过长或者为空的情况
|
|
|
+ if len(addtion_kws) > 0 {
|
|
|
+ for i, addval := range addtion_kws {
|
|
|
+ if len([]rune(addval)) > 20 {
|
|
|
+ addval = qutil.SubString(addval, 0, 20)
|
|
|
+ }
|
|
|
+ if addval == "" {
|
|
|
+ addtion_kws = append(addtion_kws[:i], addtion_kws[i+1:]...)
|
|
|
+ }
|
|
|
}
|
|
|
- if addval == "" {
|
|
|
- addtion_kws = append(addtion_kws[:i], addtion_kws[i+1:]...)
|
|
|
+ }
|
|
|
+ //排除词处理 词过长或者为空的情况
|
|
|
+ if len(not_kws) > 0 {
|
|
|
+ for i, notval := range not_kws {
|
|
|
+ if len([]rune(notval)) > 20 {
|
|
|
+ notval = qutil.SubString(notval, 0, 20)
|
|
|
+ }
|
|
|
+ if notval == "" {
|
|
|
+ not_kws = append(not_kws[:i], not_kws[i+1:]...)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- if len(not_kws) > 0 {
|
|
|
- for i, notval := range not_kws {
|
|
|
- if len([]rune(notval)) > 20 {
|
|
|
- notval = qutil.SubString(notval, 0, 20)
|
|
|
+ if kwscount != "0" {
|
|
|
+ //修改关键词
|
|
|
+ saveData["o_vipjy.a_items."+classify_index+".s_item"] = classify_name
|
|
|
+ saveData["o_vipjy.a_items."+classify_index+".a_key."+kws_index+".key"] = _kws
|
|
|
+ saveData["o_vipjy.a_items."+classify_index+".a_key."+kws_index+".appendkey"] = addtion_kws
|
|
|
+ saveData["o_vipjy.a_items."+classify_index+".a_key."+kws_index+".notkey"] = not_kws
|
|
|
+ } else {
|
|
|
+ //首次添加分类和关键词
|
|
|
+ var _key = make(map[string]interface{})
|
|
|
+ var a_key = make([]map[string]interface{}, 1)
|
|
|
+ if classify_name == "" {
|
|
|
+ classify_name = "未分类"
|
|
|
}
|
|
|
- if notval == "" {
|
|
|
- not_kws = append(not_kws[:i], not_kws[i+1:]...)
|
|
|
+ _key["key"] = _kws
|
|
|
+ _key["appendkey"] = addtion_kws
|
|
|
+ _key["notkey"] = not_kws
|
|
|
+ a_key[0] = _key
|
|
|
+ if len(a_key) > 0 {
|
|
|
+ flag = util.MQFW.UpdateById("user", userId, bson.M{
|
|
|
+ "$push": bson.M{
|
|
|
+ "o_vipjy.a_items." + classify_index + ".a_key": bson.M{
|
|
|
+ "$each": a_key,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ "$set": bson.M{
|
|
|
+ "o_vipjy.l_modifydate": time.Now().Unix(),
|
|
|
+ "o_vipjy.a_items." + classify_index + ".s_item": classify_name,
|
|
|
+ },
|
|
|
+ })
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- if kwscount != "0" {
|
|
|
- //修改关键词
|
|
|
- saveData["o_vipjy.a_items."+classify_index+".s_item"] = classify_name
|
|
|
- saveData["o_vipjy.a_items."+classify_index+".a_key."+kws_index+".key"] = _kws
|
|
|
- saveData["o_vipjy.a_items."+classify_index+".a_key."+kws_index+".appendkey"] = addtion_kws
|
|
|
- saveData["o_vipjy.a_items."+classify_index+".a_key."+kws_index+".notkey"] = not_kws
|
|
|
- } else {
|
|
|
- //首次添加分类和关键词
|
|
|
- var _key = make(map[string]interface{})
|
|
|
- var a_key = make([]map[string]interface{}, 1)
|
|
|
- if classify_name == "" {
|
|
|
- classify_name = "未分类"
|
|
|
+ // }
|
|
|
+ } else if actionType == "DK" { //删除关键词
|
|
|
+ for _, kv := range classifyArr["a_key"].([]interface{}) {
|
|
|
+ _kv := qutil.ObjToMap(kv)
|
|
|
+ if strings.Join(qutil.ObjArrToStringArr((*_kv)["key"].([]interface{})), ",") == strings.Join(_kws, ",") {
|
|
|
+ canDel_k = true
|
|
|
+ }
|
|
|
}
|
|
|
- _key["key"] = _kws
|
|
|
- _key["appendkey"] = addtion_kws
|
|
|
- _key["notkey"] = not_kws
|
|
|
- a_key[0] = _key
|
|
|
- if len(a_key) > 0 {
|
|
|
- flag = util.MQFW.UpdateById("user", userId, bson.M{
|
|
|
- "$push": bson.M{
|
|
|
- "o_vipjy.a_items." + classify_index + ".a_key": bson.M{
|
|
|
- "$each": a_key,
|
|
|
- },
|
|
|
- },
|
|
|
- "$set": bson.M{
|
|
|
- "o_vipjy.l_modifydate": time.Now().Unix(),
|
|
|
- "o_vipjy.a_items." + classify_index + ".s_item": classify_name,
|
|
|
- },
|
|
|
- })
|
|
|
+ log.Println("canDel_k:", canDel_k)
|
|
|
+ //canDel_k true:存在此关键词 可以进行删除
|
|
|
+ if canDel_k {
|
|
|
+ //一个分类 删除最后一个关键词 则把这个分类也删除
|
|
|
+ if classifyArr != nil && len(classifyArr["a_key"].([]interface{})) == 1 {
|
|
|
+ a_items = append(a_items[:i], a_items[i+1:]...)
|
|
|
+ saveData["o_vipjy.a_items"] = a_items
|
|
|
+ } else if classifyArr != nil && len(classifyArr["a_key"].([]interface{})) > 1 {
|
|
|
+ //一个分类 删除非最后一个关键词 只需要操作此关键词即可
|
|
|
+ a_key := classifyArr["a_key"].([]interface{})
|
|
|
+ a_key = append(a_key[:j], a_key[j+1:]...)
|
|
|
+ saveData["o_vipjy.a_items."+classify_index+".a_key"] = a_key
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- // }
|
|
|
- } else if actionType == "DK" { //删除关键词
|
|
|
- data, ok := util.MQFW.FindById("user", userId, `{"o_vipjy.a_items":1}`)
|
|
|
- if ok && data != nil && len(*data) > 0 {
|
|
|
- o_vipjy, _ := (*data)["o_vipjy"].(map[string]interface{})
|
|
|
- a_items := o_vipjy["a_items"].([]interface{})
|
|
|
- i, _ := strconv.Atoi(classify_index)
|
|
|
- classifyArr := a_items[i].(map[string]interface{})
|
|
|
- if classifyArr != nil && len(classifyArr["a_key"].([]interface{})) == 1 {
|
|
|
- a_items = append(a_items[:i], a_items[i+1:]...)
|
|
|
- saveData["o_vipjy.a_items"] = a_items
|
|
|
- } else if classifyArr != nil && len(classifyArr["a_key"].([]interface{})) > 1 {
|
|
|
- j, _ := strconv.Atoi(kws_index)
|
|
|
- a_key := classifyArr["a_key"].([]interface{})
|
|
|
- a_key = append(a_key[:j], a_key[j+1:]...)
|
|
|
- saveData["o_vipjy.a_items."+classify_index+".a_key"] = a_key
|
|
|
+ } else if actionType == "SC" { //保存分类
|
|
|
+ if classifyArr["a_key"] != nil && len(classifyArr["a_key"].([]interface{})) > 0 {
|
|
|
+ saveData["o_vipjy.a_items."+classify_index+".s_item"] = classify_name
|
|
|
}
|
|
|
}
|
|
|
- } else if actionType == "SC" { //保存分类
|
|
|
- saveData["o_vipjy.a_items."+classify_index+".s_item"] = classify_name
|
|
|
}
|
|
|
+ } else {
|
|
|
+ log.Println(userId, "--vip信息查询出错或为空")
|
|
|
}
|
|
|
} else if a.GetString("pageType") == "other_buyerclass" {
|
|
|
other, _ := a.GetInteger("other")
|