package models

import (
	"encoding/hex"
	"errors"
	"fmt"
	"mtp2_if/db"
	"mtp2_if/global/e"
	"mtp2_if/utils"
	"strconv"
	"time"
)

// Loginaccount 登录账户表
type Loginaccount struct {
	Loginid            int64     `json:"loginid"  xorm:"'LOGINID'" binding:"required"`    // 登陆账号
	Userid             int64     `json:"userid"  xorm:"'USERID'"`                         // 用户ID
	Loginfailnum       int32     `json:"loginfailnum"  xorm:"'LOGINFAILNUM'"`             // 连续登录失败次数(登录成功时清零)
	Password           string    `json:"-"  xorm:"'PASSWORD'"`                            // 登陆密码
	Loginusertype      int32     `json:"loginusertype"  xorm:"'LOGINUSERTYPE'"`           // 登录账号类型 - 1:投资者 2:机构交易员
	Loginstatus        int32     `json:"loginstatus"  xorm:"'LOGINSTATUS'"`               // 登录账号状态 1:正常 2:冻结 3:无效
	Lastlogintime      time.Time `json:"lastlogintime"  xorm:"'LASTLOGINTIME'"`           // 最新登录时间
	Lastloginmode      int32     `json:"lastloginmode"  xorm:"'LASTLOGINMODE'"`           // 最新登录方式(客户端类型) -  0:保留为未填终端类型 1:PC管理端 2:PC交易端 3:手机客户端_安卓 4:网页客户端 5:微信客户端 6:手机客户端_苹果 7:网上开户客户端 8:无效终端编号 9:报价终端(中江)
	Lastloginip        string    `json:"lastloginip"  xorm:"'LASTLOGINIP'"`               // 最新登录地址
	Loginport          int32     `json:"loginport"  xorm:"'LOGINPORT'"`                   // 最新登录端口
	Lastloginremark    string    `json:"lastloginremark"  xorm:"'LASTLOGINREMARK'"`       // 最新登录描述
	Modifytime         time.Time `json:"modifytime"  xorm:"'MODIFYTIME'"`                 // 修改时间
	Modifierid         int64     `json:"modifierid"  xorm:"'MODIFIERID'"`                 // 修改人
	Pwdwrongcount      int32     `json:"pwdwrongcount"  xorm:"'PWDWRONGCOUNT'"`           // 密码错误次数
	Unfreezetime       time.Time `json:"unfreezetime"  xorm:"'UNFREEZETIME'"`             // 账户解冻时间
	Haslogined         int32     `json:"haslogined"  xorm:"'HASLOGINED'"`                 // 是否已登录 - 0:未登录 1:已登录
	Hasupdatedpwd      int32     `json:"hasupdatedpwd"  xorm:"'HASUPDATEDPWD'"`           // 是否已更改密码 - 0:未修改 1:已修改
	Logincode          string    `json:"logincode"  xorm:"'LOGINCODE'"`                   // 登录代码
	Canoutin           int32     `json:"canoutin"  xorm:"'CANOUTIN'"`                     // 是否可出入金 - 0:不可 1:可
	Clientroleid       int32     `json:"clientroleid"  xorm:"'CLIENTROLEID'"`             // 终端角色ID
	Taaccountrighttype int32     `json:"taaccountrighttype"  xorm:"'TAACCOUNTRIGHTTYPE'"` // 资金账号权限类型 - 1:不选默认为所有权限 2:不选默认为无权限
}

// TableName is LOGINACCOUNT
func (Loginaccount) TableName() string {
	return "LOGINACCOUNT"
}

// Taaccount 资金账户表 - 导历史
type Taaccount struct {
	Accountid  int64 `json:"accountid"  xorm:"'ACCOUNTID'" binding:"required"` // 资金账户ID
	Userid     int64 `json:"userid"  xorm:"'USERID'" binding:"required"`       // 用户ID
	Currencyid int64 `json:"currencyid"  xorm:"'CURRENCYID'"`                  // 货币ID
	Changeflag int32 `json:"changeflag"  xorm:"'CHANGEFLAG'"`                  // 变动标志(当前账户资金有任何变动更新为1系统结算时更新0;供清算时使用) 0：无变动 1：有变动
	// Password              string    `json:"password"  xorm:"'PASSWORD'"`                           // 资金密码
	Password              string    `json:"-"  xorm:"'PASSWORD'"`                                  // 资金密码
	Tradestatus           int32     `json:"tradestatus"  xorm:"'TRADESTATUS'"`                     // 交易状态 - 1:正常 2:受限 3:冻结 4:禁止建仓(人工受限) 5:禁止交易(人工冻结) 6:待激活 7:已注销
	Signstatus            int32     `json:"signstatus"  xorm:"'SIGNSTATUS'"`                       // 签约状态 - 1:未签约 2:签约待审核 3:签约中 4:已签约 5:解约待审核 6:解约中 7:已解约 8:已解绑 9:绑卡中
	Ismain                int32     `json:"ismain"  xorm:"'ISMAIN'"`                               // 是否母账号 0:不是母账户 1:是母账户
	Parentaccountid       int64     `json:"parentaccountid"  xorm:"'PARENTACCOUNTID'"`             // 所属根账号
	Relateduserid         int64     `json:"relateduserid"  xorm:"'RELATEDUSERID'"`                 // 关联用户
	Relatedaccountstatus  int32     `json:"relatedaccountstatus"  xorm:"'RELATEDACCOUNTSTATUS'"`   // 关联用户交易权限状态 - 1:正常(可交易) 2:受限(可平仓，不可建仓) 3:冻结(不可交易)
	Taaccounttype         int32     `json:"taaccounttype"  xorm:"'TAACCOUNTTYPE'"`                 // 账号类型 - 1:外部账号 2:内部账号 3:内部做市自营账号 4:内部做市接单账号
	Isreckonaccount       int32     `json:"isreckonaccount"  xorm:"'ISRECKONACCOUNT'"`             // 是否机构分润账号 0:不是 1:是
	Ismarketaccount       int32     `json:"ismarketaccount"  xorm:"'ISMARKETACCOUNT'"`             // 是否机构接单账号 0:不是 1:是
	Balance               float64   `json:"balance"  xorm:"'BALANCE'"`                             // 期初余额
	Orifreezemargin       float64   `json:"orifreezemargin"  xorm:"'ORIFREEZEMARGIN'"`             // 期初冻结保证金
	Oriusedmargin         float64   `json:"oriusedmargin"  xorm:"'ORIUSEDMARGIN'"`                 // 期初占用保证金
	Oriotherfreezemargin  float64   `json:"oriotherfreezemargin"  xorm:"'ORIOTHERFREEZEMARGIN'"`   // 期初其他冻结保证金(出金冻结资金 交割买方冻结 申购冻结 全款买入 商城买入)
	Orifreezecharge       float64   `json:"orifreezecharge"  xorm:"'ORIFREEZECHARGE'"`             // 期初手续费冻结
	Orimortgagecredit     float64   `json:"orimortgagecredit"  xorm:"'ORIMORTGAGECREDIT'"`         // 期初授信金额
	Oriothercredit        float64   `json:"oriothercredit"  xorm:"'ORIOTHERCREDIT'"`               // 期初其它授信金额
	Orioutamountfreeze    float64   `json:"orioutamountfreeze"  xorm:"'ORIOUTAMOUNTFREEZE'"`       // 期初出金冻结
	Currentbalance        float64   `json:"currentbalance"  xorm:"'CURRENTBALANCE'"`               // 期末余额
	Freezemargin          float64   `json:"freezemargin"  xorm:"'FREEZEMARGIN'"`                   // 冻结保证金
	Usedmargin            float64   `json:"usedmargin"  xorm:"'USEDMARGIN'"`                       // 占用保证金
	Otherfreezemargin     float64   `json:"otherfreezemargin"  xorm:"'OTHERFREEZEMARGIN'"`         // 其他冻结保证金(交割买方冻结 申购冻结 全款买入 商城买入)
	Freezecharge          float64   `json:"freezecharge"  xorm:"'FREEZECHARGE'"`                   // 手续费冻结
	Mortgagecredit        float64   `json:"mortgagecredit"  xorm:"'MORTGAGECREDIT'"`               // 授信金额
	Othercredit           float64   `json:"othercredit"  xorm:"'OTHERCREDIT'"`                     // 其它授信金额
	Outamountfreeze       float64   `json:"outamountfreeze"  xorm:"'OUTAMOUNTFREEZE'"`             // 出金冻结
	Inamount              float64   `json:"inamount"  xorm:"'INAMOUNT'"`                           // 今日入金金额(包括三方入金)
	Outamount             float64   `json:"outamount"  xorm:"'OUTAMOUNT'"`                         // 今日出金金额(包括三方出金)
	Paycharge             float64   `json:"paycharge"  xorm:"'PAYCHARGE'"`                         // 今日手续费支出
	Closepl               float64   `json:"closepl"  xorm:"'CLOSEPL'"`                             // 今日平仓盈亏
	Creditincrease        float64   `json:"creditincrease"  xorm:"'CREDITINCREASE'"`               // 今日授信增加
	Creditdecrease        float64   `json:"creditdecrease"  xorm:"'CREDITDECREASE'"`               // 今日授信减少
	Othercreditincrease   float64   `json:"othercreditincrease"  xorm:"'OTHERCREDITINCREASE'"`     // 今日其它授信增加
	Othercreditdecrease   float64   `json:"othercreditdecrease"  xorm:"'OTHERCREDITDECREASE'"`     // 今日其它授信减少
	Transferamount        float64   `json:"transferamount"  xorm:"'TRANSFERAMOUNT'"`               // 今日划转金额(母子账号资金划转，从划入账号为正，从账号划出为负)
	Otherpay              float64   `json:"otherpay"  xorm:"'OTHERPAY'"`                           // 其他支出(交割付款 申购付款 全款买入 商城买入 卖家退货)
	Otherincome           float64   `json:"otherincome"  xorm:"'OTHERINCOME'"`                     // 其他收入(交割收款 申购收款 全款卖出 商城卖出 买家退货 会员手续费收入)
	Outthreshold          float64   `json:"outthreshold"  xorm:"'OUTTHRESHOLD'"`                   // 出金阈值
	Tradestatuschangetime time.Time `json:"tradestatuschangetime"  xorm:"'TRADESTATUSCHANGETIME'"` // 激活时间
	Changetime            time.Time `json:"changetime"  xorm:"'CHANGETIME'"`                       // 账户状态变更时间
	Thirdinamount         float64   `json:"thirdinamount"  xorm:"'THIRDINAMOUNT'"`                 // 今日三方入金
	Thirdoutamount        float64   `json:"thirdoutamount"  xorm:"'THIRDOUTAMOUNT'"`               // 今日三方出金
	Capitalbalance        float64   `json:"capitalbalance"  xorm:"'CAPITALBALANCE'"`               // 本金余额[外部子账户实际出入金余额]
	Fromaccountid         int64     `json:"fromaccountid"  xorm:"'FROMACCOUNTID'"`                 // 所属上级账户
	Sublevelpath          string    `json:"sublevelpath"  xorm:"'SUBLEVELPATH'"`                   // 账号层级路径(逗号分隔,首尾加逗号)
	Serivcegroup          int64     `json:"serivcegroup"  xorm:"'SERIVCEGROUP'"`                   // 服务分组
	Accountname           string    `json:"accountname"  xorm:"'ACCOUNTNAME'"`                     // 账户名称
	Accountflag           int32     `json:"accountflag"  xorm:"'ACCOUNTFLAG'"`                     // 账户标识 - 0\1 (默认为0， 当上级账户与本账户的关联用户均为自己时更新为1)
}

// TableName is TAACCOUNT
func (Taaccount) TableName() string {
	return "TAACCOUNT"
}

// Hedgeouttaaccount 对冲外部资金账户表 - 导历史
type Hedgeouttaaccount struct {
	Accountid         int64   `json:"accountid"  xorm:"'ACCOUNTID'" binding:"required"` // 资金账号[外部母账户]
	Hedgeaccountcode  string  `json:"hedgeaccountcode"  xorm:"'HEDGEACCOUNTCODE'"`      // 对冲账号
	Tradedate         string  `json:"tradedate"  xorm:"'TRADEDATE'"`                    // 交易日(yyyyMMdd)
	Prebalance        float64 `json:"prebalance"  xorm:"'PREBALANCE'"`                  // 期初余额
	Balance           float64 `json:"balance"  xorm:"'BALANCE'"`                        // 期末余额
	Usedmargin        float64 `json:"usedmargin"  xorm:"'USEDMARGIN'"`                  // 占用保证金
	Freezemargin      float64 `json:"freezemargin"  xorm:"'FREEZEMARGIN'"`              // 冻结保证金
	Freezecharge      float64 `json:"freezecharge"  xorm:"'FREEZECHARGE'"`              // 手续费冻结
	Otherfreezemargin float64 `json:"otherfreezemargin"  xorm:"'OTHERFREEZEMARGIN'"`    // 其他冻结保证金(交割买方冻结 申购冻结 全款买入 商城买入)
	Inamount          float64 `json:"inamount"  xorm:"'INAMOUNT'"`                      // 今日入金金额(包括三方入金)
	Outamount         float64 `json:"outamount"  xorm:"'OUTAMOUNT'"`                    // 今日出金金额(包括三方出金)
	Paycharge         float64 `json:"paycharge"  xorm:"'PAYCHARGE'"`                    // 今日手续费支出
	Closepl           float64 `json:"closepl"  xorm:"'CLOSEPL'"`                        // 今日平仓盈亏
	Positionprofit    float64 `json:"positionprofit"  xorm:"'POSITIONPROFIT'"`          // 结算盈亏
}

// TableName is HEDGE_OUTTAACCOUNT
func (Hedgeouttaaccount) TableName() string {
	return "HEDGE_OUTTAACCOUNT"
}

// Logintaaccount 登录账户资金权限表 - 自营会员
type Logintaaccount struct {
	Loginid    int64     `json:"loginid"  xorm:"'LOGINID'" binding:"required"`     // 登录账号ID
	Accountid  int64     `json:"accountid"  xorm:"'ACCOUNTID'" binding:"required"` // 资金账号ID
	Modifytime time.Time `json:"modifytime"  xorm:"'MODIFYTIME'"`                  // 修改时间
	Modifierid int64     `json:"modifierid"  xorm:"'MODIFIERID'"`                  // 修改人
}

// TableName is LOGINTAACCOUNT
func (Logintaaccount) TableName() string {
	return "LOGINTAACCOUNT"
}

// Arearolemarket 机构角色市场权限表
type Arearolemarket struct {
	Areauserid       int64     `json:"areauserid"  xorm:"'AREAUSERID'" binding:"required"` // 机构用户ID
	Roletype         int32     `json:"roletype"  xorm:"'ROLETYPE'" binding:"required"`     // 角色类型 -  6:自营会员 7:经纪会员
	Marketid         int32     `json:"marketid"  xorm:"'MARKETID'" binding:"required"`     // 市场ID
	Modifytime       time.Time `json:"modifytime"  xorm:"'MODIFYTIME'"`                    // 修改时间
	Modifierid       int64     `json:"modifierid"  xorm:"'MODIFIERID'"`                    // 修改人ID
	Spotrighttype    int32     `json:"spotrighttype"  xorm:"'SPOTRIGHTTYPE'"`              // 现货权限类型 - 0:无 1:可挂可摘 2:可挂 3:可摘 [现货类](卖大厅)
	Buyspotrighttype int32     `json:"buyspotrighttype"  xorm:"'BUYSPOTRIGHTTYPE'"`        // 现货权限类型 - 0:无 1:可挂可摘 2:可挂 3:可摘 [现货类](买大厅)
}

// TableName is AREAROLEMARKET
func (Arearolemarket) TableName() string {
	return "AREAROLEMARKET"
}

// Taaccountmarket 资金账号市场权限表
type Taaccountmarket struct {
	Accountid        int64     `json:"accountid"  xorm:"'ACCOUNTID'" binding:"required"` // 资金账号ID
	Marketid         int32     `json:"marketid"  xorm:"'MARKETID'" binding:"required"`   // 市场ID
	Modifytime       time.Time `json:"modifytime"  xorm:"'MODIFYTIME'"`                  // 修改时间
	Modifierid       int64     `json:"modifierid"  xorm:"'MODIFIERID'"`                  // 修改人
	Spotrighttype    int32     `json:"spotrighttype"  xorm:"'SPOTRIGHTTYPE'"`            // 现货权限类型 - 0:无1:可挂可摘 2:可挂 3:可摘 [现货类](卖大厅)
	Buyspotrighttype int32     `json:"buyspotrighttype"  xorm:"'BUYSPOTRIGHTTYPE'"`      // 现货权限类型 - 0:无1:可挂可摘 2:可挂 3:可摘 [现货类](买大厅)
}

// TableName is TAACCOUNTMARKET
func (Taaccountmarket) TableName() string {
	return "TAACCOUNTMARKET"
}

// Useraccount 用户表
type Useraccount struct {
	Userid           int64     `json:"userid"  xorm:"USERID" binding:"required"`  // 用户ID
	Usertype         int32     `json:"usertype"  xorm:"USERTYPE"`                 // 账户类型 -  1:交易所 2:机构 3:会员子机构 4:经纪人 5:投资者 6:客户 7:企业成员(云平台)
	Modifystatus     int32     `json:"modifystatus"  xorm:"MODIFYSTATUS"`         // 变更状态 1 未变更 2 变更中 3 变更待审核 4 变更待复核(投资者)
	Accountname      string    `json:"accountname"  xorm:"ACCOUNTNAME"`           // 账户名称(机构名称)
	Parentuserid     int64     `json:"parentuserid"  xorm:"PARENTUSERID"`         // 所属机构ID
	Broker           int64     `json:"broker"  xorm:"BROKER"`                     // 所属经纪人ID
	Subarealevelpath string    `json:"subarealevelpath"  xorm:"SUBAREALEVELPATH"` // 子机构层级路径(逗号分隔,首尾加逗号)
	Refereeuserid    int64     `json:"refereeuserid"  xorm:"REFEREEUSERID"`       // 推荐人ID
	Memberuserid     int64     `json:"memberuserid"  xorm:"MEMBERUSERID"`         // 所属会员ID
	Accountstatus    int32     `json:"accountstatus"  xorm:"ACCOUNTSTATUS"`       // 账户状态 -  1:待激活 2:待审核 3:待复审 4:正常 5:审核拒绝 6:停用(注销) 7:注销(删除)
	Reckonaccountid  int64     `json:"reckonaccountid"  xorm:"RECKONACCOUNTID"`   // 默认结算资金账号ID(机构分润使用) 作废
	Createtime       time.Time `json:"createtime"  xorm:"CREATETIME"`             // 创建时间
	Creatorid        int64     `json:"creatorid"  xorm:"CREATORID"`               // 创建人
	Audittime        time.Time `json:"audittime"  xorm:"AUDITTIME"`               // 审核时间
	Audituserid      int64     `json:"audituserid"  xorm:"AUDITUSERID"`           // 审核人
	Auditremark      string    `json:"auditremark"  xorm:"AUDITREMARK"`           // 审核备注
	Canceltime       time.Time `json:"canceltime"  xorm:"CANCELTIME"`             // 销户时间
	Canceluserid     int64     `json:"canceluserid"  xorm:"CANCELUSERID"`         // 销户人
	Modifytime       time.Time `json:"modifytime"  xorm:"MODIFYTIME"`             // 修改时间
	Modifierid       int64     `json:"modifierid"  xorm:"MODIFIERID"`             // 修改人
	Modifyremark     string    `json:"modifyremark"  xorm:"MODIFYREMARK"`         // 变更备注
	Maxinvestornum   int64     `json:"maxinvestornum"  xorm:"MAXINVESTORNUM"`     // 最大用户数(经纪会员下投资者个数)
	Hasauth          int32     `json:"hasauth"  xorm:"HASAUTH"`                   // 是否已实名认证 - 0:未认证 1:已认证 2:已提交(待审核) 3:已拒绝
	Refercount       int32     `json:"refercount"  xorm:"REFERCOUNT"`             // 推荐总人数
	Refernum         string    `json:"refernum"  xorm:"REFERNUM"`                 // 推荐码
	Isanonymous      int32     `json:"isanonymous"  xorm:"ISANONYMOUS"`           // 是否匿名下单 - 0:否 1:是
	Parenttopuser    string    `json:"parenttopuser"  xorm:"PARENTTOPUSER"`       // 上级顶级机构 [092=0,1时，默认为1， 092=2时若自已为顶级，则填入自己，自己不为顶级，填入ParentUserID的"ParentTopUser"]
	Subaccountlevel  int32     `json:"subaccountlevel"  xorm:"SUBACCOUNTLEVEL"`   // 子账户层数
	Applysrc         int32     `json:"applysrc"  xorm:"APPLYSRC"`                 // 申请来源 - 1:管理端 2:终端
	Auditsrc         int32     `json:"auditsrc"  xorm:"AUDITSRC"`                 // 审核来源 - 1:管理端 2:终端
	Rootuserid       int64     `json:"rootuserid"  xorm:"ROOTUSERID"`             // 根用户ID
	Canrecommend     int32     `json:"canrecommend"  xorm:"CANRECOMMEND"`         // 是否可推荐 - 0:不可 1;可
}

// TableName is USERACCOUNT
func (Useraccount) TableName() string {
	return "USERACCOUNT"
}

// Userinfo 用户信息表
type Userinfo struct {
	Userid                 int64     `json:"userid"  xorm:"'USERID'" binding:"required"`              // 用户ID
	Userinfotype           int32     `json:"userinfotype"  xorm:"'USERINFOTYPE'"`                     // 用户信息类型 - 1:个人  2:企业
	Customername           string    `json:"customername"  xorm:"'CUSTOMERNAME'"`                     // 客户名称(企业名称)
	Userstatus             int32     `json:"userstatus"  xorm:"'USERSTATUS'"`                         // 用户状态 - 1：正常 2：注销
	Usertype               int32     `json:"usertype"  xorm:"'USERTYPE'"`                             // 账户类型 -  1:交易所 2:机构 3:会员子机构 4:经纪人 5:投资者 6:客户
	Openmode               int32     `json:"openmode"  xorm:"'OPENMODE'"`                             // 开户方式 -  1:管理端开户 2:网上开户注册(会员官网) 3:微信开户 4:网页交易端注册 5:安卓手机端注册 6:苹果手机端注册 7:PC交易端注册 8:微信快速开户 9:支付宝快速开户 10:手机号快速开户
	Cardtypeid             int32     `json:"cardtypeid"  xorm:"'CARDTYPEID'"`                         // 证件类型ID
	Cardnum                string    `json:"cardnum"  xorm:"'CARDNUM'"`                               // 证件号码(加密存储)
	Halfbodyphotourl       string    `json:"halfbodyphotourl"  xorm:"'HALFBODYPHOTOURL'"`             // 半身照地址
	Cardfrontphotourl      string    `json:"cardfrontphotourl"  xorm:"'CARDFRONTPHOTOURL'"`           // 证件正面图片地址
	Cardbackphotourl       string    `json:"cardbackphotourl"  xorm:"'CARDBACKPHOTOURL'"`             // 证件背面图片地址
	Biznature              int32     `json:"biznature"  xorm:"'BIZNATURE'"`                           // 企业性质( 企业) - 1:国有控股企业 2:集体控股企业 3:私人控股企业 4:港澳台商控股企业 5:外商控股企业 6:其它
	Bizscope               string    `json:"bizscope"  xorm:"'BIZSCOPE'"`                             // 企业经营范围(企业)
	Legalpersonname        string    `json:"legalpersonname"  xorm:"'LEGALPERSONNAME'"`               // 法人姓名(企业)
	Contactname            string    `json:"contactname"  xorm:"'CONTACTNAME'"`                       // 联系人
	Sex                    int32     `json:"sex"  xorm:"'SEX'"`                                       // 用户性别  0: 女  1: 男
	Telphone               string    `json:"telphone"  xorm:"'TELPHONE'"`                             // 联系电话(加密存储)
	Mobile                 string    `json:"mobile"  xorm:"'MOBILE'"`                                 // 手机号码(加密存储)
	Fax                    string    `json:"fax"  xorm:"'FAX'"`                                       // 传真(加密存储)
	Email                  string    `json:"email"  xorm:"'EMAIL'"`                                   // 邮件(加密存储)
	Qq                     string    `json:"qq"  xorm:"'QQ'"`                                         // QQ(加密存储
	Wechat                 string    `json:"wechat"  xorm:"'WECHAT'"`                                 // 微信(加密存储)
	Countryid              int32     `json:"countryid"  xorm:"'COUNTRYID'"`                           // 国家
	Provinceid             int32     `json:"provinceid"  xorm:"'PROVINCEID'"`                         // 省
	Cityid                 int32     `json:"cityid"  xorm:"'CITYID'"`                                 // 市
	Districtid             int32     `json:"districtid"  xorm:"'DISTRICTID'"`                         // 地区
	Company                string    `json:"company"  xorm:"'COMPANY'"`                               // 公司(个人)
	Address                string    `json:"address"  xorm:"'ADDRESS'"`                               // 地址
	Postalcode             string    `json:"postalcode"  xorm:"'POSTALCODE'"`                         // 邮政编码
	Createtime             time.Time `json:"createtime"  xorm:"'CREATETIME'"`                         // 创建时间
	Creatorid              int64     `json:"creatorid"  xorm:"'CREATORID'"`                           // 创建人
	Modifiertime           time.Time `json:"modifiertime"  xorm:"'MODIFIERTIME'"`                     // 修改时间
	Modifierid             int64     `json:"modifierid"  xorm:"'MODIFIERID'"`                         // 修改人
	Remark                 string    `json:"remark"  xorm:"'REMARK'"`                                 // 备注
	Wskhinfo               string    `json:"wskhinfo"  xorm:"'WSKHINFO'"`                             // 开户申请信息(JSON)
	Signpdfurl             string    `json:"signpdfurl"  xorm:"'SIGNPDFURL'"`                         // 签约pdf文件
	Legalcardfrontphotourl string    `json:"legalcardfrontphotourl"  xorm:"'LEGALCARDFRONTPHOTOURL'"` // 法人身份证正面照地址
	Legalcardbackphotourl  string    `json:"legalcardbackphotourl"  xorm:"'LEGALCARDBACKPHOTOURL'"`   // 法人身份证背面照地址
	Otherurl               string    `json:"otherurl"  xorm:"'OTHERURL'"`                             // 其它图片地址[使用分号分隔]
	Hasencrypt             int32     `json:"hasencrypt"  xorm:"'HASENCRYPT'"`                         // 数据是否已加密 - 0:未加密 1:已加密
	Bankname               string    `json:"bankname"  xorm:"'BANKNAME'"`                             // 银行名称
	Bankaccount            string    `json:"bankaccount"  xorm:"'BANKACCOUNT'"`                       // 银行帐号 (加密存储)
	Bankcardfrontphotourl  string    `json:"bankcardfrontphotourl"  xorm:"'BANKCARDFRONTPHOTOURL'"`   // 银行卡正面照地址
	Needinvoice            int32     `json:"needinvoice"  xorm:"'NEEDINVOICE'"`                       // 是否需要发票 - 0:不需要 1:需要
	Bankid                 string    `json:"bankid"  xorm:"'BANKID'"`                                 // 银行编码
	Attachment1            string    `json:"attachment1"  xorm:"'ATTACHMENT1'"`                       // 附件1
	Attachment2            string    `json:"attachment2"  xorm:"'ATTACHMENT2'"`                       // 附件2
	Bankaccountname        string    `json:"bankaccountname"  xorm:"'BANKACCOUNTNAME'"`               // 收款人名称
	Headurl                string    `json:"headurl"  xorm:"'HEADURL'"`                               // 头像地址
	Nickname               string    `json:"nickname"  xorm:"'NICKNAME'"`                             // 昵称：默认为名称脱敏(张**) 或 手机号脱敏(139****9999)
	Mobile2                string    `json:"mobile2"  xorm:"'MOBILE2'"`                               // 手机号码[明文-尚志]
}

// TableName is USERINFO
func (Userinfo) TableName() string {
	return "USERINFO"
}

// Quoter 报价商表
type Quoter struct {
	Quoterid       int64     `json:"quoterid"  xorm:"'QUOTERID'" binding:"required"`     // 报价商ID(自增ID)
	Quotername     string    `json:"quotername"  xorm:"'QUOTERNAME'" binding:"required"` // 报价商名称
	Areauserid     int64     `json:"areauserid"  xorm:"'AREAUSERID'" binding:"required"` // 所属机构ID
	Tradeproperty  int32     `json:"tradeproperty"  xorm:"'TRADEPROPERTY'"`              // 交易属性
	Defaultmakerid int64     `json:"defaultmakerid"  xorm:"'DEFAULTMAKERID'"`            // 默认做市商ID(UserID)
	Quoterstatus   int32     `json:"quoterstatus"  xorm:"'QUOTERSTATUS'"`                // 报价商状态 - 1:正常 2:注销
	Modifierid     int64     `json:"modifierid"  xorm:"'MODIFIERID'"`                    // 修改人
	Modifytime     time.Time `json:"modifytime"  xorm:"'MODIFYTIME'"`                    // 修改时间
	Matchmode      int32     `json:"matchmode"  xorm:"'MATCHMODE'"`                      // 对手模式: 1-经纪会员自接 2:按对手关系[收益权用]
}

// TableName is QUOTER
func (Quoter) TableName() string {
	return "QUOTER"
}

// Arearole 机构角色表
type Arearole struct {
	Userid         int64     `json:"userid"  xorm:"USERID" binding:"required"`     // 机构用户ID其他做市关系，都设置为 1
	Roletype       int32     `json:"roletype"  xorm:"ROLETYPE" binding:"required"` // 角色类型 -  1:交易所 2:运营机构 3:营销中心 4:仓库机构 5:三方服务机构 6:自营会员 7:经纪会员 8:做市会员 9:产业会员 10:金融机构 11:商城店铺 12:子机构 13:报价商 14:积分服务商 15:供货商 16:圈内会员 17:物流机构 18:报价配置机构 19:场外期权做市商 20:组织机构 21:顶级机构 22:业务员 23:跟单员 24:交易员 25:客户      98:代理 99:门店
	Tradeaccountid int64     `json:"tradeaccountid"  xorm:"TRADEACCOUNTID"`        // 默认交易资金账号ID(做市会员被动接单使用、商城店铺默认资金账 号、圈内会员默认资金账号)  - 作废， 使用UserReckonAccount
	Createtime     time.Time `json:"createtime"  xorm:"CREATETIME"`                // 创建时间
	Creatorid      int64     `json:"creatorid"  xorm:"CREATORID"`                  // 创建人ID
	Modifytime     time.Time `json:"modifytime"  xorm:"MODIFYTIME"`                // 修改时间
	Modifierid     int64     `json:"modifierid"  xorm:"MODIFIERID"`                // 修改人ID
	Shoppassword   string    `json:"shoppassword"  xorm:"SHOPPASSWORD"`            // 商城店铺登陆密码(商城店铺角色使用)
	Isreturnscore  int32     `json:"isreturnscore"  xorm:"ISRETURNSCORE"`          // 是否返还积分 [经纪会员-辽东湾] - 0:不返还 1:返还
	Transurl       string    `json:"transurl"  xorm:"TRANSURL"`                    // 物流地址(物流机构)
	Outuserid      string    `json:"outuserid"  xorm:"OUTUSERID"`                  // 外部账户[场外期权做市商]
	Parentuserid   int64     `json:"parentuserid"  xorm:"PARENTUSERID"`            // 上级组织机构(组织机构)
	Rootuserid     int64     `json:"rootuserid"  xorm:"ROOTUSERID"`                // 顶级组织机构用户ID(组织机构)
	Sublevelpath   string    `json:"sublevelpath"  xorm:"SUBLEVELPATH"`            // 组织机构层级路径(逗号分隔,首尾加逗号)
	Orgtype        int32     `json:"orgtype"  xorm:"ORGTYPE"`                      // 组织机构类型 1:机构\分支节点 2:交易员\叶子节点 3:部门\分支节点
	Fromuserid     int64     `json:"fromuserid"  xorm:"FROMUSERID"`                // 所属机构(组织机构)( OrgType = 1时为自己， = 2\3时取上级机构的所属机构)
	Suborgtype     int32     `json:"suborgtype"  xorm:"SUBORGTYPE"`                // 子机构类型(千海金) - 0:机构 1:代理 2:门店
}

// TableName is AREAROLE
func (Arearole) TableName() string {
	return "AREAROLE"
}

// 获取目标账号的相关角色信息
func (r *Arearole) GetAreaRolesByUserID(UserID int) ([]Arearole, error) {
	areaRoles := make([]Arearole, 0)

	if err := db.GetEngine().Where("USERID = ?", UserID).Find(&areaRoles); err != nil {
		return nil, err
	}

	return areaRoles, nil
}

// 获取目标账号的相关角色信息
func (r *Arearole) GetAreaRoles(UserID int) ([]Arearole, error) {
	areaRoles := make([]Arearole, 0)

	if err := db.GetEngine().Where("ROLETYPE = 20 and USERID = ?", UserID).Find(&areaRoles); err != nil {
		return nil, err
	}

	return areaRoles, nil
}

// Taaccountlog 资金账户记账流水表 - 导历史
type Taaccountlog struct {
	Autoid           int64     `json:"autoid"  xorm:"'AUTOID'" binding:"required"`                     // 流水ID(220+Unix秒时间戳(10位)+xxxxxx)
	Accountid        int64     `json:"accountid"  xorm:"'ACCOUNTID'" binding:"required"`               // 资金账户ID
	Relationorderid  string    `json:"relationorderid"  xorm:"'RELATIONORDERID'"`                      // 关联单号
	Marketid         int32     `json:"marketid"  xorm:"'MARKETID'"`                                    // 市场ID
	Goodsid          int32     `json:"goodsid"  xorm:"'GOODSID'"`                                      // 商品ID
	Currencyid       int64     `json:"currencyid"  xorm:"'CURRENCYID'"`                                // 币种ID
	Amount           float64   `json:"amount"  xorm:"'AMOUNT'" binding:"required"`                     // 资金金额
	Amountadjusttype int32     `json:"amountadjusttype"  xorm:"'AMOUNTADJUSTTYPE'" binding:"required"` // 资金调整类型(默认值为0) -  0：系统 1:单边账调整  2:人工调整
	Balance          float64   `json:"balance"  xorm:"'BALANCE'" binding:"required"`                   // 期初余额
	Currentbalance   float64   `json:"currentbalance"  xorm:"'CURRENTBALANCE'" binding:"required"`     // 期末余额(变动后金额)
	Createtime       time.Time `json:"createtime"  xorm:"'CREATETIME'" binding:"required"`             // 发生时间
	Operatetype      int32     `json:"operatetype"  xorm:"'OPERATETYPE'" binding:"required"`           // 资金操作类型 (AccountFundCmdOp)- 101:入金 102:入金手续费 103:出金 104:出金冻结 105:出金解冻 106:出金手续费 107:出金手续费冻结 108:出金手续费解冻 201:交易冻结 202:交易解冻 203:交易占用 204:交易解占用 205:交易手续费冻结 206:交易手续费解冻 207:交易手续费 208:交易货款 209:交易盈亏 301:交割冻结 302:交割解冻 303:交割手续费 304:交割手续费冻结 305:交割手续费解冻 306:交割货款 307:交割税款 401:结算盈亏 402:结算递延费 403:分润收入 404:延期分润 501:授信增加 502:授信减少 503:转积分 504:转入 505:转出 506:转出冻结 507:转出解冻  601:履约金额冻结 602:履约最大冻结 603:履约金额解冻 604:履约扣款 605:履约收款 606:履约违约手续费 607:履约违约收入 608:履约最大扣款 701:供应链金融冻结 702:供应链金融解冻 703:供应链金融最大冻结 704:供应链金融利息 705:供应链金融货款 706:供应链金融押金 707:供应链金融最大扣款 801:仓单贸易冻结 802:仓单贸易解冻 803:仓单贸易首付款 804:仓单贸易最大扣款 901:商城扣款冻结 902:商城扣款解冻 903:商城扣款 904:商城收款 1001:期权冻结 1002:期权解冻 1003:期权权力金 1004:期权手续费冻结 1005:期权手续费解冻 1006:期权手续费 1007:期权盈亏 1101:营销扣款 1102:营销收款
	Moneyticket      int64     `json:"moneyticket"  xorm:"'MONEYTICKET'"`                              // 资金流水号：银行端流水号
	Remark           string    `json:"remark"  xorm:"'REMARK'"`                                        // 备注
	Businesscode     int32     `json:"businesscode"  xorm:"'BUSINESSCODE'"`                            // 业务编号
}

// TableName is TAACCOUNTLOG
func (Taaccountlog) TableName() string {
	return "TAACCOUNTLOG"
}

// Histaaccountlog 历史资金账户记账流水表
type Histaaccountlog struct {
	Autoid           int64     `json:"autoid"  xorm:"'AUTOID'" binding:"required"`                     // 流水ID(220+Unix秒时间戳(10位)+xxxxxx)
	Accountid        int64     `json:"accountid"  xorm:"'ACCOUNTID'" binding:"required"`               // 资金账户ID
	Relationorderid  string    `json:"relationorderid"  xorm:"'RELATIONORDERID'"`                      // 关联单号
	Marketid         int32     `json:"marketid"  xorm:"'MARKETID'"`                                    // 市场ID
	Goodsid          int32     `json:"goodsid"  xorm:"'GOODSID'"`                                      // 商品ID
	Currencyid       int64     `json:"currencyid"  xorm:"'CURRENCYID'"`                                // 币种ID
	Amount           float64   `json:"amount"  xorm:"'AMOUNT'" binding:"required"`                     // 资金金额
	Amountadjusttype int32     `json:"amountadjusttype"  xorm:"'AMOUNTADJUSTTYPE'" binding:"required"` // 资金调整类型(默认值为0) -  0：系统 1:单边账调整  2:人工调整
	Balance          float64   `json:"balance"  xorm:"'BALANCE'" binding:"required"`                   // 期初余额
	Currentbalance   float64   `json:"currentbalance"  xorm:"'CURRENTBALANCE'" binding:"required"`     // 期末余额(变动后金额)
	Createtime       time.Time `json:"createtime"  xorm:"'CREATETIME'" binding:"required"`             // 发生时间
	Operatetype      int32     `json:"operatetype"  xorm:"'OPERATETYPE'" binding:"required"`           // 资金操作类型 (AccountFundCmdOp)- 101:入金 102:入金手续费 103:出金 104:出金冻结 105:出金解冻 106:出金手续费 107:出金手续费冻结 108:出金手续费解冻 201:交易冻结 202:交易解冻 203:交易占用 204:交易解占用 205:交易手续费冻结 206:交易手续费解冻 207:交易手续费 208:交易货款 209:交易盈亏 301:交割冻结 302:交割解冻 303:交割手续费 304:交割手续费冻结 305:交割手续费解冻 306:交割货款 307:交割税款 401:结算盈亏 402:结算递延费 403:分润收入 404:延期分润 501:授信增加 502:授信减少 503:转积分 504:转入 505:转出 506:转出冻结 507:转出解冻  601:履约金额冻结 602:履约最大冻结 603:履约金额解冻 604:履约扣款 605:履约收款 606:履约违约手续费 607:履约违约收入 608:履约最大扣款 701:供应链金融冻结 702:供应链金融解冻 703:供应链金融最大冻结 704:供应链金融利息 705:供应链金融货款 706:供应链金融押金 707:供应链金融最大扣款 801:仓单贸易冻结 802:仓单贸易解冻 803:仓单贸易首付款 804:仓单贸易最大扣款 901:商城扣款冻结 902:商城扣款解冻 903:商城扣款 904:商城收款 1001:期权冻结 1002:期权解冻 1003:期权权力金 1004:期权手续费冻结 1005:期权手续费解冻 1006:期权手续费 1007:期权盈亏 1101:营销扣款 1102:营销收款
	Moneyticket      int64     `json:"moneyticket"  xorm:"'MONEYTICKET'"`                              // 资金流水号：银行端流水号
	Remark           string    `json:"remark"  xorm:"'REMARK'"`                                        // 备注
	Businesscode     int32     `json:"businesscode"  xorm:"'BUSINESSCODE'"`                            // 业务编号
	Histradedate     string    `json:"histradedate"  xorm:"'HISTRADEDATE'" binding:"required"`         // 历史交易日
	Isvaliddata      int32     `json:"isvaliddata"  xorm:"'ISVALIDDATA'"`                              // 是否有效 - 0:无效 1:有效
}

// TableName is HIS_TAACCOUNTLOG
func (Histaaccountlog) TableName() string {
	return "HIS_TAACCOUNTLOG"
}

// Userfavoritegoods 用户商品收藏表
type Userfavoritegoods struct {
	Userid     int64     `json:"-"  xorm:"'USERID'" binding:"required"`        // 用户
	Goodsid    int64     `json:"goodsid"  xorm:"'GOODSID'" binding:"required"` // 商品ID
	Marketid   int32     `json:"-"  xorm:"'MARKETID'"`                         // 市场ID
	Modifytime time.Time `json:"-"  xorm:"'MODIFYTIME'"`                       // 修改时间
}

// TableName is USERFAVORITEGOODS
func (Userfavoritegoods) TableName() string {
	return "USERFAVORITEGOODS"
}

// Messageboard 留言簿表
type Messageboard struct {
	Messageboardid int64     `json:"messageboardid"  xorm:"'MESSAGEBOARDID'" binding:"required"` // 留言簿ID(SEQ_MessageBoard)
	Userid         int64     `json:"userid"  xorm:"'USERID'"`                                    // 用户ID
	Message        string    `json:"message"  xorm:"'MESSAGE'"`                                  // 留言信息
	Createtime     time.Time `json:"createtime"  xorm:"'CREATETIME'"`                            // 创建时间
	Contactnum     string    `json:"contactnum"  xorm:"'CONTACTNUM'"`                            // 联系电话
}

// TableName is MESSAGEBOARD
func (Messageboard) TableName() string {
	return "MESSAGEBOARD"
}

// Wskhuserinfo 网上开户用户表 (开户成功删除记录)
type Wskhuserinfo struct {
	Userid                   int64     `json:"userid"  xorm:"USERID" binding:"required"`                  // 用户ID(自增ID)SEQ_WSKH_USERINFO
	Username                 string    `json:"username"  xorm:"USERNAME"`                                 // 用户姓名
	Sex                      int32     `json:"sex"  xorm:"SEX"`                                           // 性别 - 0:女 1:男
	Cardtype                 int32     `json:"cardtype"  xorm:"CARDTYPE"`                                 // 证件类型
	Cardnum                  string    `json:"cardnum"  xorm:"CARDNUM"`                                   // 证件号码 (加密存储)
	Cardaddress              string    `json:"cardaddress"  xorm:"CARDADDRESS"`                           // 证件地址 (加密存储)
	Mobilephone              string    `json:"mobilephone"  xorm:"MOBILEPHONE"`                           // 手机号码 (加密存储)
	Wechat                   string    `json:"wechat"  xorm:"WECHAT"`                                     // 微信号   (加密存储)
	Email                    string    `json:"email"  xorm:"EMAIL"`                                       // Email地址(加密存储)
	Ipaddress                string    `json:"ipaddress"  xorm:"IPADDRESS"`                               // IP地址
	Halfbodyphotourl         string    `json:"halfbodyphotourl"  xorm:"HALFBODYPHOTOURL"`                 // 半身照地址
	Cardfrontphotourl        string    `json:"cardfrontphotourl"  xorm:"CARDFRONTPHOTOURL"`               // 正面证件照地址
	Cardbackphotourl         string    `json:"cardbackphotourl"  xorm:"CARDBACKPHOTOURL"`                 // 背面证件照地址
	Bankid                   string    `json:"bankid"  xorm:"BANKID"`                                     // 银行编码
	Bankname                 string    `json:"bankname"  xorm:"BANKNAME"`                                 // 银行名称
	Bankaccount              string    `json:"bankaccount"  xorm:"BANKACCOUNT"`                           // 银行帐号 (加密存储)
	Bankcardfrontphotourl    string    `json:"bankcardfrontphotourl"  xorm:"BANKCARDFRONTPHOTOURL"`       // 银行卡正面照地址
	Bankcardbackphotourl     string    `json:"bankcardbackphotourl"  xorm:"BANKCARDBACKPHOTOURL"`         // 银行卡背面照地址
	Areacode                 string    `json:"areacode"  xorm:"AREACODE"`                                 // 机构代码
	Areaid                   int64     `json:"areaid"  xorm:"AREAID"`                                     // 机构Id
	Memberareaid             int64     `json:"memberareaid"  xorm:"MEMBERAREAID"`                         // 所属会员ID
	Brokerid                 string    `json:"brokerid"  xorm:"BROKERID"`                                 // 经纪人ID(加密存储)
	Accountid                int64     `json:"accountid"  xorm:"ACCOUNTID"`                               // 交易系统帐号Id (加密存储)
	Logincode                string    `json:"logincode"  xorm:"LOGINCODE"`                               // 登录帐号 (加密存储)
	Openmode                 int32     `json:"openmode"  xorm:"OPENMODE"`                                 // 开户方式 -  1:管理端开户 2:网上开户注册(会员官网-手机号) 3:微信开户 4:网页交易端注册 5:安卓手机端注册 6:苹果手机端注册 7:PC交易端注册 8:微信快速开户 9:支付宝快速开户 10:手机号快速开户 11:网上开户注册(会员官网-微信认证) 12:网上开户注册(会员官网-支付宝认证)
	Userstate                int32     `json:"userstate"  xorm:"USERSTATE"`                               // 开户状态 -   1:未提交 2: 待初审 3:初审拒绝 4:待复审 5:复审拒绝 6:测评不通过
	Remark                   string    `json:"remark"  xorm:"REMARK"`                                     // 备注
	Isvalidate               string    `json:"isvalidate"  xorm:"ISVALIDATE"`                             // 是否有效 (删除后标记为失效) - 0:无效  1:有效
	Createtime               time.Time `json:"createtime"  xorm:"CREATETIME"`                             // 开户申请时间
	Modifiedtime             time.Time `json:"modifiedtime"  xorm:"MODIFIEDTIME"`                         // 修改时间
	Modifiedby               int64     `json:"modifiedby"  xorm:"MODIFIEDBY"`                             // 修改人帐号
	Removebeforestatus       int32     `json:"removebeforestatus"  xorm:"REMOVEBEFORESTATUS"`             // REMOVEBEFORESTATUS
	Cusbankid                string    `json:"cusbankid"  xorm:"CUSBANKID"`                               // 签约类型
	Cusbankname              string    `json:"cusbankname"  xorm:"CUSBANKNAME"`                           // 签约类型名称
	Signpdfurl               string    `json:"signpdfurl"  xorm:"SIGNPDFURL"`                             // 签约pdf文件
	Referral                 string    `json:"referral"  xorm:"REFERRAL"`                                 // 推荐人编码
	Subbranch                string    `json:"subbranch"  xorm:"SUBBRANCH"`                               // 开户支行
	Bankpictureurl           string    `json:"bankpictureurl"  xorm:"BANKPICTUREURL"`                     // 银行卡正面地址
	Auditime                 time.Time `json:"auditime"  xorm:"AUDITIME"`                                 // 审核时间
	Auditedby                time.Time `json:"auditedby"  xorm:"AUDITEDBY"`                               // 审核人
	Videourl                 string    `json:"videourl"  xorm:"VIDEOURL"`                                 // 视频地址
	Signedstatus             int32     `json:"signedstatus"  xorm:"SIGNEDSTATUS"`                         // 账户一号签签约状态
	Userinfotype             int32     `json:"userinfotype"  xorm:"USERINFOTYPE"`                         // 用户信息类型 - 1:个人  2:企业
	Customername             string    `json:"customername"  xorm:"CUSTOMERNAME"`                         // 客户名称(企业名称)
	Biznature                int32     `json:"biznature"  xorm:"BIZNATURE"`                               // 企业性质( 企业) - 1:国有控股企业 2:集体控股企业 3:私人控股企业 4:港澳台商控股企业 5:外商控股企业 6:其它
	Bizscope                 string    `json:"bizscope"  xorm:"BIZSCOPE"`                                 // 企业经营范围(企业)
	Legalpersonname          string    `json:"legalpersonname"  xorm:"LEGALPERSONNAME"`                   // 法人姓名(企业)
	Contactname              string    `json:"contactname"  xorm:"CONTACTNAME"`                           // 联系人
	Countryid                int32     `json:"countryid"  xorm:"COUNTRYID"`                               // 国家
	Provinceid               int32     `json:"provinceid"  xorm:"PROVINCEID"`                             // 省
	Cityid                   int32     `json:"cityid"  xorm:"CITYID"`                                     // 市
	Districtid               int32     `json:"districtid"  xorm:"DISTRICTID"`                             // 地区
	Postalcode               string    `json:"postalcode"  xorm:"POSTALCODE"`                             // 邮政编码
	Company                  string    `json:"company"  xorm:"COMPANY"`                                   // 公司(个人)
	Legalcardfrontphotourl   string    `json:"legalcardfrontphotourl"  xorm:"LEGALCARDFRONTPHOTOURL"`     // 法人身份证正面照地址
	Legalcardbackphotourl    string    `json:"legalcardbackphotourl"  xorm:"LEGALCARDBACKPHOTOURL"`       // 法人身份证背面照地址
	Otherurl                 string    `json:"otherurl"  xorm:"OTHERURL"`                                 // 其它图片地址[使用分号分隔]
	Usertype                 int32     `json:"usertype"  xorm:"USERTYPE"`                                 // 用户类型 - 1:投资者 2:机构
	Qq                       string    `json:"qq"  xorm:"QQ"`                                             // QQ(加密存储
	Telphone                 string    `json:"telphone"  xorm:"TELPHONE"`                                 // 联系电话(加密存储)
	Attachment1              string    `json:"attachment1"  xorm:"ATTACHMENT1"`                           // 附件1
	Attachment2              string    `json:"attachment2"  xorm:"ATTACHMENT2"`                           // 附件2
	Bankaccountname          string    `json:"bankaccountname"  xorm:"BANKACCOUNTNAME"`                   // 收款人名称
	Nickname                 string    `json:"nickname"  xorm:"NICKNAME"`                                 // 昵称：默认为手机号脱敏(139****9999) 或 名称脱敏(张**)
	Headurl                  string    `json:"headurl"  xorm:"HEADURL"`                                   // 头像地址
	Mobile2                  string    `json:"mobile2"  xorm:"MOBILE2"`                                   // 手机号码[明文-尚志]
	Biztype                  int32     `json:"biztype"  xorm:"BIZTYPE"`                                   // 企业类型 - 1:进口/生产 2:销售 3:零售 4:运输 5:仓储
	Proxystatementurl        string    `json:"proxystatementurl"  xorm:"PROXYSTATEMENTURL"`               // 授权委托书
	Contactcardfrontphotourl string    `json:"contactcardfrontphotourl"  xorm:"CONTACTCARDFRONTPHOTOURL"` // 联系人证件正面图片地址
	Contactcardbackphotourl  string    `json:"contactcardbackphotourl"  xorm:"CONTACTCARDBACKPHOTOURL"`   // 联系人证件背面图片地址
	Attachment3              string    `json:"attachment3"  xorm:"ATTACHMENT3"`                           // 附件3
	Attachment4              string    `json:"attachment4"  xorm:"ATTACHMENT4"`                           // 附件4
	Attachment5              string    `json:"attachment5"  xorm:"ATTACHMENT5"`                           // 附件5
	Auditsrc                 int32     `json:"auditsrc"  xorm:"AUDITSRC"`                                 // 审核来源 - 1:管理端 2:终端
	Taxpayernum              string    `json:"taxpayernum"  xorm:"TAXPAYERNUM"`                           // 纳税人识别号
}

// TableName is WSKH_USERINFO
func (Wskhuserinfo) TableName() string {
	return "WSKH_USERINFO"
}

// Systemmanager 系统管理员表
type Systemmanager struct {
	Autoid        int32     `json:"autoid"  xorm:"'AUTOID'" binding:"required"` // 自增ID
	Reletype      int32     `json:"reletype"  xorm:"'RELETYPE'"`                // 用户类型 - 1- 交易所管理员   2- 机构管理员 3-子机构管理员
	Logincode     string    `json:"logincode"  xorm:"'LOGINCODE'"`              // 用户登录账号,唯一索引
	Username      string    `json:"username"  xorm:"'USERNAME'"`                // 用户姓名
	Password      string    `json:"password"  xorm:"'PASSWORD'"`                // 加密方式采用 用户名+密码  ,采用 SHA 算法
	Areauserid    int64     `json:"areauserid"  xorm:"'AREAUSERID'"`            // 所属机构ID
	Pwdexpdate    time.Time `json:"pwdexpdate"  xorm:"'PWDEXPDATE'"`            // 密码失效日期
	Managerstatus int32     `json:"managerstatus"  xorm:"'MANAGERSTATUS'"`      // 用户状态： 1启用  2停用  3锁定(密码错误时锁定)
	Loginstatus   int32     `json:"loginstatus"  xorm:"'LOGINSTATUS'"`          // 登录状态:1未登录 2已登录
	Isdefault     int32     `json:"isdefault"  xorm:"'ISDEFAULT'"`              // 是否默认管理员 - 0:不是默认 1:默认管理员
	Logintime     time.Time `json:"logintime"  xorm:"'LOGINTIME'"`              // 登录时间
	Loginip       string    `json:"loginip"  xorm:"'LOGINIP'"`                  // 登录IP
	Loginport     int64     `json:"loginport"  xorm:"'LOGINPORT'"`              // 登录端口
	Loginfailnum  int64     `json:"loginfailnum"  xorm:"'LOGINFAILNUM'"`        // 登录失败次数
	Uploginid     int64     `json:"uploginid"  xorm:"'UPLOGINID'"`              // 修改人ID
	Modifytime    time.Time `json:"modifytime"  xorm:"'MODIFYTIME'"`            // 修改时间
	Remark        string    `json:"remark"  xorm:"'REMARK'"`                    // 备注
	Onymac        int32     `json:"onymac"  xorm:"'ONYMAC'"`                    // 是否启用MAC地址 - 0:否 1:是
	Managertype   int32     `json:"managertype"  xorm:"'MANAGERTYPE'"`          // 账号类型 - 1:管理员 2:交易员
}

// TableName is SYSTEMMANAGER
func (Systemmanager) TableName() string {
	return "SYSTEMMANAGER"
}

// GetLoginAccount 获取登录账户信息
func GetLoginAccount(loginID int) (*Loginaccount, error) {
	var loginaccount Loginaccount
	// var loginaccount Loginaccount
	has, err := db.GetEngine().Where("LOGINID = ?", loginID).Get(&loginaccount)
	if err != nil {
		return nil, err
	}
	if !has {
		return nil, nil
	}

	return &loginaccount, nil
}

// GetLoginAccountByLoginCode 通过登录代码查询登录账号信息
func GetLoginAccountByLoginCode(loginCode string) (*Loginaccount, error) {
	engine := db.GetEngine()

	// 如果要使用 *Loginaccount, 则应初始化后再使用
	var loginaccount *Loginaccount
	loginaccount = &Loginaccount{}
	// var loginaccount Loginaccount
	has, err := engine.Where("LOGINCODE = ?", loginCode).Get(loginaccount)
	if err != nil {
		return nil, err
	}

	if has {
		return loginaccount, nil
	}

	return nil, nil
}

// GetLoginAccountByMobile 通过手机号码查询登录账号信息
func GetLoginAccountByMobile(mobile string) (*Loginaccount, error) {
	engine := db.GetEngine()

	var loginaccount Loginaccount
	var has bool
	// 手机号码需要AES加密
	key, _ := hex.DecodeString(utils.AESSecretKey)
	if mobileEncrypted, err := utils.AESEncrypt([]byte(mobile), key); err == nil {
		// 加密成功后进行查询
		has, err = engine.Join("INNER", "USERINFO", "USERINFO.USERID = LOGINACCOUNT.USERID").
			Where("USERINFO.MOBILE = ?", hex.EncodeToString(mobileEncrypted)).Get(&loginaccount)
		if err != nil {
			return nil, err
		}
	}

	if has {
		return &loginaccount, nil
	}

	return nil, nil
}

// GetUserAccount 获取用户账户信息
func GetUserAccount(userID int) (*Useraccount, error) {
	engine := db.GetEngine()
	var userAccount Useraccount

	has, err := engine.Where("USERID = ?", userID).Get(&userAccount)
	if err != nil {
		// 查询失败
		return nil, err
	}
	if !has {
		return nil, nil
	}

	return &userAccount, nil
}

// GetUserInfo 获取用户信息
func GetUserInfo(userID int) (*Userinfo, error) {
	engine := db.GetEngine()

	var userInfo Userinfo
	_, err := engine.Where("USERID = ?", userID).Get(&userInfo)
	if err != nil {
		// 查询失败
		return nil, err
	}

	return &userInfo, nil
}

// GetUserInfoByLoginID 通过登录账号获取用户信息的方法
func GetUserInfoByLoginID(loginID int) (*Userinfo, error) {
	engine := db.GetEngine()

	var userInfo Userinfo
	_, err := engine.Table("USERINFO U").Join("INNER", "LOGINACCOUNT L", "L.USERID = U.USERID").Where("L.LOGINID = ?", loginID).Get(&userInfo)
	if err != nil {
		// 查询失败
		return nil, err
	}

	return &userInfo, nil
}

// GetUserInfoByIDS 批量获取用户信息.
func GetUserInfoByIDS(userids []int64) ([]Userinfo, error) {
	engine := db.GetEngine()
	infos := make([]Userinfo, 0)
	err := engine.In("USERID", userids).Find(&infos)
	return infos, err
}

// GetUserAccountByAccountID 通过资金账户获取账户信息
func GetUserAccountByAccountID(accountID int) (*Useraccount, error) {
	engine := db.GetEngine()
	infos := make([]Useraccount, 0)
	if err := engine.Table("USERACCOUNT U").
		Join("INNER", "TAACCOUNT TA", "TA.RELATEDUSERID = U.USERID").
		Where("TA.ACCOUNTID = ?", accountID).Find(&infos); err != nil {
		return nil, err
	}
	if len(infos) > 0 {
		return &infos[0], nil
	}

	return nil, nil
}

// GetUserInfoByAccountID 通过资金账户获取用户信息
func GetUserInfoByAccountID(accountID int) (*Userinfo, error) {
	engine := db.GetEngine()
	infos := make([]Userinfo, 0)
	if err := engine.Table("USERINFO U").
		Join("INNER", "TAACCOUNT TA", "TA.RELATEDUSERID = U.USERID").
		Where("TA.ACCOUNTID = ?", accountID).Find(&infos); err != nil {
		return nil, err
	}
	if len(infos) > 0 {
		return &infos[0], nil
	}

	return nil, nil
}

// GetUserFavoriteGoodses 获取用户商品收藏信息
func GetUserFavoriteGoodses(userID int) ([]Userfavoritegoods, error) {
	engine := db.GetEngine()

	favoriteGoodses := make([]Userfavoritegoods, 0)
	if err := engine.Where("USERID = ?", userID).Find(&favoriteGoodses); err != nil {
		return nil, err
	}

	return favoriteGoodses, nil
}

// InsertUserFavoriteGoods 新增用户商品收藏信息
func InsertUserFavoriteGoods(userID int, goodsID int) error {
	engine := db.GetEngine()

	userfavoritegoods := &Userfavoritegoods{
		Userid:  int64(userID),
		Goodsid: int64(goodsID),
	}
	has, err := engine.Get(userfavoritegoods)
	if err != nil {
		return err
	}
	if !has {
		// 不存在时则插入一条新记录
		// userfavoritegoods.Modifytime = time.Now()
		if _, err := engine.Insert(userfavoritegoods); err != nil {
			return err
		}
	}

	return nil
}

// DelUserFavoriteGoods 删除用户商品收藏信息
func DelUserFavoriteGoods(userID int, goodsID int) error {
	engine := db.GetEngine()

	userfavoritegoods := &Userfavoritegoods{
		Userid:  int64(userID),
		Goodsid: int64(goodsID),
	}
	if _, err := engine.Delete(userfavoritegoods); err != nil {
		return err
	}

	return nil
}

// GetMessageBoard 获取用户留言板信息
func GetMessageBoard(userID int) ([]Messageboard, error) {
	engine := db.GetEngine()

	messageBoards := make([]Messageboard, 0)
	if err := engine.Where("USERID = ?", userID).Desc("CREATETIME").Find(&messageBoards); err != nil {
		return nil, err
	}

	return messageBoards, nil
}

// InsertMessageBoard 新增用户留言板信息
func InsertMessageBoard(userID int, message, contactNum string) int {
	engine := db.GetEngine()

	// 一天最多只能新增3条留言
	messageBoard := new(Messageboard)
	total, err := engine.Where("USERID = ? and (CREATETIME >=TRUNC(SYSDATE) and CREATETIME < TRUNC(SYSDATE)+1)", userID).Count(messageBoard)
	if err != nil {
		return e.ERROR_OPERATION_FAILED
	}
	if total >= 3 {
		return e.ERROR_ADD_MAX_3
	}

	// 由于XORM对ORACLE支持不行，有时间字段更新的直接使用SQL语句执行
	sql := fmt.Sprintf("insert into MESSAGEBOARD (MESSAGEBOARDID, USERID, MESSAGE, CONTACTNUM ,CREATETIME) values (SEQ_MessageBoard.nextval, %d, '%s', '%s', (select sysdate from dual))", userID, message, contactNum)
	if _, err := engine.Exec(sql); err != nil {
		return e.ERROR_OPERATION_FAILED
	}

	return 0
}

// GetUsersByUserType 获取批量指定类型的用户信息
// 输入 userType int 账户类型 -  1:交易所 2:机构 3:会员子机构 4:经纪人 5:投资者 6:客户
func GetUsersByUserType(userType int) ([]Userinfo, error) {
	engine := db.GetEngine()

	userInfos := make([]Userinfo, 0)
	if err := engine.Where("USERTYPE = ?", userType).Find(&userInfos); err != nil {
		return nil, err
	}

	return userInfos, nil
}

// GetTaAccountsByType 获取指定用户的资金账户列表
// 输入 userID int 关联用户ID
// 输入 taAccountType int 账号类型 - 1:外部账号 2:内部账号 3:内部做市自营账号 4:内部做市接单账号
func GetTaAccountsByType(userID, taAccountType int) ([]Taaccount, error) {
	engine := db.GetEngine()

	taAccounts := make([]Taaccount, 0)

	session := engine.Where("TRADESTATUS <> 7 and RELATEDUSERID = ?", userID)
	if taAccountType != 0 {
		session = session.And("TAACCOUNTTYPE = ?", taAccountType)
	}
	if err := session.Find(&taAccounts); err != nil {
		return nil, err
	}

	return taAccounts, nil
}

// GetTaAccountsByLoginID 通过登录账号获取对应资金账户列表的方法，一般用于获取自己的资金账号时使用
// 输入 loginID int 登录账号
// 输入 taAccountType int 账号类型 - 1:外部账号 2:内部账号 3:内部做市自营账号 4:内部做市接单账号
func GetTaAccountsByLoginID(loginID, taAccountType int) ([]Taaccount, error) {
	engine := db.GetEngine()

	taAccounts := make([]Taaccount, 0)

	// 注意：获取自身的资金账号列表，先要从LoginTAAccount表中判断是否有关联关系，如没配置关系则直接从TaAccount表中获取
	loginTaAccounts := make([]Logintaaccount, 0)
	if err := engine.Where("LOGINID = ?", loginID).Find(&loginTaAccounts); err != nil {
		return nil, err
	}
	if len(loginTaAccounts) > 0 {
		// 获取资金账号ID列表
		accountIDs := ""
		for _, v := range loginTaAccounts {
			if len(accountIDs) == 0 {
				accountIDs = strconv.Itoa(int(v.Accountid))
			} else {
				accountIDs += "," + strconv.Itoa(int(v.Accountid))
			}
		}
		// 获取资金账号列表
		session := engine.Where(fmt.Sprintf("TRADESTATUS <> 7 and ACCOUNTID in (%s)", accountIDs))
		if taAccountType != 0 {
			session = session.And("TAACCOUNTTYPE = ?", taAccountType)
		}
		if err := session.Find(&taAccounts); err != nil {
			return nil, err
		}
	} else {
		// 获取登录账户信息
		loginAccount, err := GetLoginAccount(loginID)
		if err != nil {
			return nil, err
		}
		if loginAccount == nil {
			return make([]Taaccount, 0), nil
		}
		// 资金账号权限类型 - 1:不选默认为所有权限 2:不选默认为无权限
		if loginAccount.Taaccountrighttype == 2 {
			return make([]Taaccount, 0), nil
		}

		// 直接从TaAccount表中获取
		session := engine.Table("TAACCOUNT").
			Join("INNER", "LOGINACCOUNT L", "L.USERID = TAACCOUNT.RELATEDUSERID and TAACCOUNT.TRADESTATUS <> 7").
			Where("L.LOGINID = ?", loginID)
		if taAccountType != 0 {
			session = session.And("TAACCOUNT.TAACCOUNTTYPE = ?", taAccountType)
		}
		if err := session.Find(&taAccounts); err != nil {
			return nil, err
		}
	}

	return taAccounts, nil
}

// GetTaAccountByID 通过AccountID获取资金账户信息
func GetTaAccountByID(accountID int) (*Taaccount, error) {
	engine := db.GetEngine()

	var taaccount Taaccount
	has, err := engine.Where("TRADESTATUS <> 7 and ACCOUNTID = ?", accountID).Get(&taaccount)
	if err != nil {
		return nil, err
	}
	if !has {
		return nil, nil
	}

	return &taaccount, nil
}

// InsertWSKHUserInfo 新增网上开户账户信息（客户资料申请）
func InsertWSKHUserInfo(userinfo Wskhuserinfo) error {
	engine := db.GetEngine()

	// 加密数据
	key, _ := hex.DecodeString(utils.AESSecretKey)
	// 证件号码
	if len(userinfo.Cardnum) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Cardnum), key); err == nil {
			userinfo.Cardnum = hex.EncodeToString(encrypted)
		}
	}
	// 证件地址
	if len(userinfo.Cardaddress) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Cardaddress), key); err == nil {
			userinfo.Cardaddress = hex.EncodeToString(encrypted)
		}
	}
	// 手机
	if len(userinfo.Mobilephone) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Mobilephone), key); err == nil {
			userinfo.Mobilephone = hex.EncodeToString(encrypted)
		}
	}
	// 微信
	if len(userinfo.Wechat) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Wechat), key); err == nil {
			userinfo.Wechat = hex.EncodeToString(encrypted)
		}
	}
	// 邮件
	if len(userinfo.Email) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Email), key); err == nil {
			userinfo.Email = hex.EncodeToString(encrypted)
		}
	}
	// 银行帐号
	if len(userinfo.Bankaccount) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Bankaccount), key); err == nil {
			userinfo.Bankaccount = hex.EncodeToString(encrypted)
		}
	}
	// 经纪人ID
	if len(userinfo.Brokerid) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Brokerid), key); err == nil {
			userinfo.Brokerid = hex.EncodeToString(encrypted)
		}
	}
	// 登录帐号
	if len(userinfo.Logincode) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Logincode), key); err == nil {
			userinfo.Logincode = hex.EncodeToString(encrypted)
		}
	}

	// 自增ID
	seqMap, err := engine.QueryString("SELECT SEQ_WSKH_USERINFO.nextval USERID FROM dual")
	if err != nil {
		return err
	}
	if len(seqMap) <= 0 {
		return errors.New("获取自增ID错误")
	}
	userID, _ := strconv.Atoi(seqMap[0]["USERID"])
	userinfo.Userid = int64(userID)

	// 插入数据
	if _, err = engine.Insert(&userinfo); err != nil {
		return err
	}

	return nil
}

// UpdateWSKHUserInfo 修改网上开户账户信息（客户资料申请）
func UpdateWSKHUserInfo(userinfo Wskhuserinfo) error {
	engine := db.GetEngine()

	// 加密数据
	key, _ := hex.DecodeString(utils.AESSecretKey)
	// 证件号码
	if len(userinfo.Cardnum) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Cardnum), key); err == nil {
			userinfo.Cardnum = hex.EncodeToString(encrypted)
		}
	}
	// 证件地址
	if len(userinfo.Cardaddress) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Cardaddress), key); err == nil {
			userinfo.Cardaddress = hex.EncodeToString(encrypted)
		}
	}
	// 手机
	if len(userinfo.Mobilephone) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Mobilephone), key); err == nil {
			userinfo.Mobilephone = hex.EncodeToString(encrypted)
		}
	}
	// 微信
	if len(userinfo.Wechat) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Wechat), key); err == nil {
			userinfo.Wechat = hex.EncodeToString(encrypted)
		}
	}
	// 邮件
	if len(userinfo.Email) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Email), key); err == nil {
			userinfo.Email = hex.EncodeToString(encrypted)
		}
	}
	// 银行帐号
	if len(userinfo.Bankaccount) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Bankaccount), key); err == nil {
			userinfo.Bankaccount = hex.EncodeToString(encrypted)
		}
	}
	// 经纪人ID
	if len(userinfo.Brokerid) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Brokerid), key); err == nil {
			userinfo.Brokerid = hex.EncodeToString(encrypted)
		}
	}
	// 登录帐号
	if len(userinfo.Logincode) > 0 {
		if encrypted, err := utils.AESEncrypt([]byte(userinfo.Logincode), key); err == nil {
			userinfo.Logincode = hex.EncodeToString(encrypted)
		}
	}

	// 修改数据
	// 由于表的主键未定义成ID，所以这里需要用where来过滤
	userID := userinfo.Userid
	userinfo.Userid = 0
	// m := make(map[string]interface{})
	// j, _ := json.Marshal(userinfo)
	// json.Unmarshal(j, &m)
	// delete(m, "USERID")
	if _, err := engine.Where("USERID = ?", userID).Update(&userinfo); err != nil {
		return err
	}

	return nil
}

// DeleteWSKHUserInfo 删除网上开户账户信息（客户资料申请）
func DeleteWSKHUserInfo(userID int) error {
	if userID == 0 {
		return errors.New("userID为0")
	}
	sql := fmt.Sprintf("DELETE FROM WSKH_USERINFO WHERE USERSTATE = 1 AND USERID = %d", userID)
	if _, err := db.GetEngine().Exec(sql); err != nil {
		return err
	}

	return nil
}

// GetWSKHUserInfos 获取开户信息列表
func GetWSKHUserInfos(userName string) ([]Wskhuserinfo, error) {
	engine := db.GetEngine()

	userInfos := make([]Wskhuserinfo, 0)
	session := engine.Table("WSKH_USERINFO")
	if len(userName) > 0 {
		session = session.Where(fmt.Sprintf("USERNAME like '%%%s%%'", userName))
	}
	if err := session.Find(&userInfos); err != nil {
		return nil, err
	}

	return userInfos, nil
}

// GetUserInfos 获取用户信息
// 输入 userName string 客户名称，支持模糊查询
func GetUserInfos(userName string) ([]Userinfo, error) {
	engine := db.GetEngine()

	userInfos := make([]Userinfo, 0)
	session := engine.Table("USERINFO")
	if len(userName) > 0 {
		session = session.Where(fmt.Sprintf("CUSTOMERNAME like '%%%s%%'", userName))
	}
	if err := session.Find(&userInfos); err != nil {
		return nil, err
	}

	return userInfos, nil
}

// UpdateUserAccountStatus 更新用户
func UpdateUserAccountStatus(userID, accountStatus int) error {
	engine := db.GetEngine()

	if accountStatus != 4 && accountStatus != 6 {
		return errors.New("错误的状态值")
	}

	// 要同时改UserAccount表和UserInfo表的状态
	useraccount := Useraccount{Accountstatus: int32(accountStatus)}
	if _, err := engine.Table("USERACCOUNT").
		Where("USERID = ?", userID).
		Update(&useraccount); err != nil {
		return err
	}
	// UserInfo表的状态为1-正常；2-注销
	userStatus := 1
	if accountStatus == 6 {
		userStatus = 2
	}
	userinfo := Userinfo{Userstatus: int32(userStatus)}
	if _, err := engine.Table("USERINFO").
		Where("USERID = ?", userID).
		Update(&userinfo); err != nil {
		return err
	}

	return nil
}

// GetSysteMmanagerByLoginCode 通过LoginCode获取管理端账号
func GetSysteMmanagerByLoginCode(loginCode string) (*Systemmanager, error) {
	tmp := make([]Systemmanager, 0)
	if err := db.GetEngine().Where("LOGINCODE = ?", loginCode).Find(&tmp); err != nil {
		return nil, err
	}
	if len(tmp) == 0 {
		return nil, nil
	}

	return &tmp[0], nil
}

// GetHedgeOutTaAccount 母账户资金账户获取对冲外部资金账户信息
func GetHedgeOutTaAccount(accountID int) (*Hedgeouttaaccount, error) {
	var rst Hedgeouttaaccount
	has, err := db.GetEngine().Where("ACCOUNTID = ?", accountID).Get(&rst)
	if err != nil {
		return nil, err
	}
	if !has {
		return nil, nil
	}

	return &rst, nil
}
