package com.thhy.materials.modules.biz.concret.service.impl; import cn.hutool.core.io.IoUtil; import cn.hutool.poi.excel.ExcelWriter; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.thhy.general.common.BasicResult; import com.thhy.general.config.SysUserInfo; import com.thhy.general.utils.UserInfoUtils; import com.thhy.materials.modules.biz.concret.entity.SysSteel; import com.thhy.materials.modules.biz.concret.entity.SysSteelRecord; import com.thhy.materials.modules.biz.concret.entity.dto.RecordDto; import com.thhy.materials.modules.biz.concret.entity.dto.RecordOutDto; import com.thhy.materials.modules.biz.concret.entity.dto.SteelStatisticsDto; import com.thhy.materials.modules.biz.concret.entity.dto.SteelStatisticsExcel; import com.thhy.materials.modules.biz.concret.mapper.SysSteelMapper; import com.thhy.materials.modules.biz.concret.mapper.SysSteelRecordMapper; import com.thhy.materials.modules.biz.concret.service.SysSteelRecordService; import com.thhy.materials.modules.biz.utils.ExcelUtil; import org.apache.poi.hssf.usermodel.DVConstraint; import org.apache.poi.hssf.usermodel.HSSFDataValidation; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.util.*; @Service public class SysSteelRecordServiceImpl implements SysSteelRecordService { @Resource private SysSteelRecordMapper recordMapper; @Resource private SysSteelMapper steelMapper; @Override @Transactional public BasicResult recordInsert(HashMap values) { SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo(); String userId = sysUserInfo.getUserId(); String companyId = sysUserInfo.getCompanyId(); values.put("createUser",userId); values.put("companyId",companyId); String steelId = values.get("steelId").toString(); Double changeStock = Double.valueOf(values.get("changeStock").toString()); Double stocks = recordMapper.steelSelectStock(steelId); BigDecimal b1 = new BigDecimal(Double.toString(changeStock)); double stock =0; if(stocks!=null && !stocks.equals("")&&!stocks.equals("0.0")&&Math.abs(stocks)>0.000000000001){ BigDecimal b2 = new BigDecimal(Double.toString(stocks)); stock = b1.add(b2).doubleValue(); }else { stock=b1.doubleValue(); } recordMapper.steelStockUpdate(steelId,stock); values.put("id",""); recordMapper.recordInsert(values); return BasicResult.success("入库成功"); } @Override public BasicResult recordList(Map values) { SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo(); String companyId = sysUserInfo.getCompanyId(); values.put("companyId",companyId); Integer pageNum = Integer.valueOf(values.get("pageNum").toString()); Integer pageSize = Integer.valueOf(values.get("pageSize").toString()); PageHelper.startPage(pageNum,pageSize); List recordList = recordMapper.recordList(values); recordList.stream().forEach(record -> { DecimalFormat df = new DecimalFormat("#.####"); String formattedNumber = df.format(record.getChangeStock()); record.setChangeStock(Double.valueOf(formattedNumber)); }); PageInfo sysSteelRecordPageInfo = new PageInfo<>(recordList); return BasicResult.success(sysSteelRecordPageInfo); } @Override public BasicResult recordThingJsList(String token) { SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo(token); String companyId = sysUserInfo.getCompanyId(); List recordList = recordMapper.recordThingJsList(companyId); return BasicResult.success(recordList); } @Override @Transactional public BasicResult recordDel(String id) { SysSteelRecord recordInfo = recordMapper.recordInfo(id); Double stocks = recordMapper.steelSelectStock(recordInfo.getSteelId()); Double changeStock = recordInfo.getChangeStock(); BigDecimal bd1 = new BigDecimal(Double.toString(stocks)); BigDecimal bd2 = new BigDecimal(Double.toString(changeStock)); double stockss =0; if(stocks!=null && !stocks.equals("")&&!stocks.equals("0.0")&&Math.abs(stocks)>0.000000000001){ stockss = bd1.subtract(bd2).doubleValue(); }else { stockss=(0-bd2.doubleValue()); } //修改实时库存 recordMapper.updateStockSteelId(recordInfo.getSteelId(),stockss); recordMapper.recordDel(id); return BasicResult.success("删除成功"); } @Override public BasicResult recordInfo(String id) { SysSteelRecord recordInfo = recordMapper.recordInfo(id); return BasicResult.success(recordInfo); } @Override public void recordExport(Map values, HttpServletResponse response) { SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo(); String companyId = sysUserInfo.getCompanyId(); values.put("companyId",companyId); List recordList = recordMapper.recordList(values); // if (recordList.size()<=0){ // response.setStatus(400); // return; // } List recordDtos = new ArrayList<>(); for (SysSteelRecord steelRecord : recordList){ RecordDto recordDto = new RecordDto(); recordDto.setCreateTime(steelRecord.getCreateTime()); recordDto.setSupplierName(steelRecord.getSupplierName()); recordDto.setFactoryName(steelRecord.getFactoryName()); recordDto.setBrand(steelRecord.getBrand()); recordDto.setSteelName(steelRecord.getSteelName()); recordDto.setSteelModel(steelRecord.getSteelModel()); recordDto.setChangeStock(steelRecord.getChangeStock()); recordDto.setUnit(steelRecord.getUnit()); recordDto.setRealName(steelRecord.getRealName()); recordDtos.add(recordDto); } Integer stockType = Integer.valueOf(values.get("stockType").toString()); ExcelWriter excel = new ExcelWriter();//定义excel if(stockType==1){ excel.addHeaderAlias("createTime", "入库时间"); }else { excel.addHeaderAlias("createTime", "质检合格时间"); } excel.addHeaderAlias("supplierName", "供应商"); excel.addHeaderAlias("factoryName", "厂家"); excel.addHeaderAlias("brand", "品牌"); excel.addHeaderAlias("steelName", "钢筋名称"); excel.addHeaderAlias("steelModel", "规格型号"); if(stockType==1){ excel.addHeaderAlias("changeStock", "入库重量"); }else { excel.addHeaderAlias("changeStock", "出库重量"); } excel.addHeaderAlias("unit", "计量单位"); if(stockType==1){ excel.addHeaderAlias("realName", "入库人"); }else { excel.addHeaderAlias("realName", "出库人"); } response.setContentType("application/vnd.ms-excel;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=test.xls"); OutputStream out = null; try { out = response.getOutputStream(); excel.write(recordDtos); excel.flush(out, true); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭writer,释放内存 excel.close(); } IoUtil.close(out); } @Override public void variateExcelTemplate(HttpServletResponse response) { SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo(); String companyId = sysUserInfo.getCompanyId(); List supplierList = recordMapper.supplierPull(companyId); System.out.println("----------------------------------||||||-----------------------"+supplierList); if(CollectionUtils.isEmpty(supplierList)){ BasicResult.faild("11111","该公司没有供应商","该公司没有供应商"); } String[] gys = supplierList.toArray(new String[supplierList.size()]); XSSFWorkbook book = new XSSFWorkbook(); XSSFSheet sheet = book.createSheet(); XSSFRow row = sheet.createRow(0); row.createCell(0).setCellValue("入库时间"); row.createCell(1).setCellValue("车牌号"); row.createCell(2).setCellValue("供应商"); // row.createCell(2).setCellValue("厂家"); // row.createCell(3).setCellValue("品牌"); row.createCell(3).setCellValue("钢筋名称--规格型号"); row.createCell(4).setCellValue("单位"); row.createCell(5).setCellValue("入库重量"); //row.createCell(6).setCellValue("计量单位"); // row.createCell(6).setCellValue("入库人"); //供应商 // CellRangeAddressList regions = new CellRangeAddressList(1, 500, 2, 2); // DataValidationHelper dataValidationHelper = sheet.getDataValidationHelper(); // DataValidationConstraint createExplicitListConstraint = dataValidationHelper.createExplicitListConstraint(gys); // DataValidation createValidation = dataValidationHelper.createValidation(createExplicitListConstraint, regions); // sheet.addValidationData(createValidation); //隐藏页 Sheet hidden = book.createSheet("供应商"); Cell cell = null; for (int i = 0; i < gys.length; i++) { String name = gys[i]; Row row1 = hidden.createRow(i); cell = row1.createCell(0); cell.setCellValue(name); } Name namedCell = book.createName(); namedCell.setNameName("供应商"); namedCell.setRefersToFormula("供应商" + "!$A$1:$A$" + gys.length); //sheet设置为隐藏 book.setSheetHidden(book.getSheetIndex(hidden), true); CellRangeAddressList addressList = new CellRangeAddressList(1, 500, 2, 2); DataValidationHelper dvHelper = sheet.getDataValidationHelper(); DataValidationConstraint gysList = dvHelper.createFormulaListConstraint("供应商"); DataValidation validation = dvHelper.createValidation(gysList, addressList); sheet.addValidationData(validation); // createDropDownListWithHiddenSheet(sheet,1, 500, 1, 2,gys,book,"供应商"); Map values = new HashMap<>(); values.put("companyId",companyId); List steels = steelMapper.steelList(values); if(CollectionUtils.isEmpty(steels)){ BasicResult.faild("11111","请先添加钢筋类型","请先添加钢筋类型"); } List lx = new ArrayList<>(); steels.forEach(sysSteel -> { lx.add(sysSteel.getSteelName()+"-"+sysSteel.getSteelModel()); }); String[] gjlx = lx.toArray(new String[lx.size()]); //钢筋类型 CellRangeAddressList regions1 = new CellRangeAddressList(1, 500, 3, 3); DataValidationHelper dataValidationHelper1 = sheet.getDataValidationHelper(); DataValidationConstraint createExplicitListConstraint1 = dataValidationHelper1.createExplicitListConstraint(gjlx); DataValidation createValidation1 = dataValidationHelper1.createValidation(createExplicitListConstraint1, regions1); sheet.addValidationData(createValidation1); response.setContentType("application/vnd.ms-excel;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=test.xls"); OutputStream out = null; try { out = response.getOutputStream(); book.write(out); out.close(); } catch (Exception e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(out); } BasicResult.success(); } @Override public BasicResult variateExcel(MultipartFile file, HttpServletRequest request) { SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo(); List> lists = null;//去工具类处理,返回excel中的数据 try { lists = ExcelUtil.getUserListByExcel(file.getInputStream(), file.getOriginalFilename()); } catch (Exception e) { e.printStackTrace(); } lists.remove(0); // row.createCell(0).setCellValue("入库时间"); // row.createCell(1).setCellValue("车牌号"); // row.createCell(2).setCellValue("供应商"); //// row.createCell(2).setCellValue("厂家"); //// row.createCell(3).setCellValue("品牌"); // row.createCell(3).setCellValue("钢筋名称--规格型号"); // row.createCell(4).setCellValue("单位"); // row.createCell(5).setCellValue("入库重量"); if(lists.size()>0){ for (List list : lists){ HashMap values = new HashMap<>(); //入库时间 String createTime = list.get(0).toString(); values.put("createTime",createTime); //车牌号 String carName = list.get(1).toString(); values.put("carName",carName); //供应商 String supplierName = list.get(2).toString(); String supplierId = recordMapper.supplierIdSelect(supplierName); values.put("supplierId",supplierId); values.put("stockType",1); // //厂家 // String factoryName = list.get(2).toString(); // values.put("factoryName",factoryName); // //品牌 // String brand = list.get(3).toString(); // values.put("brand",brand); //钢筋-规格型号 String steel_id = list.get(3).toString(); String[] split = steel_id.split("-"); //钢筋类型 String steelName = split[0]; //钢筋型号 String steelModel = split[1]; SysSteel steelIds = recordMapper.steelNameAndSteelModelSelectSteelId(steelName,steelModel); values.put("steelId",steelIds.getSteelId()); //入库重量 Double changeStock = Double.valueOf(list.get(5).toString()); values.put("changeStock",changeStock); //计量单位 //入库人 //SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo(); String userId = sysUserInfo.getUserId(); values.put("createUser",userId); values.put("companyId",sysUserInfo.getCompanyId()); //入库重量 BigDecimal b1 = new BigDecimal(Double.toString(changeStock)); Double stocks = steelIds.getStock(); double stock =0; if(stocks!=null && !stocks.equals("")&&!stocks.equals("0.0")&&Math.abs(stocks)>0.000000000001){ BigDecimal b2 = new BigDecimal(Double.toString(stocks)); stock = b1.add(b2).doubleValue(); }else { stock=b1.doubleValue(); } recordMapper.steelStockUpdate(steelIds.getSteelId(),stock); values.put("id",""); recordMapper.recordInsert(values); } } return BasicResult.success("导入成功"); } @Override public BasicResult steelStatistics(Map values) { SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo(); String companyId = sysUserInfo.getCompanyId(); values.put("companyId",companyId); String dateType = values.get("dateType").toString(); Liststeels = recordMapper.steelPull(values); String strTime = values.get("strTime").toString(); String endTime = values.get("endTime").toString(); if(dateType.equals("1")){ List betweenDate = getBetweenDate(strTime, endTime); if(steels.size()>0){ for (SysSteel s :steels){ values.put("steelId",s.getSteelId()); List steelStatisticsDtos = recordMapper.recordStatisticsDay(values); s.setSteelStatisticsDtos(steelStatisticsDtos); s.setBetweenDate(betweenDate); } } //日 return BasicResult.success(steels); }else if (dateType.equals("2")){//月 List monthBetweenDate = getMonthBetweenDate(strTime, endTime); if(steels.size()>0){ for (SysSteel s :steels){ values.put("steelId",s.getSteelId()); List steelStatisticsDtos = recordMapper.recordStatisticsMonth(values); s.setSteelStatisticsDtos(steelStatisticsDtos); s.setBetweenDate(monthBetweenDate); } } return BasicResult.success(steels); } return BasicResult.faild("11111","类型错误","error"); } @Override public BasicResult recordSum(Map values) { SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo(); String companyId = sysUserInfo.getCompanyId(); values.put("companyId",companyId); String dateType = values.get("dateType").toString(); if(dateType.equals("1")){ //日 List steelStatisticsDtos = recordMapper.recordSumDay(values); return BasicResult.success(steelStatisticsDtos); }else if (dateType.equals("2")){//月 List steelStatisticsDtos = recordMapper.recordSumMonth(values); return BasicResult.success(steelStatisticsDtos); } return BasicResult.faild("11111","类型错误","error"); } @Override public BasicResult recordStatisticsExcel(Map values,HttpServletResponse response) { SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo(); String companyId = sysUserInfo.getCompanyId(); values.put("companyId",companyId); String dateType = values.get("dateType").toString(); List steelStatisticsExcels = new ArrayList<>(); if(dateType.equals("1")){ //日 List steelStatisticsDtos = recordMapper.recordStatisticsDay(values); for (SteelStatisticsDto sd : steelStatisticsDtos){ SteelStatisticsExcel sse = new SteelStatisticsExcel(); sse.setSteelName(sd.getSteelName()); sse.setSteelModel(sd.getSteelModel()); sse.setGetDate(sd.getGetDate()); sse.setChangeStock(sd.getChangeStock()); steelStatisticsExcels.add(sse); } }else if (dateType.equals("2")){//月 List steelStatisticsDtos = recordMapper.recordStatisticsMonth(values); for (SteelStatisticsDto sd : steelStatisticsDtos){ SteelStatisticsExcel sse = new SteelStatisticsExcel(); sse.setSteelName(sd.getSteelName()); sse.setSteelModel(sd.getSteelModel()); sse.setGetDate(sd.getGetDate()); sse.setChangeStock(sd.getChangeStock()); steelStatisticsExcels.add(sse); } } ExcelWriter excel = new ExcelWriter();//定义excel excel.addHeaderAlias("steelName", "钢筋名称"); excel.addHeaderAlias("steelModel", "规格型号"); excel.addHeaderAlias("getDate", "日期"); excel.addHeaderAlias("changeStock", "数量"); response.setContentType("application/vnd.ms-excel;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=test.xls"); OutputStream out = null; try { out = response.getOutputStream(); excel.write(steelStatisticsExcels); excel.flush(out, true); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭writer,释放内存 excel.close(); } IoUtil.close(out); return BasicResult.success(); } @Override public void recordOutExport(Map values, HttpServletResponse response) { SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo(); String companyId = sysUserInfo.getCompanyId(); values.put("companyId",companyId); List recordList = recordMapper.recordList(values); // if (recordList.size()<=0){ // response.setStatus(400); // return; // } List recordDtos = new ArrayList<>(); for (SysSteelRecord steelRecord : recordList){ RecordOutDto recordDto = new RecordOutDto(); recordDto.setCreateTime(steelRecord.getCreateTime()); recordDto.setSteelName(steelRecord.getSteelName()); recordDto.setSteelModel(steelRecord.getSteelModel()); recordDto.setChangeStock(steelRecord.getChangeStock()); recordDto.setUnit(steelRecord.getUnit()); recordDto.setLineCode(steelRecord.getLineCode()); recordDto.setProName(steelRecord.getProName()); recordDtos.add(recordDto); } Integer stockType = Integer.valueOf(values.get("stockType").toString()); ExcelWriter excel = new ExcelWriter();//定义excel if(stockType==1){ excel.addHeaderAlias("createTime", "入库时间"); }else { excel.addHeaderAlias("createTime", "质检合格时间"); } excel.addHeaderAlias("steelName", "钢筋名称"); excel.addHeaderAlias("steelModel", "规格型号"); excel.addHeaderAlias("unit", "计量单位"); if(stockType==1){ excel.addHeaderAlias("changeStock", "入库重量"); }else { excel.addHeaderAlias("changeStock", "出库重量"); } excel.addHeaderAlias("lineCode", "钢筋笼编号"); excel.addHeaderAlias("proName", "项目名称"); response.setContentType("application/vnd.ms-excel;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=test.xls"); OutputStream out = null; try { out = response.getOutputStream(); excel.write(recordDtos); excel.flush(out, true); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭writer,释放内存 excel.close(); } IoUtil.close(out); } public static List getBetweenDate(String startTime, String endTime){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 声明保存日期集合 List list = new ArrayList(); try { // 转化成日期类型 Date startDate = sdf.parse(startTime); Date endDate = sdf.parse(endTime); //用Calendar 进行日期比较判断 Calendar calendar = Calendar.getInstance(); while (startDate.getTime()<=endDate.getTime()){ // 把日期添加到集合 list.add(sdf.format(startDate)); // 设置日期 calendar.setTime(startDate); //把日期增加一天 calendar.add(Calendar.DATE, 1); // 获取增加后的日期 startDate=calendar.getTime(); } } catch (ParseException e) { e.printStackTrace(); } return list; } /** * 获取两个日期之间的所有月份 (年月) * * @param startTime * @param endTime * @return:list */ public static List getMonthBetweenDate(String startTime, String endTime) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); // 声明保存日期集合 List list = new ArrayList<>(); try { // 转化成日期类型 Date startDate = sdf.parse(startTime); Date endDate = sdf.parse(endTime); //用Calendar 进行日期比较判断 Calendar calendar = Calendar.getInstance(); while (startDate.getTime() <= endDate.getTime()) { // 把日期添加到集合 list.add(sdf.format(startDate)); // 设置日期 calendar.setTime(startDate); //把月数增加 1 calendar.add(Calendar.MONTH, 1); // 获取增加后的日期 startDate = calendar.getTime(); } } catch (Exception e) { e.printStackTrace(); } return list; } /** * 隐藏Sheet方式创建下拉框(单元格下拉框数据大于255字节时使用) * * @return */ public void createDropDownListWithHiddenSheet(Sheet sheet, int firstRow, int firstCol, int endRow, int endCol, String[] dataArray, Workbook wbCreat, String hidddenSheetName) { Sheet hidden = wbCreat.createSheet(hidddenSheetName); Cell cell = null; for (int i = 0, length = dataArray.length; i < length; i++) { String name = dataArray[i]; Row row = hidden.createRow(i); cell = row.createCell(0); cell.setCellValue(name); } Name namedCell = wbCreat.createName(); namedCell.setNameName(hidddenSheetName); namedCell.setRefersToFormula(hidddenSheetName + "!$A$1:$A$" + dataArray.length); //sheet设置为隐藏 wbCreat.setSheetHidden(wbCreat.getSheetIndex(hidden), true); //加载数据,将名称为hidden的 DataValidationConstraint constraint = null; // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 CellRangeAddressList addressList = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); // 创建 DataValidation DataValidation validation = null; if (sheet instanceof XSSFSheet || sheet instanceof SXSSFSheet) { DataValidationHelper dvHelper = sheet.getDataValidationHelper(); constraint = dvHelper.createFormulaListConstraint(hidddenSheetName); validation = dvHelper.createValidation(constraint, addressList); } else { constraint = DVConstraint.createFormulaListConstraint(hidddenSheetName); validation = new HSSFDataValidation(addressList, constraint); } if (validation instanceof HSSFDataValidation ) { validation .setSuppressDropDownArrow(false); } else { validation .setSuppressDropDownArrow(true); validation .setShowErrorBox(true); } sheet.addValidationData(validation); } }