package com.repair.controller; import com.repair.api.RepairConsumeControllerAPI; import com.repair.common.utils.ExcelExportUtil; import com.repair.common.utils.ExcelUtils; import com.repair.common.utils.TimeExchange; import com.repair.common.utils.paramUtils; import com.repair.model.enumModel.eFileType; import com.repair.model.pojo.RepairArticleType; import com.repair.model.pojo.RepairConsume; import com.repair.model.request.insertRepairAssociationRequest; import com.repair.model.request.insertRepairConsumeRequest; import com.repair.model.request.updateRepairConsumeRequest; import com.repair.model.result.CommonResult; import com.repair.model.result.PageUtils; import com.repair.model.vo.*; import com.repair.services.RepairAreaService; import com.repair.services.RepairArticleTypeService; import com.repair.services.RepairConsumeService; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.DataFormatter; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** *

* 前端控制器 *

* * @author ceshi * @since 2023-07-18 */ @RestController public class RepairConsumeController implements RepairConsumeControllerAPI { @Autowired private RepairAreaService repairAreaService; @Autowired private RepairConsumeService repairConsumeService; @Autowired private RepairArticleTypeService repairArticleTypeService; /** * 关联耗材中添加耗材 * @param irc 耗材数据 * @param bindingResult 是否为空判断 * @return */ @Override public CommonResult InsertRepairAssociation(insertRepairAssociationRequest irc, BindingResult bindingResult) { if (bindingResult.hasErrors()) { String st = paramUtils.getParamError(bindingResult); return CommonResult.fail(st); } RepairConsume data = repairConsumeService.queryConsumeByName(irc.getName(), irc.getSchoolId()); if (data != null) { return CommonResult.fail("该报修耗材已存在!"); } RepairConsume rc = new RepairConsume() .setName(irc.getName()) .setSchoolId(irc.getSchoolId()) .setArticleId(irc.getArticleId()) .setPrice(new BigDecimal(0)); int result = repairConsumeService.insertRepairConsume(rc); return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败"); } /** * 新增耗材数据 * @param ircr 耗材数据 * @param bindingResult 是否为空判断 * @return */ @Override public CommonResult InsertRepairConsume(insertRepairConsumeRequest ircr, BindingResult bindingResult) { if (bindingResult.hasErrors()) { String st = paramUtils.getParamError(bindingResult); return CommonResult.fail(st); } RepairConsume data = repairConsumeService.queryConsumeByName(ircr.getName(), ircr.getSchoolId()); if (data != null) { return CommonResult.fail("该报修耗材已存在!"); } RepairConsume rc = new RepairConsume() .setName(ircr.getName()) .setSchoolId(ircr.getSchoolId()) .setArticleId(StringUtils.join(ircr.getArticleIds(), ',')) .setPrice(ircr.getPrice()) .setContent(ircr.getContent()); int result = repairConsumeService.insertRepairConsume(rc); return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败"); } /** * 根据数据ID修改耗材数据 * @param urcr 耗材数据 * @param bindingResult 是否为空判断 * @return */ @Override public CommonResult updateRepairConsumeById(updateRepairConsumeRequest urcr, BindingResult bindingResult) { if (bindingResult.hasErrors()) { String st = paramUtils.getParamError(bindingResult); return CommonResult.fail(st); } RepairConsume data = repairConsumeService.queryConsumeByName(urcr.getName(), urcr.getSchoolId()); if (data != null && !data.getId().equals(urcr.getId())) { return CommonResult.fail("该报修耗材已存在!"); } RepairConsume rc = new RepairConsume() .setId(urcr.getId()) .setSchoolId(urcr.getSchoolId()) .setName(urcr.getName()) .setArticleId(StringUtils.join(urcr.getArticleIds(), ',')) .setPrice(urcr.getPrice()) .setContent(urcr.getContent()); int result = repairConsumeService.updateRepairConsume(rc); return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败"); } /** * 耗材管理分页数据查询 * @param currentPage 当前页数 * @param pageCount 一页数据条数 * @param name 耗材名称 * @param startTime 起始时间 * @param endTime 结束时间 * @return */ @Override public CommonResult queryPageRepairConsumes(int currentPage, int pageCount, String name, String startTime, String endTime) { if (startTime != null && endTime != null) { try { startTime = TimeExchange.getStartOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd")); endTime = TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(endTime, "yyyy-MM-dd")); } catch (Exception e) { } } PageUtils result = repairConsumeService.queryPageRepairConsumes(currentPage, pageCount, name, startTime, endTime); for (RepairConsumeVo r : result.getList()) { if (r.getArticleId() != null) { r.setArticleIds(Arrays.asList(r.getArticleId().split(","))); } if (r.getArticleName() != null) { r.setArticleNames(Arrays.asList(r.getArticleName().split(","))); } } return CommonResult.ok(result); } /** * 根据数据ID删除耗材数据 * @param id 数据ID * @return */ @Override public CommonResult deleteRepairConsumeById(int id) { RepairConsume data = repairConsumeService.getRepairById(id); if (data == null) { return CommonResult.fail("当前数据不存在,删除失败!"); } int result = repairConsumeService.deleteRepairConsumeById(id); return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败"); } /** * 耗材数据导出 * @param name 耗材名称 * @param startTime 起始时间 * @param endTime 结束时间 * @param response 文件响应流 * @throws NoSuchMethodException * @throws InstantiationException * @throws IllegalAccessException * @throws InvocationTargetException */ @Override public void downloadRepairConsumeExcel(String name, String startTime, String endTime, HttpServletResponse response) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { Map map = new HashMap<>(); //表头与键值对的映射关系 map.put("id", "数据ID"); map.put("name", "耗材名称"); map.put("schoolName", "校区名称"); map.put("price", "耗材单价"); map.put("artileName", "物品类型"); map.put("entryName", "录入人员"); map.put("updateTimeStr", "录入时间"); if (startTime != null && endTime != null) { try { startTime = TimeExchange.getStartOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd")); endTime = TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(endTime, "yyyy-MM-dd")); } catch (Exception e) { } } List datas = repairConsumeService.queryConsumeList(name, startTime, endTime); List orderList = new ArrayList<>(); orderList.add("id"); orderList.add("name"); orderList.add("schoolName"); orderList.add("price"); orderList.add("artileName"); orderList.add("entryName"); orderList.add("updateTimeStr"); //导出逻辑 这里的list是从导入里面哪来的 map1与map不一样 orderList这里为空 Workbook workbook = ExcelExportUtil.createWorkbook(datas, map, 1, "耗材管理表", orderList); ExcelUtils.excelDownload(workbook, "耗材管理.xlsx", response); } /** * 耗材模板数据导出 * @param response 文件响应流 */ @Override public void downloadRepairConsumeModelExcel(HttpServletResponse response) { ExcelUtils.fileDownload("/耗材管理模板.xlsx", response); } /** * 耗材数据导入 * @param file 导入文件 * @return * @throws IOException */ @Override public CommonResult importRepairConsumeExcel(MultipartFile file) throws IOException { if (file.isEmpty() || file.getSize() == 0) { return CommonResult.fail("导入文件不能为空"); } String ContentType = file.getContentType(); InputStream inputStream = file.getInputStream(); List result = new ArrayList<>(); //xls格式文件 if (ContentType.equals(eFileType.Xls.getValue())) { CommonResult> resultData = readXls(inputStream); if (!resultData.isSuccess()) { return resultData; } result = resultData.getData(); } else if (ContentType.equals(eFileType.Xlsx.getValue())) { CommonResult> resultData = readXlsx(inputStream); if (!resultData.isSuccess()) { return resultData; } result = resultData.getData(); } else { return CommonResult.fail("耗材数据导入只支持Xls、Xlsx"); } boolean resultBool = repairConsumeService.saveBatch(result); return resultBool ? CommonResult.ok("导入成功") : CommonResult.fail("导入失败"); } /** * 导入Xls文件方法 * @param inputStream * @return * @throws IOException */ private CommonResult> readXls(InputStream inputStream) throws IOException { HSSFWorkbook sheets = new HSSFWorkbook(inputStream); List result = new ArrayList<>(); List ConsumeNames = new ArrayList<>(); //读取第一张sheet HSSFSheet sheetAt = sheets.getSheetAt(0); //获取校区数据 List schools = repairAreaService.queryRepairSchools(); //报修物品 List articles = repairArticleTypeService.getRepairArticleTypes(); //耗材数据 List consumes = repairConsumeService.getConsumes(); DataFormatter dataFormatter = new DataFormatter(); try { //sheetAt.getLastRowNum():从0开始统计数量 所以得+1 for (int rowNum = 1; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) { HSSFRow row = sheetAt.getRow(rowNum); if (rowNum == 1) { String name = dataFormatter.formatCellValue(row.getCell(0));//耗材名称 if (!name.equals("名称")) { return CommonResult.fail("导入数据第一列为名称"); } String schoolName = dataFormatter.formatCellValue(row.getCell(1));//校区名称 if (!schoolName.equals("校区")) { return CommonResult.fail("导入数据第二列为校区"); } String ArticleName = dataFormatter.formatCellValue(row.getCell(2));//报修物品类别 if (!ArticleName.equals("类别")) { return CommonResult.fail("导入数据第三列为类别"); } String price = dataFormatter.formatCellValue(row.getCell(3));//耗材单价 if (!price.equals("价格(元)")) { return CommonResult.fail("导入数据第四列为价格"); } } else { RepairConsume data = new RepairConsume(); //耗材名称 String name = dataFormatter.formatCellValue(row.getCell(0)); ConsumeNames.add(name); if (ConsumeNames.stream().distinct().count() != ConsumeNames.size()) { return CommonResult.fail("导入的Excel中" + name + "存在重复数据"); } data.setName(name); //校区 String schoolName = dataFormatter.formatCellValue(row.getCell(1)); Optional school = schools.stream().filter(e -> e.getName().equals(schoolName)).findFirst(); if (school != null && school.isPresent()) { data.setSchoolId(school.get().getId()); } else { return CommonResult.fail(name + "的" + schoolName + "校区数据在数据库中不存在"); } //重复数据提示 long exist = consumes.stream().filter(e -> e.getSchoolId().equals(school.get().getId()) && e.getName().equals(name)).count(); if (exist > 0) { return CommonResult.fail(schoolName + "的" + name + "耗材数据在系统中已存在,请勿重复导入"); } //报修物品(类别) String article = dataFormatter.formatCellValue(row.getCell(2)); String[] articleStrs = null; if (article.contains("、")) { articleStrs = article.split("、"); } else if (article.contains(",")) { articleStrs = article.split(","); } else { articleStrs = new String[1]; articleStrs[0] = article; } List ass = new ArrayList<>(); for (String as : articleStrs) { if (!as.equals("")) { Optional shiftData = articles.stream().filter(e -> e.getName().equals(as) && data.getSchoolId().equals(e.getSchoolId())).findFirst(); if (shiftData != null && shiftData.isPresent()) { ass.add(shiftData.get().getId().toString()); } else { return CommonResult.fail(name + "的" + as + "数据不存在"); } } data.setArticleId(StringUtils.join(ass, ',')); result.add(data); } //价格 BigDecimal price = new BigDecimal(String.valueOf(row.getCell(3))).stripTrailingZeros(); data.setPrice(price); } } } catch (Exception e) { return CommonResult.fail("请按模板格式导入数据"); } return CommonResult.ok(result); } /** * 导入Xlsx文件方法 * @param inputStream * @return * @throws IOException */ private CommonResult> readXlsx(InputStream inputStream) throws IOException { XSSFWorkbook sheets = new XSSFWorkbook(inputStream); List result = new ArrayList<>(); List ConsumeNames = new ArrayList<>(); //读取第一张sheet XSSFSheet sheetAt = sheets.getSheetAt(0); //获取校区数据 List schools = repairAreaService.queryRepairSchools(); //报修物品 List articles = repairArticleTypeService.getRepairArticleTypes(); //耗材数据 List consumes = repairConsumeService.getConsumes(); DataFormatter dataFormatter = new DataFormatter(); try { //sheetAt.getLastRowNum():从0开始统计数量 所以得+1 for (int rowNum = 1; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) { XSSFRow row = sheetAt.getRow(rowNum); if (rowNum == 1) { String name = dataFormatter.formatCellValue(row.getCell(0));//耗材名称 if (!name.equals("名称")) { return CommonResult.fail("导入数据第一列为名称"); } String schoolName = dataFormatter.formatCellValue(row.getCell(1));//校区名称 if (!schoolName.equals("校区")) { return CommonResult.fail("导入数据第二列为校区"); } String ArticleName = dataFormatter.formatCellValue(row.getCell(2));//报修物品类别 if (!ArticleName.equals("类别")) { return CommonResult.fail("导入数据第三列为类别"); } String price = dataFormatter.formatCellValue(row.getCell(3));//耗材单价 if (!price.equals("价格(元)")) { return CommonResult.fail("导入数据第四列为价格"); } } else { RepairConsume data = new RepairConsume(); //耗材名称 String name = dataFormatter.formatCellValue(row.getCell(0)); ConsumeNames.add(name); if (ConsumeNames.stream().distinct().count() != ConsumeNames.size()) { return CommonResult.fail("导入的Excel中" + name + "存在重复数据"); } data.setName(name); //校区 String schoolName = dataFormatter.formatCellValue(row.getCell(1)); Optional school = schools.stream().filter(e -> e.getName().equals(schoolName)).findFirst(); if (school != null && school.isPresent()) { data.setSchoolId(school.get().getId()); } else { return CommonResult.fail(name + "的" + schoolName + "校区数据在数据库中不存在"); } //重复数据提示 long exist = consumes.stream().filter(e -> e.getSchoolId().equals(school.get().getId()) && e.getName().equals(name)).count(); if (exist > 0) { return CommonResult.fail(schoolName + "的" + name + "耗材数据在系统中已存在,请勿重复导入"); } //报修物品(类别) String article = dataFormatter.formatCellValue(row.getCell(2)); String[] articleStrs = null; if (article.contains("、")) { articleStrs = article.split("、"); } else if (article.contains(",")) { articleStrs = article.split(","); } else { articleStrs = new String[1]; articleStrs[0] = article; } List ass = new ArrayList<>(); for (String as : articleStrs) { if (!as.equals("")) { Optional shiftData = articles.stream().filter(e -> e.getName().equals(as) && data.getSchoolId().equals(e.getSchoolId())).findFirst(); if (shiftData != null && shiftData.isPresent()) { ass.add(shiftData.get().getId().toString()); } else { return CommonResult.fail(name + "的" + as + "数据不存在"); } } data.setArticleId(StringUtils.join(ass, ',')); result.add(data); } //价格 BigDecimal price = new BigDecimal(dataFormatter.formatCellValue(row.getCell(3))); data.setPrice(price); } } } catch (Exception e) { return CommonResult.fail("请按模板格式导入数据"); } return CommonResult.ok(result); } /** * 根据校区ID和关键字查询耗材二级数据 * @param schoolId 校区ID * @return */ @Override public CommonResult queryRepairConsumesBykey(int schoolId, String keyWord) { List result = repairArticleTypeService.getRepairArticlesBySchoolId(schoolId); List consumeLists = repairConsumeService.getConsumesByKeyword(schoolId, keyWord); List datas = new ArrayList<>(); for (RepairConsume data:consumeLists) { RepairConsumeTreeVo treeData = new RepairConsumeTreeVo(); treeData.setName(data.getName()); treeData.setId(data.getId()); treeData.setParentId(Integer.valueOf(data.getArticleId())); treeData.setPrice(data.getPrice()); treeData.setNumber(1); treeData.setSchoolId(data.getSchoolId()); Optional article = result.stream().filter(e -> e.getId().toString().equals(data.getArticleId())).findFirst(); if(article != null && article.isPresent()){ treeData.setParentName(article.get().getName()); } datas.add(treeData); } return CommonResult.ok(datas); } /** * 根据校区ID查询耗材树形图结构数据 * @param schoolId 校区ID * @return */ @Override public CommonResult queryRepairConsumeTypeTree(int schoolId) { List result = repairArticleTypeService.getRepairArticlesBySchoolId(schoolId); List consumeLists = repairConsumeService.getConsumesByKeyword(schoolId, null); List datas = new ArrayList<>(); for (RepairArticleType data:result) { RepairConsumeypeTreeVo newData = new RepairConsumeypeTreeVo().builder() .id(data.getId()) .schoolId(data.getSchoolId()) .parentId(0) .price(null) .name(data.getName()) .build(); List consumes = QueryArticleTypeTreeRecords(newData.getId(), newData.getName(), consumeLists); newData.setChildren(consumes); datas.add(newData); } return CommonResult.ok(datas); } /** * 根据父级ID获取树形菜单数据 * @param parentID 父级ID * @param lists 数据集合 * @return */ private List QueryArticleTypeTreeRecords(Integer parentID, String parentName, List lists) { List newTrees = new ArrayList<>(); List datas = lists.stream().filter(e -> e.getArticleId().equals(parentID.toString())).collect(Collectors.toList()); for (RepairConsume data : datas) { RepairConsumeypeTreeVo item = RepairConsumeypeTreeVo.builder() .id(data.getId()) .schoolId(data.getSchoolId()) .parentId(Integer.valueOf(data.getArticleId())) .parentName(parentName) .price(data.getPrice()) .name(data.getName()) .number(1) .build(); List news = QueryArticleTypeTreeRecords(item.getId(), item.getName(), lists); if (news == null || news.size() == 0) { newTrees.add(item); continue; } else { item.setChildren(news); newTrees.add(item); } } return newTrees; } }