wanghuidong 5 gadi atpakaļ
vecāks
revīzija
f87e587cf2

+ 1 - 1
README.md

@@ -1 +1 @@
-标签系统
+历史数据导出自定义配置

+ 2 - 1
src/config.json

@@ -46,7 +46,8 @@
 		"addr": "192.168.3.207:27092",
 		"size": 15,
 		"db": "mxs",
-		"coll": "usermail"
+		"coll": "usermail",
+		"coll_test": "usermail_history"
 	},
 	"es": {
 		"addr": "http://192.168.3.128:9800",

+ 1 - 1
src/front/front.go

@@ -186,7 +186,7 @@ func (f *Front) PersonalMenu() {
 }
 
 func GetUserMenu(role string) []map[string]interface{} {
-	list := []map[string]interface{}{}
+	var list []map[string]interface{}
 	maps := map[string]interface{}{
 		"delete": false,
 	}

+ 0 - 1
src/front/menu.go

@@ -4,7 +4,6 @@ import (
 	mongoutil "qfw/mongodb"
 	qu "qfw/util"
 	"time"
-
 	. "util"
 
 	"gopkg.in/mgo.v2/bson"

+ 6 - 8
src/front/role.go

@@ -2,22 +2,20 @@ package front
 
 import (
 	"encoding/json"
+	"gopkg.in/mgo.v2/bson"
 	mongoutil "qfw/mongodb"
 	qu "qfw/util"
-
 	. "util"
-
-	"gopkg.in/mgo.v2/bson"
 )
 
 func (f *Front) RoleManager() {
 	defer qu.Catch()
 	if f.Method() == "POST" {
-		data, _ := Mgo.Find("role", nil, nil, nil, false, -1, -1);
+		data, _ := Mgo.Find("role", nil, nil, nil, false, -1, -1)
 		f.ServeJson(map[string]interface{}{
 			"data": data,
 		})
-	}else {
+	} else {
 		f.Render("com/role.html")
 	}
 }
@@ -31,7 +29,7 @@ func (f *Front) RoleNew() {
 		if _id != "" {
 			set := bson.M{
 				"$set": bson.M{
-					"name": name,
+					"name":  name,
 					"level": level,
 				},
 			}
@@ -41,7 +39,7 @@ func (f *Front) RoleNew() {
 					"rep": true,
 				})
 			}
-		}else {
+		} else {
 			_id := Mgo.Save("role", bson.M{"name": name, "level": level})
 			if _id != "" {
 				f.ServeJson(map[string]interface{}{
@@ -49,7 +47,7 @@ func (f *Front) RoleNew() {
 				})
 			}
 		}
-	}else {
+	} else {
 		f.Render("com/role.html")
 	}
 }

+ 3 - 1
src/history/historytask.go

@@ -21,7 +21,6 @@ func (this *HistoryData) HistoryTask(history_id string) {
 	//加载一个客户
 	log.Println("history_id", history_id)
 	customer, _ := Mgo.Find("historylog", map[string]interface{}{"_id": mongoutil.StringTOBsonId(history_id)}, nil, nil, false, -1, -1)
-	log.Println("data", customer)
 	if len(*customer) == 1 {
 		c := (*customer)[0]
 		customerId := mongoutil.BsonIdToSId(c["_id"])
@@ -84,6 +83,7 @@ func (this *HistoryData) HistoryList() {
 
 func UpdateHistoryState(state int, history_id string, count int) {
 	if state == 2 {
+
 		Mgo.Update("historylog", map[string]interface{}{"_id": mongoutil.StringTOBsonId(history_id)}, map[string]interface{}{
 			"$set": map[string]interface{}{
 				"state":        state,
@@ -92,7 +92,9 @@ func UpdateHistoryState(state int, history_id string, count int) {
 		}, false, false)
 		return
 	}
+
 	Mgo.Update("historylog", map[string]interface{}{"_id": mongoutil.StringTOBsonId(history_id)}, map[string]interface{}{
+
 		"$set": map[string]interface{}{
 			"state": state,
 		},

+ 2 - 9
src/history/task.go

@@ -2,6 +2,7 @@ package history
 
 import (
 	"encoding/json"
+	"gopkg.in/mgo.v2/bson"
 	"log"
 	mongoutil "qfw/mongodb"
 	qu "qfw/util"
@@ -9,9 +10,6 @@ import (
 	. "sqlmodel"
 	"strings"
 	"sync"
-
-	"gopkg.in/mgo.v2/bson"
-
 	. "util"
 
 	"go.mongodb.org/mongo-driver/bson/primitive"
@@ -85,8 +83,7 @@ func (c *Customer) GetDepartments(stype string, departments []map[string]interfa
 			}
 			DM.GetSearchRules(c.ID, stype, c.IdRange, dsArr) //获取某个部门的所有规则
 			c.Departments = append(c.Departments, DM)
-			qu.Debug("Departments---", DM.ID, DM.Name, DM.CustomerID, len(DM.Rules))
-			log.Println(DM.Rules)
+			// qu.Debug("Departments---", DM.ID, DM.Name, DM.CustomerID, len(DM.Rules))
 		}
 	}
 }
@@ -431,7 +428,6 @@ func (d *Department) GetSearchRules(cid, stype string, idRange bson.M, searchRul
 		for _, sr := range searchRules {
 			SR := &SearchRule{}
 			SR.Fields = make(map[string]interface{})
-
 			id := mongoutil.BsonIdToSId(sr["_id"])
 			name := qu.ObjToString(sr["s_name"])
 			SR.ID = id
@@ -454,16 +450,13 @@ func (d *Department) GetSearchRules(cid, stype string, idRange bson.M, searchRul
 			o_rule, ok := sr["o_rules"].([]interface{})
 			if !ok {
 				o_rule = []interface{}{}
-				log.Println("777")
 			}
 			o_rules := qu.ObjArrToMapArr(o_rule)
 			if len(o_rules) > 0 {
-				log.Println("666")
 				SR.GetKeyAddWord(o_rules)
 			}
 			//获取全局清理词
 			SR.GetClearWord(clearKey, clearKeyMatch)
-			log.Println("srsr", SR)
 			d.Rules = append(d.Rules, SR)
 		}
 	}

+ 2 - 2
src/history/util_history.go

@@ -564,7 +564,7 @@ func SaveMgo() {
 					defer func() {
 						<-SP
 					}()
-					MgoSave.SaveBulk(SaveColl, arru...)
+					MgoSave.SaveBulk(SaveColl_test, arru...)
 				}(arru)
 				arru = make([]map[string]interface{}, 500)
 				indexu = 0
@@ -576,7 +576,7 @@ func SaveMgo() {
 					defer func() {
 						<-SP
 					}()
-					MgoSave.SaveBulk(SaveColl, arru...)
+					MgoSave.SaveBulk(SaveColl_test, arru...)
 				}(arru[:indexu])
 				arru = make([]map[string]interface{}, 500)
 				indexu = 0

+ 161 - 126
src/service/customer_service.go

@@ -3,18 +3,16 @@ package service
 import (
 	"encoding/json"
 	"fmt"
+	"github.com/go-xweb/xweb"
+	"github.com/lauyoume/gopinyin"
+	"gopkg.in/mgo.v2/bson"
 	"io/ioutil"
-	"log"
 	"net/http"
 	mongoutil "qfw/mongodb"
 	qu "qfw/util"
 	"strings"
 	"time"
 	. "util"
-
-	"github.com/go-xweb/xweb"
-	"github.com/lauyoume/gopinyin"
-	"gopkg.in/mgo.v2/bson"
 )
 
 type Customer struct {
@@ -125,6 +123,7 @@ func (c *Customer) CustomerEuser() {
 	defer qu.Catch()
 	id := c.GetString("id")
 	query := bson.M{}
+
 	query["_id"] = mongoutil.StringTOBsonId(id)
 	data, _ := Mgo.FindOneByField("euser", query, `{}`)
 	depart, _ := Mgo.Find("euserdepart", bson.M{"s_userid": id, "b_delete": false}, nil, nil, false, -1, -1)
@@ -297,7 +296,9 @@ func (c *Customer) CuserToEuser() {
 			"i_state":         1,
 		},
 	}
+
 	b := Mgo.Update("cuser", bson.M{"_id": mongoutil.StringTOBsonId(_id)}, set, false, false)
+
 	if !b {
 		c.ServeJson(map[string]interface{}{
 			"rep": b,
@@ -685,19 +686,38 @@ func (c *Customer) EuserTagEdit() {
 		o_rulesStr := data["o_list"].(string)
 		json.Unmarshal([]byte(o_rulesStr), &o_rules)
 		data["o_list"] = o_rules
+		hid := qu.ObjToString(data["hid"])
 		var rep = true
-		if _id == "" {
-			data["i_createtime"] = createTime
-			data["i_updatetime"] = createTime
-			data["b_delete"] = false
-			_id = Mgo.Save("eusertagrule", data)
+		if hid == "" {
+			if _id == "" {
+				data["i_createtime"] = createTime
+				data["i_updatetime"] = createTime
+				data["b_delete"] = false
+				_id = Mgo.Save("eusertagrule", data)
+			} else {
+				query := bson.M{
+					"_id": mongoutil.StringTOBsonId(_id),
+				}
+				rep = Mgo.Update("eusertagrule", query, bson.M{"$set": data}, false, false)
+			}
 		} else {
-			query := bson.M{
-				"_id": mongoutil.StringTOBsonId(_id),
+			if _id == "" {
+				data["i_createtime"] = createTime
+				data["i_updatetime"] = createTime
+				data["i_type"] = "historyData"
+				data["b_delete"] = true
+				_id = Mgo.Save("eusertagrule", data)
+				rep = AddHistoryLogTag(data, false, _id)
+			} else {
+				query := bson.M{
+					"_id": mongoutil.StringTOBsonId(_id),
+				}
+				reps := Mgo.Update("eusertagrule", query, bson.M{"$set": data}, false, false)
+				if reps {
+					rep = AddHistoryLogTag(data, true, _id)
+				}
 			}
-			rep = Mgo.Update("eusertagrule", query, bson.M{"$set": data}, false, false)
 		}
-
 		c.ServeJson(map[string]interface{}{
 			"id":  cid,
 			"rep": rep,
@@ -710,10 +730,10 @@ func (c *Customer) EuserTagEdit() {
 		cid := c.GetString("cid")
 		c.T["cid"] = cid
 		c.T["matchTypeMap"] = MatchTypeMap3
+		c.T["hid"] = c.GetString("hid")
 		c.Render("private/euser_tag_rule.html", &c.T)
 	}
 }
-
 func (c *Customer) EuserTag() {
 	defer qu.Catch()
 	if c.Method() == "POST" {
@@ -863,20 +883,17 @@ func (c *Customer) CustomerHistory() {
 	user := c.GetSession("user").(map[string]interface{})
 	query := bson.M{}
 	query["_id"] = mongoutil.StringTOBsonId(id)
-	data, _ := Mgo.FindOneByField("euser", query, `{}`)
-	depart, _ := Mgo.Find("euserdepart", bson.M{"s_userid": id, "b_delete": false}, nil, nil, false, -1, -1)
-	(*data)["_id"] = mongoutil.BsonIdToSId((*data)["_id"])
-	if (*data)["i_state"] == 1 {
-		tagRule, _ := Mgo.Find("eusertagrule", bson.M{"s_userid": id, "b_delete": false}, nil, nil, false, -1, -1)
-		c.T["tagrule"] = *tagRule
-	}
+
 	hid := c.GetString("hid")
 	history_id := ""
 	if hid != "" {
 		history_id = hid
 		hData, ok := Mgo.FindOne("historylog", bson.M{"_id": mongoutil.StringTOBsonId(history_id)})
 		if ok && hData != nil && len(*hData) > 0 {
-			// (*hData)["dep_rules"]
+			c.T["history_rule"] = (*hData)["dep_rules"]
+			c.T["tagrule"] = (*hData)["tag_rules"]
+			(*hData)["_id"] = id
+			c.T["data"] = *hData
 		}
 	} else {
 		history_id = Mgo.Save("historylog", map[string]interface{}{
@@ -886,10 +903,14 @@ func (c *Customer) CustomerHistory() {
 			"create_user": user["name"],
 			"state":       0,
 		})
-		c.T["data"] = *data
-		c.T["depart"] = *depart
+		c.Redirect("/service/customer/history?id=" + id + "&hid=" + history_id)
+		// c.T["depart"] = *depart
+		// if (*data)["i_state"] == 1 {
+		// 	tagRule, _ := Mgo.Find("eusertagrule", bson.M{"s_userid": id, "b_delete": false}, nil, nil, false, -1, -1)
+		// 	c.T["tagrule"] = *tagRule
+		// }
 	}
-
+	// c.T["data"] = *data
 	c.T["history_id"] = history_id
 	c.Render("private/customer_history.html", &c.T)
 }
@@ -910,7 +931,7 @@ func (c *Customer) CustomerAllRule() {
 	inc_rules := []map[string]interface{}{}
 	inc_rule := make(map[string]interface{})
 	inc_data, _ := Mgo.FindOne("historylog", inc_query)
-	if inc_data != nil && (len(*inc_data) != 0) {
+	if inc_data != nil && *inc_data != nil {
 		for _, t := range (*inc_data)["dep_rules"].([]interface{}) {
 			if !t.(map[string]interface{})["is_new"].(bool) {
 				inc_rule["id"] = t.(map[string]interface{})["_id"].(bson.ObjectId).Hex() //规则id
@@ -935,7 +956,7 @@ func (c *Customer) CustomerAllRule() {
 			}
 			history_rule_data["department_isuse"] = m["i_isuse"]
 			history_rule_data["depart_name"] = m["s_name"]
-			depart_rule_data, _ := Mgo.Find("cuserdepartrule", q, `{"i_createtime":-1}`, `{"s_tagname":1,"i_updatetime":1,"i_isuse":1,"_id":1}`, false, 0, 0)
+			depart_rule_data, _ := Mgo.Find("euserdepartrule", q, `{"i_createtime":-1}`, `{"s_tagname":1,"i_updatetime":1,"i_isuse":1,"_id":1}`, false, 0, 0)
 			if depart_rule_data != nil && len(*depart_rule_data) != 0 {
 				for _, j := range *depart_rule_data {
 					j["_id"] = j["_id"].(bson.ObjectId).Hex()
@@ -962,75 +983,72 @@ func (c *Customer) CustomerAllRule() {
 func (c *Customer) SaveHistoryRule() {
 	rules_id := c.GetString("rulesid")
 	history_id := c.GetString("hid")
-	userid := c.GetString("userid")
-	if userid != "" {
-		//user_rules := make(map[string]interface{})
+	// userid := c.GetString("userid")
+	if history_id != "" {
 		user_history, _ := Mgo.FindOne("historylog", map[string]interface{}{
 			"_id": mongoutil.StringTOBsonId(history_id),
 		})
-		if *user_history != nil && len(*user_history) != 0 {
+		if *user_history != nil && user_history != nil {
 			//获取私有标签
-			usertags := getTserTag(userid)
-			if _, ok := (*user_history)["dep_rules"]; ok {
-				dep_rules := (*user_history)["dep_rules"].([]interface{})
-				for _, m := range dep_rules {
-					if strings.Contains(rules_id, m.(map[string]interface{})["_id"].(bson.ObjectId).Hex()) {
-						continue
+			// usertags := getTserTag(userid)
+			if (*user_history)["dep_rules"] != nil {
+				dep_rules := qu.ObjArrToMapArr((*user_history)["dep_rules"].([]interface{}))
+				dep_new_rules := []map[string]interface{}{}
+				ruleMap := map[string]bool{}
+				if len(dep_rules) > 0 {
+					for _, r := range dep_rules {
+						dep_new_rules = append(dep_new_rules, r)
+						ruleMap[mongoutil.BsonIdToSId(r["_id"])] = true
 					}
-					rules_id_list := strings.Split(rules_id, ",")
-					for _, rule := range rules_id_list {
-						//dep_rule := make(map[string]interface{})
+				}
+				rules_id_list := strings.Split(rules_id, ",")
+				for _, rule := range rules_id_list {
+					if !ruleMap[rule] {
 						query := bson.M{
-							"_id":      bson.ObjectIdHex(rule),
+							"_id":      mongoutil.StringTOBsonId(rule),
 							"b_delete": false,
 						}
 						res, _ := Mgo.FindOne("euserdepartrule", query)
 						if res != nil && len(*res) != 0 {
 							//获取规则所属部门信息
 							department_info, _ := Mgo.FindOne("euserdepart", map[string]interface{}{
-								"_id":      bson.ObjectIdHex((*res)["s_departid"].(string)),
+								"_id":      mongoutil.StringTOBsonId((*res)["s_departid"].(string)),
 								"b_delete": false,
 							})
 							(*res)["is_new"] = false
 							(*res)["s_depart_name"] = (*department_info)["s_name"]
-							dep_rules = append(dep_rules, *res)
+							dep_new_rules = append(dep_new_rules, *res)
 						}
 					}
-					set := bson.M{
-						"$set": bson.M{
-							"dep_rules":  dep_rules,
-							"tag_rules":  usertags,
-							"updatetime": time.Now().Unix(),
-						},
-					}
-					isupdata := Mgo.Update("historylog", map[string]interface{}{
-						"user_id": userid,
-						"_id":     mongoutil.StringTOBsonId(history_id),
-					}, set, false, false)
-					if isupdata {
-						c.ServeJson(map[string]interface{}{
-							"status": "success",
-						})
-					} else {
-						c.ServeJson(map[string]interface{}{
-							"status": "fail",
-						})
-					}
-					return
 				}
+				set := bson.M{
+					"$set": bson.M{
+						"dep_rules": dep_new_rules,
+						// "tag_rules":  usertags,
+						"updatetime": time.Now().Unix(),
+					},
+				}
+				ok := Mgo.Update("historylog", map[string]interface{}{
+					"_id": mongoutil.StringTOBsonId(history_id),
+				}, set, false, false)
+				//log.Println("ok", ok)
+				c.ServeJson(map[string]interface{}{
+					"status": ok,
+				})
+				return
 			} else {
 				rules_id_list := strings.Split(rules_id, ",")
 				dep_rules := []map[string]interface{}{}
 				for _, rule := range rules_id_list {
 					query := bson.M{
-						"_id":      bson.ObjectIdHex(rule),
+						"_id":      mongoutil.StringTOBsonId(rule),
 						"b_delete": false,
 					}
 					res, _ := Mgo.FindOne("euserdepartrule", query)
-					if res != nil && len(*res) != 0 {
+					if res != nil && *res != nil {
 						//获取规则所属部门信息
 						department_info, _ := Mgo.FindOne("euserdepart", map[string]interface{}{
-							"_id":      bson.ObjectIdHex((*res)["s_departid"].(string)),
+							"_id":      mongoutil.StringTOBsonId((*res)["s_departid"].(string)),
 							"b_delete": false,
 						})
 						(*res)["is_new"] = false
@@ -1040,24 +1058,17 @@ func (c *Customer) SaveHistoryRule() {
 				}
 				set := bson.M{
 					"$set": bson.M{
-						"dep_rules":  dep_rules,
-						"tag_rules":  usertags,
+						"dep_rules": dep_rules,
+						// "tag_rules":  usertags,
 						"updatetime": time.Now().Unix(),
 					},
 				}
 				isupdata := Mgo.Update("historylog", map[string]interface{}{
-					"user_id": userid,
-					"_id":     mongoutil.StringTOBsonId(history_id),
+					"_id": mongoutil.StringTOBsonId(history_id),
 				}, set, false, false)
-				if isupdata {
-					c.ServeJson(map[string]interface{}{
-						"status": "success",
-					})
-				} else {
-					c.ServeJson(map[string]interface{}{
-						"status": "fail",
-					})
-				}
+				c.ServeJson(map[string]interface{}{
+					"status": isupdata,
+				})
 				return
 			}
 
@@ -1089,6 +1100,7 @@ func (c *Customer) HistoryRuleCreate() {
 		i_createtime := time.Now().Unix()
 		data["i_updatetime"] = i_createtime
 		data["s_updateuser"] = user["name"]
+		data["s_depart_name"] = data["departmentName"]
 		var rep = false
 		s_id := ""
 		if id == "" { //新建
@@ -1097,10 +1109,10 @@ func (c *Customer) HistoryRuleCreate() {
 				d_data := map[string]interface{}{
 					"i_isuse":      1,
 					"s_userid":     user_id,
-					"s_name":       data["departmentName"],
+					"s_name":       data["s_depart_name"],
 					"i_createtime": time.Now().Unix(),
 					"i_updatetime": time.Now().Unix(),
-					"b_delete":     false,
+					"b_delete":     true,
 					"i_type":       "historyData",
 				}
 				s_id = Mgo.Save("euserdepart", d_data)
@@ -1113,12 +1125,12 @@ func (c *Customer) HistoryRuleCreate() {
 			data["s_createuser"] = user["name"]
 			s_tagnamekey := gopinyin.Convert(qu.ObjToString(data["s_tagname"]), false)
 			data["s_tagnamekey"] = s_tagnamekey
-			data["b_delete"] = false
+			data["b_delete"] = true
 			data["s_dataid"] = qu.SE.EncodeString(fmt.Sprintf("%v", i_createtime) + s_tagnamekey + s_id)
 			data["i_type"] = "historyData"
 			id = Mgo.Save("euserdepartrule", data)
 			if id != "" {
-				rep = AddHistoryLog(data, false, id)
+				rep = AddHistoryLogDep(data, false, id)
 			} else {
 				rep = false
 			}
@@ -1128,7 +1140,7 @@ func (c *Customer) HistoryRuleCreate() {
 			}
 			reps := Mgo.Update("euserdepartrule", query, bson.M{"$set": data}, false, false)
 			if reps {
-				rep = AddHistoryLog(data, true, id)
+				rep = AddHistoryLogDep(data, true, id)
 			}
 		}
 
@@ -1164,31 +1176,29 @@ func (c *Customer) HistoryTagAssociated() {
 	userid := c.GetString("userid")
 	rule_id := c.GetString("_id")
 	tags := c.GetString("ids")
-	tags_id := strings.Split(tags, ",")
+	hid := c.GetString("hid")
 
 	if userid != "" {
 		user_info, _ := Mgo.FindOne("historylog", map[string]interface{}{
-			"user_id": userid,
+			"_id": mongoutil.StringTOBsonId(hid),
 		})
-		log.Println("tag_id", tags_id)
-		if user_info != nil {
+		if user_info != nil && *user_info != nil {
 			tagrules := (*user_info)["tag_rules"]
-			for _, m := range tagrules.([]interface{}) {
-				if m.(map[string]interface{})["_id"].(bson.ObjectId).Hex() == rule_id {
-					log.Println("&&")
-					m.(map[string]interface{})["o_departruleids"] = tags
+			if tagrules != nil {
+				tagrulesArr := qu.ObjArrToMapArr(tagrules.([]interface{}))
+				for _, m := range tagrulesArr {
+					if rule_id == mongoutil.BsonIdToSId(m["_id"]) {
+						m["o_departruleids"] = tags
+					}
 				}
-			}
-			set := bson.M{
-				"$set": bson.M{
-					"tag_rules": tagrules,
-				},
-			}
-			log.Println("set", set)
-			is_updata := Mgo.Update("historylog", map[string]interface{}{
-				"user_id": userid,
-			}, set, false, false)
-			if is_updata {
+				set := bson.M{
+					"$set": bson.M{
+						"tag_rules": tagrulesArr,
+					},
+				}
+				is_updata := Mgo.Update("historylog", map[string]interface{}{
+					"_id": mongoutil.StringTOBsonId(hid),
+				}, set, false, false)
 				c.ServeJson(map[string]interface{}{
 					"rep": is_updata,
 				})
@@ -1202,7 +1212,7 @@ func getTserTag(userid string) *[]map[string]interface{} {
 	return usertags
 }
 
-func AddHistoryLog(ruleData map[string]interface{}, isUpdate bool, id string) bool {
+func AddHistoryLogDep(ruleData map[string]interface{}, isUpdate bool, id string) bool {
 	history_id := mongoutil.StringTOBsonId(ruleData["history_id"].(string))
 	hData, ok := Mgo.FindOne("historylog", bson.M{"_id": history_id})
 	if ok && hData != nil && *hData != nil && len(*hData) > 0 {
@@ -1212,9 +1222,9 @@ func AddHistoryLog(ruleData map[string]interface{}, isUpdate bool, id string) bo
 		}
 		ruleData["is_new"] = true
 		if isUpdate {
-			for _, v := range dep_rules {
+			for k, v := range dep_rules {
 				if mongoutil.BsonIdToSId(v["_id"]) == id {
-					v = ruleData
+					dep_rules[k] = ruleData
 				}
 			}
 		} else {
@@ -1227,29 +1237,54 @@ func AddHistoryLog(ruleData map[string]interface{}, isUpdate bool, id string) bo
 
 }
 
+func AddHistoryLogTag(ruleData map[string]interface{}, isUpdate bool, id string) bool {
+	history_id := mongoutil.StringTOBsonId(qu.ObjToString(ruleData["hid"]))
+	hData, ok := Mgo.FindOne("historylog", bson.M{"_id": history_id})
+	if ok && hData != nil && *hData != nil && len(*hData) > 0 {
+		tag_rules := []map[string]interface{}{}
+		if (*hData)["tag_rules"] != nil {
+			tag_rules = qu.ObjArrToMapArr((*hData)["tag_rules"].([]interface{}))
+		}
+		ruleData["is_new"] = true
+		if isUpdate {
+			for k, v := range tag_rules {
+				if mongoutil.BsonIdToSId(v["_id"]) == id {
+					tag_rules[k] = ruleData
+				}
+			}
+		} else {
+			tag_rules = append(tag_rules, ruleData)
+		}
+		return Mgo.Update("historylog", bson.M{"_id": history_id}, bson.M{"$set": bson.M{"tag_rules": tag_rules}}, false, false)
+	} else {
+		return false
+	}
+
+}
+
 //历史任务删除私有标签
 func (c *Customer) HistoryTagDel() {
 	defer qu.Catch()
-	userid := c.GetString("userid")
+	// userid := c.GetString("userid")
 	tagid := c.GetString("tagid")
-	if userid != "" && tagid != "" {
-		user_info, _ := Mgo.FindOne("historylog", map[string]interface{}{"user_id": userid})
-		if user_info != nil && len(*user_info) != 0 {
-			user_tag_rules := (*user_info)["tag_rules"].([]interface{})
+	hid := c.GetString("hid")
+	user_info, _ := Mgo.FindOne("historylog", bson.M{"_id": mongoutil.StringTOBsonId(hid)})
+	if user_info != nil && *user_info != nil {
+		if (*user_info)["tag_rules"] != nil {
+			user_tag_rules := qu.ObjArrToMapArr((*user_info)["tag_rules"].([]interface{}))
+			ruleMap := map[string]bool{tagid: true}
+			ruleArr := []map[string]interface{}{}
 			for _, m := range user_tag_rules {
-				if m.(map[string]interface{})["_id"].(bson.ObjectId).Hex() == tagid {
-					m.(map[string]interface{})["b_delete"] = true
+				if !ruleMap[mongoutil.BsonIdToSId(m["_id"])] {
+					ruleArr = append(ruleArr, m)
 				}
 			}
-
-			is_updata := Mgo.Update("historylog", bson.M{"user_id": userid}, bson.M{"$set": bson.M{"tag_rules": user_tag_rules}}, false, false)
-			if is_updata {
-				c.ServeJson(map[string]interface{}{
-					"rep": true,
-				})
-			}
-			return
+			is_updata := Mgo.Update("historylog", bson.M{"_id": mongoutil.StringTOBsonId(hid)}, bson.M{"$set": bson.M{"tag_rules": ruleArr}}, false, false)
+			c.ServeJson(map[string]interface{}{
+				"rep": is_updata,
+			})
 		}
+		return
 	}
 	c.ServeJson(map[string]interface{}{
 		"rep": false,
@@ -1290,7 +1325,7 @@ func (c *Customer) Addhistoryrule() {
 	defer qu.Catch()
 	if c.Method() == "POST" {
 		his_id := c.GetString("history_id")
-		log.Println("hisid", his_id)
+		//log.Println("hisid", his_id)
 		if his_id != "" {
 			//newHistory["tag_rules"] = usertags
 			set := bson.M{
@@ -1304,14 +1339,14 @@ func (c *Customer) Addhistoryrule() {
 					"i_updatetime":   c.GetString("i_updatetime"),
 				},
 			}
-			isupdata := Mgo.UpdateById("historylog", his_id, set)
+			isupdata := Mgo.UpdateById("historylog", mongoutil.StringTOBsonId(his_id), set)
 			if isupdata {
 				c.ServeJson(map[string]interface{}{
 					"history_id": his_id,
 					"rep":        true,
 				})
 			} else {
-				log.Println(666)
+				//log.Println(666)
 				c.ServeJson(map[string]interface{}{
 					"history_id": "",
 					"rep":        false,

+ 2 - 4
src/service/feedback_service.go

@@ -1,14 +1,12 @@
 package service
 
 import (
+	"github.com/go-xweb/xweb"
+	"gopkg.in/mgo.v2/bson"
 	mongoutil "qfw/mongodb"
 	qu "qfw/util"
 	"strings"
-
 	. "util"
-
-	"github.com/go-xweb/xweb"
-	"gopkg.in/mgo.v2/bson"
 )
 
 type Feedback struct {

+ 5 - 3
src/util/config.go

@@ -31,9 +31,10 @@ var (
 	Itype           string
 	TaskTime        int64 //定时任务时间
 	//历史数据
-	SId          string
-	EId          string
-	CustomerName string
+	SId           string
+	EId           string
+	CustomerName  string
+	SaveColl_test string
 )
 
 var (
@@ -185,6 +186,7 @@ func initdb() {
 	//mgo save
 	save := Sysconfig["save"].(map[string]interface{})
 	SaveColl = qu.ObjToString(save["coll"])
+	SaveColl_test = qu.ObjToString(save["coll_test"])
 	MgoSave = &mgo.MongodbSim{
 		MongodbAddr: qu.ObjToString(save["addr"]),
 		DbName:      qu.ObjToString(save["db"]),

+ 100 - 31
src/web/templates/private/customer_history.html

@@ -108,7 +108,7 @@
                                             <a class="btn btn-default" onclick="showDepart()">新增</a>
                                             <a class="btn btn-default" onclick="select_Depart()">选择</a>
                                         </div>
-                                        <tr class="show-select" hidden>
+                                        <tr class="show-select">
                                             <th>编号</th>
                                             <th>部门名称</th>
                                             <th>规则名称</th>
@@ -131,7 +131,7 @@
                             <div class="box-header with-border">
                                 <i class="fa fa-bookmark"></i>
                                 <h3 class="box-title">私有标签</h3>
-                                <a class="btn btn-primary btn-sm" style="float: right;margin-top: 7px;margin-right: 10px" href="/service/euser/tag/edit?cid={{.T.data._id}}"><i class="fa fa-fw fa-file-code-o fa-lg"></i>新建标签</a>
+                                <a class="btn btn-primary btn-sm" style="float: right;margin-top: 7px;margin-right: 10px" href="/service/euser/tag/edit?cid={{.T.data._id}}&hid={{.T.history_id}}"><i class="fa fa-fw fa-file-code-o fa-lg"></i>新建标签</a>
                             </div>
                             <table id="tagrule" class="table table-bordered">
                                 <thead>
@@ -193,6 +193,43 @@
         </div>
     </div><!-- /.modal -->
 </div>
+<!-- 关联客户规则 -->
+<div class="modal fade" id="modal-associated" tabindex="-1" role="dialog" aria-hidden="true">
+    <div class="modal-dialog" style="width: 60%">
+        <div class="modal-content">
+            <div class="modal-header">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+                    <div class="edit-form">
+                        <div class="edit-info">
+                            <span class="glyphicon glyphicon-ok-sign" aria-hidden="true"></span>
+                            <span>关联客户规则</span>
+                        </div>
+                        <div class="content">
+                            <table id="cuserRule" class="table table-bordered">
+                                <thead>
+                                <tr>
+                                    <th>编号</th>
+                                    <th><input type="checkbox" id="selrow" onclick="allSelect(this)"/></th>
+                                    <th>规则名称</th>
+                                    <th>部门名称</th>
+                                    <th>创建时间</th>
+                                </tr>
+                                </thead>
+                                <tbody class="associated_rule"></tbody>
+                            </table>
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <input type="button" onclick="saveTagrule()" class="btn btn-primary saveBtn" value="保存">
+                    <input type="button" onclick="cancelModel()" class="btn btn-default" style="margin-left: 24px"
+                           value="取消">
+                </div>
+            </div>
+        </div>
+    </div><!-- /.modal -->
+</div>
 {{include "com/footer.html"}}
 <script>
     menuActive("/customer/list");
@@ -201,7 +238,41 @@
     var ruleArr = []
     var history_id = {{.T.history_id}}
     var selectIndex = [];               //选中的编号
-
+    var history_rule = {{.T.history_rule}};
+    var rules_id = new Array();
+    var selected_rules = [];
+    var c_id = getParam("id");
+    var hid = getParam("hid");
+    if (history_rule !== null){
+        if (history_rule.length>0){
+            html = "";
+            var num = 1;
+            for (var i=0;i<history_rule.length;i++){
+                var selected_rule = {};
+                selected_rule.department_name = history_rule[i].s_depart_name;
+                selected_rule.rule_name = history_rule[i].s_tagname;
+                selected_rule.update_time = formattime(history_rule[i].i_updatetime);
+                selected_rule.department_status = "已启用";
+                selected_rule.rule_status = "已启用";
+                // selected_rule.isinc = ;
+                selected_rule.create_time = formattime(history_rule[i].i_createtime);
+                selected_rule.rule_id = history_rule[i]._id;
+                rules_id.push(history_rule[i]._id);
+                selected_rules.push(selected_rule);
+            }
+            if (selected_rules.length>0){
+                $(".selected-rules").html(html);
+                for (var i=0;i<selected_rules.length;i++){
+                    html += '<tr><td>'+num+'</td><td>'+selected_rules[i].department_name+'</td><td>'+selected_rules[i].rule_name+'</td><td>'+selected_rules[i].update_time+'</td>'+'<td>'+selected_rules[i].department_status+'</td>'+'<td>'+selected_rules[i].rule_status+'</td>';
+                    // if (selected_rules[i].isinc == "true"){
+                    html += '<td><button class="btn btn-danger" onclick="del_selected_rule(\''+selected_rules[i].rule_id+'\')">删除</button></td>'
+                    num++
+                }
+            }
+            $(".selected-rules").append(html);
+        }
+    }
+    
     $(document).ready(function () {
         if (dataMap.i_state == 0) {
             $('.tab_2').hide()
@@ -267,13 +338,13 @@
                     }, width: "10%" },
                 {"data": "_id", width:"11%",render: function (val, a, row, pos) {
                         tmp = '<div>' +
-                            '<a class="btn btn-sm btn-primary" href="/service/euser/tag/edit?id='+val+'&cid='+row.s_userid+'">编辑</a>&nbsp&nbsp'+
+                            // '<a class="btn btn-sm btn-primary" href="/service/euser/tag/edit?id='+val+'&cid='+row.s_userid+'">编辑</a>&nbsp&nbsp'+
                             '<a class="btn btn-sm btn-danger" onclick="delTag(\''+val+'\')">删除</a>'+
                             '</div>';
                         return tmp
                     }},
                 {"data": "_id", width:"11%",render: function (val, a, row, pos) {
-                        var s = [val, row.s_userid]
+                        var s = [val, row.hid]
                         tmp = '<div>' +
                             '<a class="btn btn-sm btn-primary" onclick="associated(\''+s+'\')">关联数据范围</a>&nbsp&nbsp'+
                             '</div>';
@@ -345,13 +416,13 @@
     }
 
     function saveCuser() {
-        if (dataMap.i_state == 1) {
-            dataMap.i_pushmodel = $('#pushModelSelect option:selected').val()
-            dataMap.i_pushtype = $('#pushTypeSelect option:selected').val()
-        }
-        dataMap.id = dataMap._id
+        dataMap.send_mode = document.getElementById("pushModelSelect").selectedIndex;
+        dataMap.push_type = document.getElementById("pushTypeSelect").selectedIndex;
+        dataMap.expand_type = document.getElementById("expandSelect").selectedIndex;
+        dataMap.history_id = history_id;
+        dataMap.c_id = c_id;
         $.ajax({
-            url: "/service/customer/save",
+            url: "/service/rule/history/add",
             type: 'POST',
             data: dataMap,
             success: function (r) {
@@ -419,7 +490,7 @@
             $.ajax({
                 url: "/service/tag/history/del",
                 type: "post",
-                data: {"tagid": val,"userid":c_id},
+                data: {"tagid": val,"userid":c_id,"hid":history_id},
                 success: function (r) {
                     if (r.rep) {
                         window.location.reload()
@@ -441,14 +512,14 @@
                 html += '<tr><td>'+num+'</td><td><input type="checkbox" id="tag_id" onclick="getcheck(this)"/></td><td>'+selected_rules[i].rule_name+'</td><td>'+selected_rules[i].department_name+'</td><td>'+selected_rules[i].create_time+'</td><td hidden>'+selected_rules[i].rule_id+'</td>';
                 num++
             }
-            $(".historyCuserRule").html(html)
+            $(".associated_rule").html(html)
         }
         $('#modal-associated').modal("show")
     }
     function saveTagrule() {
         var tag_rulesids = new Array()
         _id = tagid.split(",")[0];
-        $(".historyCuserRule tr").each(function () {
+        $(".associated_rule tr").each(function () {
             var tagchk = $(this).find('td').eq(1).find("#tag_id");
             if (tagchk.hasClass('checked')){
                 var tag_ruleid = $(this).find('td').eq(5).text();
@@ -458,7 +529,7 @@
         $.ajax({
             url: "/service/euser/historytag/associated",
             type: "post",
-            data: {"_id": _id, "ids": tag_rulesids.join(","),"userid":c_id},
+            data: {"_id": _id, "ids": tag_rulesids.join(","),"userid":c_id,"hid":history_id},
             success: function (r) {
                 if (r.rep) {
                     // window.location.reload()
@@ -470,8 +541,7 @@
             }
         })
     }
-    var c_id = getParam("id")
-    var hid = getParam("hid")
+    
     function select_Depart() {
         //获取用户自定义规则
         $.ajax({
@@ -556,11 +626,10 @@
 
         return dates;
     }
-
-    var rules_id = new Array();
-    var selected_rules = new Array()
+    
     function saveHistoryRule(e) {
         var nowDate = new Date();
+        var idArr = [];
         $(".history_rules tr").each(function () {
             var chk = $(this).find('td').eq(0).find("#rule_id");
             if (chk.hasClass('checked')){
@@ -574,10 +643,11 @@
                     selected_rule.update_time = $(this).find('td').eq(4).text();
                     selected_rule.department_status = $(this).find('td').eq(5).text();
                     selected_rule.rule_status = $(this).find('td').eq(6).text();
-                    selected_rule.isinc = $(this).find('td').eq(8).text();
+                    // selected_rule.isinc = $(this).find('td').eq(8).text();
                     selected_rule.create_time = nowDate.getFullYear()+"-"+(nowDate.getMonth()+1)+"-"+nowDate.getDate()+" "+nowDate.getHours()+":"+nowDate.getMinutes()+":"+nowDate.getSeconds();
                     selected_rule.rule_id = rule_id
                     rules_id.push(rule_id);
+                    idArr.push(rule_id);
                     selected_rules.push(selected_rule)
                 }
 
@@ -586,29 +656,28 @@
         var num = 1
         var html = ""
         if (selected_rules.length>0){
+            $(".selected-rules").html(html);
             for (var i=0;i<selected_rules.length;i++){
                 html += '<tr><td>'+num+'</td><td>'+selected_rules[i].department_name+'</td><td>'+selected_rules[i].rule_name+'</td><td>'+selected_rules[i].update_time+'</td>'+'<td>'+selected_rules[i].department_status+'</td>'+'<td>'+selected_rules[i].rule_status+'</td>';
-                if (selected_rules[i].isinc == "true"){
-                    html += '<td><span onclick="del_selected_rule(\''+selected_rules[i].rule_id+'\')">删除</span></td>'
-                }else{
-                    html += "<td></td>"
-                }
+                // if (selected_rules[i].isinc == "true"){
+                html += '<td><button class="btn btn-danger" onclick="del_selected_rule(\''+selected_rules[i].rule_id+'\')">删除</button></td>'
+                // }else{
+                    // html += "<td></td>"
+                // }
                 num++
             }
         }
-        $(".show-select").show();
-        $(".selected-rules").html(html);
+        // $(".show-select").show();
+        $(".selected-rules").append(html);
         $("#modal-history").modal("hide");
         $.ajax({
             url:"/service/customer/history/saverule",
             type:"POST",
-            data:{'rulesid':rules_id.join(','),'userid':c_id,"hid":history_id},
+            data:{'rulesid':idArr.join(','),'userid':c_id,"hid":history_id},
             traditional:true,
             success:function (r) {
                 if (r.status == "success"){
 
-                }else{
-                    $("#modal-history").modal("hide");
                 }
             }
         })

+ 9 - 0
src/web/templates/private/euser_tag_rule.html

@@ -176,6 +176,7 @@
     var o_list = [];
     var matchCode = [];     //匹配方式code
     var matchName = [];     //匹配名字
+    var history_id = {{.T.hid}}
 
     //表单数据
     var dataMap = {
@@ -440,6 +441,10 @@
             }
         }
         dataMap["o_list"] = JSON.stringify(o_list);
+        dataMap["hid"] = history_id;
+        if(history_id !== ""){
+            dataMap["i_isuse"] = 1;
+        }
         $.ajax({
             url: "/service/euser/tag/edit",
             type: "post",
@@ -447,6 +452,10 @@
             success: function (r) {
                 if (r.rep && r.id) {
                     // showTip("保存成功", 1000);
+                    if(history_id !== ""){
+                        window.location.href = "/service/customer/history?id="+ r.id +"&hid="+ history_id; 
+                        return
+                    }
                     window.location.href = "/service/customer/edit?id=" + r.id
                 } else {
                     showTip("保存失败", 1000);

+ 20 - 4
src/web/templates/private/historylog_list.html

@@ -135,12 +135,11 @@
                     }
                 },
                 {
-                    "data": "_id", width:"11%",
+                    "data": "_id", width:"13%",
                     render: function (val, a, row) {
-                        console.log(a)
-                        console.log(row)
                         tmp = '<div>' +
                           '<a class="btn btn-sm btn-primary" href="/service/customer/history?id='+ row.user_id +'&hid='+ val +'">编辑</a>' +
+                          '<a style="margin-left:10px" class="btn btn-sm btn-info" eid="'+val+'" onclick="historyWork(this)">执行</a>' +
                           '</div>';
                         return tmp
                     }
@@ -151,5 +150,22 @@
         $("#addWork").on("click",function(){
             window.location.href = "/service/customer/history?id="+ {{.T.id}};
         })
-    });
+    });
+    
+    function historyWork(obj){
+        var ok = confirm("是否确定执行?");
+        if (ok){
+            var val = $(obj).attr("eid");
+            $(obj).removeClass("btn-info").addClass("btn-success");
+            $(obj).text("正在执行");
+            $.ajax({
+                url: "/service/history/"+ val,
+                type: 'POST',
+                error: function (r) {
+                    $(obj).removeClass("btn-success").addClass("btn-danger");
+                    $(obj).text("执行失败");
+                }
+            })
+        }
+    }
 </script>