소스 검색

设备信息、导入导出、导入模板下载等

bing 1 년 전
부모
커밋
be7cf7b028

+ 32 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/YesNoEnum.java

@@ -0,0 +1,32 @@
+package org.dromara.common.core.enums;
+
+public enum YesNoEnum {
+    YES("1", "是"),
+    NO("0", "否");
+
+    private final String code;
+
+    private final String text;
+
+    YesNoEnum(String code, String text) {
+        this.code = code;
+        this.text = text;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public static String getText(String code) {
+        for (YesNoEnum value : values()) {
+            if (value.getCode().equals(code)) {
+                return value.getText();
+            }
+        }
+        return null;
+    }
+}

+ 164 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/listener/XfTermImportListener.java

@@ -0,0 +1,164 @@
+package org.dromara.backstage.basics.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.backstage.basics.domain.bo.PtAccountBo;
+import org.dromara.backstage.basics.domain.bo.PtAreaBo;
+import org.dromara.backstage.basics.domain.bo.PtRoomBo;
+import org.dromara.backstage.basics.domain.vo.PtAccountVo;
+import org.dromara.backstage.basics.domain.vo.PtAreaVo;
+import org.dromara.backstage.basics.domain.vo.PtRoomTempImportVo;
+import org.dromara.backstage.basics.domain.vo.PtRoomVo;
+import org.dromara.backstage.basics.service.IPtAccountService;
+import org.dromara.backstage.basics.service.IPtAreaService;
+import org.dromara.backstage.basics.service.IPtRoomService;
+import org.dromara.backstage.consumption.domain.XfTerm;
+import org.dromara.backstage.consumption.domain.bo.XfTermBo;
+import org.dromara.backstage.consumption.domain.bo.XfTermImportBo;
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
+import org.dromara.backstage.consumption.service.IXfTermService;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.core.utils.ValidatorUtils;
+import org.dromara.common.excel.core.ExcelListener;
+import org.dromara.common.excel.core.ExcelResult;
+import org.dromara.common.satoken.utils.LoginHelper;
+
+import java.util.List;
+
+@Slf4j
+public class XfTermImportListener extends AnalysisEventListener<XfTermImportBo> implements ExcelListener<XfTermImportBo> {
+
+    private final IPtRoomService ptRoomService;
+
+    private final IXfTermService xfTermService;
+    private final IPtAccountService ptAccountService;
+
+    private final Boolean isUpdateSupport;
+
+    private final Long operUserId;
+
+    private int successNum = 0;
+    private int failureNum = 0;
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
+
+    public XfTermImportListener(Boolean isUpdateSupport) {
+        this.ptRoomService = SpringUtils.getBean(IPtRoomService.class);
+        this.xfTermService = SpringUtils.getBean(IXfTermService.class);
+        this.ptAccountService = SpringUtils.getBean(IPtAccountService.class);
+        this.operUserId = LoginHelper.getUserId();
+        this.isUpdateSupport = isUpdateSupport;
+    }
+
+    @Override
+    public ExcelResult<XfTermImportBo> getExcelResult() {
+        return new ExcelResult<>(){
+
+            @Override
+            public List<XfTermImportBo> getList() {
+                return null;
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return null;
+            }
+
+            @Override
+            public String getAnalysis() {
+                if (failureNum > 0) {
+                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+                    throw new ServiceException(failureMsg.toString());
+                } else {
+                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                }
+                return successMsg.toString();
+            }
+        };
+    }
+
+    @Override
+    public void invoke(XfTermImportBo bo, AnalysisContext analysisContext) {
+        //1.查询区域是否存在
+        Integer rowIndex = analysisContext.readRowHolder().getRowIndex() + 1;
+        try{
+            //先验证数据
+            ValidatorUtils.validate(bo);
+
+            //查询并设置房间
+            PtRoomBo roomBo = new PtRoomBo();
+            roomBo.setRoomCode(bo.getRoomCode());
+            List<PtRoomVo> roomVos = ptRoomService.queryList(roomBo);
+            if(CollectionUtil.isEmpty(roomVos)){
+                failureMsg.append("<br/>").append("第").append(rowIndex).append("行,房间编号不存在;");
+                failureNum++;
+                return;
+            }
+            if(roomVos.size()>1){
+                failureMsg.append("<br/>").append("第").append(rowIndex).append("行,房间编号不唯一;");
+                failureNum++;
+                return;
+            }
+
+            XfTermBo xfTerm = BeanUtil.toBean(bo, XfTermBo.class);
+            xfTerm.setRoomId(roomVos.get(0).getRoomId());
+            //查询并设置商户
+            PtAccountBo ptAccountBo = new PtAccountBo();
+            ptAccountBo.setAccountName(bo.getAccountName());
+            List<PtAccountVo> ptRoomVos = ptAccountService.queryListByName(ptAccountBo);
+            if(CollectionUtil.isEmpty(ptRoomVos)){
+                failureMsg.append("<br/>").append("第").append(rowIndex).append("行,商户名称不存在;");
+                failureNum++;
+                return;
+            }
+            if(roomVos.size()>1){
+                failureMsg.append("<br/>").append("第").append(rowIndex).append("行,商户名称不唯一;");
+                failureNum++;
+                return;
+            }
+            xfTerm.setAccountId(ptRoomVos.get(0).getAccountId());
+            xfTerm.setCreateBy(operUserId);
+
+            //设备机号或设备名称不能重复
+            XfTermBo xfTermBo = new XfTermBo();
+            xfTermBo.setTermNo(bo.getTermNo());
+            xfTermBo.setTermName(bo.getTermName());
+            List<XfTermVo> xfTermVos = xfTermService.queryListByNoOrName(xfTermBo);
+            if (CollectionUtil.isEmpty(xfTermVos)) {
+                xfTermService.insertByBo(xfTerm);
+
+                successNum++;
+                successMsg.append("<br/>").append(successNum).append("、第 ").append(rowIndex).append("行,导入成功");
+            } else if (isUpdateSupport && xfTermVos.size() == 1) {
+                XfTermVo xfTermVo = xfTermVos.get(0);
+                XfTermBo xfTermBo1 = BeanUtil.toBean(xfTermVo, XfTermBo.class);
+                xfTermBo1.setCreateBy(operUserId);
+                xfTermBo1.setRoomId(xfTerm.getRoomId());
+                xfTermBo1.setAccountId(xfTerm.getAccountId());
+
+                xfTermService.updateByBo(xfTermBo1);
+                successNum++;
+                successMsg.append("<br/>").append(successNum).append("、第 ").append(rowIndex).append("行,更新成功");
+
+            }else{
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、第 ").append(rowIndex).append("行,已存在;");
+            }
+
+        } catch (Exception e) {
+            failureNum++;
+            String msg = "<br/>" +"第 " + rowIndex + "行,导入失败:";
+            failureMsg.append(msg).append(e.getMessage());
+            log.error(msg, e);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+    }
+}

+ 1 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtAccountService.java

@@ -41,6 +41,7 @@ public interface IPtAccountService {
      * @return 结算账户列表
      */
     List<PtAccountVo> queryList(PtAccountBo bo);
+    List<PtAccountVo> queryListByName(PtAccountBo bo);
 
     /**
      * 新增结算账户

+ 7 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtAccountServiceImpl.java

@@ -75,6 +75,13 @@ public class PtAccountServiceImpl implements IPtAccountService {
         return baseMapper.selectVoList(lqw);
     }
 
+    @Override
+    public List<PtAccountVo> queryListByName(PtAccountBo bo) {
+        LambdaQueryWrapper<PtAccount> lqw = Wrappers.lambdaQuery();
+        lqw.eq(PtAccount::getAccountName, bo.getAccountName());
+        return baseMapper.selectVoList(lqw);
+    }
+
     private LambdaQueryWrapper<PtAccount> buildQueryWrapper(PtAccountBo bo) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<PtAccount> lqw = Wrappers.lambdaQuery();

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtRoomServiceImpl.java

@@ -234,7 +234,7 @@ public class PtRoomServiceImpl implements IPtRoomService {
         //同一个楼栋 不能有相同的名称和门牌号
         if(StringUtils.isNotBlank(entity.getRoomName())){
             Long aLong = baseMapper.selectCount(Wrappers.<PtRoom>lambdaQuery()
-                .eq(PtRoom::getAreaId, entity.getAreaId())
+//                .eq(PtRoom::getAreaId, entity.getAreaId())
                 .and(
                     queryWrapper -> queryWrapper.eq(PtRoom::getRoomName, entity.getRoomName()).or().eq(PtRoom::getRoomCode, entity.getRoomCode())
                 )

+ 25 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfTermController.java

@@ -1,13 +1,20 @@
 package org.dromara.backstage.consumption.controller;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.backstage.basics.domain.vo.PtRoomTempImportVo;
+import org.dromara.backstage.basics.listener.PtRoomImportListener;
+import org.dromara.backstage.basics.listener.XfTermImportListener;
+import org.dromara.backstage.consumption.domain.bo.XfTermImportBo;
 import org.dromara.backstage.consumption.domain.bo.XfTermParamBo;
 import org.dromara.backstage.consumption.domain.vo.XfTermParamVo;
+import org.dromara.common.excel.core.ExcelResult;
+import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -23,6 +30,7 @@ import org.dromara.backstage.consumption.domain.vo.XfTermVo;
 import org.dromara.backstage.consumption.domain.bo.XfTermBo;
 import org.dromara.backstage.consumption.service.IXfTermService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * 消费设备
@@ -51,12 +59,28 @@ public class XfTermController extends BaseController {
     /**
      * 导出消费设备列表
      */
+    @SaCheckPermission("consumption:xfTerm:export")
+    @Log(title = "消费设备模板导入下载", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportTemplate")
+    public void exportTemplate(HttpServletResponse response) {
+        List<XfTermImportBo> list = new ArrayList<>();
+        ExcelUtil.exportExcel(list, "消费设备导入模板", XfTermImportBo.class, response);
+    }
+
     @SaCheckPermission("consumption:xfTerm:export")
     @Log(title = "消费设备", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(XfTermBo bo, HttpServletResponse response) {
         List<XfTermVo> list = xfTermService.queryList(bo);
-        ExcelUtil.exportExcel(list, "消费设备", XfTermVo.class, response);
+        ExcelUtil.exportExcel(list, "消费设备列表", XfTermVo.class, response);
+    }
+
+    @SaCheckPermission("consumption:xfTerm:import")
+    @Log(title = "设备信息的导入", businessType = BusinessType.IMPORT)
+    @PostMapping(value="/importData",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception{
+        ExcelResult<XfTermImportBo> rs = ExcelUtil.importExcel(file.getInputStream(), XfTermImportBo.class, new XfTermImportListener(updateSupport));
+        return R.ok(rs.getAnalysis());
     }
 
     /**

+ 4 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfTermBo.java

@@ -8,6 +8,8 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
+
+import java.io.Serial;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 
@@ -22,6 +24,8 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 @AutoMapper(target = XfTerm.class, reverseConvertGenerate = false)
 public class XfTermBo extends BaseEntity {
 
+    @Serial
+    private static final long serialVersionUID = 3335304346440907682L;
     /**
      * 设备Id,主键
      */

+ 117 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfTermImportBo.java

@@ -0,0 +1,117 @@
+package org.dromara.backstage.consumption.domain.bo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.backstage.consumption.domain.XfTerm;
+import org.dromara.common.core.enums.YesNoEnum;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.annotation.ExcelEnumFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.common.excel.convert.ExcelEnumConvert;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 消费设备业务对象 t_xf_term
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+@Data
+@AutoMapper(target = XfTerm.class, reverseConvertGenerate = false)
+public class XfTermImportBo {
+
+
+    @Serial
+    private static final long serialVersionUID = -3016111432056540468L;
+    /**
+     * 设备机号
+     */
+    @NotNull(message = "设备机号不能为空")
+    @ExcelProperty(value = "设备机号")
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    @NotBlank(message = "设备名称不能为空")
+    @ExcelProperty(value = "设备名称")
+    private String termName;
+    /**
+     * 结算账户Id
+     */
+    @NotBlank(message = "商户名称不能为空")
+    @ExcelProperty(value = "商户名称")
+    private String accountName;
+
+    /**
+     * 所属餐厅Id 所属餐厅不能为空
+     */
+    @NotBlank(message = "房间编码不能为空")
+    @ExcelProperty(value = "房间编码")
+    private String roomCode;
+
+
+    /**
+     * 设备IP
+     */
+    @NotBlank(message = "设备IP不能为空")
+    @ExcelProperty(value = "设备IP")
+    private String termIp;
+
+    /**
+     * 设备通讯端口
+     */
+    @NotNull(message = "设备通讯端口不能为空")
+    @ExcelProperty(value = "设备通讯端口")
+    private Long commPort;
+
+    /**
+     * 服务器IP
+     */
+    @NotBlank(message = "服务器IP不能为空")
+    @ExcelProperty(value = "服务器IP")
+    private String serverIp;
+
+    /**
+     * 服务器端口
+     */
+    @NotNull(message = "服务器端口不能为空")
+    @ExcelProperty(value = "服务器端口")
+    private Long serverPort;
+
+    /**
+     * 是否自动下载参数,见sys_yew_no字典项
+     */
+    @ExcelProperty(value = "是否自动下载参数", converter = ExcelEnumConvert.class)
+    @ExcelEnumFormat(enumClass = YesNoEnum.class)
+    @NotBlank(message = "是否自动下载参不能为空")
+    private String autoDown;
+
+    /**
+     * 设备二维码
+     */
+    @ExcelProperty(value = "设备二维码")
+    private String qrCode;
+
+
+    /**
+     * 扣费类型,见XF_ConsumeType字典类型
+     */
+    @NotBlank(message = "扣费类型不能为空")
+    @ExcelProperty(value = "扣费类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "XF_ConsumeType")
+    private String consumeType;
+
+
+
+
+}

+ 19 - 11
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfTermVo.java

@@ -7,12 +7,15 @@ import jakarta.validation.constraints.NotNull;
 import org.dromara.backstage.consumption.domain.XfTerm;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.core.enums.YesNoEnum;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.annotation.ExcelEnumFormat;
 import org.dromara.common.excel.convert.ExcelDictConvert;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
+import org.dromara.common.excel.convert.ExcelEnumConvert;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -37,7 +40,7 @@ public class XfTermVo implements Serializable {
     /**
      * 设备Id,主键
      */
-    @ExcelProperty(value = "设备Id,主键")
+//    @ExcelProperty(value = "设备Id,主键")
     private Long termId;
 
     /**
@@ -57,7 +60,7 @@ public class XfTermVo implements Serializable {
      */
     private Long roomId;
 
-    @ExcelProperty(value = "所属餐厅")
+    @ExcelProperty(value = "所属房间")
     private String roomName;
 
     /**
@@ -65,20 +68,20 @@ public class XfTermVo implements Serializable {
      */
     private Long accountId;
 
-    @ExcelProperty(value = "结算账户")
+    @ExcelProperty(value = "账户名称")
     private String accountName;
 
     /**
      * 设备类型,见XF_TermType字典类型
      */
-    @ExcelProperty(value = "设备类型,见XF_TermType字典类型", converter = ExcelDictConvert.class)
+    @ExcelProperty(value = "设备类型", converter = ExcelDictConvert.class)
     @ExcelDictFormat(dictType = "XF_TermType")
     private String termType;
 
     /**
      * 扣费类型,见XF_ConsumeType字典类型
      */
-    @ExcelProperty(value = "扣费类型,见XF_ConsumeType字典类型", converter = ExcelDictConvert.class)
+    @ExcelProperty(value = "扣费类型", converter = ExcelDictConvert.class)
     @ExcelDictFormat(dictType = "XF_ConsumeType")
     private String consumeType;
 
@@ -91,23 +94,28 @@ public class XfTermVo implements Serializable {
     /**
      * 设备通讯端口
      */
-    @ExcelProperty(value = "设备通讯端口")
+    @ExcelProperty(value = "设备端口")
     private Long commPort;
 
-    /**
-     * 备注
-     */
-    @ExcelProperty(value = "备注")
-    private String remark;
 
+    @ExcelProperty(value = "服务器IP")
     private String serverIp;
 
     /**
      * 服务器端口
      */
+    @ExcelProperty(value = "服务器端口")
     private Long serverPort;
 
+    @ExcelProperty(value = "是否自动下载参数", converter = ExcelEnumConvert.class)
+    @ExcelEnumFormat(enumClass = YesNoEnum.class)
     private String autoDown;
 
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
 
 }

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfTermService.java

@@ -1,6 +1,5 @@
 package org.dromara.backstage.consumption.service;
 
-import org.dromara.backstage.consumption.domain.XfTerm;
 import org.dromara.backstage.consumption.domain.bo.XfTermParamBo;
 import org.dromara.backstage.consumption.domain.vo.XfTermParamVo;
 import org.dromara.backstage.consumption.domain.vo.XfTermVo;
@@ -46,6 +45,7 @@ public interface IXfTermService {
      * @return 消费设备列表
      */
     List<XfTermVo> queryList(XfTermBo bo);
+    List<XfTermVo> queryListByNoOrName(XfTermBo bo);
     List<XfTermVo> queryListByIds(List<Long> ids);
 
     public Map<Long,XfTermVo> queryMapByIds(List<Long> ids);

+ 22 - 5
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfTermServiceImpl.java

@@ -2,7 +2,9 @@ package org.dromara.backstage.consumption.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.map.MapUtil;
+import org.dromara.backstage.basics.domain.vo.PtAccountVo;
 import org.dromara.backstage.basics.domain.vo.PtRoomVo;
+import org.dromara.backstage.basics.service.IPtAccountService;
 import org.dromara.backstage.basics.service.IPtRoomService;
 import org.dromara.backstage.consumption.domain.bo.XfTermParamBo;
 import org.dromara.backstage.consumption.domain.vo.XfTermParamVo;
@@ -23,10 +25,7 @@ import org.dromara.backstage.consumption.mapper.XfTermMapper;
 import org.dromara.backstage.consumption.service.IXfTermService;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -43,6 +42,8 @@ public class XfTermServiceImpl implements IXfTermService {
 
     private final IPtRoomService roomService;
 
+    private final IPtAccountService accountService;
+
     /**
      * 查询消费设备
      *
@@ -100,7 +101,23 @@ public class XfTermServiceImpl implements IXfTermService {
     @Override
     public List<XfTermVo> queryList(XfTermBo bo) {
         LambdaQueryWrapper<XfTerm> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
+        List<XfTermVo> xfTermVos = baseMapper.selectVoList(lqw);
+        if(CollectionUtil.isNotEmpty(xfTermVos)){
+            xfTermVos.forEach(x->{
+                PtRoomVo ptRoomVo = Optional.ofNullable(roomService.queryById(x.getRoomId())).orElse(new PtRoomVo());
+                x.setRoomName(ptRoomVo.getRoomName());
+                PtAccountVo ptAccountVo = Optional.ofNullable(accountService.queryById(x.getAccountId())).orElse(new PtAccountVo());
+                x.setAccountName(ptAccountVo.getAccountName());
+            });
+        }
+        return xfTermVos;
+    }
+
+    @Override
+    public List<XfTermVo> queryListByNoOrName(XfTermBo bo) {
+        LambdaQueryWrapper<XfTerm> query = Wrappers.lambdaQuery();
+        query.eq(XfTerm::getTermNo, bo.getTermNo()).or().eq(XfTerm::getTermName, bo.getTermName());
+        return baseMapper.selectVoList(query);
     }
 
     public List<XfTermVo> queryListByIds(List<Long> ids){