招标管理模块

This commit is contained in:
2025-08-21 15:01:51 +08:00
parent 14432bc61e
commit ddf7c4c096
32 changed files with 2096 additions and 10 deletions

View File

@ -0,0 +1,105 @@
package org.dromara.tender.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.tender.domain.vo.BusBiddingPlanAnnexVo;
import org.dromara.tender.domain.bo.BusBiddingPlanAnnexBo;
import org.dromara.tender.service.IBusBiddingPlanAnnexService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 招标计划-招标文件
*
* @author Lion Li
* @date 2025-08-21
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/tender/biddingPlanAnnex")
public class BusBiddingPlanAnnexController extends BaseController {
private final IBusBiddingPlanAnnexService busBiddingPlanAnnexService;
/**
* 查询招标计划-招标文件列表
*/
@SaCheckPermission("tender:biddingPlanAnnex:list")
@GetMapping("/list")
public TableDataInfo<BusBiddingPlanAnnexVo> list(BusBiddingPlanAnnexBo bo, PageQuery pageQuery) {
return busBiddingPlanAnnexService.queryPageList(bo, pageQuery);
}
/**
* 导出招标计划-招标文件列表
*/
@SaCheckPermission("tender:biddingPlanAnnex:export")
@Log(title = "招标计划-招标文件", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BusBiddingPlanAnnexBo bo, HttpServletResponse response) {
List<BusBiddingPlanAnnexVo> list = busBiddingPlanAnnexService.queryList(bo);
ExcelUtil.exportExcel(list, "招标计划-招标文件", BusBiddingPlanAnnexVo.class, response);
}
/**
* 获取招标计划-招标文件详细信息
*
* @param id 主键
*/
@SaCheckPermission("tender:biddingPlanAnnex:query")
@GetMapping("/{id}")
public R<BusBiddingPlanAnnexVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(busBiddingPlanAnnexService.queryById(id));
}
/**
* 新增招标计划-招标文件
*/
@SaCheckPermission("tender:biddingPlanAnnex:add")
@Log(title = "招标计划-招标文件", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody BusBiddingPlanAnnexBo bo) {
return toAjax(busBiddingPlanAnnexService.insertByBo(bo));
}
/**
* 修改招标计划-招标文件
*/
@SaCheckPermission("tender:biddingPlanAnnex:edit")
@Log(title = "招标计划-招标文件", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BusBiddingPlanAnnexBo bo) {
return toAjax(busBiddingPlanAnnexService.updateByBo(bo));
}
/**
* 删除招标计划-招标文件
*
* @param ids 主键串
*/
@SaCheckPermission("tender:biddingPlanAnnex:remove")
@Log(title = "招标计划-招标文件", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(busBiddingPlanAnnexService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,154 @@
package org.dromara.tender.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.formalities.domain.bo.BusFormalitiesAnnexBo;
import org.dromara.formalities.domain.bo.BusFormalitiesAreConsolidatedBo;
import org.dromara.tender.domain.bo.BusSegmentedIndicatorPlanningBo;
import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.tender.domain.vo.BusBiddingPlanVo;
import org.dromara.tender.domain.bo.BusBiddingPlanBo;
import org.dromara.tender.service.IBusBiddingPlanService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/**
* 招标计划
*
* @author Lion Li
* @date 2025-08-21
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/tender/biddingPlan")
public class BusBiddingPlanController extends BaseController {
private final IBusBiddingPlanService busBiddingPlanService;
/**
* 查询招标计划列表
*/
@SaCheckPermission("tender:biddingPlan:list")
@GetMapping("/list")
public TableDataInfo<BusBiddingPlanVo> list(BusBiddingPlanBo bo, PageQuery pageQuery) {
if (bo.getDictName() == null) {
throw new ServiceException("分包类型不能为空");
}
return busBiddingPlanService.queryPageList(bo, pageQuery);
}
/**
* 回显数据详情
* @param bo
* @return
*/
@SaCheckPermission("tender:biddingPlan:getMore")
@GetMapping("/getMore")
public R<List<BusBillofquantitiesLimitListVo>> getMore(BusBiddingPlanBo bo) {
if (bo.getId() == null) {
throw new ServiceException("id不能为空");
}
return R.ok(busBiddingPlanService.getMore(bo));
}
/**
* 导出招标计划列表
*/
// @SaCheckPermission("tender:biddingPlan:export")
// @Log(title = "招标计划", businessType = BusinessType.EXPORT)
// @PostMapping("/export")
// public void export(BusBiddingPlanBo bo, HttpServletResponse response) {
// List<BusBiddingPlanVo> list = busBiddingPlanService.queryList(bo);
// ExcelUtil.exportExcel(list, "招标计划", BusBiddingPlanVo.class, response);
// }
/**
* 获取招标计划详细信息
*
* @param id 主键
*/
// @SaCheckPermission("tender:biddingPlan:query")
// @GetMapping("/{id}")
// public R<BusBiddingPlanVo> getInfo(@NotNull(message = "主键不能为空")
// @PathVariable Long id) {
// return R.ok(busBiddingPlanService.queryById(id));
// }
/**
* 新增招标计划
*/
@SaCheckPermission("tender:biddingPlan:add")
@Log(title = "招标计划", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody BusBiddingPlanBo bo) {
return toAjax(busBiddingPlanService.insertByBo(bo));
}
/**
* 上传招标文件
*/
@SaCheckPermission("tender:biddingPlan:uploadBiddingDocuments")
@Log(title = "招标计划", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PutMapping("/uploadBiddingDocuments")
public R<Void> uploadBiddingDocuments(BusBiddingPlanBo bo,
@RequestPart("file") List<MultipartFile> files) {
return toAjax(busBiddingPlanService.uploadBiddingDocuments(bo,files));
}
/**
* 修改招标计划
*/
@SaCheckPermission("tender:biddingPlan:edit")
@Log(title = "招标计划", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(BusBiddingPlanBo bo,
@RequestPart("file") MultipartFile bidFile) {
return toAjax(busBiddingPlanService.updateByBo(bo,bidFile));
}
/**
* 修改合规性手续合账
*/
@SaCheckPermission("tender:biddingPlan:editStatus")
@Log(title = "招标计划", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping("/editStatus")
public R<Void> editStatus(@Validated(EditGroup.class) @RequestBody BusBiddingPlanBo bo) {
return toAjax(busBiddingPlanService.editStatus(bo));
}
/**
* 删除招标计划
*
* @param ids 主键串
*/
@SaCheckPermission("tender:biddingPlan:remove")
@Log(title = "招标计划", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(busBiddingPlanService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -10,6 +10,7 @@ import org.dromara.design.domain.bo.ImportExcelFileReq;
import org.dromara.design.domain.bo.ObtainAllVersionNumbersReq;
import org.dromara.design.domain.bo.SheetListReq;
import org.dromara.design.domain.vo.BusBillofquantitiesVersionsVo;
import org.dromara.tender.enums.LimitListTypeEnum;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
@ -47,6 +48,7 @@ public class BusBillofquantitiesLimitListController extends BaseController {
@SaCheckPermission("tender:billofquantitiesLimitList:list")
@GetMapping("/list")
public R<List<BusBillofquantitiesLimitListVo>> list(BusBillofquantitiesLimitListBo bo, PageQuery pageQuery) {
bo.setType(LimitListTypeEnum.COMPANY.getCode());
return R.ok(busBillofquantitiesLimitListService.getTree(bo));
}
/**
@ -55,6 +57,7 @@ public class BusBillofquantitiesLimitListController extends BaseController {
@SaCheckPermission("tender:billofquantitiesLimitList:getTree")
@GetMapping("/getTree")
public R<List<BusBillofquantitiesLimitListVo>> getTree(BusBillofquantitiesLimitListBo bo) {
bo.setType(LimitListTypeEnum.COMPANY.getCode());
return R.ok(busBillofquantitiesLimitListService.getTree(bo));
}
@ -64,6 +67,7 @@ public class BusBillofquantitiesLimitListController extends BaseController {
@SaCheckPermission("design:billofquantitiesLimitList:obtainAllVersionNumbers")
@GetMapping("/obtainAllVersionNumbers")
public R<List<String>> obtainAllVersionNumbers(BusBillofquantitiesLimitListBo bo) {
bo.setType(LimitListTypeEnum.COMPANY.getCode());
return R.ok(busBillofquantitiesLimitListService.obtainAllVersionNumbers(bo));
}
@ -73,6 +77,7 @@ public class BusBillofquantitiesLimitListController extends BaseController {
@SaCheckPermission("design:billofquantitiesLimitList:sheetList")
@GetMapping("/sheetList")
public R<List<String>> sheetList(BusBillofquantitiesLimitListBo bo) {
bo.setType(LimitListTypeEnum.COMPANY.getCode());
return R.ok(busBillofquantitiesLimitListService.sheetList(bo));
}
@ -83,6 +88,7 @@ public class BusBillofquantitiesLimitListController extends BaseController {
@Log(title = "限价一览", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BusBillofquantitiesLimitListBo bo, HttpServletResponse response) {
bo.setType(LimitListTypeEnum.COMPANY.getCode());
List<BusBillofquantitiesLimitListVo> list = busBillofquantitiesLimitListService.queryList(bo);
ExcelUtil.exportExcel(list, "限价一览", BusBillofquantitiesLimitListVo.class, response);
}
@ -113,13 +119,13 @@ public class BusBillofquantitiesLimitListController extends BaseController {
/**
* 新增限价一览
*/
@SaCheckPermission("tender:billofquantitiesLimitList:add")
@Log(title = "限价一览", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody BusBillofquantitiesLimitListBo bo) {
return toAjax(busBillofquantitiesLimitListService.insertByBo(bo));
}
// @SaCheckPermission("tender:billofquantitiesLimitList:add")
// @Log(title = "限价一览", businessType = BusinessType.INSERT)
// @RepeatSubmit()
// @PostMapping()
// public R<Void> add(@Validated(AddGroup.class) @RequestBody BusBillofquantitiesLimitListBo bo) {
// return toAjax(busBillofquantitiesLimitListService.insertByBo(bo));
// }
/**
* 修改限价一览
@ -129,6 +135,7 @@ public class BusBillofquantitiesLimitListController extends BaseController {
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BusBillofquantitiesLimitListBo bo) {
// bo.setType(LimitListTypeEnum.COMPANY.getCode());
return toAjax(busBillofquantitiesLimitListService.updateByBo(bo));
}

View File

@ -59,12 +59,14 @@ public class BusSegmentedIndicatorPlanningController extends BaseController {
return busSegmentedIndicatorPlanningService.queryPageList(bo, pageQuery);
}
/**
* 回显数据详情
* @param bo
* @return
*/
@SaCheckPermission("tender:segmentedIndicatorPlanning:getMore")
@GetMapping("/getMore")
public R<List<BusBillofquantitiesLimitListVo>> getMore(BusSegmentedIndicatorPlanningBo bo) {
// if (bo.getProjectId() == null) {
// throw new ServiceException("项目id不能为空");
// }
if (bo.getId() == null) {
throw new ServiceException("id不能为空");
}

View File

@ -0,0 +1,144 @@
package org.dromara.tender.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.web.core.BaseController;
import org.dromara.tender.domain.bo.BusBillofquantitiesLimitListBo;
import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo;
import org.dromara.tender.enums.LimitListTypeEnum;
import org.dromara.tender.service.IBusBillofquantitiesLimitListService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* 招采限价一览
*
* @author Lion Li
* @date 2025-08-19
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/tender/tenderPlanLimitList")
public class BusTenderPlanLimitListController extends BaseController {
private final IBusBillofquantitiesLimitListService busBillofquantitiesLimitListService;
/**
* 查询限价一览列表
*/
@SaCheckPermission("tender:tenderPlanLimitList:list")
@GetMapping("/list")
public R<List<BusBillofquantitiesLimitListVo>> list(BusBillofquantitiesLimitListBo bo, PageQuery pageQuery) {
return R.ok(busBillofquantitiesLimitListService.getTree(bo));
}
/**
* 查询限价一览列表
*/
@SaCheckPermission("tender:tenderPlanLimitList:getTree")
@GetMapping("/getTree")
public R<List<BusBillofquantitiesLimitListVo>> getTree(BusBillofquantitiesLimitListBo bo) {
return R.ok(busBillofquantitiesLimitListService.getTree(bo));
}
/**
* 获取所有版本号
*/
@SaCheckPermission("design:tenderPlanLimitList:obtainAllVersionNumbers")
@GetMapping("/obtainAllVersionNumbers")
public R<List<String>> obtainAllVersionNumbers(BusBillofquantitiesLimitListBo bo) {
return R.ok(busBillofquantitiesLimitListService.obtainAllVersionNumbers(bo));
}
/**
* 获取指定版本的sheet
*/
@SaCheckPermission("design:tenderPlanLimitList:sheetList")
@GetMapping("/sheetList")
public R<List<String>> sheetList(BusBillofquantitiesLimitListBo bo) {
return R.ok(busBillofquantitiesLimitListService.sheetList(bo));
}
/**
* 导出限价一览列表
*/
@SaCheckPermission("tender:tenderPlanLimitList:export")
@Log(title = "限价一览", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BusBillofquantitiesLimitListBo bo, HttpServletResponse response) {
List<BusBillofquantitiesLimitListVo> list = busBillofquantitiesLimitListService.queryList(bo);
ExcelUtil.exportExcel(list, "限价一览", BusBillofquantitiesLimitListVo.class, response);
}
/**
* 导入excel
*/
@SaCheckPermission("tender:tenderPlanLimitList:importExcelFile")
@Log(title = "导入excel", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/importExcelFile")
public R<Void> importExcelFile(Long projectId, @RequestParam("file") MultipartFile file) throws Exception {
return toAjax(busBillofquantitiesLimitListService.importExcelFile(projectId, file));
}
/**
* 获取限价一览详细信息
*
* @param id 主键
*/
@SaCheckPermission("tender:tenderPlanLimitList:query")
@GetMapping("/{id}")
public R<BusBillofquantitiesLimitListVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(busBillofquantitiesLimitListService.queryById(id));
}
/**
* 新增限价一览
*/
// @SaCheckPermission("tender:billofquantitiesLimitList:add")
// @Log(title = "限价一览", businessType = BusinessType.INSERT)
// @RepeatSubmit()
// @PostMapping()
// public R<Void> add(@Validated(AddGroup.class) @RequestBody BusBillofquantitiesLimitListBo bo) {
// return toAjax(busBillofquantitiesLimitListService.insertByBo(bo));
// }
/**
* 修改限价一览
*/
@SaCheckPermission("tender:tenderPlanLimitList:edit")
@Log(title = "限价一览", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BusBillofquantitiesLimitListBo bo) {
// bo.setType(LimitListTypeEnum.COMPANY.getCode());
return toAjax(busBillofquantitiesLimitListService.updateByBo(bo));
}
/**
* 删除限价一览
*
* @param ids 主键串
*/
@SaCheckPermission("tender:tenderPlanLimitList:remove")
@Log(title = "限价一览", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(busBillofquantitiesLimitListService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,105 @@
package org.dromara.tender.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.tender.domain.vo.BusTenderPlanningLimitListVo;
import org.dromara.tender.domain.bo.BusTenderPlanningLimitListBo;
import org.dromara.tender.service.IBusTenderPlanningLimitListService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 招标计划-限价一览
*
* @author Lion Li
* @date 2025-08-21
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/tender/tenderPlanningLimitList")
public class BusTenderPlanningLimitListController extends BaseController {
private final IBusTenderPlanningLimitListService busTenderPlanningLimitListService;
/**
* 查询招标计划-限价一览列表
*/
@SaCheckPermission("tender:tenderPlanningLimitList:list")
@GetMapping("/list")
public TableDataInfo<BusTenderPlanningLimitListVo> list(BusTenderPlanningLimitListBo bo, PageQuery pageQuery) {
return busTenderPlanningLimitListService.queryPageList(bo, pageQuery);
}
/**
* 导出招标计划-限价一览列表
*/
@SaCheckPermission("tender:tenderPlanningLimitList:export")
@Log(title = "招标计划-限价一览", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BusTenderPlanningLimitListBo bo, HttpServletResponse response) {
List<BusTenderPlanningLimitListVo> list = busTenderPlanningLimitListService.queryList(bo);
ExcelUtil.exportExcel(list, "招标计划-限价一览", BusTenderPlanningLimitListVo.class, response);
}
/**
* 获取招标计划-限价一览详细信息
*
* @param id 主键
*/
@SaCheckPermission("tender:tenderPlanningLimitList:query")
@GetMapping("/{id}")
public R<BusTenderPlanningLimitListVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(busTenderPlanningLimitListService.queryById(id));
}
/**
* 新增招标计划-限价一览
*/
@SaCheckPermission("tender:tenderPlanningLimitList:add")
@Log(title = "招标计划-限价一览", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody BusTenderPlanningLimitListBo bo) {
return toAjax(busTenderPlanningLimitListService.insertByBo(bo));
}
/**
* 修改招标计划-限价一览
*/
@SaCheckPermission("tender:tenderPlanningLimitList:edit")
@Log(title = "招标计划-限价一览", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BusTenderPlanningLimitListBo bo) {
return toAjax(busTenderPlanningLimitListService.updateByBo(bo));
}
/**
* 删除招标计划-限价一览
*
* @param ids 主键串
*/
@SaCheckPermission("tender:tenderPlanningLimitList:remove")
@Log(title = "招标计划-限价一览", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(busTenderPlanningLimitListService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,106 @@
package org.dromara.tender.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* 招标计划对象 bus_bidding_plan
*
* @author Lion Li
* @date 2025-08-21
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("bus_bidding_plan")
public class BusBiddingPlan extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 项目Id
*/
private Long projectId;
/**
* 分包类型名称
*/
private String dictName;
/**
* 名称
*/
private String name;
/**
* 计划招标时间
*/
private LocalDate plannedBiddingTime;
/**
* 招标方式(公招,邀标)
*/
private String plannedBiddingMethod;
/**
* 总价
*/
private BigDecimal price;
/**
* 合同额
*/
private BigDecimal contractPrice;
/**
* 分包内容
*/
private String content;
/**
* 中标通知书
*/
private String bidFile;
/**
* 中标通知书名称
*/
private String bidFileName;
/**
* 投标文件
*/
private String contractFile;
/**
* 投标文件名称
*/
private String contractFileName;
/**
* 状态
*/
private Integer status;
/**
* 中标单位
*/
private String winningBidder;
}

View File

@ -0,0 +1,46 @@
package org.dromara.tender.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 招标计划-招标文件对象 bus_bidding_plan_annex
*
* @author Lion Li
* @date 2025-08-21
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("bus_bidding_plan_annex")
public class BusBiddingPlanAnnex extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 招标计划Id
*/
private Long biddingPlanId;
/**
* 附件地址
*/
private String url;
/**
* 附件名称
*/
private String name;
}

View File

@ -58,6 +58,11 @@ public class BusBillofquantitiesLimitList extends BaseEntity {
*/
private String num;
/**
* 类型
*/
private String type;
/**
* 名称
*/

View File

@ -0,0 +1,47 @@
package org.dromara.tender.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.math.BigDecimal;
/**
* 招标计划-限价一览对象 bus_tender_planning_limit_list
*
* @author Lion Li
* @date 2025-08-21
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("bus_tender_planning_limit_list")
public class BusTenderPlanningLimitList extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 分标策划Id
*/
private Long biddingPlanId;
/**
* 限价一览id
*/
private Long limitListId;
/**
* 数量
*/
private BigDecimal num;
}

View File

@ -0,0 +1,45 @@
package org.dromara.tender.domain.bo;
import org.dromara.tender.domain.BusBiddingPlanAnnex;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 招标计划-招标文件业务对象 bus_bidding_plan_annex
*
* @author Lion Li
* @date 2025-08-21
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = BusBiddingPlanAnnex.class, reverseConvertGenerate = false)
public class BusBiddingPlanAnnexBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 招标计划Id
*/
private Long biddingPlanId;
/**
* 附件地址
*/
private String url;
/**
* 附件名称
*/
private String name;
}

View File

@ -0,0 +1,112 @@
package org.dromara.tender.domain.bo;
import org.dromara.tender.domain.BusBiddingPlan;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 招标计划业务对象 bus_bidding_plan
*
* @author Lion Li
* @date 2025-08-21
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = BusBiddingPlan.class, reverseConvertGenerate = false)
public class BusBiddingPlanBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 项目Id
*/
@NotNull(message = "项目Id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long projectId;
/**
* 分包类型名称
*/
private String dictName;
/**
* 名称
*/
private String name;
/**
* 计划招标时间
*/
private LocalDate plannedBiddingTime;
/**
* 招标方式(公招,邀标)
*/
private String plannedBiddingMethod;
/**
* 总价
*/
private BigDecimal price;
/**
* 合同额
*/
private BigDecimal contractPrice;
/**
* 分包内容
*/
private String content;
/**
* 中标单位
*/
private String winningBidder;
/**
* 中标通知书
*/
private String bidFile;
/**
* 中标通知书名称
*/
private String bidFileName;
/**
* 投标文件
*/
private String contractFile;
/**
* 投标文件名称
*/
private String contractFileName;
/**
* 状态
*/
private Integer status;
/**
* 限价一览表ids
*/
private List<BusTenderPlanningLimitListBo> limitListBos;
}

View File

@ -60,6 +60,11 @@ public class BusBillofquantitiesLimitListBo extends BaseEntity {
*/
private String num;
/**
* 类型
*/
private String type;
/**
* 名称
*/

View File

@ -0,0 +1,47 @@
package org.dromara.tender.domain.bo;
import org.dromara.tender.domain.BusTenderPlanningLimitList;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
/**
* 招标计划-限价一览业务对象 bus_tender_planning_limit_list
*
* @author Lion Li
* @date 2025-08-21
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = BusTenderPlanningLimitList.class, reverseConvertGenerate = false)
public class BusTenderPlanningLimitListBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 分标策划Id
*/
private Long biddingPlanId;
/**
* 限价一览id
*/
private Long limitListId;
/**
* 数量
*/
private BigDecimal num;
}

View File

@ -0,0 +1,56 @@
package org.dromara.tender.domain.vo;
import org.dromara.tender.domain.BusBiddingPlanAnnex;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 招标计划-招标文件视图对象 bus_bidding_plan_annex
*
* @author Lion Li
* @date 2025-08-21
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BusBiddingPlanAnnex.class)
public class BusBiddingPlanAnnexVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 招标计划Id
*/
@ExcelProperty(value = "招标计划Id")
private Long biddingPlanId;
/**
* 附件地址
*/
@ExcelProperty(value = "附件地址")
private String url;
/**
* 附件名称
*/
@ExcelProperty(value = "附件名称")
private String name;
}

View File

@ -0,0 +1,124 @@
package org.dromara.tender.domain.vo;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.tender.domain.BusBiddingPlan;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 招标计划视图对象 bus_bidding_plan
*
* @author Lion Li
* @date 2025-08-21
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BusBiddingPlan.class)
public class BusBiddingPlanVo 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 status;
/**
* 中标单位
*/
private String winningBidder;
}

View File

@ -79,6 +79,11 @@ public class BusBillofquantitiesLimitListVo implements Serializable {
@ExcelProperty(value = "名称")
private String name;
/**
* 类型
*/
private String type;
/**
* 规格
*/

View File

@ -0,0 +1,57 @@
package org.dromara.tender.domain.vo;
import org.dromara.tender.domain.BusTenderPlanningLimitList;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 招标计划-限价一览视图对象 bus_tender_planning_limit_list
*
* @author Lion Li
* @date 2025-08-21
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BusTenderPlanningLimitList.class)
public class BusTenderPlanningLimitListVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 分标策划Id
*/
@ExcelProperty(value = "分标策划Id")
private Long biddingPlanId;
/**
* 限价一览id
*/
@ExcelProperty(value = "限价一览id")
private Long limitListId;
/**
* 数量
*/
@ExcelProperty(value = "数量")
private BigDecimal num;
}

View File

@ -0,0 +1,25 @@
package org.dromara.tender.enums;
import lombok.Getter;
/**
* @author lilemy
* @date 2025/7/18 9:41
*/
@Getter
public enum LimitListTypeEnum {
COMPANY("1", "限价"),
SUB_COMPANY("2", "招采"),
SPECIAL("3", "物资");
private final String code;
private final String message;
LimitListTypeEnum(String code, String message) {
this.code = code;
this.message = message;
}
}

View File

@ -0,0 +1,15 @@
package org.dromara.tender.mapper;
import org.dromara.tender.domain.BusBiddingPlanAnnex;
import org.dromara.tender.domain.vo.BusBiddingPlanAnnexVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 招标计划-招标文件Mapper接口
*
* @author Lion Li
* @date 2025-08-21
*/
public interface BusBiddingPlanAnnexMapper extends BaseMapperPlus<BusBiddingPlanAnnex, BusBiddingPlanAnnexVo> {
}

View File

@ -0,0 +1,15 @@
package org.dromara.tender.mapper;
import org.dromara.tender.domain.BusBiddingPlan;
import org.dromara.tender.domain.vo.BusBiddingPlanVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 招标计划Mapper接口
*
* @author Lion Li
* @date 2025-08-21
*/
public interface BusBiddingPlanMapper extends BaseMapperPlus<BusBiddingPlan, BusBiddingPlanVo> {
}

View File

@ -0,0 +1,19 @@
package org.dromara.tender.mapper;
import org.apache.ibatis.annotations.Param;
import org.dromara.tender.domain.BusTenderPlanningLimitList;
import org.dromara.tender.domain.vo.BusTenderPlanningLimitListVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.math.BigDecimal;
/**
* 招标计划-限价一览Mapper接口
*
* @author Lion Li
* @date 2025-08-21
*/
public interface BusTenderPlanningLimitListMapper extends BaseMapperPlus<BusTenderPlanningLimitList, BusTenderPlanningLimitListVo> {
BigDecimal getLimitCoount(@Param("limitListId") Long limitListId);
}

View File

@ -0,0 +1,70 @@
package org.dromara.tender.service;
import org.dromara.tender.domain.vo.BusBiddingPlanAnnexVo;
import org.dromara.tender.domain.bo.BusBiddingPlanAnnexBo;
import org.dromara.tender.domain.BusBiddingPlanAnnex;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* 招标计划-招标文件Service接口
*
* @author Lion Li
* @date 2025-08-21
*/
public interface IBusBiddingPlanAnnexService extends IService<BusBiddingPlanAnnex>{
/**
* 查询招标计划-招标文件
*
* @param id 主键
* @return 招标计划-招标文件
*/
BusBiddingPlanAnnexVo queryById(Long id);
/**
* 分页查询招标计划-招标文件列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 招标计划-招标文件分页列表
*/
TableDataInfo<BusBiddingPlanAnnexVo> queryPageList(BusBiddingPlanAnnexBo bo, PageQuery pageQuery);
/**
* 查询符合条件的招标计划-招标文件列表
*
* @param bo 查询条件
* @return 招标计划-招标文件列表
*/
List<BusBiddingPlanAnnexVo> queryList(BusBiddingPlanAnnexBo bo);
/**
* 新增招标计划-招标文件
*
* @param bo 招标计划-招标文件
* @return 是否新增成功
*/
Boolean insertByBo(BusBiddingPlanAnnexBo bo);
/**
* 修改招标计划-招标文件
*
* @param bo 招标计划-招标文件
* @return 是否修改成功
*/
Boolean updateByBo(BusBiddingPlanAnnexBo bo);
/**
* 校验并批量删除招标计划-招标文件信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,91 @@
package org.dromara.tender.service;
import org.dromara.tender.domain.vo.BusBiddingPlanVo;
import org.dromara.tender.domain.bo.BusBiddingPlanBo;
import org.dromara.tender.domain.BusBiddingPlan;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo;
import org.springframework.web.multipart.MultipartFile;
import java.util.Collection;
import java.util.List;
/**
* 招标计划Service接口
*
* @author Lion Li
* @date 2025-08-21
*/
public interface IBusBiddingPlanService extends IService<BusBiddingPlan>{
/**
* 查询招标计划
*
* @param id 主键
* @return 招标计划
*/
BusBiddingPlanVo queryById(Long id);
/**
* 分页查询招标计划列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 招标计划分页列表
*/
TableDataInfo<BusBiddingPlanVo> queryPageList(BusBiddingPlanBo bo, PageQuery pageQuery);
/**
* 查询符合条件的招标计划列表
*
* @param bo 查询条件
* @return 招标计划列表
*/
List<BusBiddingPlanVo> queryList(BusBiddingPlanBo bo);
/**
* 新增招标计划
*
* @param bo 招标计划
* @return 是否新增成功
*/
Boolean insertByBo(BusBiddingPlanBo bo);
/**
* 修改招标计划
*
* @param bo 招标计划
* @param bidFile
* @return 是否修改成功
*/
Boolean updateByBo(BusBiddingPlanBo bo, MultipartFile bidFile);
/**
* 校验并批量删除招标计划信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
List<BusBillofquantitiesLimitListVo> getMore(BusBiddingPlanBo bo);
/**
* 上传招标文件
* @param bo
* @param files
* @return
*/
Boolean uploadBiddingDocuments(BusBiddingPlanBo bo, List<MultipartFile> files);
/**
* 修改状态
* @param bo
* @return
*/
Boolean editStatus(BusBiddingPlanBo bo);
}

View File

@ -0,0 +1,70 @@
package org.dromara.tender.service;
import org.dromara.tender.domain.vo.BusTenderPlanningLimitListVo;
import org.dromara.tender.domain.bo.BusTenderPlanningLimitListBo;
import org.dromara.tender.domain.BusTenderPlanningLimitList;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* 招标计划-限价一览Service接口
*
* @author Lion Li
* @date 2025-08-21
*/
public interface IBusTenderPlanningLimitListService extends IService<BusTenderPlanningLimitList>{
/**
* 查询招标计划-限价一览
*
* @param id 主键
* @return 招标计划-限价一览
*/
BusTenderPlanningLimitListVo queryById(Long id);
/**
* 分页查询招标计划-限价一览列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 招标计划-限价一览分页列表
*/
TableDataInfo<BusTenderPlanningLimitListVo> queryPageList(BusTenderPlanningLimitListBo bo, PageQuery pageQuery);
/**
* 查询符合条件的招标计划-限价一览列表
*
* @param bo 查询条件
* @return 招标计划-限价一览列表
*/
List<BusTenderPlanningLimitListVo> queryList(BusTenderPlanningLimitListBo bo);
/**
* 新增招标计划-限价一览
*
* @param bo 招标计划-限价一览
* @return 是否新增成功
*/
Boolean insertByBo(BusTenderPlanningLimitListBo bo);
/**
* 修改招标计划-限价一览
*
* @param bo 招标计划-限价一览
* @return 是否修改成功
*/
Boolean updateByBo(BusTenderPlanningLimitListBo bo);
/**
* 校验并批量删除招标计划-限价一览信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,133 @@
package org.dromara.tender.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.dromara.tender.domain.bo.BusBiddingPlanAnnexBo;
import org.dromara.tender.domain.vo.BusBiddingPlanAnnexVo;
import org.dromara.tender.domain.BusBiddingPlanAnnex;
import org.dromara.tender.mapper.BusBiddingPlanAnnexMapper;
import org.dromara.tender.service.IBusBiddingPlanAnnexService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 招标计划-招标文件Service业务层处理
*
* @author Lion Li
* @date 2025-08-21
*/
@RequiredArgsConstructor
@Service
public class BusBiddingPlanAnnexServiceImpl extends ServiceImpl<BusBiddingPlanAnnexMapper, BusBiddingPlanAnnex> implements IBusBiddingPlanAnnexService {
private final BusBiddingPlanAnnexMapper baseMapper;
/**
* 查询招标计划-招标文件
*
* @param id 主键
* @return 招标计划-招标文件
*/
@Override
public BusBiddingPlanAnnexVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询招标计划-招标文件列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 招标计划-招标文件分页列表
*/
@Override
public TableDataInfo<BusBiddingPlanAnnexVo> queryPageList(BusBiddingPlanAnnexBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<BusBiddingPlanAnnex> lqw = buildQueryWrapper(bo);
Page<BusBiddingPlanAnnexVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的招标计划-招标文件列表
*
* @param bo 查询条件
* @return 招标计划-招标文件列表
*/
@Override
public List<BusBiddingPlanAnnexVo> queryList(BusBiddingPlanAnnexBo bo) {
LambdaQueryWrapper<BusBiddingPlanAnnex> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<BusBiddingPlanAnnex> buildQueryWrapper(BusBiddingPlanAnnexBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<BusBiddingPlanAnnex> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(BusBiddingPlanAnnex::getId);
lqw.eq(bo.getBiddingPlanId() != null, BusBiddingPlanAnnex::getBiddingPlanId, bo.getBiddingPlanId());
lqw.eq(StringUtils.isNotBlank(bo.getUrl()), BusBiddingPlanAnnex::getUrl, bo.getUrl());
lqw.like(StringUtils.isNotBlank(bo.getName()), BusBiddingPlanAnnex::getName, bo.getName());
return lqw;
}
/**
* 新增招标计划-招标文件
*
* @param bo 招标计划-招标文件
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(BusBiddingPlanAnnexBo bo) {
BusBiddingPlanAnnex add = MapstructUtils.convert(bo, BusBiddingPlanAnnex.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改招标计划-招标文件
*
* @param bo 招标计划-招标文件
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(BusBiddingPlanAnnexBo bo) {
BusBiddingPlanAnnex update = MapstructUtils.convert(bo, BusBiddingPlanAnnex.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(BusBiddingPlanAnnex entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除招标计划-招标文件信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,313 @@
package org.dromara.tender.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.common.core.exception.ServiceException;
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.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.formalities.domain.BusFormalitiesAnnex;
import org.dromara.system.domain.vo.SysOssUploadVo;
import org.dromara.system.service.ISysOssService;
import org.dromara.tender.domain.BusBiddingPlanAnnex;
import org.dromara.tender.domain.BusTenderPlanningLimitList;
import org.dromara.tender.domain.bo.BusBiddingPlanAnnexBo;
import org.dromara.tender.domain.bo.BusTenderPlanningLimitListBo;
import org.dromara.tender.domain.vo.BusBiddingPlanAnnexVo;
import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo;
import org.dromara.tender.mapper.BusTenderPlanningLimitListMapper;
import org.dromara.tender.service.IBusBiddingPlanAnnexService;
import org.dromara.tender.service.IBusBillofquantitiesLimitListService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.dromara.tender.domain.bo.BusBiddingPlanBo;
import org.dromara.tender.domain.vo.BusBiddingPlanVo;
import org.dromara.tender.domain.BusBiddingPlan;
import org.dromara.tender.mapper.BusBiddingPlanMapper;
import org.dromara.tender.service.IBusBiddingPlanService;
import org.springframework.web.multipart.MultipartFile;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
import static org.dromara.common.constant.MinioPathConstant.FormalitiesAnnex;
/**
* 招标计划Service业务层处理
*
* @author Lion Li
* @date 2025-08-21
*/
@RequiredArgsConstructor
@Service
public class BusBiddingPlanServiceImpl extends ServiceImpl<BusBiddingPlanMapper, BusBiddingPlan> implements IBusBiddingPlanService {
private final BusBiddingPlanMapper baseMapper;
@Autowired
private BusTenderPlanningLimitListMapper busTenderPlanningLimitListMapper;
@Autowired
private IBusBillofquantitiesLimitListService busBillofquantitiesLimitListService;
@Autowired
private IBusBiddingPlanAnnexService busBiddingPlanAnnexService;
@Autowired
private ISysOssService ossService;
/**
* 查询招标计划
*
* @param id 主键
* @return 招标计划
*/
@Override
public BusBiddingPlanVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询招标计划列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 招标计划分页列表
*/
@Override
public TableDataInfo<BusBiddingPlanVo> queryPageList(BusBiddingPlanBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<BusBiddingPlan> lqw = buildQueryWrapper(bo);
Page<BusBiddingPlanVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的招标计划列表
*
* @param bo 查询条件
* @return 招标计划列表
*/
@Override
public List<BusBiddingPlanVo> queryList(BusBiddingPlanBo bo) {
LambdaQueryWrapper<BusBiddingPlan> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<BusBiddingPlan> buildQueryWrapper(BusBiddingPlanBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<BusBiddingPlan> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(BusBiddingPlan::getId);
lqw.eq(bo.getProjectId() != null, BusBiddingPlan::getProjectId, bo.getProjectId());
lqw.like(StringUtils.isNotBlank(bo.getDictName()), BusBiddingPlan::getDictName, bo.getDictName());
lqw.like(StringUtils.isNotBlank(bo.getName()), BusBiddingPlan::getName, bo.getName());
lqw.eq(bo.getPlannedBiddingTime() != null, BusBiddingPlan::getPlannedBiddingTime, bo.getPlannedBiddingTime());
lqw.eq(StringUtils.isNotBlank(bo.getPlannedBiddingMethod()), BusBiddingPlan::getPlannedBiddingMethod, bo.getPlannedBiddingMethod());
lqw.eq(bo.getPrice() != null, BusBiddingPlan::getPrice, bo.getPrice());
lqw.eq(bo.getContractPrice() != null, BusBiddingPlan::getContractPrice, bo.getContractPrice());
lqw.eq(StringUtils.isNotBlank(bo.getContent()), BusBiddingPlan::getContent, bo.getContent());
return lqw;
}
/**
* 新增招标计划
*
* @param bo 招标计划
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(BusBiddingPlanBo bo) {
BusBiddingPlan add = MapstructUtils.convert(bo, BusBiddingPlan.class);
validEntityBeforeSave(add);
BigDecimal price = BigDecimal.valueOf(0);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
if (bo.getLimitListBos() != null && !bo.getLimitListBos().isEmpty()) {
//生成分标策划-限价一览对象集合
List<BusTenderPlanningLimitList> planningLimitListList = new ArrayList<>();
for (BusTenderPlanningLimitListBo limitListBo : bo.getLimitListBos()) {
BusTenderPlanningLimitList busTenderPlanningLimitList = new BusTenderPlanningLimitList();
busTenderPlanningLimitList.setLimitListId(limitListBo.getLimitListId());
busTenderPlanningLimitList.setBiddingPlanId(bo.getId());
BigDecimal count = busTenderPlanningLimitListMapper.getLimitCoount(limitListBo.getLimitListId());
BusBillofquantitiesLimitListVo busBillofquantitiesLimitListVo = busBillofquantitiesLimitListService.queryById(limitListBo.getLimitListId());
if (busBillofquantitiesLimitListVo == null) {
throw new ServiceException("限价一览数据不存在");
}
if (busBillofquantitiesLimitListVo.getQuantity().compareTo(limitListBo.getNum().add(count !=null ? count: BigDecimal.valueOf(0))) < 0) {
throw new ServiceException(busBillofquantitiesLimitListVo.getName()+"数量超过了总数量");
}
price.add(busBillofquantitiesLimitListVo.getUnitPrice().multiply(limitListBo.getNum()));
busTenderPlanningLimitList.setNum(limitListBo.getNum());
planningLimitListList.add(busTenderPlanningLimitList);
}
add.setPlannedBiddingMethod(price.compareTo(BigDecimal.valueOf(10000000)) > 0 ? "公招":"邀标");
add.setPrice(price);
//批量新增
busTenderPlanningLimitListMapper.insertBatch(planningLimitListList);
baseMapper.updateById(add);
}
}
return flag;
}
/**
* 修改招标计划
*
* @param bo 招标计划
* @param bidFile
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(BusBiddingPlanBo bo, MultipartFile bidFile) {
if (bo.getStatus() == 1){
throw new ServiceException("数据已锁定,不允许继续上传附件");
}
BusBiddingPlan update = MapstructUtils.convert(bo, BusBiddingPlan.class);
BusBiddingPlanAnnexBo planAnnex = new BusBiddingPlanAnnexBo();
planAnnex.setBiddingPlanId(bo.getId());
List<BusBiddingPlanAnnexVo> planAnnexVoList = busBiddingPlanAnnexService.queryList(planAnnex);
if (planAnnexVoList != null && !planAnnexVoList.isEmpty() ) {
if (!bidFile.isEmpty()){
SysOssUploadVo wordEntity = ossService.uploadWithNoSave(bidFile, ossService.minioFileName(FormalitiesAnnex,bidFile));
update.setBidFile(wordEntity.getUrl());
update.setBidFileName(wordEntity.getFileName());
}
// if (!contractFile.isEmpty()){
// SysOssUploadVo wordEntity = ossService.uploadWithNoSave(contractFile, ossService.minioFileName(FormalitiesAnnex,contractFile));
// update.setContractFile(wordEntity.getUrl());
// update.setContractFileName(wordEntity.getFileName());
//
// }
if (bo.getContractPrice() != null && bo.getBidFile().isEmpty()){
throw new ServiceException("中标文件未上传");
}
if (bo.getWinningBidder() != null && bo.getBidFile().isEmpty()){
throw new ServiceException("中标单位不能为空");
}
}
// validEntityBeforeSave(update);
//todo 校验
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(BusBiddingPlan entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除招标计划信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
//删除子表数据
for (Long id : ids) {
busTenderPlanningLimitListMapper.delete(new LambdaQueryWrapper<BusTenderPlanningLimitList>()
.eq(BusTenderPlanningLimitList::getBiddingPlanId, id));
}
}
return baseMapper.deleteByIds(ids) > 0;
}
@Override
public List<BusBillofquantitiesLimitListVo> getMore(BusBiddingPlanBo bo) {
List<BusTenderPlanningLimitList> planningLimitListList = busTenderPlanningLimitListMapper.selectList(new LambdaQueryWrapper<BusTenderPlanningLimitList>()
.eq(BusTenderPlanningLimitList::getBiddingPlanId, bo.getId()));
List<Long> ids = new ArrayList<>();
for (BusTenderPlanningLimitList planningLimitList : planningLimitListList) {
ids.add(planningLimitList.getLimitListId());
}
List<BusBillofquantitiesLimitListVo> billofquantitiesLimitListList = busBillofquantitiesLimitListService.getListByIds(ids);
List<BusBillofquantitiesLimitListVo> list = billofquantitiesLimitListList.stream().distinct().collect(Collectors.toList());
for (BusBillofquantitiesLimitListVo limitList : list) {
for (BusTenderPlanningLimitList limitList1 : planningLimitListList) {
if (limitList.getId().equals(limitList1.getLimitListId())){
limitList.setQuantity(limitList1.getNum());
if (limitList.getUnitPrice() != null && limitList.getQuantity() != null) {
limitList.setPrice(limitList.getUnitPrice().multiply(limitList.getQuantity()).setScale(2, RoundingMode.HALF_UP));
}
break;
}
}
}
//构建父子映射
Map<String, List<BusBillofquantitiesLimitListVo>> parentMap = list.stream()
.collect(Collectors.groupingBy(BusBillofquantitiesLimitListVo::getPid));
//递归组装树形结构
return buildTree("0", parentMap);
}
@Override
public Boolean uploadBiddingDocuments(BusBiddingPlanBo bo, List<MultipartFile> files) {
if (bo.getStatus() == 1){
throw new ServiceException("数据已锁定,不允许继续上传附件");
}
List<BusBiddingPlanAnnex> annexArrayList = new ArrayList<>();
// 先判断数组是否为空或长度为0
if (files != null && !files.isEmpty()) {
// 遍历文件数组
for (MultipartFile file : files) {
// 处理单个文件前先判断是否为空文件isEmpty()
if (file.isEmpty()) {
System.out.println("跳过空文件");
continue;
}
SysOssUploadVo wordEntity = ossService.uploadWithNoSave(file, ossService.minioFileName(FormalitiesAnnex,file));
BusBiddingPlanAnnex formalitiesAnnex = new BusBiddingPlanAnnex();
formalitiesAnnex.setUrl(wordEntity.getUrl());
formalitiesAnnex.setName(wordEntity.getFileName());
formalitiesAnnex.setBiddingPlanId(bo.getId());
annexArrayList.add(formalitiesAnnex);
}
}
return busBiddingPlanAnnexService.saveBatch(annexArrayList);
}
@Override
public Boolean editStatus(BusBiddingPlanBo bo) {
BusBiddingPlan update = MapstructUtils.convert(bo, BusBiddingPlan.class);
return baseMapper.updateById(update) >0;
}
/**
* 递归构建树形结构
* @param parentId 父节点ID顶级节点为0
* @param parentMap 父子映射表key=pidvalue=子节点列表)
* @return 组装好的子树列表
*/
private List<BusBillofquantitiesLimitListVo> buildTree(String parentId, Map<String, List<BusBillofquantitiesLimitListVo>> parentMap) {
// 获取当前父节点的所有直接子节点
List<BusBillofquantitiesLimitListVo> children = parentMap.getOrDefault(parentId, Collections.emptyList());
if (children.isEmpty()) {
return Collections.emptyList();
}
// 为每个子节点递归设置其下一级子节点
for (BusBillofquantitiesLimitListVo child : children) {
// 递归查询当前子节点的子节点,设置为它的子树
List<BusBillofquantitiesLimitListVo> subChildren = buildTree(child.getSid(), parentMap);
// 注意需要在Vo中添加子节点列表字段用于存储子树
child.setChildren(subChildren);
}
return children;
}
}

View File

@ -87,6 +87,7 @@ public class BusBillofquantitiesLimitListServiceImpl extends ServiceImpl<BusBill
lqw.eq(StringUtils.isNotBlank(bo.getPid()), BusBillofquantitiesLimitList::getPid, bo.getPid());
lqw.eq(StringUtils.isNotBlank(bo.getNum()), BusBillofquantitiesLimitList::getNum, bo.getNum());
lqw.like(StringUtils.isNotBlank(bo.getName()), BusBillofquantitiesLimitList::getName, bo.getName());
lqw.eq(StringUtils.isNotBlank(bo.getType()), BusBillofquantitiesLimitList::getType, bo.getType());
lqw.eq(StringUtils.isNotBlank(bo.getSpecification()), BusBillofquantitiesLimitList::getSpecification, bo.getSpecification());
lqw.eq(StringUtils.isNotBlank(bo.getUnit()), BusBillofquantitiesLimitList::getUnit, bo.getUnit());
lqw.eq(bo.getQuantity() != null, BusBillofquantitiesLimitList::getQuantity, bo.getQuantity());
@ -171,6 +172,7 @@ public class BusBillofquantitiesLimitListServiceImpl extends ServiceImpl<BusBill
List<BusBillofquantitiesLimitList> busBillofquantitiesLimitLists = baseMapper.selectList(new LambdaQueryWrapper<BusBillofquantitiesLimitList>()
.select(BusBillofquantitiesLimitList::getVersions)
.eq(bo.getProjectId() != null, BusBillofquantitiesLimitList::getProjectId, bo.getProjectId())
.eq(StringUtils.isNotBlank(bo.getType()), BusBillofquantitiesLimitList::getType, bo.getType())
.orderByDesc(BusBillofquantitiesLimitList::getCreateTime)
.groupBy(BusBillofquantitiesLimitList::getVersions));
return busBillofquantitiesLimitLists.stream()
@ -184,6 +186,7 @@ public class BusBillofquantitiesLimitListServiceImpl extends ServiceImpl<BusBill
List<BusBillofquantitiesLimitList> busBillofquantitiesLimitLists = baseMapper.selectList(new LambdaQueryWrapper<BusBillofquantitiesLimitList>()
.select(BusBillofquantitiesLimitList::getSheet)
.eq(bo.getProjectId() != null, BusBillofquantitiesLimitList::getProjectId, bo.getProjectId())
.eq(StringUtils.isNotBlank(bo.getType()), BusBillofquantitiesLimitList::getType, bo.getType())
.eq(StringUtils.isNotBlank(bo.getVersions()), BusBillofquantitiesLimitList::getVersions, bo.getVersions())
.orderByAsc(BusBillofquantitiesLimitList::getSheet)
.groupBy(BusBillofquantitiesLimitList::getSheet));

View File

@ -0,0 +1,133 @@
package org.dromara.tender.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.dromara.tender.domain.bo.BusTenderPlanningLimitListBo;
import org.dromara.tender.domain.vo.BusTenderPlanningLimitListVo;
import org.dromara.tender.domain.BusTenderPlanningLimitList;
import org.dromara.tender.mapper.BusTenderPlanningLimitListMapper;
import org.dromara.tender.service.IBusTenderPlanningLimitListService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 招标计划-限价一览Service业务层处理
*
* @author Lion Li
* @date 2025-08-21
*/
@RequiredArgsConstructor
@Service
public class BusTenderPlanningLimitListServiceImpl extends ServiceImpl<BusTenderPlanningLimitListMapper, BusTenderPlanningLimitList> implements IBusTenderPlanningLimitListService {
private final BusTenderPlanningLimitListMapper baseMapper;
/**
* 查询招标计划-限价一览
*
* @param id 主键
* @return 招标计划-限价一览
*/
@Override
public BusTenderPlanningLimitListVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询招标计划-限价一览列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 招标计划-限价一览分页列表
*/
@Override
public TableDataInfo<BusTenderPlanningLimitListVo> queryPageList(BusTenderPlanningLimitListBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<BusTenderPlanningLimitList> lqw = buildQueryWrapper(bo);
Page<BusTenderPlanningLimitListVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的招标计划-限价一览列表
*
* @param bo 查询条件
* @return 招标计划-限价一览列表
*/
@Override
public List<BusTenderPlanningLimitListVo> queryList(BusTenderPlanningLimitListBo bo) {
LambdaQueryWrapper<BusTenderPlanningLimitList> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<BusTenderPlanningLimitList> buildQueryWrapper(BusTenderPlanningLimitListBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<BusTenderPlanningLimitList> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(BusTenderPlanningLimitList::getId);
lqw.eq(bo.getBiddingPlanId() != null, BusTenderPlanningLimitList::getBiddingPlanId, bo.getBiddingPlanId());
lqw.eq(bo.getLimitListId() != null, BusTenderPlanningLimitList::getLimitListId, bo.getLimitListId());
lqw.eq(bo.getNum() != null, BusTenderPlanningLimitList::getNum, bo.getNum());
return lqw;
}
/**
* 新增招标计划-限价一览
*
* @param bo 招标计划-限价一览
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(BusTenderPlanningLimitListBo bo) {
BusTenderPlanningLimitList add = MapstructUtils.convert(bo, BusTenderPlanningLimitList.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改招标计划-限价一览
*
* @param bo 招标计划-限价一览
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(BusTenderPlanningLimitListBo bo) {
BusTenderPlanningLimitList update = MapstructUtils.convert(bo, BusTenderPlanningLimitList.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(BusTenderPlanningLimitList entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除招标计划-限价一览信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.tender.mapper.BusBiddingPlanAnnexMapper">
</mapper>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.tender.mapper.BusBiddingPlanMapper">
</mapper>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.tender.mapper.BusTenderPlanningLimitListMapper">
<select id="getLimitCoount" resultType="java.math.BigDecimal">
SELECT CAST(
SUM( num ) AS DECIMAL ( 20, 2 )) as num
from bus_tender_planning_limit_list
where limit_list_id = #{limitListId}
</select>
</mapper>