|
@@ -1,91 +1,171 @@
|
|
|
-package util
|
|
|
-
|
|
|
-import (
|
|
|
- "fmt"
|
|
|
- qutil "qfw/util"
|
|
|
- "qfw/util/sms"
|
|
|
- "strings"
|
|
|
-)
|
|
|
-
|
|
|
-var Se_Topnet = qutil.SimpleEncrypt{Key: "topnet"}
|
|
|
-
|
|
|
-//根据模板发送短信,模板是运营商设定的。
|
|
|
-//第三个参数是可变参数,可以传入多个,但要和模板相匹配
|
|
|
-func SendSMS(tplcode /*模板代码*/, mobile /*手机号码*/ string, param map[string]string) {
|
|
|
- tmp := []string{}
|
|
|
- for k, v := range param {
|
|
|
- tmp = append(tmp, "#"+k+"#="+v)
|
|
|
- }
|
|
|
- text := strings.Join(tmp, "&")
|
|
|
- sms.SendSms(mobile, tplcode, text)
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
- * 结果列表转换,目前只换行行业字段
|
|
|
- * 所有的招标搜索都要调用此方法,列表中有展示行业的也可以用
|
|
|
- * industry 搜索条件中的行业,默认为空
|
|
|
- */
|
|
|
-func BidListConvert(industry string, list *[]map[string]interface{}) {
|
|
|
- if list == nil {
|
|
|
- return
|
|
|
- }
|
|
|
- commonSubstring := func(v string) (value string) {
|
|
|
- bcs := strings.Split(v, "_")
|
|
|
- if len(bcs) == 1 {
|
|
|
- value = bcs[0]
|
|
|
- } else if len(bcs) == 2 {
|
|
|
- value = bcs[0]
|
|
|
- if strings.TrimSpace(value) == "" {
|
|
|
- value = bcs[0]
|
|
|
- }
|
|
|
- }
|
|
|
- return
|
|
|
- }
|
|
|
- for _, v := range *list {
|
|
|
- budget, _ := v["budget"].(float64)
|
|
|
- bidamount, _ := v["bidamount"].(float64)
|
|
|
- if budget == 0 || strings.TrimSpace(fmt.Sprint(v["budget"])) == "" {
|
|
|
- delete(v, "budget")
|
|
|
- }
|
|
|
- if bidamount == 0 || strings.TrimSpace(fmt.Sprint(v["bidamount"])) == "" {
|
|
|
- delete(v, "bidamount")
|
|
|
- }
|
|
|
- value := ""
|
|
|
- subscopeclass, _ := v["s_subscopeclass"].(string)
|
|
|
- subscopeclass = strings.Trim(subscopeclass, ",")
|
|
|
- bct := strings.Split(subscopeclass, ",")
|
|
|
- if bct == nil || len(bct) == 0 {
|
|
|
- continue
|
|
|
- }
|
|
|
- //搜索条件中没有行业的话,取查询结果中第一个行业
|
|
|
- if industry == "" {
|
|
|
- value = commonSubstring(bct[0])
|
|
|
- } else { //搜索条件中有行业的话,取行业中和搜索条件相对应的第一个
|
|
|
- industrys := strings.Split(industry, ",")
|
|
|
- L:
|
|
|
- for _, bc := range bct {
|
|
|
- for _, is := range industrys {
|
|
|
- if bc == is {
|
|
|
- value = commonSubstring(bc)
|
|
|
- break L
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if strings.TrimSpace(value) == "" {
|
|
|
- continue
|
|
|
- }
|
|
|
- v["industry"] = value
|
|
|
- }
|
|
|
-}
|
|
|
-func GetMyPhone(userId string) string {
|
|
|
- u, ok := MQFW.FindById("user", userId, `{"s_phone":1,"s_m_phone":1}`)
|
|
|
- if ok && u != nil {
|
|
|
- if s_phone, _ := (*u)["s_phone"].(string); s_phone != "" {
|
|
|
- return s_phone
|
|
|
- } else if s_m_phone, _ := (*u)["s_m_phone"].(string); s_m_phone != "" {
|
|
|
- return s_m_phone
|
|
|
- }
|
|
|
- }
|
|
|
- return ""
|
|
|
-}
|
|
|
+package util
|
|
|
+
|
|
|
+import (
|
|
|
+ "crypto/rand"
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+ "io/ioutil"
|
|
|
+ "log"
|
|
|
+ "math/big"
|
|
|
+ "net/http"
|
|
|
+ "net/url"
|
|
|
+ qutil "qfw/util"
|
|
|
+ "qfw/util/sms"
|
|
|
+ "regexp"
|
|
|
+ "strings"
|
|
|
+)
|
|
|
+
|
|
|
+var Se_Topnet = qutil.SimpleEncrypt{Key: "topnet"}
|
|
|
+
|
|
|
+var filterReg_3 = regexp.MustCompile("(项目|公告|公示)$")
|
|
|
+var filterReg_2 = regexp.MustCompile("^[)\\)>》】\\]}}〕,,;;::'\"“”。.\\??、/+=\\_—*&……\\^%$¥@!!`~·(\\(<《【\\[{{〔]+$")
|
|
|
+var filterReg_1 = regexp.MustCompile("^([0-9]{1,3}|[零一二三四五六七八九十]{1,2}|联系人?|电话|地址|编号|采购|政府采购|成交|更正|招标|中标|变更|结果)$")
|
|
|
+var filterReg = regexp.MustCompile("^[的人号时元万公告项目地址电话邮编日期联系招标中结果成交项目项目采购采购项目政府采购公告更正公告]+$")
|
|
|
+
|
|
|
+func FilteKey(k string) string {
|
|
|
+ k = strings.TrimSpace(k)
|
|
|
+ k = filterReg_3.ReplaceAllString(k, "")
|
|
|
+ k = filterReg_2.ReplaceAllString(k, "")
|
|
|
+ k = filterReg_1.ReplaceAllString(k, "")
|
|
|
+ k = filterReg.ReplaceAllString(k, "")
|
|
|
+ return k
|
|
|
+}
|
|
|
+
|
|
|
+//根据模板发送短信,模板是运营商设定的。
|
|
|
+//第三个参数是可变参数,可以传入多个,但要和模板相匹配
|
|
|
+func SendSMS(tplcode /*模板代码*/, mobile /*手机号码*/ string, param map[string]string) {
|
|
|
+ tmp := []string{}
|
|
|
+ for k, v := range param {
|
|
|
+ tmp = append(tmp, "#"+k+"#="+v)
|
|
|
+ }
|
|
|
+ text := strings.Join(tmp, "&")
|
|
|
+ sms.SendSms(mobile, tplcode, text)
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * 结果列表转换,目前只换行行业字段
|
|
|
+ * 所有的招标搜索都要调用此方法,列表中有展示行业的也可以用
|
|
|
+ * industry 搜索条件中的行业,默认为空
|
|
|
+ */
|
|
|
+func BidListConvert(industry string, list *[]map[string]interface{}) {
|
|
|
+ if list == nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ commonSubstring := func(v string) (value string) {
|
|
|
+ bcs := strings.Split(v, "_")
|
|
|
+ if len(bcs) == 1 {
|
|
|
+ value = bcs[0]
|
|
|
+ } else if len(bcs) == 2 {
|
|
|
+ value = bcs[0]
|
|
|
+ if strings.TrimSpace(value) == "" {
|
|
|
+ value = bcs[0]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, v := range *list {
|
|
|
+ budget, _ := v["budget"].(float64)
|
|
|
+ bidamount, _ := v["bidamount"].(float64)
|
|
|
+ if budget == 0 || strings.TrimSpace(fmt.Sprint(v["budget"])) == "" {
|
|
|
+ delete(v, "budget")
|
|
|
+ }
|
|
|
+ if bidamount == 0 || strings.TrimSpace(fmt.Sprint(v["bidamount"])) == "" {
|
|
|
+ delete(v, "bidamount")
|
|
|
+ }
|
|
|
+ value := ""
|
|
|
+ subscopeclass, _ := v["s_subscopeclass"].(string)
|
|
|
+ subscopeclass = strings.Trim(subscopeclass, ",")
|
|
|
+ bct := strings.Split(subscopeclass, ",")
|
|
|
+ if bct == nil || len(bct) == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ //搜索条件中没有行业的话,取查询结果中第一个行业
|
|
|
+ if industry == "" {
|
|
|
+ value = commonSubstring(bct[0])
|
|
|
+ } else { //搜索条件中有行业的话,取行业中和搜索条件相对应的第一个
|
|
|
+ industrys := strings.Split(industry, ",")
|
|
|
+ L:
|
|
|
+ for _, bc := range bct {
|
|
|
+ for _, is := range industrys {
|
|
|
+ if bc == is {
|
|
|
+ value = commonSubstring(bc)
|
|
|
+ break L
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if strings.TrimSpace(value) == "" {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ v["industry"] = value
|
|
|
+ }
|
|
|
+}
|
|
|
+func GetMyPhone(userId string) string {
|
|
|
+ u, ok := MQFW.FindById("user", userId, `{"s_phone":1,"s_m_phone":1}`)
|
|
|
+ if ok && u != nil {
|
|
|
+ if s_phone, _ := (*u)["s_phone"].(string); s_phone != "" {
|
|
|
+ return s_phone
|
|
|
+ } else if s_m_phone, _ := (*u)["s_m_phone"].(string); s_m_phone != "" {
|
|
|
+ return s_m_phone
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ""
|
|
|
+}
|
|
|
+
|
|
|
+func HttpEs(ques, analyzer, esAddress string) (res string) {
|
|
|
+ var addrs []string
|
|
|
+ surl := ""
|
|
|
+ for _, s := range strings.Split(esAddress, ",") {
|
|
|
+ addrs = append(addrs, s)
|
|
|
+ }
|
|
|
+ i, _ := rand.Int(rand.Reader, big.NewInt(int64(len(addrs)))) //随机
|
|
|
+ surl = addrs[int(i.Int64())] + "/bidding/_analyze"
|
|
|
+ URL, _ := url.Parse(surl)
|
|
|
+ Q := URL.Query()
|
|
|
+ Q.Add("text", ques)
|
|
|
+ Q.Add("analyzer", analyzer)
|
|
|
+ URL.RawQuery = Q.Encode()
|
|
|
+ resp, err := http.Get(URL.String())
|
|
|
+ if err != nil {
|
|
|
+ log.Println("es连接失败 err1:", err)
|
|
|
+ resp, err = getesResp(ques, analyzer, addrs)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ result, err := ioutil.ReadAll(resp.Body)
|
|
|
+ if err == nil {
|
|
|
+ defer resp.Body.Close()
|
|
|
+ var resmap map[string]interface{}
|
|
|
+ json.Unmarshal(result, &resmap)
|
|
|
+ if resmap != nil {
|
|
|
+ tokens := util.ObjArrToMapArr(resmap["tokens"].([]interface{}))
|
|
|
+ for k, v := range tokens {
|
|
|
+ if FilteKey(util.ObjToString(v["token"])) != "" {
|
|
|
+ if k > 0 {
|
|
|
+ res += "+"
|
|
|
+ }
|
|
|
+ res += util.ObjToString(v["token"])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+func getesResp(ques, analyzer string, addrs []string) (resp *http.Response, err error) {
|
|
|
+ for _, v := range addrs {
|
|
|
+ surl := v + "/bidding/_analyze"
|
|
|
+ URL, _ := url.Parse(surl)
|
|
|
+ Q := URL.Query()
|
|
|
+ Q.Add("text", ques)
|
|
|
+ Q.Add("analyzer", analyzer)
|
|
|
+ URL.RawQuery = Q.Encode()
|
|
|
+ resp, err = http.Get(URL.String())
|
|
|
+ if err == nil {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return resp, err
|
|
|
+}
|