package service import ( "bytes" "encoding/json" "entity" "fmt" "github.com/robfig/cron" "io/ioutil" "math/rand" "net/http" "spirit/redis" "spirit/web/core" "strconv" "strings" "time" "util" ) type InvoiceService struct{} var ( invoiceService = InvoiceService{} ) // 发票开具 func (u *InvoiceService) InvoiceAdd(solgan *entity.Invoice, resType string, isLoop int, isRed string) (string, int, interface{}) { util.Loger.Println("流水号:", solgan.Swno) rand.Seed(time.Now().Unix()) solgan.InvoMemo = solgan.Swno solgan.OrderCode = solgan.Swno if isLoop == 0 { solgan.Swno = strings.Replace(fmt.Sprintln(solgan.Swno+fmt.Sprintf("%06v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000000))), "\n", "", -1) } solgan.SaleTax = entity.SaleTax solgan.InvType = entity.InvType solgan.BillType = entity.BillType solgan.Kpy = entity.Kpr solgan.SpecialRedFlag = entity.SpecialRedFlag solgan.OperationCode = entity.OperationCode solgan.Verified = entity.Verified solgan.Fhr = entity.Fhr solgan.Sky = entity.Sky now := time.Now() solgan.BillDate = now.Format("2006-01-02 15:04:05") /*url := entity.Url + "?build_invoice" util.Loger.Println("流水号:", solgan.Swno, "开具发票:数据", solgan) bytesData, _ := json.Marshal(solgan) reader := bytes.NewReader(bytesData) request, _ := http.NewRequest("POST", url, reader) request.Header.Set("Content-Type", "application/json;charset=UTF-8") client := http.Client{} resp, err := client.Do(request)*/ //不成功时 var err error err = nil //正常 //if (err != nil) { if (err == nil) { util.Loger.Println("开票服有问题", err) if isLoop == 0 { arr := strings.Split(entity.WarningEmail, ",") for _, value := range arr { util.SendPdf(value, true, solgan.Swno, "发票开具时服务出现问题") } solgan.ResType = resType solgan.IsRed = isRed u.OpeningTimer(solgan) } data1 := make(map[string]interface{}) data1["fpdm"] = "" data1["fphm"] = "" data1["swno"] = solgan.Swno data1["path"] = "" return "剑鱼标讯订开票服务预警", 3, data1 } /*respBytes, err := ioutil.ReadAll(resp.Body) fmt.Sprint(err) data := make(map[string]interface{}) if err := json.Unmarshal([]byte(respBytes), &data); err == nil { fmt.Println(solgan.Swno, "开票返回值:", data) }*/ //开具成功 data := make(map[string]interface{}) data["returnCode"] = "0000" //开具失败 //data["returnCode"]="100" util.Loger.Println("流水号:", solgan.Swno, "开具发票:结果", data) //开票正常时 //data["returnCode"] = entity.LineUpCode if (data["returnCode"] == entity.LineUpCode || data["returnCode"] == entity.SealCode || data["returnCode"] == entity.SuccessCode) { pdfData, code, msg := u.InvoiceDownload(solgan.Swno, solgan.SaleTax, isRed, 0, 0, solgan.Changed, resType, solgan.OrderCode) if (fmt.Sprint(code) == entity.SuccessCode) { data1 := make(map[string]interface{}) data1["fpdm"] = pdfData["fpdm"] data1["fphm"] = pdfData["fphm"] data1["swno"] = solgan.Swno data1["path"] = pdfData["path"] return msg, 0, data1 } else { data1 := make(map[string]interface{}) data1["fpdm"] = pdfData["fpdm"] data1["fphm"] = pdfData["fphm"] data1["swno"] = solgan.Swno data1["path"] = pdfData["path"] return msg, code, data1 } } else { arr := strings.Split(entity.WarningEmail, ",") for _, value := range arr { util.SendPdf(value, true, solgan.Swno, "发票开具时出现问题") } return fmt.Sprintln(data["returnMsg"]), 1, data } } // 发票下载 func (u *InvoiceService) InvoiceDownload(swno string, saleTax string, isRed string, isLoop int, isfeedback int, changed string, resType string, orderCode string) (map[string]interface{}, int, string) { song := make(map[string]interface{}) song["swno"] = swno song["saleTax"] = saleTax bytesData, _ := json.Marshal(song) fmt.Println("json", string(bytesData)) /* url := entity.Url + "?get_invoice" reader := bytes.NewReader(bytesData) request, err := http.NewRequest("POST", url, reader) fmt.Println(err) request.Header.Set("Content-Type", "application/json;charset=UTF-8") client := http.Client{} resp, err := client.Do(request)*/ //不成功时 var err error err = nil //正常 if (err != nil) { //if (err == nil) { data1 := make(map[string]interface{}) data1["fpdm"] = "" data1["fphm"] = "" data1["swno"] = "" data1["path"] = "" if isLoop == 0 { arr := strings.Split(entity.WarningEmail, ",") for _, value := range arr { util.SendPdf(value, true, swno, "发票下载时服务出现问题") } solgan := entity.Invoice{ Swno: swno, SaleTax: saleTax, IsRed: isRed, Changed: changed, ResType: resType, } u.OpeningTimer(&solgan) } return data1, 1, "剑鱼标讯订开票服务预警" } //正常 /*respBytes, err := ioutil.ReadAll(resp.Body) var dat *entity.GetInvoice util.Loger.Println("发票下载:", "流水号:", swno, "结果:", respBytes) if err := json.Unmarshal([]byte(respBytes), &dat); err == nil { fmt.Println(swno, "发票下载返回值:", dat) }*/ //异常 dat := entity.GetInvoice{} dat.ReturnMsg.MsgCode = "0000" //排队中 //dat.ReturnMsg.MsgCode="1089" //失败 //dat.ReturnMsg.MsgCode = "1000" util.Loger.Println("发票下载:", "流水号:", swno, "结果:", dat) //dat.ReturnMsg.MsgCode = entity.LineUpCode if (dat.ReturnMsg.MsgCode == entity.SuccessCode) { var swno1 string if (isRed == "true") { swno1 = swno[4:len(swno)] } else { swno1 = swno } fmt.Println(swno1) pdfData := make(map[string]interface{}) //path := util.ImgHandle(dat.FpMsgs[0].PdfContent, swno, saleTax, swno1) path := "/c/v/c/v" pdfData["path"] = path /* pdfData["fpdm"] = dat.FpMsgs[0].Fpdm pdfData["fphm"] = dat.FpMsgs[0].Fphm*/ pdfData["fpdm"] = "Fpdm" pdfData["fphm"] = "Fphm" pdfData["swno"] = swno return pdfData, 0, dat.ReturnMsg.Msg } else if (dat.ReturnMsg.MsgCode == entity.LineUpCode || dat.ReturnMsg.MsgCode == entity.SealCode) { if isLoop == 0 { u.Timer(swno, saleTax, isRed, isfeedback, changed, resType, orderCode) } return nil, 2, dat.ReturnMsg.Msg } else { arr := strings.Split(entity.WarningEmail, ",") for _, value := range arr { util.SendPdf(value, true, swno, "发票下载时出现问题,"+dat.ReturnMsg.Msg) } return nil, 1, dat.ReturnMsg.Msg } } // 发票是否存在 //noinspection ALL func (u *InvoiceService) InvoiceSee(swno string, saleTax string, model string) (int, interface{}, string) { var swno1 string if (model == "true") { swno1 = "RED_" + swno } else { swno1 = swno } fool := util.Exists("./static/res/" + saleTax + "/" + swno + "/" + swno1 + ".pdf") msg := "发票地址" if fool { pdfData := make(map[string]interface{}) pdfData["path"] = entity.PdfUrl + "/static/res/" + saleTax + "/" + swno + "/" + swno1 + ".pdf" pdfData["fpdm"] = "" pdfData["fphm"] = "" } else { return 1, "path", msg } return 0, "", msg } // 退票 //noinspection ALL func (u *InvoiceService) InvoiceRedSubmit(fpdm string, fphm string, orderCode string, resType string, changed string, isLoop int, solgan *entity.Invoice) (string, int, interface{}) { url := entity.Url + "?redSubmitEInvoiceInfo" model := "1" if (changed == "1") { model = "2" } song := make(map[string]interface{}) song["fpdm"] = fpdm song["fphm"] = fphm solgan.Yfphm = fphm solgan.Yfpdm = fpdm solgan.IsRed = "true" solgan.Changed = changed solgan.ResType = resType solgan.Model = model solgan.OrderCode = orderCode bytesData, _ := json.Marshal(song) fmt.Println("json", string(bytesData)) reader := bytes.NewReader(bytesData) request, err := http.NewRequest("POST", url, reader) fmt.Println(err) request.Header.Set("Content-Type", "application/json;charset=UTF-8") client := http.Client{} resp, err := client.Do(request) if (err != nil) { data1 := make(map[string]interface{}) data1["fpdm"] = "" data1["fphm"] = "" data1["swno"] = "" data1["path"] = "" if isLoop == 0 { arr := strings.Split(entity.WarningEmail, ",") for _, value := range arr { util.SendPdf(value, true, solgan.Swno, "发票退票时服务出现问题") } u.OpeningTimer(solgan) } if (model == "2") { return "剑鱼标讯订开票服务预警", 3, data1 } else { return "剑鱼标讯订开票服务预警", 2, data1 } } respBytes, err := ioutil.ReadAll(resp.Body) data := make(map[string]interface{}) if err := json.Unmarshal([]byte(respBytes), &data); err == nil { fmt.Println(fphm, "冲红返回值:", data) } util.Loger.Println("冲红:", "发票单号:", fpdm, "发票号码:", fphm, "结果:", data) //data["returnCode"] = entity.LineUpCode if (data["returnCode"] == entity.LineUpCode || data["returnCode"] == entity.SealCode || data["returnCode"] == entity.SuccessCode) { pdfData, code, msg := u.InvoiceDownload(data["redSwno"].(string), data["saleTax"].(string), "true", int(0), int(0), changed, resType, orderCode) if (fmt.Sprint(code) == "0") { data1 := map[string]interface{}{ "fpdm": pdfData["fpdm"], "fphm": pdfData["fphm"], "swno": data["redSwno"], "path": pdfData["path"], } return msg, 0, data1 } else { data1 := map[string]interface{}{ "fpdm": pdfData["fpdm"], "fphm": pdfData["fphm"], "swno": data["redSwno"], "path": pdfData["path"], } return msg, code, data1 } } else if (data["returnCode"] == "3002") { return "已经冲红", 4, data } else { return fmt.Sprintln(data["returnMsg"]), 1, data } } // 换票 //noinspection ALL func (u *InvoiceService) InvoiceReplace(solgan *entity.Invoice, resType string) (string, int, interface{}) { solgan.Model = "2" solgan.OrderCode = solgan.Swno msg, code1, dataMap := invoiceService.InvoiceRedSubmit(solgan.Yfpdm, solgan.Yfphm, solgan.Swno, resType, solgan.Changed, 0, solgan) util.Loger.Println("换票:", "发票单号:", solgan.Yfpdm, "发票号码:", solgan.Yfphm) if (code1 == 1) { return msg, code1, dataMap } if (code1 == 3) { return msg, 2, dataMap } solgan.Yfphm = "" solgan.Yfpdm = "" solgan.Model = "0" msg, code, datamap := u.InvoiceAdd(solgan, resType, 0, "false") _rdsVal := datamap.(map[string]interface{}) _dataMap := dataMap.(map[string]interface{}) if (code1 == 4) { _rdsVal["chcode"] = 0 _rdsVal["isch"] = true } else { _rdsVal["chcode"] = code1 _rdsVal["isch"] = false _rdsVal["chfpdm"] = _dataMap["fpdm"] _rdsVal["chfphm"] = _dataMap["fphm"] _rdsVal["chswno"] = _dataMap["swno"] _rdsVal["chpath"] = _dataMap["path"] } if (code1 == 3) { code = 2 } return msg, code, _rdsVal } //排队中签章失败定时任务 func (u *InvoiceService) Timer(swno string, saleTax string, isRed string, isfeedback int, changed string, resType string, orderCode string) { util.Loger.Print("定时任务重启", swno, saleTax, isRed, isfeedback, changed, resType) valueInface := redis.Get(core.GetConfiguration().Redis.Modules, "fp_"+swno) if (valueInface == nil) { swnoMap := make(map[string]interface{}, 0) swnoMap["swno"] = swno swnoMap["saleTax"] = saleTax swnoMap["isfeedback"] = isfeedback swnoMap["isLoop"] = 1 swnoMap["changed"] = changed swnoMap["isRed"] = isRed swnoMap["resType"] = resType swnoMap["Frequency"] = 0 swnoMap["creatTime"] = fmt.Sprint(time.Now().Unix()) swnoMap["orderCode"] = orderCode redis.PutKV("fp_"+swno, swnoMap) } c := cron.New() spec := entity.TimingCron c.AddFunc(spec, func() { // AddFunc 是添加任务的地方,此函数接收两个参数,第一个为表示定时任务的字符串,第二个为真正的真正的任务。 util.Loger.Println("定时任务开始:", "流水号:", swno) valueInface := redis.Get(core.GetConfiguration().Redis.Modules, "fp_"+swno) swnoMap := make(map[string]interface{}, 0) if (valueInface == nil) { swnoMap["swno"] = swno swnoMap["saleTax"] = saleTax swnoMap["isfeedback"] = isfeedback swnoMap["Frequency"] = 0 swnoMap["changed"] = changed swnoMap["isRed"] = isRed swnoMap["resType"] = resType swnoMap["creatTime"] = fmt.Sprint(time.Now().Unix()) swnoMap["orderCode"] = orderCode redis.PutKV("fp_"+swno, swnoMap) } else { _rdsVal := valueInface.(map[string]interface{}) swnoMap["swno"] = _rdsVal["swno"] swnoMap["saleTax"] = _rdsVal["saleTax"] swnoMap["isfeedback"] = _rdsVal["isfeedback"] swnoMap["isLoop"] = _rdsVal["isLoop"] swnoMap["changed"] = changed swnoMap["isRed"] = isRed swnoMap["resType"] = resType swnoMap["creatTime"] = _rdsVal["creatTime"] swnoMap["orderCode"] = orderCode numb, _ := strconv.Atoi(fmt.Sprint(_rdsVal["Frequency"])) fmt.Println("循环:", numb, "----", entity.Frequency) fmt.Sprint("numb", "执行次数") if numb == entity.Frequency { arr := strings.Split(entity.WarningEmail, ",") for _, value := range arr { util.SendPdf(value, false, swno, "排队中签章失败定时任务出现问题") } numb++ util.Callback(swno, saleTax, "", "", "", changed, isRed, resType, "true", "", orderCode) } util.Loger.Println("第:", numb, "次执行", "流水号:", swno) numb++ swnoMap["Frequency"] = numb redis.PutKV("fp_"+swno, swnoMap) creatTime, _ := strconv.ParseInt(fmt.Sprint(_rdsVal["creatTime"]), 10, 64) fmt.Println(creatTime - time.Now().Unix()) } pdfData, code, _ := u.InvoiceDownload(swno, saleTax, isRed, 1, 0, changed, resType, orderCode) fmt.Println(pdfData) if (code == 0) { util.Loger.Println("定时开票成功:", "流水号:", swno) if (isfeedback == 0) { //修改发票中状态 dat := util.Callback(swno, saleTax, pdfData["fpdm"].(string), pdfData["fphm"].(string), pdfData["path"].(string), changed, isRed, resType, "", "3", orderCode) util.Loger.Println("下载成功更改发票结果:", "流水号:", swno, dat) util.Loger.Println("下载成功定时任务结束:", "流水号:", swno, ) if (dat) { redis.Del(core.GetConfiguration().Redis.Modules, "fp_"+swno) util.Loger.Println("删除:", "流水号:", "fp_"+swno) c.Stop() } } else { redis.Del(core.GetConfiguration().Redis.Modules, "fp_"+swno) c.Stop() } } else { //util.Callback(swno, saleTax, "", "", "", changed, isRed, resType, "true", "", orderCode) //c.Stop() } }) c.Start() } //服务断开重新开票定时任务 //开具、重开 //model 0开票 1 冲红 2冲红开票 func (u *InvoiceService) OpeningTimer(solgan *entity.Invoice) { util.Loger.Println("发票开具服务有问题") valueInface := redis.Get(core.GetConfiguration().Redis.Modules, "xx_"+solgan.Swno) if (valueInface == nil) { solgan.Numb = 0 if solgan.Model == "1" || solgan.Model == "2" { redis.PutKV("xx_"+solgan.Yfphm, solgan) } else { redis.PutKV("xx_"+solgan.Swno, solgan) } } c := cron.New() spec := entity.OpenTimingCron c.AddFunc(spec, func() { // AddFunc 是添加任务的地方,此函数接收两个参数,第一个为表示定时任务的字符串,第二个为真正的真正的任务。 //util.Loger.Println("定时任务重新开票开始:", "流水号:", solgan.Swno) swno := "" if solgan.Model == "1" || solgan.Model == "2" { util.Loger.Println("定时任务重新开票开始:", "发票号码:", solgan.Yfphm) swno = solgan.Yfphm } else { util.Loger.Println("定时任务重新开票开始:", "流水号:", solgan.Swno) swno = solgan.Swno } valueInface := redis.Get(core.GetConfiguration().Redis.Modules, "xx_"+swno) if (valueInface == nil) { solgan.Numb = 0 if solgan.Model == "1" || solgan.Model == "2" { redis.PutKV("xx_"+solgan.Yfphm, solgan) } else { redis.PutKV("xx_"+solgan.Swno, solgan) } } else { swnoMap := valueInface.(map[string]interface{}) numb, _ := strconv.Atoi(fmt.Sprint(swnoMap["numb"])) if numb < entity.OpenFrequency { if solgan.Model == "1" || solgan.Model == "2" { util.Loger.Println("第:", numb, "次执行重新开票", "发票号码:", solgan.Yfphm) } else { util.Loger.Println("第:", numb, "次执行重新开票", "流水号:", solgan.Swno) } numb++ solgan.Numb = numb redis.PutKV("xx_"+swno, solgan) } else if (numb == entity.OpenFrequency) { fmt.Println(numb) util.Callback(solgan.Swno, solgan.SaleTax, solgan.Yfpdm, solgan.Yfphm, "", solgan.Changed, solgan.IsRed, solgan.ResType, "true", solgan.Model, solgan.OrderCode) if solgan.Model == "1" || solgan.Model == "2" { redis.Del(core.GetConfiguration().Redis.Modules, "xx_"+solgan.Yfphm) util.Loger.Println("删除:", "发票号码:", solgan.Yfphm) } else { redis.Del(core.GetConfiguration().Redis.Modules, "xx_"+solgan.Swno) util.Loger.Println("删除:", "流水号:", solgan.Swno) } c.Stop() } else { fmt.Println(numb) util.Callback(solgan.Swno, solgan.SaleTax, solgan.Yfpdm, solgan.Yfphm, "", solgan.Changed, solgan.IsRed, solgan.ResType, "true", solgan.Model, solgan.OrderCode) if solgan.Model == "1" || solgan.Model == "2" { redis.Del(core.GetConfiguration().Redis.Modules, "xx_"+solgan.Yfphm) util.Loger.Println("删除1:", "发票号码:", solgan.Yfphm) } else { redis.Del(core.GetConfiguration().Redis.Modules, "xx_"+solgan.Swno) util.Loger.Println("删除1:", "流水号:", solgan.Swno) } c.Stop() } } //是否重开 switch solgan.Model { //重新开具 case "0": _, code, _ := u.InvoiceAdd(solgan, solgan.ResType, 1, "false") if (code == 0) { //_rdsVal := datamap.(map[string]interface{}) //util.Callback(solgan.Swno, solgan.SaleTax, "", "", _rdsVal["path"].(string), solgan.Changed, "false", solgan.ResType, "true") util.Loger.Println("删除:", "流水号:", "xx_"+solgan.Swno) redis.Del(core.GetConfiguration().Redis.Modules, "xx_"+solgan.Swno) util.Callback(solgan.Swno, solgan.SaleTax, solgan.Yfpdm, solgan.Yfphm, "", solgan.Changed, solgan.IsRed, solgan.ResType, "true", solgan.Model, solgan.OrderCode) c.Stop() } //单独冲红失败 case "1": _, code, _ := u.InvoiceRedSubmit(solgan.Yfpdm, solgan.Yfphm, solgan.OrderCode, solgan.ResType, solgan.Changed, 1, solgan) if (code == 0) { //_rdsVal := datamap.(map[string]interface{}) //util.Callback(solgan.Swno, solgan.SaleTax, datamap, "", _rdsVal["path"].(string), solgan.Changed, "false", solgan.ResType, "true") util.Loger.Println("删除:", "发票号码:", "xx_"+solgan.Yfphm) redis.Del(core.GetConfiguration().Redis.Modules, "xx_"+solgan.Yfphm) util.Callback(solgan.Swno, solgan.SaleTax, solgan.Yfpdm, solgan.Yfphm, "", solgan.Changed, solgan.IsRed, solgan.ResType, "true", solgan.Model, solgan.OrderCode) c.Stop() } //冲红开具 case "2": _, code, _ := u.InvoiceRedSubmit(solgan.Yfpdm, solgan.Yfphm, solgan.OrderCode, solgan.ResType, solgan.Changed, 1, solgan) fmt.Println("code", code) if (code == 2 || code == 0) { solgan.Model = "0" if (code == 0) { u.OpeningTimer(solgan) } //_rdsVal := datamap.(map[string]interface{}) //util.Callback(solgan.Swno, solgan.SaleTax, datamap, "", _rdsVal["path"].(string), solgan.Changed, "false", solgan.ResType, "true") util.Loger.Println("删除:", "发票号码:", "xx_"+solgan.Yfphm) redis.Del(core.GetConfiguration().Redis.Modules, "xx_"+solgan.Yfphm) util.Callback(solgan.Swno, solgan.SaleTax, solgan.Yfpdm, solgan.Yfphm, "", solgan.Changed, solgan.IsRed, solgan.ResType, "true", solgan.Model, solgan.OrderCode) c.Stop() } case "3": _, code, _ := u.InvoiceDownload(solgan.Swno, solgan.SaleTax, solgan.IsRed, 1, 0, solgan.Changed, solgan.ResType, solgan.OrderCode) if (code == 0) { //_rdsVal := datamap.(map[string]interface{}) //util.Callback(solgan.Swno, solgan.SaleTax, datamap, "", _rdsVal["path"].(string), solgan.Changed, "false", solgan.ResType, "true") util.Loger.Println("删除:", "流水号:", "xx_"+solgan.Swno) redis.Del(core.GetConfiguration().Redis.Modules, "xx_"+solgan.Swno) util.Callback(solgan.Swno, solgan.SaleTax, solgan.Yfpdm, solgan.Yfphm, "", solgan.Changed, solgan.IsRed, solgan.ResType, "true", solgan.Model, solgan.OrderCode) c.Stop() } } /*if (numb == 0) { redis.Del(core.GetConfiguration().Redis.Modules, "xx_"+solgan.Swno) util.Loger.Println("删除:", "流水号:", solgan.Swno) c.Stop() } else if (numb == 1) { c.Stop() }*/ }) c.Start() } //回调