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

增加接口:查库存报表

zou.yingbin преди 4 години
родител
ревизия
6ab1de0fd6
променени са 7 файла, в които са добавени 3940 реда и са изтрити 3603 реда
  1. 111 1
      controllers/ermcp/qryAreaStock.go
  2. 443 343
      docs/docs.go
  3. 443 343
      docs/swagger.json
  4. 2806 2906
      docs/swagger.yaml
  5. 122 2
      models/ermcpAreaStock.go
  6. 2 0
      routers/router.go
  7. 13 8
      utils/sqlUtils.go

+ 111 - 1
controllers/ermcp/qryAreaStock.go

@@ -9,12 +9,38 @@ package ermcp
 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
+}
+
 // QryAreaStockApplyReq 查询库存申请请求
 type QryAreaStockApplyReq struct {
-	USERID           string `form:"userid" binding:"required"` // 用户id
+	USERID           int64  `form:"userid" binding:"required"` // 用户id
 	INOUTTYPE        string `form:"inouttype"`                 // 出入库类型 - 1:采购入库 2:销售出库 3:生产入库 4:生产出库
 	SPOTCONTRACTID   string `form:"spotcontractid"`            // 合同ID
 	WRSTANDARDID     string `form:"wrstandardid"`              // 现货商品ID
@@ -106,3 +132,87 @@ func QueryAreaStock(c *gin.Context) {
 	m := models.ErmcpAreaStock{USERID: req.USERID}
 	a.DoGetDataEx(&m)
 }
+
+type QueryAreaStockReportReq struct {
+	USERID           int64  `form:"userid" binding:"required"`    // 用户id
+	DETAILTYPE       int32  `form:"detailtype"`                   // 明细类型 1:入库明细(采购入库+生产入库) 2:出库明细(销售出库+生产出库)
+	WRSTANDARDID     string `form:"wrstandardid"`                 // 现货商品ID
+	SPOTGOODSBRANDID int32  `form:"spotgoodsbrandid"`             // 品牌ID
+	SPOTGOODSMODELID int32  `form:"spotgoodsmodelid"`             // 型号ID
+	WAREHOUSEINFOID  string `form:"warehouseinfoid"`              // 仓库ID
+	QUERYTYPE        int32  `form:"querytype" binding:"required"` // 查询类型 1-日报表(或明细) 2-月报表(或明细)
+	QUERYDATE        string `form:"querydate" binding:"required"` // 查询日期(格式 日报表YYYYMMDD, 月报表YYYYMM)
+}
+
+// QueryAreaStockReport
+// @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 wrstandardid query int false "现货商品ID"
+// @Param spotgoodsbrandid query int false "品牌ID"
+// @Param spotgoodsmodelid query int false "型号ID"
+// @Param warehouseinfoid query int false "仓库ID"
+// @Success 200 {array} models.ErmcpAreaStockReport
+// @Failure 500 {object} app.Response
+// @Router /Ermcp/QueryAreaStockReport [get]
+// @Tags 企业风险管理(app)
+func QueryAreaStockReport(c *gin.Context) {
+	a := app.GinUtils{Gin: app.Gin{C: c}}
+	req := QueryAreaStockReportReq{}
+	a.DoBindReq(&req)
+	if QueryDate(req.QUERYDATE).IsNumberic(req.QUERYTYPE) {
+		m := models.ErmcpAreaStockReport{USERID: req.USERID, WRSTANDARDID: req.WRSTANDARDID,
+			SPOTGOODSBRANDID: req.SPOTGOODSBRANDID, SPOTGOODSMODELID: req.SPOTGOODSMODELID,
+			WAREHOUSEINFOID: req.WAREHOUSEINFOID, ReportDate: req.QUERYDATE, ReportType: req.QUERYTYPE}
+		a.DoGetDataEx(&m)
+	} else {
+		a.Gin.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
+	}
+}
+
+// QueryAreaStockReportDetail
+// @Summary 查询库存报表明细
+// @Produce json
+// @Security ApiKeyAuth
+// @Param userid query int true "用户ID"
+// @Param querytype query int true "查询类型 1-日报表明细 2-月报表明细"
+// @Param detailtype query int true "明细类型 1:入库明细(采购入库+生产入库) 2:出库明细(销售出库+生产出库)"
+// @Param querydate query string true "查询日期(格式 日报表YYYYMMDD, 月报表YYYYMM)"
+// @Param wrstandardid query int false "现货商品ID"
+// @Param spotgoodsbrandid query int false "品牌ID"
+// @Param spotgoodsmodelid query int false "型号ID"
+// @Param warehouseinfoid query int false "仓库ID"
+// @Success 200 {array} models.ErmcpAreaStockApply
+// @Failure 500 {object} app.Response
+// @Router /Ermcp/QueryAreaStockReportDetail [get]
+// @Tags 企业风险管理(app)
+func QueryAreaStockReportDetail(c *gin.Context) {
+	a := app.GinUtils{Gin: app.Gin{C: c}}
+	req := QueryAreaStockReportReq{}
+	a.DoBindReq(&req)
+	if QueryDate(req.QUERYDATE).IsNumberic(req.QUERYTYPE) {
+		var beginDate, endDate string
+		if req.QUERYTYPE == 1 {
+			beginDate = req.QUERYDATE
+			endDate = beginDate
+		} else if req.QUERYTYPE == 2 {
+			beginDate = req.QUERYDATE + "01"
+			endDate = req.QUERYDATE + "31"
+		}
+		m := models.ErmcpAreaStockApply{USERID: req.USERID, WRSTANDARDID: req.WRSTANDARDID,
+			SPOTGOODSBRANDID: req.SPOTGOODSBRANDID, SPOTGOODSMODELID: req.SPOTGOODSMODELID,
+			WAREHOUSEINFOID: req.WAREHOUSEINFOID, BeginDate: beginDate, EndDate: endDate, APPLYSTATUS: 2}
+		// 出入库类型(可多项,逗号隔开) 1:采购入库 2:销售出库 3:生产入库 4:生产出库"
+		if req.DETAILTYPE == 1 {
+			m.FilterStatus = "1,3"
+		} else if req.DETAILTYPE == 2 {
+			m.FilterStatus = "2,4"
+		}
+		a.DoGetDataEx(&m)
+	} else {
+		a.Gin.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
+	}
+}

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


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


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


+ 122 - 2
models/ermcpAreaStock.go

@@ -16,7 +16,7 @@ import (
 // ErmcpAreaStockApply 出入库申请
 type ErmcpAreaStockApply struct {
 	INOUTAPPLYID     string  `json:"inoutapplyid"  xorm:"'INOUTAPPLYID'"`         // 申请ID(607+Unix秒时间戳(10位)+xxxxxx)
-	USERID           string  `json:"userid"  xorm:"'USERID'"`                     // 机构ID
+	USERID           int64   `json:"userid"  xorm:"'USERID'"`                     // 机构ID
 	INOUTTYPE        int32   `json:"inouttype"  xorm:"'INOUTTYPE'"`               // 出入库类型 - 1:采购入库 2:销售出库 3:生产入库 4:生产出库
 	WRSTANDARDID     string  `json:"wrstandardid"  xorm:"'WRSTANDARDID'"`         // 现货商品ID
 	SPOTGOODSMODELID int32   `json:"spotgoodsmodelid"  xorm:"'SPOTGOODSMODELID'"` // 现货型号ID
@@ -57,6 +57,8 @@ type ErmcpAreaStockApply struct {
 
 	FilterStatus string `json:"-"` // 查询条件, 申请状态, 逗号隔开
 	FilterType   string `json:"-"` // 查询条件, 出入库类型, 逗号隔开
+	BeginDate    string `json:"-"` // 开始日期
+	EndDate      string `json:"-"` // 结束日期
 }
 
 func (r *ErmcpAreaStockApply) calc() {
@@ -153,11 +155,19 @@ func (r *ErmcpAreaStockApply) buildSql() string {
 	if len(r.WAREHOUSEINFOID) > 0 {
 		sqlId.And("t.WAREHOUSEINFOID", r.WAREHOUSEINFOID)
 	}
+	// 日期范围
+	if len(r.BeginDate) > 0 {
+		if r.BeginDate == r.EndDate {
+			sqlId.And("t.audittradedate", r.BeginDate)
+		}else if r.EndDate > r.BeginDate {
+			sqlId.BiggerOrEq("t.audittradedate", r.BeginDate)
+			sqlId.LessOrEq("t.audittradedate", r.EndDate)
+		}
+	}
 	// 出入库状态
 	if len(r.FilterStatus) > 0 {
 		sqlId.Join(fmt.Sprintf(" and t.APPLYSTATUS in(%v)", r.FilterStatus))
 	}
-
 	// 排序
 	sqlId.Join(" order by t.APPLYTIME desc")
 	return sqlId.String()
@@ -290,3 +300,113 @@ func (r *ErmcpAreaStock) GetDataEx() (interface{}, error) {
 	}
 	return sData, err
 }
+
+// ErmcpAreaStockReport 库存报表
+type ErmcpAreaStockReport struct {
+	USERID             int64   `json:"userid"  xorm:"'USERID'"`                         // 机构ID
+	WRSTANDARDID       string  `json:"wrstandardid"  xorm:"'WRSTANDARDID'"`             // 现货商品ID
+	SPOTGOODSMODELID   int32   `json:"spotgoodsmodelid"  xorm:"'SPOTGOODSMODELID'"`     // 现货型号ID
+	SPOTGOODSBRANDID   int32   `json:"spotgoodsbrandid"  xorm:"'SPOTGOODSBRANDID'"`     // 现货品牌ID
+	WAREHOUSEINFOID    string  `json:"warehouseinfoid"  xorm:"'WAREHOUSEINFOID'"`       // 仓库ID
+	DELIVERYGOODSID    int64   `json:"deliverygoodsid"  xorm:"'DELIVERYGOODSID'"`       // 现货品种ID
+	ORISTOCK           float64 `json:"oristock"  xorm:"'ORISTOCK'"`                     // 期初库存量
+	CURSTOCK           float64 `json:"curstock"  xorm:"'CURSTOCK'"`                     // 期末库存量
+	TODAYBUYINQTY      float64 `json:"todaybuyinqty"  xorm:"'TODAYBUYINQTY'"`           // 今日采购入库量
+	TODAYPRODUCEINQTY  float64 `json:"todayproduceinqty"  xorm:"'TODAYPRODUCEINQTY'"`   // 今日生产入库量
+	TODAYSELLOUTQTY    float64 `json:"todayselloutqty"  xorm:"'TODAYSELLOUTQTY'"`       // 今日销售出库量
+	TODAYPRODUCEOUTQTY float64 `json:"todayproduceoutqty"  xorm:"'TODAYPRODUCEOUTQTY'"` // 今日生产出库量
+	UPDATETIME         string  `json:"updatetime"  xorm:"'UPDATETIME'"`                 // 更新时间
+	WRSTANDARDNAME     string  `json:"wrstandardname"  xorm:"'WRSTANDARDNAME'"`         // 现货商品名称
+	WRSTANDARDCODE     string  `json:"wrstandardcode"  xorm:"'WRSTANDARDCODE'"`         // 现货商品代码
+	UNITID             int32   `json:"unitid"  xorm:"'UNITID'"`                         // 单位id
+	BRANDNAME          string  `json:"brandname"  xorm:"'BRANDNAME'"`                   // 品牌名称
+	MODELNAME          string  `json:"modelname"  xorm:"'MODELNAME'"`                   // 型号名称
+	WAREHOUSENAME      string  `json:"warehousename"  xorm:"'WAREHOUSENAME'"`           // 仓库名称
+	WAREHOUSECODE      string  `json:"warehousecode"  xorm:"'WAREHOUSECODE'"`           // 仓库代码
+	WAREHOUSETYPE      int32   `json:"warehousetype"  xorm:"'WAREHOUSETYPE'"`           // 仓库类型 - 1 厂库  2 自有库  3 合作库
+	USERNAME           string  `json:"username"`                                        // 机构名称
+	ENUMDICNAME        string  `json:"enumdicname"`                                     // 单位名称
+
+	ReportType int32  `json:"-"` // 报表类型 1-日报表 2-月报表
+	ReportDate string `json:"-"` // 格式 日报表(YYYYMMDD) 月报表(YYYYMM)
+}
+
+func (r *ErmcpAreaStockReport) calc() {
+	r.USERNAME = mtpcache.GetUserNameByUserId(r.USERID)
+	r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
+}
+
+func (r *ErmcpAreaStockReport) buildSql() string {
+	var sqlId utils.SQLVal = "SELECT t.TODAYBUYINQTY," +
+		"       t.TODAYPRODUCEINQTY," +
+		"       t.TODAYSELLOUTQTY," +
+		"       t.TODAYPRODUCEOUTQTY," +
+		"       to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
+		"       t.USERID," +
+		"       t.WRSTANDARDID," +
+		"       t.SPOTGOODSMODELID," +
+		"       t.SPOTGOODSBRANDID," +
+		"       t.WAREHOUSEINFOID," +
+		"       t.DELIVERYGOODSID," +
+		"       t.ORISTOCK," +
+		"       t.CURSTOCK," +
+		"       w.wrstandardname," +
+		"       w.wrstandardcode," +
+		"       w.unitid," +
+		"       gb.brandname," +
+		"       gm.modelname," +
+		"       h.warehousename," +
+		"       h.warehousecode," +
+		"       h.warehousetype" +
+		"  FROM %v t" +
+		"  LEFT JOIN WRSTANDARD w" +
+		"    on t.wrstandardid = w.wrstandardid" +
+		"  LEFT JOIN SPOTGOODSBRAND gb" +
+		"    on t.spotgoodsbrandid = gb.brandid" +
+		"  LEFT JOIN SPOTGOODSMODEL gm" +
+		"    on t.spotgoodsmodelid = gm.modelid" +
+		"  LEFT JOIN WAREHOUSEINFO h" +
+		"    on t.warehouseinfoid = h.autoid" +
+		" WHERE 1 = 1"
+
+	sqlId.And("t.USERID", r.USERID)
+	if r.ReportType == 1 {
+		// 日报表
+		sqlId.FormatParam("RECKON_ERMCP_AREASTOCK")
+		sqlId.And("t.reckondate", r.ReportDate)
+	} else {
+		// 月报表
+		sqlId.FormatParam("REPORT_ERMCP_AREASTOCK")
+		sqlId.And("t.cycletype", 1)
+		sqlId.And("t.cycletime", r.ReportDate)
+	}
+	// 现货商品id
+	if len(r.WRSTANDARDID) > 0 {
+		sqlId.And("t.WRSTANDARDID", r.WRSTANDARDID)
+	}
+	// 品牌id
+	if r.SPOTGOODSBRANDID > 0 {
+		sqlId.And("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID)
+	}
+	// 型号id
+	if r.SPOTGOODSMODELID > 0 {
+		sqlId.And("t.SPOTGOODSMODELID", r.SPOTGOODSMODELID)
+	}
+	// 仓库id
+	if len(r.WAREHOUSEINFOID) > 0 {
+		sqlId.And("t.WAREHOUSEINFOID", r.WAREHOUSEINFOID)
+	}
+	return sqlId.String()
+}
+
+// GetDataEx 查询库存报表
+func (r *ErmcpAreaStockReport) GetDataEx() (interface{}, error) {
+	sData := make([]ErmcpAreaStockReport, 0)
+	err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
+	if err == nil {
+		for i := range sData {
+			sData[i].calc()
+		}
+	}
+	return sData, err
+}

+ 2 - 0
routers/router.go

@@ -365,6 +365,8 @@ func InitRouter() *gin.Engine {
 		ermcpR.GET("/QueryAreaStockApply", ermcp.QueryAreaStockApply)
 		ermcpR.GET("/QueryAreaStockApplySum", ermcp.QueryAreaStockApplySum)
 		ermcpR.GET("/QueryAreaStock", ermcp.QueryAreaStock)
+		ermcpR.GET("/QueryAreaStockReport", ermcp.QueryAreaStockReport)
+		ermcpR.GET("/QueryAreaStockReportDetail", ermcp.QueryAreaStockReportDetail)
 
 		// 期货相关
 		// 查询企业风管期货商品信息

+ 13 - 8
utils/sqlUtils.go

@@ -12,37 +12,42 @@ import "fmt"
 
 type SQLVal string
 
-// 返回自身字符串
+// String 返回自身字符串
 func (r *SQLVal) String() string {
 	return string(*r)
 }
 
-// 增加and 条件
+// FormatParam 格式化参数
+func (r *SQLVal) FormatParam(a ...interface{}) {
+	*r = SQLVal(fmt.Sprintf(r.String(), a...))
+}
+
+// And 增加and 条件
 func (r *SQLVal) And(fieldName string, val interface{}) {
 	*r = *r + SQLVal(fmt.Sprintf(" and %v = %v", fieldName, val))
 }
 
-// 大于
+// Bigger 大于
 func (r *SQLVal) Bigger(fieldName string, val interface{}) {
 	*r = *r + SQLVal(fmt.Sprintf(" and %v > %v", fieldName, val))
 }
 
-// 大于等于
+// BiggerOrEq 大于等于
 func (r *SQLVal) BiggerOrEq(fieldName string, val interface{}) {
 	*r = *r + SQLVal(fmt.Sprintf(" and %v >= %v", fieldName, val))
 }
 
-// 小于等于
+// Less 小于等于
 func (r *SQLVal) Less(fieldName string, val interface{}) {
 	*r = *r + SQLVal(fmt.Sprintf(" and %v < %v", fieldName, val))
 }
 
-// 小于等于
+// LessOrEq 小于等于
 func (r *SQLVal) LessOrEq(fieldName string, val interface{}) {
 	*r = *r + SQLVal(fmt.Sprintf(" and %v <= %v", fieldName, val))
 }
 
-// 自由增加条件
+// Join 自由增加条件
 func (r *SQLVal) Join(condition string) {
 	*r = *r + SQLVal(condition)
-}
+}

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