90 lines
2.7 KiB
Go
90 lines
2.7 KiB
Go
package controllers
|
||
|
||
import (
|
||
"server/models"
|
||
)
|
||
|
||
// 移动端进销存报表接口:购销汇总、热销排行、收发存、毛利。
|
||
//
|
||
// 统计口径全部来自「已生效」单据与库存流水,与 Web 端报表共用 erp_report_core.go,
|
||
// 因此手机端看到的金额一定能和后台对得上;经营看板见 /api/erp/dashboard。
|
||
|
||
// AppErpReportController 报表(移动端)
|
||
type AppErpReportController struct {
|
||
AppErpBaseController
|
||
}
|
||
|
||
// PurchaseSummary GET /api/erp/report/purchase?dimension=product|supplier|month 采购汇总
|
||
func (c *AppErpReportController) PurchaseSummary() {
|
||
cl, err := c.erpClaims()
|
||
if c.erpDenied(err) {
|
||
return
|
||
}
|
||
from, to := c.erpDateRange(0)
|
||
group := erpReportDimension(c.erpQuery("dimension"))
|
||
items, docPartner, returnItems := erpSummaryDocs(c.actor(cl).Tid,
|
||
models.ErpDocPurchaseIn, models.ErpDocPurchaseReturn, from, to, c.erpUint("partner_id"))
|
||
c.erpOk(erpSummaryReportData(group, items, docPartner, returnItems))
|
||
}
|
||
|
||
// SalesSummary GET /api/erp/report/sales?dimension=product|customer|month 销售汇总
|
||
func (c *AppErpReportController) SalesSummary() {
|
||
cl, err := c.erpClaims()
|
||
if c.erpDenied(err) {
|
||
return
|
||
}
|
||
from, to := c.erpDateRange(0)
|
||
group := erpReportDimension(c.erpQuery("dimension"))
|
||
items, docPartner, returnItems := erpSummaryDocs(c.actor(cl).Tid,
|
||
models.ErpDocSalesOut, models.ErpDocSalesReturn, from, to, c.erpUint("partner_id"))
|
||
c.erpOk(erpSummaryReportData(group, items, docPartner, returnItems))
|
||
}
|
||
|
||
// Rank GET /api/erp/report/rank?order=desc|asc&top=10 热销/滞销排行
|
||
func (c *AppErpReportController) Rank() {
|
||
cl, err := c.erpClaims()
|
||
if c.erpDenied(err) {
|
||
return
|
||
}
|
||
from, to := c.erpDateRange(0)
|
||
top, _ := c.GetInt("top", 10)
|
||
data, code, msg := erpSalesRankCore(c.actor(cl), from, to, top, c.erpQuery("order") == "asc")
|
||
if msg != "" {
|
||
c.erpFail(code, code, msg)
|
||
return
|
||
}
|
||
c.erpOk(data)
|
||
}
|
||
|
||
// StockMove GET /api/erp/report/stockmove 收发存汇总表
|
||
func (c *AppErpReportController) StockMove() {
|
||
cl, err := c.erpClaims()
|
||
if c.erpDenied(err) {
|
||
return
|
||
}
|
||
from, to := c.erpDateRange(0)
|
||
page, pageSize := c.erpPage()
|
||
list, total, summary, code, msg := erpStockMoveCore(
|
||
c.actor(cl), from, to, c.erpUint("warehouse_id"), c.erpQuery("keyword"), page, pageSize)
|
||
if msg != "" {
|
||
c.erpFail(code, code, msg)
|
||
return
|
||
}
|
||
c.erpListOK(list, total, page, pageSize, map[string]interface{}{"summary": summary})
|
||
}
|
||
|
||
// Profit GET /api/erp/report/profit 毛利分析
|
||
func (c *AppErpReportController) Profit() {
|
||
cl, err := c.erpClaims()
|
||
if c.erpDenied(err) {
|
||
return
|
||
}
|
||
from, to := c.erpDateRange(0)
|
||
data, code, msg := erpProfitCore(c.actor(cl), from, to)
|
||
if msg != "" {
|
||
c.erpFail(code, code, msg)
|
||
return
|
||
}
|
||
c.erpOk(data)
|
||
}
|