package controllers import ( "time" erp "server/services/erp" ) // 移动端往来账与收付款接口。 // // 往来账由单据生效时自动生成,手机端同样不开放手工新增/修改; // 收付款单可以手工开草稿并确认核销,逻辑全部复用 erp_finance_core.go。 // AppErpFinanceController 往来账 / 收付款(移动端) type AppErpFinanceController struct { AppErpBaseController } // BillList GET /api/erp/finance/bill/list 往来账(应收/应付) func (c *AppErpFinanceController) BillList() { cl, err := c.erpClaims() if c.erpDenied(err) { return } page, pageSize := c.erpPage() f := erpBillFilter{ BillType: c.erpQuery("bill_type"), PartnerID: c.erpUint("partner_id"), PartnerType: c.erpQuery("partner_type"), SourceDocID: c.erpUint("source_doc_id"), SettleState: c.erpQuery("settle_state"), Keyword: c.erpQuery("keyword"), DateFrom: c.erpQuery("date_from"), DateTo: c.erpQuery("date_to"), } list, total, summary, code, msg := erpBillListCore(c.actor(cl), f, page, pageSize) if msg != "" { c.erpFail(code, code, msg) return } c.erpListOK(list, total, page, pageSize, map[string]interface{}{"summary": summary}) } // BillDetail GET /api/erp/finance/bill/detail/:id 往来账详情(含核销记录与原单据) func (c *AppErpFinanceController) BillDetail() { cl, err := c.erpClaims() if c.erpDenied(err) { return } data, code, msg := erpBillDetailCore(c.actor(cl), c.erpPathID()) if msg != "" { c.erpFail(code, code, msg) return } c.erpOk(data) } // Aging GET /api/erp/finance/aging 账龄分析(按未结余额分桶) func (c *AppErpFinanceController) Aging() { cl, err := c.erpClaims() if c.erpDenied(err) { return } data, code, msg := erpAgingCore(c.actor(cl)) if msg != "" { c.erpFail(code, code, msg) return } c.erpOk(data) } // FundList GET /api/erp/finance/fund/list 收付款单列表 func (c *AppErpFinanceController) FundList() { cl, err := c.erpClaims() if c.erpDenied(err) { return } page, pageSize := c.erpPage() f := erpFundFilter{ FundType: c.erpQuery("fund_type"), Status: c.erpQuery("status"), PartnerID: c.erpUint("partner_id"), Keyword: c.erpQuery("keyword"), DateFrom: c.erpQuery("date_from"), DateTo: c.erpQuery("date_to"), } list, total, code, msg := erpFundListCore(c.actor(cl), f, page, pageSize) if msg != "" { c.erpFail(code, code, msg) return } c.erpListOK(list, total, page, pageSize, nil) } // FundDetail GET /api/erp/finance/fund/detail/:id 收付款单详情(含核销明细与原往来账) func (c *AppErpFinanceController) FundDetail() { cl, err := c.erpClaims() if c.erpDenied(err) { return } data, code, msg := erpFundDetailCore(c.actor(cl), c.erpPathID()) if msg != "" { c.erpFail(code, code, msg) return } c.erpOk(data) } // FundSave POST /api/erp/finance/fund/save 新建/修改收付款草稿 func (c *AppErpFinanceController) FundSave() { cl, err := c.erpClaims() if c.erpDenied(err) { return } var p erpFundPayload if !c.erpBody(&p, false) { return } id, fundNo, code, msg := erpFundSaveCore(c.actor(cl), p) if msg != "" { c.erpFail(code, code, msg) return } c.erpOk(map[string]interface{}{"id": id, "fund_no": fundNo}) } // FundConfirm POST /api/erp/finance/fund/confirm/:id // 确认收付款并核销;body 可选 settles=[{partner_bill_id,amount}],不传则按到期日自动 FIFO。 func (c *AppErpFinanceController) FundConfirm() { cl, err := c.erpClaims() if c.erpDenied(err) { return } var body struct { Settles []erp.SettleItem `json:"settles"` } if !c.erpBody(&body, true) { return } code, msg := erpFundConfirmCore(c.actor(cl), c.erpPathID(), body.Settles) if msg != "" { c.erpFail(code, code, msg) return } c.erpOk(nil) } // FundVoid POST /api/erp/finance/fund/void/:id 作废收付款单(回滚核销) func (c *AppErpFinanceController) FundVoid() { cl, err := c.erpClaims() if c.erpDenied(err) { return } code, msg := erpFundVoidCore(c.actor(cl), c.erpPathID()) if msg != "" { c.erpFail(code, code, msg) return } c.erpOk(nil) } // FundDelete DELETE /api/erp/finance/fund/delete/:id 仅草稿可删 func (c *AppErpFinanceController) FundDelete() { cl, err := c.erpClaims() if c.erpDenied(err) { return } code, msg := erpFundDeleteCore(c.actor(cl), c.erpPathID()) if msg != "" { c.erpFail(code, code, msg) return } c.erpOk(nil) } // FundOpenBills GET /api/erp/finance/fund/openBills?fund_type=&partner_id= // 收款/付款时列出可核销的往来账,手机端据此勾选。 func (c *AppErpFinanceController) FundOpenBills() { cl, err := c.erpClaims() if c.erpDenied(err) { return } ft, _ := erpInt8Query(c.erpQuery("fund_type")) list, code, msg := erpFundOpenBillsCore(c.actor(cl), ft, c.erpUint("partner_id")) if msg != "" { c.erpFail(code, code, msg) return } c.erpOk(map[string]interface{}{"list": list}) } // CashFlow GET /api/erp/finance/cashflow 资金流水(只统计实际收付) func (c *AppErpFinanceController) CashFlow() { cl, err := c.erpClaims() if c.erpDenied(err) { return } // 与 Web 端一致:默认统计近 30 天 from, to := time.Now().AddDate(0, 0, -30), time.Now() if d := c.erpQuery("date_from"); d != "" { if t, e := time.ParseInLocation("2006-01-02", d, time.Local); e == nil { from = t } } if d := c.erpQuery("date_to"); d != "" { if t, e := time.ParseInLocation("2006-01-02", d, time.Local); e == nil { to = t } } data, code, msg := erpCashFlowCore(c.actor(cl), from, to) if msg != "" { c.erpFail(code, code, msg) return } c.erpOk(data) } // PartnerSummary GET /api/erp/finance/partner 往来单位对账汇总 func (c *AppErpFinanceController) PartnerSummary() { cl, err := c.erpClaims() if c.erpDenied(err) { return } data, code, msg := erpPartnerSummaryCore(c.actor(cl), c.erpQuery("partner_type")) if msg != "" { c.erpFail(code, code, msg) return } c.erpOk(data) }