invoiceCallback_blue.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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/errors/gerror"
  9. "github.com/gogf/gf/v2/frame/g"
  10. "github.com/gogf/gf/v2/net/ghttp"
  11. "github.com/gogf/gf/v2/util/gconv"
  12. "strings"
  13. "time"
  14. )
  15. // InvoicingCallBackLogic 开票回调逻辑
  16. func InvoicingCallBackLogic(r *ghttp.Request) error {
  17. tType := r.Get("type").Int() //type [0 需要活体检测;1 成功 返回base64]
  18. switch tType {
  19. case 0: //需要活体检测
  20. if err := util.SendQrImage2ChatBot(r.Get("img").String()); err != nil {
  21. return gerror.Wrap(err, "发送活体检测消息出错")
  22. }
  23. g.Log().Info(r.Context(), "蓝票需要活体认证,已发送二维码消息")
  24. case 1: //开票成功
  25. var (
  26. pdfBase64 = r.Get("pdf").String()
  27. callBackId = r.Get("id").String()
  28. num = r.Get("num").String()
  29. kptime = r.Get("kptime").String()
  30. data = r.Get("data").Map()
  31. invoiceTime time.Time
  32. path string
  33. err error
  34. )
  35. if pdfBase64 == "" || callBackId == "" || num == "" || kptime == "" || len(data) == 0 {
  36. return gerror.New("缺少回调参数")
  37. }
  38. // 需求变更,数据库存储税务局发票地址
  39. if path = gconv.String(data["jfUrl"]); path == "" {
  40. return gerror.New("获取pdf交付地址异常")
  41. }
  42. invoiceTime, err = time.ParseInLocation(consts.DateFormat_Full, kptime, time.Local)
  43. if err != nil {
  44. return gerror.Wrap(err, "时间格式化异常")
  45. }
  46. //path, err = util.SavePdfFile(r.Context(), num, pdfBase64)
  47. //if err != nil {
  48. // return gerror.Wrap(err, "保存pdf文件失败")
  49. //}
  50. //g.Log().Infof(r.Context(), "pdf保存成功 sign:%s filePath:%s ", callBackId, path)
  51. return updateOrderInvoiceStatus(r.Context(), callBackId, num, invoiceTime, path)
  52. case 3:
  53. g.Log().Info(r.Context(), "活体验证已过期,未完成活体验证")
  54. case 4:
  55. g.Log().Info(r.Context(), "系统错误")
  56. case 6:
  57. g.Log().Info(r.Context(), "税率不存在")
  58. case 7:
  59. g.Log().Info(r.Context(), "非数电票试点纳税人,未核定数电票票种,不允许开票或其他原因")
  60. default:
  61. g.Log().Infof(r.Context(), "InvoicingCallBackLogic tType:%d", tType)
  62. }
  63. return nil
  64. }
  65. // updateOrderInvoiceStatus 开票成功进行数据库操作
  66. // orderCode 订单编号
  67. // invoiceNum 发票号码
  68. // createData 开票时间
  69. // pdfPath 下载地址
  70. func updateOrderInvoiceStatus(ctx context.Context, callBackId, invoiceNum string, invoiceTime time.Time, pdfPath string) error {
  71. var (
  72. queryItem = "order_code"
  73. queryValue = ""
  74. err error
  75. )
  76. queryItem, queryValue, err = GetQueryObj(callBackId)
  77. if err != nil {
  78. return err
  79. }
  80. err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
  81. if queryItem == "" || queryValue == "" {
  82. return gerror.Wrap(err, "updateOrderInvoiceStatus 回调字段异常")
  83. }
  84. //invoice_status: 0新开 2红冲后新开
  85. record, sqlErr := tx.GetOne(fmt.Sprintf("SELECT only_Identifying,invoice_changed FROM invoice WHERE %s =? AND invoice_status in(0,2) ORDER BY id desc", queryItem), queryValue)
  86. if err != nil {
  87. return gerror.Wrap(sqlErr, "查询订单异常")
  88. }
  89. if len(record) == 0 {
  90. return gerror.Newf("未查询到订单%s", callBackId)
  91. }
  92. var (
  93. invoiceChanged = gconv.Int(record["invoice_changed"]) == 1 //换票
  94. onlyId = gconv.String(record["only_Identifying"])
  95. isBackInvoice = strings.HasPrefix(onlyId, "xx") //是否是管理后台的开票
  96. )
  97. //更新发票内容
  98. _, err = tx.Update("invoice", g.Map{
  99. "invoice_number": invoiceNum,
  100. "url": pdfPath,
  101. "billing_time": invoiceTime.Unix(),
  102. "invoice_status": 1,
  103. }, fmt.Sprintf(" %s = ? AND invoice_status in(0,2) ", queryItem), queryValue)
  104. if err != nil {
  105. return gerror.Wrap(err, "更新发票状态异常")
  106. }
  107. // 管理后台非换票的开票,需要更新订单是否全部开票完成
  108. if !invoiceChanged && isBackInvoice {
  109. if sqlErr = selfInvoicing(tx, onlyId); err != nil {
  110. return gerror.Wrap(sqlErr, "更新订单是否全部开票完成异常")
  111. }
  112. }
  113. return nil
  114. })
  115. if err != nil {
  116. return gerror.Wrap(err, "订单回调更新异常")
  117. }
  118. if err = SendInvoiceSuccessMail(ctx, callBackId); err != nil {
  119. g.Log().Errorf(ctx, "%s 发送邮件失败 err: %v ", callBackId, err)
  120. }
  121. return nil
  122. }
  123. // selfInvoicing 自助开票
  124. func selfInvoicing(tx gdb.TX, identifyingValue string) error {
  125. //自助开票
  126. res, err := tx.GetOne("SELECT GROUP_CONCAT(order_code) as order_code from invoice where only_Identifying=?", identifyingValue)
  127. if err != nil {
  128. return gerror.New("自助开票异常")
  129. }
  130. orderArr := strings.Split(gconv.String(res["order_code"]), ",")
  131. for _, v := range orderArr {
  132. if v == "" {
  133. continue
  134. }
  135. ok, err := invoiceStatusHandle(tx, v)
  136. if err != nil {
  137. return gerror.Wrap(err, "回款计算异常")
  138. }
  139. updateData := map[string]interface{}{}
  140. if ok {
  141. updateData["applybill_status"] = 2
  142. } else {
  143. updateData["applybill_status"] = 3
  144. }
  145. _, err = tx.Update("dataexport_order", updateData, " order_code=? ", v)
  146. if err != nil {
  147. return gerror.Wrapf(err, "自助开票更新订单异常 orderCode:%v %v", v, err)
  148. }
  149. }
  150. return nil
  151. }
  152. // InvoiceStatusHandle 判断是全额还是部分回款
  153. // copy from auth :王浩
  154. func invoiceStatusHandle(tx gdb.TX, orderCode string) (bool, error) {
  155. orderData, err := tx.GetOne("SELECT pay_money FROM dataexport_order WHERE order_code=?", orderCode)
  156. if err != nil {
  157. return false, gerror.Wrap(err, "查询订单价格异常")
  158. }
  159. if orderData.IsEmpty() {
  160. return false, gerror.Wrap(err, "未查询到订单数据")
  161. }
  162. invoiceData, err := tx.GetOne("select sum(invoice_order_money) as money from invoice where order_code=? and invoice_status>=0 ", orderCode)
  163. if err != nil {
  164. return false, gerror.Wrap(err, "价格计算异常")
  165. }
  166. if invoiceData.IsEmpty() {
  167. return false, gerror.Wrap(err, "未查询到发票数据")
  168. }
  169. if gconv.Int64(invoiceData["money"]) == gconv.Int64(orderData["pay_money"]) {
  170. return true, nil
  171. }
  172. return false, nil
  173. }