feat(oms): 运输业务单新增反审核功能

审核通过后支持反审核,恢复订单到待审核状态以便修改
- 新增 /businessDocumentOrderApi/cancelAudit 接口
- 仅"审核通过(reviewStatus=1)"且未生成执行单的订单允许反审核
- 拆单主单反审核时级联清理生成的子单、子单地址及配送明细回填
This commit is contained in:
rcx
2026-08-13 17:20:41 +08:00
parent 802a2994cc
commit d5bdb5b419
5 changed files with 115 additions and 0 deletions
@@ -147,6 +147,14 @@ public class BusinessDocumentOrderApplicationService {
{
return businessDocumentOrderDomainService.audit(businessAuditDTO);
}
/**
* 业务单反审核
*/
public Boolean cancelAudit(BusinessAuditDTO businessAuditDTO)
{
return businessDocumentOrderDomainService.cancelAudit(businessAuditDTO);
}
public boolean execute(List<Long> ids) {
return businessDocumentOrderDomainService.execute(ids);
}
@@ -49,6 +49,11 @@ public interface IBusinessDocumentOrderService extends IService<BusinessDocument
public Boolean audit( List<Long> ids, Long reviewStatus, String SalesManager,String reviewOpinion);
/**
* 业务单反审核(将已审核订单恢复到待审核)
*/
public Boolean cancelAudit(List<Long> ids);
String selectByMakerCodeNc(String salesmanCodeNc);
String selectByMakerCodeNc1(String salesmanCodeNc);
@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mhd.common.core.domain.po.UserPo;
import com.mhd.common.core.utils.OrderSequence;
@@ -298,6 +299,88 @@ public class BusinessDocumentOrderImpl extends ServiceImpl<BusinessDocumentOrder
return null;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean cancelAudit(List<Long> ids) { // 取消审核 后端暂时未加鉴权
if (CollectionUtils.isEmpty(ids)) {
throw new ServiceException("未选择反审核的业务单");
}
for (Long id : ids) {
BusinessDocumentOrder order = businessDocumentOrderMapper.selectById(id);
if (ObjectUtil.isNull(order)) {
throw new ServiceException("未查询到业务单信息");
}
// 校验1:子单(splicingOrderType=3)不允许单独反审核,需对主单操作
if (order.getSplicingOrderType() != null && order.getSplicingOrderType() == 3L) {
throw new ServiceException("业务单【" + order.getGoodsNumber() + "】为子单,请对主单进行反审核");
}
// 校验2:仅"审核通过(reviewStatus=1)"可反审核
if (order.getReviewStatus() == null || order.getReviewStatus() != 1L) {
throw new ServiceException("业务单【" + order.getGoodsNumber() + "】非已审核状态,无法反审核");
}
// 校验3:已生成执行单的不允许反审核,需先取消执行
ExecuteOrder existExec = executeOrderMapper.selectOne(new LambdaQueryWrapper<ExecuteOrder>()
.eq(ExecuteOrder::getBusinessDocumentId, id)
.eq(ExecuteOrder::getDelFlag, 1).last("LIMIT 1"));
if (ObjectUtil.isNotNull(existExec)) {
throw new ServiceException("业务单【" + order.getGoodsNumber() + "】已生成执行单,请先取消执行");
}
boolean isMain = order.getSplicingOrderType() != null && order.getSplicingOrderType() == 4L;
// 拆单主单(isMain):清理审核时生成的子单、子单地址、以及回填到配送明细的 subOrderId
if (isMain) {
List<BusinessDocumentOrder> subOrders = businessDocumentOrderMapper.selectList(
new LambdaQueryWrapper<BusinessDocumentOrder>()
.eq(BusinessDocumentOrder::getMainOrderId, String.valueOf(id))
.eq(BusinessDocumentOrder::getDelFlag, 1));
if (subOrders != null && !subOrders.isEmpty()) {
List<String> subIdStrs = new ArrayList<>();
for (BusinessDocumentOrder sub : subOrders) {
// 校验4:子单若已生成执行单,主单不可反审核
ExecuteOrder subExec = executeOrderMapper.selectOne(new LambdaQueryWrapper<ExecuteOrder>()
.eq(ExecuteOrder::getBusinessDocumentId, sub.getId())
.eq(ExecuteOrder::getDelFlag, 1).last("LIMIT 1"));
if (ObjectUtil.isNotNull(subExec)) {
throw new ServiceException("子单【" + sub.getGoodsNumber() + "】已生成执行单,无法反审核主单");
}
subIdStrs.add(String.valueOf(sub.getId()));
// 逻辑删除子单(与 delete() 方法一致:delFlag 2)
sub.setDelFlag(2);
businessDocumentOrderMapper.updateById(sub);
}
// 逻辑删除子单的地址(审核时按 orderId=子单id 生成)
businessDocumentAddressMultiMapper.update(null,
new LambdaUpdateWrapper<BusinessDocumentAddressMulti>()
.in(BusinessDocumentAddressMulti::getOrderId, subIdStrs)
.set(BusinessDocumentAddressMulti::getDelFlag, 2));
// 清空审核时回填到 business_delivery_details_link.sub_order_id 的子单id
businessDeliveryDetailsLinkMapper.update(null,
new LambdaUpdateWrapper<BusinessDeliveryDetailsLink>()
.eq(BusinessDeliveryDetailsLink::getOrderId, id)
.isNotNull(BusinessDeliveryDetailsLink::getSubOrderId)
.set(BusinessDeliveryDetailsLink::getSubOrderId, null));
}
}
// 状态复位 + 清空审核信息(用 UpdateWrapper.set 确保 null 能写入;updateById 默认不更新 null)
LambdaUpdateWrapper<BusinessDocumentOrder> updateWrapper = new LambdaUpdateWrapper<BusinessDocumentOrder>()
.eq(BusinessDocumentOrder::getId, id)
.set(BusinessDocumentOrder::getReviewStatus, 0L) // 未审核
.set(BusinessDocumentOrder::getOrderStatus, 0L) // 待审核
.set(BusinessDocumentOrder::getExecuteStatus, 0L) // 无状态
.set(BusinessDocumentOrder::getReviewId, null)
.set(BusinessDocumentOrder::getReview, null)
.set(BusinessDocumentOrder::getReviewTime, null)
.set(BusinessDocumentOrder::getReviewOpinion, null)
.set(BusinessDocumentOrder::getSalesManager, null);
if (isMain) {
updateWrapper.set(BusinessDocumentOrder::getDeliveryProgress, null); // 清空主单拆单数
}
businessDocumentOrderMapper.update(null, updateWrapper);
}
return true;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean execute(List<Long> ids) {
@@ -932,6 +932,15 @@ public class BusinessDocumentOrderDomainService {
return businessDocumentOrderService.audit(businessAuditDTO.getIds(),businessAuditDTO.getReviewStatus(),businessAuditDTO.getSalesManager(),businessAuditDTO.getReviewOpinion());
}
/**
* 业务单反审核
*/
public Boolean cancelAudit(BusinessAuditDTO businessAuditDTO)
{
return businessDocumentOrderService.cancelAudit(businessAuditDTO.getIds());
}
public Boolean execute(List<Long> ids) {
return businessDocumentOrderService.execute(ids);
}
@@ -108,6 +108,16 @@ public class BusinessDocumentOrderApi extends BaseController{
return AjaxResult.success(businessDocumentOrderApplicationService.audit(businessAuditDTO));
}
/**
* 业务单反审核(将已审核订单恢复到待审核,便于修改)
*/
@ApiOperation("业务单反审核")
@PostMapping(value = "/cancelAudit")
public AjaxResult cancelAudit(@RequestBody BusinessAuditDTO businessAuditDTO)
{
return toAjax(businessDocumentOrderApplicationService.cancelAudit(businessAuditDTO));
}
/**
* 批量执行【业务单】
*/