bing 1 жил өмнө
parent
commit
4c71c94978

+ 8 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtRoomController.java

@@ -2,6 +2,7 @@ package org.dromara.backstage.basics.controller;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
@@ -11,6 +12,7 @@ import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import org.apache.commons.collections4.CollectionUtils;
 import org.dromara.backstage.basics.domain.bo.PtRoomBatchSetBo;
+import org.dromara.backstage.basics.domain.vo.PtAreaVo;
 import org.dromara.backstage.basics.domain.vo.PtRoomTempImportVo;
 import org.dromara.backstage.basics.listener.PtRoomImportListener;
 import org.dromara.common.excel.core.ExcelResult;
@@ -56,6 +58,12 @@ public class PtRoomController extends BaseController {
         return ptRoomService.queryPageList(bo, pageQuery);
     }
 
+    @SaCheckPermission("room:ptRoom:list")
+    @GetMapping("/queryRoom2AreaList")
+    public R<Map<Long, List<PtAreaVo>>> queryRoom2AreaList(PtRoomBo bo) {
+        return R.ok(ptRoomService.queryRoom2AreaList(bo));
+    }
+
     /**
      * 导出房间定义列表
      */

+ 9 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtRoomService.java

@@ -2,6 +2,7 @@ package org.dromara.backstage.basics.service;
 
 import org.dromara.backstage.basics.domain.PtRoom;
 import org.dromara.backstage.basics.domain.bo.PtRoomBatchSetBo;
+import org.dromara.backstage.basics.domain.vo.PtAreaVo;
 import org.dromara.backstage.basics.domain.vo.PtRoomVo;
 import org.dromara.backstage.basics.domain.bo.PtRoomBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -9,6 +10,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 房间定义Service接口
@@ -43,6 +45,13 @@ public interface IPtRoomService {
      */
     List<PtRoomVo> queryList(PtRoomBo bo);
 
+    /**
+     * 查询房间信息并转换成区域信息
+     * @param bo 房间定义
+     * @return 区域信息
+     */
+    Map<Long, List<PtAreaVo>> queryRoom2AreaList(PtRoomBo bo);
+
     /**
      * 新增房间定义
      *

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

@@ -1,6 +1,8 @@
 package org.dromara.backstage.basics.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.map.MapUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import org.dromara.backstage.basics.domain.bo.PtRoomBatchSetBo;
 import org.dromara.backstage.basics.domain.vo.PtAreaVo;
@@ -19,9 +21,8 @@ import org.dromara.backstage.basics.domain.PtRoom;
 import org.dromara.backstage.basics.mapper.PtRoomMapper;
 import org.dromara.backstage.basics.service.IPtRoomService;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 房间定义Service业务层处理
@@ -94,6 +95,32 @@ public class PtRoomServiceImpl implements IPtRoomService {
         return ptRoomVos;
     }
 
+    /**
+     * 仅用于选择房间
+     * @param bo 房间定义
+     * @return
+     */
+    @Override
+    public Map<Long, List<PtAreaVo>> queryRoom2AreaList(PtRoomBo bo) {
+        LambdaQueryWrapper<PtRoom> lqw = buildQueryWrapper(bo);
+        List<PtRoomVo> ptRoomVos = baseMapper.selectVoList(lqw);
+        if(CollectionUtil.isNotEmpty(ptRoomVos)){
+           List<PtAreaVo> rs = new ArrayList<>();
+           ptRoomVos.forEach(ptRoomVo -> {
+               PtAreaVo ptAreaVo = new PtAreaVo();
+               ptAreaVo.setParentId(ptRoomVo.getAreaId());
+               ptAreaVo.setAreaName(ptRoomVo.getRoomName());
+               ptAreaVo.setAreaId(ptRoomVo.getRoomId());
+               ptAreaVo.setAreaCode(ptRoomVo.getRoomCode());
+               ptAreaVo.setAreaType("room");
+               rs.add(ptAreaVo);
+           });
+           //分组
+            return rs.stream().collect(Collectors.groupingBy(PtAreaVo::getParentId));
+        }
+        return MapUtil.empty();
+    }
+
     private void setAreaName(List<PtRoomVo> ptRoomVos) {
         if(CollectionUtil.isNotEmpty(ptRoomVos)){
             Map<Long, PtAreaVo> areaMap = areaService.queryMapByIds(ptRoomVos.stream().map(PtRoomVo::getAreaId).toList());

+ 106 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfTermController.java

@@ -0,0 +1,106 @@
+package org.dromara.backstage.consumption.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+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;
+
+/**
+ * 消费设备
+ * 前端访问路由地址为:/consumption/xfTerm
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/consumption/xfTerm")
+public class XfTermController extends BaseController {
+
+    private final IXfTermService xfTermService;
+
+    /**
+     * 查询消费设备列表
+     */
+    @SaCheckPermission("consumption:xfTerm:list")
+    @GetMapping("/list")
+    public TableDataInfo<XfTermVo> list(XfTermBo bo, PageQuery pageQuery) {
+        return xfTermService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出消费设备列表
+     */
+    @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);
+    }
+
+    /**
+     * 获取消费设备详细信息
+     *
+     * @param termId 主键
+     */
+    @SaCheckPermission("consumption:xfTerm:query")
+    @GetMapping("/{termId}")
+    public R<XfTermVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long termId) {
+        return R.ok(xfTermService.queryById(termId));
+    }
+
+    /**
+     * 新增消费设备
+     */
+    @SaCheckPermission("consumption:xfTerm:add")
+    @Log(title = "消费设备", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody XfTermBo bo) {
+        return toAjax(xfTermService.insertByBo(bo));
+    }
+
+    /**
+     * 修改消费设备
+     */
+    @SaCheckPermission("consumption:xfTerm:edit")
+    @Log(title = "消费设备", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody XfTermBo bo) {
+        return toAjax(xfTermService.updateByBo(bo));
+    }
+
+    /**
+     * 删除消费设备
+     *
+     * @param termIds 主键串
+     */
+    @SaCheckPermission("consumption:xfTerm:remove")
+    @Log(title = "消费设备", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{termIds}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] termIds) {
+        return toAjax(xfTermService.deleteWithValidByIds(List.of(termIds), true));
+    }
+}

+ 349 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfTerm.java

@@ -0,0 +1,349 @@
+package org.dromara.backstage.consumption.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 消费设备对象 t_xf_term
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_xf_term")
+public class XfTerm extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 设备Id,主键
+     */
+    @TableId(value = "term_id")
+    private Long termId;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 所属餐厅Id
+     */
+    private Long roomId;
+
+    /**
+     * 结算账户Id
+     */
+    private Long accountId;
+
+    /**
+     * 设备类型,见XF_TermType字典类型
+     */
+    private String termType;
+
+    /**
+     * 设备二维码
+     */
+    private String qrCode;
+
+    /**
+     * 工作站Id
+     */
+    private Long stationId;
+
+    /**
+     * 扣费类型,见XF_ConsumeType字典类型
+     */
+    private String consumeType;
+
+    /**
+     * 是否自动下载参数,见sys_yew_no字典项
+     */
+    private String autoDown;
+
+    /**
+     * 应用系统,见YYXT数据字典类别
+     */
+    private String useType;
+
+    /**
+     * 允许使用的卡类
+     */
+    private Long cardType;
+
+    /**
+     * 设备IP
+     */
+    private String termIp;
+
+    /**
+     * 设备MAC地址
+     */
+    private String termMac;
+
+    /**
+     * 设备通讯端口
+     */
+    private Long commPort;
+
+    /**
+     * 子网掩码
+     */
+    private String mask;
+
+    /**
+     * 服务器IP
+     */
+    private String serverIp;
+
+    /**
+     * 服务器端口
+     */
+    private Long serverPort;
+
+    /**
+     * 网关IP
+     */
+    private String gatewayIp;
+
+    /**
+     * 心跳间隔,以秒为单位
+     */
+    private Long beatInterval;
+
+    /**
+     * 通讯超时时间,以100毫秒为单位
+     */
+    private Long timeout;
+
+    /**
+     * 允许脱机时间
+     */
+    private Long offlineTime;
+
+    /**
+     * 高级参数
+     */
+    private String advParam;
+
+    /**
+     * 设备参数
+     */
+    private String posParam;
+
+    /**
+     * 费率参数
+     */
+    private String rateParam;
+
+    /**
+     * 消费工作模式,见XF_WorkMode字典类别
+     */
+    private String workMode;
+
+    /**
+     * 开机模式,0-不需要营业员开机,1-需要营业员开机
+     */
+    private String openMode;
+
+    /**
+     * 卡上最大金额
+     */
+    private Long maxCardMoney;
+
+    /**
+     * 定值消费金额
+     */
+    private Long constantValue;
+
+    /**
+     * 编号0代表的金额
+     */
+    private Long rationZero;
+
+    /**
+     * 编号1代表的金额
+     */
+    private Long rationOne;
+
+    /**
+     * 编号2代表的金额
+     */
+    private Long rationTwo;
+
+    /**
+     * 编号3代表的金额
+     */
+    private Long rationThree;
+
+    /**
+     * 编号4代表的金额
+     */
+    private Long rationFour;
+
+    /**
+     * 编号5代表的金额
+     */
+    private Long rationFive;
+
+    /**
+     * 编号6代表的金额
+     */
+    private Long rationSix;
+
+    /**
+     * 编号7代表的金额
+     */
+    private Long rationSeven;
+
+    /**
+     * 编号8代表的金额
+     */
+    private Long rationEight;
+
+    /**
+     * 编号9代表的金额
+     */
+    private Long rationNine;
+
+    /**
+     * 每天最大消费次数,0-不限
+     */
+    private Long dayCount;
+
+    /**
+     * 每天最大消费金额
+     */
+    private Long dayMoney;
+
+    /**
+     * 每餐最大消费次数,0-不限
+     */
+    private Long mealCount;
+
+    /**
+     * 单次最大消费金额
+     */
+    private Long singleMoney;
+
+    /**
+     * 早餐消费金额
+     */
+    private Long breakfastMoney;
+
+    /**
+     * 午餐消费金额
+     */
+    private Long lunchMoney;
+
+    /**
+     * 晚餐消费金额
+     */
+    private Long supperMoney;
+
+    /**
+     * 夜宵消费金额
+     */
+    private Long nightMoney;
+
+    /**
+     * 早餐开始时间
+     */
+    private Long breakfastBegin;
+
+    /**
+     * 早餐结束时间
+     */
+    private Long breakfastEnd;
+
+    /**
+     * 午餐开始时间
+     */
+    private Long lunchBegin;
+
+    /**
+     * 午餐结束时间
+     */
+    private Long lunchEnd;
+
+    /**
+     * 晚餐开始时间
+     */
+    private Long supperBegin;
+
+    /**
+     * 晚餐结束时间
+     */
+    private Long suppeEnd;
+
+    /**
+     * 宵夜开始时间
+     */
+    private Long nightBegin;
+
+    /**
+     * 宵夜结束时间
+     */
+    private Long nightEnd;
+
+    /**
+     * 两次刷卡间隔,0-不限制
+     */
+    private Long swipeInterval;
+
+    /**
+     * 是否启用卡片有效限制,0-禁用 1-启用
+     */
+    private String termValidity;
+
+    /**
+     * 设备记录流水号
+     */
+    private Long recordId;
+
+    /**
+     * 数据上传时间
+     */
+    private Date uploadTime;
+
+    /**
+     * 黑名单下载时间
+     */
+    private Date blackDownTime;
+
+    /**
+     * 最后校时时间
+     */
+    private Date lastCheck;
+
+    /**
+     * 重启时间
+     */
+    private String rebootTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志(0-未删除 2-已删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

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

@@ -0,0 +1,354 @@
+package org.dromara.backstage.consumption.domain.bo;
+
+import org.dromara.backstage.consumption.domain.XfTerm;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 消费设备业务对象 t_xf_term
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = XfTerm.class, reverseConvertGenerate = false)
+public class XfTermBo extends BaseEntity {
+
+    /**
+     * 设备Id,主键
+     */
+    @NotNull(message = "设备Id,主键不能为空", groups = { EditGroup.class })
+    private Long termId;
+
+    /**
+     * 设备机号
+     */
+    @NotNull(message = "设备机号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    @NotBlank(message = "设备名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String termName;
+
+    /**
+     * 所属餐厅Id
+     */
+    private Long roomId;
+
+    /**
+     * 结算账户Id
+     */
+    @NotNull(message = "结算账户Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long accountId;
+
+    /**
+     * 设备类型,见XF_TermType字典类型
+     */
+    @NotBlank(message = "设备类型,见XF_TermType字典类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String termType;
+
+    /**
+     * 设备二维码
+     */
+    private String qrCode;
+
+    /**
+     * 工作站Id
+     */
+    private Long stationId;
+
+    /**
+     * 扣费类型,见XF_ConsumeType字典类型
+     */
+    @NotBlank(message = "扣费类型,见XF_ConsumeType字典类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String consumeType;
+
+    /**
+     * 是否自动下载参数,见sys_yew_no字典项
+     */
+    private String autoDown;
+
+    /**
+     * 应用系统,见YYXT数据字典类别
+     */
+    private String useType;
+
+    /**
+     * 允许使用的卡类
+     */
+    private Long cardType;
+
+    /**
+     * 设备IP
+     */
+    @NotBlank(message = "设备IP不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String termIp;
+
+    /**
+     * 设备MAC地址
+     */
+    private String termMac;
+
+    /**
+     * 设备通讯端口
+     */
+    @NotNull(message = "设备通讯端口不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long commPort;
+
+    /**
+     * 子网掩码
+     */
+    private String mask;
+
+    /**
+     * 服务器IP
+     */
+    @NotBlank(message = "服务器IP不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String serverIp;
+
+    /**
+     * 服务器端口
+     */
+    @NotNull(message = "服务器端口不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long serverPort;
+
+    /**
+     * 网关IP
+     */
+    private String gatewayIp;
+
+    /**
+     * 心跳间隔,以秒为单位
+     */
+    private Long beatInterval;
+
+    /**
+     * 通讯超时时间,以100毫秒为单位
+     */
+    private Long timeout;
+
+    /**
+     * 允许脱机时间
+     */
+    private Long offlineTime;
+
+    /**
+     * 高级参数
+     */
+    private String advParam;
+
+    /**
+     * 设备参数
+     */
+    private String posParam;
+
+    /**
+     * 费率参数
+     */
+    private String rateParam;
+
+    /**
+     * 消费工作模式,见XF_WorkMode字典类别
+     */
+    @NotBlank(message = "消费工作模式,见XF_WorkMode字典类别不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String workMode;
+
+    /**
+     * 开机模式,0-不需要营业员开机,1-需要营业员开机
+     */
+    @NotBlank(message = "开机模式,0-不需要营业员开机,1-需要营业员开机不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String openMode;
+
+    /**
+     * 卡上最大金额
+     */
+    @NotNull(message = "卡上最大金额不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long maxCardMoney;
+
+    /**
+     * 定值消费金额
+     */
+    private Long constantValue;
+
+    /**
+     * 编号0代表的金额
+     */
+    private Long rationZero;
+
+    /**
+     * 编号1代表的金额
+     */
+    private Long rationOne;
+
+    /**
+     * 编号2代表的金额
+     */
+    private Long rationTwo;
+
+    /**
+     * 编号3代表的金额
+     */
+    private Long rationThree;
+
+    /**
+     * 编号4代表的金额
+     */
+    private Long rationFour;
+
+    /**
+     * 编号5代表的金额
+     */
+    private Long rationFive;
+
+    /**
+     * 编号6代表的金额
+     */
+    private Long rationSix;
+
+    /**
+     * 编号7代表的金额
+     */
+    private Long rationSeven;
+
+    /**
+     * 编号8代表的金额
+     */
+    private Long rationEight;
+
+    /**
+     * 编号9代表的金额
+     */
+    private Long rationNine;
+
+    /**
+     * 每天最大消费次数,0-不限
+     */
+    private Long dayCount;
+
+    /**
+     * 每天最大消费金额
+     */
+    private Long dayMoney;
+
+    /**
+     * 每餐最大消费次数,0-不限
+     */
+    private Long mealCount;
+
+    /**
+     * 单次最大消费金额
+     */
+    private Long singleMoney;
+
+    /**
+     * 早餐消费金额
+     */
+    private Long breakfastMoney;
+
+    /**
+     * 午餐消费金额
+     */
+    private Long lunchMoney;
+
+    /**
+     * 晚餐消费金额
+     */
+    private Long supperMoney;
+
+    /**
+     * 夜宵消费金额
+     */
+    private Long nightMoney;
+
+    /**
+     * 早餐开始时间
+     */
+    private Long breakfastBegin;
+
+    /**
+     * 早餐结束时间
+     */
+    private Long breakfastEnd;
+
+    /**
+     * 午餐开始时间
+     */
+    private Long lunchBegin;
+
+    /**
+     * 午餐结束时间
+     */
+    private Long lunchEnd;
+
+    /**
+     * 晚餐开始时间
+     */
+    private Long supperBegin;
+
+    /**
+     * 晚餐结束时间
+     */
+    private Long suppeEnd;
+
+    /**
+     * 宵夜开始时间
+     */
+    private Long nightBegin;
+
+    /**
+     * 宵夜结束时间
+     */
+    private Long nightEnd;
+
+    /**
+     * 两次刷卡间隔,0-不限制
+     */
+    private Long swipeInterval;
+
+    /**
+     * 是否启用卡片有效限制,0-禁用 1-启用
+     */
+    private String termValidity;
+
+    /**
+     * 设备记录流水号
+     */
+    private Long recordId;
+
+    /**
+     * 数据上传时间
+     */
+    private Date uploadTime;
+
+    /**
+     * 黑名单下载时间
+     */
+    private Date blackDownTime;
+
+    /**
+     * 最后校时时间
+     */
+    private Date lastCheck;
+
+    /**
+     * 重启时间
+     */
+    private String rebootTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

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

@@ -0,0 +1,96 @@
+package org.dromara.backstage.consumption.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.backstage.consumption.domain.XfTerm;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 消费设备视图对象 t_xf_term
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = XfTerm.class)
+public class XfTermVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 设备Id,主键
+     */
+    @ExcelProperty(value = "设备Id,主键")
+    private Long termId;
+
+    /**
+     * 设备机号
+     */
+    @ExcelProperty(value = "设备机号")
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    @ExcelProperty(value = "设备名称")
+    private String termName;
+
+    /**
+     * 所属餐厅Id
+     */
+    @ExcelProperty(value = "所属餐厅Id")
+    private Long roomId;
+
+    /**
+     * 结算账户Id
+     */
+    @ExcelProperty(value = "结算账户Id")
+    private Long accountId;
+
+    /**
+     * 设备类型,见XF_TermType字典类型
+     */
+    @ExcelProperty(value = "设备类型,见XF_TermType字典类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "XF_TermType")
+    private String termType;
+
+    /**
+     * 扣费类型,见XF_ConsumeType字典类型
+     */
+    @ExcelProperty(value = "扣费类型,见XF_ConsumeType字典类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "XF_ConsumeType")
+    private String consumeType;
+
+    /**
+     * 设备IP
+     */
+    @ExcelProperty(value = "设备IP")
+    private String termIp;
+
+    /**
+     * 设备通讯端口
+     */
+    @ExcelProperty(value = "设备通讯端口")
+    private Long commPort;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/mapper/XfTermMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.backstage.consumption.mapper;
+
+import org.dromara.backstage.consumption.domain.XfTerm;
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 消费设备Mapper接口
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+public interface XfTermMapper extends BaseMapperPlus<XfTerm, XfTermVo> {
+
+}

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

@@ -0,0 +1,69 @@
+package org.dromara.backstage.consumption.service;
+
+import org.dromara.backstage.consumption.domain.XfTerm;
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
+import org.dromara.backstage.consumption.domain.bo.XfTermBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 消费设备Service接口
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+public interface IXfTermService {
+
+    /**
+     * 查询消费设备
+     *
+     * @param termId 主键
+     * @return 消费设备
+     */
+    XfTermVo queryById(Long termId);
+
+    /**
+     * 分页查询消费设备列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 消费设备分页列表
+     */
+    TableDataInfo<XfTermVo> queryPageList(XfTermBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的消费设备列表
+     *
+     * @param bo 查询条件
+     * @return 消费设备列表
+     */
+    List<XfTermVo> queryList(XfTermBo bo);
+
+    /**
+     * 新增消费设备
+     *
+     * @param bo 消费设备
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(XfTermBo bo);
+
+    /**
+     * 修改消费设备
+     *
+     * @param bo 消费设备
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(XfTermBo bo);
+
+    /**
+     * 校验并批量删除消费设备信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -0,0 +1,144 @@
+package org.dromara.backstage.consumption.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.backstage.consumption.domain.bo.XfTermBo;
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
+import org.dromara.backstage.consumption.domain.XfTerm;
+import org.dromara.backstage.consumption.mapper.XfTermMapper;
+import org.dromara.backstage.consumption.service.IXfTermService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 消费设备Service业务层处理
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+@RequiredArgsConstructor
+@Service
+public class XfTermServiceImpl implements IXfTermService {
+
+    private final XfTermMapper baseMapper;
+
+    /**
+     * 查询消费设备
+     *
+     * @param termId 主键
+     * @return 消费设备
+     */
+    @Override
+    public XfTermVo queryById(Long termId){
+        return baseMapper.selectVoById(termId);
+    }
+
+    /**
+     * 分页查询消费设备列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 消费设备分页列表
+     */
+    @Override
+    public TableDataInfo<XfTermVo> queryPageList(XfTermBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<XfTerm> lqw = buildQueryWrapper(bo);
+        Page<XfTermVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的消费设备列表
+     *
+     * @param bo 查询条件
+     * @return 消费设备列表
+     */
+    @Override
+    public List<XfTermVo> queryList(XfTermBo bo) {
+        LambdaQueryWrapper<XfTerm> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<XfTerm> buildQueryWrapper(XfTermBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<XfTerm> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getTermNo() != null, XfTerm::getTermNo, bo.getTermNo());
+        lqw.like(StringUtils.isNotBlank(bo.getTermName()), XfTerm::getTermName, bo.getTermName());
+        lqw.eq(StringUtils.isNotBlank(bo.getTermIp()), XfTerm::getTermIp, bo.getTermIp());
+        return lqw;
+    }
+
+    private QueryWrapper<XfTerm> buildQueryWrapper(XfTermBo bo,String tableAlias) {
+        QueryWrapper<XfTerm> lqw = new QueryWrapper<>();
+        String columnPrefix = "";
+        if(StringUtils.isNotBlank(tableAlias)){
+            columnPrefix = tableAlias + ".";
+        }
+        lqw.eq(bo.getTermNo() != null, columnPrefix+"term_no", bo.getTermNo());
+        lqw.like(StringUtils.isNotBlank(bo.getTermName()), columnPrefix+"term_name", bo.getTermName());
+        lqw.eq(StringUtils.isNotBlank(bo.getTermIp()), columnPrefix+"term_ip", bo.getTermIp());
+        return lqw;
+    }
+
+    /**
+     * 新增消费设备
+     *
+     * @param bo 消费设备
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(XfTermBo bo) {
+        XfTerm add = MapstructUtils.convert(bo, XfTerm.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setTermId(add.getTermId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改消费设备
+     *
+     * @param bo 消费设备
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(XfTermBo bo) {
+        XfTerm update = MapstructUtils.convert(bo, XfTerm.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(XfTerm entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除消费设备信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 79 - 0
ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfTermMapper.xml

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.backstage.consumption.mapper.XfTermMapper">
+
+    <resultMap type="org.dromara.backstage.consumption.domain.XfTerm" id="XfTermResult">
+            <result property="termId"    column="term_id"    />
+            <result property="tenantId"    column="tenant_id"    />
+            <result property="termNo"    column="term_no"    />
+            <result property="termName"    column="term_name"    />
+            <result property="roomId"    column="room_id"    />
+            <result property="accountId"    column="account_id"    />
+            <result property="termType"    column="term_type"    />
+            <result property="qrCode"    column="qr_code"    />
+            <result property="stationId"    column="station_id"    />
+            <result property="consumeType"    column="consume_type"    />
+            <result property="autoDown"    column="auto_down"    />
+            <result property="useType"    column="use_type"    />
+            <result property="cardType"    column="card_type"    />
+            <result property="termIp"    column="term_ip"    />
+            <result property="termMac"    column="term_mac"    />
+            <result property="commPort"    column="comm_port"    />
+            <result property="mask"    column="mask"    />
+            <result property="serverIp"    column="server_ip"    />
+            <result property="serverPort"    column="server_port"    />
+            <result property="gatewayIp"    column="gateway_ip"    />
+            <result property="beatInterval"    column="beat_interval"    />
+            <result property="timeout"    column="timeout"    />
+            <result property="offlineTime"    column="offline_time"    />
+            <result property="advParam"    column="adv_param"    />
+            <result property="posParam"    column="pos_param"    />
+            <result property="rateParam"    column="rate_param"    />
+            <result property="workMode"    column="work_mode"    />
+            <result property="openMode"    column="open_mode"    />
+            <result property="maxCardMoney"    column="max_card_money"    />
+            <result property="constantValue"    column="constant_value"    />
+            <result property="rationZero"    column="ration_zero"    />
+            <result property="rationOne"    column="ration_one"    />
+            <result property="rationTwo"    column="ration_two"    />
+            <result property="rationThree"    column="ration_three"    />
+            <result property="rationFour"    column="ration_four"    />
+            <result property="rationFive"    column="ration_five"    />
+            <result property="rationSix"    column="ration_six"    />
+            <result property="rationSeven"    column="ration_seven"    />
+            <result property="rationEight"    column="ration_eight"    />
+            <result property="rationNine"    column="ration_nine"    />
+            <result property="dayCount"    column="day_count"    />
+            <result property="dayMoney"    column="day_money"    />
+            <result property="mealCount"    column="meal_count"    />
+            <result property="singleMoney"    column="single_money"    />
+            <result property="breakfastMoney"    column="breakfast_money"    />
+            <result property="lunchMoney"    column="lunch_money"    />
+            <result property="supperMoney"    column="supper_money"    />
+            <result property="nightMoney"    column="night_money"    />
+            <result property="breakfastBegin"    column="breakfast_begin"    />
+            <result property="breakfastEnd"    column="breakfast_end"    />
+            <result property="lunchBegin"    column="lunch_begin"    />
+            <result property="lunchEnd"    column="lunch_end"    />
+            <result property="supperBegin"    column="supper_begin"    />
+            <result property="suppeEnd"    column="suppe_end"    />
+            <result property="nightBegin"    column="night_begin"    />
+            <result property="nightEnd"    column="night_end"    />
+            <result property="swipeInterval"    column="swipe_interval"    />
+            <result property="termValidity"    column="term_validity"    />
+            <result property="recordId"    column="record_id"    />
+            <result property="uploadTime"    column="upload_time"    />
+            <result property="blackDownTime"    column="black_down_time"    />
+            <result property="lastCheck"    column="last_check"    />
+            <result property="rebootTime"    column="reboot_time"    />
+            <result property="remark"    column="remark"    />
+            <result property="delFlag"    column="del_flag"    />
+            <result property="createDept"    column="create_dept"    />
+            <result property="createBy"    column="create_by"    />
+            <result property="createTime"    column="create_time"    />
+            <result property="updateBy"    column="update_by"    />
+            <result property="updateTime"    column="update_time"    />
+    </resultMap>
+</mapper>