taaccount.go 15 KB

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