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) }