This commit is contained in:
hero920103 committed 2026-10-19 01:13:17 +08:00
1 parent 5718a00e31
commit 1850ac640e
226 files changed
+37772 -12071

No files matched your search

+89
View File
@@ -0,0 +1,89 @@
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)
}