Parcourir la source

添加销售预测填报和工厂端汇总表格导出

bai il y a 3 semaines
Parent
commit
e4f0ca2721

+ 190 - 0
blade-service/blade-factory/src/main/java/org/springblade/factory/api/controller/SalesForecastSummaryController.java

@@ -493,6 +493,81 @@ public class SalesForecastSummaryController {
 
 
 	/**
+	 * 根据预测主表ID导出销售预测明细数据到Excel
+	 */
+	@GetMapping("/user/exportByMainId/{forecastMainId}")
+	public void userExportByMainId(@PathVariable Long forecastMainId, HttpServletResponse response) {
+
+		Long customerId = AuthUtil.getUserId();
+
+		PcBladeSalesForecastSummary pcBladeSalesForecastSummary = new PcBladeSalesForecastSummary();
+		pcBladeSalesForecastSummary.setCustomerId(customerId);
+		pcBladeSalesForecastSummary.setForecastMainId(forecastMainId);
+
+		// 1. 根据forecast_main_id查询明细数据
+		List<PcBladeSalesForecastSummary> summaryList = forecastService.findByForecastMainId(pcBladeSalesForecastSummary);
+
+		if (summaryList == null || summaryList.isEmpty()) {
+			try {
+				response.getWriter().write("没有找到对应的数据");
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			return;
+		}
+
+		// 2. 创建Excel工作簿
+		try (Workbook workbook = new XSSFWorkbook()) {
+			// 3. 创建工作表
+			Sheet sheet = workbook.createSheet("销售预测明细数据");
+
+			// 4. 创建表头样式
+			CellStyle headerStyle = createHeaderStyle(workbook);
+
+			// 5. 创建表头
+			String[] headers = {
+				"年份", "月份", "经销商编码", "经销商名称",
+				"品牌编码", "品牌名称", "物料编码", "物料名称",
+				"规格", "花纹", "预测数量", "审批状态"
+			};
+			Row headerRow = sheet.createRow(0);
+			for (int i = 0; i < headers.length; i++) {
+				Cell cell = headerRow.createCell(i);
+				cell.setCellValue(headers[i]);
+				cell.setCellStyle(headerStyle);
+				// 自动调整列宽
+				sheet.autoSizeColumn(i);
+			}
+
+			// 6. 填充数据
+			int rowNum = 1;
+			for (PcBladeSalesForecastSummary summary : summaryList) {
+				Row row = sheet.createRow(rowNum++);
+				fillSummaryDataRow(row, summary);
+			}
+
+			// 7. 设置响应头,准备下载
+			String fileName = "销售预测明细数据_" + forecastMainId + ".xlsx";
+			response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+			response.setHeader("Content-Disposition",
+				"attachment; filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()));
+
+			// 8. 写入响应流
+			workbook.write(response.getOutputStream());
+		} catch (IOException e) {
+			// 实际应用中应该使用日志框架记录异常
+			e.printStackTrace();
+			// 可以考虑添加适当的异常处理逻辑
+		}
+	}
+
+
+
+
+
+
+
+	/**
 	 * 填充用户数据行
 	 */
 	private void fillUserDataRow(Row row, PcBladeSalesForecastMain main, PcBladeSalesForecastSummary summary) {
@@ -914,6 +989,121 @@ public class SalesForecastSummaryController {
 
 
 
+	/**
+	 * 根据预测主表ID导出销售预测明细数据到Excel
+	 */
+	@GetMapping("/exportByMainId/{forecastMainId}")
+	public void exportByMainId(@PathVariable Long forecastMainId, HttpServletResponse response) {
+		// 1. 根据forecast_main_id查询明细数据
+		PcBladeSalesForecastSummary pcBladeSalesForecastSummary = new PcBladeSalesForecastSummary();
+		pcBladeSalesForecastSummary.setForecastMainId(forecastMainId);
+		List<PcBladeSalesForecastSummary> summaryList = forecastService.findByForecastMainId(pcBladeSalesForecastSummary);
+
+		if (summaryList == null || summaryList.isEmpty()) {
+			try {
+				response.getWriter().write("没有找到对应的数据");
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			return;
+		}
+
+		// 2. 创建Excel工作簿
+		try (Workbook workbook = new XSSFWorkbook()) {
+			// 3. 创建工作表
+			Sheet sheet = workbook.createSheet("销售预测明细数据");
+
+			// 4. 创建表头样式
+			CellStyle headerStyle = createHeaderStyle(workbook);
+
+			// 5. 创建表头
+			String[] headers = {
+				"年份", "月份", "经销商编码", "经销商名称",
+				"品牌编码", "品牌名称", "物料编码", "物料名称",
+				"规格", "花纹", "预测数量", "审批状态"
+			};
+			Row headerRow = sheet.createRow(0);
+			for (int i = 0; i < headers.length; i++) {
+				Cell cell = headerRow.createCell(i);
+				cell.setCellValue(headers[i]);
+				cell.setCellStyle(headerStyle);
+				// 自动调整列宽
+				sheet.autoSizeColumn(i);
+			}
+
+			// 6. 填充数据
+			int rowNum = 1;
+			for (PcBladeSalesForecastSummary summary : summaryList) {
+				Row row = sheet.createRow(rowNum++);
+				fillSummaryDataRow(row, summary);
+			}
+
+			// 7. 设置响应头,准备下载
+			String fileName = "销售预测明细数据_" + forecastMainId + ".xlsx";
+			response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+			response.setHeader("Content-Disposition",
+				"attachment; filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()));
+
+			// 8. 写入响应流
+			workbook.write(response.getOutputStream());
+		} catch (IOException e) {
+			// 实际应用中应该使用日志框架记录异常
+			e.printStackTrace();
+			// 可以考虑添加适当的异常处理逻辑
+		}
+	}
+
+	/**
+	 * 填充明细数据行
+	 */
+	private void fillSummaryDataRow(Row row, PcBladeSalesForecastSummary summary) {
+		int cellNum = 0;
+
+		// 年份
+		row.createCell(cellNum++).setCellValue(summary.getYear() != null ? summary.getYear() : 0);
+		// 月份
+		row.createCell(cellNum++).setCellValue(summary.getMonth() != null ? summary.getMonth() : 0);
+		// 经销商编码
+		row.createCell(cellNum++).setCellValue(summary.getCustomerCode() != null ? summary.getCustomerCode() : "");
+		// 经销商名称
+		row.createCell(cellNum++).setCellValue(summary.getCustomerName() != null ? summary.getCustomerName() : "");
+		// 品牌编码
+		row.createCell(cellNum++).setCellValue(summary.getBrandCode() != null ? summary.getBrandCode() : "");
+		// 品牌名称
+		row.createCell(cellNum++).setCellValue(summary.getBrandName() != null ? summary.getBrandName() : "");
+		// 物料编码
+		row.createCell(cellNum++).setCellValue(summary.getItemCode() != null ? summary.getItemCode() : "");
+		// 物料名称
+		row.createCell(cellNum++).setCellValue(summary.getItemName() != null ? summary.getItemName() : "");
+		// 规格
+		row.createCell(cellNum++).setCellValue(summary.getSpecs() != null ? summary.getSpecs() : "");
+		// 花纹
+		row.createCell(cellNum++).setCellValue(summary.getPattern() != null ? summary.getPattern() : "");
+		// 预测数量
+		if (summary.getForecastQuantity() != null) {
+			row.createCell(cellNum++).setCellValue(summary.getForecastQuantity().doubleValue());
+		} else {
+			row.createCell(cellNum++).setCellValue(0);
+		}
+		// 审批状态(转换为文字描述)
+		String approvalStatus = "";
+		if (summary.getApprovalStatus() != null) {
+			switch (summary.getApprovalStatus()) {
+				case 0:
+					approvalStatus = "未审批";
+					break;
+				case 1:
+					approvalStatus = "已通过";
+					break;
+				case 2:
+					approvalStatus = "已拒绝";
+					break;
+				default:
+					approvalStatus = "未知";
+			}
+		}
+		row.createCell(cellNum++).setCellValue(approvalStatus);
+	}
 
 
 

+ 3 - 0
blade-service/blade-factory/src/main/java/org/springblade/factory/mapper/PcBladeSalesForecastSummaryMapper.java

@@ -2,6 +2,7 @@ package org.springblade.factory.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import org.springblade.factory.entity.PcBladeSalesForecastSummary;
 
 import java.util.List;
@@ -12,4 +13,6 @@ public interface PcBladeSalesForecastSummaryMapper extends BaseMapper<PcBladeSal
 	int deleteByExample(PcBladeSalesForecastSummary example);
 	int batchInsert(List<PcBladeSalesForecastSummary> list);
 
+	List<PcBladeSalesForecastSummary> selectByForecastMainId(@Param("forecastMainId") Long forecastMainId);
+
 }

+ 7 - 1
blade-service/blade-factory/src/main/java/org/springblade/factory/service/PcBladeSalesForecastSummaryService.java

@@ -1,6 +1,7 @@
 package org.springblade.factory.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
@@ -148,6 +149,11 @@ public interface PcBladeSalesForecastSummaryService extends BaseService<PcBladeS
 	 */
 	List<PcBladeSalesForecastSummary> getForecastByUserAndMonth(Long customerId, Integer year, Integer month);
 
-
+	/**
+	 * 根据主表的ID获取数据
+	 * @param pcBladeSalesForecastSummary
+	 * @return
+	 */
+	List<PcBladeSalesForecastSummary> findByForecastMainId(PcBladeSalesForecastSummary pcBladeSalesForecastSummary);
 
 }

+ 19 - 0
blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeSalesForecastSummaryServiceImpl.java

@@ -622,4 +622,23 @@ public class PcBladeSalesForecastSummaryServiceImpl extends BaseServiceImpl<PcBl
 
 		return this.list(queryWrapper);
 	}
+
+
+	@Override
+	public List<PcBladeSalesForecastSummary> findByForecastMainId(PcBladeSalesForecastSummary pcBladeSalesForecastSummary) {
+		// 使用MyBatis-Plus的条件构造器构建查询条件
+		QueryWrapper<PcBladeSalesForecastSummary> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("forecast_main_id", pcBladeSalesForecastSummary.getForecastMainId());  // 匹配主表ID
+		queryWrapper.eq("is_deleted", 0);  // 过滤已删除数据
+		if (pcBladeSalesForecastSummary.getCustomerId() != null) {
+			queryWrapper.eq("customer_id", pcBladeSalesForecastSummary.getCustomerId());
+		}
+		queryWrapper.orderByAsc("year", "month", "customer_code", "item_code");  // 排序
+		// 调用父类的方法执行查询
+		return baseMapper.selectList(queryWrapper);
+	}
+
+
+
+
 }