package com.zy.asrs.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.annotations.ManagerAuth; import com.core.common.Cools; import com.core.common.R; import com.zy.asrs.domain.enums.CrnStatusType; import com.zy.asrs.domain.enums.StationStatusType; import com.zy.asrs.domain.param.SystemSwitchParam; import com.zy.asrs.domain.vo.CrnDetailVo; import com.zy.asrs.domain.vo.CrnLatestDataVo; import com.zy.asrs.domain.vo.StationLatestDataVo; import com.zy.asrs.domain.vo.RgvLatestDataVo; import com.zy.asrs.entity.*; import com.zy.asrs.service.*; import com.zy.asrs.utils.Utils; import com.zy.common.CodeRes; import com.zy.common.model.MapNode; import com.zy.common.utils.RedisUtil; import com.zy.core.News; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.CrnModeType; import com.zy.core.enums.MapNodeType; import com.zy.core.enums.RedisKeyType; import com.zy.core.enums.RgvStatusType; import com.zy.core.enums.SlaveType; import com.zy.core.model.protocol.CrnProtocol; import com.zy.core.model.protocol.StationProtocol; import com.zy.core.properties.SystemProperties; import com.zy.core.thread.CrnThread; import com.zy.core.thread.StationThread; import com.zy.core.thread.RgvThread; import com.zy.core.model.protocol.RgvProtocol; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.*; /** * 主控图接口 */ @Slf4j @RestController @RequestMapping("/console") public class ConsoleController { @Autowired private DeviceConfigService deviceConfigService; @Autowired private WrkMastService wrkMastService; @Autowired private BasCrnpErrService basCrnpErrService; @Autowired private BasMapService basMapService; @Autowired private RedisUtil redisUtil; @Autowired private LocMastService locMastService; @PostMapping("/system/running/status") @ManagerAuth(memo = "系统运行状态") public R systemRunningStatus() { return R.ok().add(Cools.add("status", SystemProperties.WCS_RUNNING_STATUS.get())); } @PostMapping("/system/switch") @ManagerAuth(memo = "系统运行开关操作") public R systemSwitch(SystemSwitchParam param) throws InterruptedException { if (Cools.isEmpty(param.getOperatorType())) { return R.error(); } if (param.getOperatorType() == 0) { if (Cools.isEmpty(param.getPassword())) { return R.error("请输入口令"); } if (!param.getPassword().equals(SystemProperties.WCS_PASSWORD)) { return R.error("口令错误"); } } Thread.sleep(200L); SystemProperties.WCS_RUNNING_STATUS.set(param.getOperatorType() == 1 ? Boolean.TRUE : Boolean.FALSE); return R.ok().add(Cools.add("status", SystemProperties.WCS_RUNNING_STATUS.get())); } @PostMapping("/latest/data/station") @ManagerAuth(memo = "站点实时数据") public R stationLatestData() { List vos = new ArrayList<>(); List devpList = deviceConfigService.selectList(new EntityWrapper() .eq("device_type", String.valueOf(SlaveType.Devp))); for (DeviceConfig deviceConfig : devpList) { StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, deviceConfig.getDeviceNo()); if (stationThread == null) { continue; } List statusList = stationThread.getStatus(); if (statusList == null || statusList.isEmpty()) { continue; } for (StationProtocol stationProtocol : statusList) { StationLatestDataVo vo = new StationLatestDataVo(); vo.setStationId(stationProtocol.getStationId()); // 站点编号 vo.setTaskNo(stationProtocol.getTaskNo()); // 任务号 vo.setTargetStaNo(stationProtocol.getTargetStaNo()); // 目标站点 vo.setAutoing(stationProtocol.isAutoing()); // 是否自动 vo.setLoading(stationProtocol.isLoading()); // 是否有物 vo.setInEnable(stationProtocol.isInEnable()); // 是否可入 vo.setOutEnable(stationProtocol.isOutEnable()); // 是否可出 vo.setEmptyMk(stationProtocol.isEmptyMk()); // 是否空板 vo.setFullPlt(stationProtocol.isFullPlt()); // 是否满板 vo.setPalletHeight(stationProtocol.getPalletHeight()); // 托盘高度 vo.setError(stationProtocol.getError()); // 错误码 vo.setBarcode(stationProtocol.getBarcode()); // 条码 String stationStatus = StationStatusType.process(stationProtocol).toString().toLowerCase().replaceAll("_", "-"); vo.setStationStatus(stationStatus); vos.add(vo); } } return R.ok().add(vos); } @PostMapping("/latest/data/crn") @ManagerAuth(memo = "堆垛机实时数据") public R crnLatestData() { List vos = new ArrayList<>(); List crnList = deviceConfigService.selectList(new EntityWrapper() .eq("device_type", String.valueOf(SlaveType.Crn))); for (DeviceConfig deviceConfig : crnList) { // 获取堆垛机信息 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, deviceConfig.getDeviceNo()); if (crnThread == null) { continue; } CrnProtocol crnProtocol = crnThread.getStatus(); if (crnProtocol == null) { continue; } CrnLatestDataVo vo = new CrnLatestDataVo(); vo.setCrnId(crnProtocol.getCrnNo()); // 堆垛机编号 vo.setOffset((double) new Random().nextInt(560)); // 堆垛机偏移量 vo.setBay(crnProtocol.getBay()); // 当前列 /** * 堆垛机状态判断 */ if (crnProtocol.getAlarm() > 0) { vo.setCrnStatus(CrnStatusType.MACHINE_ERROR); } else { if (crnProtocol.getTaskNo() > 0) { WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo()); if (wrkMast != null) { vo.setCrnStatus(CrnStatusType.process(wrkMast.getIoType())); } else { vo.setCrnStatus(crnProtocol.modeType.equals(CrnModeType.AUTO) ? CrnStatusType.MACHINE_AUTO : CrnStatusType.MACHINE_UN_AUTO); } } else { vo.setCrnStatus(crnProtocol.modeType.equals(CrnModeType.AUTO) ? CrnStatusType.MACHINE_AUTO : CrnStatusType.MACHINE_UN_AUTO); } } vos.add(vo); } return R.ok().add(vos); } @PostMapping("/latest/data/rgv") @ManagerAuth(memo = "RGV实时数据") public R rgvLatestData(){ List vos = new ArrayList<>(); List rgvList = deviceConfigService.selectList(new EntityWrapper() .eq("device_type", String.valueOf(SlaveType.Rgv))); for (DeviceConfig deviceConfig : rgvList) { RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, deviceConfig.getDeviceNo()); if (rgvThread == null) { continue; } RgvProtocol rgvProtocol = rgvThread.getStatus(); if (rgvProtocol == null) { continue; } RgvLatestDataVo vo = new RgvLatestDataVo(); vo.setRgvNo(rgvProtocol.getRgvNo()); vo.setTrackSiteNo(String.valueOf(rgvProtocol.getRgvPos())); vo.setRgvStatus(RgvStatusType.get(rgvProtocol.getStatus())); vos.add(vo); } return R.ok().add(vos); } // @PostMapping("/latest/data/barcode") // @ManagerAuth(memo = "条码扫描仪实时数据") // public R barcodeLatestData(){ // List list = new ArrayList<>(); // for (Slave barcode : slaveProperties.getBarcode()) { // BarcodeThread barcodeThread = (BarcodeThread) // SlaveConnection.get(SlaveType.Barcode, barcode.getId()); // if (null == barcodeThread) { // continue; // } // BarcodeDataVo vo = new BarcodeDataVo(); // vo.setBarcodeId(barcode.getId()); // vo.setCodeValue(barcodeThread.getBarcode()); // list.add(vo); // } // return R.ok().add(list); // } @PostMapping("/crn/detail") @ManagerAuth(memo = "堆垛机设备数据详情") public R crnDetail(@RequestParam Integer crnNo) { if (Cools.isEmpty(crnNo)) { return R.parse(CodeRes.EMPTY); } CrnDetailVo vo = new CrnDetailVo(); DeviceConfig deviceConfig = deviceConfigService.selectOne(new EntityWrapper() .eq("device_type", String.valueOf(SlaveType.Crn)) .eq("device_no", crnNo)); if (deviceConfig == null) { return R.error("设备不存在"); } CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnNo); CrnProtocol crnProtocol = crnThread.getStatus(); vo.setCrnNo(crnNo); vo.setWorkNo(crnProtocol.getTaskNo()); vo.setCrnStatus(crnProtocol.getStatusType().desc); if (crnProtocol.getAlarm() > 0) { BasCrnpErr crnError = basCrnpErrService.selectById(crnProtocol.getAlarm()); vo.setError(crnError == null ? "未知异常" : crnError.getErrName()); } if (crnProtocol.getTaskNo() > 0) { WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo()); if (wrkMast != null) { vo.setSourceStaNo(String.valueOf(wrkMast.getSourceStaNo())); vo.setStaNo(String.valueOf(wrkMast.getStaNo())); vo.setWrkSts(wrkMast.getWrkSts$()); // 工作状态 vo.setIoType(wrkMast.getIoType$()); // 入出库类型 vo.setSourceLocNo(wrkMast.getSourceLocNo$()); vo.setLocNo(wrkMast.getLocNo$()); vo.setCrnStatus(crnProtocol.getStatusType().desc); vo.setError(""); // todo } } return R.ok().add(vo); } /** * 获取地图楼层数据 */ @GetMapping("/map/lev/list") @ManagerAuth public R getMapLevList() { List levList = locMastService.getLevList(); return R.ok().add(levList); } /** * 获取地图数据 */ @GetMapping("/map/{lev}/auth") public R getLocMap(@PathVariable Integer lev) { Object object = redisUtil.get(RedisKeyType.LOC_MAP_BASE.key); if (object == null) { return R.error("地图未初始化"); } List>> mapNodeList = (List>>) object; List locMastList = locMastService.selectLocByLev(lev); for (LocMast locMast : locMastList) { String[] locType = locMast.getLocType().split("-"); HashMap mapNode = mapNodeList.get(Integer.parseInt(locType[0])).get(Integer.parseInt(locType[1])); mapNode.put("locSts", locMast.getLocSts()); mapNode.put("locNo", locMast.getLocNo()); } return R.ok().add(mapNodeList); } }