openPower.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841
  1. package main
  2. import (
  3. . "app.yhyue.com/moapp/jybase/common"
  4. "app.yhyue.com/moapp/jybase/date"
  5. "app.yhyue.com/moapp/jybase/encrypt"
  6. "app.yhyue.com/moapp/jybase/mongodb"
  7. ml "app.yhyue.com/moapp/jybase/mysql"
  8. "app.yhyue.com/moapp/jybase/redis"
  9. . "app.yhyue.com/moapp/jypkg/middleground"
  10. "bp.jydev.jianyu360.cn/BaseService/resourceCenter/rpc/pb"
  11. "bp.jydev.jianyu360.cn/BaseService/resourceCenter/rpc/resource"
  12. upb "bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
  13. "bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/usercenter"
  14. "context"
  15. "encoding/json"
  16. "flag"
  17. "fmt"
  18. "github.com/gogf/gf/v2/container/garray"
  19. "github.com/gogf/gf/v2/container/gvar"
  20. "github.com/gogf/gf/v2/frame/g"
  21. "github.com/gogf/gf/v2/os/gctx"
  22. "github.com/gogf/gf/v2/os/gtime"
  23. "github.com/gogf/gf/v2/util/gconv"
  24. "io/ioutil"
  25. "log"
  26. "regexp"
  27. "strings"
  28. "time"
  29. )
  30. const (
  31. appid = "10000"
  32. sessionId = "openPowerVirtualSessionId"
  33. )
  34. var (
  35. etcdAddress []string
  36. Mgo *mongodb.MongodbSim
  37. MgoLog *mongodb.MongodbSim
  38. MysqlMain *ml.Mysql
  39. goodsCode string
  40. goodsSpecId int64
  41. all map[string]string
  42. powerType string
  43. middleground *Middleground
  44. c *Config
  45. whether string
  46. )
  47. type Config struct {
  48. EtcdAddr []string
  49. Mongodb struct {
  50. Main *mgoConf
  51. Log *mgoConf
  52. }
  53. Mysql struct {
  54. Main *mysqlConf
  55. Base *mysqlConf
  56. }
  57. Products []int64
  58. Redis string
  59. Domain string
  60. }
  61. type mgoConf struct {
  62. Address string
  63. Size int
  64. DbName string
  65. ReplSet string
  66. UserName string
  67. Password string
  68. Collection string
  69. }
  70. type mysqlConf struct {
  71. DbName string
  72. Address string
  73. UserName string
  74. PassWord string
  75. MaxOpenConns int
  76. MaxIdleConns int
  77. }
  78. func init() {
  79. ReadConfig(&c)
  80. }
  81. func main() {
  82. MysqlMain = &ml.Mysql{
  83. Address: c.Mysql.Main.Address,
  84. UserName: c.Mysql.Main.UserName,
  85. PassWord: c.Mysql.Main.PassWord,
  86. DBName: c.Mysql.Main.DbName,
  87. MaxOpenConns: c.Mysql.Main.MaxOpenConns,
  88. MaxIdleConns: c.Mysql.Main.MaxIdleConns,
  89. }
  90. MysqlMain.Init()
  91. filterSpec := map[int64]bool{}
  92. for _, v := range c.Products {
  93. filterSpec[v] = true
  94. }
  95. allEntity := map[int64]Entity{}
  96. allEntity[-1] = &Yxy{}
  97. allT := "-1:医械通"
  98. for _, v := range *MysqlMain.SelectBySql(`select a.id,c.code,c.name,a.goods_code,a.name as spec_name from base_service.base_goods_spec a
  99. inner join base_service.base_goods_spec_power b on (a.id=b.spec_id)
  100. inner join base_service.base_function c on (b.function_code=c.code) order by a.id`) {
  101. id := Int64All(v["id"])
  102. if !filterSpec[id] {
  103. continue
  104. }
  105. name, _ := v["name"].(string)
  106. code, _ := v["code"].(string)
  107. if allEntity[id] == nil {
  108. spec_name, _ := v["spec_name"].(string)
  109. spec_name = strings.TrimPrefix(spec_name, "特殊非售卖商品_")
  110. if allT != "" {
  111. allT += " "
  112. }
  113. allT += fmt.Sprintf("%d:%s", id, spec_name)
  114. goods_code, _ := v["goods_code"].(string)
  115. allEntity[id] = &Common{
  116. Name: spec_name,
  117. GoodsCode: goods_code,
  118. GoodsSpecId: id,
  119. All: map[string]string{name: code},
  120. }
  121. } else {
  122. (allEntity[id].(*Common)).All[name] = code
  123. }
  124. }
  125. phone := flag.String("p", "", "手机号")
  126. m := flag.Int("m", 0, "1:查询权益 2:开通权益 3:取消权益")
  127. t := flag.Int64("t", 0, allT)
  128. dayCount := flag.Int("c", 0, "自定义设置需要开通权益的天数,包含今天")
  129. entName := flag.String("n", "", "企业名称")
  130. isCheck := flag.Int("b", 1, "是否前置校验和后置处理")
  131. powerWay := flag.Int("a", 0, "权益开通/取消方式;0:一个身份 1:全部身份 2:仅仅企业上")
  132. isCreateUser := flag.Bool("cu", false, "是否创建用户")
  133. inputOrderCode := flag.String("oc", "", "订单号")
  134. inputStartTime := flag.Int64("st", 0, "unix类型的开始时间")
  135. inputEndTime := flag.Int64("et", 0, "unix类型的结束时间")
  136. resetPower := flag.Bool("rp", false, "是否重新开通权益")
  137. flag.Parse()
  138. //*phone = "15037870753"
  139. //*t = 22
  140. //*entName = "王传进的测试企业99"
  141. //*isCreateUser = true
  142. //*inputOrderCode = "259519348822"
  143. //*inputStartTime = 1746028800
  144. //*inputEndTime = 1747584000
  145. //*m = 2
  146. //
  147. if *phone == "" {
  148. log.Fatalln("-p 参数无效")
  149. }
  150. if *inputOrderCode != "" {
  151. *isCreateUser = true
  152. if *inputStartTime == 0 {
  153. log.Fatalln("-st 参数无效")
  154. }
  155. if *inputEndTime == 0 {
  156. log.Fatalln("-et 参数无效")
  157. }
  158. }
  159. if *m != 2 {
  160. *isCreateUser = false
  161. }
  162. var inputStartTimeStr, inputEndTimeStr string
  163. if *inputStartTime > 0 {
  164. inputStartTimeStr = gtime.NewFromTimeStamp(*inputStartTime).String()
  165. if inputStartTimeStr == "" {
  166. log.Fatalln("-st 参数无效")
  167. }
  168. }
  169. if *inputEndTime > 0 {
  170. inputEndTimeStr = gtime.NewFromTimeStamp(*inputEndTime).String()
  171. if inputEndTimeStr == "" {
  172. log.Fatalln("-et 参数无效")
  173. }
  174. }
  175. entity := allEntity[*t]
  176. if entity == nil {
  177. log.Fatalln("-t 参数无效")
  178. }
  179. powerType, goodsCode, goodsSpecId, all = entity.init()
  180. middleground = NewMiddleground(c.EtcdAddr)
  181. middleground.RegResourceCenter("resource.rpc").RegUserCenter("usercenter.rpc")
  182. //
  183. redis.InitRedis(c.Redis)
  184. Mgo = &mongodb.MongodbSim{
  185. MongodbAddr: c.Mongodb.Main.Address,
  186. Size: c.Mongodb.Main.Size,
  187. DbName: c.Mongodb.Main.DbName,
  188. ReplSet: c.Mongodb.Main.ReplSet,
  189. UserName: c.Mongodb.Main.UserName,
  190. Password: c.Mongodb.Main.Password,
  191. }
  192. Mgo.InitPool()
  193. MgoLog = &mongodb.MongodbSim{
  194. MongodbAddr: c.Mongodb.Log.Address,
  195. Size: c.Mongodb.Log.Size,
  196. DbName: c.Mongodb.Log.DbName,
  197. ReplSet: c.Mongodb.Log.ReplSet,
  198. UserName: c.Mongodb.Log.UserName,
  199. Password: c.Mongodb.Log.Password,
  200. }
  201. MgoLog.InitPool()
  202. //
  203. createUserOk, ur, newUserId, newBaseUserId := createUser(*phone, *isCreateUser)
  204. if !createUserOk {
  205. return
  206. }
  207. //是否创建企业
  208. if *isCreateUser && *entName != "" {
  209. isInEnt := MysqlMain.CountBySql(`select count(1) as count from jianyu.entniche_info a inner join jianyu.entniche_user b on (a.name=? and b.phone=? and a.id=b.ent_id)`, *entName, *phone)
  210. if isInEnt == 0 {
  211. log.Println("该手机号是否是企业管理员(y/n)?")
  212. fmt.Scan(&whether)
  213. if whether == "y" {
  214. if createEntOk, _, _, _ := createEnt(newUserId, *phone, *entName, newBaseUserId); !createEntOk {
  215. return
  216. }
  217. } else {
  218. var entAdminPhone string
  219. log.Println("请输入管理员手机号")
  220. for {
  221. fmt.Scan(&entAdminPhone)
  222. entAdminPhone = strings.TrimSpace(entAdminPhone)
  223. if !regexp.MustCompile("^[0-9]+$").MatchString(entAdminPhone) {
  224. log.Println("手机号格式错误,请重新输入!")
  225. } else {
  226. break
  227. }
  228. }
  229. createUserOk, _, adminUserId, adminBaseUserId := createUser(entAdminPhone, *isCreateUser)
  230. if !createUserOk {
  231. return
  232. }
  233. createEntOk, newEntId, newDeptId, nweEntUserId := createEnt(adminUserId, entAdminPhone, *entName, adminBaseUserId)
  234. if !createEntOk {
  235. return
  236. }
  237. log.Println("该手机号未在企业下,是否添加为员工(y/n)?")
  238. fmt.Scan(&whether)
  239. if whether != "y" {
  240. return
  241. }
  242. addToEnt(newEntId, newDeptId, nweEntUserId, newUserId, *phone)
  243. }
  244. } else if isInEnt < 0 {
  245. log.Fatalln("查询手机号是否在企业下失败!")
  246. }
  247. }
  248. //
  249. isFindIdentity := false
  250. var updateOrderUserId string
  251. for _, v := range *ur {
  252. id := Int64All(v["base_user_id"])
  253. for _, identity := range middleground.UserCenter.IdentityList(id) {
  254. if *powerWay == 0 {
  255. if *entName == "" && identity.PositionType == 1 {
  256. continue
  257. } else if *entName != "" && (identity.PositionType == 0 || *entName != identity.Name) {
  258. continue
  259. }
  260. } else if *powerWay == 2 {
  261. if *entName == "" {
  262. continue
  263. } else if identity.PositionType == 0 || *entName != identity.Name {
  264. continue
  265. }
  266. }
  267. isFindIdentity = true
  268. msg := "身份信息:" + fmt.Sprintf("%+v", identity) + " 手机号:" + *phone
  269. var resClient = resource.NewResource(middleground.ResourceCenter.NewClient())
  270. var getPowers = func() *garray.StrArray {
  271. r, err := resClient.Haspowers(context.Background(), &pb.HaspowersReq{
  272. Appid: "10000",
  273. EntId: identity.EntId,
  274. EntUserId: identity.EntUserId,
  275. AccountId: identity.AccountId,
  276. EntAccountId: identity.EntAccountId,
  277. })
  278. if err != nil {
  279. log.Fatalln(msg, "查询", powerType, "权益失败!", err)
  280. }
  281. return garray.NewStrArrayFrom(r.Powers)
  282. }
  283. var notHavePowers = func() []string {
  284. array := []string{}
  285. powers := getPowers()
  286. for k, v := range all {
  287. if powers.Contains(v) {
  288. continue
  289. }
  290. array = append(array, k)
  291. }
  292. return array
  293. }
  294. if *m == 1 {
  295. if array := notHavePowers(); len(array) > 0 {
  296. log.Println(msg, powerType, "权益异常,缺少权益:", strings.Join(array, ","))
  297. } else {
  298. for k, _ := range all {
  299. log.Println(msg, "拥有", powerType, "权益:", k)
  300. }
  301. }
  302. } else if *m == 2 {
  303. if identity.PositionType == 1 {
  304. updateOrderUserId = gconv.String(identity.PositionId)
  305. } else {
  306. updateOrderUserId = newUserId
  307. }
  308. if *isCheck == 1 && !entity.beforeOpen(phone, identity) {
  309. return
  310. }
  311. startTime, endTime := "", ""
  312. if inputStartTimeStr != "" {
  313. startTime = inputStartTimeStr
  314. }
  315. if inputEndTimeStr != "" {
  316. endTime = inputEndTimeStr
  317. } else if *dayCount > 0 {
  318. now := time.Now()
  319. end_time := time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 0, time.Local)
  320. end_time = end_time.AddDate(0, 0, *dayCount-1)
  321. endTime = date.FormatDate(&end_time, date.Date_Full_Layout)
  322. }
  323. isEmpower := false
  324. if identity.EntId > 0 {
  325. resp, err := resClient.WaitEmpowerDetailBySpecId(context.Background(), &pb.WaitEmpowerDetailBySpecIdReq{
  326. Appid: "10000",
  327. EntId: identity.EntId,
  328. SpecId: goodsSpecId,
  329. })
  330. if err != nil {
  331. log.Println(msg, powerType, "开通失败!", err)
  332. } else if len(resp.WaitEmpowerDetails) > 0 {
  333. if *powerWay < 2 {
  334. isEmpower = true
  335. } else if *powerWay == 2 {
  336. log.Fatalln(msg, powerType, "权益已存在!")
  337. }
  338. }
  339. // for _, v := range all {
  340. // resp, err := resClient.WaitEmpowerDetail(context.Background(), &pb.WaitEmpowerDetailReq{
  341. // Appid: "10000",
  342. // EntId: identity.EntId,
  343. // FunctionCode: v,
  344. // })
  345. // log.Println(v, resp.Id)
  346. // if err != nil {
  347. // log.Println(msg, powerType, "开通失败!", err)
  348. // } else if resp.Id > 0 {
  349. // if *powerWay < 2 {
  350. // isEmpower = true
  351. // } else if *powerWay == 2 {
  352. // log.Fatalln(msg, powerType, "权益已存在!")
  353. // }
  354. // }
  355. // break
  356. // }
  357. }
  358. if len(notHavePowers()) == 0 && !*resetPower {
  359. log.Println(msg, powerType, "权益已存在,无需开通")
  360. continue
  361. }
  362. var r *pb.Resp
  363. var err error
  364. if isEmpower {
  365. for _, v := range all {
  366. r, err = resClient.Empower(context.Background(), &pb.EmpowerReq{
  367. Appid: "10000",
  368. FunctionCode: v,
  369. EntId: identity.EntId,
  370. EntUserId: []int64{identity.EntUserId},
  371. })
  372. }
  373. } else {
  374. powerReq := &pb.PowerReq{
  375. Appid: appid,
  376. GoodsCode: goodsCode,
  377. GoodsSpecId: goodsSpecId,
  378. BuyNum: 1,
  379. Type: 1,
  380. EndTime: endTime,
  381. StartTime: startTime,
  382. }
  383. if *powerWay == 2 {
  384. powerReq.EntAccountId = identity.EntAccountId
  385. powerReq.EntId = identity.EntId
  386. } else {
  387. powerReq.AccountId = identity.AccountId
  388. }
  389. r, err = resClient.PowerHandle(context.Background(), powerReq)
  390. }
  391. if err != nil {
  392. log.Println(msg, powerType, "开通失败!", err)
  393. } else if r.Status == 1 {
  394. if *isCheck == 1 {
  395. entity.afterOpen(phone, identity)
  396. }
  397. log.Println(msg, powerType, "已开通!")
  398. } else {
  399. log.Println(msg, powerType, "开通失败!")
  400. }
  401. } else if *m == 3 {
  402. powerReq := &pb.PowerReq{
  403. Appid: appid,
  404. GoodsCode: goodsCode,
  405. GoodsSpecId: goodsSpecId,
  406. BuyNum: 1,
  407. Type: -1,
  408. }
  409. if *powerWay == 2 {
  410. powerReq.EntAccountId = identity.EntAccountId
  411. powerReq.EntId = identity.EntId
  412. } else {
  413. powerReq.AccountId = identity.AccountId
  414. powerReq.EntAccountId = identity.EntAccountId
  415. powerReq.EntId = identity.EntId
  416. }
  417. r, err := resClient.PowerHandle(context.Background(), powerReq)
  418. if err != nil {
  419. log.Println(msg, powerType, "取消失败!", err)
  420. } else if r.Status == 1 {
  421. log.Println(msg, powerType, "已取消!")
  422. } else {
  423. log.Println(msg, powerType, "取消失败!", r.Status)
  424. }
  425. } else {
  426. log.Fatalln("-m 参数无效")
  427. }
  428. if *m == 2 || *m == 3 {
  429. _, err := usercenter.NewUserCenter(middleground.UserCenter.NewClient()).WorkDesktopClearUserInfo(context.Background(), &upb.WorkDesktopClearUserInfoReq{
  430. PositionId: fmt.Sprint(identity.PositionId),
  431. AppId: appid,
  432. })
  433. if err != nil {
  434. log.Println("清除用户工作桌面缓存失败", err)
  435. }
  436. }
  437. }
  438. }
  439. if !isFindIdentity {
  440. log.Fatalln("没有找到身份信息!")
  441. }
  442. if *inputOrderCode != "" && updateOrderUserId != "" {
  443. orderData := MysqlMain.SelectBySql(`select user_id,vip_starttime,vip_endtime from jianyu.dataexport_order where order_code=?`, inputOrderCode)
  444. if orderData == nil || len(*orderData) == 0 {
  445. log.Fatalln("没有找到该订单,更新订单失败!")
  446. } else if len(*orderData) > 1 {
  447. log.Fatalln("找到多个订单,需要手动处理!")
  448. }
  449. updateArgs := []interface{}{}
  450. odVar := gvar.New((*orderData)[0]).MapStrVar()
  451. updateFields := []string{}
  452. array := []string{}
  453. if odVar["user_id"].IsEmpty() {
  454. updateFields = append(updateFields, "用户id")
  455. array = append(array, "user_id=?")
  456. updateArgs = append(updateArgs, updateOrderUserId)
  457. } else {
  458. log.Println("订单表用户id存在,无需更新")
  459. }
  460. if odVar["vip_starttime"].IsEmpty() {
  461. updateFields = append(updateFields, "服务开始时间")
  462. array = append(array, "vip_starttime=?")
  463. updateArgs = append(updateArgs, inputStartTimeStr)
  464. } else {
  465. log.Println("订单表服务开始时间存在,无需更新")
  466. }
  467. if odVar["vip_endtime"].IsEmpty() {
  468. updateFields = append(updateFields, "服务截止时间")
  469. array = append(array, "vip_endtime=?")
  470. updateArgs = append(updateArgs, inputEndTimeStr)
  471. } else {
  472. log.Println("订单表服务截止时间存在,无需更新")
  473. }
  474. if len(array) > 0 {
  475. updateArgs = append(updateArgs, *inputOrderCode)
  476. if MysqlMain.UpdateOrDeleteBySql(`update jianyu.dataexport_order set `+strings.Join(array, ",")+` where order_code=?`, updateArgs...) < 0 {
  477. log.Fatalln("更新订单表" + strings.Join(updateFields, "、") + "失败!")
  478. } else {
  479. log.Fatalln("更新订单表" + strings.Join(updateFields, "、") + "成功!")
  480. }
  481. }
  482. }
  483. }
  484. type Entity interface {
  485. init() (string, string, int64, map[string]string)
  486. beforeOpen(phone *string, identity *upb.Identity) bool
  487. afterOpen(phone *string, identity *upb.Identity)
  488. }
  489. type Common struct {
  490. Name string
  491. GoodsCode string
  492. GoodsSpecId int64
  493. All map[string]string
  494. }
  495. func (c *Common) init() (string, string, int64, map[string]string) {
  496. return c.Name, c.GoodsCode, c.GoodsSpecId, c.All
  497. }
  498. func (c *Common) beforeOpen(phone *string, identity *upb.Identity) bool {
  499. return true
  500. }
  501. func (c *Common) afterOpen(phone *string, identity *upb.Identity) {
  502. }
  503. /******************************医械云******************************************/
  504. type Yxy struct {
  505. }
  506. func (y *Yxy) init() (string, string, int64, map[string]string) {
  507. return "医械云权益", "lyh", 13, map[string]string{
  508. "医疗标讯搜索": "lyh_yl_ylbxss",
  509. "医疗机构搜索": "lyh_yl_yljgss",
  510. "经销商搜索": "lyh_yl_jxsss",
  511. "医疗机构画像": "lyh_yl_yljghx",
  512. "医疗机构认领": "lyh_yl_yljgrl",
  513. "经销商认领": "lyh_yl_jxsrl",
  514. "医疗订阅": "lyh_yl_yldy",
  515. }
  516. }
  517. func (y *Yxy) beforeOpen(phone *string, identity *upb.Identity) bool {
  518. order_user_id, u := y.getUser(identity)
  519. if u == nil {
  520. return false
  521. }
  522. ok, _, _, _ := y.isOK(*phone, *u, order_user_id)
  523. return ok
  524. }
  525. func (y *Yxy) getUser(identity *upb.Identity) (string, *map[string]interface{}) {
  526. if identity.PositionType == 0 {
  527. 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}`)
  528. if u == nil || len(*u) == 0 {
  529. log.Println(fmt.Sprintf("%+v", identity), "mongodb user 中没有找到该用户!")
  530. return "", nil
  531. }
  532. return mongodb.BsonIdToSId((*u)["_id"]), u
  533. } else {
  534. 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}`)
  535. if u == nil || len(*u) == 0 {
  536. log.Println(fmt.Sprintf("%+v", identity), "mongodb ent_user 中没有找到该用户!")
  537. return "", nil
  538. }
  539. return fmt.Sprint(identity.PositionId), u
  540. }
  541. }
  542. func (y *Yxy) afterOpen(phone *string, identity *upb.Identity) {
  543. order_user_id, u := y.getUser(identity)
  544. if u == nil {
  545. return
  546. }
  547. ok, orderVip, vipRs, bigRs := y.isOK(*phone, *u, order_user_id)
  548. if ok {
  549. y.createYxtOrder(*phone, *u, orderVip, vipRs, bigRs)
  550. }
  551. }
  552. func (y *Yxy) isOK(phone string, user map[string]interface{}, order_user_id string) (bool, bool, *[]map[string]interface{}, *[]map[string]interface{}) {
  553. orderVip := true // 是否根据超级订阅订单处理 如果是大会员也是超级订阅则按大会员处理
  554. flag1 := false
  555. flag2 := false
  556. mainUserId := order_user_id
  557. if IntAllDef(user["i_member_sub_status"], -1) == 1 {
  558. mainUser, ok := Mgo.FindById("user", ObjToString(user["s_member_mainid"]), `{"s_phone"1:,"s_m_phone":1}`)
  559. if ok && mainUser != nil {
  560. mainUserId = mongodb.BsonIdToSId((*mainUser)["_id"])
  561. } else {
  562. log.Println("该用户是子账号,没有找到其主账号的信息")
  563. return false, false, nil, nil
  564. }
  565. }
  566. bigMemberRs := MysqlMain.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)
  567. if bigMemberRs != nil && len(*bigMemberRs) == 1 {
  568. (*bigMemberRs)[0]["user_phone"] = phone
  569. (*bigMemberRs)[0]["user_id"] = order_user_id
  570. }
  571. vipRs := MysqlMain.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)
  572. if (bigMemberRs == nil || len(*bigMemberRs) == 0) && (vipRs == nil || len(*vipRs) == 0) {
  573. log.Println("没有查询到该用户的年度超级订阅或者大会员订单")
  574. return false, false, nil, nil
  575. }
  576. // 同时存在超级订阅和大会员年度订单 不再判断最晚到期时间 大会员优先
  577. if vipRs != nil && len(*vipRs) == 1 {
  578. vipEndTime := Int64All(user["l_vip_endtime"])
  579. leftdayvip := time.Unix(vipEndTime, 0).Sub(time.Now()).Hours() / 24
  580. if leftdayvip >= 90 {
  581. orderVip = true
  582. flag1 = true
  583. }
  584. }
  585. if *bigMemberRs != nil && len(*bigMemberRs) == 1 {
  586. // 判断最晚到期时间
  587. bigMemberEndTime := IntAll(user["i_member_endtime"])
  588. leftdaybig := time.Unix(int64(bigMemberEndTime), 0).Sub(time.Now()).Hours() / 24
  589. if leftdaybig >= 90 {
  590. orderVip = false
  591. flag2 = true
  592. }
  593. }
  594. if !flag1 && !flag2 {
  595. log.Println("该用户剩余不符合条件")
  596. return false, false, nil, nil
  597. }
  598. return true, orderVip, vipRs, bigMemberRs
  599. }
  600. // 生成医械通订单
  601. func (y *Yxy) createYxtOrder(phone string, user map[string]interface{}, orderVip bool, vipRs, bigMemberRs *[]map[string]interface{}) {
  602. var insertOrder map[string]interface{}
  603. filterMap := map[string]interface{}{}
  604. // 超级订阅
  605. if orderVip {
  606. insertOrder = (*vipRs)[0]
  607. // 生订单信息
  608. orderMoney := Float64All(insertOrder["order_money"])
  609. endTime := Int64All(user["l_vip_endtime"])
  610. var money int
  611. filterData := (*vipRs)[0]["filter"]
  612. err := json.Unmarshal([]byte(filterData.(string)), &filterMap)
  613. if err != nil {
  614. log.Println("反序列化失败", err)
  615. return
  616. }
  617. if IntAll(insertOrder["is_backstage_order"]) == 1 {
  618. cycle := Float64All(filterMap["cyclecount"])
  619. cycleUnit := Float64All(filterMap["cycleunit"])
  620. money = y.getPriceBack(orderMoney, time.Unix(endTime, 0), cycle, cycleUnit)
  621. } else {
  622. money = y.getPrice(orderMoney, time.Unix(endTime, 0))
  623. }
  624. insertOrder["order_money"] = money
  625. insertOrder["original_price"] = money
  626. insertOrder["vip_endtime"] = time.Unix(endTime, 0).Format(date.Date_Full_Layout)
  627. } else {
  628. // 大会员
  629. endTime := Int64All(user["i_member_endtime"])
  630. filterData := (*bigMemberRs)[0]["filter"]
  631. err := json.Unmarshal([]byte(filterData.(string)), &filterMap)
  632. if err != nil {
  633. log.Println("反序列化失败", err)
  634. return
  635. }
  636. filterMap["area"] = "-"
  637. insertOrder = (*bigMemberRs)[0]
  638. insertOrder["order_money"] = 0
  639. insertOrder["original_price"] = 0
  640. insertOrder["vip_endtime"] = time.Unix(endTime, 0).Format(date.Date_Full_Layout)
  641. }
  642. filterMap["source"] = "qmx" // 后台订单
  643. // 生订单信息
  644. filter, _ := json.Marshal(filterMap)
  645. insertOrder["filter"] = string(filter)
  646. insertOrder["is_backstage_order"] = 1 // 后台创建
  647. insertOrder["product_type"] = "医械通"
  648. insertOrder["order_code"] = fmt.Sprintf("%s%s", time.Now().Format("150405"), GetRandom(6))
  649. insertOrder["prepay_id"] = ""
  650. insertOrder["pay_money"] = 0
  651. insertOrder["discount_price"] = 0
  652. insertOrder["pay_way"] = ""
  653. insertOrder["out_trade_no"] = ""
  654. insertOrder["create_time"] = date.NowFormat(date.Date_Full_Layout)
  655. insertOrder["vip_starttime"] = date.NowFormat(date.Date_Full_Layout)
  656. insertOrder["pay_time"] = insertOrder["vip_starttime"]
  657. insertOrder["prepay_time"] = insertOrder["vip_starttime"]
  658. delete(insertOrder, "id")
  659. saveRs := MysqlMain.Insert("dataexport_order", insertOrder)
  660. if saveRs > 0 {
  661. log.Println("医械通订单保存成功")
  662. } else {
  663. log.Println("医械通订单保存失败", saveRs)
  664. }
  665. }
  666. // 计算价格 线上的
  667. func (y *Yxy) getPrice(orderMoney float64, endTime time.Time) int {
  668. // 计算价格
  669. dis := endTime.Sub(time.Now())
  670. days := dis.Hours() / 24 // 剩余天数
  671. money := int(orderMoney / 360 * float64(int(days)))
  672. return money
  673. }
  674. // 计算价格 管理后台创建的
  675. func (y *Yxy) getPriceBack(orderMoney float64, endTime time.Time, cycle, cycleUnit float64) int {
  676. //(1:年 2:月 3:天 4:季)
  677. // 计算价格
  678. unitPrice := 0.0
  679. switch cycleUnit {
  680. case 1:
  681. unitPrice = orderMoney / cycle / 360
  682. case 2:
  683. unitPrice = orderMoney / cycle / 30
  684. case 3:
  685. unitPrice = orderMoney / cycle
  686. case 4:
  687. unitPrice = orderMoney / cycle / 90
  688. }
  689. dis := endTime.Sub(time.Now())
  690. days := dis.Hours() / 24 // 剩余天数
  691. //log.Println("=========", int(days), "=================")
  692. money := unitPrice * float64(int(days))
  693. return int(money)
  694. }
  695. func createUser(phone string, isCreateUser bool) (bool, *[]map[string]interface{}, string, int64) {
  696. ur, userOk := Mgo.Find("user", map[string]interface{}{
  697. "$or": []map[string]interface{}{
  698. map[string]interface{}{
  699. "s_phone": phone,
  700. },
  701. map[string]interface{}{
  702. "s_m_phone": phone,
  703. },
  704. },
  705. "i_appid": 2,
  706. }, nil, `{"_id":1,"base_user_id":1}`, false, -1, -1)
  707. var newBaseUserId int64
  708. var newUserId string
  709. if !userOk {
  710. log.Fatalln("mgo user 查询失败")
  711. } else if ur == nil || len(*ur) <= 0 {
  712. if isCreateUser {
  713. log.Println("没有找到该用户!是否创建(y/n)?")
  714. fmt.Scan(&whether)
  715. if whether != "y" {
  716. return false, nil, "", 0
  717. }
  718. } else {
  719. log.Fatalln("没有找到该用户!")
  720. }
  721. resp := middleground.UserCenter.UserAdd(upb.UserAddReq{Appid: appid, Phone: phone})
  722. if resp == nil || resp.Data.Status != 1 {
  723. log.Fatalln("创建用户失败")
  724. }
  725. newBaseUserId = resp.Data.Id
  726. newUserId = Mgo.Save("user", map[string]interface{}{
  727. "i_appid": 2,
  728. "s_phone": phone,
  729. "base_user_id": resp.Data.Id,
  730. "l_registedate": time.Now().Unix(),
  731. "s_regsource": "openpower",
  732. })
  733. MgoLog.Save("user", map[string]interface{}{
  734. "userid": newUserId,
  735. "phone": phone,
  736. "way": "phone",
  737. "system": "pc",
  738. "source": "openpower",
  739. "create_time": date.NowFormat(date.Date_Full_Layout),
  740. })
  741. *ur = append(*ur, map[string]interface{}{
  742. "_id": mongodb.StringTOBsonId(newUserId),
  743. "base_user_id": newBaseUserId,
  744. })
  745. } else {
  746. newUserId = mongodb.BsonIdToSId((*ur)[0]["_id"])
  747. newBaseUserId = gconv.Int64((*ur)[0]["base_user_id"])
  748. }
  749. return true, ur, newUserId, newBaseUserId
  750. }
  751. func createEnt(mgoUserId, phone, entName string, baseUserId int64) (bool, int64, int64, int64) {
  752. entDept := MysqlMain.SelectBySql(`select a.id as eid,b.id as did,c.id as uid from jianyu.entniche_info a inner join entniche_department b on (a.id=b.ent_id and b.pid=0) inner join entniche_user c on (a.id=c.ent_id and c.phone=?) where a.phone=? and a.name=?`, phone, phone, entName)
  753. if entDept == nil {
  754. log.Fatalln("查询企业是否存在失败!")
  755. } else if len(*entDept) > 0 {
  756. return true, gconv.Int64((*entDept)[0]["eid"]), gconv.Int64((*entDept)[0]["did"]), gconv.Int64((*entDept)[0]["uid"])
  757. }
  758. log.Println("没有找到该企业!是否创建(y/n)?")
  759. fmt.Scan(&whether)
  760. if whether != "y" {
  761. return false, 0, 0, 0
  762. }
  763. //创建企业
  764. redis.Put("session", sessionId, map[string]interface{}{
  765. "userId": mgoUserId,
  766. "mgoUserId": mgoUserId,
  767. "base_user_id": baseUserId,
  768. }, 60)
  769. resp, err := g.Client().SetCookie("SESSIONID", sessionId).Post(gctx.New(), c.Domain+"/entbase/ent/add", g.Map{
  770. "switch": true,
  771. "name": entName,
  772. })
  773. if err != nil {
  774. log.Fatalln(err)
  775. }
  776. defer resp.Body.Close()
  777. b, _ := ioutil.ReadAll(resp.Body)
  778. eId := gvar.New(b).MapStrVar()["data"].MapStrVar()["entid"].String()
  779. if eId == "" {
  780. log.Fatalln("创建企业失败", string(b))
  781. }
  782. entId := gconv.Int64(encrypt.SE.Decode4HexByCheck(eId))
  783. if entId <= 0 {
  784. log.Fatalln("创建企业失败", string(b))
  785. }
  786. resp1, err1 := g.Client().SetCookie("SESSIONID", sessionId).Post(gctx.New(), c.Domain+"/entbase/ent/entinfo")
  787. if err1 != nil {
  788. log.Fatalln(err)
  789. }
  790. defer resp1.Body.Close()
  791. b1, _ := ioutil.ReadAll(resp1.Body)
  792. deptId := gvar.New(b1).MapStrVar()["data"].MapStrVar()["dept_id"].Int64()
  793. entUserId := gconv.Int64(encrypt.SE.Decode4HexByCheck(gvar.New(b1).MapStrVar()["data"].MapStrVar()["user_id"].String()))
  794. if deptId <= 0 {
  795. log.Fatalln("创建企业后,获取部门id失败", string(b1))
  796. }
  797. return true, entId, deptId, entUserId
  798. }
  799. func addToEnt(entId, deptId, entUserId int64, userId, phone string) {
  800. redis.Put("session", sessionId, map[string]interface{}{
  801. "entId": entId,
  802. "entUserId": entUserId,
  803. "frameworkEntId": entId,
  804. "userId": userId,
  805. }, 60)
  806. resp, err := g.Client().SetCookie("SESSIONID", sessionId).Post(gctx.New(), c.Domain+"/entbase/person/add", g.Map{
  807. "id": deptId,
  808. "name": phone,
  809. "phone": phone,
  810. })
  811. if err != nil {
  812. log.Fatalln(err)
  813. }
  814. defer resp.Body.Close()
  815. b, _ := ioutil.ReadAll(resp.Body)
  816. if gvar.New(b).MapStrVar()["data"].MapStrVar()["status"].Int() != 1 {
  817. log.Fatalln("人员添加到企业下失败", string(b))
  818. }
  819. }