业务字段灵活调整参考方案

避坑指南:为什么用MIGO 102冲销后MBSM查不到记录?SAP冲销凭证的完整链路解析 本文深入解析SAP系统中MIGO 102冲销后MBSM查不到记录的原因,对比MBST与MIGO 102冲销机制的差异,揭示系统设计逻辑。提供通过采购订单历史、MB51查询及自定义报表等解决方案,并给出不同业务场景下的冲销方式选择指南,帮助用户避免常见操作误区。 阅读详情

惯例先描述业务场景:

        产品拿到公司业务需求如下,给领导展示几个现有的业务线场景的具体信息,且指定人可见.

        技术描述也就是用excel表格或者后台输入作为数据源,行字段灵活增加减少,且每一行控制可见人员的白名单信息.

技术思考:

        作为技术开发听到产品给的泛泛的描述后,觉得一个宽表+excel作为数据源同步就可以搞定,那么如果产品频繁的增加字段我们该如何快速满足,每个字段的处理规则我们要如何满足,只有支持好了这两点才能快速支撑业务,那么我们就不能用传统的一张表就搞定了

实现过程:

        本人java技术栈,仅用java分享过程

        1、首先我们定义业务模型,例如目标对象TargetGroup

        2、我们对目标对象的细节进行分析,也就属性以及属性所对应的业务关系:

                id、name、等等一系列字段

        3、定义数据源输入:

                数据源我们为了快速实现采用表格上传作为数据源

        4、表设计:

                

此处就不画关系了,object_field表最为对象模型的字段表,field_detail作为对象每个字段具体记录值表,通俗点理解关系就是我们把行表还为了列表存取kv+namespace的形式进行对业务数据的映射,以满足对数据模型的字段的灵活拓展,当然此处也有严重的缺点,就是我们做关联关系的时候一些必要的字段以及状态还是要存到主表的

此处的代码参考


    public void insertTargetField(TargetGroupExcelDto dto, String namespase) {
        ObjectField objectField = objectFieldMapper.findByNamespase(namespase);
        if (Objects.isNull(objectField)) {
            return;
        }
        List<String> fields = Arrays.asList(objectField.getObjectFields().split(","));
        //处理单个字段与字段的规则为一组动作
        Class<? extends TargetGroupExcelDto> aClass = dto.getClass();
        List<Field> dtoFields = Arrays.asList(aClass.getDeclaredFields());
        //删除之前的字段详情记录
        fieldDetailMapper.deleteByObjectId(dto.getTargetId());
        fields.stream().forEach(f -> {
            WhiteInfoDto whiteInfoDto = new WhiteInfoDto();
            whiteInfoDto.setTargetId(dto.getTargetId());
            whiteInfoDto.setObjectNamespace(namespase);
            Optional<Field> first = dtoFields.stream().filter(df -> df.getName().equals(f)).findFirst();
            if (first.isPresent()) {
                try {
                    Field field = first.get();
                    field.setAccessible(true);
                    String fValue = (String) field.get(dto);
                    whiteInfoDto.setFieldName(f);
                    whiteInfoDto.setFieldValue(fValue);
                    try {
                        Field wfield = aClass.getDeclaredField(f + "Whited");//开启白名单
                        wfield.setAccessible(true);
                        String wfieldValue = "否";
                        try {
                            wfieldValue = ((String) wfield.get(dto)).replaceAll(" ", "");
                        } catch (NullPointerException e) {

                        }

                        //此处为是否对全员可见在业务定义,不是是否开启白名单,擦了
                        whiteInfoDto.setStringWhited(StringUtils.isEmpty(wfieldValue) || wfieldValue.equals("否") ? false : true);
                    } catch (NoSuchFieldException e) {
                        log.warn("当前无白名单设置dto={},field={}", dto, f);
                    }
                    try {
                        Field ufield = aClass.getDeclaredField(f + "Users");//白名单
                        ufield.setAccessible(true);
                        String ufieldValue = "";
                        try {
                            ufieldValue = ((String) ufield.get(dto)).replaceAll(" ", "");
                        } catch (NullPointerException e) {
                        }
                        whiteInfoDto.setWhiteUsers(UserItcodeAnalysisUtil.getStringItcodes(ufieldValue));
                    } catch (NoSuchFieldException e) {
                        log.warn("当前无白名单人员dto={},field={}", dto, f);
                    }
                    //入库
                    saveFeild(whiteInfoDto);
                } catch (IllegalAccessException e) {
                    log.warn("获取字段异常e={}", e, first);
                }
            }
        });
    }


    private void saveFeild(WhiteInfoDto dto) {
        FieldDetail fd = new FieldDetail();
        String fieldDetailId = uidGenerator.getUID();
        fd.setId(fieldDetailId);
        //此处为事项id
        fd.setObjectId(dto.getTargetId());
        fd.setObjectNamespace(dto.getObjectNamespace());
        fd.setFieldName(dto.getFieldName());
        fd.setFieldType("String");//暂时写死后续有需要在迭代
        fd.setFieldValue(dto.getFieldValue());
        fd.setDeleted(false);
        fieldDetailMapper.insertSelective(fd);

        FieldWhiteItcode fw = new FieldWhiteItcode();
        fw.setFieldId(fieldDetailId);
        fw.setWhited(dto.getStringWhited());
        fw.setWhiteItcodes(dto.getWhiteUsers());
        fw.setDeleted(false);
        fieldWhiteItcodeMapper.insertSelective(fw);
    }

有遇到相同情况的可以找博主讨论哦,源码例子就不上传了,都是项目的,有空来个demo丢上来

 

分布式全局唯一ID 方案 (附参考角度) 分布式架构下,唯一序列号生成是我们在设计一个系统,尤其是数据库使用分库分表的时候常常会遇见的问题。当分成若干个sharding表后,如何能够快速拿到一个唯一序列号,是经常遇到的问题。 现目前市面上有很多的解决方案,那么我们应该怎么选择? 首先思考????你需要的全局唯一ID 需要具备什么特性?(根据需求来定,一般从这些方面考虑) 全局唯一 支持高并发 能够体现一定属性 高可靠,容错单点故障 高性能,每秒能生成数量 是否要求不可推算准确唯一ID(部门可推算+部分不可推算部分) 阅读详情

相关推荐

VL02N报错M7093深度解析:移动类型643与业务范围字段状态冲突的根源与修复

本文深度解析SAP系统中VL02N报错M7093的根源与修复方法,重点分析移动类型643与业务范围字段状态冲突问题。通过对比OMJJ和OBC4配置差异,提供两种实操解决方案,并给出预防性配置建议,帮助用户有效解决跨公司STO流程中的常见错误。

weixin_29230805的博客 318

工作流:业务模型及工作流

记录所有可用流程定义(与流程引擎解耦)

qzonemen 851

深耕业务 ---- 探索复杂/超复杂前端业务开发与设计

同步更新博客:    cnblogs: 深耕业务 ---- 探索复杂/超复杂前端业务开发与设计    知乎:深耕业务 ---- 探索复杂/超复杂前端业务开发与设计    github:深耕业务 ---- 探索复杂/超复杂前端业务开发与设计  距离上一篇博客,我已经有3个月没有写博客了,脑子里也有很多灵光和新点子,忙嘛,肯定忙,但是忙不是理由,所以见谅。这次给自己下了死命令,一定要产出点东西,...

zhong123893的博客 2837

业务设计(表、字段

1.业务设计 1.1.逻辑设计 1.1.1.范式设计 1.1.1.1.数据库设计的第一大范式 数据库表中的所有字段都只具有单一属性 单一属性的列是由基本数据类型所构成的 设计出来的表都是简单的二维表 name-age列具有两个属性,一个name,一个 age不符合第一范式,把它拆分成两列 1.1.1.2.数据库设...

weixin_30639719的博客 626

实体类加业务字段

  实体类加业务字段   在实际的web开发应用中,我们经常在返回DTO时,需要添加业务字段。但是因为这个实体类涉及的页面比较多,可能只在单个页面需要添加这个业务字段。   范例 pom坐标 &lt;dependency&gt; &lt;groupId&gt;com.alibaba&lt;/groupId&gt; &lt;artifactId&gt;fastjson&...

Joon_al_Principe的博客 1771

自定义字段解析:灵活管理利器,定制化管理轻松搞定

字段可以是文本输入、数值键入、单选、挑选、图片上传等不同类型,每种类型的字段都会有不同的特点设定。这意味着您现在可以将项目数据无缝整合到详尽的项目报表和仪表板中,从而为您提供实时的业务洞察和决策支持。项目管理工具引入自定义字段,可依据企业需求个性化定制字段,包括人员、描述、日期和数字等类型,实现关键信息的有效记录和管理。这不但代表着数字和图表的简易表明,也代表了对项目进度、团队绩效、资源开发和自我约束等关键方面的深入分析。添加其他重要日期,例如向客户发布产品的日期,或组织的活动的开始和结束日期。

dunniang的博客 431

通过智能一体化管理系统自定义表单和自定义字段设计

管理员或指定权限的用户成功登录后,进入【平台管理】 > 【字段选项管理】> 【系统字段列表】,在此界面管理、添加、删除等功能操作,此功能将可以改变界面上所显示的各个标签信息,请根据企业自身需求进行修改,创建的字段将不能修改,只可修改字段别名和其他附加信息,如下图: 管理页面 添加数据时,点击右上角图标,即可弹出添加页面,如下图: 新建页面          新建页

gdqczw的博客 3135

LarkXR 平台:玩转应用管理,实现灵活的访问权限控制与业务系统集成

LarkXR 平台是一个功能完备的 实时云渲染PaaS 平台,主要应用于数字孪生,教育仿真,元宇宙,数字人等众多场景,解决了大型三维图形应用互联网访问的难题。用户可以使用轻量化的终端设备(如手机平板、普通PC)通过浏览器访问云端运行的三维图形应用,并且可以实时的与应用进行交互,对用户而言应用就如同运行在本地一样。LarkXR 支持单节点多GPU、多节点多GPU部署, 通过“应用管理” 功能对三维图型应用进行集中管控自动分发,同时允许根据不同的使用场景灵活设置应用的访问权限。

dwj1979的博客 1172

解锁转转门店业务灵活性:如何利用MVEL引擎优化结算流程

主要介绍MVEL表达式引擎在转转门店结算业务中的使用,通过引入前后的对比,突出了在解决现有问题中的作用。

zhuanzhuantech的博客 980

业务发生重大变更时,如何优雅的调整数仓模型?

本文提出了一套完整的数仓模型调整框架,用于应对业务重大变更场景。该框架采用"业务语义解析-影响域评估-分层适配-验证落地"的流程,通过分层建模实现新业务需求与历史系统的平衡。以电商直播带货为例,详细阐述了ODS层数据接入、DWD层明细建模、DWS层主题聚合、ADS层应用落地的技术实现方案,并建立了完善的数据质量验证体系。框架强调"业务驱动、兼容历史、分层隔离、可扩展"四大原则,可跨行业复用,为业务变更下的数仓改造提供标准化解决方案

石榴姐yyds 158

编辑主权时代的灵活CMS设计:内容建模与动态字段实践

内容管理系统(CMS)的本质,是支撑内容生产、管理与分发的技术基座。其核心价值不在于功能堆砌,而在于能否匹配编辑真实工作流与内容生命周期的不确定性。灵活CMS的关键,在于将内容视为可拆解、可重组、带上下文流转的活体单元,而非静态字段容器。这要求系统具备动态字段配置能力、场景化内容建模、细粒度权限控制及所见即所得的多端协同体验。尤其在知识付费、媒体融合与品牌内容中台等场景中,‘编辑主权’正倒逼CMS从技术中心转向人本设计——让非技术人员也能安全、高效地定义结构、复用资产、响应变化。本文聚焦可落地的架构逻辑与实

weixin_34288121的博客 407

从.lic文件到业务解耦:构建灵活可控的软件授权体系

本文探讨了如何通过.lic文件实现软件授权体系的业务解耦,构建灵活可控的授权机制。通过功能层、菜单层和验证层的分离设计,结合非对称加密验证和动态授权策略,显著降低License变更频率并提升安全性。文章还提供了企业级授权方案选型建议和性能优化实践,帮助开发者构建高效的软件授权系统。

weixin_29597551的博客 252

mybatis直接操作mysql的json字段源码参考Java类型操作的最佳实践

mybatis直接操作mysql的json字段源码参考Java类型操作的最佳实践 去发现同类优质开源项目:https://gitcode.com/ 项目核心功能/场景 使用Java类型全程操作MySQL中的JSON字段,无需手动解析,实现自动化处理。 项目介绍 在现代的软件开发中,数据库操作与数据格式转换是两个重要环节。mybatis直接操作mysql的json字段源码参考项目提供了一个优雅的解...

gitblog_06756的博客 270

(一)从零到一:设计通用型埋点方案的实践与思考

埋点,顾名思义即是在业务代码逻辑中上报某一标识和该标识相关的数据,与业务流程解耦,用于监控或者数据分析。在现代软件开发中,埋点已成为优化用户体验、支持业务决策的关键工具。本文将从「业务需求初期设计埋点」到「后期重构」的角度,阐述如何设计通用型的埋点方案,希望能为读者提供实用的参考和避坑指南。

weixin_45322373的博客 2159

SAP Smartforms打印问题解决:货币和数量字段显示异常的终极指南

本文深入解析SAP Smartforms中货币和数量字段显示异常的常见问题,提供从数据结构定义到格式转换的完整解决方案。通过实战案例和优化技巧,帮助开发人员有效解决字段格式错位、符号缺失等问题,确保报表输出的精确性和美观度。

weixin_29280657的博客 233

【杂谈】SQL 杂录: 如何模糊查询表里不存在的字段

特殊业务 : 复合字段,查询表中原本没有,需要补齐的字段;聚合函数的使用

CoderSharry的博客 1132

业务管理的一站式项目系统

在全业务管理的项目管理系统中,数据的集中与共享是关键。无论是区级项目的快速响应与灵活调整,还是市级项目的规范流程与严格审核,亦或是国家级项目的高标准与严要求,系统都能通过简单的配置操作,快速适应并满足各类项目的特定需求。启服云项目管理系统为项目申报领域的全业务管理提供了解决方案,通过该系统的应用,用户可以轻松实现项目的精细化管理,为项目的成功申报奠定坚实基础。在复杂多变的项目申报领域,从区级项目到市级项目,再到国家级项目,每一个层级的项目都承载着不同的目标与期望,同时也伴随着繁琐的流程与严格的审核标准。

Technician757的博客 467
上一篇: 业务消息中心系统设计与实现(二)
下一篇: 手机云控设计思路
soulbboy
博客等级 码龄11年 30粉丝 25原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

soulbboy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值