فهرست منبع

wip:临时提交

wangkaiyue 1 سال پیش
والد
کامیت
1d6ecab267
1فایلهای تغییر یافته به همراه180 افزوده شده و 0 حذف شده
  1. 180 0
      internal/service/invoiceMake.go

+ 180 - 0
internal/service/invoiceMake.go

@@ -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
+}