This commit is contained in:
hero920103 committed 2026-11-14 07:54:01 +08:00
1 parent 4ab63e77ed
commit eb9b7beff5
16 files changed
+1031 -91

No files matched your search

+6
View File
@@ -482,6 +482,12 @@ func (c *BackendApprovalController) Options() {
"code": m.Code, "name": m.Name, "enabled": enabled,
})
}
// 进销存单据运行期按 biz_type = "erp_" + doc_type 找流程。这里额外开放「采购订单审批」
// 分类,让用户能配出只作用于采购订单的流程;不配时仍会回落到模块级 erp 流程。
// 分类 code 即 biz_type,与 FlowSave 的「分类与单据类型对齐」约定一致。
moduleList = append(moduleList, map[string]interface{}{
"code": models.ApprovalBizPurchaseOrder, "name": "采购订单审批", "enabled": true,
})
// 租户用户
var tu []models.SystemTenantUser
@@ -142,6 +142,25 @@ func (c *BackendApprovalRuntimeController) InstanceTodo() {
} else {
qs = qs.Filter("status", models.ApprovalTaskPending)
}
// 审批任务自带 biz_type,直接在任务查询上过滤,total 与分页才准确。
// erp = 只查进销存单据;non_erp = 只查其它审批,两个审批列表互不混入。
if bizType := strings.TrimSpace(c.GetString("biz_type")); bizType != "" {
switch bizType {
case "erp", "erp_":
qs = qs.Filter("biz_type__startswith", "erp_")
case "non_erp":
// 用已知单据类型精确排除,避免依赖 Exclude 对前缀操作符的支持
erpBizTypes := make([]string, 0, len(erpDocTypes))
for docType := range erpDocTypes {
erpBizTypes = append(erpBizTypes, models.ErpDocApprovalBizType(docType))
}
if len(erpBizTypes) > 0 {
qs = qs.Exclude("biz_type__in", erpBizTypes)
}
default:
qs = qs.Filter("biz_type", bizType)
}
}
total, _ := qs.Count()
var tasks []models.ApprovalTask
@@ -163,6 +182,7 @@ func (c *BackendApprovalRuntimeController) InstanceTodo() {
continue
}
taskView := oaApprovalTaskView(t, true, oaApprovalNodeTypes(inst)[t.NodeKey])
taskView["instance_id"] = t.InstanceID
taskView["instance"] = oaApprovalInstanceView(inst)
list = append(list, taskView)
}
+5
View File
@@ -578,6 +578,11 @@ func erpDocExecutableCore(a erpActor, id uint64) (map[string]interface{}, int, s
if e != nil {
return nil, 404, "单据未找到"
}
// 只有已生效单据可作为下推来源;作废、草稿、审批中、驳回都直接拒绝,
// 与保存时 erpValidateDocHead 的来源状态校验保持一致,避免绕过前端菜单
if doc.Status != models.ErpDocStatusApproved {
return nil, 400, "来源单据未生效,不能下推"
}
isReturn := doc.DocType == models.ErpDocPurchaseReturn || doc.DocType == models.ErpDocSalesReturn
items := erpDocItems(models.Orm, doc.ID)
out := make([]map[string]interface{}, 0, len(items))
+13 -3
View File
@@ -5,7 +5,7 @@
-- ============================================================
-- 目标结构(「大类」= 模块根下一层目录,会作为移动端功能页的分组标题;
-- 「小类」= 叶子菜单,渲染为功能卡片):
-- 工作台 -> 工作台(复用已有仪表盘页面 /apps/erp/dashboard)
-- 工作台(目录)-> 工作台(仪表盘 /apps/erp/dashboard)/ 审批列表(/apps/erp/workbench/approval)
-- 基础资料 -> 商品 / 供应商 / 客户 / 仓库
-- 采购管理 -> 采购订单 / 采购入库 / 采购退货
-- 销售管理 -> 销售订单 / 销售出库 / 销售退货
@@ -36,6 +36,12 @@ FROM DUAL
WHERE @erp_id IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/apps/erp/workbench' AND delete_time IS NULL) x);
-- 工作台必须是目录:历史数据里可能被建成了页面,统一纠正,目录内才放工作台/审批列表两个页面
UPDATE yz_system_menu
SET type = 1, component_path = NULL, update_time = NOW()
WHERE delete_time IS NULL AND path = '/apps/erp/workbench'
AND (type <> 1 OR (component_path IS NOT NULL AND component_path <> ''));
INSERT INTO yz_system_menu
(pid, title, path, component_path, icon, sort, status, is_visible, views, type, creater, remark)
SELECT @erp_id, '基础资料', '/apps/erp/basic', NULL, 'fa-solid fa-database', 2, 1, 1, '[2]', 1, 'system', '进销存大类:基础资料'
@@ -91,9 +97,9 @@ SET @erp_basic := (SELECT id FROM yz_system_menu WHERE path = '/apps/erp/bas
SET @erp_system := (SELECT id FROM yz_system_menu WHERE path = '/apps/erp/system' AND delete_time IS NULL LIMIT 1);
-- ---------- 2. 已有菜单迁入新树(避免同一功能出现两份) ----------
-- 仪表盘 -> 工作台大类,并更名为「工作台」;路由与页面文件不变
-- 仪表盘 -> 工作台目录内的「工作台」页面;路由与页面文件不变
UPDATE yz_system_menu
SET pid = @erp_workbench, title = '工作台', sort = 1, update_time = NOW()
SET pid = @erp_workbench, title = '工作台', sort = 1, type = 2, update_time = NOW()
WHERE delete_time IS NULL AND path = '/apps/erp/dashboard' AND @erp_workbench IS NOT NULL;
-- 供应商列表 / 客户列表 -> 基础资料大类,去掉「列表」后缀;路由与页面文件不变
@@ -127,6 +133,8 @@ CREATE TEMPORARY TABLE tmp_erp_leaf (
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
INSERT INTO tmp_erp_leaf (parent_path, title, path, icon, sort, remark) VALUES
('/apps/erp/workbench', '工作台', '/apps/erp/dashboard', 'fa-solid fa-gauge', 1, '进销存工作台(仪表盘)'),
('/apps/erp/workbench', '审批列表', '/apps/erp/workbench/approval', 'fa-solid fa-clipboard-check', 2, '待我审批 / 我已处理,审批后单据自动生效'),
('/apps/erp/basic', '商品', '/apps/erp/basic/product', 'fa-solid fa-box', 1, '商品档案'),
('/apps/erp/basic', '仓库', '/apps/erp/basic/warehouse', 'fa-solid fa-boxes-packing', 4, '仓库档案'),
('/apps/erp/purchase', '采购订单', '/apps/erp/purchase/order', 'fa-solid fa-file-invoice', 1, '采购订单'),
@@ -168,6 +176,8 @@ CREATE TEMPORARY TABLE tmp_erp_page (
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
INSERT INTO tmp_erp_page (path, component_path) VALUES
('/apps/erp/dashboard', '/apps/erp/dashboard/index.vue'),
('/apps/erp/workbench/approval', '/apps/erp/workbench/approvalList.vue'),
('/apps/erp/basic/product', '/apps/erp/basic/product.vue'),
('/apps/erp/basic/warehouse', '/apps/erp/basic/warehouse.vue'),
('/apps/erp/purchase/order', '/apps/erp/purchase/order.vue'),
+4 -3
View File
@@ -44,9 +44,10 @@ const (
// 单据类型
const (
ApprovalBizReimburse = "reimburse" // OA 报销单
ApprovalBizBid = "bid" // CRM 投标立项
ApprovalBizDomain = "domain" // 域名申请(平台侧审批)
ApprovalBizReimburse = "reimburse" // OA 报销单
ApprovalBizBid = "bid" // CRM 投标立项
ApprovalBizDomain = "domain" // 域名申请(平台侧审批)
ApprovalBizPurchaseOrder = "erp_purchase_order" // 采购订单审批(与 ErpDocApprovalBizType 一致)
)
// ---------------- 租户侧配置 ----------------