Kaynağa Gözat

wip:管理后台开票红冲

wangkaiyue 1 yıl önce
ebeveyn
işleme
1ee0c3b119

+ 2 - 2
internal/service/invoiceCallback_red.go

@@ -18,7 +18,7 @@ type RedMsg struct {
 	InvoiceCode      string `json:"invoice_code"`
 	InvoiceNumber    string `json:"invoice_number"`
 	Url              string `json:"url"`
-	InvoiceSerialnum string `json:"invoice_serialnum"`
+	InvoiceSerialNum string `json:"invoice_serialnum"`
 	InvoiceStatus    string `json:"invoice_status"`
 	BillingTime      int64  `json:"billing_time"`
 }
@@ -54,7 +54,7 @@ func InvoicingMakeRedCallBackLogic(r *ghttp.Request) error {
 			redByte, _ = gjson.Marshal(RedMsg{
 				InvoiceNumber:    offsetNum,
 				Url:              path,
-				InvoiceSerialnum: fmt.Sprintf("RED_%s", num),
+				InvoiceSerialNum: fmt.Sprintf("RED_%s", num),
 				InvoiceStatus:    "1",
 				BillingTime:      invoiceTime.Unix(),
 			})

+ 51 - 11
internal/service/invoiceMake.go

@@ -91,15 +91,15 @@ func (im *InvoiceManager) simpleMakeInvoice(ctx context.Context) (total, okNum i
 	return
 }
 
-// selfMakeInvoice 联合开票(多个订单开一张发票)
-func (im *InvoiceManager) selfMakeInvoice(ctx context.Context) (total, okNum int, end bool, err error) {
+// multipleOrdersMakeInvoice 联合开票(多个订单开一张发票)
+func (im *InvoiceManager) multipleOrdersMakeInvoice(ctx context.Context) (total, okNum int, end bool, err error) {
 	var (
 		res gdb.Result
 	)
 	//(新开发票【a.invoice_status=0 AND a.invoice_changed=0】,红冲后新开【a.invoice_status=2 AND a.invoice_changed=1】)
 	res, err = g.DB().Query(ctx, "SELECT a.invoice_type,a.remark,a.invoice_variety,a.taxpayer_identnum,a.company_name,a.invoice_content,a.invoice_money FROM invoice a WHERE a.invoice_variety like '%电子%' AND ((a.invoice_status=0 AND a.invoice_changed=0) or (a.invoice_status=2 AND a.invoice_changed=1)) AND a.invoice_code like '%,%' AND a.create_time > ? GROUP BY invoice_order_code", consts.InvoiceStartTime.Unix())
 	if err != nil {
-		err = gerror.Wrap(err, "selfMakeInvoice-查询待开票异常")
+		err = gerror.Wrap(err, "multipleOrdersMakeInvoice-查询待开票异常")
 		return
 	}
 	total, okNum = res.Len(), 0
@@ -107,7 +107,7 @@ func (im *InvoiceManager) selfMakeInvoice(ctx context.Context) (total, okNum int
 		select {
 		case im.RunPool <- true:
 		case <-time.After(time.Minute * 5):
-			err = gerror.Wrap(consts.WaitTimeOut, "simpleMakeInvoice-开票等待超时")
+			err = gerror.Wrap(consts.WaitTimeOut, "multipleOrdersMakeInvoice-开票等待超时")
 			return
 		}
 		var (
@@ -146,11 +146,11 @@ func (im *InvoiceManager) selfMakeInvoice(ctx context.Context) (total, okNum int
 		if err != nil {
 			<-im.RunPool
 			if gerror.Is(err, consts.LoginOutErr) {
-				g.Log().Infof(ctx, "selfMakeInvoice-身份过期,需要重新登录")
+				g.Log().Infof(ctx, "multipleOrdersMakeInvoice-身份过期,需要重新登录")
 				end = true
 				return
 			}
-			g.Log().Errorf(ctx, "selfMakeInvoice-开票接口调用异常 %v", err)
+			g.Log().Errorf(ctx, "multipleOrdersMakeInvoice-开票接口调用异常 %v", err)
 			continue
 		}
 		okNum++
@@ -158,15 +158,15 @@ func (im *InvoiceManager) selfMakeInvoice(ctx context.Context) (total, okNum int
 	return
 }
 
-// makeRedInvoice 红冲
+// 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_variety like '%电子%' AND a.invoice_status=0 AND a.invoice_changed=1 AND a.invoice_order_code is NULL AND a.create_time > ? ", consts.InvoiceStartTime.Unix())
+	res, err = g.DB().Query(ctx, "SELECT invoice_number,billing_time FROM invoice a  WHERE a.invoice_variety like '%电子%' AND a.invoice_status=0 AND a.invoice_changed=1 AND (a.invoice_order_code is NULL OR a.invoice_code not like '%,%') AND a.create_time > ? ", consts.InvoiceStartTime.Unix())
 	if err != nil {
-		err = gerror.Wrap(err, "selfMakeChangeInvoice-查询待冲红订单异常")
+		err = gerror.Wrap(err, "makeRedInvoice-查询待冲红订单异常")
 		return
 	}
 	total, okNum = res.Len(), 0
@@ -174,7 +174,47 @@ func (im *InvoiceManager) makeRedInvoice(ctx context.Context) (total, okNum int,
 		select {
 		case im.RunPool <- true:
 		case <-time.After(time.Minute * 5):
-			err = gerror.Wrap(consts.WaitTimeOut, "simpleMakeInvoice-开票等待超时")
+			err = gerror.Wrap(consts.WaitTimeOut, "makeRedInvoice-开票等待超时")
+			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, "makeRedInvoice-身份过期,需要重新登录")
+				end = true
+				return
+			}
+		}
+		okNum++
+	}
+	return
+}
+
+// multipleOrdersMakeRedInvoice 联合开票红冲(多个订单开一张发票)
+func (im *InvoiceManager) multipleOrdersMakeRedInvoice(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_variety like '%电子%' AND a.invoice_status=0 AND a.invoice_changed=1 AND a.invoice_code like '%,%' AND a.create_time > ? GROUP BY invoice_order_code", consts.InvoiceStartTime.Unix())
+	if err != nil {
+		err = gerror.Wrap(err, "multipleOrdersMakeRedInvoice-查询待冲红订单异常")
+		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, "multipleOrdersMakeRedInvoice-开票等待超时")
 			return
 		}
 		var (
@@ -188,7 +228,7 @@ func (im *InvoiceManager) makeRedInvoice(ctx context.Context) (total, okNum int,
 		if err != nil {
 			<-im.RunPool
 			if gerror.Is(err, consts.LoginOutErr) {
-				g.Log().Infof(ctx, "selfMakeInvoice-身份过期,需要重新登录")
+				g.Log().Infof(ctx, "multipleOrdersMakeRedInvoice-身份过期,需要重新登录")
 				end = true
 				return
 			}

+ 20 - 10
internal/service/invoiceManager.go

@@ -104,33 +104,43 @@ func (im *InvoiceManager) RunJob(ctx context.Context) {
 		}
 	}
 
-	//TODO 普通蓝票任务
+	//TODO 普通蓝票任务(线上开票、管理后台一个订单开多张票)
 	total, okNum, end, err := im.simpleMakeInvoice(ctx)
 	if err != nil {
-		g.Log().Errorf(ctx, "RunJob-开蓝票任务异常 %v", err)
+		g.Log().Errorf(ctx, "RunJob-simpleMakeInvoice任务异常 %v", err)
 		if end {
 			return
 		}
 	}
-	g.Log().Infof(ctx, "RunJob-开蓝票任务完成 共%d个 完成%d个", total, okNum)
+	g.Log().Infof(ctx, "RunJob-simpleMakeInvoice任务完成 共%d个 完成%d个", total, okNum)
 
-	// TODO 蓝票自助开票(管理后台扫码开票)
-	total, okNum, end, err = im.selfMakeInvoice(ctx)
+	// TODO 多订单合并开票(管理后台-多订单合并开票)
+	total, okNum, end, err = im.multipleOrdersMakeInvoice(ctx)
 	if err != nil {
-		g.Log().Errorf(ctx, "RunJob-开自助蓝票任务异常 %v", err)
+		g.Log().Errorf(ctx, "RunJob-multipleOrdersMakeInvoice任务异常 %v", err)
 		if end {
 			return
 		}
 	}
-	g.Log().Infof(ctx, "RunJob-开自助蓝票任务完成 共%d个 完成%d个", total, okNum)
+	g.Log().Infof(ctx, "RunJob-multipleOrdersMakeInvoice任务完成 共%d个 完成%d个", total, okNum)
 
-	// TODO 红冲
+	// TODO 红冲(线上开票、管理后台一个订单开多张票)
 	total, okNum, end, err = im.makeRedInvoice(ctx)
 	if err != nil {
-		g.Log().Errorf(ctx, "RunJob-开红票任务异常 %v", err)
+		g.Log().Errorf(ctx, "RunJob-makeRedInvoice任务异常 %v", err)
 		if end {
 			return
 		}
 	}
-	g.Log().Infof(ctx, "RunJob-开红票任务完成 共%d个 完成%d个", total, okNum)
+	g.Log().Infof(ctx, "RunJob-makeRedInvoice任务完成 共%d个 完成%d个", total, okNum)
+
+	// TODO 红冲(线上开票、管理后台一个订单开多张票)
+	total, okNum, end, err = im.multipleOrdersMakeRedInvoice(ctx)
+	if err != nil {
+		g.Log().Errorf(ctx, "RunJob-multipleOrdersMakeRedInvoice任务异常 %v", err)
+		if end {
+			return
+		}
+	}
+	g.Log().Infof(ctx, "RunJob-multipleOrdersMakeRedInvoice任务完成 共%d个 完成%d个", total, okNum)
 }

+ 1 - 1
internal/service/tripartiteCommon.go

@@ -21,7 +21,7 @@ type (
 
 func createTripartite() *TripartiteAuth {
 	t := &TripartiteAuth{}
-	return t
+	//return t
 	_, err := t.GetToken(true)
 	if err != nil {
 		g.Log().Errorf(context.Background(), "刷新token异常%v", err)