Преглед на файлове

增加查合同、品类、报表等N个新接口

zou.yingbin преди 4 години
родител
ревизия
49af91c762
променени са 12 файла, в които са добавени 2729 реда и са изтрити 622 реда
  1. 147 9
      controllers/ermcp3/qryErmcp3.go
  2. 208 0
      controllers/ermcp3/qryErmcp3Report.go
  3. 311 225
      docs/docs.go
  4. 311 225
      docs/swagger.json
  5. 813 115
      docs/swagger.yaml
  6. 391 22
      models/ermcp3.go
  7. 451 0
      models/ermcp3Report.go
  8. 2 2
      models/ermcpSpotGoodsPrice.go
  9. 45 8
      mtpcache/useraccount.go
  10. 29 16
      mtpcache/username.go
  11. 13 0
      routers/router.go
  12. 8 0
      token/token.go

+ 147 - 9
controllers/ermcp3/qryErmcp3.go

@@ -60,12 +60,12 @@ func QueryDeliveryGoodsDetail(c *gin.Context) {
 
 // QryContractReq 查询合同请求
 type QryContractReq struct {
-	AreadUserId  int64  `form:"areauserid" binding:"required"`   // 所属机构Id
-	CONTRACTTYPE int32  `form:"contracttype" binding:"required"` // 合同类型 1-采购, -1-销售
-	QUERYTYPE    int64  `form:"querytype" binding:"required"`    // 查询类型 1-全部 2-待点价 3-履约结算 4-已完成
-	USERID       int64  `form:"userid"`                          // 用户Id
-	USERTYPE     int32  `form:"usertype"`                        // 用户类型
-	CONTRACTID   string `form:"contractid"`                      // 合同ID(SpotContractId)
+	AreadUserId  int64  `form:"areauserid" binding:"required"` // 所属机构Id
+	CONTRACTTYPE int32  `form:"contracttype"`                  // 合同类型 1-采购, -1-销售
+	QUERYTYPE    int32  `form:"querytype" binding:"required"`  // 查询类型 1-全部 2-待点价 3-履约结算 4-已完成
+	USERID       int64  `form:"userid"`                        // 用户Id
+	USERTYPE     int32  `form:"usertype"`                      // 用户类型
+	CONTRACTID   string `form:"contractid"`                    // 合同ID(SpotContractId)
 }
 
 // QuerySpotContract
@@ -73,7 +73,6 @@ type QryContractReq struct {
 // @Produce json
 // @Security ApiKeyAuth
 // @Param areauserid query int true "所属机构ID"
-// @Param contracttype query int true "合同类型 1-采购, -1-销售"
 // @Param querytype query int true "查询类型 1-全部 2-待点价 3-履约结算 4-已完成"
 // @Param userid query int false "用户ID"
 // @Param usertype query int false "用户类型 2-机构 7-企业成员"
@@ -86,7 +85,7 @@ func QuerySpotContract(c *gin.Context) {
 	a := app.GinUtils{Gin: app.Gin{C: c}}
 	req := QryContractReq{}
 	a.DoBindReq(&req)
-	m := models.Ermcp3Contract{USERID: req.AreadUserId, CONTRACTTYPE: req.CONTRACTTYPE,
+	m := models.Ermcp3Contract{USERID: req.AreadUserId, QryType: req.QUERYTYPE,
 		OwnUserId: req.USERID, UserType: req.USERTYPE, SPOTCONTRACTID: req.CONTRACTID}
 	a.DoGetDataI(&m)
 }
@@ -110,6 +109,145 @@ func QuerySpotContractBS(c *gin.Context) {
 	req := QryContractReq{}
 	a.DoBindReq(&req)
 	m := models.Ermcp3SellBuyContract{UserID: req.AreadUserId, Contracttype: req.CONTRACTTYPE,
-		OwnUserId: req.USERID, UserType: req.USERTYPE, SpotContractId: req.CONTRACTID}
+		OwnUserId: req.USERID, UserType: req.USERTYPE, SpotContractId: req.CONTRACTID, QryType: req.QUERYTYPE}
 	a.DoGetDataI(&m)
 }
+
+// QueryExposureDetail
+// @Summary 查询敞口现货明细
+// @Produce json
+// @Security ApiKeyAuth
+// @Param areaUserId query int true "所属机构ID"
+// @Param middleGoodsId query int true "套保商品"
+// @Success 200 {array} models.Ermcp3ExposureDetail
+// @Failure 500 {object} app.Response
+// @Router /Ermcp3/QueryExposureDetail [get]
+// @Tags 企业风险管理v3(app)
+func QueryExposureDetail(c *gin.Context) {
+	a := app.GinUtils{Gin: app.Gin{C: c}}
+	req := struct {
+		AREAUSERID    int64 `form:"areauserid" binding:"required"`    // 所属机构id
+		MIDDLEGOODSID int32 `form:"middlegoodsid" binding:"required"` // 套保商品id
+	}{}
+	a.DoBindReq(&req)
+	m := models.Ermcp3ExposureDetail{Areauserid: req.AREAUSERID, MiddlegoodsId: req.MIDDLEGOODSID}
+	a.DoGetDataI(&m)
+}
+
+// QueryExposureSpot
+// @Summary 查询敞口现货头寸(敞口/现货头寸)
+// @Produce json
+// @Security ApiKeyAuth
+// @Param areaUserId query int true "所属机构ID"
+// @Success 200 {array} models.Ermcp3AreaSpot
+// @Failure 500 {object} app.Response
+// @Router /Ermcp3/QueryExposureSpot [get]
+// @Tags 企业风险管理v3(app)
+func QueryExposureSpot(c *gin.Context) {
+	a := app.GinUtils{Gin: app.Gin{C: c}}
+	req := struct {
+		AREAUSERID int64 `form:"areauserid" binding:"required"` // 所属机构id
+	}{}
+	a.DoBindReq(&req)
+	m := models.Ermcp3AreaSpot{AREAUSERID: req.AREAUSERID}
+	a.DoGetDataI(&m)
+}
+
+// QueryExposureSpotDetail
+// @Summary 查询敞口现货头寸明细(敞口/现货头寸/现货明细)
+// @Produce json
+// @Security ApiKeyAuth
+// @Param areauserid query int true "所属机构ID"
+// @Param deliverygoodsid query int true "现货品种ID"
+// @Success 200 {array} models.Ermcp3AreaSpotDetail
+// @Failure 500 {object} app.Response
+// @Router /Ermcp3/QueryExposureSpotDetail [get]
+// @Tags 企业风险管理v3(app)
+func QueryExposureSpotDetail(c *gin.Context) {
+	appG := app.GinUtils{Gin: app.Gin{C: c}}
+	req := struct {
+		AREAUSERID      int   `form:"areauserid" binding:"required"`      // 所属机构id
+		DELIVERYGOODSID int32 `form:"deliverygoodsid" binding:"required"` // 现货商品id
+	}{}
+	appG.DoBindReq(&req)
+	m := models.Ermcp3AreaSpotDetail{UserId: req.AREAUSERID, DELIVERYGOODSID: req.DELIVERYGOODSID}
+	appG.DoGetDataI(&m)
+}
+
+// QueryDGFactoryItem
+// @Summary 查询品种要素定义项
+// @Produce json
+// @Security ApiKeyAuth
+// @Param areauserid query int false "所属机构ID"
+// @Param dgfactoryitemid query int false "选择项ID(SEQ_DGFACTORYITEM)"
+// @Param deliverygoodsid query int false "现货品种ID"
+// @Param dgfactoryitemtypeid query int false "要素项类型"
+// @Param orderindex query int false "顺序"
+// @Success 200 {array} models.ErmcpDGFactoryItem
+// @Failure 500 {object} app.Response
+// @Router /Ermcp3/QueryDGFactoryItem [get]
+// @Tags 企业风险管理v3(app)
+func QueryDGFactoryItem(c *gin.Context) {
+	appG := app.GinUtils{Gin: app.Gin{C: c}}
+	req := struct {
+		AREAUSERID          int64 `form:"areauserid"`          // 用户id
+		DGFACTORYITEMID     int64 `form:"dgfactoryitemid"`     // 选择项ID(SEQ_DGFACTORYITEM)
+		DELIVERYGOODSID     int32 `form:"deliverygoodsid"`     // 现货品种ID
+		DGFACTORYITEMTYPEID int64 `form:"dgfactoryitemtypeid"` // 要素项类型
+		ORDERINDEX          int32 `form:"orderindex"`          // 顺序
+	}{}
+	appG.DoBindReq(&req)
+	m := models.ErmcpDGFactoryItem{
+		AREAUSERID:          req.AREAUSERID,
+		DGFACTORYITEMID:     req.DGFACTORYITEMID,
+		DELIVERYGOODSID:     req.DELIVERYGOODSID,
+		DGFACTORYITEMTYPEID: req.DGFACTORYITEMTYPEID,
+		ORDERINDEX:          req.ORDERINDEX,
+	}
+	appG.DoGetDataI(&m)
+}
+
+// QueryGoodsbrand
+// @Summary 查询商品品牌
+// @Produce json
+// @Security ApiKeyAuth
+// @Param areauserid query int true "所属机构ID"
+// @Success 200 {array} models.Ermcp3Brand
+// @Failure 500 {object} app.Response
+// @Router /Ermcp3/QueryGoodsbrand [get]
+// @Tags 企业风险管理v3(app)
+func QueryGoodsbrand(c *gin.Context) {
+	appG := app.GinUtils{Gin: app.Gin{C: c}}
+	req := struct {
+		AREAUSERID      int64 `form:"areauserid"`      // 用户id
+		DELIVERYGOODSID int32 `form:"deliverygoodsid"` // 现货品种ID
+	}{}
+	appG.DoBindReq(&req)
+	m := models.Ermcp3Brand{
+		AREAUSERID:      req.AREAUSERID,
+		DELIVERYGOODSID: req.DELIVERYGOODSID,
+	}
+	appG.DoGetDataI(&m)
+}
+
+// QueryGoodsWrstandard
+// @Summary 查询商品品类
+// @Produce json
+// @Security ApiKeyAuth
+// @Param areauserid query int true  "所属机构ID"
+// @Param deliverygoodsid query int false  "现货商品id"
+// @Success 200 {array} models.Ermcp3Wrstandard
+// @Failure 500 {object} app.Response
+// @Router /Ermcp3/QueryGoodsWrstandard [get]
+// @Tags 企业风险管理v3(app)
+func QueryGoodsWrstandard(c *gin.Context) {
+	appG := app.GinUtils{Gin: app.Gin{C: c}}
+	req := struct {
+		AREAUSERID      int   `form:"areauserid" binding:"required"` // 所属机构id
+		DELIVERYGOODSID int32 `form:"deliverygoodsid"`               // 现货商品id
+	}{}
+	appG.DoBindReq(&req)
+	m := models.Ermcp3Wrstandard{AREAUSERID: req.AREAUSERID,
+		DELIVERYGOODSID: req.DELIVERYGOODSID}
+	appG.DoGetDataI(&m)
+}

+ 208 - 0
controllers/ermcp3/qryErmcp3Report.go

@@ -0,0 +1,208 @@
+/**
+* @Author: zou.yingbin
+* @Create  : 2021/4/16 18:40
+* @Modify  : 2021/4/16 18:40
+ */
+
+package ermcp3
+
+import (
+	"github.com/gin-gonic/gin"
+	"mtp2_if/global/app"
+	"mtp2_if/global/e"
+	"mtp2_if/models"
+	"net/http"
+	"strconv"
+)
+
+// 查询日期
+type QueryDate string
+
+// IsNumberic 判断是否为数字,
+func (v QueryDate) IsNumberic(queryType int32) bool {
+	if queryType == 1 {
+		// 日报表 日期长度YYYYMMDD
+		if len(v) != 8 {
+			return false
+		}
+	} else if queryType == 2 {
+		// 月报表 日期长度YYYYMM
+		if len(v) != 6 {
+			return false
+		}
+	}
+	// 判断是否为数字
+	if _, err := strconv.ParseInt(string(v), 10, 32); err != nil {
+		return false
+	}
+	return true
+}
+
+// @Summary 查询现货日报表详情(菜单:报表查询/现货报表/现货日报表详情)
+// @Produce json
+// @Security ApiKeyAuth
+// @Param userid query int true "用户ID"
+// @Param deliverygoodsid query int true "现货商品id"
+// @Param tradedate query string true "交易日(格式:yyyyMMdd)"
+// @Success 200 {array} models.Ermcp3ReportOPLog
+// @Failure 500 {object} app.Response
+// @Router /Ermcp3/QryReportDaySpotDetail [get]
+// @Tags 企业风险管理v3(app)
+func QryReportDaySpotDetail(c *gin.Context) {
+	a := app.GinUtils{Gin: app.Gin{C: c}}
+	req := struct {
+		USERID          int64  `form:"userid" binding:"required"`          // 用户id
+		DELIVERYGOODSID int32  `form:"deliverygoodsid" binding:"required"` // 现货商品id
+		TRADEDATE       string `form:"tradedate" binding:"required"`       // 交易日
+	}{}
+	a.DoBindReq(&req)
+	m := models.Ermcp3ReportOPLog{USERID: req.USERID, DELIVERYGOODSID: req.DELIVERYGOODSID,
+		TRADEDATE: req.TRADEDATE, LogTypeFilter: "2,3"}
+	a.DoGetDataI(&m)
+}
+
+// @Summary 查询财务日报表款项(菜单:报表查询/财务报表/日报表/款项)
+// @Produce json
+// @Security ApiKeyAuth
+// @Param userid query int true "用户ID"
+// @Param tradedate query string true "交易日(格式:yyyyMMdd)"
+// @Success 200 {array} models.Ermcp3ReportOPLog
+// @Failure 500 {object} app.Response
+// @Router /Ermcp3/QryReportDayFinanceKx [get]
+// @Tags 企业风险管理v3(app)
+func QryReportDayFinanceKx(c *gin.Context) {
+	a := app.GinUtils{Gin: app.Gin{C: c}}
+	req := struct {
+		USERID    int64  `form:"userid" binding:"required"`    // 用户id
+		TRADEDATE string `form:"tradedate" binding:"required"` // 交易日
+	}{}
+	a.DoBindReq(&req)
+	m := models.Ermcp3ReportOPLog{USERID: req.USERID, TRADEDATE: req.TRADEDATE, LogTypeFilter: "8,9,10"}
+	a.DoGetDataI(&m)
+}
+
+// @Summary 查询财务日报表发票(菜单:报表查询/财务报表/日报表/发票)
+// @Produce json
+// @Security ApiKeyAuth
+// @Param userid query int true "用户ID"
+// @Param tradedate query string true "交易日(格式:yyyyMMdd)"
+// @Success 200 {array} models.Ermcp3ReportOPLog
+// @Failure 500 {object} app.Response
+// @Router /Ermcp3/QryReportDayFinanceFp [get]
+// @Tags 企业风险管理v3(app)
+func QryReportDayFinanceFp(c *gin.Context) {
+	a := app.GinUtils{Gin: app.Gin{C: c}}
+	req := struct {
+		USERID    int64  `form:"userid" binding:"required"`    // 用户id
+		TRADEDATE string `form:"tradedate" binding:"required"` // 交易日
+	}{}
+	a.DoBindReq(&req)
+	m := models.ErmcpReportOPLog{USERID: req.USERID, TRADEDATE: req.TRADEDATE, LogTypeFilter: "11, 12"}
+	a.DoGetDataI(&m)
+}
+
+// @Summary 查询现货日报表(菜单:报表查询/现货报表/现货日报表)
+// @Produce json
+// @Security ApiKeyAuth
+// @Param userid query int true "用户ID"
+// @Param tradedate query string true "交易日(格式:yyyyMMdd)"
+// @Success 200 {array} models.Ermcp3ReportDaySpot
+// @Failure 500 {object} app.Response
+// @Router /Ermcp3/QryReportDaySpot [get]
+// @Tags 企业风险管理v3(app)
+func QryReportDaySpot(c *gin.Context) {
+	a := app.GinUtils{Gin: app.Gin{C: c}}
+	req := struct {
+		USERID    int64  `form:"userid" binding:"required"`    // 用户id
+		TRADEDATE string `form:"tradedate" binding:"required"` // 交易日
+	}{}
+	a.DoBindReq(&req)
+	m := models.Ermcp3ReportDaySpot{AREAUSERID: req.USERID, RECKONDATE: req.TRADEDATE}
+	a.DoGetDataI(&m)
+}
+
+// QryReportMonthSpot
+// @Summary 查询现货月报表(菜单:报表查询/现货报表/现货月报表)
+// @Produce json
+// @Security ApiKeyAuth
+// @Param userid query int true "用户ID"
+// @Param cycletime query string true "周期时间:月(格式:yyyyMM)"
+// @Success 200 {array} models.Ermcp3ReportMonSpot
+// @Failure 500 {object} app.Response
+// @Router /Ermcp3/QryReportMonthSpot [get]
+// @Tags 企业风险管理v3(app)
+func QryReportMonthSpot(c *gin.Context) {
+	a := app.GinUtils{Gin: app.Gin{C: c}}
+	req := struct {
+		UserId    int64  `form:"userid" binding:"required"`    //用户ID
+		CycleTime string `form:"cycletime" binding:"required"` // 周期时间:月(格式:yyyyMM)
+	}{}
+	a.DoBindReq(&req)
+	m := models.Ermcp3ReportMonSpot{AREAUSERID: req.UserId, CYCLETIME: req.CycleTime}
+	a.DoGetDataI(&m)
+}
+
+// @Summary 查询现货月报表详情(菜单:报表查询/现货月报表/现货月报表详情)
+// @Produce json
+// @Security ApiKeyAuth
+// @Param userid query int true "用户ID"
+// @Param wrstandardid query int true "现货商品id"
+// @Param cycletime query string true "周期时间:月(格式:yyyyMM)"
+// @Success 200 {array} models.Ermcp3ReportDaySpot
+// @Failure 500 {object} app.Response
+// @Router /Ermcp3/QryReportMonthSpotDetail [get]
+// @Tags 企业风险管理v3(app)
+func QryReportMonthSpotDetail(c *gin.Context) {
+	a := app.GinUtils{Gin: app.Gin{C: c}}
+	req := struct {
+		UserId          int64  `form:"userid" binding:"required"`          // 用户ID
+		DELIVERYGOODSID int32  `form:"deliverygoodsid" binding:"required"` // 现货商品id
+		CycleTime       string `form:"cycletime" binding:"required"`       // 周期时间:月(格式:yyyyMM)
+	}{}
+	a.DoBindReq(&req)
+	if len(req.CycleTime) != 6 {
+		// 月报表的日期应是6位,如 202101
+		a.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
+		return
+	}
+	t1 := req.CycleTime + "01"
+	t2 := req.CycleTime + "31"
+	m := models.Ermcp3ReportDaySpot{AREAUSERID: req.UserId, DELIVERYGOODSID: req.DELIVERYGOODSID,
+		BeginDate: t1, EndDate: t2}
+	a.DoGetDataI(&m)
+}
+
+// QryReportAreaSpotPL
+// @Summary 查询现货损益报表(现货损益报表)
+// @Produce json
+// @Security ApiKeyAuth
+// @Param userid query int true "用户ID"
+// @Param querytype query int true "查询类型 1-日报表 2-月报表"
+// @Param querydate query string true "查询日期(格式 日报表YYYYMMDD, 月报表YYYYMM)"
+// @Param deliverygoodsid query int false "现货商品ID"
+// @Param spotgoodsbrandid query int false "品牌ID"
+// @Param wrstandardid query int false "品类ID"
+// @Success 200 {array} models.Ermcp3ReportAreaSpotPL
+// @Failure 500 {object} app.Response
+// @Router /Ermcp3/QryReportAreaSpotPL [get]
+// @Tags 企业风险管理v3(app)
+func QryReportAreaSpotPL(c *gin.Context) {
+	a := app.GinUtils{Gin: app.Gin{C: c}}
+	req := struct {
+		USERID           int64  `form:"userid" binding:"required"`    // 用户id
+		QUERYTYPE        int32  `form:"querytype" binding:"required"` // 查询类型
+		QUERYDATE        string `form:"querydate" binding:"required"` // 交易日
+		DELIVERYGOODSID  int32  `form:"deliverygoodsid"`              // 现货商品id
+		SPOTGOODSBRANDID int32  `form:"spotgoodsbrandid"`             // 现货品牌id
+		WRSTANDARDID     int64  `form:"wrstandardid"`                 // 品类id
+	}{}
+	a.DoBindReq(&req)
+	if QueryDate(req.QUERYDATE).IsNumberic(req.QUERYTYPE) {
+		m := models.Ermcp3ReportAreaSpotPL{AREAUSERID: req.USERID, WRSTANDARDID: req.WRSTANDARDID,
+			SPOTGOODSBRANDID: req.SPOTGOODSBRANDID, DELIVERYGOODSID: req.DELIVERYGOODSID,
+			ReportDate: req.QUERYDATE, ReportType: req.QUERYTYPE}
+		a.DoGetDataI(&m)
+	} else {
+		a.Gin.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
+	}
+}

Файловите разлики са ограничени, защото са твърде много
+ 311 - 225
docs/docs.go


Файловите разлики са ограничени, защото са твърде много
+ 311 - 225
docs/swagger.json


Файловите разлики са ограничени, защото са твърде много
+ 813 - 115
docs/swagger.yaml


+ 391 - 22
models/ermcp3.go

@@ -81,13 +81,14 @@ func (r *ErmcpDeliveryGoods) GetData() ([]ErmcpDeliveryGoods, error) {
 
 // ErmcpDGFactoryItem 品种选择项定义表
 type ErmcpDGFactoryItem struct {
-	DGFACTORYITEMID     int64  // 选择项ID(SEQ_DGFACTORYITEM)
-	DELIVERYGOODSID     int32  // 品种ID
-	DGFACTORYITEMTYPEID int64  // 要素项类型
-	DGFACTORYITEMVALUE  string // 要素项值(类型为仓库时填写仓库名称)
-	WAREHOUSEID         int64  // 仓库ID(类型为仓库时填写)
-	ISVALID             int32  // 是否有效 - 0:无效 1:有效
-	ORDERINDEX          int32  // 顺序
+	DGFACTORYITEMID     int64  `json:"dgfactoryitemid"  xorm:"'DGFACTORYITEMID'"`         // 选择项ID(SEQ_DGFACTORYITEM)
+	DELIVERYGOODSID     int32  `json:"deliverygoodsid"  xorm:"'DELIVERYGOODSID'"`         // 现货品种ID
+	DGFACTORYITEMTYPEID int64  `json:"dgfactoryitemtypeid"  xorm:"'DGFACTORYITEMTYPEID'"` // 要素项类型
+	DGFACTORYITEMVALUE  string `json:"dgfactoryitemvalue"  xorm:"'DGFACTORYITEMVALUE'"`   // 要素项值(类型为仓库时填写仓库名称)
+	WAREHOUSEID         int64  `json:"warehouseid"  xorm:"'WAREHOUSEID'"`                 // 仓库ID(类型为仓库时填写)
+	ISVALID             int32  `json:"isvalid"  xorm:"'ISVALID'"`                         // 是否有效 - 0:无效 1:有效
+	ORDERINDEX          int32  `json:"orderindex"  xorm:"'ORDERINDEX'"`                   // 顺序
+	AREAUSERID          int64  `json:"areauserid"  xorm:"'AREAUSERID'"`                   // 用户id
 }
 
 func (r *ErmcpDGFactoryItem) buildSql() string {
@@ -97,9 +98,13 @@ func (r *ErmcpDGFactoryItem) buildSql() string {
 		"       t.DGFACTORYITEMVALUE," +
 		"       to_char(t.WAREHOUSEID) WAREHOUSEID," +
 		"       t.ISVALID," +
-		"       t.ORDERINDEX" +
+		"       t.ORDERINDEX," +
+		"       g.areauserid" +
 		"  FROM DGFACTORYITEM t" +
-		" WHERE ISVALID = 1"
+		"  left join deliverygoods g" +
+		"    on t.deliverygoodsid = g.deliverygoodsid" +
+		" WHERE t.ISVALID = 1"
+	sqlId.AndEx("g.areauserid", r.AREAUSERID, r.AREAUSERID > 0)
 	sqlId.AndEx("t.DGFACTORYITEMID", r.DGFACTORYITEMID, r.DGFACTORYITEMID > 0)
 	sqlId.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
 	sqlId.AndEx("t.DGFACTORYITEMTYPEID", r.DGFACTORYITEMTYPEID, r.DGFACTORYITEMTYPEID > 0)
@@ -120,25 +125,31 @@ func (r *ErmcpDGFactoryItem) GetData() (interface{}, error) {
 	return sData, err
 }
 
-// ErmcpBrand 品牌(从品种选择项定义表中查)
-type ErmcpBrand struct {
+// Ermcp3Brand 品牌(从品种选择项定义表中查)
+type Ermcp3Brand struct {
 	BRANDID         int64  `json:"brandid"`         // 品牌id
 	BRANDNAME       string `json:"brandname"`       // 品牌名称
 	DELIVERYGOODSID int32  `json:"deliverygoodsid"` // 品种ID
+	AREAUSERID      int64  `json:"areauserid"`      // 用户id
 }
 
-// 获取品牌数据
-func (r *ErmcpBrand) GetData() ([]ErmcpBrand, error) {
+// GetDataEx
+func (r *Ermcp3Brand) GetDataEx() (interface{}, error) {
+	return r.GetData()
+}
+
+// GetData 获取品牌数据
+func (r *Ermcp3Brand) GetData() ([]Ermcp3Brand, error) {
 	m := ErmcpDGFactoryItem{
 		DELIVERYGOODSID:     r.DELIVERYGOODSID,
 		DGFACTORYITEMTYPEID: 2,
 		ORDERINDEX:          1,
 	}
-	sData := make([]ErmcpBrand, 0)
+	sData := make([]Ermcp3Brand, 0)
 	if d, err := m.GetDataEx(); err == nil {
 		if dgLst, ok := d.([]ErmcpDGFactoryItem); ok {
 			for _, val := range dgLst {
-				sData = append(sData, ErmcpBrand{BRANDID: val.DGFACTORYITEMID,
+				sData = append(sData, Ermcp3Brand{BRANDID: val.DGFACTORYITEMID, AREAUSERID: val.AREAUSERID,
 					BRANDNAME: val.DGFACTORYITEMVALUE, DELIVERYGOODSID: val.DELIVERYGOODSID})
 			}
 		}
@@ -189,7 +200,7 @@ func (r *ErmcpRelatedGoods) GetData() ([]ErmcpRelatedGoods, error) {
 type ErmcpDeliveryGoodsDetail struct {
 	Data      ErmcpDeliveryGoods  `json:"data"`      // 现货商品基本信息(交割品种)
 	GmList    []ErmcpWrstandard   `json:"gmlist"`    // 品类列表(仓单标准)
-	GbList    []ErmcpBrand        `json:"gblist"`    // 品牌列表
+	GbList    []Ermcp3Brand       `json:"gblist"`    // 品牌列表
 	WrsList   []WRSConverTDetail  `json:"wrslist"`   // 套保信息列表
 	GoodsList []ErmcpRelatedGoods `json:"goodslist"` // 关联交易商品列表
 
@@ -204,7 +215,7 @@ func (r *ErmcpDeliveryGoodsDetail) addGmList(lst []ErmcpWrstandard) {
 	}
 }
 
-func (r *ErmcpDeliveryGoodsDetail) addGbList(lst []ErmcpBrand) {
+func (r *ErmcpDeliveryGoodsDetail) addGbList(lst []Ermcp3Brand) {
 	for i := range lst {
 		if lst[i].DELIVERYGOODSID == r.Data.DELIVERYGOODSID {
 			r.GbList = append(r.GbList, lst[i])
@@ -242,14 +253,14 @@ func (r *ErmcpDeliveryGoodsDetail) GetDataEx() (interface{}, error) {
 	// 基本信息
 	for i := range data {
 		val := ErmcpDeliveryGoodsDetail{Data: data[i],
-			GmList: make([]ErmcpWrstandard, 0), GbList: make([]ErmcpBrand, 0),
+			GmList: make([]ErmcpWrstandard, 0), GbList: make([]Ermcp3Brand, 0),
 			WrsList: make([]WRSConverTDetail, 0), GoodsList: make([]ErmcpRelatedGoods, 0),
 		}
 		sData = append(sData, val)
 	}
 	//品类/品牌/套保信息
 	gm := ErmcpWrstandard{AREAUSERID: int(r.Data.AREAUSERID), DELIVERYGOODSID: r.Data.DELIVERYGOODSID, ISVALID: 1}
-	gb := ErmcpBrand{DELIVERYGOODSID: r.Data.DELIVERYGOODSID}
+	gb := Ermcp3Brand{DELIVERYGOODSID: r.Data.DELIVERYGOODSID}
 	WrsC := WRSConverTDetail{DELIVERYGOODSID: r.Data.DELIVERYGOODSID}
 	gmLst, _ := gm.GetData()
 	gbLst, _ := gb.GetData()
@@ -314,6 +325,17 @@ type Ermcp3Contract struct {
 	BRANDNAME         string  `json:"brandname"  xorm:"'brandname'"`                 // 品牌名称
 	ATTACHMENT        string  `json:"attachment"  xorm:"'ATTACHMENT'"`               // 附件
 	UNITID            int32   `json:"unitid"  xorm:"'UNITID'"`                       // 单位id(取品类上的单位id)
+	TRADEUSERID       int64   `json:"tradeuserid"  xorm:"'TRADEUSERID'"`             // 交易员id
+	SALEUSERID        int64   `json:"saleuserid"  xorm:"'SALEUSERID'"`               // 销售员id
+	MERUSERID         int64   `json:"meruserid"  xorm:"'MERUSERID'"`                 // 业务员id
+	ACCOUNTID         string  `json:"accountid"  xorm:"'ACCOUNTID'"`                 // 期货账户id
+	BIZTYPE           int32   `json:"biztype"  xorm:"'BIZTYPE'"`                     // 业务类型 1-套保 2-套利
+
+	SELLNICKNAME       string `json:"sellnickname"`       // 采购方昵称
+	BUYNICKNAME        string `json:"buynickname"`        // 销售方昵称
+	TRADEUSERLOGINCODE string `json:"tradeuserlogincode"` // 交易员登录代码
+	SALEUSERLOGINCODE  string `json:"saleuserlogincode"`  // 销售员登录代码
+	MERUSERLOGINCODE   string `json:"meruserlogincode"`   // 业务员登录代码
 
 	// 筛选条件
 	QryType   int32 `json:"-"` // 查询类型 1-未提交 2-待审核 3-履约中 4-已完成
@@ -337,9 +359,12 @@ func (r *Ermcp3Contract) getQryTypeStatus() string {
 }
 
 func (r *Ermcp3Contract) calc() {
-	r.BUYUSERName = mtpcache.GetUserNameByUserId(r.BUYUSERID)
-	r.SELLUSERNAME = mtpcache.GetUserNameByUserId(r.SELLUSERID)
+	r.BUYUSERName, r.BUYNICKNAME = mtpcache.GetUserNameAndNickName(r.BUYUSERID)
+	r.SELLUSERNAME, r.SELLNICKNAME = mtpcache.GetUserNameAndNickName(r.SELLUSERID)
 	r.EnumdicName = mtpcache.GetEnumDicitemName(r.UNITID)
+	r.TRADEUSERLOGINCODE = mtpcache.GetLoginCodeByUserId(r.TRADEUSERID)
+	r.SALEUSERLOGINCODE = mtpcache.GetLoginCodeByUserId(r.SALEUSERID)
+	r.MERUSERLOGINCODE = mtpcache.GetLoginCodeByUserId(r.MERUSERID)
 }
 
 func (r *Ermcp3Contract) buildSql() string {
@@ -381,7 +406,12 @@ func (r *Ermcp3Contract) buildSql() string {
 		"       gb.dgfactoryitemvalue brandname," +
 		"       w.wrstandardname," +
 		"       w.wrstandardcode," +
-		"       w.unitid" +
+		"       w.unitid," +
+		"       t.tradeuserid," +
+		"       t.saleuserid," +
+		"       t.meruserid," +
+		"       to_char(t.accountid) accountid," +
+		"       t.biztype" +
 		"  FROM ERMCP_SPOTCONTRACT t" +
 		"  left join deliverygoods g" +
 		"    on t.deliverygoodsid = g.deliverygoodsid" +
@@ -569,6 +599,7 @@ func (r *Ermcp3SellBuyContract) buildSql() string {
 		"   and e.enumdiccode = 'goodsunit'" +
 		" where 1 = 1"
 	sqlId.AndEx("t.userid", r.UserID, r.UserID > 0)
+	sqlId.AndEx("t.contracttype", r.Contracttype, r.Contracttype != 0)
 	sqlId.AndEx("t.SpotContractId", r.SpotContractId, len(r.SpotContractId) > 0)
 	if r.UserType == 7 {
 		// 企业成员
@@ -591,3 +622,341 @@ func (r *Ermcp3SellBuyContract) GetDataEx() (interface{}, error) {
 	}
 	return sData, err
 }
+
+// Ermcp3ExposureDetail 敞口现货明细
+type Ermcp3ExposureDetail struct {
+	Createtime        string  `json:"createtime"  xorm:"'createtime'"`               // 时间
+	Areauserid        int64   `json:"areauserid"  xorm:"'areauserid'"`               // 机构ID
+	Logtype           int32   `json:"logtype"  xorm:"'logtype'"`                     // 类型 - 1:套保计划 2:现货合同
+	Contracttype      int32   `json:"contracttype"  xorm:"'contracttype'"`           // 现货合同类型 - 1:采购 -1:销售
+	Qty               float64 `json:"qty"  xorm:"'qty'"`                             // 数量
+	RelateNo          string  `json:"relateNo"  xorm:"'relateNo'"`                   // 现货合同/套保计划编号
+	Middlegoodsname   string  `json:"middlegoodsname"  xorm:"'middlegoodsname'"`     // 套保商品名称
+	Middlegoodscode   string  `json:"middlegoodscode"  xorm:"'middlegoodscode'"`     // 套保商品代码
+	MiddlegoodsId     int32   `json:"middlegoodsId"  xorm:"'middlegoodsId'"`         // 套保商品id
+	Unitid            int32   `json:"-"  xorm:"'unitid'"`                            // 现货商品单位ID
+	Enumdicname       string  `json:"enumdicname"  xorm:"'enumdicname'"`             // 现货商品单位名称
+	ChangeQty         float64 `json:"changeQty"  xorm:"'changeQty'"`                 // 套保变动量
+	Convertfactor     float64 `json:"convertfactor"  xorm:"'convertfactor'"`         // 标仓系数
+	Convertratio      float64 `json:"convertratio"  xorm:"'convertratio'"`           // 套保系数
+	DELIVERYGOODSID   int32   `json:"deliverygoodsid"  xorm:"'DELIVERYGOODSID'"`     // 现货品种id
+	DELIVERYGOODSCODE string  `json:"deliverygoodscode"  xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
+	DELIVERYGOODSNAME string  `json:"deliverygoodsname"  xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
+}
+
+func (r *Ermcp3ExposureDetail) calc() {
+	// 销售合同转换为负数
+	if r.Logtype == 2 && r.Contracttype == -1 {
+		r.ChangeQty *= -1
+		r.Qty *= -1
+	}
+
+	// 采购计划 转换为负数
+	if r.Logtype == 1 && r.Contracttype == 1 {
+		r.ChangeQty *= -1
+		r.Qty *= -1
+	}
+}
+
+func (r *Ermcp3ExposureDetail) buildSql() string {
+	var sqlId utils.SQLVal = "with tmp as" +
+		" (select 2                as LogType," +
+		"         s.spotcontractid as relatedid," +
+		"         s.contractno     as relateNo," +
+		"         s.qty" +
+		"    from ermcp_spotcontract s" +
+		"  union all" +
+		"  select 1," +
+		"         t.hedgeplanid as relateid," +
+		"         t.hedgeplanno as relateNo," +
+		"         t.planqty     as qty" +
+		"    from ermcp_hedgeplan t)" +
+		"select to_char(t.createtime, 'yyyy-mm-dd hh24:mi:ss') createtime," +
+		"       t.middlegoodsid," +
+		"       t.areauserid," +
+		"       t.logtype," +
+		"       t.contracttype," +
+		"       t.qty / t.convertfactor / t.convertratio as qty," +
+		"       t.convertfactor," +
+		"       t.convertratio," +
+		"       t.qty changeQty," +
+		"       tmp.relateNo," +
+		"       m.middlegoodsname," +
+		"       m.middlegoodscode," +
+		"       g.deliverygoodsid," +
+		"       g.deliverygoodscode," +
+		"       g.deliverygoodsname," +
+		"       g.goodsunitid unitid," +
+		"       e.enumdicname" +
+		"  from ermcp_spotexposurelog t" +
+		"  left join erms_middlegoods m" +
+		"    on t.middlegoodsid = m.middlegoodsid" +
+		"  left join deliverygoods g" +
+		"    on t.deliverygoodsid = g.deliverygoodsid" +
+		"  left join enumdicitem e" +
+		"    on g.goodsunitid = e.enumitemname" +
+		"   and e.enumdiccode = 'goodsunit'" +
+		"  left join tmp" +
+		"    on t.logtype = tmp.LogType" +
+		"   and t.relatedid = tmp.relatedid" +
+		" where 1=1 and t.tradedate=to_char(sysdate, 'yyyymmdd')"
+	sqlId.And("t.areauserid", r.Areauserid)
+	sqlId.And("t.middlegoodsid", r.MiddlegoodsId)
+	return sqlId.String()
+}
+
+// GetDataEx
+func (r *Ermcp3ExposureDetail) GetDataEx() (interface{}, error) {
+	e := db.GetEngine()
+	s := e.SQL(r.buildSql())
+	sData := make([]Ermcp3ExposureDetail, 0)
+	if err := s.Find(&sData); err != nil {
+		return nil, err
+	}
+	for i := range sData {
+		sData[i].calc()
+	}
+	return sData, nil
+}
+
+// Ermcp3AreaSpot 敞口现货头寸
+type Ermcp3AreaSpot struct {
+	AREAUSERID        int64   `json:"areauserid"  xorm:"'AREAUSERID'"`               // 所属机构
+	ORIBUYPLANQTY     float64 `json:"-"  xorm:"'ORIBUYPLANQTY'"`                     // 期初采购计划数量
+	ORIBUYPRICEDQTY   float64 `json:"-"  xorm:"'ORIBUYPRICEDQTY'"`                   // 期初采购合同已定价数量
+	ORISELLPLANQTY    float64 `json:"-"  xorm:"'ORISELLPLANQTY'"`                    // 期初销售计划数量
+	ORISELLPRICEDQTY  float64 `json:"-"  xorm:"'ORISELLPRICEDQTY'"`                  // 期初销售合同已定价数量
+	BUYPLANQTY        float64 `json:"-"  xorm:"'BUYPLANQTY'"`                        // 采购计划数量
+	BUYPRICEDQTY      float64 `json:"-"  xorm:"'BUYPRICEDQTY'"`                      // 采购合同已定价数量
+	SELLPLANQTY       float64 `json:"-"  xorm:"'SELLPLANQTY'"`                       // 销售计划数量
+	SELLPRICEDQTY     float64 `json:"-"  xorm:"'SELLPRICEDQTY'"`                     // 销售合同已定价数量
+	TOTALSPOTQTY      float64 `json:"totalspotqty"  xorm:"'TOTALSPOTQTY'"`           // 当前数量(现货头寸总量) =  (销售计划数量 - 销售已定价数量)  - (采购计划数量 - 采购已定价数量)
+	OriToalSpotQty    float64 `json:"oritoalspotqty"  xorm:"'OriToalSpotQty'"`       // 昨日数量
+	IncreaseQty       float64 `json:"increaseqty"  xorm:"'IncreaseQty'"`             // 增加数量=销售计划数量+采购已定价数量
+	DecreaseQty       float64 `json:"decreaseqty"  xorm:"'DecreaseQty'"`             // 减少数量=-(销售已定价数量+采购计划数量)
+	UPDATETIME        string  `json:"updatetime"  xorm:"'UPDATETIME'"`               // 更新时间
+	DELIVERYGOODSID   int32   `json:"deliverygoodsid"  xorm:"'DELIVERYGOODSID'"`     // 现货品种id
+	DELIVERYGOODSCODE string  `json:"deliverygoodscode"  xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
+	DELIVERYGOODSNAME string  `json:"deliverygoodsname"  xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
+}
+
+func (r *Ermcp3AreaSpot) calc() {
+	/*
+		增加数量=今日销售计划数量+今日采购已定价数量
+		减少数量=-(今日销售已定价数量+今日采购计划数量)
+
+		其中,
+		今日销售计划数量=期末销售计划数量-期初销售计划数量
+		今日采购已定价数量=期末采购已定价数量-期初采购已定价数量
+		今日销售已定价数量=期末销售已定价数量-期初销售已定价数量
+		今日采购计划数量=期末采购计划数量-期初采购计划数量
+	*/
+	r.IncreaseQty = r.SELLPLANQTY - r.ORISELLPLANQTY + r.BUYPRICEDQTY - r.ORIBUYPRICEDQTY
+	r.DecreaseQty = (r.SELLPRICEDQTY - r.ORISELLPRICEDQTY + r.BUYPLANQTY - r.ORIBUYPLANQTY) * -1
+	r.OriToalSpotQty = (r.ORISELLPLANQTY - r.ORISELLPRICEDQTY) - (r.ORIBUYPLANQTY - r.ORIBUYPRICEDQTY)
+}
+
+func (r *Ermcp3AreaSpot) buildSql() string {
+	var sqlId utils.SQLVal = "select t.AREAUSERID," +
+		"       t.ORIBUYPLANQTY," +
+		"       t.ORIBUYPRICEDQTY," +
+		"       t.ORISELLPLANQTY," +
+		"       t.ORISELLPRICEDQTY," +
+		"       t.BUYPLANQTY," +
+		"       t.BUYPRICEDQTY," +
+		"       t.SELLPLANQTY," +
+		"       t.SELLPRICEDQTY," +
+		"       t.TOTALSPOTQTY," +
+		"       g.deliverygoodsid," +
+		"       g.deliverygoodscode," +
+		"       g.deliverygoodsname," +
+		"       to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME" +
+		"  from ermcp_areaspot t" +
+		"  left join deliverygoods g" +
+		"    on t.deliverygoodsid = g.deliverygoodsid" +
+		" where 1 = 1"
+	sqlId.And("t.areauserid", r.AREAUSERID)
+	return sqlId.String()
+}
+
+// GetDataEx
+func (r *Ermcp3AreaSpot) GetDataEx() (interface{}, error) {
+	e := db.GetEngine()
+	s := e.SQL(r.buildSql())
+	sData := make([]Ermcp3AreaSpot, 0)
+	if err := s.Find(&sData); err != nil {
+		return nil, err
+	}
+	for i := range sData {
+		sData[i].calc()
+	}
+	return sData, nil
+}
+
+// Ermcp3AreaSpotDetail 敞口现货头寸明细
+type Ermcp3AreaSpotDetail struct {
+	Relatedid         string  `json:"relatedid"  xorm:"'relatedid'"`                 // 套保计划ID/现货合同ID
+	Relatedno         string  `json:"relatedno"  xorm:"'relatedno'"`                 // 编号
+	LogType           int32   `json:"logtype"  xorm:"'logType'"`                     // 记录类型 1-套保 2-现货合同
+	Contracttype      int32   `json:"contracttype"  xorm:"'contracttype'"`           // 合同类型 1-采购 -1-销售
+	Qty               float64 `json:"qty"  xorm:"'qty'"`                             // 数量
+	Strtime           string  `json:"strtime"  xorm:"'strtime'"`                     // 时间
+	Enumdicname       string  `json:"enumdicname"`                                   // 现货商品单位名称
+	Recordname        string  `json:"recordname"`                                    // 类型名称
+	CREATETIME        string  `json:"createtime"  xorm:"'CREATETIME'"`               // 创建时间
+	Unitid            int32   `json:"-"  xorm:"'UNITID'"`                            // 单位ID
+	UserId            int     `json:"-"`                                             // 所属用户ID
+	DELIVERYGOODSID   int32   `json:"deliverygoodsid"  xorm:"'DELIVERYGOODSID'"`     // 现货品种id
+	DELIVERYGOODSCODE string  `json:"deliverygoodscode"  xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
+	DELIVERYGOODSNAME string  `json:"deliverygoodsname"  xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
+}
+
+func (r *Ermcp3AreaSpotDetail) calc() {
+	var logTypeName, contractTypeName string
+	if r.LogType == 1 {
+		logTypeName = "计划"
+	} else {
+		logTypeName = "合同"
+	}
+
+	if r.Contracttype == 1 {
+		contractTypeName = "采购"
+	} else {
+		contractTypeName = "销售"
+	}
+
+	// 销售合同 数量转为负数
+	if r.LogType == 2 && r.Contracttype == -1 {
+		if r.Qty > 0 {
+			r.Qty = r.Qty * -1
+		}
+	}
+
+	// 采购计划 数量转为负数
+	if r.LogType == 1 && r.Contracttype == 1 {
+		if r.Qty > 0 {
+			r.Qty = r.Qty * -1
+		}
+	}
+
+	r.Recordname = contractTypeName + logTypeName
+	r.Enumdicname = mtpcache.GetEnumDicitemName(r.Unitid)
+}
+
+func (r *Ermcp3AreaSpotDetail) buildSql() string {
+	var sqlId utils.SQLVal = "with tmp as" +
+		" (select to_char(t.hedgeplanid) relatedid," +
+		"         t.hedgeplanno relatedno," +
+		"         1 as logType," +
+		"         t.contracttype" +
+		"    from ermcp_hedgeplan t" +
+		"   where t.areauserid = %v" +
+		"     and t.deliverygoodsid = %v" +
+		"  union all" +
+		"  select to_char(t.spotcontractid)," +
+		"         t.contractno," +
+		"         2 as logType," +
+		"         t.contracttype" +
+		"    from ermcp_spotcontract t" +
+		"   where t.userid = %v" +
+		"     and t.deliverygoodsid = %v)" +
+		"select t.relatedid," +
+		"       tmp.relatedno," +
+		"       t.LogType," +
+		"       tmp.contracttype," +
+		"       t.RealQty qty," +
+		"       to_char(t.createtime, 'yyyy-mm-dd hh24:mi:ss') createtime," +
+		"       g.deliverygoodsid," +
+		"       g.deliverygoodsname," +
+		"       g.deliverygoodscode," +
+		"       g.goodsunitid unitid" +
+		"  from ermcp_spotlog t" +
+		" inner join tmp" +
+		"    on t.LogType = tmp.logType" +
+		"   and t.relatedid = tmp.relatedid" +
+		"   and t.areauserid = %v" +
+		"   and t.deliverygoodsid = %v" +
+		"  left join deliverygoods g" +
+		"    on t.deliverygoodsid = g.deliverygoodsid" +
+		" where t.tradedate = to_char(sysdate, 'yyyymmdd')"
+	sqlId.FormatParam(r.UserId, r.DELIVERYGOODSID, r.UserId, r.DELIVERYGOODSID, r.UserId, r.DELIVERYGOODSID)
+	return sqlId.String()
+}
+
+// GetDataEx
+func (r *Ermcp3AreaSpotDetail) GetDataEx() (interface{}, error) {
+	e := db.GetEngine()
+	s := e.SQL(r.buildSql())
+	sData := make([]Ermcp3AreaSpotDetail, 0)
+	if err := s.Find(&sData); err != nil {
+		return nil, err
+	}
+	for i := range sData {
+		sData[i].calc()
+	}
+	return sData, nil
+}
+
+// Ermcp3Wrstandard 现货品类
+type Ermcp3Wrstandard struct {
+	WRSTANDARDID    int64  `json:"wrstandardid"  xorm:"'WRSTANDARDID'"`       // 品类ID(SEQ_WRSTANDARD)
+	WRSTANDARDCODE  string `json:"wrstandardcode"  xorm:"'WRSTANDARDCODE'"`   // 品类代码
+	DELIVERYGOODSID int32  `json:"deliverygoodsid"  xorm:"'DELIVERYGOODSID'"` // 现货品种ID
+	UNITID          int32  `json:"unitid"  xorm:"'UNITID'"`                   // 品类单位ID
+	MINIVALUE       int32  `json:"minivalue"  xorm:"'MINIVALUE'"`             // 最小变动值
+	MINIVALUEDP     int32  `json:"minivaluedp"  xorm:"'MINIVALUEDP'"`         // 最小变动值小数位
+	REALMINIVALUE   int32  `json:"realminivalue"  xorm:"'REALMINIVALUE'"`     // 实际最小变动值
+	REALMINIVALUEDP int32  `json:"realminivaluedp"  xorm:"'REALMINIVALUEDP'"` // 实际最小变动值小数位
+	CREATORID       int64  `json:"creatorid"  xorm:"'CREATORID'"`             // 创建人
+	CREATETIME      string `json:"createtime"  xorm:"'CREATETIME'"`           // 创建时间
+	WRSTANDARDNAME  string `json:"wrstandardname"  xorm:"'WRSTANDARDNAME'"`   // 品类名称
+	AREAUSERID      int    `json:"areauserid"  xorm:"'AREAUSERID'"`           // 所属机构
+	EnumdicName     string `json:"enumdicname"`                               // 品类单位名称
+	ISVALID         int32  `json:"isvalid"  xorm:"'ISVALID'"`                 // 是否有效 0-无效(停用) 1-有效(正常)
+	UPDATETIME      string `json:"updatetime"  xorm:"'UPDATETIME'"`           // 更新时间
+	REMARK          string `json:"remark"  xorm:"'REMARK'"`                   // 备注
+}
+
+func (r *Ermcp3Wrstandard) calc() {
+	r.EnumdicName = mtpcache.GetEnumDicitemName(r.UNITID)
+}
+
+func (r *Ermcp3Wrstandard) buildSql() string {
+	str := "select WRSTANDARDID," +
+		"       WRSTANDARDCODE," +
+		"       DELIVERYGOODSID," +
+		"       UNITID," +
+		"       MINIVALUE," +
+		"       MINIVALUEDP," +
+		"       REALMINIVALUE," +
+		"       REALMINIVALUEDP," +
+		"       CREATORID," +
+		"       to_char(CREATETIME, 'yyyy-mm-dd hh24:mi:ss') CREATETIME," +
+		"       WRSTANDARDNAME," +
+		"       ISVALID," +
+		"       to_char(UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
+		"       REMARK," +
+		"       AREAUSERID" +
+		"  from wrstandard t" +
+		" where t.AREAUSERID=%v"
+	sqlId := fmt.Sprintf(str, r.AREAUSERID)
+	if r.DELIVERYGOODSID > 0 {
+		sqlId = sqlId + fmt.Sprintf(" and DELIVERYGOODSID=%v", r.DELIVERYGOODSID)
+	}
+	sqlId += " order by createtime desc"
+	return sqlId
+}
+
+// GetDataEx
+func (r *Ermcp3Wrstandard) GetDataEx() (interface{}, error) {
+	e := db.GetEngine()
+	s := e.SQL(r.buildSql())
+	sData := make([]Ermcp3Wrstandard, 0)
+	if err := s.Find(&sData); err != nil {
+		return nil, err
+	}
+	for i := range sData {
+		sData[i].calc()
+	}
+	return sData, nil
+}

+ 451 - 0
models/ermcp3Report.go

@@ -0,0 +1,451 @@
+/**
+* @Author: zou.yingbin
+* @Create  : 2021/4/16 18:22
+* @Modify  : 2021/4/16 18:22
+ */
+
+package models
+
+import (
+	"fmt"
+	"mtp2_if/db"
+	"mtp2_if/mtpcache"
+	"mtp2_if/utils"
+)
+
+// Ermcp3ReportOPLog 报表合同操作记录通用查询
+type Ermcp3ReportOPLog struct {
+	LOGID             string `json:"logid"  xorm:"'lOGID'"`                         // 流水ID(604+Unix秒时间戳(10位)+xxxxxx)
+	BIZTYPE           int32  `json:"biztype"  xorm:"'BIZTYPE'"`                     // 业务类型 - 1:套保计划 2:现货合同
+	OPERATELOGTYPE    int32  `json:"operatelogtype"  xorm:"'OPERATELOGTYPE'"`       // 操作流水类型 -
+	RELATEDID         string `json:"relatedid"  xorm:"'RELATEDID'"`                 // 现货合同ID\套保计划
+	LOGVALUE          string `json:"logvalue"  xorm:"'LOGVALUE'"`                   // 数值
+	LOGDATETIME       string `json:"logdatetime"  xorm:"'LOGDATETIME'"`             // 流水日期(时间)
+	TRADEDATE         string `json:"tradedate"  xorm:"'TRADEDATE'"`                 // 交易日(yyyyMMdd)
+	APPLYID           int64  `json:"applyid"  xorm:"'APPLYID'"`                     // 操作人
+	CONTRACTTYPE      int32  `json:"contracttype"  xorm:"'CONTRACTTYPE'"`           // 现货合同类型 - 1:采购 -1:销售
+	USERID            int64  `json:"userid"  xorm:"'USERID'"`                       // 机构ID
+	RELATEDNO         string `json:"relatedno"  xorm:"'RELATEDNO'"`                 // 合同编号
+	UNITID            int32  `json:"-"  xorm:"'UNITID'"`                            // 现货商品单位id
+	ENUMDICNAME       string `json:"enumdicName"`                                   // 单位名称
+	OPTYPENAME        string `json:"optypename"`                                    // 流水类型名称
+	LOGTYPENAME       string `json:"logtypename"`                                   // 合同类型(名称)
+	APPLYNAME         string `json:"applyname"`                                     // 操作人名称
+	BRANDNAME         string `json:"brandname"  xorm:"'brandname'"`                 // 品牌名称
+	DELIVERYGOODSID   int32  `json:"deliverygoodsid"  xorm:"'DELIVERYGOODSID'"`     // 现货品种id
+	DELIVERYGOODSCODE string `json:"deliverygoodscode"  xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
+	DELIVERYGOODSNAME string `json:"deliverygoodsname"  xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
+
+	LogTypeFilter string `json:"-"` // 查询日志类型, 逗号隔开(如 1,2,4)
+}
+
+// Calc 处理数据
+func (r *Ermcp3ReportOPLog) Calc() {
+	r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
+	r.APPLYNAME = mtpcache.GetUserNameByUserId(r.APPLYID)
+	if r.APPLYNAME == "" {
+		// APPLYID 可能存的是loginId
+		r.APPLYNAME = mtpcache.GetLoginCodeByLoginId(r.APPLYID)
+	}
+
+	//1:点价价格 2:点价数量 3:结算量 4:其它费用 5:追加保证金 6溢短金额 7:调整金额 8:付款金额 9:收款金额 10:退款金额
+	//11:收票金额 12:开票金额 13:提交审核(合同) 14:审核通过(合同) 15:审核拒绝(合同) 16:合同撤回 17:提交审核(计划)
+	//18:审核通过(计划) 19:审核拒绝(计划) 20:计划撤回 21:正常完结(合同) 22:异常终止(合同) 23:退还保证金
+	// 数据库注释与返回值映身关系: 结算量->确定量, 收款->收款金额, 退款->退款金额, 付款->付款金额, 收票->收票金额, 开票->开票金额
+	sDes := []string{"点价价格", "点价数量", "确定量", "其它费用", "追加保证金", "溢短金额", "调整金额", "付款", "收款", "退款",
+		"收票", "开票", "提交审核(合同)", "审核通过(合同)", "审核拒绝(合同)", "合同撤回", "提交审核(计划)",
+		"审核通过(计划)", "审核拒绝(计划)", "计划撤回", "正常完结(合同)", "异常终止(合同)", "退还保证金"}
+	if r.OPERATELOGTYPE >= 1 && r.OPERATELOGTYPE <= 23 {
+		r.OPTYPENAME = sDes[r.OPERATELOGTYPE-1]
+	}
+
+	// 收款款项:采购合同的退款、销售合同的收款应用正数显示,付款款项:采购合同的付款、销售合同的退款应用负数显示
+	if r.CONTRACTTYPE == 1 {
+		r.LOGTYPENAME = "采购"
+		// 采购合同/退款 正数
+		if r.OPERATELOGTYPE == 10 && len(r.LOGVALUE) > 0 {
+			if r.LOGVALUE[0] == '-' {
+				r.LOGVALUE = r.LOGVALUE[1:]
+			}
+		}
+		// 采购合同/付款 负数
+		if r.OPERATELOGTYPE == 8 && len(r.LOGVALUE) > 0 {
+			if r.LOGVALUE[0] != '-' {
+				r.LOGVALUE = "-" + r.LOGVALUE
+			}
+		}
+	} else if r.CONTRACTTYPE == -1 {
+		r.LOGTYPENAME = "销售"
+		// 销售合同/收款 正数
+		if r.OPERATELOGTYPE == 9 && len(r.LOGVALUE) > 0 {
+			if r.LOGVALUE[0] == '-' {
+				r.LOGVALUE = r.LOGVALUE[1:]
+			}
+		}
+		// 销售合同/退款 负数
+		if r.OPERATELOGTYPE == 10 && len(r.LOGVALUE) > 0 {
+			if r.LOGVALUE[0] != '-' {
+				r.LOGVALUE = "-" + r.LOGVALUE
+			}
+		}
+	}
+
+	// 去除多余的0,最后4个0
+	if r.LOGVALUE[len(r.LOGVALUE)-4:] == "0000" {
+		r.LOGVALUE = r.LOGVALUE[:len(r.LOGVALUE)-4]
+	}
+
+	if r.BIZTYPE == 1 {
+		r.LOGTYPENAME += "计划"
+	} else if r.BIZTYPE == 2 {
+		r.LOGTYPENAME += "合同"
+	}
+}
+
+func (r *Ermcp3ReportOPLog) buildSql() string {
+	var sqlId utils.SQLVal = "SELECT to_char(t.LOGID) LOGID," +
+		"       t.BIZTYPE," +
+		"       t.OPERATELOGTYPE," +
+		"       to_char(t.RELATEDID) RELATEDID," +
+		"       t.LOGVALUE," +
+		"       to_char(t.LOGDATETIME, 'yyyy-mm-dd hh24:mi:ss') LOGDATETIME," +
+		"       t.TRADEDATE," +
+		"       t.APPLYID," +
+		"       t.CONTRACTTYPE," +
+		"       t.USERID," +
+		"       s.contractno relatedno," +
+		"       s.spotgoodsbrandid," +
+		"       g.deliverygoodsid," +
+		"       g.deliverygoodscode," +
+		"       g.deliverygoodsname," +
+		"       g.goodsunitid unitid," +
+		"       gb.dgfactoryitemvalue brandname" +
+		"  FROM ERMCP_CONTRACTOPERATELOG t" +
+		" inner join ermcp_spotcontract s" +
+		"    on t.RELATEDID = s.spotcontractid" +
+		"  left join deliverygoods g" +
+		"    on t.deliverygoodsid = g.deliverygoodsid" +
+		"  left join dgfactoryitem gb" +
+		"    on s.spotgoodsbrandid = gb.dgfactoryitemid" +
+		" WHERE t.biztype = 2"
+	// 筛选条件
+	sqlId.And("t.userid", r.USERID)
+	sqlId.And("t.TRADEDATE", r.TRADEDATE)
+	sqlId.AndEx("t.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
+	if r.LogTypeFilter != "" {
+		sqlId.Join(fmt.Sprintf(" and t.OPERATELOGTYPE in(%v)", r.LogTypeFilter))
+	}
+	return sqlId.String()
+}
+
+// GetDataEx 获取日志记录
+func (r *Ermcp3ReportOPLog) GetDataEx() (interface{}, error) {
+	sData := make([]Ermcp3ReportOPLog, 0)
+	err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
+	for i := range sData {
+		sData[i].Calc()
+	}
+	return sData, err
+}
+
+// Ermcp3ReportDaySpot 现货日报表
+type Ermcp3ReportDaySpot struct {
+	BUYPRICEDQTY       float64 `json:"-"  xorm:"'BUYPRICEDQTY'"`                        // 期末采购定价量
+	SELLPRICEDQTY      float64 `json:"-"  xorm:"'SELLPRICEDQTY'"`                       // 期末销售定价量
+	ORIBUYPRICEDQTY    float64 `json:"-"  xorm:"'ORIBUYPRICEDQTY'"`                     // 期初采购定价量
+	ORISELLPRICEDQTY   float64 `json:"-"  xorm:"'ORISELLPRICEDQTY'"`                    // 期初销售定价量
+	TODAYBUYRECKONQTY  float64 `json:"todaybuyreckonqty"  xorm:"'TODAYBUYRECKONQTY'"`   // 采购确定量
+	TODAYSELLRECKONQTY float64 `json:"todaysellreckonqty"  xorm:"'TODAYSELLRECKONQTY'"` // 销售确定量
+	RECKONDATE         string  `json:"reckondate"  xorm:"'RECKONDATE'"`                 // 日照时期(yyyyMMdd)
+	AREAUSERID         int64   `json:"areauserid"  xorm:"'AREAUSERID'"`                 // 所属机构T
+	UNITID             int32   `json:"-"  xorm:"'UNITID'"`                              // 现货商品单位id
+	BUYINQTY           float64 `json:"buyinqty"  xorm:"'BUYINQTY'"`                     // 采购入库量
+	SELLOUTQTY         float64 `json:"selloutqty"  xorm:"'SELLOUTQTY'"`                 // 销售出库量
+	DELIVERYGOODSID    int32   `json:"deliverygoodsid"  xorm:"'DELIVERYGOODSID'"`       // 现货品种id
+	DELIVERYGOODSCODE  string  `json:"deliverygoodscode"  xorm:"'DELIVERYGOODSCODE'"`   // 现货品种代码
+	DELIVERYGOODSNAME  string  `json:"deliverygoodsname"  xorm:"'DELIVERYGOODSNAME'"`   // 现货品种名称
+
+	ENUMDICNAME        string  `json:"enumdicname"`        // 现货商品单位名称
+	TOTALBUYPRICEDQTY  float64 `json:"totalbuypricedqty"`  // 采购定价量 = 期末 - 期初
+	TOTALSELLPRICEDQTY float64 `json:"totalsellpricedqty"` // 销售定价量 = 期末 - 期初
+	BeginDate          string  `json:"-"`                  // 开始日期
+	EndDate            string  `json:"-"`                  // 结束日期
+}
+
+// Calc 数据处理
+func (r *Ermcp3ReportDaySpot) Calc() {
+	r.TOTALBUYPRICEDQTY = r.BUYPRICEDQTY - r.ORIBUYPRICEDQTY
+	r.TOTALSELLPRICEDQTY = r.SELLPRICEDQTY - r.ORISELLPRICEDQTY
+	r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
+}
+
+func (r *Ermcp3ReportDaySpot) buildSql() string {
+	var sqlId utils.SQLVal = "with tmp as" +
+		" (select t.userid," +
+		"         t.deliverygoodsid," +
+		"         t.reckondate," +
+		"         sum(t.todaybuyinqty) todaybuyinqty," +
+		"         sum(t.todayselloutqty) todayselloutqty" +
+		"    from Reckon_ERMCP_AreaStock t" +
+		"   group by t.userid, t.deliverygoodsid, t.reckondate)" +
+		"select t.reckondate," +
+		"       t.BUYPRICEDQTY," +
+		"       t.SELLPRICEDQTY," +
+		"       t.Oribuypricedqty," +
+		"       t.Orisellpricedqty," +
+		"       t.TODAYBUYRECKONQTY," +
+		"       t.TODAYSELLRECKONQTY," +
+		"       t.RECKONDATE," +
+		"       t.AREAUSERID," +
+		"       g.deliverygoodsid," +
+		"       g.deliverygoodscode," +
+		"       g.deliverygoodsname," +
+		"       g.goodsunitid        unitid," +
+		"       s.todaybuyinqty      buyinqty," +
+		"       s.todayselloutqty    selloutqty" +
+		"  from RECKON_ERMCP_AREASPOT t" +
+		"  left join tmp s" +
+		"    on t.reckondate = s.reckondate" +
+		"   and t.areauserid = s.userid" +
+		"   and t.deliverygoodsid = s.deliverygoodsid" +
+		"  left join deliverygoods g" +
+		"    on t.deliverygoodsid = g.deliverygoodsid" +
+		" where 1 = 1"
+	sqlId.And("t.AREAUSERID", r.AREAUSERID)
+	if r.DELIVERYGOODSID > 0 {
+		sqlId.And("t.DELIVERYGOODSID", r.DELIVERYGOODSID)
+	}
+	if r.RECKONDATE != "" {
+		sqlId.And("t.RECKONDATE", r.RECKONDATE)
+	} else if r.BeginDate != "" && r.BeginDate == r.EndDate {
+		sqlId.And("t.RECKONDATE", r.BeginDate)
+	} else {
+		if r.BeginDate != "" {
+			sqlId.BiggerOrEq("t.RECKONDATE", r.BeginDate)
+		}
+		if r.EndDate != "" {
+			sqlId.LessOrEq("t.RECKONDATE", r.EndDate)
+		}
+	}
+	sqlId.Join(" order by t.RECKONDATE")
+	return sqlId.String()
+}
+
+// GetDataEx 获取现货日报表
+func (r *Ermcp3ReportDaySpot) GetDataEx() (interface{}, error) {
+	sData := make([]Ermcp3ReportDaySpot, 0)
+	err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
+	for i := range sData {
+		sData[i].Calc()
+	}
+	return sData, err
+}
+
+// Ermcp3ReportMonSpot 现货月报表
+type Ermcp3ReportMonSpot struct {
+	CYCLETYPE          int32   `json:"cycletype"  xorm:"'cycletype'"`                   // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
+	CYCLETIME          string  `json:"cycletime"  xorm:"'cycletime'"`                   // 周期时间 月(YYYYMM)  季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
+	BUYPRICEDQTY       float64 `json:"-"  xorm:"'BUYPRICEDQTY'"`                        // 期末采购定价量
+	SELLPRICEDQTY      float64 `json:"-"  xorm:"'SELLPRICEDQTY'"`                       // 期末销售定价量
+	ORIBUYPRICEDQTY    float64 `json:"-"  xorm:"'ORIBUYPRICEDQTY'"`                     // 期初采购定价量
+	ORISELLPRICEDQTY   float64 `json:"-"  xorm:"'ORISELLPRICEDQTY'"`                    // 期初销售定价量
+	TODAYBUYRECKONQTY  float64 `json:"todaybuyreckonqty"  xorm:"'TODAYBUYRECKONQTY'"`   // 采购确定量
+	TODAYSELLRECKONQTY float64 `json:"todaysellreckonqty"  xorm:"'TODAYSELLRECKONQTY'"` // 销售确定量
+	AREAUSERID         int64   `json:"areauserid"  xorm:"'AREAUSERID'"`                 // 所属机构id
+	UNITID             int32   `json:"-"  xorm:"'UNITID'"`                              // 现货商品单位id
+	BUYINQTY           float64 `json:"buyinqty"  xorm:"'BUYINQTY'"`                     // 采购入库量
+	SELLOUTQTY         float64 `json:"selloutqty"  xorm:"'SELLOUTQTY'"`                 // 销售出库量
+	DELIVERYGOODSID    int32   `json:"deliverygoodsid"  xorm:"'DELIVERYGOODSID'"`       // 现货品种id
+	DELIVERYGOODSCODE  string  `json:"deliverygoodscode"  xorm:"'DELIVERYGOODSCODE'"`   // 现货品种代码
+	DELIVERYGOODSNAME  string  `json:"deliverygoodsname"  xorm:"'DELIVERYGOODSNAME'"`   // 现货品种名称
+
+	ENUMDICNAME        string  `json:"enumdicname"`        // 现货商品单位名称
+	TOTALBUYPRICEDQTY  float64 `json:"totalbuypricedqty"`  // 采购定价量 = 期末 - 期初
+	TOTALSELLPRICEDQTY float64 `json:"totalsellpricedqty"` // 销售定价量 = 期末 - 期初
+}
+
+// Calc 数据处理
+func (r *Ermcp3ReportMonSpot) Calc() {
+	r.TOTALBUYPRICEDQTY = r.BUYPRICEDQTY - r.ORIBUYPRICEDQTY
+	r.TOTALSELLPRICEDQTY = r.SELLPRICEDQTY - r.ORISELLPRICEDQTY
+	r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
+}
+
+func (r *Ermcp3ReportMonSpot) buildSql() string {
+	var sqlId utils.SQLVal = "with tmp as" +
+		" (select t.userid," +
+		"         t.deliverygoodsid," +
+		"         t.cycletime," +
+		"         t.cycletype," +
+		"         sum(t.todaybuyinqty) todaybuyinqty," +
+		"         sum(t.todayselloutqty) todayselloutqty" +
+		"    from Report_ERMCP_AreaStock t" +
+		"   group by t.userid, t.deliverygoodsid, t.cycletime, t.cycletype)" +
+		"select t.BUYPRICEDQTY," +
+		"       t.SELLPRICEDQTY," +
+		"       t.Oribuypricedqty," +
+		"       t.Orisellpricedqty," +
+		"       t.TODAYBUYRECKONQTY," +
+		"       t.TODAYSELLRECKONQTY," +
+		"       t.cycletype," +
+		"       t.cycletime," +
+		"       t.AREAUSERID," +
+		"       g.deliverygoodsid," +
+		"       g.deliverygoodscode," +
+		"       g.deliverygoodsname," +
+		"       g.goodsunitid        unitid," +
+		"       s.todaybuyinqty      buyinqty," +
+		"       s.todayselloutqty    selloutqty" +
+		"  from Report_ERMCP_AreaSpot t" +
+		"  left join tmp s" +
+		"    on t.cycletime = s.cycletime" +
+		"   and t.cycletype = s.cycletype" +
+		"   and t.areauserid = s.userid" +
+		"   and t.deliverygoodsid = s.deliverygoodsid" +
+		"  left join deliverygoods g" +
+		"    on t.deliverygoodsid = g.deliverygoodsid" +
+		" where t.cycletype = 1"
+	sqlId.And("t.AREAUSERID", r.AREAUSERID)
+	sqlId.And("t.cycletime", r.CYCLETIME)
+	return sqlId.String()
+}
+
+// GetDataEx 获取现货月报表
+func (r *Ermcp3ReportMonSpot) GetDataEx() (interface{}, error) {
+	sData := make([]Ermcp3ReportMonSpot, 0)
+	err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
+	for i := range sData {
+		sData[i].Calc()
+	}
+	return sData, err
+}
+
+// Ermcp3ReportAreaSpotPL 现货损益日/月表
+type Ermcp3ReportAreaSpotPL struct {
+	AREAUSERID            int64   `json:"areauserid"  xorm:"'AREAUSERID'"`                       // 所属机构
+	WRSTANDARDID          int64   `json:"wrstandardid"  xorm:"'WRSTANDARDID'"`                   // 品类ID
+	SPOTGOODSBRANDID      int32   `json:"spotgoodsbrandid"  xorm:"'SPOTGOODSBRANDID'"`           // 现货品牌ID
+	ORIBUYQTY             float64 `json:"oribuyqty"  xorm:"'ORIBUYQTY'"`                         // 期初采购总量
+	ORIBUYAMOUNT          float64 `json:"oribuyamount"  xorm:"'ORIBUYAMOUNT'"`                   // 期初采购总额
+	ORISELLQTY            float64 `json:"orisellqty"  xorm:"'ORISELLQTY'"`                       // 期初销售总量
+	ORISELLAMOUNT         float64 `json:"orisellamount"  xorm:"'ORISELLAMOUNT'"`                 // 期初销售总额
+	ORIQTY                float64 `json:"oriqty"  xorm:"'ORIQTY'"`                               // 期初量
+	ORIAVERAGEPRICE       float64 `json:"oriaverageprice"  xorm:"'ORIAVERAGEPRICE'"`             // 期初均价
+	ORIAMOUNT             float64 `json:"oriamount"  xorm:"'ORIAMOUNT'"`                         // 期初额
+	TODAYBUYQTY           float64 `json:"todaybuyqty"  xorm:"'TODAYBUYQTY'"`                     // 今日采购量(采购增量)
+	TODAYBUYAMOUNT        float64 `json:"todaybuyamount"  xorm:"'TODAYBUYAMOUNT'"`               // 今日采购额
+	TODAYBUYAVERAGEPRICE  float64 `json:"todaybuyaverageprice"  xorm:"'TODAYBUYAVERAGEPRICE'"`   // 今日采购均价(采购均价)
+	TODAYSELLQTY          float64 `json:"todaysellqty"  xorm:"'TODAYSELLQTY'"`                   // 今日销售量(销售增量)
+	TODAYSELLAMOUNT       float64 `json:"todaysellamount"  xorm:"'TODAYSELLAMOUNT'"`             // 今日销售额
+	TODAYSELLAVERAGEPRICE float64 `json:"todaysellaverageprice"  xorm:"'TODAYSELLAVERAGEPRICE'"` // 今日销售均价(销售均价)
+	CURBUYQTY             float64 `json:"curbuyqty"  xorm:"'CURBUYQTY'"`                         // 期末采购总量
+	CURBUYAMOUNT          float64 `json:"curbuyamount"  xorm:"'CURBUYAMOUNT'"`                   // 期末采购总额(采购额)
+	CURSELLQTY            float64 `json:"cursellqty"  xorm:"'CURSELLQTY'"`                       // 期末销售总量
+	CURSELLAMOUNT         float64 `json:"cursellamount"  xorm:"'CURSELLAMOUNT'"`                 // 期末销售总额(销售额)
+	CURQTY                float64 `json:"curqty"  xorm:"'CURQTY'"`                               // 期末量
+	CURAVERAGEPRICE       float64 `json:"curaverageprice"  xorm:"'CURAVERAGEPRICE'"`             // 期末均价
+	CURAMOUNT             float64 `json:"curamount"  xorm:"'CURAMOUNT'"`                         // 期末额
+	CURSPOTPRICE          float64 `json:"curspotprice"  xorm:"'CURSPOTPRICE'"`                   // 参考市价
+	CURMARKETVALUE        float64 `json:"curmarketvalue"  xorm:"'CURMARKETVALUE'"`               // 参考市值
+	ACTUALPL              float64 `json:"actualpl"  xorm:"'ACTUALPL'"`                           // 实际损益
+	FLOATPL               float64 `json:"floatpl"  xorm:"'FLOATPL'"`                             // 浮动损益
+	UPDATETIME            string  `json:"updatetime"  xorm:"'UPDATETIME'"`                       // 更新时间
+	WRSTANDARDCODE        string  `json:"wrstandardcode"  xorm:"'WRSTANDARDCODE'"`               // 品类代码
+	WRSTANDARDNAME        string  `json:"wrstandardname"  xorm:"'WRSTANDARDNAME'"`               // 品类名称
+	WRUNITID              int32   `json:"unitid"  xorm:"'UNITID'"`                               // 品类单位id
+	BRANDNAME             string  `json:"brandname"  xorm:"'BRANDNAME'"`                         // 品牌名称
+	MODELNAME             string  `json:"modelname"  xorm:"'MODELNAME'"`                         // 品类名称
+	GBUNITID              int32   `json:"gbunitid"  xorm:"'GBUNITID'"`                           // 现货单位id
+	DELIVERYGOODSID       int32   `json:"deliverygoodsid"  xorm:"'DELIVERYGOODSID'"`             // 现货品种id
+	DELIVERYGOODSCODE     string  `json:"deliverygoodscode"  xorm:"'DELIVERYGOODSCODE'"`         // 现货品种代码
+	DELIVERYGOODSNAME     string  `json:"deliverygoodsname"  xorm:"'DELIVERYGOODSNAME'"`         // 现货品种名称
+
+	ENUMDICNAME   string `json:"enumdicname"`   // 现货商品单位名称
+	WRENUMDICNAME string `json:"gbenumdicname"` // 品类单位名称
+
+	ReportType int32  `json:"-"` // 报表类型 1-日报表 2-月报表
+	ReportDate string `json:"-"` // 格式 日报表(YYYYMMDD) 月报表(YYYYMM)
+}
+
+func (r *Ermcp3ReportAreaSpotPL) calc() {
+	r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GBUNITID)
+	r.WRENUMDICNAME = mtpcache.GetEnumDicitemName(r.WRUNITID)
+}
+
+func (r *Ermcp3ReportAreaSpotPL) buildSql() string {
+	var sqlId utils.SQLVal = "SELECT t.AREAUSERID," +
+		"       t.WRSTANDARDID," +
+		"       t.SPOTGOODSBRANDID," +
+		"       t.ORIBUYQTY," +
+		"       t.ORIBUYAMOUNT," +
+		"       t.ORISELLQTY," +
+		"       t.ORISELLAMOUNT," +
+		"       t.ORIQTY," +
+		"       t.ORIAVERAGEPRICE," +
+		"       t.ORIAMOUNT," +
+		"       t.TODAYBUYQTY," +
+		"       t.TODAYBUYAMOUNT," +
+		"       t.TODAYBUYAVERAGEPRICE," +
+		"       t.TODAYSELLQTY," +
+		"       t.TODAYSELLAMOUNT," +
+		"       t.TODAYSELLAVERAGEPRICE," +
+		"       t.CURBUYQTY," +
+		"       t.CURBUYAMOUNT," +
+		"       t.CURSELLQTY," +
+		"       t.CURSELLAMOUNT," +
+		"       t.CURQTY," +
+		"       t.CURAVERAGEPRICE," +
+		"       t.CURAMOUNT," +
+		"       t.CURSPOTPRICE," +
+		"       t.CURMARKETVALUE," +
+		"       t.ACTUALPL," +
+		"       t.FLOATPL," +
+		"       to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
+		"       w.wrstandardcode," +
+		"       w.wrstandardname," +
+		"       w.unitid WRUNITID," +
+		"       gb.dgfactoryitemvalue brandname," +
+		"       g.deliverygoodsid," +
+		"       g.deliverygoodscode," +
+		"       g.deliverygoodsname," +
+		"       g.goodsunitid GBUNITID" +
+		"  FROM %v t" +
+		"  left join deliverygoods g" +
+		"    on t.deliverygoodsid = g.deliverygoodsid" +
+		"  left join wrstandard w" +
+		"    on t.wrstandardid = w.wrstandardid" +
+		"  left join dgfactoryitem gb" +
+		"    on t.spotgoodsbrandid = gb.dgfactoryitemid" +
+		" WHERE 1 = 1"
+	sqlId.And("t.AREAUSERID", r.AREAUSERID)
+	if r.ReportType == 1 {
+		// 日报表
+		sqlId.FormatParam("RECKON_ERMCP_AREASPOTPL")
+		sqlId.And("t.reckondate", r.ReportDate)
+	} else {
+		// 月报表
+		sqlId.FormatParam("REPORT_ERMCP_AREASPOTPL")
+		sqlId.And("t.cycletype", 1)
+		sqlId.And("t.cycletime", r.ReportDate)
+	}
+	if r.WRSTANDARDID > 0 {
+		sqlId.And("t.wrstandardid", r.WRSTANDARDID)
+	}
+	if r.SPOTGOODSBRANDID > 0 {
+		sqlId.And("t.spotgoodsbrandid", r.SPOTGOODSBRANDID)
+	}
+	if r.DELIVERYGOODSID > 0 {
+		sqlId.And("t.deliverygoodsid", r.DELIVERYGOODSID)
+	}
+	return sqlId.String()
+}
+
+// GetDataEx 获取现货损益日(月)报表
+func (r *Ermcp3ReportAreaSpotPL) GetDataEx() (interface{}, error) {
+	sData := make([]Ermcp3ReportAreaSpotPL, 0)
+	err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
+	for i := range sData {
+		sData[i].calc()
+	}
+	return sData, err
+}

+ 2 - 2
models/ermcpSpotGoodsPrice.go

@@ -41,7 +41,7 @@ func (r *ErmcpSpotGoodsPrice) calc() {
 	if r.OPERATESRC == 1 {
 		r.OPERATORNAME = mtpcache.GetSystemmangerLoginCode(r.OPERATEID)
 	} else {
-		r.OPERATORNAME = mtpcache.GetUserNameByLoginId(r.OPERATEID)
+		r.OPERATORNAME = mtpcache.GetLoginCodeByLoginId(r.OPERATEID)
 	}
 	r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
 	r.GBENUMDICNAME = mtpcache.GetEnumDicitemName(r.GMUNITID)
@@ -118,7 +118,7 @@ func (r *ErmcpSpotGoodsPriceLog) calc() {
 	if r.OPERATESRC == 1 {
 		r.OPERATORNAME = mtpcache.GetSystemmangerLoginCode(r.OPERATEID)
 	} else {
-		r.OPERATORNAME = mtpcache.GetUserNameByLoginId(r.OPERATEID)
+		r.OPERATORNAME = mtpcache.GetLoginCodeByLoginId(r.OPERATEID)
 	}
 	r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
 	r.GBENUMDICNAME = mtpcache.GetEnumDicitemName(r.GMUNITID)

+ 45 - 8
mtpcache/useraccount.go

@@ -17,7 +17,7 @@ var vUsrMgr userAccountMgr
 
 // 用户缓存
 type userAccountMgr struct {
-	mtx  sync.RWMutex     //锁
+	mtx  sync.RWMutex         //锁
 	data map[int64]usrAccData //数据[userId]accountName
 	last time.Time
 }
@@ -28,6 +28,7 @@ type usrAccData struct {
 	ACCOUNTNAME  string `json:"accountname"  xorm:"'ACCOUNTNAME'"`   //账户名称(机构名称)
 	PARENTUSERID int32  `json:"parentuserid"  xorm:"'PARENTUSERID'"` //所属机构ID
 	MEMBERUSERID int32  `json:"memberuserid"  xorm:"'MEMBERUSERID'"` //所属会员ID
+	NICKNAME     string `json:"nickname"  xorm:"'NICKNAME'"`         // 昵称
 }
 
 // 加载数据
@@ -45,7 +46,17 @@ func (r *userAccountMgr) load() {
 		return
 	}
 
-	sqlId := "select USERID, USERTYPE, ACCOUNTNAME, PARENTUSERID, MEMBERUSERID from useraccount"
+	sqlId := "select t.USERID," +
+		"       t.USERTYPE," +
+		"       t.ACCOUNTNAME," +
+		"       t.PARENTUSERID," +
+		"       t.MEMBERUSERID," +
+		"       u.nickname" +
+		"  from useraccount t" +
+		"  left join userinfo u" +
+		"    on t.userid = u.userid" +
+		" where 1 = 1"
+
 	sData := make([]usrAccData, 0)
 	s := e.SQL(sqlId)
 	if err := s.Find(&sData); err != nil {
@@ -59,7 +70,7 @@ func (r *userAccountMgr) load() {
 	}
 }
 
-func (r *userAccountMgr) get(loginId int64) string {
+func (r *userAccountMgr) get(userId int64) string {
 	r.mtx.RLock()
 	defer r.mtx.RUnlock()
 
@@ -67,19 +78,45 @@ func (r *userAccountMgr) get(loginId int64) string {
 		return ""
 	}
 
-	if v, ok := r.data[loginId]; ok {
+	if v, ok := r.data[userId]; ok {
 		return v.ACCOUNTNAME
 	}
 	return ""
 }
 
-//根据UserId获取名称
+// getEx 返回 accountname, nickname
+func (r *userAccountMgr) getEx(userId int64) (string, string) {
+	r.mtx.RLock()
+	defer r.mtx.RUnlock()
+
+	if r.data == nil {
+		return "", ""
+	}
+
+	if v, ok := r.data[userId]; ok {
+		return v.ACCOUNTNAME, v.NICKNAME
+	}
+	return "", ""
+}
+
+// GetUserNameByUserId 根据UserId获取名称
 func GetUserNameByUserId(userId int64) string {
-	if v := vUsrMgr.get(userId); v !=""{
+	if v := vUsrMgr.get(userId); v != "" {
 		return v
-	}else{
+	} else {
 		vUsrMgr.load()
 	}
 
 	return vUsrMgr.get(userId)
-}
+}
+
+// GetUserNameAndNickName 获取名称和昵称
+func GetUserNameAndNickName(userId int64) (string, string) {
+	if userName, nickName := vUsrMgr.getEx(userId); userName != "" {
+		return userName, nickName
+	} else {
+		vUsrMgr.load()
+	}
+
+	return vUsrMgr.getEx(userId)
+}

+ 29 - 16
mtpcache/username.go

@@ -9,6 +9,7 @@ package mtpcache
 import (
 	"mtp2_if/db"
 	"mtp2_if/logger"
+	"mtp2_if/utils"
 	"sync"
 	"time"
 )
@@ -22,9 +23,11 @@ type userName struct {
 }
 
 type userData struct {
-	LOGINID   int64  `json:"LOGINID"  xorm:"'LOGINID'"`     // 登录ID
-	LOGINCODE string `json:"LOGINCODE"  xorm:"'LOGINCODE'"` // 登录代码
-	USERNAME  string `json:"USERNAME"  xorm:"'USERNAME'"`   // 用户名字
+	USERID        int64  `json:"userid"  xorm:"'USERID'"`               // 用户id
+	RELATEDUSERID int64  `json:"relateduserid"  xorm:"'RELATEDUSERID'"` // 关联用户id
+	LOGINID       int64  `json:"LOGINID"  xorm:"'LOGINID'"`             // 登录ID
+	LOGINCODE     string `json:"LOGINCODE"  xorm:"'LOGINCODE'"`         // 登录代码
+	ACCOUNTNAME   string `json:"accountname"  xorm:"'ACCOUNTNAME'"`     // 用户名字
 }
 
 // 加载数据
@@ -42,11 +45,9 @@ func (r *userName) load() {
 		return
 	}
 
-	sqlId := "select l.loginid, l.logincode, s.username" +
-		"  from loginaccount l" +
-		"  left join systemmanager s" +
-		"    on l.logincode = s.logincode" +
-		" where s.username is not null"
+	var sqlId utils.SQLVal = "select t.userid, t.relateduserid, t.loginid, t.logincode, t.accountname" +
+		"  from loginaccount t" +
+		" where 1 = 1"
 
 	sData := make([]userData, 0)
 	s := e.SQL(sqlId)
@@ -70,7 +71,7 @@ func (r *userName) name(loginId int64) string {
 	}
 
 	if v, ok := r.data[loginId]; ok {
-		return v.USERNAME
+		return v.ACCOUNTNAME
 	}
 	return ""
 }
@@ -89,15 +90,17 @@ func (r *userName) loginCode(loginId int64) string {
 	return ""
 }
 
-// GetUserNameByLoginId 根据登录ID获取名称
-func GetUserNameByLoginId(loginId int64) string {
-	if v := vUser.name(loginId); v != "" {
-		return v
-	} else {
-		vUser.load()
+func (r *userName) logincodeByUserId(userId int64) string {
+	// 只取一个
+	r.mtx.RLock()
+	defer r.mtx.RUnlock()
+	for _, v := range r.data {
+		if v.USERID == userId {
+			return v.LOGINCODE
+		}
 	}
 
-	return vUser.name(loginId)
+	return ""
 }
 
 // GetLoginCodeByLoginId 根据登录ID获取登录代码
@@ -110,3 +113,13 @@ func GetLoginCodeByLoginId(loginId int64) string {
 
 	return vUser.loginCode(loginId)
 }
+
+// GetLoginCodeByUserId 获取登录代码
+func GetLoginCodeByUserId(userId int64) string {
+	if v := vUser.logincodeByUserId(userId); v != "" {
+		return v
+	} else {
+		vUser.load()
+	}
+	return vUser.logincodeByUserId(userId)
+}

+ 13 - 0
routers/router.go

@@ -416,6 +416,19 @@ func InitRouter() *gin.Engine {
 		ermcp3R.GET("/QueryDeliveryGoodsDetail", ermcp3.QueryDeliveryGoodsDetail)
 		ermcp3R.GET("/QuerySpotContract", ermcp3.QuerySpotContract)
 		ermcp3R.GET("/QuerySpotContractBS", ermcp3.QuerySpotContractBS)
+		ermcp3R.GET("/QueryExposureDetail", ermcp3.QueryExposureDetail)
+		ermcp3R.GET("/QueryExposureSpot", ermcp3.QueryExposureSpot)
+		ermcp3R.GET("/QueryExposureSpotDetail", ermcp3.QueryExposureSpotDetail)
+		ermcp3R.GET("/QryReportDaySpotDetail", ermcp3.QryReportDaySpotDetail)
+		ermcp3R.GET("/QryReportDayFinanceKx", ermcp3.QryReportDayFinanceKx)
+		ermcp3R.GET("/QryReportDayFinanceFp", ermcp3.QryReportDayFinanceFp)
+		ermcp3R.GET("/QryReportDaySpot", ermcp3.QryReportDaySpot)
+		ermcp3R.GET("/QryReportMonthSpot", ermcp3.QryReportMonthSpot)
+		ermcp3R.GET("/QryReportMonthSpotDetail", ermcp3.QryReportMonthSpotDetail)
+		ermcp3R.GET("/QryReportAreaSpotPL", ermcp3.QryReportAreaSpotPL)
+		ermcp3R.GET("/QueryDGFactoryItem", ermcp3.QueryDGFactoryItem)
+		ermcp3R.GET("/QueryGoodsbrand", ermcp3.QueryGoodsbrand)
+		ermcp3R.GET("/QueryGoodsWrstandard", ermcp3.QueryGoodsWrstandard)
 	}
 
 	return r

+ 8 - 0
token/token.go

@@ -3,9 +3,11 @@ package token
 import (
 	"errors"
 	"fmt"
+	"mtp2_if/config"
 	"mtp2_if/global/e"
 	"mtp2_if/rediscli"
 	"net/http"
+	"runtime"
 	"strings"
 
 	"github.com/gin-gonic/gin"
@@ -45,6 +47,12 @@ func Auth() gin.HandlerFunc {
 		// 	return
 		// }
 
+		if config.SerCfg.GetDebugMode() &&
+			runtime.GOOS == "windows" {
+			c.Next()
+			return
+		}
+
 		var code int
 		var data interface{}
 

Някои файлове не бяха показани, защото твърде много файлове са промени