|
@@ -88,7 +88,7 @@ var (
|
|
|
|
|
|
//Tg = map[string]interface{}{}
|
|
//Tg = map[string]interface{}{}
|
|
//一些表格没有表头,是空的,对值是排序的做处理对应 NullTxBid
|
|
//一些表格没有表头,是空的,对值是排序的做处理对应 NullTxBid
|
|
- NullTdReg = regexp.MustCompile("(首选|第[一二三四五1-5])(中标|成交)?(名|(候选|排序)?(人|单位|供应商))")
|
|
|
|
|
|
+ NullTdReg = regexp.MustCompile("(首选|第[一二三四五1-5])(中标|成交)?(名(称)?|(候选|排序)?(人|单位|供应商))")
|
|
NullTxtBid = "成交供应商排名"
|
|
NullTxtBid = "成交供应商排名"
|
|
projectnameReg = regexp.MustCompile("((公开)?招标)*[((第]*[一二三四五六七八九十a-zA-Z0-9]+(标段|包|标|段)[))]*$")
|
|
projectnameReg = regexp.MustCompile("((公开)?招标)*[((第]*[一二三四五六七八九十a-zA-Z0-9]+(标段|包|标|段)[))]*$")
|
|
MhSpilt = regexp.MustCompile("[::]")
|
|
MhSpilt = regexp.MustCompile("[::]")
|
|
@@ -105,6 +105,8 @@ var (
|
|
FilterSerial = regexp.MustCompile(".+[、..::,]")
|
|
FilterSerial = regexp.MustCompile(".+[、..::,]")
|
|
filterTableWror = regexp.MustCompile("班子成员")
|
|
filterTableWror = regexp.MustCompile("班子成员")
|
|
underline = regexp.MustCompile("_+$")
|
|
underline = regexp.MustCompile("_+$")
|
|
|
|
+ iswinnertabletag = regexp.MustCompile("(中标|候选人|成交|结果)")
|
|
|
|
+ nswinnertabletag = regexp.MustCompile("[评得分估]+")
|
|
)
|
|
)
|
|
|
|
|
|
//在解析时,判断表格元素是否隐藏
|
|
//在解析时,判断表格元素是否隐藏
|
|
@@ -201,6 +203,10 @@ func (table *Table) KVFilter() {
|
|
//4.对KV的处理
|
|
//4.对KV的处理
|
|
//判断表格是否有用,调用abandontable正则数组进行判断
|
|
//判断表格是否有用,调用abandontable正则数组进行判断
|
|
//遍历每一行
|
|
//遍历每一行
|
|
|
|
+ winnertag := iswinnertabletag.MatchString(table.Tag) && !nswinnertabletag.MatchString(table.Tag) //table标签
|
|
|
|
+ if !winnertag {
|
|
|
|
+ winnertag = iswinnertabletag.MatchString(table.Tag) && !nswinnertabletag.MatchString(table.TableResult.BlockTag) //块标签
|
|
|
|
+ }
|
|
for _, tr := range table.TRs {
|
|
for _, tr := range table.TRs {
|
|
for _, td := range tr.TDs {
|
|
for _, td := range tr.TDs {
|
|
//fmt.Println(td.BH, td.MustBH, td.Val, td.SortKV.Map)
|
|
//fmt.Println(td.BH, td.MustBH, td.Val, td.SortKV.Map)
|
|
@@ -260,11 +266,10 @@ func (table *Table) KVFilter() {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
v := table.SortKV.Map[k]
|
|
v := table.SortKV.Map[k]
|
|
- //u.Debug(k, v)
|
|
|
|
if _, ok := v.(string); ok {
|
|
if _, ok := v.(string); ok {
|
|
k = regSpliteSegment.ReplaceAllString(regReplAllSpace.ReplaceAllString(k, ""), "")
|
|
k = regSpliteSegment.ReplaceAllString(regReplAllSpace.ReplaceAllString(k, ""), "")
|
|
k1, w1, v1, tag, b := CommonDataAnaly(k, table.Tag, table.Desc, v)
|
|
k1, w1, v1, tag, b := CommonDataAnaly(k, table.Tag, table.Desc, v)
|
|
- //u.Debug(k, v, k1, w1, v1, tag, b)
|
|
|
|
|
|
+ //qutil.Debug(k, v, k1, w1, v1, tag, b)
|
|
if b {
|
|
if b {
|
|
//降低冒号值的权重
|
|
//降低冒号值的权重
|
|
if MhSpilt.MatchString(v1) {
|
|
if MhSpilt.MatchString(v1) {
|
|
@@ -293,6 +298,7 @@ func (table *Table) KVFilter() {
|
|
as.AddKey(k, v)
|
|
as.AddKey(k, v)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
//处理值是数组的kv放入标准化kv中
|
|
//处理值是数组的kv放入标准化kv中
|
|
checkKey := map[int]bool{}
|
|
checkKey := map[int]bool{}
|
|
for kn, k := range as.Keys {
|
|
for kn, k := range as.Keys {
|
|
@@ -310,12 +316,17 @@ func (table *Table) KVFilter() {
|
|
for n1, _ := range vs1 {
|
|
for n1, _ := range vs1 {
|
|
smap[n1] = map[string]interface{}{}
|
|
smap[n1] = map[string]interface{}{}
|
|
}
|
|
}
|
|
|
|
+ //hadSort := false
|
|
|
|
+ tmpEntname := make([]string, len(vs1))
|
|
|
|
+ tmpPrice := make([]string, len(vs1))
|
|
for kn1, k := range as.Keys[kn:] {
|
|
for kn1, k := range as.Keys[kn:] {
|
|
v := as.Map[k]
|
|
v := as.Map[k]
|
|
if ContactType["采购单位"].MatchString(k) || ContactType["代理机构"].MatchString(k) {
|
|
if ContactType["采购单位"].MatchString(k) || ContactType["代理机构"].MatchString(k) {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
- if vs, ok := v.([]string); ok && len(vs) == len(vs1) {
|
|
|
|
|
|
+ //目前对数组数据的key做判断,但是某些额可以是不满足情况的
|
|
|
|
+ //载明内容:[第一中标候选人 第二中标候选人] id:5d00587da5cb26b9b75e367b
|
|
|
|
+ if vs, ok := v.([]string); ok && len(vs) == len(vs1) { //数组值的个数相同
|
|
res, _, _, _, repl := CheckCommon(k, "bidorder")
|
|
res, _, _, _, repl := CheckCommon(k, "bidorder")
|
|
kv := ""
|
|
kv := ""
|
|
if !res {
|
|
if !res {
|
|
@@ -324,23 +335,72 @@ func (table *Table) KVFilter() {
|
|
kv = kt[0].Value
|
|
kv = kt[0].Value
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ //qutil.Debug(k, res, repl, kv, "--", vs)
|
|
|
|
+ if !res && kv == "" { //key未验证出,验证数组的val值
|
|
|
|
+ checkKey[kn+kn1] = true
|
|
|
|
+ if winnertag { //如果是中标信息 在根据val数组信息解析候选人
|
|
|
|
+ for vsk, vsv := range vs {
|
|
|
|
+ if NullTdReg.MatchString(vsv) { //数据先验证val是否有排序
|
|
|
|
+ //hadSort = true
|
|
|
|
+ smap[vsk]["sortstr"] = vsv
|
|
|
|
+ smap[vsk]["sort"] = GetBidSort(vsv, vsk+1)
|
|
|
|
+ } else if findCandidate2.MatchString(vsv) && tmpEntname[vsk] == "" { //数据验证val是否是候选人
|
|
|
|
+ entname, _ := winnerOrderEntity.clear("中标单位", vsv).(string)
|
|
|
|
+ if entname != "" {
|
|
|
|
+ tmpEntname[vsk] = entname
|
|
|
|
+ }
|
|
|
|
+ } else { //验证val时如果数组中的第一条数据既不满足sort或者entname 判定此数组数据错误
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
if res || kv != "" { //连续往下找几个key
|
|
if res || kv != "" { //连续往下找几个key
|
|
checkKey[kn+kn1] = true
|
|
checkKey[kn+kn1] = true
|
|
|
|
+ SORT:
|
|
if repl == "sort" {
|
|
if repl == "sort" {
|
|
|
|
+ //hadSort = true
|
|
for vsk, vsv := range vs {
|
|
for vsk, vsv := range vs {
|
|
smap[vsk]["sortstr"] = vsv
|
|
smap[vsk]["sortstr"] = vsv
|
|
smap[vsk]["sort"] = GetBidSort(vsv, vsk+1)
|
|
smap[vsk]["sort"] = GetBidSort(vsv, vsk+1)
|
|
}
|
|
}
|
|
} else if repl == "entname" || kv == "中标单位" {
|
|
} else if repl == "entname" || kv == "中标单位" {
|
|
for vsk, vsv := range vs {
|
|
for vsk, vsv := range vs {
|
|
- smap[vsk]["entname"] = winnerOrderEntity.clear("中标单位", vsv)
|
|
|
|
|
|
+ if winnerReg6.MatchString(vsv) { //k:中标候选人 v:["第一名","第二名"]
|
|
|
|
+ repl = "sort"
|
|
|
|
+ goto SORT
|
|
|
|
+ }
|
|
|
|
+ // if entname, _ := smap[vsk]["entname"].(string); entname != "" || len([]rune(vsv)) < 3 {
|
|
|
|
+ // break
|
|
|
|
+ // }
|
|
|
|
+ // entname, _ := winnerOrderEntity.clear("中标单位", vsv).(string)
|
|
|
|
+ // if entname != "" {
|
|
|
|
+ // smap[vsk]["entname"] = entname
|
|
|
|
+ //
|
|
|
|
+ if tmpEntname[vsk] != "" || len([]rune(vsv)) < 4 { //排除 单位:["台","个","套"]
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ entname, _ := winnerOrderEntity.clear("中标单位", vsv).(string)
|
|
|
|
+ if entname != "" {
|
|
|
|
+ tmpEntname[vsk] = entname
|
|
|
|
+ }
|
|
}
|
|
}
|
|
} else if kv == "中标金额" {
|
|
} else if kv == "中标金额" {
|
|
for vsk, vsv := range vs {
|
|
for vsk, vsv := range vs {
|
|
- p1 := qutil.Float64All(smap[vsk]["price"])
|
|
|
|
- p2 := qutil.Float64All(vsv)
|
|
|
|
|
|
+ //过滤price 2348273.432元(万元)-->2348273.432
|
|
|
|
+ //tmp1, _ := smap[vsk]["price"].(string)
|
|
|
|
+ tmp1 := tmpPrice[vsk]
|
|
|
|
+ p1num := numberReg2.FindString(tmp1)
|
|
|
|
+ p2num := numberReg2.FindString(vsv)
|
|
|
|
+ p1 := qutil.Float64All(p1num)
|
|
|
|
+ p2 := qutil.Float64All(p2num)
|
|
if p2 > p1 {
|
|
if p2 > p1 {
|
|
- smap[vsk]["price"] = winnerOrderEntity.clear("中标金额", vsv+GetMoneyUnit(k, vsv))
|
|
|
|
|
|
+ //smap[vsk]["price"] = winnerOrderEntity.clear("中标金额", vsv+GetMoneyUnit(k, vsv))
|
|
|
|
+ price := winnerOrderEntity.clear("中标金额", vsv+GetMoneyUnit(k, vsv))
|
|
|
|
+ if pricestr, _ := price.(string); len(pricestr) < 30 && len(pricestr) > 0 {
|
|
|
|
+ tmpPrice[vsk] = pricestr
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -350,8 +410,22 @@ func (table *Table) KVFilter() {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
newSmap := []map[string]interface{}{}
|
|
newSmap := []map[string]interface{}{}
|
|
- for _, smap_v := range smap {
|
|
|
|
- if len(smap_v) > 0 {
|
|
|
|
|
|
+ //qutil.Debug("smap=======", smap)
|
|
|
|
+ //qutil.Debug("tmpEntname--", len(tmpEntname), tmpEntname)
|
|
|
|
+ //qutil.Debug("tmpPrice--", len(tmpPrice), tmpPrice)
|
|
|
|
+ for n, smap_v := range smap {
|
|
|
|
+ //if hadSort { //有排序,再添加entname和price
|
|
|
|
+ if len(tmpEntname) > 0 && n < len(tmpEntname) && tmpEntname[n] != "" {
|
|
|
|
+ smap_v["entname"] = tmpEntname[n]
|
|
|
|
+
|
|
|
|
+ if len(tmpPrice) > 0 && n < len(tmpPrice) && tmpPrice[n] != "" {
|
|
|
|
+ smap_v["price"] = tmpPrice[n]
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //} else if len(tmpEntname) > 0 {
|
|
|
|
+ //fmt.Println("table winnerorder only has entname", tmpEntname)
|
|
|
|
+ //}
|
|
|
|
+ if len(smap_v) > 2 { //只有排序信息 sort和sortstr
|
|
newSmap = append(newSmap, smap_v)
|
|
newSmap = append(newSmap, smap_v)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -430,7 +504,7 @@ func (table *Table) KVFilter() {
|
|
table.StandKVWeight["中标单位"] = -25
|
|
table.StandKVWeight["中标单位"] = -25
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- } else if !table.BPackage {
|
|
|
|
|
|
+ } else if !table.BPackage { //没有table.WinnerOrder也没有分包 将td中的WinnerOrder赋值给table.WinnerOrder
|
|
if len(winnerOrder) > 1 {
|
|
if len(winnerOrder) > 1 {
|
|
table.WinnerOrder = winnerOrder
|
|
table.WinnerOrder = winnerOrder
|
|
}
|
|
}
|
|
@@ -507,6 +581,7 @@ func (table *Table) MergerToTableresult() {
|
|
if table.TableResult.BlockTag == "" && table.Tag != "" {
|
|
if table.TableResult.BlockTag == "" && table.Tag != "" {
|
|
table.TableResult.BlockTag = table.Tag
|
|
table.TableResult.BlockTag = table.Tag
|
|
}
|
|
}
|
|
|
|
+ //中标候选人(多个table,现在默认取第一个table的信息,考虑需不需要多个table分析合并数据?)
|
|
if table.TableResult.WinnerOrder == nil || len(table.TableResult.WinnerOrder) == 0 {
|
|
if table.TableResult.WinnerOrder == nil || len(table.TableResult.WinnerOrder) == 0 {
|
|
table.TableResult.WinnerOrder = table.WinnerOrder
|
|
table.TableResult.WinnerOrder = table.WinnerOrder
|
|
}
|
|
}
|
|
@@ -634,7 +709,7 @@ func (ts *TableResult) Analy() {
|
|
for _, table := range tabs {
|
|
for _, table := range tabs {
|
|
table.MergerToTableresult()
|
|
table.MergerToTableresult()
|
|
// for k, v := range table.TableResult.SortKV.Map {
|
|
// for k, v := range table.TableResult.SortKV.Map {
|
|
- // log.Println(k, v)
|
|
|
|
|
|
+ // qutil.Debug(k, "=====", v)
|
|
// }
|
|
// }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -788,6 +863,7 @@ func (table *Table) Analy(contactFormat *u.ContactFormat) []*Table {
|
|
if u.IsBrandGoods {
|
|
if u.IsBrandGoods {
|
|
table.analyBrand()
|
|
table.analyBrand()
|
|
}
|
|
}
|
|
|
|
+
|
|
//判断是否是多包,并处理分包的
|
|
//判断是否是多包,并处理分包的
|
|
table.CheckMultiPackageByTable()
|
|
table.CheckMultiPackageByTable()
|
|
str := "\n"
|
|
str := "\n"
|
|
@@ -1335,7 +1411,7 @@ func (table *Table) FindKV() {
|
|
}
|
|
}
|
|
**/
|
|
**/
|
|
// if td.Val == "电视" || td.Val == "电话机" || td.Val == "传真机" || td.Val == "音响" {
|
|
// if td.Val == "电视" || td.Val == "电话机" || td.Val == "传真机" || td.Val == "音响" {
|
|
- // qutil.Debug("----", "td.BH:", td.BH, "KVDirect:", td.KVDirect, "Val:", td.Val, "direct:", direct, "vdirect:", vdirect)
|
|
|
|
|
|
+ //qutil.Debug("----td.Valtype", td.Valtype, "td.BH:", td.BH, "KVDirect:", td.KVDirect, "Val:", td.Val, "direct:", direct, "vdirect:", vdirect)
|
|
// }
|
|
// }
|
|
if !td.BH && td.KVDirect < 3 {
|
|
if !td.BH && td.KVDirect < 3 {
|
|
if !table.FindTdVal(td, direct, vdirect) {
|
|
if !table.FindTdVal(td, direct, vdirect) {
|
|
@@ -1564,6 +1640,11 @@ func (table *Table) FindTdVal(td *TD, direct, vdirect int) (b bool) {
|
|
// if near != nil {
|
|
// if near != nil {
|
|
// fmt.Println("near----", near.Val, td.Val)
|
|
// fmt.Println("near----", near.Val, td.Val)
|
|
// }
|
|
// }
|
|
|
|
+ // qutil.Debug(near != nil)
|
|
|
|
+ // qutil.Debug(near.BH)
|
|
|
|
+ // qutil.Debug(near.KeyDirect == vdirect, near.KeyDirect == 0)
|
|
|
|
+ // qutil.Debug(near.KVDirect == direct, near.KVDirect == 0)
|
|
|
|
+ // qutil.Debug(near.KVDirect < 3)
|
|
if near != nil && near.BH && (near.KeyDirect == vdirect || near.KeyDirect == 0) && (near.KVDirect == direct || near.KVDirect == 0) && near.KVDirect < 3 {
|
|
if near != nil && near.BH && (near.KeyDirect == vdirect || near.KeyDirect == 0) && (near.KVDirect == direct || near.KVDirect == 0) && near.KVDirect < 3 {
|
|
near.KVDirect = direct
|
|
near.KVDirect = direct
|
|
near.KeyDirect = vdirect
|
|
near.KeyDirect = vdirect
|
|
@@ -1691,7 +1772,6 @@ func (table *Table) FindTdVal(td *TD, direct, vdirect int) (b bool) {
|
|
}
|
|
}
|
|
b = true
|
|
b = true
|
|
}
|
|
}
|
|
- //qutil.Debug("map", b, table.SortKV.Map)
|
|
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2022,8 +2102,8 @@ func (tn *Table) CheckMultiPackageByTable() (b bool, index []string) {
|
|
//if !(len(k1tags) > 0 && k1tags[0].Value == "采购单位") {
|
|
//if !(len(k1tags) > 0 && k1tags[0].Value == "采购单位") {
|
|
// tn.SortKV.RemoveKey(k1)
|
|
// tn.SortKV.RemoveKey(k1)
|
|
//}
|
|
//}
|
|
- for _,vcgdw:=range k1tags{
|
|
|
|
- if vcgdw.Value =="采购单位"{
|
|
|
|
|
|
+ for _, vcgdw := range k1tags {
|
|
|
|
+ if vcgdw.Value == "采购单位" {
|
|
tn.SortKV.RemoveKey(k1)
|
|
tn.SortKV.RemoveKey(k1)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -2751,7 +2831,7 @@ func (table *Table) analyBrand() {
|
|
} else {
|
|
} else {
|
|
// "_id" : ObjectId("5c2c3802a5cb26b9b78646c4")5c2b0551a5cb26b9b7cb05db否5c2a42e6a5cb26b9b763ba5a采购人:一、采购人5c2b06f5a5cb26b9b7cc4409
|
|
// "_id" : ObjectId("5c2c3802a5cb26b9b78646c4")5c2b0551a5cb26b9b7cb05db否5c2a42e6a5cb26b9b763ba5a采购人:一、采购人5c2b06f5a5cb26b9b7cc4409
|
|
//成交供应商排名 [map[entname:昆明合优科技有限公司 sortstr:第一中标候选人 sort:1] map[sort:2 entname:昆明厚起科技有限公司 sortstr:第二中标候选人] map[entname:云南远安科技发展有限公司 sortstr:第三中标候选人 sort:3]]
|
|
//成交供应商排名 [map[entname:昆明合优科技有限公司 sortstr:第一中标候选人 sort:1] map[sort:2 entname:昆明厚起科技有限公司 sortstr:第二中标候选人] map[entname:云南远安科技发展有限公司 sortstr:第三中标候选人 sort:3]]
|
|
- //fmt.Println("err data:", key, val)
|
|
|
|
|
|
+ //qutil.Debug("err data:", key, val)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//处理数组数据后,匹配必须title和替换要保存的title
|
|
//处理数组数据后,匹配必须title和替换要保存的title
|