Jianghan 5 rokov pred
rodič
commit
76f092021e

+ 76 - 2
src/service/customer_service.go

@@ -2,7 +2,9 @@ package service
 
 import (
 	"encoding/json"
+	"fmt"
 	"github.com/go-xweb/xweb"
+	"github.com/lauyoume/gopinyin"
 	"gopkg.in/mgo.v2/bson"
 	qu "qfw/util"
 	"strings"
@@ -17,8 +19,13 @@ type Customer struct {
 	customerCreate xweb.Mapper `xweb:"/service/customer/create"`
 	customerEdit   xweb.Mapper `xweb:"/service/customer/edit"`
 	customerSave   xweb.Mapper `xweb:"/service/customer/save"`
+	customerDel	   xweb.Mapper `xweb:"/service/customer/del"`
 	setupDepart    xweb.Mapper `xweb:"/service/customer/setup"`
+
+	cuserToEuser   xweb.Mapper `xweb:"/service/cuser/converted"`
+
 	cuserRule	   xweb.Mapper `xweb:"/service/cuser/rule/list"`		//规则列表
+	cuserRuleCreate	xweb.Mapper	`xweb:"/service/cuser/rule/create"`		//新建规则
 }
 
 func (c *Customer) CustomerList() {
@@ -132,6 +139,10 @@ func (c *Customer) CustomerSave() {
 	}
 }
 
+func (c *Customer) CustomerDel() {
+	//怎么删
+}
+
 func (c *Customer) SetupDepart() {
 	defer qu.Catch()
 	if c.Method() == "POST" {
@@ -149,9 +160,14 @@ func (c *Customer) SetupDepart() {
 	}
 }
 
+func (c *Customer) CuserToEuser() {
+	defer qu.Catch()
+	//
+}
+
 func (c *Customer) CuserRule() {
 	defer qu.Catch()
-	id := c.GetString("id")
+	ids := strings.Split(c.GetString("ids"), ",")
 	if c.Method() == "POST" {
 		start, _ := c.GetInteger("start")
 		limit, _ := c.GetInteger("length")
@@ -159,6 +175,8 @@ func (c *Customer) CuserRule() {
 		searchStr := c.GetString("search[value]")
 		search := strings.TrimSpace(searchStr)
 		query := bson.M{
+			"s_userid": ids[1],
+			"s_departid": ids[0],
 			"b_delete": false,
 		}
 		if search != "" {
@@ -176,7 +194,63 @@ func (c *Customer) CuserRule() {
 			"recordsTotal":    count,
 		})
 	} else {
-		c.T["id"] = id
+		c.T["did"] = ids[0]	//部门id
+		c.T["cid"] = ids[1]	//客户id
 		c.Render("private/cuser_rule_list.html", &c.T)
 	}
 }
+
+func (c *Customer) CuserRuleCreate() {
+	defer qu.Catch()
+	ids := strings.Split(c.GetString("ids"), ",")
+	if c.Method() == "POST" {
+		user := c.GetSession("user").(map[string]interface{})
+		data := GetPostForm(c.Request)
+		o_rules := []map[string]interface{}{}
+		o_rulesStr := data["o_rules"].(string)
+		json.Unmarshal([]byte(o_rulesStr), &o_rules)
+		data["o_rules"] = o_rules
+		if qu.IntAll(data["i_esquerytype"]) == 1 { //自动生成es
+			data["s_esquery"] = Utiltags(data)
+		}
+		data["s_userid"] = ids[1]
+		data["s_departid"] = ids[0]
+		i_createtime := time.Now().Unix()
+		data["i_updatetime"] = i_createtime
+		data["s_updateuser"] = user["name"]
+		data["i_createtime"] = i_createtime
+		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["s_dataid"] = qu.SE.EncodeString(fmt.Sprintf("%v", i_createtime) + s_tagnamekey + ids[0])
+		rid := Mgo.Save("cuserdepartrule", data)
+		var rep = false
+		if rid != "" {
+			rep = true
+		} else {
+			rep = false
+		}
+		c.ServeJson(map[string]interface{}{
+			"id":        rid,
+			"s_esquery": data["s_esquery"],
+			"rep":       rep,
+			"s_dataid":  data["s_dataid"],
+		})
+	} else {
+		c.T["did"] = ids[0]	//部门id
+		c.T["cid"] = ids[1]	//客户id
+		c.T["ids"] = c.GetString("ids")
+		c.T["province"] = Province
+		c.T["city"] = ProvinceCitys
+		c.T["district"] = CityDistricts
+		c.T["topTypeArr"] = TopTypeArr
+		c.T["subTypeArr"] = SubTypeArr
+		c.T["matchTypeMap"] = MatchTypeMap
+		c.T["matchTypeMap2"] = MatchTypeMap2
+		c.T["existField"] = ExistFiled
+		c.T["buyerClass"] = BuyerClass
+		c.T["scopeClass"] = ScopeClassMap
+		c.Render("private/cuser_rule_create.html", &c.T)
+	}
+}

+ 9 - 9
src/util/config.go

@@ -53,15 +53,15 @@ func InitMgoPool() {
 		DbName:      qu.ObjToString(Sysconfig["dbname"]),
 	}
 	Mgo.InitPool()
-	//
-	//customer := Sysconfig["customer"].(map[string]interface{})
-	//CustomerApi = qu.ObjToString(customer["api"])
-	//MgoCus = &mongodb.MongodbSim{
-	//	MongodbAddr: qu.ObjToString(customer["mgodb"]),
-	//	Size:        qu.IntAll(customer["dbsize"]),
-	//	DbName:      qu.ObjToString(customer["dbname"]),
-	//}
-	//MgoCus.InitPool()
+
+	customer := Sysconfig["customer"].(map[string]interface{})
+	CustomerApi = qu.ObjToString(customer["api"])
+	MgoCus = &mongodb.MongodbSim{
+		MongodbAddr: qu.ObjToString(customer["mgodb"]),
+		Size:        qu.IntAll(customer["dbsize"]),
+		DbName:      qu.ObjToString(customer["dbname"]),
+	}
+	MgoCus.InitPool()
 
 }
 

+ 1537 - 0
src/web/templates/private/cuser_rule_create.html

@@ -0,0 +1,1537 @@
+{{include "com/inc.html"}}
+<!-- Main Header -->
+{{include "com/header.html"}}
+<!-- Left side column. 权限菜单 -->
+{{include "com/menu.html"}}
+{{include "com/modal.html"}}
+<script src="/time/js/angular.min.js"></script>
+<script src="/time/js/wui-date.js"></script>
+<div class="content-wrapper">
+    <section class="content-header">
+        <h1> 新建规则
+            <small>
+                <button class="btn btn-warning btn-sm" onclick="importcomrule()"><i class="fa fa-fw fa-upload fa-lg"></i>导入通用标签</button>
+                <button class="btn btn-primary btn-sm" onclick="importRule()"><i class="fa fa-fw fa-cloud-upload fa-lg"></i>导入关键词</button>
+                <form style="display:none" id='uploadform' method='post'>
+                    <input type='file' name='xlsx' id='file'/>
+                </form>
+                <button class="btn btn-info btn-sm" onclick="importEs()"><i class="fa fa-fw fa-cloud-upload fa-lg"></i>导入es</button>
+                <a class="btn btn-sm btn-success" id="download" onclick="downloades()"><i class="fa fa-fw fa-cloud-download fa-lg"></i>下载es</a>
+                <a class="btn btn-sm btn-instagram" onclick="produceData()"><i class="fa fa-fw fa-database fa-lg"></i>生成数据</a>
+                <button class="btn btn-warning btn-sm" onclick="previewData()"><i class="fa fa-fw fa-eye fa-lg"></i>预览</button>
+                <button class="btn btn-danger btn-sm" onclick="archive()"><i class="fa fa-fw fa-save fa-lg"></i>存档</button>
+            </small>
+        </h1>
+        <ol class="breadcrumb">
+            <li><a href="#"><i class="fa fa-dashboard"></i> 首页</a></li>
+            <li><a href="/service/customer/list"> 客户列表</a></li>
+            <li><a href="/service/customer/edit?id={{.T.cid}}"> 编辑客户</a></li>
+            <li><a href="/service/cuser/rule/list?ids={{.T.ids}}"> 客户规则</a></li>
+            <li><a href="#"> 新增客户规则</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="tab-content">
+            <div class="nav-tabs-custom">
+                <ul class="nav nav-tabs edit-step">
+                    <li class="active" data-mode="guide"><a href="#tab_1" data-toggle="tab" aria-expanded="true">通用规则</a></li>
+                    <li data-mode="guide" class=""><a href="#tab_2" data-toggle="tab" aria-expanded="false">关键词规则</a></li>
+                    <button class="btn btn-primary btn-sm" style="float: right;margin-top: 7px;margin-right: 10px" onclick="saveTag()"><i class="fa fa-fw fa-file-text fa-lg"></i>保存标签</button>
+                </ul>
+                <div class="tab-content">
+                    <div class="tab-pane active" id="tab_1">
+                        <form class="form-horizontal">
+                            <div class="box box-primary">
+                                <div class="box-header with-border">
+                                    <i class="fa fa-tag"></i>
+                                    <h3 class="box-title">通用规则</h3>
+                                </div>
+                                <div class="box-body">
+                                    <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="" required>
+                                        </div>
+                                    </div>
+                                    <hr>
+                                    <div class="form-group">
+                                        <label class="col-sm-2 control-label">选择省</label>
+                                        <div class="col-sm-3">
+                                            <select class="form-control selectpicker" multiple data-live-search="true"
+                                                    id="province"></select>
+                                            <script>
+                                                $('#province').on('hide.bs.select', function () {
+                                                    var arr = $('#province').val();
+                                                    var arrStr = "";
+                                                    for (var i in arr) {
+                                                        if (arrStr === "") {
+                                                            arrStr = arr[i]
+                                                        } else {
+                                                            arrStr = arrStr + "," + arr[i]
+                                                        }
+                                                    }
+                                                    dataMap["s_area"] = arrStr
+                                                })
+                                            </script>
+                                        </div>
+                                        <label class="col-sm-2 control-label">选择市</label>
+                                        <div class="col-sm-3">
+                                            <select class="form-control selectpicker" multiple data-live-search="true"
+                                                    id="city"></select>
+                                            <script>
+                                                $('#city').on('hide.bs.select', function () {
+                                                    var arr = $('#city').val();
+                                                    var arrStr = "";
+                                                    for (var i in arr) {
+                                                        if (arrStr === "") {
+                                                            arrStr = arr[i]
+                                                        } else {
+                                                            arrStr = arrStr + "," + arr[i]
+                                                        }
+                                                    }
+                                                    dataMap["s_city"] = arrStr
+                                                })
+                                            </script>
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="col-sm-2 control-label">选择区/县</label>
+                                        <div class="col-sm-3">
+                                            <select class="form-control selectpicker" multiple data-live-search="true"
+                                                    id="district"></select>
+                                            <script>
+                                                $('#district').on('hide.bs.select', function () {
+                                                    var arrStr = "";
+                                                    $('#district option:selected').each(function () {
+                                                        if (arrStr === "") {
+                                                            arrStr = $(this).val()
+                                                        } else {
+                                                            arrStr = arrStr + "," + $(this).val()
+                                                        }
+                                                    });
+                                                    dataMap["s_district"] = arrStr
+                                                })
+
+                                            </script>
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="col-sm-2 control-label">公告类别</label>
+                                        <div class="col-sm-3">
+                                            <select class="form-control selectpicker" id="typeSelect">
+                                                <option selected:disabled style="diaplay:none" value=0>请选择</option>
+                                                <option value=1>一级公告类别</option>
+                                                <option value=2>二级公告类别</option>
+                                            </select>
+                                            <script>
+                                                $('#typeSelect').on('changed.bs.select', function () {
+                                                    $("#typeSelectVal").selectpicker("deselectAll");
+                                                    $("#typeSelectVal").empty();
+                                                    if ($(this).val() == 1) {
+                                                        for (var i in topTypeArr) {
+                                                            var opt = document.createElement('option');
+                                                            opt.innerText = topTypeArr[i];
+                                                            opt.value = topTypeArr[i];
+                                                            $('#typeSelectVal')[0].appendChild(opt)
+                                                        }
+                                                    }else if ($(this).val() == 2) {
+                                                        for (var i in subTypeArr) {
+                                                            var opt = document.createElement('option');
+                                                            opt.innerText = subTypeArr[i];
+                                                            opt.value = subTypeArr[i];
+                                                            $('#typeSelectVal')[0].appendChild(opt)
+                                                        }
+                                                    }
+                                                    $("#typeSelectVal").selectpicker("refresh");
+                                                })
+                                            </script>
+                                        </div>
+                                        <label class="col-sm-2 control-label">公告类别选择</label>
+                                        <div class="col-sm-3">
+                                            <select class="form-control selectpicker" multiple id="typeSelectVal"></select>
+                                            <script>
+                                                $('#typeSelectVal').on('show.bs.select', function () {
+                                                    if ($('#typeSelect').val() == 0) {
+                                                        showTip("请选择公告类别", 500)
+                                                    }
+                                                })
+                                                $('#typeSelectVal').on('hide.bs.select', function () {
+                                                    var arr = $(this).val();
+                                                    var arrStr = "";
+                                                    for (var i in arr) {
+                                                        if (arrStr === "") {
+                                                            arrStr = arr[i]
+                                                        } else {
+                                                            arrStr = arrStr + "," + arr[i]
+                                                        }
+                                                    }
+                                                    if ($('#typeSelect').val() == 1) {
+                                                        dataMap["s_toptype"] = arrStr;
+                                                        dataMap["s_subtype"] = "";
+                                                    }else {
+                                                        dataMap["s_toptype"] = "";
+                                                        dataMap["s_subtype"] = arrStr;
+                                                    }
+                                                })
+                                            </script>
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="col-sm-2 control-label ">开始时间</label>
+                                        <div class="col-sm-3">
+                                            <div class="wui-content">
+                                                <div class="wui-area" id="starttime">
+                                                    <wui-date
+                                                            format="yyyy-mm-dd hh:mm:ss"
+                                                            placeholder="请选择或输入开始日期"
+                                                            id="date4"
+                                                            btns="{'ok':'确定','now':'此刻'}"
+                                                            ng-model="date4">
+                                                    </wui-date>
+                                                </div>
+                                            </div>
+                                        </div>
+                                        <label class="col-sm-2 control-label ">结束时间</label>
+                                        <div class="col-sm-3">
+                                            <div class="wui-content">
+                                                <div class="wui-area" id="endtime">
+                                                    <wui-date
+                                                            format="yyyy-mm-dd hh:mm:ss"
+                                                            placeholder="请选择或输入结束日期"
+                                                            id="date4"
+                                                            btns="{'ok':'确定','now':'此刻'}"
+                                                            ng-model="date5">
+                                                    </wui-date>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="col-sm-2 control-label">选择字段</label>
+                                        <div class="col-sm-3">
+                                            <select class="form-control selectpicker" multiple id="existFieldSelect"
+                                                    data-actions-box="true"></select>
+                                            <script>
+                                                $('#existFieldSelect').on('hide.bs.select', function () {
+                                                    var arr = $('#existFieldSelect').val();
+                                                    var arrStr = "";
+                                                    for (var i in arr) {
+                                                        if (arrStr === "") {
+                                                            arrStr = arr[i]
+                                                        } else {
+                                                            arrStr = arrStr + "," + arr[i]
+                                                        }
+                                                    }
+                                                    dataMap["s_existfields"] = arrStr
+                                                })
+                                            </script>
+                                        </div>
+                                    </div>
+                                    <hr>
+                                    <div class="form-group">
+                                        <label class="col-sm-2 control-label">预算限制</label>
+                                        <div class="col-sm-3">
+                                            <input class="form-control" type="text" id="s_budget_min" placeholder="单位:元/大于">
+                                        </div>
+                                        <label class="col-sm-2" style="text-align: center">___ ___</label>
+                                        <div class="col-sm-3">
+                                            <input class="form-control" type="text" id="s_budget_max" placeholder="单位:元/小于">
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="col-sm-2 control-label">中标金额限制</label>
+                                        <div class="col-sm-3" id="bidamountDiv">
+                                            <input class="form-control" type="text" id="s_bidamount_min" placeholder="单位:元/大于">
+                                        </div>
+                                        <label class="col-sm-2" style="text-align: center">___ ___</label>
+                                        <div class="col-sm-3">
+                                            <input class="form-control" type="text" id="s_bidamount_max" placeholder="单位:元/小于">
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="col-sm-2 control-label">全局附加词</label>
+                                        <div class="col-sm-3">
+                                            <input type="text" class="form-control" id="g_addkey" placeholder="***"
+                                                   value="">
+                                        </div>
+                                        <label class="col-sm-2 control-label">匹配方式</label>
+                                        <div class="col-sm-3">
+                                            <input class="form-control" style="text-align: left;overflow: hidden;white-space: nowrap;text-overflow: ellipsis"
+                                                   type="button" id="s_addkeymatch" onclick="selectKeyMatch(0)">
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label for="spiderChannel" class="col-sm-2 control-label">全局排除词</label>
+                                        <div class="col-sm-3">
+                                            <input type="text" class="form-control" id="g_notkey" placeholder="***"
+                                                   value="">
+                                        </div>
+                                        <label class="col-sm-2 control-label">匹配方式</label>
+                                        <div class="col-sm-3">
+                                            <input class="form-control" style="text-align: left;overflow: hidden;white-space: nowrap;text-overflow: ellipsis"
+                                                   type="button" id="s_notkeymatch" onclick="selectKeyMatch(1)">
+                                        </div>
+                                    </div>
+                                     <div class="form-group">
+                                        <label class="col-sm-2 control-label">全局清理词</label>
+                                        <div class="col-sm-3">
+                                            <input type="text" class="form-control" id="s_globalclearkey" placeholder="***"
+                                                   value="">
+                                        </div>
+                                         <label class="col-sm-2 control-label">匹配方式</label>
+                                        <div class="col-sm-3">
+                                            <input class="form-control" style="text-align: left;overflow: hidden;white-space: nowrap;text-overflow: ellipsis"
+                                                   type="button" id="s_globalclearkeymatch" onclick="selectKeyMatch(13)">
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="col-sm-2 control-label">采购单位行业</label>
+                                        <div class="col-sm-3">
+                                            <input class="form-control" style="text-align: left;overflow: hidden;white-space: nowrap;text-overflow: ellipsis"
+                                                   type="button" id="s_buyerclass" onclick="selectBuyer(2)">
+                                        </div>
+                                        <label class="col-sm-2 control-label">公告行业</label>
+                                        <div class="col-sm-3">
+                                            <input class="form-control" style="text-align: left;overflow: hidden;white-space: nowrap;text-overflow: ellipsis"
+                                                   type="button" id="s_scopeclass" onclick="selectScope(3)">
+                                        </div>
+                                    </div>
+                                    <hr>
+                                    <div class="form-group">
+                                        <label class="col-sm-2 control-label">预览数据量</label>
+                                        <div class="col-sm-3">
+                                            <input type="text" class="form-control" id="maxnum" placeholder="默认100条" value="">
+                                        </div>
+                                        <label class="col-sm-2 control-label ">高级字段包</label>
+                                        <div class="col-sm-3">
+                                            <select class="form-control" id="extfiledselect" style="border-radius:3px">
+                                                <option value="2">是</option>
+                                                <option value="1">否</option>
+                                            </select>
+                                            <script>
+                                                $('#extfiledselect').on("change", function () {
+                                                    dataMap["i_extfieldstype"] = $('#extfiledselect option:selected').val();
+                                                })
+                                            </script>
+                                        </div>
+                                    </div>
+                                    <hr>
+                                    <div id="es_div" class="form-group" style="display: none">
+                                        <label class="col-sm-2 control-label">ES语句</label>
+                                        <div class="col-sm-8">
+                                            <textarea class="form-control" id="estxt" readonly></textarea>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </form>
+                    </div>
+                    <div class="tab-pane" id="tab_2">
+                        <div class="box box-primary">
+                            <div class="box-header with-border">
+                                <i class="fa fa-bookmark"></i>
+                                <h3 class="box-title">关键词规则</h3>
+                                <div style="float: right">
+                                    <a class="btn btn-default btn-sm" onclick="selectKeyMatch(4)">关键词匹配方式</a>
+                                    <a class="btn btn-default btn-sm" onclick="selectKeyMatch(6)">附加词匹配方式</a>
+                                    <a class="btn btn-default btn-sm" onclick="selectKeyMatch(8)">排除词匹配方式</a>
+                                    <a class="btn btn-default btn-sm" onclick="selectBuyer(9)">采购单位行业</a>
+                                    <a class="btn btn-default btn-sm" onclick="selectScope(10)">公告行业</a>
+                                </div>
+                            </div>
+                            <table id="keywords" class="table table-bordered">
+                                <thead>
+                                <div style="margin: 10px 10px 0px;">
+                                    <a class="btn btn-twitter" onclick="add_Rule()">新增</a>
+                                    <a class="btn btn-twitter" onclick="modify_Rule()">修改</a>
+                                    <a class="btn btn-twitter" onclick="del_Rule()">删除</a>
+                                </div>
+                                <tr>
+                                    <th>编号</th>
+                                    <th><input type="checkbox" onclick="allSelect(this)" id="allCheckbox"></th>
+                                    <th>关键词</th>
+                                    <th>匹配方式</th>
+                                    <th>附加词</th>
+                                    <th>匹配方式</th>
+                                    <th>排除词</th>
+                                    <th>匹配方式</th>
+                                    <th>采购单位行业</th>
+                                    <th>公告行业</th>
+                                </tr>
+                                </thead>
+                            </table>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </section>
+</div>
+
+{{include "com/footer.html"}}
+<script>
+    menuActive("/customer/list");
+    var state = 1;
+    var clearkeyMatchArr = ["detail","title"];
+    var app = angular.module('app', ["wui.date"]);
+    var province = {{.T.province}};
+    var cityMap = {{.T.city}};
+    var districtMap = {{.T.district}};
+    var topTypeArr = {{.T.topTypeArr}};
+    var subTypeArr = {{.T.subTypeArr}};
+    var matchTypeMap = {{.T.matchTypeMap}};
+    var matchTypeMap2 = {{.T.matchTypeMap2}};
+    var existField = {{.T.existField}};
+    var buyerClass = {{.T.buyerClass}};
+    var scopeClass = {{.T.scopeClass}};
+
+    var ids = {{.T.ids}}
+
+    var matchCode = [];     //匹配方式code
+    var matchName = [];     //匹配名字
+    var buyerArr = [];      //采购单位
+    var scopeTopArr = [];       //公告行业一级
+    var scopeSubArr = [];       //公告行业二级
+
+    var keyTableChecked = false;        //关键词表格数据是否有选中
+    var keyTableAllChecked = true;      //表单数据是否被全选中
+    var selectIndex = [];               //选中的编号
+    var setValue = 0;                   // 4: 关键词匹配方式,6:附加词匹配方式,8:排除词匹配方式,9:采购单位,10:公告行业, 2:全局采购单位行业, 3:全局公告行业, 13:全局清理词
+    var o_rules = [];                    //关键词列表
+
+    var s_dataid = "";                  //预览链接加密串
+
+    //表单数据
+    var dataMap = {
+        "id": "",
+        "s_tagname": "",
+        "s_area": "",
+        "s_city": "",
+        "s_district": "",
+        "s_toptype": "",
+        "s_subtype": "",
+        "s_esquery": "",
+        "s_globaladdkey": "",
+        "s_globaladdkeymatch": "",
+        "s_globalnotkey": "",
+        "s_globalnotkeymatch": "",
+        "i_maxnum": 100,
+        "i_starttime": 0,
+        "i_endtime": 0,
+        "i_extfieldstype": 2,
+        "i_esquerytype": 1,
+    };
+
+    $(document).ready(function () {
+        //省
+        for (var i in province) {
+            var provOpt = document.createElement('option');
+            provOpt.innerText = province[i];
+            provOpt.value = province[i];
+            $("#province")[0].appendChild(provOpt);
+        }
+        var optHtml = "";
+        var optGroup = "";
+        for (var i in districtMap) {
+            var opt = document.createElement('option');
+            opt.innerText = i;
+            opt.value = i;
+            $("#city")[0].appendChild(opt);
+            optGroup += '<optgroup label="' + i + '" value="' + i + '">';
+            for (var j in districtMap[i]) {
+                optGroup += '<option value="' + i + "-" + districtMap[i][j] + '">' + districtMap[i][j] + '</option>';
+            }
+            optGroup += `</optgroup>`;
+        }
+        optHtml += optGroup;
+        $("#district").append(optHtml);
+
+        $("#province").selectpicker("refresh");
+        $("#city").selectpicker("refresh");
+        $("#district").selectpicker("refresh");
+
+        for (var i in existField) {
+            var opt = document.createElement('option');
+            opt.innerText = existField[i];
+            opt.value = existField[i];
+            $('#existFieldSelect')[0].appendChild(opt)
+        }
+        $("#existFieldSelect").selectpicker("refresh");
+        var btnMatchHtml1 = "";
+        var btnMatchHtml2 = "";
+        for (var i in matchTypeMap) {
+            if (i < 5) {
+                btnMatchHtml1 += `<input type="button" class="btn btn-default col-md-pull-2" style="margin-left: 10px;margin-top: 10px" onclick="clickMatchBtn(this)"
+                            code="${matchTypeMap[i]["code"]}" value="${matchTypeMap[i]["name"]}">`;
+            }else {
+                btnMatchHtml2 += `<input type="button" class="btn btn-default col-md-pull-2" style="margin-left: 10px;margin-top: 10px" onclick="clickMatchBtn2(this)"
+                            code="${matchTypeMap[i]["code"]}" value="${matchTypeMap[i]["name"]}">`;
+            }
+        }
+        $("#btnGroupMatch").append(btnMatchHtml1);
+        $("#btnGroupMatch2").append(btnMatchHtml2);
+        var btnBuyerHtml = "";
+        for (var i in buyerClass) {
+            btnBuyerHtml += `<input type="button" class="btn btn-default col-md-2" style="margin-left: 10px;margin-top: 10px" onclick="clickBuyerBtn(this)"
+                             value="${buyerClass[i]}">`;
+        }
+        $("#btnGroupBuyer").append(btnBuyerHtml);
+
+        var btnTopHtml = "";
+        var btnSubHtml = "";
+        for (var i in scopeClass) {
+            var topId = "top_" + i;
+            btnTopHtml += `<input type="button" id="${topId}" class="btn btn-default btn_top" onclick="btnTopScopeClick(this)" value="${scopeClass[i]["name"]}">`;
+            btnSubHtml += `<div class="btn-group-sub">`;
+            for (var j in scopeClass[i]["child"]) {
+                var sub = scopeClass[i]["child"][j].split("_");
+                btnSubHtml += `<input type="button" class="btn btn-default btn-sub" onclick="btnSubScopeClick(this)" code="${scopeClass[i]["child"][j]}"
+                                index="${i}" value="${sub[1]}">`
+            }
+            btnSubHtml += '</div>'
+        }
+        $("#btnGroupTop").append(btnTopHtml);
+        $("#btnGroupSub").append(btnSubHtml);
+
+        $('#keywords').DataTable({
+            "paging": false,
+            "lengthChange": false,
+            "searching": false,
+            "ordering": false,
+            "info": true,
+            "autoWidth": false,
+            "language": {
+                "url": "/dist/js/dataTables.chinese.lang"
+            },
+            "fnDrawCallback": function () {
+                this.api().column(0).nodes().each(function (cell, i) {
+                    cell.innerHTML = i + 1;
+                });
+            },
+            "columns": [
+                {"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: "10%"},
+                {"data": function (row) {
+                        var str = row.s_keymatch;
+                        if (str && 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
+                        }
+                        return ""
+                    }, width: "5%"},
+                {"data": "s_addkey", width: "10%"},
+                {"data": function (row) {
+                        var str = row.s_addkeymatch;
+                        if (str && 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
+                        }
+                        return ""
+                    }, width: "5%"},
+                {"data": "s_notkey", width: "10%"},
+                {"data": function (row) {
+                        var str = row.s_notkeymatch;
+                        if (str && 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
+                        }
+                        return ""
+                    }, width: "5%"},
+                {"data": "s_buyerclass", width: "7%", render: function (val) {
+                        if (val == undefined) {
+                            val = ""
+                        }
+                        return val
+                    }},
+                {"data": "s_topscopeclass", width: "5%", render: function (val) {
+                        if (val == undefined) {
+                            val = ""
+                        }
+                        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
+                    }
+                }
+            }]
+        });
+    });
+
+    $('#province').selectpicker({
+        liveSearch: true,
+    });
+    $('#city').selectpicker({
+        liveSearch: true,
+    });
+    $('#district').selectpicker({
+        liveSearch: true,
+    });
+    //全局modal取消按钮
+    function cancelModel() {
+        $('#modal-imp-es').modal("hide");
+        $('#modal-select-match').modal("hide");
+        $('#modal-select-buyer').modal("hide");
+        $('#modal-select-scope').modal("hide");
+        $('#btnGroupMatch').find("input").each(function () {
+            $(this).removeClass("active-btn-match");
+        });
+        $('#btnGroupMatch2').find("input").each(function () {
+            $(this).removeClass("active-btn-match");
+        });
+        $('#btnGroupBuyer').find("input").each(function () {
+            $(this).removeClass("active-btn-match");
+        });
+        $('#btnGroupTop').find("input").each(function () {
+            $(this).removeClass("active-btn-match");
+        });
+        $('#btnGroupSub').find("input").each(function () {
+            $(this).removeClass("active-btn-match");
+        });
+    }
+    //导入es语句modal
+    function importEs() {
+        $("#modal-imp-es").modal("show");
+    }
+    //保存es语句
+    function saveEs() {
+        var esStr = $("#es_json").val();
+        try {
+            if (typeof JSON.parse(esStr) == "object") {
+                $('#modal-imp-es').modal("hide");
+                $('#es_div').show();
+                dataMap["s_esquery"] = esStr;
+                $('#estxt').val(esStr);
+                dataMap["i_esquerytype"] = 2;
+            }
+        } catch (e) {
+            showMsg("json格式有误")
+        }
+    }
+    //关键词/附加词/排除词匹配方式modal
+    function selectKeyMatch(val) {
+        setValue = val;
+        if (setValue == 0 || setValue == 1 || setValue == 13) {
+            matchCode.length = 0;
+            matchName.length = 0;
+            $('#modal-select-match').modal("show");
+        }else {
+            if (selectIndex.length > 0 && keyTableChecked) {
+                matchCode.length = 0;
+                matchName.length = 0;
+                $('#modal-select-match').modal("show");
+            }else {
+                alert("请选中关键词")
+            }
+        }
+    }
+    //匹配方式按钮点击事件
+    function clickMatchBtn(obj) {
+        if ($(obj).hasClass("active-btn-match")) {
+            $(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");
+            matchCode.push($(obj).attr("code"));
+            matchName.push($(obj).val())
+        }
+
+        $('#btnGroupMatch2 .btn-default').each(function () {
+            $(this).removeClass("active-btn-match");
+        });
+    }
+    function clickMatchBtn2(obj) {
+        matchCode.length = 0;
+        matchName.length = 0;
+        if ($(obj).hasClass("active-btn-match")) {
+            $(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");
+            matchCode.push($(obj).attr("code"));
+            matchName.push($(obj).val())
+            $('#btnGroupMatch2 .btn-default').each(function () {
+                if (this != obj) {
+                    $(this).removeClass("active-btn-match");
+                }
+            });
+        }
+
+        $('#btnGroupMatch .btn-default').each(function () {
+            $(this).removeClass("active-btn-match");
+        });
+    }
+    //匹配方式保存
+    function saveMatch() {
+        $('#btnGroupMatch').find("input").each(function () {
+            $(this).removeClass("active-btn-match");
+        });
+        $('#btnGroupMatch2').find("input").each(function () {
+            $(this).removeClass("active-btn-match");
+        });
+        var matchNameStr = "";
+        var codeStr = "";
+        for (var i in matchName) {
+            if (matchNameStr == "") {
+                matchNameStr = matchName[i];
+            }else {
+                matchNameStr += "," + matchName[i]
+            }
+            if (codeStr == "") {
+                codeStr = matchCode[i]
+            }else {
+                codeStr = codeStr + "," + matchCode[i]
+            }
+        }
+        if (setValue == 0) {
+            $('#s_addkeymatch').val(matchNameStr);
+            dataMap["s_globaladdkeymatch"] = codeStr
+        }else if (setValue == 1) {
+            $('#s_notkeymatch').val(matchNameStr);
+            dataMap["s_globalnotkeymatch"] = codeStr
+        }else if (setValue == 13){
+            $('#s_globalclearkeymatch').val(matchNameStr);
+            dataMap["s_globalclearkeymatch"] = codeStr
+        }else {
+            for (var i in selectIndex) {
+                var j = selectIndex[i] - 1;
+                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 == 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");
+        matchName.length = 0;
+        matchCode.length = 0;
+    }
+    //采购单位modal
+    function selectBuyer(val) {
+        setValue = val;
+        if (val == 2) {
+            $('#modal-select-buyer').modal("show");
+        }else {
+            if (keyTableChecked) {
+                $('#modal-select-buyer').modal("show");
+            }else {
+                alert("请选中关键词")
+            }
+        }
+    }
+    //采购单位点击
+    function clickBuyerBtn(obj) {
+        if ($(obj).hasClass("active-btn-match")) {
+            $(obj).removeClass("active-btn-match")
+            buyerArr.splice($.inArray($(obj).val(), buyerArr), 1)
+        } else {
+            $(obj).addClass("active-btn-match");
+            buyerArr.push($(obj).val())
+        }
+    }
+    function saveBuyer() {
+        $('#btnGroupBuyer').find("input").each(function () {
+            $(this).removeClass("active-btn-match");
+        });
+        var buyerStr = "";
+        for (var i in buyerArr) {
+            if ("" === buyerStr) {
+                buyerStr = buyerArr[i];
+            }else {
+                buyerStr += "," + buyerArr[i]
+            }
+        }
+        if (setValue == 2) {
+            $('#s_buyerclass').val(buyerStr);
+            $('#s_buyerclass').attr('title', buyerStr);
+            dataMap["s_globalbuyerclass"] = buyerStr;
+        }else {
+            for (var i in selectIndex) {
+                var j = selectIndex[i] - 1;
+                //采购单位
+                $("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child(9)").html(buyerStr);
+                o_rules[j]["s_buyerclass"] = buyerStr;
+            }
+        }
+        $('#modal-select-buyer').modal("hide");
+        buyerArr.length = 0;
+    }
+    //公告行业modal
+    function selectScope(val) {
+        setValue = val;
+        if (val == 3) {
+            $('#modal-select-scope').modal("show");
+        }else {
+            if (keyTableChecked) {
+                $('#modal-select-scope').modal("show");
+            }else {
+                alert("请选中关键词")
+            }
+        }
+    }
+    //公告行业一级点击
+    function btnTopScopeClick(obj) {
+        if ($(obj).hasClass("active-btn-match")) {
+            $(obj).removeClass("active-btn-match");
+            scopeTopArr.splice($.inArray($(obj).val(), scopeTopArr), 1)
+        } else {
+            $(obj).addClass("active-btn-match");
+            scopeTopArr.push($(obj).val())
+        }
+
+        //选择一级行业,取消掉所选择的所有二级行业
+        if (scopeSubArr.length > 0) {
+            $('#btnGroupSub .btn-default').each(function () {
+                $(this).removeClass("active-btn-match");
+            });
+            scopeSubArr.length = 0
+        }
+    }
+    //公告行业二级点击
+    function btnSubScopeClick(obj) {
+        if ($(obj).hasClass("active-btn-match")) {
+            $(obj).removeClass("active-btn-match")
+            scopeSubArr.splice($.inArray($(obj).val(), scopeSubArr), 1)
+        } else {
+            $(obj).addClass("active-btn-match");
+            var topid = "#top_" + $(obj).attr("index");
+            $(topid).removeClass("active-btn-match");
+            scopeSubArr.push($(obj).attr("code"))
+        }
+
+        //选择二级行业,取消掉所选择的所有一级行业
+        if (scopeTopArr.length > 0) {
+            $('#btnGroupTop .btn-default').each(function () {
+                $(this).removeClass("active-btn-match");
+            });
+            scopeTopArr.length = 0
+        }
+    }
+    function saveScope() {
+        $('#btnGroupTop').find("input").each(function () {
+            $(this).removeClass("active-btn-match");
+        });
+        $('#btnGroupSub').find("input").each(function () {
+            $(this).removeClass("active-btn-match");
+        });
+        var scopeStr = "";
+        var topStr = "";
+        var subStr = "";
+        for (var i in scopeTopArr) {
+            if ("" == scopeStr) {
+                scopeStr = scopeTopArr[i];
+            }else {
+                scopeStr += "," + scopeTopArr[i]
+            }
+            if (topStr == "") {
+                topStr = scopeTopArr[i]
+            } else {
+                topStr = topStr + "," + scopeTopArr[i]
+            }
+        }
+        for (var i in scopeSubArr) {
+            if ("" == scopeStr) {
+                scopeStr = scopeSubArr[i];
+            }else {
+                scopeStr += "," + scopeSubArr[i]
+            }
+            if (subStr == "") {
+                subStr = scopeSubArr[i]
+            } else {
+                subStr = subStr + "," + scopeSubArr[i]
+            }
+        }
+        if (setValue == 3) {
+            $('#s_scopeclass').val(scopeStr);
+            $('#s_scopeclass').attr('title', scopeStr);
+            dataMap["s_globaltopscopeclass"] = topStr;
+            dataMap["s_globalsubscopeclass"] = subStr;
+        }else {
+            for (var i in selectIndex) {
+                var j = selectIndex[i] - 1;
+                $("#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;
+            }
+        }
+        $('#modal-select-scope').modal("hide");
+        scopeTopArr.length = 0;
+        scopeSubArr.length = 0;
+    }
+    //页面添加附加词、排除词
+    function addkeyWord(rdata) {
+        o_rules = rdata["o_rules"];
+        $('#g_addkey').attr("value", rdata["s_globaladdkey"]);
+        $('#g_notkey').attr("value", rdata["s_globalnotkey"]);
+        $('#s_globalclearkey').attr("value", rdata["s_globalclearkey"]);
+        dataMap["s_globalclearkey"] = rdata["s_globalclearkey"];
+        dataMap["s_globaladdkey"] = rdata["s_globaladdkey"];
+        dataMap["s_globalnotkey"] = rdata["s_globalnotkey"];
+
+        $('#keywords').dataTable().fnClearTable();
+        $('#keywords').dataTable().fnAddData(rdata["o_rules"]);
+
+    }
+    //表格全选
+    function allSelect(obj) {
+        if ($(obj).is(':checked')) {
+            keyTableChecked = true;
+            keyTableAllChecked = true;
+            $('input[name="ckb-keyid"]').each(function () {
+                this.checked = true;
+                selectIndex.push($(this).parents("tr").index() + 1);
+            })
+        }else {
+            selectIndex.length = 0;
+            keyTableChecked = false;
+            keyTableAllChecked = false;
+            $('input[name="ckb-keyid"]').each(function () {
+                this.checked = false;
+            })
+        }
+    }
+    //表格单个选中
+    function singleSelect(obj) {
+        var tag = true;
+        selectIndex.length = 0;
+        $('input[name="ckb-keyid"]').each(function () {
+            if (this.checked) {
+                keyTableChecked = true;
+                selectIndex.push($(this).parents("tr").index() + 1);
+            }else {
+                tag = false
+            }
+        });
+        if (tag) {
+            keyTableAllChecked = true;
+            $('#allCheckbox').prop("checked", true);
+        }else {
+            keyTableAllChecked = false;
+            $('#allCheckbox').prop("checked", false);
+        }
+    }
+    //保存标签
+    function saveTag() {
+        let obj = checkArea(dataMap.s_area, dataMap.s_city, dataMap.s_district);
+        if (!obj.flag) {
+            let msg = "选择的" + obj.v1 + "和" + obj.v2 + "生成es语句时会产生错误,请重新选择其中一个";
+            showMsg(msg);
+            return
+        }
+        //通用规则采购单位行业和关键词中的采购单位行业只能存在一个
+        if (o_rules.length > 0) {
+            let tag = false;
+            for (var i in o_rules) {
+                if (o_rules[i].s_buyerclass) {
+                    tag = true
+                }
+            }
+            if (tag && dataMap.s_globalbuyerclass) {
+                showMsg("保存失败,采购单位行业在通用规则和关键词规则中不能同时存在!")
+                return;
+            }
+        }
+        //关键词、附加词、排除词存在,则必须有相应的匹配方式
+        if (dataMap.s_globaladdkey && !dataMap.s_globaladdkeymatch) {
+            showMsg("保存失败,全局附加词必须有对应的匹配方式!")
+            return;
+        }
+        if (dataMap.s_globalnotkey && !dataMap.s_globalnotkeymatch) {
+            showMsg("保存失败,全局附加词必须有对应的匹配方式!")
+            return;
+        }
+        if (dataMap.s_globalclearkey && !dataMap.s_globalclearkeymatch) {
+            showMsg("保存失败,全局清理词说必须有对应的匹配方式!")
+            return;
+        }
+        if (o_rules.length > 0) {
+            for (const i in o_rules) {
+                if (o_rules[i].s_matchkey && !o_rules[i].s_keymatch) {
+                    showMsg("保存失败,关键词规则中有关键词未对应匹配方式!")
+                    return;
+                }
+                if (o_rules[i].s_addkey && !o_rules[i].s_addkeymatch) {
+                    showMsg("保存失败,关键词规则中有附加词未对应匹配方式!")
+                    return;
+                }
+                if (o_rules[i].s_notkey && !o_rules[i].s_notkeymatch) {
+                    showMsg("保存失败,关键词规则中有排除词未对应匹配方式!")
+                    return;
+                }
+            }
+        }
+        dataMap["s_tagname"] = $('#tagname').val();
+        dataMap["s_globaladdkey"] = $('#g_addkey').val();
+        dataMap["s_globalnotkey"] = $('#g_notkey').val();
+        dataMap["s_globalclearkey"] = $('#s_globalclearkey').val();
+        if (dataMap["s_tagname"] == "") {
+            alert("请填写必须字段!")
+            return
+        }
+        if ($('#starttime').find("input").val() != "") {
+            var start = $('#starttime').find("input").val();
+            start = new Date(start).getTime() / 1000;
+            dataMap["i_starttime"] = start;
+        }
+        if ($('#endtime').find("input").val() != "") {
+            var end = $('#endtime').find("input").val();
+            end = new Date(end).getTime() / 1000;
+            dataMap["i_endtime"] = end;
+        }
+        var budget = "";
+        if ($('#s_budget_min').val() != "") {
+            budget = "大于" + $('#s_budget_min').val()
+        }
+        if ($('#s_budget_max').val() != "") {
+            if (budget == "") {
+                budget = "小于" + $('#s_budget_max').val()
+            }else {
+                budget = budget + ",小于" + $('#s_budget_max').val()
+            }
+        }
+        dataMap["s_budgetlimit"] = budget
+        var bidamount = "";
+        if ($('#s_bidamount_min').val() != "") {
+            bidamount = "大于" + $('#s_bidamount_min').val()
+        }
+        if ($('#s_bidamount_max').val() != "") {
+            if (bidamount == "") {
+                bidamount = "小于" + $('#s_bidamount_max').val()
+            }else {
+                bidamount = bidamount + ",小于" + $('#s_bidamount_max').val()
+            }
+        }
+        dataMap["s_bidamountlimit"] = bidamount
+        if ($('#maxnum').val() !== "") {
+            dataMap["i_maxnum"] = $('#maxnum').val();
+        }
+        if (dataMap.s_globaladdkeymatch.indexOf("1") > -1 || dataMap.s_globaladdkeymatch.indexOf("2") > -1 || dataMap.s_globaladdkeymatch.indexOf("3") > -1 ||
+            dataMap.s_globaladdkeymatch.indexOf("4") > -1 || dataMap.s_globaladdkeymatch.indexOf("5") > -1) {
+            dataMap["i_globaladdkeytype"] = 1
+        }else if (dataMap.s_globaladdkeymatch.indexOf("6") > -1 || dataMap.s_globaladdkeymatch.indexOf("7") > -1 ||
+            dataMap.s_globaladdkeymatch.indexOf("8") > -1 || dataMap.s_globaladdkeymatch.indexOf("9") > -1) {
+            dataMap["i_globaladdkeytype"] = 2
+        }else {
+            dataMap["i_globaladdkeytype"] = 0
+        }
+        if (dataMap.s_globalnotkeymatch.indexOf("1") > -1 || dataMap.s_globalnotkeymatch.indexOf("2") > -1 || dataMap.s_globalnotkeymatch.indexOf("3") > -1 ||
+            dataMap.s_globalnotkeymatch.indexOf("4") > -1 || dataMap.s_globalnotkeymatch.indexOf("5") > -1) {
+            dataMap["i_globalnotkeytype"] = 1
+        }else if (dataMap.s_globalnotkeymatch.indexOf("6") > -1 || dataMap.s_globalnotkeymatch.indexOf("7") > -1 ||
+            dataMap.s_globalnotkeymatch.indexOf("8") > -1 || dataMap.s_globalnotkeymatch.indexOf("9") > -1) {
+            dataMap["i_globalnotkeytype"] = 2
+        }else {
+            dataMap["i_globalnotkeytype"] = 0
+        }
+        dataMap["o_rules"] = JSON.stringify(o_rules);
+        console.log(ids)
+        dataMap["ids"] = ids
+        $.ajax({
+            url: "/service/cuser/rule/create",
+             type: 'POST',
+             data: dataMap,
+             success: function (r) {
+                 if (r.rep && r.id) {
+                    dataMap["id"]= r.id;
+                    dataMap["s_dataid"] = r.s_dataid;
+                     $('#es_div').show();
+                     $('#estxt').val(r.s_esquery);
+                    state = 2;
+                    showTip("保存成功",1000);
+                 } else {
+                    showTip("保存失败",1000);
+                 }
+             }
+         })
+    }
+
+    //导入标签
+    function importRule() {
+        $("#file").click();
+    }
+    $(function() {
+        $("#uploadform").find("input").change(function () {
+            var val = $(this).val() ? $(this).val() : "";
+            if (val.indexOf(".xlsx") < 0) {
+                showMsg("文件格式非法", function () {
+                });
+            } else {
+                var myform = new FormData();
+                myform.append('xlsx', $("#file")[0].files[0]);
+                $.ajax({
+                    url: "/service/rule/import",
+                    type: 'POST',
+                    data: myform,
+                    async: false,
+                    contentType: false,//不要设置Content-Type请求头
+                    processData: false,// 使数据不做处理
+                    success: function (r) {
+                        if (r.rep) {
+                           // dataMap["id"] = r.id;
+                            addkeyWord(r.rdata);
+                            s_dataid = r.s_dataid;
+                            showTip("导入成功",1000);
+                        } else {
+                            showTip("导入失败",1000);
+                        }
+                    }
+                })
+            }
+        })
+    });
+    //生成数据
+    function produceData() {
+        if (dataMap.id == undefined || dataMap.id == "") {
+            alert("请先保存标签");
+            return
+        }
+        com.maskShow("正在生成数据...");
+        $.ajax({
+            url:"/service/rule/produce",
+            type:"post",
+            data: {"id": dataMap.id},
+            success:function(r){
+                com.maskHide();
+                if(r.rep){
+                    dataMap.i_estotal = r.count
+                    showTip("数据生成成功", 1000);
+                }else{
+                    showTip("数据生成失败",1000);
+                }
+            }
+        })
+    }
+    //预览数据
+    function previewData() {
+        if (state == 2) {
+           myDataTable = $('#previewData').DataTable({
+                "destroy": true,
+                "paging": true,
+                "lengthChange": false,
+                "searching": false,
+                "ordering": false,
+                "info": true,
+                "autoWidth": true,
+                "serverSide": true,
+                "ajax": {
+                    url: "/service/rule/preview",
+                    type: "post",
+                    data: {"s_dataid": dataMap.s_dataid},
+                },
+                "language": {
+                    "url": "/dist/js/dataTables.chinese.lang"
+                },
+                "fnDrawCallback": function () {
+                    $("ul.pagination").prepend("&nbsp;&nbsp;&nbsp;转到第 <input type='text' id='changePage'   style='width:20px;'> 页    <a type='text' href='javascript:void(0);' id='dataTable-btn' style='text-align:center'>GO</a>");
+                    $('#dataTable-btn').click(function (e) {
+                        var redirectpage = 0;
+                        if ($("#changePage").val() && $("#changePage").val() > 0) {
+                            var redirectpage = $("#changePage").val() - 1;
+                        }
+                        myDataTable.page(redirectpage).draw(false);
+                    });
+                    this.api().column(0).nodes().each(function (cell, i) {
+                        cell.innerHTML = i + 1;
+                    });
+                },
+                "columns": [
+                    {"data": null, width: "2%"},
+                    {"data": function(row) {
+                            if (row.s_matchkey) {
+                                return row.s_matchkey
+                            }else {
+                                return ""
+                            }
+                        }, width: "8%"},
+                    {"data": function(row) {
+                            if (row.area) {
+                                return row.area
+                            }else {
+                                return ""
+                            }
+                        }, width: "4%"},
+                    {"data": function(row) {
+                            if (row.city) {
+                                return row.city
+                            }else {
+                                return ""
+                            }
+                        }, width: "4%"},
+                    {"data": function (row) {
+                            if (row.s_jyhref) {
+                                tmp = '<a class="" target="_blank" href='+row.s_jyhref+'>'+row.title+'</a>';
+                                return tmp
+                            }else {
+                                return row.title
+                            }
+                        }, width: "5%"},
+                    {"data": function(row) {
+                            if (row.subtype) {
+                                return row.subtype
+                            }else {
+                                return ""
+                            }
+                        }, 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) {
+                            var dt = new Date();
+                            dt.setTime(parseInt(row.publishtime)*1000);
+                            return dt.format("yyyy-MM-dd")
+                        }, width: "4%"},
+                    {"data": function (row) {
+                            if (row.href) {
+                                var shref = row.href;
+                                tmp = '<a class="" target="_blank" href='+shref+'>公告地址</a>';
+                                return tmp
+                            }else {
+                                return ""
+                            }
+                        }, width: "5%"},
+                    {"data": function (row) {
+                            if (row.projectscope) {
+                                if (row.projectscope.length > 14) {
+                                    return row.projectscope.substring(0, 14) + "..."
+                                } else {
+                                    return row.projectscope
+                                }
+                            }
+                            return ""
+                        }, width: "5%"},
+                    {"data": "projectname", width: "5%"},
+                    {"data": function (row) {
+                            if (row.projectscope) {
+                                return row.projectscope
+                            }
+                            return ""
+                        }, width: "3%"},
+                    {"data": function (row) {
+                            if (row.budget == undefined) {
+                                return ""
+                            }else {
+                                return row.budget
+                            }
+                        }, width: "3%"},
+                    {"data": function (row) {
+                            if (row.bidamount == undefined) {
+                                return ""
+                            }else {
+                                return row.bidamount
+                            }
+                        }, width: "3%"},
+                    {"data": "bidopentime", width: "3%", render: function (val) {
+                            if (val) {
+                                var dt = new Date();
+                                dt.setTime(parseInt(val)*1000);
+                                return dt.format("yyyy-MM-dd")
+                            }else {
+                                return ""
+                            }
+                        }},
+                    {"data": "buyer", width: "3%", render: function (val) {
+                            if (val == undefined) {
+                                val = ""
+                            }
+                            return val
+                        }},
+                    {"data": function (row) {
+                            if (row.buyerperson) {
+                                return row.buyerperson
+                            }else {
+                                return ""
+                            }
+                        }, width: "4%"},
+                    {"data": function (row) {
+                            if (row.buyertel) {
+                                return row.buyertel
+                            }else {
+                                return ""
+                            }
+                        }, width: "4%"},
+                    {"data": "agency", width: "5%", render: function (val) {
+                            if (val == undefined) {
+                                val = ""
+                            }
+                            return val
+                        }},
+                    {"data": "winner", width: "3%", render: function (val) {
+                            if (val == undefined) {
+                                val = ""
+                            }
+                            return val
+                        }},
+                    {"data": function (row) {
+                            if (row.winnerperson) {
+                                return row.winnerperson
+                            }else {
+                                return ""
+                            }
+                        }, width: "4%"},
+                    {"data": function (row) {
+                            if (row.winnertel) {
+                                return row.winnertel
+                            }else {
+                                return ""
+                            }
+                        }, width: "4%"},
+                    {"data": function (row) {
+                            if (row.legal_person) {
+                                return row.legal_person
+                            }else {
+                                return ""
+                            }
+                        }, width: "4%"},
+                    {"data": function (row) {
+                            if (row.company_phone) {
+                                return row.company_phone
+                            }else {
+                                return ""
+                            }
+                        }, width: "4%"},
+                    {"data": function (row) {
+                            if (row.company_email) {
+                                return row.company_email
+                            }else {
+                                return ""
+                            }
+                        }, width: "4%"},
+                ]
+            });
+            $('#modal-preview').modal("show");
+            if (dataMap.i_extfieldstype == 1) {
+                var str = "标准字段包 " + dataMap.i_maxnum + "/" + dataMap.i_estotal;
+                $('#dataCount').html(str)
+            } else {
+                var str = "高级字段包 " + dataMap.i_maxnum + "/" + dataMap.i_estotal;
+                $('#dataCount').html(str)
+            }
+        }else {
+            alert("请先保存标签");
+        }
+    }
+    
+    //下载es
+    function downloades(){
+      if(state==1){
+        alert("请先保存标签")
+      }else{
+        $("#download").attr("href","/service/rule/exportes?id="+dataMap["id"])
+      }
+    }
+    
+    //存档
+    function archive(){
+      if(state == 1){
+        alert("请先保存标签");
+        return
+      }else{
+        showConfirm("是否存档?", function() {
+          $.ajax({
+              url:"/service/rule/archive",
+              type:"post",
+              data:{"_id":dataMap["id"]},
+              success:function(r){
+                if(r.rep){
+                  showTip("存档成功",1000);
+                  //ttable.ajax.reload();
+                }else{
+                  showTip("存档失败",1000);
+                }
+              }
+          })
+        });
+      }
+    }
+
+    var key_flag = -1;      // 0:新增,1:修改
+    //关键词表格新增
+    function add_Rule() {
+        key_flag = 0;
+        $('#keyword_txt').val("");
+        $('#addword_txt').val("");
+        $('#notword_txt').val("");
+        $('#modal-add-keyword').modal("show");
+    }
+    //关键词修改
+    function modify_Rule(){
+        if (selectIndex.length == 1) {
+            key_flag = 1;
+            var index = selectIndex[0] - 1;
+            $('#modal-add-keyword').modal("show");
+            $('#keyword_txt').val(o_rules[index].s_matchkey);
+            $('#addword_txt').val(o_rules[index].s_addkey);
+            $('#notword_txt').val(o_rules[index].s_notkey);
+        }else {
+            showTip("请选中需要修改的关键词,且只能选中一条", 1000)
+        }
+
+    }
+    function saveKeyword() {
+        var key = $('#keyword_txt').val();
+        var addkey = $('#addword_txt').val();
+        var notkey = $('#notword_txt').val();
+        if (key != "") {
+            var rule = {};
+            rule["s_matchkey"] = key.replace(",", ",");
+            if (addkey != "") rule["s_addkey"] = addkey.replace(",", ",");
+            if (notkey != "") rule["s_notkey"] = notkey.replace(",", ",");
+            $('#modal-add-keyword').modal('hide');
+            if (key_flag == 1) {
+                var index = selectIndex[0] - 1;
+                o_rules.splice(index, 1, rule)
+            }else {
+                o_rules.push(rule)
+            }
+            $('#keywords').dataTable().fnClearTable();
+            $('#keywords').dataTable().fnAddData(o_rules);
+        }else {
+            showTip("关键词不能为空", 500)
+        }
+    }
+    //关键词删除
+    function del_Rule() {
+        if (keyTableChecked && selectIndex.length > 0) {
+            showConfirm("确定删除?", function() {
+                var tmp = []
+                for (var i in selectIndex) {
+                    var j = selectIndex[i] - 1;
+                    tmp.push(j)
+                }
+                o_rules = deleteArrayVal(o_rules, tmp)
+                $('#keywords').dataTable().fnClearTable();
+                $('#keywords').dataTable().fnAddData(o_rules);
+
+                keyTableChecked = false;
+                if (o_rules.length == 0) {
+                    $('#allCheckbox').prop("checked", false);
+                    $('#keywords').dataTable().fnClearTable();
+                }
+            })
+        }else {
+            showTip("请选中需要删除的关键词", 500)
+        }
+    }
+
+    function checkArea(area, city, district) {
+        let flag = true;
+        let v1 = "";
+        let v2 = ""
+        if (area == "" && city == "" && district == "") {
+            flag = true
+        }
+        if (city != "" && area != "") {
+            var areaArr = area.split(",");
+            var cityArr = city.split(",");
+            for (var i in areaArr) {
+                if (cityMap[areaArr[i]] != undefined) {
+                    for (var j in cityArr) {
+                        if ($.inArray(cityArr[j], cityMap[areaArr[i]]) > -1) {
+                            flag = false;
+                            v1 = areaArr[i];
+                            v2 = cityArr[j]
+                        }
+                    }
+                }
+            }
+            return {flag: flag, v1: v1, v2: v2}
+        }
+        if (city != "" && district != "") {
+            var cityArr = city.split(",");
+            var districtArr = district.split(",");
+            for (var i in cityArr) {
+                if (districtMap[cityArr[i]] != undefined) {
+                    for (var j in districtArr) {
+                        let dis = districtArr[j].split("-")[1];
+                        if ($.inArray(dis, districtMap[cityArr[i]]) > -1) {
+                            flag = false;
+                            v1 = cityArr[i];
+                            v2 = districtArr[j]
+                        }
+                    }
+                }
+            }
+            return {flag: flag, v1: v1, v2: v2}
+        }
+        return {flag: flag, v1: v1, v2: v2}
+    }
+</script>

+ 5 - 8
src/web/templates/private/cuser_rule_list.html

@@ -6,12 +6,12 @@
 <div class="content-wrapper" id="showbtn">
     <section class="content-header">
         <h1>
-            <small><a href="/service/rule/create" class="btn btn-primary opr">新增标签</a></small>
+            <small><a id="addTag" class="btn btn-primary opr">新增标签</a></small>
         </h1>
         <ol class="breadcrumb">
             <li><a href="#"><i class="fa fa-dashboard"></i> 首页</a></li>
             <li><a href="/service/customer/list"> 客户列表</a></li>
-            <li><a href="/service/customer/edit?id={{.T.id}}"> 编辑客户</a></li>
+            <li><a href="/service/customer/edit?id={{.T.cid}}"> 编辑客户</a></li>
             <li><a href="#"> 客户规则</a></li>
         </ol>
     </section>
@@ -25,9 +25,7 @@
                             <thead>
                             <tr>
                                 <th>编号</th>
-                                <th>客户名称</th>
                                 <th>标签名称</th>
-                                <th>销售经理</th>
                                 <th>修改时间</th>
                                 <th>操作</th>
                                 <th>功能</th>
@@ -68,7 +66,8 @@
 {{include "com/footer.html"}}
 <script>
     menuActive("/customer/list");
-
+    var ids = {{.T.did}} + "," + {{.T.cid}}
+    $('#addTag').attr("href", "/service/cuser/rule/create?ids="+ids)
     $(function () {
         ttable = $('#dataTable').DataTable({
             "paging": true,
@@ -81,7 +80,7 @@
             "ajax": {
                 "url": "/service/cuser/rule/list",
                 "type": "post",
-                "data": {}
+                "data": {"ids": ids}
             },
             "language": {
                 "url": "/dist/js/dataTables.chinese.lang"
@@ -101,9 +100,7 @@
             },
             "columns": [
                 {"data": null,width:"5%"},
-                {"data": "s_customer"},
                 {"data": "s_tagname"},
-                {"data": "s_salesperson"},
                 {"data": "i_updatetime",width:"9%", render: function (val) {
                   var dt = new Date()
                   dt.setTime(parseInt(val) * 1000);

+ 29 - 1
src/web/templates/private/customer_create.html

@@ -127,6 +127,11 @@
                                 <div class="col-sm-6">
                                     <input class="form-control" placeholder="输入部门名称" id="depart_name"/></div>
                             </div>
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label">子部门名称</label>
+                                <div class="col-sm-6">
+                                    <input class="form-control" placeholder="子部门名称命名规则:部门-子部门" id="s_depart_name"/></div>
+                            </div>
                             <div class="form-group">
                                 <label class="col-sm-3 control-label">部门联系人</label>
                                 <div class="col-sm-6">
@@ -693,10 +698,32 @@
         var index = selectIndex[0] - 1;
         $('#depart_name').val(departArr[index].s_name);
         $('#depart_contract').val(departArr[index].s_contract);
+        $('#s_depart_name').val(departArr[index].s_subname)
         $("#isuseSelect").val(departArr[index].i_state)
         $('#modal-add-depart').modal("show");
     }
     function del_Depart() {
+        if (keyTableChecked && selectIndex.length > 0) {
+            showConfirm("确定删除?", function() {
+                var tmp = []
+                for (var i in selectIndex) {
+                    var j = selectIndex[i] - 1;
+                    tmp.push(j)
+                }
+                departArr = deleteArrayVal(departArr, tmp)
+
+                keyTableChecked = false;
+                if (departArr.length == 0) {
+                    $('#allCheckbox').prop("checked", false);
+                    $('#departTable').dataTable().fnClearTable();
+                }else {
+                    $('#departTable').dataTable().fnClearTable();
+                    $('#departTable').dataTable().fnAddData(departArr);
+                }
+            })
+        }else {
+            showTip("请选中需要删除的关键词", 500)
+        }
     }
     function saveDepart() {
         var name = $('#depart_name').val();
@@ -705,7 +732,8 @@
             var depart = {};
             depart["s_name"] = name;
             depart["s_contract"] = contract;
-            depart["i_isuse"] =  $("#isuseSelect").val()
+            depart["s_subname"] = $('#s_depart_name').val()
+            depart["i_isuse"] = $('#isuseSelect').val()
             if (depart_flag == 1) {
                 var index = selectIndex[0] - 1;
                 departArr.splice(index, 1, depart)

+ 31 - 3
src/web/templates/private/customer_edit.html

@@ -5,7 +5,7 @@
 {{include "com/menu.html"}}
 <div class="content-wrapper">
     <section class="content-header">
-        <h1>新建客户
+        <h1>编辑客户
         </h1>
         <ol class="breadcrumb">
             <li><a href="#"><i class="fa fa-dashboard"></i> 首页</a></li>
@@ -132,6 +132,11 @@
                                 <div class="col-sm-6">
                                     <input class="form-control" placeholder="输入部门名称" id="depart_name"/></div>
                             </div>
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label">子部门名称</label>
+                                <div class="col-sm-6">
+                                    <input class="form-control" placeholder="子部门名称命名规则:部门-子部门" id="s_depart_name"/></div>
+                            </div>
                             <div class="form-group">
                                 <label class="col-sm-3 control-label">部门联系人</label>
                                 <div class="col-sm-6">
@@ -293,9 +298,9 @@
                         return tmp
                     }, width: "10%" },
                 {"data": "_id", width: "20%", render: function (val, a, row, pos) {
-                        var s = [val, row._id];
+                        var s = [val, row.s_userid];
                         tmp = '<div>' +
-                            '<a class="btn btn-sm btn-primary" href="/service/cuser/rule/list?id=' + val + '">规则</a>&nbsp&nbsp' +
+                            '<a class="btn btn-sm btn-primary" href="/service/cuser/rule/list?ids=' + s + '">规则</a>&nbsp&nbsp' +
                             '<a class="btn btn-sm btn-info" href="/service/rule/downloadata?s_dataid=' + val + '">导出数据</a>&nbsp&nbsp' +
                             '<a class="btn btn-sm btn-warning" onclick="archive(\'' + val + '\')">存档</a>' +
                             '</div>';
@@ -705,10 +710,32 @@
         var index = selectIndex[0] - 1;
         $('#depart_name').val(departArr[index].s_name);
         $('#depart_contract').val(departArr[index].s_contract);
+        $('#s_depart_name').val(departArr[index].s_subname)
         $("#isuseSelect").val(departArr[index].i_state)
         $('#modal-add-depart').modal("show");
     }
     function del_Depart() {
+        if (keyTableChecked && selectIndex.length > 0) {
+            showConfirm("确定删除?", function() {
+                var tmp = []
+                for (var i in selectIndex) {
+                    var j = selectIndex[i] - 1;
+                    tmp.push(j)
+                }
+                departArr = deleteArrayVal(departArr, tmp)
+
+                keyTableChecked = false;
+                if (departArr.length == 0) {
+                    $('#allCheckbox').prop("checked", false);
+                    $('#departTable').dataTable().fnClearTable();
+                }else {
+                    $('#departTable').dataTable().fnClearTable();
+                    $('#departTable').dataTable().fnAddData(departArr);
+                }
+            })
+        }else {
+            showTip("请选中需要删除的关键词", 500)
+        }
     }
     function saveDepart() {
         var name = $('#depart_name').val();
@@ -716,6 +743,7 @@
             var depart = {};
             depart["s_name"] = name;
             depart["s_contract"] = $('#depart_contract').val();
+            depart["s_subname"] = $('#s_depart_name').val()
             depart["i_isuse"] =  $("#isuseSelect").val()
             if (depart_flag == 1) {
                 var index = selectIndex[0] - 1;

+ 4 - 5
src/web/templates/private/customer_list.html

@@ -89,8 +89,8 @@
                     "data": "_id", width: "11%", render: function (val, a, row, pos) {
                         var s = [val, row.s_dataid];
                         tmp = '<div>' +
-                            '<a class="btn btn-sm btn-primary" href="/service/customer/edit?id=' + val + '">编辑</a>' +
-                            '<a class="btn btn-sm btn-danger" onclick="del(\'' + s + '\')">删除</a>' +
+                            '<a class="btn btn-sm btn-primary" href="/service/customer/edit?id=' + val + '">编辑</a>&nbsp;&nbsp;' +
+                            '<a class="btn btn-sm btn-danger" href="/service/customer/del?id=' + val + '">删除</a>' +
                             '</div>';
                         return tmp
                     }
@@ -99,9 +99,8 @@
                     "data": "_id", width: "20%", render: function (val, a, row, pos) {
                         var s = [val, row._id];
                         tmp = '<div>' +
-                            '<a class="btn btn-sm btn-primary" href="/service/cuser/rule/list?id=' + val + '">规则</a>' +
-                            '<a class="btn btn-sm btn-info" href="/service/rule/downloadata?s_dataid=' + val + '">导出数据</a>' +
-                            '<a class="btn btn-sm btn-warning" onclick="archive(\'' + val + '\')">存档</a>' +
+                            '<a class="btn btn-sm btn-primary" href="/service/cuser/converted?id=' + val + '">转企</a>&nbsp;&nbsp;' +
+                            '<a class="btn btn-sm btn-warning" onclick="archive(\'' + val + '\')">同步</a>' +
                             '</div>';
                         return tmp
                     }