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.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<CheckProjectMapper, CheckProject> 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.<CheckProject>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<CheckProjectVO> pageCheckProject(Query query, String key, Integer status) {
|
IPage<CheckProject> page1 = page(Condition.getPage(query));
|
IPage<CheckProject> page = page(Condition.getPage(query), Wrappers.<CheckProject>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(CheckProject::getCreateTime, CheckProject::getId));
|
/*
|
IPage<CheckProject> 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.<IPage<CheckProject>>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<String> 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.<CheckItem>lambdaQuery().in(CheckItem::getCheckProjectId, ids));
|
/*
|
itemRemove = this.checkItemService.remove((Wrapper) Wrappers.lambdaQuery().in((v0) -> {
|
return v0.getCheckProjectId();
|
}, ids));
|
*/
|
}
|
boolean deviceRemove = this.checkService.remove( Wrappers.<DeviceTypeCheckProject>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<CheckProject> 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<Long> ids = (List) checkProjects.stream().map((v0) -> {
|
return v0.getId();
|
}).collect(Collectors.toList());
|
Map<Long, List<CheckItem>> itemMap = null;
|
if (Func.isNotEmpty(ids)) {
|
List<CheckItem> 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<CheckProjectExcel> result = Lists.newArrayList();
|
for (CheckProject checkProject : checkProjects) {
|
Long id = checkProject.getId();
|
if (itemMap != null) {
|
List<CheckItem> 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<CheckProjectImport> 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<String> codes = Sets.newHashSet(listObjs((Wrapper) Wrappers.lambdaQuery().select(new SFunction[]{(v0) -> {
|
return v0.getCode();
|
}}).eq((v0) -> {
|
return v0.getStatus();
|
}, CommonConstant.ENABLE), String::valueOf));
|
Set<String> names = Sets.newHashSet(listObjs((Wrapper) Wrappers.lambdaQuery().select(new SFunction[]{(v0) -> {
|
return v0.getName();
|
}}).eq((v0) -> {
|
return v0.getStatus();
|
}, CommonConstant.ENABLE), String::valueOf));
|
Map<String, Set<String>> 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<String, Integer> 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<String, Set<String>> 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<CheckProjectImport> 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<CheckProject, List<CheckItem>> 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<CheckItem> itemList = (List) 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<String> codes, Set<String> names, Map<String, Set<String>> codeNameMap, Map<String, Integer> itemNameCount, Map<String, Set<String>> itemNameSet, List<CheckProjectImport> 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<String> 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<String> 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 = (CheckProject) getOne((Wrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> {
|
return v0.getCode();
|
}, code)).eq((v0) -> {
|
return v0.getStatus();
|
}, CommonConstant.DEACTIVATE));
|
if (checkProject != null) {
|
return Boolean.TRUE.booleanValue();
|
}
|
return Boolean.FALSE.booleanValue();
|
}
|
}
|