Преглед изворни кода

预设职级日志记录接口

mac пре 2 година
родитељ
комит
e8363b5e83

+ 10 - 1
kxs-gateway/src/main/java/com/kxs/gateway/api/filter/RequestDecoderFilter.java

@@ -34,6 +34,8 @@ import java.net.URI;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
 
 
@@ -58,14 +60,21 @@ public class RequestDecoderFilter extends AbstractGatewayFilterFactory<Object> {
 	private static final String PAGE_NAME = "pageNum";
 	private static final String SIZE_NAME = "pageSize";
 
+	private static final List<String> FILE_TYPES = List.of("multipart/form-data");
 
 	@Override
 	public GatewayFilter apply(Object config) {
 		return (exchange, chain) -> {
 			ServerHttpRequest request = exchange.getRequest();
+
+			String contentType = Objects.requireNonNull(request.getHeaders().getContentType()).toString();
+
+			if (FILE_TYPES.stream().anyMatch(contentType::startsWith)) {
+				// 这是一个文件请求
+				return chain.filter(exchange);
+			}
 			// 请求方法
 			HttpMethod method = request.getMethod();
-
 			if (method == HttpMethod.GET) {
 				// 1 修改请求参数,并获取请求参数
 				return decryptGetRequestParam(exchange, chain);

+ 3 - 3
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/controller/admin/SysMachineDeductController.java

@@ -55,9 +55,9 @@ public class SysMachineDeductController {
      * @return 机具管理-循环机已扣款-导入
      */
     @PostMapping("/import")
-    @PreAuthorize("@pms.hasPermission('sys_machine_deduct_import')")
+//    @PreAuthorize("@pms.hasPermission('sys_machine_deduct_import')")
     public R importData(@RequestExcel List<MachineDeductExcelVo> machineDeductExcelVos, BindingResult bindingResult) {
-        return R.ok(kxsMachineDeductService.importData(machineDeductExcelVos, bindingResult));
+        return kxsMachineDeductService.importData(machineDeductExcelVos, bindingResult);
     }
 
 
@@ -68,7 +68,7 @@ public class SysMachineDeductController {
      * @return 机具管理-循环机已扣款-删除
      */
     @PostMapping("/remove")
-    @PreAuthorize("@pms.hasPermission('sys_machine_deduct_del')")
+//    @PreAuthorize("@pms.hasPermission('sys_machine_deduct_del')")
     public R remove(@RequestBody List<Integer> idsList) {
         return R.ok(kxsMachineDeductService.removeBatchByIds(idsList));
     }

+ 12 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/mapper/KxsMachineMapper.java

@@ -9,6 +9,9 @@ import com.kxs.product.api.vo.kxsapp.machine.*;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDateTime;
+import java.util.List;
+
 /**
  * 客小爽机具表(KxsMachine)表数据库访问层
  *
@@ -99,5 +102,14 @@ public interface KxsMachineMapper extends BaseMapper<KxsMachine> {
      * @return {@link IPage}<{@link StoreActMachineDayDetailVO}>
      */
     IPage<StoreActMachineDayDetailVO> activateMachineMonthTotalDetail(Page<StoreActMachineDayDetailVO> page, @Param("query") StoreActMachineDayDetailDTO param);
+
+    /**
+     * 查询循环过期机具,并且扣除没有添加已扣款的机器
+     *
+     * @param machineQuery 查询
+     * @param endDay
+     * @return {@link List}<{@link KxsMachine}>
+     */
+    List<KxsMachine> selectDeductList(@Param("query") KxsMachine machineQuery, @Param("endDay") LocalDateTime endDay);
 }
 

+ 4 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsMachineDeductServiceImpl.java

@@ -46,6 +46,10 @@ public class KxsMachineDeductServiceImpl extends ServiceImpl<KxsMachineDeductMap
             KxsMachineDeduct machineDeduct = new KxsMachineDeduct();
             BeanUtil.copyProperties(excel, machineDeduct);
 
+            Long count = baseMapper.selectCount(Wrappers.<KxsMachineDeduct>lambdaQuery().eq(KxsMachineDeduct::getPosSn, excel.getPosSn()));
+            if(count > 0){
+                errorMsg.add(excel.getPosSn() + "已存在,请重新上传!");
+            }
             //查询品牌
             KxsBrand brand = brands.stream().filter(b -> b.getName().equals(excel.getBrandName())).findFirst().orElse(null);
             // 数据不合法

+ 16 - 18
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsMachineServiceImpl.java

@@ -17,10 +17,7 @@ import com.kxs.product.api.model.*;
 import com.kxs.product.api.vo.kxsapp.machine.*;
 import com.kxs.common.core.constant.enums.MachineTypeEnum;
 import com.kxs.product.biz.constant.enums.ProductErrorTypeEnum;
-import com.kxs.product.biz.mapper.KxsBrandMapper;
-import com.kxs.product.biz.mapper.KxsMachineMapper;
-import com.kxs.product.biz.mapper.KxsMachineTrackMapper;
-import com.kxs.product.biz.mapper.KxsMachineTransferMapper;
+import com.kxs.product.biz.mapper.*;
 import com.kxs.product.biz.service.KxsMachineService;
 import com.kxs.store.api.feign.RemoteKxsStoreService;
 import com.kxs.user.api.feign.RemoteKxsUserService;
@@ -55,6 +52,8 @@ public class KxsMachineServiceImpl extends ServiceImpl<KxsMachineMapper, KxsMach
 
     private final KxsMachineTransferMapper kxsMachineTransferMapper;
 
+    private final KxsMachineDeductMapper kxsMachineDeductMapper;
+
     private final RemoteKxsUserService remoteKxsUserService;
 
     private final RemoteKxsStoreService remoteKxsStoreService;
@@ -237,7 +236,7 @@ public class KxsMachineServiceImpl extends ServiceImpl<KxsMachineMapper, KxsMach
     public List<ExpiredModalBrandVO> expiredModal() {
         Long userId = SecurityUtils.getUser().getId();
         // 开始时间
-        long stime = System.currentTimeMillis();
+//        long stime = System.currentTimeMillis();
 
         List<ExpiredModalBrandVO> result = new ArrayList<>();
         //查询用户已经申请了回收的机具
@@ -250,24 +249,23 @@ public class KxsMachineServiceImpl extends ServiceImpl<KxsMachineMapper, KxsMach
         //转map方便查询
         Map<Integer, KxsBrand> brandMap = brands.stream().collect(Collectors.toMap(KxsBrand::getId, Function.identity()));
 
-
         /*
             查询思路
             获取昨天的开始时间
             所有循环机 and 未绑定 and 循环结束时间小于于昨天的开始时间 and 用户ID
          */
         LocalDateTime startDay = LocalDate.now().plusDays(1).atStartOfDay();
+        //TODO 暂时取消30天内的限制
         LocalDateTime endDay = LocalDate.now().minusDays(29).atStartOfDay();
-        List<KxsMachine> machines = baseMapper.selectList(Wrappers.<KxsMachine>lambdaQuery()
-                .eq(KxsMachine::getUserId, userId)
-                .eq(KxsMachine::getMachineType, MachineTypeEnum.M_TYPE_RE.getType())
-                .eq(KxsMachine::getBindStatus, MachineTypeEnum.NO_BIND.getType())
-                .eq(KxsMachine::getStatus, MachineTypeEnum.STATUS_OUT.getType())
-                .lt(KxsMachine::getRecycleEndTime, startDay)
-                .gt(KxsMachine::getRecycleEndTime, endDay)
-        );
-        // 结束时间
-        long etime = System.currentTimeMillis();
+
+        KxsMachine machineQuery = new KxsMachine();
+        machineQuery.setUserId(userId.intValue());
+        machineQuery.setBindStatus(MachineTypeEnum.NO_BIND.getType());
+        machineQuery.setStatus(MachineTypeEnum.STATUS_OUT.getType());
+        machineQuery.setRecycleEndTime(startDay);
+        List<KxsMachine> machines = baseMapper.selectDeductList(machineQuery, endDay);
+
+
         //过滤已申请回收的机具
         machines = machines.stream().filter(machine -> !sns.contains(machine.getPosSn())).toList();
         //组装数据
@@ -294,8 +292,8 @@ public class KxsMachineServiceImpl extends ServiceImpl<KxsMachineMapper, KxsMach
         // 结束时间
         long etime1 = System.currentTimeMillis();
         // 计算执行时间
-        System.out.printf("执行时长:%d 毫秒.", (etime - stime));
-        System.out.printf("执行时长:%d 毫秒.", (etime1 - stime));
+//        System.out.printf("执行时长:%d 毫秒.", (etime - stime));
+//        System.out.printf("执行时长:%d 毫秒.", (etime1 - stime));
         return result;
     }
 

+ 66 - 52
kxs-product/kxs-product-biz/src/main/resources/mapper/KxsMachineMapper.xml

@@ -3,59 +3,59 @@
 <mapper namespace="com.kxs.product.biz.mapper.KxsMachineMapper">
 
     <resultMap type="com.kxs.product.api.model.KxsMachine" id="KxsMachineMap">
-        <result column="id" property="id" />
-        <result column="create_time" property="createTime" />
-        <result column="update_time" property="updateTime" />
-        <result column="del_flag" property="delFlag" />
-        <result column="version" property="version" />
-        <result column="pos_sn" property="posSn" />
-        <result column="warehouse_id" property="warehouseId" />
-        <result column="warehouse_name" property="warehouseName" />
-        <result column="user_id" property="userId" />
-        <result column="merchant_id" property="merchantId" />
-        <result column="brand_id" property="brandId" />
-        <result column="recycle_status" property="recycleStatus" />
-        <result column="recycle_end_time" property="recycleEndTime" />
-        <result column="machine_type" property="machineType" />
-        <result column="cash_pledge" property="cashPledge" />
-        <result column="source_pledge" property="sourcePledge" />
-        <result column="allot_path" property="allotPath" />
-        <result column="bind_time" property="bindTime" />
-        <result column="act_time" property="actTime" />
-        <result column="delivery_time" property="deliveryTime" />
-        <result column="box_sn" property="boxSn" />
-        <result column="machine_ratio" property="machineRatio" />
-        <result column="is_act" property="isAct" />
-        <result column="bind_status" property="bindStatus" />
-        <result column="status" property="status" />
-        <result column="is_first" property="isFirst" />
-        <result column="up_fee_flag" property="upFeeFlag" />
-        <result column="down_fee_flag" property="downFeeFlag" />
-        <result column="is_supply" property="isSupply" />
-        <result column="is_op_act" property="isOpAct" />
-        <result column="return_status" property="returnStatus" />
-        <result column="pre_user_id" property="preUserId" />
-        <result column="batch_no" property="batchNo" />
+        <result column="id" property="id"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="del_flag" property="delFlag"/>
+        <result column="version" property="version"/>
+        <result column="pos_sn" property="posSn"/>
+        <result column="warehouse_id" property="warehouseId"/>
+        <result column="warehouse_name" property="warehouseName"/>
+        <result column="user_id" property="userId"/>
+        <result column="merchant_id" property="merchantId"/>
+        <result column="brand_id" property="brandId"/>
+        <result column="recycle_status" property="recycleStatus"/>
+        <result column="recycle_end_time" property="recycleEndTime"/>
+        <result column="machine_type" property="machineType"/>
+        <result column="cash_pledge" property="cashPledge"/>
+        <result column="source_pledge" property="sourcePledge"/>
+        <result column="allot_path" property="allotPath"/>
+        <result column="bind_time" property="bindTime"/>
+        <result column="act_time" property="actTime"/>
+        <result column="delivery_time" property="deliveryTime"/>
+        <result column="box_sn" property="boxSn"/>
+        <result column="machine_ratio" property="machineRatio"/>
+        <result column="is_act" property="isAct"/>
+        <result column="bind_status" property="bindStatus"/>
+        <result column="status" property="status"/>
+        <result column="is_first" property="isFirst"/>
+        <result column="up_fee_flag" property="upFeeFlag"/>
+        <result column="down_fee_flag" property="downFeeFlag"/>
+        <result column="is_supply" property="isSupply"/>
+        <result column="is_op_act" property="isOpAct"/>
+        <result column="return_status" property="returnStatus"/>
+        <result column="pre_user_id" property="preUserId"/>
+        <result column="batch_no" property="batchNo"/>
 
     </resultMap>
     <select id="machineStoreList" resultType="com.kxs.product.api.vo.kxsapp.machine.MachineStoreListVO">
         select create_time, pos_sn from kxs_machine
-          <where>
-              and del_flag = 0
-              and status = 0
-              <if test="query.warehouseId != null">
-                  and warehouse_id = #{query.warehouseId}
-              </if>
-              <if test="query.brandId != null">
-                  and brand_id = #{query.brandId}
-              </if>
-              <if test="query.boxSn != null and query.boxSn != ''">
-                  and box_sn = #{query.boxSn}
-              </if>
-              <if test="query.posSn != null and query.posSn != ''">
-                  and pos_sn like concat('%', #{query.posSn}, '%')
-              </if>
-          </where>
+        <where>
+            and del_flag = 0
+            and status = 0
+            <if test="query.warehouseId != null">
+                and warehouse_id = #{query.warehouseId}
+            </if>
+            <if test="query.brandId != null">
+                and brand_id = #{query.brandId}
+            </if>
+            <if test="query.boxSn != null and query.boxSn != ''">
+                and box_sn = #{query.boxSn}
+            </if>
+            <if test="query.posSn != null and query.posSn != ''">
+                and pos_sn like concat('%', #{query.posSn}, '%')
+            </if>
+        </where>
 
     </select>
     <select id="recycleMachinesPage" resultType="com.kxs.product.api.vo.kxsapp.machine.RecycleMachinesVO">
@@ -102,7 +102,7 @@
     </select>
     <select id="getByPage" resultType="com.kxs.product.api.vo.kxsapp.machine.MachineUserListVO">
         select a.is_act, a.pos_sn, a.machine_type, a.cash_pledge, a.delivery_time, a.warehouse_name,
-               b.name as brand
+        b.name as brand
         from kxs_machine a
         left join kxs_brand b on a.brand_id = b.id
         <where>
@@ -138,7 +138,8 @@
         </if>
         order by recycle_end_time desc
     </select>
-    <select id="activateMachineMonthTotal" resultType="com.kxs.product.api.vo.kxsapp.machine.StoreActMachineMonthTotalVO">
+    <select id="activateMachineMonthTotal"
+            resultType="com.kxs.product.api.vo.kxsapp.machine.StoreActMachineMonthTotalVO">
         select * from
         (
         select count(id) as totalNumber, DATE_FORMAT(act_time,'%Y-%m') AS `month`
@@ -152,7 +153,8 @@
         ) as tmp
         ORDER BY `date` desc
     </select>
-    <select id="activateMachineMonthTotalDetail" resultType="com.kxs.product.api.vo.kxsapp.machine.StoreActMachineDayDetailVO">
+    <select id="activateMachineMonthTotalDetail"
+            resultType="com.kxs.product.api.vo.kxsapp.machine.StoreActMachineDayDetailVO">
         SELECT *
         FROM (
         SELECT count(id) as number, DATE_FORMAT(act_time,'%Y-%m-%d') AS `date`
@@ -169,5 +171,17 @@
         ) AS tmp
         ORDER BY `date` desc
     </select>
+    <select id="selectDeductList" resultMap="KxsMachineMap">
+        select a.id, a.user_id, a.pos_sn, a.brand_id, a.recycle_end_time
+        from kxs_machine a
+                 left join kxs_machine_deduct b on a.pos_sn = b.pos_sn
+        where
+          b.pos_sn is null
+          and a.del_flag = 0
+          and a.user_id = #{query.userId}
+          and a.status = #{query.status}
+          and a.bind_status = #{query.bindStatus}
+          and a.recycle_end_time &lt; #{query.recycleEndTime}
+    </select>
 
 </mapper>

+ 2 - 1
kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/vo/kxsapp/userLevel/LevelsVO.java

@@ -3,6 +3,7 @@ package com.kxs.user.api.vo.kxsapp.userLevel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.io.Serializable;
 import java.time.LocalDateTime;
 
 /**
@@ -13,7 +14,7 @@ import java.time.LocalDateTime;
  */
 @Data
 @Schema(description = "我的职级-职级详情返回实体")
-public class LevelsVO {
+public class LevelsVO implements Serializable {
 
     /**
      * 职级名称

+ 69 - 0
kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/vo/kxsapp/userPresetLevel/UserPresetLogVO.java

@@ -0,0 +1,69 @@
+package com.kxs.user.api.vo.kxsapp.userPresetLevel;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 预设记录
+ *
+ * @author 系统
+ * @since 2024-01-03 09:39:56
+ */
+@Data
+public class UserPresetLogVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    
+    
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 结束时间
+     */
+    @Schema(description = "结束时间")
+    private LocalDate endTime;
+
+
+    /**
+     * 预设等级
+     */
+    @Schema(description = "预设等级")
+    private Integer presetLevel;
+
+
+    /**
+     * 创客姓名
+     */
+    @Schema(description = "创客姓名")
+    private String username;
+
+    /**
+     * 创客头像
+     */
+    @Schema(description = "创客头像")
+    private String avatar;
+
+
+
+
+}
+

+ 51 - 0
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/controller/kxsapp/UserPresetLevelController.java

@@ -0,0 +1,51 @@
+package com.kxs.user.biz.controller.kxsapp;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kxs.common.core.util.R;
+import com.kxs.user.api.model.KxsUserAdvance;
+import com.kxs.user.api.vo.kxsapp.userPresetLevel.UserPresetLogVO;
+import com.kxs.user.biz.service.KxsUserEquityService;
+import com.kxs.user.biz.service.KxsUserPresetLogService;
+import com.kxs.user.biz.service.KxsUserService;
+import com.kxs.user.biz.service.TradeDaySummaryService;
+import lombok.RequiredArgsConstructor;
+import org.springdoc.core.annotations.ParameterObject;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 用户相关(UserLevel)控制层
+ *
+ * @author 系统
+ * @since 2024-02-26 17:19:48
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("userPresetLevel")
+public class UserPresetLevelController {
+
+    /**
+     * 服务对象
+     */
+    private final KxsUserPresetLogService kxsUserPresetLogService;
+
+
+
+    /**
+     * 预设职级-预设记录
+     *
+     * @return 预设职级-预设记录
+     */
+    @GetMapping("/list")
+    public R list(@ParameterObject Page<UserPresetLogVO> page, @RequestParam("keyword") String keyword) {
+        return R.ok(kxsUserPresetLogService.logList(page, keyword));
+    }
+
+
+
+
+
+}
+

+ 12 - 0
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/mapper/KxsUserPresetLogMapper.java

@@ -1,8 +1,11 @@
 package com.kxs.user.biz.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kxs.user.api.model.KxsUserPresetLog;
+import com.kxs.user.api.vo.kxsapp.userPresetLevel.UserPresetLogVO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 用户预设职级日志表(KxsUserPresetLog)表数据库访问层
@@ -13,5 +16,14 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface KxsUserPresetLogMapper extends BaseMapper<KxsUserPresetLog> {
 
+    /**
+     * 预设日志列表
+     *
+     * @param page    页
+     * @param userId  用户 ID
+     * @param keyword 关键词
+     * @return {@link Page}<{@link UserPresetLogVO}>
+     */
+    Page<UserPresetLogVO> logList(Page<UserPresetLogVO> page, @Param("userId") Long userId, @Param("keyword") String keyword);
 }
 

+ 11 - 0
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/KxsUserPresetLogService.java

@@ -1,7 +1,10 @@
 package com.kxs.user.biz.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.kxs.user.api.model.KxsUserPresetLog;
+import com.kxs.user.api.vo.kxsapp.userPresetLevel.UserPresetLogVO;
 
 /**
  * 用户预设职级日志表(KxsUserPresetLog)表服务接口
@@ -11,5 +14,13 @@ import com.kxs.user.api.model.KxsUserPresetLog;
  */
 public interface KxsUserPresetLogService extends IService<KxsUserPresetLog> {
 
+    /**
+     * 预设记录日志
+     *
+     * @param page    页
+     * @param keyword 关键词
+     * @return {@link Page}<{@link UserPresetLogVO}>
+     */
+    IPage<UserPresetLogVO> logList(Page<UserPresetLogVO> page, String keyword);
 }
 

+ 11 - 0
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/impl/KxsUserPresetLogServiceImpl.java

@@ -1,6 +1,10 @@
 package com.kxs.user.biz.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kxs.common.security.util.SecurityUtils;
+import com.kxs.user.api.vo.kxsapp.userPresetLevel.UserPresetLogVO;
 import com.kxs.user.biz.mapper.KxsUserPresetLogMapper;
 import com.kxs.user.api.model.KxsUserPresetLog;
 import com.kxs.user.biz.service.KxsUserPresetLogService;
@@ -15,5 +19,12 @@ import org.springframework.stereotype.Service;
 @Service("kxsUserPresetLogService")
 public class KxsUserPresetLogServiceImpl extends ServiceImpl<KxsUserPresetLogMapper, KxsUserPresetLog> implements KxsUserPresetLogService {
 
+    @Override
+    public IPage<UserPresetLogVO> logList(Page<UserPresetLogVO> page, String keyword) {
+
+        Long userId = SecurityUtils.getUser().getId();
+
+        return baseMapper.logList(page, userId, keyword);
+    }
 }
 

+ 9 - 0
kxs-user/kxs-user-biz/src/main/resources/mapper/KxsUserPresetLogMapper.xml

@@ -15,5 +15,14 @@
         <result column="create_by_id" property="createById" />
 
     </resultMap>
+    <select id="logList" resultType="com.kxs.user.api.vo.kxsapp.userPresetLevel.UserPresetLogVO">
+        select u.id, a.end_time, a.preset_level, u.username, u.avatar from kxs_user_preset_log a
+                 left join kxs_user u on u.id = a.user_id
+                 where a.user_id = #{userId}
+                 <if test="keyword != null and keyword != ''">
+                     and u.user_code = #{keyword}
+                 </if>
+                 order by a.end_time desc
+    </select>
 
 </mapper>