userTask.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. package utility
  2. import (
  3. "analyze/internal/consts"
  4. "analyze/internal/model"
  5. "analyze/internal/model/entity"
  6. "app.yhyue.com/moapp/jybase/encrypt"
  7. "fmt"
  8. "github.com/gogf/gf/v2/database/gredis"
  9. "github.com/gogf/gf/v2/frame/g"
  10. "math"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. var (
  16. y_m_day = map[int]int{1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31}
  17. )
  18. func GetPreviousMarket(sTime, eTime time.Time) int64 {
  19. var os_time int64
  20. s_time := sTime
  21. if SEMonth(sTime, eTime) {
  22. var min int
  23. //统计月份
  24. for sTime.Before(eTime) {
  25. sTime = sTime.AddDate(0, 1, 0)
  26. min++
  27. }
  28. os_time = s_time.AddDate(0, -min, 0).Unix()
  29. } else {
  30. os_time = s_time.AddDate(0, 0, -int(math.Ceil(eTime.Sub(sTime).Hours()/24))).Unix()
  31. }
  32. return os_time
  33. }
  34. // 判断是否月初到月末
  35. func SEMonth(sTime, eTime time.Time) bool {
  36. var day int
  37. month := int(eTime.Month())
  38. if month == 2 {
  39. if eTime.Year()%4 == 0 {
  40. day = 29
  41. } else {
  42. day = 28
  43. }
  44. } else {
  45. day = y_m_day[month]
  46. }
  47. if sTime.Day() == 1 && eTime.Day() == day {
  48. return true
  49. }
  50. return false
  51. }
  52. func GetMonthData(sTime, eTime time.Time) (_b bool, dateSpans []entity.DateSpan) {
  53. //整月多取一个月进行环比
  54. if SEMonth(sTime, eTime) {
  55. _b = true
  56. sTime = sTime.AddDate(0, -1, 0)
  57. }
  58. dateSpans = getBidAmountStatistics(sTime, eTime)
  59. return
  60. }
  61. func getBidAmountStatistics(sTime, eTime time.Time) (dateSpans []entity.DateSpan) {
  62. tmpTime, rTime, tEndTime := sTime, sTime, getMonthRange(eTime, false)
  63. for rTime.Before(tEndTime) {
  64. ts, te := getMonthRange(tmpTime, true), getMonthRange(tmpTime, false)
  65. if sTime == tmpTime {
  66. ts = sTime
  67. }
  68. if te == tEndTime {
  69. te = eTime
  70. }
  71. if ts.Before(te) {
  72. dateSpans = append(dateSpans, entity.DateSpan{
  73. Key: fmt.Sprintf("%d-%d", ts.Year(), ts.Month()),
  74. From: ts.Unix(),
  75. To: te.Unix(),
  76. })
  77. }
  78. rTime = rTime.AddDate(0, 1, 0)
  79. if int(rTime.Month())-int(tmpTime.Month()) > 1 {
  80. rTime = rTime.AddDate(0, -1, 0)
  81. }
  82. tmpTime = rTime
  83. }
  84. return
  85. }
  86. // getMonthRange获取月份范围
  87. // isStart true本月月初 false 本月月末(下月月初)
  88. func getMonthRange(t time.Time, isStart bool) time.Time {
  89. if isStart {
  90. return time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, t.Location())
  91. }
  92. return time.Date(t.Year(), t.Month()+1, 1, 0, 0, 0, 0, t.Location())
  93. }
  94. func GetYearData(sTime, eTime time.Time) (_b bool, dateSpans []entity.DateSpan) {
  95. //整年多取一年进行环比
  96. if sTime.Month() == 1 && sTime.Day() == 1 && eTime.Month() == 12 && eTime.Day() == 31 {
  97. _b = true
  98. sTime = sTime.AddDate(-1, 0, 0)
  99. }
  100. dateSpans = getCommonYearStatistics(sTime, eTime)
  101. return
  102. }
  103. // 年份统计
  104. func getCommonYearStatistics(sTime, eTime time.Time) (dateSpans []entity.DateSpan) {
  105. tmpTime, rTime, tEndTime := sTime, sTime, getYearRange(eTime, false)
  106. for rTime.Before(tEndTime) {
  107. ts, te := getYearRange(tmpTime, true), getYearRange(tmpTime, false)
  108. if sTime == tmpTime {
  109. ts = sTime
  110. }
  111. if te == tEndTime {
  112. te = eTime
  113. }
  114. if ts.Before(te) {
  115. dateSpans = append(dateSpans, entity.DateSpan{
  116. Key: fmt.Sprintf("%d", ts.Year()),
  117. From: ts.Unix(),
  118. To: te.Unix(),
  119. })
  120. }
  121. rTime = rTime.AddDate(1, 0, 0)
  122. tmpTime = rTime
  123. }
  124. return
  125. }
  126. // getYearRange获取月份范围
  127. // isStart true本月月初 false 本月月末(下月月初)
  128. func getYearRange(t time.Time, isStart bool) time.Time {
  129. if isStart {
  130. return time.Date(t.Year(), 1, 1, 0, 0, 0, 0, t.Location())
  131. }
  132. return time.Date(t.Year()+1, 1, 1, 0, 0, 0, 0, t.Location())
  133. }
  134. // GetAllKeywordArr 获取所有匹配词
  135. func GetAllKeywordArr(res []entity.KeyWordGroup) (rData []entity.ViewKeyWord) {
  136. for _, kwg := range res {
  137. rData = append(rData, GetGroupKeywordArr(kwg.A_Key)...)
  138. }
  139. return
  140. }
  141. // GetGroupKeywordArr 模糊拆分为多个精准匹配
  142. func GetGroupKeywordArr(res []entity.ViewKeyWord) (rData []entity.ViewKeyWord) {
  143. for _, kw := range res {
  144. if kw.MatchWay == 1 {
  145. for _, kk := range kw.Keyword {
  146. rData = append(rData, entity.ViewKeyWord{
  147. Keyword: []string{kk},
  148. Exclude: kw.Exclude,
  149. })
  150. }
  151. for _, kk := range kw.Appended {
  152. rData = append(rData, entity.ViewKeyWord{
  153. Keyword: []string{kk},
  154. Exclude: kw.Exclude,
  155. })
  156. }
  157. } else {
  158. rData = append(rData, kw)
  159. }
  160. }
  161. return
  162. }
  163. func DateIsIn(from, to, n, m int64) bool {
  164. if m == 0 {
  165. return to >= n && from <= n
  166. }
  167. return to > n && from < n
  168. }
  169. func EncodeId(sid string) string {
  170. if sid == "" || sid == "-" { //不存在的id为-
  171. return ""
  172. }
  173. return encrypt.EncodeArticleId2ByCheck(sid)
  174. }
  175. // xxxx重点中标单位 更新分数值
  176. func UpdateWinnerInfoOfScore(key string, pt *entity.ProjectInfo, score float64) {
  177. if pt.Winners != "" {
  178. for k, w := range strings.Split(pt.Winners, ",") {
  179. id := ""
  180. if len(pt.Entidlist) > k {
  181. id = encrypt.EncodeArticleId2ByCheck(pt.Entidlist[k])
  182. }
  183. UpdateIncrementRedis(key, fmt.Sprintf("%s##%s", w, id), score)
  184. }
  185. }
  186. }
  187. // xxxx重点采购单位 更新分数值
  188. func UpdateBuyerInfoOfScore(key string, pt *entity.ProjectInfo, score float64) {
  189. if pt.Buyer != "" {
  190. UpdateIncrementRedis(key, fmt.Sprintf("%s##%s", pt.Buyer, pt.Id), score)
  191. }
  192. }
  193. // prev
  194. func GetJudgmentPrevKey(first int, next string) (key string) {
  195. return fmt.Sprintf("mk_%d_%s", first, next)
  196. }
  197. // redis update|| expire
  198. func UpdateIncrementRedis(key, member string, increment float64) {
  199. _, err := g.Redis().ZIncrBy(model.Ctx, key, increment, member)
  200. if err != nil {
  201. g.Log().Info(model.Ctx, "---update---err:", err.Error())
  202. } else {
  203. _, err = g.Redis().Expire(model.Ctx, key, consts.Top30) //缓存三十秒
  204. if err != nil {
  205. g.Log().Info(model.Ctx, "---expire---err:", err.Error())
  206. }
  207. }
  208. }
  209. // -- score
  210. func GetZrevRangeByScore(key string, max, min int64) (res []entity.MemberScore, err error) {
  211. gvar, _err := g.Redis().ZRevRange(model.Ctx, key, min, max, gredis.ZRevRangeOption{WithScores: true})
  212. if _err != nil {
  213. err = _err
  214. g.Log().Info(model.Ctx, "err:", err.Error())
  215. return
  216. }
  217. // 遍历返回结果
  218. for k, v := range gvar.Slice() {
  219. if k%2 == 0 {
  220. ms := entity.MemberScore{}
  221. ms.Member = strings.Split(fmt.Sprintf("%s", v), "##")[0]
  222. ms.Id = strings.Split(fmt.Sprintf("%s", v), "##")[1]
  223. res = append(res, ms)
  224. } else {
  225. res[k/2].Score, _ = strconv.ParseFloat(fmt.Sprintf("%s", v), 64)
  226. }
  227. }
  228. return
  229. }
  230. // --Del
  231. func DelRedisInfo(key string) {
  232. if _, err := g.Redis().Del(model.Ctx, key); err != nil {
  233. g.Log().Info(model.Ctx, "redis del err :", err.Error())
  234. }
  235. }
  236. // --key
  237. func GetSortedKeyOfRedis(prev int, key, id, suffix string) string {
  238. return fmt.Sprintf("sorted_%d_%s_%s_%s", prev, key, id, suffix)
  239. }
  240. // --
  241. func IsAnalyzeCancel(id string) bool {
  242. n, _ := g.Redis().Exists(model.Ctx, fmt.Sprintf(consts.ReportCanceledKey, id))
  243. return n > 0
  244. }