ermcp3.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. /**
  2. * @Author: zou.yingbin
  3. * @Create : 2021/4/14 11:11
  4. * @Modify : 2021/4/14 11:11
  5. */
  6. package models
  7. import (
  8. "fmt"
  9. "mtp2_if/db"
  10. "mtp2_if/mtpcache"
  11. "mtp2_if/utils"
  12. )
  13. // ErmcpDeliveryGoods 现货品种(交割品种)
  14. type ErmcpDeliveryGoods struct {
  15. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种ID(SEQ_DELIVERYGOODS)
  16. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  17. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  18. GOODSUNITID int32 `json:"goodsunitid" xorm:"'GOODSUNITID'"` // 现货品种单位ID
  19. DELIVERYGOODSTYPE int32 `json:"deliverygoodstype" xorm:"'DELIVERYGOODSTYPE'"` // 现货品种类型: 1-整装不拆分 2-散装记录明细 3:整装拆分 4:散装不记录明细
  20. STANDARDQTY int32 `json:"standardqty" xorm:"'STANDARDQTY'"` // 标准数量(库位数量) [标准品特有]
  21. STANDARDQTYRANGE int32 `json:"standardqtyrange" xorm:"'STANDARDQTYRANGE'"` // 标准数量偏差范围 [标准品特有]
  22. AUDITFLAG int32 `json:"auditflag" xorm:"'AUDITFLAG'"` // 交割是否需要审核 - 0:不需要 1:需要审核 默认为0
  23. ISVALID int32 `json:"isvalid" xorm:"'ISVALID'"` // 是否有效 - 0:无效 1:有效
  24. AGREEUNIT int32 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位[散货时默认为1, 整装时默认为标准数量]
  25. QTYDECIMALPLACE int32 `json:"qtydecimalplace" xorm:"'QTYDECIMALPLACE'"` // 成交量小数位
  26. CATEGORYID int32 `json:"categoryid" xorm:"'CATEGORYID'"` // 类别ID(SEQ_WRCATEGORY)
  27. DGSTATUS int32 `json:"dgstatus" xorm:"'DGSTATUS'"` // 品种状态 - 作废 - 0:未激活 1:正常
  28. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构
  29. EnumdicName string `json:"enumdicname"` // 现货品种单位名称
  30. ExcludeCfg int32 `json:"-"` // 排除已配置项 1-排除
  31. }
  32. func (r *ErmcpDeliveryGoods) calc() {
  33. r.EnumdicName = mtpcache.GetEnumDicitemName(r.GOODSUNITID)
  34. }
  35. func (r *ErmcpDeliveryGoods) buildSql() string {
  36. var sqlId utils.SQLVal = "SELECT t.DELIVERYGOODSID," +
  37. " t.DELIVERYGOODSCODE," +
  38. " t.DELIVERYGOODSNAME," +
  39. " t.GOODSUNITID," +
  40. " t.DELIVERYGOODSTYPE," +
  41. " t.STANDARDQTY," +
  42. " t.STANDARDQTYRANGE," +
  43. " t.AUDITFLAG," +
  44. " t.ISVALID," +
  45. " t.ISSPLIT," +
  46. " t.AGREEUNIT," +
  47. " t.QTYDECIMALPLACE," +
  48. " t.CATEGORYID," +
  49. " t.DGSTATUS," +
  50. " t.AREAUSERID" +
  51. " FROM DELIVERYGOODS t" +
  52. " WHERE 1 = 1"
  53. sqlId.AndEx("t.AREAUSERID", r.AREAUSERID, r.AREAUSERID > 0)
  54. sqlId.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  55. if r.ExcludeCfg == 1 {
  56. sqlId.Join(" and t.deliverygoodsid not in(select distinct deliverygoodsid from ermcp_bizgroupspotgoods)")
  57. }
  58. return sqlId.String()
  59. }
  60. // GetDataEx 获取现货商品(交割商品)
  61. func (r *ErmcpDeliveryGoods) GetDataEx() (interface{}, error) {
  62. return r.GetData()
  63. }
  64. // GetData
  65. func (r *ErmcpDeliveryGoods) GetData() ([]ErmcpDeliveryGoods, error) {
  66. sData := make([]ErmcpDeliveryGoods, 0)
  67. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  68. for i := range sData {
  69. sData[i].calc()
  70. }
  71. return sData, err
  72. }
  73. // ErmcpDGFactoryItem 品种选择项定义表
  74. type ErmcpDGFactoryItem struct {
  75. DGFACTORYITEMID int64 // 选择项ID(SEQ_DGFACTORYITEM)
  76. DELIVERYGOODSID int32 // 品种ID
  77. DGFACTORYITEMTYPEID int64 // 要素项类型
  78. DGFACTORYITEMVALUE string // 要素项值(类型为仓库时填写仓库名称)
  79. WAREHOUSEID int64 // 仓库ID(类型为仓库时填写)
  80. ISVALID int32 // 是否有效 - 0:无效 1:有效
  81. ORDERINDEX int32 // 顺序
  82. }
  83. func (r *ErmcpDGFactoryItem) buildSql() string {
  84. var sqlId utils.SQLVal = "SELECT DGFACTORYITEMID," +
  85. " t.DELIVERYGOODSID," +
  86. " to_char(t.DGFACTORYITEMTYPEID) DGFACTORYITEMTYPEID," +
  87. " t.DGFACTORYITEMVALUE," +
  88. " to_char(t.WAREHOUSEID) WAREHOUSEID," +
  89. " t.ISVALID," +
  90. " t.ORDERINDEX" +
  91. " FROM DGFACTORYITEM t" +
  92. " WHERE ISVALID = 1"
  93. sqlId.AndEx("t.DGFACTORYITEMID", r.DGFACTORYITEMID, r.DGFACTORYITEMID > 0)
  94. sqlId.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  95. sqlId.AndEx("t.DGFACTORYITEMTYPEID", r.DGFACTORYITEMTYPEID, r.DGFACTORYITEMTYPEID > 0)
  96. sqlId.AndEx("t.ORDERINDEX", r.ORDERINDEX, r.ORDERINDEX > 0)
  97. return sqlId.String()
  98. }
  99. // GetDataEx 获取品种选择项定义
  100. func (r *ErmcpDGFactoryItem) GetDataEx() (interface{}, error) {
  101. return r.GetData()
  102. }
  103. // GetData
  104. func (r *ErmcpDGFactoryItem) GetData() (interface{}, error) {
  105. sData := make([]ErmcpDGFactoryItem, 0)
  106. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  107. return sData, err
  108. }
  109. // ErmcpBrand 品牌(从品种选择项定义表中查)
  110. type ErmcpBrand struct {
  111. BRANDID int64 `json:"brandid"` // 品牌id
  112. BRANDNAME string `json:"brandname"` // 品牌名称
  113. DELIVERYGOODSID int32 `json:"deliverygoodsid"` // 品种ID
  114. }
  115. // 获取品牌数据
  116. func (r *ErmcpBrand) GetData() ([]ErmcpBrand, error) {
  117. m := ErmcpDGFactoryItem{
  118. DELIVERYGOODSID: r.DELIVERYGOODSID,
  119. DGFACTORYITEMTYPEID: 2,
  120. ORDERINDEX: 1,
  121. }
  122. sData := make([]ErmcpBrand, 0)
  123. if d, err := m.GetDataEx(); err == nil {
  124. if dgLst, ok := d.([]ErmcpDGFactoryItem); ok {
  125. for _, val := range dgLst {
  126. sData = append(sData, ErmcpBrand{BRANDID: val.DGFACTORYITEMID,
  127. BRANDNAME: val.DGFACTORYITEMVALUE, DELIVERYGOODSID: val.DELIVERYGOODSID})
  128. }
  129. }
  130. }
  131. return sData, nil
  132. }
  133. // ErmcpRelatedGoods 现货品种的关联交易商品
  134. type ErmcpRelatedGoods struct {
  135. GoodsId int `json:"goodsid" xorm:"'GoodsId'"` // 商品id
  136. GoodsCode string `json:"goodscode" xorm:"'GoodsCode'"` // 商品代码
  137. GoodsName string `json:"goodsname" xorm:"'GoodsName'"` // 商品名称
  138. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 品种ID
  139. AREAUSERID int64 `json:"-"` // 所属机构
  140. }
  141. func (r *ErmcpRelatedGoods) buildSql() string {
  142. var sqlId utils.SQLVal = "select distinct t.deliverygoodsid, g.goodsid, g.goodscode, g.goodsname" +
  143. " from deliverygoods t" +
  144. " inner join ERMS2_WRSConvertDetail w" +
  145. " on t.deliverygoodsid = w.deliverygoodsid" +
  146. " inner join erms_middlegoods m" +
  147. " on w.middlegoodsid = m.middlegoodsid" +
  148. " inner join ERMCP_GGConvertConfig gc" +
  149. " on m.goodsgroupid = gc.destgoodsgroupid" +
  150. " inner join goods g" +
  151. " on gc.srcgoodsgroupid = g.goodsgroupid" +
  152. " where 1 = 1"
  153. sqlId.AndEx("t.AREAUSERID", r.AREAUSERID, r.AREAUSERID > 0)
  154. sqlId.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  155. return sqlId.String()
  156. }
  157. // GetDataEx 获取现货关联交易商品
  158. func (r *ErmcpRelatedGoods) GetDataEx() (interface{}, error) {
  159. return r.GetData()
  160. }
  161. // GetData 获取现货关联交易商品
  162. func (r *ErmcpRelatedGoods) GetData() ([]ErmcpRelatedGoods, error) {
  163. sData := make([]ErmcpRelatedGoods, 0)
  164. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  165. return sData, err
  166. }
  167. // ErmcpDeliveryGoodsDetail 现货商品详情
  168. type ErmcpDeliveryGoodsDetail struct {
  169. Data ErmcpDeliveryGoods `json:"data"` // 现货商品基本信息(交割品种)
  170. GmList []ErmcpWrstandard `json:"gmlist"` // 品类列表(仓单标准)
  171. GbList []ErmcpBrand `json:"gblist"` // 品牌列表
  172. WrsList []WRSConverTDetail `json:"wrslist"` // 套保信息列表
  173. GoodsList []ErmcpRelatedGoods `json:"goodslist"` // 关联交易商品列表
  174. QryTradeGoods int32 `json:"-"` // 是否查询关联交易商品 1-查询
  175. }
  176. func (r *ErmcpDeliveryGoodsDetail) addGmList(lst []ErmcpWrstandard) {
  177. for i := range lst {
  178. if lst[i].DELIVERYGOODSID == r.Data.DELIVERYGOODSID {
  179. r.GmList = append(r.GmList, lst[i])
  180. }
  181. }
  182. }
  183. func (r *ErmcpDeliveryGoodsDetail) addGbList(lst []ErmcpBrand) {
  184. for i := range lst {
  185. if lst[i].DELIVERYGOODSID == r.Data.DELIVERYGOODSID {
  186. r.GbList = append(r.GbList, lst[i])
  187. }
  188. }
  189. }
  190. func (r *ErmcpDeliveryGoodsDetail) addWrsList(lst []WRSConverTDetail) {
  191. for i := range lst {
  192. if lst[i].DELIVERYGOODSID == r.Data.DELIVERYGOODSID {
  193. r.WrsList = append(r.WrsList, lst[i])
  194. }
  195. }
  196. }
  197. func (r *ErmcpDeliveryGoodsDetail) addGoodsList(lst []ErmcpRelatedGoods) {
  198. for i := range lst {
  199. if lst[i].DELIVERYGOODSID == r.Data.DELIVERYGOODSID {
  200. r.GoodsList = append(r.GoodsList, lst[i])
  201. }
  202. }
  203. }
  204. // GetDataEx
  205. func (r *ErmcpDeliveryGoodsDetail) GetDataEx() (interface{}, error) {
  206. sData := make([]ErmcpDeliveryGoodsDetail, 0)
  207. m := ErmcpDeliveryGoods{AREAUSERID: r.Data.AREAUSERID, DELIVERYGOODSID: r.Data.DELIVERYGOODSID}
  208. data, err := m.GetData()
  209. if err != nil {
  210. return sData, err
  211. }
  212. if data == nil || len(data) == 0 {
  213. return sData, nil
  214. }
  215. // 基本信息
  216. for i := range data {
  217. val := ErmcpDeliveryGoodsDetail{Data: data[i],
  218. GmList: make([]ErmcpWrstandard, 0), GbList: make([]ErmcpBrand, 0),
  219. WrsList: make([]WRSConverTDetail, 0), GoodsList: make([]ErmcpRelatedGoods, 0),
  220. }
  221. sData = append(sData, val)
  222. }
  223. //品类/品牌/套保信息
  224. gm := ErmcpWrstandard{AREAUSERID: int(r.Data.AREAUSERID), DELIVERYGOODSID: r.Data.DELIVERYGOODSID, ISVALID: 1}
  225. gb := ErmcpBrand{DELIVERYGOODSID: r.Data.DELIVERYGOODSID}
  226. WrsC := WRSConverTDetail{DELIVERYGOODSID: r.Data.DELIVERYGOODSID}
  227. gmLst, _ := gm.GetData()
  228. gbLst, _ := gb.GetData()
  229. wrsLst, _ := WrsC.GetData()
  230. var goodLst []ErmcpRelatedGoods
  231. if r.QryTradeGoods == 1 {
  232. goodsM := ErmcpRelatedGoods{AREAUSERID: r.Data.AREAUSERID, DELIVERYGOODSID: r.Data.DELIVERYGOODSID}
  233. goodLst, _ = goodsM.GetData()
  234. }
  235. for i := range sData {
  236. sData[i].addGmList(gmLst)
  237. sData[i].addGbList(gbLst)
  238. sData[i].addWrsList(wrsLst)
  239. sData[i].addGoodsList(goodLst)
  240. }
  241. return sData, nil
  242. }
  243. // Ermcp3Contract 现货合同
  244. type Ermcp3Contract struct {
  245. SPOTCONTRACTID string `json:"spotcontractid" xorm:"'SPOTCONTRACTID'"` // 现货合同ID(602+Unix秒时间戳(10位)+xxxxxx)
  246. CONTRACTNO string `json:"contractno" xorm:"'CONTRACTNO'"` // 现货合同编号
  247. CONTRACTTYPE int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 现货合同类型 - 1:采购 -1:销售
  248. USERID int64 `json:"userid" xorm:"'USERID'"` // 所属机构ID
  249. BUYUSERID int64 `json:"buyuserid" xorm:"'BUYUSERID'"` // 采购方ID
  250. BUYUSERName string `json:"buyusername" xorm:"'BUYUSERName'"` // 采购方名称
  251. SELLUSERID int64 `json:"selluserid" xorm:"'SELLUSERID'"` // 销售方ID
  252. SELLUSERNAME string `json:"sellusername" xorm:"'SELLUSERNAME'"` // 销售方名称
  253. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种ID
  254. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'wrstandardid'"` // 品类ID
  255. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  256. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  257. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  258. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  259. PRODUCTTYPE int32 `json:"producttype" xorm:"'PRODUCTTYPE'"` // 产品类型 - 1:标准仓单 2:等标 3:非标
  260. CONVERTFACTOR float64 `json:"convertfactor" xorm:"'CONVERTFACTOR'"` // 标仓系数(品类)
  261. SPOTGOODSDESC string `json:"spotgoodsdesc" xorm:"'SPOTGOODSDESC'"` // 商品型号
  262. PRICETYPE int32 `json:"pricetype" xorm:"'PRICETYPE'"` // 定价类型 - 1:一口价 2:点价 3:暂定价
  263. QTY float64 `json:"qty" xorm:"'QTY'"` // 数量
  264. PRICE float64 `json:"price" xorm:"'PRICE'"` // 价格\暂定价 [1:一口价、3:暂定价]
  265. AMOUNT float64 `json:"amount" xorm:"'AMOUNT'"` // 金额 [1:一口价、3:暂定价]
  266. DELIVERYSTARTDATE string `json:"deliverystartdate" xorm:"'DELIVERYSTARTDATE'"` // 交收期(开始)
  267. DELIVERYENDDATE string `json:"deliveryenddate" xorm:"'DELIVERYENDDATE'"` // 交收期(结束)
  268. GOODSID int32 `json:"goodsid" xorm:"'GOODSID'"` // 点价合约ID - 0:为现货,其它为期货商品合约ID [2:点价 3:暂定价]
  269. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 点价合约代码
  270. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 点价商品名称
  271. PRICEMOVE float64 `json:"pricemove" xorm:"'PRICEMOVE'"` // 升贴水 [2:点价 3:暂定价]
  272. STARTDATE string `json:"startdate" xorm:"'STARTDATE'"` // 点价开始日期 [2:点价 3:暂定价]
  273. ENDDATE string `json:"enddate" xorm:"'ENDDATE'"` // 点价结束日期 [2:点价 3:暂定价]
  274. MARGIN float64 `json:"margin" xorm:"'MARGIN'"` // 当前保证金
  275. CONTRACTMARGIN float64 `json:"contractmargin" xorm:"'CONTRACTMARGIN'"` // 合同保证金
  276. EnumdicName string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位名称
  277. CONTRACCTSTATUS int32 `json:"contracctstatus" xorm:"'CONTRACTSTATUS'"` // 合同状态 - 0:未提交 1:待审核 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回
  278. Remark string `json:"remark" xorm:"'Remark'"` // 备注
  279. AUDITREMARK string `json:"auditremark" xorm:"'AUDITREMARK'"` // 审核意见
  280. AUDITTIME string `json:"audittime" xorm:"'AUDITTIME'"` // 审核时间
  281. CREATETIME string `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  282. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  283. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 现货品牌ID(DGFactoryItem表的ID)
  284. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  285. ATTACHMENT string `json:"attachment" xorm:"'ATTACHMENT'"` // 附件
  286. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 单位id(取品类上的单位id)
  287. // 筛选条件
  288. QryType int32 `json:"-"` // 查询类型 1-未提交 2-待审核 3-履约中 4-已完成
  289. UserType int32 `json:"-"` // 用户类型 2-管理员 7-企业成员
  290. OwnUserId int64 `json:"-"` // 登录用户id
  291. }
  292. func (r *Ermcp3Contract) getQryTypeStatus() string {
  293. var status string
  294. switch r.QryType {
  295. case 1: // 未提交
  296. status = "0,4,6"
  297. case 2: // 待审核
  298. status = "1"
  299. case 3: // 履约中
  300. status = "2"
  301. case 4: // 已完成
  302. status = "3,5"
  303. }
  304. return status
  305. }
  306. func (r *Ermcp3Contract) calc() {
  307. r.BUYUSERName = mtpcache.GetUserNameByUserId(r.BUYUSERID)
  308. r.SELLUSERNAME = mtpcache.GetUserNameByUserId(r.SELLUSERID)
  309. r.EnumdicName = mtpcache.GetEnumDicitemName(r.UNITID)
  310. }
  311. func (r *Ermcp3Contract) buildSql() string {
  312. var sqlId utils.SQLVal = "SELECT to_char(t.SPOTCONTRACTID) SPOTCONTRACTID," +
  313. " t.CONTRACTNO," +
  314. " t.CONTRACTTYPE," +
  315. " t.USERID," +
  316. " t.BUYUSERID," +
  317. " t.SELLUSERID," +
  318. " t.DELIVERYGOODSID," +
  319. " t.wrstandardid," +
  320. " t.PRODUCTTYPE," +
  321. " w.CONVERTFACTOR," +
  322. " t.SPOTGOODSDESC," +
  323. " t.PRICETYPE," +
  324. " t.QTY," +
  325. " t.PRICE," +
  326. " t.AMOUNT," +
  327. " to_char(t.DELIVERYSTARTDATE, 'yyyy-mm-dd hh24:mi:ss') DELIVERYSTARTDATE," +
  328. " to_char(t.DELIVERYENDDATE, 'yyyy-mm-dd hh24:mi:ss') DELIVERYENDDATE," +
  329. " t.GOODSID," +
  330. " t.PRICEMOVE," +
  331. " to_char(t.STARTDATE, 'yyyy-mm-dd hh24:mi:ss') STARTDATE," +
  332. " to_char(t.ENDDATE, 'yyyy-mm-dd hh24:mi:ss') ENDDATE," +
  333. " t.MARGIN," +
  334. " t.contractmargin," +
  335. " t.remark," +
  336. " t.auditremark," +
  337. " to_char(t.contractattachment) attachment," +
  338. " t.contractstatus," +
  339. " t.SPOTGOODSBRANDID," +
  340. " to_char(t.audittime, 'yyyy-mm-dd hh24:mi:ss') audittime," +
  341. " to_char(t.createtime, 'yyyy-mm-dd hh24:mi:ss') createtime," +
  342. " to_char(t.updatetime, 'yyyy-mm-dd hh24:mi:ss') updatetime," +
  343. " g.deliverygoodscode," +
  344. " g.deliverygoodsname," +
  345. " g2.goodscode," +
  346. " g2.goodsname," +
  347. " gb.dgfactoryitemvalue brandname," +
  348. " w.wrstandardname," +
  349. " w.wrstandardcode," +
  350. " w.unitid" +
  351. " FROM ERMCP_SPOTCONTRACT t" +
  352. " left join deliverygoods g" +
  353. " on t.deliverygoodsid = g.deliverygoodsid" +
  354. " left join goods g2" +
  355. " on t.goodsid = g2.goodsid" +
  356. " left join DGFACTORYITEM gb" +
  357. " on t.spotgoodsbrandid = gb.dgfactoryitemid" +
  358. " left join wrstandard w" +
  359. " on t.wrstandardid = w.wrstandardid" +
  360. " where 1 = 1"
  361. sqlId.AndEx("t.userid", r.USERID, r.USERID > 0)
  362. sqlId.AndEx("t.SPOTCONTRACTID", r.SPOTCONTRACTID, len(r.SPOTCONTRACTID) > 0)
  363. if r.UserType == 7 {
  364. // 企业成员
  365. sqlId.Join(fmt.Sprintf(" and %v in(t.saleuserid, t.tradeuserid, t.meruserid)", r.OwnUserId))
  366. }
  367. status := r.getQryTypeStatus()
  368. if len(status) > 0 {
  369. sqlId.Join(fmt.Sprintf(" and t.contractstatus in (%v)", status))
  370. }
  371. return sqlId.String()
  372. }
  373. // GetDataEx
  374. func (r *Ermcp3Contract) GetDataEx() (interface{}, error) {
  375. sData := make([]Ermcp3Contract, 0)
  376. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  377. for i := range sData {
  378. sData[i].calc()
  379. }
  380. return sData, err
  381. }
  382. // Ermcp3SellBuyContract 采购/销售合同
  383. type Ermcp3SellBuyContract struct {
  384. UserID int64 `json:"userid" xorm:"'UserID'"` // 机构ID
  385. SpotContractId string `json:"spotcontractid" xorm:"'SPOTCONTRACTID'"` // 合同ID
  386. AccountName string `json:"accountname" xorm:"'ACCOUNTNAME'"` // 账户名称
  387. DeliveryGoodsId int `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货商品ID
  388. DeliveryGoodsCode string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  389. DeliveryGoodsName string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  390. SpotGoodsdesc string `json:"spotgoodsdesc" xorm:"'SPOTGOODSDESC'"` // 商品型号(商品规格)
  391. GoodsId int `json:"goodsid" xorm:"'GOODSID'"` // 点价商品ID
  392. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 点价商品名称
  393. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'"` // 点价商品代码
  394. Pricemove float64 `json:"pricemove" xorm:"'PRICEMOVE'"` // 升贴水
  395. Qty float64 `json:"qty" xorm:"'QTY'"` // 合同量
  396. UnpricedQty float64 `json:"unpricedqty" xorm:"'UNPRICEDQTY'"` // 未定价量
  397. PricedQty float64 `json:"pricedqty" xorm:"'PRICEDQTY'"` // 已定价量
  398. UnsureQty float64 `json:"unsureqty" xorm:"'UNSUREQTY'"` // 未确定量
  399. PayAmount float64 `json:"payamount" xorm:"'PAYAMOUNT'"` // 已收付额(收款或付款)
  400. UnpayAmount float64 `json:"unpayamount"` // 应收付款额(应支付或应收款)
  401. PrePayAmount float64 `json:"prepayamount"` // 预收付额
  402. InvoiceAmount float64 `json:"invoiceamount" xorm:"'INVOICEAMOUNT'"` // 已开票额
  403. DaikaiAmount float64 `json:"daikaiamount" xorm:"'DAIKAIAMOUNT'"` // 应收(开)票额
  404. PreInvoiceAmount float64 `json:"preinvoiceamount"` // 预收(开)票额
  405. StartDate string `json:"startdate" xorm:"'STARTDATE'"` // 点价开始日
  406. EndDate string `json:"enddate" xorm:"'ENDDATE'"` // 点价结束日
  407. DeliveryStartDate string `json:"deliverystartdate" xorm:"'DELIVERYSTARTDATE'"` // 交割开始日
  408. DeliveryendDate string `json:"deliveryenddate" xorm:"'DELIVERYENDDATE'"` // 交割结束日
  409. Convertfactor float64 `json:"convertfactor" xorm:"'CONVERTFACTOR'"` // 标仓系数(品类)
  410. EnumdicName string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位名称
  411. Contracctstatus uint `json:"contracctstatus" xorm:"'CONTRACTSTATUS'"` // 合同状态- 0:未提交 1:待审核 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回
  412. PriceType int `json:"pricetype" xorm:"'PRICETYPE'"` // 定价类型 - 1:一口价 2:点价 3:暂定价
  413. ProductType int `json:"producttype" xorm:"'PRODUCTTYPE'"` // 产品类型 - 1:标准仓单 2:等标 3:非标
  414. Contracttype int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 合同类型 1-采购, -1-销售
  415. Pricedamount float64 `json:"pricedamount" xorm:"'PRICEDAMOUNT'"` // 已定价额
  416. PricedAvg float64 `json:"pricedavg" xorm:"'PRICEDAVG'"` // 已点均价
  417. Margin float64 `json:"margin" xorm:"'MARGIN'"` // 保证金
  418. CONTRACTMARGIN float64 `json:"contractmargin" xorm:"'CONTRACTMARGIN'"` // 合同保证金
  419. Remark string `json:"remark" xorm:"'Remark'"` // 备注
  420. ATTACHMENT string `json:"attachment" xorm:"'ATTACHMENT'"` // 附件
  421. ReckonRealQty float64 `json:"reckonrealqty" xorm:"'ReckonRealQty'"` // 已确定量
  422. ReckonOtherAmount float64 `json:"reckonotheramount" xorm:"'ReckonOtherAmount'"` // 其它费用
  423. ReckonAdjustAmount float64 `json:"reckonadjustamount" xorm:"'ReckonAdjustAmount'"` // 调整金额
  424. Price float64 `json:"price" xorm:"'Price'"` // 价格
  425. LoanAmount float64 `json:"loanamount" xorm:"'LoanAmount'"` // 贷款总额=已定价额+调整金额
  426. Contractno string `json:"contractno" xorm:"'Contractno'"` // 合同编号
  427. TotalAmount float64 `json:"totalamount" xorm:"'-'"` // 合计总额
  428. ReckonedAmount float64 `json:"reckonedamount" xorm:"'ReckonedAmount'"` // 实际已收付额(已确定额,已收付总额-已退款总额)
  429. BUYUSERID int64 `json:"-" xorm:"'BUYUSERID'"` // 采购方ID
  430. SELLUSERID int64 `json:"-" xorm:"'SELLUSERID'"` // 销售方ID
  431. AUDITTIME string `json:"audittime" xorm:"'AUDITTIME'"` // 审核时间
  432. CREATETIME string `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  433. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 现货品牌ID(DGFactoryItem表的ID)
  434. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  435. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类ID
  436. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  437. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  438. // 筛选条件
  439. QryType int32 `json:"-"` // 查询类型 1-未提交 2-待审核 3-履约中 4-已完成
  440. UserType int32 `json:"-"` // 用户类型 2-管理员 7-企业成员
  441. OwnUserId int64 `json:"-"` // 登录用户id
  442. }
  443. func (r *Ermcp3SellBuyContract) calc() {
  444. r.TotalAmount = r.LoanAmount + r.ReckonOtherAmount
  445. r.UnpayAmount = r.TotalAmount - r.ReckonedAmount
  446. r.PrePayAmount = r.ReckonedAmount - r.TotalAmount
  447. r.PreInvoiceAmount = r.InvoiceAmount - r.TotalAmount
  448. if r.Contracttype == 1 {
  449. //采购合同, 取销售方名称
  450. r.AccountName = mtpcache.GetUserNameByUserId(r.SELLUSERID)
  451. } else {
  452. //销售合同, 取采购方名称
  453. r.AccountName = mtpcache.GetUserNameByUserId(r.BUYUSERID)
  454. }
  455. }
  456. func (r *Ermcp3SellBuyContract) buildSql() string {
  457. var sqlId utils.SQLVal = "select t.contractno," +
  458. " to_char(t.SpotContractId) SpotContractId," +
  459. " t.deliverygoodsid," +
  460. " t.spotgoodsdesc," +
  461. " t.goodsid," +
  462. " t.pricemove," +
  463. " t.userid," +
  464. " t.BUYUSERID," +
  465. " t.SELLUSERID," +
  466. " t.qty," +
  467. " t.qty - t.pricedqty unpricedqty," +
  468. " t.pricedqty," +
  469. " (case" +
  470. " when t.pricetype = 3 then" +
  471. " t.qty - t.RECKONREALQTY" +
  472. " else" +
  473. " t.pricedqty - t.ReckonRealQty" +
  474. " end) unsureqty," +
  475. " t.reckonedamount PayAmount," +
  476. " t.invoiceamount," +
  477. " (t.pricedamount + t.RECKONADJUSTAMOUNT + t.RECKONOTHERAMOUNT -" +
  478. " t.invoiceamount) as daikaiAmount," +
  479. " to_char(t.startdate, 'yyyy-mm-dd hh24:mi:ss') startdate," +
  480. " to_char(t.enddate, 'yyyy-mm-dd hh24:mi:ss') enddate," +
  481. " to_char(t.deliverystartdate, 'yyyy-mm-dd hh24:mi:ss') deliverystartdate," +
  482. " to_char(t.deliveryenddate, 'yyyy-mm-dd hh24:mi:ss') deliveryenddate," +
  483. " w.convertfactor," +
  484. " t.contractstatus," +
  485. " t.pricetype," +
  486. " t.producttype," +
  487. " t.contracttype," +
  488. " t.remark," +
  489. " to_char(t.contractattachment) attachment," +
  490. " t.margin," +
  491. " t.contractmargin," +
  492. " t.SPOTGOODSBRANDID," +
  493. " g.deliverygoodscode," +
  494. " g.deliverygoodsname," +
  495. " wr.wrstandardid," +
  496. " wr.wrstandardname," +
  497. " wr.wrstandardcode," +
  498. " g2.goodscode," +
  499. " g2.goodsname," +
  500. " e.enumdicname," +
  501. " t.contracttype," +
  502. " t.pricedamount," +
  503. " case" +
  504. " when t.pricedqty > 0 then" +
  505. " (t.pricedamount) / t.pricedqty" +
  506. " else" +
  507. " 0" +
  508. " end pricedAvg," +
  509. " t.ReckonRealQty," +
  510. " t.ReckonOtherAmount," +
  511. " t.ReckonAdjustAmount," +
  512. " t.Price," +
  513. " t.ReckonedAmount," +
  514. " to_char(t.audittime, 'yyyy-mm-dd hh24:mi:ss') audittime," +
  515. " to_char(t.createtime, 'yyyy-mm-dd hh24:mi:ss') createtime," +
  516. " t.pricedamount + t.ReckonAdjustAmount as LoanAmount," +
  517. " gb.dgfactoryitemvalue BRANDNAME" +
  518. " from ermcp_spotcontract t" +
  519. " left join deliverygoods g" +
  520. " on t.deliverygoodsid = g.deliverygoodsid" +
  521. " left join goods g2" +
  522. " on t.goodsid = g2.goodsid" +
  523. " left join wrstandard wr" +
  524. " on t.wrstandardid = wr.wrstandardid" +
  525. " left join DGFactoryItem gb" +
  526. " on t.spotgoodsbrandid = gb.dgfactoryitemid" +
  527. " left join enumdicitem e" +
  528. " on wr.unitid = e.enumitemname" +
  529. " and e.enumdiccode = 'goodsunit'" +
  530. " where 1 = 1"
  531. sqlId.AndEx("t.userid", r.UserID, r.UserID > 0)
  532. sqlId.AndEx("t.SpotContractId", r.SpotContractId, len(r.SpotContractId) > 0)
  533. if r.UserType == 7 {
  534. // 企业成员
  535. sqlId.Join(fmt.Sprintf(" and %v in(t.saleuserid, t.tradeuserid, t.meruserid)", r.OwnUserId))
  536. }
  537. var tmp = Ermcp3Contract{QryType: r.QryType}
  538. status := tmp.getQryTypeStatus()
  539. if len(status) > 0 {
  540. sqlId.Join(fmt.Sprintf(" and t.contractstatus in (%v)", status))
  541. }
  542. return sqlId.String()
  543. }
  544. // GetDataEx
  545. func (r *Ermcp3SellBuyContract) GetDataEx() (interface{}, error) {
  546. sData := make([]Ermcp3SellBuyContract, 0)
  547. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  548. for i := range sData {
  549. sData[i].calc()
  550. }
  551. return sData, err
  552. }