pendant.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. "go-common/app/admin/main/usersuit/model"
  7. accmdl "go-common/app/service/main/account/model"
  8. "go-common/library/database/sql"
  9. "go-common/library/ecode"
  10. "go-common/library/log"
  11. xtime "go-common/library/time"
  12. "go-common/library/xstr"
  13. "github.com/pkg/errors"
  14. )
  15. // PendantInfoList pendant list by group rank.
  16. func (s *Service) PendantInfoList(c context.Context, arg *model.ArgPendantGroupList) (pis []*model.PendantInfo, pager *model.Pager, err error) {
  17. var (
  18. total int64
  19. pids []int64
  20. ppm map[int64][]*model.PendantPrice
  21. )
  22. pager = &model.Pager{
  23. PN: arg.PN,
  24. PS: arg.PS,
  25. }
  26. // all group pendants
  27. if arg.GID == 0 {
  28. if total, err = s.d.PendantGroupInfoTotal(c); err != nil {
  29. err = errors.Wrap(err, "s.d.PendantGroupInfoTotal()")
  30. return
  31. }
  32. if total <= 0 {
  33. return
  34. }
  35. pager.Total = total
  36. if pis, pids, err = s.d.PendantInfoAll(c, arg.PN, arg.PS); err != nil {
  37. err = errors.Wrapf(err, "s.d.PendantInfoAll(%d,%d)", arg.PN, arg.PS)
  38. return
  39. }
  40. if len(pis) == 0 || len(pids) == 0 {
  41. log.Warn("no pendant list")
  42. return
  43. }
  44. if ppm, err = s.d.PendantPriceIDs(c, pids); err != nil {
  45. err = errors.Wrapf(err, "s.d.PendantPriceIDs(%s)", xstr.JoinInts(pids))
  46. return
  47. }
  48. for _, pi := range pis {
  49. if pp, ok := ppm[pi.ID]; ok {
  50. pi.Prices = pp
  51. }
  52. }
  53. return
  54. }
  55. // one group pendants
  56. if total, err = s.d.PendantGroupRefsGidTotal(c, arg.GID); err != nil {
  57. err = errors.Wrap(err, "s.d.PendantGroupRefsGidTotal()")
  58. return
  59. }
  60. if total <= 0 {
  61. return
  62. }
  63. pager.Total = total
  64. var pg *model.PendantGroup
  65. if pids, err = s.d.PendantGroupPIDs(c, arg.GID, arg.PN, arg.PS); err != nil {
  66. err = errors.Wrapf(err, "s.d.PendantGroupPIDs(%d,%d,%d)", arg.GID, arg.PN, arg.PS)
  67. return
  68. }
  69. if pg, err = s.d.PendantGroupID(c, arg.GID); err != nil {
  70. err = errors.Wrapf(err, "s.d.PendantGroupID(%d)", arg.GID)
  71. return
  72. }
  73. if len(pids) == 0 {
  74. log.Warn("no pendant group relation")
  75. return
  76. }
  77. if pis, _, err = s.d.PendantInfoIDs(c, pids); err != nil {
  78. err = errors.Wrapf(err, "s.d.PendantInfoIDs(%s)", xstr.JoinInts(pids))
  79. return
  80. }
  81. if len(pis) == 0 {
  82. log.Warn("no pendant list")
  83. return
  84. }
  85. if ppm, err = s.d.PendantPriceIDs(c, pids); err != nil {
  86. err = errors.Wrapf(err, "s.d.PendantPriceIDs(%s)", xstr.JoinInts(pids))
  87. return
  88. }
  89. for _, pi := range pis {
  90. if pp, ok := ppm[pi.ID]; ok {
  91. pi.Prices = pp
  92. }
  93. pi.GID = arg.GID
  94. pi.GroupName = pg.Name
  95. pi.GroupRank = pg.Rank
  96. }
  97. return
  98. }
  99. // PendantInfoID pendant info by pid and gid.
  100. func (s *Service) PendantInfoID(c context.Context, pid, gid int64) (pi *model.PendantInfo, err error) {
  101. if pi, err = s.d.PendantInfoID(c, pid); err != nil {
  102. err = errors.Wrapf(err, "s.d.PendantInfoID(%d)", pid)
  103. return
  104. }
  105. if pi == nil {
  106. err = ecode.PendantNotFound
  107. return
  108. }
  109. var (
  110. pg *model.PendantGroup
  111. ppm map[int64][]*model.PendantPrice
  112. )
  113. if pg, err = s.d.PendantGroupID(c, gid); err != nil {
  114. err = errors.Wrapf(err, "s.d.PendantGroupID(%d)", gid)
  115. return
  116. }
  117. if ppm, err = s.d.PendantPriceIDs(c, []int64{pid}); err != nil {
  118. err = errors.Wrapf(err, "s.d.PendantPriceIDs(%d)", pid)
  119. return
  120. }
  121. pi.GID = gid
  122. pi.GroupName = pg.Name
  123. pi.GroupRank = pg.Rank
  124. if pp, ok := ppm[pid]; ok {
  125. pi.Prices = pp
  126. }
  127. return
  128. }
  129. // PendantGroupID pendant group by ID.
  130. func (s *Service) PendantGroupID(c context.Context, gid int64) (pg *model.PendantGroup, err error) {
  131. if pg, err = s.d.PendantGroupID(c, gid); err != nil {
  132. err = errors.Wrapf(err, "s.d.PendantGroupID(%d)", gid)
  133. }
  134. return
  135. }
  136. // PendantGroupList group page.
  137. func (s *Service) PendantGroupList(c context.Context, arg *model.ArgPendantGroupList) (pgs []*model.PendantGroup, pager *model.Pager, err error) {
  138. var total int64
  139. pager = &model.Pager{
  140. PN: arg.PN,
  141. PS: arg.PS,
  142. }
  143. if total, err = s.d.PendantGroupsTotal(c); err != nil {
  144. err = errors.Wrap(err, "s.d.PendantGroupsTotal()")
  145. return
  146. }
  147. if total <= 0 {
  148. return
  149. }
  150. pager.Total = total
  151. if pgs, err = s.d.PendantGroups(c, arg.PN, arg.PS); err != nil {
  152. err = errors.Wrapf(err, "s.d.PendantGroups(%d,%d)", arg.PN, arg.PS)
  153. }
  154. return
  155. }
  156. // PendantGroupAll all groups.
  157. func (s *Service) PendantGroupAll(c context.Context) (pgs []*model.PendantGroup, err error) {
  158. if pgs, err = s.d.PendantGroupAll(c); err != nil {
  159. err = errors.Wrap(err, "s.d.PendantGroupAll()")
  160. return
  161. }
  162. return
  163. }
  164. // PendantInfoAllNoPage all info on no page.
  165. func (s *Service) PendantInfoAllNoPage(c context.Context) (pis []*model.PendantInfo, err error) {
  166. if pis, err = s.d.PendantInfoAllNoPage(c); err != nil {
  167. err = errors.Wrap(err, "s.d.PendantInfoAllNoPage()")
  168. return
  169. }
  170. return
  171. }
  172. // AddPendantInfo add pendantInfo .
  173. func (s *Service) AddPendantInfo(c context.Context, arg *model.ArgPendantInfo) (err error) {
  174. var pg *model.PendantGroup
  175. if pg, err = s.d.PendantGroupID(c, arg.GID); err != nil {
  176. err = errors.Wrapf(err, "s.d.PendantGroupID(%d)", arg.GID)
  177. return
  178. }
  179. if pg == nil {
  180. err = errors.New("group no exist")
  181. return
  182. }
  183. // begin tran
  184. var tx *sql.Tx
  185. if tx, err = s.d.BeginTran(c); err != nil {
  186. err = errors.Wrap(err, "s.arc.BeginTran()")
  187. return
  188. }
  189. defer func() {
  190. if err != nil {
  191. tx.Rollback()
  192. } else {
  193. tx.Commit()
  194. }
  195. }()
  196. pi := &model.PendantInfo{
  197. Name: arg.Name,
  198. Image: arg.Image,
  199. ImageModel: arg.ImageModel,
  200. Status: arg.Status,
  201. Rank: arg.Rank,
  202. }
  203. var pid int64
  204. if pid, err = s.d.TxAddPendantInfo(tx, pi); err != nil {
  205. err = errors.Wrapf(err, "s.d.TxAddPendantInfo(%+v)", pi)
  206. return
  207. }
  208. arg.PID = pid
  209. pr := &model.PendantGroupRef{GID: arg.GID, PID: arg.PID}
  210. if _, err = s.d.TxAddPendantGroupRef(tx, pr); err != nil {
  211. err = errors.Wrapf(err, "s.d.TxAddPendantGroupRef(%+v)", pr)
  212. return
  213. }
  214. pp := &model.PendantPrice{}
  215. for _, tp := range model.PriceTypes {
  216. pp.BulidPendantPrice(arg, tp)
  217. if pp.Price != 0 {
  218. if _, err = s.d.TxAddPendantPrices(tx, pp); err != nil {
  219. err = errors.Wrapf(err, "s.d.TxAddPendantPrices(%+v)", pp)
  220. return
  221. }
  222. }
  223. }
  224. return
  225. }
  226. // UpPendantInfo update pendant info .
  227. func (s *Service) UpPendantInfo(c context.Context, arg *model.ArgPendantInfo) (err error) {
  228. // begin tran
  229. var tx *sql.Tx
  230. if tx, err = s.d.BeginTran(c); err != nil {
  231. err = errors.Wrap(err, "s.arc.BeginTran()")
  232. return
  233. }
  234. defer func() {
  235. if err != nil {
  236. tx.Rollback()
  237. } else {
  238. tx.Commit()
  239. }
  240. }()
  241. pi := &model.PendantInfo{
  242. ID: arg.PID,
  243. Name: arg.Name,
  244. Image: arg.Image,
  245. ImageModel: arg.ImageModel,
  246. Status: arg.Status,
  247. Rank: arg.Rank,
  248. }
  249. if _, err = s.d.TxUpPendantInfo(tx, pi); err != nil {
  250. err = errors.Wrapf(err, "s.d.TxUpPendantInfo(%+v)", pi)
  251. return
  252. }
  253. if _, err = s.d.TxUpPendantGroupRef(tx, arg.GID, arg.PID); err != nil {
  254. err = errors.Wrapf(err, "s.d.TxUpPendantGroupRef(%d,%d)", arg.GID, arg.PID)
  255. return
  256. }
  257. pp := &model.PendantPrice{}
  258. for _, tp := range model.PriceTypes {
  259. pp.BulidPendantPrice(arg, tp)
  260. if pp.Price != 0 {
  261. if _, err = s.d.TxAddPendantPrices(tx, pp); err != nil {
  262. err = errors.Wrapf(err, "s.d.TxAddPendantPrices(%+v)", pp)
  263. return
  264. }
  265. }
  266. }
  267. return
  268. }
  269. // UpPendantGroupStatus update pendant group status
  270. func (s *Service) UpPendantGroupStatus(c context.Context, gid int64, status int8) (err error) {
  271. if _, err = s.d.UpPendantGroupStatus(c, gid, status); err != nil {
  272. err = errors.Wrapf(err, "s.d.UpPendantGroupStatus(%d,%d)", gid, status)
  273. }
  274. return
  275. }
  276. // UpPendantInfoStatus update pendant info status
  277. func (s *Service) UpPendantInfoStatus(c context.Context, pid int64, status int8) (err error) {
  278. if _, err = s.d.UpPendantInfoStatus(c, pid, status); err != nil {
  279. err = errors.Wrapf(err, "s.d.UpPendantInfoStatus(%d,%d)", pid, status)
  280. }
  281. return
  282. }
  283. // AddPendantGroup update pendant group.
  284. func (s *Service) AddPendantGroup(c context.Context, arg *model.ArgPendantGroup) (err error) {
  285. pg := &model.PendantGroup{
  286. Name: arg.Name,
  287. Rank: arg.Rank,
  288. Status: arg.Status,
  289. }
  290. if _, err = s.d.AddPendantGroup(c, pg); err != nil {
  291. err = errors.Wrapf(err, "s.d.AddPendantGroup(%+v)", pg)
  292. }
  293. return
  294. }
  295. // UpPendantGroup update pendant group.
  296. func (s *Service) UpPendantGroup(c context.Context, arg *model.ArgPendantGroup) (err error) {
  297. if arg.GID == 0 {
  298. err = ecode.PendantNotFound
  299. return
  300. }
  301. pg := &model.PendantGroup{
  302. ID: arg.GID,
  303. Name: arg.Name,
  304. Rank: arg.Rank,
  305. Status: arg.Status,
  306. }
  307. if _, err = s.d.UpPendantGroup(c, pg); err != nil {
  308. err = errors.Wrapf(err, "s.d.UpPendantGroup(%+v)", pg)
  309. }
  310. return
  311. }
  312. // PendantOrders get pendant order historys.
  313. func (s *Service) PendantOrders(c context.Context, arg *model.ArgPendantOrder) (pos []*model.PendantOrder, pager *model.Pager, err error) {
  314. var total int64
  315. pager = &model.Pager{
  316. PN: arg.PN,
  317. PS: arg.PS,
  318. }
  319. if total, err = s.d.MaxOrderHistory(c); err != nil {
  320. err = errors.Wrapf(err, "s.d.MaxOrderHistory(%+v)", arg)
  321. return
  322. }
  323. if total <= 0 {
  324. return
  325. }
  326. pager.Total = total
  327. var pids []int64
  328. if pos, pids, err = s.d.OrderHistorys(c, arg); err != nil {
  329. err = errors.Wrapf(err, "s.d.OrderHistorys(%+v)", arg)
  330. return
  331. }
  332. if len(pids) == 0 {
  333. return
  334. }
  335. var pim map[int64]*model.PendantInfo
  336. if _, pim, err = s.d.PendantInfoIDs(c, pids); err != nil {
  337. err = errors.Wrapf(err, "s.d.PendantInfoIDs(%v)", xstr.JoinInts(pids))
  338. return
  339. }
  340. for _, v := range pos {
  341. if pi, ok := pim[v.PID]; ok {
  342. v.PName = pi.Name
  343. }
  344. v.CoverToPlatform()
  345. }
  346. return
  347. }
  348. // PendantPKG get pendant in pkg.
  349. func (s *Service) PendantPKG(c context.Context, uid int64) (pkgs []*model.PendantPKG, equip *model.PendantPKG, err error) {
  350. if equip, err = s.d.PendantEquipUID(c, uid); err != nil {
  351. err = errors.Wrapf(err, "s.d.PendantEquipUID(%d)", uid)
  352. return
  353. }
  354. if pkgs, err = s.d.PendantPKGs(c, uid); err != nil {
  355. err = errors.Wrapf(err, "s.d.PendantPKGs(%d)", uid)
  356. return
  357. }
  358. if len(pkgs) == 0 {
  359. return
  360. }
  361. var time = time.Now().Unix()
  362. for _, pkg := range pkgs {
  363. if equip != nil && pkg.PID == equip.PID {
  364. pkg.Status = model.PendantPKGOnEquip
  365. }
  366. if pkg.Status == model.PendantPKGValid && pkg.Expires < time {
  367. pkg.Status = model.PendantPKGInvalid
  368. }
  369. }
  370. return
  371. }
  372. // UserPKGDetails get user pkg 's pendant details.
  373. func (s *Service) UserPKGDetails(c context.Context, uid, pid int64) (pkg *model.PendantPKG, err error) {
  374. if pkg, err = s.d.PendantPKG(c, uid, pid); err != nil {
  375. err = errors.Wrapf(err, "s.d.PendantPKG(%d,%d)", uid, pid)
  376. }
  377. return
  378. }
  379. // EquipPendant equip pendant.
  380. func (s *Service) EquipPendant(c context.Context, uid, pid int64) (err error) {
  381. var pkg *model.PendantPKG
  382. if pkg, err = s.d.PendantPKG(c, uid, pid); err != nil {
  383. err = errors.Wrapf(err, "s.d.PendantPKG(%d,%d)", uid, pid)
  384. return
  385. }
  386. if pkg == nil || pkg.Expires < time.Now().Unix() {
  387. log.Warn("pid(%d) not exist or expires(%d) is failed", pid, time.Now().Unix())
  388. return
  389. }
  390. if _, err = s.d.AddPendantEquip(c, pkg); err != nil {
  391. err = errors.Wrapf(err, "s.d.AddPendantEquip(%+v)", pkg)
  392. return
  393. }
  394. s.addAsyn(func() {
  395. if err = s.d.DelEquipsCache(context.Background(), []int64{uid}); err != nil {
  396. log.Error("s.d.DelEquipsCache(%d) error(%+v)", uid, err)
  397. return
  398. }
  399. })
  400. s.addAsyn(func() {
  401. if err = s.accNotify(context.Background(), uid, model.AccountNotifyUpdatePendant); err != nil {
  402. log.Error("s.accNotify(%d) error(%+v)", uid, err)
  403. return
  404. }
  405. })
  406. return
  407. }
  408. // UpPendantPKG update user pkg.
  409. func (s *Service) UpPendantPKG(c context.Context, uid, pid int64, day int64, msg *model.SysMsg, oid int64) (err error) {
  410. var (
  411. pi *model.PendantInfo
  412. pkg *model.PendantPKG
  413. )
  414. if pi, err = s.d.PendantInfoID(c, pid); err != nil {
  415. err = errors.Wrapf(err, "s.d.PendantInfoID(%d)", pid)
  416. return
  417. }
  418. if pi == nil {
  419. err = ecode.PendantNotFound
  420. return
  421. }
  422. if pkg, err = s.d.PendantPKG(c, uid, pid); err != nil {
  423. err = errors.Wrapf(err, "s.d.PendantPKG(%d,%d)", uid, pid)
  424. return
  425. }
  426. if pkg == nil {
  427. pkg = &model.PendantPKG{}
  428. }
  429. var operAction string
  430. switch msg.Type {
  431. case model.PendantAddStyleDay:
  432. if pkg.Expires < time.Now().Unix() {
  433. pkg.Expires = time.Now().Unix() + day*86400
  434. pkg.PID = pid
  435. pkg.UID = uid
  436. pkg.TP = model.PendantAddStyleDay
  437. } else {
  438. pkg.Expires = pkg.Expires + day*86400
  439. }
  440. operAction = fmt.Sprintf("新增%s挂件 %d天", pi.Name, day)
  441. case model.PendantAddStyleDate:
  442. if pkg.ID == 0 {
  443. err = errors.New("no pkg")
  444. return
  445. }
  446. oldExpires := pkg.Expires
  447. pkg.Expires = day
  448. operAction = fmt.Sprintf("修改%s挂件 到期时间从%s至%s", pi.Name,
  449. xtime.Time(oldExpires).Time().Format("2006-01-02 15:04:05"),
  450. xtime.Time(pkg.Expires).Time().Format("2006-01-02 15:04:05"))
  451. }
  452. if _, err = s.d.AddPendantPKG(c, pkg); err != nil {
  453. err = errors.Wrapf(err, "s.d.AddPendantPKG(%+v)", pkg)
  454. return
  455. }
  456. if msg.IsMsg {
  457. s.addAsyn(func() {
  458. msg.Type = model.MsgTypeCustom
  459. title, content, ip := model.MsgInfo(msg)
  460. if err = s.d.SendSysMsg(context.Background(), []int64{uid}, title, content, ip); err != nil {
  461. log.Error("s.d.MutliSendSysMsg(%d,%s,%s,%s) error(%+v)", uid, title, content, ip, err)
  462. }
  463. })
  464. }
  465. s.addAsyn(func() {
  466. if err = s.d.DelPKGCache(context.Background(), []int64{uid}); err != nil {
  467. log.Error("s.d.DelPKGCache(%d) error(%+v)", uid, err)
  468. }
  469. if err = s.d.SetPendantPointCache(context.Background(), uid, pid); err != nil {
  470. log.Error("s.d.SetPendantPointCache(%d,%d) error(%+v)", uid, pid, err)
  471. }
  472. if _, err = s.d.AddPendantOperLog(context.Background(), oid, []int64{uid}, pid, operAction); err != nil {
  473. log.Error("s.d.AddPendantOperLog(%d,%s) error(%+v)", oid, operAction, err)
  474. }
  475. })
  476. s.addAsyn(func() {
  477. if err = s.accNotify(context.Background(), uid, model.AccountNotifyUpdatePendant); err != nil {
  478. log.Error("s.accNotify(%d) error(%+v)", uid, err)
  479. return
  480. }
  481. })
  482. return
  483. }
  484. // MutliSendPendant mutli send pendant.
  485. func (s *Service) MutliSendPendant(c context.Context, uids []int64, pid int64, day int64, msg *model.SysMsg, oid int64) (err error) {
  486. var (
  487. pi *model.PendantInfo
  488. opkgs, npkgs []*model.PendantPKG
  489. )
  490. if pi, err = s.d.PendantInfoID(c, pid); err != nil {
  491. err = errors.Wrapf(err, "s.d.PendantInfoID(%d)", pid)
  492. return
  493. }
  494. if pi == nil {
  495. err = ecode.PendantNotFound
  496. return
  497. }
  498. if opkgs, err = s.d.PendantPKGUIDs(c, uids, pid); err != nil {
  499. err = errors.Wrapf(err, "s.d.PendantPKGUIDs(%+v,%d)", uids, pid)
  500. return
  501. }
  502. var ouids, nuids []int64
  503. for _, pkg := range opkgs {
  504. if pkg.Expires < time.Now().Unix() {
  505. pkg.Expires = time.Now().Unix() + day*86400
  506. } else {
  507. pkg.Expires = pkg.Expires + day*86400
  508. }
  509. ouids = append(ouids, pkg.UID)
  510. }
  511. nuids = s.diffSlice(uids, ouids)
  512. for _, nuid := range nuids {
  513. npkgs = append(npkgs, &model.PendantPKG{PID: pid, UID: nuid, Expires: time.Now().Unix() + day*86400})
  514. }
  515. // begin tran
  516. var tx *sql.Tx
  517. if tx, err = s.d.BeginTran(c); err != nil {
  518. err = errors.Wrap(err, "s.arc.BeginTran()")
  519. return
  520. }
  521. defer func() {
  522. if err != nil {
  523. tx.Rollback()
  524. } else {
  525. tx.Commit()
  526. }
  527. }()
  528. if len(npkgs) != 0 {
  529. if _, err = s.d.TxAddPendantPKGs(tx, npkgs); err != nil {
  530. err = errors.Wrapf(err, "s.d.TxAddPendantPKGs(%d,%s)", pid, xstr.JoinInts(nuids))
  531. return
  532. }
  533. }
  534. if len(opkgs) != 0 {
  535. if _, err = s.d.TxUpPendantPKGs(tx, opkgs); err != nil {
  536. err = errors.Wrapf(err, "s.d.TxUpPendantPKGs(%d,%s)", pid, xstr.JoinInts(ouids))
  537. return
  538. }
  539. }
  540. if msg.IsMsg {
  541. s.addAsyn(func() {
  542. title, content, ip := model.MsgInfo(msg)
  543. if err = s.d.MutliSendSysMsg(context.Background(), uids, title, content, ip); err != nil {
  544. log.Error("s.d.MutliSendSysMsg(%s,%s,%s,%s) error(%+v)", xstr.JoinInts(uids), title, content, ip, err)
  545. }
  546. })
  547. }
  548. s.addAsyn(func() {
  549. if err = s.d.DelPKGCache(context.Background(), uids); err != nil {
  550. log.Error("s.d.DelPKGCache(%s) error(%+v)", xstr.JoinInts(uids), err)
  551. }
  552. operAction := fmt.Sprintf("新增%s挂件 %d天", pi.Name, day)
  553. if _, err = s.d.AddPendantOperLog(context.Background(), oid, uids, pid, operAction); err != nil {
  554. log.Error("s.d.AddPendantOperLog(%d,%s,%s) error(%+v)", oid, xstr.JoinInts(uids), operAction, err)
  555. }
  556. })
  557. for _, uid := range uids {
  558. tid := uid
  559. s.addAsyn(func() {
  560. if err = s.accNotify(context.Background(), tid, model.AccountNotifyUpdatePendant); err != nil {
  561. log.Error("s.accNotify(%d) error(%+v)", tid, err)
  562. }
  563. if err = s.d.SetPendantPointCache(context.Background(), tid, pid); err != nil {
  564. log.Error("s.d.SetPendantPointCache(%d,%d) error(%+v)", tid, pid, err)
  565. }
  566. })
  567. }
  568. return
  569. }
  570. func (s *Service) diffSlice(sliceOne, sliceTwo []int64) (res []int64) {
  571. for _, ov := range sliceOne {
  572. inSlice := func(ov int64, sliceTwo []int64) bool {
  573. for _, tv := range sliceTwo {
  574. if tv == ov {
  575. return true
  576. }
  577. }
  578. return false
  579. }(ov, sliceTwo)
  580. if !inSlice {
  581. res = append(res, ov)
  582. }
  583. }
  584. return
  585. }
  586. // PendantOperlog pendant operactlog .
  587. func (s *Service) PendantOperlog(c context.Context, pn, ps int) (opers []*model.PendantOperLog, pager *model.Pager, err error) {
  588. var total int64
  589. pager = &model.Pager{
  590. PN: pn,
  591. PS: ps,
  592. }
  593. if total, err = s.d.PendantOperationLogTotal(c); err != nil {
  594. err = errors.Wrap(err, "s.d.PendantOperationLogTotal()")
  595. return
  596. }
  597. if total <= 0 {
  598. return
  599. }
  600. pager.Total = total
  601. var uids []int64
  602. if opers, uids, err = s.d.PendantOperLog(c, pn, ps); err != nil {
  603. err = errors.Wrapf(err, "s.d.PendantOperLog(%d,%d)", pn, ps)
  604. return
  605. }
  606. var accInfoMap map[int64]*accmdl.Info
  607. if accInfoMap, err = s.fetchInfos(c, uids, _fetchInfoTimeout); err != nil {
  608. log.Error("service.fetchInfos(%v, %v) error(%v)", xstr.JoinInts(uids), _fetchInfoTimeout, err)
  609. err = nil
  610. }
  611. for _, v := range opers {
  612. if accInfo, ok := accInfoMap[v.UID]; ok {
  613. v.Action = fmt.Sprintf("给用户(%s) %s", accInfo.Name, v.Action)
  614. }
  615. if operName, ok := s.Managers[v.OID]; ok {
  616. v.OperName = operName
  617. }
  618. }
  619. return
  620. }