Compare commits

...

5 Commits

Author SHA1 Message Date
禁止呵呵
8fd750a82f Merge remote-tracking branch 'origin/test' into test 2025-12-09 16:10:46 +08:00
禁止呵呵
2790ed7ea1 feat:库存查询,库存记录查询、入库记录查询 2025-12-09 16:10:37 +08:00
禁止呵呵
1187038ba8 feat:库存管理 2025-12-09 09:39:07 +08:00
禁止呵呵
e2678fe7b4 Merge remote-tracking branch 'origin/test' into test 2025-12-09 09:29:22 +08:00
禁止呵呵
c1b975cca0 feat:入库、批量入库 2025-12-09 09:29:14 +08:00
39 changed files with 992 additions and 16 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 = "productId", description = "产品大类编号", required = true)
// @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

@@ -0,0 +1,140 @@
package com.zt.plat.module.qms.resource.material.controller.admin;
import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog;
import com.zt.plat.framework.business.annotation.FileUploadController;
import com.zt.plat.framework.business.controller.AbstractFileUploadController;
import com.zt.plat.framework.business.interceptor.BusinessControllerMarker;
import com.zt.plat.framework.common.pojo.CommonResult;
import com.zt.plat.framework.common.pojo.PageParam;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.common.pojo.vo.BatchDeleteReqVO;
import com.zt.plat.framework.common.util.object.BeanUtils;
import com.zt.plat.framework.excel.core.util.ExcelUtils;
import com.zt.plat.module.qms.resource.material.controller.vo.*;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInventoryDO;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInventoryInboundDetailDO;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialProductDO;
import com.zt.plat.module.qms.resource.material.service.MaterialInventoryInboundDetailService;
import com.zt.plat.module.qms.resource.material.service.MaterialInventoryService;
import com.zt.plat.module.qms.resource.material.service.MaterialProductService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.List;
import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 入库明细,出库明细,含领用出库、退货出库、盘亏出库、销毁出库等")
@RestController
@RequestMapping("/qms/resource/material-inventory")
@Validated
@FileUploadController(source = "qms.materiainfo")
public class MaterialInventoryController extends AbstractFileUploadController implements BusinessControllerMarker {
static {
FileUploadController annotation = MaterialInventoryController.class.getAnnotation(FileUploadController.class);
if (annotation != null) {
setFileUploadInfo(annotation);
}
}
@Resource
private MaterialInventoryInboundDetailService materialInventoryInboundDetailService;
@Resource
private MaterialInventoryService mterialInventoryService;
@PostMapping("/create")
@Operation(summary = "创建入库明细,出库明细,含领用出库、退货出库、盘亏出库、销毁出库等")
@PreAuthorize("@ss.hasPermission('qms:material-inventory-inbound-detail:create')")
public CommonResult<MaterialInventoryInboundDetailRespVO> createMaterialInventoryInboundDetail(@Valid @RequestBody MaterialInventoryInboundDetailSaveReqVO createReqVO) {
return success(materialInventoryInboundDetailService.createMaterialInventoryInboundDetail(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新入库明细,出库明细,含领用出库、退货出库、盘亏出库、销毁出库等")
@PreAuthorize("@ss.hasPermission('qms:material-inventory-inbound-detail:update')")
public CommonResult<Boolean> updateMaterialInventoryInboundDetail(@Valid @RequestBody MaterialInventoryInboundDetailSaveReqVO updateReqVO) {
materialInventoryInboundDetailService.updateMaterialInventoryInboundDetail(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除入库明细,出库明细,含领用出库、退货出库、盘亏出库、销毁出库等")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('qms:material-inventory-inbound-detail:delete')")
public CommonResult<Boolean> deleteMaterialInventoryInboundDetail(@RequestParam("id") Long id) {
materialInventoryInboundDetailService.deleteMaterialInventoryInboundDetail(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除入库明细,出库明细,含领用出库、退货出库、盘亏出库、销毁出库等")
@PreAuthorize("@ss.hasPermission('qms:material-inventory-inbound-detail:delete')")
public CommonResult<Boolean> deleteMaterialInventoryInboundDetailList(@RequestBody BatchDeleteReqVO req) {
materialInventoryInboundDetailService.deleteMaterialInventoryInboundDetailListByIds(req.getIds());
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得入库明细,出库明细,含领用出库、退货出库、盘亏出库、销毁出库等")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('qms:material-inventory-inbound-detail:query')")
public CommonResult<MaterialInventoryInboundDetailRespVO> getMaterialInventoryInboundDetail(@RequestParam("id") Long id) {
MaterialInventoryInboundDetailDO materialInventoryInboundDetail = materialInventoryInboundDetailService.getMaterialInventoryInboundDetail(id);
return success(BeanUtils.toBean(materialInventoryInboundDetail, MaterialInventoryInboundDetailRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得库存明细")
// @PreAuthorize("@ss.hasPermission('qms:material-inventory-inbound-detail:query')")
public CommonResult<PageResult<MaterialInventoryInboundDetailRespVO>> getMaterialInventoryPage(@Valid MaterialInventoryInboundDetailPageReqVO pageReqVO) {
PageResult<MaterialInventoryInboundDetailDO> pageResult = materialInventoryInboundDetailService.getMaterialInventoryInboundDetailPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, MaterialInventoryInboundDetailRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出入库明细,出库明细,含领用出库、退货出库、盘亏出库、销毁出库等 Excel")
@PreAuthorize("@ss.hasPermission('qms:material-inventory-inbound-detail:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportMaterialInventoryInboundDetailExcel(@Valid MaterialInventoryInboundDetailPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<MaterialInventoryInboundDetailDO> list = materialInventoryInboundDetailService.getMaterialInventoryInboundDetailPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "入库明细,出库明细,含领用出库、退货出库、盘亏出库、销毁出库等.xls", "数据", MaterialInventoryInboundDetailRespVO.class,
BeanUtils.toBean(list, MaterialInventoryInboundDetailRespVO.class));
}
@GetMapping("/getList")
@Operation(summary = "获得库存列表")
@Parameter(name = "id", description = "编号", required = true)
public CommonResult<PageResult<MaterialInventoryRespVO>> getMaterialProduct(MaterialInventoryRespVO pageReqVO) {
PageResult<MaterialInventoryDO> pageResult = mterialInventoryService.getMaterialInventoryPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, MaterialInventoryRespVO.class));
}
@GetMapping("/get_mtrl_inf")
@Operation(summary = "获取实例列表")
@Parameter(name = "id", description = "编号", required = true)
public CommonResult<PageResult<MaterialInventoryRespVO>> getInfomation(MaterialInventoryRespVO pageReqVO) {
PageResult<MaterialInventoryDO> pageResult = mterialInventoryService.getMaterialInventoryPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, MaterialInventoryRespVO.class));
}
}

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,7 +37,7 @@ import com.zt.plat.module.qms.resource.material.service.MaterialInventoryInbound
@Tag(name = "管理后台 - 入库明细,出库明细,含领用出库、退货出库、盘亏出库、销毁出库等")
@RestController
@RequestMapping("/qms/material-inventory-inbound-detail")
@RequestMapping("/qms/resource/material-inventory-inbound-detail")
@Validated
@FileUploadController(source = "qms.materialinventoryinbounddetail")
public class MaterialInventoryInboundDetailController extends AbstractFileUploadController implements BusinessControllerMarker{

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

@@ -0,0 +1,102 @@
package com.zt.plat.module.qms.resource.material.controller.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.zt.plat.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 库存列表分页 Request VO")
@Data
public class MaterialInventoryPageReqVO extends PageParam {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.AUTO, example = "32133")
private Long id;
@Schema(description = "父id", example = "6098")
private Long parentId;
@Schema(description = "id路径")
private String idPath;
@Schema(description = "节点类型,分类|产品", example = "2")
private String nodeType;
@Schema(description = "名称", example = "张三")
private String name;
@Schema(description = "其他配置")
private String customConfig;
@Schema(description = "自定义表单")
private String customForm;
@Schema(description = "扩展数据")
private String customData;
@Schema(description = "标签")
private String tag;
@Schema(description = "标签模板")
private String labelTemplateKey;
@Schema(description = "型号")
private String modelNo;
@Schema(description = "规格")
private String specification;
@Schema(description = "技术参数")
private String parameter;
@Schema(description = "制造商")
private String manufacturer;
@Schema(description = "单位")
private String unit;
@Schema(description = "允许按量领取")
private String enablePartial;
@Schema(description = "保质期(天)")
private Integer due;
@Schema(description = "开封后保质期是否变化")
private String openDueFlag;
@Schema(description = "开封后保质期(天)")
private Integer openDueAfter;
@Schema(description = "是否危险品")
private String hazardous;
@Schema(description = "是否标准溶液")
private String standardSolutionFlag;
@Schema(description = "是否标准物质")
private String standardMaterialFlag;
@Schema(description = "复标周期,单位天。小于等于0-不复标")
private Integer reviewDue;
@Schema(description = "排序号")
private Integer sortNo;
@Schema(description = "禁用")
private String cancelFlag;
@Schema(description = "所属部门")
private String systemDepartmentCode;
@Schema(description = "备注")
private String remark;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@@ -0,0 +1,143 @@
package com.zt.plat.module.qms.resource.material.controller.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import com.zt.plat.framework.common.pojo.PageParam;
import com.zt.plat.module.qms.core.aspect.annotation.Dict;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 库存列表 Response VO")
@Data
@ExcelIgnoreUnannotated
public class MaterialInventoryRespVO extends PageParam {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "32133")
@ExcelProperty("主键")
private Long id;
@Schema(description = "父id", example = "6098")
@ExcelProperty("父id")
private Long parentId;
@Schema(description = "id路径")
@ExcelProperty("id路径")
private String idPath;
@Schema(description = "节点类型,分类|产品", example = "2")
@ExcelProperty("节点类型,分类|产品")
private String nodeType;
@Schema(description = "名称", example = "张三")
@ExcelProperty("名称")
private String name;
@Schema(description = "其他配置")
@ExcelProperty("其他配置")
private String customConfig;
@Schema(description = "自定义表单")
@ExcelProperty("自定义表单")
private String customForm;
@Schema(description = "扩展数据")
@ExcelProperty("扩展数据")
private String customData;
@Schema(description = "标签")
@ExcelProperty("标签")
private String tag;
@Schema(description = "标签模板")
@ExcelProperty("标签模板")
private String labelTemplateKey;
@Schema(description = "型号")
@ExcelProperty("型号")
private String modelNo;
@Schema(description = "规格")
@ExcelProperty("规格")
private String specification;
@Schema(description = "技术参数")
@ExcelProperty("技术参数")
private String parameter;
@Schema(description = "制造商")
@ExcelProperty("制造商")
private String manufacturer;
@Schema(description = "单位")
@ExcelProperty("单位")
private String unit;
@Schema(description = "允许按量领取")
@ExcelProperty("允许按量领取")
@Dict(dicCode = "yes_or_no")
private String enablePartial;
@Schema(description = "保质期(天)")
@ExcelProperty("保质期(天)")
private Integer due;
@Schema(description = "开封后保质期是否变化")
@ExcelProperty("开封后保质期是否变化")
@Dict(dicCode = "yes_or_no")
private String openDueFlag;
@Schema(description = "开封后保质期(天)")
@ExcelProperty("开封后保质期(天)")
private Integer openDueAfter;
@Schema(description = "是否危险品")
@ExcelProperty("是否危险品")
@Dict(dicCode = "yes_or_no")
private String hazardous;
@Schema(description = "是否标准溶液")
@ExcelProperty("是否标准溶液")
@Dict(dicCode = "yes_or_no")
private String standardSolutionFlag;
@Schema(description = "是否标准物质")
@ExcelProperty("是否标准物质")
@Dict(dicCode = "yes_or_no")
private String standardMaterialFlag;
@Schema(description = "复标周期,单位天。小于等于0-不复标")
@ExcelProperty("复标周期")
private Integer reviewDue;
@Schema(description = "排序号")
@ExcelProperty("排序号")
private Integer sortNo;
@Schema(description = "禁用")
@ExcelProperty("禁用")
private String cancelFlag;
@Schema(description = "所属部门")
@ExcelProperty("所属部门")
private String systemDepartmentCode;
@Schema(description = "备注")
@ExcelProperty("备注")
private String remark;
@Schema(description = "创建时间")
@ExcelProperty("创建时间")
private LocalDateTime createTime;
/**
* 总数量
*/
@TableField("INB_QTY")
@Schema(description = "库存总量")
@ExcelProperty("库存总量")
private Long inboundQuantity;
}

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

@@ -0,0 +1,169 @@
package com.zt.plat.module.qms.resource.material.dal.dataobject;
import com.baomidou.mybatisplus.annotation.*;
import com.zt.plat.framework.mybatis.core.dataobject.BusinessBaseDO;
import lombok.*;
/**
* 物料大类 DO
*
* @author 后台管理
*/
@TableName("t_mtrl_pdt")
@KeySequence("t_mtrl_pdt_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
/**
* 支持业务基类继承isBusiness=true 时继承 BusinessBaseDO否则继承 BaseDO
*/
public class MaterialInventoryDO extends BusinessBaseDO {
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**
* 父id
*/
@TableField("PRN_ID")
private Long parentId;
/**
* id路径
*/
@TableField("ID_PATH")
private String idPath;
/**
* 节点类型,分类|产品
*/
@TableField("NDE_TP")
private String nodeType;
/**
* 名称
*/
@TableField("NAME")
private String name;
/**
* 其他配置
*/
@TableField("CST_CFG")
private String customConfig;
/**
* 自定义表单
*/
@TableField("CST_FORM")
private String customForm;
/**
* 扩展数据
*/
@TableField("CST_DAT")
private String customData;
/**
* 标签
*/
@TableField("TAG")
private String tag;
/**
* 标签模板
*/
@TableField("LBL_TMPL_KY")
private String labelTemplateKey;
/**
* 型号
*/
@TableField("MDL_NO")
private String modelNo;
/**
* 规格
*/
@TableField("SPEC")
private String specification;
/**
* 技术参数
*/
@TableField("PRM")
private String parameter;
/**
* 制造商
*/
@TableField("MFR")
private String manufacturer;
/**
* 单位
*/
@TableField("UNT")
private String unit;
/**
* 允许按量领取,1-领用时输入量按量领取0-领用时不能输入量,整个领走
*/
@TableField("ENB_PRTL")
private String enablePartial;
/**
* 保质期(天)
*/
@TableField("DUE")
private Integer due;
/**
* 开封后保质期是否变化
*/
@TableField("OPN_DUE_FLG")
private String openDueFlag;
/**
* 开封后保质期(天)
*/
@TableField("OPN_DUE_AFT")
private Integer openDueAfter;
/**
* 是否危险品
*/
@TableField("HZRD")
private String hazardous;
/**
* 是否标准溶液
*/
@TableField("STD_SOL_FLG")
private String standardSolutionFlag;
/**
* 是否标准物质
*/
@TableField("STD_MTRL_FLG")
private String standardMaterialFlag;
/**
* 复标周期,单位天。小于等于0-不复标
*/
@TableField("RVW_DUE")
private Integer reviewDue;
/**
* 排序号
*/
@TableField("SRT_NO")
private Integer sortNo;
/**
* 禁用
*/
@TableField("CNL_FLG")
private String cancelFlag;
/**
* 所属部门
*/
@TableField("SYS_DEPT_CD")
private String systemDepartmentCode;
/**
* 备注
*/
@TableField("RMK")
private String remark;
/**
* 总数量
*/
@TableField("INB_QTY")
private Long inboundQuantity;
}

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

@@ -0,0 +1,34 @@
package com.zt.plat.module.qms.resource.material.dal.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessSampleEntrustRegistrationDO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryInboundPageReqVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryRespVO;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInventoryDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 入库 Mapper
*
* @author 后台管理
*/
@Mapper
public interface MaterialInventoryMapper extends BaseMapperX<MaterialInventoryDO> {
// default PageResult<MaterialInventoryDO> selectPage(MaterialInventoryRespVO reqVO) {
// return selectPage(reqVO, new LambdaQueryWrapperX<MaterialInventoryDO>()
//
// .eqIfPresent(MaterialInventoryDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode())
// .eqIfPresent(MaterialInventoryDO::getRemark, reqVO.getRemark())
// .betweenIfPresent(MaterialInventoryDO::getCreateTime, reqVO.getCreateTime())
// .orderByDesc(MaterialInventoryDO::getId));
// }
IPage<MaterialInventoryDO> selectPageList (IPage<?> page,@Param("param")MaterialInventoryRespVO RespVO);
}

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) {
@@ -59,12 +74,12 @@ public class MaterialInventoryInboundServiceImpl implements MaterialInventoryInb
}
@Override
public void deleteMaterialInventoryInboundListByIds(List<Long> ids) {
public void deleteMaterialInventoryInboundListByIds(List<Long> ids) {
// 校验存在
validateMaterialInventoryInboundExists(ids);
// 删除
materialInventoryInboundMapper.deleteByIds(ids);
}
}
private void validateMaterialInventoryInboundExists(List<Long> ids) {
List<MaterialInventoryInboundDO> list = materialInventoryInboundMapper.selectByIds(ids);
@@ -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, "批次剩余量不足"));
}
}
}

View File

@@ -0,0 +1,26 @@
package com.zt.plat.module.qms.resource.material.service;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryPageReqVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryRespVO;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInventoryDO;
import jakarta.validation.Valid;
import java.util.List;
/**
* 库存管理 Service 接口
*
* @author 后台管理
*/
public interface MaterialInventoryService {
/**
* 单个入库/上架
*/
PageResult<MaterialInventoryDO> getMaterialInventoryPage(MaterialInventoryRespVO pageReqVO);
}

View File

@@ -0,0 +1,30 @@
package com.zt.plat.module.qms.resource.material.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.common.util.object.BeanUtils;
import com.zt.plat.module.qms.business.bus.controller.vo.BusinessSampleEntrustRegistrationExtendRespVO;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessSampleEntrustRegistrationDO;
import com.zt.plat.module.qms.enums.QmsCommonConstant;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryRespVO;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInventoryDO;
import com.zt.plat.module.qms.resource.material.dal.mapper.MaterialInventoryMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
@Service
public class MaterialInventoryServiceImpl implements MaterialInventoryService{
@Resource
private MaterialInventoryMapper materialInventoryMapper;
@Override
public PageResult<MaterialInventoryDO> getMaterialInventoryPage(MaterialInventoryRespVO pageReqVO){
IPage<MaterialInventoryDO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
IPage<MaterialInventoryDO> pageList = materialInventoryMapper.selectPageList(page, pageReqVO);
PageResult<MaterialInventoryDO> pageResult = new PageResult<>(pageList.getRecords(), pageList.getTotal());
return BeanUtils.toBean(pageResult, MaterialInventoryDO.class);
}
}

View File

@@ -0,0 +1,103 @@
<?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="com.zt.plat.module.qms.resource.material.dal.mapper.MaterialInventoryMapper">
<!-- 结果映射 -->
<resultMap id="MaterialInventoryMap"
type="com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInventoryDO">
<!-- 基础字段 -->
<id column="id" property="id"/>
<result column="CRT_ID" property="creator"/>
<result column="CRT_NM" property="creatorName"/>
<result column="CRT_IP" property="createIp"/>
<result column="CRT_TM" property="createTime"/>
<result column="UPD_ID" property="updater"/>
<result column="UPD_NM" property="updaterName"/>
<result column="UPD_IP" property="updateIp"/>
<result column="UPD_TM" property="updateTime"/>
<result column="DEL_FLG" property="deleted"/>
<!-- 业务字段 -->
<result column="PRN_ID" property="parentId"/>
<result column="ID_PATH" property="idPath"/>
<result column="NDE_TP" property="nodeType"/>
<result column="NAME" property="name"/>
<result column="CST_CFG" property="customConfig"/>
<result column="CST_FORM" property="customForm"/>
<result column="CST_DAT" property="customData"/>
<result column="TAG" property="tag"/>
<result column="LBL_TMPL_KY" property="labelTemplateKey"/>
<result column="MDL_NO" property="modelNo"/>
<result column="SPEC" property="specification"/>
<result column="PRM" property="parameter"/>
<result column="MFR" property="manufacturer"/>
<result column="UNT" property="unit"/>
<result column="ENB_PRTL" property="enablePartial"/>
<result column="DUE" property="due"/>
<result column="OPN_DUE_FLG" property="openDueFlag"/>
<result column="OPN_DUE_AFT" property="openDueAfter"/>
<result column="HZRD" property="hazardous"/>
<result column="STD_SOL_FLG" property="standardSolutionFlag"/>
<result column="STD_MTRL_FLG" property="standardMaterialFlag"/>
<result column="RVW_DUE" property="reviewDue"/>
<result column="SRT_NO" property="sortNo"/>
<result column="CNL_FLG" property="cancelFlag"/>
<result column="SYS_DEPT_CD" property="systemDepartmentCode"/>
<result column="RMK" property="remark"/>
<result column="INB_QTY" property="inboundQuantity"/>
</resultMap>
<!-- 查询数据库列表 -->
<select id="selectPageList"
resultMap="MaterialInventoryMap">
SELECT
PDT.id,
PDT.PRN_ID,
PDT.ID_PATH,
PDT.NDE_TP,
PDT.NAME,
PDT.CST_CFG,
PDT.CST_FORM,
PDT.CST_DAT,
PDT.TAG,
PDT.LBL_TMPL_KY,
PDT.MDL_NO,
PDT.SPEC,
PDT.PRM,
PDT.MFR,
PDT.UNT,
PDT.ENB_PRTL,
PDT.DUE,
PDT.OPN_DUE_FLG,
PDT.OPN_DUE_AFT,
PDT.HZRD,
PDT.STD_SOL_FLG,
PDT.STD_MTRL_FLG,
PDT.RVW_DUE,
PDT.SRT_NO,
PDT.CNL_FLG,
PDT.SYS_DEPT_CD,
PDT.RMK,
ASN_SUM.INB_QTY_SUM AS INB_QTY
FROM
T_MTRL_PDT PDT
LEFT JOIN (
SELECT
PDT_ID,
SUM(INB_QTY) AS INB_QTY_SUM
FROM T_MTRL_BAT_ASN
WHERE DELETED = '0'
GROUP BY PDT_ID
) ASN_SUM ON PDT.id = ASN_SUM.PDT_ID
<where>
PDT.DELETED = '0'
<if test="param != null and param.id != null">
AND PDT.PRN_ID = #{param.id}
</if>
</where>
ORDER BY PDT.id DESC
</select>
</mapper>