package com.qianwen.smartman.modules.cps.service.impl; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; 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.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.cps.convert.ProcessConvert; import com.qianwen.smartman.modules.cps.entity.Process; import com.qianwen.smartman.modules.cps.entity.ProcessAssociation; import com.qianwen.smartman.modules.cps.enums.WorkTypeEnum; import com.qianwen.smartman.modules.cps.excel.ProcessExcel; import com.qianwen.smartman.modules.cps.excel.ProcessImport; import com.qianwen.smartman.modules.cps.mapper.ProcessMapper; import com.qianwen.smartman.modules.cps.service.IProcessAssociationService; import com.qianwen.smartman.modules.cps.service.IProcessService; import com.qianwen.smartman.modules.cps.utils.ThrowFun; import com.qianwen.smartman.modules.cps.vo.ProcessDetailVO; import com.qianwen.smartman.modules.cps.vo.ProcessSaveVO; import com.qianwen.smartman.modules.cps.vo.ProcessVO; import com.qianwen.smartman.modules.resource.builder.oss.OssBuilder; import com.qianwen.smartman.modules.system.entity.Dict; import com.qianwen.smartman.modules.system.service.ICodeGeneratorService; import com.qianwen.smartman.modules.system.service.IDictService; import com.qianwen.smartman.modules.tpm.enums.MetaTypeEnum; @Service public class ProcessServiceImpl extends BladeServiceImpl implements IProcessService { private static final Logger log = LoggerFactory.getLogger(ProcessServiceImpl.class); private final IProcessAssociationService processAssociationService; private final OssBuilder ossBuilder; private final ProcessMapper processMapper; private final IDictService dictService; private final ICodeGeneratorService codeGeneratorService; public ProcessServiceImpl(final IProcessAssociationService processAssociationService, final OssBuilder ossBuilder, final ProcessMapper processMapper, final IDictService dictService, final ICodeGeneratorService codeGeneratorService) { this.processAssociationService = processAssociationService; this.ossBuilder = ossBuilder; this.processMapper = processMapper; this.dictService = dictService; this.codeGeneratorService = codeGeneratorService; } @Override // org.springblade.modules.cps.service.IProcessService public IPage listPage(Query query, String keyword, Integer status) { IPage page = Condition.getPage(query); page.setRecords(ProcessConvert.INSTANCE.convertDTO2ListPage(this.processMapper.listPage(page, keyword, status))); return page; } @Override // org.springblade.modules.cps.service.IProcessService @Transactional(rollbackFor = {Exception.class}) public ProcessDetailVO insert(ProcessSaveVO vo) { if (Func.isBlank(vo.getCode())) { String code = this.codeGeneratorService.getGeneratorCode(vo, MetaTypeEnum.PROCESS.getCode()); log.info("工序编码规则生成的code:{}", code + " ," + code.length()); vo.setCode(code); } checkProcess(vo); Process process = ProcessConvert.INSTANCE.convert(vo); Long id = vo.getId(); if (Func.isNull(id)) { save(process); } else { Process p = (Process) getById(vo.getId()); Integer type = vo.getType(); if (!p.getType().equals(type)) { throw new ServiceException(MessageUtils.message("cps.process.type.not.change", new Object[0])); } updateById(process); } return ProcessConvert.INSTANCE.convertDetail(process); } @Override // org.springblade.modules.cps.service.IProcessService public ProcessDetailVO getDetail(Long processId) { ProcessDetailVO processDetailVO = this.processMapper.selectByIdWithType(processId); return processDetailVO; } @Override // org.springblade.modules.cps.service.IProcessService @Transactional(rollbackFor = {Exception.class}) public Boolean delete(List processIds, Integer type) { if (StatusType.REMOVE.getType().equals(type)) { int count = this.baseMapper.existCraftProcess(processIds); ThrowFun.isTrue(count > 0).throwMessage(MessageUtils.message("cps.process.binding.craft", new Object[0])); this.processAssociationService.remove(Wrappers.query().lambda().in(Func.isNotEmpty(processIds), ProcessAssociation::getProcessId, processIds)); /* this.processAssociationService.remove(Wrappers.query().lambda().in(Func.isNotEmpty(processIds), (v0) -> { return v0.getProcessId(); }, processIds)); */ remove(Wrappers.query().lambda().in(Func.isNotEmpty(processIds), Process::getId, processIds)); return true; } return Boolean.valueOf(changeStatus(processIds, CommonConstant.DEACTIVATE)); } @Override // org.springblade.modules.cps.service.IProcessService @Transactional(rollbackFor = {Exception.class}) public BladeFile importProcess(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])); } HashMap codeMap = new HashMap<>(16); List processList = list(); if (Func.isNotEmpty(processList)) { processList.forEach(x -> { if (CommonConstant.ENABLE.equals(x.getStatus())) { codeMap.put(x.getCode(), null); } }); } Set codeDisableSet = processList.stream().filter(c -> { return CommonConstant.DEACTIVATE.equals(c.getStatus()); }).map((v0) -> { return v0.getCode(); }).collect(Collectors.toSet()); Map dictMap = new HashMap<>(16); List dictList = this.dictService.list(Wrappers.lambdaQuery().select(Dict::getDictKey, Dict::getDictValue).eq(Dict::getCode, "work_type")); /* List dictList = this.dictService.list((Wrapper) Wrappers.lambdaQuery().select(new SFunction[]{(v0) -> { return v0.getDictKey(); }, (v0) -> { return v0.getDictValue(); }}).eq((v0) -> { return v0.getCode(); }, "work_type"));*/ if (Func.isNotEmpty(dictList)) { dictMap = dictList.stream().collect(Collectors.toMap((v0) -> { return v0.getDictValue(); }, (v0) -> { return v0.getDictKey(); })); } boolean flag = Boolean.TRUE.booleanValue(); for (ProcessImport datum : data) { checkImportProcess(datum, codeMap, codeDisableSet, dictMap); if (Func.isNotEmpty(datum.getFailReason())) { flag = Boolean.FALSE.booleanValue(); } } if (!flag) { MultipartFile multipartFile = ExcelUtil.exportFillTemplateToMultipartFile(ExcelConstant.DIRECTORY + "processFailTemplate" + ExcelConstant.SUFFIX, MessageUtils.message("excel.import.failed.report.name", new Object[0]) + ExcelConstant.SUFFIX, "工序信息表", data.stream().filter(x2 -> { return Func.isNotEmpty(x2.getFailReason()); }).collect(Collectors.toList()), null, null); return this.ossBuilder.tempTemplate().putFile(multipartFile.getOriginalFilename(), multipartFile); } data.forEach(x3 -> { Process process = ProcessConvert.INSTANCE.convert(x3); process.setIsImport(1); saveOrUpdate(process); }); return null; } @Override // org.springblade.modules.cps.service.IProcessService public List listProcessExcel(String keyword, Integer status) { return this.baseMapper.listProcessExcel(keyword, status); } private void checkProcess(ProcessSaveVO processSaveVO) { long count = count(Wrappers.lambdaQuery() .ne(Func.isNotEmpty(processSaveVO.getId()), Process::getId, processSaveVO.getId()) .eq(Process::getCode, processSaveVO.getCode()) .eq(Process::getStatus, CommonConstant.ENABLE)); /* long count = count((Wrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().ne(Func.isNotEmpty(processSaveVO.getId()), (v0) -> { return v0.getId(); }, processSaveVO.getId()).eq((v0) -> { return v0.getCode(); }, processSaveVO.getCode())).eq((v0) -> { return v0.getStatus(); }, CommonConstant.ENABLE)); */ if (count > 0) { throw new ServiceException(MessageUtils.message("cps.process.code.already.exists", new Object[0])); } long countDisable = count(Wrappers.lambdaQuery() .ne(Func.isNotEmpty(processSaveVO.getId()), Process::getId, processSaveVO.getId()) .eq(Process::getCode, processSaveVO.getCode()) .eq(Process::getStatus, CommonConstant.ENABLE)); /* long countDisable = count((Wrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().ne(Func.isNotEmpty(processSaveVO.getId()), (v0) -> { return v0.getId(); }, processSaveVO.getId()).eq((v0) -> { return v0.getCode(); }, processSaveVO.getCode())).eq((v0) -> { return v0.getStatus(); }, CommonConstant.ENABLE));*/ if (countDisable > 0) { throw new ServiceException(MessageUtils.message("cps.process.code.disable.already.exists", new Object[0])); } if (WorkTypeEnum.HANDLE.getCode().equals(processSaveVO.getType())) { throw new ServiceException(MessageUtils.message("cps.process.type.can.not.handle", new Object[0])); } } private void checkImport(List ids) { Long count = Long.valueOf(count(Wrappers.query().lambda().in(Func.isNotEmpty(ids), Process::getId, ids).eq(Process::getIsImport, 1))); if (count.longValue() > 0) { throw new ServiceException(MessageUtils.message("cps.process.delete.failed", new Object[0])); } } private void checkImportProcess(ProcessImport processImport, HashMap codeMap, Set codeDisableSet, Map dictMap) { if (Func.isEmpty(processImport.getCode())) { processImport.setFailReason(MessageUtils.message("cps.process.code.can.not.be.null", new Object[0])); } else if (codeMap.containsKey(processImport.getCode())) { processImport.setFailReason(MessageUtils.message("cps.process.code.already.exists", new Object[0])); } else if (codeDisableSet.contains(processImport.getCode())) { processImport.setFailReason(MessageUtils.message("cps.process.code.disable.already.exists", new Object[0])); } else if (ValidatorUtils.checkContextLength(processImport.getCode())) { processImport.setFailReason(MessageUtils.message("cps.process.column.code.can.not.exceed", new Object[0])); } else { codeMap.put(processImport.getCode(), null); if (Func.isEmpty(processImport.getName())) { processImport.setFailReason(MessageUtils.message("cps.process.name.can.not.be.null", new Object[0])); } else if (ValidatorUtils.checkContextLength(processImport.getName())) { processImport.setFailReason(MessageUtils.message("cps.process.column.name.can.not.exceed", new Object[0])); } else if (Func.isNotEmpty(processImport.getTypeName()) && ValidatorUtils.checkContextLength(processImport.getTypeName())) { processImport.setFailReason(MessageUtils.message("cps.process.column.type.can.not.exceed", new Object[0])); } else if (Func.isNotEmpty(processImport.getDescription()) && ValidatorUtils.checkContextLength(processImport.getDescription())) { processImport.setFailReason(MessageUtils.message("cps.process.column.description.can.not.exceed", new Object[0])); } else if (Func.isNotEmpty(processImport.getTypeName()) && !dictMap.containsKey(processImport.getTypeName())) { processImport.setFailReason(MessageUtils.message("cps.process.column.type.not.exist", new Object[0])); } else if (Func.isNotEmpty(processImport.getTypeName())) { processImport.setType(Integer.valueOf(dictMap.get(processImport.getTypeName()))); } } } }