invoiceCallback_red.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. //旧蓝票状态修改已红冲
  71. res1, sqlErr1 := tx.Update("invoice", g.Map{
  72. "invoice_status": -2,
  73. "red": string(redByte),
  74. }, "invoice_changed = 0 AND invoice_number= ? ", num)
  75. if sqlErr1 != nil {
  76. return gerror.Wrapf(sqlErr1, "InvoicingMakeRedCallBackLogic 旧蓝票状态修改已红冲异常 sql(invoice_changed = 0 AND invoice_number= %s)", num)
  77. }
  78. //新蓝票状态改为可以开票
  79. res2, sqlErr2 := tx.Update("invoice", g.Map{
  80. "invoice_status": 2,
  81. }, "invoice_changed = 1 AND invoice_number= ? ", num)
  82. if sqlErr2 != nil {
  83. return gerror.Wrapf(sqlErr2, "InvoicingMakeRedCallBackLogic 新蓝票状态改为可以开票异常 sql(invoice_changed = 1 AND invoice_number= %s)", num)
  84. }
  85. // 蓝票数量=红冲数量
  86. num1, _ := res1.RowsAffected()
  87. num2, _ := res2.RowsAffected()
  88. if !(num1 == num2 && num1 >= 1) {
  89. return gerror.Newf("更新校验异常 蓝(旧%d) 蓝(新%d)", num1, num2)
  90. }
  91. return nil
  92. })
  93. if err != nil {
  94. return gerror.Wrap(err, "InvoicingMakeRedCallBackLogic 更新发票状态异常")
  95. }
  96. return nil
  97. case 1: //失败
  98. case 2: //授信额度等信息
  99. g.Log().Info(r.Context(), "授信额度等信息")
  100. case 3:
  101. g.Log().Info(r.Context(), "活体验证已过期,未完成活体验证")
  102. case 4:
  103. g.Log().Info(r.Context(), "活体成功")
  104. case 5:
  105. if err := util.SendQrImage2ChatBot(r.Get("img").String()); err != nil {
  106. return gerror.Wrap(err, "发送活体检测消息出错")
  107. }
  108. g.Log().Info(r.Context(), "红票需要活体认证,已发送二维码消息")
  109. case 9:
  110. g.Log().Info(r.Context(), "活体码未知错误")
  111. case 10:
  112. g.Log().Info(r.Context(), "非数电票试点纳税人,未核定数电票票种,不允许开票")
  113. case 11:
  114. g.Log().Info(r.Context(), "获取授信额度失败")
  115. default:
  116. g.Log().Info(r.Context(), "InvoicingMakeRedCallBackLogic tType:%s", tType)
  117. }
  118. return nil
  119. }