feat:入库、批量入库

This commit is contained in:
禁止呵呵
2025-12-09 09:29:14 +08:00
parent f2571944c1
commit c1b975cca0
16 changed files with 244 additions and 15 deletions

View File

@@ -26,18 +26,20 @@ import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.common.pojo.CommonResult;
import com.zt.plat.framework.common.util.object.BeanUtils;
import static com.zt.plat.framework.common.pojo.CommonResult.success;
import static com.zt.plat.framework.common.pojo.CommonResult.error;
import com.zt.plat.framework.excel.core.util.ExcelUtils;
import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog;
import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.*;
import static com.zt.plat.module.qms.enums.ErrorCodeConstants.MATERIAL_BATCH_ASSIGN_NOT_EXISTS;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialBatchAssignDO;
import com.zt.plat.module.qms.resource.material.service.MaterialBatchAssignService;
@Tag(name = "管理后台 - 物料批次分发")
@RestController
@RequestMapping("/qms/material-batch-assign")
@RequestMapping("/qms/resource/material-batch-assign")
@Validated
@FileUploadController(source = "qms.materialbatchassign")
public class MaterialBatchAssignController extends AbstractFileUploadController implements BusinessControllerMarker{
@@ -94,6 +96,21 @@ public class MaterialBatchAssignController extends AbstractFileUploadController
return success(BeanUtils.toBean(materialBatchAssign, MaterialBatchAssignRespVO.class));
}
@GetMapping("/get-by-inf")
@Operation(summary = "获得物料批次分发")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
// @PreAuthorize("@ss.hasPermission('qms:material-batch-assign:query')")
public CommonResult<PageResult<MaterialBatchAssignRespVO>> getMaterialBatchAssignByInfiId(MaterialBatchAssignPageReqVO pageReqVO) {
if(pageReqVO.getMaterialInfomationId()==null||pageReqVO.getMaterialInfomationId().length()==0){
return error(MATERIAL_BATCH_ASSIGN_NOT_EXISTS,"示例编号不能为空");
}
PageResult<MaterialBatchAssignDO> pageResult = materialBatchAssignService.getMaterialBatchAssignByInfId(pageReqVO);
return success(BeanUtils.toBean(pageResult, MaterialBatchAssignRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得物料批次分发分页")
@PreAuthorize("@ss.hasPermission('qms:material-batch-assign:query')")

View File

@@ -1,8 +1,7 @@
package com.zt.plat.module.qms.resource.material.controller.admin;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchPageReqVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchRespVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchSaveReqVO;
import com.zt.plat.module.qms.resource.material.controller.vo.*;
import com.zt.plat.module.qms.resource.material.service.MaterialBatchAssignService;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@@ -37,11 +36,14 @@ import com.zt.plat.module.qms.resource.material.service.MaterialBatchService;
@Tag(name = "管理后台 - 物料批次")
@RestController
@RequestMapping("/qms/material-batch")
@RequestMapping("/qms/resource/material-batch")
@Validated
@FileUploadController(source = "qms.materialbatch")
public class MaterialBatchController extends AbstractFileUploadController implements BusinessControllerMarker{
@Resource
private MaterialBatchAssignService materialBatchAssignService;
static {
FileUploadController annotation = MaterialBatchController.class.getAnnotation(FileUploadController.class);
if (annotation != null) {
@@ -115,4 +117,10 @@ public class MaterialBatchController extends AbstractFileUploadController implem
BeanUtils.toBean(list, MaterialBatchRespVO.class));
}
@PostMapping("/assign")
@Operation(summary = "物料分发")
public CommonResult<MaterialBatchAssignRespVO> assign(@Valid @RequestBody MaterialBatchAssignSaveReqVO createReqVO) {
return success(materialBatchAssignService.assignLab(createReqVO));
}
}

View File

@@ -3,6 +3,7 @@ package com.zt.plat.module.qms.resource.material.controller.admin;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryInboundPageReqVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryInboundRespVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryInboundSaveReqVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialProductRespVO;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@@ -37,7 +38,7 @@ import com.zt.plat.module.qms.resource.material.service.MaterialInventoryInbound
@Tag(name = "管理后台 - 入库")
@RestController
@RequestMapping("/qms/material-inventory-inbound")
@RequestMapping("/qms/resource/material-inventory-inbound")
@Validated
@FileUploadController(source = "qms.materialinventoryinbound")
public class MaterialInventoryInboundController extends AbstractFileUploadController implements BusinessControllerMarker{
@@ -115,4 +116,16 @@ public class MaterialInventoryInboundController extends AbstractFileUploadContro
BeanUtils.toBean(list, MaterialInventoryInboundRespVO.class));
}
@PostMapping("/multi-put")
@Operation(summary = "批量上架")
public CommonResult<PageResult<MaterialInventoryInboundRespVO>> createMaterialInventoryInboundMulti(@Valid @RequestBody MaterialInventoryInboundSaveReqVO createReqVO) {
return success(materialInventoryInboundService.multiCreateMaterialInventoryInbound(createReqVO));
}
@PostMapping("single-put")
@Operation(summary = "单一上架")
public CommonResult<PageResult<MaterialInventoryInboundRespVO>> createMaterialInventoryInboundSingle(@Valid @RequestBody MaterialInventoryInboundSaveReqVO createReqVO) {
return success(materialInventoryInboundService.singleCreateMaterialInventoryInbound(createReqVO));
}
}

View File

@@ -37,4 +37,7 @@ public class MaterialBatchAssignPageReqVO extends PageParam {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "实例ID")
private String materialInfomationId;
}

View File

@@ -10,13 +10,13 @@ public class MaterialBatchAssignSaveReqVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15114")
private Long id;
@Schema(description = "源批次ID", example = "23099")
@Schema(description = "源批次ID",requiredMode = Schema.RequiredMode.REQUIRED, example = "23099")
private Long batchId;
@Schema(description = "产品id", example = "10774")
private String productId;
@Schema(description = "库房ID", example = "24720")
@Schema(description = "库房ID",requiredMode = Schema.RequiredMode.REQUIRED, example = "24720")
private Long warehouseId;
@Schema(description = "数量")

View File

@@ -78,5 +78,8 @@ public class MaterialInfomationPageReqVO extends PageParam {
@Schema(description = "大类ids")
List<Long> productIds;
@Schema(description = "入库id")
private long inventoryInboundId;
}

View File

@@ -1,5 +1,6 @@
package com.zt.plat.module.qms.resource.material.controller.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
@@ -45,4 +46,19 @@ public class MaterialInventoryInboundDetailSaveReqVO {
@Schema(description = "备注")
private String remark;
@Schema(description = "申请数量")
private Long quantity;
/**
* 存放位置
*/
@TableField("LOC_ID")
private String locationId;
/**
* 物料大类id
*/
@TableField("PDT_ID")
private Long productId;
}

View File

@@ -1,5 +1,6 @@
package com.zt.plat.module.qms.resource.material.controller.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
@@ -51,4 +52,8 @@ public class MaterialInventoryInboundSaveReqVO {
@Schema(description = "备注")
private String remark;
@Schema(description = "详情",requiredMode = Schema.RequiredMode.REQUIRED)
private MaterialInventoryInboundDetailSaveReqVO detail;
}

View File

@@ -47,7 +47,7 @@ public class MaterialBatchAssignDO extends BusinessBaseDO {
* 数量
*/
@TableField("INB_QTY")
private String inboundQuantity;
private Long inboundQuantity;
/**
* 暂存位置记录
*/
@@ -64,4 +64,6 @@ public class MaterialBatchAssignDO extends BusinessBaseDO {
@TableField("RMK")
private String remark;
}

View File

@@ -121,4 +121,9 @@ public class MaterialInfomationDO extends BusinessBaseDO {
@TableField("RMK")
private String remark;
/**
* 库存入库id
*/
@TableField("INVT_INB_ID")
private long inventoryInboundId;
}

View File

@@ -28,4 +28,10 @@ public interface MaterialBatchAssignMapper extends BaseMapperX<MaterialBatchAssi
.orderByDesc(MaterialBatchAssignDO::getId));
}
// default PageResult<MaterialBatchAssignDO> selectByInfId(MaterialBatchAssignPageReqVO reqVO) {
// return selectPage(reqVO, new LambdaQueryWrapperX<MaterialBatchAssignDO>()
// .eqIfPresent(MaterialBatchAssignDO::getMaterialInfomationId, reqVO.getMaterialInfomationId())
// .orderByDesc(MaterialBatchAssignDO::getCreateTime));
// }
}

View File

@@ -41,4 +41,12 @@ public interface MaterialInfomationMapper extends BaseMapperX<MaterialInfomation
.orderByDesc(MaterialInfomationDO::getId));
}
default PageResult<MaterialInfomationDO> selectAll(MaterialInfomationPageReqVO reqVO) {
reqVO.setPageSize(-1);
return selectPage(reqVO, new LambdaQueryWrapperX<MaterialInfomationDO>()
.eq(MaterialInfomationDO::getInventoryInboundId, reqVO.getInventoryInboundId()
)
);
}
}

View File

@@ -53,6 +53,14 @@ public interface MaterialBatchAssignService {
*/
MaterialBatchAssignDO getMaterialBatchAssign(Long id);
/**
* 用物料实例Id获得物料批次
*
* @param pageReqVO 分页查询
* @return 物料批次分发
*/
public PageResult<MaterialBatchAssignDO> getMaterialBatchAssignByInfId(MaterialBatchAssignPageReqVO pageReqVO);
/**
* 获得物料批次分发分页
*
@@ -61,4 +69,12 @@ public interface MaterialBatchAssignService {
*/
PageResult<MaterialBatchAssignDO> getMaterialBatchAssignPage(MaterialBatchAssignPageReqVO pageReqVO);
/**
* 分发到实验室
* @param createReqVO
* @return
*/
MaterialBatchAssignRespVO assignLab(@Valid MaterialBatchAssignSaveReqVO createReqVO);
}

View File

@@ -1,9 +1,11 @@
package com.zt.plat.module.qms.resource.material.service;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchAssignPageReqVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchAssignRespVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchAssignSaveReqVO;
import jakarta.validation.Valid;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@@ -84,9 +86,24 @@ public class MaterialBatchAssignServiceImpl implements MaterialBatchAssignServic
return materialBatchAssignMapper.selectById(id);
}
@Override
public PageResult<MaterialBatchAssignDO> getMaterialBatchAssignByInfId(MaterialBatchAssignPageReqVO pageReqVO){
return materialBatchAssignMapper.selectPage(pageReqVO);
}
@Override
public PageResult<MaterialBatchAssignDO> getMaterialBatchAssignPage(MaterialBatchAssignPageReqVO pageReqVO) {
return materialBatchAssignMapper.selectPage(pageReqVO);
}
@Override
public MaterialBatchAssignRespVO assignLab(MaterialBatchAssignSaveReqVO createReqVO){
// 插入
MaterialBatchAssignDO materialBatchAssign = BeanUtils.toBean(createReqVO, MaterialBatchAssignDO.class);
materialBatchAssignMapper.insert(materialBatchAssign);
// 返回
return BeanUtils.toBean(materialBatchAssign, MaterialBatchAssignRespVO.class);
}
}

View File

@@ -61,4 +61,18 @@ public interface MaterialInventoryInboundService {
*/
PageResult<MaterialInventoryInboundDO> getMaterialInventoryInboundPage(MaterialInventoryInboundPageReqVO pageReqVO);
/***
* 批量入库/上架
* @param createReqVO
* @return
*/
PageResult<MaterialInventoryInboundRespVO>multiCreateMaterialInventoryInbound(MaterialInventoryInboundSaveReqVO createReqVO);
/**
* 单个入库/上架
*/
PageResult<MaterialInventoryInboundRespVO>singleCreateMaterialInventoryInbound(MaterialInventoryInboundSaveReqVO createReqVO);
}

View File

@@ -1,11 +1,17 @@
package com.zt.plat.module.qms.resource.material.service;
import cn.hutool.core.collection.CollUtil;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryInboundPageReqVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryInboundRespVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryInboundSaveReqVO;
import com.zt.plat.framework.common.exception.ErrorCode;
import com.zt.plat.module.qms.resource.material.controller.vo.*;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialBatchAssignDO;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInfomationDO;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInventoryInboundDetailDO;
import com.zt.plat.module.qms.resource.material.dal.mapper.MaterialBatchAssignMapper;
import com.zt.plat.module.qms.resource.material.dal.mapper.MaterialInfomationMapper;
import com.zt.plat.module.qms.resource.material.dal.mapper.MaterialInventoryInboundDetailMapper;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.util.*;
@@ -30,7 +36,16 @@ import static com.zt.plat.module.qms.enums.ErrorCodeConstants.*;
public class MaterialInventoryInboundServiceImpl implements MaterialInventoryInboundService {
@Resource
private MaterialInventoryInboundMapper materialInventoryInboundMapper;
private MaterialInventoryInboundMapper materialInventoryInboundMapper;//入库
@Resource
private MaterialInventoryInboundDetailMapper materialInventoryInboundDetailMapper;//入库明细
@Resource
private MaterialInfomationMapper materialInfomationMapper;//物料实例
@Resource
private MaterialBatchAssignMapper materialBatchAssignMapper;//批次分配
@Override
public MaterialInventoryInboundRespVO createMaterialInventoryInbound(MaterialInventoryInboundSaveReqVO createReqVO) {
@@ -89,4 +104,85 @@ public class MaterialInventoryInboundServiceImpl implements MaterialInventoryInb
return materialInventoryInboundMapper.selectPage(pageReqVO);
}
@Override
@Transactional(rollbackFor = Exception.class)
public PageResult<MaterialInventoryInboundRespVO> multiCreateMaterialInventoryInbound(MaterialInventoryInboundSaveReqVO createReqVO) {
MaterialInventoryInboundDetailSaveReqVO detail = createReqVO.getDetail();
//判断输入数量是否大于批次剩余数据
this.quantityCheck(detail);
//生成入库头数据
MaterialInventoryInboundDO materialInventoryInbound = BeanUtils.toBean(createReqVO, MaterialInventoryInboundDO.class);
materialInventoryInboundMapper.insert(materialInventoryInbound);
//根据入库数量创建实例数据
List<MaterialInfomationDO> MaterialInfomationDO = new ArrayList<MaterialInfomationDO>();
for (int i = 0; i < detail.getQuantity(); i++) {
MaterialInfomationDO materialInfomation = new MaterialInfomationDO();
materialInfomation.setBatchId(detail.getBatchAssignId());
materialInfomation.setLocationId(detail.getLocationId());
materialInfomation.setInventoryInboundId(materialInventoryInbound.getId());
materialInfomation.setProductId(detail.getProductId());
MaterialInfomationDO.add(materialInfomation);
}
materialInfomationMapper.insert(MaterialInfomationDO);
//根据实例数据创建入库明细
MaterialInfomationPageReqVO InfomationVO = new MaterialInfomationPageReqVO();
InfomationVO.setInventoryInboundId(materialInventoryInbound.getId());
PageResult<MaterialInfomationDO> InfomationList = materialInfomationMapper.selectPage(InfomationVO);
InfomationList.getList().forEach(item -> {
MaterialInventoryInboundDetailDO detailDO = new MaterialInventoryInboundDetailDO();
detailDO.setInboundId(materialInventoryInbound.getId());
detailDO.setMaterialInfomationId(item.getId());
detailDO.setInboundWay("批量入库");
materialInventoryInboundDetailMapper.insert(detailDO);
});
return null;
}
@Override
public PageResult<MaterialInventoryInboundRespVO> singleCreateMaterialInventoryInbound(MaterialInventoryInboundSaveReqVO createReqVO) {
MaterialInventoryInboundDetailSaveReqVO detail = createReqVO.getDetail();
//判断输入数量是否大于批次剩余数据
this.quantityCheck(detail);
//生成入库头数据
MaterialInventoryInboundDO materialInventoryInbound = BeanUtils.toBean(createReqVO, MaterialInventoryInboundDO.class);
materialInventoryInboundMapper.insert(materialInventoryInbound);
//根据实例数据创建入库明细
MaterialInfomationPageReqVO InfomationVO = new MaterialInfomationPageReqVO();
InfomationVO.setInventoryInboundId(materialInventoryInbound.getId());
PageResult<MaterialInfomationDO> InfomationList = materialInfomationMapper.selectPage(InfomationVO);
InfomationList.getList().forEach(item -> {
MaterialInventoryInboundDetailDO detailDO = new MaterialInventoryInboundDetailDO();
detailDO.setInboundId(materialInventoryInbound.getId());
detailDO.setMaterialInfomationId(item.getId());
detailDO.setInboundWay("采购入库");
materialInventoryInboundDetailMapper.insert(detailDO);
});
return null;
}
private void quantityCheck(MaterialInventoryInboundDetailSaveReqVO detail) {
if (detail.getBatchAssignId() == null || detail.getQuantity() == null) {
throw exception(MATERIAL_BATCH_ASSIGN_NOT_EXISTS);
}
MaterialBatchAssignDO materialBatchAssignDO = materialBatchAssignMapper.selectById(detail.getBatchAssignId());
//判断输入数量是否大于批次剩余数据
if (materialBatchAssignDO.getInboundQuantity() < detail.getQuantity()) {
throw exception(new ErrorCode(1_032_150_000, "批次剩余量不足"));
}
}
}