唐耀东
2022-05-12 b78f403d9237c2bbddbc9be505acfd068a0521aa
提交代码
8个文件已添加
708 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/SgAiController.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SgAi.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SgAiBo.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SgAiVo.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SgAiMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISgAiService.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SgAiServiceImpl.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-oa/src/main/resources/mapper/oa/SgAiMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/SgAiController.java
New file
@@ -0,0 +1,119 @@
package com.ruoyi.web.controller.oa;
import java.util.List;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import com.ruoyi.common.annotation.DataDictClass;
import com.ruoyi.common.annotation.Dict;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.core.validate.QueryGroup;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.oa.domain.vo.SgAiVo;
import com.ruoyi.oa.domain.bo.SgAiBo;
import com.ruoyi.oa.service.ISgAiService;
import com.ruoyi.common.core.page.TableDataInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiOperation;
/**
 * AI设备Controller
 *
 * @author ruoyi
 * @date 2022-05-12
 */
@Validated
@Api(value = "AI设备控制器", tags = {"AI设备管理"})
@RequiredArgsConstructor(onConstructor_ = @Autowired)
@RestController
@RequestMapping("/oa/ai")
public class SgAiController extends BaseController {
    private final ISgAiService iSgAiService;
    /**
     * 查询AI设备列表
     */
    @DataDictClass
    @ApiOperation("查询AI设备列表")
    @PreAuthorize("@ss.hasPermi('oa:ai:list')")
    @GetMapping("/list")
    public TableDataInfo<SgAiVo> list(@Validated(QueryGroup.class) SgAiBo bo) {
        return iSgAiService.queryPageList(bo);
    }
    /**
     * 导出AI设备列表
     */
    @ApiOperation("导出AI设备列表")
    @PreAuthorize("@ss.hasPermi('oa:ai:export')")
    @Log(title = "AI设备", businessType = BusinessType.EXPORT)
    @GetMapping("/export")
    public void export(@Validated SgAiBo bo, HttpServletResponse response) {
        List<SgAiVo> list = iSgAiService.queryList(bo);
        ExcelUtil.exportExcel(list, "AI设备", SgAiVo.class, response);
    }
    /**
     * 获取AI设备详细信息
     */
    @ApiOperation("获取AI设备详细信息")
    @PreAuthorize("@ss.hasPermi('oa:ai:query')")
    @GetMapping("/{id}")
    public AjaxResult<SgAiVo> getInfo(@ApiParam("主键")
                                                  @NotNull(message = "主键不能为空")
                                                  @PathVariable("id") Long id) {
        return AjaxResult.success(iSgAiService.queryById(id));
    }
    /**
     * 新增AI设备
     */
    @ApiOperation("新增AI设备")
    @PreAuthorize("@ss.hasPermi('oa:ai:add')")
    @Log(title = "AI设备", businessType = BusinessType.INSERT)
    @RepeatSubmit()
    @PostMapping()
    public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody SgAiBo bo) {
        return toAjax(iSgAiService.insertByBo(bo) ? 1 : 0);
    }
    /**
     * 修改AI设备
     */
    @ApiOperation("修改AI设备")
    @PreAuthorize("@ss.hasPermi('oa:ai:edit')")
    @Log(title = "AI设备", businessType = BusinessType.UPDATE)
    @RepeatSubmit()
    @PutMapping()
    public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody SgAiBo bo) {
        return toAjax(iSgAiService.updateByBo(bo) ? 1 : 0);
    }
    /**
     * 删除AI设备
     */
    @ApiOperation("删除AI设备")
    @PreAuthorize("@ss.hasPermi('oa:ai:remove')")
    @Log(title = "AI设备" , businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public AjaxResult<Void> remove(@ApiParam("主键串")
                                       @NotEmpty(message = "主键不能为空")
                                       @PathVariable Long[] ids) {
        return toAjax(iSgAiService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
    }
}
ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SgAi.java
New file
@@ -0,0 +1,93 @@
package com.ruoyi.oa.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
import java.math.BigDecimal;
import com.ruoyi.common.core.domain.BaseEntity;
/**
 * AI设备对象 sg_ai
 *
 * @author ruoyi
 * @date 2022-05-12
 */
@Data
@Accessors(chain = true)
@TableName("sg_ai")
public class SgAi extends BaseEntity {
    private static final long serialVersionUID=1L;
    /**
     *
     */
    @TableId(value = "id")
    private Long id;
    /**
     * 高校
     */
    private Long schoolId;
    /**
     * 部署名称
     */
    private String deploymentName;
    /**
     * 通道
     */
    private String passageway;
    /**
     * LAN1
     */
    private String lanOne;
    /**
     * IP1
     */
    private String ipOne;
    /**
     * LAN2
     */
    private String lanTwo;
    /**
     * IP2
     */
    private String ipTwo;
    /**
     * 登录账户
     */
    private String loginAccount;
    /**
     * 安装位置
     */
    private Long buildingId;
    /**
     * 所属单位
     */
    private Long organizationId;
    /**
     * 施工批次
     */
    private Long constructionBatchId;
    /**
     * 序列号
     */
    private String serialNumber;
    /**
     * 型号
     */
    private String model;
    /**
     * 生产厂商
     */
    private Long manufacturerId;
    /**
     *
     */
    @TableLogic
    private String delFlag;
}
ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SgAiBo.java
New file
@@ -0,0 +1,148 @@
package com.ruoyi.oa.domain.bo;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.util.Date;
import com.ruoyi.common.core.domain.BaseEntity;
/**
 * AI设备业务对象 sg_ai
 *
 * @author ruoyi
 * @date 2022-05-12
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel("AI设备业务对象")
public class SgAiBo extends BaseEntity {
    /**
     *
     */
    @ApiModelProperty(value = "", required = true)
    @NotNull(message = "不能为空", groups = { EditGroup.class })
    private Long id;
    /**
     * 高校
     */
    private Long schoolId;
    /**
     * 部署名称
     */
    @ApiModelProperty(value = "部署名称", required = true)
    @NotBlank(message = "部署名称不能为空", groups = { AddGroup.class, EditGroup.class })
    private String deploymentName;
    /**
     * 通道
     */
    @ApiModelProperty(value = "通道", required = true)
    @NotBlank(message = "通道不能为空", groups = { AddGroup.class, EditGroup.class })
    private String passageway;
    /**
     * LAN1
     */
    @ApiModelProperty(value = "LAN1", required = true)
    @NotBlank(message = "LAN1不能为空", groups = { AddGroup.class, EditGroup.class })
    private String lanOne;
    /**
     * IP1
     */
    @ApiModelProperty(value = "IP1", required = true)
    @NotBlank(message = "IP1不能为空", groups = { AddGroup.class, EditGroup.class })
    private String ipOne;
    /**
     * LAN2
     */
    @ApiModelProperty(value = "LAN2", required = true)
    @NotBlank(message = "LAN2不能为空", groups = { AddGroup.class, EditGroup.class })
    private String lanTwo;
    /**
     * IP2
     */
    @ApiModelProperty(value = "IP2")
    private String ipTwo;
    /**
     * 登录账户
     */
    @ApiModelProperty(value = "登录账户")
    private String loginAccount;
    /**
     * 安装位置
     */
    @ApiModelProperty(value = "安装位置", required = true)
    @NotNull(message = "安装位置不能为空", groups = { AddGroup.class, EditGroup.class })
    private Long buildingId;
    /**
     * 所属单位
     */
    @ApiModelProperty(value = "所属单位", required = true)
    @NotNull(message = "所属单位不能为空", groups = { AddGroup.class, EditGroup.class })
    private Long organizationId;
    /**
     * 施工批次
     */
    @ApiModelProperty(value = "施工批次", required = true)
    @NotNull(message = "施工批次不能为空", groups = { AddGroup.class, EditGroup.class })
    private Long constructionBatchId;
    /**
     * 序列号
     */
    @ApiModelProperty(value = "序列号")
    private String serialNumber;
    /**
     * 型号
     */
    @ApiModelProperty(value = "型号")
    private String model;
    /**
     * 生产厂商
     */
    @ApiModelProperty(value = "生产厂商")
    private Long manufacturerId;
    /**
     * 分页大小
     */
    @ApiModelProperty("分页大小")
    private Integer pageSize;
    /**
     * 当前页数
     */
    @ApiModelProperty("当前页数")
    private Integer pageNum;
    /**
     * 排序列
     */
    @ApiModelProperty("排序列")
    private String orderByColumn;
    /**
     * 排序的方向desc或者asc
     */
    @ApiModelProperty(value = "排序的方向", example = "asc,desc")
    private String isAsc;
}
ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SgAiVo.java
New file
@@ -0,0 +1,135 @@
package com.ruoyi.oa.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.ruoyi.common.annotation.Dict;
import com.ruoyi.common.annotation.ExcelDictFormat;
import com.ruoyi.common.convert.ExcelDictConvert;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * AI设备视图对象 sg_ai
 *
 * @author ruoyi
 * @date 2022-05-12
 */
@Data
@ApiModel("AI设备视图对象")
@ExcelIgnoreUnannotated
public class SgAiVo {
    private static final long serialVersionUID = 1L;
    /**
     *
     */
    @ExcelProperty(value = "")
    @ApiModelProperty("")
    private Long id;
    /**
     * 高校
     */
    private Long schoolId;
    /**
     * 部署名称
     */
    @ExcelProperty(value = "部署名称")
    @ApiModelProperty("部署名称")
    private String deploymentName;
    /**
     * 通道
     */
    @ExcelProperty(value = "通道", converter = ExcelDictConvert.class)
    @ExcelDictFormat(dictType = "DICT112")
    @ApiModelProperty("通道")
    private String passageway;
    /**
     * LAN1
     */
    @ExcelProperty(value = "LAN1")
    @ApiModelProperty("LAN1")
    private String lanOne;
    /**
     * IP1
     */
    @ExcelProperty(value = "IP1")
    @ApiModelProperty("IP1")
    private String ipOne;
    /**
     * LAN2
     */
    @ExcelProperty(value = "LAN2")
    @ApiModelProperty("LAN2")
    private String lanTwo;
    /**
     * IP2
     */
    @ExcelProperty(value = "IP2")
    @ApiModelProperty("IP2")
    private String ipTwo;
    /**
     * 登录账户
     */
    @ExcelProperty(value = "登录账户")
    @ApiModelProperty("登录账户")
    private String loginAccount;
    /**
     * 安装位置
     */
    @ExcelProperty(value = "安装位置")
    @ApiModelProperty("安装位置")
    @Dict(dictTable = "bs_building", dicCode = "id", dicText = "detailed_name")
    private Long buildingId;
    /**
     * 所属单位
     */
    @ExcelProperty(value = "所属单位")
    @ApiModelProperty("所属单位")
    @Dict(dictTable = "bs_organization", dicCode = "id", dicText = "detailed_name")
    private Long organizationId;
    /**
     * 施工批次
     */
    @ExcelProperty(value = "施工批次")
    @ApiModelProperty("施工批次")
    @Dict(dictTable = "sg_construction_batch", dicCode = "id", dicText = "batch")
    private Long constructionBatchId;
    /**
     * 序列号
     */
    @ExcelProperty(value = "序列号")
    @ApiModelProperty("序列号")
    private String serialNumber;
    /**
     * 型号
     */
    @ExcelProperty(value = "型号")
    @ApiModelProperty("型号")
    private String model;
    /**
     * 生产厂商
     */
    @ExcelProperty(value = "生产厂商")
    @ApiModelProperty("生产厂商")
    @Dict(dictTable = "dev_manufacturer", dicCode = "id", dicText = "name")
    private Long manufacturerId;
}
ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SgAiMapper.java
New file
@@ -0,0 +1,14 @@
package com.ruoyi.oa.mapper;
import com.ruoyi.oa.domain.SgAi;
import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus;
/**
 * AI设备Mapper接口
 *
 * @author ruoyi
 * @date 2022-05-12
 */
public interface SgAiMapper extends BaseMapperPlus<SgAi> {
}
ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISgAiService.java
New file
@@ -0,0 +1,56 @@
package com.ruoyi.oa.service;
import com.ruoyi.oa.domain.SgAi;
import com.ruoyi.oa.domain.vo.SgAiVo;
import com.ruoyi.oa.domain.bo.SgAiBo;
import com.ruoyi.common.core.mybatisplus.core.IServicePlus;
import com.ruoyi.common.core.page.TableDataInfo;
import java.util.Collection;
import java.util.List;
/**
 * AI设备Service接口
 *
 * @author ruoyi
 * @date 2022-05-12
 */
public interface ISgAiService extends IServicePlus<SgAi, SgAiVo> {
    /**
     * 查询单个
     * @return
     */
    SgAiVo queryById(Long id);
    /**
     * 查询列表
     */
    TableDataInfo<SgAiVo> queryPageList(SgAiBo bo);
    /**
     * 查询列表
     */
    List<SgAiVo> queryList(SgAiBo bo);
    /**
     * 根据新增业务对象插入AI设备
     * @param bo AI设备新增业务对象
     * @return
     */
    Boolean insertByBo(SgAiBo bo);
    /**
     * 根据编辑业务对象修改AI设备
     * @param bo AI设备编辑业务对象
     * @return
     */
    Boolean updateByBo(SgAiBo bo);
    /**
     * 校验并删除数据
     * @param ids 主键集合
     * @param isValid 是否校验,true-删除前校验,false-不校验
     * @return
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}
ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SgAiServiceImpl.java
New file
@@ -0,0 +1,113 @@
package com.ruoyi.oa.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.http.HttpStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.core.page.PagePlus;
import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.stereotype.Service;
import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.oa.domain.bo.SgAiBo;
import com.ruoyi.oa.domain.vo.SgAiVo;
import com.ruoyi.oa.domain.SgAi;
import com.ruoyi.oa.mapper.SgAiMapper;
import com.ruoyi.oa.service.ISgAiService;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
 * AI设备Service业务层处理
 *
 * @author ruoyi
 * @date 2022-05-12
 */
@Service
public class SgAiServiceImpl extends ServicePlusImpl<SgAiMapper, SgAi, SgAiVo> implements ISgAiService {
    @Override
    public SgAiVo queryById(Long id){
        return getVoById(id);
    }
    @Override
    public TableDataInfo<SgAiVo> queryPageList(SgAiBo bo) {
        PagePlus<SgAi, SgAiVo> result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo));
        return PageUtils.buildDataInfo(result);
    }
    @Override
    public List<SgAiVo> queryList(SgAiBo bo) {
        return listVo(buildQueryWrapper(bo));
    }
    private LambdaQueryWrapper<SgAi> buildQueryWrapper(SgAiBo bo) {
        Map<String, Object> params = bo.getParams();
        LambdaQueryWrapper<SgAi> lqw = Wrappers.lambdaQuery();
        lqw.eq(bo.getBuildingId() != null, SgAi::getBuildingId, bo.getBuildingId());
        lqw.eq(bo.getOrganizationId() != null, SgAi::getOrganizationId, bo.getOrganizationId());
        lqw.eq(bo.getConstructionBatchId() != null, SgAi::getConstructionBatchId, bo.getConstructionBatchId());
        lqw.like(StringUtils.isNotBlank(bo.getModel()), SgAi::getModel, bo.getModel());
        lqw.eq(bo.getManufacturerId() != null, SgAi::getManufacturerId, bo.getManufacturerId());
        lqw.eq(SgAi::getSchoolId, bo.getSchoolId());
        lqw.orderByDesc(SgAi::getUpdateTime);
        return lqw;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean insertByBo(SgAiBo bo) {
        List<SgAi> list = baseMapper.selectList(new LambdaQueryWrapper<SgAi>()
            .eq(SgAi::getDeploymentName, bo.getDeploymentName())
            .eq(SgAi::getSchoolId, bo.getSchoolId()));
        if (list.size() > 0) {
            throw new ServiceException("部署名称重复", HttpStatus.HTTP_PARTIAL);
        }
        SgAi add = BeanUtil.toBean(bo, SgAi.class);
        validEntityBeforeSave(add);
        boolean flag = save(add);
        if (flag) {
            bo.setId(add.getId());
        }
        return flag;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean updateByBo(SgAiBo bo) {
        List<SgAi> list = baseMapper.selectList(new LambdaQueryWrapper<SgAi>()
            .eq(SgAi::getDeploymentName, bo.getDeploymentName())
            .eq(SgAi::getSchoolId, bo.getSchoolId())
            .ne(SgAi::getId, bo.getId()));
        if (list.size() > 0) {
            throw new ServiceException("部署名称重复", HttpStatus.HTTP_PARTIAL);
        }
        SgAi update = BeanUtil.toBean(bo, SgAi.class);
        validEntityBeforeSave(update);
        return updateById(update);
    }
    /**
     * 保存前的数据校验
     *
     * @param entity 实体类数据
     */
    private void validEntityBeforeSave(SgAi entity){
        //TODO 做一些数据校验,如唯一约束
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
        if(isValid){
            //TODO 做一些业务上的校验,判断是否需要校验
        }
        return removeByIds(ids);
    }
}
ruoyi-oa/src/main/resources/mapper/oa/SgAiMapper.xml
New file
@@ -0,0 +1,30 @@
<?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="com.ruoyi.oa.mapper.SgAiMapper">
    <resultMap type="com.ruoyi.oa.domain.SgAi" id="SgAiResult">
        <result property="id" column="id"/>
        <result property="deploymentName" column="deployment_name"/>
        <result property="passageway" column="passageway"/>
        <result property="lanOne" column="lan_one"/>
        <result property="ipOne" column="ip_one"/>
        <result property="lanTwo" column="lan_two"/>
        <result property="ipTwo" column="ip_two"/>
        <result property="loginAccount" column="login_account"/>
        <result property="buildingId" column="building_id"/>
        <result property="organizationId" column="organization_id"/>
        <result property="constructionBatchId" column="construction_batch_id"/>
        <result property="serialNumber" column="serial_number"/>
        <result property="model" column="model"/>
        <result property="manufacturerId" column="manufacturer_id"/>
        <result property="createTime" column="create_time"/>
        <result property="createBy" column="create_by"/>
        <result property="updateBy" column="update_by"/>
        <result property="updateTime" column="update_time"/>
        <result property="delFlag" column="del_flag"/>
    </resultMap>
</mapper>