Browse Source

no message

Jianghan 3 years ago
parent
commit
9d22810b76

+ 258 - 0
src/config.json

@@ -69,5 +69,263 @@
         "多规则分发依靠字段": "itemdist",
         "企业id列表": "entidlist",
         "项目唯一标识": "projectId"
+    },
+    "biaozhu": {
+        "common": [
+            {
+                "key": "projectname",
+                "descript": "项目名称(r)"
+            },
+            {
+                "key": "area",
+                "descript": "省份(q)"
+            },
+            {
+                "key": "projectcode",
+                "descript": "项目编号(t)"
+            },
+            {
+                "key": "city",
+                "descript": "城市(w)"
+            },
+            {
+                "key": "subtype",
+                "descript": "公告类别"
+            },
+            {
+                "key": "district",
+                "descript": "区县(e)"
+            },
+            {
+                "key": "buyer",
+                "descript": "采购单位(a)"
+            },
+            {
+                "key": "budget",
+                "descript": "预算(z)"
+            },
+            {
+                "key": "agency",
+                "descript": "代理机构(s)"
+            },
+            {
+                "key": "bidamount",
+                "descript": "中标金额(x)"
+            },
+            {
+                "key": "s_winner",
+                "descript": "中标单位(d)"
+            },
+            {
+                "key": "bidamounttype",
+                "descript": "金额类型"
+            }
+        ],
+        "timeplace": [
+            {
+                "key": "publishtime",
+                "descript": "发布时间"
+            },
+            {
+                "key": "bidendtime",
+                "descript": "投标截止日期"
+            },
+            {
+                "key": "bidopentime",
+                "descript": "开标日期"
+            },
+            {
+                "key": "bidopenaddress",
+                "descript": "开标地点"
+            },
+            {
+                "key": "project_startdate",
+                "descript": "开工日期"
+            },
+            {
+                "key": "project_completedate",
+                "descript": "竣工日期"
+            },
+            {
+                "key": "project_duration",
+                "descript": "工期时长"
+            },
+            {
+                "key": "project_timeunit",
+                "descript": "工期单位"
+            },
+            {
+                "key": "projectperiod",
+                "descript": "项目周期(服务周期)"
+            },
+            {
+                "key": "projectaddr",
+                "descript": "项目地址"
+            }
+        ],
+        "purchasinglist": [
+            {
+                "key": "itemname",
+                "descript": "产品名称"
+            },
+            {
+                "key": "brandname",
+                "descript": "品牌"
+            },
+            {
+                "key": "model",
+                "descript": "规格型号"
+            },
+            {
+                "key": "unitname",
+                "descript": "单位"
+            },
+            {
+                "key": "number",
+                "descript": "数量"
+            },
+            {
+                "key": "unitprice",
+                "descript": "单价"
+            },
+            {
+                "key": "totalprice",
+                "descript": "小计"
+            },
+            {
+                "key": "dimensions",
+                "descript": "尺寸"
+            }
+        ],
+        "package": [
+            {
+                "key": "serial_number",
+                "descript": "标段(包)序号"
+            },
+            {
+                "key": "name",
+                "descript": "标段(包)名称"
+            },
+            {
+                "key": "origin",
+                "descript": "标段(包)编号"
+            },
+            {
+                "key": "text",
+                "descript": "标段(包)内容"
+            },
+            {
+                "key": "budget",
+                "descript": "标段(包)预算"
+            },
+            {
+                "key": "bidamounttype",
+                "descript": "金额类型"
+            },
+            {
+                "key": "winner",
+                "descript": "标段(包)中标单位"
+            },
+            {
+                "key": "bidamount",
+                "descript": "标段(包)中标金额"
+            }
+        ],
+        "winnerorder": [
+            {
+                "key": "sortstr",
+                "descript": "候选人名次"
+            },
+            {
+                "key": "entname",
+                "descript": "候选人名称"
+            },
+            {
+                "key": "price",
+                "descript": "投标报价"
+            }
+        ],
+        "other": [
+            {
+                "key": "contractname",
+                "descript": "合同名称"
+            },
+            {
+                "key": "currency",
+                "descript": "币种"
+            },
+            {
+                "key": "contractcode",
+                "descript": "合同编号"
+            },
+            {
+                "key": "funds",
+                "descript": "资金来源"
+            },
+            {
+                "key": "signaturedate",
+                "descript": "合同签订日期"
+            },
+            {
+                "key": "payway",
+                "descript": "付款方式"
+            },
+            {
+                "key": "bid_bond",
+                "descript": "投标保证金"
+            },
+            {
+                "key": "review_experts",
+                "descript": "评审专家"
+            },
+            {
+                "key": "bidmethod",
+                "descript": "评标方法"
+            },
+            {
+                "key": "contract_bond",
+                "descript": "履约保证金"
+            },
+            {
+                "key": "qualifies",
+                "descript": "资质条件"
+            },
+            {
+                "key": "supervisorrate",
+                "descript": "费率、折扣类报价"
+            },
+            {
+                "key": "agencyrate",
+                "descript": "招标代理费率(中标服务费率)"
+            },
+            {
+                "key": "docamount",
+                "descript": "招标文件购买金额"
+            },
+            {
+                "key": "agencyfee",
+                "descript": "招标代理费(中标服务费)"
+            },
+            {
+                "key": "bidway",
+                "descript": "投标方式"
+            },
+            {
+                "key": "getdocmethod",
+                "descript": "获取招标文件办法"
+            },
+            {
+                "key": "bid_guarantee",
+                "descript": "投标保证金-是否支持保函"
+            },
+            {
+                "key": "isppp",
+                "descript": "ppp项目"
+            },
+            {
+                "key": "contract_guarantee",
+                "descript": "是否支持保函"
+            }
+        ]
     }
 }

+ 3 - 0
src/front/front.go

@@ -76,6 +76,9 @@ type Front struct {
 	groupTaskDeliver     xweb.Mapper `xweb:"/front/group/task/deliver"`    //用户组任务交付
 	groupTaskExport      xweb.Mapper `xweb:"/front/group/task/export"`     //用户组任务导出
 	groupUserTaskList    xweb.Mapper `xweb:"/front/group/user/task/list"`  //用户组下用户任务列表
+
+	remarkList   xweb.Mapper `xweb:"/front/user/remark/list"`
+	remarkDetail xweb.Mapper `xweb:"/center/detail/(.*).html"`
 }
 
 func (f *Front) Index() {

+ 351 - 0
src/front/remark.go

@@ -1 +1,352 @@
 package front
+
+import (
+	"fmt"
+	"go.mongodb.org/mongo-driver/bson"
+	mgo "mongodb"
+	qu "qfw/util"
+	"sort"
+	"strconv"
+	"strings"
+	"util"
+)
+
+func (f *Front) RemarkList() {
+	qu.Catch()
+	tid := qu.ObjToString(f.GetString("tid"))
+	sourceinfo := qu.ObjToString(f.GetString("s_sourceinfo"))
+	if f.Method() == "POST" {
+		//user := f.GetSession("user").(map[string]interface{})
+		start, _ := f.GetInteger("start")
+		limit, _ := f.GetInteger("length")
+		draw, _ := f.GetInteger("draw")
+		searchStr := f.GetString("search[value]")
+		search := strings.TrimSpace(searchStr)
+		query := map[string]interface{}{"s_usertaskid": tid}
+		if search != "" {
+			query["$or"] = []interface{}{
+				bson.M{"s_name": bson.M{"$regex": search}},
+			}
+		}
+		info, _ := util.Mgo.Find(sourceinfo, query, `{"_id": 1}`, nil, false, start, limit)
+		count := util.Mgo.Count(sourceinfo, query)
+		qu.Debug(query, sourceinfo, count)
+		f.ServeJson(map[string]interface{}{
+			"draw":            draw,
+			"data":            *info,
+			"recordsFiltered": count,
+			"recordsTotal":    count,
+		})
+
+	} else {
+		f.T["tid"] = tid
+		f.T["s_sourceinfo"] = sourceinfo
+		_ = f.Render("project/remark_list.html", &f.T)
+	}
+}
+
+func (f *Front) RemarkDetail(id, coll string) {
+	rep := getDetail(id, coll)          //获取本条公告的信息
+	f.T["otherInfo"] = rep["otherInfo"] //展示关联公告信息
+	f.T["moreInfo"] = rep["moreInfo"]   //更多关联公告信息
+	f.T["info"] = rep["info"]
+	f.T["common"] = rep["common"]
+	f.T["worder"] = rep["worder"]
+	f.T["packs"] = rep["packs"]
+	f.T["packskey"] = rep["packskey"]
+	f.T["ck_pclistag"] = rep["ck_pclistag"]
+	f.T["timeplace"] = rep["timeplace"]
+	f.T["purchasinglist"] = rep["purchasinglist"]
+	f.T["other"] = rep["other"]
+	f.T["PurchasinglistField"] = util.PurchasinglistField
+	f.T["WinnerorderField"] = util.WinnerorderField
+	f.T["PackageField"] = util.PackageField
+	f.T["topsubtype"] = util.TopSubStypeArr2
+	f.T[preKey+"purchasinglist"] = rep[preKey+"purchasinglist"]
+	f.T[preKey+"package"] = rep[preKey+"package"]
+	f.T[preKey+"winnerorder"] = rep[preKey+"winnerorder"]
+	f.T["worder_new"] = rep["worder_new"]
+	f.T["pcl_new"] = rep["pcl_new"]
+	f.T["pkg_new"] = rep["pkg_new"]
+	f.T["nextid"] = GetNextDataId(id, coll, query)              //下一条id
+	checkedNum, allNum := GetCheckedAndAllDataInfo(query, coll) //已标和总数信息
+	f.T["checkednum"] = checkedNum
+	f.T["allnum"] = allNum
+	f.T["fields"] = util.Config.Fields
+}
+
+func getDetail(id, coll string) map[string]interface{} {
+	rep := map[string]interface{}{}
+	infoTmp, _ := util.Mgo.FindById(coll, id, ``)
+	baseInfo := (*infoTmp)["v_baseinfo"].(map[string]interface{}) //字段值
+	bzInfo := (*infoTmp)["v_taginfo"].(map[string]interface{})    //标注信息
+	baseInfo["detail"] = qu.ObjToString(baseInfo["title"]) + "</br>" + qu.ObjToString(baseInfo["detail"])
+	baseInfo["_id"] = mgo.BsonIdToSId(baseInfo["_id"])
+	purchasingTag, _ := bzInfo["purchasinglist_alltag"].(bool)
+	rep["purchasingTag"] = purchasingTag
+	href := qu.ObjToString(baseInfo["href"])
+	if !strings.HasPrefix(href, "http") {
+		baseInfo["href"] = "https://" + href
+	}
+	rep["info"] = baseInfo
+	common, timeplace, other := setExtComMap(baseInfo, bzInfo) //拼装抽取common值
+	rep["common"] = common
+	rep["timeplace"] = timeplace
+	rep["other"] = other
+	packs, packskey, pkg_new := setPaceMap(baseInfo, bzInfo) //拼装子包信息
+	rep["packs"] = packs
+	rep["packskey"] = packskey
+	rep["pkg_new"] = pkg_new
+
+	purchasinglist, isNewStatus := setPurchasingMap(info) //标的物
+	rep["purchasinglist"] = purchasinglist
+	rep["pcl_new"] = isNewStatus
+	worder, worder_new := setWorderMap(info) //中标候选人
+	rep["worder"] = worder
+	rep["worder_new"] = worder_new
+	otherInfo, moreInfo := setOtherInfo(info) //处理公告关联信息
+	rep["otherInfo"] = otherInfo
+	rep["moreInfo"] = moreInfo
+	//
+	if info[preKey+"purchasinglist"] != nil {
+		rep[preKey+"purchasinglist"] = "1"
+	} else {
+		rep[preKey+"purchasinglist"] = "-1"
+	}
+	if info[preKey+"package"] != nil {
+		rep[preKey+"package"] = "1"
+	} else {
+		rep[preKey+"package"] = "-1"
+	}
+	if info[preKey+"winnerorder"] != nil {
+		rep[preKey+"winnerorder"] = "1"
+	} else {
+		rep[preKey+"winnerorder"] = "-1"
+	}
+	return rep
+}
+
+//拼装抽取common值
+func setExtComMap(info, bzInfo map[string]interface{}) ([]interface{}, []interface{}, []interface{}) {
+	//基本参数
+	common, _ := util.BiaoZhu["common"].([]interface{})
+	for k, tmp := range common {
+		if cp, ok := tmp.(map[string]interface{}); ok {
+			if info[fmt.Sprint(cp["key"])] == nil {
+				cp["value"] = ""
+			} else {
+				if cp["key"] == "subtype" {
+					if info["toptype"] != nil && info["subtype"] != nil {
+						cp["value"] = qu.ObjToString(info["toptype"]) + "-" + qu.ObjToString(info[fmt.Sprint(cp["key"])])
+					} else {
+						cp["value"] = ""
+					}
+				} else {
+					cp["value"] = info[fmt.Sprint(cp["key"])]
+				}
+			}
+			if bzInfo[fmt.Sprint(cp["key"])] == nil {
+				cp["status"] = "-1"
+			} else {
+				cp["status"] = "1"
+			}
+			common[k] = cp
+		}
+	}
+	//时间地点信息
+	timeplace, _ := util.BiaoZhu["timeplace"].([]interface{})
+	for k, tmp := range timeplace {
+		if tp, ok := tmp.(map[string]interface{}); ok {
+			if info[fmt.Sprint(tp["key"])] == nil {
+				tp["value"] = ""
+			} else {
+				key := tp["key"]
+				if key == "bidopentime" || key == "publishtime" || key == "bidendtime" || key == "project_startdate" || key == "project_completedate" {
+					tmpTime := qu.Int64All(info[fmt.Sprint(tp["key"])])
+					if tmpTime > 0 {
+						tp["value"] = qu.FormatDateByInt64(&tmpTime, qu.Date_Full_Layout)
+					} else {
+						tp["value"] = info[qu.ObjToString(tp["key"])]
+					}
+				} else {
+					tp["value"] = info[fmt.Sprint(tp["key"])]
+				}
+			}
+			if bzInfo[fmt.Sprint(tp["key"])] == nil {
+				tp["status"] = "-1"
+			} else {
+				tp["status"] = "1"
+			}
+			timeplace[k] = tp
+		}
+	}
+	//other信息
+	other, _ := util.BiaoZhu["other"].([]interface{})
+	for k, tmp := range other {
+		if cp, ok := tmp.(map[string]interface{}); ok {
+			if info[fmt.Sprint(cp["key"])] == nil {
+				cp["value"] = ""
+			} else {
+				if cp["key"] == "signaturedate" {
+					bidopentime := qu.Int64All(info[fmt.Sprint(cp["key"])])
+					if bidopentime > 0 {
+						cp["value"] = qu.FormatDateByInt64(&bidopentime, qu.Date_Full_Layout)
+					} else {
+						cp["value"] = info[qu.ObjToString(cp["key"])]
+					}
+				} else {
+					cp["value"] = info[fmt.Sprint(cp["key"])]
+				}
+			}
+			//log.Println(cp)
+			if bzInfo[fmt.Sprint(cp["key"])] == nil {
+				cp["status"] = "-1"
+			} else {
+				cp["status"] = "1"
+			}
+			other[k] = cp
+		}
+	}
+	return common, timeplace, other
+}
+
+//拼装子包信息
+func setPaceMap(info, bzInfo map[string]interface{}) ([]map[string]interface{}, []string, []bool) {
+	var confpack []interface{}
+	confpack, _ = util.BiaoZhu["package"].([]interface{})
+	bzpack := bzInfo["package"].(map[string]interface{})
+	packs := map[string]map[string]interface{}{}
+	var sortpackskey []string
+	isNewPkg := map[string]bool{} //记录子包是否是新增的
+	if packages, ok := info["package"].(map[string]interface{}); ok && len(packages) > 0 {
+		for k, tmpackage := range packages { //遍历分包
+			if tmppack, ok := tmpackage.(map[string]interface{}); ok {
+				//isNew, _ := tmppack["ck_isnew"].(bool)
+				isNew := false
+				status := "-1"
+				bzp := bzpack[k].(map[string]interface{})
+				if bzp["tag"] != nil {
+					status = "1"
+				}
+				isNewPkg[k] = isNew
+				sortpackskey = append(sortpackskey, k)
+				var pack []interface{}
+				for _, cpack := range confpack {
+					cpack, _ := cpack.(map[string]interface{})
+					key := qu.ObjToString(cpack["key"])
+					if key == "winner" || key == "bidamount" { //中标单位和中标金额winner_all特殊处理
+						continue
+					}
+					tp := map[string]interface{}{
+						"key":      key,
+						"descript": cpack["descript"],
+					}
+					if tmppack[fmt.Sprint(tp["key"])] != nil {
+						tp["value"] = tmppack[qu.ObjToString(tp["key"])]
+					} else {
+						tp["value"] = ""
+					}
+					tp["status"] = status
+					pack = append(pack, tp)
+				}
+				//特殊处理中标单位和中标金额
+				winnerall := []interface{}{}
+				if tmpWinnerAll, ok := tmppack["winner_all"].([]interface{}); ok && len(tmpWinnerAll) > 0 {
+					for _, tmp := range tmpWinnerAll {
+						tmpMap := tmp.(map[string]interface{})
+						win := map[string]interface{}{
+							"descript": "标段(包)中标单位",
+							"key":      "winner",
+							"status":   status,
+							"value":    qu.ObjToString(tmpMap["winner"]),
+						}
+						winnerall = append(winnerall, win)
+						var bidamount interface{}
+						if tmpMap["bidamount"] == nil {
+							bidamount = ""
+						} else {
+							bidamount = strconv.FormatFloat(qu.Float64All(tmpMap["bidamount"]), 'f', -1, 64)
+						}
+						bid := map[string]interface{}{
+							"descript": "标段(包)中标金额",
+							"key":      "bidamount",
+							"status":   status,
+							"value":    bidamount,
+						}
+						winnerall = append(winnerall, bid)
+					}
+				} else {
+					winnerall = append(winnerall, map[string]interface{}{
+						"descript": "标段(包)中标单位",
+						"key":      "winner",
+						"status":   "-1",
+						"value":    "",
+					})
+					winnerall = append(winnerall, map[string]interface{}{
+						"descript": "标段(包)中标金额",
+						"key":      "bidamount",
+						"status":   "-1",
+						"value":    "",
+					})
+				}
+				packs[k] = map[string]interface{}{
+					"pack":       pack,
+					"packstatus": status,
+					"winnerall":  winnerall,
+				}
+			}
+		}
+	}
+	sort.Strings(sortpackskey)
+	var packages []map[string]interface{}
+	var isNewPkgArr []bool
+	for _, v := range sortpackskey {
+		packages = append(packages, packs[v])
+		isNewPkgArr = append(isNewPkgArr, isNewPkg[v])
+	}
+	return packages, sortpackskey, isNewPkgArr
+}
+
+//拼装标的物
+func setPurchasingMap(info map[string]interface{}) ([]interface{}, []map[string]interface{}) {
+	purchasinglist, _ := util.BiaoZhu["purchasinglist"].([]interface{})
+	var purchasinglists []interface{}
+	//isNewPcl := []bool{} //记录子包是否是新增的
+	isNewAndStatus := []map[string]interface{}{}
+	if tmpcls, ok := info["purchasinglist"].([]interface{}); ok {
+		for _, v := range tmpcls {
+			if pcl, ok := v.(map[string]interface{}); ok {
+				//isNew, _ := pcl["ck_isnew"].(bool)
+				isNew := false
+				status := "-1"
+				if pcl["ck_purchasinglist"] != nil {
+					status = "1"
+				}
+				//isNewPcl = append(isNewPcl, isNew)
+				isNewAndStatus = append(isNewAndStatus, map[string]interface{}{"isnew": isNew, "status": status})
+				pcls := []interface{}{}
+				for _, ps := range purchasinglist {
+					ps, _ := ps.(map[string]interface{})
+					value := pcl[qu.ObjToString(ps["key"])]
+					if value == nil {
+						value = ""
+					}
+					tp := map[string]interface{}{
+						"key":      ps["key"],
+						"descript": ps["descript"],
+						"value":    value,
+						"status":   status,
+					}
+					// if pcl[preKey+fmt.Sprint(tp["key"])] == nil {
+					// 	tp["status"] = "-1"
+					// } else {
+					// 	tp["status"] = "1"
+					// }
+					pcls = append(pcls, tp)
+				}
+				purchasinglists = append(purchasinglists, pcls)
+			}
+		}
+	}
+	return purchasinglists, isNewAndStatus
+}

+ 38 - 16
src/util/config.go

@@ -32,21 +32,19 @@ var (
 	Itype               string
 	CustomerFieldMap_EH map[string]string
 	CustomerFieldMap_HE map[string]string
+	BiaoZhu             map[string]interface{}
 )
 
-
 var (
-	Qy_Es                  					*elastic.Elastic 		//企业es
-	Mgo_QY									*mongodb.MongodbSim		//企业mgo
-	Qy_Lock 								sync.Mutex         	   	//锁-多线程备用
-	Ext_Type,Ext_From						map[string]interface{}	//抽取来源,方式分
-	Buyer_Score,S_Winner_Score				map[string]interface{}	//字段规则分
-	Budget_Score,Bidamount_Score			map[string]interface{}
-	Projectname_Score,Projectcode_Score		map[string]interface{}
+	Qy_Es                                *elastic.Elastic       //企业es
+	Mgo_QY                               *mongodb.MongodbSim    //企业mgo
+	Qy_Lock                              sync.Mutex             //锁-多线程备用
+	Ext_Type, Ext_From                   map[string]interface{} //抽取来源,方式分
+	Buyer_Score, S_Winner_Score          map[string]interface{} //字段规则分
+	Budget_Score, Bidamount_Score        map[string]interface{}
+	Projectname_Score, Projectcode_Score map[string]interface{}
 )
 
-
-
 var SE = qu.SimpleEncrypt{Key: "topJYBX2019"}
 
 const BIDDINGSTARTID = "5a862f0640d2d9bbe88e3cec"
@@ -118,16 +116,40 @@ func InitConfig() {
 		CustomerFieldMap_EH[val] = k
 	}
 
-
+	BiaoZhu = Sysconfig["biaozhu"].(map[string]interface{})
+	//common := BiaoZhu["common"].([]interface{})
+	//timeplace := BiaoZhu["timeplace"].([]interface{})
+	//other := BiaoZhu["other"].([]interface{})
+	//for _, com := range common {
+	//	tmp := com.(map[string]interface{})
+	//	key := qu.ObjToString(tmp["key"])
+	//	if key == "" {
+	//		continue
+	//	}
+	//descript := qu.ObjToString(tmp["descript"])
+	//tmpAllField = append(tmpAllField, descript)
+	//AllFieldMap[descript] = key
+	//}
+	//for _, tp := range timeplace {
+	//tmp := tp.(map[string]interface{})
+	//key := qu.ObjToString(tmp["key"])
+	//descript := qu.ObjToString(tmp["descript"])
+	//tmpAllField = append(tmpAllField, descript)
+	//AllFieldMap[descript] = key
+	//}
+	//for _, o := range other {
+	//tmp := o.(map[string]interface{})
+	//key := qu.ObjToString(tmp["key"])
+	//descript := qu.ObjToString(tmp["descript"])
+	//tmpAllField = append(tmpAllField, descript)
+	//AllFieldMap[descript] = key
+	//}
 
 	initQuaConfig()
 }
 
-
-
-
 //质量相关初始化配置
-func initQuaConfig()  {
+func initQuaConfig() {
 	//线上-需替换-172.17.145.163:27083,172.17.4.187:27082,
 	qyxyconf := Quaconfig["qy_mongodb"].(map[string]interface{})
 	Mgo_QY = &mongodb.MongodbSim{
@@ -157,4 +179,4 @@ func initQuaConfig()  {
 
 	Projectname_Score = Quaconfig["projectname_score"].(map[string]interface{})
 	Projectcode_Score = Quaconfig["projectcode_score"].(map[string]interface{})
-}
+}

+ 1467 - 3
src/web/templates/project/remark_detail.html

@@ -1,10 +1,1474 @@
 <!DOCTYPE html>
 <html lang="en">
+{{include "com/inc.html"}}
 <head>
-  <meta charset="UTF-8">
-  <title>$Title$</title>
+    <meta charset="UTF-8">
+    <title>标注中心</title>
+    <link href="/dist/css/normalize.min.css" rel="stylesheet">
+    <link href="/dist/css/animate.min.css" rel="stylesheet">
+    <link rel="stylesheet" href="/dist/css/zz.css">
+    <link rel="stylesheet" href="/dist/css/index.css">
+    <script src="/dist/js/vue.min.js"></script>
+    <script src="/dist/js/index.js"></script>
+    <style>
+        .add-tip {
+            width: 24px;
+            height: 22px;
+            line-height: 22px;
+            text-align: center;
+            color: #fff;
+            margin: 0;
+            padding: 0;
+            border: 1px solid #ccc;
+            background-color: #fdfdfd;
+        }
+
+        .info-box > * {
+            cursor: pointer;
+        }
+
+        .button-group {
+            display: flex;
+            flex-direction: row;
+            align-items: center;
+            justify-content: space-between;
+        }
+
+        .button-group .info-box {
+            margin-left: -60px;
+        }
+
+        .edit-box .edit.two .edit-title {
+            padding-right: 4px;
+        }
+
+        .edit-box .edit .edit-input .label > span {
+            max-width: unset;
+            text-align: left;
+            padding: 0 1em;
+        }
+
+        .a-button {
+            color: #4169e3;
+            margin: 8px 15px;
+            padding: 4px 10px;
+        }
+
+        .button-box.delete-box {
+            margin-right: 22px !important;
+            margin-left: -419px !important;
+        }
+
+        .button-box.delete-box .pass {
+            background-color: #f56c6c !important;
+        }
+
+        .pass.success {
+            background-color: #09bb07 !important;
+        }
+
+        .pass.default {
+            background-color: #adadad !important;
+        }
+
+        .el-table td, .el-table th {
+            padding: 4px 0;
+        }
+
+        .top-button-group {
+            margin-top: 20px;
+        }
+
+        .top-button-group button {
+            margin-bottom: 12px;
+        }
+
+        .el-radio-button--mini.info .el-radio-button__inner {
+            color: #909399 !important;
+            background: #f4f4f5 !important;
+            border-color: #d3d4d6 !important;
+        }
+
+        .default .el-radio-button__orig-radio + .el-radio-button__inner {
+            color: #409eff;
+            background: #ecf5ff;
+            border-color: #b3d8ff;
+        }
+
+        .success .el-radio-button__orig-radio + .el-radio-button__inner {
+            color: #67c23a;
+            background: #f0f9eb;
+            border-color: #c2e7b0;
+        }
+
+        .success .el-radio-button__orig-radio:checked + .el-radio-button__inner,
+        .default .el-radio-button__orig-radio:checked + .el-radio-button__inner {
+            color: #FFF;
+            background-color: #409EFF;
+            border-color: #409EFF;
+            -webkit-box-shadow: -1px 0 0 0 #409EFF;
+            box-shadow: -1px 0 0 0 #409EFF
+        }
+
+
+    </style>
+    <script>
+        function prettyPrint(obj) {
+            var ENDLINE = "\n";
+            var COMMA_ENDLINE = ",\n";
+            var OBJ_BEGIN = "{";
+            var OBJ_END = "}";
+            var ARR_BEGIN = "[";
+            var ARR_END = "]";
+            var INDNET_SPACES = 4;
+
+            return (function innerPrettyPrint(obj, spaces) {
+                var type = typeof obj;
+                if (type == "number" || type == "boolean") {
+                    return obj.toString();
+                } else if (type == "string") {
+                    if (obj != "" && !isNaN(Number(obj))) {
+                        return Number(obj)
+                    }
+                    return '"' + obj + '"';
+                } else {
+                    var entries = [];
+                    var thisIndent = ' '.repeat(spaces);
+                    var subIndent = thisIndent + ' '.repeat(INDNET_SPACES);
+                    var subSpaces = spaces + INDNET_SPACES;
+                    if (Object.prototype.toString.call(obj) == '[object Object]') {
+                        for (var k in obj) {
+                            entries.push('"' + k + '": ' + innerPrettyPrint(obj[k], subSpaces));
+                        }
+                        return OBJ_BEGIN + ENDLINE + subIndent + entries.join(COMMA_ENDLINE + subIndent) + ENDLINE + thisIndent + OBJ_END;
+                    } else if (Object.prototype.toString.call(obj) == '[object Array]') {
+                        obj.forEach(function (a) {
+                            entries.push(innerPrettyPrint(a, subSpaces));
+                        });
+                        return ARR_BEGIN + ENDLINE + subIndent + entries.join(COMMA_ENDLINE + subIndent) + ENDLINE + thisIndent + ARR_END;
+                    } else if (obj === null) {
+                        return "null";
+                    } else {
+                        return obj.toString();
+                    }
+                }
+            })(obj, 0);
+        }
+    </script>
 </head>
 <body>
-$END$
+<main id="app">
+    <div class="content" :class="{mm:showPop}">
+        <!--文章区-->
+        <div class="article">
+            <div class="top-button-group">
+                <el-radio-group v-model="activeLabel" size="mini">
+                    <el-radio-button class="default" label="原文"></el-radio-button>
+                    {{if .T.info.filetext}}
+                    <el-radio-button class="default" label="附件"></el-radio-button>
+                    {{end}}
+                </el-radio-group>
+
+                <el-radio-group v-model="activeLabel" v-for="(item, index) in otherInfo" size="mini">
+                    <el-radio-button class="success" :label="item.id">[[item.subtype]]</el-radio-button>
+                    <el-radio-button class="success" :label="item.id + '-附件'">附件</el-radio-button>
+                </el-radio-group>
+
+                <el-radio-group v-if="moreInfo&&moreInfo.length > 0" size="mini">
+                    <el-popover
+                            placement="right-end"
+                            trigger="hover">
+                        <el-table :data="moreInfo" max-height="300">
+                            <el-table-column width="50" property="subtype" label="类型"></el-table-column>
+                            <el-table-column width="180" property="publishtime" label="发布日期"></el-table-column>
+                            <el-table-column width="220" property="title" label="标题">
+                                <template slot-scope="scope">
+                                    <a href="#" @click="openLink(scope.row.href)">[[scope.row.title]]</a>
+                                </template>
+                            </el-table-column>
+                        </el-table>
+                        <el-radio-button class="info" slot="reference" style="border-color: #d3d4d6;">更多
+                        </el-radio-button>
+                    </el-popover>
+                </el-radio-group>
+            </div>
+
+            <hr style="border: 1px;" width="100%">
+            <br><a v-if="getPageInfo.href.length > 0" :href="getPageInfo.href" target="_blank">查看原文</a>
+            <!--<a href="{{.T.jyhref}}" target="_blank">剑鱼链接</a>-->
+            <h3>[[getPageInfo.title]]</h3><br>
+
+            <div v-html="pageHtml"></div>
+        </div>
+        <!--操作区-->
+        <div class="operation">
+            <!--edit-box-->
+            <div class="edit-box">
+                <!--edit-->
+                <div class="edit one" v-for="(one,oindex) in editData" :key="oindex">
+                    <!--one-->
+                    <div class="edit-title" @click="one.show = !one.show">
+                        <span>[[one.title]]</span>
+                        <div class="button-group">
+                            <div v-if="one.showCheck">
+                                <input :id="one.title" v-show="one.title == '标的信息'" @click.stop type="checkbox"
+                                       v-model="one.checkAllTag">
+                                <label @click.stop v-show="one.title == '标的信息'" :for="one.title">全部标注</label>
+                            </div>
+                            <!-- &nbsp;
+                             <div v-if="one.showCheck">
+                                 <input :id="one.title" @click.stop type="checkbox" v-model="one.checkType">
+                                 <label @click.stop :for="one.title">是否抽取</label>
+                             </div>-->
+                            <div class="button-box">
+                                <!--v-show="one.title == '基本字段'"-->
+                                <button class="pass success" @click.stop="saveDataOne(one,'1')"
+                                        style="font-size: 14px;width: auto;float:left;">通过
+                                </button>
+                                <button class="pass default" @click.stop="saveDataOne(one,'-1')"
+                                        style="font-size: 14px;width: auto;float:left">取消
+                                </button>
+                                <!--              						  <button class="pass" @click.stop="open(one, true)"  style="font-size: 14px;width: auto;float:left">保存</button>-->
+                            </div>
+                            <!--<button class="add" v-show="one.title != '基本'" @click.stop="one.content.push(getTemp(2));goMark2(500)">+</button>-->
+                            <!--<button class="add" v-show="one.title == '基本'" @click.stop="one.content[0].content.push(getTemp(3));goMark2(60)">+</button>-->
+                            <div class="info-box" @click.stop v-show="one.showCheck">
+                                <div :class="{default: one.status == '-1'}" @click="setStatus(one,'-1')"></div>
+                                <!--<div :class="{ok: one.status == '1'}" @click="one.status = '1'"></div>-->
+                                <div :class="{ok: one.status == '1'}" @click="setStatus(one,'1')"></div>
+                                <!--<div :class="{err: one.status == '0'}" @click="one.status = '0'"></div>-->
+                                <div class="add-tip" :class="{err: (one.status != '1' && one.status != '-1')}"
+                                     @click="setStatus(one,'2')"></div>
+                            </div>
+
+                        </div>
+                    </div>
+                    <transition tag="div">
+                        <div>
+                            <div class="button-box" v-if="one.showCheck&&one.show">
+                                <button class="pass a-button" @click.stop="addChild(one, oindex)"
+                                        style="font-size: 14px;width: auto;float:left;">新增[[one.title]]
+                                </button>
+                            </div>
+                            <div class="edit-content" :class="{t:one.title == '基本字段'}" v-show="one.show">
+                                <!--two-->
+
+                                <span v-show="one.content.length === 0">当前您还没有添加子包</span>
+                                <div class="edit two" v-for="(two,index) in one.content" :key="index">
+                                    <div class="edit-title" v-if="two.title" @click="two.show = !two.show">
+                                        <span>[[two.title]]</span>
+                                        <div class="button-box"
+                                             :style="one.title == '多包信息' ? 'margin-right: 193px' : ''">
+                                            <button v-if="one.title == '多包信息'" class="pass a-button"
+                                                    @click.stop="addThreeChild(two,'2',one)"
+                                                    style="font-size: 14px;margin: 0;width: auto;float:left;">新增子包中标信息
+                                            </button>
+                                            <button class="pass success" @click.stop="saveDataTwo(two,'1',one)"
+                                                    style="font-size: 14px;width: auto;float:left;">通过
+                                            </button>
+                                            <button class="pass default" @click.stop="saveDataTwo(two,'-1',one)"
+                                                    style="font-size: 14px;width: auto;float:left">取消
+                                            </button>
+                                        </div>
+                                        <div class="button-box delete-box">
+                                            <button class="pass" @click.stop="delNewTwo(one, index, two)">删除</button>
+                                        </div>
+                                    </div>
+                                    <transition tag="div">
+                                        <div class="edit-content" v-show="two.show">
+                                            <!--input-->
+                                            <div class="edit-input">
+                                                <div v-for="(uin, uindex) of two.uInput" class="input-box"
+                                                     :key="uin.title">
+                                                    <div class="label" v-if="uin.selectArr">
+                                                        <span>[[uin.title]]&nbsp;:&nbsp;</span>
+                                                        <select v-model="uin.select"
+                                                                @change="focusFn(uin, oindex,index,uindex, two, one)">
+                                                            <option disabled value="">请选择</option>
+                                                            <option v-for="o in uin.selectArr">[[o]]</option>
+                                                        </select>
+                                                        <div class="info-box">
+                                                            <div :class="{default: uin.status == '-1'}"
+                                                                 @click="setStatus(uin,'-1', two, one)"></div>
+                                                            <div :class="{ok: uin.status == '1'}"
+                                                                 @click="setStatus(uin,'1', two, one)"></div>
+                                                            <!--<div :class="{err: uin.status == '0'}" @click="uin.status = '0'"></div>-->
+                                                            <div class="add-tip" @click="setStatus(uin,'2', two, one)"
+                                                                 :class="{err: (uin.status != '1' && uin.status != '-1')}"></div>
+
+                                                        </div>
+                                                    </div>
+                                                    <div class="label" v-else :title="uin.input">
+                                                        <span @click="goText(uin.title)">[[uin.title]]&nbsp;:&nbsp;</span>
+                                                        <input type="text" v-model="uin.input"
+                                                               @focus="goText(uin.input)" @click="goText(uin.input)"
+                                                               @blur="focusFn(uin, oindex, index, uindex,two,one)">
+                                                        <div class="info-box">
+                                                            <div :class="{default: uin.status == '-1'}"
+                                                                 @click="setStatus(uin,'-1', two, one)"></div>
+                                                            <div :class="{ok: uin.status == '1'}"
+                                                                 @click="setStatus(uin,'1', two, one)"></div>
+                                                            <!--<div :class="{err: uin.status == '0'}" @click="uin.status = '0'"></div>-->
+                                                            <div class="add-tip" @click="setStatus(uin,'2', two, one)"
+                                                                 :class="{err: (uin.status != '1' && uin.status != '-1')}"></div>
+
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                            </div>
+                                            <!--three-->
+                                            <!--<div>
+                                                                     <div class="edit-title" v-show="one.title == '基本字段'">
+                                                    <span>候选人</span>
+                                                    <div class="info-box" >
+                                                        <div :class="{default: two.wstatus == '-1'}" @click="two.wstatus = '-1'"></div>
+                                                        <div :class="{ok: two.wstatus == '1'}" @click="two.wstatus = '1'"></div>
+                                                        <el-popover trigger="click" >
+                                                          <div style="text-align: right; margin: 0">
+                                                            <el-button type="success" size="mini" @click="two.wstatus = '2'">新增</el-button>
+                                                            <el-button type="warning" size="mini" @click="two.wstatus = '3'">修改</el-button>
+                                                            <el-button type="danger" size="mini" @click="two.wstatus = '4'">删除</el-button>
+                                                          </div>
+                                                          <div class="add-tip" slot="reference" :class="{err: (two.wstatus != '1' && two.wstatus != '-1')}">[[textMap[two.wstatus] || '']]</div>
+                                                        </el-popover>
+                                                    </div>
+                                                </div>
+                                                <div class="edit three" v-for="(three,index) in two.content" :key="index">
+                                                    <div class="edit-title" @click="three.show = !three.show">
+                                                        <span>[[three.title]]</span>
+                                                    </div>
+                                                    <div class="edit-content" v-show="three.show">
+                                                        <div class="edit-input">
+                                                            <div class="input-box" v-for="(threeUin,index) in three.uInput" :key="threeUin.title">
+                                                                <div class="label">
+                                                                    <span @click="goText(threeUin.title)">[[threeUin.title]]&nbsp;:&nbsp;</span>
+                                                                    <input type="text" v-model="threeUin.input" @focus="goText(threeUin.input)" @click="goText(threeUin.input)">
+                                                                    <div class="info-box">
+                                                                        <div :class="{default: threeUin.status == '-1'}" @click="threeUin.status = '-1'"></div>
+                                                                        <div :class="{ok: threeUin.status == '1'}" @click="threeUin.status = '1'"></div>
+                                                                      <el-popover trigger="click" >
+                                                                        <div style="text-align: right; margin: 0">
+                                                                          <el-button type="success" size="mini" @click="threeUin.status = '2'">新增</el-button>
+                                                                          <el-button type="warning" size="mini" @click="threeUin.status = '3'">修改</el-button>
+                                                                          <el-button type="danger" size="mini" @click="threeUin.status = '4'">删除</el-button>
+                                                                        </div>
+                                                                        <div class="add-tip" slot="reference" :class="{err: (threeUin.status != '1' && threeUin.status != '-1')}">[[textMap[threeUin.status] || '']]</div>
+                                                                      </el-popover>
+                                                                    </div>
+                                                                </div>
+                                                            </div>
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                            </div>-->
+
+                                        </div>
+                                    </transition>
+                                </div>
+                            </div>
+                        </div>
+                    </transition>
+                </div>
+            </div>
+            <div class="save-box">
+                <!--                 <button  class="code" @click.stop="showPop = true" style="width:100px">源码</button>&nbsp;&nbsp; -->
+                <!--                 <button  class="code" @click.stop="open(1)" style="width:100px">全部验证</button> -->
+                <button class="code" @click.stop="open(2)" style="width:100px">字段验证</button>
+                <!--            <button  class="code" @click.stop="open('', false)" style="width:100px">保存</button>&nbsp;&nbsp;-->
+                <button class="code" @click.stop="openHref" style="width:100px">下一条</button>
+                <!--<button  class="code" @click.stop="window.location.href='/'" style="width:100px">下一条</button>-->
+            </div>
+        </div>
+    </div>
+    <!--弹出层-->
+    <dialog class="dialog" v-if="showPop">
+        <span class="close" @click="showPop = false;changeText()">x</span>
+        <div class="pop">
+            <div class="title">源码</div>
+            <div class="con" ref="text" contentEditable="true">
+                <pre v-html="addStyle(editData)"></pre>
+            </div>
+            <button @click="showPop = false;changeText();upChange()">保&nbsp;存</button>
+        </div>
+    </dialog>
+    <dialog id="com-alert" class="dialog" style="background: rgba(124, 124, 125, 0.1);z-index:9999;display: none;">
+        <div class="pop" style="background: rgba(124, 124, 125, 0.1);">
+            <div id="com-alert-val" class="title" style="color:red">保存成功</div>
+        </div>
+    </dialog>
+</main>
+
 </body>
+<script>
+    var allCheckFields = {{ .T.fields }}          //本次需标注的所有字段
+    // 页面数据
+    var pageDataMap = {
+        '原文': {
+            title: '{{.T.info.title}}',
+            href: '{{.T.info.href}}',
+            html: '{{Html (Regexp (Regexp .T.info.detail "(\\\\n|\\\\\\\\n)\\\\s+" "\\n") "(`|\\\\n|\\\\\\\\n)+" "<br/>")}}',
+        '附件':{
+            title: '附件内容',
+            href: '',
+            html:{{if .T.info.filetext}}{{.T.info.filetext}}.replace(/(\\n|\\\\n)\\s+/, '\n').replace(/(`|\\n|\\\\n)+/, '<br>'){{else}}``{{end}} }
+      }
+    // 更多关联信息
+    var moreInfo = {{ .T.moreInfo }}
+    //公告关联信息
+    var otherInfo = {{ .T.otherInfo }}
+    //快捷键
+    $(document).keydown(function (event) {
+        if (!event.shiftKey) {
+            var text = getSelectedContents();//获取选中文本
+            if (!text.trim().length) {
+                return
+            }
+        }
+
+        if (event.keyCode === 82) {//项目名称快捷键r
+            if (event.shiftKey) {
+                app.changeBaseValue(0, '', 2) //删除对应文本
+            } else {
+                app.changeBaseValue(0, text, 2)//填充
+            }
+        } else if (event.keyCode === 81) {//省份快捷键q
+            if (event.shiftKey) {
+                app.changeBaseValue(1, '', 2) //删除对应文本
+            } else {
+                app.changeBaseValue(1, text, 2)//填充
+            }
+        } else if (event.keyCode === 84) {//项目编号快捷键t
+            if (event.shiftKey) {
+                app.changeBaseValue(2, '', 2) //删除对应文本
+            } else {
+                app.changeBaseValue(2, text, 2)//填充
+            }
+        } else if (event.keyCode === 87) {//城市快捷键w
+            if (event.shiftKey) {
+                app.changeBaseValue(3, '', 2) //删除对应文本
+            } else {
+                app.changeBaseValue(3, text, 2)//填充
+            }
+        } else if (event.keyCode === 69) {//区县快捷键e
+            if (event.shiftKey) {
+                app.changeBaseValue(5, '', 2) //删除对应文本
+            } else {
+                app.changeBaseValue(5, text, 2)//填充
+            }
+        } else if (event.keyCode === 65) {//预算快捷键a
+            if (event.shiftKey) {
+                app.changeBaseValue(6, '', 2) //删除对应文本
+            } else {
+                app.changeBaseValue(6, text, 2)//填充
+            }
+        } else if (event.keyCode === 90) {//中标金额快捷键z
+            if (event.shiftKey) {
+                app.changeBaseValue(7, '', 2) //删除对应文本
+            } else {
+                app.changeBaseValue(7, text, 2)//填充
+            }
+        } else if (event.keyCode === 83) {//采购单位快捷键s
+            if (event.shiftKey) {
+                app.changeBaseValue(8, '', 2) //删除对应文本
+            } else {
+                app.changeBaseValue(8, text, 2)//填充
+            }
+        } else if (event.keyCode === 88) {//代理机构快捷键x
+            if (event.shiftKey) {
+                app.changeBaseValue(9, '', 2) //删除对应文本
+            } else {
+                app.changeBaseValue(9, text, 2)//填充
+            }
+        } else if (event.keyCode === 68) {//中标单位快捷键d
+            if (event.shiftKey) {
+                app.changeBaseValue(10, '', 2) //删除对应文本
+            } else {
+                app.changeBaseValue(10, text, 2)//填充
+            }
+        }
+    });
+
+    //获取鼠标选中的文本
+    function getSelectedContents() {
+        var text = "";
+        if (window.getSelection) { //chrome,firefox,opera
+            var range = window.getSelection().getRangeAt(0);
+            var container = document.createElement('div');
+            container.appendChild(range.cloneContents());
+            text = container.innerHTML;
+            //return container.innerHTML;
+            //return window.getSelection(); //只复制文本
+        } else if (document.getSelection) { //其他
+            var range = document.getSelection().getRangeAt(0);
+            var container = document.createElement('div');
+            container.appendChild(range.cloneContents());
+            text = container.innerHTML;
+            //return container.innerHTML;
+            //return document.getSelection(); //只复制文本
+        } else if (document.selection) { //IE特有的
+            text = document.selection.createRange().htmlText;
+            //return document.selection.createRange().htmlText;
+            //return document.selection.createRange().text; //只复制文本
+        }
+        text = text.replace(/(\r|\n|\s+|&nbsp;|<[^>]*>|<\/[^>]*)/g, "")
+        return text;
+    }
+
+    //记录是否点击保存
+    var issave = false;
+    var _id = {{ .T.info._id }}
+    var nextid = {{ .T.nextid }}
+    //基本信息
+    var common = {{ .T.common }}
+    var uInput = [];
+    for (k in common) {
+        var tmp = {}
+        tmp.title = common[k].descript
+        tmp.input = common[k].value
+        tmp.key = common[k].key
+        if (common[k].key === "subtype") {
+            tmp.select = common[k].value
+            tmp.selectArr = {{ .T.topsubtype }}
+        }
+        if (common[k].key === "attach_discern") {
+            tmp.select = common[k].value
+            tmp.selectArr = ['识别有效', '识别无效']
+        }
+        if (common[k].key === "attach_ext") {
+            tmp.select = common[k].value
+            tmp.selectArr = ['抽取正确', '抽取错误']
+        }
+        if (common[k].key === "isrepeat") {
+            tmp.select = common[k].value
+            tmp.selectArr = ['是', '否']
+        }
+        tmp.status = common[k].status
+        if (common[k].key === "bidamounttype") {
+            tmp.select = common[k].value ? common[k].value : '金额'
+            tmp.selectArr = ['金额', '折扣率', '单价']
+            tmp.status = 1
+        }
+        uInput[k] = tmp
+    }
+    //时间地点
+    var timeplace = {{ .T.timeplace }}
+    var tpInput = [];
+    for (k in timeplace) {
+        var tmp = {}
+        tmp.title = timeplace[k].descript
+        tmp.input = timeplace[k].value
+        tmp.key = timeplace[k].key
+        tmp.status = timeplace[k].status
+        tpInput[k] = tmp
+    }
+
+    //其他信息
+    var other = {{ .T.other }}
+    var otherInput = [];
+    for (k in other) {
+        var tmp = {}
+        tmp.title = other[k].descript
+        tmp.input = other[k].value
+        tmp.key = other[k].key
+        tmp.status = other[k].status
+        if (other[k].key === "isppp" || other[k].key === "contract_guarantee" || other[k].key === "bid_guarantee") {
+            tmp.select = other[k].value
+            tmp.selectArr = ['是', '否']
+        }
+        otherInput[k] = tmp
+    }
+
+    //中标候选人
+    var c_worder = {{ .T.worder }}
+    var worder_new = {{ .T.worder_new }}
+    var c_content = [];
+    for (k in c_worder) {
+        var c_uInput = [];
+        for (i in c_worder[k]) {
+            var tmp = {}
+            tmp.title = c_worder[k][i].descript
+            tmp.input = c_worder[k][i].value || ''
+            tmp.key = c_worder[k][i].key
+            tmp.status = c_worder[k][i].status
+            c_uInput[i] = tmp
+        }
+        var content = {};
+        content.title = "候选人"
+        content.show = true
+        content.status = worder_new[k]["status"]
+        content.uInput = c_uInput
+        content.ck_isnew = worder_new[k]["isnew"] || false
+        content.content = []
+        c_content[k] = content
+    }
+
+    //标的信息
+    var purchasinglist = {{ .T.purchasinglist }}
+    var pcl_new = {{ .T.pcl_new }}
+    var pcl_content = [];
+    for (k in purchasinglist) {
+        var c_uInput = [];
+        for (i in purchasinglist[k]) {
+            var tmp = {}
+            tmp.title = purchasinglist[k][i].descript
+            tmp.input = purchasinglist[k][i].value
+            tmp.key = purchasinglist[k][i].key
+            tmp.status = purchasinglist[k][i].status
+            //if(purchasinglist[k][i].key== "pclisover"){
+            //  tmp.select = purchasinglist[k][i].value ? purchasinglist[k][i].value : '是'
+            //  //tmp.select=purchasinglist[k][i].value
+            //  tmp.selectArr=['是','否']
+            //}
+            c_uInput[i] = tmp
+        }
+        var content = {};
+        content.title = "标的物"
+        content.show = true
+        content.status = pcl_new[k]["status"]
+        content.uInput = c_uInput
+        content.ck_isnew = pcl_new[k]["isnew"] || false
+        content.content = []
+        pcl_content[k] = content
+    }
+
+    //var ispackage='{{.T.ispackage}}'
+    //子包信息
+    var packs = {{ .T.packs }}
+    var packskey = {{ .T.packskey }}
+    var pkg_new = {{ .T.pkg_new }}
+    //var ck_package='{{.T.ck_package}}'
+    //分包抽查,若果有分包,默认ok
+    //if(packs.length>0&&ispackage=="1"){
+    //	ck_package="1"
+    //}
+    var p_content = [];
+    for (k in packs) {
+        //子包基本信息
+        var uInputs = [];
+        var pack = packs[k]["pack"]
+        for (i in pack) {
+            var tmp = {}
+            tmp.title = pack[i].descript
+            tmp.input = pack[i].value
+            tmp.key = pack[i].key
+            tmp.status = pack[i].status
+            if (pack[i].key === "bidamounttype") {
+                tmp.select = pack[i].value ? pack[i].value : '金额'
+                tmp.selectArr = ['金额', '折扣率', '单价']
+                tmp.status = 1
+            }
+            uInputs[i] = tmp
+        }
+
+        //中标人信息
+        var winnerall = packs[k]["winnerall"]
+        for (i in winnerall) {
+            var tmp = {}
+            tmp.title = winnerall[i].descript
+            tmp.input = winnerall[i].value
+            tmp.key = winnerall[i].key
+            tmp.status = winnerall[i].status
+            uInputs.push(tmp)
+        }
+        var content = {};
+        content.title = "子包";
+        content.show = true;
+        content.status = packs[k]["packstatus"];
+        content.uInput = uInputs;
+        content.ck_isnew = pkg_new[k] || false
+        content.num = packskey[k];
+        p_content[k] = content;
+
+    }
+
+    var pclf = {{ .T.PurchasinglistField }}
+    var pclfInput = []
+    for (i in pclf) {
+        for (key in pclf[i]) {
+            var tempNode = {
+                input: "",
+                key: key,
+                status: "2",
+                title: pclf[i][key]
+            }
+            //if(key== "pclisover"){
+            //  tempNode.select= '是'
+            //  tempNode.selectArr=['是','否']
+            //}
+            pclfInput.push(tempNode)
+        }
+    }
+
+
+    var wodf = {{ .T.WinnerorderField }}
+    var wodfInput = []
+    for (i in wodf) {
+        for (key in wodf[i]) {
+            wodfInput.push({
+                input: "",
+                key: key,
+                status: "2",
+                title: wodf[i][key]
+            })
+        }
+    }
+    var pf = {{ .T.PackageField }}
+    var pfInput = []
+    for (i in pf) {
+        for (key in pf[i]) {
+            var tempNode = {
+                input: "",
+                key: key,
+                status: "2",
+                title: pf[i][key]
+            }
+            if (key === "bidamounttype") {
+                tempNode.select = '金额'
+                tempNode.selectArr = ['金额', '折扣率', '单价']
+            }
+            pfInput.push(tempNode)
+        }
+    }
+    var app = new Vue({
+        el: '#app',
+        delimiters: ["[[", "]]"],
+        data: {
+            activeLabel: '原文',
+            nowLabel: ['原文'],
+            otherInfo: otherInfo,
+            moreInfo: moreInfo,
+            scrollCache: {
+                value: '',
+                index: 0
+            },
+            textMap: ['', '', '增', '改', '删'],
+            pageHtml: `{{Html (Regexp (Regexp .T.info.detail "(\\\\n|\\\\\\\\n)\\\\s+" "\\n") "(\`|\\\\n|\\\\\\\\n)+" "<br/>")}}`,
+            showPop: false,
+            editData:[{
+              title: '基本字段',
+              show: true,
+              status: "1",
+              content: [{
+                title: '',
+                show: true,
+                delete: false,
+                //wstatus:"-1",
+                uInput: uInput
+                //content: c_content
+                }]
+              }, {
+              title: '时间地点',
+              show: false,
+              status: "1",
+              content: [{
+                title: '',
+                show: true,
+                delete: false,
+                //wstatus:"-1",
+                uInput: tpInput
+                }]
+              }, {
+              title: '标的信息',
+              show: false,
+              showCheck: true,
+              key: 'purchasinglist',
+              //checkType: {{.T.ck_pclisext}},
+              content: pcl_content,
+              checkAllTag: {{ .T.ck_pclistag }},
+              status: {{ .T.ck_purchasinglist }},
+              }, {
+              title: '多包信息',
+              show:false,
+              showCheck: true,
+              key: 'package',
+              checkType: {{.T.ck_pkgisext}},
+              status:{{ .T.ck_package }},
+              content: p_content
+              }, {
+              title: '中标候选人信息',
+              show: false,
+              showCheck: true,
+              key: 'winnerorder',
+              checkType: {{.T.ck_wodrisext}},
+              status:{{ .T.ck_winnerorder }},
+              content: c_content
+              }, {
+              title: '其余信息',
+              show:false,
+              status:"1",
+              content:[{title: '', show: true, delete: false,
+                    //wstatus:"-1",
+                      uInput: otherInput
+                  }
+              ]}
+            ],
+            originData: []},
+        watch: {
+          //切换标签时更改正文内容
+          'activeLabel':
+            function () {
+                this.pageHtml = this.getPageInfo.html
+            }},
+          computed: {
+            getPageInfo() {
+              var tempData = {
+                  title: '',
+                  html: this.pageHtml,
+                  href: ''
+              }
+              //匹配原文或者原文附件
+              var originData = pageDataMap[this.activeLabel]
+              if (originData) {
+                  tempData.title = originData.title
+                  tempData.html = originData.html
+                  tempData.href = originData.href
+              } else {//匹配原公告关联信息
+                  var tempS = this.activeLabel.split('-')
+                  var isFile = tempS.length === 2
+                  var otherData = this.otherInfo.filter(v => v.id == tempS[0])
+                  if (otherData.length > 0) {
+                      tempData.title = otherData[0].title
+                      tempData.html = otherData[0].detail
+                      tempData.href = otherData[0].href
+                      if (isFile) {
+                          tempData.title = '附件内容'
+                          tempData.html = otherData[0].filetext
+                          tempData.href = ''
+                      }
+                  }
+              }
+              return tempData
+            }
+          },
+          mounted() {
+              // 缓存原始数据
+              this.originData = JSON.parse(JSON.stringify([].concat(this.editData)))
+          },
+          methods: {
+              // 当前输入框数据与原始数据比较
+              focusFn(uin, oIndex, tIndex, uIndex, two, one) {
+                  if (uin.key === "bidendtime" || uin.key === "bidopentime" || uin.key === "project_startdate" || uin.key === "project_completedate" ||
+                          uin.key === "publishtime" || uin.key === "signaturedate") {
+                      var val = uin.input
+                      if (val !== "") {
+                          var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/;
+                          var regExp = new RegExp(reg);
+                          if (!regExp.test(val)) {
+                              this.$message({
+                                  message: uin.title + ",日期格式错误!正确格式:2006-01-02 15:04:05",
+                                  type: 'warning',
+                                  duration: 2000,
+                                  offset: 300
+                              });
+                              return
+                          }
+                      }
+                  }
+                  var newNode = this.originData[oIndex].content[tIndex]
+                  if (newNode == null) {//新增子模块处理
+                      return
+                  }
+                  var oNode = newNode.uInput[uIndex]
+                  if (oNode == null) {//新增中标人信息处理
+                      return
+                  }
+                  var changeStatus = uin.input === oNode.input//多包中新增的中标信息报错
+                  if (uin.select) {
+                      changeStatus = uin.select === oNode.select
+                  }
+                  uin.status = changeStatus ? 1 : 2
+                  this.setStatus(uin, uin.status, two, one);
+              },
+              openLink(link) {
+                  window.open(link, '_blank')
+              },
+              // 改变基本字段属性
+              changeBaseValue(index, input, status) {
+                  if (this.editData[0].content[0].uInput[index].input !== input) {
+                      this.editData[0].content[0].uInput[index].input = input
+                      this.editData[0].content[0].uInput[index].status = status
+                  }
+              },
+              selectChange(uni, status, two, one) {
+                //状态更新
+                if (uni.status === '-1' || uni.status === '2') {
+                    status = 2
+                }
+                this.setStatus(uni, status, two, one)
+              },
+              openHref() {
+                  if (!issave) {
+                      alert("请先保存数据!")
+                  } else {
+                      if (nextid === "") {
+                          window.location.href = '/center/finishcheck';
+                      } else {
+                          $.ajax({
+                              url: "/center/checkid",
+                              type: "post",
+                              data: {"id": nextid},
+                              async: false,
+                              success: function (r) {
+                                  if (r && r.msg === "") {
+                                      if (r.exists) {//标注完成
+                                          window.location.href = "/center/finishcheck";
+                                      } else if (!r.exists) {
+                                          window.location.href = "/center/detail/" + r.id + ".html"
+                                      }
+                                  } else {
+                                      alert("标注出错!" + r.msg)
+                                  }
+                              }
+                          })
+                      }
+                  }
+              },
+              // 检查一级是否需要改变状态
+              checkOneStatus: function (config) {
+                  var tempObj = {
+                      obj: config.type ? config.one : config.two
+                  }
+                  if (config.type) {
+                      tempObj.list = config.one.content
+                  } else {
+                      tempObj.list = config.two.uInput
+                  }
+
+                  var statusList = [0, 0, 0, 0, 0]
+                  for (var i in tempObj.list) {
+                      var tempList = tempObj.list[i]
+                      var tempIndex = Number(tempList.status)
+                      if (tempIndex === -1) {
+                          tempIndex = 0
+                      }
+                      statusList[tempIndex] = Number(statusList[tempIndex]) + 1
+                  }
+                  if (statusList[1] > 0) {
+                      tempObj.obj.status = 1
+                  }
+                  if (statusList[4] > 0 || statusList[3] > 0 || statusList[2] > 0) {
+                      tempObj.obj.status = 2
+                  }
+                  if (statusList[4] === tempObj.list.length) {
+                      tempObj.obj.status = 4
+                      if (tempObj.obj.title === "标的信息" || tempObj.obj.title === "多包信息" || tempObj.obj.title === "中标候选人信息") {
+                          tempObj.obj.status = 2
+                      }
+                  }
+                  if (statusList[3] === tempObj.list.length) {
+                      tempObj.obj.status = 2
+                  }
+                  if (statusList[2] === tempObj.list.length) {
+                      tempObj.obj.status = 2
+                  }
+                  if (statusList[0] === tempObj.list.length) {
+                      tempObj.obj.status = -1
+                  }
+                  if (!config.type) {
+                      this.checkOneStatus({
+                          one: config.one,
+                          two: config.two,
+                          type: true
+                      })
+                  }
+              },
+              //切换状态按钮
+              setStatus:function (witch, s, two, one) {
+                  var key = witch.key
+                  //校验日期格式
+                  if (key === "bidendtime" || key === "bidopentime" || key === "project_startdate" || key === "project_completedate" ||
+                          key === "publishtime" || key === "signaturedate") {
+                      var val = witch.input
+                      if (val !== "") {
+                          var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/;
+                          var regExp = new RegExp(reg);
+                          if (!regExp.test(val)) {
+                              this.$message({
+                                  message: witch.title + ",日期格式错误!正确格式:2006-01-02 15:04:05",
+                                  type: 'warning',
+                                  duration: 2000,
+                                  offset: 300
+                              });
+                              //alert(witch.title+",日期格式错误!正确格式:2006-01-02 15:04:05")
+                              return
+                          }
+                      }
+                  }
+                  if (s === '2' && !one && !two && witch.content.length === 0) {
+                      return
+                  }
+                  witch.status = s;
+                  if (two) {
+                      this.checkOneStatus({
+                          one: one,
+                          two: two,
+                          type: false
+                      })
+                  }
+              },
+              //二级删除
+              delNewTwo: function (one, index, two) {
+                  //two.ck_isnew = false //目前点删除按钮页面直接不显示,但是集合索引位置不变,所以加了此代码
+                  //two.show = false
+                  if (two.ck_isnew) {
+                      one.content.splice(index, 1)
+                  } else {
+                      two.show = false
+                      two.status = 4
+                      this.saveDataTwo(two, 4, one)
+                  }
+                  this.checkOneStatus({
+                      one: one,
+                      two: two,
+                      type: true
+                  })
+              },
+              /*add style*/
+              addStyle: function (data) {
+                  return prettyPrint(data).replace(/(checkAllTag|checkType|showCheck|wstatus|status|key|title|input|content|uInput|selectArr|select|show|true)/g, "<mark>$1</mark>")
+              },
+              /*同步修改源码*/
+              changeText: function (boolean) {
+                  try {
+                      var tempText = JSON.parse(this.$refs.text.innerText.replace(/(\n|\s)/g, ''))
+                      if (boolean) {
+                          this.tagvalues = tempText
+                      } else {
+                          this.editData = tempText
+                      }
+                  } catch (err) {
+                      alert('源码修改失败')
+                  }
+              },
+              goText: function (value) {
+                  /*重置Html*/
+                  this.pageHtml = this.getPageInfo.html
+                  if (!value) {
+                      return false
+                  }
+                  var rs = new RegExp('(' + value + ')', 'gi')
+                  //选中input框值文本高亮
+                  if (rs.test(this.pageHtml)) {
+                      this.pageHtml = this.pageHtml.replace(rs, '<mark>$1</mark>')
+                      /*延迟查询dom,防止dom未插入*/
+                      var $this = this
+                      setTimeout(function () {
+                          $this.goMark(value)
+                      }, 150)
+                  } else {
+                      /*重置Html*/
+                      this.pageHtml = this.getPageInfo.html
+                  }
+              },
+              goMark: function (value) {
+                  var mLength = document.querySelectorAll('mark').length
+                  if (this.scrollCache.value === value) {
+                      this.scrollCache.index = (this.scrollCache.index + 1) % mLength
+                  } else {
+                      this.scrollCache.index = 0
+                  }
+                  this.scrollCache.value = value
+                  /*滚动到第一个mark*/
+                  var temp = document.querySelectorAll('mark')[this.scrollCache.index]
+                  $("mark").removeClass('focus')
+                  $(temp).addClass('focus')
+                  document.querySelector('.article').scrollTop = offset(temp).top - window.screen.height / 2
+              },
+              // markTag:function(n){
+              //    $.ajax({
+              //        url:"/markTag",
+              //        method:"post",
+              //        data: {tag:n,_id:_id},
+              //        success:function(res){
+              //            if(res){
+              //                document.getElementById("com-alert-val").innerHtml="标记成功";
+              //                var label1 = document.getElementById("com-alert");
+              //                label1.style.display="block";
+              //                setTimeout(function(){label1.style.display="none";},1000)
+              //            }
+              //        }
+              //    });
+              // },
+              addChild: function (one, oindex) {
+                  var tempNode = {}
+                  switch (one.title) {
+                      case "标的信息": {
+                          tempNode = {
+                              //content: [],
+                              show: true,
+                              ck_isnew: true,
+                              status: 2,
+                              title: "标的物",
+                              uInput: JSON.parse(JSON.stringify(pclfInput))
+                          }
+                          break
+                      }
+                      case "多包信息": {
+                          tempNode = {
+                              //content: [],
+                              show: true,
+                              status: 2,
+                              ck_isnew: true,
+                              title: "子包",
+                              uInput: JSON.parse(JSON.stringify(pfInput))
+                          }
+                          break
+                      }
+                      case "中标候选人信息": {
+                          tempNode = {
+                              //content: [],
+                              show: true,
+                              status: 2,
+                              ck_isnew: true,
+                              title: "候选人",
+                              uInput: JSON.parse(JSON.stringify(wodfInput))
+                          }
+                          break
+                      }
+                  }
+                  // if (one.status >= 2) {
+                  //     one.status = '2'
+                  // }
+                  one.content.push(tempNode)
+                  this.checkOneStatus({
+                      one: one,
+                      type: true
+                  })
+                  this.$nextTick(() => {
+                      var tempN = $(".edit.one").eq(oindex).find(".edit-title")
+                      var goTop = tempN.eq(tempN.length - 1).offset().top
+                      setTimeout(() => {
+                          $(".operation").scrollTop($(".operation").scrollTop() + goTop)
+                      }, 150)
+                  })
+              },
+              // 新增子包中标信息字段
+              addThreeChild:function (two, n, one) {
+                  two.uInput.push({
+                      input: "",
+                      key: 'winner',
+                      status: "2",
+                      title: '标段(包)中标单位'
+                  })
+                  two.uInput.push({
+                      input: "",
+                      key: 'bidamount',
+                      status: "2",
+                      title: '标段(包)中标金额'
+                  })
+                  two.status = 2
+                  this.checkOneStatus({
+                      one: one,
+                      two: two,
+                      type: false
+                  })
+            },
+              //保存
+              saveDataTwo:function (two, n, one) {
+                  two.uInput.forEach(function (v) {
+                      var key = v.key
+                      if (key === "bidendtime" || key === "bidopentime" || key === "project_startdate" || key === "project_completedate" ||
+                              key === "publishtime" || key === "signaturedate") {
+                          var val = v.input
+                          if (val !== "") {
+                              var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/;
+                              var regExp = new RegExp(reg);
+                              if (!regExp.test(val)) {
+                                  this.$message({
+                                      message: v.title + ",日期格式错误!正确格式:2006-01-02 15:04:05",
+                                      type: 'warning',
+                                      duration: 2000,
+                                      offset: 300
+                                  });
+                                  //alert(v.title+",日期格式错误!正确格式:2006-01-02 15:04:05")
+                                  return
+                              }
+                          }
+                      }
+                      if (n === "1" && v.status === "-1") {
+                          v.status = n
+                      } else if (n === "-1") {
+                          v.status = n
+                      } else if (n === "2") {
+                          v.status = n
+                      } else if (n === "4") {
+                          v.status = n
+                      }
+                  });
+                  two.status = n
+                  this.checkOneStatus({
+                      one: one,
+                      two: two,
+                      type: false
+                  })
+                  /**
+                   two.content.forEach(function(v) {
+                      v.uInput.forEach(function(value) {
+                          if (value.input && value.input != '') {
+                              value.status = n
+                          }
+                      })
+                  })
+                   */
+              },
+              saveDataOne:function (one, n) {
+                  //保存后的样式
+                  var _this = this
+                  one.content.forEach(function (v) {
+                      v.uInput.forEach(function (value) {
+                          var key = value.key
+                          if (n === 1) {
+                              if (key === "bidendtime" || key === "bidopentime" || key === "project_startdate" || key === "project_completedate" ||
+                                      key === "publishtime" || key === "signaturedate") {
+                                  var val = value.input
+                                  if (val !== "") {
+                                      var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/;
+                                      var regExp = new RegExp(reg);
+                                      if (!regExp.test(val)) {
+                                          this.$message({
+                                              message: value.title + ",日期格式错误!正确格式:2006-01-02 15:04:05",
+                                              type: 'warning',
+                                              duration: 2000,
+                                              offset: 300
+                                          });
+                                          //alert(value.title+",日期格式错误!正确格式:2006-01-02 15:04:05")
+                                          return
+                                      }
+                                  }
+                              }
+                          }
+                          // 取消全部,通过时判断状态是否处于修改新增等
+                          if (n === "1" && value.status === "-1") {
+                              value.status = n
+                          } else if (n === "-1") {
+                              value.status = n
+                          }
+                      })
+
+                      _this.checkOneStatus({
+                          two: v,
+                          one: one,
+                          type: false
+                      })
+                  });
+              },
+              //验证保存提示
+              open:function (stype) {
+                  this.$confirm('是否保存?', '提示', {
+                      confirmButtonText: '确定',
+                      cancelButtonText: '取消',
+                      type: 'warning'
+                  }).then(() => {
+                      this.upChange(stype)
+                  }).catch(() => {
+                  });
+              },
+              //保存事件
+              upChange: function (stype) {
+                  console.log(this.editData)
+                  var noTagKey = [];
+                  console.log(allCheckFields)
+                  this.editData.filter(function (one) {
+                      if (one.title === "标的信息" || one.title === "多包信息" || one.title === "中标候选人信息") {
+                          if (allCheckFields[one.key] && one.status === -1) {
+                              noTagKey.push(one.title);
+                          }
+                      } else {
+                          one.content.filter(function (v) {
+                              v.uInput.filter(function (u) {
+                                  if (allCheckFields[u.key] && u.status === -1) {
+                                      noTagKey.push(u.title);
+                                  }
+                              })
+                          })
+                      }
+                  })
+                  if (noTagKey.length > 0) {
+                      var fieldText = noTagKey.join(",");
+                      fieldText = fieldText.replace(/\([^\)]*\)/g, "");
+                      this.$alert("未标注字段:" + fieldText);
+                      return
+                  }
+                  var resultStatus = false
+                  if (stype === 1) {//全部字段验证
+                      var checkAllKey = this.editData.filter(function (one) {
+                          var otherOne = one.content.filter(function (v) {
+                              return v.uInput.filter(function (u) {
+                                  return u.status === '-1'
+                              }).length
+                          })
+                          if ((one.title === "标的信息" || one.title === "多包信息" || one.title === "中标候选人信息") && (one.status === "-1")) {
+                              return true
+                          } else {
+                              return otherOne.length
+                          }
+                      })
+                      resultStatus = !Boolean(checkAllKey.length)
+                  } else {//部分字段验证
+                      var otherTag = 0 //标注状态 0:没标 1:标注成功 2:标注失败
+                      var baseTag = 0
+                      this.editData.filter(function (one) {
+                          //多包信息、中标候选人信息在为标注失败的前提下检测标注状态,一个失败不能保存
+                          if (otherTag < 2) {
+                              if (one.title === "标的信息" || one.title === "多包信息" || one.title === "中标候选人信息") {
+                                  if (one.status === "-1") {//没标
+                                      if (otherTag !== 1) {//前一个标注成功不用记录后一个是否未标
+                                          otherTag = 0
+                                      }
+                                  } else {
+                                      if (one.content.length === 0) {//不含子包
+                                          if (one.status === '2') {
+                                              otherTag = 2 //失败
+                                          } else {
+                                              otherTag = 1 //成功
+                                          }
+                                      } else {//含子包
+                                          if (one.title === "标的信息") {
+                                              var otherOne = one.content.filter(function (v) {
+                                                  if (v.status >= 1) {//子信息标注
+                                                      var twoLength = v.uInput.filter(function (u) {
+                                                          return u.status === '-1'
+                                                      })
+                                                      if (twoLength.length > 0) {
+                                                          otherTag = 2
+                                                      }
+                                                      return true //返回此条信息被标注
+                                                  }
+                                              })
+                                              if (otherTag !== 2) {
+                                                  if (otherOne.length > 0) {//
+                                                      otherTag = 1
+                                                  } else {
+                                                      otherTag = 2
+                                                  }
+                                              }
+                                          } else {
+                                              var otherOne = one.content.filter(function (v) {
+                                                  return v.uInput.filter(function (u) {
+                                                      return u.status === '-1'
+                                                  }).length
+                                              })
+                                              if (otherOne.length > 0) {//
+                                                  otherTag = 2
+                                              } else {
+                                                  otherTag = 1
+                                              }
+                                          }
+                                      }
+                                  }
+                              } else {
+                                  var baseOne = one.content.filter(function (v) {
+                                      return v.uInput.filter(function (u) {
+                                          return u.status !== '-1'
+                                      }).length
+                                  })
+                                  if (baseOne.length > 0) {//基本字段
+                                      baseTag = 1
+                                  }
+                              }
+                          }
+                      })
+                      if (otherTag === 0 && baseTag === 1) {
+                          resultStatus = true
+                      } else if (otherTag === 1) {
+                          resultStatus = true
+                      }
+                  }
+                  if (!resultStatus) {
+                      this.$alert("未标注完成");
+                      return
+                  }
+                  var d = JSON.stringify(this.editData);
+                  console.log(d)
+                  var _this = this
+                  $.ajax({
+                      url: "/center/biaozhu",
+                      method: "post",
+                      data: {key: d, _id: _id, stype: stype},
+                      success: function (res) {
+                          if (res) {
+                              _this.$message({
+                                  message: '保存成功',
+                                  type: 'success',
+                                  duration: 1000,
+                                  offset: 300
+                              });
+                              issave = true//保存成功
+                          }
+                      },
+                      error: function (err) {
+                          alert(err);
+                      }
+                  });
+              },
+              //保存提示
+              // open:function(one, type) {
+              //     this.$confirm('是否保存?', '提示', {
+              //         confirmButtonText: '确定',
+              //         cancelButtonText: '取消',
+              //         type: 'warning'
+              //     }).then(() => {
+              //         if (type) {
+              //             this.saveOneData(one)
+              //         } else {
+              //             this.upChange()
+              //         }
+              //     }).catch(() => {
+              //     });
+              // },
+           //一级保存
+           //    saveOneData: function (one) {
+           //        if (one.title==="标的信息"||one.title==="多包信息"||one.title==="中标候选人信息"){
+           //            if(one.status ===  "-1"){
+           //                this.$alert(one.title+" 未标注完成")
+           //                return
+           //            }else if (one.status !=="-1"){
+           //                var isAlert = one.content.filter(function(v) {
+           //                    return v.uInput.filter(function (u) {
+           //                        return u.status === '-1'
+           //                    }).length
+           //                })
+           //                if (isAlert.length) {
+           //                    this.$alert(one.title+" 未标注完成")
+           //                    return
+           //                }
+           //            }
+           //        }
+           //        onetext = "["+ JSON.stringify(one) +"]";
+           //        $.ajax({
+           //            url:"/center/biaozhu",
+           //            method:"post",
+           //            data: {key:onetext,_id:_id},
+           //            success:function(res){
+           //                if(res){
+           //                    document.getElementById("com-alert-val").innerHtml="保存成功";
+           //                    var label1 = document.getElementById("com-alert");
+           //                    label1.style.display="block";
+           //                    setTimeout(function(){
+           //                            label1.style.display="none";
+           //                        },
+           //                        1000)
+           //                }
+           //            },
+           //            error:function(err){
+           //                alert(err);
+           //            }
+           //        });
+           //    },
+      }
+    })
+
+    function offset(elem) {
+        if (!elem) elem = this;
+
+        var x = elem.offsetLeft;
+        var y = elem.offsetTop;
+
+        while (elem === elem.offsetParent) {
+            x += elem.offsetLeft;
+            y += elem.offsetTop;
+        }
+        return {left: x, top: y};
+    }
+</script>
 </html>

+ 118 - 10
src/web/templates/project/remark_list.html

@@ -1,10 +1,118 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="UTF-8">
-  <title>$Title$</title>
-</head>
-<body>
-$END$
-</body>
-</html>
+{{include "com/inc.html"}}
+<!-- Main Header -->
+{{include "com/header.html"}}
+<!-- Left side column. 权限菜单 -->
+{{include "com/menu.html"}}
+<div class="content-wrapper">
+    <section class="content-header">
+        <h1>
+            <small></small>
+        </h1>
+        <ol class="breadcrumb">
+            <li><a href="#"><i class="fa fa-dashboard"></i> 标注列表</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <div id="status-div" class="col-xs-1" style="width: auto;float:right;">
+                            <label for="statusSelect">状态:
+                                <select class="form-control selectpicker" id="statusSelect">
+                                    <option value="-1">全部</option>
+                                    <option value="已标注">已标注</option>
+                                    <option value="未标注">未标注</option>
+                                </select></label>
+                        </div>
+                        <table id="dataTable" class="table table-bordered table-hover">
+                            <thead>
+                            <tr>
+                                <th></th>
+                                <th>状态</th>
+                                <th>标题</th>
+                            </tr>
+                            </thead>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </section>
+</div>
+
+{{include "com/footer.html"}}
+<script>
+    menuActive("/front/user/task/list");
+
+    let tid = {{ .T.tid }}
+    let sourceinfo = {{ .T.s_sourceinfo }}
+
+    $(function () {
+        ttable = $('#dataTable').dataTable({
+            "paging": true,
+            "lengthChange": false,
+            "searching": true,
+            "ordering": false,
+            "info": true,
+            "autoWidth": false,
+            "serverSide": true,
+            "ajax": {
+                "url": "/front/user/remark/list",
+                "type": "post",
+                "data": {"tid": tid, "s_sourceinfo": sourceinfo}
+            },
+            "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;
+                    }
+                    ttable.page(redirectpage).draw(false);
+                });
+                this.api().column(0).nodes().each(function (cell, i) {
+                    cell.innerHTML = i + 1;
+                });
+            },
+            "columns": [
+                {"data": null, width: "2%"},
+                {"data": "b_istag", width: "4%", render: function (val) {
+                        let tmp;
+                        if (val) {
+                            tmp = '<span style="display: inline-block;font-size:14px;color: green">已标注</span>'
+                        } else {
+                            tmp = '<span style="display: inline-block;font-size:14px;color: #428bca">未标注</span>'
+                        }
+                        return tmp
+                    }},
+                {"data": "v_baseinfo.title", render: function (val, index, row) {
+                        let tmp;
+                        if (row["re_data"] === 1) {
+                            tmp = '<a style="display: inline-block;cursor:pointer;font-size:16px;color: green" onclick="skipDetail(\'' + row._id + '\')">' + val + '</a>'
+                        } else {
+                            tmp = '<a style="display: inline-block;cursor:pointer;font-size:16px;color: #428bca" onclick="skipDetail(\'' + row._id + '\')">' + val + '</a>'
+                        }
+                        return tmp
+                    }}
+            ],
+            "initComplete": function () {
+                $("#dataTable_filter").append($('#status-div'))
+            },
+            "fnServerParams": function (e) {
+                e.s_status = $("#statusSelect option:selected").val()
+            }
+        });
+        $('#statusSelect').on('changed.bs.select', function () {
+            ttable.api().ajax.reload();
+        })
+    });
+
+    function skipDetail(id) {
+        window.open("/project/remark_detail/"+id+"/"+sourceinfo+".html");
+    }
+</script>

+ 3 - 2
src/web/templates/project/task_user_list.html

@@ -9,7 +9,8 @@
             <small></small>
         </h1>
         <ol class="breadcrumb">
-            <li><a href="#"><i class="fa fa-dashboard"></i> 任务列表</a></li>
+            <li><a href="/front/group/user/task/list"><i class="fa fa-dashboard"></i> 任务列表</a></li>
+            <li><a href="#"><i class="fa fa-dashboard"></i> 标注列表</a></li>
         </ol>
     </section>
     <!-- Main content -->
@@ -111,7 +112,7 @@
                 {
                     "data": "_id", width: "11%", render: function (val, a, row, pos) {
                         tmp = '<div>' +
-                            '<a class="btn btn-sm btn-primary" onclick="editPro()">标注</a>&nbsp;&nbsp;' +
+                            '<a class="btn btn-sm btn-primary" href="/front/user/remark/list?tid=' + val + '&s_sourceinfo='+row.s_sourceinfo+'">标注</a>&nbsp;&nbsp;' +
                             '</div>';
                         return tmp
                     }