|
@@ -2,28 +2,68 @@ package front
|
|
|
|
|
|
import (
|
|
import (
|
|
"encoding/json"
|
|
"encoding/json"
|
|
|
|
+ "errors"
|
|
|
|
+ "jfw/config"
|
|
|
|
+ "jfw/tools"
|
|
"log"
|
|
"log"
|
|
|
|
+ "qfw/util"
|
|
|
|
+ "qfw/util/elastic"
|
|
|
|
+ qum "qfw/util/mail"
|
|
|
|
+ "regexp"
|
|
"strings"
|
|
"strings"
|
|
- "jfw/tools"
|
|
|
|
|
|
+ "time"
|
|
|
|
+
|
|
"github.com/go-xweb/xweb"
|
|
"github.com/go-xweb/xweb"
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+var (
|
|
|
|
+ ExportTable string = "export_search"
|
|
|
|
+ ExConf ExportConfig
|
|
|
|
+ mailConfigMap map[string]interface{}
|
|
|
|
+)
|
|
|
|
+
|
|
type DataExport struct {
|
|
type DataExport struct {
|
|
*xweb.Action
|
|
*xweb.Action
|
|
toSieve xweb.Mapper `xweb:"/front/dataExport/toSieve"` //数据导出-条件筛选
|
|
toSieve xweb.Mapper `xweb:"/front/dataExport/toSieve"` //数据导出-条件筛选
|
|
sieveData xweb.Mapper `xweb:"/front/dataExport/sieveData"` //筛选数据
|
|
sieveData xweb.Mapper `xweb:"/front/dataExport/sieveData"` //筛选数据
|
|
toMyOrder xweb.Mapper `xweb:"/front/dataExport/toMyOrder"` //我的订单
|
|
toMyOrder xweb.Mapper `xweb:"/front/dataExport/toMyOrder"` //我的订单
|
|
queryOrder xweb.Mapper `xweb:"/front/dataExport/queryOrder"` //查询我的订单
|
|
queryOrder xweb.Mapper `xweb:"/front/dataExport/queryOrder"` //查询我的订单
|
|
|
|
+
|
|
|
|
+ superSearchExport xweb.Mapper `xweb:"/front/dataExport/superSearchExport"` //数据导出-超级搜索
|
|
|
|
+ toCreateOrderPage xweb.Mapper `xweb:"/front/dataExport/toCreateOrderPage/(.*)"` //数据导出-订单页面
|
|
|
|
+ previewData xweb.Mapper `xweb:"/front/dataExport/previewData/(.*)"` //数据导出-数据预览
|
|
|
|
+ sendMailVerify xweb.Mapper `xweb:"/front/dataExport/sendMailVerify"` //发送邮箱验证码
|
|
|
|
+ checkMailVerify xweb.Mapper `xweb:"/front/dataExport/checkMailVerify"` //验证邮箱验证码
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+//价格配置文件
|
|
|
|
+type ExportConfig struct {
|
|
|
|
+ UnitPrice_normal int64 `json:"unitPrice_normal"`
|
|
|
|
+ UnitPrice_senior int64 `json:"unitPrice_senior"`
|
|
|
|
+ Discount float64 `json:"discount"`
|
|
|
|
+ OrderMinPrice int64 `json:"orderMinPrice"`
|
|
|
|
+ MsgMaxCount int64 `json:"msgMaxCount"`
|
|
}
|
|
}
|
|
|
|
|
|
func init() {
|
|
func init() {
|
|
xweb.AddAction(&DataExport{})
|
|
xweb.AddAction(&DataExport{})
|
|
|
|
+ //读取配置文件
|
|
|
|
+ byte_conf, err := json.Marshal(config.Sysconfig["exportData"])
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Panic(err)
|
|
|
|
+ }
|
|
|
|
+ err = json.Unmarshal(byte_conf, &ExConf)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Panic(err)
|
|
|
|
+ }
|
|
|
|
+ mailConfigMap = config.Sysconfig["mail"].(map[string]interface{})
|
|
}
|
|
}
|
|
|
|
|
|
func (d *DataExport) ToSieve() error {
|
|
func (d *DataExport) ToSieve() error {
|
|
industrylist, sortArray = getindustrys()
|
|
industrylist, sortArray = getindustrys()
|
|
d.T["industrylist"] = industrylist
|
|
d.T["industrylist"] = industrylist
|
|
d.T["sortArray"] = sortArray
|
|
d.T["sortArray"] = sortArray
|
|
|
|
+ d.T["logid"] = config.Seoconfig["dataexport"].(string)
|
|
d.Render("/pc/dataExport_sieve.html", &d.T)
|
|
d.Render("/pc/dataExport_sieve.html", &d.T)
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
@@ -75,12 +115,18 @@ func (d *DataExport) SieveData() error {
|
|
"publishtime": publishtime,
|
|
"publishtime": publishtime,
|
|
"area": areaArr,
|
|
"area": areaArr,
|
|
"industry": industryArr,
|
|
"industry": industryArr,
|
|
- "keyword": keywordList,
|
|
|
|
|
|
+ "keywords": keywordList,
|
|
"buyer": buyerArr,
|
|
"buyer": buyerArr,
|
|
"winner": winnerArr,
|
|
"winner": winnerArr,
|
|
}
|
|
}
|
|
- reS := mongodb.Save(ExportTable, sieveCondition)
|
|
|
|
- log.Println("save ", reS)
|
|
|
|
|
|
+ _id := mongodb.Save(ExportTable, sieveCondition)
|
|
|
|
+ if _id != "" {
|
|
|
|
+ d.T["success"] = true
|
|
|
|
+ d.T["redirectUrl"] = "/front/dataExport/toCreateOrderPage/" + _id
|
|
|
|
+ } else {
|
|
|
|
+ d.T["success"] = false
|
|
|
|
+ }
|
|
|
|
+ d.ServeJson(&d.T)
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
@@ -110,3 +156,268 @@ func (d *DataExport) QueryOrder() error {
|
|
|
|
|
|
type Order struct {
|
|
type Order struct {
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+//---------------------------生成订单预览----------------------------------
|
|
|
|
+func (de *DataExport) SuperSearchExport() error {
|
|
|
|
+ openid := util.ObjToString(de.GetSession("s_m_openid"))
|
|
|
|
+ if openid == "" {
|
|
|
|
+ return errors.New("未登录")
|
|
|
|
+ }
|
|
|
|
+ //接收超级搜索页面参数
|
|
|
|
+ keywords := de.GetString("keywords") //搜索词
|
|
|
|
+ publishtime := de.GetString("publishtime") //发布时间
|
|
|
|
+ area := de.GetString("area") //地区
|
|
|
|
+ subtype := de.GetString("subtype") //信息类型
|
|
|
|
+ minprice := de.GetString("minprice") //最低价格
|
|
|
|
+ maxprice := de.GetString("maxprice") //最高价格
|
|
|
|
+ industry := strings.TrimSpace(de.GetString("industry")) //选中的行业
|
|
|
|
+ selectType := de.GetString("selectType") //标题 or 全文
|
|
|
|
+
|
|
|
|
+ //格式化keywords
|
|
|
|
+ KeyWordSave := []KeyWord{}
|
|
|
|
+ if len(keywords) > 0 {
|
|
|
|
+ keywordArr := strings.Split(keywords, " ")
|
|
|
|
+ if len(keywordArr) > 0 {
|
|
|
|
+ oneKw := KeyWord{}
|
|
|
|
+ if len(keywordArr) > 1 {
|
|
|
|
+ kwAppended := []string{}
|
|
|
|
+ for k, v := range keywordArr {
|
|
|
|
+ if k == 0 {
|
|
|
|
+ oneKw.Keyword = v
|
|
|
|
+ } else {
|
|
|
|
+ kwAppended = append(kwAppended, v)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ oneKw.Appended = kwAppended
|
|
|
|
+ } else {
|
|
|
|
+ oneKw.Keyword = keywordArr[0]
|
|
|
|
+ }
|
|
|
|
+ KeyWordSave = append(KeyWordSave, oneKw)
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ areaSave := []string{}
|
|
|
|
+ if len(area) > 0 {
|
|
|
|
+ areaSave = strings.Split(area, ",")
|
|
|
|
+ }
|
|
|
|
+ industrySave := []string{}
|
|
|
|
+ if len(industry) > 0 {
|
|
|
|
+ industrySave = strings.Split(industry, ",")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ data := map[string]interface{}{
|
|
|
|
+ "keywords": KeyWordSave,
|
|
|
|
+ "publishtime": publishtime,
|
|
|
|
+ "area": areaSave,
|
|
|
|
+ "subtype": subtype,
|
|
|
|
+ "minprice": minprice,
|
|
|
|
+ "maxprice": maxprice,
|
|
|
|
+ "industry": industrySave,
|
|
|
|
+ "selectType": selectType,
|
|
|
|
+ "comeintime": time.Now().Unix(),
|
|
|
|
+ "s_openid": openid,
|
|
|
|
+ }
|
|
|
|
+ //存入数据库
|
|
|
|
+ _id := mongodb.Save(ExportTable, data)
|
|
|
|
+ //携带id跳转订单生成页面
|
|
|
|
+ de.Redirect("/front/dataExport/toCreateOrderPage/" + _id)
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+func (de *DataExport) ToCreateOrderPage(_id string) error {
|
|
|
|
+ var (
|
|
|
|
+ query *map[string]interface{}
|
|
|
|
+ ok bool
|
|
|
|
+ msgCount int64
|
|
|
|
+ //查询字段
|
|
|
|
+ keywords []KeyWord
|
|
|
|
+ industry []string
|
|
|
|
+ minprice string
|
|
|
|
+ maxprice string
|
|
|
|
+ selectType string
|
|
|
|
+ area []string
|
|
|
|
+ publishtime string
|
|
|
|
+ subtype string
|
|
|
|
+ buyer []string //招标单位
|
|
|
|
+ winner []string //中标单位
|
|
|
|
+ )
|
|
|
|
+ openid := util.ObjToString(de.GetSession("s_m_openid"))
|
|
|
|
+ if openid == "" {
|
|
|
|
+ return errors.New("未登录")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if query, ok = mongodb.FindById(ExportTable, _id, nil); !ok {
|
|
|
|
+ return errors.New("未找到搜索记录")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ keywords = getKeyWordArrFromDbResult((*query)["keywords"])
|
|
|
|
+ industry = getStringArrFromDbResult((*query)["industry"])
|
|
|
|
+ minprice = util.ObjToString((*query)["minprice"])
|
|
|
|
+ maxprice = util.ObjToString((*query)["maxprice"])
|
|
|
|
+ subtype = util.ObjToString((*query)["subtype"])
|
|
|
|
+ area = getStringArrFromDbResult((*query)["area"])
|
|
|
|
+ selectType = util.ObjToString((*query)["selectType"])
|
|
|
|
+ publishtime = util.ObjToString((*query)["publishtime"])
|
|
|
|
+ subtype = util.ObjToString((*query)["subtype"])
|
|
|
|
+ buyer = getStringArrFromDbResult((*query)["buyer"])
|
|
|
|
+ winner = getStringArrFromDbResult((*query)["winner"])
|
|
|
|
+
|
|
|
|
+ //qstr := getSearchQuery(keywords, industry, minprice, maxprice, selectType, getBidSearchQuery(area, publishtime, subtype))
|
|
|
|
+ qstr := getDataExportSql(keywords, industry, minprice, maxprice, subtype, area, selectType, publishtime, buyer, winner)
|
|
|
|
+ msgCount = elastic.Count(INDEX, TYPE, qstr)
|
|
|
|
+
|
|
|
|
+ if msgCount > ExConf.MsgMaxCount {
|
|
|
|
+ msgCount = ExConf.MsgMaxCount
|
|
|
|
+ }
|
|
|
|
+ de.T["logid"] = config.Seoconfig["dataexport"].(string)
|
|
|
|
+
|
|
|
|
+ if msgCount == 0 {
|
|
|
|
+ de.Render("/pc/dataExport_noDataErr.html", &de.T)
|
|
|
|
+ return nil
|
|
|
|
+ }
|
|
|
|
+ de.T["msgCount"] = msgCount
|
|
|
|
+ de.T["msgMaxCount"] = ExConf.MsgMaxCount
|
|
|
|
+ de.T["discount"] = ExConf.Discount
|
|
|
|
+ de.T["unitPrice_normal"] = ExConf.UnitPrice_normal
|
|
|
|
+ de.T["unitPrice_senior"] = ExConf.UnitPrice_senior
|
|
|
|
+ de.T["orderMinPrice"] = ExConf.OrderMinPrice
|
|
|
|
+ de.Render("/pc/createOrderPage.html", &de.T)
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+func getKeyWordArrFromDbResult(k interface{}) (arr []KeyWord) {
|
|
|
|
+ if k == nil {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ kArr := k.([]interface{})
|
|
|
|
+ for _, v := range kArr {
|
|
|
|
+ kw := KeyWord{}
|
|
|
|
+ b, e := json.Marshal(v)
|
|
|
|
+ if e != nil {
|
|
|
|
+ log.Println(e.Error())
|
|
|
|
+ }
|
|
|
|
+ json.Unmarshal(b, &kw)
|
|
|
|
+ arr = append(arr, kw)
|
|
|
|
+ }
|
|
|
|
+ return
|
|
|
|
+}
|
|
|
|
+func getStringArrFromDbResult(c interface{}) (arr []string) {
|
|
|
|
+ if c != nil {
|
|
|
|
+ cArr := c.([]interface{})
|
|
|
|
+ arr = util.ObjArrToStringArr(cArr)
|
|
|
|
+ }
|
|
|
|
+ return
|
|
|
|
+}
|
|
|
|
+func (de *DataExport) PreviewData(_id string) error {
|
|
|
|
+ var (
|
|
|
|
+ query *map[string]interface{}
|
|
|
|
+ ok bool
|
|
|
|
+ //查询字段
|
|
|
|
+ keywords []KeyWord
|
|
|
|
+ industry []string
|
|
|
|
+ minprice string
|
|
|
|
+ maxprice string
|
|
|
|
+ selectType string
|
|
|
|
+ area []string
|
|
|
|
+ publishtime string
|
|
|
|
+ subtype string
|
|
|
|
+ buyer []string //招标单位
|
|
|
|
+ winner []string //中标单位
|
|
|
|
+ )
|
|
|
|
+ dataType := de.GetString("dataType")
|
|
|
|
+ openid := util.ObjToString(de.GetSession("s_m_openid"))
|
|
|
|
+ if openid == "" {
|
|
|
|
+ return errors.New("未登录")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if query, ok = mongodb.FindById(ExportTable, _id, nil); !ok {
|
|
|
|
+ return errors.New("未找到搜索记录")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ keywords = getKeyWordArrFromDbResult((*query)["keywords"])
|
|
|
|
+ industry = getStringArrFromDbResult((*query)["industry"])
|
|
|
|
+ minprice = util.ObjToString((*query)["minprice"])
|
|
|
|
+ maxprice = util.ObjToString((*query)["maxprice"])
|
|
|
|
+ subtype = util.ObjToString((*query)["subtype"])
|
|
|
|
+ area = getStringArrFromDbResult((*query)["area"])
|
|
|
|
+ selectType = util.ObjToString((*query)["selectType"])
|
|
|
|
+ publishtime = util.ObjToString((*query)["publishtime"])
|
|
|
|
+ subtype = util.ObjToString((*query)["subtype"])
|
|
|
|
+ buyer = getStringArrFromDbResult((*query)["buyer"])
|
|
|
|
+ winner = getStringArrFromDbResult((*query)["winner"])
|
|
|
|
+
|
|
|
|
+ dataexport_field := `"_id","title","description","area","city","publishtime","projectname","buyer","winner","bidamount","subtype"`
|
|
|
|
+ if dataType == "2" {
|
|
|
|
+ dataexport_field += `,"href","projectcode","buyerperson","buyertel","budget","bidopentime","agency"`
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //查询
|
|
|
|
+ qstr := getDataExportSql(keywords, industry, minprice, maxprice, subtype, area, selectType, publishtime, buyer, winner)
|
|
|
|
+ res := elastic.GetAllByIk(INDEX, TYPE, qstr, "", bidSearch_sort, dataexport_field, 0, 5, 5, false)
|
|
|
|
+ //格式化输出
|
|
|
|
+ for k, v := range *res {
|
|
|
|
+ v["index"] = k + 1
|
|
|
|
+ if v["bidamount"] != nil {
|
|
|
|
+ v["bidamount"] = v["bidamount"].(float64) / 10000
|
|
|
|
+ }
|
|
|
|
+ if v["publishtime"] != nil {
|
|
|
|
+ date := v["publishtime"]
|
|
|
|
+ v["publishtime"] = util.FormatDateWithObj(&date, util.Date_Short_Layout)
|
|
|
|
+ }
|
|
|
|
+ if v["_id"] != nil {
|
|
|
|
+ v["url"] = config.Sysconfig["webdomain"].(string) + "/article/content/" + util.CommonEncodeArticle("content", v["_id"].(string)) + ".html"
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ de.T["data"] = res
|
|
|
|
+ de.T["dataType"] = dataType
|
|
|
|
+ de.Render("/pc/previewData.html", &de.T)
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (de *DataExport) SendMailVerify() {
|
|
|
|
+ email := de.GetString("email")
|
|
|
|
+ if isEmail(email) {
|
|
|
|
+ lastSendDEVerify := util.Int64All(de.GetSession("CreatEVerifyTime"))
|
|
|
|
+ timeSpaceing := lastSendDEVerify - time.Now().Unix() + 60*5
|
|
|
|
+
|
|
|
|
+ log.Println("~~~~", lastSendDEVerify, timeSpaceing)
|
|
|
|
+ if lastSendDEVerify == 0 || timeSpaceing < 0 {
|
|
|
|
+ //生成随机数
|
|
|
|
+ verifyStr := strings.ToUpper(util.GetComplexRandom(6, 3, 3))
|
|
|
|
+ de.SetSession("DataExportVerify", verifyStr)
|
|
|
|
+ de.SetSession("CreatEVerifyTime", time.Now().Unix())
|
|
|
|
+ log.Println("====================", verifyStr, "====================")
|
|
|
|
+ //发送邮箱验证码
|
|
|
|
+ qum.SendMail(&qum.MailAuth{mailConfigMap["addr"].(string), mailConfigMap["port"].(int), mailConfigMap["user"].(string), mailConfigMap["pwd"].(string)}, &qum.Message{"剑鱼招标订阅邮箱校验", "剑鱼招标订阅", []string{email}, "您可以使用此验证码来验证您是该电子邮件地址的所有者。<font size=3>" + verifyStr + "</font>;如果这不是您本人所为,则可能是有人误输了您的电子邮件地址。请勿将此验证码泄露给他人,并且您目前无需执行任何其它操作。"})
|
|
|
|
+ de.T["success"] = true
|
|
|
|
+ } else {
|
|
|
|
+ de.T["success"] = false
|
|
|
|
+ de.T["errCode"] = 2
|
|
|
|
+ de.T["time"] = timeSpaceing
|
|
|
|
+ de.T["errMsg"] = "已发送,5分钟后再尝试"
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ de.T["success"] = false
|
|
|
|
+ de.T["errCode"] = 1
|
|
|
|
+ de.T["errMsg"] = "验证码校验失败"
|
|
|
|
+ }
|
|
|
|
+ de.ServeJson(&de.T)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (de *DataExport) CheckMailVerify() {
|
|
|
|
+ emailVerity := de.GetString("emailVerity")
|
|
|
|
+ DataExportVerify := de.GetSession("DataExportVerify")
|
|
|
|
+ verityResult := false
|
|
|
|
+ if emailVerity != "" && emailVerity == DataExportVerify {
|
|
|
|
+ verityResult = true
|
|
|
|
+ de.DelSession("DataExportVerify")
|
|
|
|
+ de.DelSession("CreatEVerifyTime")
|
|
|
|
+ de.SetSession("EMVerifySucess", true)
|
|
|
|
+ }
|
|
|
|
+ de.T["success"] = verityResult
|
|
|
|
+ de.ServeJson(&de.T)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func isEmail(value string) bool {
|
|
|
|
+ var emailPattern = regexp.MustCompile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$")
|
|
|
|
+ return emailPattern.MatchString(value)
|
|
|
|
+}
|