Jianghan 5 éve
szülő
commit
2c24dc3d84

+ 3 - 7
src/config.json

@@ -13,12 +13,8 @@
   "elasticsearch_index": "bidding_v2",
   "elasticsearch_type": "bidding",
   "elasticPoolSize": 10,
-  "mail": {
-    "host": "smtp.exmail.qq.com",
-    "port": 465,
-    "user": "public03@topnet.net.cn",
-    "pwd": "ue9Rg9Sf4CVtdm5a",
-    "retry": 3,
-    "to": "wangjianghan@topnet.net.cn"
+  "jkmail": {
+    "to": "wangjianghan@topnet.net.cn",
+    "api": "http://10.171.112.160:19281/_send/_mail"
   }
 }

+ 5 - 1
src/models/tag.go

@@ -4,8 +4,11 @@ import "gopkg.in/mgo.v2/bson"
 
 type Tag struct {
 	Id                 bson.ObjectId `json:"_id" bson:"_id"`
+	Scustomer		   string		 `json:"s_customer" bson:"s_customer"`
+	Scustomerkey	   string		 `json:"s_customerkey" bson:"s_customerkey"`
 	Scustomername      string        `json:"s_customername" bson:"s_customername"`
 	Stagname           string        `json:"s_tagname" bson:"s_tagname"`
+	Stagnamekey        string		 `json:"s_tagnamekey" bson:"s_tagnamekey"`
 	Ssalesperson       string        `json:"s_salesperson" bson:"s_salesperson"`
 	Istarttime         int           `json:"i_starttime" bson:"i_starttime"`
 	Iendtime           int           `json:"i_endtime" bson:"i_endtime"`
@@ -32,8 +35,9 @@ type Tag struct {
 }
 type ORules struct {
 	Smatchkey      string `json:"s_matchkey"  bson:"s_matchkey"`
-	Saddkey        string `json:"s_addkey" bson:"s_addkey"`
 	Skeymatch      string `json:"s_keymatch" bson:"s_keymatch"`
+	Saddkey        string `json:"s_addkey" bson:"s_addkey"`
+	Saddkeymatch   string `json:"s_addkeymatch" bson:"s_addkeymatch"`
 	Snotkey        string `json:"s_notkey" bson:"s_notkey"`
 	Snotkeymatch   string `json:"s_notkeymatch" bson:"s_notkeymatch"`
 	Stopscopeclass string `json:"s_topscopeclass" bson:"s_topscopeclass"`

+ 1 - 1
src/service/feedback_service.go

@@ -29,7 +29,7 @@ func (f *Feedback) FeedbackList() {
 		query := bson.M{}
 		if search != "" {
 			query["$or"] = []interface{}{
-				bson.M{"s_customername": bson.M{"$regex": search}},
+				bson.M{"s_customer": bson.M{"$regex": search}},
 				bson.M{"s_tagname": bson.M{"$regex": search}},
 			}
 		}

+ 18 - 14
src/service/private_service.go

@@ -3,13 +3,14 @@ package service
 import (
 	"encoding/json"
 	"fmt"
+	"io/ioutil"
 	"log"
+	"net/http"
 	qu "qfw/util"
 	gm "qfw/util/mail"
 	"regexp"
 	"sort"
 	"strings"
-	"sync"
 	"time"
 	"unicode/utf8"
 	. "util"
@@ -24,8 +25,6 @@ var (
 	emailreg *regexp.Regexp = regexp.MustCompile(`\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}`)
 	pre      *regexp.Regexp = regexp.MustCompile("https://www.jianyu360.com/article/content/")
 	suf      *regexp.Regexp = regexp.MustCompile("(.html).*")
-
-	udptaskmap = &sync.Map{}
 )
 
 type Private struct {
@@ -43,7 +42,7 @@ func (f *Private) Keydatademo(world string) {
 		ctime := destr[:10]
 		ctimeint := qu.Int64All(ctime)
 		if time.Now().Sub(time.Unix(ctimeint, 0)).Hours()/24 < Subday {
-			tagfield, _ := Mgo.FindOneByField("tags", bson.M{"s_dataid": world}, bson.M{"i_extfieldstype": 1, "i_estotal": 1, "s_customername": 1})
+			tagfield, _ := Mgo.FindOneByField("tags", bson.M{"s_dataid": world}, bson.M{"i_extfieldstype": 1, "i_estotal": 1, "s_customer": 1})
 			if (*tagfield) != nil && len(*tagfield) > 0 {
 				if qu.Int64All((*tagfield)["i_extfieldstype"]) == Standard {
 					tmp["fieldtype"] = Standardstr
@@ -56,7 +55,7 @@ func (f *Private) Keydatademo(world string) {
 					return
 				}
 				tmp["total"] = qu.Int64All((*tagfield)["i_estotal"])
-				tmp["customername"] = qu.ObjToString((*tagfield)["s_customername"])
+				tmp["customername"] = qu.ObjToString((*tagfield)["s_customer"])
 				datas, _ := Mgo.Find("tagsdata", bson.M{"s_dataid": world}, `{"publishtime":-1}`, nil, false, -1, -1)
 				if (*datas) != nil && len(*datas) > 0 {
 					matchskey := make(map[string]bool)
@@ -145,7 +144,7 @@ func (f *Private) Keydataoption(world string) {
 			if nil != res && len(*res) > 0 {
 				feedback := make(map[string]interface{})
 				feedback["s_dataid"] = world
-				feedback["s_customername"] = (*res)["s_customername"]
+				feedback["s_customer"] = (*res)["s_customer"]
 				feedback["s_tagname"] = (*res)["s_tagname"]
 				feedback["s_opinion"] = tmp["option"]
 				feedback["i_num"] = len(tmp["urls"].([]interface{}))
@@ -199,7 +198,7 @@ func (f *Private) Keydataoption(world string) {
 				}
 				f.ServeJson(map[string]string{
 					"code": "1",
-					"err":  "保存成功",
+					"err":  "提交成功",
 				})
 				go sendMail(*res, qu.ObjToString(tmp["option"]))		//发送邮件
 				return
@@ -241,15 +240,20 @@ func deletefields(fieldnum int,data *map[string]interface{}) map[string]interfac
 }
 
 func sendMail(tag map[string]interface{}, option string) {
-	gmail = &gm.GmailAuth{
-		SmtpHost: qu.ObjToString(JkMail["host"]),
-		SmtpPort: qu.IntAll(JkMail["port"]),
-		User:     qu.ObjToString(JkMail["user"]),
-		Pwd:      qu.ObjToString(JkMail["pwd"]),
-	}
+	jkmail, _ := Sysconfig["jkmail"].(map[string]interface{})
 	title := "标签系统" + qu.ObjToString(tag["s_customername"]) + "反馈信息"
 	content := "客户姓名:" + qu.ObjToString(tag["s_customername"]) + "</br>" + "规则名称:" + qu.ObjToString(tag["s_tagname"]) + "</br>" +
 		"销售经理:" + qu.ObjToString("s_salesperson") + "</br>" + "反馈内容:" + option
-	gm.GSendMail("jy@jianyu360.cn", qu.ObjToString(JkMail["to"]), "", "", title, content, "", "", gmail)
+	if jkmail != nil {
+		tomail, _ := jkmail["to"].(string)
+		api, _ := jkmail["api"].(string)
+		log.Println("start send", tomail, Sysconfig["jkmail"])
+		res, err := http.Get(fmt.Sprintf("%s?to=%s&title=%s&body=%s", api, tomail, title, content))
+		if err == nil {
+			defer res.Body.Close()
+			read, err := ioutil.ReadAll(res.Body)
+			log.Println("邮件发送:", string(read), err)
+		}
+	}
 }
 

+ 7 - 4
src/service/rule_service.go

@@ -3,6 +3,7 @@ package service
 import (
 	"encoding/json"
 	"fmt"
+	"github.com/lauyoume/gopinyin"
 	"io"
 	"io/ioutil"
 	"net/http"
@@ -52,7 +53,7 @@ func (r *Rule) RuleList() {
 		}
 		if search != "" {
 			query["$or"] = []interface{}{
-				bson.M{"s_customername": bson.M{"$regex": search}},
+				bson.M{"s_customer": bson.M{"$regex": search}},
 				bson.M{"s_tagname": bson.M{"$regex": search}},
 			}
 		}
@@ -177,10 +178,12 @@ func (r *Rule) RuleSave() {
 		if id == "" { //新建
 			data["i_createtime"] = i_createtime
 			data["s_createuser"] = user["name"]
+			data["s_customerkey"] = gopinyin.Convert(qu.ObjToString(data["s_tagname"]), false)
+			data["s_tagnamekey"] = gopinyin.Convert(qu.ObjToString(data["s_tagname"]), false)
 			data["b_delete"] = false
-			s_customername := data["s_customername"].(string)
-			s_tagname := data["s_tagname"].(string)
-			data["s_dataid"] = qu.SE.EncodeString(fmt.Sprintf("%v", i_createtime) + s_customername + s_tagname)
+			s_customerkey := qu.ObjToString(data["s_customerkey"])
+			s_tagnamekey := qu.ObjToString(data["s_tagnamekey"])
+			data["s_dataid"] = qu.SE.EncodeString(fmt.Sprintf("%v", i_createtime) + s_customerkey + s_tagnamekey)
 		}
 		id, rep := updateDbXf(id, data) //保存tags
 		r.ServeJson(map[string]interface{}{

+ 0 - 2
src/util/config.go

@@ -13,7 +13,6 @@ var (
 	EsIndex, EsType string
 	MgoEnC          string
 	Subday          float64
-	JkMail			map[string]interface{}
 	PreviewHref string //数据预览地址
 )
 
@@ -49,7 +48,6 @@ func initMgoEn() {
 }
 
 func InitOther() {
-	JkMail, _ = Sysconfig["mail"].(map[string]interface{})
 	initCitys()
 	initInfoType()
 	initBuyerClass()

+ 10 - 0
src/util/util.go

@@ -33,3 +33,13 @@ func GetPostForm(r *http.Request) map[string]interface{} {
 	}
 	return val
 }
+
+//从数组中删除元素
+func deleteSlice(arr []string, v string) []string {
+	for k, v1 := range arr {
+		if v1 == v {
+			return append(arr[:k], arr[k+1:]...)
+		}
+	}
+	return arr
+}

+ 20 - 6
src/util/utiltag.go

@@ -8,6 +8,7 @@ import (
 	"models"
 	"qfw/util"
 	"qfw/util/elastic"
+	"regexp"
 	"strings"
 	"time"
 
@@ -95,7 +96,6 @@ func UtilEsFind(tags map[string]interface{}) (error, int64) {
 		for _, v := range searchResult.Hits.Hits {
 			item := make(map[string]interface{})
 			if json.Unmarshal(*v.Source, &item) == nil {
-				//log.Println(item)
 				delete(item,"_id")
 				item["info_id"] = v.Id
 				item["s_dataid"] = sdataid
@@ -105,9 +105,17 @@ func UtilEsFind(tags map[string]interface{}) (error, int64) {
 				for _, math := range maths {
 					fileds := strsToArr(math["s_keymatch"], "field")
 					d.AddWord(strings.Split(math["s_matchkey"], ",")...)
+					mkMap := make(map[string]interface{})
+					for _, mk := range strings.Split(math["s_matchkey"], ",") {
+						if b, _ := regexp.MatchString("[A-Z]", mk); b {
+							mkMap[strings.ToLower(mk)] = mk
+							d.AddWord(strings.ToLower(mk))
+						}
+					}
 					analyKeys := []string{}
 					for _, filed := range fileds {
-						ddds := d.Analy(util.ObjToString(item[filed]))
+						filed1 := strings.ToLower(util.ObjToString(item[filed]))
+						ddds := d.Analy(filed1)
 						analyKeys = append(analyKeys, ddds...)
 					}
 					if len(analyKeys) > 0 {
@@ -119,6 +127,12 @@ func UtilEsFind(tags map[string]interface{}) (error, int64) {
 						for k := range ssavekey {
 							ssavekeys = append(ssavekeys, k)
 						}
+						for k1, v1 := range mkMap {
+							if k1 != v1 {
+								ssavekeys = deleteSlice(ssavekeys, k1)
+								ssavekeys = append(ssavekeys, util.ObjToString(v1))
+							}
+						}
 						item["s_matchkey"] = strings.Join(ssavekeys, ",")
 						item["s_matchtype"] = strings.Join(fileds, ",")
 						break
@@ -322,12 +336,12 @@ func Utiltags(tag map[string]interface{}) string {
 					},
 				})
 			}
-
 			if len(tmpnewEsObject.Bool.Should) > 0 || len(tmpnewEsObject.Bool.Must) > 0 || len(tmpnewEsObject.Bool.MustNot) > 0 {
 				tmpses.Bool.Must = append(tmpses.Bool.Must, tmpnewEsObject)
 			}
+		}
+		if saddkeymatchs := strsToArr(v.Saddkeymatch, "str"); saddkeymatchs != nil {
 			addkeyarr := models.NewEsObject{}
-
 			for _, v := range strings.Split(v.Saddkey, ",") {
 				if v == "" {
 					continue
@@ -340,7 +354,7 @@ func Utiltags(tag map[string]interface{}) string {
 							MultiMatch: &models.MultiMatch{
 								Query:  vv,
 								Type:   MultiMatchType,
-								Fields: skeymatchs,
+								Fields: saddkeymatchs,
 							},
 						})
 					}
@@ -350,7 +364,7 @@ func Utiltags(tag map[string]interface{}) string {
 						MultiMatch: &models.MultiMatch{
 							Query:  v,
 							Type:   MultiMatchType,
-							Fields: skeymatchs,
+							Fields: saddkeymatchs,
 						},
 					})
 				}

+ 0 - 1
src/web/res/js/com.js

@@ -104,7 +104,6 @@ com.pushArry=function(arr1,arr2){
 com.maskShow=function(title){
 	var change=function(){
 		if(title){
-			console.log($("#maskTitle"));
 			$("#maskTitle").text(title);
 		}else{
 			$("#maskTitle").text("加载中");

+ 1 - 0
src/web/templates/com/header.html

@@ -179,6 +179,7 @@
 									<th rowspan="2">公告内容</th>
 									<th rowspan="2">发布时间</th>
 									<th rowspan="2">公告地址</th>
+									<th rowspan="2">项目编号</th>
 									<th rowspan="2">项目名称</th>
 									<th rowspan="2">项目范围</th>
 									<th rowspan="2">预算金额<br>(万元)</th>

+ 2 - 2
src/web/templates/private/feedback_detail.html

@@ -26,7 +26,7 @@
                                 <label class="col-sm-1 control-label">客户名称</label>
                                 <div class="col-sm-3">
                                     <input type="text" class="form-control" id="username"
-                                           value={{.T.data.s_customername}}>
+                                           value={{.T.data.s_customer}}>
                                 </div>
                                 <label class="col-sm-1 control-label">规则名称</label>
                                 <div class="col-sm-3">
@@ -100,7 +100,7 @@
                 {"data": "s_purchasing"},
                 {"data": function (row) {
 						if (row.s_jyhref != undefined) {
-							var shref = row.href;
+							var shref = row.s_jyhref;
 							tmp = '<a class="" target="_blank" href='+shref+'>剑鱼地址</a>';
 							return tmp
 						}else {

+ 3 - 5
src/web/templates/private/feedback_list.html

@@ -60,19 +60,17 @@
                 "url": "/dist/js/dataTables.chinese.lang"
             },
             "columns": [
-                {"data": "s_customername"},
+                {"data": "s_customer"},
                 {"data": "s_tagname"},
                 {"data": "s_opinion"},
                 {"data": "i_num"},
-                {
-                    "data": "l_feedbacktime", render: function (val) {
+                {"data": "l_feedbacktime", render: function (val) {
                         var dt = new Date()
                         dt.setTime(parseInt(val) * 1000)
                         return dt.format("yyyy-MM-dd hh:mm:ss")
                     }
                 },
-                {
-                    "data": "_id", "width": "25%", render: function (val, a, row, pos) {
+                {"data": "_id", "width": "25%", render: function (val, a, row, pos) {
                         if (row.b_tagdel) {
                             tmp = '<div>' +
                                 '<a class="btn btn-sm btn-primary" disabled="true" href="javascript:return false;">编辑规则</a> ' +

+ 142 - 98
src/web/templates/private/rule_create.html

@@ -45,22 +45,34 @@
                                 </div>
                                 <div class="box-body">
                                     <div class="form-group">
-                                        <label class="col-sm-2 control-label">客户名称</label>
+                                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>客户名称</label>
                                         <div class="col-sm-3">
-                                            <input type="text" class="form-control radio-" id="cusName"
-                                                   placeholder="客户名称" value="" required="required">
+                                            <input type="text" class="form-control" id="customer"
+                                                   placeholder="客户名称" required>
                                         </div>
-                                        <label class="col-sm-2 control-label">规则名称</label>
+                                        <label class="col-sm-2 control-label">客户联系人</label>
                                         <div class="col-sm-3">
-                                            <input type="text" class="form-control" id="tagName" placeholder="规则名称"
-                                                   value="" required="required">
+                                            <input type="text" class="form-control" id="customername" placeholder="客户联系人姓名"
+                                                   value="">
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>销售经理</label>
+                                        <div class="col-sm-3">
+                                            <input type="text" class="form-control" id="salename" placeholder="销售经理"
+                                                   value="">
+                                        </div>
+                                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>售前支持</label>
+                                        <div class="col-sm-3">
+                                            <input type="text" class="form-control" id="serverperson" placeholder="售前支持人员"
+                                                   value="">
                                         </div>
                                     </div>
                                     <div class="form-group">
-                                        <label class="col-sm-2 control-label">销售经理</label>
+                                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>规则名称</label>
                                         <div class="col-sm-3">
-                                            <input type="text" class="form-control" id="saleName" placeholder="销售经理"
-                                                   value="" required="required">
+                                            <input type="text" class="form-control" id="tagname" placeholder="规则名称"
+                                                   value="" required>
                                         </div>
                                     </div>
                                     <hr>
@@ -306,6 +318,7 @@
                                 </h3>
                                 <div style="float: right">
                                     <a class="btn btn-default btn-sm" onclick="selectKeyMatch()">关键词匹配方式</a>
+                                    <a class="btn btn-default btn-sm" onclick="selectAddMatch()">附加词匹配方式</a>
                                     <a class="btn btn-default btn-sm" onclick="selectNotMatch()">排除词匹配方式</a>
                                     <a class="btn btn-default btn-sm" onclick="selectBuyer()">采购单位行业</a>
                                     <a class="btn btn-default btn-sm" onclick="selectScope()">公告行业</a>
@@ -317,6 +330,7 @@
                                     <th>编号</th>
                                     <th><input type="checkbox" onclick="allSelect(this)" id="allCheckbox"></th>
                                     <th>关键词</th>
+                                    <th>匹配方式</th>
                                     <th>附加词</th>
                                     <th>匹配方式</th>
                                     <th>排除词</th>
@@ -350,10 +364,8 @@
     var buyerClass = {{.T.buyerClass}};
     var scopeClass = {{.T.scopeClass}};
 
-    var matchCode1 = [];     //匹配方式code
-    var matchName1 = [];     //匹配名字
-    var matchCode2 = [];     //匹配方式code
-    var matchName2 = [];     //匹配名字
+    var matchCode = [];     //匹配方式code
+    var matchName = [];     //匹配名字
     var buyerArr = [];      //采购单位
     var scopeTopArr = [];       //公告行业一级
     var scopeSubArr = [];       //公告行业二级
@@ -369,9 +381,11 @@
     //表单数据
     var dataMap = {
         "id": "",
-        "s_customername": "",
+        "s_customer": "",
         "s_tagname": "",
         "s_salesperson": "",
+        "s_customername": "",
+        "s_servername": "",
         "s_area": "",
         "s_city": "",
         "s_district": "",
@@ -494,35 +508,34 @@
                 });
             },
             "columns": [
-                {"data": null, width: "1.5%"},
+                {"data": null, width: "2%"},
                 {"data": "", width: "1%", render: function() {
                         return `<input type="checkbox" name="ckb-keyid" onclick="singleSelect(this)" style="text-align: center">`
                     }},
-                {"data": "s_matchkey", width: "17%"},
-                {"data": "s_addkey", width: "5%", render: function (val) {
-                        if (val == undefined) {
-                            val = ""
-                        }
-                        return val
-                    }},
-                {"data": "s_globaladdkeymatch", width: "5%", render: function(val) {
-                        if (val == undefined) {
-                            val = ""
+                {"data": "s_matchkey", width: "10%"},
+                {"data": function (row) {
+                        if (row.s_keymatch != undefined) {
+                            return row.s_keymatch
+                        }else {
+                            return ""
                         }
-                        return val
-                    }},
-                {"data": "s_notkey", width: "5%", render: function (val) {
-                        if (val == undefined) {
-                            val = ""
+                    }, width: "5%"},
+                {"data": "s_addkey", width: "10%"},
+                {"data": function (row) {
+                        if (row.s_addkeymatch != undefined) {
+                            return row.s_addkeymatch
+                        }else {
+                            return ""
                         }
-                        return val
-                    }},
-                {"data": "s_globaladdkeymatch", width: "5%", render: function (val) {
-                        if (val == undefined) {
-                            val = ""
+                    }, width: "5%"},
+                {"data": "s_notkey", width: "10%"},
+                {"data": function (row) {
+                        if (row.s_notkeymatch != undefined) {
+                            return row.s_notkeymatch
+                        }else {
+                            return ""
                         }
-                        return val
-                    }},
+                    }, width: "5%"},
                 {"data": "s_buyerclass", width: "5%", render: function (val) {
                         if (val == undefined) {
                             val = ""
@@ -535,7 +548,41 @@
                         }
                         return val
                     }},
-            ]
+            ],
+            "columnDefs": [{
+                "targets": [2],
+                "render": function (data, type, full, meta) {
+                    if (data && data.length > 24) {
+                        return "<a title='" + data + "' href='#' style='text-decoration: none;'>" + data.trim().substr(0, 24) + "..." + "</a>";
+                    }else if (data == undefined) {
+                        return ""
+                    }else {
+                        return data
+                    }
+                }
+            }, {
+                "targets": [4],
+                "render": function (data, type, full, meta) {
+                    if (data && data.length > 24) {
+                        return "<a title='" + data + "' href='#' style='text-decoration: none;'>" + data.trim().substr(0, 24) + "..." + "</a>";
+                    }else if (data == undefined) {
+                        return ""
+                    }else {
+                        return data
+                    }
+                }
+            }, {
+                "targets": [6],
+                "render": function (data, type, full, meta) {
+                    if (data && data.length > 24) {
+                        return "<a title='" + data + "' href='#' style='text-decoration: none;'>" + data.trim().substr(0, 24) + "..." + "</a>";
+                    }else if (data == undefined) {
+                        return ""
+                    }else {
+                        return data
+                    }
+                }
+            }]
         });
     });
 
@@ -577,7 +624,20 @@
     //关键词匹配方式modal
     function selectKeyMatch() {
         if (keyTableChecked) {
-            setValue = 5;
+            setValue = 4;
+            matchCode.length = 0;
+            matchName.length = 0;
+            $('#modal-select-match').modal("show");
+        }else {
+            alert("请选中关键词")
+        }
+    }
+    //附加词匹配方式
+    function selectAddMatch() {
+        if (keyTableChecked) {
+            setValue = 6;
+            matchCode.length = 0;
+            matchName.length = 0;
             $('#modal-select-match').modal("show");
         }else {
             alert("请选中关键词")
@@ -586,7 +646,9 @@
     //排除词匹配方式modal
     function selectNotMatch() {
         if (keyTableChecked) {
-            setValue = 7;
+            setValue = 8;
+            matchCode.length = 0;
+            matchName.length = 0;
             $('#modal-select-match').modal("show");
         }else {
             alert("请选中关键词")
@@ -595,23 +657,13 @@
     //匹配方式按钮点击事件
     function clickMatchBtn(obj) {
         if ($(obj).hasClass("active-btn-match")) {
-            $(obj).removeClass("active-btn-match")
-            if (setValue == 5) {
-                matchCode1.splice($.inArray($(obj).attr("code"), matchCode1), 1);
-                matchName1.splice($.inArray($(obj).val(), matchName1), 1)
-            }else {
-                matchCode2.splice($.inArray($(obj).attr("code"), matchCode2), 1);
-                matchName2.splice($.inArray($(obj).val(), matchName2), 1)
-            }
+            $(obj).removeClass("active-btn-match");
+            matchCode.splice($.inArray($(obj).attr("code"), matchCode), 1);
+            matchName.splice($.inArray($(obj).val(), matchName), 1)
         } else {
             $(obj).addClass("active-btn-match");
-            if (setValue == 5) {
-                matchCode1.push($(obj).attr("code"));
-                matchName1.push($(obj).val())
-            }else {
-                matchCode2.push($(obj).attr("code"));
-                matchName2.push($(obj).val())
-            }
+            matchCode.push($(obj).attr("code"));
+            matchName.push($(obj).val())
         }
     }
     //匹配方式保存
@@ -621,53 +673,40 @@
         });
         var matchNameStr = "";
         var codeStr = "";
-        if (setValue == 5) {
-            for (var i in matchName1) {
-                if (matchNameStr == "") {
-                    matchNameStr = matchName1[i];
-                }else {
-                    matchNameStr += "," + matchName1[i]
-                }
-                if (codeStr == "") {
-                    codeStr = matchCode1[i]
-                }else {
-                    codeStr = codeStr + "," + matchCode1[i]
-                }
+        for (var i in matchName) {
+            if (matchNameStr == "") {
+                matchNameStr = matchName[i];
+            }else {
+                matchNameStr += "," + matchName[i]
             }
-        }else if (setValue == 7) {
-            for (var i in matchName2) {
-                if (matchNameStr == "") {
-                    matchNameStr = matchName2[i];
-                }else {
-                    matchNameStr += "," + matchName2[i]
-                }
-                if (codeStr == "") {
-                    codeStr = matchCode2[i]
-                }else {
-                    codeStr = codeStr + "," + matchCode2[i]
-                }
+            if (codeStr == "") {
+                codeStr = matchCode[i]
+            }else {
+                codeStr = codeStr + "," + matchCode[i]
             }
         }
         for (var i in selectIndex) {
             var j = selectIndex[i] - 1;
-            if (setValue == 5) {
-                if ($("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child(3)").text() != "" ||
-                    $("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child(4)").text() != "") {
+            if (setValue == 4) {
+                if ($("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child(3)").text() != "") {
                     $("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child("+setValue+")").html(matchNameStr);
                     o_rules[j]["s_keymatch"] = codeStr;
                 }
-            }else if (setValue == 7) {
-                if ($("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child(6)").text() != "") {
+            }else if (setValue == 6) {
+                if ($("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child(5)").text() != "") {
+                    $("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child("+setValue+")").html(matchNameStr);
+                    o_rules[j]["s_addkeymatch"] = codeStr;
+                }
+            } else if (setValue == 8) {
+                if ($("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child(7)").text() != "") {
                     $("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child("+setValue+")").html(matchNameStr);
                     o_rules[j]["s_notkeymatch"] = codeStr;
                 }
             }
         }
         $('#modal-select-match').modal("hide");
-        matchName1.length = 0;
-        matchCode1.length = 0;
-        matchName2.length = 0;
-        matchCode2.length = 0;
+        matchName.length = 0;
+        matchCode.length = 0;
     }
     //采购单位modal
     function selectBuyer() {
@@ -703,7 +742,7 @@
         for (var i in selectIndex) {
             var j = selectIndex[i] - 1;
             //采购单位
-            $("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child("+setValue+")").html(buyerStr);
+            $("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child(9)").html(buyerStr);
             o_rules[j]["s_buyerclass"] = buyerStr;
         }
         $('#modal-select-buyer').modal("hide");
@@ -777,7 +816,7 @@
         }
         for (var i in selectIndex) {
             var j = selectIndex[i] - 1;
-            $("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child(9)").html(scopeStr);
+            $("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child(10)").html(scopeStr);
             o_rules[j]["s_topscopeclass"] = topStr;
             o_rules[j]["s_subscopeclass"] = subStr;
         }
@@ -837,19 +876,17 @@
     }
     //保存规则
     function saveTag() {
-        dataMap["s_customername"] = $('#cusName').val();
-        dataMap["s_tagname"] = $('#tagName').val();
-        dataMap["s_salesperson"] = $('#saleName').val();
+        dataMap["s_customer"] = $('#customer').val();
+        dataMap["s_tagname"] = $('#tagname').val();
+        dataMap["s_salesperson"] = $('#salename').val();
+        dataMap["s_serverperson"] = $("#serverperson").val();
+        dataMap["s_customername"] = $("#customername").val();
         dataMap["s_globaladdkey"] = $('#g_addkey').val();
         dataMap["s_globalnotkey"] = $('#g_notkey').val();
-        if (dataMap["s_customername"] == "" || dataMap["s_tagname"] == "" || dataMap["s_salesperson"] == "") {
+        if (dataMap["s_customer"] == "" || dataMap["s_tagname"] == "" || dataMap["s_salesperson"] == "" || dataMap["s_serverperson"] == "") {
             alert("请填写必须字段!")
             return
         }
-        // if (o_rules.length == 0) {
-        //     alert("请导入关键字!");
-        //     return
-        // }
         if ($('#starttime').find("input").val() != "") {
             var start = $('#starttime').find("input").val();
             start = new Date(start).getTime() / 1000;
@@ -1030,6 +1067,13 @@
                                 return ""
                             }
                         }, width: "5%"},
+                    {"data": function (row) {
+                            if (row.projectcode != undefined) {
+                                return row.projectcode
+                            }else {
+                                return ""
+                            }
+                        }, width: "5%"},
                     {"data": "projectname", width: "5%"},
                     {"data": function (row) {
                             if (row.projectscope != undefined) {

+ 179 - 185
src/web/templates/private/rule_edit.html

@@ -54,22 +54,34 @@
                                 </div>
                                 <div class="box-body">
                                     <div class="form-group">
-                                        <label class="col-sm-2 control-label">客户名称</label>
+                                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>客户名称</label>
                                         <div class="col-sm-3">
-                                            <input type="text" class="form-control radio-" id="cusName"
-                                                   placeholder="客户名称" value="{{.T.data.s_customername}}" disabled>
+                                            <input type="text" class="form-control" id="customer"
+                                                   placeholder="客户名称" value="{{.T.data.s_customer}}">
                                         </div>
-                                        <label class="col-sm-2 control-label">规则名称</label>
+                                        <label class="col-sm-2 control-label">客户联系人</label>
                                         <div class="col-sm-3">
-                                            <input type="text" class="form-control" id="tagName" placeholder="规则名称"
-                                                   value="{{.T.data.s_tagname}}" disabled>
+                                            <input type="text" class="form-control" id="customername" placeholder="客户联系人姓名"
+                                                   value="{{.T.data.s_customername}}">
                                         </div>
                                     </div>
                                     <div class="form-group">
-                                        <label class="col-sm-2 control-label">销售经理</label>
+                                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>销售经理</label>
                                         <div class="col-sm-3">
-                                            <input type="text" class="form-control" id="saleName" placeholder="销售经理"
-                                                   value="{{.T.data.s_salesperson}}" disabled>
+                                            <input type="text" class="form-control" id="salename" placeholder="销售经理"
+                                                   value="{{.T.data.s_salesperson}}">
+                                        </div>
+                                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>售前支持</label>
+                                        <div class="col-sm-3">
+                                            <input type="text" class="form-control" id="serverperson" placeholder="售前支持人员"
+                                                   value="{{.T.data.s_serverperson}}">
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>规则名称</label>
+                                        <div class="col-sm-3">
+                                            <input type="text" class="form-control" id="tagname" placeholder="规则名称"
+                                                   value="{{.T.data.s_tagname}}">
                                         </div>
                                     </div>
                                     <hr>
@@ -188,7 +200,6 @@
                                                     </wui-date>
                                                 </div>
                                             </div>
-                                            <!-- <input type="text" class="form-control" name="starttime" id="starttime" placeholder="开始时间" value="">-->
                                         </div>
                                         <label class="col-sm-2 control-label ">结束时间</label>
                                         <div class="col-sm-3">
@@ -318,6 +329,7 @@
                                 </h3>
                                 <div style="float: right">
                                     <a class="btn btn-default btn-sm" onclick="selectKeyMatch()">关键词匹配方式</a>
+                                    <a class="btn btn-default btn-sm" onclick="selectAddMatch()">附加词匹配方式</a>
                                     <a class="btn btn-default btn-sm" onclick="selectNotMatch()">排除词匹配方式</a>
                                     <a class="btn btn-default btn-sm" onclick="selectBuyer()">采购单位行业</a>
                                     <a class="btn btn-default btn-sm" onclick="selectScope()">公告行业</a>
@@ -329,6 +341,7 @@
                                     <th>编号</th>
                                     <th><input type="checkbox" onclick="allSelect(this)" id="allCheckbox"></th>
                                     <th>关键词</th>
+                                    <th>匹配方式</th>
                                     <th>附加词</th>
                                     <th>匹配方式</th>
                                     <th>排除词</th>
@@ -363,10 +376,8 @@
     var buyerClass = {{.T.buyerClass}};
     var scopeClass = {{.T.scopeClass}};
 
-    var matchCode1 = [];     //匹配方式code
-    var matchName1 = [];     //匹配名字
-    var matchCode2 = [];     //匹配方式code
-    var matchName2 = [];     //匹配名字
+    var matchCode = [];     //匹配方式code
+    var matchName = [];     //匹配名字
     var buyerArr = [];      //采购单位
     var scopeTopArr = [];       //公告行业一级
     var scopeSubArr = [];       //公告行业二级
@@ -519,25 +530,14 @@
                     cell.innerHTML = i + 1;
                 });
             },
-            "data": o_rules,
+            "data": dataMap.o_rules,
             "columns": [
-                {"data": null, width: "1.5%"},
-                {
-                    "data": function () {
+                {"data": null, width: "2%"},
+                {"data": "", width: "1%", render: function() {
                         return `<input type="checkbox" name="ckb-keyid" onclick="singleSelect(this)" style="text-align: center">`
-                    }, width: "1%"
-                },
-                {"data": "s_matchkey", width: "17%"},
-                {
-                    "data": "s_addkey", width: "5%", render: function (val) {
-                        if (val == undefined) {
-                            val = ""
-                        }
-                        return val
-                    }
-                },
-                {
-                    "data": function (row) {
+                    }},
+                {"data": "s_matchkey", width: "10%"},
+                {"data": function (row) {
                         var str = row.s_keymatch;
                         if (str != undefined && str != "") {
                             var s = "";
@@ -553,19 +553,27 @@
                             return s
                         }
                         return ""
-                    }, width: "5%"
-                },
-                {
-                    "data": function (row) {
-                        if (row.s_notkey != undefined) {
-                            return row.s_notkey
-                        } else {
-                            return ""
+                    }, width: "5%"},
+                {"data": "s_addkey", width: "10%"},
+                {"data": function (row) {
+                        var str = row.s_addkeymatch;
+                        if (str != undefined && str != "") {
+                            var s = "";
+                            for (var i in matchTypeMap) {
+                                if (str.indexOf(matchTypeMap[i]["code"]) != -1) {
+                                    if (s == "") {
+                                        s = matchTypeMap[i]["name"]
+                                    } else {
+                                        s = s + "," + matchTypeMap[i]["name"]
+                                    }
+                                }
+                            }
+                            return s
                         }
-                    }, width: "5%"
-                },
-                {
-                    "data": function (row) {
+                        return ""
+                    }, width: "5%"},
+                {"data": "s_notkey", width: "10%"},
+                {"data": function (row) {
                         var str = row.s_notkeymatch;
                         if (str != undefined && str != "") {
                             var s = "";
@@ -581,36 +589,54 @@
                             return s
                         }
                         return ""
-                    }, width: "5%"
-                },
-                {
-                    "data": function (row) {
-                        if (row.s_buyerclass != undefined) {
-                            return row.s_buyerclass
-                        } else {
-                            return ""
-                        }
-                    }, width: "5%"
-                },
-                {
-                    "data": function (row) {
-                        var top = row.s_topscopeclass;
-                        var sub = row.s_subscopeclass;
-                        var str = "";
-                        if (top != undefined) {
-                            str = top
+                    }, width: "5%"},
+                {"data": "s_buyerclass", width: "5%", render: function (val) {
+                        if (val == undefined) {
+                            val = ""
                         }
-                        if (sub != undefined && sub != "") {
-                            if (str == "") {
-                                str = sub
-                            } else {
-                                str = str + "," + sub
-                            }
+                        return val
+                    }},
+                {"data": "s_topscopeclass", width: "5%", render: function (val) {
+                        if (val == undefined) {
+                            val = ""
                         }
-                        return str
-                    }, width: "5%"
-                },
-            ]
+                        return val
+                    }},
+            ],
+            "columnDefs": [{
+                "targets": [2],
+                "render": function (data, type, full, meta) {
+                    if (data && data.length > 24) {
+                        return "<a title='" + data + "' href='#' style='text-decoration: none;'>" + data.trim().substr(0, 24) + "..." + "</a>";
+                    }else if (data == undefined) {
+                        return ""
+                    }else {
+                        return data
+                    }
+                }
+            }, {
+                "targets": [4],
+                "render": function (data, type, full, meta) {
+                    if (data && data.length > 24) {
+                        return "<a title='" + data + "' href='#' style='text-decoration: none;'>" + data.trim().substr(0, 24) + "..." + "</a>";
+                    }else if (data == undefined) {
+                        return ""
+                    }else {
+                        return data
+                    }
+                }
+            }, {
+                "targets": [6],
+                "render": function (data, type, full, meta) {
+                    if (data && data.length > 24) {
+                        return "<a title='" + data + "' href='#' style='text-decoration: none;'>" + data.trim().substr(0, 24) + "..." + "</a>";
+                    }else if (data == undefined) {
+                        return ""
+                    }else {
+                        return data
+                    }
+                }
+            }]
         });
     });
 
@@ -679,17 +705,31 @@
     //关键词匹配方式modal
     function selectKeyMatch() {
         if (keyTableChecked) {
-            setValue = 5;
+            setValue = 4;
+            matchCode.length = 0;
+            matchName.length = 0;
             $('#modal-select-match').modal("show");
         } else {
             alert("请选中关键词")
         }
     }
-
+    //附加词匹配方式
+    function selectAddMatch() {
+        if (keyTableChecked) {
+            setValue = 6;
+            matchCode.length = 0;
+            matchName.length = 0;
+            $('#modal-select-match').modal("show");
+        }else {
+            alert("请选中关键词")
+        }
+    }
     //排除词匹配方式modal
     function selectNotMatch() {
         if (keyTableChecked) {
-            setValue = 7;
+            setValue = 8;
+            matchCode.length = 0;
+            matchName.length = 0;
             $('#modal-select-match').modal("show");
         } else {
             alert("请选中关键词")
@@ -700,22 +740,12 @@
     function clickMatchBtn(obj) {
         if ($(obj).hasClass("active-btn-match")) {
             $(obj).removeClass("active-btn-match")
-            if (setValue == 5) {
-                matchCode1.splice($.inArray($(obj).attr("code"), matchCode), 1);
-                matchName1.splice($.inArray($(obj).val(), matchName), 1)
-            } else {
-                matchCode2.splice($.inArray($(obj).attr("code"), matchCode), 1);
-                matchName2.splice($.inArray($(obj).val(), matchName), 1)
-            }
+            matchCode.splice($.inArray($(obj).attr("code"), matchCode), 1);
+            matchName.splice($.inArray($(obj).val(), matchName), 1)
         } else {
             $(obj).addClass("active-btn-match");
-            if (setValue == 5) {
-                matchCode1.push($(obj).attr("code"));
-                matchName1.push($(obj).val())
-            } else {
-                matchCode2.push($(obj).attr("code"));
-                matchName2.push($(obj).val())
-            }
+            matchCode.push($(obj).attr("code"));
+            matchName.push($(obj).val())
         }
     }
 
@@ -727,44 +757,33 @@
         $('#modal-select-match').modal("hide");
         var matchNameStr = "";
         var codeStr = "";
-        if (setValue == 5) {
-            for (var i in matchName1) {
-                if (matchNameStr == "") {
-                    matchNameStr = matchName1[i];
-                } else {
-                    matchNameStr += "," + matchName1[i]
-                }
-                if (codeStr == "") {
-                    codeStr = matchCode1[i]
-                } else {
-                    codeStr = codeStr + "," + matchCode1[i]
-                }
+        for (var i in matchName) {
+            if (matchNameStr == "") {
+                matchNameStr = matchName[i];
+            } else {
+                matchNameStr += "," + matchName[i]
             }
-        } else if (setValue == 7) {
-            for (var i in matchName2) {
-                if (matchNameStr == "") {
-                    matchNameStr = matchName2[i];
-                } else {
-                    matchNameStr += "," + matchName2[i]
-                }
-                if (codeStr == "") {
-                    codeStr = matchCode2[i]
-                } else {
-                    codeStr = codeStr + "," + matchCode2[i]
-                }
+            if (codeStr == "") {
+                codeStr = matchCode[i]
+            } else {
+                codeStr = codeStr + "," + matchCode[i]
             }
         }
         for (var i in selectIndex) {
             var j = selectIndex[i] - 1;
-            if (setValue == 5) {
-                if ($("#keywords tbody tr:nth-child(" + selectIndex[i] + ") td:nth-child(3)").text() != "" ||
-                    $("#keywords tbody tr:nth-child(" + selectIndex[i] + ") td:nth-child(4)").text() != "") {
-                    $("#keywords tbody tr:nth-child(" + selectIndex[i] + ") td:nth-child(" + setValue + ")").html(matchNameStr);
+            if (setValue == 4) {
+                if ($("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child(3)").text() != "") {
+                    $("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child("+setValue+")").html(matchNameStr);
                     o_rules[j]["s_keymatch"] = codeStr;
                 }
-            } else if (setValue == 7) {
-                if ($("#keywords tbody tr:nth-child(" + selectIndex[i] + ") td:nth-child(6)").text() != "") {
-                    $("#keywords tbody tr:nth-child(" + selectIndex[i] + ") td:nth-child(" + setValue + ")").html(matchNameStr);
+            }else if (setValue == 6) {
+                if ($("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child(5)").text() != "") {
+                    $("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child("+setValue+")").html(matchNameStr);
+                    o_rules[j]["s_addkeymatch"] = codeStr;
+                }
+            } else if (setValue == 8) {
+                if ($("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child(7)").text() != "") {
+                    $("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child("+setValue+")").html(matchNameStr);
                     o_rules[j]["s_notkeymatch"] = codeStr;
                 }
             }
@@ -796,7 +815,6 @@
             buyerArr.push($(obj).val())
         }
     }
-
     function saveBuyer() {
         $('#btnGroupBuyer').find("input").each(function () {
             $(this).removeClass("active-btn-match");
@@ -813,7 +831,7 @@
         for (var i in selectIndex) {
             var j = selectIndex[i] - 1;
             //采购单位
-            $("#keywords tbody tr:nth-child(" + selectIndex[i] + ") td:nth-child(" + setValue + ")").html(buyerStr);
+            $("#keywords tbody tr:nth-child(" + selectIndex[i] + ") td:nth-child(9)").html(buyerStr);
             o_rules[j]["s_buyerclass"] = buyerStr;
         }
         $('#modal-select-buyer').modal("hide");
@@ -829,7 +847,6 @@
             alert("请选中关键词")
         }
     }
-
     //公告行业一级点击
     function btnTopScopeClick(obj) {
         if ($(obj).hasClass("active-btn-match")) {
@@ -840,7 +857,6 @@
             scopeTopArr.push($(obj).val())
         }
     }
-
     //公告行业二级点击
     function btnSubScopeClick(obj) {
         if ($(obj).hasClass("active-btn-match")) {
@@ -850,11 +866,9 @@
             $(obj).addClass("active-btn-match");
             var topid = "#top_" + $(obj).attr("index");
             $(topid).removeClass("active-btn-match");
-            // scopeSubArr.push($(obj).val())
             scopeSubArr.push($(obj).attr("code"))
         }
     }
-
     function saveScope() {
         $('#btnGroupTop').find("input").each(function () {
             $(this).removeClass("active-btn-match");
@@ -891,7 +905,7 @@
         }
         for (var i in selectIndex) {
             var j = selectIndex[i] - 1;
-            $("#keywords tbody tr:nth-child(" + selectIndex[i] + ") td:nth-child(9)").html(scopeStr);
+            $("#keywords tbody tr:nth-child(" + selectIndex[i] + ") td:nth-child(10)").html(scopeStr);
             o_rules[j]["s_topscopeclass"] = topStr;
             o_rules[j]["s_subscopeclass"] = subStr;
         }
@@ -954,18 +968,17 @@
     }
 
     function saveTag() {
-        dataMap["s_customername"] = $('#cusName').val();
-        dataMap["s_tagname"] = $('#tagName').val();
+        dataMap["s_customer"] = $('#customer').val();
+        dataMap["s_tagname"] = $('#tagname').val();
+        dataMap["s_salesperson"] = $('#salename').val();
+        dataMap["s_serverperson"] = $("#serverperson").val();
+        dataMap["s_customername"] = $("#customername").val();
         dataMap["s_globaladdkey"] = $('#g_addkey').val();
         dataMap["s_globalnotkey"] = $('#g_notkey').val();
-        if (dataMap["s_customername"] == "" || dataMap["s_tagname"] == "" || dataMap["s_salesperson"] == "") {
+        if (dataMap["s_customer"] == "" || dataMap["s_tagname"] == "" || dataMap["s_salesperson"] == "" || dataMap["s_serverperson"] == "") {
             alert("请填写必须字段!")
             return
         }
-        // if (o_rules == undefined || o_rules.length == 0) {
-        //     alert("请导入关键词!");
-        //     return
-        // }
         if ($('#starttime').find("input").val() != "") {
             var start = $('#starttime').find("input").val();
             start = new Date(start).getTime() / 1000;
@@ -1049,35 +1062,28 @@
             },
             "columns": [
                 {"data": null, width: "2%"},
-                {
-                    "data": function (row) {
+                {"data": function (row) {
                         if (row.s_matchkey != undefined) {
                             return row.s_matchkey
                         } else {
                             return ""
                         }
-                    }, width: "8%"
-                },
-                {
-                    "data": function (row) {
+                    }, width: "8%"},
+                {"data": function (row) {
                         if (row.area != undefined) {
                             return row.area
                         } else {
                             return ""
                         }
-                    }, width: "4%"
-                },
-                {
-                    "data": function (row) {
+                    }, width: "4%"},
+                {"data": function (row) {
                         if (row.city != undefined) {
                             return row.city
                         } else {
                             return ""
                         }
-                    }, width: "4%"
-                },
-                {
-                    "data": function (row) {
+                    }, width: "4%"},
+                {"data": function (row) {
                         if (row.s_jyhref != undefined) {
                             if (row.title.length > 36) {
                                 var str = row.title.substring(0, 36) + "..."
@@ -1089,36 +1095,28 @@
                         } else {
                             return row.title
                         }
-                    }, width: "5%"
-                },
-                {
-                    "data": function (row) {
+                    }, width: "5%"},
+                {"data": function (row) {
                         if (row.subtype != undefined) {
                             return row.subtype
                         } else {
                             return ""
                         }
-                    }, width: "4%"
-                },
-                {
-                    "data": function (row) {
+                    }, width: "4%"},
+                {"data": function (row) {
                         var str = com.trimStr(row.detail);
                         if (str.length > 14) {
                             return str.substring(0, 14) + "..."
                         } else {
                             return str
                         }
-                    }, width: "5%"
-                },
-                {
-                    "data": function (row) {
+                    }, width: "5%"},
+                {"data": function (row) {
                         var dt = new Date();
                         dt.setTime(parseInt(row.publishtime) * 1000);
                         return dt.format("yyyy-MM-dd")
-                    }, width: "4%"
-                },
-                {
-                    "data": function (row) {
+                    }, width: "4%"},
+                {"data": function (row) {
                         if (row.href != undefined) {
                             var shref = row.href;
                             tmp = '<a class="" target="_blank" href=' + shref + '>公告地址</a>';
@@ -1126,11 +1124,16 @@
                         } else {
                             return ""
                         }
-                    }, width: "5%"
-                },
+                    }, width: "5%"},
+                {"data": function (row) {
+                        if (row.projectcode != undefined) {
+                            return row.projectcode
+                        }else {
+                            return ""
+                        }
+                    }, width: "5%"},
                 {"data": "projectname", width: "5%"},
-                {
-                    "data": function (row) {
+                {"data": function (row) {
                         if (row.projectscope != undefined) {
                             if (row.projectscope.length > 14) {
                                 return row.projectscope.substring(0, 14) + "..."
@@ -1139,28 +1142,22 @@
                             }
                         }
                         return ""
-                    }, width: "3%"
-                },
-                {
-                    "data": function (row) {
+                    }, width: "3%"},
+                {"data": function (row) {
                         if (row.budget == undefined) {
                             return ""
                         } else {
                             return row.budget
                         }
-                    }, width: "3%"
-                },
-                {
-                    "data": function (row) {
+                    }, width: "3%"},
+                {"data": function (row) {
                         if (row.bidamount == undefined) {
                             return ""
                         } else {
                             return row.bidamount
                         }
-                    }, width: "3%"
-                },
-                {
-                    "data": "bidopentime", width: "3%", render: function (val) {
+                    }, width: "3%"},
+                {"data": "bidopentime", width: "3%", render: function (val) {
                         if (val != undefined) {
                             var dt = new Date();
                             dt.setTime(parseInt(val) * 1000);
@@ -1168,16 +1165,13 @@
                         } else {
                             return ""
                         }
-                    }
-                },
-                {
-                    "data": "buyer", width: "3%", render: function (val) {
+                    }},
+                {"data": "buyer", width: "3%", render: function (val) {
                         if (val == undefined) {
                             val = ""
                         }
                         return val
-                    }
-                },
+                    }},
                 {
                     "data": function (row) {
                         if (row.buyerperson != undefined) {

+ 2 - 2
src/web/templates/private/rule_list.html

@@ -24,7 +24,7 @@
                             <thead>
                             <tr>
                                 <th>编号</th>
-                                <th>客户名</th>
+                                <th>客户名</th>
                                 <th>规则名称</th>
                                 <th>销售经理</th>
                                 <th>创建时间</th>
@@ -78,7 +78,7 @@
             },
             "columns": [
                 {"data": null,width:"5%"},
-                {"data": "s_customername"},
+                {"data": "s_customer"},
                 {"data": "s_tagname"},
                 {"data": "s_salesperson"},
                 {"data": "i_createtime",width:"9%", render: function (val) {