common.go 69 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739
  1. package models
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "encoding/json"
  6. "errors"
  7. "fmt"
  8. "mtp2_if/db"
  9. "mtp2_if/mtpcache"
  10. "mtp2_if/utils"
  11. "net/http"
  12. "strconv"
  13. "strings"
  14. "time"
  15. )
  16. // Funcmenulist 功能菜单表
  17. type Funcmenulist struct {
  18. Resourcecode string `json:"resourcecode" xorm:"'RESOURCECODE'" binding:"required"` // 资源代码
  19. Resourcename string `json:"resourcename" xorm:"'RESOURCENAME'"` // 资源名
  20. Resourcelevel uint32 `json:"resourcelevel" xorm:"'RESOURCELEVEL'"` // 级别 1-一级 2-二级 3-三级 4-四级
  21. Menutype uint32 `json:"menutype" xorm:"'MENUTYPE'"` // 菜单类型 1-管理端 2-交易端 3-终端权限
  22. Parentcode string `json:"parentcode" xorm:"'PARENTCODE'"` // 上级资源代码
  23. URL string `json:"url" xorm:"'URL'"` // URL
  24. Sort uint32 `json:"sort" xorm:"'SORT'"` // 排序 - 一级时,是所有一级菜单的排序顺序;二级时是所属同一个一级菜单下的排序、三级时是同一个二级菜单下的排序
  25. Iconame string `json:"iconame" xorm:"'ICONAME'"` // 菜单图标
  26. Remark string `json:"remark" xorm:"'REMARK'"` // 备注
  27. }
  28. // TableName is FUNCMENULIST
  29. func (Funcmenulist) TableName() string {
  30. return "FUNCMENULIST"
  31. }
  32. // GetPCMenuList 获取PC版本功能菜单表
  33. func (t *Funcmenulist) GetPCMenuList(resourceCode, parentCode string) ([]Funcmenulist, error) {
  34. funcMenuLists := make([]Funcmenulist, 0)
  35. session := db.GetEngine().Table("FUNCMENULIST T").Where("T.MENUTYPE = 2")
  36. if len(resourceCode) != 0 {
  37. session = session.And("T.RESOURCECODE = ?", resourceCode)
  38. }
  39. if len(parentCode) != 0 {
  40. session = session.And("T.PARENTCODE = ?", parentCode)
  41. }
  42. if err := session.Find(&funcMenuLists); err != nil {
  43. return nil, err
  44. }
  45. return funcMenuLists, nil
  46. }
  47. // GetMenuList 获取指定类型的功能菜单表
  48. func (t *Funcmenulist) GetMenuList(menuType int) ([]Funcmenulist, error) {
  49. funcMenuLists := make([]Funcmenulist, 0)
  50. session := db.GetEngine().Table("FUNCMENULIST T").Where("T.MENUTYPE = ?", menuType)
  51. if err := session.Find(&funcMenuLists); err != nil {
  52. return nil, err
  53. }
  54. return funcMenuLists, nil
  55. }
  56. // Rolefuncmenu 角色菜单表
  57. type Rolefuncmenu struct {
  58. Roleid uint32 `json:"roleid" xorm:"'ROLEID'" binding:"required"` // 角色权限ID
  59. Resourcecode string `json:"resourcecode" xorm:"'RESOURCECODE'" binding:"required"` // 菜单代码
  60. }
  61. // TableName is ROLEFUNCMENU
  62. func (Rolefuncmenu) TableName() string {
  63. return "ROLEFUNCMENU"
  64. }
  65. // Tabledefine 列表定义表
  66. type Tabledefine struct {
  67. Tablekey string `json:"tablekey" xorm:"'TABLEKEY'" binding:"required"` // 列表Key
  68. Tabletype uint32 `json:"tabletype" xorm:"'TABLETYPE'"` // 列表类型 - 1:管理端 2:终端
  69. Tablename string `json:"tablename" xorm:"'TABLENAME'"` // 列表名称
  70. Tabelmenu string `json:"tabelmenu" xorm:"'TABELMENU'"` // 列表菜单
  71. Remark string `json:"remark" xorm:"'REMARK'"` // Remark
  72. }
  73. // TableName is TABLEDEFINE
  74. func (Tabledefine) TableName() string {
  75. return "TABLEDEFINE"
  76. }
  77. // Tablecolumnconfig 列表表头配置表
  78. type Tablecolumnconfig struct {
  79. Autoid uint64 `json:"autoid" xorm:"'AUTOID'" binding:"required"` // AutoID
  80. Tablekey string `json:"tablekey" xorm:"'TABLEKEY'"` // 列表Key
  81. Columnfield string `json:"columnfield" xorm:"'COLUMNFIELD'"` // 列字段
  82. Columntitle string `json:"columntitle" xorm:"'COLUMNTITLE'"` // 列Title
  83. Columnwidth string `json:"columnwidth" xorm:"'COLUMNWIDTH'"` // 列宽
  84. Orderindex uint32 `json:"orderindex" xorm:"'ORDERINDEX'"` // 顺序
  85. Isshow uint32 `json:"isshow" xorm:"'ISSHOW'"` // 是否显示 - 0:不显示 1:显示
  86. Aligntype uint32 `json:"aligntype" xorm:"'ALIGNTYPE'"` // 对齐方式 - 1:居中对齐 2:左对齐 3:右对齐
  87. Formattertype string `json:"formattertype" xorm:"'FORMATTERTYPE'"` // 格式化类型
  88. Formatterstring string `json:"formatterstring" xorm:"'FORMATTERSTRING'"` // 格式化字符
  89. Remark string `json:"remark" xorm:"'REMARK'"` // 备注
  90. Needsummary uint32 `json:"needsummary" xorm:"'NEEDSUMMARY'"` // 是否需要汇总 - 0:不需要 1:需要
  91. Summarytype uint32 `json:"summarytype" xorm:"'SUMMARYTYPE'"` // 汇总类型 - 1:加总 2:最后一个
  92. Groupname string `json:"groupname" xorm:"'GROUPNAME'"` // 表头分组名称
  93. ISMERGE int32 `json:"ismerge" xorm:"ISMERGE"` // 是否合并显示 - 0:不合并 1:合并
  94. FIXED string `json:"fixed" xorm:"FIXED"` // 固定类型 - 空 | left | right
  95. }
  96. // TableName is TABLECOLUMNCONFIG
  97. func (Tablecolumnconfig) TableName() string {
  98. return "TABLECOLUMNCONFIG"
  99. }
  100. // Enumdicitem 枚举项字典表
  101. type Enumdicitem struct {
  102. Autoid int64 `json:"-" xorm:"'AUTOID'" binding:"required"` // 自增ID
  103. Enumdicid int32 `json:"-" xorm:"'ENUMDICID'" binding:"required"` // 所属枚举ID
  104. Enumdiccode string `json:"enumdiccode" xorm:"'ENUMDICCODE'" binding:"required"` // 所属枚举代码
  105. Enumdicname string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 枚举项名称
  106. Enumitemname int64 `json:"enumitemname" xorm:"'ENUMITEMNAME'" binding:"required"` // 枚举项值
  107. Enumitemstatus int32 `json:"enumitemstatus" xorm:"'ENUMITEMSTATUS'"` // 枚举项状态 - 1.启用 2.不启用
  108. Bankmappedvalue string `json:"-" xorm:"'BANKMAPPEDVALUE'"` // 银行服务对应值
  109. Remark string `json:"-" xorm:"'REMARK'"` // 备注
  110. Enumitemvalue string `json:"enumitemvalue" xorm:"'ENUMITEMVALUE'"` // 通用值 - [币种通用简写]
  111. Param1 string `json:"param1" xorm:"'PARAM1'"` // 参数1[币种:币种小数位]
  112. Param2 string `json:"param2" xorm:"'PARAM2'"` // 参数1[币种:币种显示单位]
  113. EnumdicnameEn string `json:"enumdicnameen" xorm:"'ENUMDICNAMEEN'"` // 枚举项名称 - 英文
  114. EnumdicnameZh_Tw string `json:"enumdicnamezh_tw" xorm:"'ENUMDICNAMEZH_TW'"` // 枚举项名称 - 繁体
  115. EnumdicnameTh string `json:"enumdicnameth" xorm:"'ENUMDICNAMETH'"` // 枚举项名称 - 泰文
  116. EnumdicnameVi string `json:"enumdicnamevi" xorm:"'ENUMDICNAMEVI'"` // 枚举项名称 - 越南语
  117. }
  118. // TableName is ENUMDICITEM
  119. func (Enumdicitem) TableName() string {
  120. return "ENUMDICITEM"
  121. }
  122. // Noticemsg 公告消息表
  123. type Noticemsg struct {
  124. Autoid int32 `json:"autoid" xorm:"'AUTOID'" binding:"required"` // 自增ID
  125. Msgtype int32 `json:"msgtype" xorm:"'MSGTYPE'"` // 消息类型 - 1:公告通知 2:系统消息 3:商品到期提货通知
  126. Title string `json:"title" xorm:"'TITLE'"` // 标题
  127. // Content string `json:"content" xorm:"'CONTENT'"` // 内容
  128. Scheduletime time.Time `json:"-" xorm:"'SCHEDULETIME'"` // 计划发送时间
  129. Publisher string `json:"publisher" xorm:"'PUBLISHER'"` // 消息发布者
  130. Sendtype int32 `json:"-" xorm:"'SENDTYPE'"` // 推送方式 - 1:全体广播 2:按会员广播 3:个人推送 4:按会员广播(仅会员)
  131. Userid int64 `json:"-" xorm:"'USERID'"` // 会员/投资者ID推送方式 为 个人时,填写投资者ID
  132. Istop int32 `json:"istop" xorm:"'ISTOP'"` // 是否置顶 - 0:不置顶 1:置顶
  133. Sentstatus int32 `json:"sentstatus" xorm:"'SENTSTATUS'"` // 推送状态 - 0:未推送 1:已推送 2:审核拒绝
  134. Endtime time.Time `json:"-" xorm:"'ENDTIME'"` // 结束时间
  135. Creatorid int64 `json:"-" xorm:"'CREATORID'"` // 建仓人
  136. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  137. Auditoruserid int64 `json:"-" xorm:"'AUDITORUSERID'"` // 审核人
  138. Audittime time.Time `json:"-" xorm:"'AUDITTIME'"` // 审核日期
  139. Auditremark string `json:"-" xorm:"'AUDITREMARK'"` // 审核备注
  140. Msgiconurl string `json:"msgiconurl" xorm:"'MSGICONURL'"` // 消息图标Url
  141. IsforceDisplay int32 `json:"isforcedisplay" xorm:"'ISFORCEDISPLAY'"` // 是否强制显示 - 0:不强制 1:强制
  142. Content string `json:"content" xorm:"'CONTENT2'"` // 内容 - 返回content2
  143. TitleEn string `json:"titleen" xorm:"TITLEEN"` // 标题(英文)
  144. TitleTw string `json:"titletw" xorm:"TITLETW"` // 标题(繁体)
  145. TitleTh string `json:"titleth" xorm:"TITLETH"` // 标题(泰文)
  146. TitleVi string `json:"titlevi" xorm:"TITLEVI"` // 标题(越南语)
  147. ContentEn string `json:"contenten" xorm:"'CONTENT2EN'"` // 内容 - 返回content2(英文)
  148. ContentTw string `json:"contenttw" xorm:"'CONTENT2TW'"` // 内容 - 返回content2(繁体)
  149. ContentTh string `json:"contentth" xorm:"'CONTENT2TH'"` // 内容 - 返回content2(泰文)
  150. ContentVi string `json:"contentvi" xorm:"'CONTENT2VI'"` // 内容 - 返回content2(越南语)
  151. }
  152. // TableName is NOTICEMSG
  153. func (Noticemsg) TableName() string {
  154. return "NOTICEMSG"
  155. }
  156. // Memberrecv 会员消息接受表
  157. type Memberrecv struct {
  158. Msgid int32 `json:"msgid" xorm:"'MSGID'" binding:"required"` // 消息ID
  159. Memberid int64 `json:"memberid" xorm:"'MEMBERID'" binding:"required"` // 会员用户ID
  160. }
  161. // TableName is MEMBERRECV
  162. func (Memberrecv) TableName() string {
  163. return "MEMBERRECV"
  164. }
  165. // Msgreceiver 管理端消息接收者
  166. type Msgreceiver struct {
  167. Autoid int32 `json:"autoid" xorm:"'AUTOID'" binding:"required"` // 消息ID
  168. Managerid int64 `json:"managerid" xorm:"'MANAGERID'" binding:"required"` // 用户ID
  169. Readstatus int32 `json:"readstatus" xorm:"'READSTATUS'" binding:"required"` // 消息状态 - 1:未阅读 2:已阅读 3:已删除
  170. Receivertype int32 `json:"receivertype" xorm:"'RECEIVERTYPE'" binding:"required"` // 接收用户类型 - 1:管理端用户 2:终端用户
  171. Updatetime time.Time `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  172. }
  173. // TableName is MSGRECEIVER
  174. func (Msgreceiver) TableName() string {
  175. return "MSGRECEIVER"
  176. }
  177. // Division 行政区域表
  178. type Division struct {
  179. Autoid int64 `json:"autoid" xorm:"'AUTOID'" binding:"required"` // 自增ID
  180. Divisioncode string `json:"divisioncode" xorm:"'DIVISIONCODE'" binding:"required"` // 行政代码
  181. Shortcode string `json:"shortcode" xorm:"'SHORTCODE'"` // 地区简码
  182. Parentcode string `json:"parentcode" xorm:"'PARENTCODE'"` // 上级行政代码
  183. Divisionlevel string `json:"divisionlevel" xorm:"'DIVISIONLEVEL'"` // 行政级别
  184. Divisionname string `json:"divisionname" xorm:"'DIVISIONNAME'"` // 行政名称
  185. Pathname string `json:"pathname" xorm:"'PATHNAME'"` // 路径名称
  186. Separablename string `json:"separablename" xorm:"'SEPARABLENAME'"` // 可拆分的全称
  187. Postcode string `json:"postcode" xorm:"'POSTCODE'"` // 邮政编码
  188. Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  189. Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人
  190. }
  191. // TableName is DIVISION
  192. func (Division) TableName() string {
  193. return "DIVISION"
  194. }
  195. // Szdz2imageconfig 终端图片配置 - 通用功能
  196. type Szdz2imageconfig struct {
  197. Configid int64 `json:"configid" xorm:"'CONFIGID'" binding:"required"` // 配置ID(SEQ_SZDZ2_IMAGECONFIG)
  198. Imagetype int32 `json:"imagetype" xorm:"'IMAGETYPE'"` // 类型 - 1:首页轮播(移动) 2:我的(移动)
  199. Title string `json:"title" xorm:"'TITLE'"` // 标题
  200. Imagepath string `json:"imagepath" xorm:"'IMAGEPATH'"` // 图片
  201. URL string `json:"url" xorm:"'URL'"` // 链接(地址或商品ID)
  202. Sort int64 `json:"sort" xorm:"'SORT'"` // 排序
  203. Isshow int32 `json:"isshow" xorm:"'ISSHOW'"` // 是否展示 - 0:不展示 1:展示
  204. Createdate time.Time `json:"createdate" xorm:"'CREATEDATE'"` // 创建时间
  205. Creatorid int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
  206. Updatedate time.Time `json:"updatedate" xorm:"'UPDATEDATE'"` // 修改时间
  207. Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 操作人
  208. Areauserid int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构ID
  209. Urltype int32 `json:"urltype" xorm:"'URLTYPE'"` // 链接类型 - 1:直接地址 2:商品ID
  210. IMAGEDETAILPATH string `json:"imagedetailpath" xorm:"'IMAGEDETAILPATH'"` // 详情图片 [UrlType = 3时 有且必填,其它类型不需要]
  211. }
  212. // TableName is SZDZ2_IMAGECONFIG
  213. func (Szdz2imageconfig) TableName() string {
  214. return "SZDZ2_IMAGECONFIG"
  215. }
  216. // Errorcode 异常代码表
  217. type Errorcode struct {
  218. Errorid int64 `json:"errorid" xorm:"'ERRORID'" binding:"required"` // 异常ID
  219. Errorcode string `json:"errorcode" xorm:"'ERRORCODE'"` // 异常代码
  220. Modulecode string `json:"modulecode" xorm:"'MODULECODE'"` // 所属模块
  221. Operatecode string `json:"operatecode" xorm:"'OPERATECODE'"` // 所属操作
  222. Description string `json:"description" xorm:"'DESCRIPTION'"` // 异常描述
  223. }
  224. // TableName is ERRORCODE
  225. func (Errorcode) TableName() string {
  226. return "ERRORCODE"
  227. }
  228. // Systemparam 系统参数表
  229. type Systemparam struct {
  230. Paramcode string `json:"paramcode" xorm:"'PARAMCODE'" binding:"required"` // 参数代码
  231. Paramname string `json:"-" xorm:"'PARAMNAME'"` // 参数名
  232. Paramvalue string `json:"paramvalue" xorm:"'PARAMVALUE'"` // 参数值
  233. Paramtype int32 `json:"-" xorm:"'PARAMTYPE'"` // 参数类型 0-通用 1-管理端 2-终端 3-后台 4-商城
  234. Showflag int32 `json:"-" xorm:"'SHOWFLAG'"` // 是否显示0 不显示 1 显示
  235. Modifyflag int32 `json:"-" xorm:"'MODIFYFLAG'"` // 修改标志0 不允许修改 1 允许修改
  236. Serverip string `json:"-" xorm:"'SERVERIP'"` // 限制服务器IP,备份参数,现在界面不用显示0.0.0.0则无限制,是通用参数192.168.0.211 指定服务器的参数配置
  237. Userid int64 `json:"-" xorm:"'USERID'"` // 更新用户ID
  238. Loginid string `json:"-" xorm:"'LOGINID'"` // 更新用户账号,登录账号
  239. Updatetime time.Time `json:"-" xorm:"'UPDATETIME'"` // 更新时间
  240. Remark string `json:"-" xorm:"'REMARK'"` // 备注
  241. Paramvalue2 string `json:"paramvalue2" xorm:"'PARAMVALUE2'"` // 参数值(CLOB)
  242. Regexpress string `json:"-" xorm:"'REGEXPRESS'"` // 正则表达式
  243. }
  244. // TableName is SYSTEMPARAM
  245. func (Systemparam) TableName() string {
  246. return "SYSTEMPARAM"
  247. }
  248. // Ermcpmemberfuncmenu 企业成员菜单表
  249. type Ermcpmemberfuncmenu struct {
  250. Userid int64 `json:"userid" xorm:"'USERID'" binding:"required"` // 用户ID
  251. Roleid int32 `json:"roleid" xorm:"'ROLEID'" binding:"required"` // 角色权限ID(0-管理员 22-业务员 23-跟单员 24-交易员)
  252. Resourcecode string `json:"resourcecode" xorm:"'RESOURCECODE'" binding:"required"` // 菜单代码
  253. Modifysrc int32 `json:"modifysrc" xorm:"'MODIFYSRC'"` // 修改来源 - 1:管理端 2:终端
  254. Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  255. Modifyid int64 `json:"modifyid" xorm:"'MODIFYID'"` // 修改人
  256. Modifyremark string `json:"modifyremark" xorm:"'MODIFYREMARK'"` // 修改备注
  257. Isvalid int32 `json:"isvalid" xorm:"'ISVALID'"` // 是否有效 - 0:无效 1:有效
  258. }
  259. // TableName is ERMCP_MEMBERFUNCMENU
  260. func (Ermcpmemberfuncmenu) TableName() string {
  261. return "ERMCP_MEMBERFUNCMENU"
  262. }
  263. // QuotePrimaryMenu 报价牌一级分类菜单
  264. type QuotePrimaryMenu struct {
  265. Index int `json:"Index"` // 序号
  266. Key string `json:"Key"` // 键名
  267. Name string `json:"Name"` // 菜单名称
  268. SubTitleType int `json:"SubTitleType"` // 子菜单标题模式:0-市场名称;1-外部交易所名称
  269. TradeModes string `json:"TradeModes"` // 包含市场交易类型
  270. SubMenus []QuoteSecondaryMenu `json:"SubMenus"` // 子菜单
  271. }
  272. // QuoteSecondaryMenu 报价牌二级分类菜单
  273. type QuoteSecondaryMenu struct {
  274. Index int `json:"Index"` // 序号
  275. MarketID int `json:"MarketID"` // 市场ID
  276. TradeMode int `json:"TradeMode"` // 交易模式
  277. MenuTitle string `json:"MenuTitle" xorm:"'ExExchangeName'"` // 菜单标题(市场名称或外部交易所名称)
  278. GoodsGroupIDs []int `json:"GoodsGroupIDs"` // 商品组ID列表
  279. ExExchangeID int `json:"ExExchangeID" xorm:"'ExExchangeID'"` // 外部交易所ID
  280. ExExchangeCode string `json:"ExExchangeCode" xorm:"'ExExchangeCode'"` // 外部交易所代码
  281. }
  282. // OperationPrimaryMenu 一级功能菜单
  283. type OperationPrimaryMenu struct {
  284. Key string `json:"Key"` // 菜单KEY
  285. Label string `json:"Label"` // 菜单标题
  286. Children []OperationSecondaryMenu `json:"Children"` // 二级功能菜单
  287. }
  288. // OperationSecondaryMenu 二级功能菜单
  289. type OperationSecondaryMenu struct {
  290. Key string `json:"Key"` // 菜单KEY
  291. Label string `json:"Label"` // 菜单标题
  292. TabList []OperationTabMenu `json:"TabList"` // 三级功能菜单
  293. }
  294. // OperationTabMenu 三级功能菜单
  295. type OperationTabMenu struct {
  296. Key string `json:"Key"` // 菜单KEY
  297. Label string `json:"Label"` // 菜单标题
  298. }
  299. // GetQuoteMenu 获取行情报价牌分类菜单
  300. func GetQuoteMenu(loginID int) ([]QuotePrimaryMenu, error) {
  301. engine := db.GetEngine()
  302. rst := make([]QuotePrimaryMenu, 0)
  303. // 账户下有权限的市场ID列表
  304. var marketIDs []int
  305. // 获取账户类型 - 1:交易所 2:机构 3:会员子机构 4:经纪人 5:投资者 6:客户 (目前可能登录交易端的账号类型为 2 5)
  306. userAccount := new(Useraccount)
  307. has, err := engine.Join("INNER", "LOGINACCOUNT", "USERACCOUNT.UserID = LOGINACCOUNT.UserID").Where("LOGINACCOUNT.LoginID = ?", loginID).Get(userAccount)
  308. if err != nil || !has {
  309. return nil, err
  310. }
  311. if userAccount.Usertype == 5 {
  312. // 如果账户类型为5(投资者),则需要通过其所属经济会员来获取市场权限(表:AreaRoleMarket, 条件:对应市场状态为正常;角色类型:经济会员)
  313. if err := engine.Table("AREAROLEMARKET").
  314. Cols("AREAROLEMARKET.MARKETID").
  315. Join("INNER", "MARKET", "MARKET.MARKETID = AREAROLEMARKET.MARKETID").
  316. Where("MARKET.MARKETSTATUS = 2 and AREAROLEMARKET.ROLETYPE = 7 and AREAROLEMARKET.AREAUSERID = ?", userAccount.Memberuserid).Find(&marketIDs); err != nil {
  317. return nil, err
  318. }
  319. } else {
  320. // 非投资者账号直接通过资金账号获取市场权限(表:TAAccountMarket)
  321. var taAccounts []string // 账户下所有资金账户
  322. // 先要获取当前登录账户对应的资金账户;如果为外部子资金账号(TaAccount.TaAccountType = 1),则使用TaAccount.FromAccountID来获取市场权限
  323. type taAccount struct {
  324. AccountID int `xorm:"ACCOUNTID"`
  325. TaAccountType int `xorm:"TAACCOUNTTYPE"`
  326. FromAccountID int `xorm:"FROMACCOUNTID"`
  327. }
  328. datas := make([]taAccount, 0)
  329. if err := engine.Table("LOGINTAACCOUNT").
  330. Join("INNER", "TAACCOUNT", "LOGINTAACCOUNT.ACCOUNTID = TAACCOUNT.ACCOUNTID").
  331. Cols("TAACCOUNT.ACCOUNTID", "TAACCOUNT.TAACCOUNTTYPE", "TAACCOUNT.FROMACCOUNTID").
  332. Where("LOGINTAACCOUNT.LOGINID = ?", loginID).Find(&datas); err != nil {
  333. return nil, err
  334. }
  335. // 如果一条记录都没有(未配置自营会员资金账户)则直接通过资金账户表获取
  336. if len(datas) == 0 {
  337. // 这里要注意,TaAccount表与LoginAccount表关联时,要使用TaAccount.RelatedUserID
  338. if err := engine.Table("TAACCOUNT").
  339. Join("INNER", "LOGINACCOUNT", "TAACCOUNT.RELATEDUSERID = LOGINACCOUNT.USERID").
  340. Cols("TAACCOUNT.ACCOUNTID", "TAACCOUNT.TAACCOUNTTYPE", "TAACCOUNT.FROMACCOUNTID").
  341. Where("LOGINACCOUNT.LOGINID = ?", loginID).Find(&datas); err != nil {
  342. return nil, err
  343. }
  344. }
  345. for _, v := range datas {
  346. if v.TaAccountType == 1 {
  347. // 外部资金账户使用TaAccount.FromAccountID来获取市场权限
  348. taAccounts = append(taAccounts, strconv.Itoa(v.FromAccountID))
  349. } else {
  350. taAccounts = append(taAccounts, strconv.Itoa(v.AccountID))
  351. }
  352. }
  353. // 获取资金账户对应的市场权限(有权限的市场ID)
  354. if len(taAccounts) > 0 {
  355. // taAccountStr := strings.Join(taAccounts, ",")
  356. if err := engine.Table("TAACCOUNTMARKET").
  357. Join("INNER", "MARKET", "MARKET.MARKETID = TAACCOUNTMARKET.MARKETID").
  358. Cols("TAACCOUNTMARKET.MARKETID").
  359. In("TAACCOUNTMARKET.ACCOUNTID", taAccounts).
  360. And("MARKET.MARKETSTATUS = 2").Find(&marketIDs); err != nil {
  361. return nil, err
  362. }
  363. }
  364. }
  365. // ********************* 构建行情报价牌菜单 *********************
  366. datas := make([]Funcmenulist, 0)
  367. if err := engine.Join("INNER", "ROLEFUNCMENU", "FUNCMENULIST.RESOURCECODE = ROLEFUNCMENU.RESOURCECODE").
  368. Where("FUNCMENULIST.PARENTCODE = 'trader_master_menu'").
  369. Asc("SORT").
  370. Find(&datas); err != nil {
  371. return nil, err
  372. }
  373. // 构建一级菜单对象
  374. for i, v := range datas {
  375. quotePrimaryMenu := QuotePrimaryMenu{
  376. Index: i,
  377. Key: v.Resourcecode,
  378. Name: v.Resourcename,
  379. SubMenus: make([]QuoteSecondaryMenu, 0),
  380. }
  381. // 跳过自选
  382. if v.Resourcecode == "optional" {
  383. rst = append(rst, quotePrimaryMenu)
  384. continue
  385. }
  386. // URL:模式,0-使用市场名称,1-使用外部交易所名称;Remark:包含市场交易模式
  387. quotePrimaryMenu.SubTitleType, _ = strconv.Atoi(v.URL)
  388. quotePrimaryMenu.TradeModes = v.Remark
  389. // 如果传入的LoginID获取不到有权限的市场ID列表(有可能LoginID是错误的),则不构建二级子菜单
  390. if len(marketIDs) == 0 {
  391. rst = append(rst, quotePrimaryMenu)
  392. continue
  393. }
  394. // 构建二级子菜单对象
  395. marketIDsStr := utils.JoinItoString(marketIDs, ",")
  396. if quotePrimaryMenu.SubTitleType == 0 {
  397. // 获取目标交易模式的市场信息
  398. markets := make([]Market, 0)
  399. if err := engine.Where(fmt.Sprintf(`TradeMode in (%s) and MarketID in (%s)`, quotePrimaryMenu.TradeModes, marketIDsStr)).Find(&markets); err != nil {
  400. return nil, err
  401. }
  402. // 使用市场名称
  403. for mi, mv := range markets {
  404. quoteSecondaryMenu := QuoteSecondaryMenu{
  405. Index: mi,
  406. MarketID: int(mv.MARKETID),
  407. TradeMode: int(mv.TRADEMODE),
  408. MenuTitle: mv.MARKETNAME,
  409. GoodsGroupIDs: make([]int, 0),
  410. }
  411. quotePrimaryMenu.SubMenus = append(quotePrimaryMenu.SubMenus, quoteSecondaryMenu)
  412. }
  413. } else {
  414. // 使用外部交易所名称
  415. quoteSecondaryMenus := make([]QuoteSecondaryMenu, 0)
  416. sql := fmt.Sprintf(`select distinct
  417. e.autoid ExExchangeID,
  418. e.ExExchangeName,
  419. e.ExExchangeCode
  420. from ExternalExchange e
  421. inner join goodsgroup g on g.exexchangeid = e.autoid
  422. inner join Market m on g.marketid = m.marketid
  423. where m.trademode in (%s) and m.marketid in (%s)`, quotePrimaryMenu.TradeModes, marketIDsStr)
  424. if err := engine.SQL(sql).Find(&quoteSecondaryMenus); err != nil {
  425. return nil, err
  426. }
  427. // 获取外部交易所对应的商品组信息
  428. for ei, ev := range quoteSecondaryMenus {
  429. q := &quoteSecondaryMenus[ei]
  430. q.Index = ei
  431. // 商品组列表
  432. goodsgroups := make([]Goodsgroup, 0)
  433. if err := engine.Where("Exexchangeid = ?", ev.ExExchangeID).Find(&goodsgroups); err != nil {
  434. return nil, err
  435. }
  436. marketID := 0
  437. var goodsGroupIDs []int
  438. for _, gv := range goodsgroups {
  439. marketID = int(gv.Marketid)
  440. goodsGroupIDs = append(goodsGroupIDs, int(gv.Goodsgroupid))
  441. }
  442. q.MarketID = marketID
  443. q.GoodsGroupIDs = goodsGroupIDs
  444. }
  445. quotePrimaryMenu.SubMenus = quoteSecondaryMenus
  446. }
  447. rst = append(rst, quotePrimaryMenu)
  448. }
  449. return rst, nil
  450. }
  451. // GetOperationMenu 获取功能菜单
  452. func GetOperationMenu() ([]OperationPrimaryMenu, error) {
  453. engine := db.GetEngine()
  454. rst := make([]OperationPrimaryMenu, 0)
  455. // 获取一级功能菜单
  456. opm := make([]Funcmenulist, 0)
  457. if err := engine.Join("INNER", "ROLEFUNCMENU", "FUNCMENULIST.RESOURCECODE = ROLEFUNCMENU.RESOURCECODE").
  458. Where("FUNCMENULIST.PARENTCODE = 'trader_operation_master_menu'").
  459. Asc("SORT").
  460. Find(&opm); err != nil {
  461. return nil, err
  462. }
  463. for _, pv := range opm {
  464. var operationPrimaryMenu = OperationPrimaryMenu{
  465. Key: pv.Resourcecode,
  466. Label: pv.Resourcename,
  467. Children: make([]OperationSecondaryMenu, 0),
  468. }
  469. // 获取二级功能菜单
  470. osm := make([]Funcmenulist, 0)
  471. if err := engine.Join("INNER", "ROLEFUNCMENU", "FUNCMENULIST.RESOURCECODE = ROLEFUNCMENU.RESOURCECODE").
  472. Where("FUNCMENULIST.PARENTCODE = ?", operationPrimaryMenu.Key).
  473. Asc("SORT").
  474. Find(&osm); err != nil {
  475. return nil, err
  476. }
  477. for _, sv := range osm {
  478. var operationSecondaryMenu = OperationSecondaryMenu{
  479. Key: sv.Resourcecode,
  480. Label: sv.Resourcename,
  481. TabList: make([]OperationTabMenu, 0),
  482. }
  483. // 获取三级功能菜单
  484. otm := make([]Funcmenulist, 0)
  485. if err := engine.Join("INNER", "ROLEFUNCMENU", "FUNCMENULIST.RESOURCECODE = ROLEFUNCMENU.RESOURCECODE").
  486. Where("FUNCMENULIST.PARENTCODE = ?", operationSecondaryMenu.Key).
  487. Asc("SORT").
  488. Find(&otm); err != nil {
  489. return nil, err
  490. }
  491. for _, tv := range otm {
  492. var operationTabMenu = OperationTabMenu{
  493. Key: tv.Resourcecode,
  494. Label: tv.Resourcename,
  495. }
  496. operationSecondaryMenu.TabList = append(operationSecondaryMenu.TabList, operationTabMenu)
  497. }
  498. operationPrimaryMenu.Children = append(operationPrimaryMenu.Children, operationSecondaryMenu)
  499. }
  500. rst = append(rst, operationPrimaryMenu)
  501. }
  502. return rst, nil
  503. }
  504. // GetClientTableDefines 获取终端列表定义信息
  505. func GetClientTableDefines(tableKey string, tableType int) ([]Tabledefine, error) {
  506. engine := db.GetEngine()
  507. tableDefiles := make([]Tabledefine, 0)
  508. s := engine.Table("TABLEDEFINE")
  509. if tableType != 0 {
  510. s = s.Where("TABLEDEFINE.TableType = ?", tableType)
  511. }
  512. if len(tableKey) > 0 {
  513. s = s.And("TABLEDEFINE.TableKey = ?", tableKey)
  514. }
  515. if err := s.Find(&tableDefiles); err != nil {
  516. return nil, err
  517. }
  518. return tableDefiles, nil
  519. }
  520. // GetClientTableColumns 获取客户端指定表的列头信息
  521. // tableKey 列表Key
  522. func GetClientTableColumns(tableKey string, tableType int) ([]Tablecolumnconfig, error) {
  523. engine := db.GetEngine()
  524. // 获取列表数据 2 - H5; 3 - APP
  525. tablecolumnconfigs := make([]Tablecolumnconfig, 0)
  526. // 这里的表名必须要大写 (Oracle的表名都是大写)
  527. if err := engine.Join("INNER", "TABLEDEFINE", "TABLEDEFINE.TableKey = TABLECOLUMNCONFIG.TableKey").
  528. Where("TABLEDEFINE.TableType = ?", tableType).And("TABLEDEFINE.TableKey = ?", tableKey).OrderBy("TABLECOLUMNCONFIG.ORDERINDEX").Find(&tablecolumnconfigs); err != nil {
  529. return nil, err
  530. }
  531. return tablecolumnconfigs, nil
  532. }
  533. // GetNotices 获取指定账户的通知信息(终端)
  534. // 参数 loginID int 登录账号
  535. // 参数 msgType int 消息类型 - 1:公告通知 2:系统消息
  536. // 参数 onlyUnRead bool 是否只获取未读信息
  537. func GetNotices(loginID, msgType int, onlyUnRead bool) ([]Noticemsg, error) {
  538. engine := db.GetEngine()
  539. rst := make([]Noticemsg, 0)
  540. // 获取登录账号所属会员信息
  541. var userAccount Useraccount
  542. if has, _ := engine.Join("LEFT", "LOGINACCOUNT", "LOGINACCOUNT.USERID = USERACCOUNT.USERID").
  543. Where("LOGINACCOUNT.LOGINID = ?", loginID).Get(&userAccount); !has {
  544. return nil, errors.New("获取登录账号所属会员ID失败")
  545. }
  546. // 获取登录账号已读公告ID, 这里要使用的是个人的UserID来查询
  547. var msgReceivers []int
  548. engine.Table("MSGRECEIVER").Select("AUTOID").Where("RECEIVERTYPE = 2 and MANAGERID = ?", userAccount.Userid).Find(&msgReceivers)
  549. // 查询SENDTYPE = 1的数据
  550. datas1 := make([]Noticemsg, 0)
  551. s := engine.Where("SENDTYPE = 1 and SYSDATE > SCHEDULETIME and SYSDATE < ENDTIME and SENTSTATUS=1").
  552. And("PUBLISHER = ? or PUBLISHER in (select USERACCOUNT.USERID from USERACCOUNT where USERACCOUNT.USERTYPE = 1)", userAccount.Memberuserid)
  553. if msgType > 0 {
  554. s = s.And("MSGTYPE = ?", msgType)
  555. }
  556. if onlyUnRead && len(msgReceivers) > 0 {
  557. s = s.NotIn("AUTOID", msgReceivers)
  558. }
  559. if err := s.Find(&datas1); err != nil {
  560. // 查询失败
  561. return nil, err
  562. }
  563. rst = append(rst, datas1...)
  564. // 查询SENDTYPE = 2的数据
  565. datas2 := make([]Noticemsg, 0)
  566. s = engine.Where(fmt.Sprintf(`AUTOID in (select MEMBERRECV.MSGID from MEMBERRECV where MEMBERRECV.MEMBERID = %d)`, userAccount.Memberuserid)).
  567. And("SENDTYPE = 2 and SYSDATE > SCHEDULETIME and SYSDATE < ENDTIME and SENTSTATUS=1")
  568. if msgType > 0 {
  569. s = s.And("MSGTYPE = ?", msgType)
  570. }
  571. if onlyUnRead && len(msgReceivers) > 0 {
  572. s = s.NotIn("AUTOID", msgReceivers)
  573. }
  574. if err := s.Find(&datas2); err != nil {
  575. // 查询失败
  576. return nil, err
  577. }
  578. rst = append(rst, datas2...)
  579. // 查询SENDTYPE = 3的数据
  580. datas3 := make([]Noticemsg, 0)
  581. s = engine.Where(fmt.Sprintf(`USERID = (SELECT USERID FROM LOGINACCOUNT WHERE LOGINID = %d)`, loginID)).
  582. And("SENDTYPE = 3 and SYSDATE > SCHEDULETIME and SYSDATE < ENDTIME and SENTSTATUS=1")
  583. if msgType > 0 {
  584. s = s.And("MSGTYPE = ?", msgType)
  585. }
  586. if onlyUnRead && len(msgReceivers) > 0 {
  587. s = s.NotIn("AUTOID", msgReceivers)
  588. }
  589. if err := s.Find(&datas3); err != nil {
  590. // 查询失败
  591. return nil, err
  592. }
  593. rst = append(rst, datas3...)
  594. return rst, nil
  595. }
  596. // GetEnumDicItem 获取枚举信息数组
  597. // 参数 enumDicCode string 所属枚举代码,必填
  598. // 参数 enumItemName int 枚举项值,选填,不需要则传入0
  599. // 返回 []Enumdicitem 枚举信息数组
  600. // 返回 error error
  601. func GetEnumDicItem(enumDicCode string, enumItemName int) ([]Enumdicitem, error) {
  602. engine := db.GetEngine()
  603. enumDicItems := make([]Enumdicitem, 0)
  604. session := engine.Table("ENUMDICITEM E").
  605. Join("LEFT", "ENUMDICITEMEX EX", "E.ENUMDICCODE = EX.ENUMDICCODE AND E.ENUMITEMNAME = EX.ENUMITEMNAME").
  606. Select("E.*, EX.ENUMDICNAMEEN, EX.ENUMDICNAMEZH_TW, EX.ENUMDICNAMETH,EX.ENUMDICNAMEVI").
  607. Where("E.ENUMDICCODE = ?", enumDicCode)
  608. if enumItemName > 0 {
  609. session = session.And("E.ENUMITEMNAME = ?", enumItemName)
  610. }
  611. if err := session.Find(&enumDicItems); err != nil {
  612. return nil, err
  613. }
  614. return enumDicItems, nil
  615. }
  616. // GetEnums 获取所有枚举信息
  617. func GetEnums(autoID int) ([]Enumdicitem, error) {
  618. engine := db.GetEngine()
  619. enumDicItems := make([]Enumdicitem, 0)
  620. session := engine.Table("ENUMDICITEM E").
  621. Join("LEFT", "ENUMDICITEMEX EX", "E.ENUMDICCODE = EX.ENUMDICCODE AND E.ENUMITEMNAME = EX.ENUMITEMNAME").
  622. Select("E.*, EX.ENUMDICNAMEEN, EX.ENUMDICNAMEZH_TW, EX.ENUMDICNAMETH,EX.ENUMDICNAMEVI")
  623. if autoID != 0 {
  624. session = session.Where("E.AUTOID > ?", autoID)
  625. }
  626. if err := session.OrderBy("E.AUTOID").Find(&enumDicItems); err != nil {
  627. return nil, err
  628. }
  629. return enumDicItems, nil
  630. }
  631. // GetProvincesAndCities 获取省市信息数组
  632. // 参数 provinceID int 省ID,选填
  633. // 返回 []Division 枚举信息数组
  634. // 返回 error error
  635. func GetProvincesAndCities(provinceID int) ([]Division, error) {
  636. engine := db.GetEngine()
  637. divisions := make([]Division, 0)
  638. session := engine.Where("DIVISIONLEVEL = 'province' or DIVISIONLEVEL = 'city'")
  639. if provinceID > 0 {
  640. session = session.And("AUTOID = ?", provinceID)
  641. }
  642. if err := session.Find(&divisions); err != nil {
  643. return nil, err
  644. }
  645. return divisions, nil
  646. }
  647. // GetDivisions 获取所有区域信息
  648. func GetDivisions() ([]Division, error) {
  649. engine := db.GetEngine()
  650. divisions := make([]Division, 0)
  651. if err := engine.Find(&divisions); err != nil {
  652. return nil, err
  653. }
  654. return divisions, nil
  655. }
  656. // GetImageConfigs 获取轮播图配置信息
  657. func GetImageConfigs(userId int64, imageType int) ([]Szdz2imageconfig, error) {
  658. engine := db.GetEngine()
  659. imageConfigs := make([]Szdz2imageconfig, 0)
  660. session := engine.Where("ISSHOW = 1")
  661. if userId > 0 {
  662. session = session.And("AREAUSERID = ?", mtpcache.GetAreaUserId(userId, 0))
  663. }
  664. if imageType > 0 {
  665. session = session.And("IMAGETYPE = ?", imageType)
  666. }
  667. session = session.Asc("SORT")
  668. if err := session.Find(&imageConfigs); err != nil {
  669. return nil, err
  670. }
  671. return imageConfigs, nil
  672. }
  673. // GetServerTime 获取服务器时间
  674. func GetServerTime() (*string, error) {
  675. engine := db.GetEngine()
  676. // rst, err := engine.QueryString("select sysdate from dual")
  677. rst, err := engine.QueryString(`select TO_CHAR(SYSDATE, 'YYYY-MM-DD"T"HH24:MI:SS') || (select sessiontimezone from dual) "SYSDATE" from dual`)
  678. if err != nil {
  679. return nil, err
  680. }
  681. if len(rst) > 0 {
  682. r := rst[0]["SYSDATE"]
  683. return &r, nil
  684. }
  685. return nil, nil
  686. }
  687. func GetServerTime2() (*string, error) {
  688. engine := db.GetEngine()
  689. rst, err := engine.QueryString("select sysdate from dual")
  690. if err != nil {
  691. return nil, err
  692. }
  693. if len(rst) > 0 {
  694. r := rst[0]["SYSDATE"]
  695. return &r, nil
  696. }
  697. return nil, nil
  698. }
  699. // QueryErrorInfosRsp 获取数据库错误信息模型
  700. type QueryErrorInfosRsp struct {
  701. Errorid int64 `json:"errorid" xorm:"'ERRORID'" binding:"required"` // 异常ID
  702. Errorcode string `json:"-" xorm:"'ERRORCODE'"` // 异常代码
  703. Modulecode string `json:"-" xorm:"'MODULECODE'"` // 所属模块
  704. Operatecode string `json:"-" xorm:"'OPERATECODE'"` // 所属操作
  705. Description string `json:"description" xorm:"'DESCRIPTION'"` // 异常描述
  706. Rownumber string `json:"-" xorm:"ROWNUMBER"` // 行号
  707. DescriptionEn string `json:"descriptionen" xorm:"'DESCRIPTIONEN'"` // 异常描述 - 英文
  708. DescriptionZh_Tw string `json:"descriptionzh_tw" xorm:"'DESCRIPTIONZH_TW'"` // 异常描述 - 繁体
  709. DescriptionTh string `json:"descriptionth" xorm:"'DESCRIPTIONTH'"` // 异常描述 - 泰文
  710. DescriptionVi string `json:"descriptionvi" xorm:"'DESCRIPTIONVI'"` // 异常描述 - 越南语
  711. }
  712. // GetErrorInfos 获取数据库错误信息
  713. func GetErrorInfos(rowNumber string) ([]QueryErrorInfosRsp, error) {
  714. engine := db.GetEngine()
  715. errorCodes := make([]QueryErrorInfosRsp, 0)
  716. session := engine.Table("ERRORCODE E").
  717. Join("LEFT", "ERRORCODEEX EX", "E.ERRORID = EX.ERRORID").
  718. Select("E.*, E.rowid ROWNUMBER, EX.DESCRIPTIONEN, EX.DESCRIPTIONZH_TW, EX.DESCRIPTIONTH, EX.DESCRIPTIONVI").Where("1 = 1")
  719. if len(rowNumber) != 0 {
  720. session = session.And("E.rowid > ?", rowNumber)
  721. }
  722. if err := session.Find(&errorCodes); err != nil {
  723. return nil, err
  724. }
  725. return errorCodes, nil
  726. }
  727. // GetTableUpdateTimeStamp 获取目标表最后记录变更时间
  728. func GetTableUpdateTimeStamp(tableName string) (*string, error) {
  729. engine := db.GetEngine()
  730. var timeStamp string
  731. if _, err := engine.SQL(fmt.Sprintf("SELECT to_char(SCN_TO_TIMESTAMP(MAX(ora_rowscn)), 'yyyy-MM-dd hh24:mi:ss') TIMESTAMP from %s", tableName)).
  732. Get(&timeStamp); err != nil {
  733. return nil, err
  734. }
  735. return &timeStamp, nil
  736. }
  737. // GetSystemParams 获取系统参数信息
  738. func GetSystemParams() ([]Systemparam, error) {
  739. systemParams := make([]Systemparam, 0)
  740. if err := db.GetEngine().Where("PARAMTYPE in (0,2)").Or("PARAMCODE in ('112','113')").Find(&systemParams); err != nil {
  741. return nil, err
  742. }
  743. return systemParams, nil
  744. }
  745. // GetSystemParam 获取系统参数信息
  746. func GetSystemParamsByCodes(paramcodes string) ([]Systemparam, error) {
  747. systemParams := make([]Systemparam, 0)
  748. if paramcodes != "" {
  749. session := db.GetEngine().Where("PARAMTYPE in (0,2,3)")
  750. s := strings.Split(paramcodes, ",")
  751. session = session.In("PARAMCODE", s)
  752. if err := session.Find(&systemParams); err != nil {
  753. return nil, err
  754. }
  755. } else {
  756. if err := db.GetEngine().Where("PARAMTYPE in (0,2)").Or("PARAMCODE in ('112','113')").Find(&systemParams); err != nil {
  757. return nil, err
  758. }
  759. }
  760. return systemParams, nil
  761. }
  762. // GetRoleFuncMenuLists 获取终端权限(交易所版本)
  763. func GetRoleFuncMenuLists(loginID int, resourceCode string) ([]Funcmenulist, error) {
  764. funcMenuLists := make([]Funcmenulist, 0)
  765. sql := fmt.Sprintf(`select F.* from FUNCMENULIST F where F.MENUTYPE = 3
  766. and
  767. F.RESOURCECODE in
  768. (select R.RESOURCECODE from ROLEFUNCMENU R
  769. inner join LOGINACCOUNT L on L.CLIENTROLEID = R.ROLEID where L.LOGINID = %d)`, loginID)
  770. if len(resourceCode) != 0 {
  771. sql += fmt.Sprintf(" and F.RESOURCECODE = '%s'", resourceCode)
  772. }
  773. if err := db.GetEngine().SQL(sql).Find(&funcMenuLists); err != nil {
  774. return nil, err
  775. }
  776. return funcMenuLists, nil
  777. }
  778. // GetErmcpRoleFuncMenuLists 获取终端权限(企业风管专用,区分企业和企业成员)
  779. func GetErmcpRoleFuncMenuLists(loginID int, resourceCode string) ([]Funcmenulist, error) {
  780. funcMenuLists := make([]Funcmenulist, 0)
  781. // 获取对应的Loginaccount信息
  782. var loginAccount Loginaccount
  783. has, err := db.GetEngine().Where("LOGINID = ?", loginID).Get(&loginAccount)
  784. if err != nil {
  785. return nil, err
  786. }
  787. if !has {
  788. return nil, errors.New("没有对应的登录用户信息")
  789. }
  790. // 获取对应的Useraccount信息
  791. var userAccount Useraccount
  792. has, err = db.GetEngine().Table("USERACCOUNT U").
  793. Join("INNER", "LOGINACCOUNT L", "L.USERID = U.USERID").
  794. Where("L.LOGINID = ?", loginID).Get(&userAccount)
  795. if err != nil {
  796. return nil, err
  797. }
  798. if !has {
  799. return nil, errors.New("没有对应的用户信息")
  800. }
  801. // 是否企业
  802. isEnterprise := false
  803. // 是否自营会员
  804. isTrader := false
  805. // 查询机构角色表
  806. var arearole Arearole
  807. arearoles, err := arearole.GetAreaRoles(int(userAccount.Userid), 0)
  808. if err != nil {
  809. return nil, err
  810. }
  811. for _, v := range arearoles {
  812. if v.Roletype == 6 {
  813. isTrader = true
  814. } else if v.Roletype == 20 {
  815. arearole = arearoles[0]
  816. if arearole.Suborgtype == 0 {
  817. isEnterprise = true
  818. }
  819. }
  820. }
  821. if userAccount.Usertype == 5 || (userAccount.Usertype == 2 && isTrader) {
  822. // 交易所,自营会员及投资者的权限不进行判断
  823. sql := "select F.* from FUNCMENULIST F where F.MENUTYPE = 4"
  824. if len(resourceCode) != 0 {
  825. sql += fmt.Sprintf(" and F.RESOURCECODE = '%s'", resourceCode)
  826. }
  827. if err := db.GetEngine().SQL(sql).Find(&funcMenuLists); err != nil {
  828. return nil, err
  829. }
  830. } else {
  831. // 判断是企业还是企业成员
  832. // 账户类型 - 1:交易所 2:机构 3:会员子机构 4:经纪人 5:投资者 6:客户 7:企业成员(云平台)
  833. if userAccount.Usertype == 2 && isEnterprise {
  834. // UserType=2:企业。原逻辑:根据LoginAccount表"ClientRoleID"查询”ERMCP_MemberFuncMenu“表中该用户对应角色的菜单权限
  835. sql := fmt.Sprintf(`select F.* from FUNCMENULIST F where F.MENUTYPE in (3,5)
  836. and
  837. F.RESOURCECODE in
  838. (select R.RESOURCECODE from ERMCP_MEMBERFUNCMENU R
  839. where R.ISVALID = 1 and R.USERID = %d and R.ROLEID = %d)`, loginAccount.Userid, loginAccount.Clientroleid)
  840. if len(resourceCode) != 0 {
  841. sql += fmt.Sprintf(" and F.RESOURCECODE = '%s'", resourceCode)
  842. }
  843. if err := db.GetEngine().SQL(sql).Find(&funcMenuLists); err != nil {
  844. return nil, err
  845. }
  846. } else if userAccount.Usertype == 6 || userAccount.Usertype == 7 || (userAccount.Usertype == 2 && !isEnterprise) {
  847. // UserType=7:企业成员
  848. // 查询本用户的角色ID - AreaRole表
  849. // 根据 Rootuserid 和 自己的角色查询 ERMCP_MemberFuncMenu 表中的菜单权限
  850. areaRoles := make([]Arearole, 0)
  851. if err := db.GetEngine().Where("USERID = ?", loginAccount.Userid).Find(&areaRoles); err != nil {
  852. return nil, err
  853. }
  854. if len(areaRoles) == 0 {
  855. // 无角色,返回空数组s
  856. return make([]Funcmenulist, 0), nil
  857. }
  858. // 构建RoleID列表
  859. roleIDs := ""
  860. for _, areaRole := range areaRoles {
  861. roleIDs += "," + strconv.Itoa(int(areaRole.Roletype))
  862. }
  863. if len(roleIDs) > 0 {
  864. roleIDs = roleIDs[1:]
  865. }
  866. sql := fmt.Sprintf(`select F.* from FUNCMENULIST F where F.MENUTYPE in (3,5)
  867. and
  868. F.RESOURCECODE in
  869. (select R.RESOURCECODE from ERMCP_MEMBERFUNCMENU R
  870. where R.ISVALID = 1 and R.USERID = %d and R.ROLEID in (%s))`, userAccount.Rootuserid, roleIDs)
  871. if len(resourceCode) != 0 {
  872. sql += fmt.Sprintf(" and F.RESOURCECODE = '%s'", resourceCode)
  873. }
  874. if err := db.GetEngine().SQL(sql).Find(&funcMenuLists); err != nil {
  875. return nil, err
  876. }
  877. } else {
  878. return nil, errors.New("错误的用户类型")
  879. }
  880. }
  881. return funcMenuLists, nil
  882. }
  883. // IsTrader 判断是否交易所,自营会员及投资者
  884. func IsTrader(loginID int) (bool, error) {
  885. // 获取对应的Loginaccount信息
  886. var loginAccount Loginaccount
  887. has, err := db.GetEngine().Where("LOGINID = ?", loginID).Get(&loginAccount)
  888. if err != nil {
  889. return false, err
  890. }
  891. if !has {
  892. return false, errors.New("没有对应的登录用户信息")
  893. }
  894. // 获取对应的Useraccount信息
  895. var userAccount Useraccount
  896. has, err = db.GetEngine().Table("USERACCOUNT U").
  897. Join("INNER", "LOGINACCOUNT L", "L.USERID = U.USERID").
  898. Where("L.LOGINID = ?", loginID).Get(&userAccount)
  899. if err != nil {
  900. return false, err
  901. }
  902. if !has {
  903. return false, errors.New("没有对应的用户信息")
  904. }
  905. // 是否自营会员
  906. isTrader := false
  907. // 查询机构角色表
  908. var arearole Arearole
  909. arearoles, err := arearole.GetAreaRoles(int(userAccount.Userid), 0)
  910. if err != nil {
  911. return false, err
  912. }
  913. for _, v := range arearoles {
  914. if v.Roletype == 6 {
  915. isTrader = true
  916. }
  917. }
  918. // 交易所,自营会员及投资者的权限不进行判断
  919. if userAccount.Usertype == 5 || (userAccount.Usertype == 2 && isTrader) {
  920. return true, nil
  921. }
  922. return false, nil
  923. }
  924. // NewFuncmenulist 功能菜单表
  925. type NewFuncmenulist struct {
  926. RESOURCECODE *string `json:"resourcecode" xorm:"RESOURCECODE" binding:"required"` // 资源代码
  927. RESOURCENAME *string `json:"resourcename" xorm:"RESOURCENAME"` // 资源名(Title)
  928. RESOURCELEVEL *int32 `json:"resourcelevel" xorm:"RESOURCELEVEL"` // 级别1-一级 2-二级 3-三级4-四级
  929. MENUTYPE *int32 `json:"menutype" xorm:"MENUTYPE"` // 菜单类型 - 1:管理端 2:PC(C#) 3:移动(云平台) 4:终端(交易所) 5:PC(云平台)
  930. PARENTCODE *string `json:"parentcode" xorm:"PARENTCODE"` // 上级资源代码
  931. URL *string `json:"url" xorm:"URL"` // Url
  932. SORT *int32 `json:"sort" xorm:"SORT"` // 排序
  933. ICONAME *string `json:"iconame" xorm:"ICONAME"` // 菜单图标
  934. REMARK *string `json:"remark" xorm:"REMARK"` // Remark
  935. AUTHTYPE *int32 `json:"authtype" xorm:"AUTHTYPE"` // 权限类型 - 1:菜单 2:组件 3:按钮
  936. URLTYPE *int32 `json:"urltype" xorm:"URLTYPE"` // 地址类型 - 1:路由 2:外链 3:内联框架
  937. COMPONENT *string `json:"component" xorm:"COMPONENT"` // 组件名或组件地址
  938. BUTTONTYPE *string `json:"buttontype" xorm:"BUTTONTYPE"` // 按钮类型 - 存按钮样式
  939. HIDDEN *int32 `json:"hidden" xorm:"HIDDEN"` // 是否隐藏 - 0:显示 1:隐藏
  940. BUTTONNAME *string `json:"buttonname" xorm:"BUTTONNAME"` // 按钮名称
  941. }
  942. type NewFuncmenulistReq struct {
  943. RESOURCECODE string `form:"resourcecode"` // 资源代码
  944. PARENTCODE string `form:"parentcode"` // 上级资源代码
  945. RESOURCENAME string `form:"resourcename"` // 资源名(Title), 模糊查询
  946. MENUTYPE string `form:"menutype"` // 菜单类型(格式:1,2,3) - 1:管理端 2:PC(C#) 3:移动(云平台) 4:终端(交易所) 5:PC(云平台)
  947. }
  948. // TableName is FUNCMENULIST
  949. func (r *NewFuncmenulist) TableName() string {
  950. return "FUNCMENULIST"
  951. }
  952. func (r *NewFuncmenulist) Find(req NewFuncmenulistReq) ([]NewFuncmenulist, error) {
  953. funcMenuLists := make([]NewFuncmenulist, 0)
  954. session := db.GetEngine().Table("FUNCMENULIST T")
  955. if len(req.RESOURCECODE) != 0 {
  956. session = session.And("T.RESOURCECODE = ?", req.RESOURCECODE)
  957. }
  958. if len(req.PARENTCODE) != 0 {
  959. session = session.And("T.PARENTCODE = ?", req.PARENTCODE)
  960. }
  961. if len(req.RESOURCENAME) != 0 {
  962. session = session.And("T.RESOURCENAME LIKE ?", "%"+req.RESOURCENAME+"%")
  963. }
  964. if len(req.MENUTYPE) != 0 {
  965. session = session.And(fmt.Sprintf("T.MENUTYPE in (%s)", req.MENUTYPE))
  966. }
  967. if err := session.Find(&funcMenuLists); err != nil {
  968. return nil, err
  969. }
  970. return funcMenuLists, nil
  971. }
  972. func (r *NewFuncmenulist) Insert() error {
  973. _, err := db.GetEngine().Insert(r)
  974. return err
  975. }
  976. func (r *NewFuncmenulist) Update() error {
  977. _, err := db.GetEngine().Where("RESOURCECODE = ?", r.RESOURCECODE).Update(r)
  978. return err
  979. }
  980. func (r *NewFuncmenulist) Delete() error {
  981. _, err := db.GetEngine().Where("RESOURCECODE = ?", r.RESOURCECODE).Delete(r)
  982. return err
  983. }
  984. // GetNewErmcpRoleFuncMenuLists
  985. func GetNewErmcpRoleFuncMenuLists(loginID int, menuType int) ([]NewFuncmenulist, error) {
  986. funcMenuLists := make([]NewFuncmenulist, 0)
  987. // 获取对应的Loginaccount信息
  988. var loginAccount Loginaccount
  989. has, err := db.GetEngine().Where("LOGINID = ?", loginID).Get(&loginAccount)
  990. if err != nil {
  991. return nil, err
  992. }
  993. if !has {
  994. return nil, errors.New("没有对应的登录用户信息")
  995. }
  996. // 获取对应的Useraccount信息
  997. var userAccount Useraccount
  998. has, err = db.GetEngine().Table("USERACCOUNT U").
  999. Join("INNER", "LOGINACCOUNT L", "L.USERID = U.USERID").
  1000. Where("L.LOGINID = ?", loginID).Get(&userAccount)
  1001. if err != nil {
  1002. return nil, err
  1003. }
  1004. if !has {
  1005. return nil, errors.New("没有对应的用户信息")
  1006. }
  1007. // 是否企业
  1008. isEnterprise := false
  1009. // 是否自营会员
  1010. isTrader := false
  1011. // 查询机构角色表
  1012. var arearole Arearole
  1013. arearoles, err := arearole.GetAreaRoles(int(userAccount.Userid), 0)
  1014. if err != nil {
  1015. return nil, err
  1016. }
  1017. for _, v := range arearoles {
  1018. if v.Roletype == 6 {
  1019. isTrader = true
  1020. } else if v.Roletype == 20 {
  1021. arearole = arearoles[0]
  1022. if arearole.Suborgtype == 0 {
  1023. isEnterprise = true
  1024. }
  1025. }
  1026. }
  1027. if userAccount.Usertype == 5 || (userAccount.Usertype == 2 && isTrader) {
  1028. // 交易所,自营会员及投资者的权限不进行判断
  1029. sql := fmt.Sprintf("select F.* from FUNCMENULIST F where F.MENUTYPE = %d", menuType)
  1030. if err := db.GetEngine().SQL(sql).Find(&funcMenuLists); err != nil {
  1031. return nil, err
  1032. }
  1033. } else {
  1034. // 判断是企业还是企业成员
  1035. // 账户类型 - 1:交易所 2:机构 3:会员子机构 4:经纪人 5:投资者 6:客户 7:企业成员(云平台)
  1036. if userAccount.Usertype == 2 && isEnterprise {
  1037. // UserType=2:企业。原逻辑:根据LoginAccount表"ClientRoleID"查询”ERMCP_MemberFuncMenu“表中该用户对应角色的菜单权限
  1038. sql := fmt.Sprintf(`select F.* from FUNCMENULIST F where F.MENUTYPE = %d
  1039. and
  1040. F.RESOURCECODE in
  1041. (select R.RESOURCECODE from ERMCP_MEMBERFUNCMENU R
  1042. where R.ISVALID = 1 and R.USERID = %d and R.ROLEID = %d)`, menuType, loginAccount.Userid, loginAccount.Clientroleid)
  1043. if err := db.GetEngine().SQL(sql).Find(&funcMenuLists); err != nil {
  1044. return nil, err
  1045. }
  1046. } else if userAccount.Usertype == 6 || userAccount.Usertype == 7 || (userAccount.Usertype == 2 && !isEnterprise) {
  1047. // UserType=7:企业成员
  1048. // 查询本用户的角色ID - AreaRole表
  1049. // 根据 Rootuserid 和 自己的角色查询 ERMCP_MemberFuncMenu 表中的菜单权限
  1050. areaRoles := make([]Arearole, 0)
  1051. if err := db.GetEngine().Where("USERID = ?", loginAccount.Userid).Find(&areaRoles); err != nil {
  1052. return nil, err
  1053. }
  1054. if len(areaRoles) == 0 {
  1055. // 无角色,返回空数组s
  1056. return make([]NewFuncmenulist, 0), nil
  1057. }
  1058. // 构建RoleID列表
  1059. roleIDs := ""
  1060. for _, areaRole := range areaRoles {
  1061. roleIDs += "," + strconv.Itoa(int(areaRole.Roletype))
  1062. }
  1063. if len(roleIDs) > 0 {
  1064. roleIDs = roleIDs[1:]
  1065. }
  1066. sql := fmt.Sprintf(`select F.* from FUNCMENULIST F where F.MENUTYPE = %d
  1067. and
  1068. F.RESOURCECODE in
  1069. (select R.RESOURCECODE from ERMCP_MEMBERFUNCMENU R
  1070. where R.ISVALID = 1 and R.USERID = %d and R.ROLEID in (%s))`, menuType, userAccount.Rootuserid, roleIDs)
  1071. if err := db.GetEngine().SQL(sql).Find(&funcMenuLists); err != nil {
  1072. return nil, err
  1073. }
  1074. } else {
  1075. return nil, errors.New("错误的用户类型")
  1076. }
  1077. }
  1078. return funcMenuLists, nil
  1079. }
  1080. // Exchangerateconfig 汇率配置表
  1081. type ExchangeRateConfig struct {
  1082. ORICURRENCYID int32 `json:"oricurrencyid" xorm:"ORICURRENCYID" form:"oricurrencyid"` // 源币种ID
  1083. DESCURRENCYID int32 `json:"descurrencyid" xorm:"DESCURRENCYID" form:"descurrencyid"` // 目标币种ID
  1084. EXCHANGERATE float64 `json:"exchangerate" xorm:"EXCHANGERATE"` // 汇率
  1085. REMARK string `json:"remark" xorm:"REMARK"` // 备注
  1086. UPDATEBY int64 `json:"-" xorm:"UPDATEBY"` // 更新人
  1087. UPDATETIME time.Time `json:"-" xorm:"UPDATETIME"` // 更新时间
  1088. }
  1089. func (r *ExchangeRateConfig) TableName() string {
  1090. return "EXCHANGERATECONFIG"
  1091. }
  1092. // Exchangerateconfig 汇率配置表
  1093. type Exchangerateconfig struct {
  1094. ORICURRENCYID int32 `json:"oricurrencyid" xorm:"ORICURRENCYID" form:"oricurrencyid"` // 源币种ID
  1095. DESCURRENCYID int32 `json:"descurrencyid" xorm:"DESCURRENCYID" form:"descurrencyid"` // 目标币种ID
  1096. EXCHANGERATE float64 `json:"exchangerate" xorm:"EXCHANGERATE"` // 汇率
  1097. REMARK string `json:"-" xorm:"REMARK"` // 备注
  1098. UPDATEBY int64 `json:"-" xorm:"UPDATEBY"` // 更新人
  1099. UPDATETIME time.Time `json:"-" xorm:"UPDATETIME"` // 更新时间
  1100. PageEx `xorm:"extends"` // 页码信息
  1101. }
  1102. func (r *Exchangerateconfig) TableName() string {
  1103. return "EXCHANGERATECONFIG"
  1104. }
  1105. func (r *Exchangerateconfig) calc() {
  1106. }
  1107. func (r *Exchangerateconfig) buildSql() string {
  1108. var sqlId utils.SQLVal = `
  1109. SELECT
  1110. t.*
  1111. FROM ExchangeRateConfig t
  1112. `
  1113. sqlId.AndEx("t.ORICURRENCYID", r.ORICURRENCYID, r.ORICURRENCYID > 0)
  1114. sqlId.AndEx("t.DESCURRENCYID", r.DESCURRENCYID, r.DESCURRENCYID > 0)
  1115. sqlId.Page(r.Page, r.PageSize)
  1116. return sqlId.String()
  1117. }
  1118. func (r *Exchangerateconfig) GetDataByPage() (interface{}, error, int, int, int) {
  1119. sData := make([]Exchangerateconfig, 0)
  1120. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1121. total := 0
  1122. for i := range sData {
  1123. sData[i].calc()
  1124. total = sData[i].Total
  1125. }
  1126. return sData, err, r.Page, r.PageSize, total
  1127. }
  1128. func (r *Exchangerateconfig) GetAll() (data []Exchangerateconfig, err error) {
  1129. data = make([]Exchangerateconfig, 0)
  1130. err = db.GetEngine().Table("EXCHANGERATECONFIG").Select("ORICURRENCYID,DESCURRENCYID,EXCHANGERATE,REMARK").Find(&data)
  1131. return
  1132. }
  1133. // QueryNewTitlesReq 获取资讯标题列表请求参数
  1134. type QueryNewTitlesReq struct {
  1135. COLUMNID int `form:"columnid"` // 所属栏目
  1136. Page int `json:"-" form:"page"` // 页码
  1137. PageSize int `json:"-" form:"pagesize"` // 每页大小
  1138. }
  1139. type QueryNewTitlesRsp struct {
  1140. ID int64 `json:"id" xorm:"ID"` // ID(SEQ_SITE_COLUMNDETAIL)
  1141. COLUMNID int64 `json:"columnid" xorm:"COLUMNID"` // 所属栏目
  1142. USERID int64 `json:"userid" xorm:"USERID"` // 用户ID(默认为0, 核心为为机构用户ID)
  1143. TITLE string `json:"title" xorm:"TITLE"` // 标题
  1144. COVERIMAGE string `json:"coverimage" xorm:"COVERIMAGE"` // 封面图片
  1145. AUTHOR string `json:"author" xorm:"AUTHOR"` // 作者
  1146. BRIEF string `json:"brief" xorm:"BRIEF"` // 简介
  1147. STATUS int32 `json:"status" xorm:"STATUS"` // 状态 - 1:暂存 10:待审核 20:审核通过 30:审核拒绝
  1148. ISTOP int32 `json:"istop" xorm:"ISTOP"` // 是否置顶 - 0:不置 1:置顶
  1149. HITS int64 `json:"hits" xorm:"HITS"` // 点击数
  1150. PUBLISHDATE time.Time `json:"publishdate" xorm:"PUBLISHDATE"` // 发布日期
  1151. CREAEDATE time.Time `json:"creaedate" xorm:"CREAEDATE"` // 创建时间
  1152. CREATORID int64 `json:"creatorid" xorm:"CREATORID"` // 创建人
  1153. UPDATEDATE time.Time `json:"updatedate" xorm:"UPDATEDATE"` // 修改时间
  1154. MODIFIERID int64 `json:"modifierid" xorm:"MODIFIERID"` // 操作人
  1155. ISSHOW int32 `json:"isshow" xorm:"ISSHOW"` // 是否展示 - 0:不展示 1:展示
  1156. TITLEEN string `json:"titleen" xorm:"TITLEEN"` // 标题(英文)
  1157. TITLETW string `json:"titletw" xorm:"TITLETW"` // 标题(繁体)
  1158. TITLETH string `json:"titleth" xorm:"TITLETH"` // 标题(泰文)
  1159. TITLEVI string `json:"titlevi" xorm:"TITLEVI"` // 标题(越南语)
  1160. AUTHOREN string `json:"authoren" xorm:"AUTHOREN"` // 作者(英文)
  1161. AUTHORTW string `json:"authortw" xorm:"AUTHORTW"` // 作者(繁体)
  1162. AUTHORTH string `json:"authorth" xorm:"AUTHORTH"` // 作者(泰文)
  1163. AUTHORVI string `json:"authorvi" xorm:"AUTHORVI"` // 作者()
  1164. BRIEFEN string `json:"briefen" xorm:"BRIEFEN"` // 简介(英文)
  1165. BRIEFTW string `json:"brieftw" xorm:"BRIEFTW"` // 简介(繁体)
  1166. BRIEFTH string `json:"briefth" xorm:"BRIEFTH"` // 简介(泰文)
  1167. BRIEFVI string `json:"briefvi" xorm:"BRIEFVI"` // 简介(越南语)
  1168. }
  1169. // GetNewTitles 取资讯标题列表
  1170. func GetNewTitles(req QueryNewTitlesReq) (rsp []QueryNewTitlesRsp, total int64, err error) {
  1171. engine := db.GetEngine()
  1172. session := engine.Table("SITE_COLUMNDETAIL").Where("ISSHOW = 1")
  1173. if req.COLUMNID != 0 {
  1174. session = session.And("COLUMNID = ?", req.COLUMNID)
  1175. }
  1176. total, err = session.Count(new(QueryNewTitlesRsp))
  1177. if err != nil {
  1178. return
  1179. }
  1180. rsp = make([]QueryNewTitlesRsp, 0)
  1181. session = engine.Table("SITE_COLUMNDETAIL").Where("ISSHOW = 1 AND STATUS = 20")
  1182. if req.COLUMNID != 0 {
  1183. session = session.And("COLUMNID = ?", req.COLUMNID)
  1184. }
  1185. session = session.Desc("ISTOP", "PUBLISHDATE")
  1186. page := req.Page - 1
  1187. err = session.Limit(req.PageSize, page*req.PageSize).Find(&rsp)
  1188. return
  1189. }
  1190. type QueryNewTitles2Rsp struct {
  1191. Time string `json:"time"` // 时间
  1192. List []QueryNewTitlesRsp `json:"list"` // 列表
  1193. }
  1194. // GetNewTitles2 取资讯标题列表
  1195. func GetNewTitles2(req QueryNewTitlesReq) (rsp []QueryNewTitles2Rsp, total int64, err error) {
  1196. engine := db.GetEngine()
  1197. session := engine.Table("SITE_COLUMNDETAIL").Where("ISSHOW = 1")
  1198. if req.COLUMNID != 0 {
  1199. session = session.And("COLUMNID = ?", req.COLUMNID)
  1200. }
  1201. total, err = session.Count(new(QueryNewTitlesRsp))
  1202. if err != nil {
  1203. return
  1204. }
  1205. r := make([]QueryNewTitlesRsp, 0)
  1206. session = engine.Table("SITE_COLUMNDETAIL").Where("ISSHOW = 1 AND STATUS = 20")
  1207. if req.COLUMNID != 0 {
  1208. session = session.And("COLUMNID = ?", req.COLUMNID)
  1209. }
  1210. session = session.Desc("ISTOP", "PUBLISHDATE")
  1211. page := req.Page - 1
  1212. err = session.Limit(req.PageSize, page*req.PageSize).Find(&r)
  1213. m := make(map[string][]QueryNewTitlesRsp)
  1214. for _, v := range r {
  1215. t := v.PUBLISHDATE.Format("2006-01-02")
  1216. m[t] = append(m[t], v)
  1217. }
  1218. rsp = make([]QueryNewTitles2Rsp, 0)
  1219. for k, v := range m {
  1220. rsp = append(rsp, QueryNewTitles2Rsp{
  1221. Time: k,
  1222. List: v,
  1223. })
  1224. }
  1225. return
  1226. }
  1227. type QueryNewContentsRsp struct {
  1228. ID int64 `json:"id" xorm:"ID"` // ID(SEQ_SITE_COLUMNDETAIL)
  1229. COLUMNID int64 `json:"columnid" xorm:"COLUMNID"` // 所属栏目
  1230. USERID int64 `json:"userid" xorm:"USERID"` // 用户ID(默认为0, 核心为为机构用户ID)
  1231. TITLE string `json:"title" xorm:"TITLE"` // 标题
  1232. COVERIMAGE string `json:"coverimage" xorm:"COVERIMAGE"` // 封面图片
  1233. AUTHOR string `json:"author" xorm:"AUTHOR"` // 作者
  1234. BRIEF string `json:"brief" xorm:"BRIEF"` // 简介
  1235. CONTEXT string `json:"context" xorm:"CONTEXT"` // 内容
  1236. STATUS int32 `json:"status" xorm:"STATUS"` // 状态 - 1:暂存 10:待审核 20:审核通过 30:审核拒绝
  1237. ISTOP int32 `json:"istop" xorm:"ISTOP"` // 是否置顶 - 0:不置 1:置顶
  1238. HITS int64 `json:"hits" xorm:"HITS"` // 点击数
  1239. PUBLISHDATE time.Time `json:"publishdate" xorm:"PUBLISHDATE"` // 发布日期
  1240. CREAEDATE time.Time `json:"creaedate" xorm:"CREAEDATE"` // 创建时间
  1241. CREATORID int64 `json:"creatorid" xorm:"CREATORID"` // 创建人
  1242. UPDATEDATE time.Time `json:"updatedate" xorm:"UPDATEDATE"` // 修改时间
  1243. MODIFIERID int64 `json:"modifierid" xorm:"MODIFIERID"` // 操作人
  1244. ISSHOW int32 `json:"isshow" xorm:"ISSHOW"` // 是否展示 - 0:不展示 1:展示
  1245. SRCID int64 `json:"srcid" xorm:"SRCID"` // 来源ID
  1246. MEMBERNAME string `json:"srcname" xorm:"MEMBERNAME"` // 会员名称\来源名称
  1247. MEMBERTAGS string `json:"srcurl" xorm:"MEMBERTAGS"` // 标签(逗号分隔)\来源网址
  1248. IMAGEURL string `json:"srclogo" xorm:"IMAGEURL"` // 图片地址\来源LOGO
  1249. MEMBERNAMEEN string `json:"srcnameen" xorm:"MEMBERNAMEEN"` // 会员名称\来源名称(英文)
  1250. MEMBERNAMETW string `json:"srcnametw" xorm:"MEMBERNAMETW"` // 会员名称\来源名称(繁体)
  1251. MEMBERNAMETH string `json:"srcnameth" xorm:"MEMBERNAMETH"` // 会员名称\来源名称(泰文)
  1252. MEMBERNAMEVI string `json:"srcnamevi" xorm:"MEMBERNAMEVI"` // 会员名称\来源名称(越南语)
  1253. TITLEEN string `json:"titleen" xorm:"TITLEEN"` // 标题(英文)
  1254. TITLETW string `json:"titletw" xorm:"TITLETW"` // 标题(繁体)
  1255. TITLETH string `json:"titleth" xorm:"TITLETH"` // 标题(泰文)
  1256. TITLEVI string `json:"titlevi" xorm:"TITLEVI"` // 标题(越南语)
  1257. AUTHOREN string `json:"authoren" xorm:"AUTHOREN"` // 作者(英文)
  1258. AUTHORTW string `json:"authortw" xorm:"AUTHORTW"` // 作者(繁体)
  1259. AUTHORTH string `json:"authorth" xorm:"AUTHORTH"` // 作者(泰文)
  1260. AUTHORVI string `json:"authorvi" xorm:"AUTHORVI"` // 作者()
  1261. BRIEFEN string `json:"briefen" xorm:"BRIEFEN"` // 简介(英文)
  1262. BRIEFTW string `json:"brieftw" xorm:"BRIEFTW"` // 简介(繁体)
  1263. BRIEFTH string `json:"briefth" xorm:"BRIEFTH"` // 简介(泰文)
  1264. BRIEFVI string `json:"briefvi" xorm:"BRIEFVI"` // 简介(越南语)
  1265. CONTEXTEN string `json:"contexten" xorm:"CONTEXTEN"` // 内容(英文)
  1266. CONTEXTTW string `json:"contexttw" xorm:"CONTEXTTW"` // 内容(繁体)
  1267. CONTEXTTH string `json:"contextth" xorm:"CONTEXTTH"` // 内容(泰文)
  1268. CONTEXTVI string `json:"contextvi" xorm:"CONTEXTVI"` // 内容(越南语)
  1269. }
  1270. func GetNewContents(ids []string) (rsp []QueryNewContentsRsp, error error) {
  1271. engine := db.GetEngine()
  1272. // 增加点击数
  1273. if len(ids) != 0 {
  1274. sql := fmt.Sprintf("UPDATE SITE_COLUMNDETAIL SET HITS = nvl(HITS, 0) + 1 WHERE ID IN (%v)", strings.Join(ids, ","))
  1275. engine.Exec(sql)
  1276. }
  1277. rsp = make([]QueryNewContentsRsp, 0)
  1278. session := engine.Table("SITE_COLUMNDETAIL T").
  1279. Select(`
  1280. T.*,
  1281. GM.MEMBERNAME,
  1282. GM.MEMBERNAMEEN,
  1283. GM.MEMBERNAMETW,
  1284. GM.MEMBERNAMETH,
  1285. GM.MEMBERNAMEVI,
  1286. GM.MEMBERTAGS,
  1287. GM.IMAGEURL
  1288. `).Join("LEFT", "GZ_MEMBERINFO GM", "GM.MEMBERID = T.SRCID").Where("T.ISSHOW = 1")
  1289. if len(ids) != 0 {
  1290. session = session.In("T.ID", ids)
  1291. }
  1292. if err := session.Find(&rsp); err != nil {
  1293. return nil, err
  1294. }
  1295. return
  1296. }
  1297. type GetJ10NewsData struct {
  1298. Pic string `json:"pic"`
  1299. Title string `json:"title"`
  1300. Content string `json:"content"`
  1301. }
  1302. // GetJ10NewsRsp 金10资讯数据
  1303. type GetJ10NewsRsp struct {
  1304. Id string `json:"id"`
  1305. Time string `json:"time"`
  1306. Type int `json:"type"`
  1307. Data GetJ10NewsData `json:"data"`
  1308. }
  1309. func GetJ10News(limit int) (datas []GetJ10NewsRsp, err error) {
  1310. datas = make([]GetJ10NewsRsp, 0)
  1311. rsp, err := http.Get("https://www.jin10.com/flash_newest.js")
  1312. if err != nil {
  1313. return
  1314. }
  1315. defer rsp.Body.Close()
  1316. buf := new(bytes.Buffer)
  1317. buf.ReadFrom(rsp.Body)
  1318. newStr := buf.String()
  1319. if strings.Contains(newStr, "var newest = ") {
  1320. a := strings.Replace(newStr, "var newest = ", "", -1)
  1321. b := a[:len(a)-1]
  1322. err = json.Unmarshal([]byte(b), &datas)
  1323. // 去掉<打头的记录,以及空的记录
  1324. r := make([]GetJ10NewsRsp, 0)
  1325. for _, item := range datas {
  1326. if item.Data.Content != "" && item.Data.Content[0] != []byte("<")[0] {
  1327. r = append(r, item)
  1328. }
  1329. }
  1330. if len(r) > limit {
  1331. datas = r[:limit]
  1332. }
  1333. }
  1334. return
  1335. }
  1336. // Membergoodslimitconfig 会员商品限制配置表(不显示、不能交易的权限)
  1337. type Membergoodslimitconfig struct {
  1338. AUTOID int64 `json:"autoid" xorm:"AUTOID"` // AutoID(SEQ_MEMBERGOODSLIMITCONFIG)
  1339. USERID int64 `json:"userid" xorm:"USERID" form:"userid" binding:"required"` // 会员用户ID
  1340. ROLETYPE int32 `json:"roletype" xorm:"ROLETYPE" form:"roletype" binding:"required"` // 会员角色 - 6:自营会员 7:经纪会员
  1341. GOODSID int64 `json:"goodsid" xorm:"GOODSID"` // 商品ID
  1342. ISNODISPLAY int32 `json:"isnodisplay" xorm:"ISNODISPLAY"` // 是否显示 0:否 1:是
  1343. ISCANNOTBUY int32 `json:"iscannotbuy" xorm:"ISCANNOTBUY"` // 是否不能挂买 0:否 1:是
  1344. ISCANNOTSELL int32 `json:"iscannotsell" xorm:"ISCANNOTSELL"` // 是否不能挂卖 0:否 1:是
  1345. UPDATETIME time.Time `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  1346. }
  1347. func (r *Membergoodslimitconfig) calc() {
  1348. }
  1349. func (r *Membergoodslimitconfig) buildSql() string {
  1350. var sqlId utils.SQLVal = `
  1351. select
  1352. t.autoid,
  1353. t.userid,
  1354. t.roletype,
  1355. t.goodsid,
  1356. t.isnodisplay,
  1357. t.iscannotbuy,
  1358. t.iscannotsell,
  1359. t.updatetime
  1360. from Membergoodslimitconfig t
  1361. where 1=1
  1362. `
  1363. sqlId.And("t.userid", r.USERID)
  1364. sqlId.And("t.roletype", r.ROLETYPE)
  1365. return sqlId.String()
  1366. }
  1367. // GetDataEx 从数据库中查询数据
  1368. func (r *Membergoodslimitconfig) GetDataEx() (interface{}, error) {
  1369. e := db.GetEngine()
  1370. s := e.SQL(r.buildSql())
  1371. sData := make([]Membergoodslimitconfig, 0)
  1372. if err := s.Find(&sData); err != nil {
  1373. return nil, err
  1374. }
  1375. for i := range sData {
  1376. sData[i].calc()
  1377. }
  1378. return sData, nil
  1379. }
  1380. type GetTodayAccountConfigInfoRsp struct {
  1381. TodayAccountMargins []Todayaccountmargin `json:"todayAccountMargins"` // 今日账户保证金表
  1382. TodayAccountTradefees []Todayaccounttradefee `json:"todayAccountTradefees"` // 今日账户交易费用表
  1383. TodayAccountTradeRules []Todayaccounttraderule `json:"todayAccountTradeRules"` // 今日账户交易规则信表
  1384. RiskRatioType *Riskratiotype `json:"riskRatioType"` // 风险率类型表
  1385. }
  1386. func GetTodayAccountConfigInfo(accountid int) (rsp GetTodayAccountConfigInfoRsp, err error) {
  1387. todayAccountMargins := make([]Todayaccountmargin, 0)
  1388. if err = db.GetEngine().In("ACCOUNTID", []int{0, accountid}).Find(&todayAccountMargins); err != nil {
  1389. return
  1390. }
  1391. for i := range todayAccountMargins {
  1392. item := &todayAccountMargins[i]
  1393. item.INFOCONTENT = base64.StdEncoding.EncodeToString([]byte(item.INFOCONTENT))
  1394. }
  1395. todayAccountTradefees := make([]Todayaccounttradefee, 0)
  1396. if err = db.GetEngine().In("ACCOUNTID", []int{0, accountid}).Find(&todayAccountTradefees); err != nil {
  1397. return
  1398. }
  1399. for i := range todayAccountTradefees {
  1400. item := &todayAccountTradefees[i]
  1401. item.INFOCONTENT = base64.StdEncoding.EncodeToString([]byte(item.INFOCONTENT))
  1402. }
  1403. todayAccountTradeRules := make([]Todayaccounttraderule, 0)
  1404. if err = db.GetEngine().In("ACCOUNTID", []int{0, accountid}).Find(&todayAccountTradeRules); err != nil {
  1405. return
  1406. }
  1407. for i := range todayAccountTradeRules {
  1408. item := &todayAccountTradeRules[i]
  1409. item.INFOCONTENT = base64.StdEncoding.EncodeToString([]byte(item.INFOCONTENT))
  1410. }
  1411. rsp = GetTodayAccountConfigInfoRsp{
  1412. TodayAccountMargins: todayAccountMargins,
  1413. TodayAccountTradefees: todayAccountTradefees,
  1414. TodayAccountTradeRules: todayAccountTradeRules,
  1415. }
  1416. sql := fmt.Sprintf(`
  1417. SELECT TA.ACCOUNTID,
  1418. NVL(NVL(NVL(UG.CUSTOMERTYPE, ARC.CUSTOMERTYPE), CTAD.CUSTOMERTYPE),
  1419. -1) AS RISKID
  1420. FROM TAACCOUNT TA
  1421. LEFT JOIN USERACCOUNT UA
  1422. ON UA.USERID = TA.USERID
  1423. LEFT JOIN USERGROUPDETAIL UGD
  1424. ON TA.USERID = UGD.USERID
  1425. LEFT JOIN USERGROUP UG
  1426. ON UGD.USERGROUPID = UG.AUTOID
  1427. LEFT JOIN ACCOUNTRISKCONFIG ARC
  1428. ON ARC.ACCOUNTID = TA.ACCOUNTID
  1429. LEFT JOIN CUSTOMERTYPEAREADETAIL CTAD
  1430. ON TA.USERID = CTAD.USERID
  1431. WHERE
  1432. TA.TAACCOUNTTYPE IN (2)
  1433. AND TA.ACCOUNTID = %v
  1434. `, accountid)
  1435. results, err := db.GetEngine().QueryInterface(sql)
  1436. if err != nil {
  1437. return
  1438. }
  1439. if len(results) > 0 {
  1440. if riskid, ok := results[0]["RISKID"].(float64); ok {
  1441. if riskid == -1 {
  1442. var riskatiotype Riskratiotype
  1443. if ok, err = db.GetEngine().Where("riskcontrolmode = 1 and isdefault = 1").Get(&riskatiotype); err == nil && ok {
  1444. rsp.RiskRatioType = new(Riskratiotype)
  1445. *rsp.RiskRatioType = riskatiotype
  1446. } else {
  1447. if err != nil {
  1448. err = errors.New("获取数据失败")
  1449. }
  1450. }
  1451. } else {
  1452. var riskatiotype Riskratiotype
  1453. if ok, err = db.GetEngine().Where("CUSTOMERTYPE = ?", riskid).Get(&riskatiotype); err == nil && ok {
  1454. rsp.RiskRatioType = new(Riskratiotype)
  1455. *rsp.RiskRatioType = riskatiotype
  1456. } else {
  1457. if err != nil {
  1458. err = errors.New("获取数据失败")
  1459. }
  1460. }
  1461. }
  1462. }
  1463. }
  1464. return
  1465. }
  1466. func GetWskhOpenAccountConfigs(configs string) (datas []Wskhopenaccountconfig, err error) {
  1467. err = db.GetEngine().In("CONFIGID", strings.Split(configs, ",")).NotIn("CONFIGID", []int{26, 27}).Find(&datas)
  1468. return
  1469. }
  1470. func GetI18nConfigs() (datas []I18nConfig, err error) {
  1471. err = db.GetEngine().Where("ISVALID = 1").Find(&datas)
  1472. return
  1473. }
  1474. func GetClientDocumnetConfigs() (datas []ClientDocumentConfig, err error) {
  1475. err = db.GetEngine().Where("1 = 1").Find(&datas)
  1476. return
  1477. }
  1478. func GetUserScore(userID int) (datas []QueryUserScoreRsp, err error) {
  1479. engine := db.GetEngine()
  1480. rspdatas := make([]QueryUserScoreRsp, 0)
  1481. if err := engine.Table("USERSCORE T").
  1482. Join("LEFT", "SCORETYPE ST", `T.SCORETYPEID = ST.SCORETYPEID`).
  1483. Select("T.*, ST.SCORETYPENAME AS SCORETYPENAME").
  1484. Where("T.USERID = ?", userID).Find(&rspdatas); err != nil {
  1485. return nil, err
  1486. }
  1487. return rspdatas, nil
  1488. }
  1489. func GetUserScoreDetail(userID int) (datas []QueryUserScoreDetailRsp, err error) {
  1490. engine := db.GetEngine()
  1491. rspdatas := make([]QueryUserScoreDetailRsp, 0)
  1492. if err := engine.Table("USERSCOREDETAIL T").
  1493. Join("LEFT", "SCORETYPE ST", `T.SCORETYPEID = ST.SCORETYPEID`).
  1494. Select("TO_CHAR(T.DETAILID) DETAILID, T.TRADEDATE, T.USERID, T.SCORETYPEID, T.SCORE, T.REMAINSCORE, "+
  1495. "T.VALIDTYPE, CASE WHEN T.VALIDTYPE = 1 OR T.VALIDTYPE = 3 THEN T.EXPIREDATE ELSE '-' END AS EXPIREDATE, "+
  1496. "TO_CHAR(T.CREATETIME, 'YYYY-MM-DD HH24:MI:SS') CREATEDTIME, ST.SCORETYPENAME AS SCORETYPENAME").
  1497. Where("T.USERID = ?", userID).
  1498. OrderBy("T.VALIDTYPE, T.EXPIREDATE, T.DETAILID DESC").
  1499. Find(&rspdatas); err != nil {
  1500. return nil, err
  1501. }
  1502. return rspdatas, nil
  1503. }
  1504. func GetHotGoodses() (rsp []ErmcpGoods, err error) {
  1505. // 合约交易根据”RECKON_DAYGOODSCOUNT“表
  1506. // 现货数字交易根据表”DIGITALTRADE_TRADEDETAIL“(7*24小时,无结算)
  1507. rspdatas := make([]ErmcpGoods, 0)
  1508. sql := `
  1509. SELECT
  1510. G.GOODSID, G.GOODSCODE, G.GOODSNAME, G.MARKETID, G.GOODUNITID, G.AGREEUNIT,
  1511. G.CURRENCYID, G.GOODSCURRENCYID, G.DECIMALPLACE, G.QUOTEMINUNIT, G.OUTGOODSCODE,
  1512. G.PICTUREURL, G.THUMURLS, G.BANNERURLS, M.TRADEMODE, GE.GOODSNAMEEN,
  1513. GE.GOODSNAMETW, GE.GOODSNAMETH, GE.GOODSNAMEVI
  1514. FROM
  1515. (SELECT T.GOODSID, NVL(T.TRADEAMOUNT, 0) TRADEAMOUNT, NVL(T.TRADEQTY, 0) TRADEQTY
  1516. FROM RECKON_DAYGOODSCOUNT T
  1517. WHERE T.RECKONDATE IN (SELECT T.PRETRADEDATE FROM MARKETRUN T WHERE T.MARKETID = 0)
  1518. UNION
  1519. SELECT T.GOODSID, SUM(NVL(T.TRADEVALUE, 0)) TRADEAMOUNT, SUM(NVL(T.TRADEVOLUME, 0)) TRADEQTY
  1520. FROM DIGITALTRADE_TRADEDETAIL T
  1521. WHERE T.TRADEDATE IN (SELECT TO_CHAR(TRUNC(TO_DATE(MAX(T.TRADEDATE), 'yyyyMMdd')) - 1, 'YYYYMMDD') AS PREVIOUS_DAY FROM DIGITALTRADE_TRADEDETAIL T)
  1522. GROUP BY T.GOODSID) TT
  1523. INNER JOIN GOODS G ON G.GOODSID = TT.GOODSID
  1524. INNER JOIN GOODSEX GE ON GE.GOODSID = G.GOODSID
  1525. INNER JOIN MARKET M ON M.MARKETID = G.MARKETID
  1526. ORDER BY TT.TRADEAMOUNT DESC, G.GOODSCODE
  1527. `
  1528. if err := db.GetEngine().SQL(sql).Find(&rspdatas); err != nil {
  1529. return nil, err
  1530. }
  1531. return rspdatas, nil
  1532. }