Files
2026-10-19 01:13:17 +08:00

184 lines
4.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package controllers
// 移动端进销存单据接口(采购/销售/库存十类单据共用一套路由)。
//
// 与 /backend/erp/document* 的关系:handler 与路由各自独立(接口隔离规范),
// 单据校验、明细装配、落库事务、审批提交与生效联动全部复用 erp_document_core.go,
// 因此手机端开的一张单和 Web 端开的完全等价——同一行记录、同一套库存流水。
// AppErpDocumentController 单据中心(移动端)
type AppErpDocumentController struct {
AppErpBaseController
}
// List GET /api/erp/document/list
func (c *AppErpDocumentController) List() {
cl, err := c.erpClaims()
if c.erpDenied(err) {
return
}
page, pageSize := c.erpPage()
f := erpDocFilter{
DocType: c.erpQuery("doc_type"),
DocTypes: c.erpQuery("doc_types"),
Status: c.erpQuery("status"),
Keyword: c.erpQuery("keyword"),
PartnerID: c.erpUint("partner_id"),
WarehouseID: c.erpUint("warehouse_id"),
SourceDocID: c.erpUint("source_doc_id"),
DateFrom: c.erpQuery("date_from"),
DateTo: c.erpQuery("date_to"),
}
list, total, code, msg := erpDocListCore(c.actor(cl), f, page, pageSize)
if msg != "" {
c.erpFail(code, code, msg)
return
}
c.erpListOK(list, total, page, pageSize, nil)
}
// Detail GET /api/erp/document/detail/:id
func (c *AppErpDocumentController) Detail() {
cl, err := c.erpClaims()
if c.erpDenied(err) {
return
}
id := c.erpPathID()
doc, code, msg := erpDocDetailCore(c.actor(cl), id)
if msg != "" {
c.erpFail(code, code, msg)
return
}
c.erpOk(doc)
}
// Save POST /api/erp/document/save 新建或覆盖保存草稿(body 带 id 即为编辑)
func (c *AppErpDocumentController) Save() {
cl, err := c.erpClaims()
if c.erpDenied(err) {
return
}
var p erpDocPayload
if !c.erpBody(&p, false) {
return
}
id, docNo, code, msg := erpDocSaveCore(c.actor(cl), p)
if msg != "" {
c.erpFail(code, code, msg)
return
}
c.erpOk(map[string]interface{}{"id": id, "doc_no": docNo})
}
// Delete DELETE /api/erp/document/delete/:id 仅草稿/驳回可删除(软删)
func (c *AppErpDocumentController) Delete() {
cl, err := c.erpClaims()
if c.erpDenied(err) {
return
}
id := c.erpPathID()
code, msg := erpDocDeleteCore(c.actor(cl), id)
if msg != "" {
c.erpFail(code, code, msg)
return
}
c.erpOk(nil)
}
// Cancel POST /api/erp/document/cancel/:id 作废单据
func (c *AppErpDocumentController) Cancel() {
cl, err := c.erpClaims()
if c.erpDenied(err) {
return
}
id := c.erpPathID()
code, msg := erpDocCancelCore(c.actor(cl), id)
if msg != "" {
c.erpFail(code, code, msg)
return
}
c.erpOk(nil)
}
// Approve POST /api/erp/document/approve/:id 直接审核生效(未走审批流时使用)
func (c *AppErpDocumentController) Approve() {
cl, err := c.erpClaims()
if c.erpDenied(err) {
return
}
id := c.erpPathID()
code, msg := erpDocApproveCore(c.actor(cl), id)
if msg != "" {
c.erpFail(code, code, msg)
return
}
c.erpOk(nil)
}
// Submit POST /api/erp/document/submit/:id?flow_id= 提交审批流
func (c *AppErpDocumentController) Submit() {
cl, err := c.erpClaims()
if c.erpDenied(err) {
return
}
id := c.erpPathID()
instID, code, msg := erpDocSubmitCore(c.actor(cl), id, c.erpUint("flow_id"))
if msg != "" {
c.erpFail(code, code, msg)
return
}
c.erpOk(map[string]interface{}{"instance_id": instID})
}
// Flows GET /api/erp/document/flows?doc_type= 该单据类型可用的审批流
func (c *AppErpDocumentController) Flows() {
cl, err := c.erpClaims()
if c.erpDenied(err) {
return
}
bizType, flows, code, msg := erpDocFlowsCore(c.actor(cl), c.erpQuery("doc_type"))
if msg != "" {
c.erpFail(code, code, msg)
return
}
c.erpOk(map[string]interface{}{"list": flows, "biz_type": bizType})
}
// Executable GET /api/erp/document/executable/:id 来源订单中尚可执行的明细行
func (c *AppErpDocumentController) Executable() {
cl, err := c.erpClaims()
if c.erpDenied(err) {
return
}
id := c.erpPathID()
data, code, msg := erpDocExecutableCore(c.actor(cl), id)
if msg != "" {
c.erpFail(code, code, msg)
return
}
c.erpOk(data)
}
// TakeSheet GET /api/erp/document/takeSheet?warehouse_id= 盘点表初始化
func (c *AppErpDocumentController) TakeSheet() {
cl, err := c.erpClaims()
if c.erpDenied(err) {
return
}
list, code, msg := erpTakeSheetCore(c.actor(cl), c.erpUint("warehouse_id"))
if msg != "" {
c.erpFail(code, code, msg)
return
}
c.erpOk(map[string]interface{}{"list": list})
}
// Meta GET /api/erp/document/meta 开单页字典(单据类型/状态/默认仓库/价格口径)
func (c *AppErpDocumentController) Meta() {
cl, err := c.erpClaims()
if c.erpDenied(err) {
return
}
c.erpOk(erpDocMetaDict(c.actor(cl)))
}