main.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package main
  2. import (
  3. "ElectronicInvoice/util"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/gogf/gf/v2/frame/g"
  8. "github.com/gogf/gf/v2/net/ghttp"
  9. "github.com/gogf/gf/v2/util/gconv"
  10. "github.com/gogf/gf/v2/util/grand"
  11. "github.com/gogf/gf/v2/util/guid"
  12. "time"
  13. )
  14. type (
  15. // 开发票
  16. makeInvoiceAllParam struct {
  17. TaxNum string `json:"taxNum"` //企业税号*
  18. Tel string `json:"tel"` //登录电子税局手机号或身份证号*
  19. Data []MakeInvoiceData `json:"data"`
  20. }
  21. MakeInvoiceData struct {
  22. Type string `json:"type"` //票类* 1 增值税专用发票;2 普通发票
  23. Gmfmc string `json:"gmfmc"` //购买方名称* 人名
  24. Gmfnsrsbh string `json:"gmfnsrsbh"` //购买方纳税人识别号* 身份证号
  25. Id string `json:"id"` //发票流水号* 合作商开具的发票流水号,涉及到回调通知
  26. Gmfdz string `json:"gmfdz"` //购买方地址
  27. Lxdh string `json:"lxdh"` //购买方联系方式
  28. Yhyywdmc string `json:"yhyywdmc"` //购买方开户行
  29. Yhzh string `json:"yhzh"` //购买方银行账号
  30. Fhr string `json:"fhr"` //复核人
  31. Notes string `json:"notes"` //发票备注
  32. InvoiceArr []MakeInvoiceItems `json:"invoiceArr"`
  33. }
  34. MakeInvoiceItems struct {
  35. Xmmc string `json:"xmmc"` //项目名称*
  36. Je string `json:"je"` //开票金额*
  37. WhStatus int `json:"wh_status"` //该开票项是否已调用接口进行维护: 1 已维护;0 未维护
  38. Xhgg string `json:"xhgg"` //型号规格
  39. Dw string `json:"dw"` //单位
  40. Sl string `json:"sl"` //数量
  41. Tsaxrate string `json:"taxrate"` //税率
  42. }
  43. //红冲
  44. makeRedInvoiceAllParam struct {
  45. TaxNum string `json:"taxNum"` //企业税号*
  46. Tel string `json:"tel"` //登录电子税局手机号或身份证号*
  47. Data []MakeRedInvoiceData `json:"data"`
  48. }
  49. MakeRedInvoiceData struct {
  50. Num string `json:"num"` //蓝票号码
  51. Date string `json:"date"` //购买方名称* 人名
  52. }
  53. CommonRes struct {
  54. Code int `json:"code"`
  55. Msg string `json:"msg"`
  56. Data interface{} `json:"data"`
  57. }
  58. )
  59. func main() {
  60. s := g.Server()
  61. s.Group("/", func(group *ghttp.RouterGroup) {
  62. group.POST("/authority_token/getToken", getToken) //获取token
  63. group.Group("/index_index", func(group2 *ghttp.RouterGroup) {
  64. group2.POST("/makeInvoiceC", makeInvoiceC) //开票
  65. group2.POST("/makeRedC", makeRedC) //红票
  66. })
  67. })
  68. s.Run()
  69. }
  70. var (
  71. getToken = func(r *ghttp.Request) {
  72. resp := struct {
  73. Token string `json:"token"`
  74. ExpiresIn int `json:"expiresIn"` //一天有效期
  75. }{
  76. Token: "mockToken",
  77. ExpiresIn: 60 * 60 * 24,
  78. }
  79. r.Response.Write(resp)
  80. }
  81. makeInvoiceC = func(r *ghttp.Request) {
  82. var (
  83. ctx = r.Context()
  84. param = makeInvoiceAllParam{}
  85. )
  86. err := json.Unmarshal(r.GetBody(), &param)
  87. if err != nil {
  88. g.Log().Errorf(ctx, "开票任务-接收参数异常 err:%v", err)
  89. return
  90. }
  91. g.Log().Infof(ctx, "开票任务-接收到开票信息:%s", gconv.String(param))
  92. time.Sleep(time.Second * time.Duration(grand.Intn(3))) //模拟处理
  93. go func() {
  94. context, err := util.GetPdfBase64(fmt.Sprintf("./pdfDir/invoice_Blue_%s.pdf", param.Data[0].Type)) //pdf文件
  95. if err != nil {
  96. g.Log().Errorf(ctx, "读取pdf文件异常%v", err)
  97. return
  98. }
  99. callBackParam := g.Map{
  100. "calltype": "Invoicing",
  101. "pdf": context,
  102. "num": fmt.Sprintf("MOCKBLUE_%s", guid.S()),
  103. "id": param.Data[0].Id,
  104. "kptime": time.Now().Format("2006-01-02 15:04:05"),
  105. }
  106. //TODO 回调开票成功
  107. for {
  108. if checkCallBackOk(ctx, callBackParam) {
  109. g.Log().Infof(ctx, "开票任务-开票成功")
  110. break
  111. }
  112. time.Sleep(time.Second * 3)
  113. }
  114. //TODO 任务完成通知
  115. for {
  116. if checkCallBackOk(ctx, g.Map{"calltype": "quit", "data": g.Map{"taskType": "2"}}) {
  117. g.Log().Infof(ctx, "开票任务-通知完成")
  118. break
  119. }
  120. time.Sleep(time.Second * 3)
  121. }
  122. }()
  123. r.Response.WriteJson(CommonRes{
  124. Code: 200,
  125. Msg: "",
  126. })
  127. }
  128. makeRedC = func(r *ghttp.Request) {
  129. var (
  130. ctx = r.Context()
  131. param = makeRedInvoiceAllParam{}
  132. )
  133. err := json.Unmarshal(r.GetBody(), &param)
  134. if err != nil {
  135. g.Log().Errorf(ctx, "红冲任务-接收参数异常 err:%v", err)
  136. return
  137. }
  138. g.Log().Infof(ctx, "红冲任务-接收到红冲信息:%s", gconv.String(param))
  139. time.Sleep(time.Second * time.Duration(grand.Intn(3))) //模拟处理
  140. go func() {
  141. context, err := util.GetPdfBase64("./pdfDir/invoice_Red.pdf") //pdf文件
  142. if err != nil {
  143. g.Log().Errorf(ctx, "读取pdf文件异常%v", err)
  144. return
  145. }
  146. callBackParam := g.Map{
  147. "calltype": "offset",
  148. "pdf": context,
  149. "num": param.Data[0].Num,
  150. "offsetNum": fmt.Sprintf("MOCKRED_%s", guid.S()),
  151. "kptime": time.Now().Format("2006-01-02 15:04:05"),
  152. }
  153. //TODO 回调红冲成功
  154. for {
  155. if checkCallBackOk(ctx, callBackParam) {
  156. g.Log().Infof(ctx, "红冲任务-红冲成功")
  157. break
  158. }
  159. time.Sleep(time.Second * 3)
  160. }
  161. //TODO 任务完成通知
  162. for {
  163. if checkCallBackOk(ctx, g.Map{"calltype": "quit", "data": g.Map{"taskType": "9"}}) {
  164. g.Log().Infof(ctx, "红冲任务-通知完成")
  165. break
  166. }
  167. time.Sleep(time.Second * 3)
  168. }
  169. }()
  170. r.Response.WriteJson(CommonRes{
  171. Code: 200,
  172. Msg: "",
  173. })
  174. }
  175. )
  176. func checkCallBackOk(ctx context.Context, param map[string]interface{}) bool {
  177. res, err := g.Client().Header(g.MapStrStr{"Content-Type": "application/x-www-form-urlencoded"}).Post(ctx, g.Cfg().MustGet(ctx, "callBackAction").String(), param)
  178. if err != nil {
  179. g.Log().Errorf(ctx, "模拟请求异常 %v", err)
  180. return false
  181. }
  182. defer res.Close()
  183. rData := gconv.MapStrStr(res.ReadAll())
  184. if rData["code"] == "200" {
  185. return true
  186. }
  187. return false
  188. }