classificationTag.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. package front
  2. import (
  3. qu "app.yhyue.com/moapp/jybase/common"
  4. "app.yhyue.com/moapp/jybase/encrypt"
  5. elastic "app.yhyue.com/moapp/jybase/es"
  6. "app.yhyue.com/moapp/jybase/redis"
  7. "app.yhyue.com/moapp/jypkg/common/src/qfw/util/bidsearch"
  8. "app.yhyue.com/moapp/jypkg/public"
  9. "encoding/json"
  10. "fmt"
  11. "github.com/gogf/gf/v2/util/gconv"
  12. "jy/src/jfw/config"
  13. "log"
  14. "strconv"
  15. "strings"
  16. "sync"
  17. "time"
  18. "net/http"
  19. "app.yhyue.com/moapp/jybase/date"
  20. "app.yhyue.com/moapp/jybase/go-xweb/httpsession"
  21. )
  22. const (
  23. //企业主体库身份类型区分 sql传值
  24. IdentityTypeBuyer = 0 // 采购单位
  25. IdentityTypeWinner = 1 // 中标单位
  26. )
  27. type KeyType struct {
  28. Name string `json:"name"`
  29. Url string `json:"url"`
  30. SeedData []KeyType `json:"seedData"`
  31. }
  32. // RegionAndInformationAndTender 1地域 2信息类型 3热门招标
  33. func RegionAndInformationAndTender() map[string]interface{} {
  34. if bytes, err := redis.GetBytes(RedisNameNew, "regionAndInformationAndTender"); err == nil && bytes != nil {
  35. rData := map[string]interface{}{}
  36. if err := json.Unmarshal(*bytes, &rData); err != nil {
  37. log.Printf("[MANAGER-ERR]RegionAndInformationAndTender GetData Error %v \n", err)
  38. return nil
  39. }
  40. return rData
  41. }
  42. data := make(map[string]interface{})
  43. for _, v := range []int{1, 2, 3} {
  44. data[fmt.Sprintf("labUrl_%d", v)] = GetLabUrl(v) //1地域 2信息类型 3热门招标
  45. }
  46. if bytes, err := json.Marshal(data); err == nil && bytes != nil {
  47. _ = redis.PutBytes(RedisNameNew, "regionAndInformationAndTender", &bytes, 2*60*60)
  48. }
  49. return data
  50. }
  51. func GetHotIndustry() (rData []map[string][]map[string]interface{}) {
  52. if bytes, err := redis.GetBytes(RedisNameNew, "pcIndexHotIndustry"); err == nil && bytes != nil {
  53. rData = []map[string][]map[string]interface{}{}
  54. if err := json.Unmarshal(*bytes, &rData); err != nil {
  55. log.Printf("[MANAGER-ERR]pcIndexHotIndustry GetData Error %v \n", err)
  56. return nil
  57. }
  58. }
  59. rData = getkeysMap() //热门行业
  60. if bytes, err := json.Marshal(rData); err == nil && bytes != nil {
  61. _ = redis.PutBytes(RedisNameNew, "pcIndexHotIndustry", &bytes, RedisTimeout)
  62. }
  63. return rData
  64. }
  65. // 最新更新的200中标企业
  66. func GetWinnerInfo() (data []*BuyerList) {
  67. // 取缓存
  68. cache, err := GetHotCache(config.HotWinnerConfig.CacheKey)
  69. if err == nil && cache != nil && len(cache) > 0 {
  70. return cache
  71. }
  72. // 没取到缓存查数据
  73. rs := GetHotWinnerBuyer(IdentityTypeWinner, config.HotWinnerConfig.Limit)
  74. //关联中标企业
  75. if rs == nil || len(rs) == 0 {
  76. return
  77. }
  78. for _, v := range rs {
  79. var vs BuyerList
  80. vs.Name = qu.InterfaceToStr(v["name"])
  81. vs.Url = qu.InterfaceToStr(v["url"])
  82. data = append(data, &vs)
  83. }
  84. // 存缓存
  85. go PutHotCache(config.HotWinnerConfig.CacheKey, config.HotWinnerConfig.CacheTimeout, data)
  86. return
  87. }
  88. // PutHotCache 热门采购单位、中标单位存缓存
  89. func PutHotCache(redisKey string, redisTimeout int, list []*BuyerList) {
  90. b, err := json.Marshal(list)
  91. if err != nil {
  92. log.Printf("保存缓存 序列化异常,data:%s,err:%s\n", list, err.Error())
  93. return
  94. }
  95. if err = redis.PutBytes("seoCache", redisKey, &b, redisTimeout); err != nil {
  96. log.Printf("保存缓存 redis 异常,key:%s,err:%s\n", redisKey, err.Error())
  97. }
  98. }
  99. // GetHotCache 热门采购单位、中标单位取缓存
  100. func GetHotCache(redisKey string) (list []*BuyerList, err error) {
  101. redisByte, err := redis.GetBytes("seoCache", redisKey)
  102. if err != nil || redisByte == nil || len(*redisByte) == 0 {
  103. return list, err
  104. }
  105. err = json.Unmarshal(*redisByte, &list)
  106. if err != nil {
  107. log.Println(fmt.Sprintf("读取缓存 序列化异常,err:%s", err.Error()))
  108. return nil, err
  109. }
  110. return list, nil
  111. }
  112. // 获取最新的中标单位
  113. // identityType : 0 采购单位 1-中标单位
  114. // limit: 数量
  115. func getEntBaseInfo(identityType, limit int) *[]map[string]interface{} {
  116. q := "SELECT company_id AS id,name,name_id FROM dws_f_ent_baseinfo WHERE company_id !='' and company_id is not null AND (identity_type &(1 << ?)) > 0 order by latest_time desc limit ?"
  117. return public.GlobalCommonMysql.SelectBySql(q, identityType, limit)
  118. }
  119. func GetHotWinnerBuyer(identityType, limit int) []map[string]interface{} {
  120. isWinner := identityType == 1
  121. queryTotal := gconv.Int(gconv.Float64(limit) * 1.5)
  122. var querySql string
  123. if isWinner {
  124. querySql = fmt.Sprintf(`{"query": {"bool": {"must": [{"exists": {"field": "s_winner"}},{"exists": {"field": "entidlist"}}],"must_not":[{"term":{"entidlist":"-"}}]}},"_source":["buyer","s_winner","entidlist"],"sort":[{"lasttime": "desc"}],"size": %d}`, queryTotal)
  125. } else {
  126. querySql = fmt.Sprintf(`{"query": {"bool": {"must": [{"exists": {"field": "buyer"}}]}},"_source":["buyer","s_winner","entidlist"],"sort":[{"lasttime": "desc"}],"size": %d}`, queryTotal)
  127. }
  128. getData := elastic.GetNoLimit("projectset", "projectset", querySql)
  129. var finalList []map[string]interface{}
  130. if getData != nil && len(*getData) > 0 {
  131. queryMap := make(map[string]bool)
  132. if isWinner { //采购关联企业 校验正确性
  133. var queryArr []string
  134. for _, v := range *getData {
  135. if len(queryArr) < queryTotal {
  136. for _, name := range gconv.Strings(v["entidlist"]) {
  137. if name == "" || name == "-" {
  138. continue
  139. }
  140. if queryMap[name] {
  141. continue
  142. }
  143. queryArr = append(queryArr, name)
  144. queryMap[name] = true
  145. if len(queryArr) == queryTotal {
  146. break
  147. }
  148. }
  149. }
  150. }
  151. finalList = getWinnerSeoIdByName(queryArr...)
  152. } else {
  153. var queryArr []string
  154. for _, v := range *getData {
  155. buyerName := gconv.String(v["buyer"])
  156. if queryMap[buyerName] {
  157. continue
  158. }
  159. queryArr = append(queryArr, buyerName)
  160. queryMap[buyerName] = true
  161. }
  162. finalList = getBuyerSeoIdByName(queryArr...)
  163. }
  164. }
  165. if len(finalList) > limit {
  166. finalList = finalList[:limit]
  167. }
  168. return finalList
  169. }
  170. // 根据企业名称获取seoid
  171. // query: company_name 根据名字匹配
  172. // query: _id 根据entid匹配
  173. func getWinnerSeoIdByName(winners ...string) (res []map[string]interface{}) {
  174. if len(winners) == 0 {
  175. return
  176. }
  177. winnerRes := elastic.Get("qyxy", "qyxy", fmt.Sprintf(`{"query":{"terms":{"_id":["%s"]}},"_source":[%s],"size":%d}`, strings.Join(winners, `","`), `"nseo_id","company_name"`, len(winners)))
  178. if winnerRes != nil && len(*winnerRes) > 0 {
  179. for _, m := range *winnerRes {
  180. name := gconv.String(m["company_name"])
  181. sid := gconv.String(m["nseo_id"])
  182. if name != "" && sid != "" {
  183. res = append(res, map[string]interface{}{
  184. "name": name,
  185. "seoId": sid,
  186. "url": fmt.Sprintf("/qy/%s.html", sid),
  187. })
  188. }
  189. }
  190. }
  191. return
  192. }
  193. // 根据企业名称获取seoid
  194. // query: company_name 根据名字匹配
  195. // query: _id 根据entid匹配
  196. func getWinnerSeoIdByNameNew(query string, fullData bool, winners ...string) (res []map[string]interface{}) {
  197. if len(winners) == 0 {
  198. return
  199. }
  200. var fields string = `"nseo_id","company_name","_id"`
  201. if fullData {
  202. fields = `"nseo_id","company_name","legal_person","capital","company_address","company_status"`
  203. }
  204. winnerMap := map[string]map[string]interface{}{}
  205. winnerRes := elastic.GetNoLimit(qyxy, qyxy, fmt.Sprintf(`{"query":{"terms":{"%s":["%s"]}},"_source":[%s],"size":%d}`, query, strings.Join(winners, `","`), fields, len(winners)))
  206. if winnerRes != nil && len(*winnerRes) > 0 {
  207. for _, m := range *winnerRes {
  208. name := gconv.String(m["company_name"])
  209. sid := gconv.String(m["nseo_id"])
  210. entId := gconv.String(m["_id"])
  211. if name != "" && sid != "" && entId != "" {
  212. row := map[string]interface{}{
  213. "name": name,
  214. "seoId": sid,
  215. "url": fmt.Sprintf("/qy/%s.html", sid),
  216. }
  217. if fullData {
  218. row["legal_person"] = m["legal_person"]
  219. row["capital"] = m["capital"]
  220. //if dataStamp := gconv.Int64(m["establish_date"]); dataStamp > 0 {
  221. // row["establish_date"] = gtime.New(dataStamp).Format("Y-m-d")
  222. //}
  223. //row["company_phone"] = m["company_phone"]
  224. row["address"] = m["company_address"]
  225. if state := gconv.String(m["company_status"]); state != "" {
  226. row["company_status"] = strings.Split(state, "(")[0]
  227. }
  228. }
  229. winnerMap[entId] = row
  230. }
  231. }
  232. }
  233. for _, winner := range winners {
  234. if m := winnerMap[winner]; m != nil {
  235. res = append(res, m)
  236. }
  237. }
  238. return
  239. }
  240. // 根据采购单位名字获取seoid
  241. func getBuyerSeoIdByNameNew(fullData bool, buyers ...string) (res []map[string]interface{}) {
  242. if len(buyers) == 0 {
  243. return
  244. }
  245. var fields string = `"seo_id","name"`
  246. if fullData {
  247. fields = `"seo_id","name","province","city","buyerclass"`
  248. }
  249. buyerMap := map[string]map[string]interface{}{}
  250. buyerRes := elastic.GetNoLimit("buyer", "buyer", fmt.Sprintf(`{"query":{"terms":{"buyer_name":["%s"]}},"_source":[%s],"size":%d}`, strings.Join(buyers, `","`), fields, len(buyers)))
  251. if buyerRes != nil && len(*buyerRes) > 0 {
  252. for _, m := range *buyerRes {
  253. name := gconv.String(m["name"])
  254. sid := gconv.String(m["seo_id"])
  255. if name != "" && sid != "" {
  256. row := map[string]interface{}{
  257. "name": name,
  258. "seoId": sid,
  259. "url": fmt.Sprintf("/dw/%s.html", sid),
  260. }
  261. if fullData {
  262. row["buyerclass"] = m["buyerclass"]
  263. row["area"] = m["province"]
  264. row["city"] = m["city"]
  265. }
  266. buyerMap[name] = row
  267. }
  268. }
  269. }
  270. for _, buyer := range buyers {
  271. if m := buyerMap[buyer]; m != nil {
  272. res = append(res, m)
  273. }
  274. }
  275. return
  276. }
  277. // 根据采购单位名字获取seoid
  278. func getBuyerSeoIdByName(buyer ...string) (res []map[string]interface{}) {
  279. if len(buyer) == 0 {
  280. return
  281. }
  282. buyerRes := elastic.GetNoLimit("buyer", "buyer", fmt.Sprintf(`{"query":{"terms":{"buyer_name":["%s"]}},"_source":[%s],"size":%d}`, strings.Join(buyer, `","`), `"seo_id","name"`, len(buyer)))
  283. if buyerRes != nil && len(*buyerRes) > 0 {
  284. for _, m := range *buyerRes {
  285. name := gconv.String(m["name"])
  286. sid := gconv.String(m["seo_id"])
  287. if name != "" && sid != "" {
  288. res = append(res, map[string]interface{}{
  289. "name": name,
  290. "seoId": sid,
  291. "url": fmt.Sprintf("/dw/%s.html", sid),
  292. })
  293. }
  294. }
  295. }
  296. return
  297. }
  298. // ContentRecommendation 实用内容推荐
  299. func ContentRecommendation() []KeyType {
  300. if bytes, err := redis.GetBytes(RedisNameNew, "contentRecommendation"); err == nil && bytes != nil {
  301. var rData []KeyType
  302. log.Println()
  303. if err := json.Unmarshal(*bytes, &rData); err != nil {
  304. log.Printf("[MANAGER-ERR]contentRecommendation GetData Error %v \n", err)
  305. return nil
  306. }
  307. return rData
  308. }
  309. columnCode, _ := config.Sysconfig["columnCode"].(map[string]interface{})
  310. jySchoolCode := qu.InterfaceToStr(columnCode["招投标攻略"])
  311. industryInfoCode := qu.InterfaceToStr(columnCode["行业资讯"])
  312. industryInfoUrl, _ := config.Sysconfig["industryInfoUrl"].(map[string]interface{})
  313. jySchoolUrl, _ := config.Sysconfig["jySchoolUrl"].(map[string]interface{})
  314. column, ok := mongodb.Find("column", map[string]interface{}{"$or": []map[string]interface{}{
  315. {"pid": "ztbgl"}, {"pid": "hyzx"}, {"pid": "bzzx"},
  316. }}, `{"i_order":1}`, "", false, -1, -1)
  317. dataMap := make(map[string][]KeyType)
  318. if ok && column != nil && len(*column) > 0 {
  319. for _, v := range *column {
  320. pid := qu.InterfaceToStr(v["pid"])
  321. code := qu.InterfaceToStr(v["s_columncode"])
  322. var v1 KeyType
  323. v1.Name = qu.InterfaceToStr(v["s_columnname"])
  324. if pid == jySchoolCode {
  325. v1.Url = fmt.Sprintf(qu.InterfaceToStr(jySchoolUrl["towUrl"]), code)
  326. } else if pid == industryInfoCode {
  327. v1.Url = fmt.Sprintf(qu.InterfaceToStr(industryInfoUrl["towUrl"]), code)
  328. } else if pid == "bzzx" {
  329. v1.Url = fmt.Sprintf("/helpCenter/catalog/%s", code)
  330. }
  331. dataMap[pid] = append(dataMap[pid], v1)
  332. }
  333. }
  334. var data []KeyType
  335. for _, v := range []string{jySchoolCode, industryInfoCode, "bzzx"} {
  336. if v1, ok1 := dataMap[v]; ok1 && v1 != nil {
  337. var d KeyType
  338. switch v {
  339. case jySchoolCode:
  340. d.Name = "招投标攻略"
  341. d.Url = qu.InterfaceToStr(jySchoolUrl["homeUrl"])
  342. d.SeedData = v1
  343. case industryInfoCode:
  344. d.Name = "行业资讯"
  345. d.Url = qu.InterfaceToStr(industryInfoUrl["homeUrl"])
  346. d.SeedData = v1
  347. case "bzzx":
  348. d.Name = "帮助中心"
  349. d.Url = "/helpCenter/index"
  350. d.SeedData = v1
  351. }
  352. data = append(data, d)
  353. }
  354. }
  355. if bytes, err := json.Marshal(data); err == nil && bytes != nil {
  356. _ = redis.PutBytes(RedisNameNew, "contentRecommendation", &bytes, 12*60*60)
  357. }
  358. return data
  359. }
  360. type Signal struct {
  361. Name string `json:"name"`
  362. Url string `json:"url"`
  363. UnLoginUrl string `json:"unLoginUrl"`
  364. Data []map[string]interface{} `json:"data"`
  365. }
  366. // 推荐标讯
  367. func RecommendationBeacon() []Signal {
  368. if bytes, err := redis.GetBytes(RedisNameNew, "recommendationBeacon"); err == nil && bytes != nil {
  369. var rData []Signal
  370. if err := json.Unmarshal(*bytes, &rData); err != nil {
  371. log.Printf("[MANAGER-ERR]recommendationBeacon GetData Error %v \n", err)
  372. return nil
  373. }
  374. return rData
  375. }
  376. var (
  377. now = time.Now()
  378. startTime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-7, now.Hour(), now.Minute(), now.Second(), 0, time.Local).Unix()) //最近7天
  379. endTime = fmt.Sprint(now.Unix())
  380. publishTime = fmt.Sprintf("%s_%s", startTime, endTime)
  381. )
  382. sy := sync.RWMutex{}
  383. wg := sync.WaitGroup{}
  384. var data, dataArr []Signal
  385. infoType := qu.ObjToMap(config.Seoconfig["infoTypeToLetter"])
  386. for _, v := range []string{"招标预告", "招标公告", "招标结果", "招标信用信息"} {
  387. wg.Add(1)
  388. go func(vst string) {
  389. defer wg.Done()
  390. var (
  391. list []map[string]interface{}
  392. )
  393. _, _, lists := bidsearch.GetPcBidSearchData("", "", "", publishTime, vst, "", "", "", "", "", "", "", "", 1, false, nil, bidSearch_field_1, "", false, false, "", 8, "")
  394. if lists != nil {
  395. for _, v1 := range *lists {
  396. v1["_id"] = encrypt.EncodeArticleId2ByCheck(v1["_id"].(string))
  397. delete(v1, "toptype")
  398. delete(v1, "s_subscopeclass")
  399. tmpdate := v1["publishtime"]
  400. v1["publishtime"] = qu.Int64All(tmpdate.(float64))
  401. if v1["budget"] != nil {
  402. v1["budget"] = ConversionMoeny(v1["budget"])
  403. } else if v1["bidamount"] != nil {
  404. v1["budget"] = ConversionMoeny(v1["bidamount"])
  405. }
  406. }
  407. list = *lists
  408. }
  409. var d Signal
  410. d.Name = vst
  411. d.UnLoginUrl = fmt.Sprintf("/list/stype/%s.html", (*infoType)[vst])
  412. d.Url = fmt.Sprintf("/jylab/supsearch/index.html?subtype=%s", vst)
  413. d.Data = list
  414. sy.Lock()
  415. dataArr = append(dataArr, d)
  416. sy.Unlock()
  417. }(v)
  418. }
  419. wg.Wait()
  420. for _, v := range []string{"招标预告", "招标公告", "招标结果", "招标信用信息"} {
  421. for _, v1 := range dataArr {
  422. if v == v1.Name {
  423. data = append(data, v1)
  424. }
  425. }
  426. }
  427. if bytes, err := json.Marshal(data); err == nil && bytes != nil {
  428. _ = redis.PutBytes(RedisNameNew, "recommendationBeacon", &bytes, 5*60)
  429. }
  430. return data
  431. }
  432. type BuyerList struct {
  433. Name string `json:"name"`
  434. Url string `json:"url"`
  435. }
  436. // 热门采购单位
  437. func HotBuyerList() []*BuyerList {
  438. // 取缓存
  439. cache, err := GetHotCache(config.HotBuyerConfig.CacheKey)
  440. if err == nil && cache != nil && len(cache) > 0 {
  441. return cache
  442. }
  443. // 查数据
  444. //data := getEntBaseInfo(IdentityTypeBuyer, config.HotBuyerConfig.Limit)
  445. data := GetHotWinnerBuyer(IdentityTypeBuyer, config.HotBuyerConfig.Limit)
  446. if data == nil || len(data) == 0 {
  447. return nil
  448. }
  449. var buyerList []*BuyerList
  450. for _, b := range data {
  451. name := qu.ObjToString(b["name"])
  452. url := qu.InterfaceToStr(b["url"])
  453. if name != "" && url != "" {
  454. //idEncode := encrypt.EncodeArticleId2ByCheck(buyerId)
  455. buyerList = append(buyerList, &BuyerList{
  456. Name: name,
  457. Url: url,
  458. })
  459. }
  460. }
  461. //存缓存
  462. go PutHotCache(config.HotBuyerConfig.CacheKey, config.HotBuyerConfig.CacheTimeout, buyerList)
  463. return buyerList
  464. }
  465. func GetIncludedInfo() map[string]interface{} {
  466. if bytes, err := redis.GetBytes(RedisNameNew, "jyIncludedInfo"); err == nil && bytes != nil {
  467. rData := map[string]interface{}{}
  468. if err := json.Unmarshal(*bytes, &rData); err != nil {
  469. log.Printf("[MANAGER-ERR]jyIncludedInfo GetData Error %v \n", err)
  470. return nil
  471. }
  472. return rData
  473. }
  474. data := public.BaseMysql.SelectBySql(`select bid,project,ent,buyer,bid_day_update,bid_field,field_accuracy,create_time from included_info order by create_time desc limit 1`)
  475. if data == nil || len(*data) <= 0 {
  476. return nil
  477. }
  478. info := (*data)[0]
  479. //招标信息的数值
  480. bid := qu.Int64All(info["bid"])
  481. Bid, BidUnit := formdataNum(bid)
  482. //招标采购项目的数值
  483. project := qu.Int64All(info["project"])
  484. Project, ProjectUnit := formdataNum(project)
  485. //企业数据库的数值
  486. ent := qu.Int64All(info["ent"])
  487. Ent, EntUnit := formdataNum(ent)
  488. //采购单位库的数值
  489. buyer := qu.Int64All(info["buyer"])
  490. Buyer, BuyerUnit := formdataNum(buyer)
  491. //每日更新招标信息的数值
  492. bid_day_update := qu.Int64All(info["bid_day_update"])
  493. BidDayUpdate, BidDayUpdateUnit := formdataNum(bid_day_update)
  494. mdata, ok := public.MQFW.Find("swordfish_index", map[string]interface{}{
  495. "i_push": map[string]interface{}{
  496. "$exists": true,
  497. },
  498. }, `{"_id":-1}`, `{"i_push":1}`, false, 0, 1)
  499. i_push := 0
  500. if mdata != nil && ok && len(*mdata) > 0 {
  501. swordData := (*mdata)[0]
  502. i_push = qu.IntAll(swordData["i_push"])
  503. }
  504. Push, PushUnit := formdataNum(int64(i_push))
  505. m := map[string]interface{}{
  506. "bid": Bid,
  507. "bidUnit": BidUnit,
  508. "project": Project,
  509. "projectUnit": ProjectUnit,
  510. "ent": Ent,
  511. "entUnit": EntUnit,
  512. "buyer": Buyer,
  513. "buyerUnit": BuyerUnit,
  514. "bidDayUpdate": BidDayUpdate,
  515. "bidDayUpdateUnit": BidDayUpdateUnit,
  516. "push": Push,
  517. "pushUnit": PushUnit,
  518. }
  519. if bytes, err := json.Marshal(m); err == nil && bytes != nil {
  520. _ = redis.PutBytes(RedisNameNew, "jyIncludedInfo", &bytes, 2*60*60)
  521. }
  522. return m
  523. }
  524. func NewIndexbids(session *httpsession.Session, r *http.Request) []map[string]interface{} {
  525. if bytes, err := redis.GetBytes(RedisNameNew, "pcIndexNewBids"); err == nil && bytes != nil {
  526. rData := []map[string]interface{}{}
  527. if err := json.Unmarshal(*bytes, &rData); err != nil {
  528. log.Printf("[MANAGER-ERR]jyNewIndexbids GetData Error %v \n", err)
  529. return rData
  530. }
  531. return rData
  532. }
  533. /*
  534. userInfo := jy.GetVipState(session, *config.Middleground, "")
  535. so := NewSearchOptimize("", "", "", "", "招标预告,招标公告,招标结果,招标信用信息", "", "", "title", "", "", "", "", "", "", "", "", "", "PC", "", 0, 50, 0, 0, 0, *userInfo, true, r)
  536. so.DefaultSearchParamsAuto()
  537. //缓存数据
  538. _, total, _ := so.GetBidSearchList(true)
  539. data.Count = total
  540. */
  541. // p397 收回查看拟建权限
  542. var (
  543. now = time.Now()
  544. startTime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-7, now.Hour(), now.Minute(), now.Second(), 0, time.Local).Unix()) //最近7天
  545. endTime = fmt.Sprint(now.Unix())
  546. publishTime = fmt.Sprintf("%s_%s", startTime, endTime)
  547. )
  548. _, _, lists := bidsearch.GetPcBidSearchData("", "", "", publishTime, "招标预告,招标公告,招标结果,招标信用信息", "", "", "", "", "", "", "", "", 1, false, nil, bidSearch_field_1, "", false, false, "", 8, "")
  549. if lists != nil {
  550. for _, v1 := range *lists {
  551. v1["_id"] = encrypt.EncodeArticleId2ByCheck(v1["_id"].(string))
  552. delete(v1, "toptype")
  553. delete(v1, "s_subscopeclass")
  554. tmpdate := v1["publishtime"]
  555. v1["publishtime"] = time.Unix(qu.Int64All(tmpdate.(float64)), 0).Format(date.Date_Short_Layout)
  556. if v1["budget"] != nil {
  557. v1["budget"] = ConversionMoeny(v1["budget"])
  558. } else if v1["bidamount"] != nil {
  559. v1["budget"] = ConversionMoeny(v1["bidamount"])
  560. }
  561. }
  562. if bytes, err := json.Marshal(*lists); err == nil && bytes != nil {
  563. _ = redis.PutBytes(RedisNameNew, "pcIndexNewBids", &bytes, 5*60)
  564. }
  565. return *lists
  566. }
  567. return nil
  568. }
  569. // 格式输出数据
  570. // 亿亿、万亿、亿、万 只有一位的时候保留1位小数点 两位及以上不保留 1.1亿 11亿
  571. func formdataNum(num int64) (floatNum float64, unit string) {
  572. s_num := strconv.Itoa(int(num))
  573. len_m := len(s_num)
  574. m := ""
  575. indexArr := []int{17, 13, 9, 5}
  576. unitArr := []string{"亿亿", "万亿", "亿", "万"}
  577. for k, v := range indexArr {
  578. if len_m > v {
  579. if qu.IntAll(s_num[len_m-(v-1):len_m-(v-2)]) >= 5 {
  580. if qu.IntAll(s_num[0:len_m-(v-1)])+1 == 10 {
  581. //满10 进 1
  582. m1, _ := strconv.Atoi(s_num[0 : len_m-(v-1)])
  583. m = strconv.Itoa(m1 + 1)
  584. } else {
  585. //满 万 进1 单位
  586. if qu.IntAll(s_num[0:len_m-(v-1)])+1 == 10000 {
  587. m = "1"
  588. unit = unitArr[k-1]
  589. } else {
  590. m = strconv.Itoa(qu.IntAll(s_num[0:len_m-(v-1)]) + 1)
  591. }
  592. }
  593. // log.Println("m1:", m)
  594. } else {
  595. m = s_num[0 : len_m-(v-1)]
  596. // log.Println("m2:", m)
  597. }
  598. } else if len_m == v { //
  599. if qu.IntAll(s_num[len_m-(v-2):len_m-(v-3)]) >= 5 {
  600. m = s_num[0 : len_m-(v-1)]
  601. //满10 进 1
  602. if qu.IntAll(s_num[len_m-(v-1):len_m-(v-2)])+1 == 10 {
  603. m1, _ := strconv.Atoi(s_num[0 : len_m-(v-1)])
  604. m = strconv.Itoa(m1 + 1)
  605. } else {
  606. m += "." + strconv.Itoa(qu.IntAll(s_num[len_m-(v-1):len_m-(v-2)])+1)
  607. }
  608. // log.Println("m3:", m)
  609. } else {
  610. m = s_num[0 : len_m-(v-1)]
  611. m += "." + s_num[len_m-(v-1):len_m-(v-2)]
  612. // log.Println("m4:", m)
  613. }
  614. }
  615. if m != "" {
  616. if unit == "" {
  617. unit = unitArr[k]
  618. }
  619. break
  620. }
  621. }
  622. if m == "" {
  623. m = s_num
  624. }
  625. //string 转float
  626. floatNum, _ = strconv.ParseFloat(m, 64)
  627. return floatNum, unit
  628. }