ferroalloy.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package models
  2. import (
  3. "errors"
  4. "fmt"
  5. "mtp2_if/db"
  6. "mtp2_if/logger"
  7. "mtp2_if/utils"
  8. "strconv"
  9. "sync"
  10. "time"
  11. )
  12. // 上海铁合金项目
  13. // GErmcpspotgoodsprice 现货市价表
  14. type GErmcpspotgoodsprice struct {
  15. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"DELIVERYGOODSID"` // 现货品种ID
  16. WRSTANDARDID int64 `json:"wrstandardid" xorm:"WRSTANDARDID"` // 现货商品ID(通用则为0)
  17. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"SPOTGOODSBRANDID"` // 现货品牌ID(通用则为0, 不为0则须先有商品ID)
  18. CURRENCYID int64 `json:"currencyid" xorm:"CURRENCYID"` // 报价货币ID
  19. SPOTGOODSPRICE float64 `json:"spotgoodsprice" xorm:"SPOTGOODSPRICE"` // 【最新价】当前价格
  20. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 【日期】交易日
  21. OPERATESRC int32 `json:"-" xorm:"OPERATESRC"` // 最后操作来源 - 1:管理端 2:终端
  22. OPERATEID int64 `json:"-" xorm:"OPERATEID"` // 最后操作人
  23. OPERATETIME time.Time `json:"-" xorm:"OPERATETIME"` // 最后操作时间
  24. ISVALID int32 `json:"-" xorm:"ISVALID"` // 是否有效 - 0:无效 1:有效
  25. YSTSPOTGOODSPRICE float64 `json:"ystspotgoodsprice" xorm:"YSTSPOTGOODSPRICE"` // 昨价
  26. TODAYSPOTGOODSPRICE float64 `json:"todayspotgoodsprice" xorm:"TODAYSPOTGOODSPRICE"` // 今日指定价
  27. TODAYPRICEDTOTALQTY float64 `json:"todaypricedtotalqty" xorm:"TODAYPRICEDTOTALQTY"` // 今日定价总量
  28. TODAYPRICEDTOTALAMOUNT float64 `json:"todaypricedtotalamount" xorm:"TODAYPRICEDTOTALAMOUNT"` // 今日定价金额
  29. SRCMARKETNAME string `json:"srcmarketname" xorm:"SRCMARKETNAME"` // 来源市场名称
  30. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"WRSTANDARDCODE"` // 现货商品代码
  31. WRSTANDARDNAME string `json:"wrstandardname" xorm:"WRSTANDARDNAME"` // 【名称】现货商品名称
  32. PageEx `xorm:"extends"` // 页码信息
  33. }
  34. func (r *GErmcpspotgoodsprice) calc() {
  35. if len(r.TRADEDATE) == 8 {
  36. r.TRADEDATE = fmt.Sprintf("%v-%v-%v", r.TRADEDATE[0:4], r.TRADEDATE[4:6], r.TRADEDATE[6:8])
  37. }
  38. }
  39. func (r *GErmcpspotgoodsprice) buildSql() string {
  40. var sqlId utils.SQLVal = `
  41. SELECT
  42. t.DELIVERYGOODSID ,
  43. t.WRSTANDARDID ,
  44. t.SPOTGOODSBRANDID ,
  45. t.CURRENCYID ,
  46. t.SPOTGOODSPRICE ,
  47. t.TRADEDATE ,
  48. t.YSTSPOTGOODSPRICE ,
  49. t.TODAYSPOTGOODSPRICE ,
  50. t.TODAYPRICEDTOTALQTY ,
  51. t.TODAYPRICEDTOTALAMOUNT,
  52. t.SRCMARKETNAME,
  53. w.WRSTANDARDCODE,
  54. w.WRSTANDARDNAME
  55. FROM ERMCP_SPOTGOODSPRICE t
  56. LEFT JOIN WRStandard w ON t.WRSTANDARDID = w.WRSTANDARDID
  57. WHERE t.SPOTGOODSBRANDID = 0 AND t.CURRENCYID = 1 AND t.ISVALID = 1
  58. `
  59. sqlId.OrderByDesc("w.WRSTANDARDNAME")
  60. sqlId.Page(r.Page, r.PageSize)
  61. return sqlId.String()
  62. }
  63. func (r *GErmcpspotgoodsprice) GetDataByPage() (interface{}, error, int, int, int) {
  64. sData := make([]GErmcpspotgoodsprice, 0)
  65. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  66. total := 0
  67. for i := range sData {
  68. sData[i].calc()
  69. total = sData[i].Total
  70. }
  71. return sData, err, r.Page, r.PageSize, total
  72. }
  73. type THJSigninReq struct {
  74. USERID int64 `form:"userid" binding:"required"` // 用户ID
  75. }
  76. // Signin 用户签到
  77. func (r *THJSigninReq) Signin() (err error) {
  78. // 资源锁
  79. var lock sync.Mutex
  80. lock.Lock()
  81. defer lock.Unlock()
  82. engine := db.GetEngine()
  83. // 判断目标用户当日是否已经签到
  84. p := new(Thjsignin)
  85. if has, err := engine.Where("userid = ?", r.USERID).And("tradedate = to_char(sysdate, 'yyyymmdd')").Get(&p); err != nil {
  86. logger.GetLogger().Errorf("Thjsignin failed: %s", err.Error())
  87. err = errors.New("数据错误")
  88. return err
  89. } else {
  90. if has {
  91. err = errors.New("当日已签到")
  92. return err
  93. }
  94. }
  95. // 获取签到积配置
  96. c := Thjscoreconfig{
  97. SCORECONFIGTYPE: 2,
  98. }
  99. if has, err := engine.Get(&c); err != nil || !has {
  100. logger.GetLogger().Errorf("Thjsignin failed: %s", err.Error())
  101. err = errors.New("数据错误")
  102. return err
  103. }
  104. // 事务
  105. session := engine.NewSession()
  106. defer session.Close()
  107. // add Begin() before any action
  108. if err := session.Begin(); err != nil {
  109. logger.GetLogger().Errorf("Thjsignin failed: %s", err.Error())
  110. return errors.New("数据错误")
  111. }
  112. // 判断用户积分表是否已经存在此用户
  113. curscore := 0
  114. t := Thjuserscore{USERID: r.USERID}
  115. has, err := session.Exist(t)
  116. if err != nil {
  117. session.Rollback()
  118. logger.GetLogger().Errorf("Thjsignin failed: %s", err.Error())
  119. return errors.New("数据错误")
  120. }
  121. if has {
  122. // 更新积分
  123. curscore = int(t.CURSCORE)
  124. t.CURSCORE += int64(c.PARMA1)
  125. t.UPDATETIME = time.Now()
  126. _, err = session.Update(&t)
  127. if err != nil {
  128. session.Rollback()
  129. logger.GetLogger().Errorf("Thjsignin failed: %s", err.Error())
  130. return errors.New("数据错误")
  131. }
  132. } else {
  133. // 新增用户积分记录
  134. t.CURSCORE = int64(c.PARMA1)
  135. t.UPDATETIME = time.Now()
  136. _, err = session.Insert(&t)
  137. if err != nil {
  138. session.Rollback()
  139. logger.GetLogger().Errorf("Thjsignin failed: %s", err.Error())
  140. return errors.New("数据错误")
  141. }
  142. }
  143. // 记录积分流水
  144. q := Thjuserscorelog{}
  145. seqMap, err := session.QueryString("SELECT SEQ_THJ_USERSCORELOG.nextval SEQID FROM dual")
  146. if err != nil {
  147. session.Rollback()
  148. logger.GetLogger().Errorf("Thjsignin failed: %s", err.Error())
  149. return errors.New("数据错误")
  150. }
  151. if len(seqMap) <= 0 {
  152. session.Rollback()
  153. return errors.New("获取自增ID错误")
  154. }
  155. seqID, _ := strconv.Atoi(seqMap[0]["SEQID"])
  156. q.AUTOID = int64(seqID)
  157. q.USERID = r.USERID
  158. q.SCORECONFIGTYPE = 2 // 2:签到送积分
  159. q.SCORE = float64(c.PARMA1)
  160. q.ORISCORE = float64(curscore)
  161. q.CURSCORE = float64(t.CURSCORE)
  162. q.CREATETIME = time.Now()
  163. _, err = session.Insert(&q)
  164. if err != nil {
  165. session.Rollback()
  166. logger.GetLogger().Errorf("Thjsignin failed: %s", err.Error())
  167. return errors.New("数据错误")
  168. }
  169. // add Commit() after all actions
  170. return session.Commit()
  171. }