feat(oa): 新增送货单和工艺卡插入功能

- 在 IOaDeliveryOrderService 和 IOaProcessCardService 接口中新增 insert 方法
- 在 OaDeliveryOrderBo 和 OaProcessCardBo 中增加明细列表字段
- 在 OaDeliveryOrderController 和 OaProcessCardController 中新增插入接口
- 实现事务管理,确保主表与明细表同时插入
- 添加参数校验及异常处理逻辑
- 使用批量插入提升明细数据存储效率
This commit is contained in:
2025-12-09 09:37:25 +08:00
parent 18cc98bc65
commit 930ba33f84
8 changed files with 110 additions and 0 deletions

View File

@@ -98,4 +98,12 @@ public class OaDeliveryOrderController extends BaseController {
@PathVariable Long[] orderIds) {
return toAjax(iOaDeliveryOrderService.deleteWithValidByIds(Arrays.asList(orderIds), true));
}
//新增一个插入主表和明细表的接口
@Log(title = "送货单主", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/insert")
public R<Void> insert(@Validated(AddGroup.class) @RequestBody OaDeliveryOrderBo bo) {
return toAjax(iOaDeliveryOrderService.insert(bo));
}
}

View File

@@ -98,4 +98,12 @@ public class OaProcessCardController extends BaseController {
@PathVariable Long[] cardIds) {
return toAjax(iOaProcessCardService.deleteWithValidByIds(Arrays.asList(cardIds), true));
}
//分别插入主表和明细表的接口
@Log(title = "工艺卡主", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/insertProcessCard")
public R<Void> insertProcessCard(@Validated(AddGroup.class) @RequestBody OaProcessCardBo bo) {
return toAjax(iOaProcessCardService.insertProcessCard(bo));
}
}

View File

@@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.util.Date;
import java.util.List;
import com.ruoyi.common.core.domain.BaseEntity;
@@ -111,5 +112,7 @@ public class OaDeliveryOrderBo extends BaseEntity {
*/
private String remark;
//明细
private List<OaDeliveryOrderDetailBo> detailList;
}

View File

@@ -9,6 +9,8 @@ import javax.validation.constraints.*;
import java.util.Date;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseEntity;
@@ -63,5 +65,7 @@ public class OaProcessCardBo extends BaseEntity {
*/
private String remark;
//工艺卡明细
private List<OaProcessCardDetailBo> oaProcessCardDetailList;
}

View File

@@ -46,4 +46,6 @@ public interface IOaDeliveryOrderService {
* 校验并批量删除送货单主信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
Boolean insert(OaDeliveryOrderBo bo);
}

View File

@@ -46,4 +46,6 @@ public interface IOaProcessCardService {
* 校验并批量删除工艺卡主信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
Boolean insertProcessCard(OaProcessCardBo bo);
}

View File

@@ -8,17 +8,24 @@ import com.ruoyi.common.core.domain.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 com.ruoyi.oa.domain.OaDeliveryOrderDetail;
import com.ruoyi.oa.domain.bo.OaDeliveryOrderDetailBo;
import com.ruoyi.oa.mapper.OaDeliveryOrderDetailMapper;
import com.ruoyi.oa.service.IOaDeliveryOrderDetailService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import com.ruoyi.oa.domain.bo.OaDeliveryOrderBo;
import com.ruoyi.oa.domain.vo.OaDeliveryOrderVo;
import com.ruoyi.oa.domain.OaDeliveryOrder;
import com.ruoyi.oa.mapper.OaDeliveryOrderMapper;
import com.ruoyi.oa.service.IOaDeliveryOrderService;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* 送货单主Service业务层处理
@@ -32,6 +39,8 @@ public class OaDeliveryOrderServiceImpl implements IOaDeliveryOrderService {
private final OaDeliveryOrderMapper baseMapper;
private final OaDeliveryOrderDetailMapper detailMapper;
/**
* 查询送货单主
*/
@@ -152,4 +161,40 @@ public class OaDeliveryOrderServiceImpl implements IOaDeliveryOrderService {
}
return baseMapper.deleteBatchIds(ids) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insert(OaDeliveryOrderBo bo) {
// 1. 参数校验
if (bo == null) {
throw new IllegalArgumentException("入参OaDeliveryOrderBo不能为空");
}
List<OaDeliveryOrderDetailBo> detailList = bo.getDetailList();
if (CollectionUtils.isEmpty(detailList)) {
throw new IllegalArgumentException("配送单明细列表不能为空");
}
// 2. 插入主表
OaDeliveryOrder entity = BeanUtil.toBean(bo, OaDeliveryOrder.class);
int mainResult = baseMapper.insert(entity);
if (mainResult <= 0) {
throw new RuntimeException("主表数据插入失败"); // 建议自定义业务异常
}
// 3. 批量插入明细表
List<OaDeliveryOrderDetail> detailEntityList = detailList.stream()
.map(detail -> {
OaDeliveryOrderDetail detailEntity = BeanUtil.toBean(detail, OaDeliveryOrderDetail.class);
detailEntity.setOrderId(entity.getOrderId());
return detailEntity;
})
.collect(Collectors.toList());
// 使用批量插入
boolean batchDetailResult = detailMapper.insertBatch(detailEntityList);
if (!batchDetailResult) {
throw new RuntimeException("明细表数据插入失败");
}
return true;
}
}

View File

@@ -8,17 +8,24 @@ import com.ruoyi.common.core.domain.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 com.ruoyi.oa.domain.OaProcessCardDetail;
import com.ruoyi.oa.domain.bo.OaProcessCardDetailBo;
import com.ruoyi.oa.mapper.OaProcessCardDetailMapper;
import com.ruoyi.oa.service.IOaProcessCardDetailService;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import com.ruoyi.oa.domain.bo.OaProcessCardBo;
import com.ruoyi.oa.domain.vo.OaProcessCardVo;
import com.ruoyi.oa.domain.OaProcessCard;
import com.ruoyi.oa.mapper.OaProcessCardMapper;
import com.ruoyi.oa.service.IOaProcessCardService;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* 工艺卡主Service业务层处理
@@ -32,6 +39,8 @@ public class OaProcessCardServiceImpl implements IOaProcessCardService {
private final OaProcessCardMapper baseMapper;
private final OaProcessCardDetailMapper oaProcessCardDetailMapper;
/**
* 查询工艺卡主
*/
@@ -132,4 +141,33 @@ public class OaProcessCardServiceImpl implements IOaProcessCardService {
}
return baseMapper.deleteBatchIds(ids) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertProcessCard(OaProcessCardBo bo) {
//先插入主表数据 带着判断
OaProcessCard add = BeanUtil.toBean(bo, OaProcessCard.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (!flag) {
throw new RuntimeException("主表数据插入失败");
}
List<OaProcessCardDetailBo> detailBoList = bo.getOaProcessCardDetailList();
//接着批量插入明细表数据
List<OaProcessCardDetail> detailEntities = detailBoList.stream()
.map(detailBo -> {
// 1. BO转Entity
OaProcessCardDetail detailEntity = BeanUtil.toBean(detailBo, OaProcessCardDetail.class);
// 2. 给Entity设置主表ID
detailEntity.setCardId(add.getCardId());
return detailEntity;
})
.collect(Collectors.toList());
flag = oaProcessCardDetailMapper.insertBatch(detailEntities);
if (!flag) {
throw new RuntimeException("明细表数据插入失败");
}
return flag;
}
}