Browse Source

no message

Jianghan 4 years ago
parent
commit
27a3c67805

+ 1 - 1
back/dataprocess/src/web/res/jsoneditor/js/jsoneditor.js

@@ -1864,7 +1864,7 @@ return /******/ (function(modules) { // webpackBootstrap
 	    // comes *before* the @-sign.
 	    // URLs are obnoxious.
 	    //
-	    // ex:
+	    // qy_pingan:
 	    // http://a@b@c/ => user:a@b host:c
 	    // http://a@b?@c => user:a host:c path:/?@c
 

+ 1 - 1
domainameclear/src/mgoutil/go.mongodb.org/mongo-driver/x/mongo/driver/topology/resource_pool_test.go

@@ -149,7 +149,7 @@ func TestResourcePool(t *testing.T) {
 				t.Fatalf("count mismatch; expected ec.stale to be called 7 times, got %v", ec.expiredCalled)
 			}
 			if ec.closeCalled != 3 {
-				t.Fatalf("count mismatch; expected ex.closeConnection to be called 3 times, got %v", ec.closeCalled)
+				t.Fatalf("count mismatch; expected qy_pingan.closeConnection to be called 3 times, got %v", ec.closeCalled)
 			}
 		})
 	})

+ 1 - 1
fullproject/src_v1/config.json

@@ -4,7 +4,7 @@
     "statusdays": 15,
 	"mongodbServers": "192.168.3.207:27092",
     "mongodbPoolSize": 10,
-    "mongodbName": "extract_kf",
+    "mongodbName": "wjh",
 	"hints":"publishtime_1",
     "extractColl": "jh_info",
     "projectColl": "jh_project",

+ 8 - 8
fullproject/src_v1/main.go

@@ -71,7 +71,7 @@ func DealSign() {
 	}
 }
 
-func main() {
+func mainT() {
 	//udp跑增量  id段   project
 	//udp跑全量			qlT
 	//udp跑历史数据  信息id1,id2/或id段  ls
@@ -90,9 +90,9 @@ func main() {
 }
 
 //测试组人员使用
-func mainT() {
-	sid = "5e69e7cc85a9271abf1bdb0a"
-	eid = "5e993c6185a9271abf2f51b5"
+func main() {
+	sid = "5721bfb6eabf8ffeff6081e3"
+	eid = "58d94230e1382336074b3197"
 	//flag.StringVar(&sid, "sid", "", "开始id")
 	//flag.StringVar(&eid, "eid", "", "结束id")
 	//flag.Parse()
@@ -104,7 +104,7 @@ func mainT() {
 	}
 	mapinfo["gtid"] = sid
 	mapinfo["lteid"] = eid
-	mapinfo["stype"] = "updateMoneyMgo"
+	mapinfo["stype"] = "ql"
 	mapinfo["ip"] = "127.0.0.1"
 	mapinfo["port"] = Sysconfig["udpport"]
 	if Sysconfig["loadStart"] != nil {
@@ -116,9 +116,9 @@ func mainT() {
 	P_QL.loadSite()
 	P_QL.currentType = mapinfo["stype"].(string)
 	P_QL.pici = time.Now().Unix()
-	//P_QL.taskQl(mapinfo)
-	P_QL.taskQuery()
-	time.Sleep(20 * time.Second)
+	P_QL.taskQl(mapinfo)
+	//P_QL.taskQuery()
+	time.Sleep(99999 * time.Hour)
 }
 
 func mainS() {

+ 47 - 37
fullproject/src_v1/project.go

@@ -225,6 +225,10 @@ func (p *ProjectTask) startProjectMerge(info *Info, tmp map[string]interface{})
 	}
 
 	if !bFindProject {
+		if info.SubType == "" || info.SubType == "变更" || info.SubType == "验收" || info.SubType == "违规"  ||
+			info.SubType == "结果变更" || info.SubType == "其它" {
+			return
+		}
 		id, p1 := p.NewProject(tmp, info)
 		p.AllIdsMapLock.Lock()
 		p.AllIdsMap[id] = &ID{Id: id, P: p1}
@@ -448,15 +452,19 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
 	set := map[string]interface{}{}
 	set["_id"] = pId
 	for _, f := range FIELDS {
-		if tmp[f] != nil {
+		if tmp[f] != nil && tmp[f] != "" {
 			set[f] = tmp[f]
 		}
 	}
+	//保存补充过后的area、city
+	if qu.ObjToString(set["area"]) != thisinfo.Area {
+		set["area"] = thisinfo.Area
+		set["city"] = thisinfo.City
+	}
 	bidopentime := qu.Int64All(tmp["bidopentime"])
 	if bidopentime > 0 {
 		set["bidopentime"] = bidopentime
 	}
-
 	//异常标记
 	if thisinfo.TopType != "招标" && thisinfo.TopType != "拟建" && thisinfo.TopType != "预告" {
 		set["exception"] = 1
@@ -564,11 +572,6 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
 	} else {
 		set["multipackage"] = 0
 	}
-
-	if thisinfo.Buyer == "" {
-		set["buyerclass"] = ""
-	}
-
 	//项目评审专家
 	if len(thisinfo.ReviewExperts) > 0 {
 		set["review_experts"] = thisinfo.ReviewExperts
@@ -603,7 +606,6 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
 	set["infofield"] = map[string]interface{}{
 		thisinfo.Id: res,
 	}
-
 	push := p.PushListInfo(tmp, thisinfo.Id)
 	push["s_winner"] = strings.Join(thisinfo.Winners, ",")
 	set["list"] = []bson.M{
@@ -846,6 +848,22 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 	if pInfo.Buyer == "" {
 		set["buyerclass"] = ""
 	}
+	//采购单位联系人
+	if thisinfo.Buyerperson != "" {
+		pInfo.Buyerperson = thisinfo.Buyerperson
+		set["buyerperson"] = pInfo.Buyerperson
+	}else {
+		pInfo.Buyerperson = ""
+		set["buyerperson"] = ""
+	}
+	//采购单位電話
+	if thisinfo.Buyertel != "" {
+		pInfo.Buyertel = thisinfo.Buyertel
+		set["buyertel"] = pInfo.Buyertel
+	}else {
+		pInfo.Buyertel = ""
+		set["buyertel"] = ""
+	}
 	if thisinfo.ContractCode != "" {
 		set["contractcode"] = pInfo.ContractCode + "," + thisinfo.ContractCode
 	}
@@ -855,16 +873,6 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 		pInfo.Agency = thisinfo.Agency
 		set["agency"] = thisinfo.Agency
 	}
-	//9--采购单位联系人
-	if thisinfo.Buyerperson != "" && strings.Index(pInfo.Buyerperson, thisinfo.Buyerperson) < 0 {
-		pInfo.Buyerperson = thisinfo.Buyerperson
-		set["buyerperson"] = pInfo.Buyerperson
-	}
-	//10--采购单位電話
-	if thisinfo.Buyertel != "" && strings.Index(pInfo.Buyertel, thisinfo.Buyertel) < 0 {
-		pInfo.Buyertel = thisinfo.Buyertel
-		set["buyertel"] = pInfo.Buyertel
-	}
 
 	if len(thisinfo.Topscopeclass) > 0 {
 		sort.Strings(pInfo.Topscopeclass)
@@ -909,13 +917,8 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 		for _, v := range thisinfo.WinnerOrder{
 			list = append(list, qu.ObjToString(v["entname"]))
 		}
-		for _, k := range list {
-			if BinarySearch(list, k) == -1 {
-				pInfo.Winnerorder = append(pInfo.Winnerorder, k)
-				sort.Strings(pInfo.Winnerorder)
-			}
-		}
-		set["winnerorder"] = pInfo.Winnerorder
+		set["winnerorder"] = list
+		pInfo.Winnerorder = list
 	}
 
 	if len(thisinfo.Subscopeclass) > 0 {
@@ -1003,7 +1006,6 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 	if len(set) > 0 {
 		update["$set"] = set
 	}
-	//保留原数据吧
 	push := p.PushListInfo(tmp, thisinfo.Id)
 	push["s_winner"] = strings.Join(thisinfo.Winners, ",")
 	push["compareStr"] = comStr
@@ -1013,6 +1015,11 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 		"list": push,
 		"ids":  thisinfo.Id,
 	}
+	//clearMap := map[string]interface{}{}
+	//ClearData(clearMap, set)
+	//if len(clearMap) > 0 {
+	//	update["$unset"] = clearMap
+	//}
 	if len(update) > 0 {
 		updateInfo := []map[string]interface{}{
 			{
@@ -1066,7 +1073,7 @@ func (p *ProjectTask) CompareStatus(project *ProjectInfo, info *Info) (bool, int
 }
 
 /*
- *	对比地区(省、市、区),存在且不同,不能合并
+ *	对比地区(省、市),存在且不同,不能合并
  *	返回是否新建项目
  */
 func ComparePlace(project *ProjectInfo, info *Info) bool {
@@ -1080,17 +1087,12 @@ func ComparePlace(project *ProjectInfo, info *Info) bool {
 		if info.City == "" || project.City == "" {
 			return false
 		} else if info.City == project.City {
-			if project.District == "" || info.District == "" || info.District == project.District {
-				return false
-			} else {
-				return true
-			}
-		} else {
-			return true
+			return false
 		}
 	} else {
 		return true
 	}
+	return true
 }
 
 var PackageEle = []string{
@@ -1215,7 +1217,7 @@ func CountAmount(project *ProjectInfo, info *Info, tmp map[string]interface{}) {
 				}
 			}
 		} else {
-			if project.Budget > info.Budget {
+			if info.Budget > 0 && project.Budget < info.Budget {
 				project.Budget = info.Budget
 				project.Budgettag = 0
 			}
@@ -1272,7 +1274,7 @@ func CountAmount(project *ProjectInfo, info *Info, tmp map[string]interface{}) {
 				}
 			} else {
 				if info.SubType == "中标" || info.SubType == "成交" {
-					if project.Bidamount > info.Bidamount {
+					if info.Bidamount > 0 {
 						project.Bidamount = info.Bidamount
 						project.Bidamounttag = 0
 					} else {
@@ -1292,7 +1294,7 @@ func CountAmount(project *ProjectInfo, info *Info, tmp map[string]interface{}) {
 								project.Bidamount = project.Bidamount + info.Bidamount
 								project.Bidamounttag = 0
 							} else {
-								if project.Bidamount > info.Bidamount {
+								if info.Budget > 0 && project.Bidamount > info.Bidamount {
 									project.Bidamount = info.Bidamount
 									project.Bidamounttag = 0
 								}
@@ -1320,3 +1322,11 @@ func StructToMap(filed InfoField) map[string]interface{} {
 	err = json.Unmarshal(result, &res)
 	return res
 }
+
+func ClearData(clearMap, tmp map[string]interface{}) {
+	for k, v := range tmp {
+		if v == "" {
+			clearMap[k] = ""
+		}
+	}
+}

+ 4 - 15
fullproject/src_v1/task.go

@@ -595,7 +595,7 @@ func (p *ProjectTask) enter(db, coll string, q map[string]interface{}) {
 	}()
 	fields := map[string]interface{} {"area": 1, "city": 1, "district": 1, "comeintime": 1, "publishtime": 1, "bidopentime": 1, "title": 1, "projectname": 1, "href": 1,
 		"projectcode": 1, "buyerclass": 1, "winner": 1, "s_winner": 1, "buyer": 1, "buyerperson": 1, "buyertel": 1, "infoformat": 1, "toptype": 1, "subtype": 1, "spidercode": 1,
-		"site": 1, "topscopeclass": 1, "subscopeclass": 1, "bidamount": 1, "budget": 1, "agency": 1, "package": 1, "jsondata": 1, "review_experts": 1, "purchasing": 1}
+		"site": 1, "topscopeclass": 1, "subscopeclass": 1, "bidamount": 1, "budget": 1, "agency": 1, "package": 1, "jsondata": 1, "review_experts": 1, "purchasing": 1, "winnerorder": 1}
 	ms := sess.DB(db).C(coll).Find(q).Select(fields).Sort("publishtime")
 	if Sysconfig["hints"] != nil {
 		ms.Hint(Sysconfig["hints"])
@@ -886,8 +886,7 @@ func modifyEle(tmpPro map[string]interface{}, tmp map[string]interface{}) (map[s
 func (p *ProjectTask) fillInPlace(tmp map[string]interface{}) {
 	area := util.ObjToString(tmp["area"])
 	city := util.ObjToString(tmp["city"])
-	district := util.ObjToString(tmp["district"])
-	if area != "" && city != "" && district != "" {
+	if area != "" && city != "" {
 		return
 	}
 
@@ -909,23 +908,13 @@ func (p *ProjectTask) fillInPlace(tmp map[string]interface{}) {
 			if area != site.Area {
 				return
 			} else {
-				if city == site.City {
-					if district == "" {
-						tmp["district"] = site.District
-						return
-					}
-				} else if city == "" {
-					tmp["city"] = site.City
-					tmp["district"] = site.District
-					return
-				} else if site.City == "" {
-					return
+				if site.City != "" {
+					tmp["area"] = site.City
 				}
 			}
 		} else {
 			tmp["area"] = site.Area
 			tmp["city"] = site.City
-			tmp["district"] = site.District
 			return
 		}
 	}

+ 3 - 2
projectforecast/config.json

@@ -1,8 +1,9 @@
 {
-  "mongodbServers": "192.168.3.166:27082",
+  "mongodbServers": "192.168.3.207:27092",
   "mongodbPoolSize": 10,
-  "mongodbName": "bqData",
+  "mongodbName": "mixdata",
   "mongoColl_pro": "projectinfo_c",
+  "mongoColl_ent": "buyer_enterprise",
   "mongoColl_tag": "project_biaoqian",
   "mongoColl_save": "project_forecast",
   "udpport": ":1182",

+ 3 - 1
projectforecast/main.go

@@ -15,6 +15,7 @@ var (
 	CollPro     string //项目表
 	CollTag     string //标签表
 	CollSave    string
+	CollEnt		string
 	Rate        string
 	Forecast    map[string]interface{}
 	Category    []interface{}
@@ -40,6 +41,7 @@ func init() {
 	CollPro = Sysconfig["mongoColl_pro"].(string)
 	CollTag = Sysconfig["mongoColl_tag"].(string)
 	CollSave = Sysconfig["mongoColl_save"].(string)
+	CollEnt = Sysconfig["mongoColl_ent"].(string)
 	Rate = util.ObjToString(Sysconfig["rate"])
 	Forecast = Sysconfig["forecast"].(map[string]interface{})
 	Category = Sysconfig["category"].([]interface{})
@@ -54,7 +56,7 @@ func init() {
 
 func main() {
 	go SaveMgo()
-	//GetProjectData("1597386920")
+	GetProjectData("1567295000")
 	ch := make(chan bool, 1)
 	<-ch
 }

+ 15 - 7
projectforecast/task.go

@@ -89,7 +89,7 @@ func GetProjectData(t string) {
 		},
 	}
 	qu.Debug("query-----", CollPro, query["updatetime"])
-	filed := map[string]interface{}{"area": 1, "city": 1, "buyer": 1, "projectname": 1, "category": 1, "nature": 1, "category_buyer": 1, "category_purpose": 1, "stage": 1, "o_projectinfo": 1}
+	filed := map[string]interface{}{"area": 1, "city": 1, "buyer": 1, "projectname": 1, "category": 1, "nature": 1, "category_buyer": 1, "category_purpose": 1, "stage": 1, "o_projectinfo": 1, "title": 1}
 	it := sess.DB(Dbname).C(CollPro).Select(filed).Find(query).Iter()
 	var lastid interface{}
 L:
@@ -135,10 +135,20 @@ func ForecastMethod(pro map[string]interface{}) {
 		"stage":    bson.M{"$in": Forecast[stage]},
 	}
 	var maps []map[string]interface{}
-	if pro["results"] != nil {
-		maps = qu.ObjArrToMapArr(pro["results"].([]interface{}))
-	} else {
-		maps = []map[string]interface{}{}
+	ent, _ := MongoTool.FindOne(CollEnt, bson.M{"buyer_name": pro["buyer"]})
+	if len(*ent) > 0 && (*ent)["buyerclass"] != nil {
+		arr := qu.ObjArrToStringArr((*ent)["buyerclass"].([]interface{}))
+		if len(arr) == 1 {
+			pro["buyerclass"] = arr
+		}else {
+			var arrTmp  []string
+			for _, v := range arr {
+				if v != "其它" {
+					arrTmp = append(arrTmp, v)
+				}
+			}
+			pro["buyerclass"] = arrTmp
+		}
 	}
 	result, _ := MongoTool.Find(CollTag, q, nil, nil, false, -1, -1)
 	for _, t := range *result {
@@ -157,8 +167,6 @@ func ForecastMethod(pro map[string]interface{}) {
 	if len(maps) > 0 {
 		pro["results"] = maps
 	}
-	//update := map[string]interface{}{}
-	//update["$set"] = pro
 	MgoSaveCache <- pro
 }
 

+ 1 - 1
qyxy/src/mgoutil/go.mongodb.org/mongo-driver/x/mongo/driver/topology/resource_pool_test.go

@@ -149,7 +149,7 @@ func TestResourcePool(t *testing.T) {
 				t.Fatalf("count mismatch; expected ec.stale to be called 7 times, got %v", ec.expiredCalled)
 			}
 			if ec.closeCalled != 3 {
-				t.Fatalf("count mismatch; expected ex.closeConnection to be called 3 times, got %v", ec.closeCalled)
+				t.Fatalf("count mismatch; expected qy_pingan.closeConnection to be called 3 times, got %v", ec.closeCalled)
 			}
 		})
 	})

+ 74 - 0
qyxy_change/qy_baidu/config.json

@@ -0,0 +1,74 @@
+{
+  "mongodbServer": "192.168.3.207:27092",
+  "mongodbPoolSize": 5,
+  "mongodbName": "mixdata",
+  "coll_baidu": "baidu_enterprise",
+  "coll_qy": "qyxy",
+  "coll_change": "qyxy_change_1",
+  "coll_back": "qyxy_change_back",
+  "pingan": {
+    "dbServer": "192.168.3.207:27092",
+    "dbName": "mixdata",
+    "dbColl": ""
+  },
+  "lasttime": 1600246800,
+  "tasktime": 1,
+  "changeType": [
+    {
+      "change_code": "100001",
+      "change_name": "投资人变更(人事变动)",
+      "change_push": true,
+      "change_info": "投资人、合伙人、投资者等名称变更",
+      "change_keyword": ["投资人", "合伙人", "投资者", "董事", "经营者", "股东"]
+    },
+    {
+      "change_code": "100002",
+      "change_name": "经营范围变更",
+      "change_push": true,
+      "change_info": "经营范围变更",
+      "change_keyword": ["经营范围", "业务范围", "许可经营项目", "隶属企业变更", "母公司变更", "隶属集团变更"]
+    },
+    {
+      "change_code": "100003",
+      "change_name": "经营期限变更",
+      "change_push": false,
+      "change_info": "经营期限",
+      "change_keyword": ["经营期限", "营业期限", "驻在期限", "合伙期限"]
+    },
+    {
+      "change_code": "100004",
+      "change_name": "高级管理人员备案",
+      "change_push": true,
+      "change_info": "投资人、董事、高管",
+      "change_keyword": ["高级管理人员", "高管人员", "经理", "主要人员", "负责人", "代表", "理事", "监事", "委员", "法定代表人", "主要部门人员"]
+    },
+    {
+      "change_code": "100005",
+      "change_name": "其他事项备案",
+      "change_push": false,
+      "change_info": "其他事项备案",
+      "change_keyword": ["备案", "设立"]
+    },
+    {
+      "change_code": "100006",
+      "change_name": "章程备案变更",
+      "change_push": false,
+      "change_info": "章程备案变更",
+      "change_keyword": ["章程修正", "章程备案", "合伙协议"]
+    },
+    {
+      "change_code": "100007",
+      "change_name": "经营场所,地址变更",
+      "change_push": false,
+      "change_info": "经营场所,地址变更",
+      "change_keyword": ["营业地址", "地址", "住所", "经营产所"]
+    },
+    {
+      "change_code": "100008",
+      "change_name": "其他变更",
+      "change_push": false,
+      "change_info": "无法分类的变更",
+      "change_keyword": []
+    }
+  ]
+}

+ 69 - 0
qyxy_change/qy_baidu/main.go

@@ -0,0 +1,69 @@
+package main
+
+import (
+	"mongodb"
+	"qfw/util"
+)
+
+var (
+	Sysconfig                                  map[string]interface{}
+	MongoTool                                  *mongodb.MongodbSim
+	MongoPaAdd                                 *mongodb.MongodbSim //凭安增量
+	Dbname                                     string
+	CollBd, CollQy, CollSave, CollBack, CollPa string
+	LastTime                                   int64
+	TaskTime                                   int
+	ChangeMap                                  []map[string]interface{}
+)
+
+func init() {
+	util.ReadConfig(&Sysconfig)
+
+	Dbname = Sysconfig["mongodbName"].(string)
+	MongoTool = &mongodb.MongodbSim{
+		MongodbAddr: Sysconfig["mongodbServer"].(string),
+		Size:        util.IntAll(Sysconfig["mongodbPoolSize"]),
+		DbName:      Dbname,
+	}
+	MongoTool.InitPool()
+	paDb := util.ObjToMap(Sysconfig["pingan"])
+	MongoPaAdd = &mongodb.MongodbSim{
+		MongodbAddr: (*paDb)["dbServer"].(string),
+		Size:        util.IntAll(Sysconfig["mongodbPoolSize"]),
+		DbName:      (*paDb)["dbName"].(string),
+	}
+	MongoPaAdd.InitPool()
+
+	CollPa = (*paDb)["dbColl"].(string)
+	CollBd = Sysconfig["coll_baidu"].(string)
+	CollQy = Sysconfig["coll_qy"].(string)
+	CollSave = Sysconfig["coll_change"].(string)
+	CollBack = Sysconfig["coll_back"].(string)
+	LastTime = util.Int64All(Sysconfig["lasttime"])
+	TaskTime = util.IntAll(Sysconfig["tasktime"])
+
+	ChangeMap = util.ObjArrToMapArr(Sysconfig["changeType"].([]interface{}))
+	initChangeMap()
+}
+
+func initChangeMap() {
+	for _, v := range ChangeMap {
+		list := v["change_keyword"].([]interface{})
+		var regList []string
+		if len(list) > 0 {
+			for _, v1 := range list {
+				reg := ".*" + util.ObjToString(v1) + ".*"
+				regList = append(regList, reg)
+			}
+			v["change_key_reg"] = regList
+		} else {
+			v["change_key_reg"] = []string{".*"}
+		}
+	}
+}
+
+func main() {
+	go SaveData()
+	//go TimeTask()
+	GetBdData()
+}

+ 243 - 0
qyxy_change/qy_baidu/task.go

@@ -0,0 +1,243 @@
+package main
+
+import (
+	"fmt"
+	"github.com/cron"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"log"
+	"mongodb"
+	"qfw/util"
+	"regexp"
+	"time"
+)
+
+func TimeTask() {
+	c := cron.New()
+	//cronstr := "0 */" + fmt.Sprint(TaskTime) + " * * * ?"
+	cronstr := "0 0 */" + fmt.Sprint(TaskTime) + " * * ?" //每TaskTime小时执行一次
+	_ = c.AddFunc(cronstr, func() { StartTask() })
+	c.Start()
+}
+func StartTask() {
+	GetBdData()		//百度数据
+	GetPaData()		//凭安数据
+}
+
+func GetBdData()  {
+	count := 0
+	lastid := ""
+	sess := MongoTool.GetMgoConn()
+	defer MongoTool.DestoryMongoConn(sess)
+	fields := map[string]interface{}{"data": 1, "down_time": 1}
+	q := bson.M{"down_time": bson.M{"$gte": LastTime}}
+	query := sess.DB(Dbname).C(CollBd).Find(q).Select(fields).Iter()
+	tmp := make(map[string]interface{})
+	for query.Next(&tmp) {
+		lastid = mongodb.BsonIdToSId(tmp["_id"])
+		if count%1000 == 0 {
+			util.Debug("baidu ----current----", count, lastid)
+		}
+		findEnt(tmp)
+		count++
+	}
+}
+
+func GetPaData() {
+	count := 0
+	lastid := ""
+	sess := MongoTool.GetMgoConn()
+	defer MongoTool.DestoryMongoConn(sess)
+	fields := map[string]interface{}{"changes": 1, "company_id": 1, "company_name": 1}
+	query := sess.DB(Dbname).C(CollPa).Find(nil).Select(fields).Iter()
+	tmp := make(map[string]interface{})
+	for query.Next(&tmp) {
+		lastid = mongodb.BsonIdToSId(tmp["_id"])
+		if count%1000 == 0 {
+			util.Debug("ping an ----current-----", count, lastid)
+		}
+		if tmp["changes"] != nil && len(tmp["changes"].([]interface{})) > 0 {
+			currentTime := time.Now().Unix()
+			q := bson.M{"company_name": tmp["company_name"]}
+			changeEnt, _ := MongoTool.FindOne(CollSave, q)
+			if changeEnt != nil && len(*changeEnt) > 0 {
+				util.Debug("凭安数据---更新企业信息-----ID----", tmp["_id"])
+				changeList := tmp["changes"].([]interface{})
+				if len(changeList) < len((*changeEnt)["changes"].([]interface{})) {
+					tmp["changes"] = (*changeEnt)["changes"].([]interface{})
+					infoList := tmp["changes"].([]interface{})
+					for _, item := range infoList {
+						item1 := item.(map[string]interface{})
+						setMark(item1)
+					}
+					tmp["updatetime"] = currentTime
+				}
+			}else {
+				util.Debug("凭安数据---新增企业信息-----ID----", tmp["_id"])
+				infoList := tmp["changes"].([]interface{})
+				for _, item := range infoList {
+					item1 := item.(map[string]interface{})
+					setMark(item1)
+				}
+				tmp["_id"] = primitive.NewObjectID()
+				tmp["createtime"] = currentTime
+				tmp["updatetime"] = currentTime
+			}
+			update := make(map[string]interface{})
+			update["$set"] = tmp
+			updateInfo := []map[string]interface{}{
+				{
+					"_id": tmp["_id"],
+				},
+				update,
+			}
+			MgoSaveCache <- updateInfo
+			count++
+		}
+	}
+}
+
+func findEnt(tmp map[string]interface{}) {
+	if LastTime < util.Int64All(tmp["down_time"]) {
+		LastTime = util.Int64All(tmp["down_time"])
+	}
+	data := util.ObjToMap(tmp["data"])
+	ent := util.ObjToMap((*data)["basicData"])
+	changeData := util.ObjToMap((*data)["changeRecordData"])
+	infoList := (*changeData)["list"].([]interface{})
+	currentTime := time.Now().Unix()
+	q := bson.M{"company_name": (*ent)["entName"]}
+	changeEnt, _ := MongoTool.FindOne(CollSave, q)
+	util.Debug(*changeEnt)
+	update := map[string]interface{}{}
+	if changeEnt != nil && len(*changeEnt) > 0 {
+		//1、企业变更库有该企业信息
+		if (*changeEnt)["changes"] != nil{
+			util.Debug("百度----更新企业信息-----ID----", (*changeEnt)["_id"])
+			(*changeEnt)["updatetime"] = currentTime
+			if len(infoList) > len(tmp["changes"].([]interface{})) {
+				mapArr := setChangeInfo(infoList)
+				for _, v := range mapArr{
+					setMark(v)
+				}
+				(*changeEnt)["changes"] = mapArr
+			}
+			update["$set"] = *changeEnt
+			updateInfo := []map[string]interface{}{
+				{
+					"_id": (*changeEnt)["_id"],
+				},
+				update,
+			}
+			MgoSaveCache <- updateInfo
+		}
+	} else {
+		//2、企业变更库没有该企业信息
+		paEnt, _ := MongoTool.FindOne(CollQy, q)
+		saveEnt := map[string]interface{}{}
+		if saveEnt != nil && len(*paEnt) > 0 {
+			//3、企业库有该企业信息
+			util.Debug("百度----新增企业信息----ID-----", (*paEnt)["_id"])
+			saveEnt["_id"] = primitive.NewObjectID()
+			saveEnt["company_id"] = (*paEnt)["company_id"]
+			saveEnt["company_name"] = (*ent)["entName"]
+			saveEnt["createtime"] = currentTime
+			saveEnt["updatetime"] = currentTime
+			if (*paEnt)["changes"] != nil{
+				changeArr := (*paEnt)["changes"].([]interface{})
+				mapArr := setChangeInfo(infoList)
+				for _, v := range util.ObjArrToMapArr(changeArr){
+					setMark(v)
+					mapArr = append(mapArr, v)
+				}
+				saveEnt["changes"] = mapArr
+			}else {
+				saveEnt["changes"] = setChangeInfo(infoList)
+			}
+			update["$set"] = saveEnt
+			updateInfo := []map[string]interface{}{
+				{
+					"_id": saveEnt["_id"],
+				},
+				update,
+			}
+			MgoSaveCache <- updateInfo
+		} else {
+			//4、企业库没有该企业信息
+			saveEnt["company_name"] = (*ent)["entName"]
+			saveEnt["createtime"] = currentTime
+			saveEnt["changes"] = setChangeInfo(infoList)
+			MongoTool.Save(CollBack, saveEnt)
+		}
+	}
+}
+
+func setChangeInfo(list []interface{}) []map[string]interface{} {
+	var arr []map[string]interface{}
+	for _, item := range list {
+		tmp := map[string]interface{}{}
+		item1 := item.(map[string]interface{})
+		tmp["change_date"] = item1["date"]
+		tmp["content_before"] = item1["oldValue"]
+		tmp["content_after"] = item1["newValue"]
+		tmp["change_field"] = item1["fieldName"]
+		setMark(tmp)
+		arr = append(arr, tmp)
+	}
+	return arr
+}
+
+func setMark(tmp map[string]interface{}) {
+	for _, v := range ChangeMap {
+		str := util.ObjToString(tmp["change_field"])
+		regArr := v["change_key_reg"].([]string)
+		for _, v1 := range regArr {
+			matched, _ := regexp.MatchString(v1, str)
+			if matched {
+				tmp["change_name_new"] = v["change_name"]
+				return
+			}
+		}
+	}
+}
+
+var MgoSaveCache = make(chan []map[string]interface{}, 2000)
+var SP = make(chan bool, 5)
+
+func SaveData() {
+	log.Println("Mgo Save...")
+	arru := make([][]map[string]interface{}, 200)
+	indexu := 0
+	for {
+		select {
+		case v := <-MgoSaveCache:
+			arru[indexu] = v
+			indexu++
+			if indexu == 200 {
+				SP <- true
+				go func(arru [][]map[string]interface{}) {
+					defer func() {
+						<-SP
+					}()
+					MongoTool.UpSertBulk(CollSave, arru...)
+				}(arru)
+				arru = make([][]map[string]interface{}, 200)
+				indexu = 0
+			}
+		case <-time.After(1000 * time.Millisecond):
+			if indexu > 0 {
+				SP <- true
+				go func(arru [][]map[string]interface{}) {
+					defer func() {
+						<-SP
+					}()
+					MongoTool.UpSertBulk(CollSave, arru...)
+				}(arru[:indexu])
+				arru = make([][]map[string]interface{}, 200)
+				indexu = 0
+			}
+		}
+	}
+}
+
+

+ 65 - 0
qyxy_change/qy_pingan/config.json

@@ -0,0 +1,65 @@
+{
+  "mongodbServers": "192.168.3.128:27080",
+  "mongodbPoolSize": 10,
+  "mongodbName": "mxs",
+  "mongoColl1": "qyxy",
+  "mongoColl2": "qyxy_change",
+  "changeType": [
+    {
+      "change_code": "100001",
+      "change_name": "投资人变更(人事变动)",
+      "change_push": true,
+      "change_info": "投资人、合伙人、投资者等名称变更",
+      "change_keyword": ["投资人", "合伙人", "投资者", "董事", "经营者", "股东"]
+    },
+    {
+      "change_code": "100002",
+      "change_name": "经营范围变更",
+      "change_push": true,
+      "change_info": "经营范围变更",
+      "change_keyword": ["经营范围", "业务范围", "许可经营项目", "隶属企业变更", "母公司变更", "隶属集团变更"]
+    },
+    {
+      "change_code": "100003",
+      "change_name": "经营期限变更",
+      "change_push": false,
+      "change_info": "经营期限",
+      "change_keyword": ["经营期限", "营业期限", "驻在期限", "合伙期限"]
+    },
+    {
+      "change_code": "100004",
+      "change_name": "高级管理人员备案",
+      "change_push": true,
+      "change_info": "投资人、董事、高管",
+      "change_keyword": ["高级管理人员", "高管人员", "经理", "主要人员", "负责人", "代表", "理事", "监事", "委员", "法定代表人", "主要部门人员"]
+    },
+    {
+      "change_code": "100005",
+      "change_name": "其他事项备案",
+      "change_push": false,
+      "change_info": "其他事项备案",
+      "change_keyword": ["备案"]
+    },
+    {
+      "change_code": "100006",
+      "change_name": "章程备案变更",
+      "change_push": false,
+      "change_info": "章程备案变更",
+      "change_keyword": ["章程修正", "章程备案", "合伙协议"]
+    },
+    {
+      "change_code": "100007",
+      "change_name": "经营场所,地址变更",
+      "change_push": false,
+      "change_info": "经营场所,地址变更",
+      "change_keyword": ["营业地址", "地址", "住所", "经营产所"]
+    },
+    {
+      "change_code": "100008",
+      "change_name": "其他变更",
+      "change_push": false,
+      "change_info": "无法分类的变更",
+      "change_keyword": []
+    }
+  ]
+}

+ 138 - 0
qyxy_change/qy_pingan/main.go

@@ -0,0 +1,138 @@
+package main
+
+import (
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"log"
+	"qfw/util"
+	"regexp"
+)
+
+var (
+	Sysconfig          map[string]interface{}
+	MongoTool          *MongodbSim
+	Dbname             string
+	MgoColl1, MgoColl2 string
+
+	ChangeMap		   []map[string]interface{}
+	queryClose         chan bool
+)
+
+func init() {
+	util.ReadConfig(&Sysconfig)
+
+	Dbname = Sysconfig["mongodbName"].(string)
+	MongoTool = &MongodbSim{
+		MongodbAddr: Sysconfig["mongodbServers"].(string),
+		Size:        util.IntAll(Sysconfig["mongodbPoolSize"]),
+		DbName:      Dbname,
+	}
+	MongoTool.InitPool()
+
+	MgoColl1 = Sysconfig["mongoColl1"].(string)
+	MgoColl2 = Sysconfig["mongoColl2"].(string)
+
+	queryClose = make(chan bool)
+	ChangeMap = util.ObjArrToMapArr(Sysconfig["changeType"].([]interface{}))
+	initChangeMap()
+}
+
+func main() {
+	count, taskcount := 0, 0
+	lastid := ""
+
+	util.Debug(ChangeMap)
+
+	sess := MongoTool.GetMgoConn()
+	defer MongoTool.DestoryMongoConn(sess)
+
+	pool := make(chan bool, 1)
+	infoPool := make(chan map[string]interface{}, 2000)
+	over := make(chan bool)
+	go func() {
+	M:
+		for {
+			select {
+			case tmp := <-infoPool:
+				if taskcount > 1234 {
+					break
+				}
+				pool <- true
+				go func(tmp map[string]interface{}) {
+					defer func() {
+						<-pool
+					}()
+					if tmp["changes"] != nil {
+						infoList := []interface{}(tmp["changes"].(primitive.A))
+						for _, item := range infoList {
+							item1 := item.(map[string]interface{})
+							setMark(item1)
+						}
+						tmp["_id"] = util.StringTOBsonId(util.ObjToString(tmp["company_id"]))
+						MongoTool.Save(MgoColl2, tmp)
+						taskcount ++
+					}
+				}(tmp)
+			case <-over:
+				break M
+			}
+		}
+	}()
+
+	fields := map[string]interface{}{"changes": 1, "company_id": 1, "company_name": 1}
+	query := sess.DB(Dbname).C(MgoColl1).Find(nil).Select(fields).Iter()
+
+L:
+	for {
+		select {
+		case <-queryClose:
+			log.Println("receive interrupt sign")
+			log.Println("close iter..", lastid, query.Cursor.Close(nil))
+			break L
+		default:
+			tmp := make(map[string]interface{})
+			if query.Next(&tmp) {
+				lastid = tmp["company_id"].(string)
+				if count%10000 == 0 {
+					util.Debug("current", count, lastid)
+				}
+
+				if tmp["changes"] != nil && len([]interface{}(tmp["changes"].(primitive.A))) > 0 {
+					infoPool <- tmp
+					count++
+				}
+			} else {
+				break L
+			}
+		}
+	}
+}
+
+func initChangeMap()  {
+	for _, v := range ChangeMap{
+		list := v["change_keyword"].([]interface {})
+		var regList []string
+		if len(list) > 0 {
+			for _, v1 := range list{
+				reg := ".*" + util.ObjToString(v1) + ".*"
+				regList = append(regList, reg)
+			}
+			v["change_key_reg"] = regList
+		}else {
+			v["change_key_reg"] = []string{".*"}
+		}
+	}
+}
+
+func setMark(tmp map[string]interface{})  {
+	for _, v := range ChangeMap{
+		str := util.ObjToString(tmp["change_field"])
+		regArr := v["change_key_reg"].([]string)
+		for _, v1 := range regArr{
+			matched, _ := regexp.MatchString(v1, str)
+			if matched {
+				tmp["change_name_new"] = v["change_name"]
+				return
+			}
+		}
+	}
+}

+ 613 - 0
qyxy_change/qy_pingan/mgotool.go

@@ -0,0 +1,613 @@
+package main
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"log"
+	"math/big"
+	"runtime"
+	"strconv"
+	"strings"
+	"time"
+
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"go.mongodb.org/mongo-driver/mongo"
+	"go.mongodb.org/mongo-driver/mongo/options"
+)
+
+type MgoSess struct {
+	db     string
+	coll   string
+	query  interface{}
+	sorts  []string
+	fields interface{}
+	limit  int64
+	skip   int64
+	pipe   []map[string]interface{}
+	all    interface{}
+	M      *MongodbSim
+}
+
+type MgoIter struct {
+	Cursor *mongo.Cursor
+}
+
+func NewMgo(addr, db string, size int) *MongodbSim {
+	mgo := &MongodbSim{
+		MongodbAddr: addr,
+		Size:        size,
+		DbName:      db,
+	}
+	mgo.InitPool()
+	return mgo
+}
+
+func (mt *MgoIter) Next(result interface{}) bool {
+	if mt.Cursor != nil {
+		if mt.Cursor.Next(nil) {
+			err := mt.Cursor.Decode(result)
+			if err != nil {
+				log.Println("mgo cur err", err.Error())
+				mt.Cursor.Close(nil)
+				return false
+			}
+			return true
+		} else {
+			mt.Cursor.Close(nil)
+			return false
+		}
+	} else {
+		return false
+	}
+}
+
+func (ms *MgoSess) DB(name string) *MgoSess {
+	ms.db = name
+	return ms
+}
+
+func (ms *MgoSess) C(name string) *MgoSess {
+	ms.coll = name
+	return ms
+}
+
+func (ms *MgoSess) Find(q interface{}) *MgoSess {
+	if q == nil {
+		q = map[string]interface{}{}
+	}
+	ms.query = q
+	return ms
+}
+
+func (ms *MgoSess) Select(fields interface{}) *MgoSess {
+	ms.fields = fields
+	return ms
+}
+
+func (ms *MgoSess) Limit(limit int64) *MgoSess {
+	ms.limit = limit
+	return ms
+}
+func (ms *MgoSess) Skip(skip int64) *MgoSess {
+	ms.skip = skip
+	return ms
+}
+
+func (ms *MgoSess) Sort(sorts ...string) *MgoSess {
+	ms.sorts = sorts
+	return ms
+}
+func (ms *MgoSess) Pipe(p []map[string]interface{}) *MgoSess {
+	ms.pipe = p
+	return ms
+}
+func (ms *MgoSess) All(v *[]map[string]interface{}) {
+	cur, err := ms.M.C.Database(ms.db).Collection(ms.coll).Aggregate(ms.M.Ctx, ms.pipe)
+	if err == nil && cur.Err() == nil {
+		cur.All(ms.M.Ctx, v)
+	}
+}
+func (ms *MgoSess) Iter() *MgoIter {
+	it := &MgoIter{}
+	find := options.Find()
+	if ms.skip > 0 {
+		find.SetSkip(ms.skip)
+	}
+	if ms.limit > 0 {
+		find.SetLimit(ms.limit)
+	}
+	find.SetBatchSize(100)
+	if len(ms.sorts) > 0 {
+		sort := bson.M{}
+		for _, k := range ms.sorts {
+			switch k[:1] {
+			case "-":
+				sort[k[1:]] = -1
+			case "+":
+				sort[k[1:]] = 1
+			default:
+				sort[k] = 1
+			}
+		}
+		find.SetSort(sort)
+	}
+	if ms.fields != nil {
+		find.SetProjection(ms.fields)
+	}
+	cur, err := ms.M.C.Database(ms.db).Collection(ms.coll).Find(ms.M.Ctx, ms.query, find)
+	if err != nil {
+		log.Println("mgo find err", err.Error())
+	} else {
+		it.Cursor = cur
+	}
+	return it
+}
+
+func (ms *MgoSess) Count() (int64, error) {
+	return ms.M.C.Database(ms.db).Collection(ms.coll).CountDocuments(ms.M.Ctx, ms.query)
+}
+
+type MongodbSim struct {
+	MongodbAddr string
+	Size        int
+	//	MinSize     int
+	DbName   string
+	C        *mongo.Client
+	Ctx      context.Context
+	ShortCtx context.Context
+	pool     chan bool
+	UserName string
+	Password string
+	ReplSet  string
+}
+
+func (m *MongodbSim) GetMgoConn() *MgoSess {
+	//m.Open()
+	ms := &MgoSess{}
+	ms.M = m
+	return ms
+}
+
+func (m *MongodbSim) DestoryMongoConn(ms *MgoSess) {
+	//m.Close()
+	ms.M = nil
+	ms = nil
+}
+
+func (m *MongodbSim) Destroy() {
+	//m.Close()
+	m.C.Disconnect(nil)
+	m.C = nil
+}
+
+func (m *MongodbSim) InitPool() {
+	opts := options.Client()
+	opts.SetConnectTimeout(3 * time.Second)
+	opts.SetHosts(strings.Split(m.MongodbAddr, ","))
+	//opts.ApplyURI("mongodb://" + m.MongodbAddr)
+	opts.SetMaxPoolSize(uint64(m.Size))
+	if m.UserName != "" && m.Password != "" {
+		cre := options.Credential{
+			Username: m.UserName,
+			Password: m.Password,
+		}
+		opts.SetAuth(cre)
+	}
+	ms := strings.Split(m.MongodbAddr, ",")
+	if m.ReplSet == "" && len(ms) > 1 {
+		m.ReplSet = "qfws"
+	}
+	if m.ReplSet != "" {
+		opts.SetReplicaSet(m.ReplSet)
+		opts.SetDirect(false)
+	}
+	m.pool = make(chan bool, m.Size)
+	opts.SetMaxConnIdleTime(2 * time.Hour)
+	m.Ctx, _ = context.WithTimeout(context.Background(), 99999*time.Hour)
+	m.ShortCtx, _ = context.WithTimeout(context.Background(), 1*time.Minute)
+	client, err := mongo.Connect(m.ShortCtx, opts)
+	if err != nil {
+		log.Println("mgo init error:", err.Error())
+	} else {
+		m.C = client
+	}
+}
+
+func (m *MongodbSim) Open() {
+	m.pool <- true
+}
+func (m *MongodbSim) Close() {
+	<-m.pool
+}
+
+func (m *MongodbSim) Save(c string, doc interface{}) string {
+	defer catch()
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	obj := ObjToM(doc)
+	id := primitive.NewObjectID()
+	(*obj)["_id"] = id
+	_, err := coll.InsertOne(m.Ctx, obj)
+	if nil != err {
+		log.Println("SaveError", err)
+		return ""
+	}
+	return id.Hex()
+}
+
+//原_id不变
+func (m *MongodbSim) SaveByOriID(c string, doc interface{}) bool {
+	defer catch()
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	_, err := coll.InsertOne(m.Ctx, ObjToM(doc))
+	if nil != err {
+		log.Println("SaveByOriIDError", err)
+		return false
+	}
+	return true
+}
+
+//批量插入
+func (m *MongodbSim) SaveBulk(c string, doc ...map[string]interface{}) bool {
+	defer catch()
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	var writes []mongo.WriteModel
+	for _, d := range doc {
+		write := mongo.NewInsertOneModel()
+		write.SetDocument(d)
+		writes = append(writes, write)
+	}
+	br, e := coll.BulkWrite(m.Ctx, writes)
+	if e != nil {
+		b := strings.Index(e.Error(), "duplicate") > -1
+		log.Println("mgo savebulk error:", e.Error())
+		if br != nil {
+			log.Println("mgo savebulk size:", br.InsertedCount)
+		}
+		return b
+	}
+	return true
+}
+
+//批量插入
+func (m *MongodbSim) SaveBulkInterface(c string, doc ...interface{}) bool {
+	defer catch()
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	var writes []mongo.WriteModel
+	for _, d := range doc {
+		write := mongo.NewInsertOneModel()
+		write.SetDocument(d)
+		writes = append(writes, write)
+	}
+	br, e := coll.BulkWrite(m.Ctx, writes)
+	if e != nil {
+		b := strings.Index(e.Error(), "duplicate") > -1
+		log.Println("mgo SaveBulkInterface error:", e.Error())
+		if br != nil {
+			log.Println("mgo SaveBulkInterface size:", br.InsertedCount)
+		}
+		return b
+	}
+	return true
+}
+
+//按条件统计
+func (m *MongodbSim) Count(c string, q interface{}) int {
+	r, _ := m.CountByErr(c, q)
+	return r
+}
+
+//统计
+func (m *MongodbSim) CountByErr(c string, q interface{}) (int, error) {
+	defer catch()
+	m.Open()
+	defer m.Close()
+	res, err := m.C.Database(m.DbName).Collection(c).CountDocuments(m.Ctx, ObjToM(q))
+	if err != nil {
+		log.Println("统计错误", err.Error())
+		return 0, err
+	} else {
+		return int(res), nil
+	}
+}
+
+//按条件删除
+func (m *MongodbSim) Delete(c string, q interface{}) int64 {
+	defer catch()
+	m.Open()
+	defer m.Close()
+	res, err := m.C.Database(m.DbName).Collection(c).DeleteMany(m.Ctx, ObjToM(q))
+	if err != nil && res == nil {
+		log.Println("删除错误", err.Error())
+	}
+	return res.DeletedCount
+}
+
+//删除对象
+func (m *MongodbSim) Del(c string, q interface{}) bool {
+	defer catch()
+	m.Open()
+	defer m.Close()
+	_, err := m.C.Database(m.DbName).Collection(c).DeleteMany(m.Ctx, ObjToM(q))
+	if err != nil {
+		log.Println("删除错误", err.Error())
+		return false
+	}
+	return true
+}
+
+//删除表
+func (m *MongodbSim) DelColl(c string) bool {
+	defer catch()
+	m.Open()
+	defer m.Close()
+	err := m.C.Database(m.DbName).Collection(c).Drop(m.Ctx)
+	if err != nil {
+		log.Println("删除错误", err.Error())
+		return false
+	}
+	return true
+}
+
+//按条件更新
+func (m *MongodbSim) Update(c string, q, u interface{}, upsert bool, multi bool) bool {
+	defer catch()
+	m.Open()
+	defer m.Close()
+	ct := options.Update()
+	if upsert {
+		ct.SetUpsert(true)
+	}
+	coll := m.C.Database(m.DbName).Collection(c)
+	var err error
+	if multi {
+		_, err = coll.UpdateMany(m.Ctx, ObjToM(q), ObjToM(u), ct)
+	} else {
+		_, err = coll.UpdateOne(m.Ctx, ObjToM(q), ObjToM(u), ct)
+	}
+	if err != nil {
+		log.Println("删除错误", err.Error())
+		return false
+	}
+	return true
+}
+func (m *MongodbSim) UpdateById(c string, id interface{}, set interface{}) bool {
+	defer catch()
+	m.Open()
+	defer m.Close()
+	q := make(map[string]interface{})
+	if sid, ok := id.(string); ok {
+		q["_id"], _ = primitive.ObjectIDFromHex(sid)
+	} else {
+		q["_id"] = id
+	}
+	_, err := m.C.Database(m.DbName).Collection(c).UpdateOne(m.Ctx, q, ObjToM(set))
+	if nil != err {
+		log.Println("UpdateByIdError", err)
+		return false
+	}
+	return true
+}
+
+//批量更新
+func (m *MongodbSim) UpdateBulkAll(db, c string, doc ...[]map[string]interface{}) bool {
+	return m.upSertBulk(db, c, false, doc...)
+}
+
+func (m *MongodbSim) UpdateBulk(c string, doc ...[]map[string]interface{}) bool {
+	return m.UpdateBulkAll(m.DbName, c, doc...)
+}
+
+//批量插入
+func (m *MongodbSim) UpSertBulk(c string, doc ...[]map[string]interface{}) bool {
+	return m.upSertBulk(m.DbName, c, true, doc...)
+}
+
+//批量插入
+func (m *MongodbSim) upSertBulk(db, c string, upsert bool, doc ...[]map[string]interface{}) bool {
+	defer catch()
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(db).Collection(c)
+	var writes []mongo.WriteModel
+	for _, d := range doc {
+		write := mongo.NewUpdateOneModel()
+		write.SetFilter(d[0])
+		write.SetUpdate(d[1])
+		write.SetUpsert(upsert)
+		writes = append(writes, write)
+	}
+	br, e := coll.BulkWrite(m.Ctx, writes)
+	if e != nil {
+		log.Println("mgo upsert error:", e.Error())
+		return br == nil || br.UpsertedCount == 0
+	}
+	//	else {
+	//		if r.UpsertedCount != int64(len(doc)) {
+	//			log.Println("mgo upsert uncomplete:uc/dc", r.UpsertedCount, len(doc))
+	//		}
+	//		return true
+	//	}
+	return true
+}
+
+//查询单条对象
+func (m *MongodbSim) FindOne(c string, query interface{}) (*map[string]interface{}, bool) {
+	return m.FindOneByField(c, query, nil)
+}
+
+//查询单条对象
+func (m *MongodbSim) FindOneByField(c string, query interface{}, fields interface{}) (*map[string]interface{}, bool) {
+	defer catch()
+	res, _:= m.Find(c, query, nil, fields, true, -1, -1)
+	if nil != res && len(*res) > 0 {
+		return &((*res)[0]), true
+	}
+	return nil, false
+}
+
+//查询单条对象
+func (m *MongodbSim) FindById(c string, query string, fields interface{}) (*map[string]interface{}, bool) {
+	defer catch()
+	m.Open()
+	defer m.Close()
+	of := options.FindOne()
+	of.SetProjection(ObjToOth(fields))
+	res := make(map[string]interface{})
+	_id, err := primitive.ObjectIDFromHex(query)
+	if err != nil {
+		log.Println("_id error", err)
+		return &res, true
+	}
+	sr := m.C.Database(m.DbName).Collection(c).FindOne(m.Ctx, map[string]interface{}{"_id": _id}, of)
+	if sr.Err() == nil {
+		sr.Decode(&res)
+	}
+	return &res, true
+}
+
+//底层查询方法
+func (m *MongodbSim) Find(c string, query interface{}, order interface{}, fields interface{}, single bool, start int, limit int) (*[]map[string]interface{}, bool) {
+	defer catch()
+	m.Open()
+	defer m.Close()
+	res := make([]map[string]interface{}, 1)
+	coll := m.C.Database(m.DbName).Collection(c)
+	if single {
+		of := options.FindOne()
+		of.SetProjection(ObjToOth(fields))
+		of.SetSort(ObjToM(order))
+		if sr := coll.FindOne(m.Ctx, ObjToM(query), of); sr.Err() == nil {
+			sr.Decode(&res[0])
+		}
+	} else {
+		of := options.Find()
+		of.SetProjection(ObjToOth(fields))
+		of.SetSort(ObjToM(order))
+		if start > -1 {
+			of.SetSkip(int64(start))
+			of.SetLimit(int64(limit))
+		}
+		cur, err := coll.Find(m.Ctx, ObjToM(query), of)
+		if err == nil && cur.Err() == nil {
+			cur.All(m.Ctx, &res)
+		}
+	}
+	return &res, true
+}
+
+func ObjToOth(query interface{}) *bson.M {
+	return ObjToMQ(query, false)
+}
+func ObjToM(query interface{}) *bson.M {
+	return ObjToMQ(query, true)
+}
+
+//obj(string,M)转M,查询用到
+func ObjToMQ(query interface{}, isQuery bool) *bson.M {
+	data := make(bson.M)
+	defer catch()
+	if s2, ok2 := query.(*map[string]interface{}); ok2 {
+		data = bson.M(*s2)
+	} else if s3, ok3 := query.(*bson.M); ok3 {
+		return s3
+	} else if s3, ok3 := query.(*primitive.M); ok3 {
+		return s3
+	} else if s, ok := query.(string); ok {
+		json.Unmarshal([]byte(strings.Replace(s, "'", "\"", -1)), &data)
+		if ss, oks := data["_id"]; oks && isQuery {
+			switch ss.(type) {
+			case string:
+				data["_id"], _ = primitive.ObjectIDFromHex(ss.(string))
+			case map[string]interface{}:
+				tmp := ss.(map[string]interface{})
+				for k, v := range tmp {
+					tmp[k], _ = primitive.ObjectIDFromHex(v.(string))
+				}
+				data["_id"] = tmp
+			}
+
+		}
+	} else if s1, ok1 := query.(map[string]interface{}); ok1 {
+		data = s1
+	} else if s4, ok4 := query.(bson.M); ok4 {
+		data = s4
+	} else if s4, ok4 := query.(primitive.M); ok4 {
+		data = s4
+	} else {
+		data = nil
+	}
+	return &data
+}
+func intAllDef(num interface{}, defaultNum int) int {
+	if i, ok := num.(int); ok {
+		return int(i)
+	} else if i0, ok0 := num.(int32); ok0 {
+		return int(i0)
+	} else if i1, ok1 := num.(float64); ok1 {
+		return int(i1)
+	} else if i2, ok2 := num.(int64); ok2 {
+		return int(i2)
+	} else if i3, ok3 := num.(float32); ok3 {
+		return int(i3)
+	} else if i4, ok4 := num.(string); ok4 {
+		in, _ := strconv.Atoi(i4)
+		return int(in)
+	} else if i5, ok5 := num.(int16); ok5 {
+		return int(i5)
+	} else if i6, ok6 := num.(int8); ok6 {
+		return int(i6)
+	} else if i7, ok7 := num.(*big.Int); ok7 {
+		in, _ := strconv.Atoi(fmt.Sprint(i7))
+		return int(in)
+	} else if i8, ok8 := num.(*big.Float); ok8 {
+		in, _ := strconv.Atoi(fmt.Sprint(i8))
+		return int(in)
+	} else {
+		return defaultNum
+	}
+}
+
+//出错拦截
+func catch() {
+	if r := recover(); r != nil {
+		log.Println(r)
+		for skip := 0; ; skip++ {
+			_, file, line, ok := runtime.Caller(skip)
+			if !ok {
+				break
+			}
+			go log.Printf("%v,%v\n", file, line)
+		}
+	}
+}
+
+//根据bsonID转string
+func BsonIdToSId(uid interface{}) string {
+	if uid == nil {
+		return ""
+	} else if u, ok := uid.(string); ok {
+		return u
+	} else if u, ok := uid.(primitive.ObjectID); ok {
+		return u.Hex()
+	} else {
+		return ""
+	}
+}
+
+func StringTOBsonId(id string) (bid primitive.ObjectID) {
+	defer catch()
+	if id != "" {
+		bid, _ = primitive.ObjectIDFromHex(id)
+	}
+	return
+}

+ 1 - 1
src/web/res/jsoneditor/js/jsoneditor.js

@@ -1864,7 +1864,7 @@ return /******/ (function(modules) { // webpackBootstrap
 	    // comes *before* the @-sign.
 	    // URLs are obnoxious.
 	    //
-	    // ex:
+	    // qy_pingan:
 	    // http://a@b@c/ => user:a@b host:c
 	    // http://a@b?@c => user:a host:c path:/?@c