wangkaiyue 1 год назад
Родитель
Сommit
bd4aa1240c

+ 3 - 3
config.yaml

@@ -48,15 +48,15 @@ callBack:
 
 # 开票任务
 invoiceJob:
-  stop: false # 是否停止任务(临时停止任务)
-  cron: "# */30 9-18 * * *"
+  stop: true # 是否停止任务(临时停止任务)
+  cron: "# */3 9-18 * * *"
 
 # 登录相关配置
 loginType: 1 # 税务系统登录方式【0 短信登录 1 扫码登录】
 qwxRobotUrl: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=e7792e7a-159d-4419-b1ed-27ea19b6ea54" #扫码登录企业微信消息机器人接口
 
 pdfFilePathRootDir: "./out"
-pdfFilePathPrefix: "jyInvoice" #即请求路径前缀
+pdfFilePathPrefix: "jyInvoice" #即请求路径前缀,需要nginx配置location指向生成的pdf文件
 pdfFilePathDomain: "https://jianyu360.cn"
 
 

BIN
docs/常在线-合作商平台系统接口设计说明_v4.2.docx


+ 0 - 4
go.mod

@@ -5,7 +5,6 @@ go 1.18
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20240422010359-27408422af30
 	github.com/gogf/gf/contrib/drivers/mysql/v2 v2.7.0
-	github.com/gogf/gf/contrib/nosql/redis/v2 v2.7.0
 	github.com/gogf/gf/v2 v2.7.0
 	github.com/satori/go.uuid v1.2.0
 	github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
@@ -13,9 +12,7 @@ require (
 
 require (
 	github.com/BurntSushi/toml v1.2.0 // indirect
-	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/clbanning/mxj/v2 v2.7.0 // indirect
-	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
 	github.com/fatih/color v1.15.0 // indirect
 	github.com/fsnotify/fsnotify v1.7.0 // indirect
 	github.com/go-logr/logr v1.2.4 // indirect
@@ -32,7 +29,6 @@ require (
 	github.com/mattn/go-runewidth v0.0.15 // indirect
 	github.com/olekukonko/tablewriter v0.0.5 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
-	github.com/redis/go-redis/v9 v9.2.1 // indirect
 	github.com/rivo/uniseg v0.4.4 // indirect
 	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
 	github.com/xdg-go/scram v1.0.2 // indirect

+ 0 - 10
go.sum

@@ -19,12 +19,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
-github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
-github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
-github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
 github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
@@ -41,8 +37,6 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
-github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
 github.com/donnie4w/go-logger v0.0.0-20170827050443-4740c51383f4/go.mod h1:L7S4x0R7vv3xoOhGuyAJyCO2MYzWOpccM4Isn8jIUgY=
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@@ -80,8 +74,6 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 github.com/gogf/gf/contrib/drivers/mysql/v2 v2.7.0 h1:5Igvtz4gy5UMvH+Ut4kLIpwSzggV9ZgDVBsIiOctH5E=
 github.com/gogf/gf/contrib/drivers/mysql/v2 v2.7.0/go.mod h1:0+flZ0clMKjtH1sTI7YD2KG4FPr8xz0L9h1WMd5M2Z8=
-github.com/gogf/gf/contrib/nosql/redis/v2 v2.7.0 h1:hJxshC0gZyFZaGo2HItXd5XMzIMbCRcgShr1ljMYwUc=
-github.com/gogf/gf/contrib/nosql/redis/v2 v2.7.0/go.mod h1:is3Q3ItZSPMZ1RBJ3xIcEasyGZnOg8eNeG9dubOx/zc=
 github.com/gogf/gf/v2 v2.7.0 h1:CjxhbMiE7oqf6K8ZtGuKt3dQEwK4vL6LhiI+dI7tJGU=
 github.com/gogf/gf/v2 v2.7.0/go.mod h1:Qu8nimKt9aupJQcdUL85tWF4Mfxocz97zUt8UC4abVI=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -201,8 +193,6 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
-github.com/redis/go-redis/v9 v9.2.1 h1:WlYJg71ODF0dVspZZCpYmoF1+U1Jjk9Rwd7pq6QmlCg=
-github.com/redis/go-redis/v9 v9.2.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
 github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=

+ 10 - 0
internal/controller/callback.go

@@ -34,6 +34,16 @@ func CallBack(r *ghttp.Request) {
 				flag = true
 			}
 			service.JyInvoiceManager.ScanLogin <- flag
+		case "quit":
+			switch r.Get("taskType").String() {
+			case "2": //电子发票开具
+				service.JyInvoiceManager.ReleasePool() //可进行下次开票请求
+			case "4": //活体认证
+			case "5": //验证电子税局登录授权
+			case "9": //红冲
+				service.JyInvoiceManager.ReleasePool() //可进行下次开票请求
+			}
+
 		default:
 			g.Log().Infof(r.Context(), "未设置消息回调:%s", callType)
 		}

+ 1 - 1
internal/controller/control.go

@@ -18,13 +18,13 @@ func Control(r *ghttp.Request) {
 				return service.JyInvoiceManager.MobileVerificationCode(code)
 			}
 		case "run": //控制程序暂停
-			g.Log().Infof(r.Context(), "runing")
 			switch r.Get("code").String() {
 			case "start":
 				service.JyInvoiceManager.StopRunning = false
 			case "stop":
 				service.JyInvoiceManager.StopRunning = true
 			}
+			g.Log().Infof(r.Context(), "change run status:%v", service.JyInvoiceManager.StopRunning)
 		default:
 			return gerror.New("未知操作")
 		}

+ 3 - 4
internal/service/invoiceCallback.go

@@ -14,8 +14,7 @@ import (
 
 // InvoicingCallBackLogic 开票回调逻辑
 func InvoicingCallBackLogic(r *ghttp.Request) error {
-	JyInvoiceManager.ReleasePool() //可进行下次开票请求
-	tType := r.Get("type").Int()   //type [0 需要活体检测;1 成功 返回base64]
+	tType := r.Get("type").Int() //type [0 需要活体检测;1 成功 返回base64]
 	switch tType {
 	case 0: //需要活体检测
 		//imgVal, err := url.QueryUnescape(r.Get("img").String())
@@ -42,7 +41,7 @@ func InvoicingCallBackLogic(r *ghttp.Request) error {
 			return gerror.New("缺少回调参数")
 		}
 
-		invoiceTime, err = time.ParseInLocation(kptime, time.DateTime, time.Local)
+		invoiceTime, err = time.ParseInLocation(time.DateTime, kptime, time.Local)
 		if err != nil {
 			return gerror.Wrap(err, "时间格式化异常")
 		}
@@ -85,7 +84,7 @@ func updateOrderInvoiceStatus(ctx context.Context, orderCode, invoiceNum string,
 		"url":            pdfPath,
 		"billing_time":   invoiceTime.Unix(),
 		"invoice_status": 1,
-	}, fmt.Sprintf("invoice_changed = 0 AND %s ", queryItem), orderCode)
+	}, fmt.Sprintf("invoice_changed = 0 AND %s = ? ", queryItem), orderCode)
 	if err != nil {
 		return gerror.Wrap(err, "更新发票状态异常")
 	}

+ 9 - 6
internal/service/invoiceManager.go

@@ -6,6 +6,7 @@ import (
 	"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/os/gcron"
 	"github.com/gogf/gf/v2/util/gconv"
 	"strconv"
 	"time"
@@ -28,10 +29,11 @@ type InvoiceManager struct {
 
 func init() {
 	JyInvoiceManager = createInvoiceManager()
-	//_, err := gcron.Add(context.Background(), "", JyInvoiceManager.RunJob, "invoiceJob")
-	//if err != nil {
-	//	panic(err)
-	//}
+	job, err := gcron.Add(context.Background(), g.Cfg().MustGet(context.Background(), "invoiceJob.cron").String(), JyInvoiceManager.RunJob, "invoiceJob")
+	if err != nil {
+		panic(err)
+	}
+	job.Start()
 	//go JyInvoiceManager.RunOneJob(context.Background())//流程
 	//go JyInvoiceManager.Demo(context.Background()) //开票
 	//go JyInvoiceManager.RedDemo(context.Background())//红冲
@@ -90,7 +92,7 @@ func (im *InvoiceManager) RunJob(ctx context.Context) {
 		return
 	}
 
-	if im.Login {
+	if !im.Login {
 		if err := im.Auth.Login(); err != nil {
 			g.Log().Errorf(ctx, "模拟登录异常 %v", err)
 			return
@@ -122,7 +124,7 @@ func (im *InvoiceManager) simpleMakeInvoice(ctx context.Context) (total, okNum i
 	)
 
 	//查询需要开票的数据
-	res, err = g.DB().Query(ctx, "SELECT * FROM invoice WHERE invoice_status=0 AND invoice_changed=0 AND  invoice_variety='普通发票(电子发票)' AND invoice_order_code is NULL  ")
+	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")
 	if err != nil {
 		g.Log().Errorf(ctx, "RunJob-simpleMakeInvoice-查询待开票异常 %s", err)
 		return -1, -1, gerror.Wrap(err, "simpleMakeInvoice-查询待开票异常")
@@ -130,6 +132,7 @@ func (im *InvoiceManager) simpleMakeInvoice(ctx context.Context) (total, okNum i
 	g.Log().Infof(ctx, "RunJob-simpleMakeInvoice-本次共加载%d条开票记录", res.Len())
 	total, okNum = res.Len(), 0
 	for _, m := range res.List() {
+
 		select {
 		case im.runPool <- true:
 		case <-time.After(time.Minute * 5):

+ 3 - 3
internal/service/sendMail.go

@@ -175,12 +175,12 @@ func SendInvoiceSuccessMail(ctx context.Context, orderCode string) error {
 		//自助开票
 		queryItem = "only_Identifying"
 	}
-	res, err := g.DB().GetOne(ctx, fmt.Sprintf("SELECT invoice_type,mail,taxpayer_identnum,company_name,phone,url FROM invoice WHEWE %s = ? ", queryItem), orderCode)
+	res, err := g.DB().GetOne(ctx, fmt.Sprintf("SELECT invoice_type,mail,taxpayer_identnum,company_name,phone,url FROM invoice WHERE %s = ? ", queryItem), orderCode)
 	if err != nil {
 		return gerror.Wrapf(err, "未查询到订单发票信息 %s:%s", queryItem, orderCode)
 	}
 
-	if err = res.Struct(record); err != nil {
+	if err = res.Struct(&record); err != nil {
 		return gerror.Wrapf(err, "格式化发票信息异常")
 	}
 
@@ -196,7 +196,7 @@ func (ir *invoiceRecord) GetMailHtmlContext() string {
 	case "单位":
 		return fmt.Sprintf(emailHtml_header+emailHtml_gs, ir.OrderCode, "电子普通发票", fmt.Sprintf("<a href=\"%s\" download class=\"download\">下载发票</a>", ir.Url), "电子普通发票", ir.CompanyName, ir.TaxpayerIdentnum, ir.Phone, ir.Mail)
 	case "个人":
-		return fmt.Sprintf(emailHtml_gr+emailHtml_gr, ir.OrderCode, "电子普通发票", fmt.Sprintf("<a href=\"%s\" download class=\"download\">下载发票</a>", ir.Url), "电子普通发票", ir.Phone, ir.Mail)
+		return fmt.Sprintf(emailHtml_header+emailHtml_gr, ir.OrderCode, "电子普通发票", fmt.Sprintf("<a href=\"%s\" download class=\"download\">下载发票</a>", ir.Url), "电子普通发票", ir.Phone, ir.Mail)
 	}
 	return ""
 }

+ 0 - 13
main.go

@@ -2,23 +2,10 @@ package main
 
 import (
 	"ElectronicInvoice/internal/cmd"
-	"context"
 	_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
-	_ "github.com/gogf/gf/contrib/nosql/redis/v2"
-	"github.com/gogf/gf/v2/os/gcron"
 	"github.com/gogf/gf/v2/os/gctx"
-	"time"
 )
 
 func main() {
-	go func() {
-		_, err := gcron.Add(context.Background(), "", func(ctx context.Context) {
-			time.Sleep(time.Second * 5)
-		}, "invoiceJob")
-		if err != nil {
-			panic(err)
-		}
-	}()
-
 	cmd.Main.Run(gctx.GetInitCtx())
 }