openPower.go 31 KB

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