分页插件结合collection标签后分页数量不准确的问题

news2024/12/28 18:40:51

问题1:不使用collection 聚合分页正确
简单列子
T_ATOM_DICT表有

idname
1原子1
2原子2
3原子3
4原子4
5原子5
6原子6

T_ATOM_DICT_AUDIT_ROUTE表审核记录表有

idaudit
1拒绝
1通过
4拒绝

我要显示那些原子审核了,我把两个表inner join 就是那些原子审核过了

idnameaudit
1原子1拒绝
1原子1通过
4原子4拒绝

在这里插入图片描述
mapper

    IPage<AtomDict> findAllByAuditRouteNoDuplicate(@Param("criteria") AtomDictQueryCriteria criteria, Page<Object> page);

xml基础的查询类型和返回类型

<!--    分步要用-->
<resultMap id="BaseResultMap" type="com.njry.sjzl.busi.domain.AtomDict">
        <result column="ATOM_ID" property="atomId"/>
        <result column="ATOM_ID" property="id"/>
        <result column="CATEGORY_ID" property="categoryId"/>
        <result column="CATEGORY_NAME" property="categoryName"/>
        <result column="ATOM_NAME" property="atomName"/>
        <result column="TYPE" property="type"/>
        <result column="TYPE_NAME" property="typeName" />
        <result column="DATA_CYCLE" property="dataCycle"/>
        <result column="DATA_CYCLE_NAME" property="dataCycleName"/>
        <result column="LIB_TYPE" property="libType"/>
<!--        <result column="AUDIT_RESULT" property="auditResult"/>-->
<!--        <result column="AUDIT_REMARK" property="auditRemark"/>-->
        <result column="LIB_TYPE_NAME" property="libTypeName"/>
        <result column="DATA_GENE_MODE" property="dataGeneMode"/>
        <result column="DATA_GENE_MODE_NAME" property="dataGeneModeName"/>
        <result column="TEMPLATE_ID" property="templateId"/>
        <result column="TEMPLATE_NAME" property="templateName"/>
        <result column="DATABASE" property="database"/>
        <result column="DATABASE_NAME" property="databaseName"/>
        <result column="DATABASE_TABLE" property="databaseTable"/>
        <result column="COLUMN_NAME" property="columnName"/>
        <result column="TABLE_LEVEL" property="tableLevel"/>
        <result column="PROC_NAME" property="procName"/>
        <result column="IS_HZ" property="isHz"/>
        <result column="STATUS" property="status"/>
        <result column="ATOM_TABLE" property="atomTable"/>
        <result column="MODE_FLAG" property="modeFlag"/>
        <result column="CREATE_ID" property="createId"/>
        <result column="CREATE_DATE" property="createDate"/>
        <result column="REC_ID" property="recId"/>
        <result column="REC_DATE" property="recDate"/>
        <result column="SH_ID" property="shId"/>
        <result column="SH_DATE" property="shDate"/>
        <result column="SH_REMARK" property="shRemark"/>
        <result column="DEL_ID" property="delId"/>
        <result column="DEL_DATE" property="delDate"/>
        <result column="START_DATE" property="startDate"/>
        <result column="END_DATE" property="endDate"/>
        <result column="UNIT" property="unit"/>
        <result column="DIMEN_FLAG" property="dimenFlag"/>
    </resultMap>
    
 <resultMap id="BaseResultMapBoss" type="com.njry.sjzl.busi.domain.AtomDict">
        <result column="ATOM_ID" property="atomId"/>
        <result column="ATOM_ID" property="id"/>
        <result column="CATEGORY_ID" property="categoryId"/>
        <result column="CATEGORY_NAME" property="categoryName"/>
        <result column="ATOM_NAME" property="atomName"/>
        <result column="TYPE" property="type"/>
        <result column="TYPE_NAME" property="typeName" />
        <result column="DATA_CYCLE" property="dataCycle"/>
        <result column="DATA_CYCLE_NAME" property="dataCycleName"/>
        <result column="LIB_TYPE" property="libType"/>
        <result column="LIB_TYPE_NAME" property="libTypeName"/>
        <result column="DATA_GENE_MODE" property="dataGeneMode"/>
        <result column="DATA_GENE_MODE_NAME" property="dataGeneModeName"/>
        <result column="TEMPLATE_ID" property="templateId"/>
        <result column="TEMPLATE_NAME" property="templateName"/>
        <result column="DATABASE" property="database"/>
        <result column="DATABASE_NAME" property="databaseName"/>
        <result column="DATABASE_TABLE" property="databaseTable"/>
        <result column="COLUMN_NAME" property="columnName"/>
        <result column="TABLE_LEVEL" property="tableLevel"/>
        <result column="PROC_NAME" property="procName"/>
        <result column="IS_HZ" property="isHz"/>
        <result column="STATUS" property="status"/>
        <result column="ATOM_TABLE" property="atomTable"/>
        <result column="MODE_FLAG" property="modeFlag"/>
        <result column="CREATE_ID" property="createId"/>
        <result column="CREATE_DATE" property="createDate"/>
        <result column="REC_ID" property="recId"/>
        <result column="REC_DATE" property="recDate"/>
        <result column="SH_ID" property="shId"/>
        <result column="SH_DATE" property="shDate"/>
        <result column="SH_REMARK" property="shRemark"/>
        <result column="DEL_ID" property="delId"/>
        <result column="DEL_DATE" property="delDate"/>
        <result column="START_DATE" property="startDate"/>
        <result column="END_DATE" property="endDate"/>
        <result column="UNIT" property="unit"/>
        <result column="DIMEN_FLAG" property="dimenFlag"/>

    </resultMap>
<!--    <collection property="batchList" resultMap="BatchListResultMap"/>-->
<!--    审核表数据还得关联用户表显示用户名-->
    <resultMap id="BatchListResultMap" type="com.njry.sjzl.busi.domain.AtomDictAuditRoute">
        <result column="ROUTE_ID" property="routeId"/>
        <result column="ROUTE_ID" property="id"/>
        <result column="ATOM_IDREPEAT" property="atomId"/>
        <result column="AUDIT_RESULT" property="auditResult"/>
        <result column="AUDIT_REMARK" property="auditRemark"/>
        <result column="AUDIT_ID" property="auditId"/>
        <result column="AUDIT_NAME" property="auditName"/>
        <result column="AUDIT_DATE" property="auditDate"/>
    </resultMap>
    <sql id="BathList_Column_List">
            auditroute.ROUTE_ID as ROUTE_ID, auditroute.ATOM_ID as ATOM_IDREPEAT, tuser.NAME AS AUDIT_NAME,
         auditroute.AUDIT_RESULT as AUDIT_RESULT, auditroute.AUDIT_REMARK as AUDIT_REMARK,auditroute.AUDIT_ID as AUDIT_ID,auditroute.AUDIT_DATE as AUDIT_DATE
    </sql>
    <sql id="Base_Column_List">
        tad.ATOM_ID, tad.CATEGORY_ID, tad.ATOM_NAME, tad.TYPE, tad.DATA_CYCLE, tad.LIB_TYPE, tad.DATA_GENE_MODE, tad.TEMPLATE_ID, tad.DATABASE_TABLE, tad."DATABASE",tad.COLUMN_NAME, tad.TABLE_LEVEL, tad.PROC_NAME, tad.IS_HZ, tad.STATUS, tad.ATOM_TABLE, tad.MODE_FLAG, tad.CREATE_ID,tad.CREATE_DATE, tad.REC_ID, tad.REC_DATE, tad.SH_ID, tad.SH_DATE, tad.SH_REMARK, tad.DEL_ID, tad.DEL_DATE, tad.START_DATE, tad.END_DATE, tad.UNIT, tad.DIMEN_FLAG
    </sql>
<!--    数据字典回显名字-->
    <sql id="Dict_Detail_Column_List">
        dtable.label AS DATABASE_NAME,
        dtable1.label AS DATA_GENE_MODE_NAME,
        dtable2.label AS LIB_TYPE_NAME,
        dtable3.label AS DATA_CYCLE_NAME,
        dtable4.label AS TYPE_NAME
    </sql>

真正xml如下:关联很多表回显,T_ATOM_TEMPLATE模板表,T_ATOM_BUSI_CATEGORY业务分类,五个字典表,和(原子审核表,原子审核表要关联用户表差审核用户名)

    <select id="findAllByAuditRouteNoDuplicate" resultMap="BaseResultMapBoss">
        select tatempalte.TEMPLATE_NAME,tabc.CATEGORY_NAME AS CATEGORY_NAME,
        <include refid="Base_Column_List"/>,
        <include refid="Dict_Detail_Column_List"/>,
        <include refid="BathList_Column_List"/>
        from T_ATOM_DICT tad
        left join T_ATOM_TEMPLATE tatempalte on tatempalte.TEMPLATE_ID = tad.TEMPLATE_ID
        left join T_ATOM_BUSI_CATEGORY tabc on tad.CATEGORY_ID = tabc.category_id
        left join (select dd.label,dd.value from t_dict d left join t_dict_detail dd on  dd.dict_id = d.dict_id
        where d.name = 'asset_archive_name') dtable
        on tad.DATABASE = dtable.value
        left join (select dd1.label,dd1.value from t_dict d1 left join t_dict_detail dd1 on  dd1.dict_id = d1.dict_id
        where d1.name = 't_atmo_dict_generation_mechanism') dtable1
        on tad.DATA_GENE_MODE = dtable1.value
        left join (select dd2.label,dd2.value from t_dict d2 left join t_dict_detail dd2 on  dd2.dict_id = d2.dict_id
        where d2.name = 't_atmo_dict_atomic_library_type') dtable2
        on tad.LIB_TYPE = dtable2.value
        left join (select dd3.label,dd3.value from t_dict d3 left join t_dict_detail dd3 on  dd3.dict_id = d3.dict_id
        where d3.name = 't_atmo_dict_data_cycle') dtable3
        on tad.DATA_CYCLE = dtable3.value
        left join (select dd4.label,dd4.value from t_dict d4 left join t_dict_detail dd4 on  dd4.dict_id = d4.dict_id
        where d4.name = 't_atmo_dict_data_type') dtable4
        on tad.TYPE = dtable4.value
        inner join (select ATOM_ID,AUDIT_RESULT,AUDIT_REMARK,ROUTE_ID,AUDIT_ID,AUDIT_DATE
        from T_ATOM_DICT_AUDIT_ROUTE) auditroute on auditroute.ATOM_ID =tad.ATOM_ID
        left join t_user tuser on tuser.oper_id = auditroute.AUDIT_ID
        <where>
            <if test="criteria.atomId != null">
                and tad.ATOM_ID = #{criteria.atomId}
            </if>
            <if test="criteria.atomName != null">
                and tad.ATOM_NAME like concat('%'||#{criteria.atomName},'%')
            </if>
        </where>
        order by tad.CREATE_DATE desc, auditroute.AUDIT_DATE asc
    </select>

问题2:使用collection 聚合出现分页问题
xml基础的查询类型和返回类型 里面把注释的

方法返回类型 id = “BaseResultMapBoss” 里

在这里插入图片描述

解决办法1(我最蠢的解决办法,把sql分解)
不知道怎么自定义分页解决这种(不会),
我只能把这一个sql语句分开

在impl层

    @Override
    public PageResult<AtomDict> queryAllByAuditRouteDuplicate(AtomDictQueryCriteria criteria, Page<Object> page){

//        去重 inner join(原来一个sql就该搞定的)
//        IPage<AtomDict> all = atomDictMapper.findAllByAuditRouteNoDuplicate(criteria, page);
//        去重 inner join(分步1)
        IPage<AtomDict> all = atomDictMapper.findAllByAuditRouteNoDuplicateSubstep(criteria, page);

        List<AtomDict> records = all.getRecords();


//        根据每条数据类的busiSort递归向下查找归属业务分类(回显)
//        每条数据类还要找自己的审批过程(分步2)
        if(records.size() > 0 ){
            for (int i = 0; i < records.size(); i++) {
                AtomDict atomDict = records.get(i);
                if(atomDict != null){
                    Set<String> taskSetResult  = new LinkedHashSet<>();
                    Long categoryId = atomDict.getCategoryId();
//        			这里拿到第一步去重的审核原子再去查审核记录,放在返回前端的BatchList 里面
                    List<AtomDictAuditRoute> atomDictAuditRoutes = atomDictMapper.selectBath(atomDict.getAtomId());
                    atomDict.setBatchList(atomDictAuditRoutes);
                    if(categoryId != null){
                        List<String> subCategory = atomBusiCategoryMapper.findSubCategory(categoryId);
                        String currentCategoryName = atomBusiCategoryMapper.findCategoryNameByCateforyId(categoryId);
                        taskSetResult.addAll(subCategory);
                        taskSetResult.add(currentCategoryName);
                        String temp = "";
                        for(String item : taskSetResult){
                            temp += ","+item;
                        }
                        String result = temp.substring(1);
                        atomDict.setCategoryName(result);
                    }
                }
            }
        }
        return PageUtil.toPage(all);
    }

mapper

    IPage<AtomDict> findAllByAuditRouteNoDuplicateSubstep(@Param("criteria") AtomDictQueryCriteria criteria, Page<Object> page);



    List<AtomDictAuditRoute> selectBath(@Param("atomId") String atomId);

xml

<!--    关联审核表确定原子已经审核,因为原子审核触发,在原子表没有字段判断是否审核字段修改,才导致要关联审核记录表判断(关键还得去重):和原来区别就是不collection并且去重-->
    <select id="findAllByAuditRouteNoDuplicateSubstep" resultMap="BaseResultMap">
        select stupid.* from (
            select row_number() over(partition by tad.ATOM_ID order by tad.CREATE_DATE desc) rn,tatempalte.TEMPLATE_NAME,tabc.CATEGORY_NAME AS CATEGORY_NAME,
            <include refid="Base_Column_List"/>,
            <include refid="Dict_Detail_Column_List"/>
            from T_ATOM_DICT tad
            left join T_ATOM_TEMPLATE tatempalte on tatempalte.TEMPLATE_ID = tad.TEMPLATE_ID
            left join T_ATOM_BUSI_CATEGORY tabc on tad.CATEGORY_ID = tabc.category_id
            left join (select dd.label,dd.value from t_dict d left join t_dict_detail dd on  dd.dict_id = d.dict_id
            where d.name = 'asset_archive_name') dtable
            on tad.DATABASE = dtable.value
            left join (select dd1.label,dd1.value from t_dict d1 left join t_dict_detail dd1 on  dd1.dict_id = d1.dict_id
            where d1.name = 't_atmo_dict_generation_mechanism') dtable1
            on tad.DATA_GENE_MODE = dtable1.value
            left join (select dd2.label,dd2.value from t_dict d2 left join t_dict_detail dd2 on  dd2.dict_id = d2.dict_id
            where d2.name = 't_atmo_dict_atomic_library_type') dtable2
            on tad.LIB_TYPE = dtable2.value
            left join (select dd3.label,dd3.value from t_dict d3 left join t_dict_detail dd3 on  dd3.dict_id = d3.dict_id
            where d3.name = 't_atmo_dict_data_cycle') dtable3
            on tad.DATA_CYCLE = dtable3.value
            left join (select dd4.label,dd4.value from t_dict d4 left join t_dict_detail dd4 on  dd4.dict_id = d4.dict_id
            where d4.name = 't_atmo_dict_data_type') dtable4
            on tad.TYPE = dtable4.value
            inner join (select ATOM_ID,AUDIT_RESULT,AUDIT_REMARK,ROUTE_ID,AUDIT_ID,AUDIT_DATE
            from T_ATOM_DICT_AUDIT_ROUTE) auditroute on auditroute.ATOM_ID =tad.ATOM_ID
            left join t_user tuser on tuser.oper_id = auditroute.AUDIT_ID
            <where>
                <if test="criteria.atomId != null">
                    and tad.ATOM_ID = #{criteria.atomId}
                </if>
                <if test="criteria.atomName != null">
                    and tad.ATOM_NAME like concat('%'||#{criteria.atomName},'%')
                </if>
            </where>
        ) stupid
        where stupid.rn = 1
    </select>



    <select id="selectBath" resultMap="BatchListResultMap">
        select <include refid="BathList_Column_List"/>
        from (select ATOM_ID,AUDIT_RESULT,AUDIT_REMARK,ROUTE_ID,AUDIT_ID,AUDIT_DATE
        from T_ATOM_DICT_AUDIT_ROUTE) auditroute
        left join t_user tuser on tuser.oper_id = auditroute.AUDIT_ID
        where auditroute.ATOM_ID = #{atomId}
    </select>

解决方法2(设计表时候应该加一个冗余字段)
我仔细想了一下,都是因为T_ATOM_DICT这个原子表缺少一个是否审核字段,(只要触发审核,就修改这个原子是否审核的状态)如果加这个字段就可以直接用collection收集这个原子的审批记录

解决方法3就是我不会的那种,求路过大神指教

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1840322.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对角线法则的由来

目录 一、前言 二、对角线法则 三、行列式的定义 1. 行列式的定义 2. (全)排列 3. 逆序数 四、由全排列逆序数 到 对角线法则规律 ​编辑 五、参考书目 一、前言 仅限于个人理解&#xff0c;对错没有查证。 二、对角线法则 提起对角线法则&#xff0c;我们更倾向于他是…

5.音视频基础 FLV

目录 简说FLV FLV Header FLV Body Tag Header ​编辑Tag Data Audio Data Video Data Script Data 简说FLV FLV格式可以包含音频、视频和文本数据&#xff0c;并且可以在网络上进行流媒体传输。优点是文件大小较小&#xff0c;压缩效率高&#xff0c;并且可以在较低…

RestClient操作索引库和文档

导入依赖&#xff1a; <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version></dependency>导入依赖成功之后就可以开始我们的测…

Java特性之设计模式【访问者模式】

一、访问者模式 概述 在访问者模式&#xff08;Visitor Pattern&#xff09;中&#xff0c;我们使用了一个访问者类&#xff0c;它改变了元素类的执行算法。通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式&…

栅格地图、障碍物地图与膨胀地图(膨胀地图(二)写一张膨胀地图)

前面看完了膨胀地图相关的内容&#xff0c;这里根据前面看过的内容手搓一张膨胀地图试一下。 1、数据预处理 第一步,先进行数据预处理&#xff0c;为了后续计算方便&#xff0c;首先在这里预先计算两张二维数组表&#xff0c;后续遍历时会用到这张表&#xff1a; void map_t…

UniAudio 1.5:大型语言模型(LLMs)驱动的音频编解码器

大型语言模型&#xff08;LLMs&#xff09;在文本理解和生成方面展示了卓越的能力&#xff0c;但它们不能直接应用于跨模态任务&#xff0c;除非进行微调。本文提出了一种跨模态上下文学习方法&#xff0c;使未进行进一步训练的LLMs能够在少量示例的情况下&#xff0c;无需任何…

stack=s+stack#TypeError: can only concatenate str (not “list“) to str

PYTHON的神奇操作 stack[1,2] s"ddd" # stacksstack#TypeError: can only concatenate str (not "list") to str stacks print(stack)#[1, 2, d, d, d] stack[1,2] s"ddd" stacksstack # 这里会报错&#xff0c;因为不能直接将字符串和列表相加…

强大的多数据库客户端工具:DataGrip【送源码】

今天给大家带来的工具是&#xff1a;DataGrip 介绍 DataGrip是jetbrains开发的一款关系数据库和 NoSQL 数据库的多数据库客户端工具&#xff0c;可以30天免费试用&#xff0c;后续使用需要购买。 DataGrip还是一款强大的跨平台工具&#xff0c;支持多种操作系统&#xff0c;比…

创建线程

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 由于线程是操作系统直接支持的执行单元&#xff0c;因此&#xff0c;高级语言&#xff08;如Python、Java等&#xff09;通常都内置多线程的支持。Py…

京东h5st4.73

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; lianxi a15018601872 …

只有你相信,客户才会相信

我们外贸人在一起聊天的时候&#xff0c;可能最常说的话就是我们的产品不好做&#xff0c;出单太难了&#xff0c;是不是产品不行啊&#xff1f;但是又不知道什么产品好做&#xff0c;好不容易听到一款产品好做吧&#xff1f;自己又不懂&#xff0c;摸索不出来&#xff0c;因此…

洛谷 P1726:上白泽慧音 ← Tarjan算法

【题目来源】https://www.luogu.com.cn/problem/P1726【题目描述】 在幻想乡&#xff0c;上白泽慧音是以知识渊博闻名的老师。春雪异变导致人间之里的很多道路都被大雪堵塞&#xff0c;使有的学生不能顺利地到达慧音所在的村庄。因此慧音决定换一个能够聚集最多人数的村庄作为新…

李宏毅2023机器学习作业HW06解析和代码分享

ML2023Spring - HW6 相关信息&#xff1a; 课程主页 课程视频 Sample code HW06 视频 HW06 PDF 个人完整代码分享: GitHub | Gitee | GitCode P.S. HW06 是在 Judgeboi 上提交的&#xff0c;出于学习目的这里会自定义两个度量的函数&#xff0c;不用深究&#xff0c;遵循 Sugge…

JS正则表达式构造函数和正则表达式字面量的区别

背景 笔者在使用正则表达式的过程中&#xff0c;经常看到两种使用方式&#xff0c;比较好奇这两种方式有什么不同。 一种是 正则表达式构造函数&#xff1a;new RegExp(“[xxx]”) 另一种是 正则表达式字面量&#xff1a; /[xxx]/ 于是&#xff0c;就去网上搜了一下…结果看到国…

【H5全行业数据大屏展示】—— 数据大屏分享

数据大屏展示是一种将大量数据以可视化形式展示在屏幕上的方式&#xff0c;可以帮助人们更直观地理解和分析数据。在各行各业中&#xff0c;数据大屏展示已经成为一种流行的工具&#xff0c;被广泛应用于数据分析、决策支持和业务监控等方面。在本文中&#xff0c;将分享一些数…

“论数据访问层设计技术及其应用”写作框架,系统架构设计师

论文真题 在信息系统的开发与建设中&#xff0c;分层设计是一种常见的架构设计方法&#xff0c;区分层次的目的是为了实现“高内聚低耦合”的思想。分层设计能有效简化系统复杂性&#xff0c;使设计结构清晰&#xff0c;便于提高复用能力和产品维护能力。一种常见的层次划分模…

文件系统实验(操作系统)

文件系统实验 【预备知识】 1.文件系统的文件类型 为了便于用户利用终端进行输入和输出&#xff0c;UNIX系统做了专门安排。UNIX系统自动为用户打开3个文件&#xff1a;标准输入、标准输出和标准错误输出文件&#xff0c;文件描述符分别为0、1、2&#xff0c;缺省时&#xff0c…

分班查询,一键发布,老师们都在用的分班查询系统

老师们开学季马上又要到了&#xff0c;回想起了每年埋头苦干&#xff0c;对着一堆堆的学生名单&#xff0c;一个个手动分配班级&#xff0c;再一个个通知家长和学生的日子&#xff0c;那种手忙脚乱&#xff0c;生怕出错的紧张感&#xff0c;是不是还历历在目&#xff1f;每次分…

Instagram Reels API接口——高效获取用户主页Reels视频

一、引言 Instagram作为全球知名的社交媒体平台&#xff0c;近年来推出的Reels功能受到了广大用户的热烈欢迎。Reels以短视频的形式&#xff0c;让用户能够轻松创作和分享有趣、有创意的内容。为了帮助开发者、品牌和分析师更好地利用这一功能&#xff0c;我们推出了一款专注于…

从视频创意到传播策略 | 医药产品TVC新媒体传播方案

作为营销策划人&#xff0c;你一定在寻找能够激发创意灵感、拓展策划视野的实战案例。这份最新传播方案由Unithought精心打造&#xff0c;不仅是一份详尽的策划指南&#xff0c;更是一次深入患者心灵的品牌传播实践。 何策网&#xff0c;每日收录全网方案PPT &#xff01; 方…