package service import ( "ElectronicInvoice/internal/consts" "ElectronicInvoice/util" "context" "fmt" "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/util/gconv" "strings" "time" ) // InvoicingCallBackLogic 开票回调逻辑 func InvoicingCallBackLogic(r *ghttp.Request) error { tType := r.Get("type").Int() //type [0 需要活体检测;1 成功 返回base64] switch tType { case 0: //需要活体检测 if err := util.SendQrImage2ChatBot(r.Get("img").String()); err != nil { return gerror.Wrap(err, "发送活体检测消息出错") } g.Log().Info(r.Context(), "蓝票需要活体认证,已发送二维码消息") case 1: //开票成功 var ( pdfBase64 = r.Get("pdf").String() callBackId = r.Get("id").String() num = r.Get("num").String() kptime = r.Get("kptime").String() invoiceTime time.Time err error path string ) if pdfBase64 == "" || callBackId == "" || num == "" || kptime == "" { return gerror.New("缺少回调参数") } invoiceTime, err = time.ParseInLocation(consts.DateFormat_Full, kptime, time.Local) if err != nil { return gerror.Wrap(err, "时间格式化异常") } path, err = util.SavePdfFile(r.Context(), num, pdfBase64) if err != nil { return gerror.Wrap(err, "保存pdf文件失败") } g.Log().Infof(r.Context(), "pdf保存成功 sign:%s filePath:%s ", callBackId, path) return updateOrderInvoiceStatus(r.Context(), callBackId, num, invoiceTime, path) case 3: g.Log().Info(r.Context(), "活体验证已过期,未完成活体验证") case 4: g.Log().Info(r.Context(), "系统错误") case 6: g.Log().Info(r.Context(), "税率不存在") case 7: g.Log().Info(r.Context(), "非数电票试点纳税人,未核定数电票票种,不允许开票或其他原因") default: g.Log().Infof(r.Context(), "InvoicingCallBackLogic tType:%d", tType) } return nil } // updateOrderInvoiceStatus 开票成功进行数据库操作 // orderCode 订单编号 // invoiceNum 发票号码 // createData 开票时间 // pdfPath 下载地址 func updateOrderInvoiceStatus(ctx context.Context, callBackId, invoiceNum string, invoiceTime time.Time, pdfPath string) error { var ( queryItem = "order_code" queryValue = "" err error ) queryItem, queryValue, err = GetQueryObj(callBackId) if err != nil { return err } err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { record, sqlErr := tx.GetOne(fmt.Sprintf("SELECT only_Identifying,invoice_changed FROM invoice WHERE %s =? ORDER BY id desc", queryItem), queryValue) if err != nil { return gerror.Wrap(sqlErr, "查询订单异常") } if len(record) == 0 { return gerror.Newf("未查询到订单%s", callBackId) } var ( invoiceChanged = gconv.Int(record["only_Identifying"]) == 1 //换票 isBackInvoice = strings.HasPrefix(gconv.String(record["only_Identifying"]), "xx") //是否是管理后台的开票 ) //更新发票内容 _, err = tx.Update("invoice", g.Map{ "invoice_number": invoiceNum, "url": pdfPath, "billing_time": invoiceTime.Unix(), "invoice_status": 1, }, fmt.Sprintf(" %s = ? ", queryItem), queryValue) if err != nil { return gerror.Wrap(err, "更新发票状态异常") } // 管理后台非换票的开票,需要更新订单是否全部开票完成 if !invoiceChanged && isBackInvoice { if sqlErr = selfInvoicing(tx, queryValue); err != nil { return gerror.Wrap(sqlErr, "更新订单是否全部开票完成异常") } } return nil }) if err != nil { return gerror.Wrap(err, "订单回调更新异常") } if err = SendInvoiceSuccessMail(ctx, callBackId); err != nil { g.Log().Errorf(ctx, "%s 发送邮件失败 err: %v ", callBackId, err) } return nil } // selfInvoicing 自助开票 func selfInvoicing(tx gdb.TX, identifyingValue string) error { //自助开票 res, err := tx.GetOne("SELECT GROUP_CONCAT(order_code) as order_code from invoice where only_Identifying=?", identifyingValue) if err != nil { return gerror.New("自助开票异常") } orderArr := strings.Split(gconv.String(res["order_code"]), ",") for _, v := range orderArr { if v == "" { continue } ok, err := invoiceStatusHandle(tx, v) if err != nil { return gerror.Wrap(err, "回款计算异常") } updateData := map[string]interface{}{} if ok { updateData["applybill_status"] = 2 } else { updateData["applybill_status"] = 3 } _, err = tx.Update("dataexport_order", updateData, " order_code=? ", v) if err != nil { return gerror.Wrapf(err, "自助开票更新订单异常 orderCode:%v %v", v, err) } } return nil } // InvoiceStatusHandle 判断是全额还是部分回款 // copy from auth :王浩 func invoiceStatusHandle(tx gdb.TX, orderCode string) (bool, error) { orderData, err := tx.GetOne("SELECT pay_money FROM dataexport_order WHERE order_code=?", orderCode) if err != nil { return false, gerror.Wrap(err, "查询订单价格异常") } if orderData.IsEmpty() { return false, gerror.Wrap(err, "未查询到订单数据") } invoiceData, err := tx.GetOne("select sum(invoice_order_money) as money from invoice where order_code=? and invoice_status>=0 ", orderCode) if err != nil { return false, gerror.Wrap(err, "价格计算异常") } if invoiceData.IsEmpty() { return false, gerror.Wrap(err, "未查询到发票数据") } if gconv.Int64(invoiceData["money"]) == gconv.Int64(orderData["pay_money"]) { return true, nil } return false, nil }