package front
import (
"encoding/base64"
"encoding/json"
"fmt"
"html/template"
"jfw/config"
"jfw/jylabutil"
"jfw/jyutil"
"jfw/public"
"jfw/wx"
"log"
"math/rand"
. "mongodb"
"net/url"
"qfw/util"
"qfw/util/elastic"
"qfw/util/redis"
"reflect"
"regexp"
"strconv"
"strings"
"sync"
"time"
"qfw/util/jy"
"github.com/go-xweb/httpsession"
"github.com/go-xweb/xweb"
. "github.com/thinxer/go-word2vec"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)
const (
pc_pageSize = 50 //招标搜索分页--每页显示数量
pc_maxPageNum = 10 //招标搜索分页--最大页数
wx_maxPageNum = 20
wx_pageSize = 50
bidSearch_field_1 = `"_id","title","publishtime","toptype","subtype","type","area","city","s_subscopeclass","bidamount","budget","buyerclass"`
bidSearch_field = bidSearch_field_1 + `,"bidopentime","winner","buyer","projectname","projectcode","projectinfo"`
bidSearch_sort = `{"publishtime":-1}`
)
var M *Model
var recomKWChan chan bool = make(chan bool, 1)
var listlock = &sync.Mutex{}
func init() {
M, _ = Load("./zb.bin")
}
//剑鱼标讯推送三级页点赞暂弃 改成剑鱼标讯实验室点赞功能
func (m *Front) Praise() error {
defer util.Catch()
var flag = "F"
var praiseflag = true
thistype := m.GetString("type")
uod := m.GetString("uod")
util.Try(func() {
pdata, _ := mongodb.FindOneByField("praise", `{"s_type":"`+thistype+`"}`, `{"s_no":1}`)
if len(*pdata) != 0 {
if uod == "U" {
praiseflag = mongodb.Update("praise", `{"s_type":"`+thistype+`"}`, `{ "$inc" : { "s_no" : 1 }}`, false, false)
} else {
praiseflag = mongodb.Update("praise", `{"s_type":"`+thistype+`"}`, `{ "$inc" : { "s_no" : -1 }}`, false, false)
}
if praiseflag {
flag = "T"
}
}
}, func(e interface{}) {
log.Println("剑鱼标讯实验室点赞出错", e)
})
m.ServeJson(map[string]interface{}{
"flag": flag,
})
return nil
}
//剑鱼标讯pc首页-统计
func (m *Front) NewSordfishC() error {
var shareid = m.GetString("id")
if len(shareid) == 0 {
shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jysy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9))
} else {
redis.Del("other", "jypcindex")
}
m.T["logid"] = config.Seoconfig["jysy"].(string)
m.T["shareid"] = se.EncodeString(shareid)
if ret := redis.Get("other", "jypcindex"); ret != nil {
return m.SetBody([]byte(ret.(string)))
} else {
m.DisableHttpCache()
content, _ := m.Render4Cache("/pc/index.html", &m.T)
redis.Put("other", "jypcindex", string(content), 60*60*2)
return m.SetBody(content)
}
}
//剑鱼标讯pc首页
func (m *Front) NewSordfish() error {
ispc, _ := m.GetInteger("ispc")
var shareid = m.GetString("id")
if len(shareid) == 0 {
shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jysy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9))
} else {
redis.Del("other", "jypcindex")
}
m.T["logid"] = config.Seoconfig["jysy"].(string)
m.T["shareid"] = se.EncodeString(shareid)
m.T["activestart"] = config.ActiveConfig.DoubleEleven.Active_Start
m.T["activeend"] = config.ActiveConfig.DoubleEleven.Active_End
regex, _ := regexp.Compile("(Android|Mobile)")
if ispc == 0 && len(regex.FindAllString(m.Header("User-Agent"), -1)) > 0 {
m.T["s_m_openid"] = util.ObjToString(m.GetSession("s_m_openid"))
m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
m.T["nickname"] = util.ObjToString(m.GetSession("s_nickname"))
m.T["avatar"] = util.ObjToString(m.GetSession("s_avatar"))
return m.Render("/pc/mobileindex.html", &m.T)
} else {
if ret := redis.Get("other", "jypcindex"); ret != nil {
return m.SetBody([]byte(ret.(string)))
} else {
m.T["live_Preheat_Start"] = config.ActiveConfig.Live_Preheat_Start
m.T["live_Active_End"] = config.ActiveConfig.Live_Active_End
content, _ := m.Render4Cache("/pc/index.html", &m.T)
redis.Put("other", "jypcindex", string(content), 60*60*2)
return m.SetBody(content)
}
}
return m.Render("/pc/index.html", &m.T)
}
func structureLastBidsHtml(lastBidNews *[]map[string]interface{}) (string, string) {
var tmp int = 0
var olCount int = 0
var lbnHtml string = ""
var olHtml string = `
`
for i := 0; i < len(*lastBidNews); i++ {
lastBidNew := (*lastBidNews)[i]
if tmp == 0 {
olHtml += ``
olCount++
}
tmp++
if tmp == 1 {
lbnHtml += ``
}
lbnHtml += ``
area, _ := lastBidNew["area"].(string)
area = strings.TrimSpace(area)
finalType, _ := lastBidNew["subtype"].(string)
if finalType == "" {
finalType = util.ObjToString(lastBidNew["toptype"])
}
if finalType == "" {
finalType = util.ObjToString(lastBidNew["type"])
if finalType == "bid" {
finalType = "中标"
} else if finalType == "tender" {
finalType = "招标"
} else {
finalType = ""
}
}
industry := util.ObjToString(lastBidNew["industry"])
stpadd, areaadd, induadd := classify(finalType, area, industry)
if area != "" && area != "A" {
lbnHtml += `
` + area + ``
}
if finalType != "" {
lbnHtml += `
` + finalType + ``
}
if util.ObjToString(lastBidNew["industry"]) != "" {
lbnHtml += `
` + util.ObjToString(lastBidNew["industry"]) + ``
}
publishtime, _ := lastBidNew["publishtime"].(float64)
if publishtime != 0 {
diff := util.TimeDiff(time.Unix(util.Int64All(publishtime), 0))
if diff != "" {
lbnHtml += `
` + diff + ``
}
}
lbnHtml += `
`
if tmp == 6 || i == len(*lastBidNews)-1 {
tmp = 0
lbnHtml += `
`
}
}
if olCount > 1 {
olHtml += `
`
}
return lbnHtml, olHtml
}
func detailLikeRpc(Interest []string, res *[]map[string]interface{}, flag bool) (mcontent map[string]interface{}) {
//defer util.Catch()
str := fmt.Sprintf("根据您设置的关键词(%s),给您推送以下招标信息:
", strings.Join(Interest, ";"))
//发送内容组合
i := 0
o_pushinfo := map[string]interface{}{}
var details []string
v := *res
bmatch := false
for _, k2 := range v {
title := strings.Replace(k2["title"].(string), "\n", "", -1)
province := util.ObjToString(k2["area"])
if province != "" && province != "A" {
title = `[` + province + `]` + title
}
i++
str += ""
o_pushinfo[strconv.Itoa(i)] = map[string]interface{}{
"publishtime": k2["publishtime"],
"stype": k2["type"],
"topstype": k2["toptype"],
"substype": k2["subtype"],
}
if flag {
highlight, _ := k2["highlight"].(map[string][]string)
detail := ""
if len(highlight["detail"]) > 0 {
detail = highlight["detail"][0]
}
details = append(details, detail)
}
}
mcontent = map[string]interface{}{}
if len(o_pushinfo) > 0 {
bmatch = true
mcontent["o_pushinfo"] = o_pushinfo
mcontent["s_content"] = str
mcontent["s_words"] = Interest
}
mcontent["bmatch"] = bmatch
if flag {
mcontent["details"] = details
}
return
}
//跳转到pc查询剑鱼标讯信息列表
func (m *Front) Searchinfolist(p string) error {
defer util.Catch()
return m.Redirect("/jylab/supsearch/index.html")
var shareid = m.GetString("id")
if len(shareid) == 0 {
shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jysslby"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9))
}
m.T["logid"] = config.Seoconfig["jysslby"].(string)
m.T["shareid"] = se.EncodeString(shareid)
keywords := m.GetString("keywords")
searchvalue := jy.FilteKey(m.GetString("searchvalue"))
area := m.GetString("area")
publishtime := m.GetString("publishtime")
toptype := m.GetString("toptype")
subtype := m.GetString("subtype")
industry := m.GetString("industry")
minprice := m.GetString("minprice") //最低价格
maxprice := m.GetString("maxprice") //最高价格
selectType := m.GetString("selectType")
selectTypesess := m.GetSession("selectType")
if selectTypesess != nil && selectTypesess != "" {
selectType = selectTypesess.(string)
}
if selectType == "" {
selectType = "all"
}
var status = 1
var count, totalPage int64
tabularflag := ""
var list *[]map[string]interface{}
pages := make([]interface{}, 0)
if len(searchvalue) > 0 || len(industry) > 0 {
count, totalPage, list = getBidSearchData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, 0, true, selectType, "")
//} else if m.Method() == "POST" {
//status = 2
//count, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, "", 0, true, false)
} else {
status = 2
if redis.Get("other", "index_list") == nil {
intns := make([]int, 0)
for i := 0; i < 10; i++ {
if len(intns) == 0 {
intns = append(intns, rand.Intn(100))
} else {
for {
v := rand.Intn(intns[(i-1)] + 100)
if v-intns[(i-1)] >= 30 {
intns = append(intns, v)
break
}
}
}
}
for i := 0; i < 10; i++ {
count, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, tabularflag, intns[i], true, false)
for k, v := range *list {
v["k"] = (k + 1) + i*50
t := time.Unix(util.Int64All(v["publishtime"]), 0)
v["timetemp"] = fmt.Sprint(util.Int64All(v["publishtime"]))
v["_id"] = util.EncodeArticleId2ByCheck(v["_id"].(string))
v["time"] = util.TimeDiff(t)
var stp = ""
if v["subtype"] != nil {
stp, _ = v["subtype"].(string)
} else {
stp = ""
}
if stp == "" && v["toptype"] != nil {
stp, _ = v["toptype"].(string)
}
area, _ := v["area"].(string)
v["href"] = util.CommonEncodeArticle("bdprivate", (util.GetRandom(22)))
v["stypeadd"], v["areaadd"], _ = classify(stp, area, "")
}
pages = append(pages, list)
}
m.DisableHttpCache()
redis.Put("other", "index_list", pages, 60*60*24*2)
}
}
if status == 2 { //&& m.Method() == "GET" {
pages := redis.Get("other", "index_list").([]interface{})
p := util.IntAll(p)
if p <= 0 || p > 10 {
p = 1
}
if p-1 <= 0 {
m.T["prev"] = 1
} else {
m.T["prev"] = p - 1
}
if p+1 >= 11 {
m.T["next"] = 10
} else {
m.T["next"] = p + 1
}
m.T["cur"] = p
m.T["list"] = pages[p-1]
isopen, _ := m.GetInteger("isopen")
m.T["isopen"] = isopen
m.T["area"] = area
m.T["publishtime"] = publishtime
m.T["timeslot"] = m.GetString("timeslot")
m.T["toptype"] = toptype
m.T["subtype"] = subtype
m.T["count"] = count
m.T["totalPage"] = totalPage
m.T["status"] = status
m.T["keywords"] = keywords
m.T["searchvalue"] = searchvalue
m.T["selectType"] = selectType
m.T["login"] = m.Session().Get("user")
return m.Render("/pc/bidsearch_static.html", &m.T)
} else {
if list != nil {
for _, v := range *list {
v["_id"] = util.EncodeArticleId2ByCheck(v["_id"].(string))
stp, _ := v["subtype"].(string)
if stp == "" {
stp, _ = v["toptype"].(string)
}
area, _ := v["area"].(string)
v["stypeadd"], v["areaadd"], _ = classify(stp, area, "")
//正文匹配检索关键词
highlight, _ := v["highlight"].(map[string][]string)
detail := ""
for _, val := range highlight["detail"] {
detail += public.ClearHtml.ReplaceAllString(val, "")
}
v["href"] = util.CommonEncodeArticle("bdprivate", (util.GetRandom(22)))
v["detail"] = detail
}
}
m.T["list"] = list
isopen, _ := m.GetInteger("isopen")
m.T["isopen"] = isopen
m.T["area"] = area
m.T["publishtime"] = publishtime
m.T["timeslot"] = m.GetString("timeslot")
m.T["toptype"] = toptype
m.T["subtype"] = subtype
m.T["count"] = count
m.T["status"] = status
m.T["keywords"] = keywords
m.T["searchvalue"] = searchvalue
m.T["selectType"] = selectType
m.T["login"] = m.Session().Get("user")
m.SetSession("paramkey", keywords)
if publishtime == "lately-7" {
m.SetSession("parampublishtime", "最近7天")
} else if publishtime == "lately-30" {
m.SetSession("parampublishtime", "最近30天")
} else if publishtime == "thisyear" {
m.SetSession("parampublishtime", "去年")
} else {
m.SetSession("parampublishtime", publishtime)
}
m.SetSession("paramarea", area)
if subtype != "" {
m.SetSession("paraminfotype", subtype)
} else {
m.SetSession("paraminfotype", toptype)
}
return m.Render("/pc/bidsearch.html", &m.T)
}
}
//ajax分页请求
func (m *Front) PcAjaxReq() {
tabularflag := m.GetString("tabularflag")
if tabularflag == "Y" && m.GetSession("userId") == nil {
//判断用户是否登录进行表格查询,否则返回基本数据
tabularflag = ""
}
reqType := m.GetString("reqType")
//获取最新招标信息
if reqType == "lastBids" {
//ls := elastic.GetPage(INDEX, TYPE, "{}", bidSearch_sort, bidSearch_field_1, 0, 18)
//jyutil.BidListConvert("", ls)
ls := Newbids("")
if len(ls) >= 18 {
ls = ls[:18]
}
m.ServeJson(map[string]interface{}{
"list": ls,
})
return
}
currentPage, _ := m.GetInteger("pageNumber")
if currentPage > pc_maxPageNum {
currentPage = pc_maxPageNum
}
start := (currentPage - 1) * pc_pageSize
area := m.GetString("area")
subtype := m.GetString("subtype")
publishtime := m.GetString("publishtime")
selectType := m.GetString("selectType")
industry := strings.TrimSpace(m.GetString("industry"))
minprice := m.GetString("minprice") //最低价格
maxprice := m.GetString("maxprice") //最高价格
m.SetSession("selectType", selectType)
//只有前20条 有全字段,
if subtype != "拟建" && currentPage != 1 {
tabularflag = ""
}
if selectType == "" {
selectType = "all"
}
b_word, a_word, s_word := jy.InterceptSearchKW(m.GetString("searchvalue"), selectType == "all", len(industry) == 0)
var list *[]map[string]interface{}
var secondList []map[string]interface{}
var count, totalPage int64
status, _ := m.GetInteger("status")
isLimit := 1
limitFlag := false
secondFlag := ""
secondKWS := ""
pcAjaxFlag := ""
if len(s_word) > 0 || len(industry) > 0 {
if reqType == "filter" {
if status == 1 {
count, totalPage, list = getBidSearchData(s_word, area, publishtime, subtype, industry, minprice, maxprice, 0, true, selectType, tabularflag)
} else if status == 2 {
//count, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, tabularflag, 0, true, true)
}
} else if reqType == "bidSearch" {
//全文检索限制
if selectType == "all" {
limitFlag = public.Lst.Flag
isLimit = public.Lst.IsLimited(m.Request, m.ResponseWriter, m.Session())
if isLimit == 1 { //没有被限制
defer public.Lst.Limit()
}
}
if isLimit == 1 {
if limitFlag {
if start == 0 {
limit_count := public.Lst.TotalPage * pc_pageSize
count, totalPage, list = getBidSearchData_new(s_word, area, publishtime, subtype, industry, minprice, maxprice, 0, limit_count, true, selectType, tabularflag)
if totalPage > int64(public.Lst.TotalPage) {
totalPage = int64(public.Lst.TotalPage)
}
if count > int64(limit_count) {
count = int64(limit_count)
}
}
} else {
count, totalPage, list = getBidSearchData(s_word, area, publishtime, subtype, industry, minprice, maxprice, start, true, selectType, tabularflag)
}
listSize := 0
if list != nil {
listSize = len(*list)
}
if len([]rune(s_word)) > 3 && int(count) < pc_pageSize && start == 0 {
secondKWS = jy.HttpEs(s_word, "ik_smart", public.DbConf.Elasticsearch.Main.Address)
findfields := `"title"`
qstr := getSearchQuery(secondKWS, industry, minprice, maxprice, findfields, getBidSearchQuery(area, publishtime, subtype))
secRel := elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, 0, 2*pc_pageSize, 0, false)
if secRel != nil {
public.BidListConvert(industry, secRel)
}
if list != nil {
list = public.MapArrSortMerge(*list, *secRel, "_id", "publishtime")
} else {
list = secRel
}
if len(*secRel) > 0 {
if secondKWS != "" {
s_word += "+" + secondKWS
}
secondFlag = "T"
pcAjaxFlag = "T"
}
}
public.SaveUserSearchLog(m.Request, util.ObjToString(m.GetSession("userId")), -1, "pc", "超级搜索", map[string]interface{}{
"search_word": s_word,
"search_area": area,
"search_price": []string{minprice, maxprice},
"search_publishtime": publishtime,
"search_type": subtype,
"search_industry": industry,
"pagenum": currentPage,
"pagesize": listSize,
})
}
} else if reqType == "lastNews" {
_, list = getLastNewsData(s_word, area, publishtime, subtype, industry, minprice, maxprice, tabularflag, start, false, true)
}
}
if list != nil && len(*list) > 0 {
for _, v := range *list {
if v["_id"] != nil {
v["_id"] = util.EncodeArticleId2ByCheck(v["_id"].(string))
}
stp, ok := v["subtype"].(string)
if ok && stp == "" {
stp = v["toptype"].(string)
}
area, ok := v["area"].(string)
indtry := util.ObjToString(v["industry"])
v["stypeadd"], v["areaadd"], v["indadd"] = classify(stp, area, indtry)
//正文匹配检索关键词
highlight, _ := v["highlight"].(map[string][]string)
detail := ""
for _, val := range highlight["detail"] {
detail += public.ClearHtml.ReplaceAllString(val, "")
}
v["detail"] = detail
v["href"] = util.EncodeArticleId2ByCheck(util.GetRandom(20))
}
if secondFlag != "" {
if len(*list) > pc_pageSize {
secondList = (*list)[pc_pageSize:]
if len(secondList) > pc_pageSize {
secondList = secondList[:pc_pageSize]
}
*list = (*list)[:pc_pageSize]
totalPage = 2
} else {
totalPage = 1
}
}
}
//只有前20条
m.ServeJson(map[string]interface{}{
"limitFlag": limitFlag,
"status": isLimit,
"list": list,
"count": count,
"totalPage": totalPage,
"interceptWord": a_word,
"keywords": b_word,
"searchvalue": s_word,
"secondFlag": secondFlag,
"secondList": secondList,
"pcAjaxFlag": pcAjaxFlag,
})
}
/**
**页面搜索
**/
func getBidSearchData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice string, start int, isGetCount bool, selectType, tabularflag string) (count, totalPage int64, list *[]map[string]interface{}) {
count, totalPage, list = getBidSearchData_new(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, start, pc_pageSize, isGetCount, selectType, tabularflag)
return
}
func getBidSearchData_new(searchvalue, area, publishtime, subtype, industry, minprice, maxprice string, start, pageSize int, isGetCount bool, selectType, tabularflag string) (count, totalPage int64, list *[]map[string]interface{}) {
//selectType:全文搜索(all)、标题搜索(title)
findfields := `"title"`
if selectType == "all" {
findfields = `"title","detail"`
}
qstr := getSearchQuery(searchvalue, industry, minprice, maxprice, findfields, getBidSearchQuery(area, publishtime, subtype))
if isGetCount && qstr != "" && start == 0 {
count = elastic.Count(INDEX, TYPE, qstr)
}
if !isGetCount || count > 0 || start > 0 {
var repl *[]map[string]interface{}
if selectType == "all" {
//全文搜索
if tabularflag == "Y" {
repl = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, start, pageSize, 115, true)
} else {
repl = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field_1, start, pageSize, 115, true)
}
} else {
//标题搜索
if tabularflag == "Y" {
repl = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, start, pageSize, 0, false)
} else {
repl = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field_1, start, pageSize, 0, false)
}
}
if repl != nil && *repl != nil && len(*repl) > 0 {
public.BidListConvert(industry, repl)
list = repl
}
}
limitCount := int64(pc_pageSize * pc_maxPageNum)
if count > limitCount {
count = limitCount
}
totalPage = (count + int64(pc_pageSize) - 1) / int64(pc_pageSize)
return
}
func getLastNewsData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, tabularflag string, start int, isGetCount bool, highlight bool) (count int64, list *[]map[string]interface{}) {
//最新招标信息
findfields := `"title"`
qstr := getSearchQuery(searchvalue, industry, minprice, maxprice, findfields, getBidSearchQuery(area, publishtime, subtype))
if isGetCount {
count = elastic.Count(INDEX, TYPE, qstr)
}
if !isGetCount || count > 0 {
if tabularflag == "Y" {
repl := elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, start, pc_pageSize, 115, highlight)
if repl != nil && *repl != nil && len(*repl) > 0 {
public.BidListConvert(industry, repl)
list = repl
}
} else {
repl := elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field_1, start, pc_pageSize, 115, highlight)
if repl != nil && *repl != nil && len(*repl) > 0 {
public.BidListConvert(industry, repl)
list = repl
}
}
}
limitCount := int64(pc_pageSize * pc_maxPageNum)
if count > limitCount {
count = limitCount
}
return
}
func getBidSearchQuery(area, publishtime, subtype string) string {
query := ``
if area != "" {
query += `{"terms":{"area":[`
for k, v := range strings.Split(area, ",") {
if k > 0 {
query += `,`
}
query += `"` + v + `"`
}
query += `]}}`
}
if publishtime != "" {
if len(query) > 0 {
query += ","
}
starttime, endtime := "", ""
now := time.Now()
if publishtime == "lately-7" { //最近7天
starttime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-7, 0, 0, 0, 0, time.Local).Unix())
} else if publishtime == "lately-30" { //最近30天
starttime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-30, 0, 0, 0, 0, time.Local).Unix())
} else if publishtime == "thisyear" { //去年
starttime = fmt.Sprint(time.Date(now.Year()-1, 1, 1, 0, 0, 0, 0, time.Local).Unix())
endtime = fmt.Sprint(time.Date(now.Year()-1, 12, 31, 23, 59, 59, 0, time.Local).Unix())
} else {
starttime = strings.Split(publishtime, "_")[0]
endtime = strings.Split(publishtime, "_")[1]
etTime := time.Now()
if endtime != "" {
et, _ := strconv.ParseInt(endtime, 0, 64)
etTime = time.Unix(et, 0)
}
endtime = fmt.Sprint(time.Date(etTime.Year(), etTime.Month(), etTime.Day()+1, 0, 0, 0, 0, time.Local).Unix())
}
query += `{"range":{"publishtime":{`
if starttime != "" {
query += `"gte":` + starttime
}
if starttime != "" && endtime != "" {
query += `,`
}
if endtime != "" {
query += `"lt":` + endtime
}
query += `}}}`
}
if subtype != "" {
if len(query) > 0 {
query += ","
}
query += `{"terms":{"subtype":[`
for k, v := range strings.Split(subtype, ",") {
if k > 0 {
query += `,`
}
query += `"` + v + `"`
}
query += `]}}`
}
return query
}
func getLastNewsQuery(area, publishtime, subtype, industry string) string {
query := ``
if area != "" {
query += `"area":{"$in":[`
for k, v := range strings.Split(area, ",") {
if k > 0 {
query += `,`
}
query += `"` + v + `"`
}
query += `]}`
}
if publishtime != "" {
if len(query) > 0 {
query += ","
}
starttime, endtime := "", ""
now := time.Now()
if publishtime == "lately-7" { //最近7天
starttime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-7, 0, 0, 0, 0, time.Local).Unix())
} else if publishtime == "lately-30" { //最近30天
starttime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-30, 0, 0, 0, 0, time.Local).Unix())
} else if publishtime == "thisyear" { //去年
starttime = fmt.Sprint(time.Date(now.Year()-1, 1, 1, 0, 0, 0, 0, time.Local).Unix())
endtime = fmt.Sprint(time.Date(now.Year()-1, 12, 31, 23, 59, 59, 0, time.Local).Unix())
} else {
starttime = strings.Split(publishtime, "_")[0]
endtime = strings.Split(publishtime, "_")[1]
et, _ := strconv.ParseInt(endtime, 0, 64)
etTime := time.Unix(et, 0)
endtime = fmt.Sprint(time.Date(etTime.Year(), etTime.Month(), etTime.Day()+1, 0, 0, 0, 0, time.Local).Unix())
}
if starttime != "" && endtime != "" {
query += `"$and":[{"publishtime":{"$gte":` + starttime + `}},{"publishtime":{"$lt":` + endtime + `}}]`
} else if starttime != "" && endtime == "" {
query += `"publishtime":{"$gte":` + starttime + `}`
} else if starttime == "" && endtime != "" {
query += `"publishtime":{"$lt":` + endtime + `}`
}
}
if subtype != "" {
if len(query) > 0 {
query += ","
}
query += `"subtype":{"$in":[`
for k, v := range strings.Split(subtype, ",") {
if k > 0 {
query += `,`
}
query += `"` + v + `"`
}
query += `]}`
}
//
if industry != "" {
if len(query) > 0 {
query += ","
}
query += `"s_subscopeclass":{"$in":[`
for k, v := range strings.Split(industry, ",") {
if k > 0 {
query += `,`
}
query += `"` + v + `"`
}
query += `]}`
}
query = `{` + query + `}`
return query
}
//进入订阅页面
func (m *Front) Getpage() error {
defer util.Catch()
s_type := ""
userid := util.ObjToString(m.GetSession("userId"))
var msgset map[string]interface{}
if userid != "" {
one, _ := mongodb.FindById("user", userid, `{"o_jy":1}`)
msg := (*one)["o_jy"]
if msg != "" && msg != nil {
msgset = msg.(map[string]interface{})
}
s_type = "tender"
}
m.ServeJson(map[string]interface{}{
"msgset": msgset,
"s_type": s_type,
})
return nil
}
//搜索结果,ajax分页请求
func (m *Front) WxsearchlistPaging() {
defer util.Catch()
userid := m.GetSession("userId")
var list *[]map[string]interface{}
var secRel *[]map[string]interface{}
pageNum, _ := m.GetInteger("pageNum")
if userid != nil && pageNum <= wx_maxPageNum {
//历史记录和订阅查询
one, _ := mongodb.FindById("user", userid.(string), `{"o_jy":1}`)
history := redis.GetStr("other", "s_"+userid.(string))
arrs := strings.Split(history, ",")
searchvalue := strings.TrimSpace(m.GetString("searchvalue"))
var b_word, a_word string
isLimit := 1
limitFlag := false
secondKWS := ""
secondFlag := ""
var secondList []map[string]interface{}
if searchvalue != "" {
filed := ""
if pageNum == 1 {
filed = bidSearch_field
} else {
filed = bidSearch_field_1
}
selectType := m.GetString("selectType")
subtype := m.GetString("subtype")
scope := m.GetString("scope")
publishtime := m.GetString("publishtime")
industry := strings.TrimSpace(m.GetString("industry"))
m.SetSession("industry", industry)
minprice := m.GetString("minprice")
maxprice := m.GetString("maxprice")
//全文检索限制
if selectType == "all" {
limitFlag = public.Lst.Flag
isLimit = public.Lst.IsLimited(m.Request, m.ResponseWriter, m.Session())
if isLimit == 1 { //没有被限制
defer public.Lst.Limit()
}
}
if isLimit == 1 {
s_word := ""
if limitFlag {
if pageNum == 1 {
list, b_word, a_word, s_word = getWxsearchlistData_new(searchvalue, scope, publishtime, subtype, industry, minprice, maxprice, pageNum, public.Lst.TotalPage*wx_pageSize, selectType, filed)
}
} else {
list, b_word, a_word, s_word = getWxsearchlistData(searchvalue, scope, publishtime, subtype, industry, minprice, maxprice, pageNum, selectType, filed)
}
listSize := 0
if list != nil {
listSize = len(*list)
}
if len([]rune(s_word)) > 3 && listSize < pc_pageSize && pageNum == 1 {
secondKWS = jy.HttpEs(s_word, "ik_smart", public.DbConf.Elasticsearch.Main.Address)
findfields := `"title"`
qstr := getSearchQuery(secondKWS, industry, minprice, maxprice, findfields, getBidSearchQuery(scope, publishtime, subtype))
secRel = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, filed, 0, 2*pc_pageSize, 0, false)
if secRel != nil && len(*secRel) > 0 {
public.BidListConvert(industry, secRel)
for _, v := range *secRel {
v["_id"] = util.EncodeArticleId2ByCheck(util.ObjToString(v["_id"]))
}
if list != nil {
list = public.MapArrSortMerge(*list, *secRel, "_id", "publishtime")
} else {
list = secRel
}
secondFlag = "T"
if len(*list) > pc_pageSize && selectType == "title" {
secondList = (*list)[pc_pageSize:]
if len(secondList) > pc_pageSize {
secondList = secondList[:pc_pageSize]
}
*list = (*list)[:pc_pageSize]
}
} else {
secondKWS = ""
}
}
public.SaveUserSearchLog(m.Request, util.ObjToString(m.GetSession("userId")), -1, "wx", "超级搜索", map[string]interface{}{
"search_word": searchvalue,
"search_area": scope,
"search_price": []string{minprice, maxprice},
"search_publishtime": publishtime,
"search_type": subtype,
"search_industry": industry,
"pagenum": pageNum,
"pagesize": listSize,
})
}
//新增历史记录
if history == "" {
arrs = make([]string, 0)
}
for k, v := range arrs {
if v == strings.Trim(searchvalue, " ") {
arrs = append(arrs[:k], arrs[k+1:]...)
break
}
}
arrs = append(arrs, searchvalue)
if len(arrs) > 10 {
arrs = arrs[1:11]
}
redis.Del("other", "s_"+userid.(string))
redis.Put("other", "s_"+userid.(string), strings.Join(arrs, ","), -1)
}
m.T["history"] = arrs
if one != nil && len(*one) > 0 {
o_jy, _ := (*one)["o_jy"].(map[string]interface{})
a_key, _ := o_jy["a_key"].([]interface{})
var keys []interface{}
for _, v := range a_key {
keyMap, _ := v.(map[string]interface{})
key, _ := keyMap["key"].([]interface{})
keys = append(keys, key)
}
m.T["msgset"] = keys
}
hasNextPage := list != nil && len(*list) == wx_pageSize && pageNum < wx_maxPageNum
if limitFlag {
hasNextPage = false
}
m.ServeJson(map[string]interface{}{
"limitFlag": limitFlag,
"status": isLimit,
"list": list,
"hasNextPage": hasNextPage,
"history": m.T["history"],
"msgset": m.T["msgset"],
"interceptWord": a_word,
"keyWord": b_word,
"secondFlag": secondFlag,
"secondList": secondList,
"secondKWS": secondKWS,
})
}
}
//微信端删除历史搜索
func (m *Front) DelWxHistorySearch() {
defer util.Catch()
//定义一个无用参数作为返回值
var rt string = "rt"
userId := m.GetSession("userId")
history := redis.GetStr("other", "s_"+userId.(string))
if len(history) > 0 || history != "" {
redis.Del("other", "s_"+userId.(string))
}
m.ServeJson(map[string]interface{}{
"rt": rt,
})
}
//微信端搜索
func getWxsearchlistData(keywords, scope, publishtime, subtype, industry, minprice, maxprice string, pageNum int, selectType, field string) (list *[]map[string]interface{}, b_word, a_word, s_word string) {
return getWxsearchlistData_new(keywords, scope, publishtime, subtype, industry, minprice, maxprice, pageNum, wx_pageSize, selectType, field)
}
func getWxsearchlistData_new(keywords, scope, publishtime, subtype, industry, minprice, maxprice string, pageNum, pageSize int, selectType, field string) (list *[]map[string]interface{}, b_word, a_word, s_word string) {
b_word, a_word, s_word = jy.InterceptSearchKW(keywords, selectType == "all", len(industry) == 0)
if len(b_word) == 0 {
return list, b_word, a_word, s_word
}
findfields := `"title"`
if selectType == "all" {
findfields = `"title","detail"`
}
qstr := getSearchQuery(s_word, industry, minprice, maxprice, findfields, getBidSearchQuery(scope, publishtime, subtype))
if selectType == "all" { //全文搜索
list = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, field, (pageNum-1)*pageSize, pageSize, 100, true)
} else { //标题搜索
list = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, field, (pageNum-1)*pageSize, pageSize, 100, false)
}
if list != nil {
public.BidListConvert(industry, list)
for _, v := range *list {
v["_id"] = util.EncodeArticleId2ByCheck(util.ObjToString(v["_id"]))
}
}
return list, b_word, a_word, s_word
}
//查看原文跳转
func (m *Front) VisitRedirect() {
defer util.Catch()
sid := m.GetString("id")
// regex, _ := regexp.Compile("(Android|Mobile)")
// if len(regex.FindAllString(m.Header("User-Agent"), -1)) <= 0 {
// m.Redirect("/article/p/" + sid + ".html")
// }
surl := m.GetString("url")
sds := m.GetString("keywords")
m.T["keywords"] = sds
shareopenid := m.GetString("openid")
if shareopenid != "" {
m.T["shareopenid"] = shareopenid
}
myopenid, _ := m.Session().Get("s_m_openid").(string)
if myopenid == "" {
myopenid = shareopenid
m.T["openid"] = myopenid //"-1"
} else {
m.T["openid"] = se.EncodeString(myopenid) //"-1"
}
mynickname, _ := m.Session().Get("s_nickname").(string)
myavatar, _ := m.Session().Get("s_avatar").(string)
m.T["nickname"] = mynickname
m.T["avatar"] = myavatar
m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
userId, _ := m.GetSession("userId").(string)
var obj map[string]interface{}
obj = wxvisitD(sid, userId, myopenid)
if len(obj) > 0 {
//获取打赏文案
m.T["rewardText"], m.T["advertText"] = getRewardText()
m.T["obj"] = obj
m.Render("/weixin/wxinfocontent.html", &m.T)
return
}
if surl != "" {
m.Redirect(surl)
}
}
func wxvisitD(sid, userId, openId string) (objdata map[string]interface{}) {
defer util.Catch()
var obj map[string]interface{}
if len(sid) > 5 {
brobj, ok := mongodb.Find("bidding_rec", bson.M{"s_id": sid}, `{"l_recoverydate":-1}`, nil, false, 0, 1)
if ok && (*brobj) != nil && len(*brobj) == 1 && (*brobj)[0] != nil {
obj = (*brobj)[0]
} else {
aobj, ok := public.Mgo_Bidding.FindById(public.DbConf.Mongodb.Bidding.Collection, sid, nil)
if ok && (aobj == nil || *aobj == nil || len(*aobj) == 0) {
aobj, ok = public.Mgo_Bidding.FindById(public.DbConf.Mongodb.Bidding.Collection_back, sid, nil)
}
//aobj, ok := elastic.GetByIdField("bidding", "bidding", sid, ""), true
obj = *aobj
}
if ok && obj != nil && len(obj) >= 3 {
fwt := util.ObjToString(obj["subtype"])
ltfd := getLowestField(fwt)
if ltfd != "" {
obj["fwtsname"] = obj[ltfd]
obj["fwtscode"] = ltfd
}
obj["_id"] = util.EncodeArticleId2ByCheck(sid)
obj["url"] = obj["href"]
pt := obj["publishtime"]
obj["l_publishtime"] = pt
obj["publishtime"] = util.FormatDateWithObj(&pt, util.Date_Full_Layout)
//查询是否关注
obj["followFlag"] = false
obj["hasSession"] = false
var infoformat = obj["infoformat"]
if infoformat != nil && infoformat != "" {
obj["infoformat"] = util.IntAll(infoformat)
}
if userId != "" {
pcode, _ := obj["projectcode"].(string)
pname, _ := obj["projectname"].(string)
titleTmp := util.ObjToString(obj["title"])
obj["followFlag"], obj["followId"] = MFollow(userId, pname, pcode, titleTmp, openId)
if len([]rune(titleTmp)) > 100 {
titleTmp = string([]rune(titleTmp)[:100]) + "..."
}
titleTmp = public.ClearHtml.ReplaceAllString(titleTmp, "")
obj["title"] = titleTmp
obj["hasSession"] = true
}
if strings.Trim(util.ObjToString(obj["detail"]), " ") == "" {
obj["detail"] = ""
}
}
}
return obj
}
//获取权重最低的字段
func getLowestField(subtype string) string {
fields := util.ObjToMap(config.Sysconfig["recoveryField"])
result := ""
if subtype != "招标" {
subtype = "其他"
}
var fieldsArr = util.ObjArrToMapArr((*fields)[subtype].([]interface{}))
i := getWeightRandom(fieldsArr)
for k, v := range fieldsArr {
if k == i {
result = util.ObjToString(v["field"])
}
}
return result
}
//根据权重随机获取数组的索引
func getWeightRandom(array []map[string]interface{}) int {
var weightSum, stepWeightSum float64
for _, v := range array {
weightSum += v["proportion"].(float64)
}
randVal := rand.New(rand.NewSource(time.Now().UnixNano())).Float64()
for i := 0; i < len(array); i++ {
stepWeightSum += array[i]["proportion"].(float64)
if randVal <= stepWeightSum/weightSum {
return i
}
}
return 0
}
func MFollow(userId, pname, pcode, title, openid string) (bool, string) {
defer util.Catch()
var followId string
followFlag := false
follows, ok := mongodb.Find("follow_project", `{"s_userid":"`+userId+`"}`, `{"_id":1,"s_projectname":1,"s_projectcode":1}`, nil, false, -1, -1)
if ok && follows != nil && len(*follows) > 0 {
for _, v := range *follows {
pc, _ := v["s_projectcode"].(string)
pn, _ := v["s_projectname"].(string)
if (pc != "" && pc == pcode) || (pn != "" && pn == pname) {
followFlag = true
followId = util.EncodeArticleId2ByCheck(BsonIdToSId(v["_id"]))
break
}
}
}
return followFlag, followId
}
//查看原文跳转
//增加查询备份库数据、增加关键词、描述逻辑处理
func (m *Front) PcVisitRedirect(sid string) {
defer util.Catch()
kds := m.GetString("kds")
m.T["keywords"] = kds
sid = strings.Split(sid, "_")[0]
//sid = util.DecodeArticleId(sid)[0]
var shareid = m.GetString("id")
if len(shareid) == 0 {
shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jysskzy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9))
}
m.T["logid"] = config.Seoconfig["jysskzy"].(string)
m.T["shareid"] = se.EncodeString(shareid)
if ret := redis.Get("other", "jypcdetail_"+sid+kds); ret != nil {
m.SetBody([]byte(ret.(string)))
return
} else {
m.DisableHttpCache()
data := elastic.GetByIdField("bidding", "bidding", sid, `"href"`)
if data == nil || len(*data) == 0 {
m.Render("/_error.html")
return
}
href, _ := (*data)["href"].(string)
href = strings.Replace(href, "\n", "", -1)
if href != "" && !strings.HasPrefix(href, "http") {
href = "http://" + href
}
po, bo, wo, obj := pcVRT(sid, "")
if obj != nil && len(obj) > 0 {
if len(po) > 0 {
m.T["projectOther"] = po
}
if len(bo) > 0 {
m.T["buyerOther"] = bo
}
if len(wo) > 0 {
m.T["winnerOther"] = wo
}
obj["url"] = href
m.T["obj"] = obj
content, _ := m.Render4Cache("/pc/biddetail.html", &m.T)
redis.Put("other", "jypcdetail_"+sid+kds, string(content), 60*60*24)
m.SetBody(content)
return
}
if href != "" {
m.Redirect(href)
}
}
}
//pc三级页跳转
//20170821增加查询字段s_subscopeclass
func pcVRT(sid, industry string) (po, bo, wo []map[string]interface{}, objdata map[string]interface{}) {
defer util.Catch()
var projectOther, buyerOther, winnerOther []map[string]interface{}
var obj map[string]interface{}
if len(sid) > 5 {
brobj, ok := mongodb.Find("bidding_rec", bson.M{"s_id": sid}, `{"l_recoverydate":-1}`, nil, false, 0, 1)
if ok && (*brobj) != nil && len(*brobj) == 1 && (*brobj)[0] != nil {
obj = (*brobj)[0]
} else {
aobj, ok := public.Mgo_Bidding.FindById(public.DbConf.Mongodb.Bidding.Collection, sid, nil)
if ok && (aobj == nil || *aobj == nil || len(*aobj) == 0) {
aobj, ok = public.Mgo_Bidding.FindById(public.DbConf.Mongodb.Bidding.Collection_back, sid, nil)
}
obj = *aobj
}
//obj, ok := elastic.GetByIdField("bidding", "bidding", sid, ""), true
if ok && obj != nil && len(obj) > 0 {
//DealInfo(obj, coll)
//fwt := util.ObjToString(obj["fieldweights"])
//lwf := util.ObjToString(obj["lastwrongfield"])
//ltfd := getLowestField(fwt, lwf)
//if ltfd != "" {
// obj["fwtsname"] = obj[ltfd]
// obj["fwtscode"] = ltfd
//}
obj["_id"] = util.EncodeArticleId2ByCheck(sid)
var infoformat = obj["infoformat"]
if infoformat != nil && infoformat != "" {
obj["infoformat"] = util.IntAll(infoformat)
}
if strings.Trim(util.ObjToString(obj["detail"]), " ") == "" {
obj["detail"] = ""
}
titleStr := util.ObjToString(obj["title"])
if len([]rune(titleStr)) > 100 {
titleStr = string([]rune(titleStr)[:100]) + "..."
}
//titleTmp := util.If(len([]rune(titleStr)) > 100, string([]rune(titleStr)[:100])+"...", string(titleStr)).(string)
obj["title"] = public.ClearHtml.ReplaceAllString(titleStr, "")
area := obj["area"].(string)
finalType, _ := obj["subtype"].(string)
if finalType == "" {
finalType = util.ObjToString(obj["toptype"])
}
if finalType == "" {
finalType = util.ObjToString(obj["type"])
if finalType == "bid" {
finalType = "中标"
} else if finalType == "tender" {
finalType = "招标"
} else {
finalType = ""
}
}
if industry == "" {
industry = util.ObjToString(obj["s_subscopeclass"])
if industry != "" {
if strings.Contains(industry, "它") {
industry = strings.Replace(industry, "它", "他", -1)
}
industry = strings.Split(industry, ",")[0]
}
}
//detail字段 缺少标签 处理
if config.Sysconfig["detail_element"] != nil {
var arrTags = util.ObjArrToStringArr(config.Sysconfig["detail_element"].([]interface{}))
var _detail = util.ObjToString(obj["detail"])
for _, v := range arrTags {
var intOpen = strings.Count(_detail, "<"+v)
var intClose = strings.Count(_detail, ""+v+">")
if intOpen >= intClose {
for di := 0; di < (intOpen - intClose); di++ {
_detail += "" + v + ">"
}
} else {
for di := 0; di < (intClose - intOpen); di++ {
_detail = "<" + v + ">" + _detail
}
}
// log.Println(intOpen, "--", intClose)
}
// log.Println("_detail:", _detail)
obj["detail"] = _detail
}
obj["stypeadd"], obj["areaadd"], obj["indadd"] = classify(finalType, area, industry)
//增加处理信息逻辑
objdata = obj
queryStr := ""
commonQuery := func(mustquery string) *[]map[string]interface{} {
return elastic.GetPage("bidding", "bidding", queryStr, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","s_subscopeclass"`, 0, 11)
}
//同一个项目的其他招标信息
projectName, _ := obj["projectname"].(string)
projectCode, _ := obj["projectcode"].(string)
if projectName != "" || projectCode != "" {
if projectName != "" && projectCode != "" {
queryStr = `{"$or":[{"TERM_projectname":"` + projectName + `"},{"TERM_projectcode":"` + projectCode + `"}]}`
} else if projectName != "" && projectCode == "" {
queryStr = `{"TERM_projectname":"` + projectName + `"}`
} else if projectName == "" && projectCode != "" {
queryStr = `{"TERM_projectcode":"` + projectCode + `"}`
}
projectOther = bidDataConvert(sid, commonQuery(queryStr))
}
//同一个业主最近的其他招标信息
buyer, _ := obj["buyer"].(string) //采购单位
if buyer != "" {
queryStr = `{"TERM_buyer":"` + buyer + `"}`
buyerOther = bidDataConvert(sid, commonQuery(queryStr))
}
//同一中标人最近中标的其他信息
subtype, _ := obj["subtype"].(string) //信息类型
winner, _ := obj["winner"].(string) //中标人
if winner != "" && subtype == "中标" {
queryStr = `{"TERM_s_winner":"` + winner + `"}`
winnerOther = bidDataConvert(sid, commonQuery(queryStr))
}
}
}
return projectOther, buyerOther, winnerOther, objdata
}
//数据转换
func bidDataConvert(id string, datas *[]map[string]interface{}) (array []map[string]interface{}) {
if datas == nil || len(*datas) == 0 {
return array
}
index := 0
public.BidListConvert("", datas)
for _, v := range *datas {
if len(array) >= 10 {
break
}
_id, _ := v["_id"].(string)
if _id == id {
continue
}
v["_id"] = util.EncodeArticleId2ByCheck(_id)
area, _ := v["area"].(string)
if area == "A" {
v["area"] = ""
}
tp, _ := v["subtype"].(string)
if tp == "" {
tp, _ = v["toptype"].(string)
}
if tp == "" {
tp, _ = v["type"].(string)
if tp == "bid" {
tp = "中标"
} else if tp == "tender" {
tp = "招标"
} else {
tp = ""
}
}
indtry := util.ObjToString(v["industry"])
v["stypeadd"], v["areaadd"], v["indadd"] = classify(tp, area, indtry)
v["type"] = tp
diff := ""
publishtime, _ := v["publishtime"].(float64)
if publishtime != 0 {
diff = util.TimeDiff(time.Unix(util.Int64All(publishtime), 0))
v["pbtime"] = util.Int64All(publishtime)
}
v["publishtime"] = diff
index++
v["index"] = index
array = append(array, v)
}
return array
}
//剑鱼标讯保存
func (m *Front) AjaxReq() error {
defer util.Catch()
reqType := m.GetString("reqType")
var flag = "n"
switch reqType {
case "feedback": //意见反馈
data := make(map[string]interface{})
userId, ok := m.GetSession("userId").(string)
if !ok || userId == "" {
break
}
userInfo, ok := mongodb.FindById("user", userId, nil)
if !ok {
break
}
data["i_type"] = 8
data["s_fromName"] = m.GetString("fromName")
value := m.GetString("value")
if len([]rune(value)) > 200 {
value = util.SubString(value, 0, 200)
}
data["s_remark"] = value
s_nickname, _ := (*userInfo)["s_nickname"].(string)
s_name, _ := (*userInfo)["s_name"].(string)
s_phone, _ := (*userInfo)["s_phone"].(string)
if s_name != "" {
data["s_submitname"] = s_name
} else if s_nickname != "" {
data["s_submitname"] = s_nickname
} else if s_phone != "" {
data["s_submitname"] = s_phone
} else {
data["s_submitname"] = userId
}
data["s_submitid"] = userId
data["s_title"] = m.GetString("title")
data["i_status"] = 0
if s_nickname != "" { //昵称
data["s_username"] = s_nickname
} else if s_name != "" { //s_name
data["s_username"] = s_name
} else if s_phone != "" { //s_name
data["s_username"] = s_phone
} else { //s_name
data["s_username"] = userId
}
data["l_submitdate"] = time.Now().Unix()
data["s_source"] = m.GetString("source")
data["s_fkid"] = m.GetString("fkid")
data["s_from"] = "wx"
id := mongodb.Save("interaction", data)
if len(id) > 0 {
flag = "y"
}
break
case "subscribe": //直接订阅
if userid := m.GetSession("userId"); userid != nil {
r, _ := mongodb.FindById("user", userid.(string), `{"o_jy":1}`)
o_jy, _ := (*r)["o_jy"].(map[string]interface{})
a_key, _ := o_jy["a_key"].([]interface{})
keysArray := processKeyword(m.GetString("keys"))
if keysArray == nil {
break
}
var isExists bool
for _, v := range a_key {
//count := 0
//for _, kay := range keysArray {
keyMap, _ := v.(map[string]interface{})
key, _ := keyMap["key"].([]interface{})
kystr := ""
for _, ky := range key {
kystr = kystr + " " + ky.(string)
}
if strings.TrimSpace(m.GetString("keys")) == strings.TrimSpace(kystr) {
isExists = true
flag = "y"
break
}
//}
//if count == len(keysArray) {
// isExists = true
// flag = "y"
// break
//}
}
//如果不存在
if !isExists {
if len(a_key) >= 10 {
flag = "o"
} else {
if mongodb.UpdateById("user", userid,
bson.M{
"$push": bson.M{"o_jy.a_key": bson.M{"key": keysArray}},
"$set": bson.M{"i_ts_guide": 1, "o_jy.l_modifydate": time.Now().Unix()},
}) {
flag = "y"
}
}
}
}
break
}
m.ServeJson(map[string]interface{}{
"flag": flag,
})
return nil
}
const (
INDEX = "bidding"
TYPE = "bidding"
FINDF = `"title"`
)
//预览结果
func (m *Front) WxpushView() error {
defer util.Catch()
userid := util.ObjToString(m.GetSession("userId"))
openid := util.ObjToString(m.GetSession("s_m_openid"))
if openid == "" || userid == "" {
return m.Redirect("/swordfish/share/-1")
}
a_key, list := public.PushViewDatas(userid, "", bidSearch_field_1, 1, wx_pageSize)
public.BidListConvert("", list)
m.T["firstPage"] = list
m.T["hasNextPage"] = list != nil && len(*list) == wx_pageSize
m.T["pageSize"] = wx_pageSize
m.T["a_key"] = a_key
mynickname, _ := m.Session().Get("s_nickname").(string)
myavatar, _ := m.Session().Get("s_avatar").(string)
m.T["nickname"] = mynickname
m.T["avatar"] = myavatar
m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
m.T["openid"] = se.EncodeString(openid)
return m.Render("/weixin/resultpreview.html", &m.T)
}
func (m *Front) WxpushViewPaging() {
defer util.Catch()
var list *[]map[string]interface{}
pageNum, _ := m.GetInteger("pageNum")
if userid := m.Session().Get("userId"); userid != nil && pageNum <= wx_maxPageNum {
_, list = public.PushViewDatas(userid.(string), "", bidSearch_field_1, pageNum, wx_pageSize)
}
public.BidListConvert("", list)
m.ServeJson(map[string]interface{}{
"list": list,
"hasNextPage": list != nil && len(*list) == wx_pageSize && pageNum < wx_maxPageNum,
})
}
func (m *Front) Guide(sign string) error {
defer util.Catch()
if m.Session().Get("userId") == nil || m.Session().Get("s_m_openid") == nil {
return m.Redirect("/swordfish/share/-1")
}
m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
mynickname, _ := m.Session().Get("s_nickname").(string)
myavatar, _ := m.Session().Get("s_avatar").(string)
m.T["nickname"] = mynickname
m.T["avatar"] = myavatar
myopenid, _ := m.Session().Get("s_m_openid").(string)
m.T["openid"] = se.EncodeString(myopenid)
m.T["sign"] = sign
if sign == "other" {
userInfo, ok := mongodb.FindById("user", m.GetSession("userId").(string), `{"o_jy_msgset":1}`)
if ok {
m.T["msgset"] = (*userInfo)["o_jy_msgset"]
}
}
if sign == "share" {
return m.Render("/weixin/wxshareguide.html", &m.T)
} else {
return m.Render("/weixin/wxindex.html", &m.T)
}
}
func (m *Front) Share(openids string) error {
return m.Redirect("/swordfish/about")
//
defer util.Catch()
var openid = ""
var jy_code = ""
if openids != "-1" {
wxid_code := strings.Split(openids, "__")
if len(wxid_code) > 0 {
openid = wxid_code[0]
jy_code = wxid_code[1]
}
}
m.T["openid"] = openid
m.T["jy_code"] = jy_code
m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
mynickname, _ := m.Session().Get("s_nickname").(string)
myavatar, _ := m.Session().Get("s_avatar").(string)
m.T["nickname"] = mynickname
m.T["avatar"] = myavatar
return m.Render("/weixin/wxshare.html", &m.T)
}
func (m *Front) WxpushAjaxReq() error {
defer util.Catch()
userId := util.ObjToString(m.GetSession("userId"))
if userId != "" {
vsid, _ := m.GetInteger("vsid")
jy.SubscribePush.Visit(public.PushMysql, userId, vsid)
}
return nil
}
//
func (m *Front) About() error {
defer util.Catch()
code := m.GetString("code") //渠道
// 点浏览器打开时保持在原页面
come := m.GetString("come")
flag := m.GetString("flag")
if !mobileReg.MatchString(m.UserAgent()) && flag == "" {
return m.Redirect("/front/aboutus.html" + util.If(code != "", "?code="+code, "").(string))
}
myopenid, _ := m.Session().Get("s_m_openid").(string)
mynickname, _ := m.Session().Get("s_nickname").(string)
myavatar, _ := m.Session().Get("s_avatar").(string)
if myopenid == "" {
if m.GetString("state") == "wx" {
//微信跳回来的
code := m.GetString("code")
if code != "" {
openid := jyutil.Getopenid(code)
userInfo, ok := mongodb.FindOneByField("user", map[string]interface{}{
"s_m_openid": openid,
"i_appid": 2,
}, `{"_id":-1,"s_nickname":1,"s_m_openid":1}`)
if ok && userInfo != nil && len(*userInfo) > 0 {
mynickname, _ = (*userInfo)["s_nickname"].(string)
myopenid, _ = (*userInfo)["s_m_openid"].(string)
}
}
} else {
if public.CheckWxBrowser(m.Request) {
//所有参数都不再使用,跳到微信验证用户
return m.Redirect(fmt.Sprintf(config.Wxoauth, url.QueryEscape(m.Site()+m.Url()), "wx"), 302)
}
}
}
param := m.GetString("param")
var openid = ""
var activecode = ""
//分享后微信新用户打开落地页
if param != "-1" {
wxid_code := strings.Split(param, "__")
if len(wxid_code) > 0 {
openid = wxid_code[0]
}
if len(wxid_code) > 1 {
activecode = wxid_code[1]
}
}
qrcodeType := m.GetString("qrcodeType")
if qrcodeType != "" {
activecode = qrcodeType
}
m.T["code"] = code
m.T["source"] = m.GetString("source") //分享类型 app or 公众号
m.T["activecode"] = activecode
m.T["nickname"] = mynickname
m.T["avatar"] = myavatar
if openid == "" && myopenid != "" {
m.T["openid"] = se.EncodeString(myopenid)
} else {
m.T["openid"] = openid
}
m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
m.T["flag"] = flag
m.T["come"] = come
if come == "1" && !public.CheckWxBrowser(m.Request) {
return m.Redirect("https://www.jianyu360.com/jyapp/free/download/normal?source=weixinAutoRpl")
}
var open_infoid = ""
if m.GetString("source") == "open_infocontent" {
open_infoid = m.GetString("o")
m.T["open_infoid"] = open_infoid
m.T["code"] = "open00" + open_infoid
return m.Render("/weixin/about.html")
} else {
if myopenid == "" {
if public.CheckWxBrowser(m.Request) {
if code == "" {
m.T["code"] = "wx01" //新用户微信访问,统计app下载量
}
return m.Render("/weixin/sharePage.html")
} else {
return m.Redirect("/active/appExt/sh001")
}
} else {
if public.CheckWxBrowser(m.Request) {
m.T["isWeixin"] = 1
} else {
m.T["isWeixin"] = 0
}
return m.Render("/weixin/about.html")
}
}
}
//
func (m *Front) Shareabout(openids string) error {
defer util.Catch()
var openid = ""
if openids != "-1" {
wxid_code := strings.Split(openids, "__")
if len(wxid_code) > 0 {
openid = wxid_code[0]
}
}
myopenid, _ := m.Session().Get("s_m_openid").(string)
mynickname, _ := m.Session().Get("s_nickname").(string)
myavatar, _ := m.Session().Get("s_avatar").(string)
if openid == "" && myopenid != "" {
m.T["openid"] = se.EncodeString(myopenid)
} else {
m.T["openid"] = openid
}
m.T["nickname"] = mynickname
m.T["avatar"] = myavatar
m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
m.T["source"] = ""
if public.CheckWxBrowser(m.Request) {
m.T["isWeixin"] = 1
} else {
m.T["isWeixin"] = 0
}
return m.Render("/weixin/about.html")
}
//
func (m *Front) Aboutsearch() error {
myopenid, _ := m.Session().Get("s_m_openid").(string)
m.T["openid"] = se.EncodeString(myopenid)
mynickname, _ := m.Session().Get("s_nickname").(string)
myavatar, _ := m.Session().Get("s_avatar").(string)
m.T["nickname"] = mynickname
m.T["avatar"] = myavatar
m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
m.Render("/weixin/aboutsearch.html", &m.T)
return nil
}
//剑鱼标讯微信查询保存网站
func (m *Front) AboutSR() error {
defer util.Catch()
var flag = "N"
var sn = m.GetString("searchname")
var tp = m.GetString("tp")
if len(sn) > 0 {
switch tp {
case "S": //用户查询网站是否被收录
userId, ok := m.GetSession("userId").(string)
if !ok || userId == "" {
break
}
res, err := mongodb.FindOne("bidurlinfo", bson.M{"$or": []bson.M{bson.M{"s_name": sn}, bson.M{"s_url": sn}}})
if err {
if len(*res) > 0 {
flag = "T"
}
}
break
case "I": //用户提交数据
data := make(map[string]interface{})
userId, ok := m.GetSession("userId").(string)
if !ok || userId == "" {
break
}
userInfo, ok := mongodb.FindById("user", userId, nil)
if !ok {
break
}
data["i_type"] = 8
data["s_remark"] = sn
if (*userInfo)["s_name"] != nil {
data["s_submitname"] = (*userInfo)["s_name"].(string)
}
data["s_submitid"] = userId
data["s_title"] = m.GetString("title")
data["i_status"] = 0
if (*userInfo)["s_nickname"] != nil { //昵称
data["s_username"] = (*userInfo)["s_nickname"].(string)
} else if (*userInfo)["s_name"] != nil { //s_name
data["s_username"] = (*userInfo)["s_name"].(string)
}
data["l_submitdate"] = time.Now().Unix()
data["s_source"] = m.GetString("source")
data["s_from"] = "wx"
id := mongodb.Save("interaction", data)
if len(id) > 0 && len(sn) > 0 {
flag = "T"
}
break
}
}
m.ServeJson(map[string]interface{}{
"flag": flag,
})
return nil
}
//手动删除30天无更新数据
func (m *Front) DelOL() error {
defer util.Catch()
var ids []primitive.ObjectID
var flag = "F"
var arrid = strings.Split(m.GetString("arrid"), ",")
if len(arrid) > 0 {
for _, chid := range arrid {
_id, _ := primitive.ObjectIDFromHex(util.DecodeArticleId2ByCheck(chid)[0])
ids = append(ids, _id)
}
}
userId, ok := m.GetSession("userId").(string)
if !ok || userId == "" || len(ids) < 1 {
m.ServeJson(map[string]interface{}{
"flag": flag,
})
return nil
}
if datas, ok := mongodb.Find("follow_project", bson.M{"_id": bson.M{"$in": ids}, "s_userid": m.GetSession("userId").(string)}, nil, nil, false, -1, -1); ok && datas != nil {
for _, v := range *datas {
go delRelRedis(v["s_userid"], v["a_relationinfo"])
v["s_followid"] = BsonIdToSId(v["_id"])
delete(v, "_id")
v["i_status"] = 2
mongodb.Save("follow_project_back", v)
}
}
if mongodb.Del("follow_project", bson.M{"_id": bson.M{"$in": ids}, "s_userid": m.GetSession("userId").(string)}) {
flag = "T"
}
m.ServeJson(map[string]interface{}{
"flag": flag,
})
return nil
}
//获取我的反馈列表
func (f *Front) MyFeedbacks() error {
userId, _ := f.GetSession("userId").(string)
if userId == "" {
return f.Render("/_error.html")
}
list, ok := mongodb.Find("interaction", bson.M{"s_submitid": userId}, `{"l_submitdate":-1}`, `{"s_remark":1,"l_submitdate":1,"s_opinion":1,"i_status":1}`, false, 0, 200)
if !ok {
return nil
}
if f.Method() == "GET" {
f.T["list"] = list
f.T["flag"] = true
mynickname, _ := f.Session().Get("s_nickname").(string)
myavatar, _ := f.Session().Get("s_avatar").(string)
myopenid, _ := f.GetSession("s_m_openid").(string)
f.T["nickname"] = mynickname
f.T["avatar"] = myavatar
f.T["signature"] = wx.SignJSSDK(f.Site() + f.Url())
f.T["openid"] = se.EncodeString(myopenid)
_, f.T["advertText"] = getRewardText()
f.T["advertImg"] = config.Sysconfig["advertImg"]
f.T["advertName"] = config.Sysconfig["advertName"]
f.T["advertUrl"] = config.Sysconfig["advertUrl"]
return f.Render("/weixin/feedback.html")
}
f.ServeJson(map[string]interface{}{
"list": list,
})
return nil
}
func (f *Front) GetRecomKWs() {
recomKWChan <- true
defer func() {
<-recomKWChan
}()
value := f.GetString("value")
count, _ := f.GetInteger("count")
ves := strings.Split(value, " ")
var pairs []map[string]interface{}
for _, v := range ves {
Pw, _ := M.MostSimilar(strings.Split(v, "+"), []string{}, count)
for _, p := range Pw {
sim := p.Sim
word := p.Word
if sim < float32(config.Sysconfig["recommendThreshold"].(float64)) {
continue
}
if strings.HasSuffix(word, "路") || public.DealString(word) {
continue
}
pairs = append(pairs, map[string]interface{}{
"sim": sim,
"word": word,
})
}
}
f.ServeJson(pairs)
}
//记录用户行为--推荐关键词
func (f *Front) BehaviorRecord() {
flag := saveBehaviorRecord(f.Session(),
bson.M{
"s_word": f.GetString("value"),
"s_type": f.GetString("type"),
"s_source": f.GetString("source"),
})
f.ServeJson(bson.M{"flag": flag})
}
//记录用户行为
func saveBehaviorRecord(sess *httpsession.Session, data bson.M) bool {
userid, _ := sess.Get("userId").(string)
//if openId == "" {
// return false
//}
nickName, _ := sess.Get("s_nickname").(string)
//data["s_openid"] = openId
data["s_userid"] = userid
data["s_nickname"] = nickName
data["l_createtime"] = time.Now().Unix()
return len(mongodb.Save("behavior", data)) > 0
}
//取得剑鱼标讯博客的信息列表
func (f *Front) Jyblog(param /*参数*/ string) error {
querymap := map[string]string{}
if len(param) == 0 {
querymap = map[string]string{
"perPage": f.GetString("perPage"),
"currentPage": f.GetString("currentPage"),
"contentType": "jybk",
"query": f.GetString("query"),
}
} else {
//反转生成map
paramstr := param[1:]
bs, _ := base64.StdEncoding.DecodeString(paramstr)
json.Unmarshal(bs, &querymap)
}
var shareid = f.GetString("id")
if len(shareid) == 0 {
shareid = fmt.Sprintf("%s%d", config.Seoconfig["jybky"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9))
}
f.T["logid"] = config.Seoconfig["jybky"].(string)
f.DisableHttpCache()
shareid = se.EncodeString(shareid)
data, pagination := searhWebContentblog(querymap)
f.Render("/pc/jyblog.html", &xweb.T{"querymap": querymap, "data": data, "pagination": pagination, "shareid": shareid})
return nil
}
//实际的查询剑鱼标讯博客
func searhWebContentblog(querymap map[string]string) (*[]map[string]interface{}, *[]interface{}) {
perPage, _ := strconv.Atoi(querymap["perPage"])
currentPage, _ := strconv.Atoi(querymap["currentPage"])
//修复
if perPage == 0 {
perPage = 5
}
if currentPage < 1 {
currentPage = 1
}
contentType := querymap["contentType"]
queryStr := querymap["query"]
str := ``
if queryStr != "" {
str = `{
"match": {
"s_title": {
"query":"` + queryStr + `",
"operator": "and"
}
}
},{
"match": {
"s_content": {
"query":"` + queryStr + `"
}
}
}`
}
var tempQuery = `{"query": {
"bool": {
"must":[{"term":{"s_contenttype":"` + contentType + `"}}],
"should": [` + str + `],
"minimum_should_match": 0
}
}}`
var query = tempQuery[:len(tempQuery)-1] +
`,"highlight":{
"pre_tags":[""],
"post_tags":[""],
"fields":{
"s_title":{"force_source": true}
,"s_content":{"force_source": true}
}
},"_source":["s_title","s_date","s_contenttype","s_content","releasetime","s_description","praise","s_source","s_pic","s_pic1","l_createdate","s_code","_id","s_author"]
,"from":` + fmt.Sprintf("%v", ((currentPage-1)*perPage)) + `,
"size":` + fmt.Sprintf("%v", perPage) +
`,"sort":[{"releasetime":{"order":"desc"}}] }`
total := elastic.Count("content", "content", tempQuery)
//查询列表数据
client := elastic.GetEsConn()
defer elastic.DestoryEsConn(client)
if client == nil {
return nil, nil
}
searchResult, err := client.Search().Index("content").Type("content").Source(query).Do()
if err != nil {
return nil, nil
}
var res []map[string]interface{}
if searchResult.Hits != nil {
resNum := len(searchResult.Hits.Hits)
res = make([]map[string]interface{}, resNum)
for i, hit := range searchResult.Hits.Hits {
json.Unmarshal(*hit.Source, &res[i])
//查询结果数据加工处理
for k, v := range hit.Highlight {
res[i][k] = v[0]
}
s_content, _ := res[i]["s_content"].(string)
if len(s_content) > 500 {
res[i]["s_content"] = ""
} else {
con, _ := regexp.Compile("^[^<]*?>")
content := con.ReplaceAllString(s_content, "")
con1, _ := regexp.Compile("<[^>]*$")
res[i]["s_content"] = template.HTML(con1.ReplaceAllString(content, ""))
}
s_title, _ := res[i]["s_title"].(string)
res[i]["s_title"] = template.HTML(s_title)
tmpdate, _ := res[i]["l_createdate"]
res[i]["l_createdate"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate.(float64)), 0))
tmpdate1, _ := res[i]["releasetime"]
res[i]["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1.(float64)), 0))
res[i]["s_pic"] = config.Seoconfig["jyadd"].(string) + res[i]["s_pic"].(string)
res[i]["s_pic1"] = config.Seoconfig["jyadd"].(string) + res[i]["s_pic1"].(string)
res[i]["_id"] = se.EncodeString(res[i]["_id"].(string))
}
}
//生成分页
pagination := MakePagination(perPage, currentPage, int(total), querymap, "/jyblog/index_%s.html")
return &res, &pagination
}
//计算分页,分页显示规则
func MakePagination(perPage, currentPage, total int, param map[string]string, urltpl string) []interface{} {
var totalPages int //总页数
if total == 0 {
totalPages = 1
} else {
totalPages = (total - 1 + perPage) / perPage //总页数
}
ret := make([]interface{}, 3)
index := 0
prePage, nextPage := currentPage-1, currentPage+1
if prePage < 1 {
prePage = 1
}
if nextPage > totalPages {
nextPage = totalPages
}
param["currentPage"] = strconv.Itoa(prePage)
bs, _ := json.Marshal(param)
paramstr := base64.StdEncoding.EncodeToString(bs)
url := fmt.Sprintf(urltpl, paramstr)
iscurrent := currentPage == 1
ret[index] = map[string]interface{}{"page": "< 上一页", "url": url, "iscurrent": iscurrent}
index = index + 1
param["currentPage"] = strconv.Itoa(currentPage)
bs, _ = json.Marshal(param)
paramstr = base64.StdEncoding.EncodeToString(bs)
url = fmt.Sprintf(urltpl, paramstr)
iscurrent = currentPage == currentPage
ret[index] = map[string]interface{}{"page": currentPage, "url": url, "iscurrent": iscurrent}
index = index + 1
param["currentPage"] = strconv.Itoa(nextPage)
bs, _ = json.Marshal(param)
paramstr = base64.StdEncoding.EncodeToString(bs)
url = fmt.Sprintf(urltpl, paramstr)
iscurrent = currentPage == totalPages
ret[index] = map[string]interface{}{"page": "下一页 >", "url": url, "iscurrent": iscurrent}
return ret
}
//博客三级页
func (f *Front) Jybdetail(_id string) error {
var shareid = f.GetString("id")
if len(shareid) == 0 {
shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jybky"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9))
}
f.T["logid"] = config.Seoconfig["jybky"].(string)
shareid = se.EncodeString(shareid)
if ret := redis.Get("other", "jyblog_"+_id); ret != nil {
var retlist *map[string]interface{}
b, _ := json.Marshal(ret)
json.Unmarshal(b, &retlist)
(*retlist)["s_content"] = template.HTML((*retlist)["s_content"].(string))
(*retlist)["_id"] = (*retlist)["_id"].(string)
f.T["data"] = retlist
} else {
id := se.DecodeString(_id)
r := elastic.GetByIdField("content", "content", id, `"_id","s_title","l_createdate","s_pic","s_author","s_editorname","s_contenttype","praise","releasetime","s_subcontent","s_url","s_content","s_source","s_keywords","s_description","s_contenttype"`)
if r != nil {
tmpdate1, _ := (*r)["l_createdate"]
(*r)["l_createdate"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1.(float64)), 0))
tmpdate2, _ := (*r)["releasetime"]
(*r)["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate2.(float64)), 0))
(*r)["s_content"] = template.HTML((*r)["s_content"].(string))
(*r)["_id"] = se.EncodeString((*r)["_id"].(string))
(*r)["s_pic"] = (*r)["s_pic"].(string)
}
f.DisableHttpCache()
redis.Put("other", "jyblog_"+_id, r, 2*60*60)
f.T["data"] = r
}
f.T["shareid"] = shareid
return f.Render("/pc/jyblogdetail.html", &f.T)
}
//
func (f *Front) Blogpraise() error {
defer util.Catch()
id := se.DecodeString(f.GetString("id"))
stype := f.GetString("type")
flag := "F"
var blogflag = true
util.Try(func() {
if id != "" {
if stype == "up" {
blogflag = mongodb.Update("content", `{"_id":"`+id+`"}`, `{ "$inc" : { "praise" : 1 }}`, false, false)
} else if stype == "down" {
blogflag = mongodb.Update("content", `{"_id":"`+id+`"}`, `{ "$inc" : { "praise" : -1 }}`, false, false)
}
if blogflag {
flag = "T"
r, _ := mongodb.FindById("content", id, "")
elastic.UpdateNewDoc("content", "content", r)
redis.Del("other", "jyblog_"+f.GetString("id"))
}
}
}, func(e interface{}) {
log.Println("文章点赞出错", e)
})
f.ServeJson(map[string]interface{}{
"flag": flag,
})
return nil
}
//
func getRewardText() (string, string) {
rewardText, _ := config.Sysconfig["rewardText"].([]interface{})
advertText, _ := config.Sysconfig["advertText"].([]interface{})
randVal := rand.New(rand.NewSource(time.Now().UnixNano())).Intn(len(rewardText))
if len(advertText) != 0 {
advVal := rand.New(rand.NewSource(time.Now().UnixNano())).Intn(len(advertText))
return util.ObjToString(rewardText[randVal]), util.ObjToString(advertText[advVal])
} else {
return util.ObjToString(rewardText[randVal]), ""
}
}
//
func searchresulthtml(list *[]map[string]interface{}) string {
var listhtml = ""
var j = 1
for i := 0; i < len(*list); i++ {
listdata := (*list)[i]
j = i + 1
listhtml += `` + strconv.Itoa(j) + `.`
if listdata["title"] != "" {
listhtml += `
`
}
area, _ := listdata["area"].(string)
area = strings.TrimSpace(area)
finalType, _ := listdata["subtype"].(string)
if finalType == "" {
finalType = util.ObjToString(listdata["toptype"])
}
if finalType == "" {
finalType = util.ObjToString(listdata["type"])
if finalType == "bid" {
finalType = "中标"
} else if finalType == "tender" {
finalType = "招标"
} else {
finalType = ""
}
}
industry := util.ObjToString(listdata["industry"])
stpadd, areaadd, indadd := classify(finalType, area, industry)
if area != "" && area != "A" {
listhtml += `
` + area + ``
} else {
listhtml += `
`
}
if finalType != "" {
listhtml += `
` + finalType + ``
} else {
listhtml += `
`
}
//industry, _ := listdata["industry"].(string)
if industry != "" {
listhtml += `
` + industry + ``
} else {
listhtml += `
`
}
acount := ""
if listdata["bidamount"] != nil {
acount = ConversionMoeny(listdata["bidamount"])
} else if listdata["budget"] != nil {
acount = ConversionMoeny(listdata["budget"])
}
if acount != "" {
listhtml += `
` + acount + ``
} else {
listhtml += `
`
}
publishtime, _ := listdata["publishtime"].(float64)
if publishtime != 0 {
diff := util.TimeDiff(time.Unix(util.Int64All(publishtime), 0))
if diff != "" {
listhtml += `
` + diff + ``
}
}
listhtml += `
`
}
return listhtml
}
//标签查询
func (f *Front) SearchResult(at, name string) error {
defer util.Catch()
if at == "stype" && name == "NJ" {
return f.Redirect("/jylab/supsearch/proposedProject.html")
}
var no = 5
var area = ""
var stype = ""
var industry = ""
var startPage, currentPage, limitcount int
limitcount = util.IntAll(config.Seoconfig["limitcount"])
var res = ""
var seotitle = ""
var seokeywords = ""
var seodescription = ""
if len(industrylist) > 0 {
f.T["industrylist"], f.T["sortArray"] = industrylist, sortArray
} else {
f.T["industrylist"], f.T["sortArray"] = getindustrys()
}
var shareid = f.GetString("id")
if len(shareid) == 0 {
shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jybqy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9))
}
f.T["logid"] = config.Seoconfig["jybqy"].(string)
if at == "area" {
log.Println("config.Seoconfig", config.Seoconfig)
log.Println("config.Seoconfig.area", config.Seoconfig["area"])
areamp, _ := config.Seoconfig["area"].(map[string]interface{})
if areamp != nil {
areamp1 := areamp[name].(map[string]interface{})
if areamp1 != nil {
area = areamp1["NAME"].(string)
seotitle = areamp1["TITLE"].(string)
seokeywords = areamp1["KEYWORDS"].(string)
seodescription = areamp1["DESCRIPTION"].(string)
}
}
} else if at == "stype" {
stypemp, _ := config.Seoconfig["stype"].(map[string]interface{})
if stypemp != nil {
stypemp1 := stypemp[name].(map[string]interface{})
if stypemp1 != nil {
stype = stypemp1["NAME"].(string)
seotitle = stypemp1["TITLE"].(string)
seokeywords = stypemp1["KEYWORDS"].(string)
seodescription = stypemp1["DESCRIPTION"].(string)
}
}
} else if at == "industry" {
industrymp, _ := config.Seoconfig["industry"].(map[string]interface{})
if industrymp != nil {
industrymp1 := industrymp[name].(map[string]interface{})
if industrymp1 != nil {
industry = industrymp1["NAME"].(string)
seotitle = industrymp1["TITLE"].(string)
seokeywords = industrymp1["KEYWORDS"].(string)
seodescription = industrymp1["DESCRIPTION"].(string)
}
}
}
f.T["seoarea"] = area
f.T["seostype"] = stype
f.T["seotitle"] = seotitle
f.T["seokeywords"] = seokeywords
f.T["seodption"] = seodescription
if area == "全国" {
return f.Redirect("/swordfish/searchinfolist.html")
}
if area != "" || stype != "" || industry != "" {
list := redis.Get("other", "classify_"+name)
query1 := `{"query": {"bool": {"must":[`
if area != "" {
query1 += `{"term":{"area":"` + area + `"}}`
} else if stype != "" {
query1 += `{"term":{"subtype":"` + stype + `"}}`
} else if industry != "" {
query1 += `{"term":{"industry":"` + industry + `"}}`
}
query1 += `],"should": [],"minimum_should_match": 0}}}`
query := getLastNewsQuery(area, "", stype, industry)
var datas *[]map[string]interface{}
if list == nil {
count := elastic.Count(INDEX, TYPE, query1)
//log.Println("count:", count, "----", query)
r := rand.New(rand.NewSource(time.Now().UnixNano()))
currentPage = no
startPage = r.Intn(currentPage * limitcount)
count1 := util.IntAll(count)
if count1 < startPage || startPage < 0 {
startPage = 0
}
datas = elastic.GetPage(INDEX, TYPE, query, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","bidopentime","winner","buyer","bidamount","budget","s_subscopeclass","projectname"`, startPage, limitcount)
//log.Println("datas:", *datas)
if len(*datas) > 0 {
for _, v := range *datas {
v["_id"] = util.EncodeArticleId2ByCheck(util.ObjToString(v["_id"]))
}
}
redis.Put("other", "classify_"+name, datas, 2*60*60)
} else {
b, _ := json.Marshal(list)
json.Unmarshal(b, &datas)
}
public.BidListConvert(industry, datas)
res = searchresulthtml(datas)
f.T["res"] = res
f.T["area"] = area
f.T["stype"] = stype
f.T["industry"] = industry
f.T["classifyname"] = name
f.SetSession("paramarea", area)
f.SetSession("paraminfotype", stype)
f.T["shareid"] = se.EncodeString(shareid)
}
//
if userid := f.GetSession("userId"); userid != nil {
f.T["portraitpower"] = jylabutil.IsAuthorized(userid.(string), "i_portraitpower")
}
return f.Render("/pc/classifylist.html", &f.T)
}
//
func (f *Front) GetClassifyList() error {
defer util.Catch()
//判断用户是否开启超级搜索?
classifyname := f.GetString("classifyname")
data := redis.Get("other", "classify_"+classifyname)
f.ServeJson(map[string]interface{}{
"data": data,
})
return nil
}
//
func classify(stp, area, industry string) (string, string, string) {
var areas, _ = config.Seoconfig["area"].(map[string]interface{})
var stypes, _ = config.Seoconfig["stype"].(map[string]interface{})
var industrys, _ = config.Seoconfig["industry"].(map[string]interface{})
var tpadd = ""
var areaadd = ""
var induadd = ""
if area != "" && area != "A" {
for k, v := range areas {
if area == v.(map[string]interface{})["NAME"] {
areaadd = k
}
}
}
//
if stp != "" {
for k, v := range stypes {
if stp == v.(map[string]interface{})["NAME"] {
tpadd = k
}
}
}
//
if industry != "" {
for k, v := range industrys {
if strings.Contains(util.ObjToString(v.(map[string]interface{})["NAME"]), industry) {
induadd = k
}
}
}
return tpadd, areaadd, induadd
}
func (f *Front) HasPushHistory() {
//获取时间
var formatTime string
selectTime := f.GetString("selectTime")
// log.Println(selectTime, "---", f.GetString("area"))
lenStr := len([]rune(selectTime))
if selectTime != "" {
if selectTime != "undefined" && lenStr >= 10 {
selectTime = selectTime[0:10]
select_time, _ := strconv.ParseInt(selectTime, 10, 64)
//转化
formatTime = time.Unix(select_time, 0).Format("2006-01-02")
} else if lenStr < 10 {
formatTime = ""
}
}
userId := util.ObjToString(f.GetSession("userId"))
var industry_ = []string{}
if userId == "" {
return
}
user, _ := jy.SubscribePush.UserInfo(public.MQFW, userId)
hasKeyFlag := false
isVipFlag := false
isPassCount := false
isExpire := -1
tedayNum := time.Unix(time.Now().Unix(), 1).Format("20060102")
isOnTail := 0
var o_jy map[string]interface{}
isread := false
var keys []string
otherFlag := false
if user != nil {
o_jy, _ = (*user)["o_jy"].(map[string]interface{})
if o_jy != nil || len(o_jy) == 0 {
a_key, _ := o_jy["a_key"].([]interface{})
if a_key != nil {
for _, v := range a_key {
kv := util.ObjToMap(v)
keys = append(keys, util.ObjArrToStringArr((*kv)["key"].([]interface{}))...)
}
}
}
if util.IntAll((*user)["i_vip_status"]) == 1 || util.IntAll((*user)["i_vip_status"]) == 2 {
//
var threeRemind = int64(3 * 24 * 60 * 60)
var twoRemind = int64(2 * 24 * 60 * 60)
var oneRemind = int64(1 * 24 * 60 * 60)
var o_vipjy map[string]interface{}
if (*user)["isread"] != nil {
isread = (*user)["isread"].(bool)
}
o_vipjy, _ = (*user)["o_vipjy"].(map[string]interface{})
industry_ = util.ObjArrToStringArr(o_vipjy["a_buyerclass"].([]interface{}))
if o_vipjy["a_items"] != nil {
a_itmes := util.ObjArrToMapArr(o_vipjy["a_items"].([]interface{}))
hasKeyFlag = len(a_itmes) > 0
}
isVipFlag = true
isPassCount = redis.GetInt("pushcache_2_a", "oncecount_"+tedayNum+"_"+userId) >= 2000
isOnTail = util.IntAll((*user)["i_vip_status"])
_endtime := (*user)["l_vip_endtime"]
//是否到期
if util.Int64All(_endtime)-time.Now().Unix() < threeRemind && util.Int64All(_endtime)-time.Now().Unix() >= twoRemind {
isExpire = 3 //即将到期
} else if util.Int64All(_endtime)-time.Now().Unix() < twoRemind && util.Int64All(_endtime)-time.Now().Unix() >= oneRemind {
isExpire = 2 //即将到期
} else if util.Int64All(_endtime)-time.Now().Unix() < oneRemind && util.Int64All(_endtime)-time.Now().Unix() >= 0 {
isExpire = 1 //即将到期
}
//判断首次用户是否推送的带有”其他“
t, _ := time.ParseInLocation("2006-01-02", time.Now().Format("2006-01-02"), time.Local)
today_1 := t.Unix()
today_2 := t.AddDate(0, 0, 1).Unix()
if public.PushMysql.CountBySql("select count(1) as count from pushsubscribe where isvip =1 and userid =? and buyerclass=? and (date between ? and ? )", f.GetSession("userId"), 93, today_1, today_2) > 0 {
otherFlag = true
}
} else {
if (*user)["i_vip_status"] == nil {
isExpire = 0
} else {
isOnTail = util.IntAll((*user)["i_vip_status"])
}
if o_jy != nil || len(o_jy) == 0 {
a_key, _ := o_jy["a_key"].([]interface{})
hasKeyFlag = len(a_key) > 0
}
isPassCount = redis.GetInt("pushcache_2_a", "oncecount_"+tedayNum+"_"+userId) >= 150
}
}
pageNum, _ := f.GetInteger("pageNum")
if pageNum == 0 {
pageNum = 1
}
area := f.GetString("area")
hasNextPage, list := jy.SubscribePush.Datas(public.Mgo_Bidding, public.DbConf.Mongodb.Bidding.Collection, public.DbConf.Mongodb.Bidding.Collection_back, public.PushMysql, userId, pageNum, formatTime, area)
if hasKeyFlag && len(list) == 0 && formatTime == "" && area == "" && !isVipFlag {
flag, data := jy.SubscribePush.MakeHistoryDatas(public.MQFW, public.PushMysql, userId, public.PushView)
if flag && data != nil {
jsonBytes, err := json.Marshal(data)
err = json.Unmarshal(jsonBytes, &list)
if err != nil {
log.Println("err:", err)
}
}
}
//
f.ServeJson(map[string]interface{}{
"haskey": hasKeyFlag,
"data": list,
"hasNextPage": hasNextPage,
"isInTSguide": isInTSguide(userId),
"isVipSub": isVipFlag,
"isPassCount": isPassCount,
"isExpire": isExpire,
"isOnTail": isOnTail,
"userId": util.EncodeArticleId(userId),
"keys": keys,
"otherFlag": otherFlag,
"industry": industry_,
"isread": isread,
})
}
//历史推送
func (f *Front) Historypush() error {
myopenid := util.ObjToString(f.GetSession("s_m_openid"))
userId := util.ObjToString(f.GetSession("userId"))
if myopenid == "" || userId == "" {
return f.Redirect("/swordfish/share/-1")
}
//
times := f.GetString("times")
//
// 打开推送
data, ok := mongodb.FindById("user", userId, nil)
if ok && data != nil && len(*data) > 0 {
//VIP服务到期
vipSubtips := (*data)["i_vip_subtips"]
if vipSubtips == 0 {
if mongodb.UpdateById("user", userId, bson.M{"$set": bson.M{"i_vip_subtips": 1}}) {
return f.Redirect("/front/vipsubscribe/renewPage/exprie")
}
}
}
f.T["forceShareFlag"] = public.CheckUserNeedForceShare(myopenid, public.ShareType_push)
mynickname, _ := f.Session().Get("s_nickname").(string)
myavatar, _ := f.Session().Get("s_avatar").(string)
f.T["nickname"] = mynickname
f.T["avatar"] = myavatar
f.T["signature"] = wx.SignJSSDK(f.Site() + f.Url())
f.T["openid"] = se.EncodeString(myopenid)
f.T["stime"] = times
f.T["isVip"] = util.IntAll((*data)["i_vip_status"]) > 0
f.T["isread"] = (*data)["isread"]
f.T["userId"] = userId
//直播活动和预热活动期间
if config.ActiveConfig.Live_Active_End > time.Now().Unix() && time.Now().Unix() > config.ActiveConfig.Live_Preheat_Start {
f.T["LiveState"] = true
}
return f.Render("/weixin/historypush.html", &f.T)
}
func (f *Front) HistorypushPaging() error {
pageNum, _ := f.GetInteger("pageNum")
//
selectTime := f.GetString("selectTime")
var formatTime string
if selectTime != "" {
selectTime = selectTime[0:10]
select_time, _ := strconv.ParseInt(selectTime, 10, 64)
//转化
formatTime = time.Unix(select_time, 0).Format("2006-01-02")
}
area := f.GetString("area")
log.Println("~~~~~:", formatTime, "~~~~", selectTime, "~~~", pageNum, "~~~", area)
//
userId := util.ObjToString(f.GetSession("userId"))
if userId != "" {
// user, firstPushTime := public.HistoryPush.UserInfo(userId)
// if user == nil {
// return nil
// }
hasNextPage, list := jy.SubscribePush.Datas(public.Mgo_Bidding, public.DbConf.Mongodb.Bidding.Collection, public.DbConf.Mongodb.Bidding.Collection, public.PushMysql, userId, pageNum, formatTime, area)
// hasNextPage, list, _ := public.HistoryPush.Datas(userId, pageNum, firstPushTime, formatTime)
f.ServeJson(map[string]interface{}{
"hasNextPage": hasNextPage,
"data": list,
})
}
return nil
}
//电脑端招标订阅
func (m *Front) Subscribe() error {
var shareid = m.GetString("id")
if len(shareid) == 0 {
shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jydyy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[7:14], rand.Intn(9))
}
m.T["logid"] = config.Seoconfig["jydyy"].(string)
m.T["noshareid"] = shareid
m.T["shareid"] = se.EncodeString(shareid)
myopenid, _ := m.Session().Get("s_m_openid").(string)
m.T["openid"] = se.EncodeString(myopenid)
mynickname, _ := m.Session().Get("s_nickname").(string)
myavatar, _ := m.Session().Get("s_avatar").(string)
m.T["nickname"] = mynickname
m.T["avatar"] = myavatar
m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
return m.Render("/pc/subscribe_new.html", &m.T)
}
//获取高级查询所需的参数
func getShouldQueryMap(findfield, searchvalue, industry string) []map[string]string {
mps := []map[string]string{}
for _, v := range strings.Split(industry, ",") {
mp := map[string]string{}
for _, v := range strings.Split(searchvalue, "+") {
mp[v] = findfield
}
mp[v] = "s_subscopeclass"
mps = append(mps, mp)
}
return mps
}
func getSearchQuery(keyword, industry, minprice, maxprice, findfields, mustquery string) (qstr string) {
multi_match := `{"multi_match": {"query": "%s","type": "phrase", "fields": [%s]}}`
//match_phrase := `{"match_phrase": {"s_subscopeclass": "%s"}}`
query := `{"query":{"bool":{"must":[%s]}}}`
query_bool_should := `{"bool":{"should":[%s],"minimum_should_match": 1}}`
query_bools_must := `{"bool":{"must":[{"range":{"bidamount":{%s}}}],"must_not":[{"term":{"bidamount":0}},{"term":{"budget":0}}]}},{"bool":{"must":[{"term":{"bidamount":0}},{"range":{"budget":{%s}}}]}},{"bool":{"must":[{"term":{"budget":0}},{"range":{"bidamount":{%s}}}]}}`
query_bool_must := `{"bool":{"must":[{"terms":{"s_subscopeclass":[%s]}}]}}`
//rge := `{"range": {"bidamount": {%s}}},{"range": {"budget": {%s}}}`
gte := `"gte": %s`
lte := `"lte": %s`
musts := []string{}
if mustquery != "" {
musts = append(musts, mustquery)
}
if keyword != "" {
multi_match = fmt.Sprintf(multi_match, "%s", findfields)
shoulds := []string{}
for _, v := range strings.Split(keyword, "+") {
shoulds = append(shoulds, fmt.Sprintf(multi_match, elastic.ReplaceYH(v)))
}
musts = append(musts, fmt.Sprintf(elastic.NgramMust, strings.Join(shoulds, ",")))
}
if industry != "" {
industrys := strings.Split(industry, ",")
musts = append(musts, fmt.Sprintf(query_bool_must, `"`+strings.Join(industrys, `","`)+`"`))
}
if minprice != "" || maxprice != "" {
sq := ``
if minprice != "" {
min, _ := strconv.ParseFloat(minprice, 64)
minprice = fmt.Sprintf("%.0f", min*10000)
if minprice == "0" {
minprice = ""
}
}
if maxprice != "" {
max, _ := strconv.ParseFloat(maxprice, 64)
maxprice = fmt.Sprintf("%.0f", max*10000)
if maxprice == "0" {
maxprice = ""
}
}
if minprice != "" {
sq += fmt.Sprintf(gte, minprice)
}
if minprice != "" && maxprice != "" {
sq += `,`
}
if maxprice != "" {
sq += fmt.Sprintf(lte, maxprice)
}
query_price := fmt.Sprintf(query_bool_should, fmt.Sprintf(query_bools_must, sq, sq, sq))
musts = append(musts, query_price)
}
qstr = fmt.Sprintf(query, strings.Join(musts, ","))
//log.Println("getSearchQuery:", qstr)
return
}
//
func wxPushViewDatas(index, itype string, keys []elastic.KeyConfig, allquery, findfields, SortQuery, fields string, start, limit int) *[]map[string]interface{} {
query_all := `{"query":{"bool":{"must":[%s],"should":[%s],"minimum_should_match":1}}}`
match_detail := `{"match":{"detail":{"query":"%s","operator": "and"}}}`
minq := `{"multi_match": {"query": "%s","type": "phrase", "fields": [%s]}}`
highlightStr := `%s: {"fragment_size": %d,"number_of_fragments": 1}`
query_bool := `{"bool":{"must":[%s],"should":[%s],"must_not":[%s],"minimum_should_match":1}}`
bool_must := `{"bool":{"must":[%s]}}`
//
searchDetail := strings.Contains(findfields, `"detail"`)
if len(keys) > 0 {
qstr := ""
new_minq := fmt.Sprintf(minq, "%s", `"title"`)
not_new_minq := fmt.Sprintf(minq, "%s", `"title"`) //排除词只查询标题
musts := []string{}
for _, qs_words := range keys {
mq := []string{}
notmq := []string{}
shoulds := []string{}
keywords := []string{}
boolmusts := []string{}
for _, qs_word := range qs_words.Keys {
qs_word = elastic.ReplaceYH(qs_word)
keywords = append(keywords, qs_word)
boolmusts = append(boolmusts, fmt.Sprintf(new_minq, qs_word))
}
shoulds = append(shoulds, fmt.Sprintf(bool_must, strings.Join(boolmusts, ",")))
if searchDetail {
shoulds = append(shoulds, fmt.Sprintf(match_detail, strings.Join(keywords, " ")))
}
for _, qs_word := range qs_words.NotKeys {
notmq = append(notmq, fmt.Sprintf(not_new_minq, elastic.ReplaceYH(qs_word)))
if searchDetail {
notmq = append(notmq, fmt.Sprintf(match_detail, elastic.ReplaceYH(qs_word)))
}
}
if len(qs_words.Areas) > 0 {
mq = append(mq, fmt.Sprintf(`{"terms":{"area":["%s"]}}`, strings.Join(qs_words.Areas, `","`)))
}
if len(qs_words.InfoTypes) > 0 {
mq = append(mq, fmt.Sprintf(`{"terms":{"toptype":["%s"]}}`, strings.Join(qs_words.InfoTypes, `","`)))
}
musts = append(musts, fmt.Sprintf(query_bool, strings.Join(mq, ","), strings.Join(shoulds, ","), strings.Join(notmq, ",")))
}
qstr = fmt.Sprintf(query_all, "", strings.Join(musts, ","))
qstr = fmt.Sprintf(elastic.FilterQuery, allquery, qstr[1:])
ws := []string{}
for _, w := range strings.Split(findfields, ",") {
ws = append(ws, fmt.Sprintf(highlightStr, w, 1))
}
qstr = qstr[:len(qstr)-1] + `,` + fmt.Sprintf(elastic.HL, strings.Join(ws, ",")) + `}`
if len(fields) > 0 {
qstr = qstr[:len(qstr)-1] + `,"_source":[` + fields + "]}"
}
if len(SortQuery) > 0 {
qstr = qstr[:len(qstr)-1] + `,"sort":` + SortQuery + `}`
}
if start > -1 {
qstr = qstr[:len(qstr)-1] + `,"from":` + strconv.Itoa(start) + `,"size":` + strconv.Itoa(limit) + "}"
}
//log.Println("jy-ngram-find", qstr)
return elastic.Get(index, itype, qstr)
} else {
return nil
}
}
//金额转化 金额:0-万元以下单位为元 ,万元以上至亿元以下单位为万元 ,亿元以上单位为亿元。保留 小数点后 2 位,不进行四舍五入。
func ConversionMoeny(i_money interface{}) string {
m := ""
if reflect.TypeOf(i_money).Name() == "float64" {
m = strconv.FormatFloat(util.Float64All(i_money), 'f', -1, 64)
} else {
m = util.ObjToString(i_money)
}
if m == "" {
return m
}
m_arr := strings.Split(m, ".")
m_1 := m_arr[0]
len_m1 := len([]rune(m_1))
if len_m1 >= 9 {
m = m_1[0:len_m1-8] + "." + m_1[len_m1-8:len_m1-6] + "亿元"
} else if len_m1 >= 5 {
m = m_1[0:len_m1-4] + "." + m_1[len_m1-4:len_m1-2] + "万元"
} else {
if len(m_arr) == 1 {
return m + ".00元"
}
m_2 := m_arr[1]
if len([]rune(m_2)) > 1 {
m_2 = m_2[0:2]
} else {
m_2 = m_2[0:1] + "0"
}
m = m_1 + "." + m_2 + "元"
}
return m
}