批量更新数据不同状态时 ,1.在更新前检测 2.更新后执行自己的逻辑

  今天在项目中做盘点管理,盘点单据有 编辑->提交->审批->撤销->退回->开盘->盘毕等状态。根据操作对盘点单据会不停的更新其状态。一般做法是根据这5.6种状态,编写5,6中ServiceImpl方法 分别去Update。若要是批量操作则会加上for循环,代码块冗余过多。自己便将Update抽离出来。抽离出来后,面临这一些问题。就是在有些状态更新操作时,需要做验证(如:退回只能操作审批状态。开盘只能操作审批状态)。这个时候就需要在update之前需要判断,看其当前状态是否满足条件。-------------------------------------------------------------批量更新数据不同状态时 ,1.在更新前检测  2.更新后执行自己的逻辑

此时利用断言型接口  Predicate<?> 处理【有点象JS中的callback】
/**
     * 提交盘点单
     */
    @Override
    public Result submitInventoryPlan(List<InvlctInventory> entitys) throws FrameExecuteException {
        return changeEntityStatus(entitys,InventoryStatus.SUBMIT,e->true,"提交成功!"); //若不需要在更新前进行检测  直接return  true;
    }

    /**
     * 功能:(编制中)撤销盘点单据
     * @param entitys 盘点单实体List
     */
    @Override
    public Result retreatInventoryPlan(List<InvlctInventory> entitys) throws FrameExecuteException {
        return changeEntityStatus(entitys,InventoryStatus.EDIT,e->InventoryStatus.SUBMIT.equals(e.getSts()),"撤销成功!");
    }

    /**
     * 功能:改变盘点单据状态
     * @param entitys 盘点单据实体LIst
     * @param status 要设置成的状态
     * @param trueMessage 操作成功后的提示消息
     * @return Result
     */
    private Result changeEntityStatus(List<InvlctInventory> entitys,InventoryStatus status,Predicate<InvlctInventory> pre,String trueMessage){
        List<InvlctInventory> list = new ArrayList<>();
        for (InvlctInventory invlctInventory : entitys) {
            InvlctInventory entity = get(invlctInventory.getCod());
            if(entity!=null){
                //检查是否满足 状态更新
                if(pre.test(entity)){//回调判断
                    entity.setSts(status);
                    entity.setEtim(new Date());
                    update(entity);
                }
            }else{
                list.add(invlctInventory);
            }
        }
        String message = null;
        if(list.isEmpty() || list.size()==0){
            message = trueMessage;
        }else{
            message = "部分数据不存在,请刷新!";
        }
        return new Result(true,message);
    }

原文地址:https://www.cnblogs.com/wang-yi/p/10025417.html

时间: 2024-10-10 10:35:10

批量更新数据不同状态时 ,1.在更新前检测 2.更新后执行自己的逻辑的相关文章

SqlServer 利用游标批量更新数据

原文:SqlServer 利用游标批量更新数据 SqlServer 利用游标批量更新数据 Intro# 游标在有时候会很有用,在更新一部分不多的数据时,可以很方便的更新数据,不需要再写一个小工具来做了,直接写 SQL 就可以了 Sample# 下面来看一个实际示例: Copy -- 声明字段变量 DECLARE @RegionCode INT; DECLARE @RegionName NVARCHAR(64); DECLARE @ProvinceId INT; -- 声明游标 DECLARE P

采用存储过程的方式批量更新数据

采用存储过程的方式批量更新数据,Oracle中也可采用merge-update的方式更新,不过采用如下存储过程的方式会更快些 DECLARE   MAX_ROWS            NUMBER DEFAULT 5000;   ROW_ID_TABLE        DBMS_SQL.UROWID_TABLE;   DATE_TIME_TABLE      DBMS_SQL.DATE_TABLE;   CURSOR C1 IS     SELECT /*+ use_hash(t1,t2) p

hibernate批量删除和更新数据

转载自:http://blog.csdn.net/yuhua3272004/article/details/2909538 Hibernate3.0 採用新的基于ANTLR的HQL/SQL查询翻译器,在Hibernate的配置文件里,hibernate.query.factory_class属性用来选择查询翻译器. (1)选择Hibernate3.0的查询翻译器: hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTrans

winform批量更新数据_长时间的执行会导致界面卡死

原文:winform批量更新数据_长时间的执行会导致界面卡死 前言:使用winform触发一个事件后执行的代码,如果耗时非常长,则会导致窗口界面假死!  本人最近通过winform窗体执行一项:需要批量更新一批数据库的数据的操作的任务时,由于数据量达到百万级别,非常耗时,只能慢慢更新,慢慢执行. 但是,在执行的过程遇到了一个奇葩的问题:窗体在调试状态下,代码可以慢慢循环执行,没出现异常.  但是我单独运行EXE程序时,就必现:程序假死,未响应状态. 后台百度虽然没有找到直接的答案,但是也发现了原

Neo4j 第五篇:批量更新数据

相比图形数据的查询,Neo4j更新图形数据的速度较慢,通常情况下,Neo4j更新数据的工作流程是:每次数据更新都会执行一次数据库连接,打开一个事务,在事务中更新数据.当数据量非常大时,这种做法非常耗时,大多数时间耗费在连接数据库和打开事务上,高效的做法是利用Neo4j提供的参数(Parameter)机制和UNWIND子句:在一次数据更新中,进行一次连接,打开一次事务,批量更新数据:参数用于提供列表格式的数据,UNWIND子句是把列表数据展开成一行一行的数据,每行数据都会执行结构相同的Cypher

ListView在编辑状态下不能获取修改后的值,无法更新数据

ListView在编辑状态下不能获取修改后的值,获取到的总是以前的值解决方法:在page_load事件里写: if(!IsPostBack) { ListViewBind(); } 原因:这涉及到aspx页各事件的执行顺序,因为如果没有判断IsPostBack,每次点更新时page_load都会去执行ListViewBind(),对ListView进行重新绑定,那你再去获取ListView里的值时当然就是以前的值了,这样写后ListView没有被重新绑定,里面的数据就还是以前的,所以就可以获取到

使用PHP生成器批量更新数据

使用PDO操作数据 生成器使用 随机暂停缓解数据库压力 批量更新数据 <?php header('Content-Type: text/html; charset=utf-8'); // 定义数据配置信息 $host = ''; $dbname = ''; $user = ''; $pass = ''; $prefix = ''; try { // 是否开启更新执行 define('DEBUG',true); // true 执行修改SQL false 反之, $testFor = 0; $te

mybatis学习之路----批量更新数据两种方法效率对比

原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方式有两种, 一种用for循环通过循环传过来的参数集合,循环出N条sql, 另一种 用mysql的case when 条件判断变相的进行批量更新 下面进行实现. 注意第一种方法要想成功,需要在db链接url后面带一个参数  &allowMultiQueries=true 即:  jdbc:mysql:

Sql语句批量更新数据(多表关联)

最近在项目中遇到一个问题,原来设计的功能是不需要一个特定的字段值depid的,但是新的功能需要根据depid来展现,于是出现了这样一个问题,新增加的数据都有正确的depid,而原来的大量的数据就没有depid或者说depid不是想要的,面临要批量更新原来数据depid的问题. 更新涉及到三个表base_cooperativeGroup,base_groupuser,base_user. 列出表结构: 1.base_cooperativeGroup 2.base_groupuser 3.base_