szdz.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. package szdz
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "mtp2_if/db"
  6. "mtp2_if/global/app"
  7. "mtp2_if/global/e"
  8. "mtp2_if/logger"
  9. "mtp2_if/models"
  10. "mtp2_if/utils"
  11. "net/http"
  12. "sort"
  13. "strconv"
  14. "time"
  15. "github.com/gin-gonic/gin"
  16. )
  17. // QueryRecieptOrderReq 点选挂牌委托单据查询参数
  18. type QueryRecieptOrderReq struct {
  19. app.PageInfo
  20. GoodsID int `form:"goodsID" binding:"required"` // 商品ID,必填
  21. BuyOrSell int `form:"buyorsell"` // 方向
  22. AccountName string `form:"accountName"` // 所属账户名称
  23. MarketID int `form:"marketID"` // 市场ID
  24. }
  25. // QueryRecieptOrderRsp 点选挂牌委托单据查询返回模型
  26. type QueryRecieptOrderRsp struct {
  27. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
  28. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码
  29. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  30. Buyorsell uint32 `json:"buyorsell" xorm:"'BUYORSELL'"` // 方向 - 0:买 1:卖
  31. Orderid string `json:"orderid" xorm:"'ORDERID'"` // 委托单号
  32. Tradedate string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  33. Orderprice float64 `json:"orderprice" xorm:"'ORDERPRICE'"` // 委托价格
  34. EnableQty int64 `json:"enableqty" xorm:"ENABLEQTY"` // 可摘数量
  35. AccountName string `json:"accountName" xorm:"ACCOUNTNAME"` // 所属账号名称(已脱敏)
  36. AccountID int64 `json:"accountid" xorm:"ACCOUNTID"` // 资金账号
  37. Ordertime time.Time `json:"ordertime" xorm:"'ORDERTIME'" binding:"required"` // 委托时间
  38. }
  39. // QueryRecieptOrder 点选挂牌委托单据查询(摘牌大厅)
  40. // @Summary 点选挂牌委托单据查询(摘牌大厅)
  41. // @Description 说明:pagesize参数赋值不为0时表示需要分页;page参数从0开始计算
  42. // @Produce json
  43. // @Security ApiKeyAuth
  44. // @Param page query int false "页码"
  45. // @Param pagesize query int false "每页条数"
  46. // @Param goodsID query int true "商品ID"
  47. // @Param accountName query string false "所属账户名称"
  48. // @Param marketID query int false "市场ID"
  49. // @Param buyorsell query int true "方向 - 0:买 1:卖"
  50. // @Success 200 {object} QueryRecieptOrderRsp
  51. // @Failure 500 {object} app.Response
  52. // @Router /SZDZ/QueryRecieptOrder [get]
  53. // @Tags 定制【尚志大宗】
  54. // 参考通用查询:Client_SZDZ3_SearchRecieptOrder
  55. func QueryRecieptOrder(c *gin.Context) {
  56. appG := app.Gin{C: c}
  57. // 获取请求参数
  58. var req QueryRecieptOrderReq
  59. if err := appG.C.ShouldBindQuery(&req); err != nil {
  60. logger.GetLogger().Errorf("QueryRecieptOrder failed: %s", err.Error())
  61. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  62. return
  63. }
  64. datas := make([]QueryRecieptOrderRsp, 0)
  65. engine := db.GetEngine()
  66. // 投资者挂牌委托单
  67. s := engine.Table("TRADE_ORDERDETAIL").
  68. Join("INNER", "GOODS", "TRADE_ORDERDETAIL.GOODSID = GOODS.GOODSID").
  69. Join("LEFT", "TAACCOUNT", "TAACCOUNT.ACCOUNTID = TRADE_ORDERDETAIL.ACCOUNTID").
  70. Join("LEFT", "USERACCOUNT", "USERACCOUNT.USERID = TAACCOUNT.RELATEDUSERID").
  71. Select(`GOODS.GOODSID, GOODS.GOODSCODE, GOODS.GOODSNAME,
  72. TRADE_ORDERDETAIL.BUYORSELL, to_char(TRADE_ORDERDETAIL.ORDERID) as ORDERID, TRADE_ORDERDETAIL.TRADEDATE, TRADE_ORDERDETAIL.ORDERPRICE,
  73. TRADE_ORDERDETAIL.ORDERQTY - TRADE_ORDERDETAIL.TRADEQTY - TRADE_ORDERDETAIL.CANCELQTY as ENABLEQTY,
  74. (case when USERACCOUNT.ISANONYMOUS = 0 then to_char(USERACCOUNT.ACCOUNTNAME) else '*****' end) ACCOUNTNAME`).
  75. Where("TRADE_ORDERDETAIL.ORDERSTATUS in (3,7,12) and GOODS.GOODSID = ?", req.GoodsID)
  76. if len(req.AccountName) > 0 {
  77. s = s.And("USERACCOUNT.ACCOUNTNAME = ?", req.AccountName)
  78. }
  79. if req.MarketID > 0 {
  80. s = s.And("TRADE_ORDERDETAIL.MARKETID = ?", req.MarketID)
  81. }
  82. if req.BuyOrSell > -1 {
  83. s = s.And("TRADE_ORDERDETAIL.BUYORSELL = ?", req.BuyOrSell)
  84. }
  85. // 判断是否要分页
  86. // 这样分页会报错
  87. // if req.Size > 0 {
  88. // s = s.Limit(req.Size, req.Page*req.Size)
  89. // }
  90. d1 := make([]QueryRecieptOrderRsp, 0)
  91. if err := s.Find(&d1); err != nil {
  92. // 查询失败
  93. logger.GetLogger().Errorf("QueryRecieptOrder failed: %s", err.Error())
  94. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  95. return
  96. }
  97. datas = append(datas, d1...)
  98. // 报价商挂牌委托
  99. s = engine.Table("TRADE_QUOTEDETAILNEW").
  100. Join("INNER", "GOODS", "TRADE_QUOTEDETAILNEW.GOODSID = GOODS.GOODSID").
  101. Join("INNER", "QUOTER", "QUOTER.QUOTERID = TRADE_QUOTEDETAILNEW.QUOTERID").
  102. Join("INNER", "AREAROLE", "AREAROLE.USERID = QUOTER.DEFAULTMAKERID and AREAROLE.ROLETYPE = 8").
  103. Select(`GOODS.GOODSID, GOODS.GOODSCODE, GOODS.GOODSNAME,
  104. TRADE_QUOTEDETAILNEW.BUYORSELL, to_char(TRADE_QUOTEDETAILNEW.ORDERID) as ORDERID, TRADE_QUOTEDETAILNEW.TRADEDATE, TRADE_QUOTEDETAILNEW.PRICE as ORDERPRICE,
  105. TRADE_QUOTEDETAILNEW.CURQTY as ENABLEQTY,
  106. substr(QUOTER.QUOTERNAME,0,1)||'****' as ACCOUNTNAME`).
  107. Where("(TRADE_QUOTEDETAILNEW.CURQTY > 0 or TRADE_QUOTEDETAILNEW.PRICE > 0) and TRADE_QUOTEDETAILNEW.ISVALID != 1 and TRADE_QUOTEDETAILNEW.FREEZESTATUS != 3")
  108. d2 := make([]QueryRecieptOrderRsp, 0)
  109. if err := s.Find(&d2); err != nil {
  110. // 查询失败
  111. logger.GetLogger().Errorf("QueryRecieptOrder failed: %s", err.Error())
  112. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  113. return
  114. }
  115. datas = append(datas, d2...)
  116. // 过滤相关账号下非买一卖一的单据(如买一卖一有多张单则都要显示)
  117. if req.BuyOrSell == 0 {
  118. // 买,先按价格倒序排列
  119. sort.Slice(datas, func(i int, j int) bool {
  120. if datas[i].Orderprice == datas[j].Orderprice {
  121. return datas[i].Ordertime.Before(datas[j].Ordertime)
  122. }
  123. return datas[i].Orderprice > datas[j].Orderprice
  124. })
  125. } else {
  126. // 卖,先按价格顺序排列
  127. sort.Slice(datas, func(i int, j int) bool {
  128. if datas[i].Orderprice == datas[j].Orderprice {
  129. return datas[i].Ordertime.Before(datas[j].Ordertime)
  130. }
  131. return datas[i].Orderprice < datas[j].Orderprice
  132. })
  133. }
  134. tmpDatas := make([]QueryRecieptOrderRsp, 0)
  135. for _, v := range datas {
  136. needAdd := true
  137. for _, t := range tmpDatas {
  138. if req.BuyOrSell == 0 {
  139. // 买
  140. if t.AccountID == v.AccountID && t.Buyorsell == v.Buyorsell && t.Orderprice > v.Orderprice {
  141. needAdd = false
  142. }
  143. } else {
  144. // 卖
  145. if t.AccountID == v.AccountID && t.Buyorsell == v.Buyorsell && t.Orderprice < v.Orderprice {
  146. needAdd = false
  147. }
  148. }
  149. }
  150. if needAdd {
  151. tmpDatas = append(tmpDatas, v)
  152. }
  153. }
  154. datas = tmpDatas
  155. total := len(datas)
  156. // FIXME: - 排序 & 分页
  157. // 排序
  158. sort.Slice(datas, func(i int, j int) bool {
  159. return datas[i].Tradedate > datas[j].Tradedate
  160. })
  161. // 分页
  162. if req.PageSize > 0 {
  163. // 开始上标
  164. start := req.Page * req.PageSize
  165. // 结束下标
  166. // a := []int{1,2,3,4,5}
  167. // a[2:4] -> [3 4]
  168. end := start + req.PageSize
  169. if start <= len(datas) {
  170. // 判断结束下标是否越界
  171. if end > len(datas) {
  172. end = len(datas)
  173. }
  174. datas = datas[start:end]
  175. } else {
  176. datas = make([]QueryRecieptOrderRsp, 0)
  177. }
  178. }
  179. // 查询成功返回
  180. logger.GetLogger().Debugln("QueryRecieptOrder successed: %v", datas)
  181. if req.PageSize > 0 {
  182. // 分页
  183. appG.ResponseByPage(http.StatusOK, e.SUCCESS, datas, app.PageInfo{Page: req.Page, PageSize: req.PageSize, Total: total})
  184. } else {
  185. // 不分页
  186. appG.Response(http.StatusOK, e.SUCCESS, datas)
  187. }
  188. }
  189. // QueryGoodsPickupReq 商品提货单查询请求参数
  190. type QueryGoodsPickupReq struct {
  191. AccountID string `form:"accountID" binding:"required"`
  192. TakeOrderStatus int `form:"takeOrderStatus"`
  193. }
  194. // QueryGoodsPickupRsp 商品提货单查询返回模型
  195. type QueryGoodsPickupRsp struct {
  196. models.Szdz3goodspickup `xorm:"extends"`
  197. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码
  198. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  199. }
  200. // QueryGoodsPickup 商品提货单查询
  201. // @Summary 商品提货单查询
  202. // @Produce json
  203. // @Security ApiKeyAuth
  204. // @Param accountID query string true "资金账户 - 格式:1,2,3"
  205. // @Param takeOrderStatus query int false "提货状态 - 1:待发货 2:已发货 3:已收货"
  206. // @Success 200 {object} QueryGoodsPickupRsp
  207. // @Failure 500 {object} app.Response
  208. // @Router /SZDZ/QueryGoodsPickup [get]
  209. // @Tags 定制【尚志大宗】
  210. func QueryGoodsPickup(c *gin.Context) {
  211. appG := app.Gin{C: c}
  212. // 获取请求参数
  213. var req QueryGoodsPickupReq
  214. if err := appG.C.ShouldBindQuery(&req); err != nil {
  215. logger.GetLogger().Errorf("QueryGoodsPickup failed: %s", err.Error())
  216. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  217. return
  218. }
  219. datas := make([]QueryGoodsPickupRsp, 0)
  220. engine := db.GetEngine()
  221. s := engine.Join("INNER", "GOODS", "GOODS.GOODSID = SZDZ3_GOODSPICKUP.GOODSID").
  222. Select("to_char(SZDZ3_GOODSPICKUP.TAKEORDERID) as TAKEORDERID, SZDZ3_GOODSPICKUP.*, GOODS.GOODSCODE, GOODS.GOODSNAME").
  223. Where(fmt.Sprintf(`SZDZ3_GOODSPICKUP.ACCOUNTID in (%s)`, req.AccountID)).
  224. Desc("SZDZ3_GOODSPICKUP.TAKEORDERID")
  225. if req.TakeOrderStatus > 0 {
  226. s = s.And("SZDZ3_GOODSPICKUP.TAKEORDERSTATUS = ?", req.TakeOrderStatus)
  227. }
  228. if err := s.Find(&datas); err != nil {
  229. // 查询失败
  230. logger.GetLogger().Errorf("QueryGoodsPickup failed: %s", err.Error())
  231. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  232. return
  233. }
  234. // 查询成功返回
  235. logger.GetLogger().Debugln("QueryGoodsPickup successed: %v", datas)
  236. appG.Response(http.StatusOK, e.SUCCESS, datas)
  237. }
  238. // QueryConvertLogReq 交易系统转换流水查询请求参数
  239. type QueryConvertLogReq struct {
  240. AccountID string `form:"accountID" binding:"required"`
  241. StartDate string `form:"startDate"`
  242. EndDate string `form:"endDate"`
  243. }
  244. // QueryConvertLogRsp 交易系统转换流水查询返回模型
  245. type QueryConvertLogRsp struct {
  246. models.Szdz3convertlog `xorm:"extends"`
  247. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码
  248. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  249. QTY string `json:"qty"` // 数量
  250. }
  251. // QueryConvertLog 交易系统转换流水查询
  252. // @Summary 交易系统转换流水查询
  253. // @Produce json
  254. // @Security ApiKeyAuth
  255. // @Param accountID query string true "资金账户 - 格式:1,2,3"
  256. // @Param startDate query string false "开始时间 - 闭区间,格式:yyyy-MM-dd HH:mm:ss"
  257. // @Param endDate query string false "结束时间 - 闭区间,格式:yyyy-MM-dd HH:mm:ss"
  258. // @Success 200 {object} QueryConvertLogRsp
  259. // @Failure 500 {object} app.Response
  260. // @Router /SZDZ/QueryConvertLog [get]
  261. // @Tags 定制【尚志大宗】
  262. func QueryConvertLog(c *gin.Context) {
  263. appG := app.Gin{C: c}
  264. // 获取请求参数
  265. var req QueryConvertLogReq
  266. if err := appG.C.ShouldBindQuery(&req); err != nil {
  267. logger.GetLogger().Errorf("QueryConvertLog failed: %s", err.Error())
  268. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  269. return
  270. }
  271. datas := make([]QueryConvertLogRsp, 0)
  272. engine := db.GetEngine()
  273. s := engine.Join("INNER", "GOODS", "GOODS.GOODSID = SZDZ3_CONVERTLOG.INNERGOODSID").
  274. Select("SZDZ3_CONVERTLOG.*, GOODS.GOODSCODE, GOODS.GOODSNAME").
  275. Where(fmt.Sprintf(`SZDZ3_CONVERTLOG.HandleStatus = 1 and SZDZ3_CONVERTLOG.ACCOUNTID in (%s)`, req.AccountID)).
  276. Desc("SZDZ3_CONVERTLOG.LOGID")
  277. if len(req.StartDate) > 0 {
  278. s = s.And(fmt.Sprintf(`SZDZ3_CONVERTLOG.CREATETIME >= to_date('%s','yyyy-MM-dd hh24:mi:ss')`, req.StartDate))
  279. }
  280. if len(req.EndDate) > 0 {
  281. s = s.And(fmt.Sprintf(`SZDZ3_CONVERTLOG.CREATETIME <= to_date('%s','yyyy-MM-dd hh24:mi:ss')`, req.EndDate))
  282. }
  283. if err := s.Find(&datas); err != nil {
  284. // 查询失败
  285. logger.GetLogger().Errorf("QueryConvertLog failed: %s", err.Error())
  286. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  287. return
  288. }
  289. // 计算数量
  290. for i, v := range datas {
  291. queryConvertLog := &datas[i]
  292. // 方向
  293. direction := "-"
  294. // 数量
  295. qty := v.Outvalue
  296. if v.Converttype == 1 || v.Converttype == 2 || v.Converttype == 5 {
  297. direction = "+"
  298. qty = v.Invalue
  299. }
  300. queryConvertLog.QTY = fmt.Sprintf("%s%v", direction, qty)
  301. }
  302. // 查询成功返回
  303. logger.GetLogger().Debugln("QueryConvertLog successed: %v", datas)
  304. appG.Response(http.StatusOK, e.SUCCESS, datas)
  305. }
  306. // SearchWhiteReq 搜索白名单请求参数
  307. type SearchWhiteReq struct {
  308. UserID int `form:"userID" binding:"required"`
  309. }
  310. // SearchWhite 搜索白名单
  311. // @Summary 搜索白名单
  312. // @Produce json
  313. // @Security ApiKeyAuth
  314. // @Param userID query int true "用户ID"
  315. // @Success 200 {object} models.Szdz3searchwhitelist
  316. // @Failure 500 {object} app.Response
  317. // @Router /SZDZ/SearchWhite [get]
  318. // @Tags 定制【尚志大宗】
  319. func SearchWhite(c *gin.Context) {
  320. appG := app.Gin{C: c}
  321. // 获取请求参数
  322. var req SearchWhiteReq
  323. if err := appG.C.ShouldBindQuery(&req); err != nil {
  324. logger.GetLogger().Errorf("SearchWhite failed: %s", err.Error())
  325. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  326. return
  327. }
  328. datas := make([]models.Szdz3searchwhitelist, 0)
  329. engine := db.GetEngine()
  330. if err := engine.Where("USERID = ?", req.UserID).Find(&datas); err != nil {
  331. // 查询失败
  332. logger.GetLogger().Errorf("SearchWhite failed: %s", err.Error())
  333. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  334. return
  335. }
  336. // 查询成功返回
  337. logger.GetLogger().Debugln("SearchWhite successed: %v", datas)
  338. appG.Response(http.StatusOK, e.SUCCESS, datas)
  339. }
  340. // QueryConvertConfigReq 查询交易系统转换设置请求参数
  341. type QueryConvertConfigReq struct {
  342. ConvertType int `form:"convertType"` // 转换类型 - 1:金点赞转交易 2:金点拍转交易 3:交易转金点赞(不设置) 4:交易转金点拍(不设置) 5:花生米转交易 6:交易转花生米(不设置)
  343. OuterGoodsCode string `form:"outerGoodsCode"` // 外部商品代码[JD\PD]
  344. InnerGoodsIDs string `form:"innerGoodsIDs"` // 内部商品ID列表[交易]
  345. }
  346. // QueryConvertConfig 查询交易系统转换设置
  347. // @Summary 查询交易系统转换设置
  348. // @Produce json
  349. // @Security ApiKeyAuth
  350. // @Param convertType query int false "转换类型 - 1:金点赞转交易 2:金点拍转交易 3:交易转金点赞(不设置) 4:交易转金点拍(不设置) 5:花生米转交易 6:交易转花生米(不设置)"
  351. // @Param outerGoodsCode query string false "外部商品代码[JD\PD]"
  352. // @Param innerGoodsIDs query string false "内部商品ID列表[交易],格式:1,2,3"
  353. // @Success 200 {object} models.Szdz3convertconfig
  354. // @Failure 500 {object} app.Response
  355. // @Router /SZDZ/QueryConvertConfig [get]
  356. // @Tags 定制【尚志大宗】
  357. func QueryConvertConfig(c *gin.Context) {
  358. appG := app.Gin{C: c}
  359. // 获取请求参数
  360. var req QueryConvertConfigReq
  361. if err := appG.C.ShouldBindQuery(&req); err != nil {
  362. logger.GetLogger().Errorf("QueryConvertConfigReq failed: %s", err.Error())
  363. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  364. return
  365. }
  366. datas := make([]models.Szdz3convertconfig, 0)
  367. engine := db.GetEngine()
  368. s := engine.Table("SZDZ3_CONVERTCONFIG")
  369. if req.ConvertType > 0 {
  370. s = s.And("CONVERTTYPE = ?", req.ConvertType)
  371. }
  372. if len(req.OuterGoodsCode) > 0 {
  373. s = s.And("OUTERGOODSCODE = ?", req.OuterGoodsCode)
  374. }
  375. if len(req.InnerGoodsIDs) > 0 {
  376. s = s.And(fmt.Sprintf("INNERGOODSID in (%s)", req.InnerGoodsIDs))
  377. }
  378. if err := s.Find(&datas); err != nil {
  379. // 查询失败
  380. logger.GetLogger().Errorf("QueryConvertConfigReq failed: %s", err.Error())
  381. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  382. return
  383. }
  384. // 查询成功返回
  385. logger.GetLogger().Debugln("QueryConvertConfigReq successed: %v", datas)
  386. appG.Response(http.StatusOK, e.SUCCESS, datas)
  387. }
  388. // QuerySZDZTradePositionReq 持仓汇总查询请求参数(尚志大宗)
  389. type QuerySZDZTradePositionReq struct {
  390. AccountID int `form:"accountID" binding:"required"`
  391. }
  392. // QuerySZDZTradePositionRsp 持仓汇总查询返回模型(尚志大宗)
  393. type QuerySZDZTradePositionRsp struct {
  394. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 账号Id
  395. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'"` // 商品Id
  396. Positionqty int64 `json:"positionqty" xorm:"'POSITIONQTY'"` // 期初持仓数量
  397. Holderamount float64 `json:"holderamount" xorm:"'HOLDERAMOUNT'"` // 期初持仓总金额
  398. Curpositionqty int64 `json:"curpositionqty" xorm:"'CURPOSITIONQTY'"` // 当前持仓总数量
  399. Curholderamount float64 `json:"curholderamount" xorm:"'CURHOLDERAMOUNT'"` // 当前持仓总金额
  400. Frozenqty int64 `json:"frozenqty" xorm:"'FROZENQTY'"` // 持仓冻结数量
  401. Otherfrozenqty int64 `json:"otherfrozenqty" xorm:"'OTHERFROZENQTY'"` // 持仓其他冻结数量(交割冻结)
  402. Openreqqty int64 `json:"openreqqty" xorm:"'OPENREQQTY'"` // 开仓申请数量
  403. Opentotalqty int64 `json:"opentotalqty" xorm:"'OPENTOTALQTY'"` // 开仓总数量
  404. Closetotalqty int64 `json:"closetotalqty" xorm:"'CLOSETOTALQTY'"` // 平仓总数量
  405. Tnqty int64 `json:"tnqty" xorm:"'TNQTY'"` // T+N冻结总量
  406. Tnusedqty int64 `json:"tnusedqty" xorm:"'TNUSEDQTY'"` // T+N使用量
  407. Usedmargin float64 `json:"usedmargin" xorm:"'USEDMARGIN'"` // 占用保证金
  408. Curtdposition int64 `json:"curtdposition" xorm:"'CURTDPOSITION'"` // 期末今日头寸
  409. Fretdposition int64 `json:"fretdposition" xorm:"'FRETDPOSITION'"` // 冻结今日头寸
  410. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码(内部)
  411. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  412. Currencyid int64 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID
  413. Goodunitid int64 `json:"goodunitid" xorm:"'GOODUNITID'"` // 报价单位ID
  414. Goodunit string `json:"goodunit" xorm:"'GOODUNIT'"` // 报价单位
  415. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  416. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  417. Marketid int32 `json:"marketid" xorm:"'MARKETID'"` // 市场ID
  418. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
  419. SZDZ3FreezQTY int64 `json:"szdz3freezqty" xorm:"'SZDZ3FREEZQTY'"` // 尚志大宗转换冻结总数量
  420. BuyOrSell int64 `json:"buyorsell" xorm:"'BUYORSELL'" ` // 方向 - 0:买 1:卖
  421. EnableQTY int64 `json:"enableqty" xorm:"'ENABLEQTY'"` // 可用量
  422. AveragePrice float64 `json:"averageprice" xorm:"AVERAGEPRICE"` // 持仓均价
  423. }
  424. // QuerySZDZTradePosition 持仓汇总查询(尚志大宗)
  425. // @Summary 持仓汇总查询(尚志大宗)
  426. // @Produce json
  427. // @Security ApiKeyAuth
  428. // @Param accountID query int true "资金账户"
  429. // @Success 200 {object} QuerySZDZTradePositionRsp
  430. // @Failure 500 {object} app.Response
  431. // @Router /SZDZ/QuerySZDZTradePosition [get]
  432. // @Tags 定制【尚志大宗】
  433. func QuerySZDZTradePosition(c *gin.Context) {
  434. appG := app.Gin{C: c}
  435. // 获取请求参数
  436. var req QuerySZDZTradePositionReq
  437. if err := appG.C.ShouldBindQuery(&req); err != nil {
  438. logger.GetLogger().Errorf("QueryTradePosition failed: %s", err.Error())
  439. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  440. return
  441. }
  442. // 查询数据
  443. datas, err := models.GetSZDZBuyTradePosition(req.AccountID)
  444. if err != nil {
  445. // 查询失败
  446. logger.GetLogger().Errorf("QueryConvertConfigReq failed: %s", err.Error())
  447. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  448. return
  449. }
  450. // 构建返回数据
  451. rst := make([]QuerySZDZTradePositionRsp, 0)
  452. for _, v := range datas {
  453. var tradePosition QuerySZDZTradePositionRsp
  454. // 反射数据
  455. // struct -> json
  456. if jsonBytes, err := json.Marshal(v); err == nil {
  457. // json -> struct
  458. json.Unmarshal(jsonBytes, &tradePosition)
  459. tradePosition.Accountid = v.Accountid
  460. tradePosition.Goodsid = v.Goodsid
  461. tradePosition.Positionqty = v.Positionqty
  462. tradePosition.Holderamount = v.Holderamount
  463. tradePosition.Curholderamount = v.Curholderamount
  464. tradePosition.Otherfrozenqty = v.Otherfrozenqty
  465. tradePosition.Openreqqty = v.Openreqqty
  466. tradePosition.Opentotalqty = v.Opentotalqty
  467. tradePosition.Closetotalqty = v.Closetotalqty
  468. tradePosition.Tnqty = v.Tnqty
  469. tradePosition.Tnusedqty = v.Tnusedqty
  470. tradePosition.Usedmargin = v.Usedmargin
  471. tradePosition.Curtdposition = v.Curtdposition
  472. tradePosition.Fretdposition = v.Fretdposition
  473. tradePosition.Goodscode = v.Goodscode
  474. tradePosition.Goodsname = v.Goodsname
  475. tradePosition.Currencyid = v.Currencyid
  476. tradePosition.Goodunitid = v.Goodunitid
  477. tradePosition.Goodunit = v.Goodunit
  478. tradePosition.Agreeunit = v.Agreeunit
  479. tradePosition.Decimalplace = v.Decimalplace
  480. tradePosition.Marketid = v.Marketid
  481. tradePosition.Trademode = v.Trademode
  482. tradePosition.SZDZ3FreezQTY = v.SZDZ3FreezQTY
  483. // 计算相关
  484. tradePosition.Frozenqty = v.Frozenqty + v.SZDZ3FreezQTY // 需要加上
  485. tradePosition.Curpositionqty = v.Curpositionqty + v.SZDZ3FreezQTY
  486. tradePosition.EnableQTY = v.Curpositionqty - v.Frozenqty - v.Otherfrozenqty
  487. averagePrice := tradePosition.Curholderamount / float64(tradePosition.Curpositionqty) / tradePosition.Agreeunit
  488. tradePosition.AveragePrice, _ = strconv.ParseFloat(utils.FormatFloat(averagePrice, int(v.Decimalplace)), 64)
  489. tradePosition.BuyOrSell = 0
  490. rst = append(rst, tradePosition)
  491. }
  492. }
  493. // 查询成功
  494. logger.GetLogger().Debugln("QueryTradePosition successed: %v", rst)
  495. appG.Response(http.StatusOK, e.SUCCESS, rst)
  496. }