package com.qianwen.smartman.modules.smis.service.impl; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.zip.CRC32; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.qianwen.core.log.exception.ServiceException; import com.qianwen.core.mp.base.BaseServiceImpl; import com.qianwen.core.tool.utils.Func; import com.qianwen.smartman.common.cache.cps.WorkstationCache; import com.qianwen.smartman.common.enums.WcsDataTypeEnums; import com.qianwen.smartman.common.utils.Lambda; import com.qianwen.smartman.common.utils.MessageUtils; import com.qianwen.smartman.modules.smis.convert.WorkstationWcsConvert; import com.qianwen.smartman.modules.smis.entity.DmpVariables; import com.qianwen.smartman.modules.smis.entity.WorkstationOfMachine; import com.qianwen.smartman.modules.smis.entity.WorkstationWcs; import com.qianwen.smartman.modules.smis.entity.WorkstationWcsUsage; import com.qianwen.smartman.modules.smis.mapper.WorkstationWcsMapper; import com.qianwen.smartman.modules.smis.service.IWorkstationOfMachineService; import com.qianwen.smartman.modules.smis.service.IWorkstationService; import com.qianwen.smartman.modules.smis.service.IWorkstationWcsService; import com.qianwen.smartman.modules.smis.service.IWorkstationWcsUsageService; import com.qianwen.smartman.modules.smis.vo.DmpVariablesVO; import com.qianwen.smartman.modules.smis.vo.MachineDmpVariablesVO; import com.qianwen.smartman.modules.smis.vo.WorkstationWcsSaveNewVO; import com.qianwen.smartman.modules.smis.vo.WorkstationWcsSaveVO; import com.qianwen.smartman.modules.smis.vo.WorkstationWcsVO; import com.qianwen.smartman.modules.tdengine.service.IWorkstationDynamicCollectService; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.HexUtil; @Service public class WorkstationWcsServiceImpl extends BaseServiceImpl implements IWorkstationWcsService { @Autowired private IWorkstationOfMachineService workstationOfMachineService; @Autowired @Lazy private IWorkstationService workstationService; //@Autowired //@Lazy //private IDmpVariablesService dmpVariablesService; @Autowired private IWorkstationDynamicCollectService dynamicCollectService; @Autowired @Lazy private IWorkstationWcsUsageService workstationWcsUsageService; private static final String SUFFIX = "_____0"; /* @Transactional(rollbackFor = {Exception.class}) public List updateBatch(List workstationWcsSaveVOList) { List workstationWcsList = WorkstationWcsConvert.INSTANCE.convertVOToEntity(workstationWcsSaveVOList); List workstationWcsIdList = new ArrayList<>(); List wcsList = new ArrayList<>(); for (WorkstationWcs workstationWcs : workstationWcsList) { List ids = list(Wrappers.lambdaQuery() .eq(Func.isNotEmpty(workstationWcs.getWorkstationId()), WorkstationWcs::getWorkstationId, workstationWcs.getWorkstationId()) .eq(WorkstationWcs::getCollectSettingItem, workstationWcs.getCollectSettingItem()) .eq(WorkstationWcs::getDataType, workstationWcs.getDataType()) .eq(WorkstationWcs::getDataItem, workstationWcs.getDataItem())) .stream().map(WorkstationWcs::getId).collect(Collectors.toList()); if (Func.isNotEmpty(ids)) { workstationWcsIdList.addAll(ids); } else { checkWorkstationWcs(workstationWcs);//检查数据是否存在 setCrc(workstationWcs); } MachineDmpVariablesVO machineDmpVariablesVO = this.dmpVariablesService.listByWorkstationId(workstationWcs.getWorkstationId()); List dmpVariablesVOList = machineDmpVariablesVO.getDmpVariablesVOList(); if (Func.isNotEmpty(dmpVariablesVOList)) { List nameList = dmpVariablesVOList.stream().map((v0) -> { return v0.getName(); }).collect(Collectors.toList()); if (nameList.contains(workstationWcs.getCollectSettingItem())) { Map dmpNameToId = dmpVariablesVOList.stream().collect(Collectors.toMap((v0) -> { return v0.getName(); }, (v0) -> { return v0.getId(); })); workstationWcs.setDmpVariablesId(dmpNameToId.get(workstationWcs.getCollectSettingItem())); wcsList.add(workstationWcs); } } } removeByIds(workstationWcsIdList); saveBatch(wcsList); List workstationIds = wcsList.stream().map((v0) -> { return v0.getWorkstationId(); }).collect(Collectors.toList()); if (Func.isNotEmpty(workstationIds)) { WorkstationCache.clearDmpStatus(workstationIds); clearWorkstationParamTypeCacheByWorkstationId(workstationIds); } List convert = WorkstationWcsConvert.INSTANCE.convert(wcsList); wrapperVO(convert); return convert; } */ /* @Override @Transactional(rollbackFor = {Exception.class}) public List insert(List workstationWcsSaveVOList) { Long workstationId = workstationWcsSaveVOList.get(0).getWorkstationId(); List checkedVoList = workstationWcsSaveVOList.stream().filter((v0) -> { return v0.checkedItem(); }).collect(Collectors.toList()); validWorkstationExistsWcs(checkedVoList); List dmpVariablesList = validDmpName(workstationId, checkedVoList); List saveWorkstationWcsList = WorkstationWcsConvert.INSTANCE.convertVOToEntity(checkedVoList); //删除tdengine中的count_data_${workstationId}_${usageCode}和aggregate_count_data_${workstationId}_${usageCode},实际上这2个表不存在 this.dynamicCollectService.removeTableUpdateWcs(saveWorkstationWcsList); //也是删除以上2个表,也是不存在的表 this.dynamicCollectService.removeTableDeleteWcs(list(Lambda.eq(WorkstationWcs::getWorkstationId, workstationId) .notIn(Func.isNotEmpty(saveWorkstationWcsList), WorkstationWcs::getCollectSettingItem, saveWorkstationWcsList .stream().map(WorkstationWcs::getCollectSettingItem) .collect(Collectors.toList())))); deleteByWorkstationIdList(Collections.singletonList(workstationId));//删除workstation_wsc的老数据 for (WorkstationWcs workstationWcs : saveWorkstationWcsList) { checkWorkstationWcs(workstationWcs); setCrc(workstationWcs); } List collect = saveWorkstationWcsList.stream().filter(w -> { return Func.isNotEmpty(w.getDataItem()); }).collect(Collectors.toList()); saveOrUpdateBatch(collect); //下一步更新排序(idx) Map idToIdx = workstationWcsSaveVOList.stream().collect(Collectors.toMap((v0) -> { return v0.getDmpVariablesId(); }, (v0) -> { return v0.getSort(); })); dmpVariablesList.forEach(dmpVariables -> { dmpVariables.setIdx(idToIdx.get(dmpVariables.getId()));//更新索引序号 }); this.dmpVariablesService.updateBatchById(dmpVariablesList); //更新缓存 List workstationIds = workstationWcsSaveVOList.stream().map((v0) -> { return v0.getWorkstationId(); }).collect(Collectors.toList()); WorkstationCache.clearDmpStatus(workstationIds); workstationIds.forEach(id -> { WorkstationCache.clearWorkstationWcs(String.valueOf(id)); }); clearWorkstationParamTypeCacheByWorkstationId(workstationIds); //返回所有数据的VO列表 return WorkstationWcsConvert.INSTANCE.convert(saveWorkstationWcsList); } */ private void validWorkstationExistsWcs(final List workstationWcsSaveVOList) { boolean exist = (workstationWcsSaveVOList.stream().filter(it -> { return !it.getDataType().equals(WcsDataTypeEnums.WcsDataType.OTHER.getCode()); }).filter(it2 -> { return it2.getUsageId() != null; }).collect(Collectors.groupingBy(it3 -> { return Long.valueOf(it3.getWorkstationId().longValue() + it3.getUsageId().longValue()); }, Collectors.counting()))).values().stream().anyMatch(count -> { return count.longValue() > 1; }); Assert.isTrue(!exist, MessageUtils.message("workstation.wcs.usage.id.already.exists", new Object[0]), new Object[0]); } /* private List validDmpName(Long workstationId, List workstationWcsSaveVOList) { WorkstationOfMachine one = this.workstationOfMachineService.getWorkstationOfMachineByWorkstationId(workstationId); List dmpVariablesList = this.dmpVariablesService.list(Wrappers.lambdaQuery().eq(DmpVariables::getMachineId, one.getMachineId())); Map dmpIdToName = dmpVariablesList.stream().collect(Collectors.toMap((v0) -> { return v0.getId(); }, (v0) -> { return v0.getName(); })); List collectItemList = workstationWcsSaveVOList.stream().map(w -> { return (String) dmpIdToName.get(w.getDmpVariablesId()); }).collect(Collectors.toList()); List collectItemDistinctList = collectItemList.stream().distinct().collect(Collectors.toList()); Assert.isTrue(collectItemList.size() == collectItemDistinctList.size(), MessageUtils.message("workstationWcs.collectItem.already.exists", new Object[0]), new Object[0]); return dmpVariablesList; }*/ public void setCrc(WorkstationWcs workstationWcs) { byte[] bytes = workstationWcs.getDataItem().concat(SUFFIX).getBytes(); CRC32 crc32 = new CRC32(); crc32.update(bytes, 0, bytes.length); String dataItemCrc = HexUtil.toHex(crc32.getValue()); workstationWcs.setDataItemCrc(dataItemCrc); } @Override public WorkstationWcsVO updateSetting(WorkstationWcsSaveVO workstationWcsSaveVO) { WorkstationWcs workstationWcs = WorkstationWcsConvert.INSTANCE.convert(workstationWcsSaveVO); checkSetting(workstationWcs); updateById(workstationWcs); WorkstationWcsVO workstationWcsVO = WorkstationWcsConvert.INSTANCE.convertVO(workstationWcsSaveVO); wrapperVO(Collections.singletonList(workstationWcsVO)); return workstationWcsVO; } @Override public List listWcsSetting() { List list = list( Wrappers.lambdaQuery().isNull(WorkstationWcs::getWorkstationId)); List convert = WorkstationWcsConvert.INSTANCE.convert(list); wrapperVO(convert); return convert; } @Override @Transactional(rollbackFor = {Exception.class}) public List saveSetting(List workstationWcsSaveVOList) { List workstationWcsList = WorkstationWcsConvert.INSTANCE.convertVOToEntity(workstationWcsSaveVOList); workstationWcsList.forEach(this::checkSetting); saveOrUpdateBatch(workstationWcsList); List convert = WorkstationWcsConvert.INSTANCE.convert(workstationWcsList); wrapperVO(convert); return convert; } public void checkSetting(WorkstationWcs workstationWcs) { Long count = Long.valueOf(count(Wrappers.lambdaQuery() .ne(Func.isNotEmpty(workstationWcs.getId()), WorkstationWcs::getId, workstationWcs.getId()) .eq(Func.isNotEmpty(workstationWcs.getWorkstationId()), WorkstationWcs::getWorkstationId, workstationWcs.getWorkstationId()) .isNull(Func.isEmpty(workstationWcs.getWorkstationId()), WorkstationWcs::getWorkstationId) .eq(WorkstationWcs::getCollectSettingItem, workstationWcs.getCollectSettingItem()))); /* Long count = Long.valueOf(count( Wrappers.lambdaQuery().ne(Func.isNotEmpty(workstationWcs.getId()), (v0) -> { return v0.getId(); }, workstationWcs.getId()).eq(Func.isNotEmpty(workstationWcs.getWorkstationId()), (v0) -> { return v0.getWorkstationId(); }, workstationWcs.getWorkstationId()).isNull(Func.isEmpty(workstationWcs.getWorkstationId()), (v0) -> { return v0.getWorkstationId(); }).eq((v0) -> { return v0.getCollectSettingItem(); }, workstationWcs.getCollectSettingItem())));*/ if (count.longValue() > 0) { throw new ServiceException(MessageUtils.message("workstationWcs.collectItem.already.exists", new Object[0])); } } @Override public Boolean deleteByWorkstationIdList(List workstationIdList) { remove(Wrappers.lambdaQuery().in(WorkstationWcs::getWorkstationId, workstationIdList)); /* remove((Wrapper) Wrappers.lambdaQuery().in((v0) -> { return v0.getWorkstationId(); }, workstationIdList));*/ clearWorkstationParamTypeCacheByWorkstationId(workstationIdList); return true; } @Override public List listWorkstationWcsByWorkstationId(Long workstationId) { List workstationWcsVOList = ((WorkstationWcsMapper) this.baseMapper).listWcs(workstationId); wrapperVO(workstationWcsVOList); return workstationWcsVOList; } private void wrapperVO(final List workstationWcsVOList) { workstationWcsVOList .forEach(it -> { it.setDataTypeDesc(WcsDataTypeEnums.WcsDataType.getNameByCode(it.getDataType())); //WorkstationWcsUsage usage = workstationWcsUsageService.getById(it.getUsageId()); //it.setUsageName(usage.getUsageName()); Optional.ofNullable(it.getUsageId()).map(usageId -> { WorkstationWcsUsage usage = workstationWcsUsageService.getById(usageId); return usage; }).ifPresent(usage2 -> { it.setUsageName(usage2.getUsageName()); }); //Optional.ofNullable(it.getUsageId()).map(this.workstationWcsUsageService::getById).ifPresent(()); }); /* workstationWcsVOList.forEach(it -> { it.setDataTypeDesc(WcsDataTypeEnums.WcsDataType.getNameByCode(it.getDataType())); Optional ofNullable = Optional.ofNullable(it.getUsageId()); IWorkstationWcsUsageService iWorkstationWcsUsageService = this.workstationWcsUsageService; iWorkstationWcsUsageService.getClass(); ofNullable.map((v1) -> { return r1.getById(v1); }).ifPresent(usage -> { it.setUsageName(usage.getUsageName()); }); });*/ } @Override public Boolean delete(List workstationWcsIdList) { List workstationWcs = listByIds(workstationWcsIdList); removeByIds(workstationWcsIdList); List workstationIds = workstationWcs.stream().map((v0) -> { return v0.getWorkstationId(); }).collect(Collectors.toList()); workstationIds.forEach(id -> { WorkstationCache.clearWorkstationWcs(String.valueOf(id)); }); clearWorkstationParamTypeCacheByWorkstationId(workstationIds); return null; } @Override public void clearWorkstationParamTypeCacheByWorkstationId(List workstationIdList) { List workstationOfMachineList = this.workstationOfMachineService.list(Wrappers.lambdaQuery() .in(WorkstationOfMachine::getWorkstationId, workstationIdList)); /* List workstationOfMachineList = this.workstationOfMachineService.list((Wrapper) Wrappers.lambdaQuery().in((v0) -> { return v0.getWorkstationId(); }, workstationIdList));*/ List machineIdList = workstationOfMachineList.stream().map((v0) -> { return v0.getMachineId(); }).collect(Collectors.toList()); for (Long id : machineIdList) { WorkstationCache.clearWorkstationParamTypeCache(String.valueOf(id)); } } @Override @Transactional(rollbackFor = {Exception.class}) public List insertNew(List workstationWcsSaveNewVOList, List workstationIdList) { List workstationWcsSaveVOList = new ArrayList<>(); workstationIdList.forEach(workstationId -> { List workstationWcsVOList = listWorkstationWcsByWorkstationId(workstationId); Map wcsCollectItemToId = workstationWcsVOList.stream().collect(Collectors.toMap((v0) -> { return v0.getCollectItemDesc(); }, (v0) -> { return v0.getId(); })); workstationWcsSaveNewVOList.forEach(workstationWcsSaveNewVO -> { if (wcsCollectItemToId.containsKey(workstationWcsSaveNewVO.getCollectSettingItem())) { WorkstationWcsSaveVO workstationWcsSaveVO = WorkstationWcsSaveVO.builder().id((Long) wcsCollectItemToId.get(workstationWcsSaveNewVO.getCollectSettingItem())).workstationId(workstationId).collectSettingItem(workstationWcsSaveNewVO.getCollectSettingItem()).dataItem(workstationWcsSaveNewVO.getDataItem()).dataType(workstationWcsSaveNewVO.getDataType()).bigScreen(workstationWcsSaveNewVO.getBigScreen()).realTimeData(workstationWcsSaveNewVO.getRealTimeData()).processParameter(workstationWcsSaveNewVO.getProcessParameter()).usageId(Long.valueOf(Func.toLong(workstationWcsSaveNewVO.getUsageId()))).build(); workstationWcsSaveVOList.add(workstationWcsSaveVO); } }); }); List workstationWcsList = WorkstationWcsConvert.INSTANCE.convertVOToEntity(workstationWcsSaveVOList); workstationWcsList.forEach(this::setCrc); Stream stream = workstationWcsSaveVOList.stream(); Stream stream2 = list(Lambda.in(WorkstationWcs::getWorkstationId, workstationIdList) .notIn(WorkstationWcs::getId,workstationWcsList .stream().map(WorkstationWcs::getId).collect(Collectors.toList())) .ne(WorkstationWcs::getDataType, WcsDataTypeEnums.WcsDataType.OTHER.getCode())) .stream().map(WorkstationWcsConvert.INSTANCE::convert); //Stream.concat(stream, stream2); validWorkstationExistsWcs(Stream.concat(stream, stream2).collect(Collectors.toList())); /* Stream stream = workstationWcsSaveVOList.stream(); Stream stream2 = list((Wrapper) ((ExtraLambdaQueryWrapper) Lambda.in((v0) -> { return v0.getWorkstationId(); }, workstationIdList).notIn((v0) -> { return v0.getId(); }, (Collection) workstationWcsList.stream().map((v0) -> { return v0.getId(); }).collect(Collectors.toList()))).ne((v0) -> { return v0.getDataType(); }, WcsDataTypeEnums.WcsDataType.OTHER.getCode())).stream(); WorkstationWcsConvert workstationWcsConvert = WorkstationWcsConvert.INSTANCE; workstationWcsConvert.getClass(); validWorkstationExistsWcs((List) Stream.concat(stream, stream2.map(this::convert)).collect(Collectors.toList())); */ this.dynamicCollectService.removeTableUpdateWcs(workstationWcsList); updateBatchById(workstationWcsList); WorkstationCache.clearDmpStatus(workstationIdList); workstationIdList.forEach(id -> { WorkstationCache.clearWorkstationWcs(String.valueOf(id)); }); clearWorkstationParamTypeCacheByWorkstationId(workstationIdList); List convert = WorkstationWcsConvert.INSTANCE.convert(workstationWcsList); wrapperVO(convert); return convert; } @Override public String isExists(List workstationWcsSaveNewVOList, List workstationIdList) { Map workstationIdToName = this.workstationService.listByIds(workstationIdList).stream().collect(Collectors.toMap((v0) -> { return v0.getId(); }, (v0) -> { return v0.getName(); })); StringBuilder name = new StringBuilder(""); Set idSet = new HashSet<>(); for (Long workstationId : workstationIdList) { for (WorkstationWcsSaveNewVO w : workstationWcsSaveNewVOList) { Long count = Long.valueOf(count(Wrappers.lambdaQuery() .eq(WorkstationWcs::getWorkstationId, workstationId).eq(WorkstationWcs::getDmpVariablesId, w.getDmpVariablesId()) .eq(WorkstationWcs::getDataType, w.getDataType()).eq(WorkstationWcs::getDataItem, w.getDataItem()))); /* Long count = Long.valueOf(count((Wrapper) ((LambdaQueryWrapper) ((LambdaQueryWrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getWorkstationId(); }, workstationId)).eq((v0) -> { return v0.getDmpVariablesId(); }, w.getDmpVariablesId())).eq((v0) -> { return v0.getDataType(); }, w.getDataType())).eq((v0) -> { return v0.getDataItem(); }, w.getDataItem())));*/ if (count.longValue() > 0) { idSet.add(workstationId); } } } idSet.forEach(id -> { name.append(",").append((String) workstationIdToName.get(id)); }); return Func.isNotEmpty(name) ? name.substring(1) : name.toString(); } /*** * 检查工况参数配置的数据类型dataType,和对应的数据是否存在 * @param workstationWcs */ private void checkWorkstationWcs(WorkstationWcs workstationWcs) { if (WcsDataTypeEnums.ONLY_ONE_LIST.contains(workstationWcs.getDataType())) { Long count = Long.valueOf(count(Wrappers.lambdaQuery() .ne(Func.isNotEmpty(workstationWcs.getId()), WorkstationWcs::getId, workstationWcs.getId()) .eq(Func.isNotEmpty(workstationWcs.getWorkstationId()), WorkstationWcs::getWorkstationId, workstationWcs.getWorkstationId()) .isNotNull(Func.isNotEmpty(workstationWcs.getWorkstationId()), WorkstationWcs::getWorkstationId) .eq(WorkstationWcs::getDataType, workstationWcs.getDataType()))); if (count.longValue() > 0) { throw new ServiceException(MessageUtils.message("workstationWcs.dataType.already.exists", new Object[0])); } } Long count2 = Long.valueOf(count(Wrappers.lambdaQuery() .ne(Func.isNotEmpty(workstationWcs.getId()), WorkstationWcs::getId, workstationWcs.getId()) .eq(Func.isNotEmpty(workstationWcs.getWorkstationId()), WorkstationWcs::getWorkstationId, workstationWcs.getWorkstationId()) .isNotNull(Func.isNotEmpty(workstationWcs.getWorkstationId()), WorkstationWcs::getWorkstationId) .eq(WorkstationWcs::getDmpVariablesId, workstationWcs.getDmpVariablesId()))); if (count2.longValue() > 0) { throw new ServiceException(MessageUtils.message("workstationWcs.collectItem.already.exists", new Object[0])); } } }