ermcpReport.go 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. /**
  2. * @Author: zou.yingbin
  3. * @Create : 2021/2/4 11:27
  4. * @Modify : 2021/2/4 11:27
  5. */
  6. package models
  7. import (
  8. "fmt"
  9. "mtp2_if/db"
  10. "mtp2_if/mtpcache"
  11. "mtp2_if/utils"
  12. )
  13. // ErmcpReportDayFR 财务日报表
  14. type ErmcpReportDayFR struct {
  15. RECKONDATE string `json:"reckondate" xorm:"'RECKONDATE'"` // 日照时期(yyyyMMdd)
  16. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构
  17. COLLECTMONEYCOUNT int32 `json:"collectmoneycount" xorm:"'COLLECTMONEYCOUNT'"` // 今日收款笔数
  18. COLLECTMONEYAMOUNT float64 `json:"collectmoneyamount" xorm:"'COLLECTMONEYAMOUNT'"` // 今日收款金额
  19. PAYMONEYCOUNT int32 `json:"paymoneycount" xorm:"'PAYMONEYCOUNT'"` // 今日付款笔数
  20. PAYMONEYAMOUNT float64 `json:"paymoneyamount" xorm:"'PAYMONEYAMOUNT'"` // 今日付款金额
  21. COLLECTINVOICECOUNT int32 `json:"collectinvoicecount" xorm:"'COLLECTINVOICECOUNT'"` // 今日开票笔数
  22. COLLECTINVOICEAMOUNT float64 `json:"collectinvoiceamount" xorm:"'COLLECTINVOICEAMOUNT'"` // 今日开票金额
  23. PAYINVOICECOUNT int32 `json:"payinvoicecount" xorm:"'PAYINVOICECOUNT'"` // 今日收票笔数
  24. PAYINVOICEAMOUNT float64 `json:"payinvoiceamount" xorm:"'PAYINVOICEAMOUNT'"` // 今日收票金额
  25. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  26. BeginDate string `json:"-"` // 开始日期
  27. EndDate string `json:"-"` // 结束日期
  28. }
  29. // Calc 数据处理
  30. func (r *ErmcpReportDayFR) Calc() {
  31. }
  32. func (r *ErmcpReportDayFR) buildSql() string {
  33. var sqlId utils.SQLVal = "SELECT t.RECKONDATE," +
  34. " t.AREAUSERID," +
  35. " t.COLLECTMONEYCOUNT," +
  36. " t.COLLECTMONEYAMOUNT," +
  37. " t.PAYMONEYCOUNT," +
  38. " t.PAYMONEYAMOUNT," +
  39. " t.COLLECTINVOICECOUNT," +
  40. " t.COLLECTINVOICEAMOUNT," +
  41. " t.PAYINVOICECOUNT," +
  42. " t.PAYINVOICEAMOUNT," +
  43. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh:mi:ss') UPDATETIME" +
  44. " FROM RECKON_ERMCP_AREAFR t" +
  45. " WHERE 1 = 1"
  46. // 查询条件
  47. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  48. if r.RECKONDATE != "" {
  49. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  50. } else if r.BeginDate != "" && r.BeginDate == r.EndDate {
  51. sqlId.And("t.RECKONDATE", r.BeginDate)
  52. } else {
  53. if r.BeginDate != "" {
  54. sqlId.BiggerOrEq("t.RECKONDATE", r.BeginDate)
  55. }
  56. if r.EndDate != "" {
  57. sqlId.LessOrEq("t.RECKONDATE", r.EndDate)
  58. }
  59. }
  60. return sqlId.String()
  61. }
  62. // GetDataEx 获取日报表
  63. func (r *ErmcpReportDayFR) GetDataEx() (interface{}, error) {
  64. sData := make([]ErmcpReportDayFR, 0)
  65. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  66. return sData, err
  67. }
  68. // ErmcpReportDayFRKx 财务日报表/款项
  69. type ErmcpReportDayFRKx struct {
  70. USERID int64 `json:"userid" xorm:"'USERID'"` // 机构ID
  71. TRADEDATE string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  72. }
  73. // GetDataEx 获取日报表款项记录
  74. func (r *ErmcpReportDayFRKx) GetDataEx() (interface{}, error) {
  75. m := ErmcpReportOPLog{USERID: r.USERID, LogTypeFilter: "8,9,10", TRADEDATE: r.TRADEDATE}
  76. return m.GetDataEx()
  77. }
  78. // ErmcpReportOPLog 报表合同操作记录通用查询
  79. type ErmcpReportOPLog struct {
  80. LOGID string `json:"logid" xorm:"'lOGID'"` // 流水ID(604+Unix秒时间戳(10位)+xxxxxx)
  81. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 - 1:套保计划 2:现货合同
  82. OPERATELOGTYPE int32 `json:"operatelogtype" xorm:"'OPERATELOGTYPE'"` // 操作流水类型 -
  83. RELATEDID string `json:"relatedid" xorm:"'RELATEDID'"` // 现货合同ID\套保计划
  84. LOGVALUE string `json:"logvalue" xorm:"'LOGVALUE'"` // 数值
  85. LOGDATETIME string `json:"logdatetime" xorm:"'LOGDATETIME'"` // 流水日期(时间)
  86. TRADEDATE string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  87. APPLYID int64 `json:"applyid" xorm:"'APPLYID'"` // 操作人
  88. CONTRACTTYPE int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 现货合同类型 - 1:采购 -1:销售
  89. USERID int64 `json:"userid" xorm:"'USERID'"` // 机构ID
  90. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 现货商品ID
  91. RELATEDNO string `json:"relatedno" xorm:"'RELATEDNO'"` // 合同编号
  92. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 现货商品名称
  93. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 现货商品代码
  94. UNITID int32 `json:"-" xorm:"'UNITID'"` // 现货商品单位id
  95. ENUMDICNAME string `json:"enumdicName"` // 单位名称
  96. OPTYPENAME string `json:"optypename"` // 流水类型名称
  97. LOGTYPENAME string `json:"logtypename"` // 合同类型(名称)
  98. APPLYNAME string `json:"applyname"` // 操作人名称
  99. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  100. MODELNAME string `json:"modelname" xorm:"'modelname'"` // 型号名称
  101. LogTypeFilter string `json:"-"` // 查询日志类型, 逗号隔开(如 1,2,4)
  102. }
  103. // Calc 处理数据
  104. func (r *ErmcpReportOPLog) Calc() {
  105. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  106. r.APPLYNAME = mtpcache.GetUserNameByUserId(r.APPLYID)
  107. if r.APPLYNAME == "" {
  108. // APPLYID 可能存的是loginId
  109. r.APPLYNAME = mtpcache.GetLoginCodeByLoginId(r.APPLYID)
  110. }
  111. //1:点价价格 2:点价数量 3:结算量 4:其它费用 5:追加保证金 6溢短金额 7:调整金额 8:付款金额 9:收款金额 10:退款金额
  112. //11:收票金额 12:开票金额 13:提交审核(合同) 14:审核通过(合同) 15:审核拒绝(合同) 16:合同撤回 17:提交审核(计划)
  113. //18:审核通过(计划) 19:审核拒绝(计划) 20:计划撤回 21:正常完结(合同) 22:异常终止(合同) 23:退还保证金
  114. // 数据库注释与返回值映身关系: 结算量->确定量, 收款->收款金额, 退款->退款金额, 付款->付款金额, 收票->收票金额, 开票->开票金额
  115. sDes := []string{"点价价格", "点价数量", "确定量", "其它费用", "追加保证金", "溢短金额", "调整金额", "付款", "收款", "退款",
  116. "收票", "开票", "提交审核(合同)", "审核通过(合同)", "审核拒绝(合同)", "合同撤回", "提交审核(计划)",
  117. "审核通过(计划)", "审核拒绝(计划)", "计划撤回", "正常完结(合同)", "异常终止(合同)", "退还保证金"}
  118. if r.OPERATELOGTYPE >= 1 && r.OPERATELOGTYPE <= 23 {
  119. r.OPTYPENAME = sDes[r.OPERATELOGTYPE-1]
  120. }
  121. // 收款款项:采购合同的退款、销售合同的收款应用正数显示,付款款项:采购合同的付款、销售合同的退款应用负数显示
  122. if r.CONTRACTTYPE == 1 {
  123. r.LOGTYPENAME = "采购"
  124. // 采购合同/退款 正数
  125. if r.OPERATELOGTYPE == 10 && len(r.LOGVALUE) > 0 {
  126. if r.LOGVALUE[0] == '-' {
  127. r.LOGVALUE = r.LOGVALUE[1:]
  128. }
  129. }
  130. // 采购合同/付款 负数
  131. if r.OPERATELOGTYPE == 8 && len(r.LOGVALUE) > 0 {
  132. if r.LOGVALUE[0] != '-' {
  133. r.LOGVALUE = "-" + r.LOGVALUE
  134. }
  135. }
  136. } else if r.CONTRACTTYPE == -1 {
  137. r.LOGTYPENAME = "销售"
  138. // 销售合同/收款 正数
  139. if r.OPERATELOGTYPE == 9 && len(r.LOGVALUE) > 0 {
  140. if r.LOGVALUE[0] == '-' {
  141. r.LOGVALUE = r.LOGVALUE[1:]
  142. }
  143. }
  144. // 销售合同/退款 负数
  145. if r.OPERATELOGTYPE == 10 && len(r.LOGVALUE) > 0 {
  146. if r.LOGVALUE[0] != '-' {
  147. r.LOGVALUE = "-" + r.LOGVALUE
  148. }
  149. }
  150. }
  151. // 去除多余的0,最后4个0
  152. if r.LOGVALUE[len(r.LOGVALUE)-4:] == "0000" {
  153. r.LOGVALUE = r.LOGVALUE[:len(r.LOGVALUE)-4]
  154. }
  155. if r.BIZTYPE == 1 {
  156. r.LOGTYPENAME += "计划"
  157. } else if r.BIZTYPE == 2 {
  158. r.LOGTYPENAME += "合同"
  159. }
  160. }
  161. func (r *ErmcpReportOPLog) buildSql() string {
  162. var sqlId utils.SQLVal = "SELECT to_char(t.LOGID) LOGID," +
  163. " t.BIZTYPE," +
  164. " t.OPERATELOGTYPE," +
  165. " to_char(t.RELATEDID) RELATEDID," +
  166. " t.LOGVALUE," +
  167. " to_char(t.LOGDATETIME, 'yyyy-mm-dd hh24:mi:ss') LOGDATETIME," +
  168. " t.TRADEDATE," +
  169. " t.APPLYID," +
  170. " t.CONTRACTTYPE," +
  171. " t.USERID," +
  172. " t.WRSTANDARDID," +
  173. " s.contractno relatedno," +
  174. " s.spotgoodsbrandid," +
  175. " s.spotgoodsmodelid," +
  176. " w.wrstandardname," +
  177. " w.wrstandardcode," +
  178. " w.unitid," +
  179. " gb.brandname," +
  180. " gm.modelname" +
  181. " FROM ERMCP_CONTRACTOPERATELOG t" +
  182. " inner join ermcp_spotcontract s" +
  183. " on t.RELATEDID = s.spotcontractid" +
  184. " and t.userid = %v" +
  185. " left join wrstandard w" +
  186. " on t.wrstandardid = w.wrstandardid" +
  187. " left join spotgoodsbrand gb" +
  188. " on s.spotgoodsbrandid = gb.brandid" +
  189. " left join spotgoodsmodel gm" +
  190. " on s.spotgoodsmodelid = gm.modelid" +
  191. " WHERE t.biztype = 2"
  192. sqlId = utils.SQLVal(fmt.Sprintf(sqlId.String(), r.USERID))
  193. // 筛选条件
  194. sqlId.And("t.TRADEDATE", r.TRADEDATE)
  195. if r.WRSTANDARDID > 0 {
  196. sqlId.And("t.WRSTANDARDID", r.WRSTANDARDID)
  197. }
  198. if r.LogTypeFilter != "" {
  199. sqlId.Join(fmt.Sprintf(" and t.OPERATELOGTYPE in(%v)", r.LogTypeFilter))
  200. }
  201. return sqlId.String()
  202. }
  203. // GetDataEx 获取日志记录
  204. func (r *ErmcpReportOPLog) GetDataEx() (interface{}, error) {
  205. sData := make([]ErmcpReportOPLog, 0)
  206. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  207. for i := range sData {
  208. sData[i].Calc()
  209. }
  210. return sData, err
  211. }
  212. // ErmcpReportMonthFR 财务月报表
  213. type ErmcpReportMonthFR struct {
  214. CYCLETYPE int32 `json:"cycletype" xorm:"'cycletype'"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  215. CYCLETIME string `json:"cycletime" xorm:"'cycletime'"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  216. AREAUSERID int64 `json:"areauserid" xorm:"'areauserid'"` // 所属机构【原值】
  217. COLLECTMONEYCOUNT int32 `json:"collectmoneycount" xorm:"'collectmoneycount'"` // 今日收款笔数 【汇总】
  218. COLLECTMONEYAMOUNT float64 `json:"collectmoneyamount" xorm:"'collectmoneyamount'"` // 今日收款金额【汇总】
  219. PAYMONEYCOUNT int32 `json:"paymoneycount" xorm:"'paymoneycount'"` // 今日付款笔数【汇总】
  220. PAYMONEYAMOUNT float64 `json:"paymoneyamount" xorm:"'paymoneyamount'"` // 今日付款金额【汇总】
  221. COLLECTINVOICECOUNT int32 `json:"collectinvoicecount" xorm:"'collectinvoicecount'"` // 今日开票笔数【汇总】
  222. COLLECTINVOICEAMOUNT float64 `json:"collectinvoiceamount" xorm:"'collectinvoiceamount'"` // 今日开票金额【汇总】
  223. PAYINVOICECOUNT int32 `json:"payinvoicecount" xorm:"'payinvoicecount'"` // 今日收票笔数【汇总】
  224. PAYINVOICEAMOUNT float64 `json:"payinvoiceamount" xorm:"'payinvoiceamount'"` // 今日收票金额【汇总】
  225. UPDATETIME string `json:"updatetime" xorm:"'updatetime'"` // 更新时间
  226. DayFR []ErmcpReportDayFR `json:"dayFr"` // 日报表明细
  227. }
  228. // Calc 数据处理
  229. func (r *ErmcpReportMonthFR) Calc() {
  230. }
  231. func (r *ErmcpReportMonthFR) buildSql() string {
  232. var sqlId utils.SQLVal = "SELECT t.CYCLETYPE," +
  233. " t.CYCLETIME," +
  234. " t.AREAUSERID," +
  235. " t.COLLECTMONEYCOUNT," +
  236. " t.COLLECTMONEYAMOUNT," +
  237. " t.PAYMONEYCOUNT," +
  238. " t.PAYMONEYAMOUNT," +
  239. " t.COLLECTINVOICECOUNT," +
  240. " t.COLLECTINVOICEAMOUNT," +
  241. " t.PAYINVOICECOUNT," +
  242. " t.PAYINVOICEAMOUNT," +
  243. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh:mi:ss') UPDATETIME" +
  244. " FROM REPORT_ERMCP_AREAFR t" +
  245. " WHERE 1 = 1"
  246. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  247. sqlId.And("t.CYCLETYPE", 1)
  248. sqlId.And("t.CYCLETIME", r.CYCLETIME)
  249. return sqlId.String()
  250. }
  251. // GetDataEx 获取月报表
  252. func (r *ErmcpReportMonthFR) GetDataEx() (interface{}, error) {
  253. sData := make([]ErmcpReportMonthFR, 0)
  254. // 月报表
  255. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  256. // 日报表明细
  257. if len(r.CYCLETIME) != 6 {
  258. // 月报表的日期应是6位,如 202101
  259. return nil, nil
  260. }
  261. t1 := r.CYCLETIME + "01"
  262. t2 := r.CYCLETIME + "31"
  263. for i := range sData {
  264. sData[i].Calc()
  265. dayM := ErmcpReportDayFR{AREAUSERID: r.AREAUSERID, BeginDate: t1, EndDate: t2}
  266. if dObj, err := dayM.GetDataEx(); err == nil {
  267. if d, ok := dObj.([]ErmcpReportDayFR); ok {
  268. sData[i].DayFR = d
  269. }
  270. }
  271. }
  272. return sData, err
  273. }
  274. // ErmcpReportDayExposure 敞口日报表
  275. type ErmcpReportDayExposure struct {
  276. RECKONDATE string `json:"reckondate" xorm:"'RECKONDATE'"` // 日照时期(yyyyMMdd)
  277. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种ID
  278. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构
  279. ORIBUYPLANQTY float64 `json:"oribuyplanqty" xorm:"'ORIBUYPLANQTY'"` // 期初采购计划数量
  280. ORIBUYPRICEDQTY float64 `json:"oribuypricedqty" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购合同已定价数量
  281. ORISELLPLANQTY float64 `json:"orisellplanqty" xorm:"'ORISELLPLANQTY'"` // 期初销售计划数量
  282. ORISELLPRICEDQTY float64 `json:"orisellpricedqty" xorm:"'ORISELLPRICEDQTY'"` // 期初销售合同已定价数量
  283. ORIBUYFUTUREQTY float64 `json:"oribuyfutureqty" xorm:"'ORIBUYFUTUREQTY'"` // 期初买入期货数量
  284. ORISELLFUTUREQTY float64 `json:"orisellfutureqty" xorm:"'ORISELLFUTUREQTY'"` // 期初卖出期货数量
  285. BUYPLANQTY float64 `json:"buyplanqty" xorm:"'BUYPLANQTY'"` // 采购计划数量
  286. BUYPRICEDQTY float64 `json:"buypricedqty" xorm:"'BUYPRICEDQTY'"` // 采购合同已定价数量
  287. SELLPLANQTY float64 `json:"sellplanqty" xorm:"'SELLPLANQTY'"` // 销售计划数量
  288. SELLPRICEDQTY float64 `json:"sellpricedqty" xorm:"'SELLPRICEDQTY'"` // 销售合同已定价数量
  289. BUYFUTUREQTY float64 `json:"buyfutureqty" xorm:"'BUYFUTUREQTY'"` // 买入期货数量
  290. SELLFUTUREQTY float64 `json:"sellfutureqty" xorm:"'SELLFUTUREQTY'"` // 卖出期货数量
  291. TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 现货数量
  292. TOTALFUTUREQTY float64 `json:"totalfutureqty" xorm:"'TOTALFUTUREQTY'"` // 期货数量
  293. TOTALEXPOSURE float64 `json:"totalexposure" xorm:"'TOTALEXPOSURE'"` // 总敞口
  294. TOTALHEDGERATIO float64 `json:"totalhedgeratio" xorm:"'TOTALHEDGERATIO'"` // 敞口比例
  295. TOTALNEEDHEDGEQTY float64 `json:"totalneedhedgeqty" xorm:"'TOTALNEEDHEDGEQTY'"` // 期货应套保量
  296. NEEDHEDGEEXPOSOURE float64 `json:"needhedgeexposoure" xorm:"'NEEDHEDGEEXPOSOURE'"` // 应套保敞口
  297. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 应套保敞口比例
  298. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
  299. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
  300. MIDDLEGOODSHEDGERATIO float64 `json:"middlegoodshedgeratio" xorm:"'MIDDLEGOODSHEDGERATIO'"` // 应套保比例
  301. GOODSUNITID int32 `json:"-" xorm:"'GOODSUNITID'"` // 套保商品单位id
  302. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  303. OriTotalSpotQty float64 `json:"oriTotalSpotQty"` // 期初现货数量=(期初销售计划数量-期初销售合同已定价数量)-(期初采购计划数量-期初采购合同已定价数量)
  304. OriTotalFutuQty float64 `json:"oriTotalFutuQty"` // 期初期货数量=期初买入期货数量-期初卖出期货数量
  305. DiffSpotQty float64 `json:"diffSpotQty"` // 今日变动量(现货) = 现货数量 - 期初现货数量
  306. DiffFutuQty float64 `json:"diffFutuQty"` // 今日变动量(期货) = (买入 - 买入期初) - (卖出 - 卖出期初)
  307. }
  308. // Calc 数据处理
  309. func (r *ErmcpReportDayExposure) Calc() {
  310. r.OriTotalSpotQty = (r.ORISELLPLANQTY - r.ORISELLPRICEDQTY) - (r.ORIBUYPLANQTY - r.ORIBUYPRICEDQTY)
  311. r.OriTotalFutuQty = r.ORIBUYFUTUREQTY - r.ORISELLFUTUREQTY
  312. r.DiffSpotQty = r.TOTALSPOTQTY - r.OriTotalSpotQty
  313. r.DiffFutuQty = (r.BUYFUTUREQTY - r.ORIBUYFUTUREQTY) - (r.SELLFUTUREQTY - r.ORISELLFUTUREQTY)
  314. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GOODSUNITID)
  315. }
  316. func (r *ErmcpReportDayExposure) buildSql() string {
  317. var sqlId utils.SQLVal = "SELECT t.RECKONDATE," +
  318. " t.MIDDLEGOODSID," +
  319. " t.AREAUSERID," +
  320. " t.ORIBUYPLANQTY," +
  321. " t.ORIBUYPRICEDQTY," +
  322. " t.ORISELLPLANQTY," +
  323. " t.ORISELLPRICEDQTY," +
  324. " t.ORIBUYFUTUREQTY," +
  325. " t.ORISELLFUTUREQTY," +
  326. " t.BUYPLANQTY," +
  327. " t.BUYPRICEDQTY," +
  328. " t.SELLPLANQTY," +
  329. " t.SELLPRICEDQTY," +
  330. " t.BUYFUTUREQTY," +
  331. " t.SELLFUTUREQTY," +
  332. " t.TOTALSPOTQTY," +
  333. " t.TOTALFUTUREQTY," +
  334. " t.TOTALEXPOSURE," +
  335. " t.TOTALHEDGERATIO," +
  336. " t.TOTALNEEDHEDGEQTY," +
  337. " t.NEEDHEDGEEXPOSOURE," +
  338. " t.NEEDHEDGERATIO," +
  339. " g.middlegoodsname," +
  340. " g.middlegoodscode," +
  341. " g.needhedgeratio MIDDLEGOODSHEDGERATIO," +
  342. " g.goodsunitid" +
  343. " FROM RECKON_ERMCP_AREAEXPOSURE t" +
  344. " left join ERMS_MIDDLEGOODS g" +
  345. " on t.middlegoodsid = g.middlegoodsid" +
  346. " WHERE 1 = 1"
  347. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  348. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  349. return sqlId.String()
  350. }
  351. // GetDataEx 获取敞口日报表
  352. func (r *ErmcpReportDayExposure) GetDataEx() (interface{}, error) {
  353. sData := make([]ErmcpReportDayExposure, 0)
  354. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  355. for i := range sData {
  356. sData[i].Calc()
  357. }
  358. return sData, err
  359. }
  360. // ErmcpReportDaySpot 现货日报表
  361. type ErmcpReportDaySpot struct {
  362. BUYPRICEDQTY float64 `json:"-" xorm:"'BUYPRICEDQTY'"` // 期末采购定价量
  363. SELLPRICEDQTY float64 `json:"-" xorm:"'SELLPRICEDQTY'"` // 期末销售定价量
  364. ORIBUYPRICEDQTY float64 `json:"-" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购定价量
  365. ORISELLPRICEDQTY float64 `json:"-" xorm:"'ORISELLPRICEDQTY'"` // 期初销售定价量
  366. TODAYBUYRECKONQTY float64 `json:"todaybuyreckonqty" xorm:"'TODAYBUYRECKONQTY'"` // 采购确定量
  367. TODAYSELLRECKONQTY float64 `json:"todaysellreckonqty" xorm:"'TODAYSELLRECKONQTY'"` // 销售确定量
  368. RECKONDATE string `json:"reckondate" xorm:"'RECKONDATE'"` // 日照时期(yyyyMMdd)
  369. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 现货商品ID
  370. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构T
  371. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 现货商品名称
  372. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 现货商品代码
  373. UNITID int32 `json:"-" xorm:"'UNITID'"` // 现货商品单位id
  374. BUYINQTY float64 `json:"buyinqty" xorm:"'BUYINQTY'"` // 采购入库量
  375. SELLOUTQTY float64 `json:"selloutqty" xorm:"'SELLOUTQTY'"` // 销售出库量
  376. ENUMDICNAME string `json:"enumdicname"` // 现货商品单位名称
  377. TOTALBUYPRICEDQTY float64 `json:"totalbuypricedqty"` // 采购定价量 = 期末 - 期初
  378. TOTALSELLPRICEDQTY float64 `json:"totalsellpricedqty"` // 销售定价量 = 期末 - 期初
  379. BeginDate string `json:"-"` // 开始日期
  380. EndDate string `json:"-"` // 结束日期
  381. }
  382. // Calc 数据处理
  383. func (r *ErmcpReportDaySpot) Calc() {
  384. r.TOTALBUYPRICEDQTY = r.BUYPRICEDQTY - r.ORIBUYPRICEDQTY
  385. r.TOTALSELLPRICEDQTY = r.SELLPRICEDQTY - r.ORISELLPRICEDQTY
  386. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  387. }
  388. func (r *ErmcpReportDaySpot) buildSql() string {
  389. var sqlId utils.SQLVal = "with tmp as" +
  390. " (select t.userid," +
  391. " t.wrstandardid," +
  392. " t.reckondate," +
  393. " sum(t.todaybuyinqty) todaybuyinqty," +
  394. " sum(t.todayselloutqty) todayselloutqty" +
  395. " from Reckon_ERMCP_AreaStock t" +
  396. " group by t.userid, t.wrstandardid,t.reckondate)" +
  397. "select t.reckondate," +
  398. " t.BUYPRICEDQTY," +
  399. " t.SELLPRICEDQTY," +
  400. " t.Oribuypricedqty," +
  401. " t.Orisellpricedqty," +
  402. " t.TODAYBUYRECKONQTY," +
  403. " t.TODAYSELLRECKONQTY," +
  404. " t.RECKONDATE," +
  405. " t.WRSTANDARDID," +
  406. " t.AREAUSERID," +
  407. " w.wrstandardname," +
  408. " w.wrstandardcode," +
  409. " w.unitid," +
  410. " s.todaybuyinqty buyinqty," +
  411. " s.todayselloutqty selloutqty" +
  412. " from RECKON_ERMCP_AREASPOT t" +
  413. " left join tmp s" +
  414. " on t.reckondate = s.reckondate" +
  415. " and t.areauserid = s.userid" +
  416. " and t.wrstandardid = s.wrstandardid" +
  417. " left join wrstandard w" +
  418. " on t.wrstandardid = w.wrstandardid" +
  419. " where 1 = 1"
  420. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  421. if r.WRSTANDARDID > 0 {
  422. sqlId.And("t.WRSTANDARDID", r.WRSTANDARDID)
  423. }
  424. if r.RECKONDATE != "" {
  425. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  426. } else if r.BeginDate != "" && r.BeginDate == r.EndDate {
  427. sqlId.And("t.RECKONDATE", r.BeginDate)
  428. } else {
  429. if r.BeginDate != "" {
  430. sqlId.BiggerOrEq("t.RECKONDATE", r.BeginDate)
  431. }
  432. if r.EndDate != "" {
  433. sqlId.LessOrEq("t.RECKONDATE", r.EndDate)
  434. }
  435. }
  436. sqlId.Join(" order by t.RECKONDATE")
  437. return sqlId.String()
  438. }
  439. // GetDataEx 获取现货日报表
  440. func (r *ErmcpReportDaySpot) GetDataEx() (interface{}, error) {
  441. sData := make([]ErmcpReportDaySpot, 0)
  442. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  443. for i := range sData {
  444. sData[i].Calc()
  445. }
  446. return sData, err
  447. }
  448. // ErmcpReportMonSpot 现货月报表
  449. type ErmcpReportMonSpot struct {
  450. CYCLETYPE int32 `json:"cycletype" xorm:"'cycletype'"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  451. CYCLETIME string `json:"cycletime" xorm:"'cycletime'"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  452. BUYPRICEDQTY float64 `json:"-" xorm:"'BUYPRICEDQTY'"` // 期末采购定价量
  453. SELLPRICEDQTY float64 `json:"-" xorm:"'SELLPRICEDQTY'"` // 期末销售定价量
  454. ORIBUYPRICEDQTY float64 `json:"-" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购定价量
  455. ORISELLPRICEDQTY float64 `json:"-" xorm:"'ORISELLPRICEDQTY'"` // 期初销售定价量
  456. TODAYBUYRECKONQTY float64 `json:"todaybuyreckonqty" xorm:"'TODAYBUYRECKONQTY'"` // 采购确定量
  457. TODAYSELLRECKONQTY float64 `json:"todaysellreckonqty" xorm:"'TODAYSELLRECKONQTY'"` // 销售确定量
  458. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 现货商品ID
  459. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构T
  460. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 现货商品名称
  461. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 现货商品代码
  462. UNITID int32 `json:"-" xorm:"'UNITID'"` // 现货商品单位id
  463. BUYINQTY float64 `json:"buyinqty" xorm:"'BUYINQTY'"` // 采购入库量
  464. SELLOUTQTY float64 `json:"selloutqty" xorm:"'SELLOUTQTY'"` // 销售出库量
  465. ENUMDICNAME string `json:"enumdicname"` // 现货商品单位名称
  466. TOTALBUYPRICEDQTY float64 `json:"totalbuypricedqty"` // 采购定价量 = 期末 - 期初
  467. TOTALSELLPRICEDQTY float64 `json:"totalsellpricedqty"` // 销售定价量 = 期末 - 期初
  468. }
  469. // Calc 数据处理
  470. func (r *ErmcpReportMonSpot) Calc() {
  471. r.TOTALBUYPRICEDQTY = r.BUYPRICEDQTY - r.ORIBUYPRICEDQTY
  472. r.TOTALSELLPRICEDQTY = r.SELLPRICEDQTY - r.ORISELLPRICEDQTY
  473. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  474. }
  475. func (r *ErmcpReportMonSpot) buildSql() string {
  476. var sqlId utils.SQLVal = "with tmp as" +
  477. " (select t.userid," +
  478. " t.wrstandardid," +
  479. " t.cycletime," +
  480. " t.cycletype," +
  481. " sum(t.todaybuyinqty) todaybuyinqty," +
  482. " sum(t.todayselloutqty) todayselloutqty" +
  483. " from Report_ERMCP_AreaStock t" +
  484. " group by t.userid, t.wrstandardid, t.cycletime, t.cycletype)" +
  485. "select t.BUYPRICEDQTY," +
  486. " t.SELLPRICEDQTY," +
  487. " t.Oribuypricedqty," +
  488. " t.Orisellpricedqty," +
  489. " t.TODAYBUYRECKONQTY," +
  490. " t.TODAYSELLRECKONQTY," +
  491. " t.cycletype," +
  492. " t.cycletime," +
  493. " t.WRSTANDARDID," +
  494. " t.AREAUSERID," +
  495. " w.wrstandardname," +
  496. " w.wrstandardcode," +
  497. " w.unitid," +
  498. " s.todaybuyinqty buyinqty," +
  499. " s.todayselloutqty selloutqty" +
  500. " from Report_ERMCP_AreaSpot t" +
  501. " left join tmp s" +
  502. " on t.cycletime = s.cycletime" +
  503. " and t.cycletype = s.cycletype" +
  504. " and t.areauserid = s.userid" +
  505. " and t.wrstandardid = s.wrstandardid" +
  506. " left join wrstandard w" +
  507. " on t.wrstandardid = w.wrstandardid" +
  508. " where t.cycletype = 1"
  509. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  510. sqlId.And("t.cycletime", r.CYCLETIME)
  511. return sqlId.String()
  512. }
  513. // GetDataEx 获取现货月报表
  514. func (r *ErmcpReportMonSpot) GetDataEx() (interface{}, error) {
  515. sData := make([]ErmcpReportMonSpot, 0)
  516. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  517. for i := range sData {
  518. sData[i].Calc()
  519. }
  520. return sData, err
  521. }
  522. // ErmcpReportAreaSpotPL 现货损益日/月表
  523. type ErmcpReportAreaSpotPL struct {
  524. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构
  525. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 现货商品ID
  526. SPOTGOODSMODELID int32 `json:"spotgoodsmodelid" xorm:"'SPOTGOODSMODELID'"` // 现货品类ID
  527. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 现货品牌ID
  528. ORIBUYQTY float64 `json:"oribuyqty" xorm:"'ORIBUYQTY'"` // 期初采购总量
  529. ORIBUYAMOUNT float64 `json:"oribuyamount" xorm:"'ORIBUYAMOUNT'"` // 期初采购总额
  530. ORISELLQTY float64 `json:"orisellqty" xorm:"'ORISELLQTY'"` // 期初销售总量
  531. ORISELLAMOUNT float64 `json:"orisellamount" xorm:"'ORISELLAMOUNT'"` // 期初销售总额
  532. ORIQTY float64 `json:"oriqty" xorm:"'ORIQTY'"` // 期初量
  533. ORIAVERAGEPRICE float64 `json:"oriaverageprice" xorm:"'ORIAVERAGEPRICE'"` // 期初均价
  534. ORIAMOUNT float64 `json:"oriamount" xorm:"'ORIAMOUNT'"` // 期初额
  535. TODAYBUYQTY float64 `json:"todaybuyqty" xorm:"'TODAYBUYQTY'"` // 今日采购量(采购增量)
  536. TODAYBUYAMOUNT float64 `json:"todaybuyamount" xorm:"'TODAYBUYAMOUNT'"` // 今日采购额
  537. TODAYBUYAVERAGEPRICE float64 `json:"todaybuyaverageprice" xorm:"'TODAYBUYAVERAGEPRICE'"` // 今日采购均价(采购均价)
  538. TODAYSELLQTY float64 `json:"todaysellqty" xorm:"'TODAYSELLQTY'"` // 今日销售量(销售增量)
  539. TODAYSELLAMOUNT float64 `json:"todaysellamount" xorm:"'TODAYSELLAMOUNT'"` // 今日销售额
  540. TODAYSELLAVERAGEPRICE float64 `json:"todaysellaverageprice" xorm:"'TODAYSELLAVERAGEPRICE'"` // 今日销售均价(销售均价)
  541. CURBUYQTY float64 `json:"curbuyqty" xorm:"'CURBUYQTY'"` // 期末采购总量
  542. CURBUYAMOUNT float64 `json:"curbuyamount" xorm:"'CURBUYAMOUNT'"` // 期末采购总额(采购额)
  543. CURSELLQTY float64 `json:"cursellqty" xorm:"'CURSELLQTY'"` // 期末销售总量
  544. CURSELLAMOUNT float64 `json:"cursellamount" xorm:"'CURSELLAMOUNT'"` // 期末销售总额(销售额)
  545. CURQTY float64 `json:"curqty" xorm:"'CURQTY'"` // 期末量
  546. CURAVERAGEPRICE float64 `json:"curaverageprice" xorm:"'CURAVERAGEPRICE'"` // 期末均价
  547. CURAMOUNT float64 `json:"curamount" xorm:"'CURAMOUNT'"` // 期末额
  548. CURSPOTPRICE float64 `json:"curspotprice" xorm:"'CURSPOTPRICE'"` // 参考市价
  549. CURMARKETVALUE float64 `json:"curmarketvalue" xorm:"'CURMARKETVALUE'"` // 参考市值
  550. ACTUALPL float64 `json:"actualpl" xorm:"'ACTUALPL'"` // 实际损益
  551. FLOATPL float64 `json:"floatpl" xorm:"'FLOATPL'"` // 浮动损益
  552. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  553. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 现货商品代码
  554. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 现货商品名称
  555. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 现货商品单位id
  556. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  557. MODELNAME string `json:"modelname" xorm:"'MODELNAME'"` // 品类名称
  558. GBUNITID int32 `json:"gbunitid" xorm:"'GBUNITID'"` // 品类单位id
  559. ENUMDICNAME string `json:"enumdicname"` // 现货商品单位名称
  560. GBENUMDICNAME string `json:"gbenumdicname"` // 品类单位名称
  561. ReportType int32 `json:"-"` // 报表类型 1-日报表 2-月报表
  562. ReportDate string `json:"-"` // 格式 日报表(YYYYMMDD) 月报表(YYYYMM)
  563. }
  564. func (r *ErmcpReportAreaSpotPL) calc() {
  565. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  566. r.GBENUMDICNAME = mtpcache.GetEnumDicitemName(r.GBUNITID)
  567. }
  568. func (r *ErmcpReportAreaSpotPL) buildSql() string {
  569. var sqlId utils.SQLVal = "SELECT t.AREAUSERID," +
  570. " t.WRSTANDARDID," +
  571. " t.SPOTGOODSMODELID," +
  572. " t.SPOTGOODSBRANDID," +
  573. " t.ORIBUYQTY," +
  574. " t.ORIBUYAMOUNT," +
  575. " t.ORISELLQTY," +
  576. " t.ORISELLAMOUNT," +
  577. " t.ORIQTY," +
  578. " t.ORIAVERAGEPRICE," +
  579. " t.ORIAMOUNT," +
  580. " t.TODAYBUYQTY," +
  581. " t.TODAYBUYAMOUNT," +
  582. " t.TODAYBUYAVERAGEPRICE," +
  583. " t.TODAYSELLQTY," +
  584. " t.TODAYSELLAMOUNT," +
  585. " t.TODAYSELLAVERAGEPRICE," +
  586. " t.CURBUYQTY," +
  587. " t.CURBUYAMOUNT," +
  588. " t.CURSELLQTY," +
  589. " t.CURSELLAMOUNT," +
  590. " t.CURQTY," +
  591. " t.CURAVERAGEPRICE," +
  592. " t.CURAMOUNT," +
  593. " t.CURSPOTPRICE," +
  594. " t.CURMARKETVALUE," +
  595. " t.ACTUALPL," +
  596. " t.FLOATPL," +
  597. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  598. " w.wrstandardcode," +
  599. " w.wrstandardname," +
  600. " w.unitid," +
  601. " gb.brandname," +
  602. " gm.modelname," +
  603. " gm.unitid gbunitid" +
  604. " FROM %v t" +
  605. " left join wrstandard w" +
  606. " on t.wrstandardid = w.wrstandardid" +
  607. " left join spotgoodsbrand gb" +
  608. " on t.spotgoodsbrandid = gb.brandid" +
  609. " left join spotgoodsmodel gm" +
  610. " on t.spotgoodsmodelid = gm.modelid" +
  611. " WHERE 1 = 1"
  612. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  613. if r.ReportType == 1 {
  614. // 日报表
  615. sqlId.FormatParam("RECKON_ERMCP_AREASPOTPL")
  616. sqlId.And("t.reckondate", r.ReportDate)
  617. } else {
  618. // 月报表
  619. sqlId.FormatParam("REPORT_ERMCP_AREASPOTPL")
  620. sqlId.And("t.cycletype", 1)
  621. sqlId.And("t.cycletime", r.ReportDate)
  622. }
  623. if r.WRSTANDARDID > 0 {
  624. sqlId.And("t.wrstandardid", r.WRSTANDARDID)
  625. }
  626. if r.SPOTGOODSBRANDID > 0 {
  627. sqlId.And("t.spotgoodsbrandid", r.SPOTGOODSBRANDID)
  628. }
  629. if r.SPOTGOODSMODELID > 0 {
  630. sqlId.And("t.spotgoodsmodelid", r.SPOTGOODSMODELID)
  631. }
  632. return sqlId.String()
  633. }
  634. // GetDataEx 获取现货损益日(月)报表
  635. func (r *ErmcpReportAreaSpotPL) GetDataEx() (interface{}, error) {
  636. sData := make([]ErmcpReportAreaSpotPL, 0)
  637. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  638. for i := range sData {
  639. sData[i].calc()
  640. }
  641. return sData, err
  642. }