Browse Source

试用用户

wangshan 4 năm trước cách đây
mục cha
commit
429bef2ae4

+ 0 - 1
src/jfw/modules/app/src/app/front/login.go

@@ -300,7 +300,6 @@ func (l *Login) Sess(ostr string) error {
 						actionurl = actionurl + "?selectTime=" + selectTime
 					}
 				}
-				log.Println(l.GetSession("userId"))
 				return l.Redirect(actionurl)
 			} else {
 				log.Println("解析结果:", str, ",actionurl为空")

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 1
src/jfw/modules/bigmember/src/config.json


+ 0 - 1
src/jfw/modules/bigmember/src/config/config.go

@@ -28,7 +28,6 @@ type config struct {
 	KeyMaxLength        int
 	WarnMailbox         []string
 	WarnMbTitle         string
-	DividingTime        int64
 }
 type followConfig struct {
 	Normal int

+ 1 - 1
src/jfw/modules/bigmember/src/entity/analysisEntName.go

@@ -38,7 +38,7 @@ func GetProInfoById(ids, sourceinfoids []string) []map[string]interface{} {
 						"should": []
 					}
 				},
-			  	"_source": ["projectname","_id","buyerclass","firsttime","area","city","purchasing","ids","buyer","budget","bidstatus"],
+			  	"_source": ["projectname","_id","buyerclass","firsttime","area","city","purchasing","ids","buyer","budget","bidstatus","zbtime","bidopentime","agency","s_subscopeclass","bidamount"],
 			  	"sort": [
 			    	{
 			    	  "_id": "desc"

+ 1 - 1
src/jfw/modules/bigmember/src/filter/sessionfilter.go

@@ -25,7 +25,7 @@ var expertReg = regexp.MustCompile("^/bigmember/(potential|report)/.+$")
 var wisdomReg = regexp.MustCompile("^/bigmember/(forecast|decision)/.+$")
 
 //试用版  中标预测 投标决策分析  潜在竞争对手和潜在客户
-var trialReg = regexp.MustCompile("^/bigmember/(forecast|analysis|potential)/.+$")
+var trialReg = regexp.MustCompile("^/bigmember/(forecast|analysis|potential|decision)/.+$")
 
 //继承过滤器方法
 func (l *sessionfilter) Do(w http.ResponseWriter, req *http.Request) bool {

+ 59 - 41
src/jfw/modules/bigmember/src/service/analysis/analysis.go

@@ -84,61 +84,79 @@ func (this *Analysis) PInfo() {
 				city := qutil.ObjToString(ptdata["city"])
 				buyer := qutil.ObjToString(ptdata["buyer"]) //采购单位
 				ids := qutil.ObjArrToStringArr(ptdata["ids"].([]interface{}))
-				var keyArr = []map[string]interface{}{}
-				var a_key = []map[string]interface{}{}
-				//查库获得大会员用户的信息
-				o_mb, ok := db.Mgo.FindById(C_User, userId, `{"o_member_jy":1}`)
-				if ok && o_mb != nil && (*o_mb) != nil && (*o_mb)["o_member_jy"] != nil {
-					o_member_jy := qutil.ObjToMap((*o_mb)["o_member_jy"])
-					if (*o_member_jy)["a_items"] != nil {
-						a_items := qutil.ObjArrToMapArr((*o_member_jy)["a_items"].([]interface{}))
-						if len(a_items) > 0 {
-							for _, v := range a_items {
-								a_key = qutil.ObjArrToMapArr(v["a_key"].([]interface{}))
-							L:
-								for _, vv := range a_key {
-									keys := qutil.ObjArrToStringArr(vv["key"].([]interface{}))
-									for _, kv := range keys {
-										if strings.Contains(projectname, kv) || strings.Contains(purchasing, kv) {
-											keyArr = append(keyArr, vv)
-											break L
+				if this.GetString("D") == "" {
+					var keyArr = []map[string]interface{}{}
+					var a_key = []map[string]interface{}{}
+					//查库获得大会员用户的信息
+					o_mb, ok := db.Mgo.FindById(C_User, userId, `{"o_member_jy":1}`)
+					if ok && o_mb != nil && (*o_mb) != nil && (*o_mb)["o_member_jy"] != nil {
+						o_member_jy := qutil.ObjToMap((*o_mb)["o_member_jy"])
+						if (*o_member_jy)["a_items"] != nil {
+							a_items := qutil.ObjArrToMapArr((*o_member_jy)["a_items"].([]interface{}))
+							if len(a_items) > 0 {
+								for _, v := range a_items {
+									a_key = qutil.ObjArrToMapArr(v["a_key"].([]interface{}))
+								L:
+									for _, vv := range a_key {
+										keys := qutil.ObjArrToStringArr(vv["key"].([]interface{}))
+										for _, kv := range keys {
+											if strings.Contains(projectname, kv) || strings.Contains(purchasing, kv) {
+												keyArr = append(keyArr, vv)
+												break L
+											}
 										}
 									}
 								}
 							}
 						}
 					}
-				}
-				if len(keyArr) == 0 {
-					if purchasing != "" {
-						if len(strings.Split(purchasing, ",")) > 0 {
-							for _, v := range strings.Split(purchasing, ",") {
-								keyArr = append(keyArr, map[string]interface{}{
-									"key": []string{v},
-								})
+					if len(keyArr) == 0 {
+						if purchasing != "" {
+							if len(strings.Split(purchasing, ",")) > 0 {
+								for _, v := range strings.Split(purchasing, ",") {
+									keyArr = append(keyArr, map[string]interface{}{
+										"key": []string{v},
+									})
+								}
 							}
 						}
 					}
-				}
-				ArrPS["projectname"] = projectname
-				ArrPS["buyerclass"] = strings.Split(buyerclass, ",")
-				if purchasing != "" && len(strings.Split(purchasing, ",")) > 0 {
-					if len(strings.Split(purchasing, ",")) > 5 {
-						ArrPS["purchasing"] = strings.Split(purchasing, ",")[:5]
+					ArrPS["buyerContent"] = keyArr
+					ArrPS["buyerclass"] = strings.Split(buyerclass, ",")
+					if purchasing != "" && len(strings.Split(purchasing, ",")) > 0 {
+						if len(strings.Split(purchasing, ",")) > 5 {
+							ArrPS["purchasing"] = strings.Split(purchasing, ",")[:5]
+						} else {
+							ArrPS["purchasing"] = strings.Split(purchasing, ",")
+						}
 					} else {
-						ArrPS["purchasing"] = strings.Split(purchasing, ",")
+						ArrPS["purchasing"] = []string{}
+					}
+					if area == "全国" {
+						ArrPS["area"] = map[string]interface{}{}
+					} else {
+						ArrPS["area"] = map[string]interface{}{
+							area: strings.Split(city, ","),
+						}
 					}
 				} else {
-					ArrPS["purchasing"] = []string{}
-				}
-				if area == "全国" {
-					ArrPS["area"] = map[string]interface{}{}
-				} else {
-					ArrPS["area"] = map[string]interface{}{
-						area: strings.Split(city, ","),
+					ArrPS["bidamount"] = qutil.Float64All(ptdata["bidamount"])      //中标金额
+					s_subscopeclass := qutil.ObjToString(ptdata["s_subscopeclass"]) //项目行业
+					if s_subscopeclass != "" {
+						ArrPS["s_subscopeclass"] = strings.Split(s_subscopeclass, "_")[0]
 					}
+					ArrPS["agency"] = qutil.ObjToString(ptdata["agency"]) //招标代理机构
+					zbtime := ptdata["zbtime"]
+					if zbtime != nil {
+						ArrPS["zbtime"] = qutil.FormatDateWithObj(&zbtime, "2006/01/02") //招标时间
+					}
+					bidopentime := ptdata["bidopentime"]
+					if bidopentime != nil {
+						ArrPS["bidopentime"] = qutil.FormatDateWithObj(&bidopentime, "2006/01/02") //开标时间
+					}
+					ArrPS["area"] = area
 				}
-				ArrPS["buyerContent"] = keyArr
+				ArrPS["projectname"] = projectname
 				if len(sourceinfoids) > 0 {
 					ArrPS["infoid"] = this.GetString("sourceinfoid")
 				} else if len(ids) > 0 && ids[0] != "" {

+ 38 - 11
src/jfw/modules/bigmember/src/service/analysis/decision.go

@@ -3,23 +3,30 @@ package analysis
 
 import (
 	. "api"
+	"db"
 	"encoding/json"
 	"log"
 	qutil "qfw/util"
+	"qfw/util/redis"
 	"regexp"
+	"sync"
 )
 
 type DecParam struct {
-	Area         map[string]interface{}
-	BuyerContent []map[string]interface{}
-	BuyerClass   []string
-	Sid          string
-	Pid          string
-	Pname        string
+	Area          map[string]interface{}
+	BuyerContent  []map[string]interface{}
+	BuyerClass    []string
+	Sid           string
+	Pid           string
+	Pname         string
+	Subscopeclass string
+	MinPrice      int
+	MaxPrice      int
 }
 
 var regExperts = regexp.MustCompile("^[\\p{Han}]{2,4}$")
 var regWinner = regexp.MustCompile(".+[司院厂所心处普]$")
+var decisionLock = map[string]*sync.Mutex{}
 
 //决策分析内容
 func (this *Analysis) DecInfo() {
@@ -53,11 +60,31 @@ func (this *Analysis) DecInfo() {
 		// log.Println(buyerClass, area, buyerContent)
 		if sid != "" && pname != "" && len(buyerContent) > 0 {
 			userId, _ := this.GetSession("userId").(string)
-			//试用用户投标决策权限
-			ai := AnalysisPower("project", userId, pname, sid)
-			if ai > 0 {
-				decQuery := DecQuery(area, buyerClass, buyerContent)
-				regMap.Data = getDecInfo(decQuery)
+			userInfo, ok := db.Mgo.FindById("user", userId, nil)
+			if !ok || userInfo == nil || len(*userInfo) == 0 {
+				regMap.Error_code = Error_code_1004
+				regMap.Error_msg = Error_msg_1004
+			} else {
+				if decisionLock[userId] == nil {
+					decisionLock[userId] = &sync.Mutex{}
+				}
+				decisionLock[userId].Lock()
+				defer decisionLock[userId].Unlock()
+				//试用用户投标决策权限
+				ai, base64Key := AnalysisPower("P", userId, pname, sid)
+				if ai > 0 {
+					//未预测过的项目 且需要更新bigmember_amount
+					i_member_status := qutil.IntAll((*userInfo)["i_member_status"])
+					if ai == 2 && i_member_status == 4 { //试用用户
+						redis.Put("other", "decision_trial_"+base64Key, 1, 7*24*60*60) //一周试用期
+						UpdatePower(userId, "P")
+					}
+					decQuery := DecQuery(area, buyerClass, buyerContent)
+					regMap.Data = getDecInfo(decQuery)
+				} else {
+					regMap.Error_code = Error_code_1004
+					regMap.Error_msg = Error_msg_1004
+				}
 			}
 		} else {
 			regMap.Error_code = Error_code_1002

+ 61 - 27
src/jfw/modules/bigmember/src/service/analysis/forecastwinner.go

@@ -22,7 +22,7 @@ import (
 )
 
 var OverRegLock = sync.Mutex{}
-
+var forecastWLock = map[string]*sync.Mutex{}
 var redis_forecast_status = "forecast_status_" //预测状态
 var redis_forecast_res = "forecast_res_"       //预测结果数据
 var redis_forecast_date = "forecast_date_"     //预测时间
@@ -115,33 +115,67 @@ func (this *Analysis) FWData() {
 				//接收参数
 				json.Unmarshal(this.Body(), &getRes)
 				if getRes.Type == "" && getRes.Id != "" {
-					//判断是否有中标预测权限
-					go AnalysisPower("winner", userId, getRes.Pname, getRes.Infoid)
-					getRes.RedisFKey = redis_forecast_res + userId
-					getRes.Id = qutil.DecodeArticleId2ByCheck(getRes.Id)[0]
-					if getRes.Infoid != "" {
-						getRes.Infoid = qutil.DecodeArticleId2ByCheck(getRes.Infoid)[0]
-					}
-					//中标预测数据处理ing
-					if util.JyForecastByRpc(getRes) {
-						//redis 存正在预测标识
-						redis.Put("other", redis_forecast_status+userId, getRes, -1)
-						//预测参数--保存mongodb中
-						f_id := db.Mgo.Save(C_ForecastData, map[string]interface{}{
-							"userId":      userId,
-							"createtime":  time.Now().Unix(),
-							"status":      -1, //预测完成待查看
-							"requestData": getRes,
-							"upeatetime":  time.Now().Unix(),
-						})
-						if f_id != "" {
-							redis.Put("other", redis_forecast_date+userId, f_id, forecast_time)
-						}
-						status = 2 //rpc 已接受参数 正在预测
+					userInfo, ok := db.Mgo.FindById("user", userId, nil)
+					if !ok || userInfo == nil || len(*userInfo) == 0 {
+						regMap.Error_code = Error_code_1004
+						regMap.Error_msg = Error_msg_1004
 					} else {
-						status = -1
-						s_nickname, _ := this.GetSession("s_nickname").(string)
-						go SaveFalseLogAndSendMail(userId, "rpc 接口调用出错", "", s_nickname, *getRes)
+						//是否是子账号
+						var userid = userId
+						var phone, _ = this.GetSession("s_phone").(string)
+						if (*userInfo)["s_phone"] != nil {
+							phone = qutil.ObjToString((*userInfo)["s_phone"])
+						}
+						if (*userInfo)["i_member_sub_status"] != nil && (*userInfo)["s_member_mainid"] != nil {
+							i_member_sub_status := qutil.Int64All((*userInfo)["i_member_sub_status"])
+							if i_member_sub_status == 1 { //1:启动
+								userid = qutil.ObjToString((*userInfo)["s_member_mainid"]) //父级用户id
+							}
+						}
+						if forecastWLock[userid] == nil {
+							forecastWLock[userid] = &sync.Mutex{}
+						}
+						forecastWLock[userid].Lock()
+						defer forecastWLock[userid].Unlock()
+						//判断是否有中标预测权限
+						ai, base64Key := AnalysisPower("W", userid, getRes.Pname, getRes.Infoid)
+						log.Println("ai:", ai)
+						if ai > 0 {
+							if ai == 2 {
+								UpdatePower(userid, "W") //更新sql库权限次数
+							}
+							getRes.RedisFKey = redis_forecast_res + userId
+							getRes.Id = qutil.DecodeArticleId2ByCheck(getRes.Id)[0]
+							if getRes.Infoid != "" {
+								getRes.Infoid = qutil.DecodeArticleId2ByCheck(getRes.Infoid)[0]
+							}
+							//中标预测数据处理ing
+							if util.JyForecastByRpc(getRes) {
+								//redis 存正在预测标识
+								redis.Put("other", redis_forecast_status+userId, getRes, -1)
+								//预测参数--保存mongodb中
+								f_id := db.Mgo.Save(C_ForecastData, map[string]interface{}{
+									"userId":      userId,
+									"createtime":  time.Now().Unix(),
+									"status":      -1, //预测完成待查看
+									"requestData": getRes,
+									"upeatetime":  time.Now().Unix(),
+								})
+								if f_id != "" {
+									redis.Put("other", redis_forecast_date+userId, f_id, forecast_time)
+								}
+								status = 2 //rpc 已接受参数 正在预测
+							} else {
+								status = -1
+								s_nickname, _ := this.GetSession("s_nickname").(string)
+								go SaveFalseLogAndSendMail(userId, "rpc 接口调用出错", "", s_nickname, *getRes)
+							}
+							//保存中标预测记录
+							SaveFWHistorys(status, userId, userid, base64Key, getRes.Pname, getRes.Infoid, phone)
+						} else {
+							regMap.Error_code = Error_code_1004
+							regMap.Error_msg = Error_msg_1004
+						}
 					}
 				}
 				regMap.Data = map[string]interface{}{

+ 49 - 34
src/jfw/modules/bigmember/src/service/analysis/power.go

@@ -1,71 +1,55 @@
 package analysis
 
 import (
-	. "config"
 	"db"
 	"log"
+	qutil "qfw/util"
 	"qfw/util/redis"
 )
 
 var f_0 = 0 //查询错误或者没有权限
 var f_1 = 1 //是已预测或决策过的项目
 var f_2 = 2 //未预测或未决策且有权限
-var f_3 = 3 //非试用用户或是最早一批购买大会员的用户
 
-func AnalysisPower(atype, userId, pname, sid string) int {
-	userInfo, ok := db.Mgo.FindById("user", userId, nil)
-	i_member_status, _ := (*userInfo)["i_member_status"].(int)
-	if !ok || userInfo != nil || len(*userInfo) > 0 {
-		return f_0
+func AnalysisPower(atype, userId, pname, sid string) (int, string) {
+	if sid != "" {
+		sid = qutil.DecodeArticleId2ByCheck(sid)[0]
 	}
-	if atype == "project" {
-		//投标决策分析
-		if i_member_status != 4 { //非试用用户
-			return f_3
-		}
+	if atype == "P" { //投标决策分析
 		//查看是否决策过的项目
 		base64Key := GetBase64Key(userId, pname, sid)
-		log.Println("base64key:", base64Key)
-		isExists, ok := redis.Exists("other", "decision_trial_"+userId)
+		isExists, ok := redis.Exists("other", "decision_trial_"+base64Key)
 		if ok == nil && isExists {
-			return f_1
+			return f_1, base64Key
 		}
 		//查看是否决策项目次数
 		bamount := getBAmountInfo(userId)
 		if bamount == nil {
-			return f_0
+			return f_0, base64Key
 		}
-		decision_count, _ := bamount["decision_count"].(int)
+		decision_count := qutil.IntAll(bamount["decision_count"])
 		if decision_count > 0 {
-			return f_2
-		}
-	} else if atype == "winner" {
-		//中标预测
-		starttime, _ := (*userInfo)["i_member_starttime"].(int64)
-		if starttime != 0 && starttime < Config.DividingTime {
-			return f_3
+			return f_2, base64Key
 		}
+	} else if atype == "W" { //中标预测
 		//查看是否预测过此项目
 		//forecastw_histroy  用户中标预测记录
 		base64Key := GetBase64Key(userId, pname, sid)
-		fhistorys, ok := db.Mgo.FindOne("forecastw_histroy", map[string]interface{}{
-			"s_userid": userId,
-			"s_key":    base64Key,
-		})
-		if ok && fhistorys != nil && len(*fhistorys) > 0 {
-			return f_1
+		fi := db.Mysql.CountBySql("SELECT COUNT(*) FROM forecastwinner_history a WHERE a.f_user_id = '" + userId + "' AND a.s_key = '" + base64Key + "'")
+		if fi > 0 {
+			return f_1, base64Key
 		}
 		//是否剩余预测权限
 		bamount := getBAmountInfo(userId)
 		if bamount == nil {
-			return f_0
+			return f_0, base64Key
 		}
-		decision_count, _ := bamount["forecastwinner_count"].(int)
+		decision_count := qutil.IntAll(bamount["forecastwinner_count"])
 		if decision_count > 0 {
-			return f_2
+			return f_2, base64Key
 		}
 	}
-	return f_0
+	return f_0, ""
 }
 
 //获取mysql 大会员权限信息
@@ -76,3 +60,34 @@ func getBAmountInfo(userId string) map[string]interface{} {
 	}
 	return nil
 }
+
+//更新sql库 大会员用户bigmember_amount
+func UpdatePower(userId, atype string) {
+	//投标决策分析
+	var sql = ``
+	if atype == "P" {
+		sql = `UPDATE bigmember_amount a SET a.decision_count= IF(a.decision_count<1,0,a.decision_count-1) WHERE a.user_id = '` + userId + `' AND a.is_ing = 1;`
+	} else if atype == "W" {
+		sql = `UPDATE bigmember_amount a SET a.forecastwinner_count= IF(a.forecastwinner_count<1,0,a.forecastwinner_count-1) ,a.forecastwinner_used_count=a.forecastwinner_used_count+1 WHERE a.user_id = '` + userId + `' AND a.is_ing = 1;`
+	}
+	if sql != "" {
+		bi := db.Mysql.UpdateOrDeleteBySql(sql)
+		if bi == 0 {
+			log.Println("bigmember_amount  更新出错:")
+		}
+	}
+}
+
+//保存中标预测记录
+
+func SaveFWHistorys(status int, userId, f_userId, base64Key, pname, sid, phone string) {
+	if status == 2 {
+		status = 1
+	} else {
+		status = 0
+	}
+	fi := db.Mysql.InsertBySql(`INSERT INTO forecastwinner_history (f_user_id,c_user_id,s_id,p_name,createtime,s_phone,s_key,f_result ) VALUES (?,?,?,?,?,?,?,?)`, f_userId, userId, sid, pname, qutil.NowFormat(qutil.Date_Full_Layout), phone, base64Key, status)
+	if fi == 0 {
+		log.Println("中标预测记录报错:", userId)
+	}
+}

+ 3 - 4
src/jfw/modules/bigmember/src/service/analysis/util.go

@@ -27,20 +27,19 @@ func GetBase64Key(userId, pname, sid string) (signedStr string) {
 		[]string{"sid", sid},
 	}
 	sgt := &SignStr{[]string{}, []string{}}
-	for k, v := range param {
-		log.Println(k, v)
+	for _, v := range param {
 		sgt.Key = append(sgt.Key, v[0])
 		sgt.Val = append(sgt.Val, v[1])
 	}
 	sgt.Sort()
 	reqStr := sgt.ToString()
 	str := percentEncode(reqStr)
-	log.Println("str", str)
+	// log.Println("str", str)
 	h := hmac.New(func() hash.Hash {
 		return sha1.New()
 	}, []byte(secret))
 	io.WriteString(h, str)
-	signedStr = base64.StdEncoding.EncodeToString(h.Sum(nil))
+	signedStr = url.QueryEscape(base64.StdEncoding.EncodeToString(h.Sum(nil)))
 	log.Println(signedStr)
 	return
 }

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác