package com.yuanchu.mom.service.impl; import cn.hutool.poi.excel.ExcelUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yuanchu.mom.dto.*; import com.yuanchu.mom.exception.ErrorException; import com.yuanchu.mom.mapper.StandardProductListMapper; import com.yuanchu.mom.mapper.StandardTreeMapper; import com.yuanchu.mom.pojo.*; import com.yuanchu.mom.service.*; import lombok.AllArgsConstructor; import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; /** * @author Administrator * @description 针对表【standard_tree(标准树)】的数据库操作Service实现 * @createDate 2024-03-01 15:06:44 */ @Service @AllArgsConstructor public class StandardTreeServiceImpl extends ServiceImpl implements StandardTreeService { private StandardTreeMapper standardTreeMapper; private StandardMethodListService standardMethodListService; private StandardProductListMapper standardProductListMapper; private StandardProductListService standardProductListService; private StandardTemplateService standardTemplateService; private EnumService enumService; @Override public List selectStandardTreeList() { List factoryDtos = standardTreeMapper.selectStandardTreeList(); for (FactoryDto factoryDto : factoryDtos) { for (LaboratoryDto laboratoryDto : factoryDto.getChildren()) { for (SampleTypeDto sampleTypeDto : laboratoryDto.getChildren()) { if (sampleTypeDto.getChildren().size() == 0) { sampleTypeDto.setChildren(standardTreeMapper.getStandardTree3(sampleTypeDto.getValue())); } } } } return factoryDtos; } @Override public List selectStandardTreeList2() { List sampleTypeDtos= new ArrayList<>(); List factoryDtos = standardTreeMapper.selectStandardTreeList(); for (FactoryDto factoryDto : factoryDtos) { for (LaboratoryDto laboratoryDto : factoryDto.getChildren()) { for (SampleTypeDto sampleTypeDto : laboratoryDto.getChildren()) { if (sampleTypeDto.getChildren().size() == 0) { sampleTypeDto.setChildren(standardTreeMapper.getStandardTree3(sampleTypeDto.getValue())); } sampleTypeDtos.add(sampleTypeDto); } } } return sampleTypeDtos; } @Override @Transactional(rollbackFor = Exception.class) public int addStandardTree(StandardTree standardTree) { StandardTree tree = standardTreeMapper.selectOne(Wrappers.lambdaQuery() .eq(StandardTree::getFactory, standardTree.getFactory()) .eq(StandardTree::getLaboratory, standardTree.getLaboratory()) .eq(StandardTree::getSampleType, standardTree.getSampleType()) .eq(StandardTree::getSample, standardTree.getSample()) .eq(StandardTree::getModel, standardTree.getModel())); if (tree != null) { throw new ErrorException("该型号已存在"); } return standardTreeMapper.insert(standardTree); } @Override @Transactional(rollbackFor = Exception.class) public int delStandardTree(String tree) { String[] trees = tree.split(" - "); switch (trees.length) { case 5: if (trees[3] == null) { standardTreeMapper.delete(Wrappers.lambdaUpdate().eq(StandardTree::getFactory, trees[0]).eq(StandardTree::getLaboratory, trees[1]).eq(StandardTree::getSampleType, trees[2]).isNull(StandardTree::getSample).eq(StandardTree::getModel, trees[4])); } else { standardTreeMapper.delete(Wrappers.lambdaUpdate().eq(StandardTree::getFactory, trees[0]).eq(StandardTree::getLaboratory, trees[1]).eq(StandardTree::getSampleType, trees[2]).eq(StandardTree::getSample, trees[3]).eq(StandardTree::getModel, trees[4])); } break; /*case 4: standardTreeMapper.delete(Wrappers.lambdaUpdate().eq(StandardTree::getFactory, trees[0]).eq(StandardTree::getLaboratory, trees[1]).eq(StandardTree::getSampleType, trees[2]).eq(StandardTree::getSample, trees[3])); break; case 3: standardTreeMapper.delete(Wrappers.lambdaUpdate().eq(StandardTree::getFactory, trees[0]).eq(StandardTree::getLaboratory, trees[1]).eq(StandardTree::getSampleType, trees[2])); break; case 2: standardTreeMapper.delete(Wrappers.lambdaUpdate().eq(StandardTree::getFactory, trees[0]).eq(StandardTree::getLaboratory, trees[1])); break; case 1: standardTreeMapper.delete(Wrappers.lambdaUpdate().eq(StandardTree::getFactory, trees[0])); break;*/ } return 1; } @Override @Transactional(rollbackFor = Exception.class) public int addStandardProduct(String ids, String tree) { String[] trees = tree.split(" - "); JSONArray jsonArray = JSON.parseArray(ids); for (Object o : jsonArray) { StandardProductList standardProductList = standardTreeMapper.selectStandardProductById(Integer.parseInt("" + o)); standardProductList.setFactory(trees[0]); try { standardProductList.setLaboratory(trees[1]); } catch (Exception e) { } try { standardProductList.setSampleType(trees[2]); } catch (Exception e) { } try { standardProductList.setSample(trees[3]); } catch (Exception e) { } try { standardProductList.setModel(trees[4]); } catch (Exception e) { } standardProductListMapper.insert(standardProductList); } return 1; } @Override public List getStandardTree2() { return standardTreeMapper.getStandardTree2(); } @Override @Transactional(rollbackFor = Exception.class) public int upStandardProducts(Map product) { List ids = JSON.parseArray(product.get("ids") + ""); StandardProductList productList = JSON.parseObject(JSON.toJSONString(product.get("standardProductList")), StandardProductList.class); if (productList.getMethodS() != null) { standardProductListMapper.update(productList, Wrappers.lambdaUpdate().in(StandardProductList::getId, ids).like(StandardProductList::getMethod, productList.getMethodS())); return 1; } standardProductListMapper.update(productList, Wrappers.lambdaUpdate().in(StandardProductList::getId, ids)); return 1; } @Override public List getStandTreeBySampleType(String laboratory, String sampleType) { return standardTreeMapper.selectList(Wrappers.lambdaQuery() .eq(StandardTree::getLaboratory, laboratory) .eq(StandardTree::getSampleType, sampleType) .select(StandardTree::getModel, StandardTree::getSample)); } /** * 河口检测中心导入 * @param file */ @Override @Transactional(rollbackFor = Exception.class) public void inExcelOfTree(MultipartFile file) { InputStream inputStream; try { inputStream = file.getInputStream(); } catch (IOException e) { throw new RuntimeException(e); } List lists = new ArrayList<>(); AtomicReference laboratory = new AtomicReference<>(); ExcelUtil.readBySax(inputStream, 0, (i, l, list) -> { StandardProductList str = new StandardProductList(); if (i == 0 && l == 1) { laboratory.set(standardTreeMapper.getLaboratory(list.get(1) + "")); if (laboratory.get() == null) { throw new ErrorException("检验对象不存在:" + list.get(1)); } } if (i == 0 && l >= 1) { Integer standardMethodId = standardMethodListService.getStandardMethodId(list.get(0) + ""); if (standardMethodId == null) { throw new ErrorException("标准编号不存在:" + list.get(0)); } str.setStandardMethodListId(standardMethodId); str.setSampleType(list.get(1) + ""); if (list.get(2) != null) { String sample = baseMapper.selSample(list.get(2) + ""); if (sample == null) { throw new ErrorException("样品不存在:" + list.get(2)); } str.setSample(list.get(2) + ""); } else { str.setSample(null); } if (list.get(3) != null) { str.setModel(list.get(3) + ""); Long aLong = standardTreeMapper.selectCount(Wrappers.lambdaQuery() .eq(StandardTree::getModel, str.getModel()) .eq(StandardTree::getSampleType, list.get(1) + "")); if (aLong == 0) { StandardTree standardTree = new StandardTree(); standardTree.setFactory("中天科技检测中心"); standardTree.setLaboratory(laboratory.get()); standardTree.setSampleType(str.getSampleType()); standardTree.setSample(str.getSample()); standardTree.setModel(str.getModel()); standardTreeMapper.insert(standardTree); } } else { str.setModel(null); } str.setInspectionItem(list.get(4) + ""); if (list.get(6) == null) { str.setInspectionItemSubclass(""); } else { str.setInspectionItemSubclass(list.get(6).toString()); } StandardProductList db_str; try { db_str = standardProductListMapper.getOne(str.getStandardMethodListId(), str.getInspectionItem(), str.getSample(), str.getInspectionItemSubclass(), str.getModel(), str.getInspectionItemClass()); } catch (Exception e) { throw new ErrorException("重复查询:" + str.getInspectionItem() + " " + str.getInspectionItemSubclass()); } if (ObjectUtils.isNotEmpty(db_str)) { str.setId(db_str.getId()); str.setStructureItemParameterId(db_str.getStructureItemParameterId()); } if (list.get(8) != null) { str.setMethodS(list.get(8) + ""); } if (list.get(11) == null) { str.setTell(null); } else { str.setTell(list.get(11).toString()); } if (list.get(12) == null) { str.setAsk(null); } else { str.setAsk(list.get(12).toString()); } if (list.get(13) == null) { str.setPrice(null); } else { str.setPrice((list.get(13).toString())); } if (list.get(14) == null) { str.setManHour(null); } else { str.setManHour(list.get(14).toString()); } StandardTemplate standTempIdByName = standardTemplateService.getStandTempIdByName(String.valueOf(list.get(21))); if (standTempIdByName != null) { str.setTemplateId(standTempIdByName.getId()); } else { throw new ErrorException("模板不存在:" + list.get(21)); } str.setFactory("中天科技检测中心"); str.setLaboratory(laboratory.get()); str.setState(1); str.setTree(str.getFactory() + " - " + str.getLaboratory() + " - " + str.getSampleType() + " - " + str.getSample() + " - " + (str.getModel() == null ? "" : str.getModel())); try { str.setStructureItemParameterId(standardTreeMapper.getStructureItemParameterId("\"" + str.getSampleType() + "\"", str.getInspectionItem(), str.getInspectionItemSubclass(), str.getInspectionItemClass())); } catch (Exception e) { str.setStructureItemParameterId(standardTreeMapper.getStructureItemParameterId("\"" + str.getSampleType() + "\",\"" + str.getSample() + "\"", str.getInspectionItem(), str.getInspectionItemSubclass(), str.getInspectionItemClass())); } if (str.getStructureItemParameterId() == null) { throw new ErrorException("检验项目不存在:" + str.getInspectionItem() + " " + str.getInspectionItemSubclass()); } lists.add(str); } }); lists.forEach(a -> { if (a.getId() != null) { standardProductListMapper.updateById(a); } else { standardProductListMapper.insert(a); } }); } @Override public void importWorkstationExcel(MultipartFile file) { InputStream inputStream; try { inputStream = file.getInputStream(); } catch (IOException e) { throw new RuntimeException(e); } List lists = new ArrayList<>(); AtomicReference laboratory = new AtomicReference<>(); ExcelUtil.readBySax(inputStream, 0, (i, l, list) -> { StandardProductList str = new StandardProductList(); if (i == 0 && l == 1) { laboratory.set(standardTreeMapper.getLaboratory(list.get(1) + "")); if (laboratory.get() == null) { throw new ErrorException("检验对象不存在:" + list.get(1)); } } if (i == 0 && l >= 1) { Integer standardMethodId = standardMethodListService.getStandardMethodId(list.get(0) + ""); if (standardMethodId == null) { throw new ErrorException("标准编号不存在:" + list.get(0)); } str.setStandardMethodListId(standardMethodId); str.setSampleType(list.get(1) + ""); if (list.get(2) != null) { String sample = baseMapper.selSample(list.get(2) + ""); if (sample == null) { throw new ErrorException("样品不存在:" + list.get(2)); } str.setSample(list.get(2) + ""); } else { str.setSample(null); } if (list.get(3) != null) { str.setModel(list.get(3) + ""); Long aLong = standardTreeMapper.selectCount(Wrappers.lambdaQuery() .eq(StandardTree::getModel, str.getModel()) .eq(StandardTree::getSampleType, list.get(1) + "")); if (aLong == 0) { StandardTree standardTree = new StandardTree(); standardTree.setFactory("中天科技检测中心"); standardTree.setLaboratory(laboratory.get()); standardTree.setSampleType(str.getSampleType()); standardTree.setSample(str.getSample()); standardTree.setModel(str.getModel()); standardTreeMapper.insert(standardTree); } } else { str.setModel(null); } str.setInspectionItemClass(list.get(4).toString()); str.setInspectionItemClassEn(list.get(5).toString()); // 开始加2 str.setInspectionItem(list.get(6) + ""); if (list.get(8) == null) { str.setInspectionItemSubclass(""); } else { str.setInspectionItemSubclass(list.get(8).toString()); } StandardProductList db_str; try { db_str = standardProductListMapper.getOne(str.getStandardMethodListId(), str.getInspectionItem(), str.getSample(), str.getInspectionItemSubclass(), str.getModel(), str.getInspectionItemClass()); } catch (Exception e) { throw new ErrorException("重复查询:" + str.getInspectionItem() + " " + str.getInspectionItemSubclass()); } if (ObjectUtils.isNotEmpty(db_str)) { str.setId(db_str.getId()); str.setStructureItemParameterId(db_str.getStructureItemParameterId()); } if (list.get(10) != null) { str.setMethodS(list.get(10) + ""); } if (list.get(13) == null) { str.setTell(null); } else { str.setTell(list.get(13).toString()); } if (list.get(14) == null) { str.setAsk(null); } else { str.setAsk(list.get(14).toString()); } if (list.get(15) == null) { str.setPrice(null); } else { str.setPrice((list.get(15).toString())); } if (list.get(16) == null) { str.setManHour(null); } else { str.setManHour(list.get(16).toString()); } StandardTemplate standTempIdByName = standardTemplateService.getStandTempIdByName(String.valueOf(list.get(23))); if (standTempIdByName != null) { str.setTemplateId(standTempIdByName.getId()); } else { throw new ErrorException("模板不存在:" + list.get(23)); } str.setFactory("中天科技检测中心"); str.setLaboratory(laboratory.get()); str.setState(1); str.setTree(str.getFactory() + " - " + str.getLaboratory() + " - " + str.getSampleType() + " - " + str.getSample() + " - " + (str.getModel() == null ? "" : str.getModel())); try { str.setStructureItemParameterId(standardTreeMapper.getStructureItemParameterId("\"" + str.getSampleType() + "\"", str.getInspectionItem(), str.getInspectionItemSubclass(), str.getInspectionItemClass())); } catch (Exception e) { str.setStructureItemParameterId(standardTreeMapper.getStructureItemParameterId("\"" + str.getSampleType() + "\",\"" + str.getSample() + "\"", str.getInspectionItem(), str.getInspectionItemSubclass(), str.getInspectionItemClass())); } if (str.getStructureItemParameterId() == null) { throw new ErrorException("检验项目不存在:" + str.getInspectionItem() + " " + str.getInspectionItemSubclass()); } lists.add(str); } }); lists.forEach(a -> { if (a.getId() != null) { standardProductListMapper.updateById(a); } else { standardProductListMapper.insert(a); } }); } //导出 @Override public void exportStandTree(HttpServletResponse response) throws IOException { //查询标准库数据,按照产品大类分类 List standardTreeDtos = standardTreeMapper.exportStandTree(); Map> collect = standardTreeDtos.stream().collect(Collectors.groupingBy(standardTreeDto -> standardTreeDto.getSampleType())); List>> entryList = new ArrayList<>(collect.entrySet()); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("UTF-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("标准库导出", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); try { // 新建ExcelWriter ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build(); for (int i = 0; i < collect.size(); i++) { Map.Entry> entry = entryList.get(i); WriteSheet mainSheet = EasyExcel.writerSheet(i, entry.getKey()+"标准库导出").head(standardTreeDto.class).build(); excelWriter.write(entry.getValue(), mainSheet); } // 关闭流 excelWriter.finish(); } catch (IOException e) { throw new RuntimeException("导出失败"); } } @Override public void resetTreeOfPrice(String tree, Integer standardId) { standardProductListMapper.update(null, Wrappers.lambdaUpdate().like(StandardProductList::getTree, tree).eq(StandardProductList::getStandardMethodListId, standardId).set(StandardProductList::getPrice, null)); } @Override public void resetTreeOfHour(String tree, Integer standardId) { standardProductListMapper.update(null, Wrappers.lambdaUpdate().like(StandardProductList::getTree, tree).eq(StandardProductList::getStandardMethodListId, standardId).set(StandardProductList::getManHour, null)); } @Override public void resetTreeOfAsk(String tree, Integer standardId) { standardProductListMapper.update(null, Wrappers.lambdaUpdate().like(StandardProductList::getTree, tree).eq(StandardProductList::getStandardMethodListId, standardId) .set(StandardProductList::getAsk, null) .set(StandardProductList::getTell, null) .set(StandardProductList::getSection, null) .set(StandardProductList::getPrice, null) .set(StandardProductList::getManHour, null)); } }