feat(eqp): 添加辅料库存变更功能

- 在控制器中新增 changeStock 接口用于处理辅料库存增减操作
- 实现库存变动业务逻辑,支持增加和减少两种操作类型
- 添加变动数量校验和库存充足性检查机制
- 集成事务管理确保库存更新和变动记录的一致性
- 新增变动记录日志功能记录每次库存变更详情
- 实现操作人信息自动获取和审计字段填充
- 完善参数校验和错误处理机制
This commit is contained in:
2026-01-04 13:46:19 +08:00
parent 7b2457c98f
commit aeecf4bcf7
3 changed files with 100 additions and 0 deletions

View File

@@ -96,4 +96,14 @@ public class EqpAuxiliaryMaterialChangeController extends BaseController {
@PathVariable Long[] changeIds) {
return toAjax(iEqpAuxiliaryMaterialChangeService.deleteWithValidByIds(Arrays.asList(changeIds), true));
}
/**
* 辅料库存变更接口(增加/减少库存)
* @param bo 辅料变动请求BO
* @return 操作结果
*/
@PostMapping("/changeStock")
public R<Void> changeStock(@RequestBody EqpAuxiliaryMaterialChangeBo bo) {
return iEqpAuxiliaryMaterialChangeService.changeStock(bo);
}
}

View File

@@ -1,5 +1,6 @@
package com.klp.mes.eqp.service;
import com.klp.common.core.domain.R;
import com.klp.mes.eqp.domain.EqpAuxiliaryMaterialChange;
import com.klp.mes.eqp.domain.vo.EqpAuxiliaryMaterialChangeVo;
import com.klp.mes.eqp.domain.bo.EqpAuxiliaryMaterialChangeBo;
@@ -46,4 +47,11 @@ public interface IEqpAuxiliaryMaterialChangeService {
* 校验并批量删除辅料变动记录信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 辅料库存变更(增加/减少)
* @param bo 辅料变动请求BO
* @return 操作结果
*/
R<Void> changeStock(EqpAuxiliaryMaterialChangeBo bo);
}

View File

@@ -1,12 +1,16 @@
package com.klp.mes.eqp.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.klp.common.core.domain.R;
import com.klp.common.core.page.TableDataInfo;
import com.klp.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.klp.common.helper.LoginHelper;
import com.klp.common.utils.StringUtils;
import com.klp.mes.eqp.domain.EqpAuxiliaryMaterial;
import com.klp.mes.eqp.mapper.EqpAuxiliaryMaterialMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.mes.eqp.domain.bo.EqpAuxiliaryMaterialChangeBo;
@@ -14,7 +18,9 @@ import com.klp.mes.eqp.domain.vo.EqpAuxiliaryMaterialChangeVo;
import com.klp.mes.eqp.domain.EqpAuxiliaryMaterialChange;
import com.klp.mes.eqp.mapper.EqpAuxiliaryMaterialChangeMapper;
import com.klp.mes.eqp.service.IEqpAuxiliaryMaterialChangeService;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Collection;
@@ -31,6 +37,8 @@ public class EqpAuxiliaryMaterialChangeServiceImpl implements IEqpAuxiliaryMater
private final EqpAuxiliaryMaterialChangeMapper baseMapper;
private final EqpAuxiliaryMaterialMapper eqpAuxiliaryMaterialMapper;
/**
* 查询辅料变动记录
*/
@@ -110,4 +118,78 @@ public class EqpAuxiliaryMaterialChangeServiceImpl implements IEqpAuxiliaryMater
}
return baseMapper.deleteBatchIds(ids) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public R<Void> changeStock(EqpAuxiliaryMaterialChangeBo bo) {
// 1. 基础参数校验基于EqpAuxiliaryMaterialChangeBo的字段
if (bo.getAuxiliaryId() == null) {
return R.fail("辅料ID不能为空");
}
if (bo.getChangeQuantity() == null || bo.getChangeQuantity() <= 0) {
return R.fail("变动数量必须为正整数");
}
if (StringUtils.isBlank(bo.getChangeType())) {
return R.fail("变动类型(增加/减少)不能为空");
}
// 校验变动类型合法性
if (!"增加".equals(bo.getChangeType()) && !"减少".equals(bo.getChangeType())) {
return R.fail("变动类型仅支持“增加”或“减少”");
}
// 2. 查询辅料信息
EqpAuxiliaryMaterial auxiliaryMaterial = eqpAuxiliaryMaterialMapper.selectById(bo.getAuxiliaryId());
if (auxiliaryMaterial == null) {
return R.fail("辅料不存在");
}
if ("2".equals(auxiliaryMaterial.getDelFlag())) {
return R.fail("辅料已删除,无法操作");
}
// 3. 库存变动逻辑
Long newQuantity; // 替换为Integer原表quantity是int
if ("减少".equals(bo.getChangeType())) {
// 减少库存时校验库存充足性
if (auxiliaryMaterial.getQuantity() < bo.getChangeQuantity()) {
return R.fail("库存不足,当前库存:" + auxiliaryMaterial.getQuantity() + ",需减少:" + bo.getChangeQuantity());
}
newQuantity = auxiliaryMaterial.getQuantity() - bo.getChangeQuantity();
} else {
// 增加库存直接累加
newQuantity = auxiliaryMaterial.getQuantity() + bo.getChangeQuantity();
}
// 4. 更新辅料库存(填充审计字段)
auxiliaryMaterial.setQuantity(newQuantity);
// 从上下文获取操作人(替换为你的登录助手类)
String operator = String.valueOf(LoginHelper.getUsername());
auxiliaryMaterial.setUpdateBy(operator);
auxiliaryMaterial.setUpdateTime(new Date());
boolean updateSuccess = eqpAuxiliaryMaterialMapper.updateById(auxiliaryMaterial) > 0;
if (!updateSuccess) {
return R.fail("库存更新失败");
}
// 5. 插入变动记录基于EqpAuxiliaryMaterialChangeBo转换
EqpAuxiliaryMaterialChange changeLog = new EqpAuxiliaryMaterialChange();
// 从Bo复制核心字段
changeLog.setAuxiliaryId(bo.getAuxiliaryId());
changeLog.setChangeType(bo.getChangeType());
changeLog.setChangeQuantity(bo.getChangeQuantity());
changeLog.setReason(bo.getReason()); // 变动原因
changeLog.setRemark(bo.getRemark()); // 备注
// 补充审计字段
changeLog.setChangeTime(new Date());
changeLog.setCreateBy(operator);
changeLog.setUpdateBy(operator);
changeLog.setDelFlag("0"); // 未删除
// 插入变动记录
int insertCount = baseMapper.insert(changeLog);
if (insertCount <= 0) {
return R.fail("变动记录插入失败");
}
return R.ok("库存变动成功,新库存:" + newQuantity);
}
}