package models

import (
	"fmt"
	"mtp2_if/db"
	"time"
)

// 企业风管期货单据相关

// Hedgeouttradeposition 对冲外部持仓头寸表 - 导历史
type Hedgeouttradeposition struct {
	Accountid         int64   `json:"accountid"  xorm:"'ACCOUNTID'" binding:"required"`       // 资金账号[外部母账户]
	Hedgegoodsid      int64   `json:"hedgegoodsid"  xorm:"'HEDGEGOODSID'" binding:"required"` // 对冲合约ID
	Hedgeaccountcode  string  `json:"hedgeaccountcode"  xorm:"'HEDGEACCOUNTCODE'"`            // 对冲账号
	Tradedate         string  `json:"tradedate"  xorm:"'TRADEDATE'"`                          // 交易日(yyyyMMdd)
	Marketid          int32   `json:"marketid"  xorm:"'MARKETID'"`                            // 市场ID
	Ydbuyposition     int64   `json:"ydbuyposition"  xorm:"'YDBUYPOSITION'"`                  // 期初买头寸
	Curbuyposition    int64   `json:"curbuyposition"  xorm:"'CURBUYPOSITION'"`                // 期末买头寸
	Curydbuyposition  int64   `json:"curydbuyposition"  xorm:"'CURYDBUYPOSITION'"`            // 期末上日买头寸
	Curtdbuyposition  int64   `json:"curtdbuyposition"  xorm:"'CURTDBUYPOSITION'"`            // 期末今日买头寸
	Freydbuyposition  int64   `json:"freydbuyposition"  xorm:"'FREYDBUYPOSITION'"`            // 冻结上日买头寸
	Fretdbuyposition  int64   `json:"fretdbuyposition"  xorm:"'FRETDBUYPOSITION'"`            // 冻结今日买头寸
	Ydsellposition    int64   `json:"ydsellposition"  xorm:"'YDSELLPOSITION'"`                // 期初卖头寸
	Cursellposition   int64   `json:"cursellposition"  xorm:"'CURSELLPOSITION'"`              // 期末卖头寸
	Curydsellposition int64   `json:"curydsellposition"  xorm:"'CURYDSELLPOSITION'"`          // 期末上日卖头寸
	Curtdsellposition int64   `json:"curtdsellposition"  xorm:"'CURTDSELLPOSITION'"`          // 期末今日卖头寸
	Freydsellposition int64   `json:"freydsellposition"  xorm:"'FREYDSELLPOSITION'"`          // 冻结上日卖头寸
	Fretdsellposition int64   `json:"fretdsellposition"  xorm:"'FRETDSELLPOSITION'"`          // 冻结今日卖头寸
	Buyopencost       float64 `json:"buyopencost"  xorm:"'BUYOPENCOST'"`                      // 买开仓成本
	Buypositioncost   float64 `json:"buypositioncost"  xorm:"'BUYPOSITIONCOST'"`              // 买持仓成本
	Buyusemargin      float64 `json:"buyusemargin"  xorm:"'BUYUSEMARGIN'"`                    // 买占用保证金
	Sellopencost      float64 `json:"sellopencost"  xorm:"'SELLOPENCOST'"`                    // 卖开仓成本
	Sellpositioncost  float64 `json:"sellpositioncost"  xorm:"'SELLPOSITIONCOST'"`            // 卖持仓成本
	Sellusemargin     float64 `json:"sellusemargin"  xorm:"'SELLUSEMARGIN'"`                  // 卖占用保证金
}

// TableName is HEDGE_OUTTRADEPOSITION
func (Hedgeouttradeposition) TableName() string {
	return "HEDGE_OUTTRADEPOSITION"
}

// Hedgeoutorderdetail 对冲外部委托单表 - 导历史
type Hedgeoutorderdetail struct {
	Outorderid            int64     `json:"outorderid"  xorm:"'OUTORDERID'" binding:"required"`             // 外部委托单ID(113+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
	Hedgeaccountcode      string    `json:"hedgeaccountcode"  xorm:"'HEDGEACCOUNTCODE'" binding:"required"` // 对冲账号
	Tradedate             string    `json:"tradedate"  xorm:"'TRADEDATE'"`                                  // 交易日(yyyyMMdd)
	Accountid             int64     `json:"accountid"  xorm:"'ACCOUNTID'"`                                  // 资金账号[外部母账户]
	Relatedorderid        int64     `json:"relatedorderid"  xorm:"'RELATEDORDERID'"`                        // 关联内部委托单号
	Marketid              int32     `json:"marketid"  xorm:"'MARKETID'"`                                    // 市场ID
	Hedgegoodsid          int64     `json:"hedgegoodsid"  xorm:"'HEDGEGOODSID'"`                            // 对冲合约ID
	Orderpricetype        int32     `json:"orderpricetype"  xorm:"'ORDERPRICETYPE'"`                        // 报单价格条件 - 1:市价 2: 限价
	Buyorsell             int32     `json:"buyorsell"  xorm:"'BUYORSELL'"`                                  // 买卖方向 - 0:买 1:卖
	Channelbuildtype      int32     `json:"channelbuildtype"  xorm:"'CHANNELBUILDTYPE'"`                    // 开平标志- 0:无 1:建仓 2:平仓
	Closetype             int32     `json:"closetype"  xorm:"'CLOSETYPE'"`                                  // 平仓方式 - 0:无 1:平今 2:平昨
	Orderprice            float64   `json:"orderprice"  xorm:"'ORDERPRICE'"`                                // 委托价格
	Orderqty              int64     `json:"orderqty"  xorm:"'ORDERQTY'"`                                    // 委托数量
	Tradeqty              int64     `json:"tradeqty"  xorm:"'TRADEQTY'"`                                    // 成交数量
	Cancelqty             int64     `json:"cancelqty"  xorm:"'CANCELQTY'"`                                  // 撤销数量
	Validtype             int32     `json:"validtype"  xorm:"'VALIDTYPE'"`                                  // 有效期类型 - 1::当日有效
	Hedgeflag             int32     `json:"hedgeflag"  xorm:"'HEDGEFLAG'"`                                  // 投机套保标志 - 0:无 1:投机 2:套保 3:套利
	Channeloutorderstatus int32     `json:"channeloutorderstatus"  xorm:"'CHANNELOUTORDERSTATUS'"`          // 外部单据状态 - 1 - 接收报文 2 - 发送报文成功 3 - 委托成功 4 - 委托失败 5 - 全部成交 6 - 部成部撤 7 - 全部撤单
	Ordertime             time.Time `json:"ordertime"  xorm:"'ORDERTIME'"`                                  // 委托时间
	Updatetime            time.Time `json:"updatetime"  xorm:"'UPDATETIME'"`                                // 更新时间
	Mhpinnerorderid       int64     `json:"mhpinnerorderid"  xorm:"'MHPINNERORDERID'"`                      // 接口平台委托单ID
	Mhprspcode            int64     `json:"mhprspcode"  xorm:"'MHPRSPCODE'"`                                // 渠道返回码
	Mhprsptext            string    `json:"mhprsptext"  xorm:"'MHPRSPTEXT'"`                                // 渠道返回信息
	Optiontype            int32     `json:"optiontype"  xorm:"'OPTIONTYPE'"`                                // 期权类型 - 1:认购(看涨) 2:认沽(看跌)
	Premium               float64   `json:"premium"  xorm:"'PREMIUM'"`                                      // 权利金
	Realoutorderid        int64     `json:"realoutorderid"  xorm:"'REALOUTORDERID'"`                        // 实际外部平台委托单ID
	Relatedcreateorderid  int64     `json:"relatedcreateorderid"  xorm:"'RELATEDCREATEORDERID'"`            // 关联外部建仓委托单ID[平仓委托]
	Channeloperatetype    int32     `json:"channeloperatetype"  xorm:"'CHANNELOPERATETYPE'"`                // 操作类型 - 1:正常委托 2:斩仓委托 3:强平委托
	Channelordersrc       int32     `json:"channelordersrc"  xorm:"'CHANNELORDERSRC'"`                      // 委托来源 -  1:客户端 2:风控服务 3:管理端 4:下单接口平台 5:交易服务 6:跟单服务 7:监控终端
	Operatorid            int64     `json:"operatorid"  xorm:"'OPERATORID'"`                                // 登录账号(LoginID)
	Clientordertime       time.Time `json:"clientordertime"  xorm:"'CLIENTORDERTIME'"`                      // 客户端委托时间
	Clientticket          string    `json:"clientticket"  xorm:"'CLIENTTICKET'"`                            // 客户端流水号
	UUID                  string    `json:"uuid"  xorm:"'UUID'"`                                            // 发起端唯一id
	Clienttype            int32     `json:"clienttype"  xorm:"'CLIENTTYPE'"`                                // 客户端类型 - 0:保留为未填终端类型 1:PC管理端 2:PC交易端 3:手机客户端_安卓 4:网页客户端 5:微信客户端 6:手机客户端_苹果 7:网上开户客户端 8:无效终端编号 9:报价终端(中江) 10;监控终端
	Sessionid             int64     `json:"sessionid"  xorm:"'SESSIONID'"`                                  // 会话ID
}

// TableName is HEDGE_OUTORDERDETAIL
func (Hedgeoutorderdetail) TableName() string {
	return "HEDGE_OUTORDERDETAIL"
}

// Hedgeouttradedetail 对冲外部成交单表 - 导历史
type Hedgeouttradedetail struct {
	Outtradeid             int64     `json:"outtradeid"  xorm:"'OUTTRADEID'" binding:"required"`      // 外部成交单ID(114+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
	Tradedate              string    `json:"tradedate"  xorm:"'TRADEDATE'"`                           // 交易日(yyyyMMdd)
	Relatedoutorderid      int64     `json:"relatedoutorderid"  xorm:"'RELATEDOUTORDERID'"`           // 关联外部委托单ID
	Accountid              int64     `json:"accountid"  xorm:"'ACCOUNTID'"`                           // 资金账号[外部母账户]
	Hedgeaccountcode       string    `json:"hedgeaccountcode"  xorm:"'HEDGEACCOUNTCODE'"`             // 对冲账号
	Marketid               int32     `json:"marketid"  xorm:"'MARKETID'"`                             // 市场ID
	Hedgegoodsid           int64     `json:"hedgegoodsid"  xorm:"'HEDGEGOODSID'"`                     // 对冲合约ID
	Buyorsell              int32     `json:"buyorsell"  xorm:"'BUYORSELL'"`                           // 买卖方向 - 0:买 1:卖
	Channelbuildtype       int32     `json:"channelbuildtype"  xorm:"'CHANNELBUILDTYPE'"`             // 开平标志- 0:无 1:建仓 2:平仓
	Closetype              int32     `json:"closetype"  xorm:"'CLOSETYPE'"`                           // 平仓方式 - 0:无 1:平今 2:平昨
	Hedgeflag              int32     `json:"hedgeflag"  xorm:"'HEDGEFLAG'"`                           // 投机套保标志 - 0:无 1:投机 2:套保 3:套利
	Tradeprice             float64   `json:"tradeprice"  xorm:"'TRADEPRICE'"`                         // 成交价格
	Tradeqty               int64     `json:"tradeqty"  xorm:"'TRADEQTY'"`                             // 成交数量
	Tradetime              time.Time `json:"tradetime"  xorm:"'TRADETIME'"`                           // 成交时间
	Relatedmhpinnerorderid int64     `json:"relatedmhpinnerorderid"  xorm:"'RELATEDMHPINNERORDERID'"` // 接口平台委托单ID
	Mhpinnertradeid        int64     `json:"mhpinnertradeid"  xorm:"'MHPINNERTRADEID'"`               // 接口平台成交单ID
	Hasinnerorder          int32     `json:"hasinnerorder"  xorm:"'HASINNERORDER'"`                   // 是否有内部单关联 - 0:无 1:有
	Isvalid                int32     `json:"isvalid"  xorm:"'ISVALID'"`                               // 是否有效 - 0:无效 1:有效
	Optiontype             int32     `json:"optiontype"  xorm:"'OPTIONTYPE'"`                         // 期权类型 - 1:认购(看涨) 2:认沽(看跌)
	Premium                float64   `json:"premium"  xorm:"'PREMIUM'"`                               // 权利金
	Tradetype              int32     `json:"tradetype"  xorm:"'TRADETYPE'"`                           // 成交类别 - 1:正常委托成交3:修正持仓成交
}

// TableName is HEDGE_OUTTRADEDETAIL
func (Hedgeouttradedetail) TableName() string {
	return "HEDGE_OUTTRADEDETAIL"
}

// Hedgeinnerholderdetail 对冲内部持仓单表 - 导历史
type Hedgeinnerholderdetail struct {
	Tradeid         string    `json:"tradeid"  xorm:"'TRADEIDSTR'" binding:"required"`  // 成交单号(108+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
	Buyorsell       int32     `json:"buyorsell"  xorm:"'BUYORSELL'" binding:"required"` // 方向 - 0:买 1:卖
	Tradedate       string    `json:"tradedate"  xorm:"'TRADEDATE'"`                    // 交易日(yyyyMMdd)
	Marketid        int32     `json:"marketid"  xorm:"'MARKETID'"`                      // 市场ID
	Goodsid         int32     `json:"goodsid"  xorm:"'GOODSID'"`                        // 商品ID
	Accountid       int64     `json:"accountid"  xorm:"'ACCOUNTID'"`                    // 账号ID
	Openqty         int64     `json:"openqty"  xorm:"'OPENQTY'"`                        // 建仓数量
	Holderqty       int64     `json:"holderqty"  xorm:"'HOLDERQTY'"`                    // 持仓数量
	Freezeqty       int64     `json:"freezeqty"  xorm:"'FREEZEQTY'"`                    // 冻结数量 - 按单平使用
	Openprice       float64   `json:"openprice"  xorm:"'OPENPRICE'"`                    // 建仓价格
	Holderprice     float64   `json:"holderprice"  xorm:"'HOLDERPRICE'"`                // 持仓价格
	Tradeamount     float64   `json:"tradeamount"  xorm:"'TRADEAMOUNT'"`                // 成交金额[账户]
	Holderamount    float64   `json:"holderamount"  xorm:"'HOLDERAMOUNT'"`              // 持仓金额 [商品币种]
	Releaseamount   float64   `json:"releaseamount"  xorm:"'RELEASEAMOUNT'"`            // 释放持仓金额[商品币种]
	Holderdays      int32     `json:"holderdays"  xorm:"'HOLDERDAYS'"`                  // 剩余冻结天数
	Tradetime       time.Time `json:"tradetime"  xorm:"'TRADETIME'"`                    // 交易时间
	Parentaccountid int64     `json:"parentaccountid"  xorm:"'PARENTACCOUNTID'"`        // 所属母账户
}

// TableName is HEDGE_INNERHOLDERDETAIL
func (Hedgeinnerholderdetail) TableName() string {
	return "HEDGE_INNERHOLDERDETAIL"
}

// GetList 获取内部持仓明细
func (t *Hedgeinnerholderdetail) GetList(accountID, goodsID, buyOrSell int) ([]Hedgeinnerholderdetail, error) {
	datas := make([]Hedgeinnerholderdetail, 0)
	session := db.GetEngine().Table("HEDGE_INNERHOLDERDETAIL T").Select("to_char(T.TRADEID) TRADEIDSTR, T.*").Where("T.ACCOUNTID = ?", accountID)
	if goodsID != 0 {
		session = session.And("T.GOODSID = ?", goodsID)
	}
	if buyOrSell != 0 {
		session = session.And("T.BUYORSELL = ?", buyOrSell)
	}
	if err := session.Find(&datas); err != nil {
		return nil, err
	}

	return datas, nil
}

// Hedgeinnerorderdetail 对冲内部委托单表 - 导历史
type Hedgeinnerorderdetail struct {
	Orderid                 int64     `json:"orderid"  xorm:"'ORDERID'" binding:"required"`              // 委托单号(107+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
	Tradedate               string    `json:"tradedate"  xorm:"'TRADEDATE'"`                             // 交易日(yyyyMMdd)
	Channelbuildtype        int32     `json:"channelbuildtype"  xorm:"'CHANNELBUILDTYPE'"`               // 开平标志 - 0:无 1:建仓 2:平仓
	Closetype               int32     `json:"closetype"  xorm:"'CLOSETYPE'"`                             // 平仓方式 - 0:无 1:平今 2:平昨
	Hedgeflag               int32     `json:"hedgeflag"  xorm:"'HEDGEFLAG'"`                             // 投机套保标志 - 0:无 1:投机 2:套保 3:套利
	Marketid                int32     `json:"marketid"  xorm:"'MARKETID'"`                               // 市场ID
	Goodsid                 int32     `json:"goodsid"  xorm:"'GOODSID'"`                                 // 商品ID
	Accountid               int64     `json:"accountid"  xorm:"'ACCOUNTID'"`                             // 账户ID
	Buyorsell               int32     `json:"buyorsell"  xorm:"'BUYORSELL'"`                             // 买卖 - 0:买 1:卖
	Pricemode               int32     `json:"pricemode"  xorm:"'PRICEMODE'"`                             // 取价方式 - 1:市价 2: 限价
	Orderprice              float64   `json:"orderprice"  xorm:"'ORDERPRICE'"`                           // 委托价格(账户)
	Openorderqty            int64     `json:"openorderqty"  xorm:"'OPENORDERQTY'"`                       // 委托数量
	Opentradeqty            int64     `json:"opentradeqty"  xorm:"'OPENTRADEQTY'"`                       // 成交数量
	Opencancelqty           int64     `json:"opencancelqty"  xorm:"'OPENCANCELQTY'"`                     // 撤单数量
	Openfailqty             int64     `json:"openfailqty"  xorm:"'OPENFAILQTY'"`                         // 失败数量
	Opensuccessqty          int64     `json:"opensuccessqty"  xorm:"'OPENSUCCESSQTY'"`                   // 建仓委托成功数量
	Closeorderqty           int64     `json:"closeorderqty"  xorm:"'CLOSEORDERQTY'"`                     // 委托数量
	Closetradeqty           int64     `json:"closetradeqty"  xorm:"'CLOSETRADEQTY'"`                     // 成交数量
	Closecancelqty          int64     `json:"closecancelqty"  xorm:"'CLOSECANCELQTY'"`                   // 撤单数量
	Closefailqty            int64     `json:"closefailqty"  xorm:"'CLOSEFAILQTY'"`                       // 失败数量
	Closesuccessqty         int64     `json:"closesuccessqty"  xorm:"'CLOSESUCCESSQTY'"`                 // 委托成功数量
	Openfreezemargin        float64   `json:"openfreezemargin"  xorm:"'OPENFREEZEMARGIN'"`               // 冻结保证金(冻结交易金额)
	Openunfreezemargin      float64   `json:"openunfreezemargin"  xorm:"'OPENUNFREEZEMARGIN'"`           // 解冻保证金
	Openfreezecharge        float64   `json:"openfreezecharge"  xorm:"'OPENFREEZECHARGE'"`               // 建仓冻结手续费(账户)
	Openunfreezecharge      float64   `json:"openunfreezecharge"  xorm:"'OPENUNFREEZECHARGE'"`           // 建仓解冻手续费(账户)
	Validtype               int32     `json:"validtype"  xorm:"'VALIDTYPE'"`                             // 有效类型 - 1当日有效
	Validtime               time.Time `json:"validtime"  xorm:"'VALIDTIME'"`                             // 有效期限
	Channeloperatetype      int32     `json:"channeloperatetype"  xorm:"'CHANNELOPERATETYPE'"`           // 操作类型 - 1:正常委托 2:斩仓委托 3:强平委托
	Ordertime               time.Time `json:"ordertime"  xorm:"'ORDERTIME'"`                             // 委托时间
	Channelordersrc         int32     `json:"channelordersrc"  xorm:"'CHANNELORDERSRC'"`                 // 委托来源 -  1:客户端 2:风控服务 3:管理端 4:下单接口平台 5:交易服务 6:跟单服务 7:监控终端
	Channelinnerorderstatus int32     `json:"channelinnerorderstatus"  xorm:"'CHANNELINNERORDERSTATUS'"` // 委托状态 - 1:委托请求 2:冻结成功 3:委托失败 4:委托部成部失败                  5:委托成功 6:全部撤销 7:部成部撤 8:部成部撤部失败 9:全部成交
	Operatorid              int64     `json:"operatorid"  xorm:"'OPERATORID'"`                           // 登录账号(LoginID)
	Updatetime              time.Time `json:"updatetime"  xorm:"'UPDATETIME'"`                           // 更新时间
	Clientordertime         time.Time `json:"clientordertime"  xorm:"'CLIENTORDERTIME'"`                 // 客户端委托时间
	Clientticket            string    `json:"clientticket"  xorm:"'CLIENTTICKET'"`                       // 客户端流水号
	UUID                    string    `json:"uuid"  xorm:"'UUID'"`                                       // 发起端唯一id
	Clienttype              int32     `json:"clienttype"  xorm:"'CLIENTTYPE'"`                           // 客户端类型 - 0:保留为未填终端类型 1:PC管理端 2:PC交易端 3:手机客户端_安卓 4:网页客户端 5:微信客户端 6:手机客户端_苹果 7:网上开户客户端 8:无效终端编号 9:报价终端(中江) 10;监控终端
	Retcode                 int32     `json:"retcode"  xorm:"'RETCODE'"`                                 // 错误代码
	Marginalgorithm         int32     `json:"marginalgorithm"  xorm:"'MARGINALGORITHM'"`                 // 保证金收取方式  1：比率  2：固定
	Marginvalue             float64   `json:"marginvalue"  xorm:"'MARGINVALUE'"`                         // 即市保证金设置值
	Openfeealgorithm        int32     `json:"openfeealgorithm"  xorm:"'OPENFEEALGORITHM'"`               // 建仓手续费收取方式  1：比率  2：固定
	Openchargevalue         float64   `json:"openchargevalue"  xorm:"'OPENCHARGEVALUE'"`                 // 建仓手续费设置值
	Closefeealgorithm       int32     `json:"closefeealgorithm"  xorm:"'CLOSEFEEALGORITHM'"`             // 平仓手续费收取方式 1：比率  2：固定
	Closechargevalue        float64   `json:"closechargevalue"  xorm:"'CLOSECHARGEVALUE'"`               // 平仓手续费设置值
	Accountcurrencyid       int32     `json:"accountcurrencyid"  xorm:"'ACCOUNTCURRENCYID'"`             // 账户币种ID
	Goodscurrencyid         int32     `json:"goodscurrencyid"  xorm:"'GOODSCURRENCYID'"`                 // 商品币种ID
	Margincurrencyid        int32     `json:"margincurrencyid"  xorm:"'MARGINCURRENCYID'"`               // 保证金币种ID 比率时等于账户币种
	Marginrate              float64   `json:"marginrate"  xorm:"'MARGINRATE'"`                           // 保证金汇率-比率时等于1
	Curexchangerate         float64   `json:"curexchangerate"  xorm:"'CUREXCHANGERATE'"`                 // 当前汇率
	Goodsorderprice         float64   `json:"goodsorderprice"  xorm:"'GOODSORDERPRICE'"`                 // 委托价格(商品)
	Openfreezemargin2       float64   `json:"openfreezemargin2"  xorm:"'OPENFREEZEMARGIN2'"`             // 建仓冻结保证金(保证金/商品)
	Openfreezecharge2       float64   `json:"openfreezecharge2"  xorm:"'OPENFREEZECHARGE2'"`             // 建仓冻结手续费(商品)
	Openunfreezemargin2     float64   `json:"openunfreezemargin2"  xorm:"'OPENUNFREEZEMARGIN2'"`         // 建仓解冻保证金(保证金/商品)
	Openunfreezecharge2     float64   `json:"openunfreezecharge2"  xorm:"'OPENUNFREEZECHARGE2'"`         // 建仓解冻手续费(商品)
	Parentaccountid         int64     `json:"parentaccountid"  xorm:"'PARENTACCOUNTID'"`                 // 所属母账户
	Sessionid               int64     `json:"sessionid"  xorm:"'SESSIONID'"`                             // 会话ID
}

// TableName is HEDGE_INNERORDERDETAIL
func (Hedgeinnerorderdetail) TableName() string {
	return "HEDGE_INNERORDERDETAIL"
}

// Hedgeinnertradedetail 对冲内部成交单表 - 导历史
type Hedgeinnertradedetail struct {
	Tradeid                  int64     `json:"tradeid"  xorm:"'TRADEID'" binding:"required"`                // 成交单号(108+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
	Buyorsell                int32     `json:"buyorsell"  xorm:"'BUYORSELL'" binding:"required"`            // 方向 - 0:买 1:卖
	Orderid                  int64     `json:"orderid"  xorm:"'ORDERID'"`                                   // 委托单号
	Tradedate                string    `json:"tradedate"  xorm:"'TRADEDATE'"`                               // 交易日(yyyyMMdd)
	Accountid                int64     `json:"accountid"  xorm:"'ACCOUNTID'"`                               // 账号ID
	Goodsid                  int32     `json:"goodsid"  xorm:"'GOODSID'"`                                   // 商品ID
	Marketid                 int32     `json:"marketid"  xorm:"'MARKETID'"`                                 // 市场ID
	Tradetime                time.Time `json:"tradetime"  xorm:"'TRADETIME'"`                               // 成交时间
	Tradeprice               float64   `json:"tradeprice"  xorm:"'TRADEPRICE'"`                             // 成交价格
	Tradeqty                 int64     `json:"tradeqty"  xorm:"'TRADEQTY'"`                                 // 成交数量
	Tradeamount              float64   `json:"tradeamount"  xorm:"'TRADEAMOUNT'"`                           // 成交金额(账户)
	Closepl                  float64   `json:"closepl"  xorm:"'CLOSEPL'"`                                   // 平仓盈亏(账户)
	Opencharge               float64   `json:"opencharge"  xorm:"'OPENCHARGE'"`                             // 建仓手续费(账户)
	Closecharge              float64   `json:"closecharge"  xorm:"'CLOSECHARGE'"`                           // 平仓手续费(账户)
	Tradetype                int32     `json:"tradetype"  xorm:"'TRADETYPE'"`                               // 成交类别 - 1:正常委托成交 2:风控斩仓成交 3:修正持仓成交 4:管理端斩仓成交
	Channelbuildtype         int32     `json:"channelbuildtype"  xorm:"'CHANNELBUILDTYPE'"`                 // 委托单据类型 0:无 1:建仓 2:平仓
	Closetype                int32     `json:"closetype"  xorm:"'CLOSETYPE'"`                               // 平仓方式 - 0:无 1:平今 2:平昨
	Hedgeflag                int32     `json:"hedgeflag"  xorm:"'HEDGEFLAG'"`                               // 投机套保标志 - 0:无 1:投机 2:套保 3:套利
	Openqty                  int64     `json:"openqty"  xorm:"'OPENQTY'"`                                   // 开仓数量(先建后平操作 需要记录)
	Closeqty                 int64     `json:"closeqty"  xorm:"'CLOSEQTY'"`                                 // 平仓数量(先建后平操作 需要记录)
	Status                   int32     `json:"status"  xorm:"'STATUS'"`                                     // 处理状态 - 1:待处理 2:已处理 3:处理失败
	Isreckoned               int32     `json:"isreckoned"  xorm:"'ISRECKONED'"`                             // 是否结算 - 0:未结算 1:已结算
	Openfeealgorithm         int32     `json:"openfeealgorithm"  xorm:"'OPENFEEALGORITHM'"`                 // 建仓手续费收取方式  1：比率  2：固定
	Openchargevalue          float64   `json:"openchargevalue"  xorm:"'OPENCHARGEVALUE'"`                   // 建仓手续费设置值
	Closefeealgorithm        int32     `json:"closefeealgorithm"  xorm:"'CLOSEFEEALGORITHM'"`               // 平仓手续费收取方式 1：比率  2：固定
	Closechargevalue         float64   `json:"closechargevalue"  xorm:"'CLOSECHARGEVALUE'"`                 // 平仓手续费设置值
	Accountcurrencyid        int32     `json:"accountcurrencyid"  xorm:"'ACCOUNTCURRENCYID'"`               // 账户币种ID
	Goodscurrencyid          int32     `json:"goodscurrencyid"  xorm:"'GOODSCURRENCYID'"`                   // 商品币种ID
	Curexchangerate          float64   `json:"curexchangerate"  xorm:"'CUREXCHANGERATE'"`                   // 当前汇率
	Opencharge2              float64   `json:"opencharge2"  xorm:"'OPENCHARGE2'"`                           // 建仓手续费(商品)
	Closecharge2             float64   `json:"closecharge2"  xorm:"'CLOSECHARGE2'"`                         // 平仓手续费(商品)
	Closepl2                 float64   `json:"closepl2"  xorm:"'CLOSEPL2'"`                                 // 平仓盈亏(商品)
	Closepl3                 float64   `json:"closepl3"  xorm:"'CLOSEPL3'"`                                 // 平仓盈亏(账户)(逐笔)
	Closepl4                 float64   `json:"closepl4"  xorm:"'CLOSEPL4'"`                                 // 平仓盈亏(商品)(逐笔)
	Extenalopenfeealgorithm  int32     `json:"extenalopenfeealgorithm"  xorm:"'EXTENALOPENFEEALGORITHM'"`   // 建仓手续费收取方式(外部配置) 1：比率  2：固定
	Extenalopenchargevalue   float64   `json:"extenalopenchargevalue"  xorm:"'EXTENALOPENCHARGEVALUE'"`     // 建仓手续费设置值
	Extenalclosefeealgorithm int32     `json:"extenalclosefeealgorithm"  xorm:"'EXTENALCLOSEFEEALGORITHM'"` // 平仓手续费收取方式 1：比率  2：固定
	Extenalclosechargevalue  float64   `json:"extenalclosechargevalue"  xorm:"'EXTENALCLOSECHARGEVALUE'"`   // 平仓手续费设置值
	Extenalopencharge        float64   `json:"extenalopencharge"  xorm:"'EXTENALOPENCHARGE'"`               // 建仓手续费(商品)(外部)
	Extenalclosecharge       float64   `json:"extenalclosecharge"  xorm:"'EXTENALCLOSECHARGE'"`             // 平仓手续费(商品)(外部)
	Parentaccountid          int64     `json:"parentaccountid"  xorm:"'PARENTACCOUNTID'"`                   // 所属母账户
	Relatedouttradeid        int64     `json:"relatedouttradeid"  xorm:"'RELATEDOUTTRADEID'"`               // 关联外部成交单ID
}

// TableName is HEDGE_INNERTRADEDETAIL
func (Hedgeinnertradedetail) TableName() string {
	return "HEDGE_INNERTRADEDETAIL"
}

// GetHedgeOutTradePositions 获取外部持仓头寸信息
func GetHedgeOutTradePositions(accountID int, marketID int) ([]Hedgeouttradeposition, error) {
	engine := db.GetEngine()

	hedgeOutTradePositions := make([]Hedgeouttradeposition, 0)
	session := engine.Where("ACCOUNTID = ?", accountID)
	if marketID != 0 {
		session = session.And("MARKETID = ?", marketID)
	}
	if err := session.Find(&hedgeOutTradePositions); err != nil {
		return nil, err
	}

	return hedgeOutTradePositions, nil
}

// GetHedgeInnerHolderDetails 获取指定商品和方向的通道交易内部持仓明细数据
func GetHedgeInnerHolderDetails(accountID, goodsID, buyOrSell int) ([]Hedgeinnerholderdetail, error) {
	hedgeInnerHolderDetails := make([]Hedgeinnerholderdetail, 0)

	if err := db.GetEngine().Table("HEDGE_INNERHOLDERDETAIL T").Select("T.TRADEID TRADEIDSTR, T.*").
		Where("T.GOODSID = ?", goodsID).
		And("T.BUYORSELL = ?", buyOrSell).
		And("T.ACCOUNTID = ?", accountID).
		Find(&hedgeInnerHolderDetails); err != nil {
		return nil, err
	}

	return hedgeInnerHolderDetails, nil
}

// QueryHedgeOrderDetailRsp 企业风管委托单查询返回模型
type QueryHedgeOrderDetailRsp struct {
	Orderid                 string    `json:"orderid"`                 // 委托单号(107+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
	Tradedate               string    `json:"tradedate"`               // 交易日(yyyyMMdd)
	Channelbuildtype        int32     `json:"channelbuildtype"`        // 开平标志 - 0:无 1:建仓 2:平仓
	Closetype               int32     `json:"closetype"`               // 平仓方式 - 0:无 1:平今 2:平昨
	Marketid                int32     `json:"marketid"`                // 市场ID
	Goodsid                 int32     `json:"goodsid"`                 // 商品ID
	Accountid               int64     `json:"accountid"`               // 账户ID
	Buyorsell               int32     `json:"buyorsell"`               // 买卖 - 0:买 1:卖
	Pricemode               int32     `json:"pricemode"`               // 取价方式 - 1:市价 2: 限价
	Orderprice              float64   `json:"orderprice"`              // 委托价格(账户)
	Orderqty                int64     `json:"orderqty"`                // 委托数量
	Tradeqty                int64     `json:"tradeqty"`                // 成交数量
	Openfreezemargin        float64   `json:"openfreezemargin"`        // 冻结保证金(冻结交易金额)
	Channeloperatetype      int32     `json:"channeloperatetype"`      // 操作类型 - 1:正常委托 2:斩仓委托 3:强平委托
	Ordertime               time.Time `json:"ordertime"`               // 委托时间
	Channelinnerorderstatus int32     `json:"channelinnerorderstatus"` // 委托状态 - 1:委托请求 2:冻结成功 3:委托失败 4:委托部成部失败 5:委托成功 6:全部撤销 7:部成部撤 8:部成部撤部失败 9:全部成交
	Curexchangerate         float64   `json:"curexchangerate"`         // 当前汇率

	Goodscode string `json:"goodscode"` // 商品代码(内部)
	Goodsname string `json:"goodsname"` // 商品名称

	Exchangefullname string `json:"exchangefullname"  xorm:"'EXCHANGEFULLNAME'"` // 外部交易所全称

	OrderLoginCode  string `json:"orderlogincode" xorm:"ORDERLOGINCODE"`   // 委托人
	CancelLoginCode string `json:"cancellogincode" xorm:"CANCELLOGINCODE"` // 撤单人
}

// GetHedgeInnerOrderDetails 获取指定资金账号的通道交易内部委托单信息
func GetHedgeInnerOrderDetails(accountID int) ([]QueryHedgeOrderDetailRsp, error) {
	type orderDetail struct {
		Orderid                 int64     `json:"orderid"  xorm:"'ORDERID'" binding:"required"`              // 委托单号(107+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
		Tradedate               string    `json:"tradedate"  xorm:"'TRADEDATE'"`                             // 交易日(yyyyMMdd)
		Channelbuildtype        int32     `json:"channelbuildtype"  xorm:"'CHANNELBUILDTYPE'"`               // 开平标志 - 0:无 1:建仓 2:平仓
		Closetype               int32     `json:"closetype"  xorm:"'CLOSETYPE'"`                             // 平仓方式 - 0:无 1:平今 2:平昨
		Hedgeflag               int32     `json:"hedgeflag"  xorm:"'HEDGEFLAG'"`                             // 投机套保标志 - 0:无 1:投机 2:套保 3:套利
		Marketid                int32     `json:"marketid"  xorm:"'MARKETID'"`                               // 市场ID
		Goodsid                 int32     `json:"goodsid"  xorm:"'GOODSID'"`                                 // 商品ID
		Accountid               int64     `json:"accountid"  xorm:"'ACCOUNTID'"`                             // 账户ID
		Buyorsell               int32     `json:"buyorsell"  xorm:"'BUYORSELL'"`                             // 买卖 - 0:买 1:卖
		Pricemode               int32     `json:"pricemode"  xorm:"'PRICEMODE'"`                             // 取价方式 - 1:市价 2: 限价
		Orderprice              float64   `json:"orderprice"  xorm:"'ORDERPRICE'"`                           // 委托价格(账户)
		Openorderqty            int64     `json:"openorderqty"  xorm:"'OPENORDERQTY'"`                       // 委托数量
		Opentradeqty            int64     `json:"opentradeqty"  xorm:"'OPENTRADEQTY'"`                       // 成交数量
		Opencancelqty           int64     `json:"opencancelqty"  xorm:"'OPENCANCELQTY'"`                     // 撤单数量
		Openfailqty             int64     `json:"openfailqty"  xorm:"'OPENFAILQTY'"`                         // 失败数量
		Opensuccessqty          int64     `json:"opensuccessqty"  xorm:"'OPENSUCCESSQTY'"`                   // 建仓委托成功数量
		Closeorderqty           int64     `json:"closeorderqty"  xorm:"'CLOSEORDERQTY'"`                     // 委托数量
		Closetradeqty           int64     `json:"closetradeqty"  xorm:"'CLOSETRADEQTY'"`                     // 成交数量
		Closecancelqty          int64     `json:"closecancelqty"  xorm:"'CLOSECANCELQTY'"`                   // 撤单数量
		Closefailqty            int64     `json:"closefailqty"  xorm:"'CLOSEFAILQTY'"`                       // 失败数量
		Closesuccessqty         int64     `json:"closesuccessqty"  xorm:"'CLOSESUCCESSQTY'"`                 // 委托成功数量
		Openfreezemargin        float64   `json:"openfreezemargin"  xorm:"'OPENFREEZEMARGIN'"`               // 冻结保证金(冻结交易金额)
		Openunfreezemargin      float64   `json:"openunfreezemargin"  xorm:"'OPENUNFREEZEMARGIN'"`           // 解冻保证金
		Openfreezecharge        float64   `json:"openfreezecharge"  xorm:"'OPENFREEZECHARGE'"`               // 建仓冻结手续费(账户)
		Openunfreezecharge      float64   `json:"openunfreezecharge"  xorm:"'OPENUNFREEZECHARGE'"`           // 建仓解冻手续费(账户)
		Validtype               int32     `json:"validtype"  xorm:"'VALIDTYPE'"`                             // 有效类型 - 1当日有效
		Validtime               time.Time `json:"validtime"  xorm:"'VALIDTIME'"`                             // 有效期限
		Channeloperatetype      int32     `json:"channeloperatetype"  xorm:"'CHANNELOPERATETYPE'"`           // 操作类型 - 1:正常委托 2:斩仓委托 3:强平委托
		Ordertime               time.Time `json:"ordertime"  xorm:"'ORDERTIME'"`                             // 委托时间
		Channelordersrc         int32     `json:"channelordersrc"  xorm:"'CHANNELORDERSRC'"`                 // 委托来源 -  1:客户端 2:风控服务 3:管理端 4:下单接口平台 5:交易服务 6:跟单服务 7:监控终端
		Channelinnerorderstatus int32     `json:"channelinnerorderstatus"  xorm:"'CHANNELINNERORDERSTATUS'"` // 委托状态 - 1:委托请求 2:冻结成功 3:委托失败 4:委托部成部失败                  5:委托成功 6:全部撤销 7:部成部撤 8:部成部撤部失败 9:全部成交
		Operatorid              int64     `json:"operatorid"  xorm:"'OPERATORID'"`                           // 登录账号(LoginID)
		Updatetime              time.Time `json:"updatetime"  xorm:"'UPDATETIME'"`                           // 更新时间
		Clientordertime         time.Time `json:"clientordertime"  xorm:"'CLIENTORDERTIME'"`                 // 客户端委托时间
		Clientticket            string    `json:"clientticket"  xorm:"'CLIENTTICKET'"`                       // 客户端流水号
		UUID                    string    `json:"uuid"  xorm:"'UUID'"`                                       // 发起端唯一id
		Clienttype              int32     `json:"clienttype"  xorm:"'CLIENTTYPE'"`                           // 客户端类型 - 0:保留为未填终端类型 1:PC管理端 2:PC交易端 3:手机客户端_安卓 4:网页客户端 5:微信客户端 6:手机客户端_苹果 7:网上开户客户端 8:无效终端编号 9:报价终端(中江) 10;监控终端
		Retcode                 int32     `json:"retcode"  xorm:"'RETCODE'"`                                 // 错误代码
		Marginalgorithm         int32     `json:"marginalgorithm"  xorm:"'MARGINALGORITHM'"`                 // 保证金收取方式  1：比率  2：固定
		Marginvalue             float64   `json:"marginvalue"  xorm:"'MARGINVALUE'"`                         // 即市保证金设置值
		Openfeealgorithm        int32     `json:"openfeealgorithm"  xorm:"'OPENFEEALGORITHM'"`               // 建仓手续费收取方式  1：比率  2：固定
		Openchargevalue         float64   `json:"openchargevalue"  xorm:"'OPENCHARGEVALUE'"`                 // 建仓手续费设置值
		Closefeealgorithm       int32     `json:"closefeealgorithm"  xorm:"'CLOSEFEEALGORITHM'"`             // 平仓手续费收取方式 1：比率  2：固定
		Closechargevalue        float64   `json:"closechargevalue"  xorm:"'CLOSECHARGEVALUE'"`               // 平仓手续费设置值
		Accountcurrencyid       int32     `json:"accountcurrencyid"  xorm:"'ACCOUNTCURRENCYID'"`             // 账户币种ID
		Goodscurrencyid         int32     `json:"goodscurrencyid"  xorm:"'GOODSCURRENCYID'"`                 // 商品币种ID
		Margincurrencyid        int32     `json:"margincurrencyid"  xorm:"'MARGINCURRENCYID'"`               // 保证金币种ID 比率时等于账户币种
		Marginrate              float64   `json:"marginrate"  xorm:"'MARGINRATE'"`                           // 保证金汇率-比率时等于1
		Curexchangerate         float64   `json:"curexchangerate"  xorm:"'CUREXCHANGERATE'"`                 // 当前汇率
		Goodsorderprice         float64   `json:"goodsorderprice"  xorm:"'GOODSORDERPRICE'"`                 // 委托价格(商品)
		Openfreezemargin2       float64   `json:"openfreezemargin2"  xorm:"'OPENFREEZEMARGIN2'"`             // 建仓冻结保证金(保证金/商品)
		Openfreezecharge2       float64   `json:"openfreezecharge2"  xorm:"'OPENFREEZECHARGE2'"`             // 建仓冻结手续费(商品)
		Openunfreezemargin2     float64   `json:"openunfreezemargin2"  xorm:"'OPENUNFREEZEMARGIN2'"`         // 建仓解冻保证金(保证金/商品)
		Openunfreezecharge2     float64   `json:"openunfreezecharge2"  xorm:"'OPENUNFREEZECHARGE2'"`         // 建仓解冻手续费(商品)
		Parentaccountid         int64     `json:"parentaccountid"  xorm:"'PARENTACCOUNTID'"`                 // 所属母账户
		Sessionid               int64     `json:"sessionid"  xorm:"'SESSIONID'"`                             // 会话ID

		Orderidstr       string `xorm:"ORDERIDSTR"`
		Goodscode        string `xorm:"GOODSCODE"`
		Goodsname        string `xorm:"GOODSNAME"`
		Exchangefullname string `xorm:"'EXCHANGEFULLNAME'"`

		OrderLoginCode  string `json:"orderlogincode" xorm:"ORDERLOGINCODE"`   // 委托人
		CancelLoginCode string `json:"cancellogincode" xorm:"CANCELLOGINCODE"` // 撤单人
	}

	hedgeInnerOrderDetails := make([]orderDetail, 0)
	if err := db.GetEngine().Table("HEDGE_INNERORDERDETAIL T").
		Select(`to_char(T.ORDERID) ORDERIDSTR, G.GOODSCODE, G.GOODSNAME, T.*, EX.EXCHANGEFULLNAME, 
				L1.LOGINCODE ORDERLOGINCODE, L2.LOGINCODE CANCELLOGINCODE`).
		Join("LEFT", "GOODS G", "G.GOODSID = T.GOODSID").
		Join("LEFT", "GOODSGROUP GG", "GG.GOODSGROUPID = G.GOODSGROUPID").
		Join("LEFT", "EXTERNALEXCHANGE EX", "GG.EXEXCHANGEID = EX.AUTOID").
		Join("LEFT", "LOGINACCOUNT L1", "L1.LOGINID = T.OPERATORID").
		Join("LEFT", "HEDGE_INNERORDERCANCEL H", "H.RELATEDORDERID = T.ORDERID").
		Join("LEFT", "LOGINACCOUNT L2", "L2.LOGINID = H.OPERATORID").
		Where("T.ACCOUNTID = ?", accountID).Desc("T.ORDERTIME").
		Find(&hedgeInnerOrderDetails); err != nil {
		return nil, err
	}
	rsp := make([]QueryHedgeOrderDetailRsp, 0)
	for _, v := range hedgeInnerOrderDetails {
		// 内部委托单分建平
		orderQty := v.Openorderqty
		tradeQty := v.Opentradeqty
		if v.Channelbuildtype == 2 {
			orderQty = v.Closeorderqty
			tradeQty = v.Closetradeqty
		}

		rsp = append(rsp, QueryHedgeOrderDetailRsp{
			Orderid:                 v.Orderidstr,
			Tradedate:               v.Tradedate,
			Channelbuildtype:        v.Channelbuildtype,
			Closetype:               v.Closetype,
			Marketid:                v.Marketid,
			Goodsid:                 v.Goodsid,
			Accountid:               v.Accountid,
			Buyorsell:               v.Buyorsell,
			Pricemode:               v.Pricemode,
			Orderprice:              v.Orderprice,
			Orderqty:                orderQty,
			Tradeqty:                tradeQty,
			Openfreezemargin:        v.Openfreezemargin - v.Openunfreezemargin, // 错误 #94473
			Channeloperatetype:      v.Channeloperatetype,
			Ordertime:               v.Ordertime,
			Channelinnerorderstatus: v.Channelinnerorderstatus,
			Curexchangerate:         v.Curexchangerate,
			Goodscode:               v.Goodscode,
			Goodsname:               v.Goodsname,
			Exchangefullname:        v.Exchangefullname,
			OrderLoginCode:          v.OrderLoginCode,
			CancelLoginCode:         v.CancelLoginCode,
		})
	}

	return rsp, nil
}

// GetHisHedgeInnerOrderDetails 获取指定资金账号的通道交易历史内部委托单信息
func GetHisHedgeInnerOrderDetails(accountID int, startDate, endDate string) ([]QueryHedgeOrderDetailRsp, error) {
	type orderDetail struct {
		Orderid                 int64     `json:"orderid"  xorm:"'ORDERID'" binding:"required"`              // 委托单号(107+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
		Tradedate               string    `json:"tradedate"  xorm:"'TRADEDATE'"`                             // 交易日(yyyyMMdd)
		Channelbuildtype        int32     `json:"channelbuildtype"  xorm:"'CHANNELBUILDTYPE'"`               // 开平标志 - 0:无 1:建仓 2:平仓
		Closetype               int32     `json:"closetype"  xorm:"'CLOSETYPE'"`                             // 平仓方式 - 0:无 1:平今 2:平昨
		Hedgeflag               int32     `json:"hedgeflag"  xorm:"'HEDGEFLAG'"`                             // 投机套保标志 - 0:无 1:投机 2:套保 3:套利
		Marketid                int32     `json:"marketid"  xorm:"'MARKETID'"`                               // 市场ID
		Goodsid                 int32     `json:"goodsid"  xorm:"'GOODSID'"`                                 // 商品ID
		Accountid               int64     `json:"accountid"  xorm:"'ACCOUNTID'"`                             // 账户ID
		Buyorsell               int32     `json:"buyorsell"  xorm:"'BUYORSELL'"`                             // 买卖 - 0:买 1:卖
		Pricemode               int32     `json:"pricemode"  xorm:"'PRICEMODE'"`                             // 取价方式 - 1:市价 2: 限价
		Orderprice              float64   `json:"orderprice"  xorm:"'ORDERPRICE'"`                           // 委托价格(账户)
		Openorderqty            int64     `json:"openorderqty"  xorm:"'OPENORDERQTY'"`                       // 委托数量
		Opentradeqty            int64     `json:"opentradeqty"  xorm:"'OPENTRADEQTY'"`                       // 成交数量
		Opencancelqty           int64     `json:"opencancelqty"  xorm:"'OPENCANCELQTY'"`                     // 撤单数量
		Openfailqty             int64     `json:"openfailqty"  xorm:"'OPENFAILQTY'"`                         // 失败数量
		Opensuccessqty          int64     `json:"opensuccessqty"  xorm:"'OPENSUCCESSQTY'"`                   // 建仓委托成功数量
		Closeorderqty           int64     `json:"closeorderqty"  xorm:"'CLOSEORDERQTY'"`                     // 委托数量
		Closetradeqty           int64     `json:"closetradeqty"  xorm:"'CLOSETRADEQTY'"`                     // 成交数量
		Closecancelqty          int64     `json:"closecancelqty"  xorm:"'CLOSECANCELQTY'"`                   // 撤单数量
		Closefailqty            int64     `json:"closefailqty"  xorm:"'CLOSEFAILQTY'"`                       // 失败数量
		Closesuccessqty         int64     `json:"closesuccessqty"  xorm:"'CLOSESUCCESSQTY'"`                 // 委托成功数量
		Openfreezemargin        float64   `json:"openfreezemargin"  xorm:"'OPENFREEZEMARGIN'"`               // 冻结保证金(冻结交易金额)
		Openunfreezemargin      float64   `json:"openunfreezemargin"  xorm:"'OPENUNFREEZEMARGIN'"`           // 解冻保证金
		Openfreezecharge        float64   `json:"openfreezecharge"  xorm:"'OPENFREEZECHARGE'"`               // 建仓冻结手续费(账户)
		Openunfreezecharge      float64   `json:"openunfreezecharge"  xorm:"'OPENUNFREEZECHARGE'"`           // 建仓解冻手续费(账户)
		Validtype               int32     `json:"validtype"  xorm:"'VALIDTYPE'"`                             // 有效类型 - 1当日有效
		Validtime               time.Time `json:"validtime"  xorm:"'VALIDTIME'"`                             // 有效期限
		Channeloperatetype      int32     `json:"channeloperatetype"  xorm:"'CHANNELOPERATETYPE'"`           // 操作类型 - 1:正常委托 2:斩仓委托 3:强平委托
		Ordertime               time.Time `json:"ordertime"  xorm:"'ORDERTIME'"`                             // 委托时间
		Channelordersrc         int32     `json:"channelordersrc"  xorm:"'CHANNELORDERSRC'"`                 // 委托来源 -  1:客户端 2:风控服务 3:管理端 4:下单接口平台 5:交易服务 6:跟单服务 7:监控终端
		Channelinnerorderstatus int32     `json:"channelinnerorderstatus"  xorm:"'CHANNELINNERORDERSTATUS'"` // 委托状态 - 1:委托请求 2:冻结成功 3:委托失败 4:委托部成部失败                  5:委托成功 6:全部撤销 7:部成部撤 8:部成部撤部失败 9:全部成交
		Operatorid              int64     `json:"operatorid"  xorm:"'OPERATORID'"`                           // 登录账号(LoginID)
		Updatetime              time.Time `json:"updatetime"  xorm:"'UPDATETIME'"`                           // 更新时间
		Clientordertime         time.Time `json:"clientordertime"  xorm:"'CLIENTORDERTIME'"`                 // 客户端委托时间
		Clientticket            string    `json:"clientticket"  xorm:"'CLIENTTICKET'"`                       // 客户端流水号
		UUID                    string    `json:"uuid"  xorm:"'UUID'"`                                       // 发起端唯一id
		Clienttype              int32     `json:"clienttype"  xorm:"'CLIENTTYPE'"`                           // 客户端类型 - 0:保留为未填终端类型 1:PC管理端 2:PC交易端 3:手机客户端_安卓 4:网页客户端 5:微信客户端 6:手机客户端_苹果 7:网上开户客户端 8:无效终端编号 9:报价终端(中江) 10;监控终端
		Retcode                 int32     `json:"retcode"  xorm:"'RETCODE'"`                                 // 错误代码
		Marginalgorithm         int32     `json:"marginalgorithm"  xorm:"'MARGINALGORITHM'"`                 // 保证金收取方式  1：比率  2：固定
		Marginvalue             float64   `json:"marginvalue"  xorm:"'MARGINVALUE'"`                         // 即市保证金设置值
		Openfeealgorithm        int32     `json:"openfeealgorithm"  xorm:"'OPENFEEALGORITHM'"`               // 建仓手续费收取方式  1：比率  2：固定
		Openchargevalue         float64   `json:"openchargevalue"  xorm:"'OPENCHARGEVALUE'"`                 // 建仓手续费设置值
		Closefeealgorithm       int32     `json:"closefeealgorithm"  xorm:"'CLOSEFEEALGORITHM'"`             // 平仓手续费收取方式 1：比率  2：固定
		Closechargevalue        float64   `json:"closechargevalue"  xorm:"'CLOSECHARGEVALUE'"`               // 平仓手续费设置值
		Accountcurrencyid       int32     `json:"accountcurrencyid"  xorm:"'ACCOUNTCURRENCYID'"`             // 账户币种ID
		Goodscurrencyid         int32     `json:"goodscurrencyid"  xorm:"'GOODSCURRENCYID'"`                 // 商品币种ID
		Margincurrencyid        int32     `json:"margincurrencyid"  xorm:"'MARGINCURRENCYID'"`               // 保证金币种ID 比率时等于账户币种
		Marginrate              float64   `json:"marginrate"  xorm:"'MARGINRATE'"`                           // 保证金汇率-比率时等于1
		Curexchangerate         float64   `json:"curexchangerate"  xorm:"'CUREXCHANGERATE'"`                 // 当前汇率
		Goodsorderprice         float64   `json:"goodsorderprice"  xorm:"'GOODSORDERPRICE'"`                 // 委托价格(商品)
		Openfreezemargin2       float64   `json:"openfreezemargin2"  xorm:"'OPENFREEZEMARGIN2'"`             // 建仓冻结保证金(保证金/商品)
		Openfreezecharge2       float64   `json:"openfreezecharge2"  xorm:"'OPENFREEZECHARGE2'"`             // 建仓冻结手续费(商品)
		Openunfreezemargin2     float64   `json:"openunfreezemargin2"  xorm:"'OPENUNFREEZEMARGIN2'"`         // 建仓解冻保证金(保证金/商品)
		Openunfreezecharge2     float64   `json:"openunfreezecharge2"  xorm:"'OPENUNFREEZECHARGE2'"`         // 建仓解冻手续费(商品)
		Parentaccountid         int64     `json:"parentaccountid"  xorm:"'PARENTACCOUNTID'"`                 // 所属母账户
		Sessionid               int64     `json:"sessionid"  xorm:"'SESSIONID'"`                             // 会话ID

		Orderidstr       string `xorm:"ORDERIDSTR"`
		Goodscode        string `xorm:"GOODSCODE"`
		Goodsname        string `xorm:"GOODSNAME"`
		Exchangefullname string `xorm:"'EXCHANGEFULLNAME'"`

		OrderLoginCode  string `json:"orderlogincode" xorm:"ORDERLOGINCODE"`   // 委托人
		CancelLoginCode string `json:"cancellogincode" xorm:"CANCELLOGINCODE"` // 撤单人
	}

	hedgeInnerOrderDetails := make([]orderDetail, 0)
	session := db.GetEngine().Table("HIS_HEDGE_INNERORDERDETAIL T").
		Select(`to_char(T.ORDERID) ORDERIDSTR, G.GOODSCODE, G.GOODSNAME, T.*, EX.EXCHANGEFULLNAME, 
				L1.LOGINCODE ORDERLOGINCODE, L2.LOGINCODE CANCELLOGINCODE`).
		Join("LEFT", "GOODS G", "G.GOODSID = T.GOODSID").
		Join("LEFT", "GOODSGROUP GG", "GG.GOODSGROUPID = G.GOODSGROUPID").
		Join("LEFT", "EXTERNALEXCHANGE EX", "GG.EXEXCHANGEID = EX.AUTOID").
		Join("LEFT", "LOGINACCOUNT L1", "L1.LOGINID = T.OPERATORID").
		Join("LEFT", "HIS_HEDGE_INNERORDERCANCEL H", "H.RELATEDORDERID = T.ORDERID").
		Join("LEFT", "LOGINACCOUNT L2", "L2.LOGINID = H.OPERATORID").
		Where("T.ISVALIDDATA = 1 and T.ACCOUNTID = ?", accountID).Desc("T.ORDERTIME")
	if len(startDate) > 0 {
		session = session.And(fmt.Sprintf("to_date(T.HISTRADEDATE,'yyyyMMdd') >= to_date('%s','yyyy-MM-dd')", startDate))
	}
	if len(endDate) > 0 {
		session = session.And(fmt.Sprintf("to_date(T.HISTRADEDATE,'yyyyMMdd') <= to_date('%s','yyyy-MM-dd')", endDate))
	}
	if err := session.Find(&hedgeInnerOrderDetails); err != nil {
		return nil, err
	}
	rsp := make([]QueryHedgeOrderDetailRsp, 0)
	for _, v := range hedgeInnerOrderDetails {
		// 内部委托单分建平
		orderQty := v.Openorderqty
		tradeQty := v.Opentradeqty
		if v.Channelbuildtype == 2 {
			orderQty = v.Closeorderqty
			tradeQty = v.Closetradeqty
		}

		rsp = append(rsp, QueryHedgeOrderDetailRsp{
			Orderid:                 v.Orderidstr,
			Tradedate:               v.Tradedate,
			Channelbuildtype:        v.Channelbuildtype,
			Closetype:               v.Closetype,
			Marketid:                v.Marketid,
			Goodsid:                 v.Goodsid,
			Accountid:               v.Accountid,
			Buyorsell:               v.Buyorsell,
			Pricemode:               v.Pricemode,
			Orderprice:              v.Orderprice,
			Orderqty:                orderQty,
			Tradeqty:                tradeQty,
			Openfreezemargin:        v.Openfreezemargin - v.Openunfreezemargin,
			Channeloperatetype:      v.Channeloperatetype,
			Ordertime:               v.Ordertime,
			Channelinnerorderstatus: v.Channelinnerorderstatus,
			Curexchangerate:         v.Curexchangerate,
			Goodscode:               v.Goodscode,
			Goodsname:               v.Goodsname,
			Exchangefullname:        v.Exchangefullname,
			OrderLoginCode:          v.OrderLoginCode,
			CancelLoginCode:         v.CancelLoginCode,
		})
	}

	return rsp, nil
}

// GetHedgeOutOrderDetails 获取指定资金账号的通道交易外部委托单信息
func GetHedgeOutOrderDetails(accountID int) ([]QueryHedgeOrderDetailRsp, error) {
	type orderDetail struct {
		Outorderid            int64     `json:"outorderid"  xorm:"'OUTORDERID'" binding:"required"`             // 外部委托单ID(113+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
		Hedgeaccountcode      string    `json:"hedgeaccountcode"  xorm:"'HEDGEACCOUNTCODE'" binding:"required"` // 对冲账号
		Tradedate             string    `json:"tradedate"  xorm:"'TRADEDATE'"`                                  // 交易日(yyyyMMdd)
		Accountid             int64     `json:"accountid"  xorm:"'ACCOUNTID'"`                                  // 资金账号[外部母账户]
		Relatedorderid        int64     `json:"relatedorderid"  xorm:"'RELATEDORDERID'"`                        // 关联内部委托单号
		Marketid              int32     `json:"marketid"  xorm:"'MARKETID'"`                                    // 市场ID
		Hedgegoodsid          int64     `json:"hedgegoodsid"  xorm:"'HEDGEGOODSID'"`                            // 对冲合约ID
		Orderpricetype        int32     `json:"orderpricetype"  xorm:"'ORDERPRICETYPE'"`                        // 报单价格条件 - 1:市价 2: 限价
		Buyorsell             int32     `json:"buyorsell"  xorm:"'BUYORSELL'"`                                  // 买卖方向 - 0:买 1:卖
		Channelbuildtype      int32     `json:"channelbuildtype"  xorm:"'CHANNELBUILDTYPE'"`                    // 开平标志- 0:无 1:建仓 2:平仓
		Closetype             int32     `json:"closetype"  xorm:"'CLOSETYPE'"`                                  // 平仓方式 - 0:无 1:平今 2:平昨
		Orderprice            float64   `json:"orderprice"  xorm:"'ORDERPRICE'"`                                // 委托价格
		Orderqty              int64     `json:"orderqty"  xorm:"'ORDERQTY'"`                                    // 委托数量
		Tradeqty              int64     `json:"tradeqty"  xorm:"'TRADEQTY'"`                                    // 成交数量
		Cancelqty             int64     `json:"cancelqty"  xorm:"'CANCELQTY'"`                                  // 撤销数量
		Validtype             int32     `json:"validtype"  xorm:"'VALIDTYPE'"`                                  // 有效期类型 - 1::当日有效
		Hedgeflag             int32     `json:"hedgeflag"  xorm:"'HEDGEFLAG'"`                                  // 投机套保标志 - 0:无 1:投机 2:套保 3:套利
		Channeloutorderstatus int32     `json:"channeloutorderstatus"  xorm:"'CHANNELOUTORDERSTATUS'"`          // 外部单据状态 - 1 - 接收报文 2 - 发送报文成功 3 - 委托成功 4 - 委托失败 5 - 全部成交 6 - 部成部撤 7 - 全部撤单
		Ordertime             time.Time `json:"ordertime"  xorm:"'ORDERTIME'"`                                  // 委托时间
		Updatetime            time.Time `json:"updatetime"  xorm:"'UPDATETIME'"`                                // 更新时间
		Mhpinnerorderid       int64     `json:"mhpinnerorderid"  xorm:"'MHPINNERORDERID'"`                      // 接口平台委托单ID
		Mhprspcode            int64     `json:"mhprspcode"  xorm:"'MHPRSPCODE'"`                                // 渠道返回码
		Mhprsptext            string    `json:"mhprsptext"  xorm:"'MHPRSPTEXT'"`                                // 渠道返回信息
		Optiontype            int32     `json:"optiontype"  xorm:"'OPTIONTYPE'"`                                // 期权类型 - 1:认购(看涨) 2:认沽(看跌)
		Premium               float64   `json:"premium"  xorm:"'PREMIUM'"`                                      // 权利金
		Realoutorderid        int64     `json:"realoutorderid"  xorm:"'REALOUTORDERID'"`                        // 实际外部平台委托单ID
		Relatedcreateorderid  int64     `json:"relatedcreateorderid"  xorm:"'RELATEDCREATEORDERID'"`            // 关联外部建仓委托单ID[平仓委托]
		Channeloperatetype    int32     `json:"channeloperatetype"  xorm:"'CHANNELOPERATETYPE'"`                // 操作类型 - 1:正常委托 2:斩仓委托 3:强平委托
		Channelordersrc       int32     `json:"channelordersrc"  xorm:"'CHANNELORDERSRC'"`                      // 委托来源 -  1:客户端 2:风控服务 3:管理端 4:下单接口平台 5:交易服务 6:跟单服务 7:监控终端
		Operatorid            int64     `json:"operatorid"  xorm:"'OPERATORID'"`                                // 登录账号(LoginID)
		Clientordertime       time.Time `json:"clientordertime"  xorm:"'CLIENTORDERTIME'"`                      // 客户端委托时间
		Clientticket          string    `json:"clientticket"  xorm:"'CLIENTTICKET'"`                            // 客户端流水号
		UUID                  string    `json:"uuid"  xorm:"'UUID'"`                                            // 发起端唯一id
		Clienttype            int32     `json:"clienttype"  xorm:"'CLIENTTYPE'"`                                // 客户端类型 - 0:保留为未填终端类型 1:PC管理端 2:PC交易端 3:手机客户端_安卓 4:网页客户端 5:微信客户端 6:手机客户端_苹果 7:网上开户客户端 8:无效终端编号 9:报价终端(中江) 10;监控终端
		Sessionid             int64     `json:"sessionid"  xorm:"'SESSIONID'"`                                  // 会话ID

		Orderidstr       string `xorm:"ORDERIDSTR"`
		Goodscode        string `xorm:"GOODSCODE"`
		Goodsname        string `xorm:"GOODSNAME"`
		Exchangefullname string `xorm:"'EXCHANGEFULLNAME'"`

		OrderLoginCode  string `json:"orderlogincode" xorm:"ORDERLOGINCODE"`   // 委托人
		CancelLoginCode string `json:"cancellogincode" xorm:"CANCELLOGINCODE"` // 撤单人
	}

	hedgeOutOrderDetails := make([]orderDetail, 0)
	if err := db.GetEngine().Table("HEDGE_OUTORDERDETAIL T").
		Select(`to_char(T.OUTORDERID) ORDERIDSTR, G.GOODSCODE, G.GOODSNAME, T.*, EX.EXCHANGEFULLNAME, 
				L1.LOGINCODE ORDERLOGINCODE, L2.LOGINCODE CANCELLOGINCODE`).
		Join("LEFT", "GOODS G", "G.GOODSID = T.HEDGEGOODSID").
		Join("LEFT", "GOODSGROUP GG", "GG.GOODSGROUPID = G.GOODSGROUPID").
		Join("LEFT", "EXTERNALEXCHANGE EX", "GG.EXEXCHANGEID = EX.AUTOID").
		Join("LEFT", "LOGINACCOUNT L1", "L1.LOGINID = T.OPERATORID").
		Join("LEFT", "HEDGE_OUTORDERCANCEL H", "H.RELATEDOUTORDERID = T.OUTORDERID").
		Join("LEFT", "LOGINACCOUNT L2", "L2.LOGINID = H.OPERATORID").
		Where("T.ACCOUNTID = ?", accountID).Desc("T.OUTORDERID").
		Find(&hedgeOutOrderDetails); err != nil {
		return nil, err
	}
	rsp := make([]QueryHedgeOrderDetailRsp, 0)
	for _, v := range hedgeOutOrderDetails {
		// 外部单据状态 -> 委托状态
		// 外部单据状态 - 1 - 接收报文 2 - 发送报文成功 3 - 委托成功 4 - 委托失败 5 - 全部成交 6 - 部成部撤 7 - 全部撤单
		// 委托状态 - 1:委托请求 2:冻结成功 3:委托失败 4:委托部成部失败 5:委托成功 6:全部撤销 7:部成部撤 8:部成部撤部失败 9:全部成交
		status := v.Channeloutorderstatus
		if v.Channeloutorderstatus == 1 {
			status = 1
		} else if v.Channeloutorderstatus == 2 {
			status = 1
		} else if v.Channeloutorderstatus == 3 {
			status = 5
		} else if v.Channeloutorderstatus == 4 {
			status = 3
		} else if v.Channeloutorderstatus == 5 {
			status = 9
		} else if v.Channeloutorderstatus == 6 {
			status = 7
		} else if v.Channeloutorderstatus == 7 {
			status = 6
		}

		rsp = append(rsp, QueryHedgeOrderDetailRsp{
			Orderid:                 v.Orderidstr,
			Tradedate:               v.Tradedate,
			Channelbuildtype:        v.Channelbuildtype,
			Closetype:               v.Closetype,
			Marketid:                v.Marketid,
			Goodsid:                 int32(v.Hedgegoodsid),
			Accountid:               v.Accountid,
			Buyorsell:               v.Buyorsell,
			Pricemode:               v.Orderpricetype,
			Orderprice:              v.Orderprice,
			Orderqty:                v.Orderqty,
			Tradeqty:                v.Tradeqty,
			Openfreezemargin:        0,
			Channeloperatetype:      v.Channeloperatetype,
			Ordertime:               v.Ordertime,
			Channelinnerorderstatus: status,
			Curexchangerate:         1,
			Goodscode:               v.Goodscode,
			Goodsname:               v.Goodsname,
			Exchangefullname:        v.Exchangefullname,
			OrderLoginCode:          v.OrderLoginCode,
			CancelLoginCode:         v.CancelLoginCode,
		})
	}

	return rsp, nil
}

// GetHisHedgeOutOrderDetails 获取指定资金账号的通道交易历史外部委托单信息
func GetHisHedgeOutOrderDetails(accountID int, startDate, endDate string) ([]QueryHedgeOrderDetailRsp, error) {
	type orderDetail struct {
		Outorderid            int64     `json:"outorderid"  xorm:"'OUTORDERID'" binding:"required"`             // 外部委托单ID(113+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
		Hedgeaccountcode      string    `json:"hedgeaccountcode"  xorm:"'HEDGEACCOUNTCODE'" binding:"required"` // 对冲账号
		Tradedate             string    `json:"tradedate"  xorm:"'TRADEDATE'"`                                  // 交易日(yyyyMMdd)
		Accountid             int64     `json:"accountid"  xorm:"'ACCOUNTID'"`                                  // 资金账号[外部母账户]
		Relatedorderid        int64     `json:"relatedorderid"  xorm:"'RELATEDORDERID'"`                        // 关联内部委托单号
		Marketid              int32     `json:"marketid"  xorm:"'MARKETID'"`                                    // 市场ID
		Hedgegoodsid          int64     `json:"hedgegoodsid"  xorm:"'HEDGEGOODSID'"`                            // 对冲合约ID
		Orderpricetype        int32     `json:"orderpricetype"  xorm:"'ORDERPRICETYPE'"`                        // 报单价格条件 - 1:市价 2: 限价
		Buyorsell             int32     `json:"buyorsell"  xorm:"'BUYORSELL'"`                                  // 买卖方向 - 0:买 1:卖
		Channelbuildtype      int32     `json:"channelbuildtype"  xorm:"'CHANNELBUILDTYPE'"`                    // 开平标志- 0:无 1:建仓 2:平仓
		Closetype             int32     `json:"closetype"  xorm:"'CLOSETYPE'"`                                  // 平仓方式 - 0:无 1:平今 2:平昨
		Orderprice            float64   `json:"orderprice"  xorm:"'ORDERPRICE'"`                                // 委托价格
		Orderqty              int64     `json:"orderqty"  xorm:"'ORDERQTY'"`                                    // 委托数量
		Tradeqty              int64     `json:"tradeqty"  xorm:"'TRADEQTY'"`                                    // 成交数量
		Cancelqty             int64     `json:"cancelqty"  xorm:"'CANCELQTY'"`                                  // 撤销数量
		Validtype             int32     `json:"validtype"  xorm:"'VALIDTYPE'"`                                  // 有效期类型 - 1::当日有效
		Hedgeflag             int32     `json:"hedgeflag"  xorm:"'HEDGEFLAG'"`                                  // 投机套保标志 - 0:无 1:投机 2:套保 3:套利
		Channeloutorderstatus int32     `json:"channeloutorderstatus"  xorm:"'CHANNELOUTORDERSTATUS'"`          // 外部单据状态 - 1 - 接收报文 2 - 发送报文成功 3 - 委托成功 4 - 委托失败 5 - 全部成交 6 - 部成部撤 7 - 全部撤单
		Ordertime             time.Time `json:"ordertime"  xorm:"'ORDERTIME'"`                                  // 委托时间
		Updatetime            time.Time `json:"updatetime"  xorm:"'UPDATETIME'"`                                // 更新时间
		Mhpinnerorderid       int64     `json:"mhpinnerorderid"  xorm:"'MHPINNERORDERID'"`                      // 接口平台委托单ID
		Mhprspcode            int64     `json:"mhprspcode"  xorm:"'MHPRSPCODE'"`                                // 渠道返回码
		Mhprsptext            string    `json:"mhprsptext"  xorm:"'MHPRSPTEXT'"`                                // 渠道返回信息
		Optiontype            int32     `json:"optiontype"  xorm:"'OPTIONTYPE'"`                                // 期权类型 - 1:认购(看涨) 2:认沽(看跌)
		Premium               float64   `json:"premium"  xorm:"'PREMIUM'"`                                      // 权利金
		Realoutorderid        int64     `json:"realoutorderid"  xorm:"'REALOUTORDERID'"`                        // 实际外部平台委托单ID
		Relatedcreateorderid  int64     `json:"relatedcreateorderid"  xorm:"'RELATEDCREATEORDERID'"`            // 关联外部建仓委托单ID[平仓委托]
		Channeloperatetype    int32     `json:"channeloperatetype"  xorm:"'CHANNELOPERATETYPE'"`                // 操作类型 - 1:正常委托 2:斩仓委托 3:强平委托
		Channelordersrc       int32     `json:"channelordersrc"  xorm:"'CHANNELORDERSRC'"`                      // 委托来源 -  1:客户端 2:风控服务 3:管理端 4:下单接口平台 5:交易服务 6:跟单服务 7:监控终端
		Operatorid            int64     `json:"operatorid"  xorm:"'OPERATORID'"`                                // 登录账号(LoginID)
		Clientordertime       time.Time `json:"clientordertime"  xorm:"'CLIENTORDERTIME'"`                      // 客户端委托时间
		Clientticket          string    `json:"clientticket"  xorm:"'CLIENTTICKET'"`                            // 客户端流水号
		UUID                  string    `json:"uuid"  xorm:"'UUID'"`                                            // 发起端唯一id
		Clienttype            int32     `json:"clienttype"  xorm:"'CLIENTTYPE'"`                                // 客户端类型 - 0:保留为未填终端类型 1:PC管理端 2:PC交易端 3:手机客户端_安卓 4:网页客户端 5:微信客户端 6:手机客户端_苹果 7:网上开户客户端 8:无效终端编号 9:报价终端(中江) 10;监控终端
		Sessionid             int64     `json:"sessionid"  xorm:"'SESSIONID'"`                                  // 会话ID

		Orderidstr       string `xorm:"ORDERIDSTR"`
		Goodscode        string `xorm:"GOODSCODE"`
		Goodsname        string `xorm:"GOODSNAME"`
		Exchangefullname string `xorm:"'EXCHANGEFULLNAME'"`

		OrderLoginCode  string `json:"orderlogincode" xorm:"ORDERLOGINCODE"`   // 委托人
		CancelLoginCode string `json:"cancellogincode" xorm:"CANCELLOGINCODE"` // 撤单人
	}

	hedgeOutOrderDetails := make([]orderDetail, 0)
	session := db.GetEngine().Table("HIS_HEDGE_OUTORDERDETAIL T").
		Select(`to_char(T.OUTORDERID) ORDERIDSTR, G.GOODSCODE, G.GOODSNAME, T.*, EX.EXCHANGEFULLNAME, 
				L1.LOGINCODE ORDERLOGINCODE, L2.LOGINCODE CANCELLOGINCODE`).
		Join("LEFT", "GOODS G", "G.GOODSID = T.HEDGEGOODSID").
		Join("LEFT", "GOODSGROUP GG", "GG.GOODSGROUPID = G.GOODSGROUPID").
		Join("LEFT", "EXTERNALEXCHANGE EX", "GG.EXEXCHANGEID = EX.AUTOID").
		Join("LEFT", "LOGINACCOUNT L1", "L1.LOGINID = T.OPERATORID").
		Join("LEFT", "HIS_HEDGE_OUTORDERCANCEL H", "H.RELATEDOUTORDERID = T.OUTORDERID").
		Join("LEFT", "LOGINACCOUNT L2", "L2.LOGINID = H.OPERATORID").
		Where("T.ISVALIDDATA = 1 and T.ACCOUNTID = ?", accountID).Desc("T.OUTORDERID")
	if len(startDate) > 0 {
		session = session.And(fmt.Sprintf("to_date(T.HISTRADEDATE,'yyyyMMdd') >= to_date('%s','yyyy-MM-dd')", startDate))
	}
	if len(endDate) > 0 {
		session = session.And(fmt.Sprintf("to_date(T.HISTRADEDATE,'yyyyMMdd') <= to_date('%s','yyyy-MM-dd')", endDate))
	}
	if err := session.Find(&hedgeOutOrderDetails); err != nil {
		return nil, err
	}
	rsp := make([]QueryHedgeOrderDetailRsp, 0)
	for _, v := range hedgeOutOrderDetails {
		// 外部单据状态 -> 委托状态
		// 外部单据状态 - 1 - 接收报文 2 - 发送报文成功 3 - 委托成功 4 - 委托失败 5 - 全部成交 6 - 部成部撤 7 - 全部撤单
		// 委托状态 - 1:委托请求 2:冻结成功 3:委托失败 4:委托部成部失败 5:委托成功 6:全部撤销 7:部成部撤 8:部成部撤部失败 9:全部成交
		status := v.Channeloutorderstatus
		if v.Channeloutorderstatus == 1 {
			status = 1
		} else if v.Channeloutorderstatus == 2 {
			status = 1
		} else if v.Channeloutorderstatus == 3 {
			status = 5
		} else if v.Channeloutorderstatus == 4 {
			status = 3
		} else if v.Channeloutorderstatus == 5 {
			status = 9
		} else if v.Channeloutorderstatus == 6 {
			status = 7
		} else if v.Channeloutorderstatus == 7 {
			status = 6
		}

		rsp = append(rsp, QueryHedgeOrderDetailRsp{
			Orderid:                 v.Orderidstr,
			Tradedate:               v.Tradedate,
			Channelbuildtype:        v.Channelbuildtype,
			Closetype:               v.Closetype,
			Marketid:                v.Marketid,
			Goodsid:                 int32(v.Hedgegoodsid),
			Accountid:               v.Accountid,
			Buyorsell:               v.Buyorsell,
			Pricemode:               v.Orderpricetype,
			Orderprice:              v.Orderprice,
			Orderqty:                v.Orderqty,
			Tradeqty:                v.Tradeqty,
			Openfreezemargin:        0,
			Channeloperatetype:      v.Channeloperatetype,
			Ordertime:               v.Ordertime,
			Channelinnerorderstatus: status,
			Curexchangerate:         1,
			Goodscode:               v.Goodscode,
			Goodsname:               v.Goodsname,
			Exchangefullname:        v.Exchangefullname,
			OrderLoginCode:          v.OrderLoginCode,
			CancelLoginCode:         v.CancelLoginCode,
		})
	}

	return rsp, nil
}

// QueryHedgeTradeDetailRsp 获取企业风管成交单返回模型
type QueryHedgeTradeDetailRsp struct {
	Tradeid          string    `json:"tradeid"`          // 成交单号(108+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
	Buyorsell        int32     `json:"buyorsell"`        // 方向 - 0:买 1:卖
	Orderid          string    `json:"orderid"`          // 委托单号
	Tradedate        string    `json:"tradedate"`        // 交易日(yyyyMMdd)
	Accountid        int64     `json:"accountid"`        // 账号ID
	Goodsid          int32     `json:"goodsid"`          // 商品ID
	Marketid         int32     `json:"marketid"`         // 市场ID
	Tradetime        time.Time `json:"tradetime"`        // 成交时间
	Tradeprice       float64   `json:"tradeprice"`       // 成交价格
	Tradeqty         int64     `json:"tradeqty"`         // 成交数量
	Tradeamount      float64   `json:"tradeamount"`      // 成交金额(账户)
	Opencharge       float64   `json:"opencharge"`       // 建仓手续费(账户)
	Closecharge      float64   `json:"closecharge"`      // 平仓手续费(账户)
	Tradetype        int32     `json:"tradetype"`        // 成交类别 - 1:正常委托成交 2:风控斩仓成交 3:修正持仓成交 4:管理端斩仓成交
	Channelbuildtype int32     `json:"channelbuildtype"` // 委托单据类型 0:无 1:建仓 2:平仓
	Closetype        int32     `json:"closetype"`        // 平仓方式 - 0:无 1:平今 2:平昨
	Curexchangerate  float64   `json:"curexchangerate"`  // 当前汇率
	Opencharge2      float64   `json:"opencharge2"`      // 建仓手续费(商品)
	Closecharge2     float64   `json:"closecharge2"`     // 平仓手续费(商品)
	Closepl          float64   `json:"closepl"`          // 平仓盈亏(账户)
	Closepl2         float64   `json:"closepl2"`         // 平仓盈亏(商品)
	Closepl3         float64   `json:"closepl3"`         // 平仓盈亏(账户)(逐笔)
	Closepl4         float64   `json:"closepl4"`         // 平仓盈亏(商品)(逐笔)

	Goodscode string `json:"goodscode"` // 商品代码(内部)
	Goodsname string `json:"goodsname"` // 商品名称

	Exchangefullname string `json:"exchangefullname"` // 外部交易所全称

	OrderLoginCode string `json:"orderlogincode" xorm:"ORDERLOGINCODE"` // 委托人
}

// GetHedgeInnerTradeDetails 获取通道交易内部成交单信息
func GetHedgeInnerTradeDetails(accountID, goodsID, buyOrSell, orderID int) ([]QueryHedgeTradeDetailRsp, error) {
	type tradeDetail struct {
		Tradeid                  string    `json:"tradeid"  xorm:"'TRADEIDSTR'"`                                // 成交单号(108+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
		Buyorsell                int32     `json:"buyorsell"  xorm:"'BUYORSELL'"`                               // 方向 - 0:买 1:卖
		Orderid                  string    `json:"orderid"  xorm:"'ORDERIDSTR'"`                                // 委托单号
		Tradedate                string    `json:"tradedate"  xorm:"'TRADEDATE'"`                               // 交易日(yyyyMMdd)
		Accountid                int64     `json:"accountid"  xorm:"'ACCOUNTID'"`                               // 账号ID
		Goodsid                  int32     `json:"goodsid"  xorm:"'GOODSID'"`                                   // 商品ID
		Marketid                 int32     `json:"marketid"  xorm:"'MARKETID'"`                                 // 市场ID
		Tradetime                time.Time `json:"tradetime"  xorm:"'TRADETIME'"`                               // 成交时间
		Tradeprice               float64   `json:"tradeprice"  xorm:"'TRADEPRICE'"`                             // 成交价格
		Tradeqty                 int64     `json:"tradeqty"  xorm:"'TRADEQTY'"`                                 // 成交数量
		Tradeamount              float64   `json:"tradeamount"  xorm:"'TRADEAMOUNT'"`                           // 成交金额(账户)
		Closepl                  float64   `json:"closepl"  xorm:"'CLOSEPL'"`                                   // 平仓盈亏(账户)
		Opencharge               float64   `json:"opencharge"  xorm:"'OPENCHARGE'"`                             // 建仓手续费(账户)
		Closecharge              float64   `json:"closecharge"  xorm:"'CLOSECHARGE'"`                           // 平仓手续费(账户)
		Tradetype                int32     `json:"tradetype"  xorm:"'TRADETYPE'"`                               // 成交类别 - 1:正常委托成交 2:风控斩仓成交 3:修正持仓成交 4:管理端斩仓成交
		Channelbuildtype         int32     `json:"channelbuildtype"  xorm:"'CHANNELBUILDTYPE'"`                 // 委托单据类型 0:无 1:建仓 2:平仓
		Closetype                int32     `json:"closetype"  xorm:"'CLOSETYPE'"`                               // 平仓方式 - 0:无 1:平今 2:平昨
		Hedgeflag                int32     `json:"hedgeflag"  xorm:"'HEDGEFLAG'"`                               // 投机套保标志 - 0:无 1:投机 2:套保 3:套利
		Openqty                  int64     `json:"openqty"  xorm:"'OPENQTY'"`                                   // 开仓数量(先建后平操作 需要记录)
		Closeqty                 int64     `json:"closeqty"  xorm:"'CLOSEQTY'"`                                 // 平仓数量(先建后平操作 需要记录)
		Status                   int32     `json:"status"  xorm:"'STATUS'"`                                     // 处理状态 - 1:待处理 2:已处理 3:处理失败
		Isreckoned               int32     `json:"isreckoned"  xorm:"'ISRECKONED'"`                             // 是否结算 - 0:未结算 1:已结算
		Openfeealgorithm         int32     `json:"openfeealgorithm"  xorm:"'OPENFEEALGORITHM'"`                 // 建仓手续费收取方式  1：比率  2：固定
		Openchargevalue          float64   `json:"openchargevalue"  xorm:"'OPENCHARGEVALUE'"`                   // 建仓手续费设置值
		Closefeealgorithm        int32     `json:"closefeealgorithm"  xorm:"'CLOSEFEEALGORITHM'"`               // 平仓手续费收取方式 1：比率  2：固定
		Closechargevalue         float64   `json:"closechargevalue"  xorm:"'CLOSECHARGEVALUE'"`                 // 平仓手续费设置值
		Accountcurrencyid        int32     `json:"accountcurrencyid"  xorm:"'ACCOUNTCURRENCYID'"`               // 账户币种ID
		Goodscurrencyid          int32     `json:"goodscurrencyid"  xorm:"'GOODSCURRENCYID'"`                   // 商品币种ID
		Curexchangerate          float64   `json:"curexchangerate"  xorm:"'CUREXCHANGERATE'"`                   // 当前汇率
		Opencharge2              float64   `json:"opencharge2"  xorm:"'OPENCHARGE2'"`                           // 建仓手续费(商品)
		Closecharge2             float64   `json:"closecharge2"  xorm:"'CLOSECHARGE2'"`                         // 平仓手续费(商品)
		Closepl2                 float64   `json:"closepl2"  xorm:"'CLOSEPL2'"`                                 // 平仓盈亏(商品)
		Closepl3                 float64   `json:"closepl3"  xorm:"'CLOSEPL3'"`                                 // 平仓盈亏(账户)(逐笔)
		Closepl4                 float64   `json:"closepl4"  xorm:"'CLOSEPL4'"`                                 // 平仓盈亏(商品)(逐笔)
		Extenalopenfeealgorithm  int32     `json:"extenalopenfeealgorithm"  xorm:"'EXTENALOPENFEEALGORITHM'"`   // 建仓手续费收取方式(外部配置) 1：比率  2：固定
		Extenalopenchargevalue   float64   `json:"extenalopenchargevalue"  xorm:"'EXTENALOPENCHARGEVALUE'"`     // 建仓手续费设置值
		Extenalclosefeealgorithm int32     `json:"extenalclosefeealgorithm"  xorm:"'EXTENALCLOSEFEEALGORITHM'"` // 平仓手续费收取方式 1：比率  2：固定
		Extenalclosechargevalue  float64   `json:"extenalclosechargevalue"  xorm:"'EXTENALCLOSECHARGEVALUE'"`   // 平仓手续费设置值
		Extenalopencharge        float64   `json:"extenalopencharge"  xorm:"'EXTENALOPENCHARGE'"`               // 建仓手续费(商品)(外部)
		Extenalclosecharge       float64   `json:"extenalclosecharge"  xorm:"'EXTENALCLOSECHARGE'"`             // 平仓手续费(商品)(外部)
		Parentaccountid          int64     `json:"parentaccountid"  xorm:"'PARENTACCOUNTID'"`                   // 所属母账户
		Relatedouttradeid        int64     `json:"relatedouttradeid"  xorm:"'RELATEDOUTTRADEID'"`               // 关联外部成交单ID

		Orderidstr       string `xorm:"ORDERIDSTR"`
		Goodscode        string `xorm:"GOODSCODE"`
		Goodsname        string `xorm:"GOODSNAME"`
		Exchangefullname string `xorm:"'EXCHANGEFULLNAME'"`

		OrderLoginCode string `json:"orderlogincode" xorm:"ORDERLOGINCODE"` // 委托人
	}

	tradeDetails := make([]tradeDetail, 0)
	session := db.GetEngine().Table("HEDGE_INNERTRADEDETAIL T").
		Select(`to_char(T.TRADEID) TRADEIDSTR, to_char(T.ORDERID) ORDERIDSTR, G.GOODSCODE, G.GOODSNAME, T.*, EX.EXCHANGEFULLNAME, 
				L1.LOGINCODE ORDERLOGINCODE`).
		Join("LEFT", "GOODS G", "G.GOODSID = T.GOODSID").
		Join("LEFT", "GOODSGROUP GG", "GG.GOODSGROUPID = G.GOODSGROUPID").
		Join("LEFT", "EXTERNALEXCHANGE EX", "GG.EXEXCHANGEID = EX.AUTOID").
		Join("LEFT", "HEDGE_INNERORDERDETAIL TT", "TT.ORDERID = T.ORDERID").
		Join("LEFT", "LOGINACCOUNT L1", "L1.LOGINID = TT.OPERATORID").
		Where("T.ACCOUNTID = ?", accountID)
	if goodsID != 0 {
		session = session.And("T.GOODSID = ?", goodsID)
	}
	if buyOrSell != 0 {
		session = session.And("T.BUYORSELL = ?", buyOrSell)
	}
	if orderID != 0 {
		session = session.And("T.ORDERID = ?", orderID)
	}
	if err := session.Desc("T.TRADEID").
		Find(&tradeDetails); err != nil {
		return nil, err
	}

	rsp := make([]QueryHedgeTradeDetailRsp, 0)
	for _, v := range tradeDetails {
		rsp = append(rsp, QueryHedgeTradeDetailRsp{
			Tradeid:          v.Tradeid,
			Buyorsell:        v.Buyorsell,
			Orderid:          v.Orderid,
			Tradedate:        v.Tradedate,
			Accountid:        v.Accountid,
			Goodsid:          v.Goodsid,
			Marketid:         v.Marketid,
			Tradetime:        v.Tradetime,
			Tradeprice:       v.Tradeprice,
			Tradeqty:         v.Tradeqty,
			Tradeamount:      v.Tradeamount,
			Opencharge:       v.Opencharge,
			Closecharge:      v.Closecharge,
			Tradetype:        v.Tradetype,
			Channelbuildtype: v.Channelbuildtype,
			Closetype:        v.Closetype,
			Curexchangerate:  v.Curexchangerate,
			Opencharge2:      v.Opencharge2,
			Closecharge2:     v.Closecharge2,
			Goodscode:        v.Goodscode,
			Goodsname:        v.Goodsname,
			Exchangefullname: v.Exchangefullname,
			OrderLoginCode:   v.OrderLoginCode,
			Closepl:          v.Closepl,
			Closepl2:         v.Closepl2,
			Closepl3:         v.Closepl3,
			Closepl4:         v.Closepl4,
		})
	}

	return rsp, nil
}

// GetHisHedgeInnerTradeDetails 获取通道交易历史内部成交单信息
func GetHisHedgeInnerTradeDetails(accountID, goodsID, buyOrSell, orderID int, startDate, endDate string) ([]QueryHedgeTradeDetailRsp, error) {
	type tradeDetail struct {
		Tradeid                  string    `json:"tradeid"  xorm:"'TRADEIDSTR'"`                                // 成交单号(108+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
		Buyorsell                int32     `json:"buyorsell"  xorm:"'BUYORSELL'"`                               // 方向 - 0:买 1:卖
		Orderid                  string    `json:"orderid"  xorm:"'ORDERIDSTR'"`                                // 委托单号
		Tradedate                string    `json:"tradedate"  xorm:"'TRADEDATE'"`                               // 交易日(yyyyMMdd)
		Accountid                int64     `json:"accountid"  xorm:"'ACCOUNTID'"`                               // 账号ID
		Goodsid                  int32     `json:"goodsid"  xorm:"'GOODSID'"`                                   // 商品ID
		Marketid                 int32     `json:"marketid"  xorm:"'MARKETID'"`                                 // 市场ID
		Tradetime                time.Time `json:"tradetime"  xorm:"'TRADETIME'"`                               // 成交时间
		Tradeprice               float64   `json:"tradeprice"  xorm:"'TRADEPRICE'"`                             // 成交价格
		Tradeqty                 int64     `json:"tradeqty"  xorm:"'TRADEQTY'"`                                 // 成交数量
		Tradeamount              float64   `json:"tradeamount"  xorm:"'TRADEAMOUNT'"`                           // 成交金额(账户)
		Closepl                  float64   `json:"closepl"  xorm:"'CLOSEPL'"`                                   // 平仓盈亏(账户)
		Opencharge               float64   `json:"opencharge"  xorm:"'OPENCHARGE'"`                             // 建仓手续费(账户)
		Closecharge              float64   `json:"closecharge"  xorm:"'CLOSECHARGE'"`                           // 平仓手续费(账户)
		Tradetype                int32     `json:"tradetype"  xorm:"'TRADETYPE'"`                               // 成交类别 - 1:正常委托成交 2:风控斩仓成交 3:修正持仓成交 4:管理端斩仓成交
		Channelbuildtype         int32     `json:"channelbuildtype"  xorm:"'CHANNELBUILDTYPE'"`                 // 委托单据类型 0:无 1:建仓 2:平仓
		Closetype                int32     `json:"closetype"  xorm:"'CLOSETYPE'"`                               // 平仓方式 - 0:无 1:平今 2:平昨
		Hedgeflag                int32     `json:"hedgeflag"  xorm:"'HEDGEFLAG'"`                               // 投机套保标志 - 0:无 1:投机 2:套保 3:套利
		Openqty                  int64     `json:"openqty"  xorm:"'OPENQTY'"`                                   // 开仓数量(先建后平操作 需要记录)
		Closeqty                 int64     `json:"closeqty"  xorm:"'CLOSEQTY'"`                                 // 平仓数量(先建后平操作 需要记录)
		Status                   int32     `json:"status"  xorm:"'STATUS'"`                                     // 处理状态 - 1:待处理 2:已处理 3:处理失败
		Isreckoned               int32     `json:"isreckoned"  xorm:"'ISRECKONED'"`                             // 是否结算 - 0:未结算 1:已结算
		Openfeealgorithm         int32     `json:"openfeealgorithm"  xorm:"'OPENFEEALGORITHM'"`                 // 建仓手续费收取方式  1：比率  2：固定
		Openchargevalue          float64   `json:"openchargevalue"  xorm:"'OPENCHARGEVALUE'"`                   // 建仓手续费设置值
		Closefeealgorithm        int32     `json:"closefeealgorithm"  xorm:"'CLOSEFEEALGORITHM'"`               // 平仓手续费收取方式 1：比率  2：固定
		Closechargevalue         float64   `json:"closechargevalue"  xorm:"'CLOSECHARGEVALUE'"`                 // 平仓手续费设置值
		Accountcurrencyid        int32     `json:"accountcurrencyid"  xorm:"'ACCOUNTCURRENCYID'"`               // 账户币种ID
		Goodscurrencyid          int32     `json:"goodscurrencyid"  xorm:"'GOODSCURRENCYID'"`                   // 商品币种ID
		Curexchangerate          float64   `json:"curexchangerate"  xorm:"'CUREXCHANGERATE'"`                   // 当前汇率
		Opencharge2              float64   `json:"opencharge2"  xorm:"'OPENCHARGE2'"`                           // 建仓手续费(商品)
		Closecharge2             float64   `json:"closecharge2"  xorm:"'CLOSECHARGE2'"`                         // 平仓手续费(商品)
		Closepl2                 float64   `json:"closepl2"  xorm:"'CLOSEPL2'"`                                 // 平仓盈亏(商品)
		Closepl3                 float64   `json:"closepl3"  xorm:"'CLOSEPL3'"`                                 // 平仓盈亏(账户)(逐笔)
		Closepl4                 float64   `json:"closepl4"  xorm:"'CLOSEPL4'"`                                 // 平仓盈亏(商品)(逐笔)
		Extenalopenfeealgorithm  int32     `json:"extenalopenfeealgorithm"  xorm:"'EXTENALOPENFEEALGORITHM'"`   // 建仓手续费收取方式(外部配置) 1：比率  2：固定
		Extenalopenchargevalue   float64   `json:"extenalopenchargevalue"  xorm:"'EXTENALOPENCHARGEVALUE'"`     // 建仓手续费设置值
		Extenalclosefeealgorithm int32     `json:"extenalclosefeealgorithm"  xorm:"'EXTENALCLOSEFEEALGORITHM'"` // 平仓手续费收取方式 1：比率  2：固定
		Extenalclosechargevalue  float64   `json:"extenalclosechargevalue"  xorm:"'EXTENALCLOSECHARGEVALUE'"`   // 平仓手续费设置值
		Extenalopencharge        float64   `json:"extenalopencharge"  xorm:"'EXTENALOPENCHARGE'"`               // 建仓手续费(商品)(外部)
		Extenalclosecharge       float64   `json:"extenalclosecharge"  xorm:"'EXTENALCLOSECHARGE'"`             // 平仓手续费(商品)(外部)
		Parentaccountid          int64     `json:"parentaccountid"  xorm:"'PARENTACCOUNTID'"`                   // 所属母账户
		Relatedouttradeid        int64     `json:"relatedouttradeid"  xorm:"'RELATEDOUTTRADEID'"`               // 关联外部成交单ID

		Orderidstr       string `xorm:"ORDERIDSTR"`
		Goodscode        string `xorm:"GOODSCODE"`
		Goodsname        string `xorm:"GOODSNAME"`
		Exchangefullname string `xorm:"'EXCHANGEFULLNAME'"`

		OrderLoginCode string `json:"orderlogincode" xorm:"ORDERLOGINCODE"` // 委托人
	}

	tradeDetails := make([]tradeDetail, 0)
	session := db.GetEngine().Table("HIS_HEDGE_INNERTRADEDETAIL T").
		Select(`to_char(T.TRADEID) TRADEIDSTR, to_char(T.ORDERID) ORDERIDSTR, G.GOODSCODE, G.GOODSNAME, T.*, EX.EXCHANGEFULLNAME, 
				L1.LOGINCODE ORDERLOGINCODE`).
		Join("LEFT", "GOODS G", "G.GOODSID = T.GOODSID").
		Join("LEFT", "GOODSGROUP GG", "GG.GOODSGROUPID = G.GOODSGROUPID").
		Join("LEFT", "EXTERNALEXCHANGE EX", "GG.EXEXCHANGEID = EX.AUTOID").
		Join("LEFT", "HIS_HEDGE_INNERORDERDETAIL TT", "TT.ORDERID = T.ORDERID").
		Join("LEFT", "LOGINACCOUNT L1", "L1.LOGINID = TT.OPERATORID").
		Where("T.ISVALIDDATA = 1 and T.ACCOUNTID = ?", accountID)
	if goodsID != 0 {
		session = session.And("T.GOODSID = ?", goodsID)
	}
	if buyOrSell != 0 {
		session = session.And("T.BUYORSELL = ?", buyOrSell)
	}
	if orderID != 0 {
		session = session.And("T.ORDERID = ?", orderID)
	}
	if len(startDate) > 0 {
		session = session.And(fmt.Sprintf("to_date(T.HISTRADEDATE,'yyyyMMdd') >= to_date('%s','yyyy-MM-dd')", startDate))
	}
	if len(endDate) > 0 {
		session = session.And(fmt.Sprintf("to_date(T.HISTRADEDATE,'yyyyMMdd') <= to_date('%s','yyyy-MM-dd')", endDate))
	}
	if err := session.Desc("T.TRADEID").
		Find(&tradeDetails); err != nil {
		return nil, err
	}

	rsp := make([]QueryHedgeTradeDetailRsp, 0)
	for _, v := range tradeDetails {
		rsp = append(rsp, QueryHedgeTradeDetailRsp{
			Tradeid:          v.Tradeid,
			Buyorsell:        v.Buyorsell,
			Orderid:          v.Orderid,
			Tradedate:        v.Tradedate,
			Accountid:        v.Accountid,
			Goodsid:          v.Goodsid,
			Marketid:         v.Marketid,
			Tradetime:        v.Tradetime,
			Tradeprice:       v.Tradeprice,
			Tradeqty:         v.Tradeqty,
			Tradeamount:      v.Tradeamount,
			Opencharge:       v.Opencharge,
			Closecharge:      v.Closecharge,
			Tradetype:        v.Tradetype,
			Channelbuildtype: v.Channelbuildtype,
			Closetype:        v.Closetype,
			Curexchangerate:  v.Curexchangerate,
			Opencharge2:      v.Opencharge2,
			Closecharge2:     v.Closecharge2,
			Goodscode:        v.Goodscode,
			Goodsname:        v.Goodsname,
			Exchangefullname: v.Exchangefullname,
			OrderLoginCode:   v.OrderLoginCode,
		})
	}

	return rsp, nil
}

// GetHedgeOutTradeDetails 获取通道交易外部成交单信息
func GetHedgeOutTradeDetails(accountID, goodsID, buyOrSell, orderID int) ([]QueryHedgeTradeDetailRsp, error) {
	type tradeDetail struct {
		Outtradeid             string    `json:"outtradeid"  xorm:"'OUTTRADEIDSTR'" binding:"required"`   // 外部成交单ID(114+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
		Tradedate              string    `json:"tradedate"  xorm:"'TRADEDATE'"`                           // 交易日(yyyyMMdd)
		Relatedoutorderid      string    `json:"relatedoutorderid"  xorm:"'RELATEDOUTORDERIDSTR'"`        // 关联外部委托单ID
		Accountid              int64     `json:"accountid"  xorm:"'ACCOUNTID'"`                           // 资金账号[外部母账户]
		Hedgeaccountcode       string    `json:"hedgeaccountcode"  xorm:"'HEDGEACCOUNTCODE'"`             // 对冲账号
		Marketid               int32     `json:"marketid"  xorm:"'MARKETID'"`                             // 市场ID
		Hedgegoodsid           int64     `json:"hedgegoodsid"  xorm:"'HEDGEGOODSID'"`                     // 对冲合约ID
		Buyorsell              int32     `json:"buyorsell"  xorm:"'BUYORSELL'"`                           // 买卖方向 - 0:买 1:卖
		Channelbuildtype       int32     `json:"channelbuildtype"  xorm:"'CHANNELBUILDTYPE'"`             // 开平标志- 0:无 1:建仓 2:平仓
		Closetype              int32     `json:"closetype"  xorm:"'CLOSETYPE'"`                           // 平仓方式 - 0:无 1:平今 2:平昨
		Hedgeflag              int32     `json:"hedgeflag"  xorm:"'HEDGEFLAG'"`                           // 投机套保标志 - 0:无 1:投机 2:套保 3:套利
		Tradeprice             float64   `json:"tradeprice"  xorm:"'TRADEPRICE'"`                         // 成交价格
		Tradeqty               int64     `json:"tradeqty"  xorm:"'TRADEQTY'"`                             // 成交数量
		Tradetime              time.Time `json:"tradetime"  xorm:"'TRADETIME'"`                           // 成交时间
		Relatedmhpinnerorderid int64     `json:"relatedmhpinnerorderid"  xorm:"'RELATEDMHPINNERORDERID'"` // 接口平台委托单ID
		Mhpinnertradeid        int64     `json:"mhpinnertradeid"  xorm:"'MHPINNERTRADEID'"`               // 接口平台成交单ID
		Hasinnerorder          int32     `json:"hasinnerorder"  xorm:"'HASINNERORDER'"`                   // 是否有内部单关联 - 0:无 1:有
		Isvalid                int32     `json:"isvalid"  xorm:"'ISVALID'"`                               // 是否有效 - 0:无效 1:有效
		Optiontype             int32     `json:"optiontype"  xorm:"'OPTIONTYPE'"`                         // 期权类型 - 1:认购(看涨) 2:认沽(看跌)
		Premium                float64   `json:"premium"  xorm:"'PREMIUM'"`                               // 权利金
		Tradetype              int32     `json:"tradetype"  xorm:"'TRADETYPE'"`                           // 成交类别 - 1:正常委托成交3:修正持仓成交

		Orderidstr       string `xorm:"ORDERIDSTR"`
		Goodscode        string `xorm:"GOODSCODE"`
		Goodsname        string `xorm:"GOODSNAME"`
		Exchangefullname string `xorm:"'EXCHANGEFULLNAME'"`

		Tradeamount float64 `xorm:"TRADEAMOUNT"` // 成交金额

		OrderLoginCode string `json:"orderlogincode" xorm:"ORDERLOGINCODE"` // 委托人
	}

	tradeDetails := make([]tradeDetail, 0)
	session := db.GetEngine().Table("HEDGE_OUTTRADEDETAIL T").
		Select(`to_char(T.OUTTRADEID) OUTTRADEIDSTR, to_char(T.RELATEDOUTORDERID) RELATEDOUTORDERIDSTR, G.GOODSCODE, G.GOODSNAME, T.*, EX.EXCHANGEFULLNAME, 
				(T.TRADEPRICE * T.TRADEQTY * G.AGREEUNIT) TRADEAMOUNT, 
				L1.LOGINCODE ORDERLOGINCODE`).
		Join("LEFT", "GOODS G", "G.GOODSID = T.HEDGEGOODSID").
		Join("LEFT", "GOODSGROUP GG", "GG.GOODSGROUPID = G.GOODSGROUPID").
		Join("LEFT", "EXTERNALEXCHANGE EX", "GG.EXEXCHANGEID = EX.AUTOID").
		Join("LEFT", "HEDGE_OUTORDERDETAIL TT", "TT.OUTORDERID = T.RELATEDOUTORDERID").
		Join("LEFT", "LOGINACCOUNT L1", "L1.LOGINID = TT.OPERATORID").
		Where("T.ACCOUNTID = ?", accountID)
	if goodsID != 0 {
		session = session.And("T.HEDGEGOODSID = ?", goodsID)
	}
	if buyOrSell != 0 {
		session = session.And("T.BUYORSELL = ?", buyOrSell)
	}
	if orderID != 0 {
		session = session.And("T.RELATEDOUTORDERID = ?", orderID)
	}
	if err := session.Desc("T.OUTTRADEID").
		Find(&tradeDetails); err != nil {
		return nil, err
	}

	rsp := make([]QueryHedgeTradeDetailRsp, 0)
	for _, v := range tradeDetails {
		rsp = append(rsp, QueryHedgeTradeDetailRsp{
			Tradeid:          v.Outtradeid,
			Buyorsell:        v.Buyorsell,
			Orderid:          v.Relatedoutorderid,
			Tradedate:        v.Tradedate,
			Accountid:        v.Accountid,
			Goodsid:          int32(v.Hedgegoodsid),
			Marketid:         v.Marketid,
			Tradetime:        v.Tradetime,
			Tradeprice:       v.Tradeprice,
			Tradeqty:         v.Tradeqty,
			Tradeamount:      v.Tradeamount,
			Opencharge:       0,
			Closecharge:      0,
			Tradetype:        v.Tradetype,
			Channelbuildtype: v.Channelbuildtype,
			Closetype:        v.Closetype,
			Curexchangerate:  1,
			Opencharge2:      0,
			Closecharge2:     0,
			Goodscode:        v.Goodscode,
			Goodsname:        v.Goodsname,
			Exchangefullname: v.Exchangefullname,
			OrderLoginCode:   v.OrderLoginCode,
		})
	}

	return rsp, nil
}

// GetHisHedgeOutTradeDetails 获取通道交易外部历史成交单信息
func GetHisHedgeOutTradeDetails(accountID, goodsID, buyOrSell, orderID int, startDate, endDate string) ([]QueryHedgeTradeDetailRsp, error) {
	type tradeDetail struct {
		Outtradeid             string    `json:"outtradeid"  xorm:"'OUTTRADEIDSTR'" binding:"required"`   // 外部成交单ID(114+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
		Tradedate              string    `json:"tradedate"  xorm:"'TRADEDATE'"`                           // 交易日(yyyyMMdd)
		Relatedoutorderid      string    `json:"relatedoutorderid"  xorm:"'RELATEDOUTORDERIDSTR'"`        // 关联外部委托单ID
		Accountid              int64     `json:"accountid"  xorm:"'ACCOUNTID'"`                           // 资金账号[外部母账户]
		Hedgeaccountcode       string    `json:"hedgeaccountcode"  xorm:"'HEDGEACCOUNTCODE'"`             // 对冲账号
		Marketid               int32     `json:"marketid"  xorm:"'MARKETID'"`                             // 市场ID
		Hedgegoodsid           int64     `json:"hedgegoodsid"  xorm:"'HEDGEGOODSID'"`                     // 对冲合约ID
		Buyorsell              int32     `json:"buyorsell"  xorm:"'BUYORSELL'"`                           // 买卖方向 - 0:买 1:卖
		Channelbuildtype       int32     `json:"channelbuildtype"  xorm:"'CHANNELBUILDTYPE'"`             // 开平标志- 0:无 1:建仓 2:平仓
		Closetype              int32     `json:"closetype"  xorm:"'CLOSETYPE'"`                           // 平仓方式 - 0:无 1:平今 2:平昨
		Hedgeflag              int32     `json:"hedgeflag"  xorm:"'HEDGEFLAG'"`                           // 投机套保标志 - 0:无 1:投机 2:套保 3:套利
		Tradeprice             float64   `json:"tradeprice"  xorm:"'TRADEPRICE'"`                         // 成交价格
		Tradeqty               int64     `json:"tradeqty"  xorm:"'TRADEQTY'"`                             // 成交数量
		Tradetime              time.Time `json:"tradetime"  xorm:"'TRADETIME'"`                           // 成交时间
		Relatedmhpinnerorderid int64     `json:"relatedmhpinnerorderid"  xorm:"'RELATEDMHPINNERORDERID'"` // 接口平台委托单ID
		Mhpinnertradeid        int64     `json:"mhpinnertradeid"  xorm:"'MHPINNERTRADEID'"`               // 接口平台成交单ID
		Hasinnerorder          int32     `json:"hasinnerorder"  xorm:"'HASINNERORDER'"`                   // 是否有内部单关联 - 0:无 1:有
		Isvalid                int32     `json:"isvalid"  xorm:"'ISVALID'"`                               // 是否有效 - 0:无效 1:有效
		Optiontype             int32     `json:"optiontype"  xorm:"'OPTIONTYPE'"`                         // 期权类型 - 1:认购(看涨) 2:认沽(看跌)
		Premium                float64   `json:"premium"  xorm:"'PREMIUM'"`                               // 权利金
		Tradetype              int32     `json:"tradetype"  xorm:"'TRADETYPE'"`                           // 成交类别 - 1:正常委托成交3:修正持仓成交

		Orderidstr       string `xorm:"ORDERIDSTR"`
		Goodscode        string `xorm:"GOODSCODE"`
		Goodsname        string `xorm:"GOODSNAME"`
		Exchangefullname string `xorm:"'EXCHANGEFULLNAME'"`

		Tradeamount float64 `xorm:"TRADEAMOUNT"` // 成交金额

		OrderLoginCode string `json:"orderlogincode" xorm:"ORDERLOGINCODE"` // 委托人
	}

	tradeDetails := make([]tradeDetail, 0)
	session := db.GetEngine().Table("HIS_HEDGE_OUTTRADEDETAIL T").
		Select(`to_char(T.OUTTRADEID) OUTTRADEIDSTR, to_char(T.RELATEDOUTORDERID) RELATEDOUTORDERIDSTR, G.GOODSCODE, G.GOODSNAME, T.*, EX.EXCHANGEFULLNAME, 
				(T.TRADEPRICE * T.TRADEQTY * G.AGREEUNIT) TRADEAMOUNT, 
				L1.LOGINCODE ORDERLOGINCODE`).
		Join("LEFT", "GOODS G", "G.GOODSID = T.HEDGEGOODSID").
		Join("LEFT", "GOODSGROUP GG", "GG.GOODSGROUPID = G.GOODSGROUPID").
		Join("LEFT", "EXTERNALEXCHANGE EX", "GG.EXEXCHANGEID = EX.AUTOID").
		Join("LEFT", "HIS_HEDGE_OUTORDERDETAIL TT", "TT.OUTORDERID = T.RELATEDOUTORDERID").
		Join("LEFT", "LOGINACCOUNT L1", "L1.LOGINID = TT.OPERATORID").
		Where("T.ISVALIDDATA = 1 and T.ACCOUNTID = ?", accountID)
	if goodsID != 0 {
		session = session.And("T.HEDGEGOODSID = ?", goodsID)
	}
	if buyOrSell != 0 {
		session = session.And("T.BUYORSELL = ?", buyOrSell)
	}
	if orderID != 0 {
		session = session.And("T.RELATEDOUTORDERID = ?", orderID)
	}
	if len(startDate) > 0 {
		session = session.And(fmt.Sprintf("to_date(T.HISTRADEDATE,'yyyyMMdd') >= to_date('%s','yyyy-MM-dd')", startDate))
	}
	if len(endDate) > 0 {
		session = session.And(fmt.Sprintf("to_date(T.HISTRADEDATE,'yyyyMMdd') <= to_date('%s','yyyy-MM-dd')", endDate))
	}
	if err := session.Desc("T.OUTTRADEID").
		Find(&tradeDetails); err != nil {
		return nil, err
	}

	rsp := make([]QueryHedgeTradeDetailRsp, 0)
	for _, v := range tradeDetails {
		rsp = append(rsp, QueryHedgeTradeDetailRsp{
			Tradeid:          v.Outtradeid,
			Buyorsell:        v.Buyorsell,
			Orderid:          v.Relatedoutorderid,
			Tradedate:        v.Tradedate,
			Accountid:        v.Accountid,
			Goodsid:          int32(v.Hedgegoodsid),
			Marketid:         v.Marketid,
			Tradetime:        v.Tradetime,
			Tradeprice:       v.Tradeprice,
			Tradeqty:         v.Tradeqty,
			Tradeamount:      v.Tradeamount,
			Opencharge:       0,
			Closecharge:      0,
			Tradetype:        v.Tradetype,
			Channelbuildtype: v.Channelbuildtype,
			Closetype:        v.Closetype,
			Curexchangerate:  1,
			Opencharge2:      0,
			Closecharge2:     0,
			Goodscode:        v.Goodscode,
			Goodsname:        v.Goodsname,
			Exchangefullname: v.Exchangefullname,
			OrderLoginCode:   v.OrderLoginCode,
		})
	}

	return rsp, nil
}
