invoiceManager.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package service
  2. import (
  3. "context"
  4. "github.com/gogf/gf/v2/errors/gerror"
  5. "github.com/gogf/gf/v2/frame/g"
  6. "github.com/gogf/gf/v2/os/gcron"
  7. "time"
  8. )
  9. var (
  10. JyInvoiceManager *InvoiceManager
  11. )
  12. type InvoiceManager struct {
  13. Auth *TripartiteAuth
  14. jobRunning bool //开票是否运行中
  15. StopRunning bool //财务占用账号,需要暂停任务
  16. Login bool //登录状态
  17. RunPool chan bool //任务(每次只能进行一个开票任务)
  18. phoneCode chan string //短信验证码池
  19. ScanLogin chan bool //扫码登录
  20. }
  21. func init() {
  22. JyInvoiceManager = createInvoiceManager()
  23. job, err := gcron.Add(context.Background(), g.Cfg().MustGet(context.Background(), "invoiceJob.cron").String(), JyInvoiceManager.RunJob, "invoiceJob")
  24. if err != nil {
  25. panic(err)
  26. }
  27. job.Start()
  28. JyInvoiceManager.Auth.CallBackInit()
  29. //go JyInvoiceManager.RunOneJob(context.Background())//流程
  30. //go JyInvoiceManager.Demo(context.Background()) //开票
  31. //go JyInvoiceManager.Auth.Login() //登录
  32. //go JyInvoiceManager.RedDemo(context.Background())//红冲
  33. //err = JyInvoiceManager.Auth.AddTaxCode([]Billitem{{
  34. // Name: "技术服务费",
  35. // Ssflbm: "3040205000000000000",
  36. // Thirdid: "6f2e6a7a-18a7-4f21-b52e-a47437f817cc",
  37. //}})
  38. //if err != nil {
  39. // panic(err)
  40. //}
  41. //list, err := JyInvoiceManager.Auth.GetSuccessTaxCodeList()
  42. //g.Dump(list, err)
  43. }
  44. func createInvoiceManager() *InvoiceManager {
  45. return &InvoiceManager{
  46. Auth: createTripartite(),
  47. Login: true, //默认已经登录
  48. RunPool: make(chan bool, 1), //开票只能单线程跑
  49. phoneCode: make(chan string, 1), //手机验证码
  50. ScanLogin: make(chan bool, 1), //扫码登录通知
  51. }
  52. }
  53. func (im *InvoiceManager) MobileVerificationCode(code string) error {
  54. if code == "" {
  55. return gerror.New("验证码为空")
  56. }
  57. select {
  58. case <-time.After(time.Minute):
  59. return gerror.New("验证码接收超时")
  60. case im.phoneCode <- code:
  61. return nil
  62. }
  63. }
  64. func (im *InvoiceManager) MobileVerificationClear() error {
  65. select {
  66. case <-time.After(time.Minute):
  67. return gerror.New("清除验证码超时")
  68. case <-im.phoneCode:
  69. return nil
  70. }
  71. }
  72. // RunJob 开票定时任务
  73. func (im *InvoiceManager) RunJob(ctx context.Context) {
  74. if im.jobRunning || im.StopRunning {
  75. g.Log().Infof(ctx, "RunJob-程序本次任务中断 jobRunning:%v StopRunning:%v", im.jobRunning, im.StopRunning)
  76. return
  77. }
  78. im.jobRunning = true
  79. defer func() {
  80. im.jobRunning = false
  81. g.Log().Infof(ctx, "RunJob-开票任务完成")
  82. }()
  83. if g.Cfg().MustGet(ctx, "invoiceJob.stop", false).Bool() {
  84. g.Log().Infof(ctx, "RunJob-开票程序任务已暂停,开启请删除 config.json > invoiceJob.stop")
  85. return
  86. }
  87. if !im.Login {
  88. if err := im.Auth.Login(); err != nil {
  89. g.Log().Errorf(ctx, "模拟登录异常 %v", err)
  90. return
  91. } else {
  92. g.Log().Infof(ctx, "登录成功")
  93. }
  94. }
  95. //TODO 普通蓝票任务
  96. total, okNum, end, err := im.simpleMakeInvoice(ctx)
  97. if err != nil {
  98. g.Log().Errorf(ctx, "RunJob-开蓝票任务异常 %v", err)
  99. if end {
  100. return
  101. }
  102. }
  103. g.Log().Infof(ctx, "RunJob-开蓝票任务完成 共%d个 完成%d个", total, okNum)
  104. // TODO 蓝票自助开票(管理后台扫码开票)
  105. total, okNum, end, err = im.selfMakeInvoice(ctx)
  106. if err != nil {
  107. g.Log().Errorf(ctx, "RunJob-开自助蓝票任务异常 %v", err)
  108. if end {
  109. return
  110. }
  111. }
  112. g.Log().Infof(ctx, "RunJob-开自助蓝票任务完成 共%d个 完成%d个", total, okNum)
  113. // TODO 开红票
  114. total, okNum, end, err = im.makeRedInvoice(ctx)
  115. if err != nil {
  116. g.Log().Errorf(ctx, "RunJob-开红票任务异常 %v", err)
  117. if end {
  118. return
  119. }
  120. }
  121. g.Log().Infof(ctx, "RunJob-开红票任务完成 共%d个 完成%d个", total, okNum)
  122. }