invoiceCallback_red.go 4.1 KB

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