detailStruct.go 8.9 KB

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