This commit is contained in:
谷成伟 2024-07-03 17:12:43 +08:00
commit e0701d79b7
26 changed files with 1223 additions and 85 deletions

View File

@ -24,6 +24,7 @@
<postgresql.version>42.7.3</postgresql.version>
<sa.version>1.38.0</sa.version>
<easyexcel.version>4.0.1</easyexcel.version>
<annotations.version>4.8.6</annotations.version>
</properties>
@ -72,6 +73,20 @@
<version>${sa.version}</version>
</dependency>
<!-- easyexcel导入导出 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyexcel.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 提供Redis连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>

View File

@ -0,0 +1,55 @@
package com.das.common.utils;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.das.modules.equipment.domain.excel.SheetInfoBean;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
/**
* EXCEL处理工具类
* @author 王凯
* @version 1.0.0
* @since 2022-08-17
*/
public class ExcelUtil {
/**导出*/
public static void exportMoreSheet(String fileName,
HttpServletRequest request,
HttpServletResponse response,
List<SheetInfoBean> sheetInfoList){
try {
// response.reset();
response.setHeader("Access-Control-Allow-Origin", "*");
if (request.getMethod().equals("OPTIONS")) {
response.addHeader("Access-Control-Allow-Methods", "GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,PATCH");
response.addHeader("Access-Control-Allow-Headers", "dnt,Origin, X-Requested-With,Content-Type, Accept, Authorization");
}
response.setCharacterEncoding("utf-8");
response.setContentType("application/vnd.ms-excel");
String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
WriteSheet writeSheet;
for (SheetInfoBean bean : sheetInfoList) {
// 构建sheet对象
writeSheet = EasyExcel.writerSheet(bean.getSheetName()).head(bean.getHeadClass()).build();
// 写出sheet数据
excelWriter.write(bean.getDataList(), writeSheet);
}
// // 关流
excelWriter.finish();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

View File

@ -4,13 +4,17 @@ import cn.dev33.satoken.stp.StpUtil;
import com.das.common.constant.SysAuthorityIds;
import com.das.common.exceptions.ServiceException;
import com.das.common.result.R;
import com.das.common.utils.ExcelUtil;
import com.das.modules.equipment.domain.dto.SysIotModelDto;
import com.das.modules.equipment.domain.dto.SysIotModelFieldDto;
import com.das.modules.equipment.domain.dto.SysIotModelServiceDto;
import com.das.modules.equipment.domain.vo.SysIotModelFieldVo;
import com.das.modules.equipment.domain.vo.SysIotModelServiceVo;
import com.das.modules.equipment.domain.vo.SysIotModelVo;
import com.das.modules.equipment.entity.SysIotModel;
import com.das.modules.equipment.service.SysIotModelService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@ -209,5 +213,16 @@ public class SysIotModelController {
sysIotModelService.deleteSysIotModelService(sysIotModelServiceDto);
return R.success();
}
/** 物模型导出 */
@PostMapping("/export")
public void exportSysIotModel(@RequestBody SysIotModelDto sysIotModelDto, HttpServletRequest request, HttpServletResponse response) {
if (sysIotModelDto.getId() == null) {
throw new ServiceException("请选择需要下载的物模型属性信息");
}
sysIotModelService.exportSysIotModel(sysIotModelDto,request, response);
}
}

View File

@ -32,5 +32,5 @@ public class SysIotModelFieldDto implements Serializable {
*/
private Integer porder;
private Integer version;
private Integer revision;
}

View File

@ -35,5 +35,5 @@ public class SysIotModelServiceDto implements Serializable {
*/
private Integer porder;
private Integer version;
private Integer revision;
}

View File

@ -0,0 +1,63 @@
package com.das.modules.equipment.domain.excel;
import java.util.List;
public class SheetInfoBean {
/**
* sheet页名称
*/
private String sheetName;
/**
* sheet标题bean
*/
private Class<?> headClass;
/**
* sheet页数据
*/
private List<?> dataList;
public SheetInfoBean() {
}
public SheetInfoBean(String sheetName, Class<?> headClass, List<?> dataList) {
this.sheetName = sheetName;
this.headClass = headClass;
this.dataList = dataList;
}
public String getSheetName() {
return sheetName;
}
public void setSheetName(String sheetName) {
this.sheetName = sheetName;
}
public Class<?> getHeadClass() {
return headClass;
}
public void setHeadClass(Class<?> headClass) {
this.headClass = headClass;
}
public List<?> getDataList() {
return dataList;
}
public void setDataList(List<?> dataList) {
this.dataList = dataList;
}
@Override
public String toString() {
return "SheetInfoBean{" +
"sheetName='" + sheetName + '\'' +
", headClass=" + headClass +
", dataList=" + dataList +
'}';
}
}

View File

@ -0,0 +1,49 @@
package com.das.modules.equipment.domain.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
/**
* 物模型属性前端回显
*
* @author guchengwei
*/
@Data
public class SysIotModelFieldExcel {
/**
* 所属物模型ID
*/
@ExcelProperty(value = "所属物模型名称",index = 0)
private String iotModelName;
/**
* 物模型动作编码
*/
@ExcelProperty(value = "物模型属性编码",index = 1)
private String attributeCode;
/**
* 物模型动作名称
*/
@ExcelProperty(value = "物模型属性名称",index = 2)
private String attributeName;
/**
* 属性类型
*/
@ExcelProperty(value = "属性类型",index = 3)
private Integer attributeType;
/**
* 测点序号
*/
@ExcelProperty(value = "测点序号",index = 4)
private Integer porder;
}

View File

@ -0,0 +1,51 @@
package com.das.modules.equipment.domain.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import java.io.Serializable;
/**
* 物模型动作前端回显
*
* @author guchengwei
*/
@Data
public class SysIotModelServiceExcel implements Serializable {
/**
* 所属物模型ID
*/
@ExcelProperty(value = "所属物模型名称",index = 0)
private String iotModelName;
/**
* 物模型动作编码
*/
@ExcelProperty(value = "物模型动作编码",index = 1)
private String serviceCode;
/**
* 物模型动作名称
*/
@ExcelProperty(value = "物模型动作名称",index = 2)
private String serviceName;
/**
* 动作类型
*/
@ExcelProperty(value = "动作类型",index = 3)
private Integer serviceType;
/**
* 测点序号
*/
@ExcelProperty(value = "测点序号",index = 4)
private Integer porder;
}

View File

@ -43,6 +43,6 @@ public class SysIotModelFieldVo {
*/
private Integer porder;
private Integer version;
private Integer revision;
}

View File

@ -43,6 +43,6 @@ public class SysIotModelServiceVo {
*/
private Integer porder;
private Integer version;
private Integer revision;
}

View File

@ -2,10 +2,20 @@ package com.das.modules.equipment.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.das.modules.equipment.domain.excel.SysIotModelFieldExcel;
import com.das.modules.equipment.domain.excel.SysIotModelServiceExcel;
import com.das.modules.equipment.domain.vo.SysIotModelFieldVo;
import com.das.modules.equipment.domain.vo.SysIotModelServiceVo;
import com.das.modules.equipment.entity.SysIotModel;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface SysIotModelMapper extends BaseMapper<SysIotModel> {
List<SysIotModelFieldExcel> queryFieldByModelId(Long id);
List<SysIotModelServiceExcel> queryServiceByModelId(Long id);
}

View File

@ -6,6 +6,8 @@ import com.das.modules.equipment.domain.dto.SysIotModelServiceDto;
import com.das.modules.equipment.domain.vo.SysIotModelFieldVo;
import com.das.modules.equipment.domain.vo.SysIotModelServiceVo;
import com.das.modules.equipment.domain.vo.SysIotModelVo;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
@ -34,4 +36,6 @@ public interface SysIotModelService {
void deleteSysIotModelService(SysIotModelServiceDto sysIotModelServiceDto);
void exportSysIotModel(SysIotModelDto sysIotModelDto, HttpServletRequest request, HttpServletResponse response);
}

View File

@ -5,10 +5,14 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.das.common.config.SessionUtil;
import com.das.common.exceptions.ServiceException;
import com.das.common.utils.BeanCopyUtils;
import com.das.common.utils.ExcelUtil;
import com.das.modules.auth.domain.vo.SysUserVo;
import com.das.modules.equipment.domain.excel.SheetInfoBean;
import com.das.modules.equipment.domain.dto.SysIotModelDto;
import com.das.modules.equipment.domain.dto.SysIotModelFieldDto;
import com.das.modules.equipment.domain.dto.SysIotModelServiceDto;
import com.das.modules.equipment.domain.excel.SysIotModelFieldExcel;
import com.das.modules.equipment.domain.excel.SysIotModelServiceExcel;
import com.das.modules.equipment.domain.vo.SysIotModelFieldVo;
import com.das.modules.equipment.domain.vo.SysIotModelServiceVo;
import com.das.modules.equipment.domain.vo.SysIotModelVo;
@ -19,6 +23,8 @@ import com.das.modules.equipment.mapper.SysIotModelFieldMapper;
import com.das.modules.equipment.mapper.SysIotModelMapper;
import com.das.modules.equipment.mapper.SysIotModelServiceMapper;
import com.das.modules.equipment.service.SysIotModelService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -67,14 +73,6 @@ public class SysIotModelServiceImpl implements SysIotModelService {
public SysIotModelVo updateSysIotModel(SysIotModelDto sysIotModelDto) {
SysIotModel sysIotModel = new SysIotModel();
BeanCopyUtils.copy(sysIotModelDto,sysIotModel);
QueryWrapper<SysIotModel> sysIotModelQueryWrapper = new QueryWrapper<>();
sysIotModelQueryWrapper.eq("iot_model_code", sysIotModelDto.getIotModelCode());
sysIotModelQueryWrapper.eq("id", sysIotModelDto.getId());
SysIotModel sysIotModelQuery = sysIotModelMapper.selectOne(sysIotModelQueryWrapper);
if (!(sysIotModelQuery == null)){
throw new ServiceException("更新的物模型编码code重复");
}
SysUserVo sysUserVo = (SysUserVo) StpUtil.getTokenSession().get(SessionUtil.SESSION_USER_KEY);
sysIotModel.setUpdatedTime(new Date());
sysIotModel.setUpdatedBy(sysUserVo.getAccount());
@ -116,7 +114,7 @@ public class SysIotModelServiceImpl implements SysIotModelService {
public List<SysIotModelFieldVo> querySysIotModelField(SysIotModelFieldDto sysIotModelFieldDto) {
List<SysIotModelFieldVo> sysIotModelFieldVoList = new ArrayList<>();
QueryWrapper<SysIotModelField> sysIotModelFieldQueryWrapper = new QueryWrapper<>();
sysIotModelFieldQueryWrapper.like("iot_model_id",sysIotModelFieldDto.getIotModelId());
sysIotModelFieldQueryWrapper.eq("iot_model_id",sysIotModelFieldDto.getIotModelId());
List<SysIotModelField> sysIotModelFields = sysIotModelFieldMapper.selectList(sysIotModelFieldQueryWrapper);
for (SysIotModelField item : sysIotModelFields){
SysIotModelFieldVo sysIotModelVo = new SysIotModelFieldVo();
@ -154,14 +152,6 @@ public class SysIotModelServiceImpl implements SysIotModelService {
public SysIotModelFieldVo updateSysIotModelField(SysIotModelFieldDto sysIotModelFieldDto) {
SysIotModelField sysIotModelField = new SysIotModelField();
BeanCopyUtils.copy(sysIotModelFieldDto,sysIotModelField);
QueryWrapper<SysIotModelField> sysIotModelFieldQueryWrapper = new QueryWrapper<>();
sysIotModelFieldQueryWrapper.eq("attribute_code", sysIotModelFieldDto.getAttributeCode());
sysIotModelFieldQueryWrapper.eq("id", sysIotModelFieldDto.getId());
SysIotModelField sysIotModelFieldQuery = sysIotModelFieldMapper.selectOne(sysIotModelFieldQueryWrapper);
if (!(sysIotModelFieldQuery == null)){
throw new ServiceException("物模型属性修改的code已经存在");
}
SysUserVo sysUserVo = (SysUserVo) StpUtil.getTokenSession().get(SessionUtil.SESSION_USER_KEY);
sysIotModelField.setUpdatedTime(new Date());
sysIotModelField.setUpdatedBy(sysUserVo.getAccount());
@ -181,7 +171,7 @@ public class SysIotModelServiceImpl implements SysIotModelService {
public List<SysIotModelServiceVo> querySysIotModelService(SysIotModelServiceDto sysIotModelServiceDto) {
List<SysIotModelServiceVo> sysIotModelServiceVoList = new ArrayList<>();
QueryWrapper<SysIotModelServices> sysIotModelServicesQueryWrapper = new QueryWrapper<>();
sysIotModelServicesQueryWrapper.like("iot_model_id",sysIotModelServiceDto.getIotModelId());
sysIotModelServicesQueryWrapper.eq("iot_model_id",sysIotModelServiceDto.getIotModelId());
List<SysIotModelServices> sysIotModelServices = sysIotModelServiceMapper.selectList(sysIotModelServicesQueryWrapper);
for (SysIotModelServices item : sysIotModelServices){
SysIotModelServiceVo sysIotServiceVo = new SysIotModelServiceVo();
@ -196,10 +186,10 @@ public class SysIotModelServiceImpl implements SysIotModelService {
SysIotModelServices sysIotModelServices = new SysIotModelServices();
BeanCopyUtils.copy(sysIotModelServiceDto,sysIotModelServices);
QueryWrapper<SysIotModelField> sysIotModelFieldQueryWrapper = new QueryWrapper<>();
sysIotModelFieldQueryWrapper.eq("service_code", sysIotModelServiceDto.getServiceCode());
SysIotModelField sysIotModelFieldQuery = sysIotModelFieldMapper.selectOne(sysIotModelFieldQueryWrapper);
if (!(sysIotModelFieldQuery == null)){
QueryWrapper<SysIotModelServices> sysIotModelServiceQueryWrapper = new QueryWrapper<>();
sysIotModelServiceQueryWrapper.eq("service_code", sysIotModelServiceDto.getServiceCode());
SysIotModelServices sysIotModelServiceQuery = sysIotModelServiceMapper.selectOne(sysIotModelServiceQueryWrapper);
if (!(sysIotModelServiceQuery == null)){
throw new ServiceException("物模型动作code已经存在");
}
SysUserVo sysUserVo = (SysUserVo) StpUtil.getTokenSession().get(SessionUtil.SESSION_USER_KEY);
@ -219,14 +209,6 @@ public class SysIotModelServiceImpl implements SysIotModelService {
public SysIotModelServiceVo updateSysIotModelService(SysIotModelServiceDto sysIotModelServiceDto) {
SysIotModelServices sysIotModelServices = new SysIotModelServices();
BeanCopyUtils.copy(sysIotModelServiceDto,sysIotModelServices);
QueryWrapper<SysIotModelField> sysIotModelFieldQueryWrapper = new QueryWrapper<>();
sysIotModelFieldQueryWrapper.eq("service_code", sysIotModelServiceDto.getServiceCode());
sysIotModelFieldQueryWrapper.eq("id", sysIotModelServiceDto.getId());
SysIotModelField sysIotModelFieldQuery = sysIotModelFieldMapper.selectOne(sysIotModelFieldQueryWrapper);
if (!(sysIotModelFieldQuery == null)){
throw new ServiceException("物模型动作更新code已经存在");
}
SysUserVo sysUserVo = (SysUserVo) StpUtil.getTokenSession().get(SessionUtil.SESSION_USER_KEY);
sysIotModelServices.setUpdatedTime(new Date());
sysIotModelServices.setUpdatedBy(sysUserVo.getAccount());
@ -242,4 +224,20 @@ public class SysIotModelServiceImpl implements SysIotModelService {
sysIotModelServiceMapper.deleteById(sysIotModelServiceDto.getId());
}
@Override
public void exportSysIotModel(SysIotModelDto sysIotModelDto, HttpServletRequest request, HttpServletResponse response) {
// 查询物模型属性和动作
List<SysIotModelFieldExcel> sysIotModelFieldVoList = sysIotModelMapper.queryFieldByModelId(sysIotModelDto.getId());
List<SysIotModelServiceExcel> sysIotModelServiceVoList = sysIotModelMapper.queryServiceByModelId(sysIotModelDto.getId());
SysIotModel sysIotModel = sysIotModelMapper.selectById(sysIotModelDto.getId());
String fileName = sysIotModel.getIotModelName()+":物模型信息表";
List<SheetInfoBean> sheetInfoBeanList = new ArrayList<>();
SheetInfoBean sheetInfoBean1 = new SheetInfoBean("物模型属性", SysIotModelFieldExcel.class, sysIotModelFieldVoList);
SheetInfoBean sheetInfoBean2 = new SheetInfoBean("物模型动作", SysIotModelServiceExcel.class, sysIotModelServiceVoList);
sheetInfoBeanList.add(sheetInfoBean1);
sheetInfoBeanList.add(sheetInfoBean2);
ExcelUtil.exportMoreSheet(fileName,request,response,sheetInfoBeanList);
}
}

View File

@ -0,0 +1,31 @@
<?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.das.modules.equipment.mapper.SysIotModelMapper">
<resultMap type="com.das.modules.equipment.domain.excel.SysIotModelServiceExcel" id="SysIotModelServiceMap">
<result property="iotModelName" column="iotModelName" jdbcType="VARCHAR"/>
<result property="serviceCode" column="service_code" jdbcType="VARCHAR"/>
<result property="serviceName" column="service_name" jdbcType="VARCHAR"/>
<result property="serviceType" column="service_type" jdbcType="INTEGER"/>
<result property="porder" column="porder" jdbcType="INTEGER"/>
</resultMap>
<resultMap type="com.das.modules.equipment.domain.excel.SysIotModelFieldExcel" id="SysIotModelFieldMap">
<result property="iotModelName" column="iotModelName" jdbcType="VARCHAR"/>
<result property="attributeCode" column="attribute_code" jdbcType="VARCHAR"/>
<result property="attributeName" column="attribute_name" jdbcType="VARCHAR"/>
<result property="attributeType" column="attribute_type" jdbcType="INTEGER"/>
<result property="porder" column="porder" jdbcType="INTEGER"/>
</resultMap>
<select id="queryFieldByModelId" resultMap="SysIotModelFieldMap">
select simf.*,sim.iot_model_name as iotModelName from sys_iot_model_field simf left join sys_iot_model sim on simf.iot_model_id = sim.id
where simf.iot_model_id = #{id}
</select>
<select id="queryServiceByModelId" resultMap="SysIotModelServiceMap">
select sims.*,sim.iot_model_name as iotModelName from sys_iot_model_service sims left join sys_iot_model sim on sims.iot_model_id = sim.id
where sims.iot_model_id = #{id}
</select>
</mapper>

View File

@ -1,14 +1,40 @@
@use 'sass:math';
@use 'sass:map';
@mixin set-css-var-value($name, $value) {
#{joinVarName($name)}: #{$value};
}
@function joinVarName($list) {
$name: '--ba';
@each $item in $list {
@if $item != '' {
$name: $name + '-' + $item;
@if $item !='' {
$name: '#{$name}-#{$item}';
}
}
@return $name;
}
@mixin set-css-var-value2($name, $value) {
@if $value=='' {}
@else {
#{joinVarName2($name)}: #{$value};
}
}
@function joinVarName2($list) {
$name: '--el';
@each $item in $list {
@if $item !='' {
$name: #{$name}+'-'+#{$item};
}
}
@return $name;
}
@ -20,11 +46,27 @@
* 通过映射设置所有的CSS变量
*/
@mixin set-component-css-var($name, $variables) {
@each $attribute, $value in $variables {
@if $attribute == 'default' {
@each $attribute,
$value in $variables {
@if $attribute =='default' {
#{getCssVarName($name)}: #{$value};
} @else {
}
@else {
#{getCssVarName($name, $attribute)}: #{$value};
}
}
}
@mixin set-css-color-type($colors, $type) {
@include set-css-var-value2(('color', $type), map.get($colors, $type, 'base'));
@each $i in (3, 5, 7, 8, 9) {
@include set-css-var-value2(('color', $type, 'light', $i),
map.get($colors, $type, 'light-#{$i}'));
}
@include set-css-var-value2(('color', $type, 'dark-2'),
map.get($colors, $type, 'dark-2'));
}

View File

@ -17,6 +17,8 @@ $colors: map.deep-merge(( // 白色和黑色作为基本颜色选项
),
'warning': ('base': #e6a23c,
),
'danger': ('base': #f56c6c,
),
'error': ('base': #f56c6c,
),
'info': ('base': #909399,
@ -33,38 +35,45 @@ $color-black: map.get($colors, 'black') !default; // 黑色
$color-primary: map.get($colors, 'primary', 'base') !default; // 主要颜色默认使用'base'色调
$color-success: map.get($colors, 'success', 'base') !default; // 成功状态颜色默认使用'base'色调
$color-warning: map.get($colors, 'warning', 'base') !default; // 警告状态颜色默认使用'base'色调
$color-danger: map.get($colors, 'danger', 'base') !default;
$color-error: map.get($colors, 'error', 'base') !default; // 错误状态颜色默认使用'base'色调
$color-info: map.get($colors, 'info', 'base') !default; // 信息状态颜色默认使用'base'色调
// @mixin set-color-mix-level($type,
// $number,
// $mode: 'light',
// $mix-color: $color-white) {
// $colors: map.deep-merge(($type: ('#{$mode}-#{$number}': mix($mix-color,
// map.get($colors, $type, 'base'),
// math.percentage(math.div($number, 10))),
// ),
// ),
// $colors ) !global;
// }
// @mixin set-css-color-type($colors, $type) {
// @include set-css-var-value(('color', $type), map.get($colors, $type, 'base'));
@mixin set-color-mix-level($type,
$number,
$mode: 'light',
$mix-color: $color-white) {
$colors: map.deep-merge(($type: ('#{$mode}-#{$number}': mix($mix-color,
map.get($colors, $type, 'base'),
math.percentage(math.div($number, 10))),
),
),
$colors ) !global;
}
// @each $i in (3, 5, 7, 8, 9) {
// @include set-css-var-value(('color', $type, 'light', $i),
// map.get($colors, $type, 'light-#{$i}'));
// }
// $colors.primary.light-i
// --el-color-primary-light-i
// 10% 53a8ff
// 20% 66b1ff
// 30% 79bbff
// 40% 8cc5ff
// 50% a0cfff
// 60% b3d8ff
// 70% c6e2ff
// 80% d9ecff
// 90% ecf5ff
@each $type in $types {
@for $i from 1 through 9 {
@include set-color-mix-level($type, $i, 'light', $color-white);
}
}
// @include set-css-var-value(('color', $type, 'dark-2'),
// map.get($colors, $type, 'dark-2'));
// }
// --el-color-primary-dark-2
@each $type in $types {
@include set-color-mix-level($type, 2, 'dark', $color-black);
}
// @each $type in $types {
// @for $i from 1 through 9 {
// @include set-color-mix-level($type, $i, 'light', $color-white);
// }
// }
// // --el-color-primary-dark-2
// @each $type in $types {
@ -95,11 +104,11 @@ $border-color: map.merge(('': #f6f6f6,
:root {
--el-color-primary: #0064AA !important;
// --el-color-primary: #0064AA !important;
// @each $type in $types {
// @include set-css-color-type($colors, $type);
// }
@each $type in $types {
@include set-css-color-type($colors, $type);
}
@include set-css-var-value('main-space', $main-space);
@include set-css-var-value('color-primary-light', $primary-light);

View File

@ -12,7 +12,7 @@ export function mainHeight(extra = 0): CSSProperties {
let height = extra
const adminLayoutMainExtraHeight: anyObj = {
Default: 70,
Classic: 148,
Classic: 150,
Streamline: 60,
}
if (isAdminApp()) {

View File

@ -0,0 +1,793 @@
<template>
<!-- 设备 -->
<div class="ba-user-container">
<el-container class="defaultContainer">
<el-aside class="defaultAside">
<el-main class="treeMain">
<el-tree
style="max-width: 600px; margin-top: 2.2%"
:data="userData"
:props="defaultProps"
node-key="id"
:load="loadNode"
lazy
@node-click="handleNodeClick"
/>
</el-main>
</el-aside>
<el-container class="defaultMainContainer">
<el-header class="defaultHeader">
<el-space>
<el-input v-model="headerForm.searchFor"></el-input>
<el-radio-group v-model="headerForm.resource">
<el-radio value="1" label="名称"></el-radio>
<el-radio value="2" label="编码"></el-radio>
</el-radio-group>
<el-button type="primary" :icon="Search" class="defaultBtn">查询</el-button>
</el-space>
<div style="display: flex; align-items: center">
<div>
<el-button size="large" :icon="CirclePlusFilled" type="primary" class="defaultBtn" @click="addDeviceList">新增</el-button>
</div>
<div>
<el-upload
v-model:file-list="fileList"
class="upload-demo"
action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
multiple
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
:limit="3"
:on-exceed="handleExceed"
style="margin: 0 10px 0 10px; display: flex; align-items: center"
>
<el-button size="large" :icon="Upload" style="display: flex; align-items: center" class="defaultBtn">导入</el-button>
</el-upload>
</div>
<div>
<el-button size="large" :icon="Download" class="defaultBtn">导出</el-button>
</div>
</div>
</el-header>
<el-main class="defaultMain">
<el-table ref="multipleTableRef" :data="deviceList" class="tablePart">
<el-table-column type="selection" />
<el-table-column property="account" label="设备名称" />
<el-table-column property="userName" label="设备编码" />
<el-table-column property="userName" label="生产厂家" />
<el-table-column property="userName" label="资产性质" />
<el-table-column property="address" label="操作">
<template #default="scope">
<span style="color: #0064aa; cursor: pointer" @click="viewDeviceDetails">查看 </span>
<span style="color: #0064aa"> | </span>
<span style="color: #0064aa; cursor: pointer" @click=""> 删除 </span>
<span style="color: #0064aa"> | </span>
<span style="color: #0064aa; cursor: pointer"> 门户 </span>
<span style="color: #0064aa"> | </span>
<span style="color: #0064aa; cursor: pointer"> 密码</span>
</template>
</el-table-column>
</el-table>
</el-main>
</el-container>
<!-- 查看设备详情页面 -->
<el-dialog v-model="editDeviceDialog" title="编辑设备台账" width="1000" :before-close="handleCloseEditDevice">
<el-form
ref="modifyDeviceDetails"
:inline="true"
label-width="auto"
:model="editDeviceData"
:rules="editDeviceRules"
style="padding: 20px 33px; font-size: 14px; line-height: 1.5; word-wrap: break-word; font-size: 20px"
>
<el-row>
<el-col :span="12">
<el-form-item label="设备类型:">
<el-select v-model="editDeviceData.object_type" placeholder="Select" style="width: 190px">
<el-option v-for="item in TypeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="物模型ID:">
<el-select v-model="editDeviceData.objectModelId" placeholder="Select" style="width: 190px">
<el-option v-for="item in TypeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="设备名称:" prop="name">
<el-input v-model="editDeviceData.name" placeholder="请输入设备名称" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备编码:" prop="code">
<el-input v-model="editDeviceData.code" placeholder="请输入设备编码" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="管理部门:" prop="administrative">
<el-tree-select
v-model="editDeviceData.administrative"
:data="data"
:render-after-expand="false"
style="width: 190px"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="状态标识" prop="statusIdentification">
<el-select v-model="editDeviceData.statusIdentification" placeholder="Select" style="width: 190px">
<el-option v-for="item in TypeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="生产厂家:">
<el-input v-model="editDeviceData.manufacturer" placeholder="请输入生产厂家" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规格型号:">
<el-input v-model="editDeviceData.specification" placeholder="请输入规格型号" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="出厂日期:">
<el-date-picker
v-model="editDeviceData.productionData"
type="date"
style="width: 190px"
placeholder="请输入出厂日期"
:size="size"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="出厂编号:">
<el-input v-model="editDeviceData.startNumber" placeholder="请输入出厂编号" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="物资编号:">
<el-input v-model="editDeviceData.itemNumber" placeholder="请输入物资编号" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="资产性质:">
<el-input v-model="editDeviceData.assetNature" placeholder="请输入资产性质" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="设备等级:">
<el-input v-model="editDeviceData.equipmentLevel" placeholder="请输入设备等级" clearable />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="editDeviceDialog = false"> 取消 </el-button>
<el-button @click="saveData">保存</el-button>
</div>
</template>
</el-dialog>
<!-- 新增设备详情页面 -->
<el-dialog v-model="editAddDeviceDialog" title="新增设备台账" width="1000" :before-close="handleCloseAddEditDevice">
<el-form
ref="modifyAddDeviceDetails"
:inline="true"
label-width="auto"
:model="editAddDeviceData"
:rules="editAddDeviceRules"
style="padding: 20px 33px; font-size: 14px; line-height: 1.5; word-wrap: break-word; font-size: 20px"
>
<el-row>
<el-col :span="12">
<el-form-item label="设备类型:">
<el-select v-model="editDeviceData.object_type" placeholder="Select" style="width: 190px">
<el-option v-for="item in TypeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="物模型ID:">
<el-select v-model="editDeviceData.objectModelId" placeholder="Select" style="width: 190px">
<el-option v-for="item in TypeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="设备名称:" prop="name">
<el-input v-model="editAddDeviceData.name" placeholder="请输入设备名称" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备编码:" prop="code">
<el-input v-model="editAddDeviceData.code" placeholder="请输入设备编码" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="管理部门:" prop="administrative">
<el-tree-select
v-model="editAddDeviceData.administrative"
:data="data"
:render-after-expand="false"
style="width: 190px"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="状态标识" prop="statusIdentification">
<el-select v-model="editAddDeviceData.statusIdentification" placeholder="Select" style="width: 190px">
<el-option v-for="item in TypeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="生产厂家:">
<el-input v-model="editAddDeviceData.manufacturer" placeholder="请输入生产厂家" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规格型号:">
<el-input v-model="editAddDeviceData.specification" placeholder="请输入规格型号" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="出厂日期:">
<el-date-picker
v-model="editAddDeviceData.productionData"
type="date"
style="width: 190px"
placeholder="请输入出厂日期"
:size="size"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="出厂编号:">
<el-input v-model="editAddDeviceData.startNumber" placeholder="请输入出厂编号" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="投运日期:">
<el-date-picker
v-model="editAddDeviceData.itemNumber"
type="date"
style="width: 190px"
placeholder="请输入投运日期"
:size="size"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="安装位置:">
<el-input v-model="editAddDeviceData.installationPosition" placeholder="请输入安装位置" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="额定电压(kV):">
<el-input v-model="editAddDeviceData.ratedVoltage" placeholder="请输入额定电压" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="额定电流(A):">
<el-input v-model="editAddDeviceData.ratedCurrent" placeholder="请输入额定电流" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="额定功率(kW):">
<el-input v-model="editAddDeviceData.ratedPower" placeholder="请输入额定功率" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="站控KEY:">
<el-input v-model="editAddDeviceData.stationControlKey" placeholder="请输入站控KEY" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="分类:">
<el-select v-model="editAddDeviceData.classification" placeholder="Select" style="width: 190px">
<el-option v-for="item in TypeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="editAddDeviceDialog = false"> 取消 </el-button>
<el-button @click="saveAddData">保存</el-button>
</div>
</template>
</el-dialog>
</el-container>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
import { Search, CirclePlusFilled, Upload, Download } from '@element-plus/icons-vue'
import { userList } from '/@/api/backend'
import { ElTable, ElMessage, ElMessageBox } from 'element-plus'
import type { UploadProps, UploadUserFile } from 'element-plus'
import type Node from 'element-plus/es/components/tree/src/model/node'
interface Tree {
label: string
children?: Tree[]
id: string
}
//
const treeQuery = reactive({
parentOrgId: '',
})
const userData = ref()
const getTree = () => {
console.log(treeQuery, 'treeQuery')
userList(treeQuery).then((res) => {
console.log(res, '树')
userData.value = res.data
})
}
onMounted(() => {
getTree()
})
const formQuery = reactive({
orgId: '',
recursive: false,
pageSize: 10,
pageNum: 1,
})
const treeId = ref()
const handleNodeClick = (data: Tree) => {
console.log(data.id, 'data')
treeId.value = data.id
formQuery.orgId = data.id
console.log(formQuery, 444444444)
}
const loadNode = (node: Node, resolve: (data: Tree[]) => void) => {
if (node.level === 0) {
return resolve([])
}
const treeQuery = reactive({
parentOrgId: node.data.id,
})
userList(treeQuery)
.then((res) => {
console.log(res, '树')
// userData.value = res.data
return resolve(res.data)
})
.catch((err) => {
console.log(err)
})
}
const defaultProps = {
children: 'children',
label: 'name',
}
//
const headerForm = reactive({
searchFor: '',
resource: '2',
})
const addDeviceList = () => {
editAddDeviceDialog.value = true
}
const fileList = ref<UploadUserFile[]>([
{
name: 'element-plus-logo.svg',
url: 'https://element-plus.org/images/element-plus-logo.svg',
},
{
name: 'element-plus-logo2.svg',
url: 'https://element-plus.org/images/element-plus-logo.svg',
},
])
const handleRemove: UploadProps['onRemove'] = (file, uploadFiles) => {
console.log(file, uploadFiles)
}
const handlePreview: UploadProps['onPreview'] = (uploadFile) => {
console.log(uploadFile)
}
const handleExceed: UploadProps['onExceed'] = (files, uploadFiles) => {
ElMessage.warning(`The limit is 3, you selected ${files.length} files this time, add up to ${files.length + uploadFiles.length} totally`)
}
const beforeRemove: UploadProps['beforeRemove'] = (uploadFile, uploadFiles) => {
return ElMessageBox.confirm(`Cancel the transfer of ${uploadFile.name} ?`).then(
() => true,
() => false
)
}
const deviceList = [
[
{
date: '2016-05-03',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles',
},
{
date: '2016-05-02',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles',
},
{
date: '2016-05-04',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles',
},
{
date: '2016-05-01',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles',
},
],
]
//
const editDeviceDialog = ref(false)
const editDeviceData = reactive({
object_type: '',
objectModelId: '',
name: '',
code: '',
administrative: '',
statusIdentification: '',
manufacturer: '',
specification: '',
productionData: '',
startNumber: '',
itemNumber: '',
assetNature: '',
equipmentLevel: '',
})
const TypeOptions = [
{
value: 'Option1',
label: 'Option1',
},
{
value: 'Option2',
label: 'Option2',
},
{
value: 'Option3',
label: 'Option3',
},
{
value: 'Option4',
label: 'Option4',
},
{
value: 'Option5',
label: 'Option5',
},
]
const data = [
{
value: '1',
label: 'Level one 1',
children: [
{
value: '1-1',
label: 'Level two 1-1',
children: [
{
value: '1-1-1',
label: 'Level three 1-1-1',
},
],
},
],
},
{
value: '2',
label: 'Level one 2',
children: [
{
value: '2-1',
label: 'Level two 2-1',
children: [
{
value: '2-1-1',
label: 'Level three 2-1-1',
},
],
},
{
value: '2-2',
label: 'Level two 2-2',
children: [
{
value: '2-2-1',
label: 'Level three 2-2-1',
},
],
},
],
},
{
value: '3',
label: 'Level one 3',
children: [
{
value: '3-1',
label: 'Level two 3-1',
children: [
{
value: '3-1-1',
label: 'Level three 3-1-1',
},
],
},
{
value: '3-2',
label: 'Level two 3-2',
children: [
{
value: '3-2-1',
label: 'Level three 3-2-1',
},
],
},
],
},
]
const size = ref<'default' | 'large' | 'small'>('default')
const handleCloseEditDevice = () => {
editDeviceDialog.value = false
}
const viewDeviceDetails = () => {
editDeviceDialog.value = true
}
const editDeviceRules = reactive({
name: [
{
required: true,
message: '设备名称不能为空',
trigger: 'blur',
},
],
code: [
{
required: true,
message: '设备编码不能为空',
trigger: 'blur',
},
],
administrative: [
{
required: true,
message: '管理部门不能为空',
trigger: 'blur',
},
],
statusIdentification: [
{
required: true,
message: '状态标识不能为空',
trigger: 'blur',
},
],
})
const modifyDeviceDetails = ref()
const saveData = () => {
modifyDeviceDetails.value.validate((valid: any) => {
if (valid) {
editDeviceDialog.value = false
} else {
console.log('error submit!!')
return false
}
})
}
//
const editAddDeviceData = reactive({
object_type: '',
objectModelId: '',
name: '',
code: '',
administrative: '',
statusIdentification: '',
manufacturer: '',
specification: '',
productionData: '',
startNumber: '',
itemNumber: '',
installationPosition: '',
ratedVoltage: '',
ratedCurrent: '',
ratedPower: '',
stationControlKey: '',
classification: '',
})
const editAddDeviceRules = reactive({
name: [
{
required: true,
message: '设备名称不能为空',
trigger: 'blur',
},
],
code: [
{
required: true,
message: '设备编码不能为空',
trigger: 'blur',
},
],
administrative: [
{
required: true,
message: '管理部门不能为空',
trigger: 'blur',
},
],
statusIdentification: [
{
required: true,
message: '状态标识不能为空',
trigger: 'blur',
},
],
})
const editAddDeviceDialog = ref(false)
const modifyAddDeviceDetails = ref()
const saveAddData = () => {
modifyAddDeviceDetails.value.validate((valid: any) => {
if (valid) {
editAddDeviceDialog.value = false
}
})
}
const handleCloseAddEditDevice = () => {
editAddDeviceDialog.value = false
}
</script>
<style scoped lang="scss">
.el-col {
// border-radius: 4px;
background-color: #fff;
}
@mixin searchInput($value) {
margin-right: $value;
width: 220px;
height: 40px;
}
$defaultHeaderHeight: 60px;
$defaultMainHeight: calc(100% - 60px);
$paginationHeight: 32px;
.ba-user-container {
width: 100%;
height: 100%;
// background-color: #fff;
.defaultContainer {
height: 100%;
.defaultAside {
width: 260px;
height: 100%;
border-right: 1px solid #eaebed;
.treeHeader {
display: flex;
align-items: center;
justify-content: center;
height: $defaultHeaderHeight;
.searchInput {
@include searchInput(0);
}
}
.treeMain {
height: $defaultMainHeight;
.treePart {
height: 100%;
}
}
}
.defaultMainContainer {
height: 100%;
.defaultHeader {
display: flex;
justify-content: space-between;
align-items: center;
height: $defaultHeaderHeight;
.searchPart {
display: flex;
justify-content: space-between;
align-items: center;
}
.defaultBtn {
width: 88px;
height: 40px;
}
.searchInput {
@include searchInput(10px);
}
}
.defaultMain {
height: $defaultMainHeight;
.tablePart {
height: calc(100% - $paginationHeight);
}
.tableOperate {
display: flex;
justify-content: center;
align-items: center;
a {
margin: 5px;
color: #0064aa;
font-weight: 600;
&:hover {
cursor: pointer;
}
}
}
}
}
}
}
</style>

View File

@ -208,7 +208,7 @@
<script setup lang="ts">
import { ref, reactive, onMounted, computed } from 'vue'
import { Search, CirclePlusFilled } from '@element-plus/icons-vue'
import { userQuery, userUpdate, userDelete, userAdd, userList, allRoleQuery, userChangePassword } from '/@/api/backend'
import { userQuery, userUpdate, userDelete, userAdd, userList, allRoleQuery } from '/@/api/backend'
import { ElTable, ElMessage, FormRules } from 'element-plus'
import type Node from 'element-plus/es/components/tree/src/model/node'
import Avatar from '/@/views/backend/userInfo/avatar.vue'
@ -408,6 +408,7 @@ const formUserUpData = reactive({
id: '',
account: '',
userName: '',
password: '',
email: '',
phone: '',
orgId: '',
@ -415,11 +416,12 @@ const formUserUpData = reactive({
profilePicture: '',
})
const viewUsers = (data: any) => {
console.log(data, '页面修改数据1')
console.log(data, '页面修改数据1')
formRef.value?.resetFields()
visibleParamUpData.value = true
formUserUpData.id = data.row.id
formUserUpData.account = data.row.account
formUserUpData.password = ''
formUserUpData.userName = data.row.userName
formUserUpData.email = data.row.email
formUserUpData.phone = data.row.phone
@ -428,12 +430,11 @@ const viewUsers = (data: any) => {
return item.id
})
formUserUpData.profilePicture = data.row.profilePicture
}
const upDataOnSubmit = () => {
formRef.value.validate((valid: any) => {
if (valid) {
console.log(formUserUpData, formUserUpData.roleList, 'formUserUpData')
console.log(formUserUpData, formUserUpData.password, 'formUserUpData')
userUpdate(formUserUpData).then((res) => {
if (res.code == 200) {
@ -563,18 +564,20 @@ const changePassWordData = reactive({
const passWordUpdata = () => {
ChangePasswordFrom.value.validate((valid: any) => {
if (valid) {
userChangePassword(changePassWordData)
.then((res) => {
if (res.code == 200) {
ElMessage.success('修改成功')
passWordDialog.value = false
} else {
ElMessage.error(res.msg)
}
})
.catch(() => {
ElMessage.error('修改失败')
})
// userChangePassword(changePassWordData)
// .then((res) => {
// if (res.code == 200) {
// ElMessage.success('')
// passWordDialog.value = false
// } else {
// ElMessage.error(res.msg)
// }
// })
// .catch(() => {
// ElMessage.error('')
// })
formUserUpData.password = passWordProp.newPassword
passWordDialog.value = false
}
})
}