renkang
2026-04-02 666a4ef3cf5d9838795487918621a4232859506d
网关管理功能
已添加7个文件
已修改8个文件
473 ■■■■■ 文件已修改
server/db/business.yw_gateway.permissions.sql 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/db/yw_gateway.sql 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/bootstrap-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/bootstrap-test.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_timer/src/main/resources/bootstrap-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_timer/src/main/resources/bootstrap-test.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/resources/bootstrap-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/resources/bootstrap-test.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwGatewayCloudController.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwGatewayMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwGateway.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwGatewayService.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwGatewayServiceImpl.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/db/business.yw_gateway.permissions.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywgateway:create', '新建网关管理', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywgateway:delete', '删除网关管理', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywgateway:update', '修改网关管理', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywgateway:query', '查询网关管理', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywgateway:exportExcel', '导出网关管理(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
server/db/yw_gateway.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
CREATE TABLE `yw_gateway` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `creator` int(11) DEFAULT NULL COMMENT '创建人编码',
  `create_date` datetime DEFAULT NULL COMMENT '创建时间',
  `editor` int(11) DEFAULT NULL COMMENT '更新人编码',
  `edit_date` datetime DEFAULT NULL COMMENT '更新时间',
  `isdeleted` int(1) DEFAULT '0' COMMENT '是否删除 0否 1是',
  `name` varchar(100) DEFAULT NULL COMMENT '网关名称',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `status` int(1) DEFAULT '0' COMMENT '状态 0启用 1禁用',
  `sortnum` int(11) DEFAULT NULL COMMENT '排序码',
  `gateway_model` varchar(100) DEFAULT NULL COMMENT '网关型号',
  `gateway_code` varchar(100) DEFAULT NULL COMMENT '网关设备号',
  `last_heartbeat_time` datetime DEFAULT NULL COMMENT '最后心跳时间',
  `project_id` int(11) DEFAULT NULL COMMENT '所属项目编码(关联yw_project)',
  PRIMARY KEY (`id`),
  KEY `idx_gateway_code` (`gateway_code`),
  KEY `idx_project_id` (`project_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='网关管理';
server/system_gateway/src/main/resources/bootstrap-dev.yml
@@ -1,11 +1,11 @@
spring:
  cloud:
    nacos:
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      server-addr: http://192.168.0.3:8848 #配置Nacos地址
      username: nacos
      password: nacos
      discovery:
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        server-addr: http://192.168.0.3:8848 #配置Nacos地址
#        namespace: dmvisit
        namespace: funingyunwei_dev
        username: nacos
server/system_gateway/src/main/resources/bootstrap-test.yml
@@ -1,11 +1,11 @@
spring:
  cloud:
    nacos:
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      server-addr: http://192.168.0.3:8848 #配置Nacos地址
      username: nacos
      password: nacos
      discovery:
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        server-addr: http://192.168.0.3:8848 #配置Nacos地址
        namespace: funingyunwei_test
#        namespace: dev_renkang
        username: nacos
server/system_timer/src/main/resources/bootstrap-dev.yml
@@ -10,7 +10,7 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      server-addr: http://192.168.0.3:8848 #配置Nacos地址
      username: nacos
      password: nacos
      #      config:
@@ -22,7 +22,7 @@
      #        group: dev
      #        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        server-addr: http://192.168.0.3:8848 #配置Nacos地址
        namespace: funingyunwei_dev
        username: nacos
        password: nacos
server/system_timer/src/main/resources/bootstrap-test.yml
@@ -10,7 +10,7 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      server-addr: http://192.168.0.3:8848 #配置Nacos地址
      username: nacos
      password: nacos
      #      config:
@@ -22,7 +22,7 @@
      #        group: dev
      #        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        server-addr: http://192.168.0.3:8848 #配置Nacos地址
        namespace: funingyunwei_test
        username: nacos
        password: nacos
server/visits/admin_timer/src/main/resources/bootstrap-dev.yml
@@ -10,7 +10,7 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      server-addr: http://192.168.0.3:8848 #配置Nacos地址
      username: nacos
      password: nacos
#      config:
@@ -22,7 +22,7 @@
#        group: dev
#        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        server-addr: http://192.168.0.3:8848 #配置Nacos地址
        namespace: funingyunwei_dev
        username: nacos
        password: nacos
server/visits/admin_timer/src/main/resources/bootstrap-test.yml
@@ -10,7 +10,7 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      server-addr: http://192.168.0.3:8848 #配置Nacos地址
      username: nacos
      password: nacos
#      config:
@@ -22,7 +22,7 @@
#        group: dev
#        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        server-addr: http://192.168.0.3:8848 #配置Nacos地址
        namespace: funingyunwei_test
        username: nacos
        password: nacos
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwGatewayCloudController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
package com.doumee.cloud.admin;
import com.doumee.api.BaseController;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.YwGateway;
import com.doumee.service.business.YwGatewayService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.doumee.config.annotation.CloudRequiredPermission;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
 * ç½‘关管理
 * @author renkang
 * @date 2026/04/02
 */
@Api(tags = "网关管理")
@RestController
@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX + "/business/ywGateway")
public class YwGatewayCloudController extends BaseController {
    @Autowired
    private YwGatewayService ywGatewayService;
    @PreventRepeat
    @ApiOperation("新建")
    @PostMapping("/create")
    @CloudRequiredPermission("business:ywgateway:create")
    public ApiResponse create(@RequestBody YwGateway ywGateway, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ywGateway.setLoginUserInfo(this.getLoginUser(token));
        return ApiResponse.success(ywGatewayService.create(ywGateway));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @CloudRequiredPermission("business:ywgateway:delete")
    public ApiResponse deleteById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ywGatewayService.deleteById(id, this.getLoginUser(token));
        return ApiResponse.success(null);
    }
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @CloudRequiredPermission("business:ywgateway:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        String[] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
            idList.add(Integer.valueOf(id));
        }
        ywGatewayService.deleteByIdInBatch(idList, this.getLoginUser(token));
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @CloudRequiredPermission("business:ywgateway:update")
    public ApiResponse updateById(@RequestBody YwGateway ywGateway, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ywGateway.setLoginUserInfo(this.getLoginUser(token));
        ywGatewayService.updateById(ywGateway);
        return ApiResponse.success(null);
    }
    @ApiOperation("禁启用")
    @PostMapping("/updateStatusById")
    @CloudRequiredPermission("business:ywgateway:update")
    public ApiResponse updateStatusById(@RequestBody YwGateway ywGateway, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ywGateway.setLoginUserInfo(this.getLoginUser(token));
        ywGatewayService.updateStatusById(ywGateway);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @CloudRequiredPermission("business:ywgateway:query")
    public ApiResponse<PageData<YwGateway>> findPage(@RequestBody PageWrap<YwGateway> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        pageWrap.getModel().setLoginUserInfo(this.getLoginUser(token));
        return ApiResponse.success(ywGatewayService.findPage(pageWrap));
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @CloudRequiredPermission("business:ywgateway:query")
    public ApiResponse findById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(ywGatewayService.findById(id));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:ywgateway:exportExcel")
    public void exportExcel(@RequestBody PageWrap<YwGateway> pageWrap, HttpServletResponse response, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        pageWrap.getModel().setLoginUserInfo(this.getLoginUser(token));
        ExcelExporter.build(YwGateway.class).export(ywGatewayService.findPage(pageWrap).getRecords(), "网关管理", response);
    }
}
server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml
@@ -10,7 +10,7 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      server-addr: http://192.168.0.3:8848 #配置Nacos地址
      username: nacos
      password: nacos
#      config:
@@ -22,7 +22,7 @@
#        group: dev
#        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        server-addr: http://192.168.0.3:8848 #配置Nacos地址
#        namespace: dmvisit
        namespace: funingyunwei_dev
        username: nacos
server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml
@@ -10,7 +10,7 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      server-addr: http://192.168.0.3:8848 #配置Nacos地址
      username: nacos
      password: nacos
#      config:
@@ -22,7 +22,7 @@
#        group: dev
#        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        server-addr: http://192.168.0.3:8848 #配置Nacos地址
        namespace: funingyunwei_test
        username: nacos
        password: nacos
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwGatewayMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.doumee.dao.business;
import com.github.yulichang.base.MPJBaseMapper;
import com.doumee.dao.business.model.YwGateway;
/**
 * ç½‘关管理Mapper
 * @author renkang
 * @date 2026/04/02
 */
public interface YwGatewayMapper extends MPJBaseMapper<YwGateway> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwGateway.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.core.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
/**
 * ç½‘关管理
 * @author renkang
 * @date 2026/04/02
 */
@Data
@ApiModel("网关管理")
@TableName("`yw_gateway`")
public class YwGateway extends LoginUserModel {
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name = "主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelColumn(name = "创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelColumn(name = "更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name = "更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "0")
    @ExcelColumn(name = "是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "网关名称")
    @ExcelColumn(name = "网关名称")
    private String name;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name = "备注")
    private String remark;
    @ApiModelProperty(value = "状态 0启用 1禁用", example = "0")
    @ExcelColumn(name = "状态 0启用 1禁用")
    private Integer status;
    @ApiModelProperty(value = "排序码", example = "1")
    @ExcelColumn(name = "排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "网关型号")
    @ExcelColumn(name = "网关型号")
    private String gatewayModel;
    @ApiModelProperty(value = "网关设备号")
    @ExcelColumn(name = "网关设备号")
    private String gatewayCode;
    @ApiModelProperty(value = "最后心跳时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ExcelColumn(name = "最后心跳时间")
    private Date lastHeartbeatTime;
    @ApiModelProperty(value = "所属项目编码(关联yw_project)", example = "1")
    private Integer projectId;
    @ApiModelProperty(value = "项目名称")
    @TableField(exist = false)
    private String projectName;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwGatewayService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.doumee.service.business;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.YwGateway;
import java.util.List;
/**
 * ç½‘关管理Service定义
 * @author renkang
 * @date 2026/04/02
 */
public interface YwGatewayService {
    /**
     * åˆ›å»º
     *
     * @param ywGateway å®žä½“对象
     * @return Integer
     */
    Integer create(YwGateway ywGateway);
    /**
     * ä¸»é”®åˆ é™¤
     *
     * @param id ä¸»é”®
     * @param user ç™»å½•用户
     */
    void deleteById(Integer id, LoginUserInfo user);
    /**
     * æ‰¹é‡ä¸»é”®åˆ é™¤
     *
     * @param ids ä¸»é”®é›†
     * @param user ç™»å½•用户
     */
    void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user);
    /**
     * ä¸»é”®æ›´æ–°
     *
     * @param ywGateway å®žä½“对象
     */
    void updateById(YwGateway ywGateway);
    /**
     * æ›´æ–°çŠ¶æ€
     *
     * @param ywGateway å®žä½“对象(id + status)
     */
    void updateStatusById(YwGateway ywGateway);
    /**
     * ä¸»é”®æŸ¥è¯¢è¯¦æƒ…
     *
     * @param id ä¸»é”®
     * @return YwGateway
     */
    YwGateway findById(Integer id);
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param pageWrap åˆ†é¡µå¯¹è±¡
     * @return PageData<YwGateway>
     */
    PageData<YwGateway> findPage(PageWrap<YwGateway> pageWrap);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwGatewayServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,142 @@
package com.doumee.service.business.impl;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.YwGatewayMapper;
import com.doumee.dao.business.model.YwGateway;
import com.doumee.service.business.YwGatewayService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * ç½‘关管理Service实现
 * @author renkang
 * @date 2026/04/02
 */
@Service
public class YwGatewayServiceImpl implements YwGatewayService {
    @Autowired
    private YwGatewayMapper ywGatewayMapper;
    @Override
    public Integer create(YwGateway ywGateway) {
        if (Objects.isNull(ywGateway)
                || StringUtils.isBlank(ywGateway.getName())
                || StringUtils.isBlank(ywGateway.getGatewayCode())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LoginUserInfo loginUserInfo = ywGateway.getLoginUserInfo();
        // æ ¡éªŒç½‘关设备号唯一
        if (ywGatewayMapper.selectCount(new QueryWrapper<YwGateway>().lambda()
                .eq(YwGateway::getIsdeleted, Constants.ZERO)
                .eq(YwGateway::getGatewayCode, ywGateway.getGatewayCode())) > Constants.ZERO) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "网关设备号重复!");
        }
        ywGateway.setCreateDate(new Date());
        ywGateway.setCreator(loginUserInfo.getId());
        ywGateway.setEditDate(new Date());
        ywGateway.setEditor(loginUserInfo.getId());
        ywGateway.setIsdeleted(Constants.ZERO);
        ywGatewayMapper.insert(ywGateway);
        return ywGateway.getId();
    }
    @Override
    public void deleteById(Integer id, LoginUserInfo user) {
        ywGatewayMapper.update(new UpdateWrapper<YwGateway>()
                .lambda()
                .set(YwGateway::getIsdeleted, Constants.ONE)
                .set(YwGateway::getEditDate, DateUtil.getCurrDateTime())
                .set(YwGateway::getEditor, user.getId())
                .eq(YwGateway::getId, id)
        );
    }
    @Override
    public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user) {
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        for (Integer id : ids) {
            this.deleteById(id, user);
        }
    }
    @Override
    public void updateById(YwGateway ywGateway) {
        if (Objects.isNull(ywGateway)
                || Objects.isNull(ywGateway.getId())
                || StringUtils.isBlank(ywGateway.getName())
                || StringUtils.isBlank(ywGateway.getGatewayCode())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LoginUserInfo loginUserInfo = ywGateway.getLoginUserInfo();
        // æ ¡éªŒç½‘关设备号唯一(排除自身)
        if (ywGatewayMapper.selectCount(new QueryWrapper<YwGateway>().lambda()
                .eq(YwGateway::getIsdeleted, Constants.ZERO)
                .eq(YwGateway::getGatewayCode, ywGateway.getGatewayCode())
                .ne(YwGateway::getId, ywGateway.getId())) > Constants.ZERO) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "网关设备号重复!");
        }
        ywGateway.setEditDate(new Date());
        ywGateway.setEditor(loginUserInfo.getId());
        ywGatewayMapper.updateById(ywGateway);
    }
    @Override
    public void updateStatusById(YwGateway ywGateway) {
        YwGateway model = new YwGateway();
        model.setId(ywGateway.getId());
        model.setStatus(ywGateway.getStatus());
        ywGatewayMapper.updateById(model);
    }
    @Override
    public YwGateway findById(Integer id) {
        return ywGatewayMapper.selectJoinOne(YwGateway.class,
                new MPJLambdaWrapper<YwGateway>()
                        .selectAll(YwGateway.class)
                        .selectAs(com.doumee.dao.business.model.YwProject::getName, YwGateway::getProjectName)
                        .leftJoin(com.doumee.dao.business.model.YwProject.class, com.doumee.dao.business.model.YwProject::getId, YwGateway::getProjectId)
                        .eq(YwGateway::getId, id)
                        .last(" limit 1 ")
        );
    }
    @Override
    public PageData<YwGateway> findPage(PageWrap<YwGateway> pageWrap) {
        IPage<YwGateway> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<YwGateway> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        YwGateway model = pageWrap.getModel();
        queryWrapper.selectAll(YwGateway.class)
                .selectAs(com.doumee.dao.business.model.YwProject::getName, YwGateway::getProjectName)
                .leftJoin(com.doumee.dao.business.model.YwProject.class, com.doumee.dao.business.model.YwProject::getId, YwGateway::getProjectId)
                .and(Objects.nonNull(model) && StringUtils.isNotBlank(model.getName()),
                        i -> i.like(YwGateway::getName, model.getName()).or().like(YwGateway::getGatewayCode, model.getName()))
                .eq(Objects.nonNull(model) && Objects.nonNull(model.getStatus()), YwGateway::getStatus, model.getStatus())
                .eq(Objects.nonNull(model) && Objects.nonNull(model.getProjectId()), YwGateway::getProjectId, model.getProjectId())
                .eq(YwGateway::getIsdeleted, Constants.ZERO)
                .orderByDesc(YwGateway::getCreateDate);
        IPage<YwGateway> iPage = ywGatewayMapper.selectJoinPage(page, YwGateway.class, queryWrapper);
        return PageData.from(iPage);
    }
}