| | |
| | | import com.alibaba.excel.write.merge.AbstractMergeStrategy; |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.Wrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | |
| | | import com.qianwen.core.mp.support.Query; |
| | | import com.qianwen.core.oss.model.BladeFile; |
| | | import com.qianwen.core.secure.utils.AuthUtil; |
| | | import com.qianwen.core.tool.utils.CollectionUtil; |
| | | import com.qianwen.core.tool.utils.DateUtil; |
| | | import com.qianwen.core.tool.utils.Func; |
| | | import com.qianwen.core.tool.utils.StringUtil; |
| | | import com.qianwen.license.common.LicenseExtraModel; |
| | | import com.qianwen.license.common.LicenseVerify; |
| | | import com.qianwen.smartman.common.cache.DictCache; |
| | | import com.qianwen.smartman.common.cache.cps.WorkstationCache; |
| | | import com.qianwen.smartman.common.constant.CalendarConstant; |
| | |
| | | import com.qianwen.smartman.common.enums.DictEnum; |
| | | import com.qianwen.smartman.common.enums.StatusType; |
| | | import com.qianwen.smartman.common.enums.WcsDataTypeEnums; |
| | | import com.qianwen.smartman.common.license.LicenseWrapper; |
| | | import com.qianwen.smartman.common.mqtt.MqttMessageSender; |
| | | import com.qianwen.smartman.common.utils.Lambda; |
| | | import com.qianwen.smartman.common.utils.MessageUtils; |
| | |
| | | import com.qianwen.smartman.modules.smis.service.ICalendarService; |
| | | import com.qianwen.smartman.modules.smis.service.ICommonGroupOfItemService; |
| | | import com.qianwen.smartman.modules.smis.service.ICommonGroupService; |
| | | import com.qianwen.smartman.modules.smis.service.IDmpVariablesService; |
| | | import com.qianwen.smartman.modules.smis.service.IMachineService; |
| | | import com.qianwen.smartman.modules.smis.service.IWorkstationOfMachineService; |
| | | import com.qianwen.smartman.modules.smis.service.IWorkstationService; |
| | |
| | | private WorkstationMapper workstationMapper; |
| | | @Autowired |
| | | private OssBuilder ossBuilder; |
| | | @Autowired |
| | | private IDmpVariablesService dmpVariablesService; |
| | | |
| | | |
| | | @Autowired |
| | | private IWorkstationWorkbenchService workbenchService; |
| | |
| | | private MqttMessageSender mqttMsgSender; |
| | | @Autowired |
| | | private WorkstationDatapointsService wsDpService; |
| | | @Autowired |
| | | private LicenseWrapper licenseWrapper; |
| | | @Autowired |
| | | private WorkstationDatapointsService dataPointService; |
| | | |
| | | private final String NAME = "默认工作台"; |
| | | private final Integer SORT = 1; |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = {Exception.class}) |
| | | public WorkstationVO submit(WorkstationSubmitVO workstationSubmitVO) { |
| | | |
| | | checkLicenseCount(); |
| | | |
| | | checkWorkstation(workstationSubmitVO); |
| | | if (Func.isEmpty(workstationSubmitVO.getId())) { |
| | | checkUnableWorkstation(workstationSubmitVO); |
| | |
| | | submitWorkstationWorkbench(workstationSubmitVO, workstation); |
| | | WorkstationCache.clearWorkstationCache(); |
| | | WorkstationCache.clearWorkstationRealTime(workstation.getId()); |
| | | CacheUtil.clear(ExtCacheConstant.POSTING_WORKSTATION, Boolean.FALSE); |
| | | CacheUtil.clear(ExtCacheConstant.COLLECT_WORKSTATION, Boolean.FALSE); |
| | | CacheUtil.clear(ExtCacheConstant.POSTING_MACHINE, Boolean.FALSE); |
| | | CacheUtil.clear(ExtCacheConstant.WORKSTATION_MACHINE, Boolean.FALSE); |
| | | String redisKey = ExtCacheConstant.CPS_CACHE.concat(":").concat(":").concat(WorkstationCache.CRC); |
| | |
| | | |
| | | } |
| | | return workstationVO; |
| | | } |
| | | |
| | | /** |
| | | * 验证许可中配置的设备数量 |
| | | */ |
| | | void checkLicenseCount() { |
| | | |
| | | Wrapper<Workstation> wrapper = Wrappers.lambdaQuery(Workstation.class).eq(Workstation::getIsDeleted, 0); |
| | | Long count = workstationMapper.selectCount(wrapper); |
| | | |
| | | |
| | | Long machineAmount = licenseWrapper.getWorkstationAmount(); |
| | | if(count >= machineAmount) { |
| | | throw new ServiceException("工位数超过许可上限数:"+ machineAmount); |
| | | } |
| | | } |
| | | /* |
| | | private void submitWorkstationFtpDirectory(WorkstationSubmitVO workstationSubmitVO, Workstation workstation) { |
| | |
| | | this.workstationWcsService.deleteByWorkstationIdList(workstationIds); |
| | | this.workstationOfMachineService.remove(Wrappers.<WorkstationOfMachine>lambdaQuery().in(WorkstationOfMachine::getWorkstationId, workstationIds)); |
| | | this.commonGroupOfItemService.remove(Wrappers.<CommonGroupOfItem>lambdaQuery().in(CommonGroupOfItem::getItemId, workstationIds)); |
| | | |
| | | //20250324新增,删除工位对应的数据点位配置。 |
| | | dataPointService.removeByWorkstation(workstationIds); |
| | | /* |
| | | this.workstationOfMachineService.remove((Wrapper) Wrappers.lambdaQuery().in((v0) -> { |
| | | return v0.getWorkstationId(); |
| | |
| | | return v0.getItemId(); |
| | | }, workstationIds));*/ |
| | | WorkstationCache.clearWorkstationCache(); |
| | | CacheUtil.clear(ExtCacheConstant.POSTING_WORKSTATION, Boolean.FALSE); |
| | | CacheUtil.clear(ExtCacheConstant.COLLECT_WORKSTATION, Boolean.FALSE); |
| | | CacheUtil.clear(ExtCacheConstant.POSTING_MACHINE, Boolean.FALSE); |
| | | CacheUtil.clear(ExtCacheConstant.WORKSTATION_MACHINE, Boolean.FALSE); |
| | | CacheUtil.clear(redisKey, Boolean.FALSE); |
| | | } |
| | | changeStatus(workstationIds, CommonConstant.DEACTIVATE); |
| | | WorkstationCache.clearWorkstationCache(); |
| | | CacheUtil.clear(ExtCacheConstant.POSTING_WORKSTATION, Boolean.FALSE); |
| | | CacheUtil.clear(ExtCacheConstant.COLLECT_WORKSTATION, Boolean.FALSE); |
| | | CacheUtil.clear(ExtCacheConstant.POSTING_MACHINE, Boolean.FALSE); |
| | | CacheUtil.clear(ExtCacheConstant.WORKSTATION_MACHINE, Boolean.FALSE); |
| | | CacheUtil.clear(redisKey, Boolean.FALSE); |
| | |
| | | return String.valueOf(item.getId()); |
| | | }).collect(Collectors.toList())); |
| | | } |
| | | List<WorkstationVO> workstationVOS = this.workstationMapper.listPage(workStationGroupIdList, workstationVOIPage, keyWord, groupId, CommonGroupConstant.ALL_WORKSTATION_ID, status == null ? CommonConstant.ENABLE : status, type, Integer.valueOf(LocalDate.now().getYear())); |
| | | List<WorkstationVO> workstationVOS = this.workstationMapper.listPage(workStationGroupIdList, workstationVOIPage, keyWord, groupId, CommonGroupConstant.ALL_WORKSTATION_ID, status == null ? CommonConstant.ENABLE : status, type, LocalDate.now().getYear()); |
| | | workstationVOS.forEach(workstationVO -> { |
| | | String calendarName = workstationVO.getCalendarName(); |
| | | if (Func.isBlank(calendarName)) { |
| | |
| | | return manualBuildIPage(query, buildProperties(result, dto.getDeviceStatus())); |
| | | } |
| | | |
| | | @Override |
| | | public List<RealTimeStatusVO> getRealTimeProperties(Long workstationId, Long machineId) { |
| | | List<RealTimeStatusVO> properties = new ArrayList<>(); |
| | | Map<String, Object> map = WorkstationCache.getWorkstationRealTime(String.valueOf(workstationId)); |
| | | List<DmpVariablesVO> list = this.dmpVariablesService.getDmpVariablesByWorkstationId(workstationId); |
| | | if (CollectionUtil.isNotEmpty(list)) { |
| | | list.forEach(dmpVariablesVO -> { |
| | | RealTimeStatusVO vo = new RealTimeStatusVO(); |
| | | vo.setKey(dmpVariablesVO.getName()); |
| | | vo.setName(dmpVariablesVO.getDescription()); |
| | | vo.setUnit(dmpVariablesVO.getDmpType()); |
| | | vo.setSort(dmpVariablesVO.getIdx()); |
| | | vo.setWcsDataType(dmpVariablesVO.getWcsDataType()); |
| | | vo.setBigScreen(dmpVariablesVO.getBigScreen()); |
| | | vo.setRealTimeData(dmpVariablesVO.getRealTimeData()); |
| | | if (map.containsKey(dmpVariablesVO.getName())) { |
| | | TelemetryDataResponseDTO t = (TelemetryDataResponseDTO) MapUtils.getObject(map, dmpVariablesVO.getName()); |
| | | vo.setValue(t.getV()); |
| | | } |
| | | properties.add(vo); |
| | | }); |
| | | } |
| | | return properties; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 获取实时数据展示的数据点列表 |
| | | * @param workstationIdList 工位id集合 |
| | | * @return map(工位id -> 数据点集合) |
| | | */ |
| | | public Map<Long, List<RealTimeStatusVO>> getRealTimeProperties(List<Long> workstationIdList) { |
| | | Map<Long, List<RealTimeStatusVO>> properties = new HashMap<>(); |
| | | //在这里!!!! |
| | | //顶顶顶顶 |
| | | //List<DmpVariablesVO> list = this.dmpVariablesService.getDmpVariablesByWorkstationIds(workstationIdList); |
| | | //this.wsDpService.getDatapointsByWorkstationIds(); |
| | | //if (Func.isNotEmpty(list)) { |
| | | /* |
| | | Map<Long, List<DmpVariablesVO>> dmpVariablesMap =list.stream().collect(Collectors.groupingBy((v0) -> { |
| | | return v0.getWorkstationId(); |
| | | })); |
| | | dmpVariablesMap.forEach((workstationId, dmpVariablesVOList) -> { |
| | | ArrayList<RealTimeStatusVO> arrayList = new ArrayList<>(); |
| | | Map<String, Object> map = WorkstationCache.getWorkstationRealTime(String.valueOf(workstationId));//应该有数据,因为缓存没有,直接查的queryLastParameter |
| | | dmpVariablesVOList.forEach(dmpVariablesVO -> { |
| | | RealTimeStatusVO vo = new RealTimeStatusVO(); |
| | | vo.setKey(dmpVariablesVO.getName()); |
| | | vo.setName(dmpVariablesVO.getDescription()); |
| | | vo.setUnit(dmpVariablesVO.getDmpType()); |
| | | vo.setSort(dmpVariablesVO.getIdx()); |
| | | vo.setWcsDataType(dmpVariablesVO.getWcsDataType()); |
| | | vo.setBigScreen(dmpVariablesVO.getBigScreen()); |
| | | vo.setRealTimeData(dmpVariablesVO.getRealTimeData()); |
| | | if (map.containsKey(dmpVariablesVO.getName())) { |
| | | TelemetryDataResponseDTO t = (TelemetryDataResponseDTO) MapUtils.getObject(map, dmpVariablesVO.getName()); |
| | | vo.setValue(t.getV()); |
| | | } |
| | | arrayList.add(vo); |
| | | }); |
| | | properties.put(workstationId, arrayList); |
| | | }); |
| | | */ |
| | | |
| | | //} |
| | | |
| | | //yangys修改,改为数据点位的方式 |
| | | for(Long workstationId: workstationIdList) { |
| | | |
| | |
| | | WorkstationDatapointsVO dpVO = wsDpService.getDatapoints(workstationId); |
| | | if(dpVO!=null && ObjectUtil.isNotEmpty(dpVO.getDpHead())) { |
| | | |
| | | String prop,label; |
| | | String prop; |
| | | JSONArray dpCfgJson = JSONArray.parseArray(dpVO.getDpConfig()); |
| | | for(int i=0;i<dpCfgJson.size();i++) { |
| | | cfgRow = dpCfgJson.getJSONObject(i); |
| | |
| | | RealTimeStatusVO vo = new RealTimeStatusVO(); |
| | | prop = cfgRow.getString("dpName"); |
| | | vo.setKey(prop); |
| | | |
| | | /* |
| | | label = prop; |
| | | if(StringUtils.equals("DeviceStatus", prop)) { |
| | | label = "状态"; |
| | |
| | | label = "产量"; |
| | | }else if(StringUtils.equals("AlarmNo", prop)) { |
| | | label = "告警号"; |
| | | } |
| | | vo.setName(label); |
| | | //vo.setUnit(headRow.getString("dpUnit")); |
| | | }*/ |
| | | vo.setName(cfgRow.getString("dpLabel")); |
| | | vo.setSort(i); |
| | | //vo.setWcsDataType(dmpVariablesVO.getWcsDataType()); |
| | | vo.setBigScreen(false); |
| | | vo.setRealTimeData(true); |
| | | |
| | |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /* |
| | | @Override |
| | | public List<DmpVariablesVO> getDmpVariables(String workstationId, String machineId) { |
| | | if (Func.isBlank(machineId)) { |
| | |
| | | return v0.getRealTimeData(); |
| | | }).collect(Collectors.toList()); |
| | | } |
| | | */ |
| | | |
| | | private void checkWorkstation(WorkstationSubmitVO workstationSubmitVO) { |
| | | if (Func.isNotEmpty(workstationSubmitVO.getCode()) && workstationSubmitVO.getCode().length() > 24) { |
| | |
| | | } |
| | | |
| | | private IPage<WorkstationRealTimeStatusVO> manualBuildIPage(Query query, List<WorkstationRealTimeStatusVO> result) { |
| | | Page<WorkstationRealTimeStatusVO> page = new Page<>(query.getCurrent().intValue(), query.getSize().intValue(), result.size()); |
| | | Page<WorkstationRealTimeStatusVO> page = new Page<>(query.getCurrent(), query.getSize(), result.size()); |
| | | if (result.size() == 0) { |
| | | return page; |
| | | } |
| | | if (query.getSize().intValue() == -1) { |
| | | if (query.getSize() == -1) { |
| | | page.setRecords(result); |
| | | } else if (result.size() < ((query.getCurrent().intValue() - 1) * query.getSize().intValue()) + query.getSize().intValue()) { |
| | | page.setRecords(result.subList((query.getCurrent().intValue() - 1) * query.getSize().intValue(), result.size())); |
| | | } else if (result.size() < ((query.getCurrent() - 1) * query.getSize()) + query.getSize()) { |
| | | page.setRecords(result.subList((query.getCurrent() - 1) * query.getSize(), result.size())); |
| | | } else { |
| | | page.setRecords(result.subList((query.getCurrent().intValue() - 1) * query.getSize().intValue(), ((query.getCurrent().intValue() - 1) * query.getSize().intValue()) + query.getSize().intValue())); |
| | | page.setRecords(result.subList((query.getCurrent() - 1) * query.getSize(), ((query.getCurrent() - 1) * query.getSize()) + query.getSize())); |
| | | } |
| | | return page; |
| | | } |
| | |
| | | return dataList; |
| | | } |
| | | //TODO,格式太差 |
| | | Map<Long, List<RealTimeStatusVO>> realTimePropertiesMap = getRealTimeProperties( list.stream().map((v0) -> { |
| | | return v0.getId(); |
| | | }).collect(Collectors.toList())); |
| | | Map<Long, List<RealTimeStatusVO>> realTimePropertiesMap = getRealTimeProperties( list.stream().map(WorkstationRealTimeStatusVO::getId).collect(Collectors.toList())); |
| | | |
| | | return list.stream().filter(i -> { |
| | | boolean filter = Boolean.TRUE.booleanValue(); |
| | | boolean filter = true; |
| | | |
| | | if (Func.isEmpty(i.getMachineId())) { |
| | | filter = false; |
| | | } |
| | | |
| | | List<RealTimeStatusVO> properties = realTimePropertiesMap.get(i.getId()); |
| | | if (Func.isNotEmpty(deviceStatus)) { |
| | | if (Func.isEmpty(properties)) { |