xuhy
2025-02-12 f840a3996696d556d4623b282ab2a335f9cf023d
动态中心,报修
18个文件已修改
4个文件已添加
300 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TFaultRepairMessageController.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TInformationController.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/TFaultRepairMessageDTO.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TFaultAreaDicMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TItemTypeMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TFaultRepairMessage.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TInformation.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TFaultAreaDicService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TItemTypeService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TFaultAreaDicServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TInformationServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TItemTypeServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/FaultConcatInfoVO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/TFaultAreaDicVO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/TItemTypeVO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TFaultAreaDicMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TFaultRepairMessageMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TItemTypeMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
@@ -172,6 +172,15 @@
        contractService.updateById(contract);
        return R.ok();
    }
    @Log(title = "合同管理-确认结算", businessType =  BusinessType.UPDATE)
    @ApiOperation(value = "确认结算")
    @PostMapping(value = "/confirmSettlement")
    public R<Boolean> confirmSettlement(String id) {
        TContract contract = contractService.getById(id);
        contract.setStatus("8");
        contractService.updateById(contract);
        return R.ok();
    }
    @ApiOperation(value = "终止合同剩余未缴费账单列表")
    @PostMapping(value = "/contractBillList")
    public R<PageInfo<BillVO>> contractBillList(@RequestBody TContractBillQuery query) {
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TFaultRepairMessageController.java
@@ -1,9 +1,26 @@
package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.dto.TFaultRepairMessageDTO;
import com.ruoyi.system.model.*;
import com.ruoyi.system.service.*;
import com.ruoyi.system.vo.TFaultAreaDicVO;
import com.ruoyi.system.vo.TItemTypeVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
@@ -13,9 +30,94 @@
 * @author xiaochen
 * @since 2025-01-17
 */
@Api(tags = "报修管理")
@RestController
@RequestMapping("/t-fault-repair-message")
public class TFaultRepairMessageController {
    private final TFaultRepairMessageService tFaultRepairMessageService;
    private final TItemService itemService;
    private final TItemTypeService itemTypeService;
    private final TFaultAreaDicService faultAreaDicService;
    private final TFaultDescribeDicService faultDescribeDicService;
    private final TokenService tokenService;
    private final TContractService contractService;
    private final THouseService houseService;
    @Autowired
    public TFaultRepairMessageController(TFaultRepairMessageService tFaultRepairMessageService, TItemService itemService, TItemTypeService itemTypeService, TFaultAreaDicService faultAreaDicService, TFaultDescribeDicService faultDescribeDicService, TokenService tokenService, TContractService contractService, THouseService houseService) {
        this.tFaultRepairMessageService = tFaultRepairMessageService;
        this.itemService = itemService;
        this.itemTypeService = itemTypeService;
        this.faultAreaDicService = faultAreaDicService;
        this.faultDescribeDicService = faultDescribeDicService;
        this.tokenService = tokenService;
        this.contractService = contractService;
        this.houseService = houseService;
    }
    /**
     * 获取维修物品二级结构
     */
    @ApiOperation(value = "获取维修物品二级结构")
    @PostMapping(value = "/getItemList")
    public R<List<TItemTypeVO>> getItemList() {
        List<TItemTypeVO> itemTypes = itemTypeService.getItemList();
        List<TItem> items = itemService.list();
        itemTypes.forEach(itemType -> {
            itemType.setItemList(items.stream().filter(item -> itemType.getId().equals(item.getTypeId())).collect(Collectors.toList()));
        });
        return R.ok(itemTypes);
    }
    /**
     * 获取故障区域列表
     */
    @ApiOperation(value = "获取故障区域二级结构")
    @PostMapping(value = "/getAreaDicList")
    public R<List<TFaultAreaDicVO>> getAreaDicList() {
        List<TFaultAreaDicVO> faultAreaDicVOS = faultAreaDicService.getAreaDicList();
        List<TFaultDescribeDic> faultDescribeDicList = faultDescribeDicService.list();
        faultAreaDicVOS.forEach(areaDicVO -> {
            areaDicVO.setFaultDescribeDicList(faultDescribeDicList.stream().filter(item -> areaDicVO.getId().equals(item.getFaultId())).collect(Collectors.toList()));
        });
        return R.ok(faultAreaDicVOS);
    }
    /**
     * 通过当前租户查询合同房源信息
     */
    @ApiOperation(value = "通过当前租户查询合同房源信息")
    @PostMapping(value = "/getConcatByTenantId")
    public R<List<TContract>> getConcatByTenantId() {
//        Long userId = tokenService.getLoginUser().getUserId();
        String tenantId = "1881967035070177281";
        // 查询合同信息
        List<TContract> list = contractService.list(Wrappers.lambdaQuery(TContract.class)
                .eq(TContract::getTenantId, tenantId)
                .eq(TContract::getStatus, 4));
        if(CollectionUtils.isEmpty(list)){
            return R.ok(list);
        }
        List<String> houseIds = list.stream().map(TContract::getHouseId).collect(Collectors.toList());
        List<THouse> houseList = houseService.list(Wrappers.lambdaQuery(THouse.class)
                .in(THouse::getId, houseIds));
        list.forEach(item -> {
            item.setHouseName(houseList.stream().filter(house -> house.getId().equals(item.getHouseId())).findFirst().orElse(new THouse()).getHouseName());
        });
        return R.ok(list);
    }
    /**
     * 添加报修信息
     */
    @ApiOperation(value = "添加报修信息")
    @PostMapping(value = "/addFault")
    public R<String> addFault(@RequestBody TFaultRepairMessageDTO dto) {
        tFaultRepairMessageService.save(dto);
        return R.ok();
    }
}
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TInformationController.java
@@ -2,19 +2,16 @@
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.system.model.TInformation;
import com.ruoyi.system.query.TInformationQuery;
import com.ruoyi.system.service.TInformationService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
/**
 * <p>
@@ -30,9 +27,11 @@
public class TInformationController {
    private final TInformationService informationService;
    private final RedisCache redisCache;
    @Autowired
    public TInformationController(TInformationService informationService) {
    public TInformationController(TInformationService informationService, RedisCache redisCache) {
        this.informationService = informationService;
        this.redisCache = redisCache;
    }
    /**
@@ -44,5 +43,16 @@
        return R.ok(informationService.pageList(query));
    }
    /**
     * 获取资讯管理详情
     */
    @ApiOperation(value = "获取资讯管理详情")
    @GetMapping(value = "/getDetailById")
    public R<TInformation> getDetailById(@RequestParam String id) {
        // 处理查看次数
        redisCache.increment(Constants.INFORMATION_VIEW + id);
        return R.ok(informationService.getById(id));
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
@@ -128,6 +128,10 @@
     * LDAPS 远程方法调用
     */
    public static final String LOOKUP_LDAPS = "ldaps:";
    /**
     * LDAPS 远程方法调用
     */
    public static final String INFORMATION_VIEW = "information_view:";
    /**
     * 自动识别json对象白名单配置(仅允许解析的包名,范围越小越安全)
ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
@@ -330,4 +330,14 @@
        Long result = (Long) redisTemplate.execute(UNLOCK_SCRIPT, Collections.singletonList(lockKeyWithPrefix), requestId);
        return result != null && result == 1L;
    }
    /**
     * 自增
     * @param key 要加一的键
     */
    public int increment(String key) {
        // +1 操作
        return redisTemplate.opsForValue().increment(key).intValue();
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/TFaultRepairMessageDTO.java
New file
@@ -0,0 +1,10 @@
package com.ruoyi.system.dto;
import com.ruoyi.system.model.TFaultRepairMessage;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@Data
@ApiModel(value = "报修dto")
public class TFaultRepairMessageDTO extends TFaultRepairMessage {
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TFaultAreaDicMapper.java
@@ -4,6 +4,7 @@
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.model.TFaultAreaDic;
import com.ruoyi.system.query.TFaultAreaDicQuery;
import com.ruoyi.system.vo.TFaultAreaDicVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -28,4 +29,9 @@
     */
    List<TFaultAreaDic> pageList(@Param("query")TFaultAreaDicQuery query, @Param("pageInfo")PageInfo<TFaultAreaDic> pageInfo);
    /**
     * 查询列表
     * @return
     */
    List<TFaultAreaDicVO> getAreaDicList();
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TItemTypeMapper.java
@@ -4,6 +4,7 @@
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.model.TItemType;
import com.ruoyi.system.query.TItemTypeQuery;
import com.ruoyi.system.vo.TItemTypeVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -25,4 +26,8 @@
     * @return
     */
    List<TItemType> pageList(@Param("query") TItemTypeQuery query, @Param("pageInfo")PageInfo<TItemType> pageInfo);
    List<TItemTypeVO> getItemList();
}
ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java
@@ -133,6 +133,16 @@
    @TableField("remark")
    private String remark;
    /**
     * 1    待提交
     * 2    待审批
     * 3    未签订
     * 4    已签订
     * 5    已驳回
     * 6    已终止
     * 7    待结算
     * 8    已结算
     */
    @ApiModelProperty(value = "状态 待提交 待审批 未签订 已签订....")
    @TableField("status")
    private String status;
@@ -151,5 +161,8 @@
    @ApiModelProperty(value = "合计年租金")
    @TableField("total_year")
    private BigDecimal totalYear;
    @ApiModelProperty(value = "房屋名称")
    @TableField(exist = false)
    private String houseName;
}
ruoyi-system/src/main/java/com/ruoyi/system/model/TFaultRepairMessage.java
@@ -34,13 +34,17 @@
    private String id;
    @ApiModelProperty(value = "用户id")
    @TableField("app_user_id")
    private String appUserId;
    @TableField("tenant_id")
    private String tenantId;
    @ApiModelProperty(value = "物品id")
    @TableField("item_id")
    private String itemId;
    @ApiModelProperty(value = "合同id")
    @TableField("contract_id")
    private String contractId;
    @ApiModelProperty(value = "故障区域")
    @TableField("fault_area_name")
    private String faultAreaName;
ruoyi-system/src/main/java/com/ruoyi/system/model/TInformation.java
@@ -67,4 +67,8 @@
    @TableField("attachment_name")
    private String attachmentName;
    @ApiModelProperty(value = "查看次数")
    @TableField(exist = false)
    private Integer viewCount;
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TFaultAreaDicService.java
@@ -4,6 +4,9 @@
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.model.TFaultAreaDic;
import com.ruoyi.system.query.TFaultAreaDicQuery;
import com.ruoyi.system.vo.TFaultAreaDicVO;
import java.util.List;
/**
 * <p>
@@ -28,4 +31,7 @@
     * @return
     */
    boolean isExit(TFaultAreaDic dto);
    List<TFaultAreaDicVO> getAreaDicList();
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TItemTypeService.java
@@ -4,6 +4,9 @@
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.model.TItemType;
import com.ruoyi.system.query.TItemTypeQuery;
import com.ruoyi.system.vo.TItemTypeVO;
import java.util.List;
/**
 * <p>
@@ -28,4 +31,6 @@
     * @return
     */
    PageInfo<TItemType> pageList(TItemTypeQuery query);
    List<TItemTypeVO> getItemList();
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TFaultAreaDicServiceImpl.java
@@ -11,6 +11,7 @@
import com.ruoyi.system.query.TFaultAreaDicQuery;
import com.ruoyi.system.service.TFaultAreaDicService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.system.vo.TFaultAreaDicVO;
import com.ruoyi.system.vo.TenantVO;
import org.springframework.stereotype.Service;
@@ -45,4 +46,9 @@
            return this.count(Wrappers.lambdaQuery(TFaultAreaDic.class).eq(TFaultAreaDic::getFaultAreaName, dto.getFaultAreaName())) > 0;
        }
    }
    @Override
    public List<TFaultAreaDicVO> getAreaDicList() {
        return this.baseMapper.getAreaDicList();
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TInformationServiceImpl.java
@@ -1,12 +1,15 @@
package com.ruoyi.system.service.impl;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.system.mapper.TInformationMapper;
import com.ruoyi.system.model.TInformation;
import com.ruoyi.system.query.TInformationQuery;
import com.ruoyi.system.service.TInformationService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.system.vo.HouseVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -22,10 +25,16 @@
@Service
public class TInformationServiceImpl extends ServiceImpl<TInformationMapper, TInformation> implements TInformationService {
    @Autowired
    private RedisCache redisCache;
    @Override
    public PageInfo<TInformation> pageList(TInformationQuery query) {
        PageInfo<TInformation> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<TInformation> list = this.baseMapper.pageList(query,pageInfo);
        list.forEach(item -> {
            item.setViewCount(redisCache.getCacheObject(Constants.INFORMATION_VIEW + item.getId()));
        });
        pageInfo.setRecords(list);
        return pageInfo;
    }
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TItemTypeServiceImpl.java
@@ -10,6 +10,7 @@
import com.ruoyi.system.query.TItemTypeQuery;
import com.ruoyi.system.service.TItemTypeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.system.vo.TItemTypeVO;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -43,4 +44,9 @@
        pageInfo.setRecords(list);
        return pageInfo;
    }
    @Override
    public List<TItemTypeVO> getItemList() {
        return this.baseMapper.getItemList();
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/FaultConcatInfoVO.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.system.vo;
import com.ruoyi.system.model.TContract;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(value = "报修房源信息VO")
public class FaultConcatInfoVO extends TContract {
    @ApiModelProperty(value = "房屋名称")
    private String houseName;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/TFaultAreaDicVO.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.system.vo;
import com.ruoyi.system.model.TFaultAreaDic;
import com.ruoyi.system.model.TFaultDescribeDic;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "故障区域vo")
public class TFaultAreaDicVO extends TFaultAreaDic {
    @ApiModelProperty(value = "故障描述")
    private List<TFaultDescribeDic> faultDescribeDicList;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/TItemTypeVO.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.system.vo;
import com.ruoyi.system.model.TItem;
import com.ruoyi.system.model.TItemType;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "物品类型VO")
public class TItemTypeVO extends TItemType {
    @ApiModelProperty(value = "维修物品集合")
    private List<TItem> itemList;
}
ruoyi-system/src/main/resources/mapper/system/TFaultAreaDicMapper.xml
@@ -24,5 +24,11 @@
        WHERE disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        ORDER BY sort_by,create_time DESC
    </select>
    <select id="getAreaDicList" resultType="com.ruoyi.system.vo.TFaultAreaDicVO">
        SELECT <include refid="Base_Column_List"></include>
        FROM t_fault_area_dic
        WHERE disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        ORDER BY sort_by,create_time DESC
    </select>
</mapper>
ruoyi-system/src/main/resources/mapper/system/TFaultRepairMessageMapper.xml
@@ -5,8 +5,9 @@
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.system.model.TFaultRepairMessage">
        <id column="id" property="id" />
        <result column="app_user_id" property="appUserId" />
        <result column="tenant_id" property="tenantId" />
        <result column="item_id" property="itemId" />
        <result column="contract_id" property="contractId" />
        <result column="fault_area_name" property="faultAreaName" />
        <result column="describe_name" property="describeName" />
        <result column="describe_detail" property="describeDetail" />
@@ -18,7 +19,7 @@
        <result column="leave_message" property="leaveMessage" />
        <result column="handle_person" property="handlePerson" />
        <result column="handle_time" property="handleTime" />
        <result column="reault_describe" property="reaultDescribe" />
        <result column="result_describe" property="resultDescribe" />
        <result column="repair_picture" property="repairPicture" />
        <result column="attachment" property="attachment" />
        <result column="status" property="status" />
@@ -31,7 +32,7 @@
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, app_user_id, item_id, fault_area_name, describe_name, describe_detail, fault_pictures, service_address, repair_type, visit_time, contact_number, leave_message, handle_person, handle_time, reault_describe, repair_picture, attachment, status, create_time, update_time, create_by, update_by, disabled
        id, tenant_id, item_id,contract_id, fault_area_name, describe_name, describe_detail, fault_pictures, service_address, repair_type, visit_time, contact_number, leave_message, handle_person, handle_time, result_describe, repair_picture, attachment, status, create_time, update_time, create_by, update_by, disabled
    </sql>
</mapper>
ruoyi-system/src/main/resources/mapper/system/TItemTypeMapper.xml
@@ -25,5 +25,12 @@
        where disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        ORDER BY sort_by,create_time DESC
    </select>
    <select id="getItemList" resultType="com.ruoyi.system.vo.TItemTypeVO">
        select
        <include refid="Base_Column_List"/>
        from t_item_type
        where disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        ORDER BY sort_by,create_time DESC
    </select>
</mapper>