招采管理模块修改

This commit is contained in:
2025-08-22 19:46:11 +08:00
parent 476c19019e
commit f06d46469e
22 changed files with 775 additions and 274 deletions

View File

@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*; import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.tender.domain.bo.BusBiddingPlanBo;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.idempotent.annotation.RepeatSubmit;
@ -21,12 +22,13 @@ import org.dromara.bidding.domain.vo.BusListOfWinningBidsVo;
import org.dromara.bidding.domain.bo.BusListOfWinningBidsBo; import org.dromara.bidding.domain.bo.BusListOfWinningBidsBo;
import org.dromara.bidding.service.IBusListOfWinningBidsService; import org.dromara.bidding.service.IBusListOfWinningBidsService;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/** /**
* 中标项目一览 * 中标项目一览
* *
* @author Lion Li * @author Lion Li
* @date 2025-08-20 * @date 2025-08-22
*/ */
@Validated @Validated
@RequiredArgsConstructor @RequiredArgsConstructor
@ -75,8 +77,8 @@ public class BusListOfWinningBidsController extends BaseController {
@Log(title = "中标项目一览", businessType = BusinessType.INSERT) @Log(title = "中标项目一览", businessType = BusinessType.INSERT)
@RepeatSubmit() @RepeatSubmit()
@PostMapping() @PostMapping()
public R<Void> add(@RequestBody BusListOfWinningBidsBo bo) { public R<Void> add(@RequestPart("bo") BusListOfWinningBidsBo bo ,@RequestParam(name = "file", required = false) MultipartFile file) {
return toAjax(busListOfWinningBidsService.insertByBo(bo)); return toAjax(busListOfWinningBidsService.insertByBo(bo,file));
} }
/** /**

View File

@ -6,7 +6,6 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date; import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
@ -16,7 +15,7 @@ import java.io.Serial;
* 中标项目一览对象 bus_list_of_winning_bids * 中标项目一览对象 bus_list_of_winning_bids
* *
* @author Lion Li * @author Lion Li
* @date 2025-08-20 * @date 2025-08-22
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ -37,90 +36,105 @@ public class BusListOfWinningBids extends BaseEntity {
*/ */
private Long projectId; private Long projectId;
/**
* 项目状态
*/
private String projectStatus;
/** /**
* 项目名称 * 项目名称
*/ */
private String projectName; private String projectName;
/** /**
* 中标价(原币) * 项目简称
*/ */
private BigDecimal winningBidOriginal; private String shortName;
/** /**
* 汇率 * 负责人
*/ */
private BigDecimal exchangeRate; private String principal;
/** /**
* 币种 * 负责人电话
*/ */
private String currency; private String principalPhone;
/** /**
* 所属主体 * 项目类型
*/ */
private String subject; private String projectType;
/**
* 项目阶段
*/
private String projectStage;
/**
* 开工时间
*/
private String onStreamTime;
/**
* 经度
*/
private String lng;
/**
* 纬度
*/
private String lat;
/**
* 项目地址
*/
private String projectSite;
/**
* 计划容量
*/
private String plan;
/**
* 实际容量
*/
private String actual;
/**
* 设计总量
*/
private Long designTotal;
/**
* 备注
*/
private String remark;
/**
* 排序字段
*/
private Long sort;
/**
* 删除时间
*/
private Date deletedAt;
/**
* 是否中标0中标 1未中标
*/
private String whetherBid;
/** /**
* 中标价 * 中标价
*/ */
private BigDecimal winningBid; private BigDecimal bidPrice;
/** /**
* 中标日期 * 中标通知书
*/ */
private LocalDate bidWinningDate; private String bidFile;
/** /**
* 投标保证金 * 中标通知书名称
*/ */
private BigDecimal bidDeposit; private String bidFileName;
/**
* 是否退还
*/
private String whetherSendBack;
/**
* 建设单位(客户)
*/
private String construction;
/**
* 总造价
*/
private BigDecimal totalCost;
/**
* 立项申请人
*/
private String projectApplicant;
/**
* 立项部门
*/
private String projectApplicantDept;
/**
* 立项申请日期
*/
private LocalDate projectApplicantTime;
/**
* 流程状态
*/
private String processStatus;
/**
* 项目编号
*/
private String projectNumbering;
} }

View File

@ -10,7 +10,6 @@ import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*; import jakarta.validation.constraints.*;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date; import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
@ -18,7 +17,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
* 中标项目一览业务对象 bus_list_of_winning_bids * 中标项目一览业务对象 bus_list_of_winning_bids
* *
* @author Lion Li * @author Lion Li
* @date 2025-08-20 * @date 2025-08-22
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ -34,93 +33,110 @@ public class BusListOfWinningBidsBo extends BaseEntity {
/** /**
* 项目id * 项目id
*/ */
@NotNull(message = "项目id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long projectId; private Long projectId;
/**
* 项目状态
*/
private String projectStatus;
/** /**
* 项目名称 * 项目名称
*/ */
private String projectName; private String projectName;
/** /**
* 中标价(原币) * 项目简称
*/ */
private BigDecimal winningBidOriginal; private String shortName;
/** /**
* 汇率 * 负责人
*/ */
private BigDecimal exchangeRate; private String principal;
/** /**
* 币种 * 负责人电话
*/ */
private String currency; private String principalPhone;
/** /**
* 所属主体 * 项目类型
*/ */
private String subject; private String projectType;
/**
* 项目阶段
*/
private String projectStage;
/**
* 开工时间
*/
private String onStreamTime;
/**
* 经度
*/
private String lng;
/**
* 纬度
*/
private String lat;
/**
* 项目地址
*/
private String projectSite;
/**
* 计划容量
*/
private String plan;
/**
* 实际容量
*/
private String actual;
/**
* 设计总量
*/
@NotNull(message = "设计总量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long designTotal;
/**
* 备注
*/
private String remark;
/**
* 排序字段
*/
@NotNull(message = "排序字段不能为空", groups = { AddGroup.class, EditGroup.class })
private Long sort;
/**
* 删除时间
*/
private Date deletedAt;
/**
* 是否中标0中标 1未中标
*/
private String whetherBid;
/** /**
* 中标价 * 中标价
*/ */
private BigDecimal winningBid; private BigDecimal bidPrice;
/** /**
* 中标日期 * 中标通知书
*/ */
private LocalDate bidWinningDate; private String bidFile;
/** /**
* 投标保证金 * 中标通知书名称
*/ */
private BigDecimal bidDeposit; private String bidFileName;
/**
* 是否退还
*/
private String whetherSendBack;
/**
* 建设单位(客户)
*/
private String construction;
/**
* 总造价
*/
private BigDecimal totalCost;
/**
* 立项申请人
*/
private String projectApplicant;
/**
* 立项部门
*/
private String projectApplicantDept;
/**
* 立项申请日期
*/
private LocalDate projectApplicantTime;
/**
* 流程状态
*/
private String processStatus;
/**
* 项目编号
*/
private String projectNumbering;
} }

View File

@ -1,7 +1,6 @@
package org.dromara.bidding.domain.vo; package org.dromara.bidding.domain.vo;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date; import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.bidding.domain.BusListOfWinningBids; import org.dromara.bidding.domain.BusListOfWinningBids;
@ -22,7 +21,7 @@ import java.util.Date;
* 中标项目一览视图对象 bus_list_of_winning_bids * 中标项目一览视图对象 bus_list_of_winning_bids
* *
* @author Lion Li * @author Lion Li
* @date 2025-08-20 * @date 2025-08-22
*/ */
@Data @Data
@ExcelIgnoreUnannotated @ExcelIgnoreUnannotated
@ -44,12 +43,6 @@ public class BusListOfWinningBidsVo implements Serializable {
@ExcelProperty(value = "项目id") @ExcelProperty(value = "项目id")
private Long projectId; private Long projectId;
/**
* 项目状态
*/
@ExcelProperty(value = "项目状态")
private String projectStatus;
/** /**
* 项目名称 * 项目名称
*/ */
@ -57,95 +50,119 @@ public class BusListOfWinningBidsVo implements Serializable {
private String projectName; private String projectName;
/** /**
* 中标价(原币) * 项目简称
*/ */
@ExcelProperty(value = "中标价(原币)", converter = ExcelDictConvert.class) @ExcelProperty(value = "项目简称")
private BigDecimal winningBidOriginal; private String shortName;
/** /**
* 汇率 * 负责人
*/ */
@ExcelProperty(value = "汇率") @ExcelProperty(value = "负责人")
private BigDecimal exchangeRate; private String principal;
/** /**
* 币种 * 负责人电话
*/ */
@ExcelProperty(value = "币种") @ExcelProperty(value = "负责人电话")
private String currency; private String principalPhone;
/** /**
* 所属主体 * 项目类型
*/ */
@ExcelProperty(value = "所属主体") @ExcelProperty(value = "项目类型")
private String subject; private String projectType;
/**
* 项目阶段
*/
@ExcelProperty(value = "项目阶段")
private String projectStage;
/**
* 开工时间
*/
@ExcelProperty(value = "开工时间")
private String onStreamTime;
/**
* 经度
*/
@ExcelProperty(value = "经度")
private String lng;
/**
* 纬度
*/
@ExcelProperty(value = "纬度")
private String lat;
/**
* 项目地址
*/
@ExcelProperty(value = "项目地址")
private String projectSite;
/**
* 计划容量
*/
@ExcelProperty(value = "计划容量")
private String plan;
/**
* 实际容量
*/
@ExcelProperty(value = "实际容量")
private String actual;
/**
* 设计总量
*/
@ExcelProperty(value = "设计总量")
private Long designTotal;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 排序字段
*/
@ExcelProperty(value = "排序字段")
private Long sort;
/**
* 删除时间
*/
@ExcelProperty(value = "删除时间")
private Date deletedAt;
/**
* 是否中标0中标 1未中标
*/
@ExcelProperty(value = "是否中标", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "0=中标,1=未中标")
private String whetherBid;
/** /**
* 中标价 * 中标价
*/ */
@ExcelProperty(value = "中标价") @ExcelProperty(value = "中标价")
private BigDecimal winningBid; private BigDecimal bidPrice;
/** /**
* 中标日期 * 中标通知书
*/ */
@ExcelProperty(value = "中标日期") @ExcelProperty(value = "中标通知书")
private LocalDate bidWinningDate; private String bidFile;
/** /**
* 投标保证金 * 中标通知书名称
*/ */
@ExcelProperty(value = "投标保证金") @ExcelProperty(value = "中标通知书名称")
private BigDecimal bidDeposit; private String bidFileName;
/**
* 是否退还
*/
@ExcelProperty(value = "是否退还")
private String whetherSendBack;
/**
* 建设单位(客户)
*/
@ExcelProperty(value = "建设单位", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "客=户")
private String construction;
/**
* 总造价
*/
@ExcelProperty(value = "总造价")
private BigDecimal totalCost;
/**
* 立项申请人
*/
@ExcelProperty(value = "立项申请人")
private String projectApplicant;
/**
* 立项部门
*/
@ExcelProperty(value = "立项部门")
private String projectApplicantDept;
/**
* 立项申请日期
*/
@ExcelProperty(value = "立项申请日期")
private LocalDate projectApplicantTime;
/**
* 流程状态
*/
@ExcelProperty(value = "流程状态")
private String processStatus;
/**
* 项目编号
*/
@ExcelProperty(value = "项目编号")
private String projectNumbering;
} }

View File

@ -8,7 +8,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
* 中标项目一览Mapper接口 * 中标项目一览Mapper接口
* *
* @author Lion Li * @author Lion Li
* @date 2025-08-20 * @date 2025-08-22
*/ */
public interface BusListOfWinningBidsMapper extends BaseMapperPlus<BusListOfWinningBids, BusListOfWinningBidsVo> { public interface BusListOfWinningBidsMapper extends BaseMapperPlus<BusListOfWinningBids, BusListOfWinningBidsVo> {

View File

@ -3,11 +3,12 @@ package org.dromara.bidding.service;
import org.dromara.bidding.domain.vo.BusListOfWinningBidsVo; import org.dromara.bidding.domain.vo.BusListOfWinningBidsVo;
import org.dromara.bidding.domain.bo.BusListOfWinningBidsBo; import org.dromara.bidding.domain.bo.BusListOfWinningBidsBo;
import org.dromara.bidding.domain.BusListOfWinningBids; import org.dromara.bidding.domain.BusListOfWinningBids;
import org.dromara.common.core.domain.R;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -15,7 +16,7 @@ import java.util.List;
* 中标项目一览Service接口 * 中标项目一览Service接口
* *
* @author Lion Li * @author Lion Li
* @date 2025-08-20 * @date 2025-08-22
*/ */
public interface IBusListOfWinningBidsService extends IService<BusListOfWinningBids>{ public interface IBusListOfWinningBidsService extends IService<BusListOfWinningBids>{
@ -47,10 +48,11 @@ public interface IBusListOfWinningBidsService extends IService<BusListOfWinningB
/** /**
* 新增中标项目一览 * 新增中标项目一览
* *
* @param bo 中标项目一览 * @param bo 中标项目一览
* @param file
* @return 是否新增成功 * @return 是否新增成功
*/ */
Boolean insertByBo(BusListOfWinningBidsBo bo); Boolean insertByBo(BusListOfWinningBidsBo bo, MultipartFile file);
/** /**
* 修改中标项目一览 * 修改中标项目一览
@ -69,5 +71,10 @@ public interface IBusListOfWinningBidsService extends IService<BusListOfWinningB
*/ */
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 根据项目id获取数据
* @param bo
* @return
*/
BusListOfWinningBidsVo queryOne(BusListOfWinningBidsBo bo); BusListOfWinningBidsVo queryOne(BusListOfWinningBidsBo bo);
} }

View File

@ -1,6 +1,10 @@
package org.dromara.bidding.service.impl; package org.dromara.bidding.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
import org.dromara.common.core.domain.event.ProcessEvent;
import org.dromara.common.core.domain.event.ProcessTaskEvent;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -9,6 +13,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.design.domain.BusBillofquantitiesVersions;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.dromara.bidding.domain.bo.BusBiddingLimitVersionsBo; import org.dromara.bidding.domain.bo.BusBiddingLimitVersionsBo;
import org.dromara.bidding.domain.vo.BusBiddingLimitVersionsVo; import org.dromara.bidding.domain.vo.BusBiddingLimitVersionsVo;
@ -26,6 +32,7 @@ import java.util.Collection;
* @author Lion Li * @author Lion Li
* @date 2025-08-21 * @date 2025-08-21
*/ */
@Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
public class BusBiddingLimitVersionsServiceImpl extends ServiceImpl<BusBiddingLimitVersionsMapper, BusBiddingLimitVersions> implements IBusBiddingLimitVersionsService { public class BusBiddingLimitVersionsServiceImpl extends ServiceImpl<BusBiddingLimitVersionsMapper, BusBiddingLimitVersions> implements IBusBiddingLimitVersionsService {
@ -131,4 +138,60 @@ public class BusBiddingLimitVersionsServiceImpl extends ServiceImpl<BusBiddingLi
} }
return baseMapper.deleteByIds(ids) > 0; return baseMapper.deleteByIds(ids) > 0;
} }
/**
* 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等)
* 正常使用只需#processEvent.flowCode=='leave1'
* 示例为了方便则使用startsWith匹配了全部示例key
*
* @param processEvent 参数
*/
@org.springframework.context.event.EventListener(condition = "#processEvent.flowCode.endsWith('biddingEquipmentList')")
public void processPlansHandlErequipmentList(ProcessEvent processEvent) {
log.info("物资设备清单审核任务执行了{}", processEvent.toString());
String id = processEvent.getBusinessId();
LambdaQueryWrapper<BusBiddingLimitVersions> eq = new LambdaQueryWrapper<BusBiddingLimitVersions>()
.eq(BusBiddingLimitVersions::getVersions, id);
BusBiddingLimitVersions busBiddingLimitVersions = new BusBiddingLimitVersions();
busBiddingLimitVersions.setStatus(processEvent.getStatus());
boolean update = this.update(busBiddingLimitVersions, eq);
// BusBiddingPlan biddingPlan = baseMapper.selectById(Long.valueOf(id));
// if (biddingPlan == null) {
// log.error("");
// }
// if (BusinessStatusEnum.DRAFT.getStatus().equals(biddingPlan.getStatus())) {
// biddingPlan.setBidStatus(1);
// }
// biddingPlan.setStatus(processEvent.getStatus());
// baseMapper.updateById(biddingPlan);
}
/**
* 执行任务创建监听
* 示例:也可通过 @EventListener(condition = "#processTaskEvent.flowCode=='leave1'")进行判断
* 在方法中判断流程节点key
* if ("xxx".equals(processTaskEvent.getNodeCode())) {
* //执行业务逻辑
* }
*
* @param processTaskEvent 参数
*/
@org.springframework.context.event.EventListener(condition = "#processTaskEvent.flowCode.endsWith('biddingEquipmentList')")
public void processTaskPlansHandlerEquipmentList(ProcessTaskEvent processTaskEvent) {
log.info("物资设备清单审核任务创建了{}", processTaskEvent.toString());
}
/**
* 监听删除流程事件
* 正常使用只需#processDeleteEvent.flowCode=='leave1'
* 示例为了方便则使用startsWith匹配了全部示例key
*
* @param processDeleteEvent 参数
*/
@EventListener(condition = "#processDeleteEvent.flowCode.endsWith('biddingEquipmentList')")
public void processDeletePlansHandlerEquipmentList(ProcessDeleteEvent processDeleteEvent) {
log.info("物资设备清单计划删除流程事件,技术标准文件审核任务执行了{}", processDeleteEvent.toString());
}
} }

View File

@ -1,32 +1,35 @@
package org.dromara.bidding.service.impl; package org.dromara.bidding.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.system.domain.vo.SysOssUploadVo;
import org.dromara.system.service.ISysOssService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.dromara.bidding.domain.bo.BusListOfWinningBidsBo; import org.dromara.bidding.domain.bo.BusListOfWinningBidsBo;
import org.dromara.bidding.domain.vo.BusListOfWinningBidsVo; import org.dromara.bidding.domain.vo.BusListOfWinningBidsVo;
import org.dromara.bidding.domain.BusListOfWinningBids; import org.dromara.bidding.domain.BusListOfWinningBids;
import org.dromara.bidding.mapper.BusListOfWinningBidsMapper; import org.dromara.bidding.mapper.BusListOfWinningBidsMapper;
import org.dromara.bidding.service.IBusListOfWinningBidsService; import org.dromara.bidding.service.IBusListOfWinningBidsService;
import org.springframework.web.multipart.MultipartFile;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Collection; import java.util.Collection;
import static org.dromara.common.constant.MinioPathConstant.FormalitiesAnnex;
/** /**
* 中标项目一览Service业务层处理 * 中标项目一览Service业务层处理
* *
* @author Lion Li * @author Lion Li
* @date 2025-08-20 * @date 2025-08-22
*/ */
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
@ -34,6 +37,9 @@ public class BusListOfWinningBidsServiceImpl extends ServiceImpl<BusListOfWinnin
private final BusListOfWinningBidsMapper baseMapper; private final BusListOfWinningBidsMapper baseMapper;
@Autowired
private ISysOssService ossService;
/** /**
* 查询中标项目一览 * 查询中标项目一览
* *
@ -76,41 +82,32 @@ public class BusListOfWinningBidsServiceImpl extends ServiceImpl<BusListOfWinnin
LambdaQueryWrapper<BusListOfWinningBids> lqw = Wrappers.lambdaQuery(); LambdaQueryWrapper<BusListOfWinningBids> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(BusListOfWinningBids::getId); lqw.orderByDesc(BusListOfWinningBids::getId);
lqw.eq(bo.getProjectId() != null, BusListOfWinningBids::getProjectId, bo.getProjectId()); lqw.eq(bo.getProjectId() != null, BusListOfWinningBids::getProjectId, bo.getProjectId());
lqw.eq(StringUtils.isNotBlank(bo.getProjectStatus()), BusListOfWinningBids::getProjectStatus, bo.getProjectStatus()); lqw.eq(bo.getId() != null, BusListOfWinningBids::getId, bo.getId());
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), BusListOfWinningBids::getProjectName, bo.getProjectName());
lqw.eq(bo.getWinningBidOriginal() != null, BusListOfWinningBids::getWinningBidOriginal, bo.getWinningBidOriginal());
lqw.eq(bo.getExchangeRate() != null, BusListOfWinningBids::getExchangeRate, bo.getExchangeRate());
lqw.eq(StringUtils.isNotBlank(bo.getCurrency()), BusListOfWinningBids::getCurrency, bo.getCurrency());
lqw.eq(StringUtils.isNotBlank(bo.getSubject()), BusListOfWinningBids::getSubject, bo.getSubject());
lqw.eq(bo.getWinningBid() != null, BusListOfWinningBids::getWinningBid, bo.getWinningBid());
lqw.eq(bo.getBidWinningDate() != null, BusListOfWinningBids::getBidWinningDate, bo.getBidWinningDate());
lqw.eq(bo.getBidDeposit() != null, BusListOfWinningBids::getBidDeposit, bo.getBidDeposit());
lqw.eq(StringUtils.isNotBlank(bo.getWhetherSendBack()), BusListOfWinningBids::getWhetherSendBack, bo.getWhetherSendBack());
lqw.eq(StringUtils.isNotBlank(bo.getConstruction()), BusListOfWinningBids::getConstruction, bo.getConstruction());
lqw.eq(bo.getTotalCost() != null, BusListOfWinningBids::getTotalCost, bo.getTotalCost());
lqw.eq(StringUtils.isNotBlank(bo.getProjectApplicant()), BusListOfWinningBids::getProjectApplicant, bo.getProjectApplicant());
lqw.eq(StringUtils.isNotBlank(bo.getProjectApplicantDept()), BusListOfWinningBids::getProjectApplicantDept, bo.getProjectApplicantDept());
lqw.eq(bo.getProjectApplicantTime() != null, BusListOfWinningBids::getProjectApplicantTime, bo.getProjectApplicantTime());
lqw.eq(StringUtils.isNotBlank(bo.getProcessStatus()), BusListOfWinningBids::getProcessStatus, bo.getProcessStatus());
lqw.eq(StringUtils.isNotBlank(bo.getProjectNumbering()), BusListOfWinningBids::getProjectNumbering, bo.getProjectNumbering());
return lqw; return lqw;
} }
/** /**
* 新增中标项目一览 * 新增中标项目一览
* *
* @param bo 中标项目一览 * @param bo 中标项目一览
* @param file
* @return 是否新增成功 * @return 是否新增成功
*/ */
@Override @Override
public Boolean insertByBo(BusListOfWinningBidsBo bo) { public Boolean insertByBo(BusListOfWinningBidsBo bo, MultipartFile file) {
if ("0".equals(bo.getWhetherBid())){
SysOssUploadVo wordEntity = ossService.uploadWithNoSave(file, ossService.minioFileName(FormalitiesAnnex,file));
bo.setBidFile(wordEntity.getUrl());
bo.setBidFileName(wordEntity.getFileName());
}else {
bo.setBidPrice(null);
bo.setBidFile(null);
bo.setBidFileName(null);
}
if (bo.getId() == null) { if (bo.getId() == null) {
BusListOfWinningBids add = MapstructUtils.convert(bo, BusListOfWinningBids.class); BusListOfWinningBids add = MapstructUtils.convert(bo, BusListOfWinningBids.class);
Long count = baseMapper.selectCount(new LambdaQueryWrapper<BusListOfWinningBids>().eq(BusListOfWinningBids::getProjectId, bo.getProjectId()));
if (count > 0) {
throw new ServiceException("项目已存在不允许新增");
}
validEntityBeforeSave(add); validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0; boolean flag = baseMapper.insert(add) > 0;
if (flag) { if (flag) {
bo.setId(add.getId()); bo.setId(add.getId());

View File

@ -10,6 +10,8 @@ import org.dromara.common.core.exception.ServiceException;
import org.dromara.formalities.domain.bo.BusFormalitiesAnnexBo; import org.dromara.formalities.domain.bo.BusFormalitiesAnnexBo;
import org.dromara.formalities.domain.bo.BusFormalitiesAreConsolidatedBo; import org.dromara.formalities.domain.bo.BusFormalitiesAreConsolidatedBo;
import org.dromara.tender.domain.bo.BusSegmentedIndicatorPlanningBo; import org.dromara.tender.domain.bo.BusSegmentedIndicatorPlanningBo;
import org.dromara.tender.domain.vo.BusBiddingPlanAnnexVo;
import org.dromara.tender.domain.vo.BusBiddingPlanDetailVo;
import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo; import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -68,6 +70,20 @@ public class BusBiddingPlanController extends BaseController {
return R.ok(busBiddingPlanService.getMore(bo)); return R.ok(busBiddingPlanService.getMore(bo));
} }
/**
* 查看招标文件详情
* @param bo
* @return
*/
@SaCheckPermission("tender:biddingPlan:getAnnex")
@GetMapping("/getAnnex")
public R<List<BusBiddingPlanAnnexVo>> getAnnex(BusBiddingPlanBo bo) {
if (bo.getId() == null) {
throw new ServiceException("id不能为空");
}
return R.ok(busBiddingPlanService.getAnnex(bo));
}
/** /**
* 导出招标计划列表 * 导出招标计划列表
@ -85,12 +101,12 @@ public class BusBiddingPlanController extends BaseController {
* *
* @param id 主键 * @param id 主键
*/ */
// @SaCheckPermission("tender:biddingPlan:query") @SaCheckPermission("tender:biddingPlan:query")
// @GetMapping("/{id}") @GetMapping("/{id}")
// public R<BusBiddingPlanVo> getInfo(@NotNull(message = "主键不能为空") public R<BusBiddingPlanDetailVo> getInfo(@NotNull(message = "主键不能为空")
// @PathVariable Long id) { @PathVariable Long id) {
// return R.ok(busBiddingPlanService.queryById(id)); return R.ok(busBiddingPlanService.queryDetailById(id));
// } }
/** /**
* 新增招标计划 * 新增招标计划
@ -122,9 +138,8 @@ public class BusBiddingPlanController extends BaseController {
@Log(title = "招标计划", businessType = BusinessType.UPDATE) @Log(title = "招标计划", businessType = BusinessType.UPDATE)
@RepeatSubmit() @RepeatSubmit()
@PutMapping() @PutMapping()
public R<Void> edit(BusBiddingPlanBo bo, public R<Void> edit( @Validated(EditGroup.class) @RequestBody BusBiddingPlanBo bo) {
@RequestPart("file") MultipartFile bidFile) { return toAjax(busBiddingPlanService.updateByBo(bo));
return toAjax(busBiddingPlanService.updateByBo(bo,bidFile));
} }
/** /**

View File

@ -71,6 +71,10 @@ public class BusBiddingPlan extends BaseEntity {
* 分包内容 * 分包内容
*/ */
private String content; private String content;
/**
* 类型2、招采3、物资
*/
private String type;
/** /**
* 中标通知书 * 中标通知书
@ -95,7 +99,12 @@ public class BusBiddingPlan extends BaseEntity {
/** /**
* 状态 * 状态
*/ */
private Integer status; private Integer bidStatus;
/**
* 审核状态
*/
private String status;
/** /**
* 中标单位 * 中标单位

View File

@ -1,5 +1,8 @@
package org.dromara.tender.domain; package org.dromara.tender.domain;
import jakarta.validation.constraints.NotNull;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import lombok.Data; import lombok.Data;
@ -32,6 +35,11 @@ public class TenderSupplierInput extends BaseEntity {
@TableId(value = "id") @TableId(value = "id")
private Long id; private Long id;
/**
* 项目Id
*/
private Long projectId;
/** /**
* 企业登记注册类型 * 企业登记注册类型
*/ */

View File

@ -99,10 +99,20 @@ public class BusBiddingPlanBo extends BaseEntity {
*/ */
private String contractFileName; private String contractFileName;
/**
* 类型2、招采3、物资
*/
private String type;
/** /**
* 状态 * 状态
*/ */
private Integer status; private Integer bidStatus;
/**
* 审核状态
*/
private String status;
/** /**
* 中标单位id * 中标单位id
@ -114,4 +124,9 @@ public class BusBiddingPlanBo extends BaseEntity {
*/ */
private List<BusTenderPlanningLimitListBo> limitListBos; private List<BusTenderPlanningLimitListBo> limitListBos;
/**
* 文件类型
*/
private Integer fileType;
} }

View File

@ -1,5 +1,6 @@
package org.dromara.tender.domain.bo; package org.dromara.tender.domain.bo;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.tender.domain.TenderSupplierInput; import org.dromara.tender.domain.TenderSupplierInput;
import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.EditGroup; import org.dromara.common.core.validate.EditGroup;
@ -29,6 +30,12 @@ public class TenderSupplierInputBo extends BaseEntity {
@NotNull(message = "不能为空", groups = { EditGroup.class }) @NotNull(message = "不能为空", groups = { EditGroup.class })
private Long id; private Long id;
/**
* 项目Id
*/
@NotNull(message = "项目Id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long projectId;
/** /**
* 企业登记注册类型 * 企业登记注册类型
*/ */

View File

@ -0,0 +1,144 @@
package org.dromara.tender.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.tender.domain.BusBiddingPlan;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
* 招标计划视图对象 bus_bidding_plan
*
* @author Lion Li
* @date 2025-08-21
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BusBiddingPlan.class)
public class BusBiddingPlanDetailVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 项目Id
*/
@ExcelProperty(value = "项目Id")
private Long projectId;
/**
* 分包类型名称
*/
@ExcelProperty(value = "分包类型名称")
private String dictName;
/**
* 名称
*/
@ExcelProperty(value = "名称")
private String name;
/**
* 计划招标时间
*/
@ExcelProperty(value = "计划招标时间")
private LocalDate plannedBiddingTime;
/**
* 招标方式(公招,邀标)
*/
@ExcelProperty(value = "招标方式(公招,邀标)")
private String plannedBiddingMethod;
/**
* 总价
*/
@ExcelProperty(value = "总价")
private BigDecimal price;
/**
* 合同额
*/
@ExcelProperty(value = "合同额")
private BigDecimal contractPrice;
/**
* 分包内容
*/
@ExcelProperty(value = "分包内容")
private String content;
/**
* 中标通知书
*/
@ExcelProperty(value = "中标通知书")
private String bidFile;
/**
* 中标通知书名称
*/
@ExcelProperty(value = "中标通知书名称")
private String bidFileName;
/**
* 合同文件
*/
@ExcelProperty(value = "合同文件")
private String contractFile;
/**
* 合同文件名称
*/
@ExcelProperty(value = "合同文件名称")
private String contractFileName;
/**
* 状态
*/
private Integer bidStatus;
/**
* 审核状态
*/
private String status;
/**
* 类型2、招采3、物资
*/
private String type;
/**
* 中标单位
*/
private String winningBidder;
/**
* 中标单位id
*/
private Long winningBidderId;
/**
* 招采一览表数据
*/
List<BusBillofquantitiesLimitListVo> billofquantitiesLimitList;
/**
* 招标文件数据
*/
List<BusBiddingPlanAnnexVo> biddingPlanAnnexVoList;
}

View File

@ -113,7 +113,17 @@ public class BusBiddingPlanVo implements Serializable {
/** /**
* 状态 * 状态
*/ */
private Integer status; private Integer bidStatus;
/**
* 审核状态
*/
private String status;
/**
* 类型2、招采3、物资
*/
private String type;
/** /**
* 中标单位 * 中标单位

View File

@ -3,6 +3,9 @@ package org.dromara.tender.domain.vo;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Date; import java.util.Date;
import jakarta.validation.constraints.NotNull;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.tender.domain.TenderSupplierInput; import org.dromara.tender.domain.TenderSupplierInput;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
@ -33,6 +36,12 @@ public class TenderSupplierInputVo implements Serializable {
@ExcelProperty(value = "") @ExcelProperty(value = "")
private Long id; private Long id;
/**
* 项目Id
*/
@ExcelProperty(value = "项目Id")
private Long projectId;
/** /**
* 企业登记注册类型 * 企业登记注册类型
*/ */

View File

@ -1,5 +1,8 @@
package org.dromara.tender.service; package org.dromara.tender.service;
import jakarta.validation.constraints.NotNull;
import org.dromara.tender.domain.vo.BusBiddingPlanAnnexVo;
import org.dromara.tender.domain.vo.BusBiddingPlanDetailVo;
import org.dromara.tender.domain.vo.BusBiddingPlanVo; import org.dromara.tender.domain.vo.BusBiddingPlanVo;
import org.dromara.tender.domain.bo.BusBiddingPlanBo; import org.dromara.tender.domain.bo.BusBiddingPlanBo;
import org.dromara.tender.domain.BusBiddingPlan; import org.dromara.tender.domain.BusBiddingPlan;
@ -58,10 +61,9 @@ public interface IBusBiddingPlanService extends IService<BusBiddingPlan>{
* 修改招标计划 * 修改招标计划
* *
* @param bo 招标计划 * @param bo 招标计划
* @param bidFile
* @return 是否修改成功 * @return 是否修改成功
*/ */
Boolean updateByBo(BusBiddingPlanBo bo, MultipartFile bidFile); Boolean updateByBo(BusBiddingPlanBo bo);
/** /**
* 校验并批量删除招标计划信息 * 校验并批量删除招标计划信息
@ -88,4 +90,13 @@ public interface IBusBiddingPlanService extends IService<BusBiddingPlan>{
* @return * @return
*/ */
Boolean editStatus(BusBiddingPlanBo bo); Boolean editStatus(BusBiddingPlanBo bo);
/**
* 查看招标文件
* @param bo
* @return
*/
List<BusBiddingPlanAnnexVo> getAnnex(BusBiddingPlanBo bo);
BusBiddingPlanDetailVo queryDetailById(Long id);
} }

View File

@ -1,6 +1,10 @@
package org.dromara.tender.service.impl; package org.dromara.tender.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
import org.dromara.common.core.domain.event.ProcessEvent;
import org.dromara.common.core.domain.event.ProcessTaskEvent;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -9,6 +13,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.design.domain.BusBillofquantitiesVersions;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.dromara.tender.domain.bo.BusBLimitListVersionsBo; import org.dromara.tender.domain.bo.BusBLimitListVersionsBo;
import org.dromara.tender.domain.vo.BusBLimitListVersionsVo; import org.dromara.tender.domain.vo.BusBLimitListVersionsVo;
@ -26,6 +32,7 @@ import java.util.Collection;
* @author Lion Li * @author Lion Li
* @date 2025-08-21 * @date 2025-08-21
*/ */
@Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
public class BusBLimitListVersionsServiceImpl extends ServiceImpl<BusBLimitListVersionsMapper, BusBLimitListVersions> implements IBusBLimitListVersionsService { public class BusBLimitListVersionsServiceImpl extends ServiceImpl<BusBLimitListVersionsMapper, BusBLimitListVersions> implements IBusBLimitListVersionsService {
@ -132,4 +139,60 @@ public class BusBLimitListVersionsServiceImpl extends ServiceImpl<BusBLimitListV
} }
return baseMapper.deleteByIds(ids) > 0; return baseMapper.deleteByIds(ids) > 0;
} }
/**
* 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等)
* 正常使用只需#processEvent.flowCode=='leave1'
* 示例为了方便则使用startsWith匹配了全部示例key
*
* @param processEvent 参数
*/
@org.springframework.context.event.EventListener(condition = "#processEvent.flowCode.endsWith('biddingEquipmentList')")
public void processPlansHandlErequipmentList(ProcessEvent processEvent) {
log.info("物资设备清单审核任务执行了{}", processEvent.toString());
String id = processEvent.getBusinessId();
LambdaQueryWrapper<BusBLimitListVersions> eq = new LambdaQueryWrapper<BusBLimitListVersions>()
.eq(BusBLimitListVersions::getVersions, id);
BusBLimitListVersions busBLimitListVersions = new BusBLimitListVersions();
busBLimitListVersions.setStatus(processEvent.getStatus());
//
//
boolean update = this.update(busBLimitListVersions, eq);
// BusBiddingPlan biddingPlan = baseMapper.selectById(Long.valueOf(id));
// if (biddingPlan == null) {
// log.error("");
// }
// if (BusinessStatusEnum.DRAFT.getStatus().equals(biddingPlan.getStatus())) {
// biddingPlan.setBidStatus(1);
// }
// biddingPlan.setStatus(processEvent.getStatus());
// baseMapper.updateById(biddingPlan);
}
/**
* 执行任务创建监听
* 示例:也可通过 @EventListener(condition = "#processTaskEvent.flowCode=='leave1'")进行判断
* 在方法中判断流程节点key
* if ("xxx".equals(processTaskEvent.getNodeCode())) {
* //执行业务逻辑
* }
*
* @param processTaskEvent 参数
*/
@org.springframework.context.event.EventListener(condition = "#processTaskEvent.flowCode.endsWith('biddingEquipmentList')")
public void processTaskPlansHandlerEquipmentList(ProcessTaskEvent processTaskEvent) {
log.info("物资设备清单审核任务创建了{}", processTaskEvent.toString());
}
/**
* 监听删除流程事件
* 正常使用只需#processDeleteEvent.flowCode=='leave1'
* 示例为了方便则使用startsWith匹配了全部示例key
*
* @param processDeleteEvent 参数
*/
@EventListener(condition = "#processDeleteEvent.flowCode.endsWith('biddingEquipmentList')")
public void processDeletePlansHandlerEquipmentList(ProcessDeleteEvent processDeleteEvent) {
log.info("物资设备清单计划删除流程事件,技术标准文件审核任务执行了{}", processDeleteEvent.toString());
}
} }

View File

@ -1,6 +1,12 @@
package org.dromara.tender.service.impl; package org.dromara.tender.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
import org.dromara.common.core.domain.event.ProcessEvent;
import org.dromara.common.core.domain.event.ProcessTaskEvent;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
@ -10,23 +16,28 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.oss.core.OssClient;
import org.dromara.common.oss.factory.OssFactory;
import org.dromara.design.domain.BusBillofquantities;
import org.dromara.design.domain.BusBillofquantitiesVersions;
import org.dromara.formalities.domain.BusFormalitiesAnnex; import org.dromara.formalities.domain.BusFormalitiesAnnex;
import org.dromara.system.domain.vo.SysOssUploadVo; import org.dromara.system.domain.vo.SysOssUploadVo;
import org.dromara.system.service.ISysOssService; import org.dromara.system.service.ISysOssService;
import org.dromara.tender.domain.BusBiddingPlanAnnex; import org.dromara.tender.domain.*;
import org.dromara.tender.domain.BusTenderPlanningLimitList;
import org.dromara.tender.domain.bo.BusBiddingPlanAnnexBo; import org.dromara.tender.domain.bo.BusBiddingPlanAnnexBo;
import org.dromara.tender.domain.bo.BusTenderPlanningLimitListBo; import org.dromara.tender.domain.bo.BusTenderPlanningLimitListBo;
import org.dromara.tender.domain.vo.BusBiddingPlanAnnexVo; import org.dromara.tender.domain.vo.BusBiddingPlanAnnexVo;
import org.dromara.tender.domain.vo.BusBiddingPlanDetailVo;
import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo; import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo;
import org.dromara.tender.mapper.BusTenderPlanningLimitListMapper; import org.dromara.tender.mapper.BusTenderPlanningLimitListMapper;
import org.dromara.tender.service.IBusBiddingPlanAnnexService; import org.dromara.tender.service.IBusBiddingPlanAnnexService;
import org.dromara.tender.service.IBusBillofquantitiesLimitListService; import org.dromara.tender.service.IBusBillofquantitiesLimitListService;
import org.dromara.tender.service.ITenderSupplierInputService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.dromara.tender.domain.bo.BusBiddingPlanBo; import org.dromara.tender.domain.bo.BusBiddingPlanBo;
import org.dromara.tender.domain.vo.BusBiddingPlanVo; import org.dromara.tender.domain.vo.BusBiddingPlanVo;
import org.dromara.tender.domain.BusBiddingPlan;
import org.dromara.tender.mapper.BusBiddingPlanMapper; import org.dromara.tender.mapper.BusBiddingPlanMapper;
import org.dromara.tender.service.IBusBiddingPlanService; import org.dromara.tender.service.IBusBiddingPlanService;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -44,6 +55,7 @@ import static org.dromara.common.constant.MinioPathConstant.FormalitiesAnnex;
* @author Lion Li * @author Lion Li
* @date 2025-08-21 * @date 2025-08-21
*/ */
@Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
public class BusBiddingPlanServiceImpl extends ServiceImpl<BusBiddingPlanMapper, BusBiddingPlan> implements IBusBiddingPlanService { public class BusBiddingPlanServiceImpl extends ServiceImpl<BusBiddingPlanMapper, BusBiddingPlan> implements IBusBiddingPlanService {
@ -62,6 +74,10 @@ public class BusBiddingPlanServiceImpl extends ServiceImpl<BusBiddingPlanMapper,
@Autowired @Autowired
private ISysOssService ossService; private ISysOssService ossService;
@Autowired
private ITenderSupplierInputService tenderSupplierInputService;
/** /**
* 查询招标计划 * 查询招标计划
* *
@ -106,6 +122,7 @@ public class BusBiddingPlanServiceImpl extends ServiceImpl<BusBiddingPlanMapper,
lqw.eq(bo.getProjectId() != null, BusBiddingPlan::getProjectId, bo.getProjectId()); lqw.eq(bo.getProjectId() != null, BusBiddingPlan::getProjectId, bo.getProjectId());
lqw.like(StringUtils.isNotBlank(bo.getDictName()), BusBiddingPlan::getDictName, bo.getDictName()); lqw.like(StringUtils.isNotBlank(bo.getDictName()), BusBiddingPlan::getDictName, bo.getDictName());
lqw.like(StringUtils.isNotBlank(bo.getName()), BusBiddingPlan::getName, bo.getName()); lqw.like(StringUtils.isNotBlank(bo.getName()), BusBiddingPlan::getName, bo.getName());
lqw.eq(bo.getBidStatus() !=null, BusBiddingPlan::getBidStatus, bo.getBidStatus());
lqw.eq(bo.getPlannedBiddingTime() != null, BusBiddingPlan::getPlannedBiddingTime, bo.getPlannedBiddingTime()); lqw.eq(bo.getPlannedBiddingTime() != null, BusBiddingPlan::getPlannedBiddingTime, bo.getPlannedBiddingTime());
lqw.eq(StringUtils.isNotBlank(bo.getPlannedBiddingMethod()), BusBiddingPlan::getPlannedBiddingMethod, bo.getPlannedBiddingMethod()); lqw.eq(StringUtils.isNotBlank(bo.getPlannedBiddingMethod()), BusBiddingPlan::getPlannedBiddingMethod, bo.getPlannedBiddingMethod());
lqw.eq(bo.getPrice() != null, BusBiddingPlan::getPrice, bo.getPrice()); lqw.eq(bo.getPrice() != null, BusBiddingPlan::getPrice, bo.getPrice());
@ -141,10 +158,12 @@ public class BusBiddingPlanServiceImpl extends ServiceImpl<BusBiddingPlanMapper,
if (busBillofquantitiesLimitListVo == null) { if (busBillofquantitiesLimitListVo == null) {
throw new ServiceException("限价一览数据不存在"); throw new ServiceException("限价一览数据不存在");
} }
if (busBillofquantitiesLimitListVo.getQuantity().compareTo(limitListBo.getNum().add(count !=null ? count: BigDecimal.valueOf(0))) < 0) { if (limitListBo.getNum().add(count !=null ? count: BigDecimal.ZERO).compareTo(busBillofquantitiesLimitListVo.getQuantity()) > 0) {
throw new ServiceException(busBillofquantitiesLimitListVo.getName()+"数量超过了总数量"); throw new ServiceException(busBillofquantitiesLimitListVo.getName()+"数量超过了总数量");
} }
price.add(busBillofquantitiesLimitListVo.getUnitPrice().multiply(limitListBo.getNum())); if (busBillofquantitiesLimitListVo.getUnitPrice() != null && limitListBo.getNum() != null){
price = price.add(busBillofquantitiesLimitListVo.getUnitPrice().multiply(limitListBo.getNum()).setScale(2, RoundingMode.HALF_UP));
}
busTenderPlanningLimitList.setNum(limitListBo.getNum()); busTenderPlanningLimitList.setNum(limitListBo.getNum());
planningLimitListList.add(busTenderPlanningLimitList); planningLimitListList.add(busTenderPlanningLimitList);
} }
@ -162,35 +181,28 @@ public class BusBiddingPlanServiceImpl extends ServiceImpl<BusBiddingPlanMapper,
* 修改招标计划 * 修改招标计划
* *
* @param bo 招标计划 * @param bo 招标计划
* @param bidFile
* @return 是否修改成功 * @return 是否修改成功
*/ */
@Override @Override
public Boolean updateByBo(BusBiddingPlanBo bo, MultipartFile bidFile) { public Boolean updateByBo(BusBiddingPlanBo bo) {
if (bo.getStatus() == 1){ if (bo.getBidStatus() == 1){
throw new ServiceException("数据已锁定,不允许继续上传附件"); throw new ServiceException("数据已锁定,不允许继续上传附件");
} }
BusBiddingPlan update = MapstructUtils.convert(bo, BusBiddingPlan.class); BusBiddingPlan update = MapstructUtils.convert(bo, BusBiddingPlan.class);
BusBiddingPlanAnnexBo planAnnex = new BusBiddingPlanAnnexBo(); if (update != null) {
planAnnex.setBiddingPlanId(bo.getId()); //修改合同额和中标单位时对前置条件进行校验
List<BusBiddingPlanAnnexVo> planAnnexVoList = busBiddingPlanAnnexService.queryList(planAnnex); if (bo.getContractPrice() !=null || bo.getWinningBidderId() != null){
if (planAnnexVoList != null && !planAnnexVoList.isEmpty() ) { //判断招标文件是否上传
if (!bidFile.isEmpty()){ BusBiddingPlanAnnexBo planAnnex = new BusBiddingPlanAnnexBo();
SysOssUploadVo wordEntity = ossService.uploadWithNoSave(bidFile, ossService.minioFileName(FormalitiesAnnex,bidFile)); planAnnex.setBiddingPlanId(bo.getId());
update.setBidFile(wordEntity.getUrl()); List<BusBiddingPlanAnnexVo> planAnnexVoList = busBiddingPlanAnnexService.queryList(planAnnex);
update.setBidFileName(wordEntity.getFileName()); if (planAnnexVoList == null || planAnnexVoList.isEmpty() ) {
} throw new ServiceException("招标文件未上传");
// if (!contractFile.isEmpty()){ }
// SysOssUploadVo wordEntity = ossService.uploadWithNoSave(contractFile, ossService.minioFileName(FormalitiesAnnex,contractFile)); //判断中标文件是否上传
// update.setContractFile(wordEntity.getUrl()); if ((bo.getBidFile() == null || bo.getBidFile().isEmpty()) && (bo.getContractPrice() != null ||bo.getWinningBidderId() != null)){
// update.setContractFileName(wordEntity.getFileName()); throw new ServiceException("中标文件未上传");
// }
// }
if (bo.getContractPrice() != null && bo.getBidFile().isEmpty()){
throw new ServiceException("中标文件未上传");
}
if (bo.getWinningBidder() != null && bo.getBidFile().isEmpty()){
throw new ServiceException("中标单位不能为空");
} }
} }
// validEntityBeforeSave(update); // validEntityBeforeSave(update);
@ -260,7 +272,7 @@ public class BusBiddingPlanServiceImpl extends ServiceImpl<BusBiddingPlanMapper,
@Override @Override
public Boolean uploadBiddingDocuments(BusBiddingPlanBo bo, List<MultipartFile> files) { public Boolean uploadBiddingDocuments(BusBiddingPlanBo bo, List<MultipartFile> files) {
if (bo.getStatus() == 1){ if (bo.getBidStatus() == 1){
throw new ServiceException("数据已锁定,不允许继续上传附件"); throw new ServiceException("数据已锁定,不允许继续上传附件");
} }
List<BusBiddingPlanAnnex> annexArrayList = new ArrayList<>(); List<BusBiddingPlanAnnex> annexArrayList = new ArrayList<>();
@ -268,6 +280,28 @@ public class BusBiddingPlanServiceImpl extends ServiceImpl<BusBiddingPlanMapper,
if (files != null && !files.isEmpty()) { if (files != null && !files.isEmpty()) {
// 遍历文件数组 // 遍历文件数组
for (MultipartFile file : files) { for (MultipartFile file : files) {
if (bo.getFileType() == 0){
BusBiddingPlanAnnexBo planAnnex = new BusBiddingPlanAnnexBo();
planAnnex.setBiddingPlanId(bo.getId());
List<BusBiddingPlanAnnexVo> planAnnexVoList = busBiddingPlanAnnexService.queryList(planAnnex);
BusBiddingPlan biddingPlan = baseMapper.selectById(bo.getId());
//冗余中标单位名称
TenderSupplierInput tenderSupplierInput = tenderSupplierInputService.getById(bo.getWinningBidderId());
biddingPlan.setWinningBidderId(bo.getWinningBidderId());
biddingPlan.setWinningBidder(tenderSupplierInput.getSupplierName());
if (biddingPlan.getPlannedBiddingTime() == null){
throw new ServiceException("计划招标时间不能为空!!");
}
if (planAnnexVoList == null || planAnnexVoList.isEmpty() ) {
throw new ServiceException("请先上传招标文件再上传中标文件!!");
}
if (!file.isEmpty()){
SysOssUploadVo wordEntity = ossService.uploadWithNoSave(file, ossService.minioFileName(FormalitiesAnnex,file));
biddingPlan.setBidFile(wordEntity.getUrl());
biddingPlan.setBidFileName(wordEntity.getFileName());
return baseMapper.updateById(biddingPlan) > 0;
}
}
// 处理单个文件前先判断是否为空文件isEmpty() // 处理单个文件前先判断是否为空文件isEmpty()
if (file.isEmpty()) { if (file.isEmpty()) {
System.out.println("跳过空文件"); System.out.println("跳过空文件");
@ -287,9 +321,52 @@ public class BusBiddingPlanServiceImpl extends ServiceImpl<BusBiddingPlanMapper,
@Override @Override
public Boolean editStatus(BusBiddingPlanBo bo) { public Boolean editStatus(BusBiddingPlanBo bo) {
BusBiddingPlan update = MapstructUtils.convert(bo, BusBiddingPlan.class); BusBiddingPlan update = MapstructUtils.convert(bo, BusBiddingPlan.class);
BusBiddingPlan biddingPlan = baseMapper.selectById(bo.getId());
BusBiddingPlanAnnexBo planAnnex = new BusBiddingPlanAnnexBo();
planAnnex.setBiddingPlanId(bo.getId());
List<BusBiddingPlanAnnexVo> planAnnexVoList = busBiddingPlanAnnexService.queryList(planAnnex);
if (biddingPlan.getPlannedBiddingTime() == null){
throw new ServiceException("请填写计划招标时间!!");
}
if (planAnnexVoList == null || planAnnexVoList.isEmpty() ) {
throw new ServiceException("请上传招标文件!!");
}
if (biddingPlan.getBidFile() == null || biddingPlan.getBidFile().isEmpty()) {
throw new ServiceException("请上传中标通知书!!");
}
if (biddingPlan.getWinningBidderId() == null){
throw new ServiceException("请填写中标单位!!");
}
if (biddingPlan.getContractPrice() == null){
throw new ServiceException("请填写合同额!!");
}
update.setBidStatus(1);
return baseMapper.updateById(update) >0; return baseMapper.updateById(update) >0;
} }
@Override
public List<BusBiddingPlanAnnexVo> getAnnex(BusBiddingPlanBo bo) {
BusBiddingPlanAnnexBo annexBo = new BusBiddingPlanAnnexBo();
annexBo.setBiddingPlanId(bo.getId());
return busBiddingPlanAnnexService.queryList(annexBo);
}
@Override
public BusBiddingPlanDetailVo queryDetailById(Long id) {
BusBiddingPlan biddingPlan = baseMapper.selectById(id);
BusBiddingPlanBo bo = new BusBiddingPlanBo();
bo.setId(id);
BusBiddingPlanDetailVo detailVo = new BusBiddingPlanDetailVo();
BeanUtil.copyProperties(biddingPlan, detailVo);
List<BusBillofquantitiesLimitListVo> more = getMore(bo);
detailVo.setBillofquantitiesLimitList(more);
List<BusBiddingPlanAnnexVo> annex = getAnnex(bo);
detailVo.setBiddingPlanAnnexVoList(annex);
return detailVo;
}
/** /**
* 递归构建树形结构 * 递归构建树形结构
* @param parentId 父节点ID顶级节点为0 * @param parentId 父节点ID顶级节点为0

View File

@ -1,6 +1,11 @@
package org.dromara.tender.service.impl; package org.dromara.tender.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
import org.dromara.common.core.domain.event.ProcessEvent;
import org.dromara.common.core.domain.event.ProcessTaskEvent;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -10,12 +15,15 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.utils.excel.ExcelDynamicReader; import org.dromara.common.utils.excel.ExcelDynamicReader;
import org.dromara.design.domain.BusBillofquantitiesVersions;
import org.dromara.tender.domain.BusBiddingPlan;
import org.dromara.tender.domain.bo.BusBLimitListVersionsBo; import org.dromara.tender.domain.bo.BusBLimitListVersionsBo;
import org.dromara.tender.domain.bo.TenderAllVersionNumbersReq; import org.dromara.tender.domain.bo.TenderAllVersionNumbersReq;
import org.dromara.tender.domain.vo.BusBLimitListVersionsVo; import org.dromara.tender.domain.vo.BusBLimitListVersionsVo;
import org.dromara.tender.enums.LimitListTypeEnum; import org.dromara.tender.enums.LimitListTypeEnum;
import org.dromara.tender.service.IBusBLimitListVersionsService; import org.dromara.tender.service.IBusBLimitListVersionsService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.dromara.tender.domain.bo.BusBillofquantitiesLimitListBo; import org.dromara.tender.domain.bo.BusBillofquantitiesLimitListBo;
import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo; import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo;
@ -35,6 +43,7 @@ import java.util.stream.Collectors;
* @author Lion Li * @author Lion Li
* @date 2025-08-19 * @date 2025-08-19
*/ */
@Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
public class BusBillofquantitiesLimitListServiceImpl extends ServiceImpl<BusBillofquantitiesLimitListMapper, BusBillofquantitiesLimitList> implements IBusBillofquantitiesLimitListService { public class BusBillofquantitiesLimitListServiceImpl extends ServiceImpl<BusBillofquantitiesLimitListMapper, BusBillofquantitiesLimitList> implements IBusBillofquantitiesLimitListService {

View File

@ -119,6 +119,7 @@ public class BusSegmentedIndicatorPlanningServiceImpl extends ServiceImpl<BusSeg
BusSegmentedIndicatorPlanning add = MapstructUtils.convert(bo, BusSegmentedIndicatorPlanning.class); BusSegmentedIndicatorPlanning add = MapstructUtils.convert(bo, BusSegmentedIndicatorPlanning.class);
// validEntityBeforeSave(add); // validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0; boolean flag = baseMapper.insert(add) > 0;
BigDecimal price = BigDecimal.valueOf(0);
if (flag) { if (flag) {
bo.setId(add.getId()); bo.setId(add.getId());
if (bo.getLimitListBos() != null && !bo.getLimitListBos().isEmpty()) { if (bo.getLimitListBos() != null && !bo.getLimitListBos().isEmpty()) {
@ -138,9 +139,14 @@ public class BusSegmentedIndicatorPlanningServiceImpl extends ServiceImpl<BusSeg
} }
busIndicatorPlanningLimitList.setNum(limitListBo.getNum()); busIndicatorPlanningLimitList.setNum(limitListBo.getNum());
planningLimitListList.add(busIndicatorPlanningLimitList); planningLimitListList.add(busIndicatorPlanningLimitList);
if (busBillofquantitiesLimitListVo.getUnitPrice() != null && limitListBo.getNum() != null){
price = price.add(busBillofquantitiesLimitListVo.getUnitPrice().multiply(limitListBo.getNum()).setScale(2, RoundingMode.HALF_UP));
}
} }
add.setPrice(price);
//批量新增 //批量新增
indicatorPlanningLimitListMapper.insertBatch(planningLimitListList); indicatorPlanningLimitListMapper.insertBatch(planningLimitListList);
baseMapper.updateById(add);
} }
} }
return flag; return flag;

View File

@ -17,6 +17,7 @@ import lombok.RequiredArgsConstructor;
import org.dromara.system.domain.vo.SysOssUploadVo; import org.dromara.system.domain.vo.SysOssUploadVo;
import org.dromara.system.domain.vo.SysOssVo; import org.dromara.system.domain.vo.SysOssVo;
import org.dromara.system.service.ISysOssService; import org.dromara.system.service.ISysOssService;
import org.dromara.tender.domain.BusBiddingPlan;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.dromara.tender.domain.bo.TenderSupplierInputBo; import org.dromara.tender.domain.bo.TenderSupplierInputBo;
@ -89,6 +90,7 @@ public class TenderSupplierInputServiceImpl extends ServiceImpl<TenderSupplierIn
Map<String, Object> params = bo.getParams(); Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<TenderSupplierInput> lqw = Wrappers.lambdaQuery(); LambdaQueryWrapper<TenderSupplierInput> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(TenderSupplierInput::getId); lqw.orderByDesc(TenderSupplierInput::getId);
lqw.eq(bo.getProjectId() != null, TenderSupplierInput::getProjectId, bo.getProjectId());
lqw.eq(StringUtils.isNotBlank(bo.getSupplierType()), TenderSupplierInput::getSupplierType, bo.getSupplierType()); lqw.eq(StringUtils.isNotBlank(bo.getSupplierType()), TenderSupplierInput::getSupplierType, bo.getSupplierType());
lqw.eq(StringUtils.isNotBlank(bo.getInputFile()), TenderSupplierInput::getInputFile, bo.getInputFile()); lqw.eq(StringUtils.isNotBlank(bo.getInputFile()), TenderSupplierInput::getInputFile, bo.getInputFile());
lqw.like(StringUtils.isNotBlank(bo.getSupplierName()), TenderSupplierInput::getSupplierName, bo.getSupplierName()); lqw.like(StringUtils.isNotBlank(bo.getSupplierName()), TenderSupplierInput::getSupplierName, bo.getSupplierName());