package cn.iocoder.yudao.module.srm.service.tender; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.SrmTenderMaterialSaveReqVO; import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.SrmTenderProjectPageReqVO; import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.SrmTenderProjectSaveReqVO; import cn.iocoder.yudao.module.srm.dal.dataobject.SrmBidAwardDO; import cn.iocoder.yudao.module.srm.dal.dataobject.SrmTenderMaterialDO; import cn.iocoder.yudao.module.srm.dal.dataobject.SrmTenderProjectDO; import cn.iocoder.yudao.module.srm.dal.mysql.SrmBidAwardMapper; import cn.iocoder.yudao.module.srm.dal.mysql.SrmTenderMaterialMapper; import cn.iocoder.yudao.module.srm.dal.mysql.SrmTenderProjectMapper; import cn.iocoder.yudao.module.srm.enums.ErrorCodeConstants; import cn.iocoder.yudao.module.srm.enums.TenderStatusEnum; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @Service @Validated public class SrmTenderProjectServiceImpl implements SrmTenderProjectService { @Resource private SrmTenderProjectMapper tenderProjectMapper; @Resource private SrmTenderMaterialMapper tenderMaterialMapper; @Resource private SrmBidAwardMapper bidAwardMapper; @Override public Long createTenderProject(SrmTenderProjectSaveReqVO createReqVO) { SrmTenderProjectDO project = BeanUtils.toBean(createReqVO, SrmTenderProjectDO.class); project.setTenderStatus(TenderStatusEnum.DRAFT.getCode()); tenderProjectMapper.insert(project); return project.getId(); } @Override public void updateTenderProject(SrmTenderProjectSaveReqVO updateReqVO) { SrmTenderProjectDO project = validateTenderExists(updateReqVO.getId()); if (!TenderStatusEnum.DRAFT.getCode().equals(project.getTenderStatus())) { throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_STATUS_NOT_DRAFT); } SrmTenderProjectDO updateObj = BeanUtils.toBean(updateReqVO, SrmTenderProjectDO.class); tenderProjectMapper.updateById(updateObj); } @Override public void deleteTenderProject(Long id) { SrmTenderProjectDO project = validateTenderExists(id); if (!TenderStatusEnum.DRAFT.getCode().equals(project.getTenderStatus())) { throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_STATUS_NOT_DRAFT); } tenderMaterialMapper.deleteByTenderProjectId(id); tenderProjectMapper.deleteById(id); } @Override public SrmTenderProjectDO getTenderProject(Long id) { return tenderProjectMapper.selectById(id); } @Override public PageResult getTenderProjectPage(SrmTenderProjectPageReqVO pageReqVO) { PageResult pageResult = tenderProjectMapper.selectPage(pageReqVO); // 批量查询定标信息,填充 awardId 和 purchaseOrderNo List projectIds = pageResult.getList().stream() .map(SrmTenderProjectDO::getId).collect(Collectors.toList()); if (!projectIds.isEmpty()) { List awards = bidAwardMapper.selectListByTenderProjectIds(projectIds); Map awardMap = awards.stream().collect(Collectors.toMap( SrmBidAwardDO::getTenderProjectId, Function.identity(), (a, b) -> a)); pageResult.getList().forEach(project -> { SrmBidAwardDO award = awardMap.get(project.getId()); if (award != null) { project.setAwardId(award.getId()); project.setPurchaseOrderNo(award.getPurchaseOrderNo()); } }); } return pageResult; } @Override public void publishTender(Long id) { SrmTenderProjectDO project = validateTenderExists(id); if (!TenderStatusEnum.DRAFT.getCode().equals(project.getTenderStatus())) { throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_STATUS_NOT_DRAFT); } project.setTenderStatus(TenderStatusEnum.PUBLISHED.getCode()); tenderProjectMapper.updateById(project); } @Override public void closeTender(Long id) { SrmTenderProjectDO project = validateTenderExists(id); if (TenderStatusEnum.CLOSED.getCode().equals(project.getTenderStatus())) { throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_STATUS_ALREADY_CLOSED); } project.setTenderStatus(TenderStatusEnum.CLOSED.getCode()); tenderProjectMapper.updateById(project); } @Override public void startBidding(Long id) { SrmTenderProjectDO project = validateTenderExists(id); if (!TenderStatusEnum.PUBLISHED.getCode().equals(project.getTenderStatus())) { throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_STATUS_NOT_PUBLISHED); } project.setTenderStatus(TenderStatusEnum.BIDDING.getCode()); tenderProjectMapper.updateById(project); } @Override public void startEvaluation(Long id) { SrmTenderProjectDO project = validateTenderExists(id); if (!TenderStatusEnum.BIDDING.getCode().equals(project.getTenderStatus())) { throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_STATUS_NOT_BIDDING); } project.setTenderStatus(TenderStatusEnum.EVALUATING.getCode()); tenderProjectMapper.updateById(project); } // ========== 物料子表 ========== @Override public void createMaterial(SrmTenderMaterialSaveReqVO createReqVO) { SrmTenderMaterialDO material = BeanUtils.toBean(createReqVO, SrmTenderMaterialDO.class); tenderMaterialMapper.insert(material); } @Override public void updateMaterial(SrmTenderMaterialSaveReqVO updateReqVO) { SrmTenderMaterialDO updateObj = BeanUtils.toBean(updateReqVO, SrmTenderMaterialDO.class); tenderMaterialMapper.updateById(updateObj); } @Override public void deleteMaterial(Long id) { tenderMaterialMapper.deleteById(id); } @Override public List getMaterialList(Long tenderProjectId) { return tenderMaterialMapper.selectListByTenderProjectId(tenderProjectId); } private SrmTenderProjectDO validateTenderExists(Long id) { SrmTenderProjectDO project = tenderProjectMapper.selectById(id); if (project == null) { throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_NOT_EXISTS); } return project; } }