extpackage.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. // extpackage
  2. package extract
  3. import (
  4. "jy/clear"
  5. ju "jy/util"
  6. "log"
  7. qu "qfw/util"
  8. "reflect"
  9. )
  10. //处理分包信息
  11. func PackageDetail(j *ju.Job, e *ExtractTask) {
  12. qu.Try(func() {
  13. if len(j.BlockPackage) > 0 {
  14. packageResult := map[string]map[string]interface{}{}
  15. packagenum := len(j.BlockPackage)
  16. for pkName, pkg := range j.BlockPackage {
  17. //是否清理标记
  18. clearmap := map[string]bool{}
  19. sonJobResult := map[string]interface{}{}
  20. sonJobResult["text"] = pkg.Text
  21. sonJobResult["origin"] = pkg.Origin
  22. sonJobResult["type"] = pkg.Type
  23. sonJobResult["winnerorder"] = pkg.WinnerOrder
  24. for k, tags := range e.Tag {
  25. L:
  26. for _, tag := range tags {
  27. if pkg.TableKV != nil {
  28. for key, val := range pkg.TableKV.Kv {
  29. if tag.Key == key {
  30. clearmap[k] = false
  31. var tmpval interface{}
  32. if len(e.ClearFn[k]) > 0 {
  33. data := clear.DoClearFn(e.ClearFn[k], []interface{}{val, j.Content})
  34. tmpval = data[0]
  35. } else {
  36. tmpval = val
  37. }
  38. sonJobResult[k] = tmpval
  39. if packagenum == 1 {
  40. field := &ju.ExtField{
  41. Field: k,
  42. Code: "package",
  43. RuleText: "package",
  44. Type: "table",
  45. MatchType: "tag_string",
  46. ExtFrom: "package",
  47. Value: tmpval,
  48. Score: 0,
  49. }
  50. j.Result[k] = append(j.Result[k], field)
  51. }
  52. break L
  53. }
  54. }
  55. }
  56. if pkg.ColonKV != nil {
  57. for key, val := range pkg.ColonKV.Kv {
  58. if tag.Key == key {
  59. clearmap[k] = true
  60. var tmpval interface{}
  61. if len(e.ClearFn[k]) > 0 {
  62. data := clear.DoClearFn(e.ClearFn[k], []interface{}{val, j.Content})
  63. tmpval = data[0]
  64. } else {
  65. tmpval = val
  66. }
  67. sonJobResult[k] = tmpval
  68. if packagenum == 1 {
  69. field := &ju.ExtField{
  70. Field: k,
  71. Code: "package",
  72. RuleText: "package",
  73. Type: "colon",
  74. MatchType: "tag_string",
  75. ExtFrom: "package",
  76. Value: tmpval,
  77. Score: 0,
  78. }
  79. j.Result[k] = append(j.Result[k], field)
  80. }
  81. break L
  82. }
  83. }
  84. }
  85. if pkg.SpaceKV != nil {
  86. for key, val := range pkg.SpaceKV.Kv {
  87. if tag.Key == key {
  88. clearmap[k] = true
  89. var tmpval interface{}
  90. if len(e.ClearFn[k]) > 0 {
  91. data := clear.DoClearFn(e.ClearFn[k], []interface{}{val, j.Content})
  92. tmpval = data[0]
  93. } else {
  94. tmpval = val
  95. }
  96. sonJobResult[k] = tmpval
  97. if packagenum == 1 {
  98. field := &ju.ExtField{
  99. Field: k,
  100. Code: "package",
  101. RuleText: "package",
  102. Type: "space",
  103. MatchType: "tag_string",
  104. ExtFrom: "package",
  105. Value: tmpval,
  106. Score: 0,
  107. }
  108. j.Result[k] = append(j.Result[k], field)
  109. }
  110. break L
  111. }
  112. }
  113. }
  114. }
  115. }
  116. //如果有中标候选人排序,优先用第一中标候选人的中标单位和中标金额覆盖该包里面相应的字段的值
  117. if pkg.WinnerOrder != nil && len(pkg.WinnerOrder) > 0 {
  118. firstWinnerOrder := pkg.WinnerOrder[0]
  119. if qu.ObjToString(sonJobResult["winner"]) == "" || (!pkg.Accuracy && qu.ObjToString(firstWinnerOrder["entname"]) != "" && qu.Int64All(firstWinnerOrder["sort"]) == 1) {
  120. sonJobResult["winner"] = firstWinnerOrder["entname"]
  121. }
  122. if qu.Float64All(sonJobResult["bidamount"]) == 0 || (!pkg.Accuracy && qu.Float64All(firstWinnerOrder["price"]) > 0 && qu.Int64All(firstWinnerOrder["sort"]) == 1) {
  123. sonJobResult["bidamount"] = firstWinnerOrder["price"]
  124. }
  125. }
  126. //log.Println(pkName, sonJobResult)
  127. sonJobResult["clear"] = clearmap
  128. packageResult[pkName] = sonJobResult
  129. }
  130. if len(packageResult) > 0 {
  131. j.PackageInfo = packageResult
  132. }
  133. }
  134. extRegBackPack(j, e)
  135. }, func(err interface{}) {
  136. log.Println("PackageDetail err", err)
  137. })
  138. }
  139. //清理分包信息
  140. func extRegBackPack(j *ju.Job, e *ExtractTask) {
  141. defer qu.Catch()
  142. //正则清理
  143. for _, rc := range e.RuleCores {
  144. for pk, pack := range j.PackageInfo {
  145. clear, _ := pack["clear"].(map[string]interface{})
  146. for k, val := range pack {
  147. if b, ok := clear[k].(bool); ok && b {
  148. if rc.Field == k {
  149. text := qu.ObjToString(val)
  150. for _, in := range rc.RuleBacks {
  151. if text != "" && !in.IsLua {
  152. text = in.RegPreBac.Reg.ReplaceAllString(text, in.RegPreBac.Replace)
  153. }
  154. }
  155. pack[k] = text
  156. }
  157. }
  158. }
  159. j.PackageInfo[pk] = pack
  160. }
  161. }
  162. //通用正则清理
  163. for _, in := range e.RuleBacks {
  164. for _, pack := range j.PackageInfo {
  165. for k, val := range pack {
  166. if in.Field == k {
  167. text := qu.ObjToString(val)
  168. if text != "" && !in.IsLua {
  169. text = in.RegPreBac.Reg.ReplaceAllString(text, in.RegPreBac.Replace)
  170. }
  171. pack[k] = text
  172. }
  173. }
  174. }
  175. }
  176. //函数清理
  177. for _, pack := range j.PackageInfo {
  178. for key, val := range pack {
  179. if reflect.TypeOf(val) != nil && (reflect.TypeOf(val).String() == "float64" || reflect.TypeOf(val).String() == "int64") {
  180. continue
  181. } else {
  182. lock.Lock()
  183. cfn := e.ClearFn[key]
  184. lock.Unlock()
  185. data := clear.DoClearFn(cfn, []interface{}{val, j.Content})
  186. pack[key] = data[0]
  187. }
  188. }
  189. }
  190. //特殊属性的分包清理
  191. for _, rc := range e.PkgRuleCores {
  192. for pk, pack := range j.PackageInfo {
  193. for k, val := range pack {
  194. if rc.Field == k {
  195. text := qu.ObjToString(val)
  196. for _, in := range rc.RuleBacks {
  197. if text != "" {
  198. if !in.IsLua { //正则
  199. text = in.RegPreBac.Reg.ReplaceAllString(text, in.RegPreBac.Replace)
  200. } else { //lua
  201. result := GetResultMapForLua(j)
  202. lua := ju.LuaScript{Code: in.Code, Name: in.Name, Result: result, Script: in.RuleText}
  203. if j != nil {
  204. lua.Block = j.Block
  205. }
  206. extinfo := lua.RunScript("back")
  207. if extinfo["value"] != nil {
  208. text = qu.ObjToString(extinfo["value"])
  209. }
  210. }
  211. }
  212. }
  213. pack[k] = text
  214. }
  215. }
  216. j.PackageInfo[pk] = pack
  217. }
  218. }
  219. }