package com.ruoyi.projectManagement.service.impl; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.enums.IsDeleteEnum; import com.ruoyi.common.enums.SaleEnum; import com.ruoyi.projectManagement.dto.ContractInfoDto; import com.ruoyi.projectManagement.dto.SaveInfoDto; import com.ruoyi.projectManagement.dto.ShippingAddressDto; import com.ruoyi.projectManagement.dto.UpdateStateInfo; import com.ruoyi.projectManagement.mapper.InfoMapper; import com.ruoyi.projectManagement.pojo.Info; import com.ruoyi.projectManagement.service.InfoService; import com.ruoyi.projectManagement.service.impl.handle.ContractInfoHandleService; import com.ruoyi.projectManagement.service.impl.handle.InfoHandleService; import com.ruoyi.projectManagement.service.impl.handle.ShippingAddressHandleService; import com.ruoyi.projectManagement.vo.InfoVo; import com.ruoyi.projectManagement.vo.ListInfoVo; import com.ruoyi.projectManagement.vo.SaveInfoVo; import com.ruoyi.projectManagement.vo.SearchInfoVo; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerService; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import java.util.List; import java.util.concurrent.CompletableFuture; /** * @author buhuazhen * @date 2026/3/9 * @email 3038525872@qq.com */ @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class InfoServiceImpl implements InfoService { private final InfoHandleService infoHandleService; private final InfoMapper infoMapper; private final ContractInfoHandleService contractInfoHandleService; private final ShippingAddressHandleService shippingAddressHandleService; private final ISalesLedgerService salesLedgerService; @Transactional(rollbackFor = Exception.class) @Override public void save(SaveInfoVo saveInfoVo) { // 保存主信息 Long infoId = infoHandleService.save(saveInfoVo.getInfo()); if(saveInfoVo.getShippingAddress() != null){ shippingAddressHandleService.save(infoId, saveInfoVo.getShippingAddress()); } if(saveInfoVo.getContractInfo() != null){ contractInfoHandleService.save(infoId, saveInfoVo.getContractInfo()); } if(saveInfoVo.getSalesLedgerProductList() != null){ salesLedgerService.handleSalesLedgerProducts(infoId, saveInfoVo.getSalesLedgerProductList(), SaleEnum.MANAGEMENT); } } @Override @Transactional public void updateStatus(UpdateStateInfo updateStateInfo) { Info info = new Info(); info.setId(updateStateInfo.getId()); // 审批状态 if(updateStateInfo.getReviewStatus() != null){ info.setReviewStatus(updateStateInfo.getReviewStatus().getCode()); } // 进度状态 if(updateStateInfo.getStage() != null){ info.setStatus(updateStateInfo.getStage().getCode()); } infoMapper.updateById(info); } @Override @Transactional public void deleteInfo(Long id) { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper(); updateWrapper.eq(Info::getId, id); updateWrapper.set(Info::getIsDelete, IsDeleteEnum.DELETED.getCode()); // 对应附表信息是否删除待确定(因为后续可能会进行引用所以先不删除 } @Override public Page searchListInfo(SearchInfoVo vo) { Page listInfoVoPage = infoMapper.searchListInfo(vo); return listInfoVoPage; } @Override @SneakyThrows public InfoVo getInfoById(Long id) { CompletableFuture infoFuture = CompletableFuture.supplyAsync(() -> infoHandleService.getInfoById(id)); CompletableFuture contractFuture = CompletableFuture.supplyAsync(() -> contractInfoHandleService.getByInfoId(id)); CompletableFuture shippingFuture = CompletableFuture.supplyAsync(() -> shippingAddressHandleService.getByInfoId(id)); // 商品 CompletableFuture> listCompletableFuture = CompletableFuture.supplyAsync(() -> salesLedgerService.getSalesLedgerProductListByRelateId(id,SaleEnum.MANAGEMENT)); // 下级项目信息 CompletableFuture> subordinateInfoListFuture = CompletableFuture.supplyAsync(() -> infoHandleService.getSubordinateInfo(id)); // 等待所有异步完成 CompletableFuture.allOf(infoFuture, contractFuture, shippingFuture,listCompletableFuture,subordinateInfoListFuture).join(); SaveInfoDto info = infoFuture.get(); ContractInfoDto contract = contractFuture.get(); ShippingAddressDto shippingAddress = shippingFuture.get(); List salesLedgerProductList = listCompletableFuture.get(); List saveInfoDtos = subordinateInfoListFuture.get(); InfoVo vo = new InfoVo(); vo.setInfo(info); vo.setContractInfo(contract); vo.setShippingAddress(shippingAddress); vo.setSalesLedgerProductList(salesLedgerProductList); vo.setSubordinateInfoList(saveInfoDtos); return vo; } }