当前位置: 首页 > news >正文

物料相关记录

• 背景

在金蝶星瀚物料列表中,标准列“物料分组”默认显示的是“物料基本分类标准”下的分组值。业务上希望在物料列表中显示另一个分类标
准“存货类别”下的分组,例如“烟、酒、茶”。

经过分析,不建议直接修改标准“物料分组”的显示逻辑,因为该字段有标准语义,直接改动可能影响查询、报表、权限规则和后续升
级。因此采用新增字段的方式实现。

实现思路

在物料主数据 bd_material 上新增一个自定义字段:

cyjt_invcategory / fk_cyjt_invcategory

用于保存“存货类别”分类标准对应的分类名称。

物料保存时,通过插件读取物料“分类标准”分录,找到分类标准为“存货类别”的那一行,将对应分组名称写入该字段。然后在物料列表
配置中增加该字段,即可显示“存货类别”。

插件实现

插件放在星瀚工程的操作插件包下:

cyjt.cy001.devcy.devcy01.plugin.operate

插件类:

MaterialInvCategorySavePlugin

核心逻辑:

物料保存时
-> 读取 entry_groupstandard 分类标准分录
-> 找到 standardid 对应编码为 002 或名称为“存货类别”的分录
-> 取 groupid 对应分组的 name
-> 写入物料主表字段 cyjt_invcategory

这样新保存或修改的物料都会自动同步“存货类别”。

列表显示配置

编辑界面新增字段后,列表不会自动显示,还需要在开发平台中配置列表字段:

物料 bd_material 扩展
-> 新增字段 cyjt_invcategory
-> 设置字段入库、可见、允许列表显示
-> 列表字段中加入“存货类别”
-> 发布元数据
-> 清缓存或重新登录

如果前台列表仍未显示,需要在列表个性化或列设置中勾选该字段。

历史数据处理

插件只对后续保存的物料生效,历史数据需要通过 SQL 批量补齐。

实际确认到相关物理表如下:

T_BD_MATERIAL -- 物料主表
t_bd_materialgroupdetail -- 物料分类标准分录表
t_bd_materialgroup -- 物料分组
t_bd_mtgroupstandard -- 分类标准表

主键均为:

fid

其中:

T_BD_MATERIAL.fk_cyjt_invcategory

为新增字段对应的数据库列。

分类标准“存货类别”的编码为:

002

UPDATE T_BD_MATERIAL m SET fk_cyjt_invcategory = g.fname FROM t_bd_materialgroupdetail e INNER JOIN t_bd_mtgroupstandard gs ON gs.fid = e.fstandardid INNER JOIN T_bd_materialgroup g ON g.fid = e.fgroupid WHERE e.fmaterialid = m.fid AND gs.fnumber = '002' AND (m.fk_cyjt_invcategory IS NULL OR trim(m.fk_cyjt_invcategory) = '') select * from T_BD_MATERIAL -- 物料主表 select * from t_bd_materialgroupdetail -- 物料分类标准分录表 select * from t_bd_materialgroup -- 物料分组 select * from t_bd_mtgroupstandard -- 分类标准表

历史数据预览 SQL

SELECT
m.fid,
m.fnumber,
m.fname,
m.fk_cyjt_invcategory AS 当前存货类别,
gs.fnumber AS 分类标准编码,
gs.fname AS 分类标准名称,
g.fnumber AS 分组编码,
g.fname AS 分组名称
FROM T_BD_MATERIAL m
INNER JOIN t_bd_materialgroupdetail e
ON e.fmaterialid = m.fid
INNER JOIN t_bd_mtgroupstandard gs
ON gs.fid = e.fstandardid
INNER JOIN T_bd_materialgroup g
ON g.fid = e.fgroupid
WHERE gs.fnumber = '002';

历史数据更新 SQL

UPDATE T_BD_MATERIAL m
SET fk_cyjt_invcategory = g.fname
FROM t_bd_materialgroupdetail e
INNER JOIN t_bd_mtgroupstandard gs
ON gs.fid = e.fstandardid
INNER JOIN T_bd_materialgroup g
ON g.fid = e.fgroupid
WHERE e.fmaterialid = m.fid
AND gs.fnumber = '002'
AND g.fname IS NOT NULL
AND trim(g.fname) <> ''
AND (
m.fk_cyjt_invcategory IS NULL
OR trim(m.fk_cyjt_invcategory) = ''
);

遇到的问题

一开始使用了 SQL Server 风格写法:

UPDATE m
SET ...
FROM ...

在 PostgreSQL 中报错:

relation "m" does not exist

原因是 PostgreSQL 不能直接 UPDATE m,需要写真实表名:

UPDATE T_BD_MATERIAL m

之后又遇到:

relation "bd_material" does not exist

原因是 bd_material 是星瀚实体标识,不是数据库物理表名。实际物理表是:

T_BD_MATERIAL

最后还发现字段看起来为空,但加上空值条件后查不到数据。排查发现:

fk_cyjt_invcategory 字符长度 = 1
原始值 = ' '

也就是说字段里存的是一个空格,不是 NULL,也不是空字符串。因此条件需要从:

m.fk_cyjt_invcategory IS NULL OR m.fk_cyjt_invcategory = ''

改为:

m.fk_cyjt_invcategory IS NULL OR trim(m.fk_cyjt_invcategory) = ''

总结

本次实现没有改动标准“物料分组”字段,而是通过新增物料字段 cyjt_invcategory 来冗余保存“存货类别”分类名称。新数据通过保存
插件自动同步,历史数据通过 SQL 批量补齐。该方案对标准逻辑影响小,列表展示清晰,也便于后续过滤、导出和报表使用。

package cyjt.cy001.devcy.devcy01.plugin.operate; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.entity.plugin.AbstractOperationServicePlugIn; import kd.bos.entity.plugin.args.BeforeOperationArgs; import kd.bos.logging.Log; import kd.bos.logging.LogFactory; /** * 物料保存插件:将“存货类别”分类标准分录同步到物料主表字段。 */ public class MaterialInvCategorySavePlugin extends AbstractOperationServicePlugIn { private static final Log log = LogFactory.getLog(MaterialInvCategorySavePlugin.class); private static final String ENTRY_GROUP_STANDARD = "entry_groupstandard"; private static final String FIELD_STANDARD = "standardid"; private static final String FIELD_GROUP = "groupid"; /** * 物料主表上的自定义字段标识,需要和开发平台设计器中创建的字段标识保持一致。 */ private static final String FIELD_INV_CATEGORY = "cyjt_invcategory"; /** * “存货类别”分类标准编码,当前按截图中的编码 002 处理。 */ private static final String INV_CATEGORY_STANDARD_NUMBER = "002"; private static final String INV_CATEGORY_STANDARD_NAME = "存货类别"; @Override public void beforeExecuteOperationTransaction(BeforeOperationArgs e) { super.beforeExecuteOperationTransaction(e); DynamicObject[] dataEntities = e.getDataEntities(); if (dataEntities == null || dataEntities.length == 0) { return; } for (DynamicObject material : dataEntities) { try { material.set(FIELD_INV_CATEGORY, getInvCategoryName(material)); } catch (Exception ex) { log.error("同步物料存货类别失败,物料ID:" + material.getLong("id"), ex); } } } private String getInvCategoryName(DynamicObject material) { DynamicObjectCollection entries = material.getDynamicObjectCollection(ENTRY_GROUP_STANDARD); if (entries == null || entries.isEmpty()) { return null; } for (DynamicObject entry : entries) { DynamicObject standard = entry.getDynamicObject(FIELD_STANDARD); if (!isInvCategoryStandard(standard)) { continue; } DynamicObject group = entry.getDynamicObject(FIELD_GROUP); return group == null ? null : group.getString("name"); } return null; } private boolean isInvCategoryStandard(DynamicObject standard) { if (standard == null) { return false; } String number = standard.getString("number"); String name = standard.getString("name"); return INV_CATEGORY_STANDARD_NUMBER.equals(number) || INV_CATEGORY_STANDARD_NAME.equals(name); } }
http://www.jsqmd.com/news/826177/

相关文章:

  • rt-thread源码探秘:rt_components_board_init的自动初始化机制剖析
  • 别只改EXCLUDED_ARCHS!深入理解iOS模拟器架构与动态库链接的‘爱恨情仇’
  • Agentset框架:声明式编排驱动多智能体系统开发与实战
  • 碧蓝航线Alas自动化脚本终极指南:如何实现7x24小时全自动游戏管理
  • 智能体开发资源全攻略:从Awesome列表到实战技术栈选型
  • 别再傻傻分不清了!手把手教你选对P-MOS和N-MOS做开关(附典型电路图)
  • Kubernetes自动扩缩容策略深度解析
  • 2025最权威的十大降重复率神器横评
  • 解锁明日方舟8000+官方素材:你的创意宝库终极指南
  • ClawForgeAI:基于大模型的代码生成中间件实践与私有化部署指南
  • 鱼叉式钓鱼产业化趋势与零信任防御体系研究
  • Proxima:模块化本地AI应用开发框架与智能体构建实战
  • 虚拟平台性能与功耗精确建模技术解析
  • 技能组合三维模型:深度、广度与时效性在职业发展中的动态平衡
  • 基于MCP协议构建AI视觉服务器:为LLM赋予图像理解能力
  • Simulink玩转F28335双ePWM同步:从模型到示波器波形全流程分析
  • 开源记忆引擎memU:为LLM构建长期记忆系统的实战指南
  • 2025届学术党必备的降重复率平台实际效果
  • 采购必看!防水电源、充电器厂家怎么选择,插墙式适配器工厂怎么选择,裸板电源厂哪家好?认准深圳三丽恒光科技 - 栗子测评
  • css文字超出显示省略号
  • 联盟营销实战指南:从技能树到高转化,打造可持续变现的数字资产
  • 2026年知名的江苏全屋定制板材/江苏全屋定制全屋整装厂家精选合集 - 行业平台推荐
  • 终极窗口记忆指南:用PersistentWindows告别多显示器布局混乱
  • WebToEpub:3分钟免费将网页小说转为EPUB电子书的终极指南
  • 2026值得信赖的硅微粉/玻璃粉生产厂家优选,高端粉体供应实力推荐 - 栗子测评
  • Kubernetes CRD 开发实践指南
  • GEE python:获取影像的信息和两景NDVI影像差异和影像方差
  • Kubernetes服务网格深度解析
  • Piral未来路线图:微前端技术的演进方向与发展趋势
  • 量子物理到底是啥?原理、核心概念与经典实验全面解析