detailStruct.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/gogf/gf/v2/frame/g"
  6. "github.com/gogf/gf/v2/util/gconv"
  7. "jybxseo/internal/consts"
  8. "jybxseo/utility"
  9. "strings"
  10. "time"
  11. )
  12. var (
  13. JyBxSeoDetailRoot *DetailRoot = &DetailRoot{}
  14. DetailNeedMosaic map[string]interface{}
  15. PreviewClassTemplate = map[string]string{}
  16. BidTemplate = map[string]string{}
  17. WinBidTemplate = map[string]string{}
  18. CreditBidTemplate = map[string]string{}
  19. BottomDescribe string
  20. )
  21. type (
  22. DetailRoot struct{}
  23. )
  24. // GetDetail 根据seoId查询标讯详情
  25. // seoId 标讯seoId标识
  26. // isLogin 是否登录,未登录内容加密
  27. func (dRoot *DetailRoot) GetDetail(ctx context.Context, seoId string, isLogin bool) map[string]interface{} {
  28. res, err := g.DB().GetOne(ctx, fmt.Sprintf(`SELECT col.bid_id FROM %s col WHERE col.seo_id = '%s'`, consts.TableName, seoId))
  29. if err != nil || res.IsEmpty() {
  30. return nil
  31. }
  32. data, ok := utility.BiddingMgo.FindById("bidding", gconv.String(res["bid_id"]), nil)
  33. if ok && data != nil && len(*data) > 0 {
  34. obj := *data
  35. if !isLogin {
  36. obj = Filter(obj)
  37. }
  38. obj["title"] = gconv.String(fmt.Sprintf("【%s】%s", consts.TopTypeMap[gconv.String(obj["toptype"])], obj["title"]))
  39. var publishTime int64
  40. tm := time.Date(time.Now().Year(), time.Now().Month(), time.Now().Day(), 23, 59, 59, 59, time.Now().Location())
  41. if gconv.Int64(obj["publish_time"])+3600*24 > tm.Unix() {
  42. publishTime = gconv.Int64(obj["publish_time"])
  43. } else {
  44. publishTime = gconv.Int64(obj["publish_time"]) + 3600*24
  45. }
  46. obj["time"] = time.Unix(publishTime, 0).Format("2006-01-02")
  47. var _detail = gconv.String(obj["detail"])
  48. for _, v := range []string{"table", "div"} {
  49. var intOpen = strings.Count(_detail, "<"+v)
  50. var intClose = strings.Count(_detail, "</"+v+">")
  51. if intOpen >= intClose {
  52. for di := 0; di < (intOpen - intClose); di++ {
  53. _detail += "</" + v + ">"
  54. }
  55. } else {
  56. for di := 0; di < (intClose - intOpen); di++ {
  57. _detail = "<" + v + ">" + _detail
  58. }
  59. }
  60. }
  61. obj["detail"] = _detail
  62. return obj
  63. }
  64. return nil
  65. }
  66. // 未登录用户进行数据过滤 name 配置文件
  67. func Filter(obj map[string]interface{}) map[string]interface{} {
  68. detail := fmt.Sprint(obj["detail"])
  69. mosaicText := fmt.Sprintf(`<span style="color:#2ABED1;">%s</span>`, g.Cfg("global").MustGet(context.Background(), "detailMosaic").String())
  70. detailText := fmt.Sprintf(`<span class="noLoginMosaic" style="color: #2ABED1;">%s</span>`, g.Cfg("global").MustGet(context.Background(), "detailMosaic").String())
  71. if DetailNeedMosaic == nil {
  72. DetailNeedMosaic = g.Cfg("global").MustGet(context.Background(), "detailNeedMosaic").Map()
  73. }
  74. for dk, dv := range DetailNeedMosaic {
  75. if !dv.(bool) {
  76. continue
  77. }
  78. if obj["package"] != nil {
  79. pk := gconv.Map(obj["package"])
  80. for _, pv := range pk {
  81. if pv != nil {
  82. if page := gconv.Map(pv); page != nil {
  83. if page[dk] != nil {
  84. page[dk] = mosaicText
  85. }
  86. delete(page, "text")
  87. }
  88. }
  89. }
  90. }
  91. //if util.ObjToString(obj[dk]) != "" {
  92. // detail = strings.ReplaceAll(detail, util.ObjToString(obj[dk]), detailText)
  93. //}
  94. if gconv.String(obj[dk]) != "" {
  95. value, b := obj[dk].(float64)
  96. if b {
  97. replaceStr := fmt.Sprintf("%v", int64(value))
  98. detail = strings.ReplaceAll(detail, replaceStr, detailText)
  99. } else {
  100. detail = strings.ReplaceAll(detail, gconv.String(obj[dk]), detailText)
  101. }
  102. }
  103. //中标企业信息
  104. if dk == "winnerMap" {
  105. winnerNewMap := map[string]interface{}{}
  106. if obj[dk] != nil {
  107. winnerMap := gconv.Map(obj[dk])
  108. for _, wv := range winnerMap {
  109. winnerNewMap[mosaicText] = wv
  110. }
  111. }
  112. obj[dk] = winnerNewMap
  113. } else {
  114. obj[dk] = mosaicText
  115. }
  116. }
  117. obj["detail"] = detail
  118. return obj
  119. }
  120. // GetAbstractInfo 获取摘要
  121. /*func GetAbstractInfo(obj map[string]interface{}, areaName string) string {
  122. date := gconv.Int64(obj["publishtime"])
  123. if date == 0 {
  124. date = gconv.Int64(obj["comeintime"])
  125. }
  126. dateStr := time.Unix(gconv.Int64(obj["publishtime"]), 0).Format("2006年01月02日")
  127. var abs = ""
  128. topType := gconv.String(obj["toptype"])
  129. switch topType {
  130. case "招标":
  131. BidTemplate = g.Cfg("global").MustGet(context.Background(), "bidTemplate").MapStrStr()
  132. subType := gconv.String(obj["subType"])
  133. if subType == "变更" || subType == "单一" || subType == "邀标" {
  134. if gconv.String(obj["buyer"]) != "" && gconv.String(obj["title"]) != "" {
  135. abs = fmt.Sprintf(BidTemplate["tmp4"], date, gconv.String(obj["buyer"]), gconv.String(obj["title"]), areaName)
  136. }
  137. }
  138. if subType != "变更" && subType != "单一" && subType != "邀标" && gconv.String(obj["agency"]) != "" {
  139. if gconv.String(obj["buyer"]) != "" && gconv.String(obj["subtype"]) != "" && gconv.String(obj["title"]) != "" {
  140. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  141. number := r.Intn(2) + 2
  142. if number == 2 {
  143. abs = fmt.Sprintf(BidTemplate["tmp2"], dateStr, gconv.String(obj["buyer"]), gconv.String(obj["title"]))
  144. } else {
  145. abs = fmt.Sprintf(BidTemplate["tmp3"], dateStr, gconv.String(obj["buyer"]), gconv.String(obj["subtype"]), gconv.String(obj["title"]))
  146. }
  147. }
  148. }
  149. case "结果":
  150. WinBidTemplate = g.Cfg("global").MustGet(context.Background(), "winBidTemplate").MapStrStr()
  151. subType := gconv.String(obj["subtype"])
  152. if subType == "中标" || subType == "成交" {
  153. if gconv.String(obj["agency"]) != "" {
  154. if gconv.String(obj["title"]) != "" && gconv.String(obj["winner"]) != "" {
  155. abs = fmt.Sprintf(WinBidTemplate["tmp3"], gconv.String(obj["agency"]), gconv.String(obj["buyer"]), gconv.String(obj["title"]), dateStr, gconv.String(obj["s_winner"]), areaName, gconv.String(obj["subtype"]))
  156. }
  157. } else {
  158. if gconv.String(obj["buyer"]) != "" && gconv.String(obj["title"]) != "" && gconv.String(obj["s_winner"]) != "" {
  159. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  160. number := r.Intn(2) + 1
  161. if number == 1 {
  162. winner := strings.Join(strings.Split(gconv.String(obj["s_winner"]), ","), "、")
  163. abs = fmt.Sprintf(WinBidTemplate["tmp1"], areaName, dateStr, gconv.String(obj["title"]), winner)
  164. } else {
  165. abs = fmt.Sprintf(WinBidTemplate["tmp2"], dateStr, gconv.String(obj["buyer"]), gconv.String(obj["title"]), gconv.String(obj["s_winner"]))
  166. }
  167. }
  168. }
  169. }
  170. if subType == "流标" || subType == "废标" || subType == "结果变更" {
  171. abs = fmt.Sprintf(gconv.String(WinBidTemplate["tmp4"]), dateStr, gconv.String(obj["buyer"]), gconv.String(obj["subtype"]), gconv.String(obj["title"]), areaName)
  172. }
  173. case "预告":
  174. PreviewClassTemplate = g.Cfg("global").MustGet(context.Background(), "previewClassTemplate").MapStrStr()
  175. if gconv.String(obj["agency"]) != "" {
  176. if gconv.String(obj["buyer"]) != "" && gconv.String(obj["subtype"]) != "" && gconv.String(obj["title"]) != "" {
  177. abs = fmt.Sprintf(PreviewClassTemplate["tmp1"], gconv.String(obj["buyer"]), dateStr, gconv.String(obj["agency"]), gconv.String(obj["subtype"]), gconv.String(obj["title"]), areaName)
  178. }
  179. } else {
  180. if gconv.String(obj["buyer"]) != "" && gconv.String(obj["subtype"]) != "" && gconv.String(obj["title"]) != "" {
  181. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  182. number := r.Intn(2) + 2
  183. if number == 2 {
  184. abs = fmt.Sprintf(PreviewClassTemplate["tmp2"], dateStr, gconv.String(obj["buyer"]), gconv.String(obj["title"]))
  185. } else {
  186. abs = fmt.Sprintf(PreviewClassTemplate["tmp3"], dateStr, gconv.String(obj["buyer"]), gconv.String(obj["subtype"]), gconv.String(obj["title"]))
  187. }
  188. }
  189. }
  190. case "其他":
  191. CreditBidTemplate = g.Cfg("global").MustGet(context.Background(), "creditBidTemplate").MapStrStr()
  192. subType := gconv.String(obj["subtype"])
  193. if subType == "合同" || subType == "验收" {
  194. if gconv.String(obj["buyer"]) != "" && gconv.String(obj["title"]) != "" && gconv.String(obj["subtype"]) != "" && gconv.String(obj["s_winner"]) != "" {
  195. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  196. number := r.Intn(2) + 1
  197. if number == 1 {
  198. abs = fmt.Sprintf(CreditBidTemplate["tmp1"], dateStr, gconv.String(obj["buyer"]), gconv.String(obj["title"]), gconv.String(obj["subtype"]), gconv.String(obj["s_winner"]), areaName)
  199. } else {
  200. abs = fmt.Sprintf(CreditBidTemplate["tmp2"], dateStr, gconv.String(obj["buyer"]), gconv.String(obj["subtype"]), gconv.String(obj["title"]), gconv.String(obj["s_winner"]))
  201. }
  202. }
  203. } else if subType == "违规" {
  204. abs = fmt.Sprintf(CreditBidTemplate["tmp2"], dateStr, gconv.String(obj["title"]))
  205. }
  206. }
  207. return abs
  208. }*/