尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

InvenTree 项目代码(Project Codes)详解:为订单建立可追踪的项目维度

InvenTree 项目代码(Project Codes)详解:为订单建立可追踪的项目维度 InvenTree 项目代码Project Codes详解为订单建立可追踪的项目维度【免费下载链接】InvenTreeOpen Source Inventory Management System项目地址: https://gitcode.com/GitHub_Trending/in/InvenTreeInvenTree 的 Project Codes项目代码是一套用于跨订单追踪项目的轻量级标识机制为采购订单、销售订单、退货订单和构建订单打上统一的项目标记即可在订单列表中按项目筛选、排序与检索。本文基于仓库文档 Project Codes 与后端/前端源码完整讲解项目代码的数据模型、全局开关PROJECT_CODES_ENABLED的配置方式、订单级与行项目级的分配规则以及 API 与前端表格中对应的筛选实现读完即可在 InvenTree 实例中启用并按项目组织全部订单数据。项目代码是什么项目代码是一个分配给特定项目的唯一标识符用于追踪和组织与项目相关的活动与资源便于快速检索项目相关数据并支撑项目管理与报表需求。从源码看项目代码对应后端模型ProjectCode定义在 common/models.py。该模型继承自InvenTreeMetadataModel意味着每个项目代码还可以附加任意的 Metadata 键值对核心字段包括字段类型/约束说明codeCharField(max_length50)uniqueTrue唯一的项目代码字符串即标识本身descriptionCharField(max_length200)可空项目描述activeBooleanField默认True该项目代码是否处于启用状态responsible外键指向users.models.Owner可空负责该项目的用户或用户组模型中__str__直接返回code因此在前端下拉框、表格列和 API 输出中项目代码基本都以其代码串形式展示。此外check_permission方法显示任何用户都有权查看项目代码view权限而创建/编辑等写操作受限于 staff 用户这与后文“仅在设置页中管理”的入口设计一致。为订单分配项目代码项目代码可以分配给系统中的多种订单类型文档中明确列出四类构建订单Build Orders采购订单Purchase Orders销售订单Sales Orders退货订单Return Orders为订单分配项目代码后用户可以按项目聚合查看与某个项目相关的所有订单从而加强项目层面的监督与资源分配管理。在数据模型层面订单基类通过外键挂载项目代码见 order/models.pyproject_code models.ForeignKey( common_models.ProjectCode, on_deletemodels.SET_NULL, blankTrue, nullTrue, verbose_name_(Project Code), help_text_(Select project code for this order), )两个实现细节值得注意on_deletemodels.SET_NULL删除某个项目代码时已关联的订单不会级联删除其project_code字段会被置空。这保证了项目代码可以安全地增删而不破坏订单历史数据。blankTrue, nullTrue项目代码是纯可选字段不分配项目代码的订单完全正常工作。行项目级的项目代码对于带有外部公司供应商或客户的订单系统支持在行项目line item级别分配项目代码实现更细粒度的项目追踪。此时订单自身的项目代码充当该行项目级别的默认值除非在行项目上被显式覆盖。这一点在抽象行项目模型OrderLineItem中有直接体现其文档字符串明确列出project_code: Project code associated with this line item (optional)并在 order/models.py 中定义了与订单相同的可空外键。因此采购订单行、销售订单行以及订单的额外行ExtraLine都各自持有一个独立的项目代码引用。分配时机项目代码既可以在订单创建时分配也可以在之后任意阶段通过编辑订单来分配。只要项目代码功能已启用订单详情表单中就会出现Project Code字段前端表单的逻辑同样印证了这一点。以 PurchaseOrderForms.tsx 为例if (!globalSettings.isSet(PROJECT_CODES_ENABLED, true)) { delete fields.project_code; }即当全局设置未启用项目代码时表单会直接从字段定义中移除project_code用户在界面上根本看不到该输入项。销售、构建、退货、调拨订单的表单SalesOrderForms.tsx、BuildForms.tsx、ReturnOrderForms.tsx、TransferOrderForms.tsx采用完全相同的条件判断逻辑。管理项目代码全局设置与配置表项目代码的管理创建、编辑、删除入口位于全局设置页面选择Project Codes标签页即可进入项目代码的配置界面该标签页下只暴露一个全局设置项NameDescriptionDefaultUnitsPROJECT_CODES_ENABLEDEnable project codes for tracking projectsFalsebool该设置在后端的定义见 common/setting/system.pyPROJECT_CODES_ENABLED: { name: _(Enable project codes), description: _(Enable project codes for tracking projects), default: False, validator: bool, },启用项目代码支持默认情况下项目代码功能是关闭的default: False。需要在设置页选择Enable Project Codes将PROJECT_CODES_ENABLED设为True订单表单才会出现Project Code字段。从源码结构看这个开关的作用域是“界面可见性”而非“数据层可用性”后端模型的外键定义与 API 端点并不检查该开关只是前端的表单字段、表格列和过滤器根据PROJECT_CODES_ENABLED动态显示或隐藏。也就是说即使界面开关关闭通过 API 直接写入project_code字段在数据层仍是可行的该设置本质上是控制功能在 UI 中是否启用。前端管理界面由 AdminCenter 的project-codes标签页渲染{ name: project-codes, label: tProject Codes, icon: IconListDetails /, content: ( Stack gapxs GlobalSettingList keys{[PROJECT_CODES_ENABLED]} / ProjectCodeTable / /Stack ) }即该页面上半部分是PROJECT_CODES_ENABLED开关下半部分是ProjectCodeTable项目代码列表用于集中维护所有代码的code、description、active与responsible字段。按项目代码筛选订单订单表格支持按项目代码直接筛选和排序这是该功能日常使用频率最高的操作前端表格层提供了两个配套组件见 Filter.tsxHasProjectCodeFilter布尔过滤器对应 API 字段has_project_code用于快速筛选“已分配项目代码”或“未分配项目代码”的订单ProjectCodeFilter按具体项目代码值过滤且其active状态同样受PROJECT_CODES_ENABLED控制。排序列则由 ColumnRenderers.tsx 中的ProjectCodeColumn提供accessor: project_code并支持按代码排序。后端 API 侧的对应实现位于订单过滤器基类order/api.pyproject_code rest_filters.ModelChoiceFilter( querysetcommon.models.ProjectCode.objects.all(), field_nameproject_code, label_(Project Code), ) has_project_code rest_filters.BooleanFilter( methodfilter_has_project_code, label_(Has Project Code) ) def filter_has_project_code(self, queryset, name, value): Filter by whether or not the order has a project code. if str2bool(value): return queryset.exclude(project_codeNone) return queryset.filter(project_codeNone)因此在 REST API 中可以对各订单列表端点如采购订单列表附加查询参数?project_codeid按项目代码 ID 过滤?has_project_codetrue|false按“是否已分配项目代码”过滤。此外各订单列表端点采购订单、销售订单、退货订单、调拨订单都在search_fields中纳入了project_code__code并声明了排序别名ordering_field_aliases {project_code: [project_code__code]}使得全局搜索输入项目代码串、以及按?orderingproject_code排序均可直接生效。在序列化输出方面common/filters.py 提供了两个可选字段构建器enable_project_code_filter()输出project_code_detail完整的项目代码对象含code、description等并通过prefetch_fields[project_code]自动预取关系避免 N1 查询enable_project_label_filter()输出project_code_label即只返回project_code.code字符串供表格列轻量展示。这两个可选字段被订单与行项目序列化器广泛引用见 order/serializers.py调用方可以通过detail[]输出选项控制是否返回完整对象兼顾了列表接口的性能与详情接口的完整性。小结InvenTree 的项目代码机制由三个层次构成数据层是带唯一code的ProjectCode模型及其在订单、行项目上的可空外键配置层是默认关闭的全局开关PROJECT_CODES_ENABLED交互层则是订单表单中的Project Code字段与订单表格中的项目代码筛选/排序能力。由于外键采用SET_NULL级联策略且字段完全可选该功能可以在不影响既有订单数据的前提下随时启用与调整适合作为多项目并存环境下组织采购、销售与生产订单的轻量级维度。【免费下载链接】InvenTreeOpen Source Inventory Management System项目地址: https://gitcode.com/GitHub_Trending/in/InvenTree创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表