openPower.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. package main
  2. import (
  3. "context"
  4. "encoding/json"
  5. "flag"
  6. "fmt"
  7. "log"
  8. "time"
  9. . "app.yhyue.com/moapp/jybase/common"
  10. "app.yhyue.com/moapp/jybase/date"
  11. "app.yhyue.com/moapp/jybase/mongodb"
  12. ml "app.yhyue.com/moapp/jybase/mysql"
  13. "bp.jydev.jianyu360.cn/BaseService/resourceCenter/rpc/pb"
  14. "bp.jydev.jianyu360.cn/BaseService/resourceCenter/rpc/resource"
  15. upb "bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
  16. "bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/usercenter"
  17. "github.com/zeromicro/go-zero/core/discov"
  18. "github.com/zeromicro/go-zero/zrpc"
  19. )
  20. const (
  21. appid = "10000"
  22. )
  23. var (
  24. etcdAddress []string
  25. BaseService *ml.Mysql
  26. Mgo *mongodb.MongodbSim
  27. JyOrder *ml.Mysql
  28. goodsCode string
  29. goodsSpecId int64
  30. all map[string]string
  31. powerType string
  32. )
  33. func main() {
  34. phone := flag.String("p", "", "手机号")
  35. m := flag.Int("m", 0, "1:查询权益 2:开通权益 3:取消权益")
  36. t := flag.String("t", "", "yxy:医械云 bi_yllyh:医疗领域化BI bi_ldx:立达信BI分析工具")
  37. isProduct := flag.Int("d", 0, "是否是线上环境;0:否 1:是")
  38. dayCount := flag.Int("c", 0, "自定义设置需要开通权益的天数,包含今天")
  39. flag.Parse()
  40. if *phone == "" {
  41. log.Fatalln("-p 参数无效")
  42. }
  43. var entity Entity
  44. if *t == "yxy" {
  45. entity = &Yxy{}
  46. } else if *t == "bi_yllyh" {
  47. entity = &Bi_yllyh{}
  48. } else if *t == "bi_ldx" {
  49. goodsCode = "special_nosale_goods"
  50. entity = &Bi_ldx{}
  51. } else {
  52. log.Fatalln("-t 参数无效")
  53. }
  54. powerType, goodsCode, goodsSpecId, all = entity.init()
  55. if *isProduct == 1 {
  56. etcdAddress = []string{"172.17.4.182:2379", "172.17.4.183:2379", "172.17.148.49:2379"}
  57. BaseService = &ml.Mysql{
  58. Address: "172.17.145.164:14000",
  59. UserName: "root",
  60. PassWord: "Tibi#20211222",
  61. DBName: "base_service",
  62. MaxOpenConns: 2,
  63. MaxIdleConns: 2,
  64. }
  65. Mgo = &mongodb.MongodbSim{
  66. MongodbAddr: "172.17.4.193:27080,172.17.4.83:27080",
  67. Size: 1,
  68. DbName: "qfw",
  69. ReplSet: "",
  70. UserName: "",
  71. Password: "",
  72. }
  73. JyOrder = &ml.Mysql{
  74. Address: "172.17.145.169:3306",
  75. UserName: "root",
  76. PassWord: "TopMysql@123",
  77. DBName: "jianyu",
  78. MaxOpenConns: 2,
  79. MaxIdleConns: 2,
  80. }
  81. } else {
  82. etcdAddress = []string{"127.0.0.1:2379"}
  83. BaseService = &ml.Mysql{
  84. Address: "192.168.3.14:4000",
  85. UserName: "root",
  86. PassWord: "=PDT49#80Z!RVv52_z",
  87. DBName: "base_service",
  88. MaxOpenConns: 2,
  89. MaxIdleConns: 2,
  90. }
  91. Mgo = &mongodb.MongodbSim{
  92. MongodbAddr: "192.168.3.206:27080",
  93. Size: 1,
  94. DbName: "qfw",
  95. ReplSet: "",
  96. UserName: "",
  97. Password: "",
  98. }
  99. JyOrder = &ml.Mysql{
  100. Address: "192.168.3.11:3366",
  101. UserName: "root",
  102. PassWord: "Topnet123",
  103. DBName: "jianyu",
  104. MaxOpenConns: 2,
  105. MaxIdleConns: 2,
  106. }
  107. }
  108. BaseService.Init()
  109. JyOrder.Init()
  110. Mgo.InitPool()
  111. ur := BaseService.SelectBySql(`select id from base_user where phone=?`, *phone)
  112. if ur == nil || len(*ur) <= 0 {
  113. log.Fatalln("没有找到该用户!")
  114. }
  115. for _, v := range *ur {
  116. id := Int64All(v["id"])
  117. msg := "用户:" + fmt.Sprint(id) + " 手机号:" + *phone
  118. u, ok := Mgo.FindOneByField("user", map[string]interface{}{"base_user_id": id}, `{"_id":1,"l_vip_endtime":1,"i_member_endtime":1,"s_member_mainid":1,"i_member_sub_status":1}`)
  119. if !ok || u == nil || len(*u) == 0 {
  120. log.Println(msg, "mongodb user 中没有找到该用户!")
  121. continue
  122. }
  123. var c = resource.NewResource(zrpc.MustNewClient(zrpc.RpcClientConf{
  124. Etcd: discov.EtcdConf{
  125. Hosts: etcdAddress,
  126. Key: "resource.rpc",
  127. },
  128. }))
  129. if *m == 1 {
  130. r, err := c.Haspowers(context.Background(), &pb.HaspowersReq{
  131. Appid: "10000",
  132. EntId: 0,
  133. EntUserId: 0,
  134. UserId: id,
  135. })
  136. if err != nil {
  137. log.Println(msg, "查询", powerType, "权益失败!", err)
  138. } else {
  139. mp := map[string]bool{}
  140. for _, v := range r.Powers {
  141. mp[v] = true
  142. }
  143. flag := true
  144. for k, v := range all {
  145. if !mp[v] {
  146. log.Println(msg, powerType, "权益异常,缺少权益:", k)
  147. flag = false
  148. continue
  149. }
  150. }
  151. if flag {
  152. for k, _ := range all {
  153. log.Println(msg, "拥有", powerType, "权益:", k)
  154. }
  155. }
  156. }
  157. } else if *m == 2 {
  158. if !entity.beforeOpen(phone, u) {
  159. return
  160. }
  161. endTime := ""
  162. if *dayCount > 0 {
  163. now := time.Now()
  164. end_time := time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 0, time.Local)
  165. end_time = end_time.AddDate(0, 0, *dayCount-1)
  166. endTime = date.FormatDate(&end_time, date.Date_Full_Layout)
  167. }
  168. r, err := c.PowerHandle(context.Background(), &pb.PowerReq{
  169. Appid: appid,
  170. GoodsCode: goodsCode,
  171. GoodsSpecId: goodsSpecId,
  172. EntId: 0,
  173. UserId: id,
  174. BuyNum: 1,
  175. Type: 1,
  176. EndTime: endTime,
  177. })
  178. if err != nil {
  179. log.Println(msg, powerType, "开通失败!", err)
  180. } else if r.Status == 1 {
  181. entity.afterOpen(phone, u)
  182. log.Println(msg, powerType, "已开通!")
  183. } else {
  184. log.Println(msg, powerType, "开通失败!")
  185. }
  186. } else if *m == 3 {
  187. r, err := c.PowerHandle(context.Background(), &pb.PowerReq{
  188. Appid: appid,
  189. GoodsCode: goodsCode,
  190. GoodsSpecId: goodsSpecId,
  191. EntId: 0,
  192. UserId: id,
  193. BuyNum: 1,
  194. Type: -1,
  195. })
  196. if err != nil {
  197. log.Println(msg, powerType, "取消失败!", err)
  198. } else if r.Status == 1 {
  199. log.Println(msg, powerType, "已取消!")
  200. } else {
  201. log.Println(msg, powerType, "取消失败!")
  202. }
  203. } else {
  204. log.Fatalln("-m 参数无效")
  205. }
  206. if *m == 2 || *m == 3 {
  207. var cc = usercenter.NewUserCenter(zrpc.MustNewClient(zrpc.RpcClientConf{
  208. Etcd: discov.EtcdConf{
  209. Hosts: etcdAddress,
  210. Key: "usercenter.rpc",
  211. },
  212. }))
  213. userId := mongodb.BsonIdToSId((*u)["_id"])
  214. resp, err := cc.WorkDesktopClearUserInfo(context.Background(), &upb.WorkDesktopClearUserInfoReq{
  215. UserId: userId,
  216. AppId: appid,
  217. Platform: "PC",
  218. UserIds: userId,
  219. NewUserId: fmt.Sprint(id),
  220. })
  221. if err != nil {
  222. log.Println("清除用户工作桌面缓存失败", err)
  223. } else if resp.ErrorCode != 0 {
  224. log.Println("清除用户工作桌面缓存失败", resp.ErrorMsg)
  225. }
  226. }
  227. }
  228. }
  229. type Entity interface {
  230. init() (string, string, int64, map[string]string)
  231. beforeOpen(phone *string, u *map[string]interface{}) bool
  232. afterOpen(phone *string, u *map[string]interface{})
  233. }
  234. /******************************医疗领域化BI******************************************/
  235. type Bi_yllyh struct {
  236. }
  237. //
  238. func (b *Bi_yllyh) init() (string, string, int64, map[string]string) {
  239. return "医疗领域化BI", "special_nosale_goods", 14, map[string]string{"医疗领域化BI": "bi_yllyh"}
  240. }
  241. //
  242. func (b *Bi_yllyh) beforeOpen(phone *string, u *map[string]interface{}) bool {
  243. return true
  244. }
  245. //
  246. func (b *Bi_yllyh) afterOpen(phone *string, u *map[string]interface{}) {
  247. }
  248. /******************************立达信BI分析工具******************************************/
  249. type Bi_ldx struct {
  250. }
  251. //
  252. func (b *Bi_ldx) init() (string, string, int64, map[string]string) {
  253. return "立达信BI分析工具", "special_nosale_goods", 15, map[string]string{"立达信BI分析工具": "bi_ldx"}
  254. }
  255. //
  256. func (b *Bi_ldx) beforeOpen(phone *string, u *map[string]interface{}) bool {
  257. return true
  258. }
  259. //
  260. func (b *Bi_ldx) afterOpen(phone *string, u *map[string]interface{}) {
  261. }
  262. /******************************医械云******************************************/
  263. type Yxy struct {
  264. }
  265. //
  266. func (y *Yxy) init() (string, string, int64, map[string]string) {
  267. return "医械云权益", "lyh", 13, map[string]string{
  268. "医疗标讯搜索": "lyh_yl_ylbxss",
  269. "医疗机构搜索": "lyh_yl_yljgss",
  270. "经销商搜索": "lyh_yl_jxsss",
  271. "医疗机构画像": "lyh_yl_yljghx",
  272. "医疗机构认领": "lyh_yl_yljgrl",
  273. "经销商认领": "lyh_yl_jxsrl",
  274. "医疗订阅": "lyh_yl_yldy",
  275. }
  276. }
  277. //
  278. func (y *Yxy) beforeOpen(phone *string, u *map[string]interface{}) bool {
  279. ok, _, _, _ := y.isOK(*phone, *u)
  280. return ok
  281. }
  282. //
  283. func (y *Yxy) afterOpen(phone *string, u *map[string]interface{}) {
  284. ok, orderVip, vipRs, bigRs := y.isOK(*phone, *u)
  285. if ok {
  286. y.createYxtOrder(*phone, *u, orderVip, vipRs, bigRs)
  287. }
  288. }
  289. func (y *Yxy) isOK(phone string, user map[string]interface{}) (bool, bool, *[]map[string]interface{}, *[]map[string]interface{}) {
  290. orderVip := true // 是否根据超级订阅订单处理 如果是大会员也是超级订阅则按大会员处理
  291. flag1 := false
  292. flag2 := false
  293. mainPhone := phone
  294. if IntAllDef(user["i_member_sub_status"], -1) == 1 {
  295. mainUser, ok := Mgo.FindById("user", ObjToString(user["s_member_mainid"]), `{"s_phone"1:,"s_m_phone":1}`)
  296. if ok && mainUser != nil {
  297. mainPhone = ObjToString((*mainUser)["s_phone"])
  298. if mainPhone == "" {
  299. mainPhone = ObjToString((*mainUser)["s_m_phone"])
  300. }
  301. if mainPhone == "" {
  302. log.Println("该用户是子账号,没有找到其主账号的手机号")
  303. return false, false, nil, nil
  304. }
  305. } else {
  306. log.Println("该用户是子账号,没有找到其主账号的信息")
  307. return false, false, nil, nil
  308. }
  309. }
  310. bigMemberRs := JyOrder.SelectBySql(`select * from dataexport_order where user_phone=? and order_status=1 and product_type ="大会员" and (timestampdiff(day,vip_starttime,vip_endtime)>=365) order by create_time desc limit 1`, mainPhone)
  311. if bigMemberRs != nil && len(*bigMemberRs) == 1 {
  312. (*bigMemberRs)[0]["user_phone"] = phone
  313. (*bigMemberRs)[0]["user_id"] = mongodb.BsonIdToSId(user["_id"])
  314. }
  315. vipRs := JyOrder.SelectBySql(`select * from dataexport_order where user_phone=? and order_status=1 and product_type ="VIP订阅" and (timestampdiff(day,vip_starttime,vip_endtime)>=365) order by create_time desc limit 1`, phone)
  316. if (bigMemberRs == nil || len(*bigMemberRs) == 0) && (vipRs == nil || len(*vipRs) == 0) {
  317. log.Println("没有查询到该用户的年度超级订阅或者大会员订单")
  318. return false, false, nil, nil
  319. }
  320. // 同时存在超级订阅和大会员年度订单 不再判断最晚到期时间 大会员优先
  321. if vipRs != nil && len(*vipRs) == 1 {
  322. vipEndTime := Int64All(user["l_vip_endtime"])
  323. leftdayvip := time.Unix(vipEndTime, 0).Sub(time.Now()).Hours() / 24
  324. if leftdayvip >= 90 {
  325. orderVip = true
  326. flag1 = true
  327. }
  328. }
  329. if *bigMemberRs != nil && len(*bigMemberRs) == 1 {
  330. // 判断最晚到期时间
  331. bigMemberEndTime := IntAll(user["i_member_endtime"])
  332. leftdaybig := time.Unix(int64(bigMemberEndTime), 0).Sub(time.Now()).Hours() / 24
  333. if leftdaybig >= 90 {
  334. orderVip = false
  335. flag2 = true
  336. }
  337. }
  338. if !flag1 && !flag2 {
  339. log.Println("该用户剩余不符合条件")
  340. return false, false, nil, nil
  341. }
  342. return true, orderVip, vipRs, bigMemberRs
  343. }
  344. // 生成医械通订单
  345. func (y *Yxy) createYxtOrder(phone string, user map[string]interface{}, orderVip bool, vipRs, bigMemberRs *[]map[string]interface{}) {
  346. var insertOrder map[string]interface{}
  347. // 超级订阅
  348. if orderVip {
  349. insertOrder = (*vipRs)[0]
  350. // 生订单信息
  351. orderMoney := Float64All(insertOrder["order_money"])
  352. endTime := Int64All(user["l_vip_endtime"])
  353. var money int
  354. if IntAll(insertOrder["is_backstage_order"]) == 1 {
  355. filterData := (*vipRs)[0]["filter"]
  356. filterMap := map[string]interface{}{}
  357. err := json.Unmarshal([]byte(filterData.(string)), &filterMap)
  358. if err != nil {
  359. log.Println("反序列化失败", err)
  360. return
  361. }
  362. cycle := Float64All(filterMap["cyclecount"])
  363. cycleUnit := Float64All(filterMap["cycleunit"])
  364. money = y.getPriceBack(orderMoney, time.Unix(endTime, 0), cycle, cycleUnit)
  365. } else {
  366. money = y.getPrice(orderMoney, time.Unix(endTime, 0))
  367. }
  368. insertOrder["order_money"] = money
  369. insertOrder["original_price"] = money
  370. insertOrder["vip_endtime"] = time.Unix(endTime, 0).Format(date.Date_Full_Layout)
  371. } else {
  372. // 大会员
  373. endTime := Int64All(user["i_member_endtime"])
  374. filterData := (*bigMemberRs)[0]["filter"]
  375. filterMap := map[string]interface{}{}
  376. err := json.Unmarshal([]byte(filterData.(string)), &filterMap)
  377. if err != nil {
  378. log.Println("反序列化失败", err)
  379. return
  380. }
  381. filterMap["area"] = "-"
  382. insertOrder = (*bigMemberRs)[0]
  383. filter, _ := json.Marshal(filterMap)
  384. insertOrder["filter"] = string(filter)
  385. insertOrder["order_money"] = 0
  386. insertOrder["original_price"] = 0
  387. insertOrder["vip_endtime"] = time.Unix(endTime, 0).Format(date.Date_Full_Layout)
  388. }
  389. // 生订单信息
  390. insertOrder["product_type"] = "医械通"
  391. insertOrder["order_code"] = fmt.Sprintf("%s%s", time.Now().Format("150405"), GetRandom(6))
  392. insertOrder["prepay_id"] = ""
  393. insertOrder["pay_money"] = 0
  394. insertOrder["discount_price"] = 0
  395. insertOrder["pay_way"] = ""
  396. insertOrder["out_trade_no"] = ""
  397. insertOrder["create_time"] = date.NowFormat(date.Date_Full_Layout)
  398. insertOrder["vip_starttime"] = date.NowFormat(date.Date_Full_Layout)
  399. insertOrder["pay_time"] = insertOrder["vip_starttime"]
  400. insertOrder["prepay_time"] = insertOrder["vip_starttime"]
  401. delete(insertOrder, "id")
  402. saveRs := JyOrder.Insert("dataexport_order", insertOrder)
  403. if saveRs > 0 {
  404. log.Println("医械通订单保存成功")
  405. } else {
  406. log.Println("医械通订单保存失败", saveRs)
  407. }
  408. }
  409. // 计算价格 线上的
  410. func (y *Yxy) getPrice(orderMoney float64, endTime time.Time) int {
  411. // 计算价格
  412. dis := endTime.Sub(time.Now())
  413. days := dis.Hours() / 24 // 剩余天数
  414. money := int(orderMoney / 360 * float64(int(days)))
  415. return money
  416. }
  417. // 计算价格 管理后台创建的
  418. func (y *Yxy) getPriceBack(orderMoney float64, endTime time.Time, cycle, cycleUnit float64) int {
  419. //(1:年 2:月 3:天 4:季)
  420. // 计算价格
  421. unitPrice := 0.0
  422. switch cycleUnit {
  423. case 1:
  424. unitPrice = orderMoney / cycle / 360
  425. case 2:
  426. unitPrice = orderMoney / cycle / 30
  427. case 3:
  428. unitPrice = orderMoney / cycle
  429. case 4:
  430. unitPrice = orderMoney / cycle / 90
  431. }
  432. dis := endTime.Sub(time.Now())
  433. days := dis.Hours() / 24 // 剩余天数
  434. //log.Println("=========", int(days), "=================")
  435. money := unitPrice * float64(int(days))
  436. return int(money)
  437. }