|
@@ -0,0 +1,180 @@
|
|
|
|
+package service
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "ElectronicInvoice/internal/consts"
|
|
|
|
+ "context"
|
|
|
|
+ "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/util/gconv"
|
|
|
|
+ "strconv"
|
|
|
|
+ "time"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+// simpleMakeInvoice 简单开票
|
|
|
|
+func (im *InvoiceManager) simpleMakeInvoice(ctx context.Context) (total, okNum int, end bool, err error) {
|
|
|
|
+ var (
|
|
|
|
+ res gdb.Result
|
|
|
|
+ )
|
|
|
|
+ //查询需要开票的数据
|
|
|
|
+ res, err = g.DB().Query(ctx, "SELECT a.*,b.pay_way,b.order_money,b.pay_money FROM invoice a INNER JOIN dataexport_order b ON a.order_code=b.order_code WHERE a.invoice_status=0 AND a.invoice_changed=0 AND a.invoice_variety='普通发票(电子发票)' AND a.invoice_order_code is NULL AND a.create_time > ? ", consts.InvoiceStartTime.Unix())
|
|
|
|
+ if err != nil {
|
|
|
|
+ err = gerror.Wrap(err, "simpleMakeInvoice-查询待开票异常")
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ total, okNum = res.Len(), 0
|
|
|
|
+ for _, m := range res.List() {
|
|
|
|
+ select {
|
|
|
|
+ case im.RunPool <- true:
|
|
|
|
+ case <-time.After(time.Minute * 5):
|
|
|
|
+ err = gerror.Wrap(consts.WaitTimeOut, "simpleMakeInvoice-开票等待超时")
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ var (
|
|
|
|
+ orderCode = gconv.String(m["order_code"])
|
|
|
|
+ iType = gconv.String(m["invoice_type"])
|
|
|
|
+ remark = gconv.String(m["remark"])
|
|
|
|
+ prices float64
|
|
|
|
+ )
|
|
|
|
+
|
|
|
|
+ //公对公转账 账单金额可以修改 开发票应取实付金额 pay_money
|
|
|
|
+ //微信支付宝支付 pay_money为订单金额减去微信or支付包红包
|
|
|
|
+ if gconv.String(m["pay_way"]) == "transferAccounts" {
|
|
|
|
+ prices = gconv.Float64(m["pay_money"]) / float64(100)
|
|
|
|
+ } else {
|
|
|
|
+ prices = gconv.Float64(m["order_money"]) / float64(100)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ c := MakeInvoiceData{
|
|
|
|
+ Type: "2",
|
|
|
|
+ Id: orderCode,
|
|
|
|
+ Notes: remark,
|
|
|
|
+ Fhr: g.Cfg().MustGet(ctx, "company.hfr", "贺鹏飞").String(),
|
|
|
|
+ InvoiceArr: []MakeInvoiceItems{{
|
|
|
|
+ Xmmc: g.Cfg().MustGet(ctx, "company.taxCode").String(), //开票项
|
|
|
|
+ WhStatus: 1, //开票项是否维护
|
|
|
|
+ Je: strconv.FormatFloat(prices, 'f', -1, 64), //金额
|
|
|
|
+ Sl: "1", //数量
|
|
|
|
+ }},
|
|
|
|
+ }
|
|
|
|
+ if iType == "单位" {
|
|
|
|
+ c.Gmfmc = gconv.String(m["company_name"])
|
|
|
|
+ c.Gmfnsrsbh = gconv.String(m["taxpayer_identnum"])
|
|
|
|
+ } else {
|
|
|
|
+ c.Gmfmc = iType
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ err = im.Auth.MakeSingleInvoice(c)
|
|
|
|
+ if err != nil {
|
|
|
|
+ <-im.RunPool
|
|
|
|
+ if gerror.Is(err, consts.LoginOutErr) {
|
|
|
|
+ end = true
|
|
|
|
+ g.Log().Infof(ctx, "simpleMakeInvoice-身份过期,需要重新登录")
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ g.Log().Errorf(ctx, "simpleMakeInvoice-开票接口调用异常 %v", err)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ okNum++
|
|
|
|
+ }
|
|
|
|
+ return
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// selfMakeInvoice 自助开票
|
|
|
|
+func (im *InvoiceManager) selfMakeInvoice(ctx context.Context) (total, okNum int, end bool, err error) {
|
|
|
|
+ var (
|
|
|
|
+ res gdb.Result
|
|
|
|
+ )
|
|
|
|
+ res, err = g.DB().Query(ctx, "SELECT a.invoice_money,a.only_Identifying,a.invoice_type,a.company_name,a.taxpayer_identnum,a.remark FROM invoice a WHERE a.invoice_status=0 AND a.invoice_changed=0 AND a.invoice_variety='电子普通发票' AND a.invoice_order_code is not NULL AND a.create_time > ? GROUP BY invoice_order_code", consts.InvoiceStartTime.Unix())
|
|
|
|
+ if err != nil {
|
|
|
|
+ err = gerror.Wrap(err, "selfMakeInvoice-查询待开票异常")
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ total, okNum = res.Len(), 0
|
|
|
|
+ for _, m := range res.List() {
|
|
|
|
+ select {
|
|
|
|
+ case im.RunPool <- true:
|
|
|
|
+ case <-time.After(time.Minute * 5):
|
|
|
|
+ err = gerror.Wrap(consts.WaitTimeOut, "simpleMakeInvoice-开票等待超时")
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ var (
|
|
|
|
+ orderCode = gconv.String(m["only_Identifying"])
|
|
|
|
+ iType = gconv.String(m["invoice_type"])
|
|
|
|
+ prices = gconv.Float64(m["invoice_money"]) / float64(100)
|
|
|
|
+ remark = gconv.String(m["remark"])
|
|
|
|
+ )
|
|
|
|
+ c := MakeInvoiceData{
|
|
|
|
+ Type: "2",
|
|
|
|
+ Id: orderCode,
|
|
|
|
+ Notes: remark,
|
|
|
|
+ Fhr: g.Cfg().MustGet(ctx, "company.hfr", "贺鹏飞").String(),
|
|
|
|
+ InvoiceArr: []MakeInvoiceItems{{
|
|
|
|
+ Xmmc: g.Cfg().MustGet(ctx, "company.taxCode").String(), //开票项
|
|
|
|
+ WhStatus: 1, //开票项是否维护
|
|
|
|
+ Je: strconv.FormatFloat(prices, 'f', -1, 64), //金额
|
|
|
|
+ Sl: "1", //数量
|
|
|
|
+ }},
|
|
|
|
+ }
|
|
|
|
+ if iType == "单位" {
|
|
|
|
+ c.Gmfmc = gconv.String(m["company_name"])
|
|
|
|
+ c.Gmfnsrsbh = gconv.String(m["taxpayer_identnum"])
|
|
|
|
+ } else {
|
|
|
|
+ c.Gmfmc = iType
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ err = im.Auth.MakeSingleInvoice(c)
|
|
|
|
+ if err != nil {
|
|
|
|
+ <-im.RunPool
|
|
|
|
+ if gerror.Is(err, consts.LoginOutErr) {
|
|
|
|
+ g.Log().Infof(ctx, "selfMakeInvoice-身份过期,需要重新登录")
|
|
|
|
+ end = true
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ g.Log().Errorf(ctx, "selfMakeInvoice-开票接口调用异常 %v", err)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ okNum++
|
|
|
|
+ }
|
|
|
|
+ return
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// makeRedInvoice 红冲
|
|
|
|
+func (im *InvoiceManager) makeRedInvoice(ctx context.Context) (total, okNum int, end bool, err error) {
|
|
|
|
+ var (
|
|
|
|
+ res gdb.Result
|
|
|
|
+ )
|
|
|
|
+ //冲红任务
|
|
|
|
+ res, err = g.DB().Query(ctx, "SELECT invoice_number,billing_time FROM invoice a WHERE a.invoice_status=0 AND a.invoice_changed=1 AND a.invoice_variety='普通发票(电子发票)' AND a.invoice_order_code is NULL AND a.create_time > ? ", consts.InvoiceStartTime.Unix())
|
|
|
|
+ if err != nil {
|
|
|
|
+ err = gerror.Wrap(err, "selfMakeChangeInvoice-查询待冲红订单异常")
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ total, okNum = res.Len(), 0
|
|
|
|
+ for _, m := range res.List() {
|
|
|
|
+ select {
|
|
|
|
+ case im.RunPool <- true:
|
|
|
|
+ case <-time.After(time.Minute * 5):
|
|
|
|
+ err = gerror.Wrap(consts.WaitTimeOut, "simpleMakeInvoice-开票等待超时")
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ var (
|
|
|
|
+ invoiceNumber = gconv.String(m["invoice_number"])
|
|
|
|
+ invoiceDate = time.Unix(gconv.Int64(m["billing_time"]), 0)
|
|
|
|
+ )
|
|
|
|
+ err = im.Auth.MakeSingleRedInvoice(MakeRedInvoiceData{
|
|
|
|
+ Num: invoiceNumber,
|
|
|
|
+ Date: invoiceDate.Format(consts.DateFormat_Short),
|
|
|
|
+ })
|
|
|
|
+ if err != nil {
|
|
|
|
+ <-im.RunPool
|
|
|
|
+ if gerror.Is(err, consts.LoginOutErr) {
|
|
|
|
+ g.Log().Infof(ctx, "selfMakeInvoice-身份过期,需要重新登录")
|
|
|
|
+ end = true
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ okNum++
|
|
|
|
+ }
|
|
|
|
+ return
|
|
|
|
+}
|