Преглед изворни кода

修复U9订单提交,预测模板导出

baihua пре 3 недеља
родитељ
комит
53db20bdeb

+ 17 - 1
blade-service-api/blade-factory-api/src/main/java/org/springblade/factory/entity/ViewWhqohSel.java

@@ -14,75 +14,91 @@ public class ViewWhqohSel extends BaseEntity {
 
 	private static final long serialVersionUID = 1L;
 
+	//组织 ID
 	@JsonProperty("ORG_ID")
 	@TableField("ORG_ID")
 	private Long orgId;
 
+	//组织 编码
 	@JsonProperty("ORG_CODE")
 	@TableField("ORG_CODE")
 	private String orgCode;
 
+	// 组织 名称
 	@JsonProperty("ORG_NAME")
 	@TableField("ORG_NAME")
 	private String orgName;
 
+	//料品ID
 	@JsonProperty("Item_ID")
 	@TableField("Item_ID")
 	private Long itemId;
 
+	// 料号
 	@JsonProperty("Item_Code")
 	@TableField("Item_Code")
 	private String itemCode;
 
+	//品名
 	@JsonProperty("Item_Name")
 	@TableField("Item_Name")
 	private String itemName;
 
+	//规格
 	@JsonProperty("Item_PECS")
 	@TableField("Item_PECS")
 	private String itemPecs;
 
+	//描述
 	@JsonProperty("Item_Description")
 	@TableField("Item_Description")
 	private String itemDescription;
 
+	//库存单位ID
 	@JsonProperty("InventoryInfo_ID")
 	@TableField("InventoryInfo_ID")
 	private Long inventoryInfoId;
 
+	//库存单位编码
 	@JsonProperty("InventoryInfo_Code")
 	@TableField("InventoryInfo_Code")
 	private String inventoryInfoCode;
 
+	//库存单位名称
 	@JsonProperty("InventoryInfo_Name")
 	@TableField("InventoryInfo_Name")
 	private String inventoryInfoName;
 
+	//仓库ID
 	@JsonProperty("Warehouse_ID")
 	@TableField("Warehouse_ID")
 	private Long warehouseId;
 
+	//Warehouse_Code
 	@JsonProperty("Warehouse_Code")
 	@TableField("Warehouse_Code")
 	private String warehouseCode;
 
+	//仓库名称
 	@JsonProperty("Warehouse_Name")
 	@TableField("Warehouse_Name")
 	private String warehouseName;
 
+	//存储类型ID
 	@JsonProperty("StorageType_ID")
 	@TableField("StorageType_ID")
 	private Integer storageTypeId;
 
+	//存储类型
 	@JsonProperty("StorageType_Name")
 	@TableField("StorageType_Name")
 	private String storageTypeName;
 
+	//库存数
 	@JsonProperty("StoreQty")
 	@TableField("StoreQty")
 	private BigDecimal storeQty;
 
 
-
 }
 

+ 52 - 31
blade-service/blade-factory/src/main/java/org/springblade/factory/api/controller/SalesForecastSummaryController.java

@@ -349,12 +349,9 @@ public class SalesForecastSummaryController {
 	}
 
 
-
-
 	@GetMapping("/exportTemplate")
 	@ApiOperation(value="导出提交数据模板")
 	public void exportTemplate(HttpServletResponse response) throws IOException {
-
 		// 1. 创建 Excel 工作簿
 		Workbook workbook = new XSSFWorkbook();
 		// 2. 创建工作表
@@ -365,10 +362,12 @@ public class SalesForecastSummaryController {
 		// 定义表头字段(按你要求的顺序)
 		String[] headers = {"物料号", "物料名称", "品牌名", "规格", "花纹", "预测数量"};
 
-		// 4. 设置表头样式(可选,优化视觉效果)
+		// 4. 设置表头样式(优化视觉效果)
 		CellStyle headerStyle = workbook.createCellStyle();
 		Font font = workbook.createFont();
 		font.setBold(true); // 加粗
+		font.setFontName("微软雅黑");
+		font.setFontHeightInPoints((short) 12);
 		headerStyle.setFont(font);
 		headerStyle.setAlignment(HorizontalAlignment.CENTER); // 居中
 
@@ -377,46 +376,69 @@ public class SalesForecastSummaryController {
 			Cell cell = headerRow.createCell(i);
 			cell.setCellValue(headers[i]);
 			cell.setCellStyle(headerStyle);
-			// 自动调整列宽(适配内容
+			// 自动调整列宽并加宽(适配中文
 			sheet.autoSizeColumn(i);
+			sheet.setColumnWidth(i, sheet.getColumnWidth(i) + 2048);
 		}
 
-		// ========== 完善数据查询和填充逻辑 ==========
-		Map<String, Object> res = getUserLinkGoods();
-		// 修复1:Gson转换(兼容原有写法,避免类型强转报错)
+		// ========== 核心:查询数据并填充 ==========
 		List<PjpfStockDesc> pjpfStockDescList = new ArrayList<>();
-		if (res.get("pjpfStockDescList") != null && res.get("pjpfStockDescList") instanceof List) {
-			// 直接强转,保留你原有逻辑,避免Gson转换复杂问题
-			pjpfStockDescList = (List<PjpfStockDesc>) res.get("pjpfStockDescList");
+		try {
+			Map<String, Object> res = getUserLinkGoods();
+			// 安全转换数据列表
+			if (res.get("pjpfStockDescList") != null && res.get("pjpfStockDescList") instanceof List) {
+				pjpfStockDescList = (List<PjpfStockDesc>) res.get("pjpfStockDescList");
+			}
+		} catch (Exception e) {
+			System.err.println("查询物料数据异常:" + e.getMessage());
+			e.printStackTrace();
 		}
 
-		// 填充数据行(匹配所有指定字段)
+		// 6. 定义数据行样式
+		CellStyle dataStyle = workbook.createCellStyle();
+		dataStyle.setAlignment(HorizontalAlignment.CENTER);
+
+		// 7. 填充数据行
 		int rowNum = 1;
-		for (PjpfStockDesc item : pjpfStockDescList) {
-			Row row = sheet.createRow(rowNum++);
-			// 1. id(处理null,避免空指针)
-			// 2. 物料号(对应实体code字段,修复原错误的materialCode)
-			row.createCell(0).setCellValue(item.getCode() != null ? item.getCode() : "");
-			// 3. 物料名称(对应cname字段)
-			row.createCell(1).setCellValue(item.getCname() != null ? item.getCname() : "");
-			// 4. 品牌名(对应brandName字段,无值则为空)
-			row.createCell(2).setCellValue(item.getBrandName() != null ? item.getBrandName() : "");
-			// 5. 规格(对应typeNo字段)
-			row.createCell(3).setCellValue(item.getTypeNo() != null ? item.getTypeNo() : "");
-			// 6. 花纹(对应brandItem字段)
-			row.createCell(4).setCellValue(item.getBrandItem() != null ? item.getBrandItem() : "");
-			// 7. 预测数量(模板留空,供用户填写)
-			row.createCell(5).setCellValue("");
+		if (pjpfStockDescList != null && !pjpfStockDescList.isEmpty()) {
+			for (PjpfStockDesc item : pjpfStockDescList) {
+				Row row = sheet.createRow(rowNum++);
+				// 1. 物料号
+				row.createCell(0).setCellValue(item.getCode() != null ? item.getCode() : "");
+				// 2. 物料名称
+				row.createCell(1).setCellValue(item.getCname() != null ? item.getCname() : "");
+				// 3. 品牌名(核心:映射PubDescSeg4_Name)
+				row.createCell(2).setCellValue(item.getBrandName() != null ? item.getBrandName() : "");
+				// 4. 规格
+				row.createCell(3).setCellValue(item.getTypeNo() != null ? item.getTypeNo() : "");
+				// 5. 花纹(核心:映射pattern)
+				row.createCell(4).setCellValue(item.getBrandItem() != null ? item.getBrandItem() : "");
+				// 6. 预测数量(默认填0,供用户修改)
+				row.createCell(5).setCellValue(0);
+
+				// 统一设置数据行样式
+				for (int i = 0; i < 6; i++) {
+					row.getCell(i).setCellStyle(dataStyle);
+				}
+			}
+		} else {
+			// 无数据时添加提示行
+			Row emptyRow = sheet.createRow(1);
+			Cell emptyCell = emptyRow.createCell(0);
+			emptyCell.setCellValue("暂无可用的物料数据");
+			emptyCell.setCellStyle(dataStyle);
+			// 预测数量列默认填0
+			emptyRow.createCell(5).setCellValue(0);
+			emptyRow.getCell(5).setCellStyle(dataStyle);
 		}
 
-		// 6. 设置响应头,触发文件下载
+		// 8. 设置响应头,触发文件下载(解决中文乱码)
 		response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
 		response.setCharacterEncoding("UTF-8");
-		// 文件名编码,避免中文乱码
 		String fileName = URLEncoder.encode("物料预测模板.xlsx", StandardCharsets.UTF_8.toString());
 		response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
 
-		// 7. 写出 Excel 文件到响应流
+		// 9. 写出 Excel 文件到响应流
 		try (OutputStream outputStream = response.getOutputStream()) {
 			workbook.write(outputStream);
 			outputStream.flush();
@@ -519,7 +541,6 @@ public class SalesForecastSummaryController {
 		Map<String, Object> resultMap = new HashMap<>();
 		resultMap.put("pjpfStockDescList", stockList);
 		resultMap.put("pjpfBrandDescList", brandList);
-
 		return resultMap;
 	}
 

+ 1 - 1
blade-service/blade-factory/src/main/java/org/springblade/factory/api/controller/SalesOrderController.java

@@ -94,6 +94,7 @@ public class SalesOrderController {
 	private ZcrmViewWhqohSelService zcrmViewWhqohSelService;
 	private final GeneratedNumberUitls generatedNumberUitls;
 
+
 	// ====================== 功能1:下载可下单物料模板 ======================
 	@GetMapping("/downloadTemplate")
 	@ApiOperation(value = "下载订单导入模板", notes = "模板包含所有可下单物料,字段:物料号、物料名称、品牌名、规格、花纹、订单数量")
@@ -266,7 +267,6 @@ public class SalesOrderController {
 		Map<String, Object> resultMap = new HashMap<>();
 		resultMap.put("pjpfStockDescList", stockList);
 		resultMap.put("pjpfBrandDescList", brandList);
-
 		return resultMap;
 	}
 

+ 1 - 6
blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeSalesForecastMainServiceImpl.java

@@ -231,13 +231,8 @@ public class PcBladeSalesForecastMainServiceImpl extends BaseServiceImpl<PcBlade
 					summary.setApprovalStatus(summary.getApprovalStatus() == null ? 0 : summary.getApprovalStatus());
 				}
 
-				boolean summarySaved = pcBladeSalesForecastSummaryService.saveBatch(summaryList);
-				if (!summarySaved) {
-					log.error("明细表插入失败:主表ID={}, 年份={}, 月份={}", mainId, year, month);
-					throw new RuntimeException("添加失败:明细表数据保存失败"); // 触发事务回滚
-				}
+				pcBladeSalesForecastSummaryService.saveBatch(summaryList);
 			}
-
 			return R.data("添加成功");
 		} catch (Exception e) {
 			log.error("批量添加销售预测数据失败", e);

+ 10 - 9
blade-service/blade-u9cloud/src/main/java/org/springblade/u9cloud/controller/SalesOrderSyncController.java

@@ -10,6 +10,7 @@ import org.springblade.factory.entity.PcBladeOrder;
 import org.springblade.factory.entity.PcBladeOrderItem;
 import org.springblade.u9cloud.common.U9cloudGetTokenUtil;
 import org.springblade.u9cloud.config.U9cloudConfig;
+import org.springblade.u9cloud.domain.SyncOrderRequest;
 import org.springblade.u9cloud.entity.CreateOrderSo;
 import org.springblade.u9cloud.service.PcBladeOrderItemService;
 import org.springblade.u9cloud.service.PcBladeOrderService;
@@ -45,11 +46,11 @@ public class SalesOrderSyncController {
 	 * 适配U9C接口:http://U9C地址/webapi/CustWeiFeiSoCreate/CreateSo
 	 */
 	@PostMapping("/sync/create")
-	public R<?> syncCreate(@RequestParam String orderCode) {
+	public R<?> syncCreate(@RequestBody SyncOrderRequest request) {
 		try {
 			// 1. 查询本地订单主表+明细表
-			PcBladeOrder localOrder = getLocalOrderByCode(orderCode);
-			List<PcBladeOrderItem> localOrderItems = getLocalOrderItemsByCode(orderCode);
+			PcBladeOrder localOrder = getLocalOrderByCode(request.getOrderCode());
+			List<PcBladeOrderItem> localOrderItems = getLocalOrderItemsByCode(request.getOrderCode());
 
 			// 2. 组装U9C请求体
 			CreateOrderSo u9cOrder = this.toolsOrderData(localOrder, localOrderItems);
@@ -62,7 +63,7 @@ public class SalesOrderSyncController {
 			return parseU9cResponse(responseBody, "新增");
 
 		} catch (Exception e) {
-			log.error("同步新增订单到U9C失败,订单编号:{}", orderCode, e);
+			log.error("同步新增订单到U9C失败,订单编号:{}", request.getOrderCode(), e);
 			return R.fail("同步新增销售订单到U9C失败:" + e.getMessage());
 		}
 	}
@@ -70,14 +71,14 @@ public class SalesOrderSyncController {
 	/**
 	 * 修改销售订单到U9C
 	 * 适配U9C接口:http://U9C地址/webapi/CustWeiFeiSoModify/ModifySo
-	 * @param orderCode 本地订单编号
+	 * @param request 本地订单编号
 	 */
 	@PostMapping("/sync/modify")
-	public R<?> syncModify(@RequestParam String orderCode) {
+	public R<?> syncModify(@RequestBody SyncOrderRequest request) {
 		try {
 			// 1. 查询本地订单主表+明细表(校验订单存在性)
-			PcBladeOrder localOrder = getLocalOrderByCode(orderCode);
-			List<PcBladeOrderItem> localOrderItems = getLocalOrderItemsByCode(orderCode);
+			PcBladeOrder localOrder = getLocalOrderByCode(request.getOrderCode());
+			List<PcBladeOrderItem> localOrderItems = getLocalOrderItemsByCode(request.getOrderCode());
 
 			// 2. 组装U9C修改请求体(核心:补充DocNo,U9C修改接口必填)
 			CreateOrderSo u9cOrder = this.toolsOrderData(localOrder, localOrderItems);
@@ -101,7 +102,7 @@ public class SalesOrderSyncController {
 			}
 
 		} catch (Exception e) {
-			log.error("同步修改订单到U9C失败,订单编号:{}", orderCode, e);
+			log.error("同步修改订单到U9C失败,订单编号:{}", request.getOrderCode(), e);
 			return R.fail("同步修改销售订单到U9C失败:" + e.getMessage());
 		}
 	}

+ 10 - 0
blade-service/blade-u9cloud/src/main/java/org/springblade/u9cloud/domain/SyncOrderRequest.java

@@ -0,0 +1,10 @@
+package org.springblade.u9cloud.domain;
+
+import lombok.Data;
+
+@Data
+public class SyncOrderRequest {
+	// 字段名和前端JSON的key保持一致:orderCode
+	private String orderCode;
+
+}