src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -1,10 +1,5 @@
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;
@@ -13,9 +8,6 @@
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;
@@ -25,11 +17,9 @@
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;
@@ -46,7 +36,6 @@
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;
@@ -65,12 +54,12 @@
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;
@@ -78,14 +67,11 @@
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业务层处理
@@ -245,13 +231,22 @@
            for (SalesLedger ledger : ledgerList) {
                XSSFSheet sheet = workbook.createSheet(ledger.getSalesContractNo());
                sheet.setColumnWidth(0, 1310);  // 4.56 → 精准显示
                sheet.setColumnWidth(1, 4000);  // 15.06 → 精准显示
                sheet.setColumnWidth(2, 8980);  // 34.43 → 精准显示
                sheet.setColumnWidth(3, 1820);  // 6.56 → 精准显示
                sheet.setColumnWidth(4, 2880);  // 10.68 → 精准显示
                sheet.setColumnWidth(5, 5090);  // 19.31 → 精准显示
                sheet.setColumnWidth(6, 1410);  // 4.97 → 精准显示
                // 设置页边距(单位:英寸,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, 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, false, true);
@@ -303,11 +298,13 @@
                Row row7 = sheet.createRow(7);
                row7.createCell(0).setCellValue("地址:湖南省耒阳市创新创业园A1栋");
                Row row8 = sheet.createRow(8);
                row8.createCell(0).setCellValue("货物详细信息:");
                row8.setHeightInPoints((short) 3); // 行高3磅
                Row row9 = sheet.createRow(9);
                row9.createCell(0).setCellValue("货物详细信息:");
                int tableStart = 9;
                int tableStart = 10;
                Row headerRow = sheet.createRow(tableStart);
                headerRow.setHeightInPoints((short)22);
                headerRow.setHeightInPoints((short) 18);
                String[] headers = {"序号", "物料编号", "品名/规格", "单位", "数量", "订单号", "共四联"};
                for (int i = 0; i < headers.length; i++) {
@@ -337,7 +334,7 @@
                for (int i = 0; i < productList.size(); i++) {
                    SalesLedgerProduct p = productList.get(i);
                    Row dataRow = sheet.createRow(currentRow++);
                    dataRow.setHeightInPoints((short)22);
                    dataRow.setHeightInPoints((short) 18);
                    String materialCode = "";
                    if (p.getProductModelId() != null) {
@@ -373,7 +370,7 @@
                for (int i = 0; i < needEmpty; i++) {
                    int seq = productList.size() + i;
                    Row dataRow = sheet.createRow(currentRow++);
                    dataRow.setHeightInPoints((short)22);
                    dataRow.setHeightInPoints((short) 18);
                    for (int c = 0; c <= 5; c++) dataRow.createCell(c).setCellStyle(dataCenterStyle);
@@ -392,12 +389,12 @@
                // 合计
                Row totalRow = sheet.createRow(currentRow);
                totalRow.setHeightInPoints((short)22);
                totalRow.setHeightInPoints((short) 18);
                // 合计放在第二列,不合并单元格
                totalRow.createCell(1).setCellValue("合计");
                totalRow.createCell(4).setCellValue(totalQuantity.doubleValue());
                // 设置样式
                for (int c = 0; c <= 5; c++) {
                    Cell cell = totalRow.getCell(c) != null ? totalRow.getCell(c) : totalRow.createCell(c);
@@ -486,7 +483,7 @@
        if (date == null) {
            return null;
        }
        return date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        return date.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
    }
    @Override
@@ -609,7 +606,7 @@
    }
    @Override
    public IPage<SalesLedger> selectSalesLedgerListPage(Page page, SalesLedgerDto salesLedgerDto) {
    public IPage<SalesLedgerDto> selectSalesLedgerListPage(Page page, SalesLedgerDto salesLedgerDto) {
        return salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto);
    }
@@ -886,7 +883,7 @@
            // 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,
@@ -1032,10 +1029,13 @@
                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);
            }
        }
    }
@@ -1043,6 +1043,7 @@
    private SalesLedger convertToEntity(SalesLedgerDto dto) {
        SalesLedger entity = new SalesLedger();
        BeanUtils.copyProperties(dto, entity);
        entity.setProduce(dto.getProduce());
        return entity;
    }
@@ -1149,4 +1150,4 @@
            throw new RuntimeException("动态更新主表金额失败", e);
        }
    }
}
}