Forráskód Böngészése

fix:发票回显修改

duxin 5 hónapja
szülő
commit
594b4cb0ed
1 módosított fájl, 1799 hozzáadás és 1799 törlés
  1. 1799 1799
      src/jfw/modules/subscribepay/src/service/invoice.go

+ 1799 - 1799
src/jfw/modules/subscribepay/src/service/invoice.go

@@ -1,66 +1,66 @@
 package service
 
 import (
-    . "app.yhyue.com/moapp/jybase/api"
-    qutil "app.yhyue.com/moapp/jybase/common"
-    . "app.yhyue.com/moapp/jybase/date"
-    "app.yhyue.com/moapp/jybase/encrypt"
-    "app.yhyue.com/moapp/jybase/go-xweb/log"
-    "app.yhyue.com/moapp/jybase/go-xweb/xweb"
-    "app.yhyue.com/moapp/jybase/mail"
-    "app.yhyue.com/moapp/jypkg/common/src/qfw/util/dataexport"
-    "bytes"
-    "database/sql"
-    "encoding/json"
-    "errors"
-    "fmt"
-    "github.com/google/uuid"
-    "io/ioutil"
-    "jy/src/jfw/modules/subscribepay/src/config"
-    "jy/src/jfw/modules/subscribepay/src/util"
-    "net/http"
-    "os"
-    "strconv"
-    "strings"
-    "sync"
-    "time"
+	. "app.yhyue.com/moapp/jybase/api"
+	qutil "app.yhyue.com/moapp/jybase/common"
+	. "app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jybase/go-xweb/log"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"app.yhyue.com/moapp/jybase/mail"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/dataexport"
+	"bytes"
+	"database/sql"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"github.com/google/uuid"
+	"io/ioutil"
+	"jy/src/jfw/modules/subscribepay/src/config"
+	"jy/src/jfw/modules/subscribepay/src/util"
+	"net/http"
+	"os"
+	"strconv"
+	"strings"
+	"sync"
+	"time"
 )
 
 type Invoice struct {
-    *xweb.Action
-    addinvoice        xweb.Mapper `xweb:"/invoice/add"`            //开发票
-    showinvoice       xweb.Mapper `xweb:"/invoice/show"`           //查看发票
-    newInvoiceShow    xweb.Mapper `xweb:"/invoice/newShow"`        //查看发票
-    showinvoiceList   xweb.Mapper `xweb:"/invoice/showList"`       //新查看发票 p537
-    callbackinvoice   xweb.Mapper `xweb:"/invoice/callback"`       //开发票回调
-    replaceinvoice    xweb.Mapper `xweb:"/invoice/replace"`        //换发票
-    newReplaceinvoice xweb.Mapper `xweb:"/invoice/newReplace"`     //新换发票
-    refundinvoice     xweb.Mapper `xweb:"/invoice/refund"`         //退票
-    invoiceinfo       xweb.Mapper `xweb:"/invoice/info"`           //订单详情数据
-    available         xweb.Mapper `xweb:"/invoice/available"`      //是否可用开发票
-    invoiceswitch     xweb.Mapper `xweb:"/invoice/switch"`         //发票开关
-    invoiceQuery      xweb.Mapper `xweb:"/invoice/query"`          //发票信息查询
-    invoiceSubmit     xweb.Mapper `xweb:"/invoice/submit"`         //发票信息提交
-    getCompanyCode    xweb.Mapper `xweb:"/invoice/getCompanyCode"` //开票联想税号
+	*xweb.Action
+	addinvoice        xweb.Mapper `xweb:"/invoice/add"`            //开发票
+	showinvoice       xweb.Mapper `xweb:"/invoice/show"`           //查看发票
+	newInvoiceShow    xweb.Mapper `xweb:"/invoice/newShow"`        //查看发票
+	showinvoiceList   xweb.Mapper `xweb:"/invoice/showList"`       //新查看发票 p537
+	callbackinvoice   xweb.Mapper `xweb:"/invoice/callback"`       //开发票回调
+	replaceinvoice    xweb.Mapper `xweb:"/invoice/replace"`        //换发票
+	newReplaceinvoice xweb.Mapper `xweb:"/invoice/newReplace"`     //新换发票
+	refundinvoice     xweb.Mapper `xweb:"/invoice/refund"`         //退票
+	invoiceinfo       xweb.Mapper `xweb:"/invoice/info"`           //订单详情数据
+	available         xweb.Mapper `xweb:"/invoice/available"`      //是否可用开发票
+	invoiceswitch     xweb.Mapper `xweb:"/invoice/switch"`         //发票开关
+	invoiceQuery      xweb.Mapper `xweb:"/invoice/query"`          //发票信息查询
+	invoiceSubmit     xweb.Mapper `xweb:"/invoice/submit"`         //发票信息提交
+	getCompanyCode    xweb.Mapper `xweb:"/invoice/getCompanyCode"` //开票联想税号
 }
 
 var dbname = "invoice"
 
 type ReturnJson map[string]interface{}
 type InvoiceInfo struct {
-    code int                    `json:"code"`
-    msg  string                 `json:"msg"`
-    data map[string]interface{} `json:"data"`
+	code int                    `json:"code"`
+	msg  string                 `json:"msg"`
+	data map[string]interface{} `json:"data"`
 }
 
 // 红票信息
 type RedMsg struct {
-    InvoiceCode      string `json:"invoice_code"`
-    InvoiceNumber    string `json:"invoice_number"`
-    Url              string `json:"url"`
-    InvoiceSerialnum string `json:"invoice_serialnum"`
-    InvoiceStatus    string `json:"invoice_status"`
-    BillingTime      int64  `json:"billing_time"`
+	InvoiceCode      string `json:"invoice_code"`
+	InvoiceNumber    string `json:"invoice_number"`
+	Url              string `json:"url"`
+	InvoiceSerialnum string `json:"invoice_serialnum"`
+	InvoiceStatus    string `json:"invoice_status"`
+	BillingTime      int64  `json:"billing_time"`
 }
 
 var emailHtml_gs = `<p class="item">
@@ -103,1878 +103,1878 @@ var email_format = ""
 var email_format_new = ""
 
 func init() {
-    for i := 0; i < 10; i++ {
-        locks[i] = sync.Mutex{}
-    }
-    r, err := os.Open("./mailtemplate.html")
-    if err != nil {
-        log.Println("err", err)
-    }
-    defer r.Close()
-    bs, _ := ioutil.ReadAll(r)
-    email_format = string(bs)
-    r, err = os.Open("./mailtemplateNew.html")
-    if err != nil {
-        log.Println("err", err)
-    }
-    defer r.Close()
-    bs, _ = ioutil.ReadAll(r)
-    email_format_new = string(bs)
+	for i := 0; i < 10; i++ {
+		locks[i] = sync.Mutex{}
+	}
+	r, err := os.Open("./mailtemplate.html")
+	if err != nil {
+		log.Println("err", err)
+	}
+	defer r.Close()
+	bs, _ := ioutil.ReadAll(r)
+	email_format = string(bs)
+	r, err = os.Open("./mailtemplateNew.html")
+	if err != nil {
+		log.Println("err", err)
+	}
+	defer r.Close()
+	bs, _ = ioutil.ReadAll(r)
+	email_format_new = string(bs)
 }
 
 func (this *Invoice) Invoiceswitch() {
-    if config.InvoiceConfig.Invoice_switch {
-        this.ServeJson(map[string]interface{}{
-            "code": "1000",
-        })
-    } else {
-        //更新数据 用于回显
-        userId := qutil.ObjToString(this.GetSession("userId"))
-        order_code := this.GetString("order_code")
-        applyBill_company := this.GetString("company")
-        //获取数据
-        applyBill_type := this.GetString("invoice_type") //个人 单位
-        my_email := this.GetString("email")
-        phone_num := this.GetString("phone_num")
-        code := strings.ToUpper(this.GetString("id_num")) //纳税人识别号
-        data := make(map[string]interface{})
-        dataexport_data := make(map[string]interface{})
-        if userId != "" && my_email != "" && phone_num != "" && order_code != "" {
-            if applyBill_type == "个人" {
-                data["taxpayer_identnum"] = ""
-                data["company_name"] = ""
-                dataexport_data["applyBill_type"] = 0
-                dataexport_data["applyBill_taxnum"] = ""
-                dataexport_data["applybill_company"] = ""
-            } else {
-                data["taxpayer_identnum"] = code
-                data["company_name"] = applyBill_company
-                dataexport_data["applyBill_taxnum"] = code
-                dataexport_data["applybill_company"] = applyBill_company
-                dataexport_data["applyBill_type"] = 1
-            }
-            dataexport_data["user_mail"] = my_email
-            dataexport_data["user_phone"] = phone_num
-            data["order_code"] = order_code
-            data["mail"] = my_email
-            data["phone"] = phone_num
-            data["invoice_type"] = applyBill_type
-            data["create_time"] = time.Now().Unix()
-            data["user_id"] = userId
-            status := util.Mysql.Find(dbname, map[string]interface{}{"order_code": order_code, "user_id": userId}, "", "create_time", 0, 0)
-            if len(*status) <= 0 {
-                //更新 "order_status,applybill_status,order_code,user_mail,applybill_type,applybill_company,user_phone,applybill_taxnum"
-                util.Mysql.Update("dataexport_order", map[string]interface{}{"order_code": order_code, "user_id": userId}, dataexport_data)
-            } else {
-                req := map[string]interface{}{
-                    "order_code":      order_code,
-                    "user_id":         userId,
-                    "invoice_changed": 0,
-                }
-                if len(*status) > 1 {
-                    req["id"] = (*status)[1]["id"]
-                } else {
-                    req["id"] = (*status)[0]["id"]
-                }
-                util.Mysql.Update(dbname, req, data)
-            }
-        }
-        this.ServeJson(map[string]interface{}{
-            "code":   "1001",
-            "messge": "因第三方发票系统升级,开发票功能暂停使用。如有疑问,请咨询客服400-108-6670",
-        })
-    }
+	if config.InvoiceConfig.Invoice_switch {
+		this.ServeJson(map[string]interface{}{
+			"code": "1000",
+		})
+	} else {
+		//更新数据 用于回显
+		userId := qutil.ObjToString(this.GetSession("userId"))
+		order_code := this.GetString("order_code")
+		applyBill_company := this.GetString("company")
+		//获取数据
+		applyBill_type := this.GetString("invoice_type") //个人 单位
+		my_email := this.GetString("email")
+		phone_num := this.GetString("phone_num")
+		code := strings.ToUpper(this.GetString("id_num")) //纳税人识别号
+		data := make(map[string]interface{})
+		dataexport_data := make(map[string]interface{})
+		if userId != "" && my_email != "" && phone_num != "" && order_code != "" {
+			if applyBill_type == "个人" {
+				data["taxpayer_identnum"] = ""
+				data["company_name"] = ""
+				dataexport_data["applyBill_type"] = 0
+				dataexport_data["applyBill_taxnum"] = ""
+				dataexport_data["applybill_company"] = ""
+			} else {
+				data["taxpayer_identnum"] = code
+				data["company_name"] = applyBill_company
+				dataexport_data["applyBill_taxnum"] = code
+				dataexport_data["applybill_company"] = applyBill_company
+				dataexport_data["applyBill_type"] = 1
+			}
+			dataexport_data["user_mail"] = my_email
+			dataexport_data["user_phone"] = phone_num
+			data["order_code"] = order_code
+			data["mail"] = my_email
+			data["phone"] = phone_num
+			data["invoice_type"] = applyBill_type
+			data["create_time"] = time.Now().Unix()
+			data["user_id"] = userId
+			status := util.Mysql.Find(dbname, map[string]interface{}{"order_code": order_code, "user_id": userId}, "", "create_time", 0, 0)
+			if len(*status) <= 0 {
+				//更新 "order_status,applybill_status,order_code,user_mail,applybill_type,applybill_company,user_phone,applybill_taxnum"
+				util.Mysql.Update("dataexport_order", map[string]interface{}{"order_code": order_code, "user_id": userId}, dataexport_data)
+			} else {
+				req := map[string]interface{}{
+					"order_code":      order_code,
+					"user_id":         userId,
+					"invoice_changed": 0,
+				}
+				if len(*status) > 1 {
+					req["id"] = (*status)[1]["id"]
+				} else {
+					req["id"] = (*status)[0]["id"]
+				}
+				util.Mysql.Update(dbname, req, data)
+			}
+		}
+		this.ServeJson(map[string]interface{}{
+			"code":   "1001",
+			"messge": "因第三方发票系统升级,开发票功能暂停使用。如有疑问,请咨询客服400-108-6670",
+		})
+	}
 }
 
 // Addinvoice 用户端-线上开票只能选电子普票
 func (this *Invoice) Addinvoice() error {
-    defer qutil.Catch()
-    userId := qutil.ObjToString(this.GetSession("userId"))
-    var applyBill_status int
-    var order_code, applyBill_company, applyBill_type, price, product_name string
-    order_code = this.GetString("order_code")
-    applyBill_company = this.GetString("company")
-    //获取数据
-    applyBill_type = this.GetString("invoice_type") //个人 单位
-    my_email := this.GetString("email")
-    phone_num := this.GetString("phone_num")
-    code := strings.ToUpper(this.GetString("id_num")) //纳税人识别号
-    isSys, _ := this.GetBool("isSys")
-    jsonData := ReturnJson{}
-    invoice_status := -1   //发票表开票失败
-    updata_status := false //更新表状态
-    if userId != "" && my_email != "" && phone_num != "" && order_code != "" {
-        last := order_code[len([]rune(order_code))-1:]
-        pos := qutil.IntAllDef(last, 0)
-        locks[pos].Lock()
-        defer locks[pos].Unlock()
-        u := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": order_code, "user_id": userId, "applyBill_status": map[string]interface{}{"ne": 2}}, "order_money,product_type,pay_way,pay_money,is_backstage_order,billingMode,signing_subject,return_status,applybill_status", "")
-        if u != nil {
-            //后端代用户下单支持开票 order_channel = xdqd04
-            if qutil.IntAll((*u)["billingMode"]) == 1 && (qutil.IntAll((*u)["is_backstage_order"]) != 1 || (qutil.IntAll((*u)["is_backstage_order"]) == 1 && qutil.ObjToString((*u)["signing_subject"]) == "h01" && qutil.IntAll((*u)["return_status"]) == 1 && qutil.IntAll((*u)["applybill_status"]) == 0)) {
-                var prices float64
-                //公对公转账 账单金额可以修改 开发票应取实付金额 pay_money
-                //微信支付宝支付 pay_money为订单金额减去微信or支付包红包
-                prices = qutil.Float64All((*u)["pay_money"]) / float64(100)
-                price = strconv.FormatFloat(prices, 'f', -1, 64)
-                product_name = (*u)["product_type"].(string)
-                applyBill_status = 1
-                data := make(map[string]interface{})
-                dataexport_data := make(map[string]interface{})
-                dataexport_data["applyBill_status"] = applyBill_status
-                if applyBill_type == "个人" {
-                    dataexport_data["applyBill_type"] = 0
-                    data["taxpayer_identnum"] = ""
-                    data["company_name"] = ""
-                    dataexport_data["applyBill_taxnum"] = ""
-                    dataexport_data["applybill_company"] = ""
-                } else {
-                    data["taxpayer_identnum"] = code
-                    data["company_name"] = applyBill_company
-                    dataexport_data["applyBill_taxnum"] = code
-                    dataexport_data["applybill_company"] = applyBill_company
-                    dataexport_data["applyBill_type"] = 1
-                }
-                dataexport_data["user_mail"] = my_email
-                data["product_type"] = product_name
-                data["order_code"] = order_code
-                data["mail"] = my_email
-                data["phone"] = phone_num
-                data["invoice_type"] = applyBill_type
-                data["invoice_changed"] = 0
-                data["create_time"] = time.Now().Unix()
-                data["user_id"] = userId
-                data["invoice_status"] = 0
-                data["invoice_money"] = price
-                var orders = []map[string]interface{}{}
-                var items = []map[string]interface{}{}
-                item := map[string]interface{}{
-                    "name":        product_name,
-                    "code":        config.InvoiceConfig.Code,
-                    "yhzcbs":      config.InvoiceConfig.Tax_policy,
-                    "lineType":    config.InvoiceConfig.Invoice_nature,
-                    "taxRate":     config.InvoiceConfig.Tax_rate,
-                    "taxPrice":    price,
-                    "totalAmount": price,
-                    "quantity":    "1",
-                }
-                items = append(items, item)
-                order := map[string]interface{}{
-                    "billNo": order_code,
-                    "items":  items,
-                }
-                orders = append(orders, order)
-                client := &http.Client{}
-                body := map[string]interface{}{
-                    "Swno":      order_code,
-                    "custType":  "03",
-                    "orders":    orders,
-                    "custTaxNo": code,
-                    "phone":     phone_num,
-                    "billDate":  NowFormat(Date_Full_Layout), //单据日期  格式:yyyy-MM-dd HH:mm:ss
-                }
-
-                if applyBill_type == "单位" {
-                    body["custName"] = applyBill_company
-                } else {
-                    body["custName"] = applyBill_type
-                }
-                //发送请求之前插入数据,防止请求时间过长
-                if !isSys {
-                    status := util.Mysql.Find(dbname, map[string]interface{}{"order_code": order_code, "user_id": userId}, "", "create_time", 0, 0)
-                    if len(*status) > 0 {
-                        return nil
-                    }
-                    if i := util.Mysql.Insert(dbname, data); i > 0 {
-                        invoice_status = 0
-                    }
-                    if !util.Mysql.Update("dataexport_order", map[string]interface{}{"order_code": order_code, "user_id": userId}, dataexport_data) {
-                        invoice_status = -1
-                    }
-                } else {
-                    if ok := util.Mysql.Update(dbname, map[string]interface{}{
-                        "order_code":      order_code,
-                        "user_id":         userId,
-                        "invoice_changed": 0,
-                    }, data); ok {
-                        invoice_status = 0
-                    }
-                }
-                if config.InvoiceConfig.Third_party_switch {
-                    b, _ := json.Marshal(body)
-                    buffer := bytes.NewBuffer(b)
-                    request, _ := http.NewRequest("POST", config.InvoiceConfig.Invoice_interface_address+"/Invoice/Add", buffer)
-                    response, err := client.Do(request)
-                    if err == nil {
-                        res, err := ioutil.ReadAll(response.Body)
-                        if err != nil {
-                            invoice_status = -1
-                        } else {
-                            resMap := qutil.ObjToMap(string(res))
-                            if *resMap != nil {
-                                if qutil.IntAll((*resMap)["code"]) == 0 { //开票成功
-                                    invoice_status = 1
-                                    jsonData["invoice_status"] = invoice_status
-                                } else if qutil.IntAll((*resMap)["code"]) == 2 { //开票中
-                                    // log.Println("开票中")
-                                    invoice_status = 0
-                                    jsonData["invoice_status"] = invoice_status
-                                } else { //开票失败
-                                    // log.Println("开票失败")
-                                    invoice_status = -1
-                                    jsonData["invoice_status"] = invoice_status
-                                }
-                            }
-                            defer response.Body.Close()
-                            resData := (*resMap)["data"].(map[string]interface{})
-                            update_status := util.Mysql.Update(dbname, map[string]interface{}{"order_code": order_code}, map[string]interface{}{
-                                "invoice_serialnum": resData["swno"],
-                                "invoice_code":      resData["fpdm"],
-                                "invoice_number":    resData["fphm"],
-                                "url":               resData["path"],
-                                "invoice_status":    invoice_status,
-                            })
-                            if !update_status {
-                                log.Println("order_ocde:", order_code+"update fail")
-                            }
-                        }
-                    }
-                }
-            }
-        } else {
-            if invoice_status != 1 {
-                log.Println("invoice err:", "updata_status:", updata_status, "order_code:", order_code, "invoice_status:", invoice_status, userId)
-            }
-        }
-    }
-    jsonData["invoice_status"] = invoice_status
-    this.ServeJson(jsonData)
-    return nil
+	defer qutil.Catch()
+	userId := qutil.ObjToString(this.GetSession("userId"))
+	var applyBill_status int
+	var order_code, applyBill_company, applyBill_type, price, product_name string
+	order_code = this.GetString("order_code")
+	applyBill_company = this.GetString("company")
+	//获取数据
+	applyBill_type = this.GetString("invoice_type") //个人 单位
+	my_email := this.GetString("email")
+	phone_num := this.GetString("phone_num")
+	code := strings.ToUpper(this.GetString("id_num")) //纳税人识别号
+	isSys, _ := this.GetBool("isSys")
+	jsonData := ReturnJson{}
+	invoice_status := -1   //发票表开票失败
+	updata_status := false //更新表状态
+	if userId != "" && my_email != "" && phone_num != "" && order_code != "" {
+		last := order_code[len([]rune(order_code))-1:]
+		pos := qutil.IntAllDef(last, 0)
+		locks[pos].Lock()
+		defer locks[pos].Unlock()
+		u := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": order_code, "user_id": userId, "applyBill_status": map[string]interface{}{"ne": 2}}, "order_money,product_type,pay_way,pay_money,is_backstage_order,billingMode,signing_subject,return_status,applybill_status", "")
+		if u != nil {
+			//后端代用户下单支持开票 order_channel = xdqd04
+			if qutil.IntAll((*u)["billingMode"]) == 1 && (qutil.IntAll((*u)["is_backstage_order"]) != 1 || (qutil.IntAll((*u)["is_backstage_order"]) == 1 && qutil.ObjToString((*u)["signing_subject"]) == "h01" && qutil.IntAll((*u)["return_status"]) == 1 && qutil.IntAll((*u)["applybill_status"]) == 0)) {
+				var prices float64
+				//公对公转账 账单金额可以修改 开发票应取实付金额 pay_money
+				//微信支付宝支付 pay_money为订单金额减去微信or支付包红包
+				prices = qutil.Float64All((*u)["pay_money"]) / float64(100)
+				price = strconv.FormatFloat(prices, 'f', -1, 64)
+				product_name = (*u)["product_type"].(string)
+				applyBill_status = 1
+				data := make(map[string]interface{})
+				dataexport_data := make(map[string]interface{})
+				dataexport_data["applyBill_status"] = applyBill_status
+				if applyBill_type == "个人" {
+					dataexport_data["applyBill_type"] = 0
+					data["taxpayer_identnum"] = ""
+					data["company_name"] = ""
+					dataexport_data["applyBill_taxnum"] = ""
+					dataexport_data["applybill_company"] = ""
+				} else {
+					data["taxpayer_identnum"] = code
+					data["company_name"] = applyBill_company
+					dataexport_data["applyBill_taxnum"] = code
+					dataexport_data["applybill_company"] = applyBill_company
+					dataexport_data["applyBill_type"] = 1
+				}
+				dataexport_data["user_mail"] = my_email
+				data["product_type"] = product_name
+				data["order_code"] = order_code
+				data["mail"] = my_email
+				data["phone"] = phone_num
+				data["invoice_type"] = applyBill_type
+				data["invoice_changed"] = 0
+				data["create_time"] = time.Now().Unix()
+				data["user_id"] = userId
+				data["invoice_status"] = 0
+				data["invoice_money"] = price
+				var orders = []map[string]interface{}{}
+				var items = []map[string]interface{}{}
+				item := map[string]interface{}{
+					"name":        product_name,
+					"code":        config.InvoiceConfig.Code,
+					"yhzcbs":      config.InvoiceConfig.Tax_policy,
+					"lineType":    config.InvoiceConfig.Invoice_nature,
+					"taxRate":     config.InvoiceConfig.Tax_rate,
+					"taxPrice":    price,
+					"totalAmount": price,
+					"quantity":    "1",
+				}
+				items = append(items, item)
+				order := map[string]interface{}{
+					"billNo": order_code,
+					"items":  items,
+				}
+				orders = append(orders, order)
+				client := &http.Client{}
+				body := map[string]interface{}{
+					"Swno":      order_code,
+					"custType":  "03",
+					"orders":    orders,
+					"custTaxNo": code,
+					"phone":     phone_num,
+					"billDate":  NowFormat(Date_Full_Layout), //单据日期  格式:yyyy-MM-dd HH:mm:ss
+				}
+
+				if applyBill_type == "单位" {
+					body["custName"] = applyBill_company
+				} else {
+					body["custName"] = applyBill_type
+				}
+				//发送请求之前插入数据,防止请求时间过长
+				if !isSys {
+					status := util.Mysql.Find(dbname, map[string]interface{}{"order_code": order_code, "user_id": userId}, "", "create_time", 0, 0)
+					if len(*status) > 0 {
+						return nil
+					}
+					if i := util.Mysql.Insert(dbname, data); i > 0 {
+						invoice_status = 0
+					}
+					if !util.Mysql.Update("dataexport_order", map[string]interface{}{"order_code": order_code, "user_id": userId}, dataexport_data) {
+						invoice_status = -1
+					}
+				} else {
+					if ok := util.Mysql.Update(dbname, map[string]interface{}{
+						"order_code":      order_code,
+						"user_id":         userId,
+						"invoice_changed": 0,
+					}, data); ok {
+						invoice_status = 0
+					}
+				}
+				if config.InvoiceConfig.Third_party_switch {
+					b, _ := json.Marshal(body)
+					buffer := bytes.NewBuffer(b)
+					request, _ := http.NewRequest("POST", config.InvoiceConfig.Invoice_interface_address+"/Invoice/Add", buffer)
+					response, err := client.Do(request)
+					if err == nil {
+						res, err := ioutil.ReadAll(response.Body)
+						if err != nil {
+							invoice_status = -1
+						} else {
+							resMap := qutil.ObjToMap(string(res))
+							if *resMap != nil {
+								if qutil.IntAll((*resMap)["code"]) == 0 { //开票成功
+									invoice_status = 1
+									jsonData["invoice_status"] = invoice_status
+								} else if qutil.IntAll((*resMap)["code"]) == 2 { //开票中
+									// log.Println("开票中")
+									invoice_status = 0
+									jsonData["invoice_status"] = invoice_status
+								} else { //开票失败
+									// log.Println("开票失败")
+									invoice_status = -1
+									jsonData["invoice_status"] = invoice_status
+								}
+							}
+							defer response.Body.Close()
+							resData := (*resMap)["data"].(map[string]interface{})
+							update_status := util.Mysql.Update(dbname, map[string]interface{}{"order_code": order_code}, map[string]interface{}{
+								"invoice_serialnum": resData["swno"],
+								"invoice_code":      resData["fpdm"],
+								"invoice_number":    resData["fphm"],
+								"url":               resData["path"],
+								"invoice_status":    invoice_status,
+							})
+							if !update_status {
+								log.Println("order_ocde:", order_code+"update fail")
+							}
+						}
+					}
+				}
+			}
+		} else {
+			if invoice_status != 1 {
+				log.Println("invoice err:", "updata_status:", updata_status, "order_code:", order_code, "invoice_status:", invoice_status, userId)
+			}
+		}
+	}
+	jsonData["invoice_status"] = invoice_status
+	this.ServeJson(jsonData)
+	return nil
 }
 
 // 查看发票
 func (this *Invoice) Showinvoice() {
-    order_code := this.GetString("order_code")
-    data := make(map[string]interface{})
-    data["order_code"] = order_code
-    status := util.Mysql.Find(dbname, data, "", "create_time", 0, 0)
-    //红冲发票开关
-    redSwitchInfo := map[string]interface{}{
-        "ris": config.InvoiceConfig.Red_invoice_switch,
-        "rim": config.InvoiceConfig.Red_invoice_msg,
-    }
-    if status != nil && len(*status) != 0 {
-        count := len(*status)
-        data := (*status)[count-1]
-        if data != nil {
-            delete(data, "user_id")
-            if url := qutil.InterfaceToStr(data["url"]); url != "" {
-                //ios 移动端
-                if util.IsMobileIOS(this.Request.UserAgent()) {
-                    //国家税务局-增值税电子发票公共服务平台
-                    if strings.Contains(url, "tysl.beijing.chinatax") {
-                        data["url"] = strings.ReplaceAll(url, "/preview.html?code=", "/web-reader/reader?file=")
-                    }
-                }
-                this.ServeJson(map[string]interface{}{
-                    "status":        "success",
-                    "changed":       qutil.If(count > 1, true, false).(bool),
-                    "data":          data,
-                    "redSwitchInfo": redSwitchInfo,
-                })
-            } else {
-                this.ServeJson(map[string]interface{}{
-                    "status":        "processing",
-                    "changed":       qutil.If(count > 1, true, false).(bool),
-                    "data":          data,
-                    "redSwitchInfo": redSwitchInfo,
-                })
-            }
-        } else {
-            this.ServeJson(map[string]interface{}{
-                "status":        "fail",
-                "changed":       false,
-                "data":          "",
-                "redSwitchInfo": redSwitchInfo,
-            })
-        }
-        //if len(*status) > 1 {
-        //	if (*status)[1]["url"] != nil && (*status)[1]["url"] != "" {
-        //		this.ServeJson(map[string]interface{}{
-        //			"status":        "success",
-        //			"changed":       true,
-        //			"data":          (*status)[1],
-        //			"redSwitchInfo": redSwitchInfo,
-        //		})
-        //	} else {
-        //		this.ServeJson(map[string]interface{}{
-        //			"status":        "processing",
-        //			"changed":       true,
-        //			"data":          (*status)[1],
-        //			"redSwitchInfo": redSwitchInfo,
-        //		})
-        //	}
-        //} else {
-        //	if (*status)[0]["url"] != nil && (*status)[0]["url"] != "" {
-        //		this.ServeJson(map[string]interface{}{
-        //			"status":        "success",
-        //			"changed":       false,
-        //			"data":          (*status)[0],
-        //			"redSwitchInfo": redSwitchInfo,
-        //		})
-        //	} else {
-        //		this.ServeJson(map[string]interface{}{
-        //			"status":        "processing",
-        //			"changed":       false,
-        //			"data":          (*status)[0],
-        //			"redSwitchInfo": redSwitchInfo,
-        //		})
-        //	}
-        //}
-    } else {
-        datas := util.Mysql.FindOne("dataexport_order", data, "order_status,applybill_status,order_code,user_mail,applybill_type,applybill_company,user_phone,applybill_taxnum", "")
-        this.ServeJson(map[string]interface{}{
-            "status":        "fail",
-            "data":          "",
-            "datas":         datas,
-            "redSwitchInfo": redSwitchInfo,
-        })
-    }
+	order_code := this.GetString("order_code")
+	data := make(map[string]interface{})
+	data["order_code"] = order_code
+	status := util.Mysql.Find(dbname, data, "", "create_time", 0, 0)
+	//红冲发票开关
+	redSwitchInfo := map[string]interface{}{
+		"ris": config.InvoiceConfig.Red_invoice_switch,
+		"rim": config.InvoiceConfig.Red_invoice_msg,
+	}
+	if status != nil && len(*status) != 0 {
+		count := len(*status)
+		data := (*status)[count-1]
+		if data != nil {
+			delete(data, "user_id")
+			if url := qutil.InterfaceToStr(data["url"]); url != "" {
+				//ios 移动端
+				if util.IsMobileIOS(this.Request.UserAgent()) {
+					//国家税务局-增值税电子发票公共服务平台
+					if strings.Contains(url, "tysl.beijing.chinatax") {
+						data["url"] = strings.ReplaceAll(url, "/preview.html?code=", "/web-reader/reader?file=")
+					}
+				}
+				this.ServeJson(map[string]interface{}{
+					"status":        "success",
+					"changed":       qutil.If(count > 1, true, false).(bool),
+					"data":          data,
+					"redSwitchInfo": redSwitchInfo,
+				})
+			} else {
+				this.ServeJson(map[string]interface{}{
+					"status":        "processing",
+					"changed":       qutil.If(count > 1, true, false).(bool),
+					"data":          data,
+					"redSwitchInfo": redSwitchInfo,
+				})
+			}
+		} else {
+			this.ServeJson(map[string]interface{}{
+				"status":        "fail",
+				"changed":       false,
+				"data":          "",
+				"redSwitchInfo": redSwitchInfo,
+			})
+		}
+		//if len(*status) > 1 {
+		//	if (*status)[1]["url"] != nil && (*status)[1]["url"] != "" {
+		//		this.ServeJson(map[string]interface{}{
+		//			"status":        "success",
+		//			"changed":       true,
+		//			"data":          (*status)[1],
+		//			"redSwitchInfo": redSwitchInfo,
+		//		})
+		//	} else {
+		//		this.ServeJson(map[string]interface{}{
+		//			"status":        "processing",
+		//			"changed":       true,
+		//			"data":          (*status)[1],
+		//			"redSwitchInfo": redSwitchInfo,
+		//		})
+		//	}
+		//} else {
+		//	if (*status)[0]["url"] != nil && (*status)[0]["url"] != "" {
+		//		this.ServeJson(map[string]interface{}{
+		//			"status":        "success",
+		//			"changed":       false,
+		//			"data":          (*status)[0],
+		//			"redSwitchInfo": redSwitchInfo,
+		//		})
+		//	} else {
+		//		this.ServeJson(map[string]interface{}{
+		//			"status":        "processing",
+		//			"changed":       false,
+		//			"data":          (*status)[0],
+		//			"redSwitchInfo": redSwitchInfo,
+		//		})
+		//	}
+		//}
+	} else {
+		datas := util.Mysql.FindOne("dataexport_order", data, "order_status,applybill_status,order_code,user_mail,applybill_type,applybill_company,user_phone,applybill_taxnum", "")
+		this.ServeJson(map[string]interface{}{
+			"status":        "fail",
+			"data":          "",
+			"datas":         datas,
+			"redSwitchInfo": redSwitchInfo,
+		})
+	}
 
 }
 
 // 查看发票
 func (this *Invoice) ShowinvoiceList() {
-    order_code := this.GetString("order_code")
-    //红冲发票开关
-    redSwitchInfo := map[string]interface{}{
-        "ris": config.InvoiceConfig.Red_invoice_switch,
-        "rim": config.InvoiceConfig.Red_invoice_msg,
-    }
-    invoices := ShowList(order_code)
-    if invoices != nil && len(invoices) > 0 {
-        //isIos := util.IsMobileIOS(this.Request.UserAgent())
-        var invoiceData []map[string]interface{}
-        for _, data := range invoices {
-            //是否换过票
-            isChanged := qutil.IntAll(data["isChanged"]) > 1
-            if isChanged && qutil.IntAll(data["invoice_changed"]) == 0 { //换过票的 只展示换票后的数据
-                continue
-            }
-            delete(data, "user_id")
-            data["id"] = encrypt.SE.Encode2Hex(qutil.InterfaceToStr(data["id"]))
-            timeLimit := qutil.Int64All(data["create_time"]) <= config.InvoiceConfig.Order_createtime                                //24年之前的发票不让换票
-            isJyInvoice := !(qutil.InterfaceToStr(data["invoice_number"]) != "" && qutil.InterfaceToStr(data["invoice_code"]) == "") //非数电票
-            isJyEntity := data["invoicing_entity"] != nil && qutil.InterfaceToStr(data["invoicing_entity"]) != config.InvoiceConfig.SigningSubject
-            data["changed"] = qutil.If(isJyInvoice || isChanged || isJyEntity || timeLimit, true, false)
-            //if url := qutil.InterfaceToStr(data["url"]); url != "" {
-            //ios 移动端
-            //if !isIos {
-            data["url"] = qutil.If(data["source_url"] != nil && qutil.ObjToString(data["source_url"]) != "", data["source_url"], data["url"])
-            //国家税务局-增值税电子发票公共服务平台
-            //if strings.Contains(url, "tysl.beijing.chinatax") {
-            //	data["url"] = strings.ReplaceAll(url, "/preview.html?code=", "/web-reader/reader?file=")
-            //}
-            //}
-            //}
-            isReopen := timeLimit
-            //var isReopen bool
-            if qutil.IntAll(data["invoice_status"]) == -1 && !isReopen {
-                isReopen = util.Mysql.Count("invoice_fail_record", map[string]interface{}{
-                    "only_Identifying": data["only_Identifying"],
-                    "order_code":       order_code,
-                })+1 >= config.InvoiceConfig.SubmitNum
-            }
-            data["only_Identifying"] = encrypt.SE.EncodeString(qutil.InterfaceToStr(data["only_Identifying"]))
-            data["isReopen"] = isReopen
-            invoiceData = append(invoiceData, data)
-        }
-        this.ServeJson(map[string]interface{}{
-            "status":        "success",
-            "invoiceData":   invoiceData,
-            "redSwitchInfo": redSwitchInfo,
-        })
-    } else {
-        data := util.Mysql.FindOne("dataexport_order", map[string]interface{}{
-            "order_code": order_code,
-        }, "order_status,applybill_status,order_code,user_mail,applybill_type,applybill_company,user_phone,applybill_taxnum", "")
-        if data != nil {
-            (*data)["status"] = "fail"
-        }
-
-        this.ServeJson(map[string]interface{}{
-            "status":        "fail",
-            "orderData":     data,
-            "redSwitchInfo": redSwitchInfo,
-        })
-    }
+	order_code := this.GetString("order_code")
+	//红冲发票开关
+	redSwitchInfo := map[string]interface{}{
+		"ris": config.InvoiceConfig.Red_invoice_switch,
+		"rim": config.InvoiceConfig.Red_invoice_msg,
+	}
+	invoices := ShowList(order_code)
+	if invoices != nil && len(invoices) > 0 {
+		//isIos := util.IsMobileIOS(this.Request.UserAgent())
+		var invoiceData []map[string]interface{}
+		for _, data := range invoices {
+			//是否换过票
+			isChanged := qutil.IntAll(data["isChanged"]) > 1
+			if isChanged && qutil.IntAll(data["invoice_changed"]) == 0 { //换过票的 只展示换票后的数据
+				continue
+			}
+			delete(data, "user_id")
+			data["id"] = encrypt.SE.Encode2Hex(qutil.InterfaceToStr(data["id"]))
+			timeLimit := qutil.Int64All(data["create_time"]) <= config.InvoiceConfig.Order_createtime                                //24年之前的发票不让换票
+			isJyInvoice := !(qutil.InterfaceToStr(data["invoice_number"]) != "" && qutil.InterfaceToStr(data["invoice_code"]) == "") //非数电票
+			isJyEntity := data["invoicing_entity"] != nil && qutil.InterfaceToStr(data["invoicing_entity"]) != config.InvoiceConfig.SigningSubject
+			data["changed"] = qutil.If(isJyInvoice || isChanged || isJyEntity || timeLimit, true, false)
+			//if url := qutil.InterfaceToStr(data["url"]); url != "" {
+			//ios 移动端
+			//if !isIos {
+			data["url"] = qutil.If(data["source_url"] != nil && qutil.ObjToString(data["source_url"]) != "", data["source_url"], data["url"])
+			//国家税务局-增值税电子发票公共服务平台
+			//if strings.Contains(url, "tysl.beijing.chinatax") {
+			//	data["url"] = strings.ReplaceAll(url, "/preview.html?code=", "/web-reader/reader?file=")
+			//}
+			//}
+			//}
+			isReopen := timeLimit
+			//var isReopen bool
+			if qutil.IntAll(data["invoice_status"]) == -1 && !isReopen {
+				isReopen = util.Mysql.Count("invoice_fail_record", map[string]interface{}{
+					"only_Identifying": data["only_Identifying"],
+					"order_code":       order_code,
+				})+1 >= config.InvoiceConfig.SubmitNum
+			}
+			data["only_Identifying"] = encrypt.SE.EncodeString(qutil.InterfaceToStr(data["only_Identifying"]))
+			data["isReopen"] = isReopen
+			invoiceData = append(invoiceData, data)
+		}
+		this.ServeJson(map[string]interface{}{
+			"status":        "success",
+			"invoiceData":   invoiceData,
+			"redSwitchInfo": redSwitchInfo,
+		})
+	} else {
+		data := util.Mysql.FindOne("dataexport_order", map[string]interface{}{
+			"order_code": order_code,
+		}, "order_status,applybill_status,order_code,user_mail,applybill_type,applybill_company,user_phone,applybill_taxnum", "")
+		if data != nil {
+			(*data)["status"] = "fail"
+		}
+
+		this.ServeJson(map[string]interface{}{
+			"status":        "fail",
+			"orderData":     data,
+			"redSwitchInfo": redSwitchInfo,
+		})
+	}
 }
 
 func ShowList(order_code string) []map[string]interface{} {
-    data := util.Mysql.SelectBySql(fmt.Sprintf(`SELECT *,(
+	data := util.Mysql.SelectBySql(fmt.Sprintf(`SELECT *,(
   SELECT count(1) as count FROM invoice b WHERE b.order_code = a.order_code and  b.only_Identifying is not null and b.only_Identifying = a.only_Identifying
 ) as isChanged FROM invoice a WHERE order_code = '%s' and invoice_status != -2 and invoice_variety is not null and invoice_variety is not null and invoice_variety not  LIKE '%s' ORDER BY create_time DESC`, order_code, "%纸质%"))
-    if data == nil {
-        return nil
-    }
-    return *data
+	if data == nil {
+		return nil
+	}
+	return *data
 }
 
 func (this *Invoice) NewInvoiceShow() {
-    stype := this.GetString("stype")
-    code := this.GetString("code")
-    data := make(map[string]interface{})
-    var sData map[string]interface{}
-    switch stype {
-    case "1": //订单回显金额
-        payMoney, phone := ResidueMoney(code)
-        data["pay_money"] = payMoney
-        sData = ShowData(phone)
-    case "2": //发票信息回显
-        invoice := util.Mysql.FindOne("invoice", map[string]interface{}{"id": encrypt.SE.Decode4Hex(code)}, "id,only_Identifying,order_code,invoice_order_code,invoice_money,remark,invoice_type,invoice_content,invoice_variety,company_name,phone,mail,taxpayer_identnum,invoice_money,invoice_order_money,company_address,bank_name,recipient,delivery_address,bank_account,company_phone", "")
-        if invoice != nil {
-            (*invoice)["id"] = code
-            if (*invoice)["invoice_order_code"] != nil {
-                (*invoice)["order_code"] = (*invoice)["invoice_order_code"]
-            }
-            (*invoice)["only_Identifying"] = encrypt.SE.EncodeString(qutil.InterfaceToStr((*invoice)["only_Identifying"]))
-        }
-        data["invoice"] = invoice
-    }
-    data["showData"] = sData
-    this.ServeJson(map[string]interface{}{
-        "data": data,
-    })
+	stype := this.GetString("stype")
+	code := this.GetString("code")
+	data := make(map[string]interface{})
+	var sData map[string]interface{}
+	switch stype {
+	case "1": //订单回显金额
+		payMoney, phone := ResidueMoney(code)
+		data["pay_money"] = payMoney
+		sData = ShowData(phone)
+	case "2": //发票信息回显
+		invoice := util.Mysql.FindOne("invoice", map[string]interface{}{"id": encrypt.SE.Decode4Hex(code)}, "id,only_Identifying,order_code,invoice_order_code,invoice_money,remark,invoice_type,invoice_content,invoice_variety,company_name,phone,mail,taxpayer_identnum,invoice_money,invoice_order_money,company_address,bank_name,recipient,delivery_address,bank_account,company_phone", "")
+		if invoice != nil {
+			(*invoice)["id"] = code
+			if (*invoice)["invoice_order_code"] != nil {
+				(*invoice)["order_code"] = (*invoice)["invoice_order_code"]
+			}
+			(*invoice)["only_Identifying"] = encrypt.SE.EncodeString(qutil.InterfaceToStr((*invoice)["only_Identifying"]))
+		}
+		data["invoice"] = invoice
+	}
+	data["showData"] = sData
+	this.ServeJson(map[string]interface{}{
+		"data": data,
+	})
 }
 
 // 开发票回调
 func (this *Invoice) Callbackinvoice() {
-    isRed, _ := this.GetBool("isRed")
-    resType := this.GetString("resType") //红票回调-->"changed":换票 "refund":退票
-    order_code := this.GetString("order_code")
-    applyBill_status := this.GetString("code")
-    fpdm := this.GetString("fpdm")
-    fphm := this.GetString("fphm")
-    path := this.GetString("path")
-    swno := this.GetString("swno")
-    changed := this.GetString("changed")
-    isSys, _ := this.GetBool("isSys") //是否发票系统故障
-    if isSys {
-        q := map[string]interface{}{}
-        q["order_code"] = order_code
-        q["invoice_changed"], _ = strconv.Atoi(changed)
-        sysMap := map[string]interface{}{"invoice_status": -1}
-        ok := util.Mysql.Update(dbname, q, sysMap)
-        if ok {
-            this.ServeJson(map[string]interface{}{
-                "msg":    "发票系统故障回调成功",
-                "status": "success",
-            })
-        }
-        return
-    }
-    if !isRed {
-        if order_code != "" {
-            if changed == "1" {
-                m := make(map[string]interface{})
-                query := make(map[string]interface{})
-                query["order_code"] = order_code
-                query["invoice_changed"] = 1
-                m["invoice_code"] = fpdm
-                m["invoice_number"] = fphm
-                m["url"] = "http://" + path
-                m["invoice_serialnum"] = swno
-                m["invoice_status"] = applyBill_status
-                m["billing_time"] = time.Now().Unix()
-                updata_status := util.Mysql.Update(dbname, query, m)
-                if updata_status {
-                    user_info := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": order_code}, "user_nickname,user_mail", "")
-                    res := util.Mysql.FindOne(dbname, query, "invoice_type,mail,taxpayer_identnum,company_name,phone,url", "")
-                    if (*res)["invoice_type"] == "个人" {
-                        go func() {
-                            var user_mail string
-                            if (*res)["mail"] == nil {
-                                user_mail = (*user_info)["user_mail"].(string)
-                            } else {
-                                user_mail = (*res)["mail"].(string)
-                            }
-                            var url string
-                            if (*res)["url"] == nil {
-                                url = "http://" + path
-                            } else {
-                                url = (*res)["url"].(string)
-                            }
-                            emailHtml := emailHtml_gr
-                            emailHtmls := fmt.Sprintf(emailHtml, (*res)["phone"], user_mail)
-                            html := fmt.Sprintf(email_format, order_code, "电子普通发票", fmt.Sprintf("<a href=\"%s\" download class=\"download\">下载发票</a>", url), "电子普通发票", emailHtmls)
-                            InvoiceSendMail(user_mail, html, "电子发票")
-                        }()
-                    } else {
-                        var company_mail string
-                        if (*res)["mail"] == nil {
-                            company_mail = (*user_info)["user_mail"].(string)
-                        } else {
-                            company_mail = (*res)["mail"].(string)
-                        }
-                        var url string
-                        if (*res)["url"] == nil {
-                            url = "http://" + path
-                        } else {
-                            url = (*res)["url"].(string)
-                        }
-                        emailHtml := emailHtml_gs
-                        emailHtmls := fmt.Sprintf(emailHtml, (*res)["company_name"], (*res)["taxpayer_identnum"], (*res)["phone"], company_mail)
-                        if strings.Contains(order_code, "xx") {
-                            //自助开票
-                            orderCodeArr := util.Mysql.SelectBySql("select   GROUP_CONCAT(order_code) as  order_code  from   invoice  where  only_Identifying=?", order_code)
-                            if len(*orderCodeArr) > 0 {
-                                order_code = qutil.ObjToString((*orderCodeArr)[0]["order_code"])
-                                for _, v := range strings.Split(order_code, ",") {
-                                    //订单信息保存
-                                    updateData := map[string]interface{}{}
-                                    if InvoiceStatusHandle(v) {
-                                        updateData["applybill_status"] = 2
-                                    } else {
-                                        updateData["applybill_status"] = 3
-                                    }
-                                    util.Mysql.Update("dataexport_order", map[string]interface{}{
-                                        "order_code": v,
-                                    }, updateData)
-                                }
-                            }
-                        }
-                        html := fmt.Sprintf(email_format, order_code, "电子普通发票", fmt.Sprintf("<a href=\"%s\" download class=\"download\">下载发票</a>", url), "电子普通发票", emailHtmls)
-                        InvoiceSendMail((*res)["mail"].(string), html, "电子发票")
-
-                    }
-                    this.ServeJson(map[string]interface{}{
-                        "msg":    "状态修改成功",
-                        "status": "success",
-                    })
-                }
-            } else {
-                t := make(map[string]interface{})
-
-                if strings.Contains(order_code, "xx") {
-                    //自助开票
-                    t["only_Identifying"] = order_code
-                } else {
-                    //系统开票
-                    t["order_code"] = order_code
-                }
-                t["invoice_changed"] = 0
-                user_info := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": order_code}, "user_nickname,user_mail", "")
-                res := util.Mysql.FindOne(dbname, t, "invoice_type,mail,taxpayer_identnum,company_name,phone,url", "")
-                if res != nil {
-                    m := make(map[string]interface{})
-                    query := make(map[string]interface{})
-                    if strings.Contains(order_code, "xx") {
-                        //自助开票
-                        query["only_Identifying"] = order_code
-                    } else {
-                        //系统开票
-                        query["order_code"] = order_code
-                    }
-                    query["invoice_changed"] = 0
-                    m["invoice_code"] = fpdm
-                    m["invoice_number"] = fphm
-                    m["url"] = "http://" + path
-                    m["invoice_serialnum"] = swno
-                    m["invoice_status"] = applyBill_status
-                    m["billing_time"] = time.Now().Unix()
-                    updata_status := util.Mysql.Update(dbname, query, m)
-                    if updata_status {
-                        if (*res)["invoice_type"] == "个人" {
-                            go func() {
-                                var user_mail string
-                                if (*res)["mail"] == nil {
-                                    user_mail = (*user_info)["user_mail"].(string)
-                                } else {
-                                    user_mail = (*res)["mail"].(string)
-                                }
-                                var url string
-                                if (*res)["url"] == nil {
-                                    url = "http://" + path
-                                } else {
-                                    url = (*res)["url"].(string)
-                                }
-                                emailHtml := emailHtml_gr
-                                emailHtmls := fmt.Sprintf(emailHtml, (*res)["phone"], user_mail)
-                                if strings.Contains(order_code, "xx") {
-                                    //自助开票
-                                    orderCodeArr := util.Mysql.SelectBySql("select   GROUP_CONCAT(order_code) as  order_code  from   invoice  where  only_Identifying=?", order_code)
-                                    if len(*orderCodeArr) > 0 {
-                                        order_code = qutil.ObjToString((*orderCodeArr)[0]["order_code"])
-                                        for _, v := range strings.Split(order_code, ",") {
-                                            //订单信息保存
-                                            updateData := map[string]interface{}{}
-                                            if InvoiceStatusHandle(v) {
-                                                updateData["applybill_status"] = 2
-                                            } else {
-                                                updateData["applybill_status"] = 3
-                                            }
-                                            util.Mysql.Update("dataexport_order", map[string]interface{}{
-                                                "order_code": v,
-                                            }, updateData)
-                                        }
-                                    }
-
-                                }
-                                html := fmt.Sprintf(email_format, order_code, "电子普通发票", fmt.Sprintf("<a href=\"%s\" download class=\"download\">下载发票</a>", url), "电子普通发票", emailHtmls)
-                                InvoiceSendMail(user_mail, html, "电子发票")
-
-                            }()
-
-                        } else {
-                            var company_mail string
-                            if (*res)["mail"] == nil {
-                                company_mail = (*user_info)["user_mail"].(string)
-                            } else {
-                                company_mail = (*res)["mail"].(string)
-                            }
-                            var url string
-                            if (*res)["url"] == nil {
-                                url = "http://" + path
-                            } else {
-                                url = (*res)["url"].(string)
-                            }
-                            emailHtml := emailHtml_gs
-                            emailHtmls := fmt.Sprintf(emailHtml, (*res)["company_name"], (*res)["taxpayer_identnum"], (*res)["phone"], company_mail)
-                            if strings.Contains(order_code, "xx") {
-                                //自助开票
-                                orderCodeArr := util.Mysql.SelectBySql("select   GROUP_CONCAT(order_code) as  order_code  from   invoice  where  only_Identifying=?", order_code)
-                                if len(*orderCodeArr) > 0 {
-                                    order_code = qutil.ObjToString((*orderCodeArr)[0]["order_code"])
-                                    for _, v := range strings.Split(order_code, ",") {
-                                        //订单信息保存
-                                        updateData := map[string]interface{}{}
-                                        if InvoiceStatusHandle(v) {
-                                            updateData["applybill_status"] = 2
-                                        } else {
-                                            updateData["applybill_status"] = 3
-                                        }
-                                        util.Mysql.Update("dataexport_order", map[string]interface{}{
-                                            "order_code": v,
-                                        }, updateData)
-                                    }
-                                }
-
-                            }
-                            html := fmt.Sprintf(email_format, order_code, "电子普通发票", fmt.Sprintf("<a href=\"%s\" download class=\"download\">下载发票</a>", url), "电子普通发票", emailHtmls)
-                            InvoiceSendMail((*res)["mail"].(string), html, "电子发票")
-
-                        }
-                        this.ServeJson(map[string]interface{}{
-                            "msg":    "状态修改成功",
-                            "status": "success",
-                        })
-                    }
-
-                } else {
-                    this.ServeJson(map[string]interface{}{
-                        "msg":    "订单不存在",
-                        "status": "fail",
-                    })
-                }
-            }
-
-        } else {
-            this.ServeJson(map[string]interface{}{
-                "msg":    "参数缺失",
-                "status": "fail",
-            })
-        }
-    } else {
-        redMap := map[string]interface{}{}
-        query := map[string]interface{}{}
-        if order_code != "" {
-            query["order_code"] = order_code
-            red := RedMsg{
-                fpdm,
-                fphm,
-                "http://" + path,
-                swno,
-                applyBill_status,
-                time.Now().Unix(),
-            }
-            redStr, _ := json.Marshal(red)
-            redMap["red"] = redStr
-            redMap["invoice_status"] = -2
-        }
-        if resType == "changed" {
-            query["invoice_changed"] = 0
-            ok := util.Mysql.Update(dbname, query, redMap)
-            if ok {
-                this.ServeJson(map[string]interface{}{
-                    "msg":    "用户换票冲红保存成功",
-                    "status": "success",
-                })
-            }
-        } else if resType == "refund" {
-            data := util.Mysql.Find(dbname, query, "", "create_time", 0, 0)
-            if len(*data) == 2 {
-                query["invoice_changed"] = 1
-            } else {
-                query["invoice_changed"] = 0
-            }
-            ok := util.Mysql.Update(dbname, query, redMap)
-            if ok {
-                this.ServeJson(map[string]interface{}{
-                    "msg":    "用户退款冲红保存成功",
-                    "status": "success",
-                })
-            }
-        }
-    }
+	isRed, _ := this.GetBool("isRed")
+	resType := this.GetString("resType") //红票回调-->"changed":换票 "refund":退票
+	order_code := this.GetString("order_code")
+	applyBill_status := this.GetString("code")
+	fpdm := this.GetString("fpdm")
+	fphm := this.GetString("fphm")
+	path := this.GetString("path")
+	swno := this.GetString("swno")
+	changed := this.GetString("changed")
+	isSys, _ := this.GetBool("isSys") //是否发票系统故障
+	if isSys {
+		q := map[string]interface{}{}
+		q["order_code"] = order_code
+		q["invoice_changed"], _ = strconv.Atoi(changed)
+		sysMap := map[string]interface{}{"invoice_status": -1}
+		ok := util.Mysql.Update(dbname, q, sysMap)
+		if ok {
+			this.ServeJson(map[string]interface{}{
+				"msg":    "发票系统故障回调成功",
+				"status": "success",
+			})
+		}
+		return
+	}
+	if !isRed {
+		if order_code != "" {
+			if changed == "1" {
+				m := make(map[string]interface{})
+				query := make(map[string]interface{})
+				query["order_code"] = order_code
+				query["invoice_changed"] = 1
+				m["invoice_code"] = fpdm
+				m["invoice_number"] = fphm
+				m["url"] = "http://" + path
+				m["invoice_serialnum"] = swno
+				m["invoice_status"] = applyBill_status
+				m["billing_time"] = time.Now().Unix()
+				updata_status := util.Mysql.Update(dbname, query, m)
+				if updata_status {
+					user_info := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": order_code}, "user_nickname,user_mail", "")
+					res := util.Mysql.FindOne(dbname, query, "invoice_type,mail,taxpayer_identnum,company_name,phone,url", "")
+					if (*res)["invoice_type"] == "个人" {
+						go func() {
+							var user_mail string
+							if (*res)["mail"] == nil {
+								user_mail = (*user_info)["user_mail"].(string)
+							} else {
+								user_mail = (*res)["mail"].(string)
+							}
+							var url string
+							if (*res)["url"] == nil {
+								url = "http://" + path
+							} else {
+								url = (*res)["url"].(string)
+							}
+							emailHtml := emailHtml_gr
+							emailHtmls := fmt.Sprintf(emailHtml, (*res)["phone"], user_mail)
+							html := fmt.Sprintf(email_format, order_code, "电子普通发票", fmt.Sprintf("<a href=\"%s\" download class=\"download\">下载发票</a>", url), "电子普通发票", emailHtmls)
+							InvoiceSendMail(user_mail, html, "电子发票")
+						}()
+					} else {
+						var company_mail string
+						if (*res)["mail"] == nil {
+							company_mail = (*user_info)["user_mail"].(string)
+						} else {
+							company_mail = (*res)["mail"].(string)
+						}
+						var url string
+						if (*res)["url"] == nil {
+							url = "http://" + path
+						} else {
+							url = (*res)["url"].(string)
+						}
+						emailHtml := emailHtml_gs
+						emailHtmls := fmt.Sprintf(emailHtml, (*res)["company_name"], (*res)["taxpayer_identnum"], (*res)["phone"], company_mail)
+						if strings.Contains(order_code, "xx") {
+							//自助开票
+							orderCodeArr := util.Mysql.SelectBySql("select   GROUP_CONCAT(order_code) as  order_code  from   invoice  where  only_Identifying=?", order_code)
+							if len(*orderCodeArr) > 0 {
+								order_code = qutil.ObjToString((*orderCodeArr)[0]["order_code"])
+								for _, v := range strings.Split(order_code, ",") {
+									//订单信息保存
+									updateData := map[string]interface{}{}
+									if InvoiceStatusHandle(v) {
+										updateData["applybill_status"] = 2
+									} else {
+										updateData["applybill_status"] = 3
+									}
+									util.Mysql.Update("dataexport_order", map[string]interface{}{
+										"order_code": v,
+									}, updateData)
+								}
+							}
+						}
+						html := fmt.Sprintf(email_format, order_code, "电子普通发票", fmt.Sprintf("<a href=\"%s\" download class=\"download\">下载发票</a>", url), "电子普通发票", emailHtmls)
+						InvoiceSendMail((*res)["mail"].(string), html, "电子发票")
+
+					}
+					this.ServeJson(map[string]interface{}{
+						"msg":    "状态修改成功",
+						"status": "success",
+					})
+				}
+			} else {
+				t := make(map[string]interface{})
+
+				if strings.Contains(order_code, "xx") {
+					//自助开票
+					t["only_Identifying"] = order_code
+				} else {
+					//系统开票
+					t["order_code"] = order_code
+				}
+				t["invoice_changed"] = 0
+				user_info := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": order_code}, "user_nickname,user_mail", "")
+				res := util.Mysql.FindOne(dbname, t, "invoice_type,mail,taxpayer_identnum,company_name,phone,url", "")
+				if res != nil {
+					m := make(map[string]interface{})
+					query := make(map[string]interface{})
+					if strings.Contains(order_code, "xx") {
+						//自助开票
+						query["only_Identifying"] = order_code
+					} else {
+						//系统开票
+						query["order_code"] = order_code
+					}
+					query["invoice_changed"] = 0
+					m["invoice_code"] = fpdm
+					m["invoice_number"] = fphm
+					m["url"] = "http://" + path
+					m["invoice_serialnum"] = swno
+					m["invoice_status"] = applyBill_status
+					m["billing_time"] = time.Now().Unix()
+					updata_status := util.Mysql.Update(dbname, query, m)
+					if updata_status {
+						if (*res)["invoice_type"] == "个人" {
+							go func() {
+								var user_mail string
+								if (*res)["mail"] == nil {
+									user_mail = (*user_info)["user_mail"].(string)
+								} else {
+									user_mail = (*res)["mail"].(string)
+								}
+								var url string
+								if (*res)["url"] == nil {
+									url = "http://" + path
+								} else {
+									url = (*res)["url"].(string)
+								}
+								emailHtml := emailHtml_gr
+								emailHtmls := fmt.Sprintf(emailHtml, (*res)["phone"], user_mail)
+								if strings.Contains(order_code, "xx") {
+									//自助开票
+									orderCodeArr := util.Mysql.SelectBySql("select   GROUP_CONCAT(order_code) as  order_code  from   invoice  where  only_Identifying=?", order_code)
+									if len(*orderCodeArr) > 0 {
+										order_code = qutil.ObjToString((*orderCodeArr)[0]["order_code"])
+										for _, v := range strings.Split(order_code, ",") {
+											//订单信息保存
+											updateData := map[string]interface{}{}
+											if InvoiceStatusHandle(v) {
+												updateData["applybill_status"] = 2
+											} else {
+												updateData["applybill_status"] = 3
+											}
+											util.Mysql.Update("dataexport_order", map[string]interface{}{
+												"order_code": v,
+											}, updateData)
+										}
+									}
+
+								}
+								html := fmt.Sprintf(email_format, order_code, "电子普通发票", fmt.Sprintf("<a href=\"%s\" download class=\"download\">下载发票</a>", url), "电子普通发票", emailHtmls)
+								InvoiceSendMail(user_mail, html, "电子发票")
+
+							}()
+
+						} else {
+							var company_mail string
+							if (*res)["mail"] == nil {
+								company_mail = (*user_info)["user_mail"].(string)
+							} else {
+								company_mail = (*res)["mail"].(string)
+							}
+							var url string
+							if (*res)["url"] == nil {
+								url = "http://" + path
+							} else {
+								url = (*res)["url"].(string)
+							}
+							emailHtml := emailHtml_gs
+							emailHtmls := fmt.Sprintf(emailHtml, (*res)["company_name"], (*res)["taxpayer_identnum"], (*res)["phone"], company_mail)
+							if strings.Contains(order_code, "xx") {
+								//自助开票
+								orderCodeArr := util.Mysql.SelectBySql("select   GROUP_CONCAT(order_code) as  order_code  from   invoice  where  only_Identifying=?", order_code)
+								if len(*orderCodeArr) > 0 {
+									order_code = qutil.ObjToString((*orderCodeArr)[0]["order_code"])
+									for _, v := range strings.Split(order_code, ",") {
+										//订单信息保存
+										updateData := map[string]interface{}{}
+										if InvoiceStatusHandle(v) {
+											updateData["applybill_status"] = 2
+										} else {
+											updateData["applybill_status"] = 3
+										}
+										util.Mysql.Update("dataexport_order", map[string]interface{}{
+											"order_code": v,
+										}, updateData)
+									}
+								}
+
+							}
+							html := fmt.Sprintf(email_format, order_code, "电子普通发票", fmt.Sprintf("<a href=\"%s\" download class=\"download\">下载发票</a>", url), "电子普通发票", emailHtmls)
+							InvoiceSendMail((*res)["mail"].(string), html, "电子发票")
+
+						}
+						this.ServeJson(map[string]interface{}{
+							"msg":    "状态修改成功",
+							"status": "success",
+						})
+					}
+
+				} else {
+					this.ServeJson(map[string]interface{}{
+						"msg":    "订单不存在",
+						"status": "fail",
+					})
+				}
+			}
+
+		} else {
+			this.ServeJson(map[string]interface{}{
+				"msg":    "参数缺失",
+				"status": "fail",
+			})
+		}
+	} else {
+		redMap := map[string]interface{}{}
+		query := map[string]interface{}{}
+		if order_code != "" {
+			query["order_code"] = order_code
+			red := RedMsg{
+				fpdm,
+				fphm,
+				"http://" + path,
+				swno,
+				applyBill_status,
+				time.Now().Unix(),
+			}
+			redStr, _ := json.Marshal(red)
+			redMap["red"] = redStr
+			redMap["invoice_status"] = -2
+		}
+		if resType == "changed" {
+			query["invoice_changed"] = 0
+			ok := util.Mysql.Update(dbname, query, redMap)
+			if ok {
+				this.ServeJson(map[string]interface{}{
+					"msg":    "用户换票冲红保存成功",
+					"status": "success",
+				})
+			}
+		} else if resType == "refund" {
+			data := util.Mysql.Find(dbname, query, "", "create_time", 0, 0)
+			if len(*data) == 2 {
+				query["invoice_changed"] = 1
+			} else {
+				query["invoice_changed"] = 0
+			}
+			ok := util.Mysql.Update(dbname, query, redMap)
+			if ok {
+				this.ServeJson(map[string]interface{}{
+					"msg":    "用户退款冲红保存成功",
+					"status": "success",
+				})
+			}
+		}
+	}
 }
 
 // 换票
 func (this *Invoice) Replaceinvoice() {
-    //红冲开关
-    if !config.InvoiceConfig.Red_invoice_switch {
-        this.ServeJson(map[string]interface{}{
-            "invoice_status": -1,
-            "invoice_msg":    config.InvoiceConfig.Red_invoice_msg,
-        })
-        return
-    }
-    userId := qutil.ObjToString(this.GetSession("userId"))
-    order_code := this.GetString("order_code")
-    isSys, _ := this.GetBool("isSys")
-    res := util.Mysql.FindOne(dbname, map[string]interface{}{"order_code": order_code, "user_id": userId, "invoice_changed": 0}, "", "") //仅线上开发票可换票
-    if res != nil {
-        order_res := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": order_code, "user_id": userId, "applyBill_status": map[string]interface{}{"ne": 2}}, "order_money,product_type,user_nickname,user_mail", "")
-        invoice_type := this.GetString("invoice_type")
-        phone := this.GetString("phone_num")
-        e_mail := this.GetString("email")
-        company_name := this.GetString("company")
-        id_num := strings.ToUpper(this.GetString("id_num")) //纳税人识别号
-        if invoice_type == "个人" {
-            if phone == (*res)["phone"] && e_mail == (*res)["mail"] && (*res)["invoice_type"] == "个人" {
-                emailHtml := emailHtml_gr
-                emailHtmls := fmt.Sprintf(emailHtml, phone, e_mail)
-                html := fmt.Sprintf(email_format, order_code, (*res)["url"], emailHtmls)
-                m := make(map[string]interface{})
-                m["order_code"] = order_code
-                m["invoice_changed"] = 1
-                m["invoice_code"] = (*res)["invoice_code"]
-                m["invoice_number"] = (*res)["invoice_number"]
-                m["url"] = (*res)["url"]
-                m["invoice_serialnum"] = (*res)["invoice_serialnum"]
-                m["invoice_status"] = 1
-                m["billing_time"] = time.Now().Unix()
-                m["mail"] = (*res)["mail"]
-                m["phone"] = (*res)["phone"]
-                m["invoice_type"] = (*res)["invoice_type"]
-                m["company_name"] = (*res)["company_name"]
-                m["taxpayer_identnum"] = (*res)["taxpayer_identnum"]
-                m["create_time"] = time.Now().Unix()
-                m["product_type"] = (*res)["product_type"]
-                m["user_id"] = userId
-                if !isSys {
-                    status := util.Mysql.Find(dbname, map[string]interface{}{"order_code": order_code, "user_id": userId}, "", "create_time", 0, 0)
-                    if len(*status) > 1 {
-                        return
-                    }
-                    order_id := util.Mysql.Insert(dbname, m)
-                    if order_id != -1 {
-                        this.ServeJson(map[string]interface{}{
-                            "invoice_status": 1,
-                        })
-                    }
-                } else {
-                    query := map[string]interface{}{}
-                    query["user_id"] = userId
-                    query["order_code"] = order_code
-                    query["invoice_changed"] = 1
-                    ok := util.Mysql.Update(dbname, query, m)
-                    if ok {
-                        this.ServeJson(map[string]interface{}{
-                            "invoice_status": 1,
-                        })
-                    }
-                }
-                InvoiceSendMail((*res)["mail"].(string), html, "电子发票")
-                return
-            }
-        } else {
-            if phone == (*res)["phone"] && e_mail == (*res)["mail"] && id_num == (*res)["taxpayer_identnum"] && company_name == (*res)["company_name"] && (*res)["invoice_type"] == "单位" {
-                emailHtml := emailHtml_gs
-                emailHtmls := fmt.Sprintf(emailHtml, (*res)["company_name"], (*res)["taxpayer_identnum"], (*res)["phone"], e_mail)
-                html := fmt.Sprintf(email_format, order_code, (*res)["url"], emailHtmls)
-                m := make(map[string]interface{})
-                m["order_code"] = order_code
-                m["invoice_changed"] = 1
-                m["invoice_code"] = (*res)["invoice_code"]
-                m["invoice_number"] = (*res)["invoice_number"]
-                m["url"] = (*res)["url"]
-                m["invoice_serialnum"] = (*res)["invoice_serialnum"]
-                m["invoice_status"] = 1
-                m["billing_time"] = time.Now().Unix()
-                m["mail"] = (*res)["mail"]
-                m["phone"] = (*res)["phone"]
-                m["invoice_type"] = (*res)["invoice_type"]
-                m["company_name"] = (*res)["company_name"]
-                m["taxpayer_identnum"] = (*res)["taxpayer_identnum"]
-                m["create_time"] = time.Now().Unix()
-                m["product_type"] = (*res)["product_type"]
-                m["user_id"] = userId
-                if !isSys {
-                    status := util.Mysql.Find(dbname, map[string]interface{}{"order_code": order_code, "user_id": userId}, "", "create_time", 0, 0)
-                    if len(*status) > 1 {
-                        return
-                    }
-                    order_id := util.Mysql.Insert(dbname, m)
-                    if order_id != -1 {
-                        this.ServeJson(map[string]interface{}{
-                            "invoice_status": 1,
-                        })
-                    }
-                } else {
-                    query := map[string]interface{}{}
-                    query["user_id"] = userId
-                    query["order_code"] = order_code
-                    query["invoice_changed"] = 1
-                    ok := util.Mysql.Update(dbname, query, m)
-                    if ok {
-                        this.ServeJson(map[string]interface{}{
-                            "invoice_status": 1,
-                        })
-                    }
-                }
-                InvoiceSendMail((*res)["mail"].(string), html, "电子发票")
-                return
-            }
-        }
-        invoice_status := 0
-        dataexport_data := make(map[string]interface{})
-        if invoice_type == "个人" {
-            dataexport_data["applyBill_type"] = 0
-            dataexport_data["applyBill_taxnum"] = ""
-            dataexport_data["applybill_company"] = ""
-        } else {
-            dataexport_data["applyBill_type"] = 1
-            dataexport_data["applyBill_taxnum"] = id_num
-            dataexport_data["applybill_company"] = company_name
-        }
-        dataexport_data["user_mail"] = e_mail
-        util.Mysql.Update("dataexport_order", map[string]interface{}{"order_code": order_code, "user_id": userId}, dataexport_data)
-        data := make(map[string]interface{})
-        data["order_code"] = order_code
-        data["mail"] = e_mail
-        data["phone"] = phone
-        data["invoice_type"] = invoice_type
-        data["company_name"] = company_name
-        data["taxpayer_identnum"] = id_num
-        data["invoice_changed"] = 1
-        data["create_time"] = time.Now().Unix()
-        data["user_id"] = userId
-        data["invoice_status"] = invoice_status
-        data["product_type"] = (*res)["product_type"]
-        if !isSys {
-            status := util.Mysql.Find(dbname, map[string]interface{}{"order_code": order_code, "user_id": userId}, "", "create_time", 0, 0)
-            if len(*status) == 0 {
-                if id := util.Mysql.Insert(dbname, data); id > 0 {
-                    invoice_status = 1
-                }
-            } else {
-                invoice_status = 1
-            }
-        } else {
-            if ok := util.Mysql.Update(dbname, map[string]interface{}{
-                "order_code":      order_code,
-                "user_id":         userId,
-                "invoice_changed": 1,
-            }, data); ok {
-                invoice_status = 1
-            }
-        }
-        if !config.InvoiceConfig.Third_party_switch {
-            this.ServeJson(map[string]interface{}{
-                "invoice_status": invoice_status,
-            })
-            return
-        }
-        var orders = []map[string]interface{}{}
-        var items = []map[string]interface{}{}
-        prices := qutil.Float64All((*order_res)["order_money"]) / float64(100)
-        price := strconv.FormatFloat(prices, 'f', -1, 64)
-        item := map[string]interface{}{
-            "name":        (*order_res)["product_type"],
-            "code":        config.InvoiceConfig.Code,
-            "yhzcbs":      config.InvoiceConfig.Tax_policy,
-            "lineType":    config.InvoiceConfig.Invoice_nature,
-            "taxRate":     config.InvoiceConfig.Tax_rate,
-            "taxPrice":    price,
-            "totalAmount": price,
-            "quantity":    "1",
-            "phone":       phone,
-            "billDate":    NowFormat(Date_Full_Layout), //单据日期  格式:yyyy-MM-dd HH:mm:ss
-        }
-        items = append(items, item)
-        order := map[string]interface{}{
-            "billNo": order_code,
-            "items":  items,
-        }
-        orders = append(orders, order)
-        client := &http.Client{}
-        body := map[string]interface{}{
-            "Swno":      order_code,
-            "custType":  "03",
-            "orders":    orders,
-            "custTaxNo": id_num,
-            "yfphm":     (*res)["invoice_number"],
-            "yfpdm":     (*res)["invoice_code"],
-            "changed":   "1",
-            "phone":     phone,
-            "redcode":   (*res)["invoice_serialnum"],
-        }
-        if invoice_type == "单位" {
-            body["custName"] = company_name
-        } else {
-            body["custName"] = invoice_type
-        }
-        b, _ := json.Marshal(body)
-        buffer := bytes.NewBuffer(b)
-        request, err := http.NewRequest("POST", config.InvoiceConfig.Invoice_interface_address+"/Invoice/Replace", buffer)
-        if err == nil {
-            var invoice_status = 0
-            invoice_res := &InvoiceInfo{}
-            response, err1 := client.Do(request)
-            if err1 != nil {
-                invoice_status = -1
-            } else {
-                res, err := ioutil.ReadAll(response.Body)
-                defer response.Body.Close()
-                if err != nil {
-                    invoice_status = -1
-                } else {
-                    resMap := qutil.ObjToMap(string(res))
-                    if *resMap != nil {
-                        if qutil.IntAll((*resMap)["code"]) == 1 {
-                            invoice_status = -1
-                        }
-                    }
-                    err := json.Unmarshal(res, invoice_res)
-                    if err != nil {
-                        log.Println("序列化出错", err)
-                    } else {
-                        if invoice_res.data["path"] != nil {
-                            invoice_status = 1
-                        }
-                        if invoice_res == nil {
-                            invoice_status = -1
-                        }
-                    }
-                }
-            }
-            updata_status := true
-            if invoice_status == -1 {
-                if !delReplaceInvoice(map[string]interface{}{"order_code": order_code, "invoice_changed": 1}) {
-                    log.Printf("delete replace invoice err: %s", order_code)
-                }
-            } else {
-                updata_status = util.Mysql.Update(dbname, map[string]interface{}{"order_code": order_code, "invoice_changed": 1}, map[string]interface{}{
-                    "invoice_serialnum": invoice_res.data["swno"],
-                    "invoice_code":      invoice_res.data["fpdm"],
-                    "invoice_number":    invoice_res.data["fphm"],
-                    "url":               invoice_res.data["path"],
-                    "invoice_status":    invoice_status,
-                })
-            }
-            if updata_status {
-                this.ServeJson(map[string]interface{}{
-                    "invoice_status": invoice_status,
-                })
-            } else {
-                this.ServeJson(map[string]interface{}{
-                    "invoice_status": 0,
-                })
-            }
-        } else {
-            go func() {
-                //删除该错误发票信息
-                // util.Mysql.Update(dbname, map[string]interface{}{"order_code": order_code, "invoice_changed": 1}, map[string]interface{}{
-                // 	"invoice_status": -1,
-                // })
-                if !delReplaceInvoice(map[string]interface{}{"order_code": order_code, "invoice_changed": 1}) {
-                    log.Printf("delete go func replace invoice err: %s", order_code)
-                }
-            }()
-
-            this.ServeJson(map[string]interface{}{
-                "invoice_status": -1,
-            })
-        }
-    }
+	//红冲开关
+	if !config.InvoiceConfig.Red_invoice_switch {
+		this.ServeJson(map[string]interface{}{
+			"invoice_status": -1,
+			"invoice_msg":    config.InvoiceConfig.Red_invoice_msg,
+		})
+		return
+	}
+	userId := qutil.ObjToString(this.GetSession("userId"))
+	order_code := this.GetString("order_code")
+	isSys, _ := this.GetBool("isSys")
+	res := util.Mysql.FindOne(dbname, map[string]interface{}{"order_code": order_code, "user_id": userId, "invoice_changed": 0}, "", "") //仅线上开发票可换票
+	if res != nil {
+		order_res := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": order_code, "user_id": userId, "applyBill_status": map[string]interface{}{"ne": 2}}, "order_money,product_type,user_nickname,user_mail", "")
+		invoice_type := this.GetString("invoice_type")
+		phone := this.GetString("phone_num")
+		e_mail := this.GetString("email")
+		company_name := this.GetString("company")
+		id_num := strings.ToUpper(this.GetString("id_num")) //纳税人识别号
+		if invoice_type == "个人" {
+			if phone == (*res)["phone"] && e_mail == (*res)["mail"] && (*res)["invoice_type"] == "个人" {
+				emailHtml := emailHtml_gr
+				emailHtmls := fmt.Sprintf(emailHtml, phone, e_mail)
+				html := fmt.Sprintf(email_format, order_code, (*res)["url"], emailHtmls)
+				m := make(map[string]interface{})
+				m["order_code"] = order_code
+				m["invoice_changed"] = 1
+				m["invoice_code"] = (*res)["invoice_code"]
+				m["invoice_number"] = (*res)["invoice_number"]
+				m["url"] = (*res)["url"]
+				m["invoice_serialnum"] = (*res)["invoice_serialnum"]
+				m["invoice_status"] = 1
+				m["billing_time"] = time.Now().Unix()
+				m["mail"] = (*res)["mail"]
+				m["phone"] = (*res)["phone"]
+				m["invoice_type"] = (*res)["invoice_type"]
+				m["company_name"] = (*res)["company_name"]
+				m["taxpayer_identnum"] = (*res)["taxpayer_identnum"]
+				m["create_time"] = time.Now().Unix()
+				m["product_type"] = (*res)["product_type"]
+				m["user_id"] = userId
+				if !isSys {
+					status := util.Mysql.Find(dbname, map[string]interface{}{"order_code": order_code, "user_id": userId}, "", "create_time", 0, 0)
+					if len(*status) > 1 {
+						return
+					}
+					order_id := util.Mysql.Insert(dbname, m)
+					if order_id != -1 {
+						this.ServeJson(map[string]interface{}{
+							"invoice_status": 1,
+						})
+					}
+				} else {
+					query := map[string]interface{}{}
+					query["user_id"] = userId
+					query["order_code"] = order_code
+					query["invoice_changed"] = 1
+					ok := util.Mysql.Update(dbname, query, m)
+					if ok {
+						this.ServeJson(map[string]interface{}{
+							"invoice_status": 1,
+						})
+					}
+				}
+				InvoiceSendMail((*res)["mail"].(string), html, "电子发票")
+				return
+			}
+		} else {
+			if phone == (*res)["phone"] && e_mail == (*res)["mail"] && id_num == (*res)["taxpayer_identnum"] && company_name == (*res)["company_name"] && (*res)["invoice_type"] == "单位" {
+				emailHtml := emailHtml_gs
+				emailHtmls := fmt.Sprintf(emailHtml, (*res)["company_name"], (*res)["taxpayer_identnum"], (*res)["phone"], e_mail)
+				html := fmt.Sprintf(email_format, order_code, (*res)["url"], emailHtmls)
+				m := make(map[string]interface{})
+				m["order_code"] = order_code
+				m["invoice_changed"] = 1
+				m["invoice_code"] = (*res)["invoice_code"]
+				m["invoice_number"] = (*res)["invoice_number"]
+				m["url"] = (*res)["url"]
+				m["invoice_serialnum"] = (*res)["invoice_serialnum"]
+				m["invoice_status"] = 1
+				m["billing_time"] = time.Now().Unix()
+				m["mail"] = (*res)["mail"]
+				m["phone"] = (*res)["phone"]
+				m["invoice_type"] = (*res)["invoice_type"]
+				m["company_name"] = (*res)["company_name"]
+				m["taxpayer_identnum"] = (*res)["taxpayer_identnum"]
+				m["create_time"] = time.Now().Unix()
+				m["product_type"] = (*res)["product_type"]
+				m["user_id"] = userId
+				if !isSys {
+					status := util.Mysql.Find(dbname, map[string]interface{}{"order_code": order_code, "user_id": userId}, "", "create_time", 0, 0)
+					if len(*status) > 1 {
+						return
+					}
+					order_id := util.Mysql.Insert(dbname, m)
+					if order_id != -1 {
+						this.ServeJson(map[string]interface{}{
+							"invoice_status": 1,
+						})
+					}
+				} else {
+					query := map[string]interface{}{}
+					query["user_id"] = userId
+					query["order_code"] = order_code
+					query["invoice_changed"] = 1
+					ok := util.Mysql.Update(dbname, query, m)
+					if ok {
+						this.ServeJson(map[string]interface{}{
+							"invoice_status": 1,
+						})
+					}
+				}
+				InvoiceSendMail((*res)["mail"].(string), html, "电子发票")
+				return
+			}
+		}
+		invoice_status := 0
+		dataexport_data := make(map[string]interface{})
+		if invoice_type == "个人" {
+			dataexport_data["applyBill_type"] = 0
+			dataexport_data["applyBill_taxnum"] = ""
+			dataexport_data["applybill_company"] = ""
+		} else {
+			dataexport_data["applyBill_type"] = 1
+			dataexport_data["applyBill_taxnum"] = id_num
+			dataexport_data["applybill_company"] = company_name
+		}
+		dataexport_data["user_mail"] = e_mail
+		util.Mysql.Update("dataexport_order", map[string]interface{}{"order_code": order_code, "user_id": userId}, dataexport_data)
+		data := make(map[string]interface{})
+		data["order_code"] = order_code
+		data["mail"] = e_mail
+		data["phone"] = phone
+		data["invoice_type"] = invoice_type
+		data["company_name"] = company_name
+		data["taxpayer_identnum"] = id_num
+		data["invoice_changed"] = 1
+		data["create_time"] = time.Now().Unix()
+		data["user_id"] = userId
+		data["invoice_status"] = invoice_status
+		data["product_type"] = (*res)["product_type"]
+		if !isSys {
+			status := util.Mysql.Find(dbname, map[string]interface{}{"order_code": order_code, "user_id": userId}, "", "create_time", 0, 0)
+			if len(*status) == 0 {
+				if id := util.Mysql.Insert(dbname, data); id > 0 {
+					invoice_status = 1
+				}
+			} else {
+				invoice_status = 1
+			}
+		} else {
+			if ok := util.Mysql.Update(dbname, map[string]interface{}{
+				"order_code":      order_code,
+				"user_id":         userId,
+				"invoice_changed": 1,
+			}, data); ok {
+				invoice_status = 1
+			}
+		}
+		if !config.InvoiceConfig.Third_party_switch {
+			this.ServeJson(map[string]interface{}{
+				"invoice_status": invoice_status,
+			})
+			return
+		}
+		var orders = []map[string]interface{}{}
+		var items = []map[string]interface{}{}
+		prices := qutil.Float64All((*order_res)["order_money"]) / float64(100)
+		price := strconv.FormatFloat(prices, 'f', -1, 64)
+		item := map[string]interface{}{
+			"name":        (*order_res)["product_type"],
+			"code":        config.InvoiceConfig.Code,
+			"yhzcbs":      config.InvoiceConfig.Tax_policy,
+			"lineType":    config.InvoiceConfig.Invoice_nature,
+			"taxRate":     config.InvoiceConfig.Tax_rate,
+			"taxPrice":    price,
+			"totalAmount": price,
+			"quantity":    "1",
+			"phone":       phone,
+			"billDate":    NowFormat(Date_Full_Layout), //单据日期  格式:yyyy-MM-dd HH:mm:ss
+		}
+		items = append(items, item)
+		order := map[string]interface{}{
+			"billNo": order_code,
+			"items":  items,
+		}
+		orders = append(orders, order)
+		client := &http.Client{}
+		body := map[string]interface{}{
+			"Swno":      order_code,
+			"custType":  "03",
+			"orders":    orders,
+			"custTaxNo": id_num,
+			"yfphm":     (*res)["invoice_number"],
+			"yfpdm":     (*res)["invoice_code"],
+			"changed":   "1",
+			"phone":     phone,
+			"redcode":   (*res)["invoice_serialnum"],
+		}
+		if invoice_type == "单位" {
+			body["custName"] = company_name
+		} else {
+			body["custName"] = invoice_type
+		}
+		b, _ := json.Marshal(body)
+		buffer := bytes.NewBuffer(b)
+		request, err := http.NewRequest("POST", config.InvoiceConfig.Invoice_interface_address+"/Invoice/Replace", buffer)
+		if err == nil {
+			var invoice_status = 0
+			invoice_res := &InvoiceInfo{}
+			response, err1 := client.Do(request)
+			if err1 != nil {
+				invoice_status = -1
+			} else {
+				res, err := ioutil.ReadAll(response.Body)
+				defer response.Body.Close()
+				if err != nil {
+					invoice_status = -1
+				} else {
+					resMap := qutil.ObjToMap(string(res))
+					if *resMap != nil {
+						if qutil.IntAll((*resMap)["code"]) == 1 {
+							invoice_status = -1
+						}
+					}
+					err := json.Unmarshal(res, invoice_res)
+					if err != nil {
+						log.Println("序列化出错", err)
+					} else {
+						if invoice_res.data["path"] != nil {
+							invoice_status = 1
+						}
+						if invoice_res == nil {
+							invoice_status = -1
+						}
+					}
+				}
+			}
+			updata_status := true
+			if invoice_status == -1 {
+				if !delReplaceInvoice(map[string]interface{}{"order_code": order_code, "invoice_changed": 1}) {
+					log.Printf("delete replace invoice err: %s", order_code)
+				}
+			} else {
+				updata_status = util.Mysql.Update(dbname, map[string]interface{}{"order_code": order_code, "invoice_changed": 1}, map[string]interface{}{
+					"invoice_serialnum": invoice_res.data["swno"],
+					"invoice_code":      invoice_res.data["fpdm"],
+					"invoice_number":    invoice_res.data["fphm"],
+					"url":               invoice_res.data["path"],
+					"invoice_status":    invoice_status,
+				})
+			}
+			if updata_status {
+				this.ServeJson(map[string]interface{}{
+					"invoice_status": invoice_status,
+				})
+			} else {
+				this.ServeJson(map[string]interface{}{
+					"invoice_status": 0,
+				})
+			}
+		} else {
+			go func() {
+				//删除该错误发票信息
+				// util.Mysql.Update(dbname, map[string]interface{}{"order_code": order_code, "invoice_changed": 1}, map[string]interface{}{
+				// 	"invoice_status": -1,
+				// })
+				if !delReplaceInvoice(map[string]interface{}{"order_code": order_code, "invoice_changed": 1}) {
+					log.Printf("delete go func replace invoice err: %s", order_code)
+				}
+			}()
+
+			this.ServeJson(map[string]interface{}{
+				"invoice_status": -1,
+			})
+		}
+	}
 
 }
 
 // 新换票
 func (this *Invoice) NewReplaceinvoice() {
-    //红冲开关
-    if !config.InvoiceConfig.Red_invoice_switch {
-        this.ServeJson(map[string]interface{}{
-            "invoice_status": -1,
-            "invoice_msg":    config.InvoiceConfig.Red_invoice_msg,
-        })
-        return
-    }
-    invoice_type := this.GetString("invoice_type")
-    phone := this.GetString("phone")
-    e_mail := this.GetString("mail")
-    company_name := this.GetString("company_name")
-    id_num := strings.ToUpper(this.GetString("taxpayer_identnum")) //纳税人识别号
-    invoiceContent := this.GetString("invoiceContent")
-    remark := this.GetString("remark")
-    invoiceVariety := this.GetString("invoice_variety")
-    invoice_status := 0
-    //userId := qutil.ObjToString(this.GetSession("userId"))  支持扫描换票
-    //order_code := this.GetString("order_code")
-    sid := encrypt.SE.Decode4Hex(this.GetString("sid"))
-    oRes := util.Mysql.FindOne(dbname, map[string]interface{}{"id": sid, "invoice_changed": 0, "invoice_status": 1}, "", "") //仅线上开发票可换票
-    if oRes != nil && len(*oRes) > 0 &&
-        ((*oRes)["invoicing_entity"] == nil || qutil.InterfaceToStr((*oRes)["invoicing_entity"]) == config.InvoiceConfig.SigningSubject) {
-        var (
-            qSql    string
-            errCode []string
-            //saveData []map[string]interface{}
-            resArr []map[string]interface{}
-        )
-        pCode := qutil.InterfaceToStr((*oRes)["order_code"])
-        //多订单联合开票
-        if invoice_order_code := qutil.InterfaceToStr((*oRes)["invoice_order_code"]); len(strings.Split(invoice_order_code, ",")) > 1 {
-            pCode = invoice_order_code
-            qSql = fmt.Sprintf(`SELECT * FROM invoice WHERE invoice_order_code = '%s' and invoice_changed = 0 and invoice_status = 1`, qutil.InterfaceToStr((*oRes)["invoice_order_code"]))
-            res1 := util.Mysql.SelectBySql(qSql)
-            if res1 != nil && len(*res1) > 0 {
-                resArr = *res1
-            }
-        } else {
-            resArr = append(resArr, *oRes)
-        }
-        var isMail bool
-        tm := time.Now()
-        for _, res := range resArr {
-            if res["only_Identifying"] == nil { //无唯一id 允许换票一次 生成唯一id
-                newUuid := uuid.New()
-                res["only_Identifying"] = newUuid
-                util.Mysql.Update(dbname, map[string]interface{}{"id": res["id"]}, map[string]interface{}{"only_Identifying": newUuid, "invoice_status": -2})
-            } else if util.Mysql.Count(dbname, map[string]interface{}{
-                "order_code":       res["order_code"],
-                "user_id":          res["user_id"],
-                "only_Identifying": res["only_Identifying"],
-            }) > 1 {
-                continue
-            }
-
-            res["company_phone"] = this.GetString("company_phone")
-            res["operable_time"] = FormatDate(&tm, Date_Full_Layout)
-            res["bank_account"] = this.GetString("bank_account")
-            res["company_address"] = this.GetString("company_address")
-            res["bank_name"] = this.GetString("bank_name")
-            res["recipient"] = this.GetString("recipient")
-            res["delivery_address"] = this.GetString("delivery_address")
-            data := res
-            delete(data, "id")
-            switch IsEdit(res, phone, e_mail, id_num, company_name, invoice_type, invoiceContent, remark, invoiceVariety) {
-            case true:
-                this.ServeJson(map[string]interface{}{
-                    "invoice_status": -1,
-                    "invoice_msg":    "开票信息未修改,不允许提交",
-                })
-                return
-                data["phone"] = phone
-                data["mail"] = e_mail
-                data["invoice_content"] = invoiceContent
-                data["company_name"] = company_name
-                data["invoice_type"] = invoice_type
-                data["taxpayer_identnum"] = id_num
-                data["remark"] = remark
-                data["invoice_variety"] = invoiceVariety
-                //var html string
-                //if invoice_type == "个人" {
-                //	emailHtml := emailHtml_gr
-                //	emailHtmls := fmt.Sprintf(emailHtml, phone, e_mail)
-                //	html = fmt.Sprintf(email_format, data["order_code"], data["url"], emailHtmls)
-                //} else {
-                //	emailHtml := emailHtml_gs
-                //	emailHtmls := fmt.Sprintf(emailHtml, company_name, id_num, phone, e_mail)
-                //	html = fmt.Sprintf(email_format, data["order_code"], data["url"], emailHtmls)
-                //}
-                data["invoice_changed"] = 1
-                data["invoice_status"] = 1
-                data["billing_time"] = tm.Unix()
-                data["create_time"] = tm.Unix()
-                order_id := util.Mysql.Insert(dbname, data)
-                if order_id == -1 {
-                    errCode = append(errCode, fmt.Sprintf("%s_%s", data["order_code"], data["invoice_order_code"]))
-                }
-                if !isMail { //成功发邮件
-                    isMail = true
-                    sendMail(invoice_type, pCode, company_name, id_num, e_mail, phone, qutil.InterfaceToStr(data["source_url"]), invoiceContent)
-                    //InvoiceSendMail(data["mail"].(string), html, "电子发票")
-                }
-            case false:
-                if !config.InvoiceConfig.Third_party_switch {
-                    this.ServeJson(map[string]interface{}{
-                        "error_code": -2,
-                        "error_msg":  "暂不支持换票",
-                    })
-                    return
-                }
-                data["phone"] = phone
-                data["mail"] = e_mail
-                data["invoice_content"] = invoiceContent
-                data["company_name"] = company_name
-                data["invoice_type"] = invoice_type
-                data["taxpayer_identnum"] = id_num
-                data["remark"] = remark
-                data["invoice_variety"] = invoiceVariety
-                dataexport_data := make(map[string]interface{})
-                if invoice_type == "个人" {
-                    dataexport_data["applyBill_type"] = 0
-                    dataexport_data["applyBill_taxnum"] = ""
-                    dataexport_data["applybill_company"] = ""
-                } else {
-                    dataexport_data["applyBill_type"] = 1
-                    dataexport_data["applyBill_taxnum"] = id_num
-                    dataexport_data["applybill_company"] = company_name
-                }
-                dataexport_data["user_mail"] = e_mail
-                util.Mysql.Update("dataexport_order", map[string]interface{}{"order_code": res["order_code"]}, dataexport_data)
-                data["mail"] = e_mail
-                data["phone"] = phone
-                data["invoice_type"] = invoice_type
-                data["company_name"] = company_name
-                data["taxpayer_identnum"] = id_num
-                data["invoice_changed"] = 1
-                data["create_time"] = time.Now().Unix()
-                data["invoice_status"] = invoice_status
-                order_id := util.Mysql.Insert(dbname, data)
-                if order_id == -1 {
-                    errCode = append(errCode, fmt.Sprintf("%s_%s", data["order_code"], data["invoice_order_code"]))
-                }
-            }
-        }
-        log.Println("换票错误信息:", errCode)
-        this.ServeJson(map[string]interface{}{
-            "error_code": 0,
-            "error_msg":  "",
-        })
-
-    } else {
-        this.ServeJson(map[string]interface{}{
-            "error_code": -1,
-            "error_msg":  "订单状态异常",
-        })
-        return
-    }
+	//红冲开关
+	if !config.InvoiceConfig.Red_invoice_switch {
+		this.ServeJson(map[string]interface{}{
+			"invoice_status": -1,
+			"invoice_msg":    config.InvoiceConfig.Red_invoice_msg,
+		})
+		return
+	}
+	invoice_type := this.GetString("invoice_type")
+	phone := this.GetString("phone")
+	e_mail := this.GetString("mail")
+	company_name := this.GetString("company_name")
+	id_num := strings.ToUpper(this.GetString("taxpayer_identnum")) //纳税人识别号
+	invoiceContent := this.GetString("invoiceContent")
+	remark := this.GetString("remark")
+	invoiceVariety := this.GetString("invoice_variety")
+	invoice_status := 0
+	//userId := qutil.ObjToString(this.GetSession("userId"))  支持扫描换票
+	//order_code := this.GetString("order_code")
+	sid := encrypt.SE.Decode4Hex(this.GetString("sid"))
+	oRes := util.Mysql.FindOne(dbname, map[string]interface{}{"id": sid, "invoice_changed": 0, "invoice_status": 1}, "", "") //仅线上开发票可换票
+	if oRes != nil && len(*oRes) > 0 &&
+		((*oRes)["invoicing_entity"] == nil || qutil.InterfaceToStr((*oRes)["invoicing_entity"]) == config.InvoiceConfig.SigningSubject) {
+		var (
+			qSql    string
+			errCode []string
+			//saveData []map[string]interface{}
+			resArr []map[string]interface{}
+		)
+		pCode := qutil.InterfaceToStr((*oRes)["order_code"])
+		//多订单联合开票
+		if invoice_order_code := qutil.InterfaceToStr((*oRes)["invoice_order_code"]); len(strings.Split(invoice_order_code, ",")) > 1 {
+			pCode = invoice_order_code
+			qSql = fmt.Sprintf(`SELECT * FROM invoice WHERE invoice_order_code = '%s' and invoice_changed = 0 and invoice_status = 1`, qutil.InterfaceToStr((*oRes)["invoice_order_code"]))
+			res1 := util.Mysql.SelectBySql(qSql)
+			if res1 != nil && len(*res1) > 0 {
+				resArr = *res1
+			}
+		} else {
+			resArr = append(resArr, *oRes)
+		}
+		var isMail bool
+		tm := time.Now()
+		for _, res := range resArr {
+			if res["only_Identifying"] == nil { //无唯一id 允许换票一次 生成唯一id
+				newUuid := uuid.New()
+				res["only_Identifying"] = newUuid
+				util.Mysql.Update(dbname, map[string]interface{}{"id": res["id"]}, map[string]interface{}{"only_Identifying": newUuid, "invoice_status": -2})
+			} else if util.Mysql.Count(dbname, map[string]interface{}{
+				"order_code":       res["order_code"],
+				"user_id":          res["user_id"],
+				"only_Identifying": res["only_Identifying"],
+			}) > 1 {
+				continue
+			}
+
+			res["company_phone"] = this.GetString("company_phone")
+			res["operable_time"] = FormatDate(&tm, Date_Full_Layout)
+			res["bank_account"] = this.GetString("bank_account")
+			res["company_address"] = this.GetString("company_address")
+			res["bank_name"] = this.GetString("bank_name")
+			res["recipient"] = this.GetString("recipient")
+			res["delivery_address"] = this.GetString("delivery_address")
+			data := res
+			delete(data, "id")
+			switch IsEdit(res, phone, e_mail, id_num, company_name, invoice_type, invoiceContent, remark, invoiceVariety) {
+			case true:
+				this.ServeJson(map[string]interface{}{
+					"invoice_status": -1,
+					"invoice_msg":    "开票信息未修改,不允许提交",
+				})
+				return
+				data["phone"] = phone
+				data["mail"] = e_mail
+				data["invoice_content"] = invoiceContent
+				data["company_name"] = company_name
+				data["invoice_type"] = invoice_type
+				data["taxpayer_identnum"] = id_num
+				data["remark"] = remark
+				data["invoice_variety"] = invoiceVariety
+				//var html string
+				//if invoice_type == "个人" {
+				//	emailHtml := emailHtml_gr
+				//	emailHtmls := fmt.Sprintf(emailHtml, phone, e_mail)
+				//	html = fmt.Sprintf(email_format, data["order_code"], data["url"], emailHtmls)
+				//} else {
+				//	emailHtml := emailHtml_gs
+				//	emailHtmls := fmt.Sprintf(emailHtml, company_name, id_num, phone, e_mail)
+				//	html = fmt.Sprintf(email_format, data["order_code"], data["url"], emailHtmls)
+				//}
+				data["invoice_changed"] = 1
+				data["invoice_status"] = 1
+				data["billing_time"] = tm.Unix()
+				data["create_time"] = tm.Unix()
+				order_id := util.Mysql.Insert(dbname, data)
+				if order_id == -1 {
+					errCode = append(errCode, fmt.Sprintf("%s_%s", data["order_code"], data["invoice_order_code"]))
+				}
+				if !isMail { //成功发邮件
+					isMail = true
+					sendMail(invoice_type, pCode, company_name, id_num, e_mail, phone, qutil.InterfaceToStr(data["source_url"]), invoiceContent)
+					//InvoiceSendMail(data["mail"].(string), html, "电子发票")
+				}
+			case false:
+				if !config.InvoiceConfig.Third_party_switch {
+					this.ServeJson(map[string]interface{}{
+						"error_code": -2,
+						"error_msg":  "暂不支持换票",
+					})
+					return
+				}
+				data["phone"] = phone
+				data["mail"] = e_mail
+				data["invoice_content"] = invoiceContent
+				data["company_name"] = company_name
+				data["invoice_type"] = invoice_type
+				data["taxpayer_identnum"] = id_num
+				data["remark"] = remark
+				data["invoice_variety"] = invoiceVariety
+				dataexport_data := make(map[string]interface{})
+				if invoice_type == "个人" {
+					dataexport_data["applyBill_type"] = 0
+					dataexport_data["applyBill_taxnum"] = ""
+					dataexport_data["applybill_company"] = ""
+				} else {
+					dataexport_data["applyBill_type"] = 1
+					dataexport_data["applyBill_taxnum"] = id_num
+					dataexport_data["applybill_company"] = company_name
+				}
+				dataexport_data["user_mail"] = e_mail
+				util.Mysql.Update("dataexport_order", map[string]interface{}{"order_code": res["order_code"]}, dataexport_data)
+				data["mail"] = e_mail
+				data["phone"] = phone
+				data["invoice_type"] = invoice_type
+				data["company_name"] = company_name
+				data["taxpayer_identnum"] = id_num
+				data["invoice_changed"] = 1
+				data["create_time"] = time.Now().Unix()
+				data["invoice_status"] = invoice_status
+				order_id := util.Mysql.Insert(dbname, data)
+				if order_id == -1 {
+					errCode = append(errCode, fmt.Sprintf("%s_%s", data["order_code"], data["invoice_order_code"]))
+				}
+			}
+		}
+		log.Println("换票错误信息:", errCode)
+		this.ServeJson(map[string]interface{}{
+			"error_code": 0,
+			"error_msg":  "",
+		})
+
+	} else {
+		this.ServeJson(map[string]interface{}{
+			"error_code": -1,
+			"error_msg":  "订单状态异常",
+		})
+		return
+	}
 
 }
 
 func IsEdit(res map[string]interface{}, phone, e_mail, id_num, company_name, invoice_type, invoiceContent, remark, invoiceVariety string) bool {
-    if invoice_type == "个人" {
-        if phone == res["phone"] && e_mail == res["mail"] && res["invoice_type"] == "个人" &&
-            res["invoice_content"] == invoiceContent && res["remark"] == remark && res["invoice_variety"] == invoiceVariety {
-            return true
-        }
-    } else {
-        if phone == res["phone"] && e_mail == res["mail"] && id_num == res["taxpayer_identnum"] &&
-            company_name == res["company_name"] && res["invoice_type"] == "单位" &&
-            res["invoice_content"] == invoiceContent && res["remark"] == remark && res["invoice_variety"] == invoiceVariety {
-            return true
-        }
-    }
-    return false
+	if invoice_type == "个人" {
+		if phone == res["phone"] && e_mail == res["mail"] && res["invoice_type"] == "个人" &&
+			res["invoice_content"] == invoiceContent && res["remark"] == remark && res["invoice_variety"] == invoiceVariety {
+			return true
+		}
+	} else {
+		if phone == res["phone"] && e_mail == res["mail"] && id_num == res["taxpayer_identnum"] &&
+			company_name == res["company_name"] && res["invoice_type"] == "单位" &&
+			res["invoice_content"] == invoiceContent && res["remark"] == remark && res["invoice_variety"] == invoiceVariety {
+			return true
+		}
+	}
+	return false
 }
 
 // 退票
 func (this *Invoice) Refundinvoice() {
-    if !config.InvoiceConfig.Third_party_switch {
-        this.ServeJson(map[string]interface{}{
-            "invoice_status": -1,
-            "invoice_msg":    config.InvoiceConfig.Red_invoice_msg,
-        })
-        return
-    }
-    var refund_flag = -1
-    userid := this.GetSession("userId")
-    invoice_serialnum := this.GetString("invoice_serialnum") //发票流水号
-    if invoice_serialnum != "" {
-        query := make(map[string]interface{})
-        query["invoice_serialnum"] = invoice_serialnum
-        query["user_id"] = userid
-        res := util.Mysql.FindOne(dbname, query, "fpdm,fphm,invoice_serialnum", "")
-        if res != nil {
-            req_ := make(map[string]interface{})
-            req_["fpdm"] = (*res)["fpdm"]
-            req_["fphm"] = (*res)["fphm"]
-            req_["redcode"] = (*res)["invoice_serialnum"]
-            b, _ := json.Marshal(req_)
-            buffer := bytes.NewBuffer(b)
-            request, _ := http.NewRequest("POST", config.InvoiceConfig.Invoice_interface_address+"/Invoice/RedSubmit", buffer)
-            client := &http.Client{}
-            response, err := client.Do(request)
-            if err == nil {
-                res, _ := ioutil.ReadAll(response.Body)
-                defer response.Body.Close()
-                result := map[string]interface{}{}
-                err := json.Unmarshal(res, &result)
-                if err != nil {
-                    log.Println("json序列化错误")
-                } else {
-                    if result["code"].(string) == "0" {
-                        refund_flag = 0
-                    } else if result["code"].(string) == "1" {
-                        refund_flag = 1
-                    } else {
-                        refund_flag = 2
-                    }
-                }
-                go util.Mysql.Update(dbname, query, map[string]interface{}{"refund_flag": refund_flag})
-            }
-
-        }
-    }
+	if !config.InvoiceConfig.Third_party_switch {
+		this.ServeJson(map[string]interface{}{
+			"invoice_status": -1,
+			"invoice_msg":    config.InvoiceConfig.Red_invoice_msg,
+		})
+		return
+	}
+	var refund_flag = -1
+	userid := this.GetSession("userId")
+	invoice_serialnum := this.GetString("invoice_serialnum") //发票流水号
+	if invoice_serialnum != "" {
+		query := make(map[string]interface{})
+		query["invoice_serialnum"] = invoice_serialnum
+		query["user_id"] = userid
+		res := util.Mysql.FindOne(dbname, query, "fpdm,fphm,invoice_serialnum", "")
+		if res != nil {
+			req_ := make(map[string]interface{})
+			req_["fpdm"] = (*res)["fpdm"]
+			req_["fphm"] = (*res)["fphm"]
+			req_["redcode"] = (*res)["invoice_serialnum"]
+			b, _ := json.Marshal(req_)
+			buffer := bytes.NewBuffer(b)
+			request, _ := http.NewRequest("POST", config.InvoiceConfig.Invoice_interface_address+"/Invoice/RedSubmit", buffer)
+			client := &http.Client{}
+			response, err := client.Do(request)
+			if err == nil {
+				res, _ := ioutil.ReadAll(response.Body)
+				defer response.Body.Close()
+				result := map[string]interface{}{}
+				err := json.Unmarshal(res, &result)
+				if err != nil {
+					log.Println("json序列化错误")
+				} else {
+					if result["code"].(string) == "0" {
+						refund_flag = 0
+					} else if result["code"].(string) == "1" {
+						refund_flag = 1
+					} else {
+						refund_flag = 2
+					}
+				}
+				go util.Mysql.Update(dbname, query, map[string]interface{}{"refund_flag": refund_flag})
+			}
+
+		}
+	}
 
 }
 
 func (this *Invoice) Invoiceinfo() {
-    userId := qutil.ObjToString(this.GetSession("userId"))
-    order_code := this.GetString("order_code")
-    data := make(map[string]interface{})
-    data["order_code"] = order_code
-    data["user_id"] = userId
-    countdowntime := config.Config.OrderCountdown.(string)
-    status := util.Mysql.FindOne("dataexport_order", data, "", "")
-    if *status != nil {
-        (*status)["source"] = LastInvoiceSource(qutil.InterfaceToStr((*status)["order_code"]))
-        //卡卷id加密
-        if (*status)["d_relation_id"] != "" {
-            (*status)["userLotteryId"] = encrypt.SE.Encode2Hex(qutil.ObjToString((*status)["d_relation_id"]))
-        }
-        (*status)["order_money"] = float64((*status)["order_money"].(int64)) / 100
-        if (*status)["discount_price"] != nil && (*status)["discount_price"].(int64) > 0 {
-            (*status)["discount_price"] = float64((*status)["discount_price"].(int64)) / 100
-        }
-        if (*status)["pay_money"] != nil && (*status)["pay_money"].(int64) > 0 {
-            (*status)["pay_money"] = float64((*status)["pay_money"].(int64)) / 100
-        }
-        delete((*status), "d_relation_id")
-        (*status)["countdown"] = countdowntime
-        var isCanInvoic bool
-        create_time, _ := time.ParseInLocation(Date_Full_Layout, qutil.ObjToString((*status)["create_time"]), time.Local)
-        if create_time.Unix() > config.InvoiceConfig.Order_createtime {
-            //剩余可开票金额
-            isCanInvoic = IsAllowInvoice(*status)
-        }
-        (*status)["is_can_invoice"] = isCanInvoic
-        filter := dataexport.SieveCondition{}
-        if (*status)["filter"] != nil {
-            err := json.Unmarshal([]byte((*status)["filter"].(string)), &filter)
-            if err == nil {
-                // 处理行业其他
-                tmpIndustry := []string{}
-                for i := 0; i < len(filter.Industry); i++ {
-                    cIndustry := filter.Industry[i]
-                    if strings.Contains(cIndustry, "其它") {
-                        continue
-                    }
-                    tmpIndustry = append(tmpIndustry, cIndustry)
-                }
-                filter.Industry = tmpIndustry
-            }
-            (*status)["filter"] = filter
-        }
-        //是否存在可查看发票
-        (*status)["invoice_show"] = len(ShowList(order_code)) > 0
-        this.ServeJson(map[string]interface{}{
-            "status": "success",
-            "data":   status,
-        })
-    } else {
-        (*status)["countdown"] = countdowntime
-        this.ServeJson(map[string]interface{}{
-            "status": "fail",
-            "data":   "",
-        })
-    }
+	userId := qutil.ObjToString(this.GetSession("userId"))
+	order_code := this.GetString("order_code")
+	data := make(map[string]interface{})
+	data["order_code"] = order_code
+	data["user_id"] = userId
+	countdowntime := config.Config.OrderCountdown.(string)
+	status := util.Mysql.FindOne("dataexport_order", data, "", "")
+	if *status != nil {
+		(*status)["source"] = LastInvoiceSource(qutil.InterfaceToStr((*status)["order_code"]))
+		//卡卷id加密
+		if (*status)["d_relation_id"] != "" {
+			(*status)["userLotteryId"] = encrypt.SE.Encode2Hex(qutil.ObjToString((*status)["d_relation_id"]))
+		}
+		(*status)["order_money"] = float64((*status)["order_money"].(int64)) / 100
+		if (*status)["discount_price"] != nil && (*status)["discount_price"].(int64) > 0 {
+			(*status)["discount_price"] = float64((*status)["discount_price"].(int64)) / 100
+		}
+		if (*status)["pay_money"] != nil && (*status)["pay_money"].(int64) > 0 {
+			(*status)["pay_money"] = float64((*status)["pay_money"].(int64)) / 100
+		}
+		delete((*status), "d_relation_id")
+		(*status)["countdown"] = countdowntime
+		var isCanInvoic bool
+		create_time, _ := time.ParseInLocation(Date_Full_Layout, qutil.ObjToString((*status)["create_time"]), time.Local)
+		if create_time.Unix() > config.InvoiceConfig.Order_createtime {
+			//剩余可开票金额
+			isCanInvoic = IsAllowInvoice(*status)
+		}
+		(*status)["is_can_invoice"] = isCanInvoic
+		filter := dataexport.SieveCondition{}
+		if (*status)["filter"] != nil {
+			err := json.Unmarshal([]byte((*status)["filter"].(string)), &filter)
+			if err == nil {
+				// 处理行业其他
+				tmpIndustry := []string{}
+				for i := 0; i < len(filter.Industry); i++ {
+					cIndustry := filter.Industry[i]
+					if strings.Contains(cIndustry, "其它") {
+						continue
+					}
+					tmpIndustry = append(tmpIndustry, cIndustry)
+				}
+				filter.Industry = tmpIndustry
+			}
+			(*status)["filter"] = filter
+		}
+		//是否存在可查看发票
+		(*status)["invoice_show"] = len(ShowList(order_code)) > 0
+		this.ServeJson(map[string]interface{}{
+			"status": "success",
+			"data":   status,
+		})
+	} else {
+		(*status)["countdown"] = countdowntime
+		this.ServeJson(map[string]interface{}{
+			"status": "fail",
+			"data":   "",
+		})
+	}
 
 }
 
 func InvoiceSendMail(target_mail, html, title string) {
-    for k, v := range config.GmailAuth {
-        if mail.GSendMail("剑鱼标讯", target_mail, "", "", title, html, "", "", v) {
-            log.Println(target_mail, fmt.Sprintf("使用%s发送邮件成功", v.User))
-            break
-        }
-        if k < len(config.GmailAuth)-1 {
-            log.Println(target_mail, fmt.Sprintf("使用%s发送邮件失败!3s后使用其他邮箱尝试", v.User))
-        } else {
-            log.Println(target_mail, fmt.Sprintf("使用%s发送邮件失败!", v.User))
-        }
-        time.Sleep(time.Second * 3)
-    }
+	for k, v := range config.GmailAuth {
+		if mail.GSendMail("剑鱼标讯", target_mail, "", "", title, html, "", "", v) {
+			log.Println(target_mail, fmt.Sprintf("使用%s发送邮件成功", v.User))
+			break
+		}
+		if k < len(config.GmailAuth)-1 {
+			log.Println(target_mail, fmt.Sprintf("使用%s发送邮件失败!3s后使用其他邮箱尝试", v.User))
+		} else {
+			log.Println(target_mail, fmt.Sprintf("使用%s发送邮件失败!", v.User))
+		}
+		time.Sleep(time.Second * 3)
+	}
 }
 
 // 查询订单最后开票状态
 func LastInvoiceSource(orderCode string) int64 {
-    orderData := util.Mysql.SelectBySql("select source  from  invoice   where   order_code  =? ORDER BY  create_time desc ", orderCode)
-    if orderData != nil && len(*orderData) > 0 {
-        return qutil.Int64All((*orderData)[0]["source"])
-    }
-    return 0
+	orderData := util.Mysql.SelectBySql("select source  from  invoice   where   order_code  =? ORDER BY  create_time desc ", orderCode)
+	if orderData != nil && len(*orderData) > 0 {
+		return qutil.Int64All((*orderData)[0]["source"])
+	}
+	return 0
 }
 
 // 是否可开票
 func IsAllowInvoice(res map[string]interface{}) bool {
-    if qutil.IntAll(res["applybill_status"]) > 0 {
-        return false
-    }
-    if qutil.Float64All(res["pay_money"]) == 0 {
-        return false
-    }
-    filter := qutil.ObjToString(res["filter"].(string))
-    filter_map := map[string]interface{}{}
-    _ = json.Unmarshal([]byte(filter), &filter_map)
-    if qutil.IntAll(res["order_status"]) == 1 && qutil.InterfaceToStr(filter_map["badge"]) != "exchange" {
-        //用户下单|| 代用户下单
-        if qutil.IntAll(res["is_backstage_order"]) == 0 || qutil.InterfaceToStr(res["order_channel"]) == "xdqd04" {
-            return len(ShowList(qutil.InterfaceToStr(res["order_code"]))) == 0
-        } else { //qmx下单 已全额回款 发票企业为剑鱼
-            return qutil.IntAll(res["return_status"]) == 1 && qutil.InterfaceToStr(res["signing_subject"]) == "h01" &&
-                len(ShowList(qutil.InterfaceToStr(res["order_code"]))) == 0
-        }
-    }
-    return false
+	if qutil.IntAll(res["applybill_status"]) > 0 {
+		return false
+	}
+	if qutil.Float64All(res["pay_money"]) == 0 {
+		return false
+	}
+	filter := qutil.ObjToString(res["filter"].(string))
+	filter_map := map[string]interface{}{}
+	_ = json.Unmarshal([]byte(filter), &filter_map)
+	if qutil.IntAll(res["order_status"]) == 1 && qutil.InterfaceToStr(filter_map["badge"]) != "exchange" {
+		//用户下单|| 代用户下单
+		if qutil.IntAll(res["is_backstage_order"]) == 0 || qutil.InterfaceToStr(res["order_channel"]) == "xdqd04" {
+			return len(ShowList(qutil.InterfaceToStr(res["order_code"]))) == 0
+		} else { //qmx下单 已全额回款 发票企业为剑鱼
+			return qutil.IntAll(res["return_status"]) == 1 && qutil.InterfaceToStr(res["signing_subject"]) == "h01" &&
+				len(ShowList(qutil.InterfaceToStr(res["order_code"]))) == 0
+		}
+	}
+	return false
 }
 
 func (this *Invoice) Available() {
-    u := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": this.GetString("order_code")}, "pay_time", "")
-    status := 0
-    if u != nil {
-        if pay_time, _ := (*u)["pay_time"].(string); pay_time != "" && config.InvoiceConfig.Switch_paymch.Time != "" {
-            p1, err1 := time.ParseInLocation(Date_Full_Layout, pay_time, time.Local)
-            p2, err2 := time.ParseInLocation(Date_Full_Layout, config.InvoiceConfig.Switch_paymch.Time, time.Local)
-            if err1 == nil && err2 == nil {
-                if config.InvoiceConfig.Switch_paymch.Model == 1 { //大于该时间点,不能开票
-                    if p1.Before(p2) {
-                        status = 1
-                    }
-                } else if config.InvoiceConfig.Switch_paymch.Model == 2 { //小于该时间点,不能开票
-                    if p1.After(p2) {
-                        status = 1
-                    }
-                } else { //无限制,都能开票
-                    status = 1
-                }
-            }
-        } else {
-            status = 1
-        }
-    }
-    this.ServeJson(map[string]interface{}{
-        "status": status,
-    })
+	u := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": this.GetString("order_code")}, "pay_time", "")
+	status := 0
+	if u != nil {
+		if pay_time, _ := (*u)["pay_time"].(string); pay_time != "" && config.InvoiceConfig.Switch_paymch.Time != "" {
+			p1, err1 := time.ParseInLocation(Date_Full_Layout, pay_time, time.Local)
+			p2, err2 := time.ParseInLocation(Date_Full_Layout, config.InvoiceConfig.Switch_paymch.Time, time.Local)
+			if err1 == nil && err2 == nil {
+				if config.InvoiceConfig.Switch_paymch.Model == 1 { //大于该时间点,不能开票
+					if p1.Before(p2) {
+						status = 1
+					}
+				} else if config.InvoiceConfig.Switch_paymch.Model == 2 { //小于该时间点,不能开票
+					if p1.After(p2) {
+						status = 1
+					}
+				} else { //无限制,都能开票
+					status = 1
+				}
+			}
+		} else {
+			status = 1
+		}
+	}
+	this.ServeJson(map[string]interface{}{
+		"status": status,
+	})
 }
 
 // 删除有问题的换开发票并记录
 func delReplaceInvoice(query map[string]interface{}) bool {
-    data := util.Mysql.FindOne(dbname, query, "", "")
-    if data != nil && len(*data) > 0 {
-        log.Printf("invoice replace delete data: %+v", data)
-    }
-    return util.Mysql.Delete(dbname, query)
+	data := util.Mysql.FindOne(dbname, query, "", "")
+	if data != nil && len(*data) > 0 {
+		log.Printf("invoice replace delete data: %+v", data)
+	}
+	return util.Mysql.Delete(dbname, query)
 }
 
 func InvoiceAmount(orderCode string) (invoicedMoney int64) {
-    invoicedInfo := util.Mysql.SelectBySql(fmt.Sprintf("SELECT invoice_order_money,only_Identifying FROM invoice WHERE order_code = '%s' and invoice_status>=0", orderCode))
-    if invoicedInfo != nil && len(*invoicedInfo) > 0 {
-        onlyMap := make(map[string]int64)
-        for _, m := range *invoicedInfo {
-            if m["only_Identifying"] != nil { //过滤换票过程中的数据
-                onlyMap[qutil.InterfaceToStr(m["only_Identifying"])] = qutil.Int64All(m["invoice_order_money"])
-            } else {
-                invoicedMoney += qutil.Int64All(m["invoice_order_money"])
-            }
-        }
-        if len(onlyMap) > 0 {
-            for _, i := range onlyMap {
-                invoicedMoney += i
-            }
-        }
-    }
-    return
+	invoicedInfo := util.Mysql.SelectBySql(fmt.Sprintf("SELECT invoice_order_money,only_Identifying FROM invoice WHERE order_code = '%s' and invoice_status>=0", orderCode))
+	if invoicedInfo != nil && len(*invoicedInfo) > 0 {
+		onlyMap := make(map[string]int64)
+		for _, m := range *invoicedInfo {
+			if m["only_Identifying"] != nil { //过滤换票过程中的数据
+				onlyMap[qutil.InterfaceToStr(m["only_Identifying"])] = qutil.Int64All(m["invoice_order_money"])
+			} else {
+				invoicedMoney += qutil.Int64All(m["invoice_order_money"])
+			}
+		}
+		if len(onlyMap) > 0 {
+			for _, i := range onlyMap {
+				invoicedMoney += i
+			}
+		}
+	}
+	return
 }
 
 // InvoiceSubmit 发票信息提交
 func (this *Invoice) InvoiceSubmit() {
-    if !R.CheckReqParam(this.ResponseWriter, this.Request, "invoice_variety", "invoiceContent", "invoice_type", "phone", "mail") {
-        this.ServeJson(NewResult("", errors.New("缺少参数")))
-        return
-    }
-    if this.GetString("invoice_type") == "单位" && !R.CheckReqParam(this.ResponseWriter, this.Request, "company_name", "taxpayer_identnum") {
-        this.ServeJson(NewResult("", errors.New("缺少参数")))
-        return
-    }
-    if !config.InvoiceConfig.Invoice_type[this.GetString("invoice_variety")] {
-        this.ServeJson(NewResult("", errors.New("发票类型有误")))
-        return
-    }
-    if this.GetString("invoice_type") != "个人" && this.GetString("invoice_type") != "单位" {
-        this.ServeJson(NewResult("", errors.New("发票抬头有误")))
-        return
-    }
-    if len([]rune(this.GetString("company_address"))) > 55 {
-        this.ServeJson(NewResult("", errors.New("单位地址过长")))
-        return
-    }
-    now := time.Now()
-    again, _ := this.GetInteger("again")                                                //是否是失败重新开票 0 首次提交  1 再此提交
-    oldOnlyIdentifying := encrypt.SE.DecodeString(this.GetString("oldOnlyIdentifying")) //最后一次失败的发票信息唯一标识
-    data := map[string]interface{}{
-        "company_name":      this.GetString("company_name"),
-        "phone":             this.GetString("phone"),
-        "mail":              this.GetString("mail"),
-        "invoice_type":      this.GetString("invoice_type"),
-        "invoice_content":   this.GetString("invoiceContent"),
-        "invoice_status":    0,
-        "invoice_changed":   0,
-        "company_phone":     this.GetString("company_phone"),
-        "taxpayer_identnum": this.GetString("taxpayer_identnum"),
-        "create_time":       time.Now().Unix(),
-        "operable_time":     FormatDate(&now, Date_Full_Layout),
-        "invoicing_entity":  "北京剑鱼信息技术有限公司",
-        "remark":            this.GetString("remark"),
-        "invoice_variety":   this.GetString("invoice_variety"),
-        "bank_account":      this.GetString("bank_account"),
-        "company_address":   this.GetString("company_address"),
-        "bank_name":         this.GetString("bank_name"),
-        "recipient":         this.GetString("recipient"),
-        "delivery_address":  this.GetString("delivery_address"),
-    }
-    if again == 1 {
-        err := OpenInvoiceAgain(oldOnlyIdentifying, data)
-        if err != nil {
-            this.ServeJson(NewResult("", err))
-            return
-        }
-        this.ServeJson(NewResult("保存信息成功", nil))
-        return
-    }
-    source, _ := this.GetInteger("source")
-    switch source {
-    case 0: //用户端开票
-        userId := qutil.ObjToString(this.GetSession("userId"))
-        if userId == "" {
-            this.ServeJson(NewResult("", errors.New("userId为空")))
-            return
-        }
-        orderCode := this.GetString("order_code")
-        err := JyOpenInvoice(orderCode, userId, data)
-        if err != nil {
-            this.ServeJson(NewResult("", err))
-            return
-        }
-    case 1: //管理后台扫码开票
-        onlyIdentifying := encrypt.SE.DecodeString(this.GetString("onlyIdentifying"))
-        invoiceMoney := encrypt.SE.DecodeString(this.GetString("invoiceMoney"))
-        operator := encrypt.SE.Decode4HexByCheck(this.GetString("operator"))
-        if onlyIdentifying == "" || invoiceMoney == "" {
-            this.ServeJson(NewResult("", errors.New("传入参数不正确")))
-            return
-        }
-        err := AdminOpenInvoice(onlyIdentifying, invoiceMoney, operator, data)
-        if err != nil {
-            this.ServeJson(NewResult("", err))
-            return
-        }
-    }
-    this.ServeJson(NewResult("保存信息成功", nil))
+	if !R.CheckReqParam(this.ResponseWriter, this.Request, "invoice_variety", "invoiceContent", "invoice_type", "phone", "mail") {
+		this.ServeJson(NewResult("", errors.New("缺少参数")))
+		return
+	}
+	if this.GetString("invoice_type") == "单位" && !R.CheckReqParam(this.ResponseWriter, this.Request, "company_name", "taxpayer_identnum") {
+		this.ServeJson(NewResult("", errors.New("缺少参数")))
+		return
+	}
+	if !config.InvoiceConfig.Invoice_type[this.GetString("invoice_variety")] {
+		this.ServeJson(NewResult("", errors.New("发票类型有误")))
+		return
+	}
+	if this.GetString("invoice_type") != "个人" && this.GetString("invoice_type") != "单位" {
+		this.ServeJson(NewResult("", errors.New("发票抬头有误")))
+		return
+	}
+	if len([]rune(this.GetString("company_address"))) > 55 {
+		this.ServeJson(NewResult("", errors.New("单位地址过长")))
+		return
+	}
+	now := time.Now()
+	again, _ := this.GetInteger("again")                                                //是否是失败重新开票 0 首次提交  1 再此提交
+	oldOnlyIdentifying := encrypt.SE.DecodeString(this.GetString("oldOnlyIdentifying")) //最后一次失败的发票信息唯一标识
+	data := map[string]interface{}{
+		"company_name":      this.GetString("company_name"),
+		"phone":             this.GetString("phone"),
+		"mail":              this.GetString("mail"),
+		"invoice_type":      this.GetString("invoice_type"),
+		"invoice_content":   this.GetString("invoiceContent"),
+		"invoice_status":    0,
+		"invoice_changed":   0,
+		"company_phone":     this.GetString("company_phone"),
+		"taxpayer_identnum": this.GetString("taxpayer_identnum"),
+		"create_time":       time.Now().Unix(),
+		"operable_time":     FormatDate(&now, Date_Full_Layout),
+		"invoicing_entity":  "北京剑鱼信息技术有限公司",
+		"remark":            this.GetString("remark"),
+		"invoice_variety":   this.GetString("invoice_variety"),
+		"bank_account":      this.GetString("bank_account"),
+		"company_address":   this.GetString("company_address"),
+		"bank_name":         this.GetString("bank_name"),
+		"recipient":         this.GetString("recipient"),
+		"delivery_address":  this.GetString("delivery_address"),
+	}
+	if again == 1 {
+		err := OpenInvoiceAgain(oldOnlyIdentifying, data)
+		if err != nil {
+			this.ServeJson(NewResult("", err))
+			return
+		}
+		this.ServeJson(NewResult("保存信息成功", nil))
+		return
+	}
+	source, _ := this.GetInteger("source")
+	switch source {
+	case 0: //用户端开票
+		userId := qutil.ObjToString(this.GetSession("userId"))
+		if userId == "" {
+			this.ServeJson(NewResult("", errors.New("userId为空")))
+			return
+		}
+		orderCode := this.GetString("order_code")
+		err := JyOpenInvoice(orderCode, userId, data)
+		if err != nil {
+			this.ServeJson(NewResult("", err))
+			return
+		}
+	case 1: //管理后台扫码开票
+		onlyIdentifying := encrypt.SE.DecodeString(this.GetString("onlyIdentifying"))
+		invoiceMoney := encrypt.SE.DecodeString(this.GetString("invoiceMoney"))
+		operator := encrypt.SE.Decode4HexByCheck(this.GetString("operator"))
+		if onlyIdentifying == "" || invoiceMoney == "" {
+			this.ServeJson(NewResult("", errors.New("传入参数不正确")))
+			return
+		}
+		err := AdminOpenInvoice(onlyIdentifying, invoiceMoney, operator, data)
+		if err != nil {
+			this.ServeJson(NewResult("", err))
+			return
+		}
+	}
+	this.ServeJson(NewResult("保存信息成功", nil))
 }
 
 func OpenInvoiceAgain(oldOnlyIdentifying string, data map[string]interface{}) error {
-    if oldOnlyIdentifying == "" {
-        return errors.New("缺少关键参数")
-    }
-    if util.Mysql.Count("invoice_fail_record", map[string]interface{}{"only_Identifying": oldOnlyIdentifying}) >= config.InvoiceConfig.SubmitNum {
-        return errors.New("提交次数已达上限")
-    }
-    ok := InvoiceFailRecord(oldOnlyIdentifying)
-    if !ok {
-        return errors.New("插入失败记录出错")
-    }
-    delete(data, "invoice_changed")
-    if !util.Mysql.Update("invoice", map[string]interface{}{"only_Identifying": oldOnlyIdentifying, "invoice_status": -1}, data) {
-        return errors.New("再次开票更新发票信息出错")
-    }
-    return nil
+	if oldOnlyIdentifying == "" {
+		return errors.New("缺少关键参数")
+	}
+	if util.Mysql.Count("invoice_fail_record", map[string]interface{}{"only_Identifying": oldOnlyIdentifying}) >= config.InvoiceConfig.SubmitNum {
+		return errors.New("提交次数已达上限")
+	}
+	ok := InvoiceFailRecord(oldOnlyIdentifying)
+	if !ok {
+		return errors.New("插入失败记录出错")
+	}
+	delete(data, "invoice_changed")
+	if !util.Mysql.Update("invoice", map[string]interface{}{"only_Identifying": oldOnlyIdentifying, "invoice_status": -1}, data) {
+		return errors.New("再次开票更新发票信息出错")
+	}
+	return nil
 }
 
 func JyOpenInvoice(orderCode, userId string, data map[string]interface{}) error {
-    onlyIdentifying := fmt.Sprintf("%s%s%s", "aa", time.Now().Format("150405"), qutil.GetRandom(4))
-    orderInfo := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": orderCode}, "product_type,user_mail,pay_money,create_time,signing_subject,applybill_status", "")
-    if orderInfo == nil {
-        return errors.New("订单不存在")
-    }
-    createTime, _ := time.ParseInLocation("2006-01-02 15:04:05", qutil.ObjToString((*orderInfo)["create_time"]), time.Local)
-    if createTime.Unix() < config.InvoiceConfig.Order_createtime {
-        return errors.New("2024年之前的订单不在开票")
-    }
-    if qutil.ObjToString((*orderInfo)["signing_subject"]) == "h02" {
-        return errors.New("签约主体为拓普")
-    }
-    /*if qutil.IntAll((*orderInfo)["applybill_status"]) != 0 {
-    	return errors.New("已提交发票信息")
-    }*/
-    invoicedMoney := InvoiceAmount(orderCode) //已开票金额
-    invoiceMoney := qutil.Int64All((*orderInfo)["pay_money"]) - invoicedMoney
-    if invoiceMoney == 0 {
-        return errors.New("开票金额已用完")
-    }
-    data["order_code"] = orderCode
-    data["invoice_order_code"] = orderCode
-    data["only_Identifying"] = onlyIdentifying
-    data["invoice_money"] = invoiceMoney
-    data["invoice_order_money"] = invoiceMoney
-    data["product_type"] = qutil.ObjToString((*orderInfo)["product_type"])
-    data["user_id"] = userId
-    data["source"] = 0
-    if !util.Mysql.ExecTx("用户端开发票", func(tx *sql.Tx) bool {
-        if util.Mysql.InsertByTx(tx, "invoice", data) <= 0 {
-            log.Println("插入invoice出错", orderCode)
-            return false
-        }
-        if !util.Mysql.UpdateByTx(tx, "dataexport_order", map[string]interface{}{
-            "order_code": orderCode,
-        }, map[string]interface{}{
-            "applybill_status": 1,
-        }) {
-            log.Println("更新dataexport_order出错", orderCode)
-            return false
-        }
-        return true
-    }) {
-        return errors.New("用户端开票插入数据出错")
-    }
-    return nil
+	onlyIdentifying := fmt.Sprintf("%s%s%s", "aa", time.Now().Format("150405"), qutil.GetRandom(4))
+	orderInfo := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": orderCode}, "product_type,user_mail,pay_money,create_time,signing_subject,applybill_status", "")
+	if orderInfo == nil {
+		return errors.New("订单不存在")
+	}
+	createTime, _ := time.ParseInLocation("2006-01-02 15:04:05", qutil.ObjToString((*orderInfo)["create_time"]), time.Local)
+	if createTime.Unix() < config.InvoiceConfig.Order_createtime {
+		return errors.New("2024年之前的订单不在开票")
+	}
+	if qutil.ObjToString((*orderInfo)["signing_subject"]) == "h02" {
+		return errors.New("签约主体为拓普")
+	}
+	/*if qutil.IntAll((*orderInfo)["applybill_status"]) != 0 {
+		return errors.New("已提交发票信息")
+	}*/
+	invoicedMoney := InvoiceAmount(orderCode) //已开票金额
+	invoiceMoney := qutil.Int64All((*orderInfo)["pay_money"]) - invoicedMoney
+	if invoiceMoney == 0 {
+		return errors.New("开票金额已用完")
+	}
+	data["order_code"] = orderCode
+	data["invoice_order_code"] = orderCode
+	data["only_Identifying"] = onlyIdentifying
+	data["invoice_money"] = invoiceMoney
+	data["invoice_order_money"] = invoiceMoney
+	data["product_type"] = qutil.ObjToString((*orderInfo)["product_type"])
+	data["user_id"] = userId
+	data["source"] = 0
+	if !util.Mysql.ExecTx("用户端开发票", func(tx *sql.Tx) bool {
+		if util.Mysql.InsertByTx(tx, "invoice", data) <= 0 {
+			log.Println("插入invoice出错", orderCode)
+			return false
+		}
+		if !util.Mysql.UpdateByTx(tx, "dataexport_order", map[string]interface{}{
+			"order_code": orderCode,
+		}, map[string]interface{}{
+			"applybill_status": 1,
+		}) {
+			log.Println("更新dataexport_order出错", orderCode)
+			return false
+		}
+		return true
+	}) {
+		return errors.New("用户端开票插入数据出错")
+	}
+	return nil
 }
 
 func AdminOpenInvoice(onlyIdentifying, invoiceMoney, operator string, data map[string]interface{}) error {
-    //二维码
-    path := "/front/invoiceScan/qr"
-    urlStr := fmt.Sprintf("onlyIdentifying=%s&invoiceMoney=%s&operator=%s", encrypt.SE.EncodeString(onlyIdentifying), encrypt.SE.EncodeString(invoiceMoney), encrypt.SE.Encode2HexByCheck(operator))
-    fullUrl := path + "?" + urlStr
-    oldData := util.Mysql.FindOne("invoice", map[string]interface{}{
-        "only_Identifying": onlyIdentifying,
-    }, "id", "")
-    if oldData != nil {
-        return errors.New("该订单发票信息已经提交过申请")
-    }
-    orderArr := []string{}
-    mailOrderArr := []string{}
-    orderMap := map[string]interface{}{}
-    Allmoney := int64(0)
-    for _, v := range strings.Split(invoiceMoney, ",") {
-        invoiceMoneyArr := strings.Split(v, ":")
-        orderArr = append(orderArr, invoiceMoneyArr[0])
-        Allmoney += qutil.Int64All(invoiceMoneyArr[1])
-        orderMap[invoiceMoneyArr[0]] = invoiceMoneyArr[1]
-        prices := qutil.Float64All(invoiceMoneyArr[1]) / float64(100)
-        price := strconv.FormatFloat(prices, 'f', -1, 64)
-        mailOrderArr = append(mailOrderArr, fmt.Sprintf("%s(%s元)", invoiceMoneyArr[0], price))
-
-    }
-    //提交时订单金额再做一次校验
-    for orderCode, money := range orderMap {
-        payMoney, _ := ResidueMoney(orderCode)
-        if payMoney < qutil.Int64All(money) {
-            return errors.New("该订单发票信息已经提交过申请")
-        }
-    }
-    if !util.Mysql.ExecTx("发票信息保存", func(tx *sql.Tx) bool {
-        for orderCode, money := range orderMap {
-            orderInfo := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": orderCode}, "product_type,user_mail,user_id,create_time", "")
-            productType := ""
-            if orderInfo != nil {
-                productType = qutil.InterfaceToStr((*orderInfo)["product_type"])
-            }
-            createTime, _ := time.ParseInLocation("2006-01-02 15:04:05", qutil.ObjToString((*orderInfo)["create_time"]), time.Local)
-            if createTime.Unix() < config.InvoiceConfig.Order_createtime {
-                log.Println("2024年之前的订单不在开票", orderCode)
-                return false
-            }
-            data["order_code"] = orderCode
-            data["invoice_order_code"] = strings.Join(orderArr, ",")
-            data["only_Identifying"] = onlyIdentifying
-            data["invoice_money"] = Allmoney
-            data["invoice_order_money"] = money
-            data["product_type"] = productType
-            data["user_id"] = qutil.ObjToString((*orderInfo)["user_id"])
-            data["operator"] = operator
-            data["source"] = 1
-            data["code_url"] = fullUrl
-            if util.Mysql.Insert("invoice", data) <= 0 {
-                log.Println("扫码开票插入invoice表出错", orderCode)
-                return false
-            }
-            //订单发票状态改成已申请
-            if !util.Mysql.Update("dataexport_order", map[string]interface{}{
-                "order_code": orderCode,
-            }, map[string]interface{}{
-                "applybill_status": 1,
-            }) {
-                log.Println("扫码开票更新dataexport_order表出错", orderCode)
-                return false
-            }
-        }
-        return true
-    }) {
-        return errors.New("发票信息保存失败")
-    }
-    return nil
+	//二维码
+	path := "/front/invoiceScan/qr"
+	urlStr := fmt.Sprintf("onlyIdentifying=%s&invoiceMoney=%s&operator=%s", encrypt.SE.EncodeString(onlyIdentifying), encrypt.SE.EncodeString(invoiceMoney), encrypt.SE.Encode2HexByCheck(operator))
+	fullUrl := path + "?" + urlStr
+	oldData := util.Mysql.FindOne("invoice", map[string]interface{}{
+		"only_Identifying": onlyIdentifying,
+	}, "id", "")
+	if oldData != nil {
+		return errors.New("该订单发票信息已经提交过申请")
+	}
+	orderArr := []string{}
+	mailOrderArr := []string{}
+	orderMap := map[string]interface{}{}
+	Allmoney := int64(0)
+	for _, v := range strings.Split(invoiceMoney, ",") {
+		invoiceMoneyArr := strings.Split(v, ":")
+		orderArr = append(orderArr, invoiceMoneyArr[0])
+		Allmoney += qutil.Int64All(invoiceMoneyArr[1])
+		orderMap[invoiceMoneyArr[0]] = invoiceMoneyArr[1]
+		prices := qutil.Float64All(invoiceMoneyArr[1]) / float64(100)
+		price := strconv.FormatFloat(prices, 'f', -1, 64)
+		mailOrderArr = append(mailOrderArr, fmt.Sprintf("%s(%s元)", invoiceMoneyArr[0], price))
+
+	}
+	//提交时订单金额再做一次校验
+	for orderCode, money := range orderMap {
+		payMoney, _ := ResidueMoney(orderCode)
+		if payMoney < qutil.Int64All(money) {
+			return errors.New("该订单发票信息已经提交过申请")
+		}
+	}
+	if !util.Mysql.ExecTx("发票信息保存", func(tx *sql.Tx) bool {
+		for orderCode, money := range orderMap {
+			orderInfo := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": orderCode}, "product_type,user_mail,user_id,create_time", "")
+			productType := ""
+			if orderInfo != nil {
+				productType = qutil.InterfaceToStr((*orderInfo)["product_type"])
+			}
+			createTime, _ := time.ParseInLocation("2006-01-02 15:04:05", qutil.ObjToString((*orderInfo)["create_time"]), time.Local)
+			if createTime.Unix() < config.InvoiceConfig.Order_createtime {
+				log.Println("2024年之前的订单不在开票", orderCode)
+				return false
+			}
+			data["order_code"] = orderCode
+			data["invoice_order_code"] = strings.Join(orderArr, ",")
+			data["only_Identifying"] = onlyIdentifying
+			data["invoice_money"] = Allmoney
+			data["invoice_order_money"] = money
+			data["product_type"] = productType
+			data["user_id"] = qutil.ObjToString((*orderInfo)["user_id"])
+			data["operator"] = operator
+			data["source"] = 1
+			data["code_url"] = fullUrl
+			if util.Mysql.Insert("invoice", data) <= 0 {
+				log.Println("扫码开票插入invoice表出错", orderCode)
+				return false
+			}
+			//订单发票状态改成已申请
+			if !util.Mysql.Update("dataexport_order", map[string]interface{}{
+				"order_code": orderCode,
+			}, map[string]interface{}{
+				"applybill_status": 1,
+			}) {
+				log.Println("扫码开票更新dataexport_order表出错", orderCode)
+				return false
+			}
+		}
+		return true
+	}) {
+		return errors.New("发票信息保存失败")
+	}
+	return nil
 }
 
 func InvoiceFailRecord(oldOnlyIdentifying string) bool {
-    //开票失败再次提交
-    invoiceData := util.Mysql.Find("invoice", map[string]interface{}{"only_Identifying": oldOnlyIdentifying, "invoice_status": -1}, "", "", -1, -1)
-    if invoiceData == nil && len(*invoiceData) <= 0 {
-        log.Println("未找到开票记录", oldOnlyIdentifying)
-        return false
-    }
-    //插入开票失败记录表
-    ok := util.Mysql.ExecTx("插入开票失败记录表", func(tx *sql.Tx) bool {
-        for _, val := range *invoiceData {
-            delete(val, "id")
-            delete(val, "code_url")
-            if util.Mysql.InsertByTx(tx, "invoice_fail_record", val) <= 0 {
-                return false
-            }
-        }
-        return true
-    })
-    return ok
+	//开票失败再次提交
+	invoiceData := util.Mysql.Find("invoice", map[string]interface{}{"only_Identifying": oldOnlyIdentifying, "invoice_status": -1}, "", "", -1, -1)
+	if invoiceData == nil && len(*invoiceData) <= 0 {
+		log.Println("未找到开票记录", oldOnlyIdentifying)
+		return false
+	}
+	//插入开票失败记录表
+	ok := util.Mysql.ExecTx("插入开票失败记录表", func(tx *sql.Tx) bool {
+		for _, val := range *invoiceData {
+			delete(val, "id")
+			delete(val, "code_url")
+			if util.Mysql.InsertByTx(tx, "invoice_fail_record", val) <= 0 {
+				return false
+			}
+		}
+		return true
+	})
+	return ok
 }
 
 func (this *Invoice) GetCompanyCode() {
-    code := ""
-    companyInfo := util.Mysql.FindOne("entniche_info", map[string]interface{}{"name": this.GetString("companyName")}, "code", "")
-    if companyInfo != nil && len(*companyInfo) > 0 {
-        code = qutil.ObjToString((*companyInfo)["code"])
-    }
-    this.ServeJson(NewResult(map[string]interface{}{
-        "code": code,
-    }, nil))
-    return
+	code := ""
+	companyInfo := util.Mysql.FindOne("entniche_info", map[string]interface{}{"name": this.GetString("companyName")}, "code", "")
+	if companyInfo != nil && len(*companyInfo) > 0 {
+		code = qutil.ObjToString((*companyInfo)["code"])
+	}
+	this.ServeJson(NewResult(map[string]interface{}{
+		"code": code,
+	}, nil))
+	return
 }
 
 // 发票信息查询
 func (this *Invoice) InvoiceQuery() {
-    onlyIdentifying := encrypt.SE.DecodeString(this.GetString("onlyIdentifying"))
-    invoiceMoney := encrypt.SE.DecodeString(this.GetString("invoiceMoney"))
-    operator := ""
-    if onlyIdentifying == "" || invoiceMoney == "" {
-        this.ServeJson(NewResult("", errors.New("传入参数不正确")))
-        return
-    }
-    orderArr := []string{}
-    money := int64(0)
-    for _, v := range strings.Split(invoiceMoney, ",") {
-        invoiceMoneyArr := strings.Split(v, ":")
-        orderArr = append(orderArr, invoiceMoneyArr[0])
-        money += qutil.Int64All(invoiceMoneyArr[1])
-    }
-    var sData map[string]interface{}
-    invoiceOne := util.Mysql.FindOne("invoice", map[string]interface{}{
-        "only_Identifying": onlyIdentifying,
-    }, "id,invoice_changed,order_code, invoice_order_code,bank_account,invoice_code, create_time,invoice_number,company_phone,company_name, phone, mail,company_phone, invoice_type, invoice_content, url, invoice_status, invoice_serialnum, taxpayer_identnum,operator, operable_time, invoicing_entity, remark, invoice_variety, logistics_code, company_address, bank_name, recipient, delivery_address,only_Identifying", " create_time   DESC")
-    companyName := ""
-    if invoiceOne == nil {
-        //查询公司名称
-        querySQL := fmt.Sprintf("select company_name,user_phone  from   dataexport_order  where order_code  in  (%s)   and  company_name!=''   ORDER BY  create_time   DESC LIMIT 1", fmt.Sprintf("\"%s\"", strings.Join(orderArr, "\",\"")))
-        orderArr := util.Mysql.SelectBySql(querySQL)
-        if orderArr != nil && len(*orderArr) > 0 {
-            companyName = qutil.ObjToString((*orderArr)[0]["company_name"])
-            sData = ShowData(qutil.ObjToString((*orderArr)[0]["user_phone"]))
-            //回显内容
-        }
-    } else {
-        (*invoiceOne)["order_code"] = qutil.If((*invoiceOne)["invoice_order_code"] != nil, (*invoiceOne)["invoice_order_code"], (*invoiceOne)["order_code"])
-        (*invoiceOne)["id"] = encrypt.SE.Encode2Hex(qutil.InterfaceToStr((*invoiceOne)["id"]))
-        timeLimit := qutil.Int64All((*invoiceOne)["create_time"]) <= config.InvoiceConfig.Order_createtime //24年之前的发票不让换票
-        switch qutil.IntAll((*invoiceOne)["invoice_status"]) {
-        case 1:
-            isJyInvoice := !(qutil.InterfaceToStr((*invoiceOne)["invoice_number"]) != "" && qutil.InterfaceToStr((*invoiceOne)["invoice_code"]) == "") //非数电票
-            isJyEntity := (*invoiceOne)["invoicing_entity"] != nil && qutil.InterfaceToStr((*invoiceOne)["invoicing_entity"]) != config.InvoiceConfig.SigningSubject
-            isChanged := util.Mysql.Count("invoice", map[string]interface{}{
-                "only_Identifying": onlyIdentifying,
-                "order_code":       (*invoiceOne)["order_code"],
-            }) > 1
-            (*invoiceOne)["changed"] = qutil.If(isJyInvoice || isChanged || isJyEntity || timeLimit, true, false)
-        case -1: //失败支持重新提交否
-            if !timeLimit {
-                (*invoiceOne)["isReopen"] = util.Mysql.Count("invoice_fail_record", map[string]interface{}{
-                    "only_Identifying": onlyIdentifying,
-                    "order_code":       (*invoiceOne)["order_code"],
-                })+1 >= config.InvoiceConfig.SubmitNum
-            } else {
-                (*invoiceOne)["isReopen"] = false
-            }
-        }
-    }
-
-    this.ServeJson(NewResult(map[string]interface{}{
-        "orderCodes":   strings.Join(orderArr, ","),
-        "money":        money,
-        "invoice":      &invoiceOne,
-        "operator":     operator,
-        "company_name": companyName,
-        "showData":     sData, //回显近期信息
-        "isFollowWx":   1,
-    }, nil))
+	onlyIdentifying := encrypt.SE.DecodeString(this.GetString("onlyIdentifying"))
+	invoiceMoney := encrypt.SE.DecodeString(this.GetString("invoiceMoney"))
+	operator := ""
+	if onlyIdentifying == "" || invoiceMoney == "" {
+		this.ServeJson(NewResult("", errors.New("传入参数不正确")))
+		return
+	}
+	orderArr := []string{}
+	money := int64(0)
+	for _, v := range strings.Split(invoiceMoney, ",") {
+		invoiceMoneyArr := strings.Split(v, ":")
+		orderArr = append(orderArr, invoiceMoneyArr[0])
+		money += qutil.Int64All(invoiceMoneyArr[1])
+	}
+	var sData map[string]interface{}
+	invoiceOne := util.Mysql.FindOne("invoice", map[string]interface{}{
+		"only_Identifying": onlyIdentifying,
+	}, "id,invoice_changed,order_code, invoice_order_code,bank_account,invoice_code, create_time,invoice_number,company_phone,company_name, phone, mail,company_phone, invoice_type, invoice_content, url, invoice_status, invoice_serialnum, taxpayer_identnum,operator, operable_time, invoicing_entity, remark, invoice_variety, logistics_code, company_address, bank_name, recipient, delivery_address,only_Identifying", " create_time   DESC")
+	companyName := ""
+	if invoiceOne == nil {
+		//查询公司名称
+		querySQL := fmt.Sprintf("select company_name,user_phone  from   dataexport_order  where order_code  in  (%s)   and  company_name!=''   ORDER BY  create_time   DESC LIMIT 1", fmt.Sprintf("\"%s\"", strings.Join(orderArr, "\",\"")))
+		orderArr := util.Mysql.SelectBySql(querySQL)
+		if orderArr != nil && len(*orderArr) > 0 {
+			companyName = qutil.ObjToString((*orderArr)[0]["company_name"])
+			sData = ShowData(qutil.ObjToString((*orderArr)[0]["user_phone"]))
+			//回显内容
+		}
+	} else {
+		(*invoiceOne)["order_code"] = qutil.If((*invoiceOne)["invoice_order_code"] != nil, (*invoiceOne)["invoice_order_code"], (*invoiceOne)["order_code"])
+		(*invoiceOne)["id"] = encrypt.SE.Encode2Hex(qutil.InterfaceToStr((*invoiceOne)["id"]))
+		timeLimit := qutil.Int64All((*invoiceOne)["create_time"]) <= config.InvoiceConfig.Order_createtime //24年之前的发票不让换票
+		switch qutil.IntAll((*invoiceOne)["invoice_status"]) {
+		case 1:
+			isJyInvoice := !(qutil.InterfaceToStr((*invoiceOne)["invoice_number"]) != "" && qutil.InterfaceToStr((*invoiceOne)["invoice_code"]) == "") //非数电票
+			isJyEntity := (*invoiceOne)["invoicing_entity"] != nil && qutil.InterfaceToStr((*invoiceOne)["invoicing_entity"]) != config.InvoiceConfig.SigningSubject
+			isChanged := util.Mysql.Count("invoice", map[string]interface{}{
+				"only_Identifying": onlyIdentifying,
+				"order_code":       (*invoiceOne)["order_code"],
+			}) > 1
+			(*invoiceOne)["changed"] = qutil.If(isJyInvoice || isChanged || isJyEntity || timeLimit, true, false)
+		case -1: //失败支持重新提交否
+			if !timeLimit {
+				(*invoiceOne)["isReopen"] = util.Mysql.Count("invoice_fail_record", map[string]interface{}{
+					"only_Identifying": onlyIdentifying,
+					"order_code":       (*invoiceOne)["order_code"],
+				})+1 >= config.InvoiceConfig.SubmitNum
+			} else {
+				(*invoiceOne)["isReopen"] = false
+			}
+		}
+	}
+
+	this.ServeJson(NewResult(map[string]interface{}{
+		"orderCodes":   strings.Join(orderArr, ","),
+		"money":        money,
+		"invoice":      &invoiceOne,
+		"operator":     operator,
+		"company_name": companyName,
+		"showData":     sData, //回显近期信息
+		"isFollowWx":   1,
+	}, nil))
 }
 
 func ShowData(phone string) map[string]interface{} {
-    data := util.Mysql.SelectBySql(fmt.Sprintf(`SELECT company_name,phone,company_phone,mail,invoice_variety,invoice_type,company_address,bank_name,bank_account,remark,taxpayer_identnum FROM invoice WHERE phone = '%s' ORDER BY create_time desc LIMIT 1`, phone))
-    if data != nil && len(*data) > 0 {
-        return (*data)[0]
-    }
-    return nil
+	data := util.Mysql.SelectBySql(fmt.Sprintf(`SELECT company_name,phone,company_phone,mail,invoice_variety,invoice_content,invoice_type,company_address,bank_name,bank_account,remark,taxpayer_identnum FROM invoice WHERE phone = '%s' ORDER BY create_time desc LIMIT 1`, phone))
+	if data != nil && len(*data) > 0 {
+		return (*data)[0]
+	}
+	return nil
 }
 
 // GetUserId 获取用户id从订单中
 func GetUserId(orderCode string) (userId string) {
-    rs := util.Mysql.SelectBySql(fmt.Sprintf("select user_id from %s where order_code=?", "dataexport_order"), orderCode)
-    if rs != nil && len(*rs) > 0 {
-        userId = qutil.ObjToString((*rs)[0]["userId"])
-    }
-    return userId
+	rs := util.Mysql.SelectBySql(fmt.Sprintf("select user_id from %s where order_code=?", "dataexport_order"), orderCode)
+	if rs != nil && len(*rs) > 0 {
+		userId = qutil.ObjToString((*rs)[0]["userId"])
+	}
+	return userId
 }
 
 // 调航天金税接口
 func htjs(body map[string]interface{}, orderCode []string, invoiceType, companyName, taxpayerIdentnum, mail, phone string) {
-    invoice_status := 0
-    client := &http.Client{}
-    b, _ := json.Marshal(body)
-    buffer := bytes.NewBuffer(b)
-    request, _ := http.NewRequest("POST", config.InvoiceConfig.Invoice_interface_address+"/Invoice/Add", buffer)
-    response, err := client.Do(request)
-    if err == nil {
-        res, err := ioutil.ReadAll(response.Body)
-        if err != nil {
-            invoice_status = -1
-        } else {
-            resMap := qutil.ObjToMap(string(res))
-            if *resMap != nil {
-                if qutil.IntAll((*resMap)["code"]) == 0 { //开票成功
-                    invoice_status = 1
-                } else if qutil.IntAll((*resMap)["code"]) == 2 { //开票中
-                    invoice_status = 0
-                } else { //开票失败
-                    invoice_status = -1
-                }
-            }
-            defer response.Body.Close()
-            resData := (*resMap)["data"].(map[string]interface{})
-            if invoice_status == 1 {
-                sendMail(invoiceType, strings.Join(orderCode, ","), companyName, taxpayerIdentnum, mail, phone, qutil.InterfaceToStr(resData["path"]), "")
-            }
-            for _, v := range orderCode {
-                util.Mysql.Update(dbname, map[string]interface{}{"order_code": v, "invoice_status": 0}, map[string]interface{}{
-                    "invoice_serialnum": resData["swno"],
-                    "invoice_code":      resData["fpdm"],
-                    "invoice_number":    resData["fphm"],
-                    "url":               resData["path"],
-                    "invoice_status":    invoice_status,
-                })
-                //订单信息保存
-                updateData := map[string]interface{}{}
-                if InvoiceStatusHandle(v) {
-                    updateData["applybill_status"] = 2
-                } else {
-                    updateData["applybill_status"] = 3
-                }
-                util.Mysql.Update("dataexport_order", map[string]interface{}{
-                    "order_code": v,
-                }, updateData)
-            }
-        }
-    }
+	invoice_status := 0
+	client := &http.Client{}
+	b, _ := json.Marshal(body)
+	buffer := bytes.NewBuffer(b)
+	request, _ := http.NewRequest("POST", config.InvoiceConfig.Invoice_interface_address+"/Invoice/Add", buffer)
+	response, err := client.Do(request)
+	if err == nil {
+		res, err := ioutil.ReadAll(response.Body)
+		if err != nil {
+			invoice_status = -1
+		} else {
+			resMap := qutil.ObjToMap(string(res))
+			if *resMap != nil {
+				if qutil.IntAll((*resMap)["code"]) == 0 { //开票成功
+					invoice_status = 1
+				} else if qutil.IntAll((*resMap)["code"]) == 2 { //开票中
+					invoice_status = 0
+				} else { //开票失败
+					invoice_status = -1
+				}
+			}
+			defer response.Body.Close()
+			resData := (*resMap)["data"].(map[string]interface{})
+			if invoice_status == 1 {
+				sendMail(invoiceType, strings.Join(orderCode, ","), companyName, taxpayerIdentnum, mail, phone, qutil.InterfaceToStr(resData["path"]), "")
+			}
+			for _, v := range orderCode {
+				util.Mysql.Update(dbname, map[string]interface{}{"order_code": v, "invoice_status": 0}, map[string]interface{}{
+					"invoice_serialnum": resData["swno"],
+					"invoice_code":      resData["fpdm"],
+					"invoice_number":    resData["fphm"],
+					"url":               resData["path"],
+					"invoice_status":    invoice_status,
+				})
+				//订单信息保存
+				updateData := map[string]interface{}{}
+				if InvoiceStatusHandle(v) {
+					updateData["applybill_status"] = 2
+				} else {
+					updateData["applybill_status"] = 3
+				}
+				util.Mysql.Update("dataexport_order", map[string]interface{}{
+					"order_code": v,
+				}, updateData)
+			}
+		}
+	}
 }
 
 // 判断是全额还是部分回款
 func InvoiceStatusHandle(orderCode string) bool {
-    orderData := util.Mysql.FindOne("dataexport_order", map[string]interface{}{
-        "order_code": orderCode,
-    }, "pay_money", "")
-    if orderData == nil {
-        return false
-    }
-    invoiceData := util.Mysql.SelectBySql("select sum(invoice_order_money) as  money  from  invoice where  order_code=?  and  invoice_status>=0  ", orderCode)
-    if invoiceData == nil || len(*invoiceData) == 0 {
-        return false
-    }
-    allMoney := qutil.Int64All((*invoiceData)[0]["money"])
-    pay_money := qutil.Int64All((*orderData)["pay_money"])
-    if pay_money == allMoney {
-        return true
-    }
-    return false
+	orderData := util.Mysql.FindOne("dataexport_order", map[string]interface{}{
+		"order_code": orderCode,
+	}, "pay_money", "")
+	if orderData == nil {
+		return false
+	}
+	invoiceData := util.Mysql.SelectBySql("select sum(invoice_order_money) as  money  from  invoice where  order_code=?  and  invoice_status>=0  ", orderCode)
+	if invoiceData == nil || len(*invoiceData) == 0 {
+		return false
+	}
+	allMoney := qutil.Int64All((*invoiceData)[0]["money"])
+	pay_money := qutil.Int64All((*orderData)["pay_money"])
+	if pay_money == allMoney {
+		return true
+	}
+	return false
 }
 
 // 电子普票发邮箱
 func sendMail(invoiceType, orderCode, companyName, taxpayerIdentnum, mail, phone, url, invoiceContent string) {
-    if invoiceType == "个人" {
-        emailHtml := emailHtml_gr
-        emailHtmls := fmt.Sprintf(emailHtml, phone, mail)
-        html := fmt.Sprintf(email_format, orderCode, "电子普通发票", fmt.Sprintf("<a href=\"%s\" download class=\"download\">查看发票</a>", url), "电子普通发票", invoiceContent, emailHtmls)
-        InvoiceSendMail(mail, html, "电子发票")
-    } else {
-        emailHtml := emailHtml_gs
-        emailHtmls := fmt.Sprintf(emailHtml, companyName, taxpayerIdentnum, phone, mail)
-        html := fmt.Sprintf(email_format, orderCode, "电子普通发票", fmt.Sprintf("<a href=\"%s\" download class=\"download\">查看发票</a>", url), "电子普通发票", invoiceContent, emailHtmls)
-        InvoiceSendMail(mail, html, "电子发票")
-    }
+	if invoiceType == "个人" {
+		emailHtml := emailHtml_gr
+		emailHtmls := fmt.Sprintf(emailHtml, phone, mail)
+		html := fmt.Sprintf(email_format, orderCode, "电子普通发票", fmt.Sprintf("<a href=\"%s\" download class=\"download\">查看发票</a>", url), "电子普通发票", invoiceContent, emailHtmls)
+		InvoiceSendMail(mail, html, "电子发票")
+	} else {
+		emailHtml := emailHtml_gs
+		emailHtmls := fmt.Sprintf(emailHtml, companyName, taxpayerIdentnum, phone, mail)
+		html := fmt.Sprintf(email_format, orderCode, "电子普通发票", fmt.Sprintf("<a href=\"%s\" download class=\"download\">查看发票</a>", url), "电子普通发票", invoiceContent, emailHtmls)
+		InvoiceSendMail(mail, html, "电子发票")
+	}
 }
 
 // 剩余金额
 func InvoicePrice(orderData map[string]interface{}) int64 {
-    residueMoney := int64(0)
-    if qutil.Int64All(orderData["applybill_status"]) == 2 {
-        return residueMoney
-    }
+	residueMoney := int64(0)
+	if qutil.Int64All(orderData["applybill_status"]) == 2 {
+		return residueMoney
+	}
 
-    return qutil.Int64All(orderData["pay_money"]) - InvoiceAmount(qutil.InterfaceToStr(orderData["order_code"]))
+	return qutil.Int64All(orderData["pay_money"]) - InvoiceAmount(qutil.InterfaceToStr(orderData["order_code"]))
 }
 
 // 订单剩余金额查询
 func ResidueMoney(orderCode string) (int64, string) {
-    residueMoney := int64(0)
-    //订单信息查询
-    orderData := util.Mysql.SelectBySql("select  pay_money,applybill_status,user_phone from  dataexport_order  where  order_code =?", orderCode)
-    if len(*orderData) == 0 || orderData == nil {
-        return residueMoney, ""
-    }
-    return InvoicePrice((*orderData)[0]), qutil.InterfaceToStr((*orderData)[0]["user_phone"])
-
-    //发票信息查询
-    //invoiceData := util.Mysql.SelectBySql("select invoice_status,sum(invoice_order_money) as  money  from  invoice where  order_code=?  and  invoice_status>=0  GROUP BY  invoice_status", orderCode)
-    //if len(*orderData) == 0 || orderData == nil {
-    //} else {
-    //    //开过几次票
-    //    payMoney := qutil.Int64All((*orderData)[0]["pay_money"])
-    //    allMoney := int64(0)
-    //    for _, invoice := range *invoiceData {
-    //        invoice_status := qutil.Int64All(invoice["invoice_status"])
-    //        money := qutil.Int64All(invoice["money"])
-    //        if invoice_status == 0 {
-    //            return residueMoney
-    //        } else {
-    //            allMoney += money
-    //        }
-    //    }
-    //    residueMoney = payMoney - allMoney
-    //}
-    //return residueMoney
+	residueMoney := int64(0)
+	//订单信息查询
+	orderData := util.Mysql.SelectBySql("select  pay_money,applybill_status,user_phone from  dataexport_order  where  order_code =?", orderCode)
+	if len(*orderData) == 0 || orderData == nil {
+		return residueMoney, ""
+	}
+	return InvoicePrice((*orderData)[0]), qutil.InterfaceToStr((*orderData)[0]["user_phone"])
+
+	//发票信息查询
+	//invoiceData := util.Mysql.SelectBySql("select invoice_status,sum(invoice_order_money) as  money  from  invoice where  order_code=?  and  invoice_status>=0  GROUP BY  invoice_status", orderCode)
+	//if len(*orderData) == 0 || orderData == nil {
+	//} else {
+	//    //开过几次票
+	//    payMoney := qutil.Int64All((*orderData)[0]["pay_money"])
+	//    allMoney := int64(0)
+	//    for _, invoice := range *invoiceData {
+	//        invoice_status := qutil.Int64All(invoice["invoice_status"])
+	//        money := qutil.Int64All(invoice["money"])
+	//        if invoice_status == 0 {
+	//            return residueMoney
+	//        } else {
+	//            allMoney += money
+	//        }
+	//    }
+	//    residueMoney = payMoney - allMoney
+	//}
+	//return residueMoney
 }