extpackage.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. // extpackage
  2. package extract
  3. import (
  4. "jy/clear"
  5. ju "jy/util"
  6. "log"
  7. qu "qfw/util"
  8. "reflect"
  9. "sort"
  10. )
  11. func pkvdata(pkg *ju.BlockPackage, sonJobResult *map[string]interface{}, e *ExtractTask,isSite bool,codeSite string) {
  12. if pkg.ColonKV != nil {
  13. kvparse(pkg.ColonKV, e, sonJobResult,isSite,codeSite)
  14. }
  15. if pkg.TableKV != nil {
  16. kvparse(pkg.TableKV, e, sonJobResult,isSite,codeSite)
  17. }
  18. if pkg.SpaceKV != nil {
  19. kvparse(pkg.SpaceKV, e, sonJobResult,isSite,codeSite)
  20. }
  21. }
  22. func kvparse(p *ju.JobKv, e *ExtractTask, sonJobResult *map[string]interface{},isSite bool,codeSite string) {
  23. if p != nil {
  24. for pk, pv2 := range p.KvTags {
  25. if len(pv2) > 1 && !(pk == "预算" || pk == "中标金额") {
  26. tmp := []*ju.Tag{}
  27. var tmpindex, tmpweight int = -9999, -9999
  28. for ii, vv := range pv2 {
  29. if tmpweight < vv.Weight {
  30. tmpindex = ii
  31. tmpweight = vv.Weight
  32. }
  33. }
  34. tmp = append(tmp, pv2[tmpindex])
  35. p.KvTags[pk] = tmp
  36. }
  37. }
  38. for pk, pv := range p.KvTags {
  39. if len(pv) == 0 {
  40. continue
  41. }
  42. tags := ju.GetTags(pk,isSite,codeSite)
  43. if tags.Len() > 0 {
  44. if ((*sonJobResult)["name"] == nil || (*sonJobResult)["name"] == "")&& tags[0].Key == "项目名称"{
  45. (*sonJobResult)["name"] = pv[0].Value
  46. }
  47. if qu.Float64All((*sonJobResult)["budget"]) == 0 && tags[0].Key == "预算" {
  48. lock.Lock()
  49. cfn := e.ClearFn["budget"]
  50. lock.Unlock()
  51. data := clear.DoClearFn(cfn, []interface{}{pv[0].Value, ""})
  52. (*sonJobResult)["budget"] = data[0]
  53. continue
  54. }
  55. if qu.Float64All((*sonJobResult)["bidamount"]) == 0 && tags[0].Key == "中标金额" {
  56. lock.Lock()
  57. cfn := e.ClearFn["budget"]
  58. lock.Unlock()
  59. data := clear.DoClearFn(cfn, []interface{}{pv[0].Value, ""})
  60. (*sonJobResult)["bidamount"] = data[0]
  61. continue
  62. }
  63. if ((*sonJobResult)["winner"] == nil || (*sonJobResult)["winner"] == "" )&& tags[0].Key == "中标单位"{
  64. (*sonJobResult)["winner"] = pv[0].Value
  65. }
  66. }
  67. if (*sonJobResult)["name"] == nil && pk == "名称" {
  68. (*sonJobResult)["name"] = pv[0].Value
  69. }
  70. }
  71. }
  72. }
  73. //处理分包信息
  74. func PackageDetail(j *ju.Job, e *ExtractTask,isSite bool,codeSite string) {
  75. qu.Try(func() {
  76. if len(j.BlockPackage) > 0 {
  77. tmpkeys := []string{}
  78. for k, _ := range j.BlockPackage {
  79. if k == ""{
  80. continue
  81. }
  82. tmpkeys = append(tmpkeys, k)
  83. }
  84. sort.Strings(tmpkeys)
  85. packageResult := map[string]map[string]interface{}{}
  86. //packagenum := len(j.BlockPackage)
  87. for i, pkName := range tmpkeys {
  88. pkg, ok := j.BlockPackage[pkName]
  89. if !ok {
  90. continue
  91. }
  92. //是否清理标记
  93. clearmap := map[string]bool{}
  94. sonJobResult := map[string]interface{}{}
  95. if pkg != nil {
  96. sonJobResult["origin"] = pkg.Origin
  97. sonJobResult["text"] = pkg.Text
  98. sonJobResult["budget"] = pkg.Budget
  99. sonJobResult["bidamount"] = pkg.Bidamount
  100. wins := make([]map[string]interface{}, 0)
  101. if pkg.Winner == "" && len(j.Winnerorder) > 0 {
  102. if sonJobResult["winnerorder"] == nil {
  103. for _, tv := range j.Winnerorder {
  104. if tv["type"].(int) == i{
  105. wins = append(wins, tv)
  106. }
  107. }
  108. sonJobResult["winnerorder"] = wins
  109. }
  110. if len(wins) >0{
  111. sonJobResult["bidamount"] = wins[0]["price"]
  112. sonJobResult["winner"] = wins[0]["entname"]
  113. }
  114. } else {
  115. if len(j.Winnerorder) > 0 {
  116. sonJobResult["bidamount"] = j.Winnerorder[0]["price"]
  117. sonJobResult["winner"] = wins[0]["entname"]
  118. }
  119. sonJobResult["winnerorder"] = pkg.WinnerOrder
  120. }
  121. pkvdata(pkg, &sonJobResult, e,isSite,codeSite)
  122. sonJobResult["type"] = pkg.Type
  123. if len(tmpkeys) == 1{
  124. if qu.Float64All(sonJobResult["budget"])==0{
  125. for _,bv := range j.Block{
  126. kvparse(bv.ColonKV,e,&sonJobResult,isSite,codeSite)
  127. kvparse(bv.TableKV,e,&sonJobResult,isSite,codeSite)
  128. kvparse(bv.SpaceKV,e,&sonJobResult,isSite,codeSite)
  129. }
  130. }
  131. }
  132. if sonJobResult["name"] == nil {
  133. sonJobResult["name"] = j.Title
  134. }
  135. }
  136. //分包暂不参与选举
  137. /*
  138. for k, tags := range e.Tag {
  139. L:
  140. for _, tag := range tags {
  141. if pkg.TableKV != nil {
  142. for key, val := range pkg.TableKV.Kv {
  143. if tag.Key == key {
  144. clearmap[k] = false
  145. var tmpval interface{}
  146. if len(e.ClearFn[k]) > 0 {
  147. data := clear.DoClearFn(e.ClearFn[k], []interface{}{val, j.Content})
  148. tmpval = data[0]
  149. } else {
  150. tmpval = val
  151. }
  152. sonJobResult[k] = tmpval
  153. if packagenum == 1 {
  154. field := &ju.ExtField{
  155. Field: k,
  156. Code: "package",
  157. RuleText: "package",
  158. Type: "table",
  159. MatchType: "tag_string",
  160. ExtFrom: "package",
  161. Value: tmpval,
  162. Score: 0,
  163. }
  164. j.Result[k] = append(j.Result[k], field)
  165. }
  166. break L
  167. }
  168. }
  169. }
  170. if pkg.ColonKV != nil {
  171. for key, val := range pkg.ColonKV.Kv {
  172. if tag.Key == key {
  173. clearmap[k] = true
  174. var tmpval interface{}
  175. if len(e.ClearFn[k]) > 0 {
  176. data := clear.DoClearFn(e.ClearFn[k], []interface{}{val, j.Content})
  177. tmpval = data[0]
  178. } else {
  179. tmpval = val
  180. }
  181. sonJobResult[k] = tmpval
  182. if packagenum == 1 {
  183. field := &ju.ExtField{
  184. Field: k,
  185. Code: "package",
  186. RuleText: "package",
  187. Type: "colon",
  188. MatchType: "tag_string",
  189. ExtFrom: "package",
  190. Value: tmpval,
  191. Score: 0,
  192. }
  193. j.Result[k] = append(j.Result[k], field)
  194. }
  195. break L
  196. }
  197. }
  198. }
  199. if pkg.SpaceKV != nil {
  200. for key, val := range pkg.SpaceKV.Kv {
  201. if tag.Key == key {
  202. clearmap[k] = true
  203. var tmpval interface{}
  204. if len(e.ClearFn[k]) > 0 {
  205. data := clear.DoClearFn(e.ClearFn[k], []interface{}{val, j.Content})
  206. tmpval = data[0]
  207. } else {
  208. tmpval = val
  209. }
  210. sonJobResult[k] = tmpval
  211. if packagenum == 1 {
  212. field := &ju.ExtField{
  213. Field: k,
  214. Code: "package",
  215. RuleText: "package",
  216. Type: "space",
  217. MatchType: "tag_string",
  218. ExtFrom: "package",
  219. Value: tmpval,
  220. Score: 0,
  221. }
  222. j.Result[k] = append(j.Result[k], field)
  223. }
  224. break L
  225. }
  226. }
  227. }
  228. }
  229. }
  230. */
  231. //如果有中标候选人排序,优先用第一中标候选人的中标单位和中标金额覆盖该包里面相应的字段的值
  232. if pkg.WinnerOrder != nil && len(pkg.WinnerOrder) > 0 {
  233. firstWinnerOrder := pkg.WinnerOrder[0]
  234. if qu.ObjToString(sonJobResult["winner"]) == "" || (!pkg.Accuracy && qu.ObjToString(firstWinnerOrder["entname"]) != "" && qu.Int64All(firstWinnerOrder["sort"]) == 1) {
  235. sonJobResult["winner"] = firstWinnerOrder["entname"]
  236. }
  237. if qu.Float64All(sonJobResult["bidamount"]) == 0 || (!pkg.Accuracy && qu.Float64All(firstWinnerOrder["price"]) > 0 && qu.Int64All(firstWinnerOrder["sort"]) == 1) {
  238. sonJobResult["bidamount"] = firstWinnerOrder["price"]
  239. }
  240. }
  241. //log.Println(pkName, sonJobResult)
  242. sonJobResult["clear"] = clearmap
  243. packageResult[pkName] = sonJobResult
  244. }
  245. if len(packageResult) > 0 {
  246. j.PackageInfo = packageResult
  247. }
  248. }
  249. extRegBackPack(j, e)
  250. }, func(err interface{}) {
  251. log.Println("PackageDetail err", err)
  252. })
  253. }
  254. //清理分包信息
  255. func extRegBackPack(j *ju.Job, e *ExtractTask) {
  256. defer qu.Catch()
  257. //正则清理
  258. if j.CategorySecond == "" {
  259. for _, rc1 := range e.RuleCores[j.Category] {
  260. for _, rc := range rc1 {
  261. for pk, pack := range j.PackageInfo {
  262. clear, _ := pack["clear"].(map[string]interface{})
  263. for k, val := range pack {
  264. if b, ok := clear[k].(bool); ok && b {
  265. if rc.Field == k {
  266. text := qu.ObjToString(val)
  267. for _, in := range rc.RuleBacks {
  268. if text != "" && !in.IsLua {
  269. text = in.RegPreBac.Reg.ReplaceAllString(text, in.RegPreBac.Replace)
  270. }
  271. }
  272. pack[k] = text
  273. }
  274. }
  275. }
  276. j.PackageInfo[pk] = pack
  277. }
  278. }
  279. }
  280. } else {
  281. for _, rc1 := range e.RuleCores[j.Category+"_"+j.CategorySecond] {
  282. for _, rc := range rc1 {
  283. for pk, pack := range j.PackageInfo {
  284. clear, _ := pack["clear"].(map[string]interface{})
  285. for k, val := range pack {
  286. if b, ok := clear[k].(bool); ok && b {
  287. if rc.Field == k {
  288. text := qu.ObjToString(val)
  289. for _, in := range rc.RuleBacks {
  290. if text != "" && !in.IsLua {
  291. text = in.RegPreBac.Reg.ReplaceAllString(text, in.RegPreBac.Replace)
  292. }
  293. }
  294. pack[k] = text
  295. }
  296. }
  297. }
  298. j.PackageInfo[pk] = pack
  299. }
  300. }
  301. }
  302. }
  303. //通用正则清理
  304. for _, in := range e.RuleBacks {
  305. for _, pack := range j.PackageInfo {
  306. for k, val := range pack {
  307. if in.Field == k {
  308. text := qu.ObjToString(val)
  309. if text != "" && !in.IsLua {
  310. text = in.RegPreBac.Reg.ReplaceAllString(text, in.RegPreBac.Replace)
  311. }
  312. pack[k] = text
  313. }
  314. }
  315. }
  316. }
  317. //函数清理
  318. for _, pack := range j.PackageInfo {
  319. for key, val := range pack {
  320. if reflect.TypeOf(val) != nil && (reflect.TypeOf(val).String() == "float64" || reflect.TypeOf(val).String() == "int64") {
  321. continue
  322. } else {
  323. lock.Lock()
  324. cfn := e.ClearFn[key]
  325. lock.Unlock()
  326. data := clear.DoClearFn(cfn, []interface{}{val, j.Content})
  327. pack[key] = data[0]
  328. }
  329. }
  330. }
  331. //特殊属性的分包清理
  332. for _, rc := range e.PkgRuleCores {
  333. for pk, pack := range j.PackageInfo {
  334. for k, val := range pack {
  335. if rc.Field == k {
  336. text := qu.ObjToString(val)
  337. for _, in := range rc.RuleBacks {
  338. if text != "" {
  339. if !in.IsLua { //正则
  340. text = in.RegPreBac.Reg.ReplaceAllString(text, in.RegPreBac.Replace)
  341. } else { //lua
  342. result := GetResultMapForLua(j)
  343. lua := ju.LuaScript{Code: in.Code, Name: in.Name, Result: result, Script: in.RuleText}
  344. if j != nil {
  345. lua.Block = j.Block
  346. }
  347. extinfo := lua.RunScript("back")
  348. if extinfo["value"] != nil {
  349. text = qu.ObjToString(extinfo["value"])
  350. }
  351. }
  352. }
  353. }
  354. pack[k] = text
  355. }
  356. }
  357. j.PackageInfo[pk] = pack
  358. }
  359. }
  360. }