wangzhuo 3 years ago
parent
commit
b33bc9379b
23 changed files with 1986 additions and 1 deletions
  1. 287 0
      blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/entity/Biding.java
  2. 118 0
      blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/entity/BidingAgent.java
  3. 193 0
      blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/entity/BidingItems.java
  4. 45 0
      blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/feign/IBidingDescClient.java
  5. 4 0
      blade-service/blade-check/src/main/java/org/springblade/check/controller/AuditProecessController.java
  6. 6 0
      blade-service/blade-check/src/main/java/org/springblade/check/service/IAuditProecessService.java
  7. 172 0
      blade-service/blade-check/src/main/java/org/springblade/check/service/impl/AuditProecessServiceImpl.java
  8. 19 1
      blade-service/blade-client/src/main/java/org/springblade/client/corps/controller/CorpsDescController.java
  9. 44 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/controller/BidingAgentController.java
  10. 70 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/controller/BidingItemsController.java
  11. 217 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/export/ExportBidingController.java
  12. 22 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/BidingAgentMapper.java
  13. 28 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/BidingAgentMapper.xml
  14. 21 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/BidingItemsMapper.java
  15. 30 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/BidingItemsMapper.xml
  16. 23 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/BidingMapper.java
  17. 59 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/BidingMapper.xml
  18. 21 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IBidingAgentService.java
  19. 36 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IBidingItemsService.java
  20. 83 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IBidingService.java
  21. 72 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/BidingAgentServiceImpl.java
  22. 93 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/BidingItemsServiceImpl.java
  23. 323 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/BidingServiceImpl.java

+ 287 - 0
blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/entity/Biding.java

@@ -0,0 +1,287 @@
+package org.springblade.purchase.sales.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 标书表实体类
+ *
+ * @author BladeX
+ */
+@Data
+@TableName("business_biding")
+@ApiModel(value = "Biding对象", description = "标书表")
+public class Biding implements Serializable {
+
+	private static final Long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@ApiModelProperty(value = "主键")
+	private Long id;
+
+	/**
+	 * 系统编号
+	 */
+	@ApiModelProperty(value = "系统编号")
+	private String sysNo;
+
+	/**
+	 * 租户
+	 */
+	@ApiModelProperty(value = "租户")
+	private String tenantId;
+
+	/**
+	 * 是否已删除(0否,1是)
+	 */
+	@ApiModelProperty(value = "是否已删除")
+	private Integer isDeleted;
+
+	/**
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人")
+	private Long createUser;
+
+	/**
+	 * 创建时间
+	 */
+	@ApiModelProperty(value = "创建时间")
+	private Date createTime;
+
+	/**
+	 * 创建部门
+	 */
+	@ApiModelProperty(value = "创建部门")
+	private Long createDept;
+
+	/**
+	 * 修改人
+	 */
+	@ApiModelProperty(value = "修改人")
+	private Long updateUser;
+
+	/**
+	 * 修改日期
+	 */
+	@ApiModelProperty(value = "修改日期")
+	private Date updateTime;
+
+	/**
+	 * 发布日期
+	 */
+	@ApiModelProperty(value = "发布日期")
+	private Date releaseTime;
+
+	/**
+	 * 截止时间
+	 */
+	@ApiModelProperty(value = "截止时间")
+	private Date deadlineTime;
+
+	/**
+	 * 合同号
+	 */
+	@ApiModelProperty(value = "合同号")
+	private String contractNo;
+
+	/**
+	 * 状态
+	 */
+	@ApiModelProperty(value = "状态")
+	private Integer status;
+
+	/**
+	 * 起运港
+	 */
+	@ApiModelProperty(value = "起运港")
+	private String departureHarbor;
+
+	/**
+	 * 目的港
+	 */
+	@ApiModelProperty(value = "目的港")
+	private String objectiveHarbor;
+
+	/**
+	 * 起运地
+	 */
+	@ApiModelProperty(value = "起运地")
+	private String departureLand;
+
+	/**
+	 * 目的地
+	 */
+	@ApiModelProperty(value = "目的地")
+	private String objectiveLand;
+
+	/**
+	 * 装柜日期
+	 */
+	@ApiModelProperty(value = "装柜日期")
+	private Date loadingTime;
+
+	/**
+	 * 是否直航(0否 1是)
+	 */
+	@ApiModelProperty(value = "是否直航")
+	private Integer directFlight;
+
+	/**
+	 * 转港
+	 */
+	@ApiModelProperty(value = "转港")
+	private String transshipment;
+
+	/**
+	 * 运输方式
+	 */
+	@ApiModelProperty(value = "运输方式")
+	private String transportType;
+
+	/**
+	 * 运输条款
+	 */
+	@ApiModelProperty(value = "运输条款")
+	private String transportClause;
+
+	/**
+	 * 件数
+	 */
+	@ApiModelProperty(value = "件数")
+	private BigDecimal number;
+
+	/**
+	 * 重量
+	 */
+	@ApiModelProperty(value = "重量")
+	private BigDecimal weight;
+
+	/**
+	 * 包装
+	 */
+	@ApiModelProperty(value = "包装")
+	private String packing;
+
+	/**
+	 * 尺码
+	 */
+	@ApiModelProperty(value = "尺码")
+	private BigDecimal size;
+
+	/**
+	 * 货物信息
+	 */
+	@ApiModelProperty(value = "货物信息")
+	private String cargoInformation;
+
+	/**
+	 * 备注
+	 */
+	@ApiModelProperty(value = "备注")
+	private String remark;
+
+	/**
+	 * 明细信息
+	 */
+	@TableField(exist = false)
+	private List<BidingItems> itemsList;
+
+	/**
+	 * 代理信息
+	 */
+	@TableField(exist = false)
+	private List<BidingAgent> agentList;
+
+	/**
+	 * 标书对比信息
+	 */
+	@TableField(exist = false)
+	private List<BidingItems> contrastList;
+
+	/**
+	 * 箱型箱量
+	 */
+	@ApiModelProperty(value = "箱型箱量")
+	private String boxTypeQuantity;
+
+	/**
+	 * 发布日期开始时间
+	 */
+	@TableField(exist = false)
+	private String releaseBeginTime;
+
+	/**
+	 * 发布日期结束时间
+	 */
+	@TableField(exist = false)
+	private String releaseEndTime;
+
+	/**
+	 * 截止日期开始时间
+	 */
+	@TableField(exist = false)
+	private String deadlineBeginTime;
+
+	/**
+	 * 截止日期结束时间
+	 */
+	@TableField(exist = false)
+	private String deadlineEndTime;
+
+	/**
+	 * 装柜日期开始时间
+	 */
+	@TableField(exist = false)
+	private String loadingBeginTime;
+
+	/**
+	 * 装柜日期结束时间
+	 */
+	@TableField(exist = false)
+	private String loadingEndTime;
+
+	/**
+	 * 制单时间开始时间
+	 */
+	@TableField(exist = false)
+	private String createBeginTime;
+
+	/**
+	 * 制单时间结束时间
+	 */
+	@TableField(exist = false)
+	private String createEndTime;
+
+	/**
+	 * 跳转对应页面的路由
+	 */
+	@TableField(exist = false)
+	private String url;
+	/**
+	 * 页面枚举
+	 */
+	@TableField(exist = false)
+	private String pageStatus;
+	/**
+	 * 页面名字
+	 */
+	@TableField(exist = false)
+	private String pageLabel;
+
+	/**
+	 * 客户id
+	 */
+	@TableField(exist = false)
+	private String corpId;
+}

+ 118 - 0
blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/entity/BidingAgent.java

@@ -0,0 +1,118 @@
+package org.springblade.purchase.sales.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 标书代理明细表实体类
+ *
+ * @author BladeX
+ */
+@Data
+@TableName("business_biding_agent")
+@ApiModel(value = "BidingAgent对象", description = "标书代理明细表")
+public class BidingAgent implements Serializable {
+
+	private static final Long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@ApiModelProperty(value = "主键")
+	private Long id;
+
+	/**
+	 * 主表主键
+	 */
+	@ApiModelProperty(value = "主表主键")
+	private Long pid;
+
+	/**
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人")
+	private Long createUser;
+
+	/**
+	 * 创建时间
+	 */
+	@ApiModelProperty(value = "创建时间")
+	private Date createTime;
+
+	/**
+	 * 创建部门
+	 */
+	@ApiModelProperty(value = "创建部门")
+	private Long createDept;
+
+	/**
+	 * 修改人
+	 */
+	@ApiModelProperty(value = "修改人")
+	private Long updateUser;
+
+	/**
+	 * 修改日期
+	 */
+	@ApiModelProperty(value = "修改日期")
+	private Date updateTime;
+
+	/**
+	 * 租户
+	 */
+	@ApiModelProperty(value = "租户")
+	private String tenantId;
+
+	/**
+	 * 是否已删除(1否,1是)
+	 */
+	@ApiModelProperty(value = "是否已删除")
+	private Integer isDeleted;
+
+	/**
+	 * 代理人id
+	 */
+	@ApiModelProperty(value = "代理人id")
+	private Long agentId;
+
+	/**
+	 * 名称
+	 */
+	@ApiModelProperty(value = "名称")
+	private String agentName;
+
+	/**
+	 * 联系人
+	 */
+	@ApiModelProperty(value = "联系人")
+	private String contacts;
+
+	/**
+	 * 邮箱
+	 */
+	@ApiModelProperty(value = "邮箱")
+	private String mailbox;
+
+	/**
+	 * 电话
+	 */
+	@ApiModelProperty(value = "电话")
+	private String phone;
+
+	/**
+	 * 状态
+	 */
+	@ApiModelProperty(value = "状态")
+	private Integer status;
+
+	/**
+	 * 备注
+	 */
+	@ApiModelProperty(value = "备注")
+	private String remark;
+}

+ 193 - 0
blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/entity/BidingItems.java

@@ -0,0 +1,193 @@
+package org.springblade.purchase.sales.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 标书表实体类
+ *
+ * @author BladeX
+ */
+
+@Data
+@TableName("business_biding_items")
+@ApiModel(value = "BidingItems对象", description = "标书明细表表")
+public class BidingItems implements Serializable {
+
+	private static final Long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@ApiModelProperty(value = "主键")
+	private Long id;
+
+	/**
+	 * 主表主键
+	 */
+	@ApiModelProperty(value = "主表主键")
+	private Long pid;
+
+	/**
+	 * 来源id
+	 */
+	@ApiModelProperty(value = "来源id")
+	private Long srcId;
+
+	/**
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人")
+	private Long createUser;
+
+	/**
+	 * 创建时间
+	 */
+	@ApiModelProperty(value = "创建时间")
+	private Date createTime;
+
+	/**
+	 * 创建部门
+	 */
+	@ApiModelProperty(value = "创建部门")
+	private Long createDept;
+
+	/**
+	 * 修改人
+	 */
+	@ApiModelProperty(value = "修改人")
+	private Long updateUser;
+
+	/**
+	 * 修改日期
+	 */
+	@ApiModelProperty(value = "修改日期")
+	private Date updateTime;
+
+	/**
+	 * 租户
+	 */
+	@ApiModelProperty(value = "租户")
+	private String tenantId;
+
+	/**
+	 * 是否已删除(1否,1是)
+	 */
+	@ApiModelProperty(value = "是否已删除")
+	private Integer isDeleted;
+
+	/**
+	 * 箱型
+	 */
+	@ApiModelProperty(value = "箱型")
+	private String boxType;
+
+	/**
+	 * 箱量
+	 */
+	@ApiModelProperty(value = "箱量")
+	private BigDecimal boxAmount;
+
+	/**
+	 * 海运费
+	 */
+	@ApiModelProperty(value = "海运费")
+	private BigDecimal seaFreight;
+
+	/**
+	 * 起运港箱使费
+	 */
+	@ApiModelProperty(value = "起运港箱使费")
+	private BigDecimal departureHarborFee;
+
+	/**
+	 * 目的港箱使费
+	 */
+	@ApiModelProperty(value = "目的港箱使费")
+	private BigDecimal objectiveHarborFee;
+
+	/**
+	 * 状态
+	 */
+	@ApiModelProperty(value = "状态")
+	private Integer status;
+
+	/**
+	 * 备注
+	 */
+	@ApiModelProperty(value = "备注")
+	private String remark;
+
+	/**
+	 * 名称
+	 */
+	@ApiModelProperty(value = "名称")
+	private String contrastName;
+
+	/**
+	 * 船公司
+	 */
+	@ApiModelProperty(value = "船公司")
+	private String shippingCompany;
+
+	/**
+	 * 船名
+	 */
+	@ApiModelProperty(value = "船名")
+	private String shipName;
+
+	/**
+	 * 区分明细(0明细信息,1标书对比)
+	 */
+	@ApiModelProperty(value = "区分明细")
+	private Integer distinguish;
+
+	/**
+	 * 起运港杂费
+	 */
+	@ApiModelProperty(value = "起运港杂费")
+	private BigDecimal departureHarborIncidental;
+
+	/**
+	 * 目的港杂费
+	 */
+	@ApiModelProperty(value = "目的港杂费")
+	private BigDecimal objectiveHarborIncidental;
+
+	/**
+	 * 截单日期
+	 */
+	@ApiModelProperty(value = "截单日期")
+	private Date cutOffTime;
+
+	/**
+	 * 截港日期
+	 */
+	@ApiModelProperty(value = "截港日期")
+	private Date harborInterceptionTime;
+
+	/**
+	 * 航程
+	 */
+	@ApiModelProperty(value = "航程")
+	private Integer voyage;
+
+	/**
+	 * 提单类型
+	 */
+	@ApiModelProperty(value = "提单类型")
+	private String billLadingType;
+
+	/**
+	 * 有效期
+	 */
+	@ApiModelProperty(value = "有效期")
+	private Date termValidity;
+
+}

+ 45 - 0
blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/feign/IBidingDescClient.java

@@ -0,0 +1,45 @@
+package org.springblade.purchase.sales.feign;
+
+import org.springblade.core.tool.api.R;
+import org.springblade.purchase.sales.entity.Biding;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * @author caifc
+ * @date 2021-10-21 22:28
+ */
+@FeignClient(
+	value = "blade-purchase-sales"
+)
+public interface IBidingDescClient {
+
+	@GetMapping("exportBiding/getById")
+	Biding getById(@RequestParam("id") Long id);
+
+	/**
+	 * 标书审核中
+	 * @param id
+	 * @return
+	 */
+	@PostMapping("exportBiding/underReview")
+	R underReview(@RequestParam("id") Long id);
+
+	/**
+	 * 标书订单审核通过
+	 * @param id
+	 * @return
+	 */
+	@PostMapping("/exportBiding/passCheck")
+	R passCheck(@RequestParam("id") Long id);
+
+	/**
+	 * 标书订单审核驳回
+	 * @param id
+	 * @return
+	 */
+	@PostMapping("/exportBiding/passCancel")
+	R passCancel(@RequestParam("id") Long id);
+}

+ 4 - 0
blade-service/blade-check/src/main/java/org/springblade/check/controller/AuditProecessController.java

@@ -239,6 +239,10 @@ public class AuditProecessController extends BladeController {
 		else if ("dldd".equals(proecess.getCheckType())) {
 			auditProecessService.agencyOrderProcess(auditProecess);
 		}
+		//标书订单审核
+		else if ("bsdd".equals(proecess.getCheckType())) {
+			auditProecessService.bidingCheck(auditProecess);
+		}
 		// 办公用品采购
 		else if ("ocg".equals(proecess.getCheckType()) || "oly".equals(proecess.getCheckType())) {
 			auditProecessService.officeCheck(auditProecess);

+ 6 - 0
blade-service/blade-check/src/main/java/org/springblade/check/service/IAuditProecessService.java

@@ -68,6 +68,12 @@ public interface IAuditProecessService extends IService<AuditProecess> {
 	void agencyOrderProcess(AuditProecess auditProecess);
 
 	/**
+	 * 标书订单审核
+	 * @param auditProecess
+	 */
+	void bidingCheck(AuditProecess auditProecess);
+
+	/**
 	 * 销售机会审批
 	 * @param auditProecess
 	 */

+ 172 - 0
blade-service/blade-check/src/main/java/org/springblade/check/service/impl/AuditProecessServiceImpl.java

@@ -53,7 +53,9 @@ import org.springblade.finance.vojo.Settlement;
 import org.springblade.project.entity.ServiceProject;
 import org.springblade.project.feign.IHandoverClient;
 import org.springblade.project.feign.IProjectClient;
+import org.springblade.purchase.sales.entity.Biding;
 import org.springblade.purchase.sales.entity.Order;
+import org.springblade.purchase.sales.feign.IBidingDescClient;
 import org.springblade.purchase.sales.feign.IOrderCheckClient;
 import org.springblade.school.feign.ISalaryClient;
 import org.springblade.system.feign.ISysClient;
@@ -116,6 +118,8 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, A
 
 	private final IFinancingClient financingClient;
 
+	private final IBidingDescClient bidingDescClient;//标书
+
 	@Override
 	public IPage<AuditProecessVO> selectAuditProecessPage(IPage<AuditProecessVO> page, AuditProecessVO auditProecess) {
 		return page.setRecords(baseMapper.selectAuditProecessPage(page, auditProecess));
@@ -1806,6 +1810,174 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, A
 	}
 
 	/**
+	 * 标书订单审核
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
+	public void bidingCheck(AuditProecess auditProecess) {
+		//查看最新操作记录,防止重复提交
+		AuditProecess proecessTemp = baseMapper.selectById(auditProecess.getId());
+		if (proecessTemp == null) {
+			throw new SecurityException("未查到此审批记录,禁止操作");
+		}
+		if ("A".equals(proecessTemp.getAuditStatus()) || "B".equals(proecessTemp.getAuditStatus())) {
+			throw new SecurityException("当前记录已经完成审批,禁止重复操作");
+		}
+
+		if (auditProecess.getAuditStatus() == null || !"S".equals(auditProecess.getAuditStatus())) {
+			throw new SecurityException("审批状态非待审,禁止操作");
+		}
+		//信息
+		Message sendMessage = new Message();
+		sendMessage.setParameter(String.valueOf(auditProecess.getBillId()));
+		sendMessage.setUserName(AuthUtil.getUserName());
+		sendMessage.setUserId(AuthUtil.getUserId());
+		sendMessage.setToUserId(auditProecess.getSendUserId());
+		sendMessage.setToUserName(auditProecess.getSendName());
+		sendMessage.setMessageType(1);
+		sendMessage.setTenantId(AuthUtil.getTenantId());
+		sendMessage.setCreateUser(AuthUtil.getUserId());
+		sendMessage.setCreateTime(new Date());
+		sendMessage.setUrl(auditProecess.getUrl());
+		sendMessage.setPageLabel(auditProecess.getPageLabel());
+		sendMessage.setPageStatus(auditProecess.getPageStatus());
+
+		//用户操作 1.通过  2.驳回
+		Integer operate = auditProecess.getOperate();
+		//查看当前审批是否为最后一级
+		String iffinalItem = auditProecess.getIffinalItem();
+		//审批人
+		auditProecess.setAuditUserId(String.valueOf(AuthUtil.getUserId()));
+		//审批时间
+		auditProecess.setAuditOpTime(new Date());
+		//不是最后一级
+		if ("F".equals(iffinalItem)) {
+
+			//通过
+			if (operate == 1) {
+				//如果是第一级, 则修改状态为审批中
+				if (auditProecess.getLevelId() == 1) {
+					R submit = bidingDescClient.underReview(auditProecess.getSrcBillId());
+					if (!submit.isSuccess()) {
+						throw new SecurityException("审批开始修改审核状态失败");
+					}
+				}
+
+				auditProecess.setAuditStatus("A");
+				//查询下一级,开启待审
+				LambdaQueryWrapper<AuditProecess> auditProecessLambdaQueryWrapper = new LambdaQueryWrapper<>();
+				auditProecessLambdaQueryWrapper
+					.eq(AuditProecess::getBatchNo, auditProecess.getBatchNo())
+					.eq(AuditProecess::getSrcBillId, auditProecess.getSrcBillId())
+					.eq(AuditProecess::getIsDelete, 0)
+					.eq(AuditProecess::getActId, auditProecess.getActId())
+					.eq(AuditProecess::getBillId, auditProecess.getBillId())
+					.eq(AuditProecess::getBillNo, auditProecess.getBillNo())
+					.eq(AuditProecess::getTenantId, AuthUtil.getTenantId())
+					.eq(AuditProecess::getLevelId, auditProecess.getLevelId() + 1);
+				Integer count = baseMapper.selectCount(auditProecessLambdaQueryWrapper);
+				if (count != null && count > 1) {
+					throw new SecurityException("审核失败,获取下一级信息失败");
+				}
+				AuditProecess proecess = baseMapper.selectOne(auditProecessLambdaQueryWrapper);
+				if (proecess == null) {
+					throw new SecurityException("审批通过=>获取下一级信息失败");
+				}
+				proecess.setAuditStatus("S");
+				baseMapper.updateById(proecess);
+
+				SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
+
+				//获得订单创建日期
+				String orderDate = null;
+				if (proecessTemp.getBillId() != null) {
+					Biding biding = bidingDescClient.getById(proecessTemp.getBillId());
+					if (biding != null) {
+						orderDate = simpleDateFormat.format(biding.getCreateTime());
+					}
+				}
+
+				Message message = new Message();
+				message.setUserName(AuthUtil.getUserName());
+				message.setUserId(AuthUtil.getUserId());
+				message.setParameter(String.valueOf(auditProecess.getBillId()));
+				message.setMessageType(1);
+				message.setTenantId(AuthUtil.getTenantId());
+				//标书模板
+				message.setMessageBody("您有标书订单审核,订单单号:" + "" + proecessTemp.getBillNo() + ","
+					+ "订单日期:" + orderDate + ",请审核。"
+					+ "提交人:" + proecessTemp.getSendName() + "  " + "提交时间" + simpleDateFormat.format(proecessTemp.getSendTime())
+				);
+
+				message.setCreateUser(AuthUtil.getUserId());
+				message.setUrl("/bidingDocument/issueTender/index");
+				message.setCreateTime(new Date());
+
+				// 消息批量通知下一级
+				sendMsgToGroup(message, proecess.getAuditUserId());
+			}
+			//不通过
+			else if (operate == 2) {
+				auditProecess.setAuditStatus("B");
+				//todo 调用feign取消
+				R r = bidingDescClient.passCancel(auditProecess.getSrcBillId());
+				if (!r.isSuccess()) {
+					throw new SecurityException("修改订单数据失败");
+				}
+
+				sendMessage.setMessageBody("您的标书订单审核未通过" + ",订单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
+				R save = messageClient.save(sendMessage);
+				if (!save.isSuccess()) {
+					throw new SecurityException("发送消息失败");
+				}
+			}
+
+		}
+		//是最后一级
+		else if ("T".equals(iffinalItem)) {
+			//通过
+			if (operate == 1) {
+				//todo 调用feign直接通过
+				auditProecess.setAuditStatus("A");
+				R r = bidingDescClient.passCheck(auditProecess.getSrcBillId());
+				if (!r.isSuccess()) {
+					throw new SecurityException("修改订单数据失败");
+				}
+
+				sendMessage.setMessageBody("您的标书订单审核已通过" + ",订单号:" + proecessTemp.getBillNo() + ",请继续操作");
+				R save = messageClient.save(sendMessage);
+				if (!save.isSuccess()) {
+					throw new SecurityException("发送消息失败");
+				}
+			}
+			//不通过
+			else if (operate == 2) {
+				//todo 调用feign取消
+				auditProecess.setAuditStatus("B");
+				R r = bidingDescClient.passCancel(auditProecess.getSrcBillId());
+				if (!r.isSuccess()) {
+					throw new SecurityException("修改订单数据失败");
+				}
+				sendMessage.setMessageBody("标书订单审核未通过" + ",订单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
+				R save = messageClient.save(sendMessage);
+				if (!save.isSuccess()) {
+					throw new SecurityException("发送消息失败");
+				}
+			}
+		} else {
+			throw new SecurityException("审批异常,请联系管理员");
+		}
+
+		cleanMsg(proecessTemp.getAuditUserId(), AuthUtil.getUserId(), proecessTemp.getSrcBillId());
+
+		//保存操作记录
+		auditProecess.setAuditMsg(auditProecess.getAuditMsg());
+		auditProecess.setAuditItem(new Date());
+		baseMapper.updateById(auditProecess);
+	}
+
+	/**
 	 * 销售机会审批
 	 *
 	 * @param auditProecess

+ 19 - 1
blade-service/blade-client/src/main/java/org/springblade/client/corps/controller/CorpsDescController.java

@@ -556,7 +556,7 @@ public class CorpsDescController extends BladeController {
 	}
 
 	/**
-	 * 客户信息
+	 * 车队信息
 	 */
 	@GetMapping("/fleetList")
 	@ApiOperationSupport(order = 2)
@@ -574,6 +574,24 @@ public class CorpsDescController extends BladeController {
 	}
 
 	/**
+	 * 客户信息
+	 */
+	@GetMapping("/bidingCorpsList")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "所有客户信息", notes = "获得客户信息")
+	public R<List<CorpsDesc>> bidingCorpsList(CorpsDescVO corpsDesc) {
+
+		LambdaQueryWrapper<CorpsDesc> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(CorpsDesc::getIsDeleted, 0);
+		lambdaQueryWrapper.eq(CorpsDesc::getTenantId, SecureUtil.getTenantId());
+		lambdaQueryWrapper.eq(CorpsDesc::getCorpType, "KH");
+
+		List<CorpsDesc> corpsDescList = corpsDescService.list(lambdaQueryWrapper);
+
+		return R.data(corpsDescList);
+	}
+
+	/**
 	 * 同步客户
 	 */
 	@PostMapping("/copy")

+ 44 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/controller/BidingAgentController.java

@@ -0,0 +1,44 @@
+package org.springblade.purchase.sales.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+import org.springblade.purchase.sales.entity.BidingAgent;
+import org.springblade.purchase.sales.service.IBidingAgentService;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+/**
+ * 代理信息表 控制器
+ *
+ * @author BladeX
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/bidingAgent")
+@Api(value = "代理信息表", tags = "代理信息接口")
+public class BidingAgentController extends BladeController {
+
+	private final IBidingAgentService bidingAgentService;
+
+	/**
+	 * 删除 代理信息表
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "删除", notes = "传入bidingAgent")
+	public R update(@Valid @RequestBody BidingAgent bidingAgent){
+		if (bidingAgent.getId() == null){
+			return R.fail(500, "请选择要删除的数据");
+		}
+		bidingAgent.setIsDeleted(1);
+		return R.status(bidingAgentService.updateById(bidingAgent));
+	}
+}

+ 70 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/controller/BidingItemsController.java

@@ -0,0 +1,70 @@
+package org.springblade.purchase.sales.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+import org.springblade.purchase.sales.entity.Biding;
+import org.springblade.purchase.sales.entity.BidingItems;
+import org.springblade.purchase.sales.service.IBidingItemsService;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 明细表 控制器
+ *
+ * @author BladeX
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/bidingItems")
+@Api(value = "明细表", tags = "明细表接口")
+public class BidingItemsController extends BladeController {
+
+	private final IBidingItemsService bidingItemsService;
+
+	/**
+	 * app投标
+	 */
+	@PostMapping("/appSubmit")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "app新增投标", notes = "传入biding")
+	public R submit(@Valid @RequestBody Biding biding){
+		List<BidingItems> itemsList = bidingItemsService.saveBidingItemsMessage(biding.getContrastList(), biding.getId(), 1);
+		biding.setContrastList(itemsList);
+		return R.data(biding);
+	}
+
+	/**
+	 * 删除 订单明细表
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "删除", notes = "传入bidingItems")
+	public R update(@Valid @RequestBody BidingItems bidingItems){
+		if (bidingItems.getId() == null){
+			return R.fail(500, "请选择要删除的数据");
+		}
+		bidingItems.setIsDeleted(1);
+		return R.status(bidingItemsService.updateById(bidingItems));
+	}
+
+	/**
+	 * 确认中标
+	 */
+	@PostMapping("/winningTheBid")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "确认中标", notes = "传入bidingItems")
+	public R winningTheBid(@Valid @RequestBody BidingItems bidingItems){
+		bidingItemsService.winningTheBid(bidingItems);
+		return R.success("操作成功");
+	}
+
+}

+ 217 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/export/ExportBidingController.java

@@ -0,0 +1,217 @@
+package org.springblade.purchase.sales.export;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.finance.vo.CostMessage;
+import org.springblade.purchase.sales.entity.Biding;
+import org.springblade.purchase.sales.entity.Order;
+import org.springblade.purchase.sales.service.IBidingAgentService;
+import org.springblade.purchase.sales.service.IBidingItemsService;
+import org.springblade.purchase.sales.service.IBidingService;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 出口标书控制器
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/exportBiding")
+@Api(value = "出口标书", tags = "出口标书")
+public class ExportBidingController extends BladeController {
+
+	//标书主表
+	private final IBidingService bidingService;
+	//标书明细
+	private final IBidingItemsService bidingItemsService;
+	//代理信息
+	private final IBidingAgentService bidingAgentService;
+
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入biding")
+	public R<Biding> detail(Biding biding){
+		biding.setTenantId(AuthUtil.getTenantId());
+		biding.setIsDeleted(0);
+		Biding detail = bidingService.getBidingMassage(biding);
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入biding")
+	public R<IPage<Biding>> bidingList(Biding biding, Query query){
+		biding.setTenantId(AuthUtil.getTenantId());
+		biding.setIsDeleted(0);
+		IPage<Biding> IPage = bidingService.page(Condition.getPage(query), Condition.getQueryWrapper(biding));
+		return R.data(IPage);
+	}
+
+	/**
+	 * 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "自定义分页", notes = "传入biding")
+	public R<IPage<Biding>> page(Query query, Biding biding){
+		LambdaQueryWrapper<Biding> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Biding::getTenantId, AuthUtil.getTenantId());
+		lambdaQueryWrapper.eq(Biding::getIsDeleted, 0);
+		lambdaQueryWrapper.between(StringUtil.isNotBlank(biding.getReleaseBeginTime()) && StringUtil.isNotBlank(biding.getReleaseEndTime()),
+			Biding::getReleaseTime, biding.getReleaseBeginTime(), biding.getReleaseEndTime());//发布日期
+		lambdaQueryWrapper.between(StringUtil.isNotBlank(biding.getDeadlineBeginTime()) && StringUtil.isNotBlank(biding.getDeadlineEndTime()),
+			Biding::getDeadlineTime, biding.getDeadlineBeginTime(), biding.getDeadlineEndTime());//截止时间
+		lambdaQueryWrapper.between(StringUtil.isNotBlank(biding.getLoadingBeginTime()) && StringUtil.isNotBlank(biding.getLoadingEndTime()),
+			Biding::getLoadingTime, biding.getLoadingBeginTime(), biding.getLoadingEndTime());//装柜时间
+		lambdaQueryWrapper.between(StringUtil.isNotBlank(biding.getCreateBeginTime()) && StringUtil.isNotBlank(biding.getCreateEndTime()),
+			Biding::getCreateTime, biding.getCreateBeginTime(), biding.getCreateEndTime());//制单时间
+		lambdaQueryWrapper.eq(StringUtil.isNotBlank(biding.getDepartureHarbor()), Biding::getDepartureHarbor, biding.getDepartureHarbor());//起运港
+		lambdaQueryWrapper.eq(StringUtil.isNotBlank(biding.getObjectiveHarbor()), Biding::getObjectiveHarbor, biding.getObjectiveHarbor());//目的港
+		lambdaQueryWrapper.eq(ObjectUtil.isNotEmpty(biding.getCreateUser()), Biding::getCreateUser, biding.getCreateUser());//制单人
+		lambdaQueryWrapper.eq(ObjectUtil.isNotEmpty(biding.getStatus()), Biding::getStatus, biding.getStatus());//状态
+		lambdaQueryWrapper.orderByDesc(Biding::getId);
+
+		IPage<Biding> iPage = bidingService.page(Condition.getPage(query), lambdaQueryWrapper);
+		return R.data(iPage);
+	}
+
+	/**
+	 * 新增标书
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入biding")
+	public R save(@Valid @RequestBody Biding biding){
+		return R.status(bidingService.save(biding));
+	}
+
+	/**
+	 * 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "新增或修改", notes = "传入biding")
+	public R submit(@Valid @RequestBody Biding biding){
+		return bidingService.saveBidingMessage(biding);
+	}
+
+	/**
+	 * 修改 删除
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "修改 删除", notes = "传入biding")
+	public R update(@Valid @RequestBody Biding biding){
+		if (biding.getId() == null){
+			throw new SecurityException("请选择要删除的数据");
+		}
+		biding.setIsDeleted(1);
+		bidingService.updateById(biding);
+		bidingItemsService.updateByPid(biding.getId());
+		bidingAgentService.updateByPid(biding.getId());
+		return R.success("操作成功");
+	}
+
+	/**
+	 * 发布
+	 */
+	@PostMapping("/release")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "发布", notes = "传入biding")
+	public R release(@Valid @RequestBody Biding biding){
+		bidingService.release(biding);
+		return R.success("发布成功");
+	}
+
+	/**
+	 * 作废
+	 */
+	@PostMapping("/invalid")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "作废", notes = "传入biding")
+	public R invalid(@Valid @RequestBody Biding biding){
+		bidingService.invalid(biding);
+		return R.success("作废成功");
+	}
+
+	/**
+	 * 请核
+	 */
+	@PostMapping("/checkBiding")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "请核", notes = "传入biding")
+	public R checkBiding(@RequestBody Biding biding){
+		bidingService.checkBiding(biding);
+		return R.success("操作成功");
+	}
+
+	/**
+	 * 审核通过
+	 */
+	@PostMapping("/passCheck")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "审核通过", notes = "传入id")
+	public R passCheck(@ApiParam(value = "主表id", required = true) @RequestParam Long id) {
+		bidingService.passCheck(id);
+		return R.success("审批通过");
+	}
+
+	/**
+	 * 审核中
+	 */
+	@PostMapping("/underReview")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "审核中", notes = "传入id")
+	public R underReview(@ApiParam(value = "主表id", required = true) @RequestParam Long id) {
+		bidingService.underReview(id);
+		return R.success("操作成功");
+	}
+
+	/**
+	 * 审核不通过
+	 */
+	@PostMapping("/passCancel")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "审核不通过", notes = "传入id")
+	public R passCancel(@ApiParam(value = "主表id", required = true) @RequestParam Long id) {
+		bidingService.passCancel(id);
+		return R.success("操作成功");
+	}
+
+	/**
+	 * app列表分页数据
+	 */
+	@GetMapping("/appPage")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "自定义分页", notes = "传入biding")
+	public R<IPage<Biding>> appPage(Query query, Biding biding){
+		IPage<Biding> iPage = bidingService.appPage(Condition.getPage(query), biding);
+		return R.data(iPage);
+	}
+
+	@GetMapping("/getById")
+	public Biding getById(Long id) {
+		return bidingService.getById(id);
+	}
+
+}

+ 22 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/BidingAgentMapper.java

@@ -0,0 +1,22 @@
+package org.springblade.purchase.sales.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.purchase.sales.entity.BidingAgent;
+import org.springblade.purchase.sales.entity.BidingItems;
+
+/**
+ * 标书代理信息表 Mapper 接口
+ *
+ * @author BladeX
+ */
+
+public interface BidingAgentMapper extends BaseMapper<BidingAgent> {
+
+	/**
+	 * 更新状态
+	 *
+	 * @param id
+	 */
+	void updateByPid(@Param("id") Long id);
+}

+ 28 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/BidingAgentMapper.xml

@@ -0,0 +1,28 @@
+<?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.springblade.purchase.sales.mapper.BidingAgentMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="bidingAgentResultMap" type="org.springblade.purchase.sales.entity.BidingAgent">
+        <id column="id" property="id"/>
+        <result column="pid" property="pid"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="tenant_id" property="tenantId"/>
+        <result column="agent_name" property="agentName"/>
+        <result column="contacts" property="contacts"/>
+        <result column="mailbox" property="mailbox"/>
+        <result column="phone" property="phone"/>
+        <result column="status" property="status"/>
+        <result column="remark" property="remark"/>
+    </resultMap>
+
+
+    <update id="updateByPid" parameterType="long">
+        UPDATE business_biding_agent SET is_deleted = '1' WHERE pid = #{id}
+    </update>
+</mapper>

+ 21 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/BidingItemsMapper.java

@@ -0,0 +1,21 @@
+package org.springblade.purchase.sales.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.purchase.sales.entity.BidingItems;
+
+/**
+ * 标书明细表 Mapper 接口
+ *
+ * @author BladeX
+ */
+
+public interface BidingItemsMapper extends BaseMapper<BidingItems> {
+
+	/**
+	 * 更新状态
+	 *
+	 * @param id
+	 */
+	void updateByPid(@Param("id") Long id);
+}

+ 30 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/BidingItemsMapper.xml

@@ -0,0 +1,30 @@
+<?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.springblade.purchase.sales.mapper.BidingItemsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="bidingItemsResultMap" type="org.springblade.purchase.sales.entity.BidingItems">
+        <id column="id" property="id"/>
+        <result column="pid" property="pid"/>
+        <result column="src_id" property="srcId"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="tenant_id" property="tenantId"/>
+        <result column="box_type" property="boxType"/>
+        <result column="box_amount" property="boxAmount"/>
+        <result column="sea_freight" property="seaFreight"/>
+        <result column="departure_harbor_fee" property="departureHarborFee"/>
+        <result column="objective_harbor_fee" property="objectiveHarborFee"/>
+        <result column="status" property="status"/>
+        <result column="remark" property="remark"/>
+    </resultMap>
+
+
+    <update id="updateByPid" parameterType="long">
+        UPDATE business_biding_items SET is_deleted = '1' WHERE pid = #{id}
+    </update>
+</mapper>

+ 23 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/BidingMapper.java

@@ -0,0 +1,23 @@
+package org.springblade.purchase.sales.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.purchase.sales.entity.Biding;
+
+import java.util.List;
+
+/**
+ * 标书表 Mapper 接口
+ *
+ * @author BladeX
+ */
+public interface BidingMapper extends BaseMapper<Biding> {
+
+	/**
+	 * app列表分页数据
+	 * @param biding
+	 * @return
+	 */
+	List<Biding> salaryBiding(@Param("biding") Biding biding, IPage page);
+}

+ 59 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/BidingMapper.xml

@@ -0,0 +1,59 @@
+<?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.springblade.purchase.sales.mapper.BidingMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="bidingResultMap" type="org.springblade.purchase.sales.entity.Biding">
+        <id column="id" property="id"/>
+        <result column="sys_no" property="sysNo"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="tenant_id" property="tenantId"/>
+        <result column="release_time" property="releaseTime"/>
+        <result column="deadline_time" property="deadlineTime"/>
+        <result column="contract_no" property="contractNo"/>
+        <result column="status" property="status"/>
+        <result column="departure_harbor" property="departureHarbor"/>
+        <result column="objective_harbor" property="objectiveHarbor"/>
+        <result column="departure_land" property="departureLand"/>
+        <result column="objective_land" property="objectiveLand"/>
+        <result column="loading_time" property="loadingTime"/>
+        <result column="direct_flight" property="directFlight"/>
+        <result column="transshipment" property="transshipment"/>
+        <result column="transport_type" property="transportType"/>
+        <result column="transport_clause" property="transportClause"/>
+        <result column="number" property="number"/>
+        <result column="weight" property="weight"/>
+        <result column="packing" property="packing"/>
+        <result column="size" property="size"/>
+        <result column="cargo_information" property="cargoInformation"/>
+        <result column="remark" property="remark"/>
+        <result column="box_type_quantity" property="boxTypeQuantity"/>
+    </resultMap>
+
+    <select id="salaryBiding" resultType="org.springblade.purchase.sales.entity.Biding">
+        SELECT
+            BB.id AS id,
+            BB.sys_no AS sysNo,
+            BB.release_time  AS releaseTime,
+            BB.deadline_time AS deadlineTime,
+            BB.loading_time AS loadingTime,
+            BB.departure_harbor AS departureHarbor,
+            BB.objective_harbor AS objectiveHarbor,
+            BB.cargo_information AS cargoInformation,
+            BB.box_type_quantity AS boxTypeQuantity,
+            BB.status AS status,
+            BCD.id as corpId
+        FROM business_biding BB
+        LEFT JOIN business_biding_agent BBA ON BBA.pid = BB.id
+        LEFT JOIN basic_corps_desc BCD ON BCD.id = BBA.agent_name
+        <where>
+            BB.is_deleted = 0
+            and BBA.is_deleted = 0
+        </where>
+    </select>
+</mapper>

+ 21 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IBidingAgentService.java

@@ -0,0 +1,21 @@
+package org.springblade.purchase.sales.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.purchase.sales.entity.BidingAgent;
+
+/**
+ * 标书代理信息 服务类
+ *
+ * @author BladeX
+ * @since 2023-09-07
+ */
+
+public interface IBidingAgentService extends IService<BidingAgent> {
+
+	/**
+	 * 更新状态
+	 *
+	 * @param id
+	 */
+	public void updateByPid(Long id);
+}

+ 36 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IBidingItemsService.java

@@ -0,0 +1,36 @@
+package org.springblade.purchase.sales.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.core.tool.api.R;
+import org.springblade.purchase.sales.entity.Biding;
+import org.springblade.purchase.sales.entity.BidingItems;
+
+import java.util.List;
+
+/**
+ * 标书明细 服务类
+ *
+ * @author BladeX
+ * @since 2023-09-07
+ */
+
+public interface IBidingItemsService extends IService<BidingItems> {
+
+	/**
+	 * 保存订单明细信息
+	 */
+	List<BidingItems> saveBidingItemsMessage(List<BidingItems> list, Long pid, Integer distinguish);
+
+	/**
+	 * 更新状态
+	 *
+	 * @param id
+	 */
+	void updateByPid(Long id);
+
+	/**
+	 * 确认中标
+	 */
+	void winningTheBid(BidingItems bidingItems);
+
+}

+ 83 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IBidingService.java

@@ -0,0 +1,83 @@
+package org.springblade.purchase.sales.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.core.tool.api.R;
+import org.springblade.finance.vo.CostMessage;
+import org.springblade.purchase.sales.entity.Biding;
+
+/**
+ * 标书 服务类
+ *
+ * @author BladeX
+ * @since 2023-09-07
+ */
+
+public interface IBidingService extends IService<Biding> {
+
+	/**
+	 * 获取标书详情
+	 *
+	 * @param biding
+	 * @return
+	 */
+	Biding getBidingMassage(Biding biding);
+
+	/**
+	 * app列表分页数据
+	 * @param biding
+	 * @return
+	 */
+	IPage<Biding> appPage(IPage<Biding> page, Biding biding);
+
+	/**
+	 * 新增或修改
+	 *
+	 * @param biding
+	 * @retirn
+	 */
+	R saveBidingMessage(Biding biding);
+
+	/**
+	 * 发布
+	 * @param biding
+	 * @return
+	 */
+	void release(Biding biding);
+
+	/**
+	 * 作废
+	 * @param biding
+	 * @return
+	 */
+	void invalid(Biding biding);
+
+	/**
+	 * 请核
+	 * @param biding
+	 * @return
+	 */
+	void checkBiding(Biding biding);
+
+	/**
+	 * 审批通过
+	 * @param id
+	 * @teturn
+	 */
+	void passCheck(Long id);
+
+	/**
+	 * 审批中
+	 * @param id
+	 * @teturn
+	 */
+	void underReview(Long id);
+
+	/**
+	 * 审核不通过
+	 * @param id
+	 * @teturn
+	 */
+	void passCancel(Long id);
+
+}

+ 72 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/BidingAgentServiceImpl.java

@@ -0,0 +1,72 @@
+package org.springblade.purchase.sales.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.AllArgsConstructor;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.purchase.sales.entity.Biding;
+import org.springblade.purchase.sales.entity.BidingAgent;
+import org.springblade.purchase.sales.entity.BidingItems;
+import org.springblade.purchase.sales.mapper.BidingAgentMapper;
+import org.springblade.purchase.sales.service.IBidingAgentService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 标书代理信息表 服务实现类
+ *
+ * @author BladeX
+ */
+
+@Service
+@AllArgsConstructor
+public class BidingAgentServiceImpl extends ServiceImpl<BidingAgentMapper, BidingAgent> implements IBidingAgentService {
+
+
+	/**
+	 * 保存订单明细信息
+	 *
+	 * @param list 订单明细
+	 * @param pid  订单主表id
+	 * @return
+	 */
+	public List<BidingAgent> saveBidingAgentMassage(List<BidingAgent> list, Long pid) {
+		list.forEach(item -> {
+			if (item.getId() == null){//id为空 新增
+				item.setTenantId(SecureUtil.getTenantId());
+				item.setCreateUser(SecureUtil.getUserId());
+				item.setCreateTime(new Date());
+				item.setPid(pid);
+				baseMapper.insert(item);
+			}else {//不为空 修改
+				item.setTenantId(SecureUtil.getTenantId());
+				item.setUpdateUser(SecureUtil.getUserId());
+				item.setUpdateTime(new Date());
+				item.setPid(pid);
+				baseMapper.updateById(item);
+			}
+		});
+		return list;
+	}
+
+	/**
+	 * 获得订单明细信息
+	 * @param biding
+	 * @return
+	 */
+	public List<BidingAgent> getBidingAgent(Biding biding){
+		List<BidingAgent> list = baseMapper.selectList(new LambdaQueryWrapper<BidingAgent>()
+			.eq(BidingAgent::getPid, biding.getId())
+			.eq(BidingAgent::getIsDeleted, 0)
+			.eq(BidingAgent::getTenantId, AuthUtil.getTenantId()));
+		return list;
+	}
+
+	@Override
+	public void updateByPid(Long id) {
+		baseMapper.updateByPid(id);
+	}
+}

+ 93 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/BidingItemsServiceImpl.java

@@ -0,0 +1,93 @@
+package org.springblade.purchase.sales.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.AllArgsConstructor;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.purchase.sales.entity.Biding;
+import org.springblade.purchase.sales.entity.BidingItems;
+import org.springblade.purchase.sales.mapper.BidingItemsMapper;
+import org.springblade.purchase.sales.service.IBidingItemsService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 标书明细表 服务实现类
+ *
+ * @author BladeX
+ * @since 2022-09-07
+ */
+
+@Service
+@AllArgsConstructor
+public class BidingItemsServiceImpl extends ServiceImpl<BidingItemsMapper, BidingItems> implements IBidingItemsService {
+
+
+	/**
+	 * 保存订单明细信息
+	 *
+	 * @param list 订单明细
+	 * @param pid  订单主表id
+	 * @param distinguish 区分标识
+	 * @return
+	 */
+	public List<BidingItems> saveBidingItemsMessage(List<BidingItems> list, Long pid, Integer distinguish){
+		list.forEach(item -> {
+			if (item.getId() == null){//id为空 新增
+				item.setTenantId(SecureUtil.getTenantId());
+				item.setCreateUser(SecureUtil.getUserId());
+				item.setCreateTime(new Date());
+				item.setDistinguish(distinguish);
+				if (distinguish == 1){
+					item.setStatus(5);
+				}
+				item.setPid(pid);
+				baseMapper.insert(item);
+			}else {//不为空 修改
+				item.setTenantId(SecureUtil.getTenantId());
+				item.setUpdateUser(SecureUtil.getUserId());
+				item.setUpdateTime(new Date());
+				item.setDistinguish(distinguish);
+				item.setPid(pid);
+				baseMapper.updateById(item);
+			}
+		});
+		return list;
+	}
+
+	/**
+	 * 获得订单明细信息
+	 * @param biding
+	 * @param distinguish 区分标识
+	 * @return
+	 */
+	public List<BidingItems> getBidingItems(Biding biding, Integer distinguish){
+		List<BidingItems> list = baseMapper.selectList(new LambdaQueryWrapper<BidingItems>()
+			.eq(BidingItems::getPid, biding.getId())
+			.eq(BidingItems::getDistinguish, distinguish)
+			.eq(BidingItems::getIsDeleted, 0)
+			.eq(BidingItems::getTenantId, AuthUtil.getTenantId()));
+		return list;
+	}
+
+	@Override
+	public void updateByPid(Long id) {
+		baseMapper.updateByPid(id);
+	}
+
+	/**
+	 * 确认中标
+	 */
+	@Override
+	public void winningTheBid(BidingItems bidingItems){
+		BidingItems items = baseMapper.selectById(bidingItems.getId());
+		if (items == null){
+			throw new SecurityException("数据异常");
+		}
+		items.setStatus(6);
+		baseMapper.updateById(items);
+	}
+}

+ 323 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/BidingServiceImpl.java

@@ -0,0 +1,323 @@
+package org.springblade.purchase.sales.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.seata.common.util.CollectionUtils;
+import io.seata.spring.annotation.GlobalTransactional;
+import lombok.AllArgsConstructor;
+import org.springblade.check.dto.AuditProecessDTO;
+import org.springblade.check.entity.AuditPathsActs;
+import org.springblade.check.entity.AuditPathsLevels;
+import org.springblade.check.feign.ICheckClient;
+import org.springblade.client.feign.ISerialClient;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.finance.vo.CostMessage;
+import org.springblade.purchase.sales.entity.Biding;
+import org.springblade.purchase.sales.entity.BidingAgent;
+import org.springblade.purchase.sales.entity.BidingItems;
+import org.springblade.purchase.sales.entity.Order;
+import org.springblade.purchase.sales.enums.OrderStatusEnum;
+import org.springblade.purchase.sales.mapper.BidingMapper;
+import org.springblade.purchase.sales.service.IBidingService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 标书表 服务实现类
+ *
+ * @author BladeX
+ * @since 2022-09-07
+ */
+@Service
+@AllArgsConstructor
+public class BidingServiceImpl extends ServiceImpl<BidingMapper, Biding> implements IBidingService {
+
+	private final BidingItemsServiceImpl bidingItemsService;//明细
+	private final BidingAgentServiceImpl bidingAgentService;//代理信息
+	private ISerialClient serialClient;//生成系统编号
+	private final ICheckClient iCheckClient;//审批
+
+	/**
+	 * 获得标书详情
+	 * @param biding
+	 * @return
+	 */
+	@Override
+	public Biding getBidingMassage(Biding biding) {
+		//获得主表信息
+		Biding bidingMassage = baseMapper.selectById(biding.getId());
+		if (bidingMassage == null){
+			throw new SecurityException("信息异常");
+		}
+
+		//根据主表id获得明细信息
+		List<BidingItems> bidingItemsList = bidingItemsService.getBidingItems(bidingMassage, 0);
+		bidingMassage.setItemsList(bidingItemsList);
+
+		//获得代理明细
+		List<BidingAgent> agentList = bidingAgentService.getBidingAgent(bidingMassage);
+		bidingMassage.setAgentList(agentList);
+
+		//获得标书对比明细
+		List<BidingItems> contrastList = bidingItemsService.getBidingItems(bidingMassage, 1);
+		bidingMassage.setContrastList(contrastList);
+
+		return bidingMassage;
+	}
+
+	/**
+	 * app列表分页数据
+	 * @param biding
+	 * @return
+	 */
+	@Override
+	public IPage<Biding> appPage(IPage<Biding> page, Biding biding){
+		List<Biding> list = baseMapper.salaryBiding(biding, page);
+		return page.setRecords(list);
+	}
+
+	/**
+	 * 新增或修改
+	 *
+	 * @param biding
+	 * @return
+	 */
+	@Override
+	@Transactional
+	public R saveBidingMessage(Biding biding) {
+		//校验合同号是否重复
+		if (biding.getId() == null && StringUtil.isNotBlank(biding.getContractNo())){//新增
+			LambdaQueryWrapper<Biding> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+			lambdaQueryWrapper
+				.eq(Biding::getTenantId, AuthUtil.getTenantId())
+				.eq(Biding::getIsDeleted, 0)
+				.eq(Biding::getContractNo, biding.getContractNo());
+			Integer count = baseMapper.selectCount(lambdaQueryWrapper);
+			if (count != null && count > 0) {
+				throw new SecurityException("合同号:" + biding.getContractNo() + "已存在,禁止重复添加");
+			}
+		}else {//编辑
+			LambdaQueryWrapper<Biding> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+			lambdaQueryWrapper
+				.ne(Biding::getId, biding.getId())
+				.eq(Biding::getTenantId, AuthUtil.getTenantId())
+				.eq(Biding::getIsDeleted, 0)
+				.eq(Biding::getContractNo, biding.getContractNo());
+			Integer count = baseMapper.selectCount(lambdaQueryWrapper);
+			if (count != null && count > 0) {
+				throw new SecurityException("合同号:" + biding.getContractNo() + "已存在,禁止重复添加");
+			}
+		}
+
+		//保存箱型箱量
+		StringBuilder boxTypeQuantity = new StringBuilder();
+		if (CollectionUtils.isNotEmpty(biding.getItemsList())){
+			biding.getItemsList().forEach(e -> {
+				if (StringUtil.isNotBlank(e.getBoxType())){
+					boxTypeQuantity.append(e.getBoxType()).append("*").append(e.getBoxAmount()).append(",");
+				}
+			});
+			biding.setBoxTypeQuantity(boxTypeQuantity.toString().substring(0, boxTypeQuantity.toString().length() - 1));
+		}
+
+		if (biding.getId() == null){//id为空代表新单据
+			//生成系统编号
+			R billNo = serialClient.getBillNo("BS", "BS", "BS");
+			if (billNo.getCode() != 200) {
+				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+				return R.fail(500, "生成系统编号失败");
+			}
+			biding.setSysNo((String) billNo.getData());
+			biding.setTenantId(SecureUtil.getTenantId());
+			biding.setCreateUser(AuthUtil.getUserId());
+			biding.setCreateTime(new Date());
+			baseMapper.insert(biding);
+		}else {//id不为空修改单据
+			biding.setTenantId(SecureUtil.getTenantId());
+			biding.setUpdateUser(AuthUtil.getUserId());
+			biding.setUpdateTime(new Date());
+			baseMapper.updateById(biding);
+		}
+
+		//保存明细
+		if (CollectionUtils.isNotEmpty(biding.getItemsList())){
+			List<BidingItems> list = bidingItemsService.saveBidingItemsMessage(biding.getItemsList(), biding.getId(), 0);
+			biding.setItemsList(list);
+		}else {
+			throw new SecurityException("明细为空");
+		}
+		//保存代理信息
+		if (CollectionUtils.isNotEmpty(biding.getAgentList())){
+			List<BidingAgent> list = bidingAgentService.saveBidingAgentMassage(biding.getAgentList(), biding.getId());
+			biding.setAgentList(list);
+		}else {
+			throw new SecurityException("代理信息为空");
+		}
+		//保存标书对比
+		if (CollectionUtils.isNotEmpty(biding.getContrastList()))
+		{
+			List<BidingItems> list = bidingItemsService.saveBidingItemsMessage(biding.getContrastList(), biding.getId(), 1);
+			biding.setContrastList(list);
+		}
+
+		return R.data(biding);
+	}
+
+	/**
+	 * 发布
+	 * @param biding
+	 * @return
+	 */
+	@Override
+	public void release(Biding biding){
+		Biding salesBiding = baseMapper.selectById(biding.getId());
+		if (salesBiding == null){
+			throw new SecurityException("发布失败,未找到单据");
+		}
+		if (salesBiding.getStatus() == 0){
+			throw new SecurityException("订单未请核");
+		}
+		if (salesBiding.getStatus() == 7){
+			throw new SecurityException("订单已作废");
+		}
+
+		salesBiding.setStatus(4);
+		baseMapper.updateById(salesBiding);
+	}
+
+	/**
+	 * 作废
+	 * @param biding
+	 * @return
+	 */
+	@Override
+	public void invalid(Biding biding){
+		Biding salesBiding = baseMapper.selectById(biding.getId());
+		if (salesBiding == null){
+			throw new SecurityException("作废失败,未找到单据");
+		}
+		salesBiding.setStatus(7);
+		baseMapper.updateById(salesBiding);
+	}
+
+	/**
+	 * 请核
+	 * @param biding
+	 * @return
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
+	public void checkBiding(Biding biding){
+		Biding salesBiding = baseMapper.selectById(biding.getId());
+		if (salesBiding.getStatus() == 1){
+			throw new SecurityException("订单已请核,请勿重复请核");
+		}
+		//生成平台审核数据
+		AuditPathsActs pathsActs = iCheckClient.getApprovalActId(15, "status",AuthUtil.getTenantId());
+		if (pathsActs == null || pathsActs.getIsEnable() == 2) {
+			throw new SecurityException("当前租户未查询到审批流配置");
+		} else {
+			//获取审批级次
+			List<AuditPathsLevels> auditPathsLevels = iCheckClient.listApproval(15, "status", AuthUtil.getTenantId());
+			if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(auditPathsLevels)) {
+				throw new SecurityException("开启审批失败:未查询到审批信息");
+			}
+			//修改订单信息
+			AuditProecessDTO auditProecessDTO = new AuditProecessDTO();
+			// 绑定审核类型
+			auditProecessDTO.setCheckType("bsdd");//代理订单
+			// 追加跳转路由url
+			auditProecessDTO.setUrl(biding.getUrl());
+			auditProecessDTO.setPageStatus(biding.getPageStatus());
+			auditProecessDTO.setPageLabel(biding.getPageLabel());
+			//增加审批类型
+			auditProecessDTO.setProcessType("标书审批");
+			auditProecessDTO.setOrderRemark(salesBiding.getRemark());//订单备注
+			auditProecessDTO.setPathsLevelsList(auditPathsLevels);
+			auditProecessDTO.setActId(1);
+			auditProecessDTO.setSrcBillId(salesBiding.getId());//申请表id
+			auditProecessDTO.setBillId(salesBiding.getId());//业务id
+			auditProecessDTO.setBillNo(salesBiding.getSysNo());//业务编号
+			auditProecessDTO.setSendUserId(AuthUtil.getUserId());//请核人id
+			auditProecessDTO.setSendName(AuthUtil.getUserName());//请核人名称
+			auditProecessDTO.setSendTime(new Date());//请核时间
+			auditProecessDTO.setTenantId(AuthUtil.getTenantId());//租户id
+			R financeProcess = iCheckClient.createFinanceProcess(auditProecessDTO);
+			if (!financeProcess.isSuccess()) {
+				throw new SecurityException("操作失败,请联系管理员");
+			}
+			Biding upBiding = new Biding();
+			upBiding.setId(salesBiding.getId());
+			upBiding.setStatus(5);
+			baseMapper.updateById(upBiding);
+		}
+	}
+
+	/**
+	 * 审核通过
+	 */
+	@Override
+	public void passCheck(Long id) {
+		LambdaQueryWrapper<Biding> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Biding::getId, id);
+		lambdaQueryWrapper.eq(Biding::getTenantId, AuthUtil.getTenantId());
+		lambdaQueryWrapper.eq(Biding::getIsDeleted, 0);
+		Biding biding = baseMapper.selectOne(lambdaQueryWrapper);
+		if (biding == null){
+			throw new SecurityException("审批通过失败");
+		}
+		if (biding.getStatus() == 3){
+			throw new SecurityException("订单已审批通过请勿重复审批");
+		}
+		biding.setStatus(3);
+		baseMapper.updateById(biding);
+	}
+
+	/**
+	 * 审批中
+	 */
+	@Override
+	public void underReview(Long id) {
+		LambdaQueryWrapper<Biding> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Biding::getId, id);
+		lambdaQueryWrapper.eq(Biding::getTenantId, AuthUtil.getTenantId());
+		lambdaQueryWrapper.eq(Biding::getIsDeleted, 0);
+		Biding biding = baseMapper.selectOne(lambdaQueryWrapper);
+		if (biding == null) {
+			throw new SecurityException("审批失败");
+		}
+		biding.setStatus(2);
+		baseMapper.updateById(biding);
+	}
+
+	/**
+	 * 审核不通过
+	 */
+	@Override
+	public void passCancel(Long id) {
+		LambdaQueryWrapper<Biding> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Biding::getId, id);
+		lambdaQueryWrapper.eq(Biding::getTenantId, AuthUtil.getTenantId());
+		lambdaQueryWrapper.eq(Biding::getIsDeleted, 0);
+		Biding biding = baseMapper.selectOne(lambdaQueryWrapper);
+		if (biding == null){
+			throw new SecurityException("审批驳回失败,未找到单据");
+		}
+		if (biding.getStatus() == 0){
+			throw new SecurityException("订单已驳回或未提交审批,请勿重复操作");
+		}
+		biding.setStatus(0);
+		baseMapper.updateById(biding);
+	}
+
+}