| | |
| | | package com.ruoyi.sales.service.impl; |
| | | |
| | | import com.alibaba.excel.EasyExcel; |
| | | import com.alibaba.excel.ExcelWriter; |
| | | import com.alibaba.excel.write.metadata.WriteSheet; |
| | | import com.alibaba.excel.write.metadata.fill.FillConfig; |
| | | import com.alibaba.excel.write.metadata.fill.FillWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.deepoove.poi.XWPFTemplate; |
| | | import com.deepoove.poi.config.Configure; |
| | | import com.ruoyi.account.pojo.AccountIncome; |
| | | import com.ruoyi.account.service.AccountIncomeService; |
| | | import com.ruoyi.basic.mapper.CustomerMapper; |
| | | import com.ruoyi.basic.mapper.ProductMapper; |
| | |
| | | import com.ruoyi.common.enums.FileNameType; |
| | | import com.ruoyi.common.exception.base.BaseException; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | import com.ruoyi.common.utils.HackLoopTableRenderPolicy; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.device.execl.DeviceMaintenanceExeclDto; |
| | | import com.ruoyi.framework.security.LoginUser; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import com.ruoyi.other.mapper.TempFileMapper; |
| | |
| | | import com.ruoyi.sales.pojo.*; |
| | | import com.ruoyi.sales.service.ISalesLedgerProductService; |
| | | import com.ruoyi.sales.service.ISalesLedgerService; |
| | | import com.ruoyi.sales.vo.ShippingNoteVo; |
| | | import com.ruoyi.stock.mapper.StockInventoryMapper; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.io.*; |
| | | import java.io.IOException; |
| | | import java.io.InputStream; |
| | | import java.lang.reflect.Field; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.net.URLEncoder; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.nio.file.Files; |
| | | import java.nio.file.Path; |
| | | import java.nio.file.Paths; |
| | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.YearMonth; |
| | | import java.time.ZoneId; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.*; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.function.Function; |
| | | import java.util.stream.Collectors; |
| | | import java.util.zip.ZipEntry; |
| | | import java.util.zip.ZipOutputStream; |
| | | |
| | | /** |
| | | * 销售台账Service业务层处理 |
| | |
| | | for (SalesLedger ledger : ledgerList) { |
| | | XSSFSheet sheet = workbook.createSheet(ledger.getSalesContractNo()); |
| | | |
| | | sheet.setColumnWidth(0, 2500); |
| | | // 设置页边距(单位:英寸,1英寸=2.54厘米) |
| | | sheet.getPrintSetup().setLandscape(false); // 纵向打印 |
| | | sheet.setMargin(Sheet.TopMargin, 0.54 / 2.54); // 上页边距:0.54厘米 |
| | | sheet.setMargin(Sheet.BottomMargin, 0.54 / 2.54); // 下页边距:0.54厘米 |
| | | sheet.setMargin(Sheet.LeftMargin, 0.41 / 2.54); // 左页边距:0.41厘米 |
| | | sheet.setMargin(Sheet.RightMargin, 0.41 / 2.54); // 右页边距:0.41厘米 |
| | | sheet.setMargin(Sheet.HeaderMargin, 0.77 / 2.54); // 页眉:0.77厘米 |
| | | sheet.setMargin(Sheet.FooterMargin, 0.27 / 2.54); // 页脚:0.27厘米 |
| | | |
| | | sheet.setColumnWidth(0, 1310); |
| | | sheet.setColumnWidth(1, 4000); |
| | | sheet.setColumnWidth(2, 9000); |
| | | sheet.setColumnWidth(3, 2500); |
| | | sheet.setColumnWidth(4, 3000); |
| | | sheet.setColumnWidth(5, 4500); |
| | | sheet.setColumnWidth(6, 2000); |
| | | sheet.setColumnWidth(2, 8980); |
| | | sheet.setColumnWidth(3, 1820); |
| | | sheet.setColumnWidth(4, 2880); |
| | | sheet.setColumnWidth(5, 5090); |
| | | sheet.setColumnWidth(6, 1410); |
| | | |
| | | CellStyle companyTitle = createBaseStyle(workbook, "宋体", (short) 20, true, true); |
| | | CellStyle billTitle = createBaseStyle(workbook, "宋体", (short) 18, true, true); |
| | | CellStyle billTitle = createBaseStyle(workbook, "宋体", (short) 18, false, true); |
| | | CellStyle headerStyle = createBorderStyle(workbook, "宋体", (short) 12, true, true); |
| | | CellStyle dataCenterStyle = createBorderStyle(workbook, "宋体", (short) 11, false, true); |
| | | |
| | |
| | | fillMergeRange(sheet, 0, 0, 0, 6, companyTitle); |
| | | |
| | | Row row1 = sheet.createRow(1); |
| | | row1.createCell(0).setCellValue("送 货 单"); |
| | | row1.createCell(0).setCellValue("送 货 单"); |
| | | sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 6)); |
| | | fillMergeRange(sheet, 1, 1, 0, 6, billTitle); |
| | | |
| | | Customer customer = customerMapper.selectById(ledger.getCustomerId()); |
| | | |
| | | Row row2 = sheet.createRow(2); |
| | | row2.setHeightInPoints(13); |
| | | row2.createCell(0).setCellValue("客户名称:" + ledger.getCustomerName()); |
| | | row2.createCell(4).setCellValue("单据编号:" + ledger.getSalesContractNo()); |
| | | |
| | | Row row3 = sheet.createRow(3); |
| | | row3.setHeightInPoints(13); |
| | | row3.createCell(0).setCellValue("送货地址:" + customer.getCompanyAddress()); |
| | | row3.createCell(4).setCellValue("送货日期:" + formatDate(LocalDate.now())); |
| | | |
| | | // 空行 |
| | | Row row4 = sheet.createRow(4); |
| | | row4.createCell(0).setCellValue("联系方式:" + customer.getContactPerson() + " " + customer.getContactPhone()); |
| | | row4.setHeightInPoints(13); |
| | | row4.createCell(4).setCellValue("联系电话:" + customer.getCompanyPhone()); |
| | | |
| | | Row row5 = sheet.createRow(5); |
| | | row5.createCell(0).setCellValue("送货单位:湖南鹏创电子有限公司"); |
| | | row5.createCell(0).setCellValue("联系方式:" + customer.getContactPerson() + " " + customer.getContactPhone()); |
| | | Row row6 = sheet.createRow(6); |
| | | row6.createCell(0).setCellValue("地址:湖南省耒阳市创新创业园A1栋"); |
| | | row6.createCell(0).setCellValue("送货单位:湖南鹏创电子有限公司"); |
| | | Row row7 = sheet.createRow(7); |
| | | row7.createCell(0).setCellValue("货物详细信息:"); |
| | | row7.createCell(0).setCellValue("地址:湖南省耒阳市创新创业园A1栋"); |
| | | Row row8 = sheet.createRow(8); |
| | | row8.setHeightInPoints((short) 3); // 行高3磅 |
| | | Row row9 = sheet.createRow(9); |
| | | row9.createCell(0).setCellValue("货物详细信息:"); |
| | | |
| | | int tableStart = 8; |
| | | int tableStart = 10; |
| | | Row headerRow = sheet.createRow(tableStart); |
| | | headerRow.setHeightInPoints((short) 18); |
| | | |
| | | String[] headers = {"序号", "物料编号", "品名/规格", "单位", "数量", "订单号", "共四联"}; |
| | | for (int i = 0; i < headers.length; i++) { |
| | | Cell hc = headerRow.createCell(i); |
| | |
| | | for (int i = 0; i < productList.size(); i++) { |
| | | SalesLedgerProduct p = productList.get(i); |
| | | Row dataRow = sheet.createRow(currentRow++); |
| | | dataRow.setHeightInPoints((short) 18); |
| | | |
| | | String materialCode = ""; |
| | | if (p.getProductModelId() != null) { |
| | |
| | | for (int i = 0; i < needEmpty; i++) { |
| | | int seq = productList.size() + i; |
| | | Row dataRow = sheet.createRow(currentRow++); |
| | | dataRow.setHeightInPoints((short) 18); |
| | | |
| | | for (int c = 0; c <= 5; c++) dataRow.createCell(c).setCellStyle(dataCenterStyle); |
| | | |
| | |
| | | |
| | | // 合计 |
| | | Row totalRow = sheet.createRow(currentRow); |
| | | sheet.addMergedRegion(new CellRangeAddress(currentRow, currentRow, 0, 3)); |
| | | totalRow.createCell(0).setCellValue("合计"); |
| | | totalRow.setHeightInPoints((short) 18); |
| | | |
| | | // 合计放在第二列,不合并单元格 |
| | | totalRow.createCell(1).setCellValue("合计"); |
| | | totalRow.createCell(4).setCellValue(totalQuantity.doubleValue()); |
| | | fillMergeRange(sheet, currentRow, currentRow, 0, 5, dataCenterStyle); |
| | | |
| | | // 设置样式 |
| | | for (int c = 0; c <= 5; c++) { |
| | | Cell cell = totalRow.getCell(c) != null ? totalRow.getCell(c) : totalRow.createCell(c); |
| | | cell.setCellStyle(dataCenterStyle); |
| | | } |
| | | totalRow.createCell(6).setCellStyle(centerNoBorder); |
| | | |
| | | // 备注 |
| | | currentRow++; |
| | | Row emptyRow1 = sheet.createRow(currentRow); |
| | | emptyRow1.setHeightInPoints((short) 9); // 行高9磅 |
| | | |
| | | currentRow++; |
| | | Row remarkRow = sheet.createRow(currentRow); |
| | | remarkRow.createCell(0).setCellValue("备注:贵司在收货后请即刻核实数量及品质,若有异议,请在3日内提出,否则视为收受。"); |
| | | remarkRow.createCell(0).setCellValue("备注:贵司在收货后请即刻核实数量及品质,若有异议,请在3日内提出,否则视为收妥。"); |
| | | sheet.addMergedRegion(new CellRangeAddress(currentRow, currentRow, 0, 6)); |
| | | |
| | | currentRow++; |
| | | Row emptyRow2 = sheet.createRow(currentRow); |
| | | emptyRow2.setHeightInPoints((short) 9); // 行高9磅 |
| | | |
| | | currentRow++; |
| | | Row sign1 = sheet.createRow(currentRow); |
| | | sign1.createCell(0).setCellValue("送货单位(签章):"); |
| | | sign1.createCell(5).setCellValue("收货单位:"); |
| | | sign1.createCell(4).setCellValue("收货单位:"); |
| | | |
| | | currentRow++; |
| | | Row sign2 = sheet.createRow(currentRow); |
| | | sign2.createCell(0).setCellValue("送货人:"); |
| | | sign2.createCell(5).setCellValue("收货人:"); |
| | | sign2.createCell(4).setCellValue("收货人:"); |
| | | } |
| | | |
| | | workbook.write(response.getOutputStream()); |
| | |
| | | } |
| | | } |
| | | |
| | | // 工具类不动 |
| | | // 工具类 |
| | | private CellStyle createBaseStyle(Workbook workbook, String fontName, short fontSize, boolean bold, boolean center) { |
| | | CellStyle style = workbook.createCellStyle(); |
| | | Font font = workbook.createFont(); |
| | |
| | | if (date == null) { |
| | | return null; |
| | | } |
| | | return date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); |
| | | } |
| | | |
| | | /** |
| | | * 设置单元格样式 |
| | | */ |
| | | private void setCellStyle(Cell cell, boolean isHeader, boolean isTitle) { |
| | | Workbook workbook = cell.getSheet().getWorkbook(); |
| | | CellStyle style = workbook.createCellStyle(); |
| | | |
| | | // 设置对齐方式 |
| | | style.setAlignment(HorizontalAlignment.CENTER); |
| | | style.setVerticalAlignment(VerticalAlignment.CENTER); |
| | | |
| | | // 设置边框 |
| | | style.setBorderTop(BorderStyle.THIN); |
| | | style.setBorderBottom(BorderStyle.THIN); |
| | | style.setBorderLeft(BorderStyle.THIN); |
| | | style.setBorderRight(BorderStyle.THIN); |
| | | |
| | | // 设置字体 |
| | | Font font = workbook.createFont(); |
| | | font.setFontName("宋体"); |
| | | if (isTitle) { |
| | | font.setFontHeightInPoints((short) 16); |
| | | font.setBold(true); |
| | | } else if (isHeader) { |
| | | font.setFontHeightInPoints((short) 12); |
| | | font.setBold(true); |
| | | } else { |
| | | font.setFontHeightInPoints((short) 11); |
| | | } |
| | | style.setFont(font); |
| | | |
| | | cell.setCellStyle(style); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 送货单样式处理器 |
| | | */ |
| | | public static class ShippingNoteStyleHandler implements com.alibaba.excel.write.handler.CellWriteHandler { |
| | | @Override |
| | | public void beforeCellCreate(com.alibaba.excel.write.metadata.holder.WriteSheetHolder writeSheetHolder, com.alibaba.excel.write.metadata.holder.WriteTableHolder writeTableHolder, org.apache.poi.ss.usermodel.Row row, com.alibaba.excel.metadata.Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) { |
| | | } |
| | | |
| | | // @Override |
| | | // public void afterCellDispose(com.alibaba.excel.write.metadata.holder.WriteSheetHolder writeSheetHolder, com.alibaba.excel.write.metadata.holder.WriteTableHolder writeTableHolder, org.apache.poi.ss.usermodel.Cell cell, com.alibaba.excel.metadata.Head head, Integer relativeRowIndex, Boolean isHead) { |
| | | // org.apache.poi.ss.usermodel.Workbook workbook = writeSheetHolder.getSheet().getWorkbook(); |
| | | // org.apache.poi.ss.usermodel.Sheet sheet = writeSheetHolder.getSheet(); |
| | | // |
| | | // // 设置列宽 |
| | | // sheet.setColumnWidth(0, 6000); // 序号 |
| | | // sheet.setColumnWidth(1, 6000); // 物料编号 |
| | | // sheet.setColumnWidth(2, 10000); // 品名/规格 |
| | | // sheet.setColumnWidth(3, 4000); // 单位 |
| | | // sheet.setColumnWidth(4, 4000); // 数量 |
| | | // sheet.setColumnWidth(5, 6000); // 订单号 |
| | | // sheet.setColumnWidth(6, 4000); // 共四联 |
| | | // |
| | | // // 设置单元格样式 |
| | | // org.apache.poi.ss.usermodel.CellStyle style = workbook.createCellStyle(); |
| | | // style.setAlignment(org.apache.poi.ss.usermodel.HorizontalAlignment.CENTER); |
| | | // style.setVerticalAlignment(org.apache.poi.ss.usermodel.VerticalAlignment.CENTER); |
| | | // style.setBorderTop(org.apache.poi.ss.usermodel.BorderStyle.THIN); |
| | | // style.setBorderBottom(org.apache.poi.ss.usermodel.BorderStyle.THIN); |
| | | // style.setBorderLeft(org.apache.poi.ss.usermodel.BorderStyle.THIN); |
| | | // style.setBorderRight(org.apache.poi.ss.usermodel.BorderStyle.THIN); |
| | | // |
| | | // // 设置字体 |
| | | // org.apache.poi.ss.usermodel.Font font = workbook.createFont(); |
| | | // font.setFontName("宋体"); |
| | | // font.setFontHeightInPoints((short) 11); |
| | | // style.setFont(font); |
| | | // |
| | | // cell.setCellStyle(style); |
| | | // } |
| | | return date.format(DateTimeFormatter.ofPattern("yyyy/MM/dd")); |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | |
| | | @Override |
| | | public IPage<SalesLedger> selectSalesLedgerListPage(Page page, SalesLedgerDto salesLedgerDto) { |
| | | public IPage<SalesLedgerDto> selectSalesLedgerListPage(Page page, SalesLedgerDto salesLedgerDto) { |
| | | return salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto); |
| | | } |
| | | |
| | |
| | | // 4. 处理子表数据 |
| | | List<SalesLedgerProduct> productList = salesLedgerDto.getProductData(); |
| | | if (productList != null && !productList.isEmpty()) { |
| | | handleSalesLedgerProducts(salesLedger.getId(), productList, salesLedgerDto.getType(), salesLedgerDto.isProduce()); |
| | | handleSalesLedgerProducts(salesLedger.getId(), productList, salesLedgerDto.getType(), Boolean.TRUE.equals(salesLedgerDto.getProduce())); |
| | | updateMainContractAmount( |
| | | salesLedger.getId(), |
| | | productList, |
| | |
| | | salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice()); |
| | | salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice()); |
| | | salesLedgerProductMapper.insert(salesLedgerProduct); |
| | | |
| | | } |
| | | } |
| | | if (isProduce) { |
| | | for (SalesLedgerProduct salesLedgerProduct : products) { |
| | | // 添加生产数据 |
| | | if (isProduce) { |
| | | salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct); |
| | | } |
| | | salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct); |
| | | } |
| | | } |
| | | } |
| | |
| | | private SalesLedger convertToEntity(SalesLedgerDto dto) { |
| | | SalesLedger entity = new SalesLedger(); |
| | | BeanUtils.copyProperties(dto, entity); |
| | | entity.setProduce(dto.getProduce()); |
| | | return entity; |
| | | } |
| | | |
| | |
| | | throw new RuntimeException("动态更新主表金额失败", e); |
| | | } |
| | | } |
| | | } |
| | | } |