package com.qianwen.smartman.modules.smis.service.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import com.alibaba.excel.write.merge.AbstractMergeStrategy; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import com.qianwen.core.excel.util.ExcelUtil; import com.qianwen.core.log.exception.ServiceException; import com.qianwen.core.mp.service.impl.BladeServiceImpl; import com.qianwen.core.mp.support.Condition; 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.smartman.common.constant.CommonConstant; import com.qianwen.smartman.common.constant.ExcelConstant; import com.qianwen.smartman.common.enums.StatusType; import com.qianwen.smartman.common.utils.MessageUtils; import com.qianwen.smartman.common.utils.ValidatorUtils; import com.qianwen.smartman.modules.smis.convert.DeviceTypeConvert; import com.qianwen.smartman.modules.smis.entity.DeviceType; import com.qianwen.smartman.modules.smis.entity.Machine; import com.qianwen.smartman.modules.smis.excel.DeviceTypeExcel; import com.qianwen.smartman.modules.smis.mapper.DeviceTypeMapper; import com.qianwen.smartman.modules.smis.service.IDeviceTypeService; import com.qianwen.smartman.modules.smis.service.IMachineService; import com.qianwen.smartman.modules.smis.vo.DeviceTypeAddVO; import com.qianwen.smartman.modules.smis.vo.DeviceTypeExcelVO; import com.qianwen.smartman.modules.smis.vo.DeviceTypeUpdateVO; import com.qianwen.smartman.modules.smis.vo.DeviceTypeVO; import com.qianwen.smartman.modules.resource.builder.oss.OssBuilder; @Service public class DeviceTypeServiceImpl extends BladeServiceImpl implements IDeviceTypeService { private final OssBuilder ossBuilder; private final IMachineService machineService; public DeviceTypeServiceImpl(final OssBuilder ossBuilder, final IMachineService machineService) { this.ossBuilder = ossBuilder; this.machineService = machineService; } @Override public DeviceType createDeviceType(DeviceTypeAddVO deviceTypeAddVO) { //DeviceType d;d.getTenantId() Long count = Long.valueOf(count(Wrappers.lambdaQuery() .eq(DeviceType::getCode, deviceTypeAddVO.getCode()) .eq(DeviceType::getStatus, CommonConstant.ENABLE) .eq(DeviceType::getTenantId, AuthUtil.getTenantId()))); /* Long count = Long.valueOf(count((Wrapper) ((LambdaQueryWrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getCode(); }, deviceTypeAddVO.getCode())).eq((v0) -> { return v0.getStatus(); }, CommonConstant.ENABLE)).eq((v0) -> { return v0.getTenantId(); }, AuthUtil.getTenantId())));*/ if (count.longValue() > 0) { throw new ServiceException(MessageUtils.message("cps.workstation.device.type.code.already.exists", new Object[0])); } boolean result = checkUnableType(deviceTypeAddVO.getCode()); if (result) { throw new ServiceException(MessageUtils.message("cps.work.station.device.already.stop.status", new Object[0])); } DeviceType deviceType = DeviceTypeConvert.INSTANCE.convert(deviceTypeAddVO); save(deviceType); return deviceType; } private boolean checkUnableType(String code) { DeviceType deviceType = getOne(Wrappers.lambdaQuery().eq(DeviceType::getCode, code).eq(DeviceType::getStatus, CommonConstant.DEACTIVATE)); if (deviceType != null) { return true; } return false; } @Override public DeviceType updateDeviceType(DeviceTypeUpdateVO deviceTypeUpdateVO) { Long count = Long.valueOf(count(Wrappers.lambdaQuery() .eq(DeviceType::getCode, checkExistDeviceType(deviceTypeUpdateVO.getId()).getCode()) .eq(DeviceType::getTenantId, AuthUtil.getTenantId()) .ne(DeviceType::getId, deviceTypeUpdateVO.getId()))); /* Long count = Long.valueOf(count(Wrappers.lambdaQuery().eq((v0) -> { return v0.getCode(); }, checkExistDeviceType(Long.valueOf(deviceTypeUpdateVO.getId().longValue())).getCode())).eq((v0) -> { return v0.getTenantId(); }, AuthUtil.getTenantId())).ne((v0) -> { return v0.getId(); }, deviceTypeUpdateVO.getId())));*/ if (count.longValue() > 0) { throw new ServiceException(MessageUtils.message("cps.workstation.device.type.code.already.exists", new Object[0])); } DeviceType deviceType = DeviceTypeConvert.INSTANCE.convert(deviceTypeUpdateVO); int nums = this.baseMapper.typeAndonRecord(Lists.newArrayList(new Long[]{deviceTypeUpdateVO.getId()})); if (nums > 0) { throw new ServiceException(MessageUtils.message("machine.type.andon.not.update", new Object[0])); } updateById(deviceType); return deviceType; } @Override public IPage pageDeviceType(String keyWord, Integer status, Query query) { //DeviceType::getTenantId DeviceType::getName IPage page = page(Condition.getPage(query), Wrappers.lambdaUpdate() .eq(DeviceType::getTenantId, AuthUtil.getTenantId()) .eq(DeviceType::getStatus, (status == null) ? CommonConstant.ENABLE : status) .and(Func.isNotEmpty(keyWord), wrapper -> wrapper.likeRight(DeviceType::getCode, keyWord).or().likeRight(DeviceType::getName, keyWord)) .orderByDesc(Arrays.asList(DeviceType::getCreateTime, DeviceType::getId) ) ); /* IPage page = page(Condition.getPage(query), (Wrapper) ((LambdaUpdateWrapper) ((LambdaUpdateWrapper) Wrappers.lambdaUpdate().eq((v0) -> { return v0.getTenantId(); }, AuthUtil.getTenantId())).eq((v0) -> { return v0.getStatus(); }, status == null ? CommonConstant.ENABLE : status)).and(Func.isNotEmpty(keyWord), wrapper -> { LambdaUpdateWrapper lambdaUpdateWrapper = (LambdaUpdateWrapper) ((LambdaUpdateWrapper) ((LambdaUpdateWrapper) wrapper.likeRight((v0) -> { return v0.getCode(); }, keyWord)).or()).likeRight((v0) -> { return v0.getName(); }, keyWord); }).orderByDesc((v0) -> { return v0.getCreateTime(); }, new SFunction[]{(v0) -> { return v0.getId(); }}));*/ return Optional.ofNullable(page).map(p -> { IPage page2 = new Page<>(p.getCurrent(), p.getSize(), p.getTotal()); page2.setRecords(DeviceTypeConvert.INSTANCE.convert(p.getRecords())); return page2; }).orElse(new Page<>()); } @Override public DeviceTypeVO getDeviceTypeById(Long id) { DeviceType deviceType = checkExistDeviceType(id); return DeviceTypeConvert.INSTANCE.convert(deviceType); } @Override public Boolean deleteDeviceTypeByIds(List ids, Integer type) { List machineList = this.machineService.list(Wrappers.lambdaQuery().in(Machine::getMachineTypeId, ids)); if (StatusType.REMOVE.getType().equals(type)) { if (CollectionUtil.isNotEmpty(machineList)) { throw new ServiceException(MessageUtils.message("cps.work.station.already.associated.with.the.device", new Object[0])); } int nums = this.baseMapper.typeAndonRecord(ids); if (nums > 0) { throw new ServiceException(MessageUtils.message("machine.type.andon.not.remove", new Object[0])); } return Boolean.valueOf(removeByIds(ids)); } else if (CollectionUtil.isNotEmpty(machineList)) { throw new ServiceException(MessageUtils.message("cps.work.station.already.associated.with.the.device.unable", new Object[0])); } else { return Boolean.valueOf(changeStatus(ids, CommonConstant.DEACTIVATE)); } } @Override public List listDeviceType(String keyword, Integer status) { List deviceTypes = list(Wrappers.lambdaQuery() .eq((status != null), DeviceType::getStatus, status) .and(Func.isNotEmpty(keyword), wrapper -> wrapper.likeRight(DeviceType::getCode, keyword).or().likeRight(DeviceType::getName, keyword)) .eq(Func.isNotEmpty(AuthUtil.getTenantId()), DeviceType::getTenantId, AuthUtil.getTenantId()).orderByAsc(DeviceType::getCode)); /* List deviceTypes2 = list((Wrapper) Wrappers.lambdaQuery().eq(status != null, (v0) -> { return v0.getStatus(); }, status).and(Func.isNotEmpty(keyword), wrapper -> { LambdaQueryWrapper lambdaQueryWrapper = (LambdaQueryWrapper) ((LambdaQueryWrapper) ((LambdaQueryWrapper) wrapper.likeRight((v0) -> { return v0.getCode(); }, keyword)).or()).likeRight((v0) -> { return v0.getName(); }, keyword); }).eq(Func.isNotEmpty(AuthUtil.getTenantId()), (v0) -> { return v0.getTenantId(); }, AuthUtil.getTenantId()).orderByAsc((v0) -> { return v0.getCode(); }));*/ List list = DeviceTypeConvert.INSTANCE.convert1(deviceTypes); return list; } @Override public BladeFile importDeviceType(List data) { if (Func.isEmpty(data)) { throw new ServiceException(MessageUtils.message("excel.import.data.can.not.be.null", new Object[0])); } if (data.size() > 200) { throw new ServiceException(MessageUtils.message("excel.import.size.failed", new Object[0])); } //DeviceType::getStatus List deviceTypes = list(Wrappers.lambdaQuery().eq(DeviceType::getStatus, CommonConstant.ENABLE)); Set codeSet = deviceTypes.stream().map((v0) -> { return v0.getCode(); }).collect(Collectors.toSet()); Boolean flag = Boolean.TRUE; for (DeviceTypeExcel datum : data) { if (Func.isBlank(datum.getCode())) { datum.setFailReason(MessageUtils.message("cps.work.station.device.code.is.null", new Object[0])); flag = Boolean.FALSE; } else { if (Func.isNotBlank(datum.getCode())) { if (codeSet.contains(datum.getCode())) { datum.setFailReason(MessageUtils.message("cps.workstation.device.type.code.already.exists", new Object[0])); flag = Boolean.FALSE; } else { codeSet.add(datum.getCode()); } } boolean result = checkUnableType(datum.getCode()); if (result) { datum.setFailReason(MessageUtils.message("cps.work.station.device.already.stop.status", new Object[0])); flag = Boolean.FALSE; } else if (Func.isBlank(datum.getName())) { datum.setFailReason(MessageUtils.message("cps.work.station.device.name.is.null", new Object[0])); flag = Boolean.FALSE; } else if (ValidatorUtils.stringFilter(datum.getCode())) { datum.setFailReason(MessageUtils.message("cps.device.type.code.exist.special.symbols.error", new Object[0])); flag = Boolean.FALSE; } else if (ValidatorUtils.stringFilter(datum.getName())) { datum.setFailReason(MessageUtils.message("cps.device.type.name.exist.special.symbols.error", new Object[0])); flag = Boolean.FALSE; } } } if (!flag.booleanValue()) { MultipartFile multipartFile = ExcelUtil.exportFillTemplateToMultipartFile(ExcelConstant.DIRECTORY + "机器类型导入失败模板" + ExcelConstant.SUFFIX, MessageUtils.message("excel.import.failed.report.name", new Object[0]) + ExcelConstant.SUFFIX, "机器类型表", data.stream().filter(x -> { return Func.isNotEmpty(x.getFailReason()); }).collect(Collectors.toList()), (Object) null, (AbstractMergeStrategy) null); BladeFile bladeFile = this.ossBuilder.tempTemplate().putFile(multipartFile.getOriginalFilename(), multipartFile); return bladeFile; } List list = new ArrayList<>(); data.forEach(x2 -> { DeviceType deviceType = DeviceTypeConvert.INSTANCE.convert(x2); list.add(deviceType); }); if (CollectionUtil.isNotEmpty(list)) { saveBatch(list); return null; } return null; } @Override public List getDeviceTypeAllList() { List list = list(); List result = DeviceTypeConvert.INSTANCE.convert(list); return result; } @Override public BladeFile export(DeviceTypeExcelVO deviceTypeExcelVO) { List list = listDeviceType(deviceTypeExcelVO.getKeyWord(), deviceTypeExcelVO.getStatus()); String fileName = String.format("%s-%s.xlsx", "机器类型数据", DateUtil.time()); MultipartFile multipartFile = ExcelUtil.exportToMultipartFile(fileName, "机器类型数据表", list, DeviceTypeExcel.class); BladeFile bladeFile = this.ossBuilder.tempTemplate().putFile(multipartFile.getOriginalFilename(), multipartFile); return bladeFile; } private DeviceType checkExistDeviceType(Long id) { DeviceType deviceType = (DeviceType) getById(id); if (Func.isEmpty(deviceType)) { throw new ServiceException(MessageUtils.message("cps.workstation.the.device.type.no.longer.exists", new Object[0])); } return deviceType; } boolean checkCodeIsExist(String code) { DeviceType one = getOne(Wrappers.lambdaQuery().eq(DeviceType::getCode, code) .eq(DeviceType::getTenantId, AuthUtil.getTenantId())); return Func.isNotEmpty(one); } }