package com.zy.asrs.wcs.core.map.service; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.framework.common.Cools; import com.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wcs.common.domain.enums.DictType; import com.zy.asrs.wcs.core.entity.BasShuttle; import com.zy.asrs.wcs.core.entity.Loc; import com.zy.asrs.wcs.core.map.controller.param.MapDataParam; import com.zy.asrs.wcs.core.map.controller.param.MapQueryParam; import com.zy.asrs.wcs.core.map.controller.result.LiftVo; import com.zy.asrs.wcs.core.map.controller.result.LocVo; import com.zy.asrs.wcs.core.map.controller.result.ShuttleVo; import com.zy.asrs.wcs.core.map.entity.MapItem; import com.zy.asrs.wcs.core.model.enums.DeviceCtgType; import com.zy.asrs.wcs.core.model.enums.LocStsType; import com.zy.asrs.wcs.core.service.BasShuttleService; import com.zy.asrs.wcs.core.service.LocService; import com.zy.asrs.wcs.core.service.LocStsService; import com.zy.asrs.wcs.core.utils.Utils; import com.zy.asrs.wcs.rcs.entity.Device; import com.zy.asrs.wcs.rcs.model.protocol.LiftProtocol; import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol; import com.zy.asrs.wcs.rcs.service.DeviceService; import com.zy.asrs.wcs.rcs.service.DeviceTypeService; import com.zy.asrs.wcs.system.entity.Dict; import com.zy.asrs.wcs.system.service.DictService; import com.zy.asrs.wcs.system.service.UserService; import com.zy.asrs.wcs.utils.CommonUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; /** * Created by vincent on 3/15/2024 */ @Service public class MapService { @Autowired private UserService userService; @Autowired private DictService dictService; @Autowired private DeviceTypeService deviceTypeService; @Autowired private DeviceService deviceService; @Autowired private LocService locService; @Autowired private LocStsService locStsService; @Autowired private BasShuttleService basShuttleService; public String getMapFloorList(Long userId) { String floorKey = "floor-list"; Dict dict = dictService.getOne(new LambdaQueryWrapper().eq(Dict::getFlag, floorKey)); if (null == dict) { dict = new Dict(); dict.setName(floorKey); dict.setFlag(floorKey); dict.setType(DictType.JSON.flag); dict.setValue(floorListStr); dict.setCreateBy(userId); dict.setUpdateBy(userId); if (!dictService.save(dict)) { throw new CoolException("服务器内部错误"); } } return Optional.ofNullable(dict).map(Dict::getValue).orElse(null); } public String getMapData(MapQueryParam param, Long userId) { String mapKey = getMapKey(param.getFloor()); Dict dict = dictService.getOne(new LambdaQueryWrapper().eq(Dict::getFlag, mapKey)); return Optional.ofNullable(dict).map(Dict::getValue).orElse(null); } @Transactional public void saveMapData(MapDataParam param, Long userId) { Date now = new Date(); // dict String mapKey = getMapKey(param.getFloor()); Dict dict = dictService.getOne(new LambdaQueryWrapper().eq(Dict::getFlag, mapKey)); if (Cools.isEmpty(dict)) { dict = new Dict(); dict.setName(mapKey); dict.setFlag(mapKey); dict.setType(DictType.JSON.flag); dict.setValue(JSON.toJSONString(param.getItemList())); dict.setCreateBy(userId); dict.setUpdateBy(userId); if (!dictService.save(dict)) { throw new CoolException("服务器内部错误"); } } else { dict.setValue(JSON.toJSONString(param.getItemList())); dict.setUpdateTime(new Date()); dict.setUpdateBy(userId); if (!dictService.updateById(dict)) { throw new CoolException("服务器内部错误"); } } // loc List newLocList = new ArrayList<>(); for (MapItem item : param.getItemList()) { int row = Integer.parseInt(String.valueOf(item.getProperty().get("row"))); int bay = Integer.parseInt(String.valueOf(item.getProperty().get("bay"))); String locNo = Utils.getLocNo(row, bay, param.getFloor()); newLocList.add(locNo); } List existLocList = locService.list(new LambdaQueryWrapper().eq(Loc::getLev, param.getFloor())) .stream().map(Loc::getLocNo).collect(Collectors.toList()); List locListToSave = newLocList.stream().filter(locNo -> !existLocList.contains(locNo)).collect(Collectors.toList()); List locListToRemove = existLocList.stream().filter(locNo -> !newLocList.contains(locNo)).collect(Collectors.toList()); List locListInBoth = newLocList.stream().filter(existLocList::contains).collect(Collectors.toList()); for (String locNo : locListToSave) { Loc loc = new Loc(); loc.setLocNo(locNo); loc.setName(locNo); loc.setRow(Utils.getRow(locNo)); loc.setBay(Utils.getBay(locNo)); loc.setLev(Utils.getLev(locNo)); loc.setLocSts(LocStsType.O.val()); loc.setCreateBy(userId); loc.setCreateTime(now); loc.setUpdateBy(userId); loc.setUpdateTime(now); if (!locService.save(loc)) { throw new CoolException("服务器内部错误"); } } for (String locNo : locListToRemove) { if (!locService.remove(new LambdaQueryWrapper().eq(Loc::getLocNo, locNo))) { throw new CoolException("服务器内部错误"); } } for (String locNo : locListInBoth) { } } public List getShelfLocNoGroup(String locNo) { List locVos = new ArrayList<>(); int row = Utils.getRow(locNo); int bay = Utils.getBay(locNo); List locList = locService.list(new LambdaQueryWrapper().eq(Loc::getRow, row).eq(Loc::getBay, bay).orderByAsc(Loc::getLev)); for (Loc loc : locList) { LocVo locVo = new LocVo(); locVo.setLocNo(loc.getLocNo()); locVo.setLocSts(loc.getLocStsFlag()); locVo.setZpallet(loc.getZpallet()); locVo.setEnable(CommonUtils.getStatusBool(loc.getStatus())); locVos.add(locVo); } return locVos; } public LocVo getShelfLocNoInfo(String locNo) { LocVo locVo = new LocVo(); locVo.setLocNo(locNo); Loc loc = locService.selectByLocNo(locNo); if (null == loc) { return locVo; } locVo.setLocSts(loc.getLocStsFlag()); locVo.setZpallet(loc.getZpallet()); locVo.setEnable(CommonUtils.getStatusBool(loc.getStatus())); return locVo; } public ShuttleVo getShuttleInfo(String shuttleNo) { ShuttleVo vo = new ShuttleVo(); vo.setShuttleNo(shuttleNo); Device device = deviceService.getOne(new LambdaQueryWrapper() .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val()) .eq(Device::getDeviceNo, shuttleNo) ); if (null == device) { return vo; } BasShuttle basShuttle = basShuttleService.getOne(new LambdaQueryWrapper().eq(BasShuttle::getDeviceId, device.getId())); if (null == basShuttle || Cools.isEmpty(basShuttle.getProtocol())) { return vo; } ShuttleProtocol protocol = JSON.parseObject(basShuttle.getProtocol(), ShuttleProtocol.class); // ShuttleThread thread = (ShuttleThread)SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue()); // if (null == thread) { // return vo; // } // ShuttleProtocol protocol = thread.getStatus(); // if (null == protocol) { // return vo; // } vo.setTaskNo(String.valueOf(protocol.getTaskNo())); vo.setStatus(protocol.getProtocolStatusType().desc); vo.setOriginLocNo(protocol.getSourceLocNo()); vo.setDestLocNo(protocol.getLocNo()); vo.setCurrentCode(protocol.getCurrentCode()); vo.setCurrentLocNo(protocol.getCurrentLocNo()); vo.setBatteryPower(protocol.getBatteryPower()); vo.setErrorCode(protocol.getErrorCode()); vo.setBatteryTemp(protocol.getBatteryTemp()); vo.setHasLift(protocol.getHasLift()); vo.setHasPallet(protocol.getHasPallet()); vo.setHasCharge(protocol.getHasCharge()); vo.setBatteryVoltage(String.valueOf(protocol.getBatteryVoltage())); // vo.setZpallet(); vo.setPakMk(protocol.getPakMk()); vo.setEnable(CommonUtils.getStatusBool(basShuttle.getStatus())); return vo; } public LiftVo getLiftInfo(String liftNo) { LiftVo vo = new LiftVo(); vo.setLiftNo(liftNo); LiftProtocol protocol = new LiftProtocol(); // todo checkout protocol // vo.setTaskNo(String.valueOf(protocol.getTaskNo())); // vo.setStatus(protocol.getProtocolStatusType().desc); // vo.setOriginLocNo(protocol.getSourceLocNo()); // vo.setDestLocNo(protocol.getLocNo()); // vo.setCurrentCode(protocol.getCurrentCode()); // vo.setBatteryPower(protocol.getBatteryPower()); // vo.setErrorCode(protocol.getErrorCode()); // vo.setBatteryTemp(protocol.getBatteryTemp()); // vo.setHasLift(protocol.getHasLift()); // vo.setHasPallet(protocol.getHasPallet()); // vo.setHasCharge(protocol.getHasCharge()); // vo.setBatteryVoltage(String.valueOf(protocol.getBatteryVoltage())); // vo.setPakMk(protocol.getPakMk()); return vo; } private String getMapKey(Integer floor) { if (null != floor) { return "map-" + floor; } return "map"; } private final String floorListStr = "[\n" + " {\n" + " label: '1F',\n" + " value: 1\n" + " },\n" + "]"; }