taaccount.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. package taaccount
  2. import (
  3. "fmt"
  4. "mtp2_if/controllers/order"
  5. "mtp2_if/db"
  6. "mtp2_if/global/app"
  7. "mtp2_if/global/e"
  8. "mtp2_if/logger"
  9. "mtp2_if/models"
  10. "net/http"
  11. "github.com/gin-gonic/gin"
  12. )
  13. // GetTaAccountsReq 获取资金账户请求参数
  14. type GetTaAccountsReq struct {
  15. LoginID int `form:"loginID" binding:"required"`
  16. TaAccountType int `form:"taAccountType"`
  17. }
  18. // GetTaAccounts 获取资金账户信息
  19. // @Summary 获取资金账户信息
  20. // @Produce json
  21. // @Security ApiKeyAuth
  22. // @Param loginID query int true "登录账户"
  23. // @Param taAccountType query int false "账号类型 - 1:外部账号 2:内部账号 3:内部做市自营账号 4:内部做市接单账号"
  24. // @Success 200 {object} models.Taaccount
  25. // @Failure 500 {object} app.Response
  26. // @Router /TaAccount/GetTaAccounts [get]
  27. // @Tags 资金账户
  28. func GetTaAccounts(c *gin.Context) {
  29. appG := app.Gin{C: c}
  30. // 获取请求参数
  31. var req GetTaAccountsReq
  32. if err := appG.C.ShouldBindQuery(&req); err != nil {
  33. logger.GetLogger().Errorf("GetTaAccounts failed: %s", err.Error())
  34. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  35. return
  36. }
  37. // 查询数据
  38. taAccounts, err := models.GetTaAccountsByLoginID(req.LoginID, req.TaAccountType)
  39. if err != nil {
  40. // 查询失败
  41. logger.GetLogger().Errorf("GetTaAccounts failed: %s", err.Error())
  42. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  43. return
  44. }
  45. // 如果是母账户,要从对冲外部资金账户表获取资金信息
  46. for i := range taAccounts {
  47. item := &taAccounts[i]
  48. if item.Ismain == 1 {
  49. hedgeOutTaAccount, _ := models.GetHedgeOutTaAccount(int(item.Accountid))
  50. if hedgeOutTaAccount != nil {
  51. item.Balance = hedgeOutTaAccount.Prebalance
  52. item.Currentbalance = hedgeOutTaAccount.Balance
  53. item.Usedmargin = hedgeOutTaAccount.Usedmargin
  54. item.Freezemargin = hedgeOutTaAccount.Freezemargin
  55. item.Freezecharge = hedgeOutTaAccount.Freezecharge
  56. item.Otherfreezemargin = hedgeOutTaAccount.Otherfreezemargin
  57. item.Inamount = hedgeOutTaAccount.Inamount
  58. item.Outamount = hedgeOutTaAccount.Outamount
  59. item.Paycharge = hedgeOutTaAccount.Paycharge
  60. item.Closepl = hedgeOutTaAccount.Closepl
  61. }
  62. }
  63. }
  64. if len(taAccounts) > 0 {
  65. // 查融资额
  66. var a models.InStrBuilder
  67. for i := range taAccounts {
  68. a.Add(taAccounts[i].Accountid)
  69. }
  70. mRemainAmount := models.QhjContractRemainAmount{FilterAccId: a.InStr()}
  71. if d, err := mRemainAmount.GetData(); err == nil {
  72. for _, v := range d {
  73. for i := range taAccounts {
  74. if v.ACCOUNTID == taAccounts[i].Accountid {
  75. taAccounts[i].REMAINAMOUNT = v.REMAINACOUNT
  76. }
  77. }
  78. }
  79. }
  80. // 查总市值
  81. if rst, bRet := order.GetTradePosition(a.InStr(), ""); bRet {
  82. for i := range taAccounts {
  83. for _, v := range rst {
  84. if taAccounts[i].Accountid == v.AccountID {
  85. taAccounts[i].CURAMOUNT += v.MarketAmount
  86. }
  87. }
  88. }
  89. }
  90. }
  91. // 查询成功
  92. logger.GetLogger().Debugln("GetTaAccounts successed: %v", taAccounts)
  93. appG.Response(http.StatusOK, e.SUCCESS, taAccounts)
  94. }
  95. // QueryAmountLogReq 资金流水查询(当前)请求参数
  96. type QueryAmountLogReq struct {
  97. app.PageInfo
  98. AccountID string `form:"accountID"` // 资金账户
  99. OperateType string `form:"operateType"` // 资金操作类型
  100. }
  101. // QueryAmountLogRsp 资金流水查询(当前)返回模型
  102. type QueryAmountLogRsp struct {
  103. models.Taaccountlog `xorm:"extends"`
  104. MarketName string `json:"marketname" xorm:"'MARKETNAME'"` // 市场名称
  105. TradeMode uint32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
  106. GoodsCode string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码
  107. GoodsName string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  108. AGoodsCode string `json:"agoodscode" xorm:"'AGOODSCODE'"` // 竞拍商品代码
  109. AGoodsName string `json:"agoodsname" xorm:"'GOODSNAME'"` // 竞拍商品名称
  110. DGoodsCode string `json:"dgoodscode" xorm:"'DGOODSCODE'"` // 交割商品代码
  111. DGoodsName string `json:"dgoodsname" xorm:"'DGOODSNAME'"` // 交割商品名称
  112. OperateTypeName string `json:"-" xorm:"OPERATETYPENAME"` // 资金操作类型名称
  113. }
  114. // QueryAmountLog 资金流水查询(当前)
  115. // @Summary 资金流水查询(当前)
  116. // @Produce json
  117. // @Security ApiKeyAuth
  118. // @Param page query int false "页码"
  119. // @Param pagesize query int false "每页条数"
  120. // @Param accountID query string true "资金账户 - 格式:1,2,3"
  121. // @Param OperateType query string false "资金操作类型 - 格式:1,2,3"
  122. // @Success 200 {object} QueryAmountLogRsp
  123. // @Failure 500 {object} app.Response
  124. // @Router /TaAccount/QueryAmountLog [get]
  125. // @Tags 资金账户
  126. // 参考通用查询:QueryClientAmountLog
  127. func QueryAmountLog(c *gin.Context) {
  128. appG := app.Gin{C: c}
  129. // 获取请求参数
  130. var req QueryAmountLogReq
  131. if err := appG.C.ShouldBindQuery(&req); err != nil {
  132. logger.GetLogger().Errorf("QueryAmountLog failed: %s", err.Error())
  133. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  134. return
  135. }
  136. // 查询数据
  137. datas := make([]QueryAmountLogRsp, 0)
  138. engine := db.GetEngine()
  139. s := engine.Table("TAACCOUNTLOG").
  140. Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMSTATUS = 1 and ENUMDICITEM.ENUMDICID = 39 and ENUMDICITEM.ENUMITEMNAME = TAACCOUNTLOG.OPERATETYPE").
  141. Join("LEFT", "MARKET", "MARKET.MARKETID = TAACCOUNTLOG.MARKETID").
  142. Join("LEFT", "GOODS", "GOODS.GOODSID = TAACCOUNTLOG.GOODSID").
  143. Join("LEFT", "AUCTION_ORDERINFO", "AUCTION_ORDERINFO.GOODSID = TAACCOUNTLOG.GOODSID").
  144. Join("LEFT", "DELIVERYGOODS", "DELIVERYGOODS.DELIVERYGOODSID = TAACCOUNTLOG.GOODSID").
  145. Select(`to_char(TAACCOUNTLOG.RELATIONORDERID) as RELATIONORDERID, TAACCOUNTLOG.*,
  146. MARKET.MARKETNAME, MARKET.TRADEMODE,
  147. GOODS.GOODSCODE, GOODS.GOODSNAME,
  148. AUCTION_ORDERINFO.GOODSCODE AS AGOODSCODE, AUCTION_ORDERINFO.GOODSNAME AS AGOODSNAME,
  149. DELIVERYGOODS.DELIVERYGOODSCODE AS DGOODSCODE, DELIVERYGOODS.DELIVERYGOODSNAME AS DGOODSNAME,
  150. ENUMDICITEM.ENUMDICNAME AS OPERATETYPENAME`).
  151. Where(fmt.Sprintf("TAACCOUNTLOG.ACCOUNTID in (%s)", req.AccountID)).Desc("TAACCOUNTLOG.AUTOID")
  152. if len(req.OperateType) > 0 {
  153. s = s.And(fmt.Sprintf("TAACCOUNTLOG.OPERATETYPE in (%s)", req.OperateType))
  154. }
  155. if err := s.Find(&datas); err != nil {
  156. // 查询失败
  157. logger.GetLogger().Errorf("QueryAmountLog failed: %s", err.Error())
  158. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  159. return
  160. }
  161. // 查询成功返回
  162. if req.PageSize > 0 {
  163. // 分页
  164. rst := make([]QueryAmountLogRsp, 0)
  165. // 开始上标
  166. // 终端分页1开始
  167. start := (req.Page - 1) * req.PageSize
  168. // 结束下标
  169. end := start + req.PageSize
  170. if start <= len(datas) {
  171. // 判断结束下标是否越界
  172. if end > len(datas) {
  173. end = len(datas)
  174. }
  175. rst = datas[start:end]
  176. } else {
  177. rst = datas[0:0]
  178. }
  179. logger.GetLogger().Debugln("QueryAmountLog successed: %v", rst)
  180. appG.ResponseByPage(http.StatusOK, e.SUCCESS, rst, app.PageInfo{Page: req.Page, PageSize: req.PageSize, Total: len(datas)})
  181. } else {
  182. // 不分页
  183. logger.GetLogger().Debugln("QueryAmountLog successed: %v", datas)
  184. appG.Response(http.StatusOK, e.SUCCESS, datas)
  185. }
  186. }
  187. // QueryHisAmountLogReq 资金流水查询(历史)请求参数
  188. type QueryHisAmountLogReq struct {
  189. app.PageInfo
  190. AccountID string `form:"accountID"` // 资金账户
  191. OperateType string `form:"operateType"` // 资金操作类型
  192. StartDate string `form:"startDate"` // 开始时间
  193. EndDate string `form:"endDate"` // 结束时间
  194. }
  195. // QueryHisAmountLogRsp 资金流水查询(历史)返回模型
  196. type QueryHisAmountLogRsp struct {
  197. models.Histaaccountlog `xorm:"extends"`
  198. MarketName string `json:"marketname" xorm:"'MARKETNAME'"` // 市场名称
  199. TradeMode uint32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
  200. GoodsCode string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码
  201. GoodsName string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  202. AGoodsCode string `json:"agoodscode" xorm:"'AGOODSCODE'"` // 竞拍商品代码
  203. AGoodsName string `json:"agoodsname" xorm:"'GOODSNAME'"` // 竞拍商品名称
  204. DGoodsCode string `json:"dgoodscode" xorm:"'DGOODSCODE'"` // 交割商品代码
  205. DGoodsName string `json:"dgoodsname" xorm:"'DGOODSNAME'"` // 交割商品名称
  206. OperateTypeName string `json:"-" xorm:"OPERATETYPENAME"` // 资金操作类型名称
  207. }
  208. // QueryHisAmountLog 资金流水查询(历史)
  209. // @Summary 资金流水查询(历史)
  210. // @Produce json
  211. // @Security ApiKeyAuth
  212. // @Param page query int false "页码"
  213. // @Param pagesize query int false "每页条数"
  214. // @Param accountID query string true "资金账户 - 格式:1,2,3"
  215. // @Param OperateType query string false "资金操作类型 - 格式:1,2,3"
  216. // @Param startDate query string false "开始时间 - 闭区间,格式:yyyy-MM-dd"
  217. // @Param endDate query string false "结束时间 - 闭区间,格式:yyyy-MM-dd"
  218. // @Success 200 {object} QueryHisAmountLogRsp
  219. // @Failure 500 {object} app.Response
  220. // @Router /TaAccount/QueryHisAmountLog [get]
  221. // @Tags 资金账户
  222. // 参考通用查询:Client_QueryHis_taaccountlog
  223. func QueryHisAmountLog(c *gin.Context) {
  224. appG := app.Gin{C: c}
  225. // 获取请求参数
  226. var req QueryHisAmountLogReq
  227. if err := appG.C.ShouldBindQuery(&req); err != nil {
  228. logger.GetLogger().Errorf("QueryHisAmountLog failed: %s", err.Error())
  229. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  230. return
  231. }
  232. // 查询数据
  233. datas := make([]QueryHisAmountLogRsp, 0)
  234. engine := db.GetEngine()
  235. s := engine.Table("HIS_TAACCOUNTLOG").
  236. Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMSTATUS = 1 and ENUMDICITEM.ENUMDICID = 39 and ENUMDICITEM.ENUMITEMNAME = HIS_TAACCOUNTLOG.OPERATETYPE").
  237. Join("LEFT", "MARKET", "MARKET.MARKETID = HIS_TAACCOUNTLOG.MARKETID").
  238. Join("LEFT", "GOODS", "GOODS.GOODSID = HIS_TAACCOUNTLOG.GOODSID").
  239. Join("LEFT", "HIS_AUCTION_ORDERINFO", "HIS_AUCTION_ORDERINFO.GOODSID = HIS_TAACCOUNTLOG.GOODSID and HIS_AUCTION_ORDERINFO.ISVALIDDATA = 1").
  240. Join("LEFT", "DELIVERYGOODS", "DELIVERYGOODS.DELIVERYGOODSID = HIS_TAACCOUNTLOG.GOODSID").
  241. Select(`to_char(HIS_TAACCOUNTLOG.RELATIONORDERID) as RELATIONORDERID, HIS_TAACCOUNTLOG.*,
  242. MARKET.MARKETNAME, MARKET.TRADEMODE,
  243. GOODS.GOODSCODE, GOODS.GOODSNAME,
  244. HIS_AUCTION_ORDERINFO.GOODSCODE AS AGOODSCODE, HIS_AUCTION_ORDERINFO.GOODSNAME AS AGOODSNAME,
  245. DELIVERYGOODS.DELIVERYGOODSCODE AS DGOODSCODE, DELIVERYGOODS.DELIVERYGOODSNAME AS DGOODSNAME,
  246. ENUMDICITEM.ENUMDICNAME AS OPERATETYPENAME`).
  247. Where(fmt.Sprintf(`HIS_TAACCOUNTLOG.ISVALIDDATA = 1 and HIS_TAACCOUNTLOG.ACCOUNTID in (%s)`, req.AccountID)).Desc("HIS_TAACCOUNTLOG.AUTOID")
  248. if len(req.OperateType) > 0 {
  249. s = s.And(fmt.Sprintf("HIS_TAACCOUNTLOG.OPERATETYPE in (%s)", req.OperateType))
  250. }
  251. if len(req.StartDate) > 0 {
  252. s = s.And(fmt.Sprintf("to_date(HIS_TAACCOUNTLOG.HISTRADEDATE,'yyyyMMdd') >= to_date('%s','yyyy-MM-dd')", req.StartDate))
  253. }
  254. if len(req.EndDate) > 0 {
  255. s = s.And(fmt.Sprintf("to_date(HIS_TAACCOUNTLOG.HISTRADEDATE,'yyyyMMdd') <= to_date('%s','yyyy-MM-dd')", req.EndDate))
  256. }
  257. if err := s.Find(&datas); err != nil {
  258. // 查询失败
  259. logger.GetLogger().Errorf("QueryHisAmountLog failed: %s", err.Error())
  260. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  261. return
  262. }
  263. // 查询成功返回
  264. if req.PageSize > 0 {
  265. // 分页
  266. rst := make([]QueryHisAmountLogRsp, 0)
  267. // 开始上标
  268. // 终端分页1开始
  269. start := (req.Page - 1) * req.PageSize
  270. // 结束下标
  271. end := start + req.PageSize
  272. if start <= len(datas) {
  273. // 判断结束下标是否越界
  274. if end > len(datas) {
  275. end = len(datas)
  276. }
  277. rst = datas[start:end]
  278. } else {
  279. rst = datas[0:0]
  280. }
  281. logger.GetLogger().Debugln("QueryHisAmountLog successed: %v", rst)
  282. appG.ResponseByPage(http.StatusOK, e.SUCCESS, rst, app.PageInfo{Page: req.Page, PageSize: req.PageSize, Total: len(datas)})
  283. } else {
  284. // 不分页
  285. logger.GetLogger().Debugln("QueryHisAmountLog successed: %v", datas)
  286. appG.Response(http.StatusOK, e.SUCCESS, datas)
  287. }
  288. }
  289. // QueryRelatedTaAccount
  290. // @Summary 查询关联资金账户信息
  291. // @Produce json
  292. // @Security ApiKeyAuth
  293. // @Param relateduserid query int true "关联UserID"
  294. // @Success 200 {array} models.RelatedTaAccount
  295. // @Failure 500 {object} app.Response
  296. // @Router /TaAccount/QueryRelatedTaAccount [get]
  297. // @Tags 资金账户
  298. func QueryRelatedTaAccount(c *gin.Context) {
  299. a := app.GinUtils{Gin: app.Gin{C: c}}
  300. m := models.RelatedTaAccount{}
  301. a.DoBindReq(&m)
  302. a.DoGetDataI(&m)
  303. }