winnerorder.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. package pretreated
  2. import (
  3. "jy/clear"
  4. //"jy/clear"
  5. "jy/util"
  6. qutil "qfw/util"
  7. "regexp"
  8. "strconv"
  9. "strings"
  10. "unicode/utf8"
  11. )
  12. type WinnerOrderEntity struct {
  13. }
  14. type WinnerFlag struct {
  15. index int //数组索引
  16. start int //数组开始索引
  17. end int //数组结束索引
  18. textStart int //文本开始索引
  19. textEnd int //文本结束索引
  20. max int
  21. indexs []int
  22. }
  23. var (
  24. winnerOrderEntity = &WinnerOrderEntity{}
  25. numberReg = regexp.MustCompile("[一二三四五六七八九十0-9]+")
  26. numberReg2 = regexp.MustCompile("[\\d一二三四五六七八九十.,,]+")
  27. thisNumberReg = regexp.MustCompile("第" + numberReg.String())
  28. winnerReg0 = regexp.MustCompile("(中标候选人第\\d名|第[0-9一二三四五](中选|中标|成交)候选(人|供应商)|中标人[1-9]|[第|弟][一二三四五0-9]中标人)")
  29. winnerReg1 = regexp.MustCompile("(^|[^为])(【?(推荐)?第[一二三四五六七八九十1-9]+(合格|名|包|标段)?】?([候|侯]选)?(入围|备选|成交|中[标|选])人?([((]成交[))])?([候|侯]选|排序)?(人(单位)?|供[应货]商|单位|机构)(名称)?为?)($|[^,;;。,])")
  30. winnerReg2 = regexp.MustCompile("(排名第[一二三四五六七八九十1-9]+|[第|弟][一二三四五六七八九十1-9]+(中标|中选)?[候|侯]选人|中标候选人排名[::]\\d)")
  31. winnerReg3 = regexp.MustCompile("((中标候选人)?第[一二三四五六七八九十1-9]+名|(中标候选人)[1-9])")
  32. winnerReg4 = regexp.MustCompile("((确认|推荐|评审|排[名|序])[为::]+|(由高到低排序前.名|公示下列内容|(确定|推荐)的?中[标|选]候选人|\n中[标|选]候选.{1,3}\\s*\n|\n(中[标|选]候选.{1,3}[::\u3000\u2003\u00a0\\s]|成交候选供应商)|(排[名|序]|公[示|告]|具体|推荐|结果(公示)?|中[标|选]候选人.{0,2})如下|[一二三四五六七八九十\\d]+、(中[标|选]候选[^\n::]{1,8}|.{0,8}(成交|结果)信息|成交[^\n::]{2,8}))[为::]?)")
  33. winnerReg5 = regexp.MustCompile("([^,;;。,、\n投标人]+?)(为?)(第[一二三四五六七八九十1-9]+(成交|中标)?([候|侯]选(人|供应商|单位|机构)|名)|排名第[一二三四五六七八九十1-9]+)([,;;。,、]|\\s+\n)")
  34. winnerReg6 = regexp.MustCompile("(^(排名)?第[一二三四五六七八九十1-9]+[名中标成交备选候人单位供应商]*)")
  35. winnerReg7 = regexp.MustCompile("第[一二三四五六七八九十]{1}标段[::]")
  36. //带金额
  37. winnerReg8 = regexp.MustCompile("(第[一二三四五六七八九十]中选候选人)[::\\s]+?[((]1[))][\\s]+?(单位名称)[::]?(.*)[\\s]+?[((]2[))][\\s]+(参选报价|投标报价(含税))[::]?(.*)")
  38. winnerReg9 = regexp.MustCompile("(第[一二三四五六七八九十]中[选|标]?候选人|中标人[1-9])[::\\s]+?([\u4E00-\u9FA5]{4,20})[\\s]+([0-9\\.\\s万元]+)")
  39. winnerReg10 = regexp.MustCompile("(第[一二三四五六七八九十]中标人)[::\\s]+?报价[¥]?([0-9\\.\\s万元]+)[;;]([\u4E00-\u9FA5]{4,20})")
  40. winnerReg11 = regexp.MustCompile("([弟|第][一二三四五六七八九十]中[标|选]候选人)[::\\s]+?(单位名称|投标人名称)[::]?(.*)[\\s]+?(参选报价|投标报价[((]含税[))]|投标报价[((]元[))])[::]?(.*)")
  41. winnerReg12 = regexp.MustCompile("(中[标|选]候选人[弟|第][一二三四五六七八九十0-9]名|[弟|第][一二三四五六七八九十0-9](中标)?候选人)[::\\s ]+?(.*)[ \\s,,]+?(投标报价|投标总报价|金额)[::]?([0-9\\.\\s万元]+)")
  42. winnerReg13 = regexp.MustCompile("([弟|第][一二三四五六七八九十0-9])\n(成交候选人|成交供应商)\n(.*)\n([0-9\\.\\s万元]+)")
  43. winnerReg14 = regexp.MustCompile("(中标候选人|成交候选人)\n.*\n.*\n第[1-9][\\s]+?名")
  44. winnerReg14_1 = regexp.MustCompile("(第[1-9])[\\s]+?名[::](.{4,20}公司)[\\s]+中标价[::]([0-9\\.\\s万元]+)")
  45. winnerReg15 = regexp.MustCompile("([弟|第][一二三四五六七八九十0-9](中标|中选)?候选人)[::](.*)[ \\s\\n,,]+(最终报价[::\\s]+不含税单价.*)?不含税总价[::]?([0-9\\.()\\s万元]+)")
  46. winnerReg16 = regexp.MustCompile("(中[标|选]候选人)排序[::]([1-9一二三四五六七])[\\s]+.{1,4}名称[::](.*公司)[\\s]+.{1,4}报价[::]([¥〇0-9\\.人民币零点壹贰叁肆伍陆柒捌玖拾佰仟万亿元圆角分整]+)")
  47. winnerReg17 = regexp.MustCompile("(报价金额|应答含税总价)[::]?([¥〇0-9\\.人民币零点壹贰叁肆伍陆柒捌玖拾佰仟万亿元圆角分整]+)")
  48. winnerReg18 = regexp.MustCompile("([中|投]标候选人[弟|第])([1-9一二三四五])[\\s]?名[::]([\u4E00-\u9FA5]{4,20})([((].*公司[))])?[,,\\s]+投标报价[::]([0-9\\.\\s万元]+)")
  49. //格式化中标金额换行
  50. winnerReg100 = regexp.MustCompile("中标金额:[\\s]+([0-9\\.万元]+)")
  51. //不带金额
  52. winnerReg20 = regexp.MustCompile("(中标单位候选人名称)[\\s]+(.*)[\\s]+(中标候选人单位名次)[\\s]+([弟|第][一二三四五六七八九十0-9]中标人)")
  53. winnerReg21 = regexp.MustCompile("(石城(.*公司|.*厂|.*有\n限公司))[0-9.]+([弟|第][一二三四五六七八九十0-9])成交[\n]?候选人")
  54. winnerReg22 = regexp.MustCompile("投标人[::](.{4,20}公司)[\\s-]+标段[::][1-3][\\s-]+排名[::]([1-9])")
  55. winnerReg23 = regexp.MustCompile("([\u4E00-\u9FA5]{4,20})\n(有限公司|公司)[\\s]+(第[一二三四五1-9]中[选|标]候选人)")
  56. winnerReg24 = regexp.MustCompile("[\\s\\n]+([\u4E00-\u9FA5]{4,20}公司)[\\s\\n]+(第[一二三四五六七八九十]中[选|标]?候选人)")
  57. winnerRegclear = regexp.MustCompile("(买方人员|经评审.*排名第[一二三四五六七八九十1-9]+)")
  58. colonEndReg = regexp.MustCompile("[::]$")
  59. toWarpReg = regexp.MustCompile("[,。,;;]+")
  60. findamountReg = regexp.MustCompile("[,。,;;\u3000\u2003\u00a0\\s]+")
  61. amountReg = regexp.MustCompile("^\\d+(\\.\\d+)?([百|千]?元|[百|千]?[万|亿]元?)$")
  62. companyWarpReg = regexp.MustCompile("(公司)(.+?[::])")
  63. findCompanyReg = regexp.MustCompile("[^::]+公司")
  64. colonSpaceReg = regexp.MustCompile("[::]\\s+")
  65. findCandidate = regexp.MustCompile("(^.{5,}(公司|集团|单位|机构|企业|厂|场|院|所|店|中心|市|局|站|城|处|行|部|队|联合[会|体])|工作室)")
  66. findCandidate2 = regexp.MustCompile("(^.{5,}(公司|集团|单位|机构|企业|厂|场|院|所|店|中心|局|站|城|处|行|部|队|联合[会|体]|工作室|有限司)$)")
  67. clearSpace1 = regexp.MustCompile("([((][\\d一二三四五六七八九十][))][\\s\u3000\u2003\u00a0\\t]*|<[^>].+?>)")
  68. clearSpace2 = regexp.MustCompile("</?[^>]+>")
  69. offerReg = regexp.MustCompile("(中标|磋商|投标|报|单|成交)总?(价|金额)")
  70. nofferReg = regexp.MustCompile("(费率|折扣率)")
  71. nobidValReg = regexp.MustCompile("^\\d{2}%$")
  72. )
  73. /*
  74. *查找分包中的中标人排序
  75. *text文本,flag非否精确查找
  76. *from 来源
  77. */
  78. func (wo *WinnerOrderEntity) Find(text string, flag bool, from int, isSite bool, codeSite string) []map[string]interface{} {
  79. if clearSpace2.MatchString(text){
  80. text = TextAfterRemoveTable(text)
  81. }//评得分估|标的|班子成员|人员
  82. text = winnerRegclear.ReplaceAllString(text,"")
  83. if nswinnertabletag.MatchString(text) && !winnerReg0.MatchString(text){
  84. return []map[string]interface{}{}
  85. }
  86. text = winnerReg5.ReplaceAllString(text, "\n$3:$1\n")
  87. text = winnerReg20.ReplaceAllString(text,"\n${4}:${2}\n")
  88. text = winnerReg21.ReplaceAllString(text,"\n${3}成交候选人:${1}\n")
  89. text = strings.ReplaceAll(text,"有\n限公司","有限公司")
  90. text = winnerReg22.ReplaceAllString(text,"\n中标候选人第${2}名:${1}\n")
  91. text = winnerReg23.ReplaceAllString(text,"\n${3}:${1}${2}\n")
  92. text = winnerReg24.ReplaceAllString(text,"\n${2}:${1}\n")
  93. text = winnerReg8.ReplaceAllString(text,"\n${1}:${3}\n中标金额:${5}\n")
  94. text = winnerReg9.ReplaceAllString(text,"\n${1}:${2}\n中标金额:${3}\n")
  95. text = winnerReg10.ReplaceAllString(text,"\n${1}:${3}\n中标金额:${2}\n")
  96. text = winnerReg11.ReplaceAllString(text,"\n${1}:${3}\n中标金额:${5}\n")
  97. text = winnerReg12.ReplaceAllString(text,"\n${1}:${3}\n中标金额:${5}\n")
  98. text = winnerReg13.ReplaceAllString(text,"\n${1}${2}:${3}\n中标金额:${4}\n")
  99. text = winnerReg15.ReplaceAllString(text,"\n${1}:${3}\n中标金额:${5}\n")
  100. text = winnerReg16.ReplaceAllString(text,"\n第${2}${1}:${3}\n中标金额:${4}\n")
  101. text = winnerReg17.ReplaceAllString(text,"\n中标金额:${2}\n")
  102. text = winnerReg18.ReplaceAllString(text,"\n${1}${2}名:${3}\n中标金额:${5}\n")
  103. //中标金额格式化
  104. text = winnerReg100.ReplaceAllString(text,"中标金额:${1}")
  105. //特殊格式
  106. if winnerReg14.MatchString(text) {
  107. text = winnerReg14_1.ReplaceAllString(text,"\n中标候选人${1}名:${2}\n中标金额:${3}\n")
  108. }
  109. text = clearSpace1.ReplaceAllString(text, "") //清理(1) 单位名称:成都维诺信科技有限公司-->单位名称:成都维诺信科技有限公司
  110. if strings.TrimSpace(text) == "" {
  111. return []map[string]interface{}{}
  112. }
  113. blocks := winnerReg4.Split(text, -1)
  114. if len(blocks) == 0 {
  115. blocks = append(blocks, text)
  116. } else if len(blocks) == 1 {
  117. blocks = winnerReg7.Split(text, -1)
  118. }
  119. winners := wo.findByReg(text, blocks, winnerReg0, from, isSite, codeSite)
  120. if len(winners) == 0 {
  121. winners = wo.findByReg(text, blocks, winnerReg2, from, isSite, codeSite)
  122. }
  123. if len(winners) == 0 {
  124. if flag {
  125. //异常
  126. winners = wo.findByReg(text, blocks, winnerReg3, from, isSite, codeSite)
  127. } else {
  128. indexs_4 := winnerReg4.Split(text, -1)
  129. if len(indexs_4) > 1 {
  130. for _, v_4 := range indexs_4 {
  131. indexs_3 := winnerReg3.FindAllStringIndex(v_4, -1)
  132. if len(indexs_3) < 2 {
  133. continue
  134. }
  135. for _, v_3 := range indexs_3 {
  136. if strings.Count(v_4[:v_3[1]], "\n") <= 3 {
  137. winners = wo.findByReg(text, blocks, winnerReg3, from, isSite, codeSite)
  138. break
  139. }
  140. }
  141. }
  142. }
  143. }
  144. }
  145. //候选人有一半以上是错误的话,那么就认为全部抽错了
  146. invalidCount := 0
  147. for _, v := range winners {
  148. if !findCandidate.MatchString(qutil.ObjToString(v["entname"])) {
  149. invalidCount++
  150. }
  151. }
  152. if invalidCount > len(winners)/2 {
  153. return []map[string]interface{}{}
  154. }
  155. return winners
  156. }
  157. //获取中标人排序文本
  158. func (wo *WinnerOrderEntity) getText(text string, blocks []string, reg_2 *regexp.Regexp, from int) []string {
  159. isWinnerReg1 := reg_2 == winnerReg1
  160. rdata := []string{}
  161. //确定中标候选人排序在哪个块里面
  162. rightIndex, prevMax := -1, -1
  163. rightIndexs := []int{}
  164. var winnerFlag []*WinnerFlag
  165. for b_k, b_v := range blocks {
  166. indexs := []*WinnerFlag{}
  167. array := reg_2.FindAllStringSubmatchIndex(b_v, -1)
  168. for _, v := range array {
  169. var wrfg *WinnerFlag
  170. if isWinnerReg1 {
  171. if v[4]<0 || v[5]<0 {
  172. continue
  173. }
  174. wrfg = &WinnerFlag{
  175. index: wo.toNumber(b_v[v[4]:v[5]], 0),
  176. textStart: v[4],
  177. textEnd: v[5],
  178. }
  179. } else {
  180. if v[2]<0 || v[3]<0 {
  181. continue
  182. }
  183. wrfg = &WinnerFlag{
  184. index: wo.toNumber(b_v[v[2]:v[3]], 0),
  185. textStart: v[2],
  186. textEnd: v[3],
  187. }
  188. }
  189. indexs = append(indexs, wrfg)
  190. }
  191. wf := wo.getMax(indexs, from)
  192. if wf != nil && wf.max >= prevMax {
  193. prevMax = wf.max
  194. rightIndex = b_k
  195. rightIndexs = append(rightIndexs, b_k)
  196. winnerFlag = append(winnerFlag, wf)
  197. }
  198. }
  199. ////在这个块里面,截取
  200. if rightIndex == -1 {
  201. return rdata
  202. }
  203. for i, rightIndex := range rightIndexs {
  204. text = blocks[rightIndex]
  205. warpCount := wo.interceptText(winnerFlag[i].indexs, text)
  206. if warpCount == 0 {
  207. warpCount = 1
  208. }
  209. textEnd := text[winnerFlag[i].textEnd:]
  210. text = text[winnerFlag[i].textStart:winnerFlag[i].textEnd]
  211. warpIndex := regSpliteSegment.FindAllStringIndex(textEnd, -1)
  212. if len(warpIndex) >= warpCount {
  213. textEnd = textEnd[:warpIndex[warpCount-1][1]]
  214. }
  215. text = text + textEnd
  216. if isWinnerReg1 {
  217. text = reg_2.ReplaceAllString(text, "$1\n$2$15")
  218. } else {
  219. text = reg_2.ReplaceAllString(text, "\n$1")
  220. }
  221. text = regReplWrapSpace.ReplaceAllString(text, "")
  222. lines := SspacekvEntity.getLines(text)
  223. text = ""
  224. for k, v := range lines {
  225. v = strings.TrimSpace(v)
  226. v = colonSpaceReg.ReplaceAllString(v, ":")
  227. if reg_2.MatchString(v) && !regDivision.MatchString(v) {
  228. if isWinnerReg1 {
  229. v = reg_2.ReplaceAllString(v, "$1$2:$15")
  230. } else {
  231. v = reg_2.ReplaceAllString(v, "$1:")
  232. }
  233. }
  234. //逗号之类符号的分割,查找紧跟在中标候选人之后的中标金额
  235. //如果后面没有什么标识,只有金额的情况下,把中标金额加到金额前面
  236. if reg_2.MatchString(v) {
  237. //两个kv连到一起
  238. if len(regDivision.FindAllString(v, -1)) > 1 && !findamountReg.MatchString(v) {
  239. v = companyWarpReg.ReplaceAllString(v, "$1\n$2")
  240. }
  241. vs := findamountReg.Split(v, -1)
  242. if len(vs) > 1 {
  243. vs_1 := strings.TrimSpace(vs[1])
  244. if amountReg.MatchString(vs_1) {
  245. v = strings.Replace(v, vs[1], "中标金额:"+vs_1, 1)
  246. }
  247. }
  248. }
  249. v = toWarpReg.ReplaceAllString(v, "\n")
  250. text += v
  251. if (!reg_2.MatchString(v) || !colonEndReg.MatchString(v)) && k < len(lines)-1 {
  252. text += "\n"
  253. }
  254. }
  255. rdata = append(rdata, text)
  256. }
  257. return rdata
  258. }
  259. //抽取对应的排序结果
  260. func (wo *WinnerOrderEntity) findByReg(content string, blocks []string, reg_2 *regexp.Regexp, from int, isSite bool, codeSite string) []map[string]interface{} {
  261. text := wo.getText(content, blocks, reg_2, from)
  262. winners := []map[string]interface{}{}
  263. if len(text) < 1 {
  264. return winners
  265. }
  266. for i, v := range text {
  267. object := map[string]interface{}{}
  268. count := 0
  269. kvs := colonkvEntity.getColonSpaceKV(v, isSite, codeSite)
  270. for _, kv := range kvs {
  271. k, v := kv.Key, kv.Value
  272. if regDivision.MatchString(v) {
  273. v_k := regDivision.Split(v, -1)[0]
  274. if reg_2.MatchString(v_k) {
  275. k = v_k
  276. }
  277. }
  278. if reg_2.MatchString(k) { //中标人
  279. if len(object) > 0 {
  280. winners = append(winners, object)
  281. object = map[string]interface{}{}
  282. }
  283. val := wo.clear("中标单位", v)
  284. if val != nil && utf8.RuneCountInString(qutil.ObjToString(val)) > 5 {
  285. count++
  286. object["entname"] = strings.TrimRight(strings.ReplaceAll(strings.TrimSpace(qutil.ObjToString(val)), "公司", "公司,"), ",")
  287. object["sort"] = wo.toNumber(k, count)
  288. object["sortstr"] = thisNumberReg.FindString(k)
  289. object["type"] = i
  290. }
  291. }else { //中标金额 - 折扣率系数-待定
  292. findOfferFlag := false
  293. if offerReg.MatchString(k) && !nofferReg.MatchString(k){
  294. findOfferFlag = true
  295. } else {
  296. kvTags := GetKvTags([]*util.Kv{&util.Kv{Key: k, Value: v}}, "", []string{"中标金额"}, isSite, codeSite)
  297. if len(kvTags["中标金额"]) > 0 {
  298. findOfferFlag = true
  299. }
  300. }
  301. //找到了中标金额
  302. if findOfferFlag && object["entname"] != nil {
  303. val := wo.clear("中标金额", v+GetMoneyUnit(k, v))
  304. if val != nil && !nobidValReg.MatchString(qutil.ObjToString(val)) {
  305. moneys := clear.ObjToMoney([]interface{}{val, ""})
  306. if len(moneys) > 0 {
  307. if vf, ok := moneys[0].(float64); ok && moneys[len(moneys)-1].(bool){
  308. object["price"] = float64(vf)
  309. }
  310. }
  311. }
  312. winners = append(winners, object)
  313. object = map[string]interface{}{}
  314. }
  315. }
  316. }
  317. if len(object) > 0 {
  318. winners = append(winners, object)
  319. }
  320. indexs := []*WinnerFlag{}
  321. //tym := make(map[int]bool, 0)
  322. for _, winner := range winners {
  323. indexs = append(indexs, &WinnerFlag{
  324. index: winner["sort"].(int),
  325. //ttype: winner["type"].(int),
  326. })
  327. //tym[winner["type"].(int)] = true
  328. }
  329. //winnerFlag := wo.getMax(indexs, from)
  330. //if winnerFlag != nil {
  331. // winners = winners[winnerFlag.start : winnerFlag.end+1]
  332. //} else {
  333. // winners = []map[string]interface{}{}
  334. //}
  335. }
  336. return winners
  337. }
  338. //清理结果
  339. func (wo *WinnerOrderEntity) clear(typ, v string) interface{} {
  340. if typ == "中标单位" && regDivision.MatchString(v) {
  341. v = findCompanyReg.FindString(v)
  342. v = filterWinner.FindString(v)
  343. }
  344. v = filterValue.ReplaceAllString(v, "")
  345. //过滤
  346. return v //clear.ClearResult(typ, v)
  347. }
  348. //
  349. func (wo *WinnerOrderEntity) toNumber(value string, defaultNum int) int {
  350. value = numberReg.FindString(value)
  351. if value == "" {
  352. return defaultNum
  353. }
  354. v := util.ChineseNumberToInt(value)
  355. if v < 1 {
  356. v, _ = strconv.Atoi(value)
  357. }
  358. if v > 0 {
  359. return v
  360. }
  361. return defaultNum
  362. }
  363. //
  364. func (wo *WinnerOrderEntity) getMax(indexs []*WinnerFlag, from int) *WinnerFlag {
  365. allMap := map[int]*WinnerFlag{}
  366. max, start, textStart := -1, -1, -1
  367. isContinue := false
  368. flag := false
  369. is := []int{}
  370. for k, winnerFlag := range indexs {
  371. v := winnerFlag.index
  372. //从1开始,1前面的过滤掉
  373. if v == 1 {
  374. flag = true
  375. }
  376. if !flag {
  377. continue
  378. }
  379. if v == 1 {
  380. start = k
  381. textStart = winnerFlag.textStart
  382. isContinue = false
  383. }
  384. if isContinue {
  385. continue
  386. }
  387. nextIndex := 0
  388. if k < len(indexs)-1 {
  389. nextIndex = indexs[k+1].index
  390. }
  391. //从1-n是一组,遇到小于n的从新添加分组,分组不是1开头的过滤掉
  392. is = append(is, winnerFlag.textStart, winnerFlag.textEnd)
  393. if nextIndex-v != 1 {
  394. isContinue = true
  395. if max < k-start {
  396. max = k - start
  397. allMap[k-start] = &WinnerFlag{
  398. textStart: textStart,
  399. textEnd: winnerFlag.textEnd,
  400. start: start,
  401. end: k,
  402. max: max,
  403. indexs: is,
  404. }
  405. }
  406. }
  407. }
  408. if max != -1 {
  409. if from != 3 && len(allMap[max].indexs) <= 2 {
  410. return nil
  411. }
  412. return allMap[max]
  413. }
  414. return nil
  415. }
  416. //如果有两个,看第一个有几个换行,用第一个里面的最后一个换行作为第二个的结束位置
  417. //如果有两个以上,取前两个中换行最多的最后一个换行,作为其他的结束位置
  418. func (wo *WinnerOrderEntity) interceptText(indexs []int, con string) int {
  419. if len(indexs) == 1 {
  420. return 0
  421. }
  422. count := 0
  423. for ik, iv := range indexs {
  424. text := ""
  425. if ik < len(indexs)-1 {
  426. text = con[iv:indexs[ik+1]]
  427. } else {
  428. text = con[iv:]
  429. }
  430. //如果两个
  431. if len(indexs) == 2 {
  432. //取第一个有几个换行符
  433. if ik == 0 {
  434. count = len(regSpliteSegment.FindAllStringIndex(text, -1))
  435. }
  436. } else {
  437. //多个,取前两个中换行符最多的
  438. if ik <= 1 {
  439. thisCount := len(regSpliteSegment.FindAllStringIndex(text, -1))
  440. if thisCount > count {
  441. count = thisCount
  442. }
  443. }
  444. }
  445. }
  446. return count
  447. }
  448. //排序
  449. func (wo *WinnerOrderEntity) Order(winnerOrder []map[string]interface{}) {
  450. if winnerOrder == nil || len(winnerOrder) <= 1 {
  451. return
  452. }
  453. for x, _ := range winnerOrder {
  454. for y := 0; y < len(winnerOrder)-x-1; y++ {
  455. dt1, xok := winnerOrder[y]["sort"].(int)
  456. dt2, yok := winnerOrder[y+1]["sort"].(int)
  457. if xok && yok && dt1 > dt2 {
  458. temp := winnerOrder[y]
  459. winnerOrder[y] = winnerOrder[y+1]
  460. winnerOrder[y+1] = temp
  461. }
  462. }
  463. }
  464. }
  465. //合并
  466. func (wo *WinnerOrderEntity) Merge(winnerOrder, wors []map[string]interface{}) {
  467. if wors == nil || len(wors) == 0 {
  468. return
  469. }
  470. for _, v := range wors {
  471. for _, tv := range winnerOrder {
  472. sort, _ := v["sort"].(int)
  473. t_sort, _ := tv["sort"].(int)
  474. if sort == 0 || sort != t_sort {
  475. continue
  476. }
  477. if qutil.ObjToString(tv["entname"]) == "" && qutil.ObjToString(v["entname"]) != "" {
  478. tv["entname"] = v["entname"]
  479. }
  480. t_price, _ := tv["price"].(float64)
  481. price, _ := v["price"].(float64)
  482. if t_price == 0 && price != 0 {
  483. tv["price"] = v["price"]
  484. }
  485. }
  486. }
  487. }