|
|
@@ -0,0 +1,310 @@
|
|
|
+package org.springblade.factory.service.impl;
|
|
|
+
|
|
|
+import com.alibaba.excel.util.CollectionUtils;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springblade.core.mp.base.BaseServiceImpl;
|
|
|
+import org.springblade.core.secure.utils.AuthUtil;
|
|
|
+import org.springblade.factory.entity.PcBladeSalesForecastMain;
|
|
|
+import org.springblade.factory.entity.PcBladeSalesForecastSummary;
|
|
|
+import org.springblade.factory.entity.ViewCustomerSel;
|
|
|
+import org.springblade.factory.mapper.PcBladeSalesForecastMainMapper;
|
|
|
+import org.springblade.factory.mapper.PcBladeSalesForecastSummaryMapper;
|
|
|
+import org.springblade.factory.service.PcBladeSalesForecastMainService;
|
|
|
+import org.springblade.factory.service.PcBladeSalesForecastSummaryService;
|
|
|
+import org.springblade.factory.service.ZcrmViewCustomerSelService;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * <p>
|
|
|
+ * 销售预测主表 服务实现类
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @author yourname
|
|
|
+ * @since 2025-09-10
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@AllArgsConstructor
|
|
|
+@Slf4j
|
|
|
+public class PcBladeSalesForecastMainServiceImpl extends BaseServiceImpl<PcBladeSalesForecastMainMapper, PcBladeSalesForecastMain> implements PcBladeSalesForecastMainService {
|
|
|
+
|
|
|
+ private final PcBladeSalesForecastSummaryService pcBladeSalesForecastSummaryService;
|
|
|
+ private final ZcrmViewCustomerSelService customerSelService;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public PcBladeSalesForecastMain selectPcBladeSalesForecastMainById(Long id) {
|
|
|
+ // 1. 查询主表数据
|
|
|
+ PcBladeSalesForecastMain main = baseMapper.selectById(id);
|
|
|
+ if (main == null) {
|
|
|
+ log.warn("销售预测主表数据不存在,ID: {}", id);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 关联查询明细数据
|
|
|
+ try {
|
|
|
+ // 创建查询条件,关联主表ID且状态为有效
|
|
|
+ PcBladeSalesForecastSummary querySummary = new PcBladeSalesForecastSummary();
|
|
|
+ querySummary.setForecastMainId(id);
|
|
|
+ querySummary.setStatus(1); // 假设1表示有效数据
|
|
|
+
|
|
|
+ // 查询明细列表
|
|
|
+ List<PcBladeSalesForecastSummary> summaryList =
|
|
|
+ pcBladeSalesForecastSummaryService.selectPcBladeSalesForecastSummaryList(querySummary);
|
|
|
+
|
|
|
+ // 设置明细列表到主表对象
|
|
|
+ main.setPcBladeSalesForecastSummaryList(summaryList);
|
|
|
+ log.info("查询销售预测主表及明细成功,主表ID: {},明细数量: {}",
|
|
|
+ id, summaryList != null ? summaryList.size() : 0);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("查询销售预测明细数据时发生异常,主表ID: {}", id, e);
|
|
|
+ // 此处不抛出异常,避免因明细查询失败导致主表数据无法返回
|
|
|
+ }
|
|
|
+
|
|
|
+ return main;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean insertPcBladeSalesForecastMain(PcBladeSalesForecastMain pcBladeSalesForecastMain) {
|
|
|
+ // 可以在这里添加创建人、创建时间等默认值设置
|
|
|
+ pcBladeSalesForecastMain.setCreateTime(new Date());
|
|
|
+ pcBladeSalesForecastMain.setIsDeleted(0);
|
|
|
+ pcBladeSalesForecastMain.setStatus(1);
|
|
|
+ return save(pcBladeSalesForecastMain);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean updatePcBladeSalesForecastMain(PcBladeSalesForecastMain pcBladeSalesForecastMain) {
|
|
|
+ // 设置更新时间
|
|
|
+ pcBladeSalesForecastMain.setUpdateTime(new Date());
|
|
|
+ return updateById(pcBladeSalesForecastMain);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean approve(PcBladeSalesForecastMain pcBladeSalesForecastMain) {
|
|
|
+ if (pcBladeSalesForecastMain.getId() == null || pcBladeSalesForecastMain.getApprovalStatus() == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ UpdateWrapper<PcBladeSalesForecastMain> updateWrapper = new UpdateWrapper<>();
|
|
|
+ updateWrapper.eq("id", pcBladeSalesForecastMain.getId())
|
|
|
+ .set("approval_status", pcBladeSalesForecastMain.getApprovalStatus())
|
|
|
+ .set("approved_time", LocalDateTime.now());
|
|
|
+ return update(updateWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<PcBladeSalesForecastMain> pagePro(IPage<PcBladeSalesForecastMain> page, QueryWrapper<PcBladeSalesForecastMain> queryWrapper) {
|
|
|
+ // 1. 执行基础分页查询
|
|
|
+ IPage<PcBladeSalesForecastMain> resultPage = this.page(page, queryWrapper);
|
|
|
+
|
|
|
+ // 2. 如果有需要,可以在这里处理查询结果
|
|
|
+ // 例如:关联查询子表数据、计算额外字段等
|
|
|
+ List<PcBladeSalesForecastMain> records = resultPage.getRecords();
|
|
|
+ if (records != null && !records.isEmpty()) {
|
|
|
+ for (PcBladeSalesForecastMain main : records) {
|
|
|
+ // 处理每条记录,例如设置额外计算的字段
|
|
|
+ // TODO 这个需要查询
|
|
|
+ PcBladeSalesForecastSummary pcBladeSalesForecastSummary = new PcBladeSalesForecastSummary();
|
|
|
+ pcBladeSalesForecastSummary.setForecastMainId(main.getId());
|
|
|
+ pcBladeSalesForecastSummary.setStatus(1);
|
|
|
+ List<PcBladeSalesForecastSummary> pcBladeSalesForecastSummaryList = pcBladeSalesForecastSummaryService.selectPcBladeSalesForecastSummaryList(pcBladeSalesForecastSummary);
|
|
|
+ main.setPcBladeSalesForecastSummaryList(pcBladeSalesForecastSummaryList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 3. 返回处理后的分页结果
|
|
|
+ return resultPage;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public boolean batchAdd(PcBladeSalesForecastMain pcBladeSalesForecastMain) {
|
|
|
+ try {
|
|
|
+ // 1. 验证主表数据是否为空
|
|
|
+ if (pcBladeSalesForecastMain == null) {
|
|
|
+ log.error("批量添加失败:主表数据不能为空");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 设置公共字段
|
|
|
+ Long currentUserId = AuthUtil.getUserId();
|
|
|
+
|
|
|
+ // 设置默认审批状态(0-未审批)
|
|
|
+ if (pcBladeSalesForecastMain.getApprovalStatus() == null) {
|
|
|
+ pcBladeSalesForecastMain.setApprovalStatus(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 保存主表数据,获取自动生成的ID
|
|
|
+ pcBladeSalesForecastMain.setCustomerId(currentUserId);
|
|
|
+ ViewCustomerSel zcrmViewCustomerSel = customerSelService.selectZcrmViewCustomerSelByCustomerId(pcBladeSalesForecastMain.getCustomerId());
|
|
|
+ pcBladeSalesForecastMain.setCustomerCode(zcrmViewCustomerSel.getCustomerCode());
|
|
|
+ pcBladeSalesForecastMain.setCustomerName(zcrmViewCustomerSel.getCustomerName());
|
|
|
+
|
|
|
+ boolean mainSaved = save(pcBladeSalesForecastMain);
|
|
|
+ if (!mainSaved) {
|
|
|
+ log.error("批量添加失败:主表数据保存失败");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 处理明细表数据
|
|
|
+ List<PcBladeSalesForecastSummary> summaryList = pcBladeSalesForecastMain.getPcBladeSalesForecastSummaryList();
|
|
|
+ if (summaryList != null && !summaryList.isEmpty()) {
|
|
|
+ // 获取主表ID用于关联
|
|
|
+ Long mainId = pcBladeSalesForecastMain.getId();
|
|
|
+ if (mainId == null) {
|
|
|
+ log.error("批量添加失败:主表ID生成失败");
|
|
|
+ // 事务会自动回滚
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置明细表公共字段和关联ID
|
|
|
+ for (PcBladeSalesForecastSummary summary : summaryList) {
|
|
|
+ // 设置关联主表ID
|
|
|
+ summary.setForecastMainId(mainId);
|
|
|
+
|
|
|
+ // 同步主表的年份、月份和经销商信息
|
|
|
+ summary.setYear(pcBladeSalesForecastMain.getYear());
|
|
|
+ summary.setMonth(pcBladeSalesForecastMain.getMonth());
|
|
|
+ summary.setCustomerId(pcBladeSalesForecastMain.getCustomerId());
|
|
|
+ summary.setCustomerCode(pcBladeSalesForecastMain.getCustomerCode());
|
|
|
+ summary.setCustomerName(pcBladeSalesForecastMain.getCustomerName());
|
|
|
+ summary.setCustomerCode(pcBladeSalesForecastMain.getCustomerCode());
|
|
|
+ summary.setCustomerName(pcBladeSalesForecastMain.getCustomerName());
|
|
|
+ summary.setCustomerId(pcBladeSalesForecastMain.getCustomerId());
|
|
|
+
|
|
|
+ // 设置默认审批状态
|
|
|
+ if (summary.getApprovalStatus() == null) {
|
|
|
+ summary.setApprovalStatus(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 批量保存明细表
|
|
|
+ boolean summarySaved = pcBladeSalesForecastSummaryService.saveBatch(summaryList);
|
|
|
+ if (!summarySaved) {
|
|
|
+ log.error("批量添加失败:明细表数据保存失败");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 5. 所有操作成功
|
|
|
+ return true;
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("批量添加销售预测数据失败", e);
|
|
|
+ // 发生异常时事务会自动回滚
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public boolean batchUpdate(PcBladeSalesForecastMain main) {
|
|
|
+ try {
|
|
|
+ // 1. 验证主表数据及ID
|
|
|
+ if (main == null || main.getId() == null) {
|
|
|
+ log.error("批量修改失败:主表数据或ID不能为空");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 更新主表数据
|
|
|
+ boolean mainUpdated = updateById(main);
|
|
|
+ if (!mainUpdated) {
|
|
|
+ log.error("批量修改失败:主表数据更新失败,主表ID: {}", main.getId());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 处理明细表数据
|
|
|
+ List<PcBladeSalesForecastSummary> summaryList = main.getPcBladeSalesForecastSummaryList();
|
|
|
+ if (summaryList != null && !summaryList.isEmpty()) {
|
|
|
+ Long mainId = main.getId();
|
|
|
+
|
|
|
+ // 遍历处理每条明细
|
|
|
+ for (PcBladeSalesForecastSummary summary : summaryList) {
|
|
|
+ // 验证明细ID
|
|
|
+ if (summary.getId() == null) {
|
|
|
+ log.warn("跳过无ID的明细表数据,主表ID: {}", mainId);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 确保关联关系正确
|
|
|
+ summary.setForecastMainId(mainId);
|
|
|
+
|
|
|
+ // 更新明细数据
|
|
|
+ boolean summaryUpdated = pcBladeSalesForecastSummaryService.updateById(summary);
|
|
|
+ if (!summaryUpdated) {
|
|
|
+ log.error("明细表数据更新失败,明细ID: {}", summary.getId());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("明细表数据更新完成,主表ID: {},共更新{}条明细",
|
|
|
+ mainId, summaryList.size());
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("主表及明细表数据批量修改成功,主表ID: {}", main.getId());
|
|
|
+ return true;
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("批量修改销售预测数据发生异常", e);
|
|
|
+ // 事务自动回滚
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量软删除销售预测数据(主表+明细表)
|
|
|
+ * 假设实体类使用了MyBatis-Plus的逻辑删除注解@TableLogic
|
|
|
+ * @param pcBladeSalesForecastMain
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public boolean batchDelete(PcBladeSalesForecastMain pcBladeSalesForecastMain) {
|
|
|
+ // 1. 验证参数
|
|
|
+ if (pcBladeSalesForecastMain == null || pcBladeSalesForecastMain.getId() == null) {
|
|
|
+ log.warn("批量删除失败:主表ID列表为空");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 2. 先删除关联的明细表数据
|
|
|
+ QueryWrapper<PcBladeSalesForecastSummary> summaryQuery = new QueryWrapper<>();
|
|
|
+ summaryQuery.in("forecast_main_id", pcBladeSalesForecastMain.getId());
|
|
|
+ boolean summaryDeleted = pcBladeSalesForecastSummaryService.remove(summaryQuery);
|
|
|
+
|
|
|
+ if (!summaryDeleted) {
|
|
|
+ log.warn("明细表数据删除失败,可能无对应明细记录");
|
|
|
+ // 这里不直接返回false,因为可能确实没有明细数据
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 再删除主表数据(逻辑删除)
|
|
|
+ boolean mainDeleted = removeById(pcBladeSalesForecastMain.getId());
|
|
|
+ if (!mainDeleted) {
|
|
|
+ log.error("主表数据批量删除失败");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 记录删除结果
|
|
|
+ log.info("批量软删除销售预测数据成功,共处理{}条主表记录", pcBladeSalesForecastMain.getPcBladeSalesForecastSummaryList().size());
|
|
|
+ return true;
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("批量软删除销售预测数据时发生异常", e);
|
|
|
+ // 事务会自动回滚
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|