123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- package main
- import (
- "ElectronicInvoice/util"
- "context"
- "encoding/json"
- "fmt"
- "github.com/gogf/gf/v2/frame/g"
- "github.com/gogf/gf/v2/net/ghttp"
- "github.com/gogf/gf/v2/util/gconv"
- "github.com/gogf/gf/v2/util/grand"
- "github.com/gogf/gf/v2/util/guid"
- "time"
- )
- type (
- // 开发票
- makeInvoiceAllParam struct {
- TaxNum string `json:"taxNum"` //企业税号*
- Tel string `json:"tel"` //登录电子税局手机号或身份证号*
- Data []MakeInvoiceData `json:"data"`
- }
- MakeInvoiceData struct {
- Type string `json:"type"` //票类* 1 增值税专用发票;2 普通发票
- Gmfmc string `json:"gmfmc"` //购买方名称* 人名
- Gmfnsrsbh string `json:"gmfnsrsbh"` //购买方纳税人识别号* 身份证号
- Id string `json:"id"` //发票流水号* 合作商开具的发票流水号,涉及到回调通知
- Gmfdz string `json:"gmfdz"` //购买方地址
- Lxdh string `json:"lxdh"` //购买方联系方式
- Yhyywdmc string `json:"yhyywdmc"` //购买方开户行
- Yhzh string `json:"yhzh"` //购买方银行账号
- Fhr string `json:"fhr"` //复核人
- Notes string `json:"notes"` //发票备注
- InvoiceArr []MakeInvoiceItems `json:"invoiceArr"`
- }
- MakeInvoiceItems struct {
- Xmmc string `json:"xmmc"` //项目名称*
- Je string `json:"je"` //开票金额*
- WhStatus int `json:"wh_status"` //该开票项是否已调用接口进行维护: 1 已维护;0 未维护
- Xhgg string `json:"xhgg"` //型号规格
- Dw string `json:"dw"` //单位
- Sl string `json:"sl"` //数量
- Tsaxrate string `json:"taxrate"` //税率
- }
- //红冲
- makeRedInvoiceAllParam struct {
- TaxNum string `json:"taxNum"` //企业税号*
- Tel string `json:"tel"` //登录电子税局手机号或身份证号*
- Data []MakeRedInvoiceData `json:"data"`
- }
- MakeRedInvoiceData struct {
- Num string `json:"num"` //蓝票号码
- Date string `json:"date"` //购买方名称* 人名
- }
- CommonRes struct {
- Code int `json:"code"`
- Msg string `json:"msg"`
- Data interface{} `json:"data"`
- }
- )
- func main() {
- s := g.Server()
- s.Group("/", func(group *ghttp.RouterGroup) {
- group.POST("/authority_token/getToken", getToken) //获取token
- group.Group("/index_index", func(group2 *ghttp.RouterGroup) {
- group2.POST("/makeInvoiceC", makeInvoiceC) //开票
- group2.POST("/makeRedC", makeRedC) //红票
- })
- })
- s.Run()
- }
- var (
- getToken = func(r *ghttp.Request) {
- resp := struct {
- Token string `json:"token"`
- ExpiresIn int `json:"expiresIn"` //一天有效期
- }{
- Token: "mockToken",
- ExpiresIn: 60 * 60 * 24,
- }
- r.Response.Write(resp)
- }
- makeInvoiceC = func(r *ghttp.Request) {
- var (
- ctx = r.Context()
- param = makeInvoiceAllParam{}
- )
- err := json.Unmarshal(r.GetBody(), ¶m)
- if err != nil {
- g.Log().Errorf(ctx, "开票任务-接收参数异常 err:%v", err)
- return
- }
- g.Log().Infof(ctx, "开票任务-接收到开票信息:%s", gconv.String(param))
- time.Sleep(time.Second * time.Duration(grand.Intn(3))) //模拟处理
- go func() {
- callBackParam := g.Map{
- "calltype": "Invoicing",
- "pdf": util.GetPdfBase64(fmt.Sprintf("./pdfDir/invoice_Blue_%s.pdf", param.Data[0].Type)), //pdf文件
- "num": fmt.Sprintf("MOCKBLUE_%s", guid.S()),
- "id": param.Data[0].Id,
- "kptime": time.Now().Format("2006-01-02 15:04:05"),
- }
- //TODO 回调开票成功
- for {
- if checkCallBackOk(ctx, callBackParam) {
- g.Log().Infof(ctx, "开票任务-开票成功")
- break
- }
- time.Sleep(time.Second * 3)
- }
- //TODO 任务完成通知
- for {
- if checkCallBackOk(ctx, g.Map{"calltype": "quit", "data": g.Map{"taskType": "2"}}) {
- g.Log().Infof(ctx, "开票任务-通知完成")
- break
- }
- time.Sleep(time.Second * 3)
- }
- }()
- r.Response.WriteJson(CommonRes{
- Code: 200,
- Msg: "",
- })
- }
- makeRedC = func(r *ghttp.Request) {
- var (
- ctx = r.Context()
- param = makeRedInvoiceAllParam{}
- )
- err := json.Unmarshal(r.GetBody(), ¶m)
- if err != nil {
- g.Log().Errorf(ctx, "红冲任务-接收参数异常 err:%v", err)
- return
- }
- g.Log().Infof(ctx, "红冲任务-接收到红冲信息:%s", gconv.String(param))
- time.Sleep(time.Second * time.Duration(grand.Intn(3))) //模拟处理
- go func() {
- callBackParam := g.Map{
- "calltype": "offset",
- "pdf": util.GetPdfBase64("./pdfDir/invoice_Red.pdf"), //pdf文件
- "num": param.Data[0].Num,
- "offsetNum": fmt.Sprintf("MOCKRED_%s", guid.S()),
- "kptime": time.Now().Format("2006-01-02 15:04:05"),
- }
- //TODO 回调红冲成功
- for {
- if checkCallBackOk(ctx, callBackParam) {
- g.Log().Infof(ctx, "红冲任务-红冲成功")
- break
- }
- time.Sleep(time.Second * 3)
- }
- //TODO 任务完成通知
- for {
- if checkCallBackOk(ctx, g.Map{"calltype": "quit", "data": g.Map{"taskType": "9"}}) {
- g.Log().Infof(ctx, "红冲任务-通知完成")
- break
- }
- time.Sleep(time.Second * 3)
- }
- }()
- r.Response.WriteJson(CommonRes{
- Code: 200,
- Msg: "",
- })
- }
- )
- func checkCallBackOk(ctx context.Context, param map[string]interface{}) bool {
- res, err := g.Client().Header(g.MapStrStr{"Content-Type": "application/x-www-form-urlencoded"}).Post(ctx, g.Cfg().MustGet(ctx, "callBackAction").String(), param)
- if err != nil {
- g.Log().Errorf(ctx, "模拟请求异常 %v", err)
- return false
- }
- defer res.Close()
- rData := gconv.MapStrStr(res.ReadAll())
- if rData["code"] == "200" {
- return true
- }
- return false
- }
|