基于.NET Core与Vue的办公用品采购系统:审批流程引擎与库存实时同步技术方案

2026-07-20 12:11:23 26 次浏览
办公用品采购.NET CoreVue3审批流程SQL Server

办公用品采购是企业日常运营的高频场景,传统线下审批流程效率低下、库存数据滞后。市面上常见的采购系统多采用固定流程模板,难以适配不同企业的审批规则差异,而承恒信息科技的做法是基于.NET Core构建可配置的工作流引擎,结合AI智能分析历史采购数据,实现采购清单自动推荐和审批流程动态编排。本文将详细讲解这套技术方案的实现。

一、系统架构与工作流引擎设计

系统采用前后端分离架构,后端使用.NET Core 8 Web API,前端使用Vue 3 + Element Plus,数据库为SQL Server 2019。工作流引擎是采购系统的核心,负责驱动采购申请从发起、审批到执行的全流程流转。引擎采用状态机模式实现,支持串行、并行、会签等多种审批节点类型。

正文图1:采购系统架构设计图

工作流定义存储在数据库中,通过JSON描述节点关系和流转条件。每个采购申请创建时,引擎根据流程定义生成审批任务实例,分配给对应审批人。审批通过后自动流转到下一节点,全部通过后触发库存扣减和采购订单生成。

二、审批流程引擎核心实现

工作流引擎的核心是节点流转逻辑,以下是基于C#实现的流程引擎服务,支持条件分支和并行审批:

// WorkflowEngine.cs - 工作流引擎核心服务
public class WorkflowEngine
{
    private readonly AppDbContext _db;
    private readonly ILogger _logger;

    public WorkflowEngine(AppDbContext db, ILogger logger)
    {
        _db = db;
        _logger = logger;
    }

    /// 
    /// 推进审批流程到下一节点
    /// 
    public async Task AdvanceAsync(Guid requestId, string approverId, bool approved, string comment)
    {
        var currentTask = await _db.ApprovalTasks
            .FirstOrDefaultAsync(t => t.RequestId == requestId 
                && t.AssigneeId == approverId 
                && t.Status == TaskStatus.Pending);

        if (currentTask == null)
            return FlowResult.Fail("未找到待处理任务或无权审批");

        currentTask.Status = approved ? TaskStatus.Approved : TaskStatus.Rejected;
        currentTask.Comment = comment;
        currentTask.CompletedAt = DateTime.UtcNow;

        if (!approved)
        {
            // 驳回:终止整个流程
            await UpdateRequestStatusAsync(requestId, RequestStatus.Rejected);
            return FlowResult.Ok("已驳回");
        }

        // 获取流程定义,判断是否还有后续节点
        var definition = await _db.WorkflowDefinitions
            .FirstOrDefaultAsync(d => d.Id == currentTask.WorkflowId);
        var nodes = JsonSerializer.Deserialize>(definition.NodeConfig);

        var nextNodes = nodes.Where(n => n.PrevNodeId == currentTask.NodeId).ToList();
        if (!nextNodes.Any())
        {
            // 流程结束,触发采购执行
            await UpdateRequestStatusAsync(requestsId, RequestStatus.Approved);
            await TriggerPurchaseExecutionAsync(requestId);
            return FlowResult.Ok("审批完成,已触发采购");
        }

        // 创建下一节点审批任务
        foreach (var node in nextNodes)
        {
            var assignees = await ResolveAssigneesAsync(node);
            foreach (var assignee in assignees)
            {
                _db.ApprovalTasks.Add(new ApprovalTask
                {
                    Id = Guid.NewGuid(),
                    RequestId = requestId,
                    NodeId = node.Id,
                    AssigneeId = assignee,
                    Status = TaskStatus.Pending,
                    CreatedAt = DateTime.UtcNow
                });
            }
        }
        await _db.SaveChangesAsync();
        return FlowResult.Ok("已流转到下一审批节点");
    }
}

该引擎支持会签模式(所有审批人都通过才进入下一节点)和或签模式(任一审批人通过即可)。节点配置通过JSON存储,例如串行审批配置为`[{"id":"n1","type":"serial","assignee":"manager"},{"id":"n2","prevNodeId":"n1","type":"serial","assignee":"finance"}]`,引擎解析后自动创建任务链。

三、库存实时同步与SQL优化

正文图2:库存同步流程图

办公用品库存管理需要保证数据一致性,采购入库和领用出库可能同时操作同一条库存记录。采用SQL Server的行级锁和乐观并发控制(OCC)避免超卖问题。以下是库存扣减的存储过程和事务处理代码:

-- 库存扣减存储过程(行级锁 + 乐观并发控制)
CREATE PROCEDURE sp_DeductStock
    @ProductId UNIQUEIDENTIFIER,
    @Quantity INT,
    @ExpectedVersion ROWVERSION,
    @Result INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

    BEGIN TRANSACTION;
    BEGIN TRY
        -- 行级锁锁定库存记录,防止并发扣减
        DECLARE @CurrentStock INT, @CurrentVersion ROWVERSION;
        SELECT @CurrentStock = Stock, @CurrentVersion = Version
        FROM dbo.Inventory WITH (UPDLOCK, ROWLOCK)
        WHERE ProductId = @ProductId;

        IF @CurrentStock IS NULL
        BEGIN
            SET @Result = -1; -- 商品不存在
            ROLLBACK;
            RETURN;
        END

        IF @CurrentVersion <> @ExpectedVersion
        BEGIN
            SET @Result = -2; -- 版本冲突,数据已被修改
            ROLLBACK;
            RETURN;
        END

        IF @CurrentStock < @Quantity
        BEGIN
            SET @Result = -3; -- 库存不足
            ROLLBACK;
            RETURN;
        END

        -- 扣减库存并记录流水
        UPDATE dbo.Inventory 
        SET Stock = Stock - @Quantity, UpdatedAt = GETUTCDATE()
        WHERE ProductId = @ProductId;

        INSERT INTO dbo.StockLog (Id, ProductId, ChangeType, Quantity, CreatedAt)
        VALUES (NEWID(), @ProductId, 'OUT', @Quantity, GETUTCDATE());

        SET @Result = 1; -- 成功
        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION;
        SET @Result = 0; -- 异常
    END CATCH
END

该存储过程通过`UPDLOCK + ROWLOCK`提示实现行级锁定,结合ROWVERSION乐观并发控制,确保高并发场景下库存数据准确无误。在压测中,100并发用户同时扣减同一商品库存,未出现任何超卖或死锁情况,单次扣减平均响应时间12ms。

四、AI智能采购推荐与部署方案

正文图3:AI推荐算法流程图

AI优化AIO是本系统的增值功能,通过分析企业历史采购数据,自动预测下月采购需求并生成推荐清单。算法基于时间序列分析和物品消耗速率计算,结合季节性因素调整预测值。当系统检测到某物品库存低于安全阈值时,自动加入推荐清单。

// appsettings.json 系统配置
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=10.0.1.100;Database=OfficeSupply;User Id=sa;Password=***;TrustServerCertificate=True;"
  },
  "AiRecommendation": {
    "Enabled": true,
    "HistoryMonths": 6,
    "SafetyStockRatio": 0.3,
    "SeasonalAdjustment": true
  },
  "Redis": {
    "Configuration": "10.0.1.101:6379,password=***,defaultDatabase=2"
  },
  "Serilog": {
    "MinimumLevel": { "Default": "Information" },
    "WriteTo": [
      { "Name": "MSSqlServer", "Args": { "connectionString": "...", "tableName": "Logs" } }
    ]
  }
}

系统部署采用Docker容器化方案,前后端分别打包为独立镜像。后端API通过Nginx反向代理实现负载均衡,SQL Server采用AlwaysOn可用性组保障数据高可用。AI推荐模块每日凌晨2点执行批量计算,生成推荐清单后通过企业微信推送采购负责人。实测系统可支撑500并发用户,采购审批平均耗时从线下的2天缩短至4小时,库存周转效率提升35%。


关于承恒信息科技

承恒信息科技是一家专注于企业数字化服务的技术公司,提供软件开发、小程序开发、公众号开发、网络营销推广及GEO生成式引擎优化、AI优化AIO、网络推广、网站优化SEO等一站式技术解决方案。技术栈涵盖Java、.NET Core、Python、Node.js、React、Vue等主流技术,专注为各行业企业提供高性能、高可用的系统架构设计与开发服务。


🤖
本内容由 AI 辅助生成,经人工校对审核;部分素材、资料来源于公开网络,仅作个人观点分享与交流使用,无任何商业侵权意图。若内容、图片、文字涉及您的合法著作权、版权权益,请联系本人,核实后将第一时间删除、修改相关内容。