classificationTag.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  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() []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. return rData
  59. }
  60. keysMap := getkeysMap() //热门行业
  61. if bytes, err := json.Marshal(keysMap); err == nil && bytes != nil {
  62. _ = redis.PutBytes(RedisNameNew, "pcIndexHotIndustry", &bytes, 2*60*60)
  63. }
  64. return keysMap
  65. }
  66. // 最新更新的200中标企业
  67. func GetWinnerInfo() (data []*BuyerList) {
  68. // 取缓存
  69. cache, err := GetHotCache(config.HotWinnerConfig.CacheKey)
  70. if err == nil && cache != nil && len(cache) > 0 {
  71. return cache
  72. }
  73. // 没取到缓存查数据
  74. rs := GetHotWinnerBuyer(IdentityTypeWinner, config.HotWinnerConfig.Limit)
  75. //关联中标企业
  76. if rs == nil || len(rs) == 0 {
  77. return
  78. }
  79. for _, v := range rs {
  80. var vs BuyerList
  81. vs.Name = qu.InterfaceToStr(v["name"])
  82. vs.Url = qu.InterfaceToStr(v["url"])
  83. data = append(data, &vs)
  84. }
  85. // 存缓存
  86. go PutHotCache(config.HotWinnerConfig.CacheKey, config.HotWinnerConfig.CacheTimeout, data)
  87. return
  88. }
  89. // PutHotCache 热门采购单位、中标单位存缓存
  90. func PutHotCache(redisKey string, redisTimeout int, list []*BuyerList) {
  91. b, err := json.Marshal(list)
  92. if err != nil {
  93. log.Printf("保存缓存 序列化异常,data:%s,err:%s\n", list, err.Error())
  94. return
  95. }
  96. if err = redis.PutBytes("seoCache", redisKey, &b, redisTimeout); err != nil {
  97. log.Printf("保存缓存 redis 异常,key:%s,err:%s\n", redisKey, err.Error())
  98. }
  99. }
  100. // GetHotCache 热门采购单位、中标单位取缓存
  101. func GetHotCache(redisKey string) (list []*BuyerList, err error) {
  102. redisByte, err := redis.GetBytes("seoCache", redisKey)
  103. if err != nil || redisByte == nil || len(*redisByte) == 0 {
  104. return list, err
  105. }
  106. err = json.Unmarshal(*redisByte, &list)
  107. if err != nil {
  108. log.Println(fmt.Sprintf("读取缓存 序列化异常,err:%s", err.Error()))
  109. return nil, err
  110. }
  111. return list, nil
  112. }
  113. // 获取最新的中标单位
  114. // identityType : 0 采购单位 1-中标单位
  115. // limit: 数量
  116. func getEntBaseInfo(identityType, limit int) *[]map[string]interface{} {
  117. 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 ?"
  118. return public.GlobalCommonMysql.SelectBySql(q, identityType, limit)
  119. }
  120. func GetHotWinnerBuyer(identityType, limit int) []map[string]interface{} {
  121. isWinner := identityType == 1
  122. queryTotal := gconv.Int(gconv.Float64(limit) * 1.5)
  123. var querySql string
  124. if isWinner {
  125. 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)
  126. } else {
  127. querySql = fmt.Sprintf(`{"query": {"bool": {"must": [{"exists": {"field": "buyer"}}]}},"_source":["buyer","s_winner","entidlist"],"sort":[{"lasttime": "desc"}],"size": %d}`, queryTotal)
  128. }
  129. getData := elastic.GetNoLimit("projectset", "projectset", querySql)
  130. var finalList []map[string]interface{}
  131. if getData != nil && len(*getData) > 0 {
  132. queryMap := make(map[string]bool)
  133. if isWinner { //采购关联企业 校验正确性
  134. var queryArr []string
  135. for _, v := range *getData {
  136. if len(queryArr) < queryTotal {
  137. for _, name := range gconv.Strings(v["entidlist"]) {
  138. if name == "" || name == "-" {
  139. continue
  140. }
  141. if queryMap[name] {
  142. continue
  143. }
  144. queryArr = append(queryArr, name)
  145. queryMap[name] = true
  146. if len(queryArr) == queryTotal {
  147. break
  148. }
  149. }
  150. }
  151. }
  152. finalList = getWinnerSeoIdByName(queryArr...)
  153. } else {
  154. var queryArr []string
  155. for _, v := range *getData {
  156. buyerName := gconv.String(v["buyer"])
  157. if queryMap[buyerName] {
  158. continue
  159. }
  160. queryArr = append(queryArr, buyerName)
  161. queryMap[buyerName] = true
  162. }
  163. finalList = getBuyerSeoIdByName(queryArr...)
  164. }
  165. }
  166. if len(finalList) > limit {
  167. finalList = finalList[:limit]
  168. }
  169. return finalList
  170. }
  171. // 根据企业名称获取seoid
  172. // query: company_name 根据名字匹配
  173. // query: _id 根据entid匹配
  174. func getWinnerSeoIdByName(winners ...string) (res []map[string]interface{}) {
  175. if len(winners) == 0 {
  176. return
  177. }
  178. winnerRes := elastic.Get("qyxy", "qyxy", fmt.Sprintf(`{"query":{"terms":{"_id":["%s"]}},"_source":[%s],"size":%d}`, strings.Join(winners, `","`), `"nseo_id","company_name"`, len(winners)))
  179. if winnerRes != nil && len(*winnerRes) > 0 {
  180. for _, m := range *winnerRes {
  181. name := gconv.String(m["company_name"])
  182. sid := gconv.String(m["nseo_id"])
  183. if name != "" && sid != "" {
  184. res = append(res, map[string]interface{}{
  185. "name": name,
  186. "seoId": sid,
  187. "url": fmt.Sprintf("/qy/%s.html", sid),
  188. })
  189. }
  190. }
  191. }
  192. return
  193. }
  194. // 根据采购单位名字获取seoid
  195. func getBuyerSeoIdByName(buyer ...string) (res []map[string]interface{}) {
  196. if len(buyer) == 0 {
  197. return
  198. }
  199. buyerRes := elastic.GetNoLimit("buyer", "buyer", fmt.Sprintf(`{"query":{"terms":{"buyer_name":["%s"]}},"_source":[%s],"size":%d}`, strings.Join(buyer, `","`), `"seo_id","name"`, len(buyer)))
  200. if buyerRes != nil && len(*buyerRes) > 0 {
  201. for _, m := range *buyerRes {
  202. name := gconv.String(m["name"])
  203. sid := gconv.String(m["seo_id"])
  204. if name != "" && sid != "" {
  205. res = append(res, map[string]interface{}{
  206. "name": name,
  207. "seoId": sid,
  208. "url": fmt.Sprintf("/dw/%s.html", sid),
  209. })
  210. }
  211. }
  212. }
  213. return
  214. }
  215. // ContentRecommendation 实用内容推荐
  216. func ContentRecommendation() []KeyType {
  217. if bytes, err := redis.GetBytes(RedisNameNew, "contentRecommendation"); err == nil && bytes != nil {
  218. var rData []KeyType
  219. log.Println()
  220. if err := json.Unmarshal(*bytes, &rData); err != nil {
  221. log.Printf("[MANAGER-ERR]contentRecommendation GetData Error %v \n", err)
  222. return nil
  223. }
  224. return rData
  225. }
  226. columnCode, _ := config.Sysconfig["columnCode"].(map[string]interface{})
  227. jySchoolCode := qu.InterfaceToStr(columnCode["招投标攻略"])
  228. industryInfoCode := qu.InterfaceToStr(columnCode["行业资讯"])
  229. industryInfoUrl, _ := config.Sysconfig["industryInfoUrl"].(map[string]interface{})
  230. jySchoolUrl, _ := config.Sysconfig["jySchoolUrl"].(map[string]interface{})
  231. column, ok := mongodb.Find("column", map[string]interface{}{"$or": []map[string]interface{}{
  232. {"pid": "ztbgl"}, {"pid": "hyzx"}, {"pid": "bzzx"},
  233. }}, `{"i_order":1}`, "", false, -1, -1)
  234. dataMap := make(map[string][]KeyType)
  235. if ok && column != nil && len(*column) > 0 {
  236. for _, v := range *column {
  237. pid := qu.InterfaceToStr(v["pid"])
  238. code := qu.InterfaceToStr(v["s_columncode"])
  239. var v1 KeyType
  240. v1.Name = qu.InterfaceToStr(v["s_columnname"])
  241. if pid == jySchoolCode {
  242. v1.Url = fmt.Sprintf(qu.InterfaceToStr(jySchoolUrl["towUrl"]), code)
  243. } else if pid == industryInfoCode {
  244. v1.Url = fmt.Sprintf(qu.InterfaceToStr(industryInfoUrl["towUrl"]), code)
  245. } else if pid == "bzzx" {
  246. v1.Url = fmt.Sprintf("/helpCenter/catalog/%s", code)
  247. }
  248. dataMap[pid] = append(dataMap[pid], v1)
  249. }
  250. }
  251. var data []KeyType
  252. for _, v := range []string{jySchoolCode, industryInfoCode, "bzzx"} {
  253. if v1, ok1 := dataMap[v]; ok1 && v1 != nil {
  254. var d KeyType
  255. switch v {
  256. case jySchoolCode:
  257. d.Name = "招投标攻略"
  258. d.Url = qu.InterfaceToStr(jySchoolUrl["homeUrl"])
  259. d.SeedData = v1
  260. case industryInfoCode:
  261. d.Name = "行业资讯"
  262. d.Url = qu.InterfaceToStr(industryInfoUrl["homeUrl"])
  263. d.SeedData = v1
  264. case "bzzx":
  265. d.Name = "帮助中心"
  266. d.Url = "/helpCenter/index"
  267. d.SeedData = v1
  268. }
  269. data = append(data, d)
  270. }
  271. }
  272. if bytes, err := json.Marshal(data); err == nil && bytes != nil {
  273. _ = redis.PutBytes(RedisNameNew, "contentRecommendation", &bytes, 12*60*60)
  274. }
  275. return data
  276. }
  277. type Signal struct {
  278. Name string `json:"name"`
  279. Url string `json:"url"`
  280. UnLoginUrl string `json:"unLoginUrl"`
  281. Data []map[string]interface{} `json:"data"`
  282. }
  283. // 推荐标讯
  284. func RecommendationBeacon() []Signal {
  285. if bytes, err := redis.GetBytes(RedisNameNew, "recommendationBeacon"); err == nil && bytes != nil {
  286. var rData []Signal
  287. if err := json.Unmarshal(*bytes, &rData); err != nil {
  288. log.Printf("[MANAGER-ERR]recommendationBeacon GetData Error %v \n", err)
  289. return nil
  290. }
  291. return rData
  292. }
  293. sy := sync.RWMutex{}
  294. wg := sync.WaitGroup{}
  295. var data, dataArr []Signal
  296. infoType := qu.ObjToMap(config.Seoconfig["infoTypeToLetter"])
  297. for _, v := range []string{"招标预告", "招标公告", "招标结果", "招标信用信息"} {
  298. wg.Add(1)
  299. go func(vst string) {
  300. defer wg.Done()
  301. var list []map[string]interface{}
  302. _, _, lists := bidsearch.GetPcBidSearchData("", "", "", "", vst, "", "", "", "", "", "", "", "", 1, false, nil, bidSearch_field_1, "", false, false, "", 8, "")
  303. if lists != nil {
  304. for _, v1 := range *lists {
  305. v1["_id"] = encrypt.CommonEncodeArticle("content", v1["_id"].(string))
  306. delete(v1, "toptype")
  307. delete(v1, "s_subscopeclass")
  308. tmpdate := v1["publishtime"]
  309. v1["publishtime"] = qu.Int64All(tmpdate.(float64))
  310. if v1["budget"] != nil {
  311. v1["budget"] = ConversionMoeny(v1["budget"])
  312. } else if v1["bidamount"] != nil {
  313. v1["budget"] = ConversionMoeny(v1["bidamount"])
  314. }
  315. }
  316. list = *lists
  317. }
  318. var d Signal
  319. d.Name = vst
  320. d.UnLoginUrl = fmt.Sprintf("/list/stype/%s.html", (*infoType)[vst])
  321. d.Url = fmt.Sprintf("/jylab/supsearch/index.html?subtype=%s", vst)
  322. d.Data = list
  323. sy.Lock()
  324. dataArr = append(dataArr, d)
  325. sy.Unlock()
  326. }(v)
  327. }
  328. wg.Wait()
  329. for _, v := range []string{"招标预告", "招标公告", "招标结果", "招标信用信息"} {
  330. for _, v1 := range dataArr {
  331. if v == v1.Name {
  332. data = append(data, v1)
  333. }
  334. }
  335. }
  336. if bytes, err := json.Marshal(data); err == nil && bytes != nil {
  337. _ = redis.PutBytes(RedisNameNew, "recommendationBeacon", &bytes, 5*60)
  338. }
  339. return data
  340. }
  341. type BuyerList struct {
  342. Name string `json:"name"`
  343. Url string `json:"url"`
  344. }
  345. // 热门采购单位
  346. func HotBuyerList() []*BuyerList {
  347. // 取缓存
  348. cache, err := GetHotCache(config.HotBuyerConfig.CacheKey)
  349. if err == nil && cache != nil && len(cache) > 0 {
  350. return cache
  351. }
  352. // 查数据
  353. //data := getEntBaseInfo(IdentityTypeBuyer, config.HotBuyerConfig.Limit)
  354. data := GetHotWinnerBuyer(IdentityTypeBuyer, config.HotBuyerConfig.Limit)
  355. if data == nil || len(data) == 0 {
  356. return nil
  357. }
  358. var buyerList []*BuyerList
  359. for _, b := range data {
  360. name := qu.ObjToString(b["name"])
  361. url := qu.InterfaceToStr(b["url"])
  362. if name != "" && url != "" {
  363. //idEncode := encrypt.EncodeArticleId2ByCheck(buyerId)
  364. buyerList = append(buyerList, &BuyerList{
  365. Name: name,
  366. Url: url,
  367. })
  368. }
  369. }
  370. //存缓存
  371. go PutHotCache(config.HotBuyerConfig.CacheKey, config.HotBuyerConfig.CacheTimeout, buyerList)
  372. return buyerList
  373. }
  374. func GetIncludedInfo() map[string]interface{} {
  375. if bytes, err := redis.GetBytes(RedisNameNew, "jyIncludedInfo"); err == nil && bytes != nil {
  376. rData := map[string]interface{}{}
  377. if err := json.Unmarshal(*bytes, &rData); err != nil {
  378. log.Printf("[MANAGER-ERR]jyIncludedInfo GetData Error %v \n", err)
  379. return nil
  380. }
  381. return rData
  382. }
  383. 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`)
  384. if data == nil || len(*data) <= 0 {
  385. return nil
  386. }
  387. info := (*data)[0]
  388. //招标信息的数值
  389. bid := qu.Int64All(info["bid"])
  390. Bid, BidUnit := formdataNum(bid)
  391. //招标采购项目的数值
  392. project := qu.Int64All(info["project"])
  393. Project, ProjectUnit := formdataNum(project)
  394. //企业数据库的数值
  395. ent := qu.Int64All(info["ent"])
  396. Ent, EntUnit := formdataNum(ent)
  397. //采购单位库的数值
  398. buyer := qu.Int64All(info["buyer"])
  399. Buyer, BuyerUnit := formdataNum(buyer)
  400. //每日更新招标信息的数值
  401. bid_day_update := qu.Int64All(info["bid_day_update"])
  402. BidDayUpdate, BidDayUpdateUnit := formdataNum(bid_day_update)
  403. mdata, ok := public.MQFW.Find("swordfish_index", map[string]interface{}{
  404. "i_push": map[string]interface{}{
  405. "$exists": true,
  406. },
  407. }, `{"_id":-1}`, `{"i_push":1}`, false, 0, 1)
  408. i_push := 0
  409. if mdata != nil && ok && len(*mdata) > 0 {
  410. swordData := (*mdata)[0]
  411. i_push = qu.IntAll(swordData["i_push"])
  412. }
  413. Push, PushUnit := formdataNum(int64(i_push))
  414. m := map[string]interface{}{
  415. "bid": Bid,
  416. "bidUnit": BidUnit,
  417. "project": Project,
  418. "projectUnit": ProjectUnit,
  419. "ent": Ent,
  420. "entUnit": EntUnit,
  421. "buyer": Buyer,
  422. "buyerUnit": BuyerUnit,
  423. "bidDayUpdate": BidDayUpdate,
  424. "bidDayUpdateUnit": BidDayUpdateUnit,
  425. "push": Push,
  426. "pushUnit": PushUnit,
  427. }
  428. if bytes, err := json.Marshal(m); err == nil && bytes != nil {
  429. _ = redis.PutBytes(RedisNameNew, "jyIncludedInfo", &bytes, 2*60*60)
  430. }
  431. return m
  432. }
  433. func NewIndexbids(session *httpsession.Session, r *http.Request) []map[string]interface{} {
  434. if bytes, err := redis.GetBytes(RedisNameNew, "jyNewIndexbids"); err == nil && bytes != nil {
  435. rData := []map[string]interface{}{}
  436. if err := json.Unmarshal(*bytes, &rData); err != nil {
  437. log.Printf("[MANAGER-ERR]jyNewIndexbids GetData Error %v \n", err)
  438. return rData
  439. }
  440. return rData
  441. }
  442. /*
  443. userInfo := jy.GetVipState(session, *config.Middleground, "")
  444. so := NewSearchOptimize("", "", "", "", "招标预告,招标公告,招标结果,招标信用信息", "", "", "title", "", "", "", "", "", "", "", "", "", "PC", "", 0, 50, 0, 0, 0, *userInfo, true, r)
  445. so.DefaultSearchParamsAuto()
  446. //缓存数据
  447. _, total, _ := so.GetBidSearchList(true)
  448. data.Count = total
  449. */
  450. // p397 收回查看拟建权限
  451. _, _, lists := bidsearch.GetPcBidSearchData("", "", "", "", "招标预告,招标公告,招标结果,招标信用信息", "", "", "", "", "", "", "", "", 1, false, nil, bidSearch_field_1, "", false, false, "", 8, "")
  452. if lists != nil {
  453. for _, v1 := range *lists {
  454. v1["_id"] = encrypt.CommonEncodeArticle("content", v1["_id"].(string))
  455. delete(v1, "toptype")
  456. delete(v1, "s_subscopeclass")
  457. tmpdate := v1["publishtime"]
  458. v1["publishtime"] = time.Unix(qu.Int64All(tmpdate.(float64)), 0).Format(date.Date_Short_Layout)
  459. if v1["budget"] != nil {
  460. v1["budget"] = ConversionMoeny(v1["budget"])
  461. } else if v1["bidamount"] != nil {
  462. v1["budget"] = ConversionMoeny(v1["bidamount"])
  463. }
  464. }
  465. if bytes, err := json.Marshal(*lists); err == nil && bytes != nil {
  466. _ = redis.PutBytes(RedisNameNew, "jyNewIndexbids", &bytes, 5*60)
  467. }
  468. return *lists
  469. }
  470. return nil
  471. }
  472. // 格式输出数据
  473. // 亿亿、万亿、亿、万 只有一位的时候保留1位小数点 两位及以上不保留 1.1亿 11亿
  474. func formdataNum(num int64) (floatNum float64, unit string) {
  475. s_num := strconv.Itoa(int(num))
  476. len_m := len(s_num)
  477. m := ""
  478. indexArr := []int{17, 13, 9, 5}
  479. unitArr := []string{"亿亿", "万亿", "亿", "万"}
  480. for k, v := range indexArr {
  481. if len_m > v {
  482. if qu.IntAll(s_num[len_m-(v-1):len_m-(v-2)]) >= 5 {
  483. if qu.IntAll(s_num[0:len_m-(v-1)])+1 == 10 {
  484. //满10 进 1
  485. m1, _ := strconv.Atoi(s_num[0 : len_m-(v-1)])
  486. m = strconv.Itoa(m1 + 1)
  487. } else {
  488. //满 万 进1 单位
  489. if qu.IntAll(s_num[0:len_m-(v-1)])+1 == 10000 {
  490. m = "1"
  491. unit = unitArr[k-1]
  492. } else {
  493. m = strconv.Itoa(qu.IntAll(s_num[0:len_m-(v-1)]) + 1)
  494. }
  495. }
  496. // log.Println("m1:", m)
  497. } else {
  498. m = s_num[0 : len_m-(v-1)]
  499. // log.Println("m2:", m)
  500. }
  501. } else if len_m == v { //
  502. if qu.IntAll(s_num[len_m-(v-2):len_m-(v-3)]) >= 5 {
  503. m = s_num[0 : len_m-(v-1)]
  504. //满10 进 1
  505. if qu.IntAll(s_num[len_m-(v-1):len_m-(v-2)])+1 == 10 {
  506. m1, _ := strconv.Atoi(s_num[0 : len_m-(v-1)])
  507. m = strconv.Itoa(m1 + 1)
  508. } else {
  509. m += "." + strconv.Itoa(qu.IntAll(s_num[len_m-(v-1):len_m-(v-2)])+1)
  510. }
  511. // log.Println("m3:", m)
  512. } else {
  513. m = s_num[0 : len_m-(v-1)]
  514. m += "." + s_num[len_m-(v-1):len_m-(v-2)]
  515. // log.Println("m4:", m)
  516. }
  517. }
  518. if m != "" {
  519. if unit == "" {
  520. unit = unitArr[k]
  521. }
  522. break
  523. }
  524. }
  525. if m == "" {
  526. m = s_num
  527. }
  528. //string 转float
  529. floatNum, _ = strconv.ParseFloat(m, 64)
  530. return floatNum, unit
  531. }