package com.qianwen.smartman.modules.cps.service.impl; import cn.hutool.core.util.StrUtil; import com.alibaba.excel.write.merge.AbstractMergeStrategy; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.google.common.collect.Sets; import java.lang.invoke.SerializedLambda; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import org.apache.commons.compress.utils.Lists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.qianwen.smartman.common.cache.RegionCache; import com.qianwen.smartman.common.constant.CommonGroupConstant; import com.qianwen.smartman.common.constant.ExcelConstant; import com.qianwen.smartman.common.constant.ToolingConstant; import com.qianwen.smartman.common.enums.CommonGroupTypeEnum; import com.qianwen.smartman.common.utils.Lambda; import com.qianwen.smartman.common.utils.MessageUtils; import com.qianwen.smartman.common.utils.ValidatorUtils; 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.tool.node.ForestNodeMerger; import com.qianwen.core.tool.utils.Func; import com.qianwen.smartman.modules.cps.convert.ToolAppendixConvert; import com.qianwen.smartman.modules.cps.convert.TrayConvert; import com.qianwen.smartman.modules.cps.dto.TrayFaceDTO; import com.qianwen.smartman.modules.cps.entity.CommonGroup; import com.qianwen.smartman.modules.cps.entity.CommonGroupOfItem; import com.qianwen.smartman.modules.cps.entity.ToolAppendix; import com.qianwen.smartman.modules.cps.entity.Tray; import com.qianwen.smartman.modules.cps.entity.TrayFixture; import com.qianwen.smartman.modules.cps.entity.TrayStorage; import com.qianwen.smartman.modules.cps.entity.TraySurface; import com.qianwen.smartman.modules.cps.enums.CommonGroupEnum; import com.qianwen.smartman.modules.cps.enums.TrayEnum; import com.qianwen.smartman.modules.cps.excel.TrayImport; import com.qianwen.smartman.modules.cps.mapper.TrayMapper; import com.qianwen.smartman.modules.cps.service.ICommonGroupOfItemService; import com.qianwen.smartman.modules.cps.service.ICommonGroupService; import com.qianwen.smartman.modules.cps.service.IToolAppendixService; import com.qianwen.smartman.modules.cps.service.ITrayFixtureService; import com.qianwen.smartman.modules.cps.service.ITrayService; import com.qianwen.smartman.modules.cps.service.ITrayStorageService; import com.qianwen.smartman.modules.cps.service.ITraySurfaceService; import com.qianwen.smartman.modules.cps.utils.ThrowFun; import com.qianwen.smartman.modules.cps.vo.CommonGroupTypeVO; import com.qianwen.smartman.modules.cps.vo.IdsVO; import com.qianwen.smartman.modules.cps.vo.PageTrayVO; import com.qianwen.smartman.modules.cps.vo.ToolAppendixVO; import com.qianwen.smartman.modules.cps.vo.ToolingVO; import com.qianwen.smartman.modules.cps.vo.TrayEasyVO; import com.qianwen.smartman.modules.cps.vo.TraySaveVO; import com.qianwen.smartman.modules.cps.vo.TrayTreeVO; import com.qianwen.smartman.modules.cps.vo.TrayUpdateVO; import com.qianwen.smartman.modules.cps.vo.TrayVO; import com.qianwen.smartman.modules.resource.builder.oss.OssBuilder; import com.qianwen.smartman.modules.system.service.ICodeGeneratorService; import com.qianwen.smartman.modules.tpm.enums.MetaTypeEnum; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @Service public class TrayServiceImpl extends BladeServiceImpl implements ITrayService { private static final Logger log = LoggerFactory.getLogger(TrayServiceImpl.class); private final ITraySurfaceService surfaceService; private final ICommonGroupService commonGroupService; private final IToolAppendixService toolAppendixService; private final ITrayFixtureService fixtureService; private final ITrayStorageService storageService; private final ICommonGroupOfItemService commonGroupOfItemService; private final OssBuilder ossBuilder; private final ICodeGeneratorService codeGeneratorService; public TrayServiceImpl(final ITraySurfaceService surfaceService, final ICommonGroupService commonGroupService, final IToolAppendixService toolAppendixService, final ITrayFixtureService fixtureService, final ITrayStorageService storageService, final ICommonGroupOfItemService commonGroupOfItemService, final OssBuilder ossBuilder, final ICodeGeneratorService codeGeneratorService) { this.surfaceService = surfaceService; this.commonGroupService = commonGroupService; this.toolAppendixService = toolAppendixService; this.fixtureService = fixtureService; this.storageService = storageService; this.commonGroupOfItemService = commonGroupOfItemService; this.ossBuilder = ossBuilder; this.codeGeneratorService = codeGeneratorService; } @Override // org.springblade.modules.cps.service.ITrayService @Transactional(rollbackFor = {Exception.class}) public TrayVO saveTray(TraySaveVO vo) { if (Func.isBlank(vo.getCode())) { String code = this.codeGeneratorService.getGeneratorCode(vo, MetaTypeEnum.TRAY.getCode()); log.info("物料编码规则生成的code:{}", code + " ," + code.length()); vo.setCode(code); } validCode(vo.getCode()); Tray tray = TrayConvert.INSTANCE.convert(vo); save(tray); Long trayId = tray.getId(); Long groupId = vo.getGroupId(); CommonGroupOfItem item = CommonGroupOfItem.builder().groupId(groupId).itemId(trayId).groupType(CommonGroupTypeEnum.TRAY.getName()).groupCategory(CommonGroupConstant.DEFAULT_CATEGORY).build(); this.commonGroupOfItemService.save(item); List faceList = vo.getFaceList(); if (Func.isNotEmpty(faceList)) { Set codeSet = Sets.newHashSet(); List surfaces = faceList.stream().map(f -> { String faceCode = f.getFaceCode(); String faceName = f.getFaceName(); codeSet.add(faceCode); return new TraySurface().setName(faceName).setCode(faceCode).setProgramCode(f.getProgramCode()).setTrayId(trayId); }).collect(Collectors.toList()); int size = faceList.size(); if (codeSet.size() != size) { throw new ServiceException(MessageUtils.message("cps.tray.face.name.exist", new Object[0])); } this.surfaceService.saveBatch(surfaces); } return TrayConvert.INSTANCE.convert(tray).setFaceNumber(Integer.valueOf(Func.isEmpty(faceList) ? 0 : faceList.size())); } @Override // org.springblade.modules.cps.service.ITrayService public TrayVO getDetail(Long id) { Tray tray = (Tray) getById(id); CommonGroupOfItem item = (CommonGroupOfItem) this.commonGroupOfItemService.getOne(Wrappers.lambdaQuery().eq(CommonGroupOfItem::getItemId, id)); Long groupId = item.getGroupId(); CommonGroup group = (CommonGroup) this.commonGroupService.getById(groupId); long count = this.surfaceService.count(Lambda.eq((v0) -> { return v0.getTrayId(); }, id)); return TrayConvert.INSTANCE.convert(tray).setFaceNumber(Integer.valueOf(Math.toIntExact(count))).setGroupId(groupId).setGroupName(group.getName()); } @Override // org.springblade.modules.cps.service.ITrayService public IPage trayPage(Query query, String keyword, Long groupId) { if (ToolingConstant.TRAY_ROOT.equals(groupId)) { return this.baseMapper.trayPage(Condition.getPage(query), keyword, null); } return this.baseMapper.trayPage(Condition.getPage(query), keyword, groupId); } @Override // org.springblade.modules.cps.service.ITrayService @Transactional(rollbackFor = {Exception.class}) public Boolean updateTray(TrayUpdateVO vo) { Tray tray = TrayConvert.INSTANCE.convert(vo); boolean update = updateById(tray); this.commonGroupOfItemService.update(Wrappers.lambdaUpdate() .set(CommonGroupOfItem::getGroupId, vo.getGroupId()) .eq(CommonGroupOfItem::getItemId, vo.getId())); /* this.commonGroupOfItemService.update((Wrapper) ((LambdaUpdateWrapper) Wrappers.lambdaUpdate().set((v0) -> { return v0.getGroupId(); }, vo.getGroupId())).eq((v0) -> { return v0.getItemId(); }, vo.getId()));*/ Integer availability = vo.getAvailability(); boolean flag = Func.isNotEmpty(availability); if (flag) { this.baseMapper.updateFixTure(vo.getId(), availability); } return Boolean.valueOf(update); } @Override // org.springblade.modules.cps.service.ITrayService @Transactional(rollbackFor = {Exception.class}) public Boolean removeTray(IdsVO vo) { List ids = Func.toLongList(vo.getIds()); int count = removeFaceFixture(ids); ThrowFun.isTrue(count > 0).throwMessage(MessageUtils.message("cps.tray.face.banding.fixture", new Object[0])); long countTrayStorage = this.storageService.count(Wrappers.lambdaQuery().in(TrayStorage::getTrayId, ids)); ThrowFun.isTrue(countTrayStorage > 0).throwMessage(MessageUtils.message("cps.tray.ware.station.fixture", new Object[0])); boolean remove = removeByIds(ids); boolean removeFace = this.surfaceService.remove(Wrappers.lambdaQuery().in(TraySurface::getTrayId, ids)); boolean removeFixture = this.fixtureService.remove(Wrappers.lambdaQuery().in(TrayFixture::getTrayId, ids)); this.fixtureService.updateFixtureStatusByTray(ids); this.storageService.remove(Wrappers.lambdaQuery().in(TrayStorage::getTrayId, ids)); return Boolean.valueOf(remove && removeFace && removeFixture); } @Override // org.springblade.modules.cps.service.ITrayService public List toolingTree(CommonGroupTypeVO vo) { switch (CommonGroupTypeEnum.of(vo.getGroupType())) { case TRAY: return groupTrayTree(vo); case FIXTURE: return groupFixtureTree(vo); default: return Lists.newArrayList(); } } @Override // org.springblade.modules.cps.service.ITrayService @Transactional(rollbackFor = {Exception.class}) public Boolean removeTree(Long id) { CommonGroup group = (CommonGroup) this.commonGroupService.getById(id); CommonGroup rootGroup = this.commonGroupService.getOne(Wrappers.lambdaQuery() .eq(CommonGroup::getGroupCategory, group.getGroupCategory()) .eq(CommonGroup::getGroupType, group.getGroupType()) .eq(CommonGroup::getName, CommonGroupConstant.DEFAULT_GROUP_NAME)); List allSubGroup = this.commonGroupService.getAllSubGroup(Long.valueOf(Func.toLong(id)), group.getGroupType(), group.getGroupCategory()); List groupId = allSubGroup.stream().map((v0) -> { return v0.getId(); }).collect(Collectors.toList()); boolean update = this.commonGroupOfItemService.update(Wrappers.lambdaUpdate() .set(CommonGroupOfItem::getGroupId, rootGroup.getId()) .in(CommonGroupOfItem::getGroupId, groupId)); /* boolean update = this.commonGroupOfItemService.update((Wrapper) ((LambdaUpdateWrapper) Wrappers.lambdaUpdate().set((v0) -> { return v0.getGroupId(); }, rootGroup.getId())).in((v0) -> { return v0.getGroupId(); }, groupId));*/ boolean remove = this.commonGroupService.removeById(id); return Boolean.valueOf(update && remove); } @Override // org.springblade.modules.cps.service.ITrayService public List trayTree(CommonGroupTypeVO vo) { List trayTree = this.baseMapper.groupTray(); return getTrayTree(trayTree, vo); } @Override // org.springblade.modules.cps.service.ITrayService public List listToolAppendix(String id) { List appendixList = this.toolAppendixService.list(Wrappers.lambdaQuery() .eq(ToolAppendix::getParentId, id)); /* List appendixList = this.toolAppendixService.list((Wrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getParentId(); }, id));*/ return ToolAppendixConvert.INSTANCE.convert(appendixList); } @Override // org.springblade.modules.cps.service.ITrayService public List unUsedTrayTree(CommonGroupTypeVO vo) { List trayTree = this.baseMapper.unUsedGroupTray(); return getUnUsedTray(trayTree); } @Override // org.springblade.modules.cps.service.ITrayService public List listTray() { List list = list(Wrappers.lambdaQuery() .orderByDesc(Arrays.asList(Tray::getCreateTime, Tray::getId) )); /* List list = list((Wrapper) Wrappers.lambdaQuery().orderByDesc((v0) -> { return v0.getCreateTime(); }, new SFunction[]{(v0) -> { return v0.getId(); }}));*/ return TrayConvert.INSTANCE.convertVO(list); } @Override // org.springblade.modules.cps.service.ITrayService @Transactional(rollbackFor = {Exception.class}) public BladeFile importTray(MultipartFile file) { if (Objects.isNull(file)) { throw new ServiceException(MessageUtils.message("excel.import.file.is.null", new Object[0])); } List trayData = ExcelUtil.read(file, 0, 2, TrayImport.class); if (Func.isEmpty(trayData)) { throw new ServiceException(MessageUtils.message("excel.import.data.can.not.be.null", new Object[0])); } if (trayData.size() > 200) { throw new ServiceException(MessageUtils.message("excel.import.size.failed", new Object[0])); } Set trayCodeSet = list().stream().map((v0) -> { return v0.getCode(); }).collect(Collectors.toSet()); Map> map = trayData.stream().filter(c -> { return Func.isNotEmpty(c.getTrayCode()); }).collect(Collectors.groupingBy((v0) -> { return v0.getTrayCode(); })); HashMap commonGroupNameMap = this.commonGroupService.getCommonGroupNameMap(CommonGroupTypeEnum.TRAY.getName(), CommonGroupConstant.DEFAULT_CATEGORY); checkTrayImport(trayData, commonGroupNameMap, map, trayCodeSet); List fails = trayData.stream().filter(w -> { return StrUtil.isNotEmpty(w.getFailReason()); }).collect(Collectors.toList()); if (fails.size() > 0) { MultipartFile template = ExcelUtil.exportFillTemplateToMultipartFile(ExcelConstant.DIRECTORY + "trayImportErrorTemplate" + ExcelConstant.SUFFIX, MessageUtils.message("excel.import.failed.report.name", new Object[0]) + ExcelConstant.SUFFIX, "托盘信息表", trayData.stream().filter(x -> { return Func.isNotEmpty(x.getFailReason()); }).collect(Collectors.toList()), (Object) null, (AbstractMergeStrategy) null); return this.ossBuilder.tempTemplate().putFile(template.getOriginalFilename(), template); } trayData.forEach(trayImport -> { if (trayImport.getTrayGroupName().equals(CommonGroupEnum.ALL.getCode())) { trayImport.setTrayGroupName(CommonGroupEnum.UNASSORTED.getCode()); } if (trayCodeSet.contains(trayImport.getTrayCode())) { update(Wrappers.update().lambda().eq(Tray::getCode, trayImport.getTrayCode()).set(Tray::getName, trayImport.getName())); /* update((Wrapper) ((LambdaUpdateWrapper) Wrappers.update().lambda().eq((v0) -> { return v0.getCode(); }, trayImport.getTrayCode())).set((v0) -> { return v0.getName(); }, trayImport.getName()));*/ Tray tray = getOne(Wrappers.query().lambda().eq(Tray::getCode, trayImport.getTrayCode())); this.commonGroupOfItemService.update(Wrappers.update().lambda() .eq(CommonGroupOfItem::getItemId, tray.getId()) .set(CommonGroupOfItem::getGroupId, commonGroupNameMap.get(trayImport.getTrayGroupName()))); /* this.commonGroupOfItemService.update((Wrapper) ((LambdaUpdateWrapper) Wrappers.update().lambda().eq((v0) -> { return v0.getItemId(); }, tray.getId())).set((v0) -> { return v0.getGroupId(); }, commonGroupNameMap.get(trayImport.getTrayGroupName()))); */ return; } TraySaveVO traySaveVO = new TraySaveVO(); traySaveVO.setCode(trayImport.getTrayCode()); traySaveVO.setName(Func.isEmpty(trayImport.getName()) ? trayImport.getTrayCode() : trayImport.getName()); traySaveVO.setAvailability(TrayEnum.StatusEnum.ACTIVATING.getStatus()); traySaveVO.setGroupId((Long) commonGroupNameMap.get(trayImport.getTrayGroupName())); traySaveVO.setFaceList(new ArrayList<>()); saveTray(traySaveVO); }); return null; } @Override // org.springblade.modules.cps.service.ITrayService public int removeFaceFixture(List ids) { return this.baseMapper.removeFaceFixture(ids); } private void checkTrayImport(List trayData, Map commonGroupNameMap, Map> map, Set trayCodeSet) { for (TrayImport trayImport : trayData) { if (Func.isNotBlank(trayImport.getTrayGroupName()) && !commonGroupNameMap.containsKey(trayImport.getTrayGroupName())) { trayImport.setFailReason(MessageUtils.message("cps.tray.group.not.existing", new Object[0])); } else if (Func.isBlank(trayImport.getTrayGroupName())) { trayImport.setFailReason(MessageUtils.message("cps.tray.group.name.can.not.empty", new Object[0])); } else if (Func.isBlank(trayImport.getTrayCode())) { trayImport.setFailReason(MessageUtils.message("cps.tray.code.can.not.empty", new Object[0])); } else { if (Func.isNotBlank(trayImport.getTrayCode())) { if (map.get(trayImport.getTrayCode()).size() > 1) { trayImport.setFailReason(MessageUtils.message("cps.tray.code.existing", new Object[0])); } else if (trayCodeSet.contains(trayImport.getTrayCode())) { trayImport.setFailReason(MessageUtils.message("cps.tray.code.existing", new Object[0])); } } if (ValidatorUtils.stringFilter(trayImport.getTrayCode())) { trayImport.setFailReason(MessageUtils.message("cps.tray.code.exist.special.symbols.error", new Object[0])); } else if (Func.isNotEmpty(trayImport.getName()) && ValidatorUtils.stringFilter(trayImport.getName())) { trayImport.setFailReason(MessageUtils.message("cps.tray.name.exist.special.symbols.error", new Object[0])); } } } } private List getUnUsedTray(List vo) { if (Func.isEmpty(vo)) { return Lists.newArrayList(); } List groupIds = vo.stream().map((v0) -> { return v0.getParentId(); }).collect(Collectors.toList()); List commonGroups = this.commonGroupService.list(Wrappers.lambdaQuery().in(CommonGroup::getId, groupIds)); /* List commonGroups = this.commonGroupService.list((Wrapper) Wrappers.lambdaQuery().in((v0) -> { return v0.getId(); }, groupIds)); */ List groups = commonGroups.stream().map(this::convert).collect(Collectors.toList()); vo.addAll(groups); return ForestNodeMerger.merge(vo); } private List getTrayTree(List vo, CommonGroupTypeVO groupTypeVO) { List commonGroups = this.commonGroupService.list(Wrappers.lambdaQuery() .eq(CommonGroup::getGroupType, groupTypeVO.getGroupType()) .eq(CommonGroup::getGroupCategory, groupTypeVO.getGroupCategory())); /* List commonGroups = this.commonGroupService.list((Wrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getGroupType(); }, groupTypeVO.getGroupType())).eq((v0) -> { return v0.getGroupCategory(); }, groupTypeVO.getGroupCategory()));*/ List groups = commonGroups.stream().map(this::convert).collect(Collectors.toList()); vo.addAll(groups); return ForestNodeMerger.merge(vo); } private TrayTreeVO convert(CommonGroup group) { TrayTreeVO treeVO = new TrayTreeVO(); treeVO.setId(group.getId()); treeVO.setName(group.getName()); treeVO.setCode(group.getCode()); treeVO.setParentId(group.getParentId()); treeVO.setIsGroup(Boolean.TRUE); return treeVO; } private List groupTrayTree(CommonGroupTypeVO vo) { List trayList = this.baseMapper.trayTree(vo); return ForestNodeMerger.merge(calculateToolingNum(trayList)); } private List groupFixtureTree(CommonGroupTypeVO vo) { List trayList = this.baseMapper.fixtureTree(vo); return ForestNodeMerger.merge(calculateToolingNum(trayList)); } private List calculateToolingNum(List vo) { List result = Lists.newArrayList(); vo.forEach(v -> { int nums = vo.stream().filter(p -> { return p.getCode().indexOf(v.getCode()) == 0; }).mapToInt((v0) -> { return v0.getNumbers(); }).sum(); ToolingVO res = TrayConvert.INSTANCE.convert(v); res.setNumbers(Integer.valueOf(nums)); result.add(res); }); return result; } private void validCode(String code) { long count = count(Lambda.eq((v0) -> { return v0.getCode(); }, code)); ThrowFun.isTrue(count > 0).throwMessage(MessageUtils.message("cps.tray.code.exist", new Object[0])); } }