szdz.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. package szdz
  2. import (
  3. "fmt"
  4. "mtp2_if/db"
  5. "mtp2_if/global/app"
  6. "mtp2_if/global/e"
  7. "mtp2_if/logger"
  8. "mtp2_if/models"
  9. "net/http"
  10. "sort"
  11. "github.com/gin-gonic/gin"
  12. )
  13. // QueryRecieptOrderReq 点选挂牌委托单据查询参数
  14. type QueryRecieptOrderReq struct {
  15. app.PageInfo
  16. GoodsID int `form:"goodsID" binding:"required"` // 商品ID,必填
  17. BuyOrSell int `form:"buyorsell"` // 方向
  18. AccountName string `form:"accountName"` // 所属账户名称
  19. MarketID int `form:"marketID"` // 市场ID
  20. }
  21. // QueryRecieptOrderRsp 点选挂牌委托单据查询返回模型
  22. type QueryRecieptOrderRsp struct {
  23. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
  24. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码
  25. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  26. Buyorsell uint32 `json:"buyorsell" xorm:"'BUYORSELL'"` // 方向 - 0:买 1:卖
  27. Orderid string `json:"orderid" xorm:"'ORDERID'"` // 委托单号
  28. Tradedate string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  29. Orderprice float64 `json:"orderprice" xorm:"'ORDERPRICE'"` // 委托价格
  30. EnableQty int64 `json:"enableqty" xorm:"ENABLEQTY"` // 可摘数量
  31. AccountName string `json:"accountName" xorm:"ACCOUNTNAME"` // 所属账号名称(已脱敏)
  32. AccountID int64 `json:"accountid" xorm:"ACCOUNTID"` // 资金账号
  33. }
  34. // QueryRecieptOrder 点选挂牌委托单据查询(摘牌大厅)
  35. // @Summary 点选挂牌委托单据查询(摘牌大厅)
  36. // @Description 说明:pagesize参数赋值不为0时表示需要分页;page参数从0开始计算
  37. // @Produce json
  38. // @Security ApiKeyAuth
  39. // @Param page query int false "页码"
  40. // @Param pagesize query int false "每页条数"
  41. // @Param goodsID query int true "商品ID"
  42. // @Param accountName query string false "所属账户名称"
  43. // @Param marketID query int false "市场ID"
  44. // @Param buyorsell query int true "方向 - 0:买 1:卖"
  45. // @Success 200 {object} QueryRecieptOrderRsp
  46. // @Failure 500 {object} app.Response
  47. // @Router /SZDZ/QueryRecieptOrder [get]
  48. // @Tags 定制【尚志大宗】
  49. // 参考通用查询:Client_SZDZ3_SearchRecieptOrder
  50. func QueryRecieptOrder(c *gin.Context) {
  51. appG := app.Gin{C: c}
  52. // 获取请求参数
  53. var req QueryRecieptOrderReq
  54. if err := appG.C.ShouldBindQuery(&req); err != nil {
  55. logger.GetLogger().Errorf("QueryRecieptOrder failed: %s", err.Error())
  56. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  57. return
  58. }
  59. datas := make([]QueryRecieptOrderRsp, 0)
  60. engine := db.GetEngine()
  61. // 投资者挂牌委托单
  62. s := engine.Table("TRADE_ORDERDETAIL").
  63. Join("INNER", "GOODS", "TRADE_ORDERDETAIL.GOODSID = GOODS.GOODSID").
  64. Join("LEFT", "TAACCOUNT", "TAACCOUNT.ACCOUNTID = TRADE_ORDERDETAIL.ACCOUNTID").
  65. Join("LEFT", "USERACCOUNT", "USERACCOUNT.USERID = TAACCOUNT.RELATEDUSERID").
  66. Select(`GOODS.GOODSID, GOODS.GOODSCODE, GOODS.GOODSNAME,
  67. TRADE_ORDERDETAIL.BUYORSELL, to_char(TRADE_ORDERDETAIL.ORDERID) as ORDERID, TRADE_ORDERDETAIL.TRADEDATE, TRADE_ORDERDETAIL.ORDERPRICE,
  68. TRADE_ORDERDETAIL.ORDERQTY - TRADE_ORDERDETAIL.TRADEQTY - TRADE_ORDERDETAIL.CANCELQTY as ENABLEQTY,
  69. substr(USERACCOUNT.ACCOUNTNAME,0,1)||'****' as ACCOUNTNAME`).
  70. Where("TRADE_ORDERDETAIL.ORDERSTATUS in (3,7,12) and GOODS.GOODSID = ?", req.GoodsID)
  71. if len(req.AccountName) > 0 {
  72. s = s.And("USERACCOUNT.ACCOUNTNAME = ?", req.AccountName)
  73. }
  74. if req.MarketID > 0 {
  75. s = s.And("TRADE_ORDERDETAIL.MARKETID = ?", req.MarketID)
  76. }
  77. if req.BuyOrSell > -1 {
  78. s = s.And("TRADE_ORDERDETAIL.BUYORSELL = ?", req.BuyOrSell)
  79. }
  80. // 判断是否要分页
  81. // 这样分页会报错
  82. // if req.Size > 0 {
  83. // s = s.Limit(req.Size, req.Page*req.Size)
  84. // }
  85. d1 := make([]QueryRecieptOrderRsp, 0)
  86. if err := s.Find(&d1); err != nil {
  87. // 查询失败
  88. logger.GetLogger().Errorf("QueryRecieptOrder failed: %s", err.Error())
  89. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  90. return
  91. }
  92. datas = append(datas, d1...)
  93. // 报价商挂牌委托
  94. s = engine.Table("TRADE_QUOTEDETAILNEW").
  95. Join("INNER", "GOODS", "TRADE_QUOTEDETAILNEW.GOODSID = GOODS.GOODSID").
  96. Join("INNER", "QUOTER", "QUOTER.QUOTERID = TRADE_QUOTEDETAILNEW.QUOTERID").
  97. Join("INNER", "AREAROLE", "AREAROLE.USERID = QUOTER.DEFAULTMAKERID and AREAROLE.ROLETYPE = 8").
  98. Select(`GOODS.GOODSID, GOODS.GOODSCODE, GOODS.GOODSNAME,
  99. TRADE_QUOTEDETAILNEW.BUYORSELL, to_char(TRADE_QUOTEDETAILNEW.ORDERID) as ORDERID, TRADE_QUOTEDETAILNEW.TRADEDATE, TRADE_QUOTEDETAILNEW.PRICE as ORDERPRICE,
  100. TRADE_QUOTEDETAILNEW.CURQTY as ENABLEQTY,
  101. substr(QUOTER.QUOTERNAME,0,1)||'****' as ACCOUNTNAME`).
  102. Where("(TRADE_QUOTEDETAILNEW.CURQTY > 0 or TRADE_QUOTEDETAILNEW.PRICE > 0) and TRADE_QUOTEDETAILNEW.ISVALID != 1 and TRADE_QUOTEDETAILNEW.FREEZESTATUS != 3")
  103. d2 := make([]QueryRecieptOrderRsp, 0)
  104. if err := s.Find(&d2); err != nil {
  105. // 查询失败
  106. logger.GetLogger().Errorf("QueryRecieptOrder failed: %s", err.Error())
  107. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  108. return
  109. }
  110. datas = append(datas, d2...)
  111. // 过滤相关账号下非买一卖一的单据(如买一卖一有多张单则都要显示)
  112. if req.BuyOrSell == 0 {
  113. // 买,先按价格倒序排列
  114. sort.Slice(datas, func(i int, j int) bool {
  115. return datas[i].Orderprice > datas[j].Orderprice
  116. })
  117. } else {
  118. // 卖,先按价格顺序排列
  119. sort.Slice(datas, func(i int, j int) bool {
  120. return datas[i].Orderprice < datas[j].Orderprice
  121. })
  122. }
  123. tmpDatas := make([]QueryRecieptOrderRsp, 0)
  124. for _, v := range datas {
  125. needAdd := true
  126. for _, t := range tmpDatas {
  127. if req.BuyOrSell == 0 {
  128. // 买
  129. if t.AccountID == v.AccountID && t.Buyorsell == v.Buyorsell && t.Orderprice > v.Orderprice {
  130. needAdd = false
  131. }
  132. } else {
  133. // 卖
  134. if t.AccountID == v.AccountID && t.Buyorsell == v.Buyorsell && t.Orderprice < v.Orderprice {
  135. needAdd = false
  136. }
  137. }
  138. }
  139. if needAdd {
  140. tmpDatas = append(tmpDatas, v)
  141. }
  142. }
  143. datas = tmpDatas
  144. total := len(datas)
  145. // FIXME: - 排序 & 分页
  146. // 排序
  147. sort.Slice(datas, func(i int, j int) bool {
  148. return datas[i].Tradedate > datas[j].Tradedate
  149. })
  150. // 分页
  151. if req.PageSize > 0 {
  152. // 开始上标
  153. start := req.Page * req.PageSize
  154. // 结束下标
  155. // a := []int{1,2,3,4,5}
  156. // a[2:4] -> [3 4]
  157. end := start + req.PageSize
  158. if start <= len(datas) {
  159. // 判断结束下标是否越界
  160. if end > len(datas) {
  161. end = len(datas)
  162. }
  163. datas = datas[start:end]
  164. } else {
  165. datas = make([]QueryRecieptOrderRsp, 0)
  166. }
  167. }
  168. // 查询成功返回
  169. logger.GetLogger().Infof("QueryRecieptOrder successed: %v", datas)
  170. if req.PageSize > 0 {
  171. // 分页
  172. appG.ResponseByPage(http.StatusOK, e.SUCCESS, datas, app.PageInfo{Page: req.Page, PageSize: req.PageSize, Total: total})
  173. } else {
  174. // 不分页
  175. appG.Response(http.StatusOK, e.SUCCESS, datas)
  176. }
  177. }
  178. // QueryGoodsPickupReq 商品提货单查询请求参数
  179. type QueryGoodsPickupReq struct {
  180. AccountID string `form:"accountID" binding:"required"`
  181. TakeOrderStatus int `form:"takeOrderStatus"`
  182. }
  183. // QueryGoodsPickupRsp 商品提货单查询返回模型
  184. type QueryGoodsPickupRsp struct {
  185. models.Szdz3goodspickup `xorm:"extends"`
  186. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码
  187. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  188. }
  189. // QueryGoodsPickup 商品提货单查询
  190. // @Summary 商品提货单查询
  191. // @Produce json
  192. // @Security ApiKeyAuth
  193. // @Param accountID query string true "资金账户 - 格式:1,2,3"
  194. // @Param takeOrderStatus query int false "提货状态 - 1:待发货 2:已发货 3:已收货"
  195. // @Success 200 {object} QueryGoodsPickupRsp
  196. // @Failure 500 {object} app.Response
  197. // @Router /SZDZ/QueryGoodsPickup [get]
  198. // @Tags 定制【尚志大宗】
  199. func QueryGoodsPickup(c *gin.Context) {
  200. appG := app.Gin{C: c}
  201. // 获取请求参数
  202. var req QueryGoodsPickupReq
  203. if err := appG.C.ShouldBindQuery(&req); err != nil {
  204. logger.GetLogger().Errorf("QueryGoodsPickup failed: %s", err.Error())
  205. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  206. return
  207. }
  208. datas := make([]QueryGoodsPickupRsp, 0)
  209. engine := db.GetEngine()
  210. s := engine.Join("INNER", "GOODS", "GOODS.GOODSID = SZDZ3_GOODSPICKUP.GOODSID").
  211. Select("to_char(SZDZ3_GOODSPICKUP.TAKEORDERID) as TAKEORDERID, SZDZ3_GOODSPICKUP.*, GOODS.GOODSCODE, GOODS.GOODSNAME").
  212. Where(fmt.Sprintf(`SZDZ3_GOODSPICKUP.ACCOUNTID in (%s)`, req.AccountID)).
  213. Desc("SZDZ3_GOODSPICKUP.TAKEORDERID")
  214. if req.TakeOrderStatus > 0 {
  215. s = s.And("SZDZ3_GOODSPICKUP.TAKEORDERSTATUS = ?", req.TakeOrderStatus)
  216. }
  217. if err := s.Find(&datas); err != nil {
  218. // 查询失败
  219. logger.GetLogger().Errorf("QueryGoodsPickup failed: %s", err.Error())
  220. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  221. return
  222. }
  223. // 查询成功返回
  224. logger.GetLogger().Infof("QueryGoodsPickup successed: %v", datas)
  225. appG.Response(http.StatusOK, e.SUCCESS, datas)
  226. }
  227. // QueryConvertLogReq 交易系统转换流水查询请求参数
  228. type QueryConvertLogReq struct {
  229. AccountID string `form:"accountID" binding:"required"`
  230. StartDate string `form:"startDate"`
  231. EndDate string `form:"endDate"`
  232. }
  233. // QueryConvertLogRsp 交易系统转换流水查询返回模型
  234. type QueryConvertLogRsp struct {
  235. models.Szdz3convertlog `xorm:"extends"`
  236. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码
  237. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  238. QTY string `json:"qty"` // 数量
  239. }
  240. // QueryConvertLog 交易系统转换流水查询
  241. // @Summary 交易系统转换流水查询
  242. // @Produce json
  243. // @Security ApiKeyAuth
  244. // @Param accountID query string true "资金账户 - 格式:1,2,3"
  245. // @Param startDate query string false "开始时间 - 闭区间,格式:yyyy-MM-dd HH:mm:ss"
  246. // @Param endDate query string false "结束时间 - 闭区间,格式:yyyy-MM-dd HH:mm:ss"
  247. // @Success 200 {object} QueryConvertLogRsp
  248. // @Failure 500 {object} app.Response
  249. // @Router /SZDZ/QueryConvertLog [get]
  250. // @Tags 定制【尚志大宗】
  251. func QueryConvertLog(c *gin.Context) {
  252. appG := app.Gin{C: c}
  253. // 获取请求参数
  254. var req QueryConvertLogReq
  255. if err := appG.C.ShouldBindQuery(&req); err != nil {
  256. logger.GetLogger().Errorf("QueryConvertLog failed: %s", err.Error())
  257. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  258. return
  259. }
  260. datas := make([]QueryConvertLogRsp, 0)
  261. engine := db.GetEngine()
  262. s := engine.Join("INNER", "GOODS", "GOODS.GOODSID = SZDZ3_CONVERTLOG.INNERGOODSID").
  263. Select("SZDZ3_CONVERTLOG.*, GOODS.GOODSCODE, GOODS.GOODSNAME").
  264. Where(fmt.Sprintf(`SZDZ3_CONVERTLOG.HandleStatus = 1 and SZDZ3_CONVERTLOG.ACCOUNTID in (%s)`, req.AccountID)).
  265. Desc("SZDZ3_CONVERTLOG.LOGID")
  266. if len(req.StartDate) > 0 {
  267. s = s.And(fmt.Sprintf(`SZDZ3_CONVERTLOG.CREATETIME >= to_date('%s','yyyy-MM-dd hh24:mi:ss')`, req.StartDate))
  268. }
  269. if len(req.EndDate) > 0 {
  270. s = s.And(fmt.Sprintf(`SZDZ3_CONVERTLOG.CREATETIME <= to_date('%s','yyyy-MM-dd hh24:mi:ss')`, req.EndDate))
  271. }
  272. if err := s.Find(&datas); err != nil {
  273. // 查询失败
  274. logger.GetLogger().Errorf("QueryConvertLog failed: %s", err.Error())
  275. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  276. return
  277. }
  278. // 计算数量
  279. for i, v := range datas {
  280. queryConvertLog := &datas[i]
  281. // 方向
  282. direction := "-"
  283. // 数量
  284. qty := v.Outvalue
  285. if v.Converttype == 1 || v.Converttype == 2 || v.Converttype == 5 {
  286. direction = "+"
  287. qty = v.Invalue
  288. }
  289. queryConvertLog.QTY = fmt.Sprintf("%s%v", direction, qty)
  290. }
  291. // 查询成功返回
  292. logger.GetLogger().Infof("QueryConvertLog successed: %v", datas)
  293. appG.Response(http.StatusOK, e.SUCCESS, datas)
  294. }
  295. // SearchWhiteReq 搜索白名单请求参数
  296. type SearchWhiteReq struct {
  297. UserID int `form:"userID" binding:"required"`
  298. }
  299. // SearchWhite 搜索白名单
  300. // @Summary 搜索白名单
  301. // @Produce json
  302. // @Security ApiKeyAuth
  303. // @Param userID query int true "用户ID"
  304. // @Success 200 {object} models.Szdz3searchwhitelist
  305. // @Failure 500 {object} app.Response
  306. // @Router /SZDZ/SearchWhite [get]
  307. // @Tags 定制【尚志大宗】
  308. func SearchWhite(c *gin.Context) {
  309. appG := app.Gin{C: c}
  310. // 获取请求参数
  311. var req SearchWhiteReq
  312. if err := appG.C.ShouldBindQuery(&req); err != nil {
  313. logger.GetLogger().Errorf("SearchWhite failed: %s", err.Error())
  314. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  315. return
  316. }
  317. datas := make([]models.Szdz3searchwhitelist, 0)
  318. engine := db.GetEngine()
  319. if err := engine.Where("USERID = ?", req.UserID).Find(&datas); err != nil {
  320. // 查询失败
  321. logger.GetLogger().Errorf("SearchWhite failed: %s", err.Error())
  322. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  323. return
  324. }
  325. // 查询成功返回
  326. logger.GetLogger().Infof("SearchWhite successed: %v", datas)
  327. appG.Response(http.StatusOK, e.SUCCESS, datas)
  328. }
  329. // QueryConvertConfigReq 查询交易系统转换设置请求参数
  330. type QueryConvertConfigReq struct {
  331. ConvertType int `form:"convertType"` // 转换类型 - 1:金点赞转交易 2:金点拍转交易 3:交易转金点赞(不设置) 4:交易转金点拍(不设置) 5:花生米转交易 6:交易转花生米(不设置)
  332. OuterGoodsCode string `form:"outerGoodsCode"` // 外部商品代码[JD\PD]
  333. InnerGoodsIDs string `form:"innerGoodsIDs"` // 内部商品ID列表[交易]
  334. }
  335. // QueryConvertConfig 查询交易系统转换设置
  336. // @Summary 查询交易系统转换设置
  337. // @Produce json
  338. // @Security ApiKeyAuth
  339. // @Param convertType query int false "转换类型 - 1:金点赞转交易 2:金点拍转交易 3:交易转金点赞(不设置) 4:交易转金点拍(不设置) 5:花生米转交易 6:交易转花生米(不设置)"
  340. // @Param outerGoodsCode query string false "外部商品代码[JD\PD]"
  341. // @Param innerGoodsIDs query string false "内部商品ID列表[交易],格式:1,2,3"
  342. // @Success 200 {object} models.Szdz3convertconfig
  343. // @Failure 500 {object} app.Response
  344. // @Router /SZDZ/QueryConvertConfig [get]
  345. // @Tags 定制【尚志大宗】
  346. func QueryConvertConfig(c *gin.Context) {
  347. appG := app.Gin{C: c}
  348. // 获取请求参数
  349. var req QueryConvertConfigReq
  350. if err := appG.C.ShouldBindQuery(&req); err != nil {
  351. logger.GetLogger().Errorf("QueryConvertConfigReq failed: %s", err.Error())
  352. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  353. return
  354. }
  355. datas := make([]models.Szdz3convertconfig, 0)
  356. engine := db.GetEngine()
  357. s := engine.Table("SZDZ3_CONVERTCONFIG")
  358. if req.ConvertType > 0 {
  359. s = s.And("CONVERTTYPE = ?", req.ConvertType)
  360. }
  361. if len(req.OuterGoodsCode) > 0 {
  362. s = s.And("OUTERGOODSCODE = ?", req.OuterGoodsCode)
  363. }
  364. if len(req.InnerGoodsIDs) > 0 {
  365. s = s.And(fmt.Sprintf("INNERGOODSID in (%s)", req.InnerGoodsIDs))
  366. }
  367. if err := s.Find(&datas); err != nil {
  368. // 查询失败
  369. logger.GetLogger().Errorf("QueryConvertConfigReq failed: %s", err.Error())
  370. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  371. return
  372. }
  373. // 查询成功返回
  374. logger.GetLogger().Infof("QueryConvertConfigReq successed: %v", datas)
  375. appG.Response(http.StatusOK, e.SUCCESS, datas)
  376. }