package models

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

// Szdz3goodspickup 商品提货单表
type Szdz3goodspickup struct {
	Takeorderid     string    `json:"takeorderid"  xorm:"'TAKEORDERID'" binding:"required"` // 提货单号(905+Unix秒时间戳(10位)+xxxxxx)
	Accountid       int64     `json:"accountid"  xorm:"'ACCOUNTID'"`                        // 账户ID
	Goodsid         int64     `json:"goodsid"  xorm:"'GOODSID'"`                            // 商品ID
	Userid          int64     `json:"userid"  xorm:"'USERID'"`                              // 用户ID
	Qty             float64   `json:"qty"  xorm:"'QTY'"`                                    // 提货数量
	Reqtime         time.Time `json:"reqtime"  xorm:"'REQTIME'"`                            // 更新时间
	Recivername     string    `json:"recivername"  xorm:"'RECIVERNAME'"`                    // 提货人姓名
	Cardtypeid      int32     `json:"cardtypeid"  xorm:"'CARDTYPEID'"`                      // 提货人证件类型
	Cardnum         string    `json:"cardnum"  xorm:"'CARDNUM'"`                            // 提货人证件号码
	Phonenum        string    `json:"phonenum"  xorm:"'PHONENUM'"`                          // 提货人联系方式
	Takemode        int32     `json:"takemode"  xorm:"'TAKEMODE'"`                          // 提货方式 - 2:自提 3:配送
	Address         string    `json:"address"  xorm:"'ADDRESS'"`                            // 提货人详细地址
	Takeremark      string    `json:"takeremark"  xorm:"'TAKEREMARK'"`                      // 提货备注
	Takeorderstatus int32     `json:"takeorderstatus"  xorm:"'TAKEORDERSTATUS'"`            // 提货状态 - 1:待发货 2:已发货 3:已收货
	Auditer         int32     `json:"auditer"  xorm:"'AUDITER'"`                            // 审核人
	Audittime       time.Time `json:"audittime"  xorm:"'AUDITTIME'"`                        // 审核时间
	Checkremark     string    `json:"checkremark"  xorm:"'CHECKREMARK'"`                    // 审核备注
	Tradedate       string    `json:"tradedate"  xorm:"'TRADEDATE'"`                        // 交易日(yyyyMMdd)
	Marketid        int32     `json:"marketid"  xorm:"'MARKETID'"`                          // 市场ID
	Handlestatus    int32     `json:"handlestatus"  xorm:"'HANDLESTATUS'"`                  // 处理状态
}

// TableName is SZDZ3_GOODSPICKUP
func (Szdz3goodspickup) TableName() string {
	return "SZDZ3_GOODSPICKUP"
}

// Szdz3convertlog 交易系统转换流水表
type Szdz3convertlog struct {
	Logid          int64     `json:"logid"  xorm:"'LOGID'" binding:"required"` // LogID(901+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
	Tradedate      string    `json:"tradedate"  xorm:"'TRADEDATE'"`            // 交易日(yyyyMMdd)
	Converttype    int32     `json:"converttype"  xorm:"'CONVERTTYPE'"`        // 转换类型 - 1:金点赞转交易 2:金点拍转交易 3:交易转金点赞 4:交易转金点拍
	Outergoodscode string    `json:"outergoodscode"  xorm:"'OUTERGOODSCODE'"`  // 外部商品代码[JD\PD]
	Innergoodsid   int64     `json:"innergoodsid"  xorm:"'INNERGOODSID'"`      // 内部商品ID
	Outvalue       float64   `json:"outvalue"  xorm:"'OUTVALUE'"`              // 源值
	Invalue        float64   `json:"invalue"  xorm:"'INVALUE'"`                // 目标值
	Outratio       int64     `json:"outratio"  xorm:"'OUTRATIO'"`              // 配置转出比值
	Inratio        int64     `json:"inratio"  xorm:"'INRATIO'"`                // 配置转入比值
	Daymaxvalue    float64   `json:"daymaxvalue"  xorm:"'DAYMAXVALUE'"`        // 配置当日最大转入限制
	Timemaxvalue   float64   `json:"timemaxvalue"  xorm:"'TIMEMAXVALUE'"`      // 配置单次最大转入限制
	Timeminvalue   float64   `json:"timeminvalue"  xorm:"'TIMEMINVALUE'"`      // 配置单次最小数量限制
	Userid         int64     `json:"userid"  xorm:"'USERID'"`                  // 用户ID
	Accountid      int64     `json:"accountid"  xorm:"'ACCOUNTID'"`            // 资金账户ID
	Createtime     time.Time `json:"createtime"  xorm:"'CREATETIME'"`          // 记账时间
	Handlestatus   int32     `json:"handlestatus"  xorm:"'HANDLESTATUS'"`      // 处理状态
	Clientticket   string    `json:"clientticket"  xorm:"'CLIENTTICKET'"`      // 客户端流水号
	Remark         string    `json:"remark"  xorm:"'REMARK'"`                  // 备注
	Mobile         string    `json:"mobile"  xorm:"'MOBILE'"`                  // 手机号码(加密存储)
	Sessionid      int64     `json:"sessionid"  xorm:"'SESSIONID'"`            // 会话ID
	Daymaxvalue2   float64   `json:"daymaxvalue2"  xorm:"'DAYMAXVALUE2'"`      // 配置当日最大转入限制(转入)
	Timemaxvalue2  float64   `json:"timemaxvalue2"  xorm:"'TIMEMAXVALUE2'"`    // 配置单次最大转入限制(转入)
	Timeminvalue2  float64   `json:"timeminvalue2"  xorm:"'TIMEMINVALUE2'"`    // 配置单次最小数量限制(转入)
	Pddecimalplace int32     `json:"pddecimalplace"  xorm:"'PDDECIMALPLACE'"`  // PD小数位
}

// TableName is SZDZ3_CONVERTLOG
func (Szdz3convertlog) TableName() string {
	return "SZDZ3_CONVERTLOG"
}

// Szdz3searchwhitelist 搜索白名单表
type Szdz3searchwhitelist struct {
	Userid     int64     `json:"userid"  xorm:"'USERID'" binding:"required"` // 用户ID
	Createtime time.Time `json:"createtime"  xorm:"'CREATETIME'"`            // 创建时间
	Creatorid  int64     `json:"creatorid"  xorm:"'CREATORID'"`              // 创建人
	Modifierid int64     `json:"modifierid"  xorm:"'MODIFIERID'"`            // 修改人
	Modifytime time.Time `json:"modifytime"  xorm:"'MODIFYTIME'"`            // 修改时间
}

// TableName is SZDZ3_SEARCHWHITELIST
func (Szdz3searchwhitelist) TableName() string {
	return "SZDZ3_SEARCHWHITELIST"
}

// Szdz3convertconfig 交易系统转换设置表
type Szdz3convertconfig struct {
	Converttype    int32     `json:"converttype"  xorm:"'CONVERTTYPE'" binding:"required"`       // 转换类型 - 1:金点赞转交易 2:金点拍转交易 3:交易转金点赞(不设置) 4:交易转金点拍(不设置) 5:花生米转交易 6:交易转花生米(不设置)
	Outergoodscode string    `json:"outergoodscode"  xorm:"'OUTERGOODSCODE'" binding:"required"` // 外部商品代码[JD\PD]
	Innergoodsid   int64     `json:"innergoodsid"  xorm:"'INNERGOODSID'" binding:"required"`     // 内部商品ID[交易]
	Outratio       int64     `json:"outratio"  xorm:"'OUTRATIO'"`                                // 源值
	Inratio        int64     `json:"inratio"  xorm:"'INRATIO'"`                                  // 目标值
	Daymaxvalue    float64   `json:"daymaxvalue"  xorm:"'DAYMAXVALUE'"`                          // 当日最大转入限制
	Timemaxvalue   float64   `json:"timemaxvalue"  xorm:"'TIMEMAXVALUE'"`                        // 单次最大转入限制
	Timeminvalue   float64   `json:"timeminvalue"  xorm:"'TIMEMINVALUE'"`                        // 单次最小转入限制
	Createtime     time.Time `json:"createtime"  xorm:"'CREATETIME'"`                            // 创建时间
	Creatorid      int64     `json:"creatorid"  xorm:"'CREATORID'"`                              // 创建人
	Modifierid     int64     `json:"modifierid"  xorm:"'MODIFIERID'"`                            // 修改人
	Modifytime     time.Time `json:"modifytime"  xorm:"'MODIFYTIME'"`                            // 修改时间
	Pddecimalplace int32     `json:"pddecimalplace"  xorm:"'PDDECIMALPLACE'"`                    // PD小数位
	Canin          int32     `json:"canin"  xorm:"'CANIN'"`                                      // 是否可转入 - 0:不可 1:可 [5:花生米转交易]
	Canout         int32     `json:"canout"  xorm:"'CANOUT'"`                                    // 是否可转出 - 0:不可 1:可 [5:花生米转交易]
	Freezedays     int32     `json:"freezedays"  xorm:"'FREEZEDAYS'"`                            // 冻结天数 [5:花生米转交易]
}

// TableName is SZDZ3_CONVERTCONFIG
func (Szdz3convertconfig) TableName() string {
	return "SZDZ3_CONVERTCONFIG"
}

// SZDZTradePosition 尚志大宗查买持仓数据库模型
type SZDZTradePosition struct {
	Accountid       int64   `json:"accountid"  xorm:"'ACCOUNTID'"`             // 账号Id
	Goodsid         int64   `json:"goodsid"  xorm:"'GOODSID'"`                 // 商品Id
	Positionqty     int64   `json:"positionqty"  xorm:"'POSITIONQTY'"`         // 期初持仓数量
	Holderamount    float64 `json:"holderamount"  xorm:"'HOLDERAMOUNT'"`       // 期初持仓总金额
	Curpositionqty  int64   `json:"curpositionqty"  xorm:"'CURPOSITIONQTY'"`   // 当前持仓总数量
	Curholderamount float64 `json:"curholderamount"  xorm:"'CURHOLDERAMOUNT'"` // 当前持仓总金额
	Frozenqty       int64   `json:"frozenqty"  xorm:"'FROZENQTY'"`             // 持仓冻结数量
	Otherfrozenqty  int64   `json:"otherfrozenqty"  xorm:"'OTHERFROZENQTY'"`   // 持仓其他冻结数量(交割冻结)
	Openreqqty      int64   `json:"openreqqty"  xorm:"'OPENREQQTY'"`           // 开仓申请数量
	Opentotalqty    int64   `json:"opentotalqty"  xorm:"'OPENTOTALQTY'"`       // 开仓总数量
	Closetotalqty   int64   `json:"closetotalqty"  xorm:"'CLOSETOTALQTY'"`     // 平仓总数量
	Tnqty           int64   `json:"tnqty"  xorm:"'TNQTY'"`                     // T+N冻结总量
	Tnusedqty       int64   `json:"tnusedqty"  xorm:"'TNUSEDQTY'"`             // T+N使用量
	Usedmargin      float64 `json:"usedmargin"  xorm:"'USEDMARGIN'"`           // 占用保证金
	Curtdposition   int64   `json:"curtdposition"  xorm:"'CURTDPOSITION'"`     // 期末今日头寸
	Fretdposition   int64   `json:"fretdposition"  xorm:"'FRETDPOSITION'"`     // 冻结今日头寸
	Goodscode       string  `json:"goodscode"  xorm:"'GOODSCODE'"`             // 商品代码(内部)
	Goodsname       string  `json:"goodsname"  xorm:"'GOODSNAME'"`             // 商品名称
	Currencyid      int64   `json:"currencyid"  xorm:"'CURRENCYID'"`           // 报价货币ID
	Goodunitid      int64   `json:"goodunitid"  xorm:"'GOODUNITID'"`           // 报价单位ID
	Goodunit        string  `json:"goodunit" xorm:"'GOODUNIT'"`                // 报价单位
	Agreeunit       float64 `json:"agreeunit"  xorm:"'AGREEUNIT'"`             // 合约单位
	Decimalplace    int64   `json:"decimalplace"  xorm:"'DECIMALPLACE'"`       // 报价小数位
	Marketid        int32   `json:"marketid"  xorm:"'MARKETID'"`               // 市场ID
	Trademode       int32   `json:"trademode"  xorm:"'TRADEMODE'"`             // 交易模式
	SZDZ3FreezQTY   int64   `json:"szdz3freezqty" xorm:"'SZDZ3FREEZQTY'"`      // 尚志大宗转换冻结总数量
}

// GetSZDZBuyTradePosition 获取尚志大宗买持仓数据
// 参数 accountID int 资金账户
// 返回值 []SZDZTradePosition 尚志大宗买持仓数据
// 返回值 error 错误
func GetSZDZBuyTradePosition(accountID int) ([]SZDZTradePosition, error) {
	engine := db.GetEngine()

	// 查询数据, 使用Goods作为主表, TRADEPOSITION无记录时使用SZDZ3_FREEZEPOSITION
	tradePosition := make([]SZDZTradePosition, 0)
	s := engine.Table("GOODS").
		Join("LEFT", "TRADEPOSITION", fmt.Sprintf("TRADEPOSITION.GOODSID = GOODS.GOODSID and TRADEPOSITION.ACCOUNTID = %d", accountID)).
		Join("LEFT", "SZDZ3_FREEZEPOSITION", fmt.Sprintf("SZDZ3_FREEZEPOSITION.GOODSID = GOODS.GOODSID and SZDZ3_FREEZEPOSITION.ACCOUNTID = %d", accountID)).
		Join("LEFT", "MARKET", "GOODS.MARKETID = MARKET.MARKETID").
		Join("LEFT", "ENUMDICITEM", "GOODS.GOODUNITID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'goodsunit'").
		Select(`NVL(TRADEPOSITION.ACCOUNTID, SZDZ3_FREEZEPOSITION.ACCOUNTID) ACCOUNTID,
				NVL(TRADEPOSITION.GOODSID,SZDZ3_FREEZEPOSITION.GOODSID) GOODSID,
				NVL(TRADEPOSITION.BUYPOSITIONQTY, 0) POSITIONQTY,
				NVL(TRADEPOSITION.BUYHOLDERAMOUNT, 0) HOLDERAMOUNT,
				NVL(TRADEPOSITION.BUYCURPOSITIONQTY, 0) CURPOSITIONQTY,
				NVL(TRADEPOSITION.BUYCURHOLDERAMOUNT, 0) CURHOLDERAMOUNT,
				NVL(TRADEPOSITION.BUYFROZENQTY, 0) FROZENQTY,
				NVL(TRADEPOSITION.BUYOTHERFROZENQTY, 0) OTHERFROZENQTY,
				NVL(TRADEPOSITION.BUYOPENREQQTY, 0) OPENREQQTY,
				NVL(TRADEPOSITION.BUYOPENTOTALQTY, 0) OPENTOTALQTY,
				NVL(TRADEPOSITION.BUYCLOSETOTALQTY, 0) CLOSETOTALQTY,
				NVL(TRADEPOSITION.BUYTNQTY, 0) TNQTY,
				NVL(TRADEPOSITION.BUYTNUSEDQTY, 0) TNUSEDQTY,
				NVL(TRADEPOSITION.USEDMARGIN, 0) USEDMARGIN,
				NVL(TRADEPOSITION.BUYCURTDPOSITION, 0) CURTDPOSITION,
				NVL(TRADEPOSITION.BUYFRETDPOSITION, 0) FRETDPOSITION,
				NVL(SZDZ3_FREEZEPOSITION.QTY, 0) SZDZ3FreezQTY,
				GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.CURRENCYID, GOODS.GOODUNITID, ENUMDICITEM.ENUMDICNAME as GOODUNIT, GOODS.AGREEUNIT, GOODS.DECIMALPLACE, MARKET.MARKETID, MARKET.TRADEMODE`).
		Where(fmt.Sprintf(`TRADEPOSITION.ACCOUNTID = %d and TRADEPOSITION.BUYCURPOSITIONQTY > 0 or SZDZ3_FREEZEPOSITION.QTY > 0`, accountID))
	if err := s.Find(&tradePosition); err != nil {
		// 查询失败
		return tradePosition, err
	}

	return tradePosition, nil
}
