invoiceCallback_red.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package service
  2. import (
  3. "ElectronicInvoice/internal/consts"
  4. "ElectronicInvoice/util"
  5. "context"
  6. "fmt"
  7. "github.com/gogf/gf/v2/database/gdb"
  8. "github.com/gogf/gf/v2/encoding/gjson"
  9. "github.com/gogf/gf/v2/errors/gerror"
  10. "github.com/gogf/gf/v2/frame/g"
  11. "github.com/gogf/gf/v2/net/ghttp"
  12. "github.com/gogf/gf/v2/util/gconv"
  13. "time"
  14. )
  15. // 红票信息
  16. type RedMsg struct {
  17. InvoiceCode string `json:"invoice_code"`
  18. InvoiceNumber string `json:"invoice_number"`
  19. Url string `json:"url"`
  20. SourceUrl string `json:"source_url"`
  21. InvoiceSerialNum string `json:"invoice_serialnum"`
  22. InvoiceStatus string `json:"invoice_status"`
  23. BillingTime int64 `json:"billing_time"`
  24. }
  25. // InvoicingMakeRedCallBackLogic 开票回调逻辑
  26. func InvoicingMakeRedCallBackLogic(r *ghttp.Request) error {
  27. tType := r.Get("type").Int()
  28. switch tType {
  29. case 0: //红冲成功
  30. err := g.DB().Transaction(r.Context(), func(ctx context.Context, tx gdb.TX) error {
  31. var (
  32. pdfBase64 = r.Get("pdf").String()
  33. num = r.Get("num").String() //蓝票号
  34. offsetNum = r.Get("offsetNum").String() //红票号
  35. kptime = r.Get("kptime").String()
  36. data = r.Get("data").Map()
  37. invoiceTime time.Time
  38. sourceUrl string //税务局发票链接
  39. fileUrl string //剑鱼文件地址
  40. redByte []byte
  41. err error
  42. )
  43. invoiceTime, err = time.ParseInLocation(consts.DateFormat_Full, kptime, time.Local)
  44. if err != nil {
  45. return gerror.Wrap(err, "时间格式化异常")
  46. }
  47. if pdfBase64 == "" || offsetNum == "" || num == "" || kptime == "" || len(data) == 0 {
  48. return gerror.New("缺少回调参数")
  49. }
  50. // 需求变更,数据库存储税务局发票地址
  51. if sourceUrl = gconv.String(data["jfUrl"]); sourceUrl == "" {
  52. return gerror.New("获取pdf交付地址异常")
  53. }
  54. fileUrl, err = util.SavePdfFile(r.Context(), fmt.Sprintf("RED_%s", num), pdfBase64)
  55. if err != nil {
  56. return gerror.Wrap(err, "InvoicingMakeRedCallBackLogic 保存红冲pdf文件失败")
  57. }
  58. //保存红票信息
  59. redByte, _ = gjson.Marshal(RedMsg{
  60. InvoiceNumber: offsetNum,
  61. Url: fileUrl,
  62. SourceUrl: sourceUrl,
  63. InvoiceSerialNum: fmt.Sprintf("RED_%s", num),
  64. InvoiceStatus: "1",
  65. BillingTime: invoiceTime.Unix(),
  66. })
  67. if num == "" {
  68. return gerror.Wrap(err, "InvoicingMakeRedCallBackLogic 蓝票号异常")
  69. }
  70. //g.Dump("RunRedBatchOnce-批量红冲", redByte)
  71. //return nil
  72. //旧蓝票状态修改已红冲
  73. res1, sqlErr1 := tx.Update("invoice", g.Map{
  74. "invoice_status": -2,
  75. "red": string(redByte),
  76. }, "invoice_changed = 0 AND invoice_number= ? ", num)
  77. if sqlErr1 != nil {
  78. return gerror.Wrapf(sqlErr1, "InvoicingMakeRedCallBackLogic 旧蓝票状态修改已红冲异常 sql(invoice_changed = 0 AND invoice_number= %s)", num)
  79. }
  80. //新蓝票状态改为可以开票
  81. res2, sqlErr2 := tx.Update("invoice", g.Map{
  82. "invoice_status": 2,
  83. }, "invoice_changed = 1 AND invoice_number= ? ", num)
  84. if sqlErr2 != nil {
  85. return gerror.Wrapf(sqlErr2, "InvoicingMakeRedCallBackLogic 新蓝票状态改为可以开票异常 sql(invoice_changed = 1 AND invoice_number= %s)", num)
  86. }
  87. // 蓝票数量=红冲数量
  88. num1, _ := res1.RowsAffected()
  89. num2, _ := res2.RowsAffected()
  90. if !(num1 == num2 && num1 >= 1) {
  91. return gerror.Newf("更新校验异常 蓝(旧%d) 蓝(新%d)", num1, num2)
  92. }
  93. return nil
  94. })
  95. if err != nil {
  96. return gerror.Wrap(err, "InvoicingMakeRedCallBackLogic 更新发票状态异常")
  97. }
  98. return nil
  99. case 1: //失败
  100. case 2: //授信额度等信息
  101. g.Log().Info(r.Context(), "授信额度等信息")
  102. case 3:
  103. g.Log().Info(r.Context(), "活体验证已过期,未完成活体验证")
  104. case 4:
  105. g.Log().Info(r.Context(), "活体成功")
  106. case 5:
  107. if err := util.SendQrImage2ChatBot(r.Get("img").String()); err != nil {
  108. return gerror.Wrap(err, "发送活体检测消息出错")
  109. }
  110. g.Log().Info(r.Context(), "红票需要活体认证,已发送二维码消息")
  111. case 9:
  112. g.Log().Info(r.Context(), "活体码未知错误")
  113. case 10:
  114. g.Log().Info(r.Context(), "非数电票试点纳税人,未核定数电票票种,不允许开票")
  115. case 11:
  116. g.Log().Info(r.Context(), "获取授信额度失败")
  117. default:
  118. g.Log().Info(r.Context(), "InvoicingMakeRedCallBackLogic tType:%s", tType)
  119. }
  120. return nil
  121. }