package com.qianwen.smartman.modules.cps.service.impl; import com.alibaba.excel.write.merge.AbstractMergeStrategy; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import java.lang.invoke.SerializedLambda; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.qianwen.smartman.common.cache.RegionCache; import com.qianwen.smartman.common.constant.CommonConstant; import com.qianwen.smartman.common.constant.DateConstant; 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.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.utils.DateUtil; import com.qianwen.core.tool.utils.Func; import com.qianwen.core.tool.utils.StringUtil; import com.qianwen.smartman.modules.cps.convert.CheckProjectConvert; import com.qianwen.smartman.modules.cps.entity.CheckItem; import com.qianwen.smartman.modules.cps.entity.CheckProject; import com.qianwen.smartman.modules.cps.entity.DeviceTypeCheckProject; import com.qianwen.smartman.modules.cps.enums.ValueTypeEnum; import com.qianwen.smartman.modules.cps.excel.CheckProjectExcel; import com.qianwen.smartman.modules.cps.excel.CheckProjectImport; import com.qianwen.smartman.modules.cps.mapper.CheckProjectMapper; import com.qianwen.smartman.modules.cps.service.ICheckItemService; import com.qianwen.smartman.modules.cps.service.ICheckProjectService; import com.qianwen.smartman.modules.cps.service.IDeviceCheckService; import com.qianwen.smartman.modules.cps.vo.CheckProjectSubmitVO; import com.qianwen.smartman.modules.cps.vo.CheckProjectUpdateVO; import com.qianwen.smartman.modules.cps.vo.CheckProjectVO; import com.qianwen.smartman.modules.resource.builder.oss.OssBuilder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @Service /* loaded from: blade-api.jar:BOOT-INF/classes/org/springblade/modules/cps/service/impl/CheckProjectServiceImpl.class */ public class CheckProjectServiceImpl extends BladeServiceImpl implements ICheckProjectService { private static final Logger log = LoggerFactory.getLogger(CheckProjectServiceImpl.class); private final ICheckItemService checkItemService; private final OssBuilder ossBuilder; private final IDeviceCheckService checkService; public CheckProjectServiceImpl(final ICheckItemService checkItemService, final OssBuilder ossBuilder, final IDeviceCheckService checkService) { this.checkItemService = checkItemService; this.ossBuilder = ossBuilder; this.checkService = checkService; } @Override // org.springblade.modules.cps.service.ICheckProjectService public CheckProject createCheckProject(CheckProjectSubmitVO vo) { String code = vo.getCode(); long count = count(Wrappers.lambdaQuery().eq(Func.isNotBlank(code), CheckProject::getCode, code).eq(CheckProject::getStatus, CommonConstant.ENABLE)); /* long count = count((Wrapper) Wrappers.lambdaQuery().eq(Func.isNotBlank(code), (v0) -> { return v0.getCode(); }, code).eq((v0) -> { return v0.getStatus(); }, CommonConstant.ENABLE)); */ if (count > 0) { throw new ServiceException(MessageUtils.message("excel.import.check.project.code.same", new Object[0])); } boolean result = checkStopStatus(code); if (result) { throw new ServiceException(MessageUtils.message("cps.tpm.already.exist.stop.status", new Object[0])); } CheckProject checkProject = CheckProject.builder().code(code).name(vo.getName()).remark(vo.getRemark()).build(); checkProject.setStatus(vo.getStatus()); save(checkProject); return checkProject; } @Override // org.springblade.modules.cps.service.ICheckProjectService public IPage pageCheckProject(Query query, String key, Integer status) { IPage page1 = page(Condition.getPage(query)); IPage page = page(Condition.getPage(query), Wrappers.lambdaQuery() .eq(CheckProject::getStatus, (status == null) ? CommonConstant.ENABLE : status) .and(Func.isNotBlank(key), c -> c.likeRight(CheckProject::getCode, key)) .or().likeRight(Func.isNotBlank(key), CheckProject::getName, key).or() .likeRight(Func.isNotBlank(key), CheckProject::getRemark, key) .orderByDesc(Arrays.asList(CheckProject::getCreateTime, CheckProject::getId))); /* IPage page = page(Condition.getPage(query), (Wrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getStatus(); }, status == null ? CommonConstant.ENABLE : status)).and(Func.isNotBlank(key), c -> { ((LambdaQueryWrapper) ((LambdaQueryWrapper) ((LambdaQueryWrapper) c.likeRight((v0) -> { return v0.getCode(); }, key)).or()).likeRight(Func.isNotBlank(key), (v0) -> { return v0.getName(); }, key).or()).likeRight(Func.isNotBlank(key), (v0) -> { return v0.getRemark(); }, key); }).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(CheckProjectConvert.INSTANCE.convert(p.getRecords())); return page2; }).orElse(new Page<>()); } @Override // org.springblade.modules.cps.service.ICheckProjectService @Transactional(rollbackFor = {Exception.class}) public boolean removeCheckProject(List ids, Integer type) { if (StatusType.REMOVE.getType().equals(type)) { boolean remove = removeByIds(Func.toLongList(ids)); boolean itemRemove = false; if (remove) { itemRemove = this.checkItemService.remove(Wrappers.lambdaQuery().in(CheckItem::getCheckProjectId, ids)); /* itemRemove = this.checkItemService.remove((Wrapper) Wrappers.lambdaQuery().in((v0) -> { return v0.getCheckProjectId(); }, ids)); */ } boolean deviceRemove = this.checkService.remove( Wrappers.lambdaQuery().in(DeviceTypeCheckProject::getCheckProjectId, ids)); return remove && itemRemove && deviceRemove; } return changeStatus(Func.toLongList(ids), CommonConstant.DEACTIVATE); } @Override // org.springblade.modules.cps.service.ICheckProjectService public boolean updateCheckProject(CheckProjectUpdateVO vo) { CheckProject checkProject = CheckProjectConvert.INSTANCE.convert(vo); return updateById(checkProject); } @Override // org.springblade.modules.cps.service.ICheckProjectService public BladeFile exportCheckProject(String key, Integer status) { List checkProjects = list( Wrappers.lambdaQuery() .eq(CheckProject::getStatus, status) .and(Func.isNotBlank(key), c -> c.likeRight(CheckProject::getCode, key)).or() .likeRight(Func.isNotBlank(key), CheckProject::getName, key).or() .likeRight(Func.isNotBlank(key), CheckProject::getRemark, key) .orderByDesc(Arrays.asList(CheckProject::getCreateTime, CheckProject::getId)) ); List ids = checkProjects.stream().map(CheckProject::getId).collect(Collectors.toList()); /* List checkProjects = list((Wrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getStatus(); }, status)).and(Func.isNotBlank(key), c -> { ((LambdaQueryWrapper) ((LambdaQueryWrapper) ((LambdaQueryWrapper) c.likeRight((v0) -> { return v0.getCode(); }, key)).or()).likeRight(Func.isNotBlank(key), (v0) -> { return v0.getName(); }, key).or()).likeRight(Func.isNotBlank(key), (v0) -> { return v0.getRemark(); }, key); }).orderByDesc((v0) -> { return v0.getCreateTime(); }, new SFunction[]{(v0) -> { return v0.getId(); }})); List ids = (List) checkProjects.stream().map((v0) -> { return v0.getId(); }).collect(Collectors.toList()); */ Map> itemMap = null; if (Func.isNotEmpty(ids)) { List checkItems = this.checkItemService.list(Wrappers.lambdaQuery().in(CheckItem::getCheckProjectId, ids)); itemMap = (Map>)checkItems.stream().collect(Collectors.groupingBy(CheckItem::getCheckProjectId)); /* List checkItems = this.checkItemService.list((Wrapper) Wrappers.lambdaQuery().in((v0) -> { return v0.getCheckProjectId(); }, ids)); itemMap = (Map) checkItems.stream().collect(Collectors.groupingBy((v0) -> { return v0.getCheckProjectId(); }));*/ } List result = Lists.newArrayList(); for (CheckProject checkProject : checkProjects) { Long id = checkProject.getId(); if (itemMap != null) { List items = itemMap.get(id); if (Func.isNotEmpty(items)) { items.forEach(item -> { result.add(CheckProjectExcel.builder().projectCode(checkProject.getCode()).projectName(checkProject.getName()).remark(checkProject.getRemark()).itemName(item.getName()).valueType(item.getValueType()).requirement(item.getRequirement()).standardValue(item.getStandardValue()).build()); }); } else { result.add(CheckProjectExcel.builder().projectCode(checkProject.getCode()).projectName(checkProject.getName()).remark(checkProject.getRemark()).build()); } } } String fileName = String.format("%s-%s.xlsx", "点检项目", DateUtil.time()); MultipartFile multipartFile = ExcelUtil.exportToMultipartFile(fileName, "点检项目数据表", result, CheckProjectExcel.class); return this.ossBuilder.tempTemplate().putFile(multipartFile.getOriginalFilename(), multipartFile); } @Override // org.springblade.modules.cps.service.ICheckProjectService @Transactional(rollbackFor = {Exception.class}) public BladeFile importCheckProject(MultipartFile file) { List rawData = ExcelUtil.read(file, 0, 2, CheckProjectImport.class); if (Func.isEmpty(rawData)) { throw new ServiceException(MessageUtils.message("excel.import.data.can.not.be.null", new Object[0])); } if (rawData.size() > 200) { throw new ServiceException(MessageUtils.message("excel.import.size.failed", new Object[0])); } Set codes = Sets.newHashSet(listObjs(Wrappers.lambdaQuery().select(CheckProject::getCode).eq(CheckProject::getStatus, CommonConstant.ENABLE), String::valueOf)); Set names = Sets.newHashSet(listObjs(Wrappers.lambdaQuery().select(CheckProject::getName).eq(CheckProject::getStatus, CommonConstant.ENABLE), String::valueOf)); Map> codeNameMap = (Map>)rawData.stream().filter(c -> Func.isNotBlank(c.getProjectCode())).collect(Collectors.groupingBy(CheckProjectImport::getProjectCode, Collectors.mapping(v -> v.getProjectCode() + "-" + v.getProjectName() + "-" + v.getRemark(), Collectors.toSet()))); Map itemNameCount = (Map)rawData.stream().filter(c -> Func.isNotBlank(c.getProjectCode())).collect(Collectors.groupingBy(CheckProjectImport::getProjectCode, Collectors.mapping(CheckProjectImport::getItemName, Collectors.reducing(Integer.valueOf(0), e -> Integer.valueOf(1), Integer::sum)))); Map> itemNameSet = (Map>)rawData.stream().filter(c -> Func.isNotBlank(c.getProjectCode())).collect(Collectors.groupingBy(CheckProjectImport::getProjectCode, Collectors.mapping(CheckProjectImport::getItemName, Collectors.toSet()))); /* Set codes = Sets.newHashSet(listObjs((Wrapper) Wrappers.lambdaQuery().select(new SFunction[]{(v0) -> { return v0.getCode(); }}).eq((v0) -> { return v0.getStatus(); }, CommonConstant.ENABLE), String::valueOf)); Set names = Sets.newHashSet(listObjs((Wrapper) Wrappers.lambdaQuery().select(new SFunction[]{(v0) -> { return v0.getName(); }}).eq((v0) -> { return v0.getStatus(); }, CommonConstant.ENABLE), String::valueOf)); Map> codeNameMap = (Map) rawData.stream().filter(c -> { return Func.isNotBlank(c.getProjectCode()); }).collect(Collectors.groupingBy((v0) -> { return v0.getProjectCode(); }, Collectors.mapping(v -> { return v.getProjectCode() + "-" + v.getProjectName() + "-" + v.getRemark(); }, Collectors.toSet()))); Map itemNameCount = (Map) rawData.stream().filter(c2 -> { return Func.isNotBlank(c2.getProjectCode()); }).collect(Collectors.groupingBy((v0) -> { return v0.getProjectCode(); }, Collectors.mapping((v0) -> { return v0.getItemName(); }, Collectors.reducing(0, e -> { return 1; }, (v0, v1) -> { return Integer.sum(v0, v1); })))); Map> itemNameSet = (Map) rawData.stream().filter(c3 -> { return Func.isNotBlank(c3.getProjectCode()); }).collect(Collectors.groupingBy((v0) -> { return v0.getProjectCode(); }, Collectors.mapping((v0) -> { return v0.getItemName(); }, Collectors.toSet()))); */ List failExcel = Lists.newArrayList(); for (CheckProjectImport data : rawData) { validImport(data, codes, names, codeNameMap, itemNameCount, itemNameSet, failExcel); } if (Func.isNotEmpty(failExcel)) { log.info("失败的数据:{}", JSON.toJSONString(failExcel)); MultipartFile multipartFile = ExcelUtil.exportFillTemplateToMultipartFile(ExcelConstant.DIRECTORY + "checkProjectFailTemplate" + ExcelConstant.SUFFIX, MessageUtils.message("excel.import.failed.report.name", new Object[0]) + ExcelConstant.SUFFIX, "点检项目表", failExcel, (Object) null, (AbstractMergeStrategy) null); return this.ossBuilder.tempTemplate().putFile(multipartFile.getOriginalFilename(), multipartFile); } Map> collect = rawData.stream().collect(Collectors.groupingBy(c -> CheckProject.builder().code(c.getProjectCode()).name(c.getProjectName()).remark(c.getRemark()).build(), Collectors.mapping(c -> CheckItem.builder().name(c.getItemName()).valueType(c.getValueType()).requirement(c.getRequirement()).standardValue(c.getStandardValue()).build(), Collectors.toList()))); /* Map> collect = (Map) rawData.stream().collect(Collectors.groupingBy(c4 -> { return CheckProject.builder().code(c4.getProjectCode()).name(c4.getProjectName()).remark(c4.getRemark()).build(); }, Collectors.mapping(c5 -> { return CheckItem.builder().name(c5.getItemName()).valueType(c5.getValueType()).requirement(c5.getRequirement()).standardValue(c5.getStandardValue()).build(); }, Collectors.toList())));*/ collect.forEach((project, items) -> { save(project); List itemList = items.stream().filter(c6 -> { return Func.isNotBlank(c6.getName()); }).peek(c7 -> { c7.setCheckProjectId(project.getId()); }).collect(Collectors.toList()); this.checkItemService.saveBatch(itemList); }); return null; } private void validImport(CheckProjectImport data, Set codes, Set names, Map> codeNameMap, Map itemNameCount, Map> itemNameSet, List failExcel) { String code = data.getProjectCode(); data.setFailReason(""); if (Func.isBlank(code)) { data.setFailReason(MessageUtils.message("excel.import.check.project.code.exists", new Object[0])); failExcel.add(data); } else if (codes.contains(code)) { data.setFailReason(MessageUtils.message("excel.import.check.project.code.same", new Object[0])); failExcel.add(data); } else { Set nameList = codeNameMap.getOrDefault(code, Sets.newHashSet()); if (nameList.size() > 1) { data.setFailReason(StringUtil.format(MessageUtils.message("excel.import.check.project.many.name", new Object[0]), new Object[]{code})); failExcel.add(data); return; } boolean result = checkStopStatus(code); if (result) { data.setFailReason(StringUtil.format(MessageUtils.message("cps.tpm.already.exist.stop.status", new Object[0]), new Object[]{code})); failExcel.add(data); return; } String name = data.getProjectName(); if (Func.isBlank(name)) { data.setFailReason(MessageUtils.message("excel.import.check.project.name.exists", new Object[0])); failExcel.add(data); } else if (names.contains(name)) { data.setFailReason(MessageUtils.message("excel.import.check.project.code.same", new Object[0])); failExcel.add(data); } else { String itemName = data.getItemName(); if (Func.isNotBlank(itemName)) { Integer itemCount = itemNameCount.getOrDefault(code, 1); Set itemSet = itemNameSet.getOrDefault(code, Sets.newHashSet()); if (itemCount.intValue() != itemSet.size()) { data.setFailReason(MessageUtils.message("cps.tpm.check.item.exists", new Object[0])); failExcel.add(data); return; } } String valueType = data.getValueType(); String standardValue = data.getStandardValue(); if (Func.isNotBlank(valueType)) { if (Func.isBlank(itemName)) { data.setFailReason(MessageUtils.message("cps.check.item.name.not.null", new Object[0])); failExcel.add(data); return; } ValueTypeEnum typeEnum = ValueTypeEnum.find(valueType); if (Func.isEmpty(typeEnum)) { data.setFailReason(MessageUtils.message("cps.check.item.value.type.exists", new Object[0])); failExcel.add(data); return; } else if (Func.isNotBlank(standardValue)) { if (ValueTypeEnum.DATE == typeEnum) { try { SimpleDateFormat sdf = new SimpleDateFormat(DateConstant.PATTERN_DATE); sdf.parse(standardValue); } catch (ParseException e) { data.setFailReason(MessageUtils.message("cps.check.item.date.standard.value.not.valid", new Object[0])); failExcel.add(data); return; } } else if (ValueTypeEnum.NUMBER == typeEnum && !ValidatorUtils.isNumber(standardValue)) { data.setFailReason(MessageUtils.message("cps.check.item.number.standard.value.not.valid", new Object[0])); failExcel.add(data); return; } } } String requirement = data.getRequirement(); if (Func.isNotBlank(requirement) && Func.isBlank(itemName)) { data.setFailReason(MessageUtils.message("cps.check.item.name.not.null", new Object[0])); failExcel.add(data); } else if (Func.isNotBlank(standardValue) && Func.isBlank(itemName)) { data.setFailReason(MessageUtils.message("cps.check.item.name.not.null", new Object[0])); failExcel.add(data); } } } } private boolean checkStopStatus(String code) { CheckProject checkProject = getOne(Wrappers.lambdaQuery().eq(CheckProject::getCode, code).eq(CheckProject::getStatus, CommonConstant.DEACTIVATE)); /* CheckProject checkProject = (CheckProject) getOne((Wrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getCode(); }, code)).eq((v0) -> { return v0.getStatus(); }, CommonConstant.DEACTIVATE)); */ if (checkProject != null) { return true; } return false; } }