rev:设备监控

Signed-off-by: jiaoliming <dawnjiao@foxmail.com>
This commit is contained in:
jiaoliming
2023-09-01 10:32:04 +08:00
parent 1a2dcfc24c
commit f3e26048f2
16 changed files with 2422 additions and 0 deletions

View File

@@ -0,0 +1,106 @@
package org.nl.acs.stage.rest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.stage.service.NewStageActorService;
import org.nl.acs.stage.service.dto.StageActorDto;
import org.nl.modules.logging.annotation.Log;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
/**
* @author jlm
* @date 2021-04-12
**/
@RestController
@RequiredArgsConstructor
@Api(tags = "舞台演员管理")
@RequestMapping("/api/new/stageActor")
@Slf4j
public class NewStageActorController {
private final NewStageActorService stageActorService;
@GetMapping
@Log("查询舞台演员")
@ApiOperation("查询舞台演员")
//@PreAuthorize("@el.check('stageActor:list')")
public ResponseEntity<Object> query(@RequestParam Map whereJson, Pageable page) {
return new ResponseEntity<>(stageActorService.queryAll(whereJson, page), HttpStatus.OK);
}
@PostMapping
@Log("新增舞台演员")
@ApiOperation("新增舞台演员")
//@PreAuthorize("@el.check('stageActor:add')")
public ResponseEntity<Object> create(@Validated @RequestBody StageActorDto dto) {
stageActorService.create(dto);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@PutMapping
@Log("修改舞台演员")
@ApiOperation("修改舞台演员")
//@PreAuthorize("@el.check('stageActor:edit')")
public ResponseEntity<Object> update(@Validated @RequestBody StageActorDto dto) {
stageActorService.update(dto);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@Log("删除舞台演员")
@ApiOperation("删除舞台演员")
//@PreAuthorize("@el.check('stageActor:del')")
@DeleteMapping
public ResponseEntity<Object> delete(@RequestBody String[] ids) {
stageActorService.deleteAll(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@Log("导出舞台演员")
@ApiOperation("导出舞台演员")
@GetMapping(value = "/download")
//@PreAuthorize("@el.check('stageActor:list')")
public void download(HttpServletResponse response, Map whereJson) throws IOException {
stageActorService.download(stageActorService.queryAll(whereJson), response);
}
@PostMapping("/saveData")
@Log("保存舞台演员")
@ApiOperation("修改舞台演员")
//@PreAuthorize("@el.check('stageActor:edit')")
public ResponseEntity<Object> saveData(@RequestBody Map map) throws IOException {
String stage_code = (String) map.get("stage_code");
String grid_width = String.valueOf(map.get("grid_width"));
String grid_length = String.valueOf(map.get("grid_length"));
JSONArray actors = JSONArray.parseArray(JSON.toJSONString(map.get("list")));
JSONObject mstForm = new JSONObject();
mstForm.put("stage_code", stage_code);
mstForm.put("grid_width", grid_width);
mstForm.put("grid_length", grid_length);
stageActorService.saveData(mstForm, actors);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@GetMapping("/queryStageActor/{stage_code}")
@Log("查询舞台演员")
@ApiOperation("查询舞台演员")
//@PreAuthorize("@el.check('stageActor:list')")
public ResponseEntity<Object> queryStageActor(@PathVariable String stage_code) throws Exception {
return new ResponseEntity<>(stageActorService.queryStageActorByStageCode(stage_code), HttpStatus.OK);
}
}

View File

@@ -0,0 +1,85 @@
package org.nl.acs.stage.rest;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.stage.service.NewStageService;
import org.nl.acs.stage.service.dto.StageDto;
import org.nl.modules.logging.annotation.Log;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
/**
* @author ldjun
* @date 2021-04-12
**/
@RestController
@RequiredArgsConstructor
@Api(tags = "舞台管理")
@RequestMapping("/api/new/stage")
@Slf4j
public class NewStageController {
private final NewStageService stageService;
@GetMapping
@Log("查询舞台")
@ApiOperation("查询舞台")
//@PreAuthorize("@el.check('stage:list')")
public ResponseEntity<Object> query(@RequestParam Map whereJson, Pageable page) {
return new ResponseEntity<>(stageService.queryAll(whereJson, page), HttpStatus.OK);
}
@PostMapping
@Log("新增舞台")
@ApiOperation("新增舞台")
//@PreAuthorize("@el.check('stage:add')")
public ResponseEntity<Object> create(@Validated @RequestBody StageDto dto) {
stageService.create(dto);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@PutMapping
@Log("修改舞台")
@ApiOperation("修改舞台")
//@PreAuthorize("@el.check('stage:edit')")
public ResponseEntity<Object> update(@Validated @RequestBody StageDto dto) {
stageService.update(dto);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@Log("删除舞台")
@ApiOperation("删除舞台")
//@PreAuthorize("@el.check('stage:del')")
@DeleteMapping
public ResponseEntity<Object> delete(@RequestBody String[] ids) {
stageService.deleteAll(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@Log("导出舞台")
@ApiOperation("导出舞台")
@GetMapping(value = "/download")
//@PreAuthorize("@el.check('stage:list')")
public void download(HttpServletResponse response, Map whereJson) throws IOException {
stageService.download(stageService.queryAll(whereJson), response);
}
@GetMapping("/selectList")
@Log("下拉选舞台")
@ApiOperation("下拉选舞台")
//@PreAuthorize("@el.check('routePlan:list')")
public ResponseEntity<Object> selectList() {
return new ResponseEntity<>(stageService.selectList(), HttpStatus.OK);
}
}

View File

@@ -0,0 +1,77 @@
package org.nl.acs.stage.rest;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.stage.service.NewStageImageService;
import org.nl.acs.stage.service.dto.StageImageDto;
import org.nl.modules.logging.annotation.Log;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
/**
* @author zhouz
* @date 2021-04-06
**/
@RestController
@RequiredArgsConstructor
@Api(tags = "舞台管理")
@RequestMapping("/api/new/stageImage")
@Slf4j
public class NewStageImageController {
private final NewStageImageService stageImageService;
@GetMapping
@Log("查询舞台")
@ApiOperation("查询舞台")
//@PreAuthorize("@el.check('stageImage:list')")
public ResponseEntity<Object> query(@RequestParam Map whereJson, Pageable page) {
return new ResponseEntity<>(stageImageService.queryAll(whereJson, page), HttpStatus.OK);
}
@PostMapping
@Log("新增舞台")
@ApiOperation("新增舞台")
//@PreAuthorize("@el.check('stageImage:add')")
public ResponseEntity<Object> create(@Validated @RequestBody StageImageDto dto) {
stageImageService.create(dto);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@PutMapping
@Log("修改舞台")
@ApiOperation("修改舞台")
//@PreAuthorize("@el.check('stageImage:edit')")
public ResponseEntity<Object> update(@Validated @RequestBody StageImageDto dto) {
stageImageService.update(dto);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@Log("删除舞台")
@ApiOperation("删除舞台")
//@PreAuthorize("@el.check('stageImage:del')")
@DeleteMapping
public ResponseEntity<Object> delete(@RequestBody String[] ids) {
stageImageService.deleteAll(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@Log("导出舞台")
@ApiOperation("导出舞台")
@GetMapping(value = "/download")
//@PreAuthorize("@el.check('stageImage:list')")
public void download(HttpServletResponse response, Map whereJson) throws IOException {
stageImageService.download(stageImageService.queryAll(whereJson), response);
}
}

View File

@@ -0,0 +1,19 @@
package org.nl.acs.stage.service;
import com.alibaba.fastjson.JSONObject;
import org.nl.acs.opc.Device;
public interface IDriverService {
/**
* 获取设备监控信息
* @param device
* @return
*/
JSONObject getDeviceInfo(Device device);
/**
* 获取db值
*/
Integer getDbValue(Device device,String dbName);
}

View File

@@ -0,0 +1,103 @@
package org.nl.acs.stage.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.nl.acs.stage.service.dto.StageActorDto;
import org.springframework.data.domain.Pageable;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* @author ldjun
* @description 服务接口
* @date 2021-04-12
**/
public interface NewStageActorService {
/**
* 查询数据分页
*
* @param whereJson 条件
* @param page 分页参数
* @return Map<String, Object>
*/
Map<String, Object> queryAll(Map whereJson, Pageable page);
/**
* 查询所有数据不分页
*
* @param whereJson 条件参数
* @return List<StageActorDto>
*/
List<StageActorDto> queryAll(Map whereJson);
/**
* 根据ID查询
*
* @param actor_uuid ID
* @return StageActor
*/
StageActorDto findById(String actor_uuid);
/**
* 根据编码查询
*
* @param code code
* @return StageActor
*/
StageActorDto findByCode(String code);
/**
* 创建
*
* @param dto /
*/
void create(StageActorDto dto);
/**
* 编辑
*
* @param dto /
*/
void update(StageActorDto dto);
/**
* 多选删除
*
* @param ids /
*/
void deleteAll(String[] ids);
/**
* 导出数据
*
* @param dtos 待导出的数据
* @param response /
* @throws IOException /
*/
void download(List<StageActorDto> dtos, HttpServletResponse response) throws IOException;
/**
* 舞台编辑时候保存数据
*
* @param mstForm 舞台编码
* @param array 舞台演员明细
* @throws IOException
*/
void saveData(JSONObject mstForm, JSONArray array) throws IOException;
/**
* 根据舞台编码查询舞台演员
*
* @param stage_code 舞台编码
* @return
*/
JSONObject queryStageActorByStageCode(String stage_code) throws Exception;
}

View File

@@ -0,0 +1,82 @@
package org.nl.acs.stage.service;
import org.nl.acs.stage.service.dto.StageImageDto;
import org.springframework.data.domain.Pageable;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* @author zhouz
* @description 服务接口
* @date 2021-04-06
**/
public interface NewStageImageService {
/**
* 查询数据分页
*
* @param whereJson 条件
* @param page 分页参数
* @return Map<String, Object>
*/
Map<String, Object> queryAll(Map whereJson, Pageable page);
/**
* 查询所有数据不分页
*
* @param whereJson 条件参数
* @return List<StageImageDto>
*/
List<StageImageDto> queryAll(Map whereJson);
/**
* 根据ID查询
*
* @param image_uuid ID
* @return StageImage
*/
StageImageDto findById(String image_uuid);
/**
* 根据编码查询
*
* @param code code
* @return StageImage
*/
StageImageDto findByCode(String code);
/**
* 创建
*
* @param dto /
*/
void create(StageImageDto dto);
/**
* 编辑
*
* @param dto /
*/
void update(StageImageDto dto);
/**
* 多选删除
*
* @param ids /
*/
void deleteAll(String[] ids);
/**
* 导出数据
*
* @param dtos 待导出的数据
* @param response /
* @throws IOException /
*/
void download(List<StageImageDto> dtos, HttpServletResponse response) throws IOException;
}

View File

@@ -0,0 +1,92 @@
package org.nl.acs.stage.service;
import com.alibaba.fastjson.JSONArray;
import org.nl.acs.stage.service.dto.StageDto;
import org.springframework.data.domain.Pageable;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* @author ldjun
* @description 服务接口
* @date 2021-04-12
**/
public interface NewStageService {
/**
* 查询数据分页
*
* @param whereJson 条件
* @param page 分页参数
* @return Map<String, Object>
*/
Map<String, Object> queryAll(Map whereJson, Pageable page);
/**
* 查询所有数据不分页
*
* @param whereJson 条件参数
* @return List<StageDto>
*/
List<StageDto> queryAll(Map whereJson);
/**
* 根据ID查询
*
* @param stage_uuid ID
* @return Stage
*/
StageDto findById(String stage_uuid);
/**
* 根据编码查询
*
* @param code code
* @return Stage
*/
StageDto findByCode(String code);
/**
* 创建
*
* @param dto /
*/
void create(StageDto dto);
/**
* 编辑
*
* @param dto /
*/
void update(StageDto dto);
/**
* 多选删除
*
* @param ids /
*/
void deleteAll(String[] ids);
/**
* 导出数据
*
* @param dtos 待导出的数据
* @param response /
* @throws IOException /
*/
void download(List<StageDto> dtos, HttpServletResponse response) throws IOException;
/**
* 前端舞台下拉选列表
*
* @return
*/
JSONArray selectList();
}

View File

@@ -0,0 +1,85 @@
package org.nl.acs.stage.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author ldjun
* @description /
* @date 2021-04-12
**/
@Data
public class StageActorDto implements Serializable {
/**
* 图标标识
*/
private String actor_uuid;
/**
* 设备编码
*/
private String device_code;
/**
* 图标名字
*/
private String device_name;
/**
* 图标名字
*/
private String image_name;
/**
* 图标名字
*/
private String angle;
/**
* 舞台标识
*/
private String stage_uuid;
/**
* 备注
*/
private String remark;
/**
* 是否启用
*/
private String is_active;
/**
* 是否删除
*/
private String is_delete;
/**
* 创建者
*/
private String create_by;
/**
* 创建时间
*/
private String create_time;
/**
* 修改者
*/
private String update_by;
/**
* 修改时间
*/
private String update_time;
/**
* 数组下标
*/
private BigDecimal index_seq;
}

View File

@@ -0,0 +1,64 @@
package org.nl.acs.stage.service.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author ldjun
* @description /
* @date 2021-04-12
**/
@Data
public class StageDto implements Serializable {
/**
* 舞台标识
*/
private String stage_uuid;
/**
* 舞台编码
*/
private String stage_code;
/**
* 舞台名字
*/
private String stage_name;
/**
* 备注
*/
private String remark;
/**
* 是否启用
*/
private String is_active;
/**
* 是否删除
*/
private String is_delete;
/**
* 创建者
*/
private String create_by;
/**
* 创建时间
*/
private String create_time;
/**
* 修改者
*/
private String update_by;
/**
* 修改时间
*/
private String update_time;
}

View File

@@ -0,0 +1,69 @@
package org.nl.acs.stage.service.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author zhouz
* @description /
* @date 2021-04-06
**/
@Data
public class StageImageDto implements Serializable {
/**
* 设备标识
*/
private String image_uuid;
/**
* 设备名字
*/
private String image_name;
/**
* 适用驱动
*/
private String driver_code_json;
/**
* 备注
*/
private String remark;
/**
* 是否启用
*/
private String is_active;
/**
* 是否删除
*/
private String is_delete;
/**
* 创建者
*/
private String create_by;
/**
* 创建时间
*/
private String create_time;
/**
* 修改者
*/
private String update_by;
/**
* 修改时间
*/
private String update_time;
/**
* 图标编码
*/
private String image_code;
}

View File

@@ -0,0 +1,273 @@
package org.nl.acs.stage.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.device.service.StorageCellService;
import org.nl.acs.monitor.DeviceStageMonitor;
import org.nl.acs.opc.Device;
import org.nl.acs.opc.DeviceAppService;
import org.nl.acs.opc.DeviceAppServiceImpl;
import org.nl.acs.stage.service.NewStageActorService;
import org.nl.acs.stage.service.dto.StageActorDto;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.common.utils.FileUtil;
import org.nl.modules.common.utils.RedisUtils;
import org.nl.modules.common.utils.SecurityUtils;
import org.nl.modules.wql.core.bean.ResultBean;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.modules.wql.util.WqlUtil;
import org.springframework.context.ApplicationContext;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.BindException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* @author ldjun
* @description 服务实现
* @date 2021-04-12
**/
@Service
@RequiredArgsConstructor
@Slf4j
public class NewStageActorServiceImpl implements NewStageActorService {
private final RedisUtils redisUtils;
private final StorageCellService storageCellService;
private final ApplicationContext applicationContext;
@Override
public Map<String, Object> queryAll(Map whereJson, Pageable page) {
WQLObject wo = WQLObject.getWQLObject("acs_stage_actor");
ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), "", "update_time desc");
final JSONObject json = rb.pageResult();
return json;
}
@Override
public List<StageActorDto> queryAll(Map whereJson) {
WQLObject wo = WQLObject.getWQLObject("acs_stage_actor");
JSONArray arr = wo.query().getResultJSONArray(0);
List<StageActorDto> list = arr.toJavaList(StageActorDto.class);
return list;
}
@Override
public StageActorDto findById(String actor_uuid) {
WQLObject wo = WQLObject.getWQLObject("acs_stage_actor");
JSONObject json = wo.query("actor_uuid ='" + actor_uuid + "'").uniqueResult(0);
final StageActorDto obj = json.toJavaObject(StageActorDto.class);
return obj;
}
@Override
public StageActorDto findByCode(String code) {
WQLObject wo = WQLObject.getWQLObject("acs_stage_actor");
JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0);
final StageActorDto obj = json.toJavaObject(StageActorDto.class);
return obj;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(StageActorDto dto) {
String currentUsername = SecurityUtils.getCurrentUsername();
String now = DateUtil.now();
dto.setActor_uuid(IdUtil.simpleUUID());
dto.setCreate_by(currentUsername);
dto.setUpdate_by(currentUsername);
dto.setUpdate_time(now);
dto.setCreate_time(now);
WQLObject wo = WQLObject.getWQLObject("acs_stage_actor");
JSONObject json = (JSONObject) JSONObject.toJSON(dto);
wo.insert(json);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(StageActorDto dto) {
StageActorDto entity = this.findById(dto.getActor_uuid());
if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!");
String currentUsername = SecurityUtils.getCurrentUsername();
String now = DateUtil.now();
dto.setUpdate_time(now);
dto.setUpdate_by(currentUsername);
WQLObject wo = WQLObject.getWQLObject("acs_stage_actor");
JSONObject json = (JSONObject) JSONObject.toJSON(dto);
wo.update(json);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteAll(String[] ids) {
WQLObject wo = WQLObject.getWQLObject("acs_stage_actor");
for (String actor_uuid : ids) {
wo.delete("actor_uuid = '" + actor_uuid + "'");
}
}
@Override
public void download(List<StageActorDto> all, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (StageActorDto stageActor : all) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("设备编码", stageActor.getDevice_code());
map.put("图标名字", stageActor.getDevice_name());
map.put("图标名字", stageActor.getImage_name());
map.put("图标名字", stageActor.getAngle());
map.put("舞台标识", stageActor.getStage_uuid());
map.put("备注", stageActor.getRemark());
map.put("是否启用", stageActor.getIs_active());
map.put("是否删除", stageActor.getIs_delete());
map.put("创建者", stageActor.getCreate_by());
map.put("创建时间", stageActor.getCreate_time());
map.put("修改者", stageActor.getUpdate_by());
map.put("修改时间", stageActor.getUpdate_time());
list.add(map);
}
FileUtil.downloadExcel(list, response);
}
@Override
public void saveData(JSONObject mstForm, JSONArray array) throws IOException {
String stage_code = mstForm.getString("stage_code");
String grid_width = mstForm.getString("grid_width");
String grid_length = mstForm.getString("grid_length");
//舞台主表【acs_stage】
WQLObject stageTab = WQLObject.getWQLObject("acs_stage");
JSONObject stageObj = stageTab.query("is_delete ='0' and stage_code = '" + stage_code + "'").uniqueResult(0);
if (ObjectUtil.isNull(stageObj)) {
throw new BindException("舞台为找到,操作失败!");
}
stageObj.put("grid_width", grid_width);
stageObj.put("grid_length", grid_length);
stageTab.update(stageObj);
//舞台实时监控表【acs_stage_actor】
WQLObject actorTab = WQLObject.getWQLObject("acs_stage_actor");
String stage_uuid = stageObj.getString("stage_uuid");
actorTab.delete("stage_uuid = '" + stage_uuid + "'");
JSONArray actors = new JSONArray();
for (int i = 0; i < array.size(); i++) {
JSONObject json = array.getJSONObject(i);
JSONObject param = new JSONObject();
param.put("actor_uuid", IdUtil.simpleUUID());
param.put("device_code", json.getString("device_code"));
param.put("device_name", json.getString("name"));
param.put("image_name", json.getString("img2"));
param.put("index_seq", json.getString("index"));
param.put("angle", json.getString("angle"));
param.put("stage_uuid", stage_uuid);
actors.add(param);
String currentUsername = SecurityUtils.getCurrentUsername();
String now = DateUtil.now();
param.put("create_by", currentUsername);
param.put("create_time", now);
param.put("update_by", currentUsername);
param.put("update_time", now);
actorTab.insert(param);
}
redisUtils.del("stage:mst:" + stage_code);
redisUtils.del("stage:dtl:" + stage_code);
redisUtils.set("stage:mst:" + stage_code, stageObj.toString());
redisUtils.set("stage:dtl:" + stage_code, actors.toString());
}
@Override
public JSONObject queryStageActorByStageCode(String stage_code) throws Exception {
//舞台主表【acs_stage】
WQLObject stageTab = WQLObject.getWQLObject("acs_stage");
JSONObject stageObj;
//先从缓存查找
stageObj = JSON.parseObject(redisUtils.get("stage:mst:" + stage_code) == null ? (String) redisUtils.get("stage:mst:" + stage_code) : redisUtils.get("stage:mst:" + stage_code).toString());
//缓存没找到去数据库查找
if (MapUtil.isEmpty(stageObj)) {
stageObj = stageTab.query("is_delete ='0' and stage_code = '" + stage_code + "'").uniqueResult(0);
}
if (MapUtil.isEmpty(stageObj)) {
throw new BindException("舞台为找到,操作失败!");
}
//舞台实时监控表【acs_stage_actor】
WQLObject actorTab = WQLObject.getWQLObject("acs_stage_actor");
String stage_uuid = stageObj.getString("stage_uuid");
JSONArray arr = new JSONArray();
JSONArray list = new JSONArray();
String dtl = (String) redisUtils.get("stage:dtl:" + stage_code);
if (StrUtil.isNotEmpty(dtl)) {
list = JSONArray.parseArray(dtl);
}
if (ObjectUtil.isNull(list) || list.size() < 1) {
list = actorTab.query("stage_uuid = '" + stage_uuid + "'", "index_seq").getResultJSONArray(0);
}
DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class);
for (int i = 0, j = list.size(); i < j; i++) {
JSONObject json = list.getJSONObject(i);
JSONObject obj = new JSONObject();
obj.put("id", json.getInteger("index"));
obj.put("index", json.getInteger("index_seq"));
obj.put("device_code", json.getString("device_code"));
String device_code = json.getString("device_code");
if (!StrUtil.isEmpty(device_code)) {
if (!StrUtil.isEmpty(json.getString("device_code")) || json.getString("device_code").length() > 0) {
JSONObject jo = new JSONObject();
Device device = appService.findDeviceByCode(device_code);
if (ObjectUtil.isNull(device)) {
continue;
}
// if (ObjectUtil.isNotEmpty(device.getDeviceDriver())) {
//
//// IDriverService driverService = applicationContext.getBean(device.getDeviceDriverDefination().getDriverCode(), IDriverService.class);
// obj.put("device_name", device.getDevice_name());
//// jo = driverService.getDeviceInfo(device);
//
// }
if (device.getDeviceDriver() instanceof DeviceStageMonitor) {
DeviceStageMonitor monitorService = (DeviceStageMonitor) device.getDeviceDriver();
jo = monitorService.getDeviceStatusName();
}
obj.put("data", jo);
}
}
obj.put("img2", json.getString("image_name"));
obj.put("angle", json.getString("angle"));
arr.add(obj);
}
JSONObject result = new JSONObject();
result.put("form", stageObj);
result.put("detail", arr);
return result;
}
}

View File

@@ -0,0 +1,139 @@
package org.nl.acs.stage.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.stage.service.NewStageImageService;
import org.nl.acs.stage.service.dto.StageImageDto;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.common.utils.FileUtil;
import org.nl.modules.common.utils.SecurityUtils;
import org.nl.modules.wql.core.bean.ResultBean;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.util.WqlUtil;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* @author zhouz
* @description 服务实现
* @date 2021-04-06
**/
@Service
@RequiredArgsConstructor
@Slf4j
public class NewStageImageServiceImpl implements NewStageImageService {
@Override
public Map<String, Object> queryAll(Map whereJson, Pageable page) {
String where = "1=1";
if (whereJson.get("device_type") != null) {
where = "driver_code_json like ('%" + whereJson.get("device_type") + "%')";
}
WQLObject wo = WQLObject.getWQLObject("acs_stage_image");
ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), where, "update_time desc");
final JSONObject json = rb.pageResult();
return json;
}
@Override
public List<StageImageDto> queryAll(Map whereJson) {
WQLObject wo = WQLObject.getWQLObject("acs_stage_image");
JSONArray arr = wo.query().getResultJSONArray(0);
List<StageImageDto> list = arr.toJavaList(StageImageDto.class);
return list;
}
@Override
public StageImageDto findById(String image_uuid) {
WQLObject wo = WQLObject.getWQLObject("acs_stage_image");
JSONObject json = wo.query("image_uuid ='" + image_uuid + "'").uniqueResult(0);
final StageImageDto obj = json.toJavaObject(StageImageDto.class);
return obj;
}
@Override
public StageImageDto findByCode(String code) {
WQLObject wo = WQLObject.getWQLObject("acs_stage_image");
JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0);
final StageImageDto obj = json.toJavaObject(StageImageDto.class);
return obj;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(StageImageDto dto) {
String currentUsername = SecurityUtils.getCurrentUsername();
String now = DateUtil.now();
dto.setImage_uuid(IdUtil.simpleUUID());
dto.setCreate_by(currentUsername);
dto.setUpdate_by(currentUsername);
dto.setUpdate_time(now);
dto.setCreate_time(now);
WQLObject wo = WQLObject.getWQLObject("acs_stage_image");
JSONObject json = (JSONObject) JSONObject.toJSON(dto);
wo.insert(json);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(StageImageDto dto) {
StageImageDto entity = this.findById(dto.getImage_uuid());
if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!");
String currentUsername = SecurityUtils.getCurrentUsername();
String now = DateUtil.now();
dto.setUpdate_time(now);
dto.setUpdate_by(currentUsername);
WQLObject wo = WQLObject.getWQLObject("acs_stage_image");
JSONObject json = (JSONObject) JSONObject.toJSON(dto);
wo.update(json);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteAll(String[] ids) {
WQLObject wo = WQLObject.getWQLObject("acs_stage_image");
for (String image_uuid : ids) {
wo.delete("image_uuid = '" + image_uuid + "'");
}
}
@Override
public void download(List<StageImageDto> all, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (StageImageDto stageImage : all) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("设备名字", stageImage.getImage_name());
map.put("适用驱动", stageImage.getDriver_code_json());
map.put("备注", stageImage.getRemark());
map.put("是否启用", stageImage.getIs_active());
map.put("是否删除", stageImage.getIs_delete());
map.put("创建者", stageImage.getCreate_by());
map.put("创建时间", stageImage.getCreate_time());
map.put("修改者", stageImage.getUpdate_by());
map.put("修改时间", stageImage.getUpdate_time());
map.put("图标编码", stageImage.getImage_code());
list.add(map);
}
FileUtil.downloadExcel(list, response);
}
}

View File

@@ -0,0 +1,150 @@
package org.nl.acs.stage.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.stage.service.NewStageService;
import org.nl.acs.stage.service.dto.StageDto;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.common.utils.FileUtil;
import org.nl.modules.common.utils.SecurityUtils;
import org.nl.modules.wql.core.bean.ResultBean;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.util.WqlUtil;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* @author ldjun
* @description 服务实现
* @date 2021-04-12
**/
@Service
@RequiredArgsConstructor
@Slf4j
public class NewStageServiceImpl implements NewStageService {
@Override
public Map<String, Object> queryAll(Map whereJson, Pageable page) {
WQLObject wo = WQLObject.getWQLObject("acs_stage");
ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), "", "update_time desc");
final JSONObject json = rb.pageResult();
return json;
}
@Override
public List<StageDto> queryAll(Map whereJson) {
WQLObject wo = WQLObject.getWQLObject("acs_stage");
JSONArray arr = wo.query().getResultJSONArray(0);
List<StageDto> list = JSONObject.parseArray(arr.toJSONString(), StageDto.class);
return list;
}
@Override
public StageDto findById(String stage_uuid) {
WQLObject wo = WQLObject.getWQLObject("acs_stage");
JSONObject json = wo.query("stage_uuid ='" + stage_uuid + "'").uniqueResult(0);
final StageDto obj = json.toJavaObject(StageDto.class);
return obj;
}
@Override
public StageDto findByCode(String code) {
WQLObject wo = WQLObject.getWQLObject("acs_stage");
JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0);
final StageDto obj = json.toJavaObject(StageDto.class);
return obj;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(StageDto dto) {
String currentUsername = SecurityUtils.getCurrentUsername();
String now = DateUtil.now();
dto.setStage_uuid(IdUtil.simpleUUID());
dto.setCreate_by(currentUsername);
dto.setUpdate_by(currentUsername);
dto.setUpdate_time(now);
dto.setCreate_time(now);
WQLObject wo = WQLObject.getWQLObject("acs_stage");
JSONObject json = (JSONObject) JSONObject.toJSON(dto);
wo.insert(json);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(StageDto dto) {
StageDto entity = this.findById(dto.getStage_uuid());
if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!");
String currentUsername = SecurityUtils.getCurrentUsername();
String now = DateUtil.now();
dto.setUpdate_time(now);
dto.setUpdate_by(currentUsername);
WQLObject wo = WQLObject.getWQLObject("acs_stage");
JSONObject json = (JSONObject) JSONObject.toJSON(dto);
wo.update(json);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteAll(String[] ids) {
WQLObject wo = WQLObject.getWQLObject("acs_stage");
for (String stage_uuid : ids) {
wo.delete("stage_uuid = '" + stage_uuid + "'");
}
}
@Override
public void download(List<StageDto> all, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (StageDto stage : all) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("舞台编码", stage.getStage_code());
map.put("舞台名字", stage.getStage_name());
map.put("备注", stage.getRemark());
map.put("是否启用", stage.getIs_active());
map.put("是否删除", stage.getIs_delete());
map.put("创建者", stage.getCreate_by());
map.put("创建时间", stage.getCreate_time());
map.put("修改者", stage.getUpdate_by());
map.put("修改时间", stage.getUpdate_time());
list.add(map);
}
FileUtil.downloadExcel(list, response);
}
@Override
public JSONArray selectList() {
//设备基础信息表【acs_stage】
JSONArray arr = WQLObject.getWQLObject("acs_stage").query("is_delete= '0' AND is_active= '1'").getResultJSONArray(0);
JSONArray result = new JSONArray();
for (int i = 0; i < arr.size(); i++) {
JSONObject obj = arr.getJSONObject(i);
JSONObject json = new JSONObject();
json.put("stage_id", obj.getString("stage_id"));
json.put("stage_code", obj.getString("stage_code"));
json.put("stage_name", obj.getString("stage_name"));
result.add(json);
}
return result;
}
}

View File

@@ -0,0 +1,104 @@
package org.nl.acs.stage.service.utils;
import cn.hutool.core.util.ObjectUtil;
import org.nl.acs.device.service.dto.StorageCellDto;
import org.springframework.stereotype.Service;
@Service
public class StageActorUtil {
public static String getMode(int mode){
if (mode == 1){
return "联机";
}
return "未联机";
}
public static String getMode(int mode,int i){
if (mode == 0) {
return "未联机";
} else if (mode == 1) {
return "单机";
} else if (mode == 2) {
return "联机";
} else if (mode == 3) {
return "运行中";
} else if (mode == 4) {
return "申请叫料";
} else if (mode == 5) {
return "申请空盘";
} else if (mode == 6) {
return "空盘入库";
}
return "";
}
public static String getMove(int move){
if (move == 0){
return "无货";
} else if (move == 1){
return "有货";
}
return "有托盘有货";
}
public static String getCacheMove(int move){
if (move == 0){
return "无货";
} else if (move == 1) {
return "空料斗";
}
return "满料斗";
}
public static Boolean getIsOnline(int mode){
if (mode == 0){
return false;
}
return true;
}
public static int getHasGoods(int move){
if (move == 0){
return 0;
} else if (move == 2){
return 2;
}
return 1;
}
public static int getHasGoods(int move, int empty){
if (move == 0){
return 1;
}
return 0;
}
public static String getAddress(StorageCellDto storageCellDto){
if (ObjectUtil.isNotEmpty(storageCellDto)){
return storageCellDto.getStorage_code();
}
return "";
}
public static String getRequireSucess(Boolean requireSucess){
if (requireSucess == false){
return "0";
}
return "1";
}
public static String getRequestSucess(Boolean requireSucess){
if (requireSucess == false){
return "";
}
return "";
}
public static String getIsOrNo(int i){
if (i == 0){
return "";
}
return "";
}
}

View File

@@ -0,0 +1,61 @@
[交易说明]
交易名: 根据设备查询舞台编码
所属模块:
功能简述:
版权所有:
表引用:
版本经历:
[数据库]
--指定数据库为空采用默认值默认为db.properties中列出的第一个库
[IO定义]
#################################################
## 表字段对应输入参数
#################################################
输入.flag TYPEAS s_string
//设备编码
输入.device_code TYPEAS s_string
[临时表]
--这边列出来的临时表就会在运行期动态创建
[临时变量]
--所有中间过程变量均可在此处定义
[业务过程]
##########################################
# 1、输入输出检查 #
##########################################
##########################################
# 2、主过程前处理 #
##########################################
##########################################
# 3、业务主过程 #
##########################################
IF 输入.flag = "1"
QUERY
SELECT
stage_code
FROM
acs_stage
WHERE
stage_uuid IN (
SELECT
stage_uuid
FROM
acs_stage_actor
WHERE
1=1
OPTION 输入.device_code <> ""
device_code = 输入.device_code
ENDOPTION
)
ENDSELECT
ENDQUERY
ENDIF

View File

@@ -0,0 +1,913 @@
<template>
<div style="overflow: hidden">
舞台<el-select v-model="stage_code" placeholder="请选择" @change="$_changeStage()">
<el-option
v-for="item in stageSelectList"
:key="item.stage_code"
:label="item.stage_name"
:value="item.stage_code"
/>
</el-select>
<el-row>
<div id="container" className="container" style="min-height: 100%" />
</el-row>
<!--点击设备显示信息-->
<el-dialog
id="dialogs"
title="设备信息"
class="newDialog"
:visible.sync="dialogDeviceMsgVisible"
width="22%"
:top="tops"
:show-close="false"
:modal="false"
>
<el-table
:data="arr"
style="width: 100%"
max-height="500px"
>
<el-table-column
prop="name"
label="监控项"
/>
<el-table-column
prop="value"
label="当前值"
/>
</el-table>
</el-dialog>
<!--弹窗设置设备与图标绑定与角度-->
<el-dialog title="设备设置" :visible.sync="dialogFormVisible" width="35%">
<el-form :model="form" size="small">
<el-form-item label="设备编号" prop="device_code" label-width="80px">
<el-input v-model="form.device_code" :disabled="true" />
</el-form-item>
<el-form-item label="设备状态" label-width="80px">
<el-radio-group v-model="form.option">
<el-radio-button :label="0">禁止进出</el-radio-button>
<el-radio-button :label="1">允许进入</el-radio-button>
<el-radio-button :label="2">允许离开</el-radio-button>
</el-radio-group>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false"> </el-button>
<el-button type="primary" @click="dialogSave"> </el-button>
</div>
</el-dialog>
<!--弹窗设置设备与图标绑定与角度-->
<el-dialog title="设备设置" :visible.sync="dialogFormVisible3" width="35%">
<el-form :model="form" size="small">
<el-form-item label="设备编号" prop="device_code" label-width="80px">
<el-input v-model="form.device_code" :disabled="true" />
</el-form-item>
<el-form-item label="设备状态" label-width="80px">
<el-radio-group v-model="form.hasGoodStatus">
<el-radio-button :label="0">无货</el-radio-button>
<el-radio-button :label="1">有托盘</el-radio-button>
<el-radio-button :label="2">有托盘有货</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="物料编码" prop="material_type" label-width="80px">
<el-input v-model="form.material_type" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible3 = false"> </el-button>
<el-button type="primary" @click="dialogSave"> </el-button>
</div>
</el-dialog>
<!--弹窗设置设备与图标绑定与角度-->
<el-dialog title="设备设置" :visible.sync="dialogFormVisible4" width="35%">
<el-form :model="form" size="small">
<el-form-item label="设备编号" prop="device_code" label-width="120px">
<el-input v-model="form.device_code" :disabled="true" />
</el-form-item>
<el-form-item label="禁用机械手" prop="is_disable" label-width="120px">
<el-radio-group v-model="form.is_disable">
<el-radio-button :label="0">正常</el-radio-button>
<el-radio-button :label="1">禁用</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="请求标记" prop="requireSucess" label-width="120px">
<el-radio-group v-model="form.requireSucess">
<el-radio-button :label="0"></el-radio-button>
<el-radio-button :label="1"></el-radio-button>
</el-radio-group>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible4 = false"> </el-button>
<el-button type="primary" @click="dialogSave"> </el-button>
</div>
</el-dialog>
<el-dialog title="设备设置" :visible.sync="dialogFormVisible5" width="35%">
<el-form :model="form" size="small">
<el-form-item label="设备编号" prop="device_code" label-width="120px">
<el-input v-model="form.device_code" :disabled="true" />
</el-form-item>
<el-form-item label="请求标记" prop="requireSucess" label-width="120px">
<el-radio-group v-model="form.requireSucess">
<el-radio-button :label="false"></el-radio-button>
<el-radio-button :label="true"></el-radio-button>
</el-radio-group>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible5 = false"> </el-button>
<el-button type="primary" @click="dialogSave"> </el-button>
</div>
</el-dialog>
<el-dialog title="设备设置" :visible.sync="dialogFormVisible6" width="35%">
<el-form :model="form" size="small">
<el-form-item label="设备编号" prop="device_code" label-width="120px">
<el-input v-model="form.device_code" :disabled="true" />
</el-form-item>
<el-form-item label="申请指令标记" prop="requireSucess" label-width="120px">
<el-radio-group v-model="form.requireSucess">
<el-radio-button :label="0"></el-radio-button>
<el-radio-button :label="1"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="请求任务标记" prop="applySucess" label-width="120px">
<el-radio-group v-model="form.applySucess">
<el-radio-button :label="0"></el-radio-button>
<el-radio-button :label="1"></el-radio-button>
</el-radio-group>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible5 = false"> </el-button>
<el-button type="primary" @click="dialogSave"> </el-button>
</div>
</el-dialog>
<!--弹窗设置设备与图标绑定与角度-->
<el-dialog title="设备设置" :visible.sync="dialogFormVisible1" width="35%">
<el-form :model="form" size="small">
<el-form-item label="设备编号" prop="device_code" label-width="80px">
<el-input v-model="form.device_code" :disabled="true" />
</el-form-item>
<el-form-item label="条码" label-width="80px">
<el-input v-model="form.barcode" :disabled="false" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible1 = false"> </el-button>
<el-button type="primary" @click="saveBarcode"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import crudStage from '@/api/logicflow/stage'
import paramCrud from '@/api/system/param'
import deviceCrud from '@/api/acs/device/device'
import { getDeviceByCodes } from '@/api/acs/device/deviceStageMonitor'
import '@logicflow/core/dist/style/index.css'
import '@logicflow/extension/lib/style/index.css'
import { LogicFlow } from '@logicflow/core'
import { registerCustomElement } from '@/views/system/logicflow/editor/components/node'
let data = {}
let lf = ''
export default {
name: 'MonitorDeviceBack',
data() {
return {
stageParam: '', // 舞台参数
dialogDeviceMsgVisible: false, // 显示设备信息的dialog
device_code: null,
tops: '20vh', // 初始top
stage_code: '',
stageSelectList: [],
arr: [], // 显示数组
dialogFormVisible: false,
dialogFormVisible1: false,
dialogFormVisible2: false,
dialogFormVisible3: false,
dialogFormVisible4: false,
dialogFormVisible5: false,
dialogFormVisible6: false,
form: {
device_code: '',
hasGoodStatus: null,
barcode: '',
suspended: null,
material_type: '',
requireSucess: '',
fullrequireSucess: '',
is_disable: '',
applySucess: ''
},
allDeviceMsg: [],
msgTop: '200px',
msgLeft: '200px'
}
},
mounted() {
this.initStageList()
this.init()
},
beforeDestroy() {
// js提供的clearInterval方法用来清除定时器
console.log('定时器销毁')
clearInterval(this.timer)
},
methods: {
initStageList() {
// 初始化舞台下拉框
crudStage.selectStageList().then(data => {
this.stageSelectList = data
this.stageParam = data.stage_code
this.init(data.stage_code)
})
},
// 流程图初始化
init(stageParam) {
// 初始化配置
lf = new LogicFlow({
overlapMode: 1,
container: document.querySelector('#container'), // 容器
// 画布配置
// width: window.innerWidth, // 宽度
height: window.innerHeight, // 高度
grid: { // 不用格子直接显示,使用背景
visible: false,
type: 'mesh',
size: 5
},
background: {
backgroundImage: 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PHBhdHRlcm4gaWQ9ImdyaWQiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZD0iTSAwIDEwIEwgNDAgMTAgTSAxMCAwIEwgMTAgNDAgTSAwIDIwIEwgNDAgMjAgTSAyMCAwIEwgMjAgNDAgTSAwIDMwIEwgNDAgMzAgTSAzMCAwIEwgMzAgNDAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2QwZDBkMCIgb3BhY2l0eT0iMC4yIiBzdHJva2Utd2lkdGg9IjEiLz48cGF0aCBkPSJNIDQwIDAgTCAwIDAgMCA0MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZDBkMGQwIiBzdHJva2Utd2lkdGg9IjEiLz48L3BhdHRlcm4+PC9kZWZzPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JpZCkiLz48L3N2Zz4=")',
backgroundRepeat: 'repeat'
},
isSilentMode: true,
adjustEdge: false,
adjustEdgeMiddle: false,
adjustEdgeStartAndEnd: false,
adjustNodePosition: false,
hideAnchors: true,
nodeTextEdit: false,
edgeTextEdit: false
})
lf.setTheme(
{
baseEdge: { strokeWidth: 1 },
baseNode: { strokeWidth: 1 },
nodeText: { overflowMode: 'autoWrap', lineHeight: 1.5 },
edgeText: { overflowMode: 'autoWrap', lineHeight: 1.5 }
}
)
// 注册自定义元素
registerCustomElement(lf)
// 删除默认的右键菜单
lf.extension.menu.setMenuConfig({
nodeMenu: false
})
lf.on('node:click', (data, e) => { // 鼠标点击节点
console.log('data: ', data)
// 展开显示设备信息
if (data.data.type !== 'pro-rect' && data.data.type !== 'pro-circle' && data.data.type !== 'triangle' && data.data.type !== 'rect-radius') {
if (data.data.properties.device) {
this.moveShow(data.data) // 传递节点数据用来获取id做比对
this.dialogDeviceMsgVisible = true
this.device_code = data.data.properties.device
this.tops = data.e.y + 'px'
document.getElementsByClassName('el-dialog')[0].style.marginLeft = data.e.x + 'px'
}
}
})
lf.on('node:contextmenu', (data, e, position) => { // 右键编辑
if (data.data.type !== 'pro-rect' && data.data.type !== 'pro-circle' && data.data.type !== 'triangle' && data.data.type !== 'rect-radius') {
if (data.data.properties.device) {
this.editDevice(data.data.id) // 编辑
}
}
})
// 开始渲染
lf.render(data)
this.initStageData(stageParam)
},
$_changeStage(val) { // 选择舞台的事件
this.stageParam = val
},
initStageData(stageParam) {
// 获取舞台编码
paramCrud.getValueByCode(stageParam).then(res => {
// console.log(res)
debugger
if (res.value) {
crudStage.getNewStageDataByCode(res.value).then(res => { // 通过舞台编码获取舞台数据并且赋值到lf对象
data = JSON.parse(res.stage_data)
lf.render(data)
this.initStatus() // 初始化状态
})
} else {
this.$notify.error({
title: '错误',
message: '请设置参数!'
})
}
})
this.timer = setInterval(() => { // 定时刷新设备的状态信息
console.log('定时器启动')
this.initStatus()
}, 2000)
},
editDevice(id) {
let item = ''
for (const i in this.allDeviceMsg) { // 查找点击节点的id
if (id === this.allDeviceMsg[i].id) {
item = this.allDeviceMsg[i]
break // 匹对完退出
}
}
const clickObj = item
console.log('clickObj.data', clickObj.data)
if (!item.data) {
return
}
if (!clickObj.data.is_click) {
return
}
if (clickObj.data.device_type === 'scanner') { // 扫码器
this.dialogFormVisible1 = true
} else {
console.log(clickObj.data.driver_type)
if (clickObj.data.driver_type === 'standard_ordinary_site') {
this.dialogFormVisible3 = true
} else if (clickObj.data.driver_type === 'hailiang_packer_station') {
this.dialogFormVisible4 = true
} else if (clickObj.data.driver_type === 'hailiang_xj_plc_test') {
this.$refs.child1.setForm(clickObj)
} else if (clickObj.data.driver_type === 'slit_two_manipulator') {
this.dialogFormVisible4 = true
} else if (clickObj.data.driver_type === 'hailiang_special_full_station' ||
clickObj.data.driver_type === 'hailiang_cleaning_feeding_line' ||
clickObj.data.driver_type === 'hailiang_engraving_machine' ||
clickObj.data.driver_type === 'hailiang_old_special_full_station' ||
clickObj.data.driver_type === 'hailiang_old_special_pour_station' ||
clickObj.data.driver_type === 'hailiang_packer_station') {
this.dialogFormVisible5 = true
} else if (clickObj.data.driver_type === 'standard_conveyor_control_with_scanner') {
this.dialogFormVisible6 = true
} else {
this.dialogFormVisible = true
}
}
this.form.angle = clickObj.angle
this.form.index = clickObj.index
this.form.device_code = clickObj.device_code
this.form.hasGoodStatus = clickObj.data.hasGoods
this.form.material_type = clickObj.data.material_type
this.form.requireSucess = clickObj.data.requireSucess
this.form.fullrequireSucess = clickObj.data.fullrequireSucess
this.form.is_disable = clickObj.data.is_disable1
this.form.applySucess = clickObj.data.applySucess
},
moveShow(nodeData) { // 点击之后显示出来的数据----只需要设备信息
let item = ''
for (const i in this.allDeviceMsg) { // 查找点击节点的id
if (nodeData.id === this.allDeviceMsg[i].id) {
item = this.allDeviceMsg[i]
break // 匹对完退出
}
}
this.arr = [] // 清空
if (item.device_code && item.data) {
// console.log('item', item)
this.arr = [
{ name: '设备编号', value: item.device_code },
{ name: '设备名称', value: item.device_name }
]
const data = item.data
for (const val in data) {
if (val === 'isOnline' || val === 'isError' || val === 'hasGoods') {
continue
}
if (val === 'message' && data.isError === true) {
const obj = { name: '设备信息', value: data[val] }
this.arr.push(obj)
}
if (val === 'message' && data.isError === 'false') {
const obj = { name: '异常信息', value: data[val] }
this.arr.push(obj)
}
if (val === 'move') {
const obj = { name: '光电信号', value: data[val] }
this.arr.push(obj)
} else if (val === 'mode') {
const obj = { name: '模式', value: data[val] }
this.arr.push(obj)
} else if (val === 'error') {
const obj = { name: '报警', value: data[val] }
this.arr.push(obj)
} else if (val === 'ip') {
const obj = { name: 'IP地址', value: data[val] }
this.arr.push(obj)
} else if (val === 'number') {
const obj = { name: '托盘数量', value: data[val] }
this.arr.push(obj)
} else if (val === 'inst_message') {
const obj = { name: '指令信息', value: data[val] }
this.arr.push(obj)
} else if (val === 'message') {
const obj = { name: '备注信息', value: data[val] }
this.arr.push(obj)
} else if (val === 'inst_message') {
const obj = { name: '当前指令信息', value: data[val] }
this.arr.push(obj)
} else if (val === 'last_inst_message') {
const obj = { name: '上次指令信息', value: data[val] }
this.arr.push(obj)
} else if (val === 'barcode') {
const obj = { name: '载具号', value: data[val] }
this.arr.push(obj)
} else if (val === 'barcode_length') {
const obj = { name: '载具长度', value: data[val] }
this.arr.push(obj)
} else if (val === 'last_container') {
const obj = { name: '上次载具号', value: data[val] }
this.arr.push(obj)
} else if (val === 'instruction_code') {
const obj = { name: '指令号', value: data[val] }
this.arr.push(obj)
} else if (val === 'task_code') {
const obj = { name: '任务号', value: data[val] }
this.arr.push(obj)
} else if (val === 'last_instruction_code') {
const obj = { name: '上次指令号', value: data[val] }
this.arr.push(obj)
} else if (val === 'action') {
const obj = { name: '动作信号', value: data[val] }
this.arr.push(obj)
} else if (val === 'io_action') {
const obj = { name: '允许进出信号', value: data[val] }
this.arr.push(obj)
} else if (val === 'material') {
const obj = { name: '物料', value: data[val] }
this.arr.push(obj)
} else if (val === 'batch') {
const obj = { name: '批次', value: data[val] }
this.arr.push(obj)
} else if (val === 'applySucess') {
const obj = { name: '是否申请指令', value: data[val] }
this.arr.push(obj)
} else if (val === 'status') {
const obj = { name: '设备状态', value: data[val] }
this.arr.push(obj)
} else if (val === 'weight') {
const obj = { name: '重量', value: data[val] }
this.arr.push(obj)
} else if (val === 'move_1') {
const obj = { name: '前工位光电信号', value: data[val] }
this.arr.push(obj)
} else if (val === 'open') {
const obj = { name: '开到位', value: data[val] }
this.arr.push(obj)
} else if (val === 'close') {
const obj = { name: '关到位', value: data[val] }
this.arr.push(obj)
} else if (val === 'phase') {
const obj = { name: 'AGV交互阶段', value: data[val] }
this.arr.push(obj)
} else if (val === 'option') {
const obj = { name: 'AGV动作', value: data[val] }
this.arr.push(obj)
} else if (val === 'agv_power') {
const obj = { name: 'AGV电量', value: data[val] }
this.arr.push(obj)
} else if (val === 'move_2') {
const obj = { name: '后工位光电信号', value: data[val] }
this.arr.push(obj)
} else if (val === 'action_1') {
const obj = { name: '前工位动作信号', value: data[val] }
this.arr.push(obj)
} else if (val === 'action_2') {
const obj = { name: '后工位动作信号', value: data[val] }
this.arr.push(obj)
} else if (val === 'walk_y') {
const obj = { name: '行走列', value: data[val] }
this.arr.push(obj)
} else if (val === 'task1') {
const obj = { name: '前工位任务号', value: data[val] }
this.arr.push(obj)
} else if (val === 'task2') {
const obj = { name: '后工位任务号', value: data[val] }
this.arr.push(obj)
} else if (val === 'task') {
const obj = { name: '任务号', value: data[val] }
this.arr.push(obj)
} else if (val === 'is_disable') {
const obj = { name: '是否禁用', value: data[val] }
this.arr.push(obj)
} else if (val === 'temperature') {
const obj = { name: '当前温度', value: data[val] }
this.arr.push(obj)
} else if (val === 'finish') {
const obj = { name: '工单完成', value: data[val] }
this.arr.push(obj)
} else if (val === 'door') {
const obj = { name: '门状态', value: data[val] }
this.arr.push(obj)
} else if (val === 'notCreateTaskMessage') {
const obj = { name: '任务创建失败原因', value: data[val] }
this.arr.push(obj)
} else if (val === 'notCreateInstMessage') {
const obj = { name: '指令创建失败原因', value: data[val] }
this.arr.push(obj)
} else if (val === 'feedMessage') {
const obj = { name: '未反馈电气信号原因', value: data[val] }
this.arr.push(obj)
} else if (val === 'requireSucess') {
const obj = { name: '请求成功标记', value: data[val] }
this.arr.push(obj)
} else if (val === 'matching_barcode') {
const obj = { name: '开始匹配条码', value: data[val] }
this.arr.push(obj)
} else if (val === 'matching_barcode_fail') {
const obj = { name: '条码匹配失败', value: data[val] }
this.arr.push(obj)
} else if (val === 'task_type') {
const obj = { name: '任务类型', value: data[val] }
this.arr.push(obj)
} else if (val === 'task_finish') {
const obj = { name: '任务完成', value: data[val] }
this.arr.push(obj)
} else if (val === 'noFeedAgvMessage') {
const obj = { name: '未反馈AGV原因', value: data[val] }
this.arr.push(obj)
} else if (val === 'prepare_ready') {
const obj = { name: '准备位就绪', value: data[val] }
this.arr.push(obj)
} else if (val === 'in_ready') {
const obj = { name: '对接位入箱就绪', value: data[val] }
this.arr.push(obj)
} else if (val === 'in_finish') {
const obj = { name: '对接位入箱完成', value: data[val] }
this.arr.push(obj)
} else if (val === 'out_ready') {
const obj = { name: '对接位出箱就绪', value: data[val] }
this.arr.push(obj)
} else if (val === 'pause') {
const obj = { name: '暂停', value: data[val] }
this.arr.push(obj)
} else if (val === 'checking') {
const obj = { name: '盘点中', value: data[val] }
this.arr.push(obj)
} else if (val === 'check_finish') {
const obj = { name: '盘点完成', value: data[val] }
this.arr.push(obj)
} else if (val === 'check_compel_finish') {
const obj = { name: '盘点强制完成', value: data[val] }
this.arr.push(obj)
} else if (val === 'hoist_target_layer') {
const obj = { name: '提升机条码目的层', value: data[val] }
this.arr.push(obj)
} else if (val === 'prepare_barcode') {
const obj = { name: '准备位条码', value: data[val] }
this.arr.push(obj)
} else if (val === 'docking_barcode') {
const obj = { name: '对接位条码', value: data[val] }
this.arr.push(obj)
} else if (val === 'one_floor_barcode1') {
const obj = { name: '一层条码1', value: data[val] }
this.arr.push(obj)
} else if (val === 'one_floor_barcode2') {
const obj = { name: '一层条码2', value: data[val] }
this.arr.push(obj)
} else if (val === 'one_floor_barcode3') {
const obj = { name: '一层条码3', value: data[val] }
this.arr.push(obj)
} else if (val === 'one_floor_barcode4') {
const obj = { name: '一层条码4', value: data[val] }
this.arr.push(obj)
} else if (val === 'one_floor_barcode5') {
const obj = { name: '一层条码5', value: data[val] }
this.arr.push(obj)
} else if (val === 'one_floor_barcode6') {
const obj = { name: '一层条码6', value: data[val] }
this.arr.push(obj)
} else if (val === 'one_floor_barcode7') {
const obj = { name: '一层条码7', value: data[val] }
this.arr.push(obj)
} else if (val === 'one_floor_barcode8') {
const obj = { name: '一层条码8', value: data[val] }
this.arr.push(obj)
} else if (val === 'one_floor_barcode9') {
const obj = { name: '一层条码9', value: data[val] }
this.arr.push(obj)
} else if (val === 'one_floor_barcode10') {
const obj = { name: '一层条码10', value: data[val] }
this.arr.push(obj)
} else if (val === 'two_floor_barcode1') {
const obj = { name: '二层条码1', value: data[val] }
this.arr.push(obj)
} else if (val === 'two_floor_barcode2') {
const obj = { name: '二层条码2', value: data[val] }
this.arr.push(obj)
} else if (val === 'two_floor_barcode3') {
const obj = { name: '二层条码3', value: data[val] }
this.arr.push(obj)
} else if (val === 'two_floor_barcode4') {
const obj = { name: '二层条码4', value: data[val] }
this.arr.push(obj)
} else if (val === 'two_floor_barcode5') {
const obj = { name: '二层条码5', value: data[val] }
this.arr.push(obj)
} else if (val === 'two_floor_barcode6') {
const obj = { name: '二层条码6', value: data[val] }
this.arr.push(obj)
} else if (val === 'two_floor_barcode7') {
const obj = { name: '二层条码7', value: data[val] }
this.arr.push(obj)
} else if (val === 'two_floor_barcode8') {
const obj = { name: '二层条码8', value: data[val] }
this.arr.push(obj)
} else if (val === 'two_floor_barcode9') {
const obj = { name: '二层条码9', value: data[val] }
this.arr.push(obj)
} else if (val === 'two_floor_barcode10') {
const obj = { name: '二层条码10', value: data[val] }
this.arr.push(obj)
} else if (val === 'three_floor_barcode1') {
const obj = { name: '三层条码1', value: data[val] }
this.arr.push(obj)
} else if (val === 'three_floor_barcode2') {
const obj = { name: '三层条码2', value: data[val] }
this.arr.push(obj)
} else if (val === 'three_floor_barcode3') {
const obj = { name: '三层条码3', value: data[val] }
this.arr.push(obj)
} else if (val === 'three_floor_barcode4') {
const obj = { name: '三层条码4', value: data[val] }
this.arr.push(obj)
} else if (val === 'three_floor_barcode5') {
const obj = { name: '三层条码5', value: data[val] }
this.arr.push(obj)
} else if (val === 'three_floor_barcode6') {
const obj = { name: '三层条码6', value: data[val] }
this.arr.push(obj)
} else if (val === 'three_floor_barcode7') {
const obj = { name: '三层条码7', value: data[val] }
this.arr.push(obj)
} else if (val === 'three_floor_barcode8') {
const obj = { name: '三层条码8', value: data[val] }
this.arr.push(obj)
} else if (val === 'three_floor_barcode9') {
const obj = { name: '三层条码9', value: data[val] }
this.arr.push(obj)
} else if (val === 'three_floor_barcode10') {
const obj = { name: '三层条码10', value: data[val] }
this.arr.push(obj)
} else if (val === 'order') {
const obj = { name: '工单号', value: data[val] }
this.arr.push(obj)
} else if (val === 'full_number') {
const obj = { name: '满料位数量', value: data[val] }
this.arr.push(obj)
} else if (val === 'storage_stock_num') {
const obj = { name: '倒料位数量', value: data[val] }
this.arr.push(obj)
} else if (val === 'now_one_box_num') {
const obj = { name: '当前箱数量(每框实时)', value: data[val] }
this.arr.push(obj)
} else if (val === 'order_prod_allnum') {
const obj = { name: '工单生产总量', value: data[val] }
this.arr.push(obj)
} else if (val === 'now_order_prod_num') {
const obj = { name: '当前生产总量(订单实时)', value: data[val] }
this.arr.push(obj)
} else if (val === 'noApplyTaskMessage') {
const obj = { name: '未申请任务原因', value: data[val] }
this.arr.push(obj)
} else if (val === 'line_stock_num') {
const obj = { name: '线体库存数量(接料位、满料位数量和)', value: data[val] }
this.arr.push(obj)
} else if (val === 'order_compel_finish') {
const obj = { name: '工单强制完成', value: data[val] }
this.arr.push(obj)
} else if (val === 'empty_put_finish') {
const obj = { name: '空箱位空箱补给完成', value: data[val] }
this.arr.push(obj)
} else if (val === 'agv_take_finish') {
const obj = { name: '满箱已运出满箱位', value: data[val] }
this.arr.push(obj)
} else if (val === 'one_qty') {
const obj = { name: '1号口数量', value: data[val] }
this.arr.push(obj)
} else if (val === 'two_qty') {
const obj = { name: '2号口数量', value: data[val] }
this.arr.push(obj)
} else if (val === 'three_qty') {
const obj = { name: '3号口数量', value: data[val] }
this.arr.push(obj)
} else if (val === 'four_qty') {
const obj = { name: '4号口数量', value: data[val] }
this.arr.push(obj)
} else if (val === 'five_qty') {
const obj = { name: '5号口数量', value: data[val] }
this.arr.push(obj)
} else if (val === 'one_status') {
const obj = { name: '1号口状态', value: data[val] }
this.arr.push(obj)
} else if (val === 'two_status') {
const obj = { name: '2号口状态', value: data[val] }
this.arr.push(obj)
} else if (val === 'three_status') {
const obj = { name: '3号口状态', value: data[val] }
this.arr.push(obj)
} else if (val === 'four_status') {
const obj = { name: '4号口状态', value: data[val] }
this.arr.push(obj)
} else if (val === 'five_status') {
const obj = { name: '5号口状态', value: data[val] }
this.arr.push(obj)
} else if (val === 'boxType') {
const obj = { name: '箱型', value: data[val] }
this.arr.push(obj)
} else if (val === 'getStation') {
const obj = { name: '取货位', value: data[val] }
this.arr.push(obj)
} else if (val === 'putStation') {
const obj = { name: '放货位', value: data[val] }
this.arr.push(obj)
} else if (val === 'barcodeArr') {
const obj = { name: '码垛条码', value: data[val] }
this.arr.push(obj)
} else if (val === 'robotCode') {
const obj = { name: '编码', value: data[val] }
this.arr.push(obj)
} else if (val === 'robotTypeCode') {
const obj = { name: '型号', value: data[val] }
this.arr.push(obj)
} else if (val === 'pointCode') {
const obj = { name: '节点编码', value: data[val] }
this.arr.push(obj)
} else if (val === 'positionX') {
const obj = { name: '坐标x', value: data[val] }
this.arr.push(obj)
} else if (val === 'positionY') {
const obj = { name: '坐标y', value: data[val] }
this.arr.push(obj)
} else if (val === 'theta') {
const obj = { name: '⻆度', value: data[val] }
this.arr.push(obj)
} else if (val === 'forkHeight') {
const obj = { name: '货叉⾼度', value: data[val] }
this.arr.push(obj)
} else if (val === 'forkLength') {
const obj = { name: '货叉⻓度', value: data[val] }
this.arr.push(obj)
} else if (val === 'forkTheta') {
const obj = { name: '货叉相对机器⼈⻆度', value: data[val] }
this.arr.push(obj)
} else if (val === 'stationCode') {
const obj = { name: '⼯作站编码', value: data[val] }
this.arr.push(obj)
} else if (val === 'locationCode') {
const obj = { name: '⼯作位编码', value: data[val] }
this.arr.push(obj)
} else if (val === 'state') {
const obj = { name: '机器⼈状态', value: data[val] }
this.arr.push(obj)
} else if (val === 'hardwareState') {
const obj = { name: '机器⼈硬件状态', value: data[val] }
this.arr.push(obj)
} else if (val === 'trays') {
const obj = { name: '背篓描述', value: data[val] }
this.arr.push(obj)
} else if (val === 'trayLevel') {
const obj = { name: '背篓序号', value: data[val] }
this.arr.push(obj)
} else if (val === 'containerCode') {
const obj = { name: '容器编码', value: data[val] }
this.arr.push(obj)
} else if (val === 'taskCodes') {
const obj = { name: '业务任务', value: data[val] }
this.arr.push(obj)
} else if (val === 'positionCode') {
const obj = { name: '位置编码', value: data[val] }
this.arr.push(obj)
}
}
}
// console.log('arr:', this.arr)
},
initStatus() { // 初始化所有节点的设备信息通过节点id对应设备编号
let resion = {}
resion = lf.getGraphData().nodes.map(item => ({ id: item.id, device_code: item.properties.device }))
getDeviceByCodes(resion).then(res => {
console.log(res)
this.allDeviceMsg = res // 拿到所有节点的设备数据
// console.log('initStatus-res', res)
// 实时设置状态信息
for (var item of res) { // 循环并且设置属性值
if (item.data !== undefined) {
if (item.data.isOnline !== undefined) {
lf.setProperties(item.id, {
isOnline: item.data.isOnline
})
}
if (item.data.hasGoods !== undefined) {
lf.setProperties(item.id, {
hasGoods: item.data.hasGoods
})
}
if (item.data.isError !== undefined) {
lf.setProperties(item.id, {
isError: item.data.isError
})
}
}
}
// 设置动态实时显示设备信息
const { nodes } = lf.getSelectElements() // 获取选中的节点
// console.log(nodes)
if (nodes.length === 1) { // 因为是定时器,没有选中则不用实时更新显示数据
this.moveShow(nodes[0]) // 监控模式下不可能托选,因此就只有一个数据
}
})
},
dialogSave() {
deviceCrud.changeDeviceStatus(this.form).then(res => {
this.$notify({ title: '操作成功', message: '', type: 'success' })
this.dialogFormVisible = false
this.dialogFormVisible3 = false
this.dialogFormVisible4 = false
this.dialogFormVisible5 = false
this.dialogFormVisible6 = false
this.initStageData()
}).catch(err => {
this.dialogFormVisible = false
this.dialogFormVisible3 = false
this.dialogFormVisible4 = false
this.dialogFormVisible5 = false
console.log(err.response.data.message)
})
},
saveBarcode() {
deviceCrud.saveBarcode(this.form).then(res => {
this.notify('操作成功', 'success')
this.dialogFormVisible1 = false
this.initStageData()
}).catch(err => {
this.dialogFormVisible1 = false
console.log(err.response.data.message)
})
}
}
}
</script>
<style>
html, body {
height: 100%;
}
body {
padding: 0;
margin: 0;
}
</style>
<style scoped>
.container {
background-color: #f8f9fa;
height: 100%;
}
.newDialog /deep/ .el-dialog__header {
padding: 1vh 1vw 0 1vw;
}
.newDialog /deep/ .el-dialog__body {
padding: 1vh 1vw;
}
.toolbar-sty {
position: absolute;
margin-top: 5px;
top: 0;
padding: 5px;
left: 30px;
height: 45px;
/*width: 310px;*/
display: flex;
align-items: center;
border-bottom: 1px solid #e5e5e5;
z-index: 10;
background: #e5e5e5;
}
</style>