openPower.go 15 KB

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