Browse Source

修复销售预测重复提交问题

bai 1 month ago
parent
commit
5e13916703

+ 76 - 0
blade-service/blade-factory/src/main/java/org/springblade/factory/Summary/SummaryPredictionsController.java

@@ -0,0 +1,76 @@
+package org.springblade.factory.Summary;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.tool.api.R;
+import org.springblade.factory.entity.PcBladeSalesForecastSummary;
+import org.springblade.factory.entity.PjpfStockDesc;
+import org.springblade.factory.service.PcBladeSalesForecastSummaryService;
+import org.springblade.factory.service.PjpfStockDescService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 销售预测汇总 控制器
+ *
+ * @author horizon
+ * @since 2025-08-05
+ */
+@RestController
+@RequestMapping("/api/factory/SummaryPredictions")
+@AllArgsConstructor
+@Slf4j
+public class SummaryPredictionsController {
+
+	// 销售预测明细 service
+	private final PcBladeSalesForecastSummaryService pcBladeSalesForecastSummaryService;
+
+	// 库存 service
+	private final PjpfStockDescService pjpfStockDescService;
+
+	/**
+	 * 按年月日查询库存总数
+	 *
+	 * @param year  年份(如:2025)
+	 * @param month 月份(1-12,可选)
+	 * @return 库存总数统计结果
+	 */
+//	@GetMapping("/getTotal")
+//	public R<Map<String, Object>> getTotal(
+//		@RequestParam(required = false) Integer year,
+//		@RequestParam(required = false) Integer month) {
+
+//		// 构建查询条件(按create_time的年月日筛选)
+//		QueryWrapper<PjpfStockDesc> queryWrapper = new QueryWrapper<>();
+//		queryWrapper.eq("is_deleted", 0);
+//		List<PjpfStockDesc> pjpfStockDescList = pjpfStockDescService.list(queryWrapper);
+//
+//		QueryWrapper<PcBladeSalesForecastSummary> PcBladeSalesForecastSummaryWrapper = new QueryWrapper<>();
+//
+//		PcBladeSalesForecastSummaryWrapper.eq("is_deleted", 0);
+//		PcBladeSalesForecastSummaryWrapper.eq("status", 1);
+//
+//		if (year != null) {
+//			PcBladeSalesForecastSummaryWrapper.eq("year", year);
+//		}
+//
+//		if (year != null && month != null) {
+//			PcBladeSalesForecastSummaryWrapper.eq("month", month);
+//		}
+//
+//
+//		List<PcBladeSalesForecastSummary> pcBladeSalesForecastSummaryList = pcBladeSalesForecastSummaryService.list(PcBladeSalesForecastSummaryWrapper);
+//
+//
+//	}
+}
+

+ 35 - 15
blade-service/blade-factory/src/main/java/org/springblade/factory/api/controller/SalesForecastSummaryController.java

@@ -20,6 +20,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.factory.entity.*;
 import org.springblade.factory.entity.*;
 import org.springblade.factory.service.*;
 import org.springblade.factory.service.*;
 import org.springblade.u9cloud.entity.ZcrmViewCustomerSel;
 import org.springblade.u9cloud.entity.ZcrmViewCustomerSel;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 import springfox.documentation.annotations.ApiIgnore;
 import springfox.documentation.annotations.ApiIgnore;
@@ -31,10 +32,8 @@ import java.nio.charset.StandardCharsets;
 import java.security.Principal;
 import java.security.Principal;
 import java.time.LocalDate;
 import java.time.LocalDate;
 import java.time.format.DateTimeParseException;
 import java.time.format.DateTimeParseException;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 
 /**
 /**
  * 销售预测接口 控制器
  * 销售预测接口 控制器
@@ -130,32 +129,47 @@ public class SalesForecastSummaryController {
 	@ApiOperation(value = "销售预测汇总添加", notes = "添加销售预测主表及明细数据")
 	@ApiOperation(value = "销售预测汇总添加", notes = "添加销售预测主表及明细数据")
 	public R<String> mainAdd(@RequestBody PcBladeSalesForecastMain pcBladeSalesForecastMain) {
 	public R<String> mainAdd(@RequestBody PcBladeSalesForecastMain pcBladeSalesForecastMain) {
 		try {
 		try {
-			// 验证参数
+			// 1. 基础参数验证
 			if (pcBladeSalesForecastMain == null) {
 			if (pcBladeSalesForecastMain == null) {
 				return R.fail("提交数据不能为空");
 				return R.fail("提交数据不能为空");
 			}
 			}
-
-			// 验证必要字段
 			if (pcBladeSalesForecastMain.getYear() == null || pcBladeSalesForecastMain.getMonth() == null) {
 			if (pcBladeSalesForecastMain.getYear() == null || pcBladeSalesForecastMain.getMonth() == null) {
 				return R.fail("年份和月份为必填项");
 				return R.fail("年份和月份为必填项");
 			}
 			}
 
 
-			// 调用Service层批量添加方法
-			boolean success = salesForecastMainService.batchAdd(pcBladeSalesForecastMain);
+			List<PcBladeSalesForecastSummary> summaryList = pcBladeSalesForecastMain.getPcBladeSalesForecastSummaryList();
+			if (summaryList == null || summaryList.isEmpty()) {
+				return R.fail("明细数据不能为空");
+			}
 
 
-			if (success) {
-				log.info("销售预测数据添加成功,主表ID: {}", pcBladeSalesForecastMain.getId());
-				return R.success("添加成功");
-			} else {
-				log.error("销售预测数据添加失败");
-				return R.fail("添加失败,请稍后重试");
+			// 2. 获取当前用户ID(客户ID)
+			Long currentUserId = AuthUtil.getUserId();
+
+			// 3. 检查主表是否已存在相同记录(核心修改:仅判断主表重复)
+			// 这里假设主表的唯一判断条件是:年份+月份+客户ID
+			boolean mainExists = salesForecastMainService.checkMainDuplicate(
+				pcBladeSalesForecastMain.getYear(),
+				pcBladeSalesForecastMain.getMonth(),
+				currentUserId
+			);
+			if (mainExists) {
+				return R.fail("提交失败:该年月的销售预测主记录已存在");
 			}
 			}
+
+			// 4. 调用Service层批量添加方法
+			return salesForecastMainService.batchAdd(pcBladeSalesForecastMain);
+		} catch (DuplicateKeyException e) {
+			// 最终防线:捕获数据库唯一键冲突
+			log.error("销售预测数据重复提交", e);
+			return R.fail("提交失败:已存在相同的销售预测记录,请避免重复提交");
 		} catch (Exception e) {
 		} catch (Exception e) {
 			log.error("销售预测添加接口发生异常", e);
 			log.error("销售预测添加接口发生异常", e);
 			return R.fail("系统异常,请联系管理员");
 			return R.fail("系统异常,请联系管理员");
 		}
 		}
 	}
 	}
 
 
+
+
 	/**
 	/**
 	 * 销售预测汇总列表 --修改接口
 	 * 销售预测汇总列表 --修改接口
 	 */
 	 */
@@ -364,6 +378,12 @@ public class SalesForecastSummaryController {
 		ViewCustomerSel zcrmViewCustomerSel = customerSelService.selectZcrmViewCustomerSelByCustomerId(forecast.getCustomerId());
 		ViewCustomerSel zcrmViewCustomerSel = customerSelService.selectZcrmViewCustomerSelByCustomerId(forecast.getCustomerId());
 		forecast.setCustomerCode(zcrmViewCustomerSel.getCustomerCode());
 		forecast.setCustomerCode(zcrmViewCustomerSel.getCustomerCode());
 		forecast.setCustomerName(zcrmViewCustomerSel.getCustomerName());
 		forecast.setCustomerName(zcrmViewCustomerSel.getCustomerName());
+
+
+
+
+
+
 		return forecastService.saveOrUpdateForecast(forecast);
 		return forecastService.saveOrUpdateForecast(forecast);
 	}
 	}
 
 

+ 12 - 1
blade-service/blade-factory/src/main/java/org/springblade/factory/service/PcBladeSalesForecastMainService.java

@@ -61,7 +61,7 @@ public interface PcBladeSalesForecastMainService extends BaseService<PcBladeSale
 	 * @param pcBladeSalesForecastMain
 	 * @param pcBladeSalesForecastMain
 	 * @return
 	 * @return
 	 */
 	 */
-	boolean batchAdd(PcBladeSalesForecastMain pcBladeSalesForecastMain);
+	R<String> batchAdd(PcBladeSalesForecastMain pcBladeSalesForecastMain);
 
 
 	/**
 	/**
 	 * 批量修改销售预测数据
 	 * 批量修改销售预测数据
@@ -92,4 +92,15 @@ public interface PcBladeSalesForecastMainService extends BaseService<PcBladeSale
 	List<PcBladeSalesForecastMain> findByUserAndYearAndMonth(Long currentUserId, Integer year, Integer month);
 	List<PcBladeSalesForecastMain> findByUserAndYearAndMonth(Long currentUserId, Integer year, Integer month);
 
 
 
 
+
+	/**
+	 * 检查主表是否存在重复记录
+	 * @param year 年份
+	 * @param month 月份
+	 * @param customerId 客户ID
+	 * @return 是否存在重复
+	 */
+	boolean checkMainDuplicate(Integer year, Integer month, Long customerId);
+
+
 }
 }

+ 23 - 12
blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeSalesForecastMainServiceImpl.java

@@ -33,6 +33,7 @@ public class PcBladeSalesForecastMainServiceImpl extends BaseServiceImpl<PcBlade
 	private PcBladeSalesForecastSummaryService pcBladeSalesForecastSummaryService;
 	private PcBladeSalesForecastSummaryService pcBladeSalesForecastSummaryService;
 	private ZcrmViewCustomerSelService customerSelService;
 	private ZcrmViewCustomerSelService customerSelService;
 	private PcBladeSalesForecastSummaryMapper summaryMapper;
 	private PcBladeSalesForecastSummaryMapper summaryMapper;
+	private PcBladeSalesForecastMainMapper pcBladeSalesForecastMainMapper;
 
 
 	@Autowired
 	@Autowired
 	@Lazy
 	@Lazy
@@ -147,11 +148,11 @@ public class PcBladeSalesForecastMainServiceImpl extends BaseServiceImpl<PcBlade
 
 
 	@Override
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	@Transactional(rollbackFor = Exception.class)
-	public boolean batchAdd(PcBladeSalesForecastMain pcBladeSalesForecastMain) {
+	public R<String> batchAdd(PcBladeSalesForecastMain pcBladeSalesForecastMain) {
 		try {
 		try {
 			if (pcBladeSalesForecastMain == null) {
 			if (pcBladeSalesForecastMain == null) {
 				log.error("批量添加失败:主表数据不能为空");
 				log.error("批量添加失败:主表数据不能为空");
-				return false;
+				return R.fail("批量添加失败:主表数据不能为空");
 			}
 			}
 
 
 			Long currentUserId = AuthUtil.getUserId();
 			Long currentUserId = AuthUtil.getUserId();
@@ -165,10 +166,10 @@ public class PcBladeSalesForecastMainServiceImpl extends BaseServiceImpl<PcBlade
 			pcBladeSalesForecastMain.setCustomerCode(zcrmViewCustomerSel.getCustomerCode());
 			pcBladeSalesForecastMain.setCustomerCode(zcrmViewCustomerSel.getCustomerCode());
 			pcBladeSalesForecastMain.setCustomerName(zcrmViewCustomerSel.getCustomerName());
 			pcBladeSalesForecastMain.setCustomerName(zcrmViewCustomerSel.getCustomerName());
 
 
-			boolean mainSaved = save(pcBladeSalesForecastMain);
-			if (!mainSaved) {
+			int mainSaved = baseMapper.insert(pcBladeSalesForecastMain);
+			if (mainSaved == 0) {
 				log.error("批量添加失败:主表数据保存失败");
 				log.error("批量添加失败:主表数据保存失败");
-				return false;
+				return R.fail("批量添加失败:主表数据保存失败");
 			}
 			}
 
 
 			List<PcBladeSalesForecastSummary> summaryList = pcBladeSalesForecastMain.getPcBladeSalesForecastSummaryList();
 			List<PcBladeSalesForecastSummary> summaryList = pcBladeSalesForecastMain.getPcBladeSalesForecastSummaryList();
@@ -176,7 +177,7 @@ public class PcBladeSalesForecastMainServiceImpl extends BaseServiceImpl<PcBlade
 				Long mainId = pcBladeSalesForecastMain.getId();
 				Long mainId = pcBladeSalesForecastMain.getId();
 				if (mainId == null) {
 				if (mainId == null) {
 					log.error("批量添加失败:主表ID生成失败");
 					log.error("批量添加失败:主表ID生成失败");
-					return false;
+					return R.fail("批量添加失败:主表ID生成失败");
 				}
 				}
 
 
 				for (PcBladeSalesForecastSummary summary : summaryList) {
 				for (PcBladeSalesForecastSummary summary : summaryList) {
@@ -186,7 +187,6 @@ public class PcBladeSalesForecastMainServiceImpl extends BaseServiceImpl<PcBlade
 					summary.setCustomerId(pcBladeSalesForecastMain.getCustomerId());
 					summary.setCustomerId(pcBladeSalesForecastMain.getCustomerId());
 					summary.setCustomerCode(pcBladeSalesForecastMain.getCustomerCode());
 					summary.setCustomerCode(pcBladeSalesForecastMain.getCustomerCode());
 					summary.setCustomerName(pcBladeSalesForecastMain.getCustomerName());
 					summary.setCustomerName(pcBladeSalesForecastMain.getCustomerName());
-
 					if (summary.getApprovalStatus() == null) {
 					if (summary.getApprovalStatus() == null) {
 						summary.setApprovalStatus(0);
 						summary.setApprovalStatus(0);
 					}
 					}
@@ -195,15 +195,13 @@ public class PcBladeSalesForecastMainServiceImpl extends BaseServiceImpl<PcBlade
 				boolean summarySaved = pcBladeSalesForecastSummaryService.saveBatch(summaryList);
 				boolean summarySaved = pcBladeSalesForecastSummaryService.saveBatch(summaryList);
 				if (!summarySaved) {
 				if (!summarySaved) {
 					log.error("批量添加失败:明细表数据保存失败");
 					log.error("批量添加失败:明细表数据保存失败");
-					return false;
+					return R.fail("批量添加失败:明细表数据保存失败");
 				}
 				}
 			}
 			}
-
-			return true;
-
+			return R.data("添加成功");
 		} catch (Exception e) {
 		} catch (Exception e) {
 			log.error("批量添加销售预测数据失败", e);
 			log.error("批量添加销售预测数据失败", e);
-			return false;
+			return R.fail("批量添加销售预测数据失败" + e.getMessage());
 		}
 		}
 	}
 	}
 
 
@@ -372,4 +370,17 @@ public class PcBladeSalesForecastMainServiceImpl extends BaseServiceImpl<PcBlade
 
 
 		return mainList;
 		return mainList;
 	}
 	}
+
+	@Override
+	public boolean checkMainDuplicate(Integer year, Integer month, Long customerId) {
+		QueryWrapper<PcBladeSalesForecastMain> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("year", year)
+			.eq("month", month)
+			.eq("customer_id", customerId);
+
+		// 存在相同条件的主表记录则返回true
+		return baseMapper.selectCount(queryWrapper) > 0;
+	}
+
+
 }
 }