invoiceCallback_red.go 3.6 KB

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