unicom.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961
  1. package unicom
  2. import (
  3. "bytes"
  4. "context"
  5. "crypto/des"
  6. "encoding/base64"
  7. "errors"
  8. "fmt"
  9. "strconv"
  10. "time"
  11. "go-common/app/interface/main/app-wall/model"
  12. "go-common/app/interface/main/app-wall/model/unicom"
  13. account "go-common/app/service/main/account/model"
  14. "go-common/library/ecode"
  15. log "go-common/library/log"
  16. "go-common/library/queue/databus/report"
  17. )
  18. const (
  19. _unicomKey = "unicom"
  20. _unicomPackKey = "unicom_pack"
  21. )
  22. // InOrdersSync insert OrdersSync
  23. func (s *Service) InOrdersSync(c context.Context, usermob, ip string, u *unicom.UnicomJson, now time.Time) (err error) {
  24. if !s.iplimit(_unicomKey, ip) {
  25. err = ecode.AccessDenied
  26. return
  27. }
  28. var result int64
  29. if result, err = s.dao.InOrdersSync(c, usermob, u, now); err != nil || result == 0 {
  30. log.Error("unicom_s.dao.OrdersSync (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%v) error(%v) or result==0",
  31. usermob, u.Cpid, u.Spid, u.TypeInt, u.Ordertypes, u.Channelcode, u.Ordertime, u.Canceltime, u.Endtime, u.Province, u.Area, u.Videoid, err)
  32. }
  33. return
  34. }
  35. // InAdvanceSync insert AdvanceSync
  36. func (s *Service) InAdvanceSync(c context.Context, usermob, ip string, u *unicom.UnicomJson, now time.Time) (err error) {
  37. if !s.iplimit(_unicomKey, ip) {
  38. err = ecode.AccessDenied
  39. return
  40. }
  41. var result int64
  42. if result, err = s.dao.InAdvanceSync(c, usermob, u, now); err != nil || result == 0 {
  43. log.Error("unicom_s.dao.InAdvanceSync (%s,%s,%s,%s,%s,%s,%s,%s,%v) error(%v) or result==0",
  44. usermob, u.Userphone, u.Cpid, u.Spid, u.Ordertypes, u.Channelcode, u.Province, u.Area, err)
  45. }
  46. return
  47. }
  48. // FlowSync update OrdersSync
  49. func (s *Service) FlowSync(c context.Context, flowbyte int, usermob, time, ip string, now time.Time) (err error) {
  50. if !s.iplimit(_unicomKey, ip) {
  51. err = ecode.AccessDenied
  52. return
  53. }
  54. var result int64
  55. if result, err = s.dao.FlowSync(c, flowbyte, usermob, time, now); err != nil || result == 0 {
  56. log.Error("unicom_s.dao.OrdersSync(%s, %s, %s) error(%v) or result==0", usermob, time, flowbyte, err)
  57. }
  58. return
  59. }
  60. // InIPSync
  61. func (s *Service) InIPSync(c context.Context, ip string, u *unicom.UnicomIpJson, now time.Time) (err error) {
  62. if !s.iplimit(_unicomKey, ip) {
  63. err = ecode.AccessDenied
  64. return
  65. }
  66. var result int64
  67. if result, err = s.dao.InIPSync(c, u, now); err != nil {
  68. log.Error("s.dao.InIpSync(%s,%s) error(%v)", u.Ipbegin, u.Ipend, err)
  69. } else if result == 0 {
  70. err = ecode.RequestErr
  71. log.Error("unicom_s.dao.InIpSync(%s,%s) error(%v) result==0", u.Ipbegin, u.Ipend, err)
  72. }
  73. return
  74. }
  75. // UserFlow
  76. func (s *Service) UserFlow(c context.Context, usermob, mobiApp, ip string, build int, now time.Time) (res *unicom.Unicom, msg string, err error) {
  77. var (
  78. row map[string]*unicom.Unicom
  79. orderType int
  80. )
  81. row = s.unicomInfo(c, usermob, now)
  82. res, msg, err = s.uState(row, usermob, now)
  83. switch err {
  84. case ecode.NothingFound:
  85. orderType = 1
  86. case ecode.NotModified:
  87. orderType = 3
  88. default:
  89. orderType = 2
  90. }
  91. s.unicomInfoc(mobiApp, usermob, ip, build, orderType, now)
  92. return
  93. }
  94. // unicomInfo
  95. func (s *Service) unicomInfo(c context.Context, usermob string, now time.Time) (res map[string]*unicom.Unicom) {
  96. var (
  97. err error
  98. us []*unicom.Unicom
  99. )
  100. res = map[string]*unicom.Unicom{}
  101. if us, err = s.dao.UnicomCache(c, usermob); err == nil && len(us) > 0 {
  102. s.pHit.Incr("unicoms_cache")
  103. } else {
  104. if us, err = s.dao.OrdersUserFlow(context.TODO(), usermob); err != nil {
  105. log.Error("unicom_s.dao.OrdersUserFlow error(%v)", err)
  106. return
  107. }
  108. s.pMiss.Incr("unicoms_cache")
  109. if len(us) > 0 {
  110. if err = s.dao.AddUnicomCache(c, usermob, us); err != nil {
  111. log.Error("s.dao.AddUnicomCache usermob(%v) error(%v)", usermob, err)
  112. return
  113. }
  114. }
  115. }
  116. if len(us) > 0 {
  117. row := &unicom.Unicom{}
  118. channel := &unicom.Unicom{}
  119. for _, u := range us {
  120. if u.TypeInt == 1 && now.Unix() <= int64(u.Endtime) {
  121. *row = *u
  122. continue
  123. } else if u.TypeInt == 0 {
  124. if int64(row.Ordertime) == 0 {
  125. *row = *u
  126. } else if int64(row.Ordertime) < int64(u.Ordertime) {
  127. continue
  128. }
  129. *row = *u
  130. continue
  131. } else if u.TypeInt == 1 {
  132. if int64(row.Ordertime) > int64(u.Ordertime) {
  133. continue
  134. }
  135. *channel = *u
  136. }
  137. }
  138. if row.Spid == 0 && channel.Spid == 0 {
  139. return
  140. } else if row.Spid == 0 && channel.Spid > 0 {
  141. row = channel
  142. }
  143. res[usermob] = row
  144. }
  145. return
  146. }
  147. // UserState
  148. func (s *Service) UserState(c context.Context, usermob, mobiApp, ip string, build int, now time.Time) (res *unicom.Unicom, msg string, err error) {
  149. var (
  150. orderType int
  151. )
  152. row := s.unicomInfo(c, usermob, now)
  153. res, msg, err = s.uState(row, usermob, now)
  154. switch err {
  155. case ecode.NothingFound:
  156. orderType = 1
  157. case ecode.NotModified:
  158. orderType = 3
  159. default:
  160. orderType = 2
  161. }
  162. s.unicomInfoc(mobiApp, usermob, ip, build, orderType, now)
  163. return
  164. }
  165. // UnicomState
  166. func (s *Service) UnicomState(c context.Context, usermob, mobiApp, ip string, build int, now time.Time) (res *unicom.Unicom, err error) {
  167. var (
  168. ok bool
  169. )
  170. row := s.unicomInfo(c, usermob, now)
  171. if res, ok = row[usermob]; !ok {
  172. res = &unicom.Unicom{Unicomtype: 1}
  173. } else if res.TypeInt == 1 && now.Unix() > int64(res.Endtime) {
  174. res.Unicomtype = 3
  175. } else if res.TypeInt == 1 {
  176. res.Unicomtype = 4
  177. } else if res.TypeInt == 0 {
  178. res.Unicomtype = 2
  179. }
  180. log.Info("unicomstate_type:%v unicomstate_type_usermob:%v", res.Unicomtype, usermob)
  181. s.unicomInfoc(mobiApp, usermob, ip, build, res.Unicomtype, now)
  182. return
  183. }
  184. // UserFlowState
  185. func (s *Service) UserFlowState(c context.Context, usermob string, now time.Time) (res *unicom.Unicom, err error) {
  186. row := s.unicomInfo(c, usermob, now)
  187. var ok bool
  188. if res, ok = row[usermob]; !ok {
  189. res = &unicom.Unicom{Unicomtype: 1}
  190. } else if res.TypeInt == 1 {
  191. res.Unicomtype = 3
  192. } else if res.TypeInt == 0 {
  193. res.Unicomtype = 2
  194. }
  195. return
  196. }
  197. // uState
  198. func (s *Service) uState(unicom map[string]*unicom.Unicom, usermob string, now time.Time) (res *unicom.Unicom, msg string, err error) {
  199. var ok bool
  200. if res, ok = unicom[usermob]; !ok {
  201. err = ecode.NothingFound
  202. msg = "该卡号尚未开通哔哩哔哩专属免流服务"
  203. } else if res.TypeInt == 1 && now.Unix() > int64(res.Endtime) {
  204. err = ecode.NotModified
  205. msg = "该卡号哔哩哔哩专属免流服务已退订且已过期"
  206. }
  207. return
  208. }
  209. // IsUnciomIP is unicom ip
  210. func (s *Service) IsUnciomIP(ipUint uint32, ipStr, mobiApp string, build int, now time.Time) (err error) {
  211. if !model.IsIPv4(ipStr) {
  212. err = ecode.NothingFound
  213. return
  214. }
  215. isValide := s.unciomIPState(ipUint)
  216. s.ipInfoc(mobiApp, "", ipStr, build, isValide, now)
  217. if isValide {
  218. return
  219. }
  220. err = ecode.NothingFound
  221. return
  222. }
  223. // UserUnciomIP
  224. func (s *Service) UserUnciomIP(ipUint uint32, ipStr, usermob, mobiApp string, build int, now time.Time) (res *unicom.UnicomUserIP) {
  225. res = &unicom.UnicomUserIP{
  226. IPStr: ipStr,
  227. IsValide: false,
  228. }
  229. if !model.IsIPv4(ipStr) {
  230. return
  231. }
  232. if res.IsValide = s.unciomIPState(ipUint); !res.IsValide {
  233. log.Error("unicom_user_ip:%v unicom_ip_usermob:%v", ipStr, usermob)
  234. }
  235. s.ipInfoc(mobiApp, usermob, ipStr, build, res.IsValide, now)
  236. return
  237. }
  238. // Order unicom user order
  239. func (s *Service) Order(c context.Context, usermobDes, channel string, ordertype int, now time.Time) (res *unicom.BroadbandOrder, msg string, err error) {
  240. var (
  241. usermob string
  242. )
  243. var (
  244. _aesKey = []byte("9ed226d9")
  245. )
  246. bs, err := base64.StdEncoding.DecodeString(usermobDes)
  247. if err != nil {
  248. log.Error("base64.StdEncoding.DecodeString(%s) error(%v)", usermobDes, err)
  249. return
  250. }
  251. bs, err = s.DesDecrypt(bs, _aesKey)
  252. if err != nil {
  253. log.Error("unicomSvc.DesDecrypt error(%v)", err)
  254. return
  255. }
  256. if len(bs) > 32 {
  257. usermob = string(bs[:32])
  258. } else {
  259. usermob = string(bs)
  260. }
  261. row := s.unicomInfo(c, usermob, now)
  262. if u, ok := row[usermob]; ok {
  263. if u.Spid != 979 && u.Spid != 0 && u.TypeInt == 0 {
  264. err = ecode.NotModified
  265. msg = "您当前是流量卡并且已生效无法再订购流量包"
  266. return
  267. }
  268. }
  269. if res, msg, err = s.dao.Order(c, usermobDes, channel, ordertype); err != nil {
  270. log.Error("s.dao.Order usermobDes(%v) error(%v)", usermobDes, err)
  271. return
  272. }
  273. return
  274. }
  275. // CancelOrder unicom user cancel order
  276. func (s *Service) CancelOrder(c context.Context, usermob string) (res *unicom.BroadbandOrder, msg string, err error) {
  277. if res, msg, err = s.dao.CancelOrder(c, usermob); err != nil {
  278. log.Error("s.dao.CancelOrder usermob(%v) error(%v)", usermob, err)
  279. return
  280. }
  281. return
  282. }
  283. // UnicomSMSCode unicom sms code
  284. func (s *Service) UnicomSMSCode(c context.Context, phone string, now time.Time) (msg string, err error) {
  285. if msg, err = s.dao.SendSmsCode(c, phone); err != nil {
  286. log.Error("s.dao.SendSmsCode phone(%v) error(%v)", phone, err)
  287. return
  288. }
  289. return
  290. }
  291. // AddUnicomBind unicom user bind
  292. func (s *Service) AddUnicomBind(c context.Context, phone string, code int, mid int64, now time.Time) (msg string, err error) {
  293. var (
  294. usermobDes string
  295. usermob string
  296. ub *unicom.UserBind
  297. result int64
  298. res *unicom.Unicom
  299. )
  300. if usermobDes, msg, err = s.dao.SmsNumber(c, phone, code); err != nil {
  301. log.Error("s.dao.SmsNumber error(%v)", err)
  302. return
  303. }
  304. if usermobDes == "" {
  305. err = ecode.NotModified
  306. msg = "激活失败,请重新输入验证码激活"
  307. return
  308. }
  309. var (
  310. _aesKey = []byte("9ed226d9")
  311. )
  312. bs, err := base64.StdEncoding.DecodeString(usermobDes)
  313. if err != nil {
  314. log.Error("base64.StdEncoding.DecodeString(%s) error(%v)", usermobDes, err)
  315. return
  316. }
  317. bs, err = s.DesDecrypt(bs, _aesKey)
  318. if err != nil {
  319. log.Error("unicomSvc.DesDecrypt error(%v)", err)
  320. return
  321. }
  322. if len(bs) > 32 {
  323. usermob = string(bs[:32])
  324. } else {
  325. usermob = string(bs)
  326. }
  327. row := s.unicomInfo(c, usermob, now)
  328. if res, msg, err = s.uState(row, usermob, now); err != nil {
  329. return
  330. }
  331. if res.Spid == 979 {
  332. err = ecode.NotModified
  333. msg = "该业务只支持哔哩哔哩免流卡"
  334. return
  335. }
  336. if _, err = s.unicomBindInfo(c, mid); err == nil {
  337. err = ecode.NotModified
  338. msg = "该账户已绑定过手机号"
  339. return
  340. }
  341. if midtmp := s.unicomBindMIdByPhone(c, phone); midtmp > 0 {
  342. err = ecode.NotModified
  343. msg = "该手机号已被注册"
  344. return
  345. }
  346. if ub, err = s.dao.UserBindOld(c, phone); err != nil || ub == nil {
  347. phoneInt, _ := strconv.Atoi(phone)
  348. ub = &unicom.UserBind{
  349. Usermob: usermob,
  350. Phone: phoneInt,
  351. Mid: mid,
  352. State: 1,
  353. }
  354. } else {
  355. ub.Mid = mid
  356. ub.State = 1
  357. }
  358. if result, err = s.dao.InUserBind(c, ub); err != nil || result == 0 {
  359. log.Error("s.dao.InUserBind ub(%v) error(%v) or result==0", ub, err)
  360. return
  361. }
  362. if err = s.dao.AddUserBindCache(c, mid, ub); err != nil {
  363. log.Error("s.dao.AddUserBindCache error(%v)", err)
  364. return
  365. }
  366. // databus
  367. s.addUserBindState(&unicom.UserBindInfo{MID: ub.Mid, Phone: ub.Phone, Action: "unicom_welfare_bind"})
  368. return
  369. }
  370. // ReleaseUnicomBind release unicom bind
  371. func (s *Service) ReleaseUnicomBind(c context.Context, mid int64, phone int) (msg string, err error) {
  372. var (
  373. result int64
  374. ub *unicom.UserBind
  375. )
  376. if ub, err = s.unicomBindInfo(c, mid); err != nil {
  377. msg = "用户未绑定手机号"
  378. return
  379. }
  380. ub.State = 0
  381. if err = s.dao.DeleteUserBindCache(c, mid); err != nil {
  382. log.Error("s.dao.DeleteUserBindCache error(%v)", err)
  383. return
  384. }
  385. if result, err = s.dao.InUserBind(c, ub); err != nil || result == 0 {
  386. log.Error("s.dao.InUserBind ub(%v) error(%v) or result==0", ub, err)
  387. return
  388. }
  389. // databus
  390. s.addUserBindState(&unicom.UserBindInfo{MID: ub.Mid, Phone: ub.Phone, Action: "unicom_welfare_untied"})
  391. return
  392. }
  393. // unicomBindInfo unicom bind info
  394. func (s *Service) unicomBindInfo(c context.Context, mid int64) (res *unicom.UserBind, err error) {
  395. if res, err = s.dao.UserBindCache(c, mid); err == nil {
  396. s.pHit.Incr("unicoms_userbind_cache")
  397. } else {
  398. if res, err = s.dao.UserBind(c, mid); err != nil {
  399. log.Error("s.dao.UserBind error(%v)", err)
  400. return
  401. }
  402. s.pMiss.Incr("unicoms_userbind_cache")
  403. if res == nil {
  404. err = ecode.NothingFound
  405. return
  406. }
  407. if err = s.dao.AddUserBindCache(c, mid, res); err != nil {
  408. log.Error("s.dao.AddUserBindCache mid(%d) error(%v)", mid, err)
  409. return
  410. }
  411. }
  412. return
  413. }
  414. func (s *Service) unicomBindMIdByPhone(c context.Context, phone string) (mid int64) {
  415. var err error
  416. if mid, err = s.dao.UserBindPhoneMid(c, phone); err != nil {
  417. log.Error("s.dao.UserBindPhoneMid error(%v)", phone)
  418. return
  419. }
  420. return
  421. }
  422. // UserBind user bind
  423. func (s *Service) UserBind(c context.Context, mid int64) (res *unicom.UserBind, msg string, err error) {
  424. var (
  425. acc *account.Info
  426. ub *unicom.UserBind
  427. )
  428. if acc, err = s.accd.Info(c, mid); err != nil {
  429. log.Error("s.accd.info error(%v)", err)
  430. return
  431. }
  432. res = &unicom.UserBind{
  433. Name: acc.Name,
  434. Mid: acc.Mid,
  435. }
  436. if ub, err = s.unicomBindInfo(c, mid); err != nil {
  437. log.Error("s.userBindInfo error(%v)", err)
  438. err = nil
  439. }
  440. if ub != nil {
  441. res.Phone = ub.Phone
  442. res.Integral = ub.Integral
  443. res.Flow = ub.Flow
  444. }
  445. return
  446. }
  447. // UnicomPackList unicom pack list
  448. func (s *Service) UnicomPackList() (res []*unicom.UserPack) {
  449. res = s.unicomPackCache
  450. return
  451. }
  452. // UnicomPackReceive unicom pack receive
  453. func (s *Service) UnicomPackReceive(c context.Context, mid int64, packID int64, now time.Time) (msg string, err error) {
  454. var (
  455. pack *unicom.UserPack
  456. userbind *unicom.UserBind
  457. requestNo int64
  458. unicomOrderID string
  459. unicomOutorderID string
  460. u *unicom.Unicom
  461. )
  462. if userbind, err = s.unicomBindInfo(c, mid); err != nil {
  463. err = ecode.NotModified
  464. msg = "用户未绑定手机号"
  465. return
  466. }
  467. row := s.unicomInfo(c, userbind.Usermob, now)
  468. if u, msg, err = s.uState(row, userbind.Usermob, now); err != nil {
  469. return
  470. }
  471. if u.Spid == 979 {
  472. err = ecode.NotModified
  473. msg = "该业务只支持哔哩哔哩免流卡"
  474. return
  475. }
  476. if pack, err = s.unicomPackInfos(c, packID); err != nil {
  477. err = ecode.NotModified
  478. msg = "该礼包不存在"
  479. return
  480. }
  481. if pack.Capped != 0 && pack.Amount == 0 {
  482. err = ecode.NotModified
  483. msg = "该礼包不存在"
  484. return
  485. }
  486. if userbind.Integral < pack.Integral {
  487. err = ecode.NotModified
  488. msg = "福利点不足"
  489. return
  490. }
  491. if requestNo, err = s.seqdao.SeqID(c); err != nil {
  492. log.Error("unicom_s.seqdao.SeqID error (%v)", err)
  493. return
  494. }
  495. switch pack.Type {
  496. case 0:
  497. if err = s.dao.UserFlowWaitCache(c, userbind.Phone); err == nil {
  498. err = ecode.NotModified
  499. msg = "请间隔一分钟之后再领取流量包"
  500. return
  501. }
  502. if msg, err = s.dao.FlowPre(c, userbind.Phone, requestNo, now); err != nil {
  503. log.Error("s.dao.FlowPre error(%v)", err)
  504. return
  505. }
  506. if unicomOrderID, unicomOutorderID, msg, err = s.dao.FlowExchange(c, userbind.Phone, pack.Param, requestNo, now); err != nil {
  507. log.Error("s.dao.FlowExchange error(%v)", err)
  508. return
  509. }
  510. uf := &unicom.UnicomUserFlow{
  511. Phone: userbind.Phone,
  512. Mid: mid,
  513. Integral: pack.Integral,
  514. Flow: 0,
  515. Orderid: unicomOrderID,
  516. Outorderid: unicomOutorderID,
  517. Desc: pack.Desc,
  518. }
  519. key := strconv.Itoa(userbind.Phone) + unicomOutorderID
  520. if err = s.addUserFlowCache(c, key, uf); err != nil {
  521. log.Error("s.addUserFlowCache error(%v)", err)
  522. return
  523. }
  524. if err = s.dao.AddUserFlowWaitCache(c, userbind.Phone); err != nil {
  525. log.Error("s.dao.AddUserFlowWaitCache error(%v)", err)
  526. return
  527. }
  528. case 1:
  529. var batchID int
  530. if batchID, err = strconv.Atoi(pack.Param); err != nil {
  531. log.Error("batchID(%v) strconv.Atoi error(%v)", pack.Param, err)
  532. msg = "礼包参数错误"
  533. err = ecode.RequestErr
  534. return msg, err
  535. }
  536. if msg, err = s.accd.AddVIP(c, mid, requestNo, batchID, pack.Desc); err != nil {
  537. log.Error("s.accd.AddVIP error(%v)", err)
  538. return msg, err
  539. }
  540. case 2:
  541. var day int
  542. if day, err = strconv.Atoi(pack.Param); err != nil {
  543. log.Error("day(%v) strconv.Atoi error(%v)", pack.Param, err)
  544. msg = "礼包参数错误"
  545. err = ecode.RequestErr
  546. return msg, err
  547. }
  548. if msg, err = s.live.AddVip(c, mid, day); err != nil {
  549. log.Error("s.live.AddVip error(%v)", err)
  550. return "", err
  551. }
  552. case 3:
  553. var acc *account.Info
  554. if acc, err = s.accd.Info(c, mid); err != nil {
  555. log.Error("s.accd.info error(%v)", err)
  556. return
  557. }
  558. if msg, err = s.shop.Coupon(c, pack.Param, mid, acc.Name); err != nil {
  559. log.Error("s.shop.Coupon error(%v)", err)
  560. return
  561. }
  562. }
  563. var (
  564. p = &unicom.UserPack{}
  565. ub = &unicom.UserBind{}
  566. requestNoStr string
  567. result int64
  568. )
  569. if pack.Capped != 0 {
  570. *p = *pack
  571. p.Amount = p.Amount - 1
  572. if p.Amount == 0 {
  573. if err = s.dao.DeleteUserPackCache(c, p.ID); err != nil {
  574. log.Error("s.dao.DeleteUserPackCache error(%v)", err)
  575. return
  576. }
  577. p.State = 0
  578. } else {
  579. if err = s.dao.AddUserPackCache(c, p.ID, p); err != nil {
  580. log.Error("s.dao.AddUserPackCache error(%v)", err)
  581. return
  582. }
  583. }
  584. if result, err = s.dao.UpUserPacks(c, p, p.ID); err != nil || result == 0 {
  585. log.Error("s.dao.UpUserPacks error(%v) or result==0", err)
  586. return
  587. }
  588. }
  589. *ub = *userbind
  590. ub.Integral = ub.Integral - pack.Integral
  591. if err = s.updateUserIntegral(c, mid, ub); err != nil {
  592. log.Error("s.updateUserIntegral error(%v)", err)
  593. return
  594. }
  595. msg = pack.Desc + ",领取成功"
  596. if unicomOrderID != "" {
  597. requestNoStr = unicomOrderID
  598. } else {
  599. requestNoStr = strconv.FormatInt(requestNo, 10)
  600. }
  601. log.Info("unicom_pack(%v) mid(%v)", pack.Desc+",领取成功", userbind.Mid)
  602. s.unicomPackInfoc(userbind.Usermob, pack.Desc, requestNoStr, userbind.Phone, pack.Integral, int(pack.Capped), userbind.Mid, now)
  603. ul := &unicom.UserPackLog{
  604. Phone: userbind.Phone,
  605. Usermob: userbind.Usermob,
  606. Mid: userbind.Mid,
  607. RequestNo: requestNoStr,
  608. Type: pack.Type,
  609. Desc: pack.Desc,
  610. UserDesc: ("您当前已领取" + pack.Desc + ",扣除" + strconv.Itoa(pack.Integral) + "福利点"),
  611. Integral: pack.Integral,
  612. }
  613. s.addUserPackLog(ul)
  614. return
  615. }
  616. // UnicomFlowPack unicom flow pack
  617. func (s *Service) UnicomFlowPack(c context.Context, mid int64, flowID string, now time.Time) (msg string, err error) {
  618. var (
  619. userbind *unicom.UserBind
  620. ub = &unicom.UserBind{}
  621. requestNo int64
  622. flowDesc string
  623. flow int
  624. unicomOrderID string
  625. unicomOutorderID string
  626. u *unicom.Unicom
  627. )
  628. if userbind, err = s.unicomBindInfo(c, mid); err != nil {
  629. err = ecode.NotModified
  630. msg = "用户未绑定手机号"
  631. return
  632. }
  633. row := s.unicomInfo(c, userbind.Usermob, now)
  634. if u, msg, err = s.uState(row, userbind.Usermob, now); err != nil {
  635. return
  636. }
  637. if u.Spid == 979 {
  638. err = ecode.NotModified
  639. msg = "该业务只支持哔哩哔哩免流卡"
  640. return
  641. }
  642. switch flowID {
  643. case "01":
  644. flow = 100
  645. flowDesc = "100MB流量包"
  646. case "02":
  647. flow = 200
  648. flowDesc = "200MB流量包"
  649. case "03":
  650. flow = 300
  651. flowDesc = "300MB流量包"
  652. case "04":
  653. flow = 500
  654. flowDesc = "500MB流量包"
  655. case "05":
  656. flow = 1024
  657. flowDesc = "1024MB流量包"
  658. case "06":
  659. flow = 2048
  660. flowDesc = "2048MB流量包"
  661. default:
  662. err = ecode.RequestErr
  663. msg = "流量包参数错误"
  664. return
  665. }
  666. if userbind.Flow < flow {
  667. err = ecode.NotModified
  668. msg = "可用流量不足"
  669. return
  670. }
  671. if err = s.dao.UserFlowWaitCache(c, userbind.Phone); err == nil {
  672. err = ecode.NotModified
  673. msg = "请间隔一分钟之后再领取流量包"
  674. return
  675. }
  676. if requestNo, err = s.seqdao.SeqID(c); err != nil {
  677. log.Error("unicom_s.seqdao.SeqID error (%v)", err)
  678. return
  679. }
  680. if unicomOrderID, unicomOutorderID, msg, err = s.dao.FlowExchange(c, userbind.Phone, flowID, requestNo, now); err != nil {
  681. log.Error("s.dao.FlowExchange error(%v)", err)
  682. return
  683. }
  684. uf := &unicom.UnicomUserFlow{
  685. Phone: userbind.Phone,
  686. Mid: mid,
  687. Integral: 0,
  688. Flow: flow,
  689. Orderid: unicomOrderID,
  690. Outorderid: unicomOutorderID,
  691. Desc: flowDesc,
  692. }
  693. key := strconv.Itoa(userbind.Phone) + unicomOutorderID
  694. if err = s.addUserFlowCache(c, key, uf); err != nil {
  695. log.Error("s.addUserFlowCache error(%v)", err)
  696. return
  697. }
  698. *ub = *userbind
  699. ub.Flow = ub.Flow - flow
  700. if err = s.updateUserIntegral(c, mid, ub); err != nil {
  701. log.Error("s.updateUserIntegral error(%v)", err)
  702. return
  703. }
  704. msg = flowDesc + ",领取成功"
  705. log.Info("unicom_pack(%v) mid(%v)", flowDesc+",领取成功", userbind.Mid)
  706. s.unicomPackInfoc(userbind.Usermob, flowDesc, unicomOrderID, userbind.Phone, flow, 0, userbind.Mid, now)
  707. ul := &unicom.UserPackLog{
  708. Phone: userbind.Phone,
  709. Usermob: userbind.Usermob,
  710. Mid: userbind.Mid,
  711. RequestNo: unicomOrderID,
  712. Type: 0,
  713. Desc: flowDesc,
  714. UserDesc: ("您当前已领取" + flowDesc + ",扣除" + strconv.Itoa(flow) + "MB流量"),
  715. Integral: flow,
  716. }
  717. s.addUserPackLog(ul)
  718. if err = s.dao.AddUserFlowWaitCache(c, userbind.Phone); err != nil {
  719. log.Error("s.dao.AddUserFlowWaitCache error(%v)", err)
  720. return
  721. }
  722. return
  723. }
  724. // UserBindLog user bind week log
  725. func (s *Service) UserBindLog(c context.Context, mid int64, now time.Time) (res []*unicom.UserLog, err error) {
  726. if res, err = s.dao.SearchUserBindLog(c, mid, now); err != nil {
  727. log.Error("unicom s.dao.SearchUserBindLog error(%v)", err)
  728. return
  729. }
  730. return
  731. }
  732. // WelfareBindState welfare user bind state
  733. func (s *Service) WelfareBindState(c context.Context, mid int64) (res int) {
  734. if ub, err := s.dao.UserBindCache(c, mid); err == nil && ub != nil {
  735. res = 1
  736. }
  737. return
  738. }
  739. func (s *Service) updateUserIntegral(c context.Context, mid int64, ub *unicom.UserBind) (err error) {
  740. var result int64
  741. if err = s.dao.AddUserBindCache(c, mid, ub); err != nil {
  742. log.Error("s.dao.AddUserBindCache error(%v)", err)
  743. return
  744. }
  745. if result, err = s.dao.UpUserIntegral(c, ub); err != nil {
  746. log.Error("s.dao.UpUserIntegral error(%v) ", err)
  747. return
  748. }
  749. if result == 0 {
  750. log.Error("s.dao.UpUserIntegral result==0")
  751. err = ecode.NotModified
  752. return
  753. }
  754. return
  755. }
  756. // unicomPackInfos unicom pack infos
  757. func (s *Service) unicomPackInfos(c context.Context, id int64) (res *unicom.UserPack, err error) {
  758. var (
  759. ub *unicom.UserPack
  760. row = map[int64]*unicom.UserPack{}
  761. ok bool
  762. )
  763. if ub, err = s.dao.UserPackCache(c, id); err == nil {
  764. res = ub
  765. s.pHit.Incr("unicoms_pack_cache")
  766. } else {
  767. if row, err = s.dao.UserPackByID(c, id); err != nil {
  768. log.Error("s.dao.UserBind error(%v)", err)
  769. return
  770. }
  771. s.pMiss.Incr("unicoms_pack_cache")
  772. ub, ok = row[id]
  773. if !ok {
  774. err = ecode.NothingFound
  775. return
  776. }
  777. if err = s.dao.AddUserPackCache(c, id, ub); err != nil {
  778. log.Error("s.dao.AddUserPackCache id(%d) error(%v)", id, err)
  779. return
  780. }
  781. res = ub
  782. }
  783. return
  784. }
  785. // unciomIPState
  786. func (s *Service) unciomIPState(ipUint uint32) (isValide bool) {
  787. for _, u := range s.unicomIpCache {
  788. if u.IPStartUint <= ipUint && u.IPEndUint >= ipUint {
  789. isValide = true
  790. return
  791. }
  792. }
  793. isValide = false
  794. return
  795. }
  796. // unicomIp ip limit
  797. func (s *Service) iplimit(k, ip string) bool {
  798. key := fmt.Sprintf(_initIPlimitKey, k, ip)
  799. if _, ok := s.operationIPlimit[key]; ok {
  800. return true
  801. }
  802. return false
  803. }
  804. // DesDecrypt
  805. func (s *Service) DesDecrypt(src, key []byte) ([]byte, error) {
  806. block, err := des.NewCipher(key)
  807. if err != nil {
  808. return nil, err
  809. }
  810. out := make([]byte, len(src))
  811. dst := out
  812. bs := block.BlockSize()
  813. if len(src)%bs != 0 {
  814. return nil, errors.New("crypto/cipher: input not full blocks")
  815. }
  816. for len(src) > 0 {
  817. block.Decrypt(dst, src[:bs])
  818. src = src[bs:]
  819. dst = dst[bs:]
  820. }
  821. out = s.zeroUnPadding(out)
  822. return out, nil
  823. }
  824. // zeroUnPadding
  825. func (s *Service) zeroUnPadding(origData []byte) []byte {
  826. return bytes.TrimFunc(origData,
  827. func(r rune) bool {
  828. return r == rune(0)
  829. })
  830. }
  831. func (s *Service) addUserFlowCache(c context.Context, key string, uf *unicom.UnicomUserFlow) (err error) {
  832. if err = s.dao.AddUserFlowCache(c, key); err != nil {
  833. log.Error("s.dao.AddUserFlowCache error(%v)", err)
  834. return
  835. }
  836. var flowList map[string]*unicom.UnicomUserFlow
  837. if flowList, err = s.dao.UserFlowListCache(c); err != nil {
  838. log.Error("s.dao.UserFlowListCache error(%v)", err)
  839. return
  840. }
  841. if flowList == nil {
  842. flowList = map[string]*unicom.UnicomUserFlow{
  843. key: uf,
  844. }
  845. } else {
  846. flowList[key] = uf
  847. }
  848. if err = s.dao.AddUserFlowListCache(c, flowList); err != nil {
  849. log.Error("s.dao.AddUserFlowListCache error(%v)", err)
  850. return
  851. }
  852. return
  853. }
  854. // UserPacksLog user pack logs
  855. func (s *Service) UserPacksLog(c context.Context, starttime, now time.Time, start int, ip string) (res []*unicom.UserPackLog, err error) {
  856. if !s.iplimit(_unicomPackKey, ip) {
  857. err = ecode.AccessDenied
  858. return
  859. }
  860. var (
  861. endday time.Time
  862. )
  863. if starttime.Month() >= now.Month() && starttime.Year() >= now.Year() {
  864. res = []*unicom.UserPackLog{}
  865. return
  866. }
  867. if endInt := starttime.AddDate(0, 1, -1).Day(); start > endInt {
  868. res = []*unicom.UserPackLog{}
  869. return
  870. } else if start == endInt {
  871. endday = starttime.AddDate(0, 1, 0)
  872. } else {
  873. endday = starttime.AddDate(0, 0, start)
  874. }
  875. if res, err = s.dao.UserPacksLog(c, endday.AddDate(0, 0, -1), endday); err != nil {
  876. log.Error("user pack logs s.dao.UserPacksLog error(%v)", err)
  877. return
  878. }
  879. if len(res) == 0 {
  880. res = []*unicom.UserPackLog{}
  881. }
  882. return
  883. }
  884. func (s *Service) addUserPackLog(u *unicom.UserPackLog) {
  885. select {
  886. case s.packLogCh <- u:
  887. default:
  888. log.Warn("user pack log buffer is full")
  889. }
  890. }
  891. func (s *Service) addUserPackLogproc() {
  892. for {
  893. i, ok := <-s.packLogCh
  894. if !ok {
  895. log.Warn("user pack log proc exit")
  896. return
  897. }
  898. var (
  899. c = context.TODO()
  900. result int64
  901. err error
  902. logID = 91
  903. )
  904. switch v := i.(type) {
  905. case *unicom.UserPackLog:
  906. if result, err = s.dao.InUserPackLog(c, v); err != nil || result == 0 {
  907. log.Error("s.dao.UpUserIntegral error(%v) or result==0", err)
  908. continue
  909. }
  910. report.User(&report.UserInfo{
  911. Mid: v.Mid,
  912. Business: logID,
  913. Action: "unicom_userpack_deduct",
  914. Ctime: time.Now(),
  915. Content: map[string]interface{}{
  916. "phone": v.Phone,
  917. "pack_desc": v.UserDesc,
  918. "integral": (0 - v.Integral),
  919. },
  920. })
  921. }
  922. }
  923. }