Commit 724c527ab0d475b235af2f0ade6aebadbdd72e47
1 parent
f5e61242
✨ feat(mes): 添加产品收货单及行相关功能和数据结构
新增产品收货单及行的相关数据对象、请求和响应 VO,以及对应的服务和控制器接口。实现了产品收货单的创建、更新、删除和查询功能,支持与物料、仓库等模块的关联,提升了系统的可扩展性和可维护性。
Showing
28 changed files
with
1987 additions
and
0 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/MesWmProductRecptController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt; | |
| 2 | + | |
| 3 | +import cn.hutool.core.collection.CollUtil; | |
| 4 | +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; | |
| 5 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 6 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | |
| 7 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 8 | +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | |
| 9 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 10 | +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; | |
| 11 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.MesWmProductRecptPageReqVO; | |
| 12 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.MesWmProductRecptRespVO; | |
| 13 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.MesWmProductRecptSaveReqVO; | |
| 14 | +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; | |
| 15 | +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; | |
| 16 | +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; | |
| 17 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDO; | |
| 18 | +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; | |
| 19 | +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; | |
| 20 | +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; | |
| 21 | +import cn.iocoder.yudao.module.mes.service.wm.productrecpt.MesWmProductRecptService; | |
| 22 | +import io.swagger.v3.oas.annotations.Operation; | |
| 23 | +import io.swagger.v3.oas.annotations.Parameter; | |
| 24 | +import io.swagger.v3.oas.annotations.tags.Tag; | |
| 25 | +import jakarta.annotation.Resource; | |
| 26 | +import jakarta.servlet.http.HttpServletResponse; | |
| 27 | +import jakarta.validation.Valid; | |
| 28 | +import org.springframework.security.access.prepost.PreAuthorize; | |
| 29 | +import org.springframework.validation.annotation.Validated; | |
| 30 | +import org.springframework.web.bind.annotation.*; | |
| 31 | + | |
| 32 | +import java.io.IOException; | |
| 33 | +import java.util.Collections; | |
| 34 | +import java.util.List; | |
| 35 | +import java.util.Map; | |
| 36 | + | |
| 37 | +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; | |
| 38 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 39 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | |
| 40 | + | |
| 41 | +@Tag(name = "管理后台 - MES 产品收货单") | |
| 42 | +@RestController | |
| 43 | +@RequestMapping("/mes/wm/product-recpt") | |
| 44 | +@Validated | |
| 45 | +public class MesWmProductRecptController { | |
| 46 | + | |
| 47 | + @Resource | |
| 48 | + private MesWmProductRecptService productRecptService; | |
| 49 | + | |
| 50 | + @Resource | |
| 51 | + private MesProWorkOrderService workOrderService; | |
| 52 | + | |
| 53 | + @Resource | |
| 54 | + private MesMdItemService itemService; | |
| 55 | + | |
| 56 | + @Resource | |
| 57 | + private MesMdUnitMeasureService unitMeasureService; | |
| 58 | + | |
| 59 | + @PostMapping("/create") | |
| 60 | + @Operation(summary = "创建产品收货单") | |
| 61 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:create')") | |
| 62 | + public CommonResult<Long> createProductRecpt(@Valid @RequestBody MesWmProductRecptSaveReqVO createReqVO) { | |
| 63 | + return success(productRecptService.createProductRecpt(createReqVO)); | |
| 64 | + } | |
| 65 | + | |
| 66 | + @PutMapping("/update") | |
| 67 | + @Operation(summary = "修改产品收货单") | |
| 68 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:update')") | |
| 69 | + public CommonResult<Boolean> updateProductRecpt(@Valid @RequestBody MesWmProductRecptSaveReqVO updateReqVO) { | |
| 70 | + productRecptService.updateProductRecpt(updateReqVO); | |
| 71 | + return success(true); | |
| 72 | + } | |
| 73 | + | |
| 74 | + @DeleteMapping("/delete") | |
| 75 | + @Operation(summary = "删除产品收货单") | |
| 76 | + @Parameter(name = "id", description = "编号", required = true) | |
| 77 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:delete')") | |
| 78 | + public CommonResult<Boolean> deleteProductRecpt(@RequestParam("id") Long id) { | |
| 79 | + productRecptService.deleteProductRecpt(id); | |
| 80 | + return success(true); | |
| 81 | + } | |
| 82 | + | |
| 83 | + @GetMapping("/get") | |
| 84 | + @Operation(summary = "获得产品收货单") | |
| 85 | + @Parameter(name = "id", description = "编号", required = true, example = "1024") | |
| 86 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:query')") | |
| 87 | + public CommonResult<MesWmProductRecptRespVO> getProductRecpt(@RequestParam("id") Long id) { | |
| 88 | + MesWmProductRecptDO recpt = productRecptService.getProductRecpt(id); | |
| 89 | + if (recpt == null) { | |
| 90 | + return success(null); | |
| 91 | + } | |
| 92 | + return success(buildRespVOList(Collections.singletonList(recpt)).get(0)); | |
| 93 | + } | |
| 94 | + | |
| 95 | + @GetMapping("/page") | |
| 96 | + @Operation(summary = "获得产品收货单分页") | |
| 97 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:query')") | |
| 98 | + public CommonResult<PageResult<MesWmProductRecptRespVO>> getProductRecptPage( | |
| 99 | + @Valid MesWmProductRecptPageReqVO pageReqVO) { | |
| 100 | + PageResult<MesWmProductRecptDO> pageResult = productRecptService.getProductRecptPage(pageReqVO); | |
| 101 | + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); | |
| 102 | + } | |
| 103 | + | |
| 104 | + @GetMapping("/export-excel") | |
| 105 | + @Operation(summary = "导出产品收货单 Excel") | |
| 106 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:export')") | |
| 107 | + @ApiAccessLog(operateType = EXPORT) | |
| 108 | + public void exportProductRecptExcel(@Valid MesWmProductRecptPageReqVO pageReqVO, | |
| 109 | + HttpServletResponse response) throws IOException { | |
| 110 | + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); | |
| 111 | + PageResult<MesWmProductRecptDO> pageResult = productRecptService.getProductRecptPage(pageReqVO); | |
| 112 | + ExcelUtils.write(response, "产品收货单.xls", "数据", MesWmProductRecptRespVO.class, | |
| 113 | + buildRespVOList(pageResult.getList())); | |
| 114 | + } | |
| 115 | + | |
| 116 | + @PutMapping("/submit") | |
| 117 | + @Operation(summary = "提交产品收货单") | |
| 118 | + @Parameter(name = "id", description = "编号", required = true) | |
| 119 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:update')") | |
| 120 | + public CommonResult<Boolean> submitProductRecpt(@RequestParam("id") Long id) { | |
| 121 | + productRecptService.submitProductRecpt(id); | |
| 122 | + return success(true); | |
| 123 | + } | |
| 124 | + | |
| 125 | + @PutMapping("/stock") | |
| 126 | + @Operation(summary = "执行上架") | |
| 127 | + @Parameter(name = "id", description = "编号", required = true) | |
| 128 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:update')") | |
| 129 | + public CommonResult<Boolean> stockProductRecpt(@RequestParam("id") Long id) { | |
| 130 | + productRecptService.stockProductRecpt(id); | |
| 131 | + return success(true); | |
| 132 | + } | |
| 133 | + | |
| 134 | + @PutMapping("/execute") | |
| 135 | + @Operation(summary = "执行入库") | |
| 136 | + @Parameter(name = "id", description = "编号", required = true) | |
| 137 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:execute')") | |
| 138 | + public CommonResult<Boolean> executeProductRecpt(@RequestParam("id") Long id) { | |
| 139 | + productRecptService.executeProductRecpt(id); | |
| 140 | + return success(true); | |
| 141 | + } | |
| 142 | + | |
| 143 | + @PutMapping("/cancel") | |
| 144 | + @Operation(summary = "取消产品收货单") | |
| 145 | + @Parameter(name = "id", description = "编号", required = true) | |
| 146 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:update')") | |
| 147 | + public CommonResult<Boolean> cancelProductRecpt(@RequestParam("id") Long id) { | |
| 148 | + productRecptService.cancelProductRecpt(id); | |
| 149 | + return success(true); | |
| 150 | + } | |
| 151 | + | |
| 152 | + // ==================== 拼接 VO ==================== | |
| 153 | + | |
| 154 | + private List<MesWmProductRecptRespVO> buildRespVOList(List<MesWmProductRecptDO> list) { | |
| 155 | + if (CollUtil.isEmpty(list)) { | |
| 156 | + return Collections.emptyList(); | |
| 157 | + } | |
| 158 | + // 1. 获得关联数据 | |
| 159 | + Map<Long, MesProWorkOrderDO> workOrderMap = workOrderService.getWorkOrderMap( | |
| 160 | + convertSet(list, MesWmProductRecptDO::getWorkOrderId)); | |
| 161 | + Map<Long, MesMdItemDO> itemMap = itemService.getItemMap( | |
| 162 | + convertSet(list, MesWmProductRecptDO::getItemId)); | |
| 163 | + Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap( | |
| 164 | + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); | |
| 165 | + // 2. 构建结果 | |
| 166 | + return BeanUtils.toBean(list, MesWmProductRecptRespVO.class, vo -> { | |
| 167 | + MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(), | |
| 168 | + workOrder -> vo.setWorkOrderCode(workOrder.getCode())); | |
| 169 | + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { | |
| 170 | + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); | |
| 171 | + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), | |
| 172 | + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); | |
| 173 | + }); | |
| 174 | + }); | |
| 175 | + } | |
| 176 | + | |
| 177 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/MesWmProductRecptDetailController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt; | |
| 2 | + | |
| 3 | +import cn.hutool.core.collection.CollUtil; | |
| 4 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 5 | +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | |
| 6 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 7 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.detail.MesWmProductRecptDetailRespVO; | |
| 8 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.detail.MesWmProductRecptDetailSaveReqVO; | |
| 9 | +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; | |
| 10 | +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; | |
| 11 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDetailDO; | |
| 12 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; | |
| 13 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; | |
| 14 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; | |
| 15 | +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; | |
| 16 | +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; | |
| 17 | +import cn.iocoder.yudao.module.mes.service.wm.productrecpt.MesWmProductRecptDetailService; | |
| 18 | +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; | |
| 19 | +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; | |
| 20 | +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; | |
| 21 | +import io.swagger.v3.oas.annotations.Operation; | |
| 22 | +import io.swagger.v3.oas.annotations.Parameter; | |
| 23 | +import io.swagger.v3.oas.annotations.tags.Tag; | |
| 24 | +import jakarta.annotation.Resource; | |
| 25 | +import jakarta.validation.Valid; | |
| 26 | +import org.springframework.security.access.prepost.PreAuthorize; | |
| 27 | +import org.springframework.validation.annotation.Validated; | |
| 28 | +import org.springframework.web.bind.annotation.*; | |
| 29 | + | |
| 30 | +import java.util.Collections; | |
| 31 | +import java.util.List; | |
| 32 | +import java.util.Map; | |
| 33 | + | |
| 34 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 35 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | |
| 36 | + | |
| 37 | +@Tag(name = "管理后台 - MES 产品收货单明细") | |
| 38 | +@RestController | |
| 39 | +@RequestMapping("/mes/wm/product-recpt-detail") | |
| 40 | +@Validated | |
| 41 | +public class MesWmProductRecptDetailController { | |
| 42 | + | |
| 43 | + @Resource | |
| 44 | + private MesWmProductRecptDetailService productRecptDetailService; | |
| 45 | + | |
| 46 | + @Resource | |
| 47 | + private MesMdItemService itemService; | |
| 48 | + | |
| 49 | + @Resource | |
| 50 | + private MesMdUnitMeasureService unitMeasureService; | |
| 51 | + | |
| 52 | + @Resource | |
| 53 | + private MesWmWarehouseService warehouseService; | |
| 54 | + | |
| 55 | + @Resource | |
| 56 | + private MesWmWarehouseLocationService locationService; | |
| 57 | + | |
| 58 | + @Resource | |
| 59 | + private MesWmWarehouseAreaService areaService; | |
| 60 | + | |
| 61 | + @PostMapping("/create") | |
| 62 | + @Operation(summary = "创建产品收货单明细") | |
| 63 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:create')") | |
| 64 | + public CommonResult<Long> createProductRecptDetail(@Valid @RequestBody MesWmProductRecptDetailSaveReqVO createReqVO) { | |
| 65 | + return success(productRecptDetailService.createProductRecptDetail(createReqVO)); | |
| 66 | + } | |
| 67 | + | |
| 68 | + @PutMapping("/update") | |
| 69 | + @Operation(summary = "修改产品收货单明细") | |
| 70 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:update')") | |
| 71 | + public CommonResult<Boolean> updateProductRecptDetail(@Valid @RequestBody MesWmProductRecptDetailSaveReqVO updateReqVO) { | |
| 72 | + productRecptDetailService.updateProductRecptDetail(updateReqVO); | |
| 73 | + return success(true); | |
| 74 | + } | |
| 75 | + | |
| 76 | + @DeleteMapping("/delete") | |
| 77 | + @Operation(summary = "删除产品收货单明细") | |
| 78 | + @Parameter(name = "id", description = "编号", required = true) | |
| 79 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:delete')") | |
| 80 | + public CommonResult<Boolean> deleteProductRecptDetail(@RequestParam("id") Long id) { | |
| 81 | + productRecptDetailService.deleteProductRecptDetail(id); | |
| 82 | + return success(true); | |
| 83 | + } | |
| 84 | + | |
| 85 | + @GetMapping("/get") | |
| 86 | + @Operation(summary = "获得产品收货单明细") | |
| 87 | + @Parameter(name = "id", description = "编号", required = true, example = "1024") | |
| 88 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:query')") | |
| 89 | + public CommonResult<MesWmProductRecptDetailRespVO> getProductRecptDetail(@RequestParam("id") Long id) { | |
| 90 | + MesWmProductRecptDetailDO detail = productRecptDetailService.getProductRecptDetail(id); | |
| 91 | + if (detail == null) { | |
| 92 | + return success(null); | |
| 93 | + } | |
| 94 | + return success(buildRespVOList(Collections.singletonList(detail)).get(0)); | |
| 95 | + } | |
| 96 | + | |
| 97 | + @GetMapping("/list-by-line") | |
| 98 | + @Operation(summary = "获得产品收货单明细列表(按行编号)") | |
| 99 | + @Parameter(name = "lineId", description = "行编号", required = true, example = "1024") | |
| 100 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:query')") | |
| 101 | + public CommonResult<List<MesWmProductRecptDetailRespVO>> getProductRecptDetailListByLineId( | |
| 102 | + @RequestParam("lineId") Long lineId) { | |
| 103 | + List<MesWmProductRecptDetailDO> list = productRecptDetailService.getProductRecptDetailListByLineId(lineId); | |
| 104 | + return success(buildRespVOList(list)); | |
| 105 | + } | |
| 106 | + | |
| 107 | + // ==================== 拼接 VO ==================== | |
| 108 | + | |
| 109 | + private List<MesWmProductRecptDetailRespVO> buildRespVOList(List<MesWmProductRecptDetailDO> list) { | |
| 110 | + if (CollUtil.isEmpty(list)) { | |
| 111 | + return Collections.emptyList(); | |
| 112 | + } | |
| 113 | + // 1. 获得关联数据 | |
| 114 | + Map<Long, MesMdItemDO> itemMap = itemService.getItemMap( | |
| 115 | + convertSet(list, MesWmProductRecptDetailDO::getItemId)); | |
| 116 | + Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap( | |
| 117 | + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); | |
| 118 | + Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap( | |
| 119 | + convertSet(list, MesWmProductRecptDetailDO::getWarehouseId)); | |
| 120 | + Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap( | |
| 121 | + convertSet(list, MesWmProductRecptDetailDO::getLocationId)); | |
| 122 | + Map<Long, MesWmWarehouseAreaDO> areaMap = areaService.getWarehouseAreaMap( | |
| 123 | + convertSet(list, MesWmProductRecptDetailDO::getAreaId)); | |
| 124 | + // 2. 构建结果 | |
| 125 | + return BeanUtils.toBean(list, MesWmProductRecptDetailRespVO.class, vo -> { | |
| 126 | + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { | |
| 127 | + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); | |
| 128 | + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), | |
| 129 | + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); | |
| 130 | + }); | |
| 131 | + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), | |
| 132 | + warehouse -> vo.setWarehouseName(warehouse.getName())); | |
| 133 | + MapUtils.findAndThen(locationMap, vo.getLocationId(), | |
| 134 | + location -> vo.setLocationName(location.getName())); | |
| 135 | + MapUtils.findAndThen(areaMap, vo.getAreaId(), | |
| 136 | + area -> vo.setAreaName(area.getName())); | |
| 137 | + }); | |
| 138 | + } | |
| 139 | + | |
| 140 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/MesWmProductRecptLineController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt; | |
| 2 | + | |
| 3 | +import cn.hutool.core.collection.CollUtil; | |
| 4 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 5 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 6 | +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | |
| 7 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 8 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line.MesWmProductRecptLinePageReqVO; | |
| 9 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line.MesWmProductRecptLineRespVO; | |
| 10 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line.MesWmProductRecptLineSaveReqVO; | |
| 11 | +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; | |
| 12 | +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; | |
| 13 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptLineDO; | |
| 14 | +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; | |
| 15 | +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; | |
| 16 | +import cn.iocoder.yudao.module.mes.service.wm.productrecpt.MesWmProductRecptLineService; | |
| 17 | +import io.swagger.v3.oas.annotations.Operation; | |
| 18 | +import io.swagger.v3.oas.annotations.Parameter; | |
| 19 | +import io.swagger.v3.oas.annotations.tags.Tag; | |
| 20 | +import jakarta.annotation.Resource; | |
| 21 | +import jakarta.validation.Valid; | |
| 22 | +import org.springframework.security.access.prepost.PreAuthorize; | |
| 23 | +import org.springframework.validation.annotation.Validated; | |
| 24 | +import org.springframework.web.bind.annotation.*; | |
| 25 | + | |
| 26 | +import java.util.Collections; | |
| 27 | +import java.util.List; | |
| 28 | +import java.util.Map; | |
| 29 | + | |
| 30 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 31 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | |
| 32 | + | |
| 33 | +@Tag(name = "管理后台 - MES 产品收货单行") | |
| 34 | +@RestController | |
| 35 | +@RequestMapping("/mes/wm/product-recpt-line") | |
| 36 | +@Validated | |
| 37 | +public class MesWmProductRecptLineController { | |
| 38 | + | |
| 39 | + @Resource | |
| 40 | + private MesWmProductRecptLineService productRecptLineService; | |
| 41 | + | |
| 42 | + @Resource | |
| 43 | + private MesMdItemService itemService; | |
| 44 | + | |
| 45 | + @Resource | |
| 46 | + private MesMdUnitMeasureService unitMeasureService; | |
| 47 | + | |
| 48 | + @PostMapping("/create") | |
| 49 | + @Operation(summary = "创建产品收货单行") | |
| 50 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:create')") | |
| 51 | + public CommonResult<Long> createProductRecptLine(@Valid @RequestBody MesWmProductRecptLineSaveReqVO createReqVO) { | |
| 52 | + return success(productRecptLineService.createProductRecptLine(createReqVO)); | |
| 53 | + } | |
| 54 | + | |
| 55 | + @PutMapping("/update") | |
| 56 | + @Operation(summary = "修改产品收货单行") | |
| 57 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:update')") | |
| 58 | + public CommonResult<Boolean> updateProductRecptLine(@Valid @RequestBody MesWmProductRecptLineSaveReqVO updateReqVO) { | |
| 59 | + productRecptLineService.updateProductRecptLine(updateReqVO); | |
| 60 | + return success(true); | |
| 61 | + } | |
| 62 | + | |
| 63 | + @DeleteMapping("/delete") | |
| 64 | + @Operation(summary = "删除产品收货单行") | |
| 65 | + @Parameter(name = "id", description = "编号", required = true) | |
| 66 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:delete')") | |
| 67 | + public CommonResult<Boolean> deleteProductRecptLine(@RequestParam("id") Long id) { | |
| 68 | + productRecptLineService.deleteProductRecptLine(id); | |
| 69 | + return success(true); | |
| 70 | + } | |
| 71 | + | |
| 72 | + @GetMapping("/get") | |
| 73 | + @Operation(summary = "获得产品收货单行") | |
| 74 | + @Parameter(name = "id", description = "编号", required = true, example = "1024") | |
| 75 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:query')") | |
| 76 | + public CommonResult<MesWmProductRecptLineRespVO> getProductRecptLine(@RequestParam("id") Long id) { | |
| 77 | + MesWmProductRecptLineDO line = productRecptLineService.getProductRecptLine(id); | |
| 78 | + if (line == null) { | |
| 79 | + return success(null); | |
| 80 | + } | |
| 81 | + return success(buildRespVOList(Collections.singletonList(line)).get(0)); | |
| 82 | + } | |
| 83 | + | |
| 84 | + @GetMapping("/page") | |
| 85 | + @Operation(summary = "获得产品收货单行分页") | |
| 86 | + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:query')") | |
| 87 | + public CommonResult<PageResult<MesWmProductRecptLineRespVO>> getProductRecptLinePage( | |
| 88 | + @Valid MesWmProductRecptLinePageReqVO pageReqVO) { | |
| 89 | + PageResult<MesWmProductRecptLineDO> pageResult = productRecptLineService.getProductRecptLinePage(pageReqVO); | |
| 90 | + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); | |
| 91 | + } | |
| 92 | + | |
| 93 | + // ==================== 拼接 VO ==================== | |
| 94 | + | |
| 95 | + private List<MesWmProductRecptLineRespVO> buildRespVOList(List<MesWmProductRecptLineDO> list) { | |
| 96 | + if (CollUtil.isEmpty(list)) { | |
| 97 | + return Collections.emptyList(); | |
| 98 | + } | |
| 99 | + // 1. 获得关联数据 | |
| 100 | + Map<Long, MesMdItemDO> itemMap = itemService.getItemMap( | |
| 101 | + convertSet(list, MesWmProductRecptLineDO::getItemId)); | |
| 102 | + Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap( | |
| 103 | + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); | |
| 104 | + // 2. 构建结果 | |
| 105 | + return BeanUtils.toBean(list, MesWmProductRecptLineRespVO.class, vo -> { | |
| 106 | + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { | |
| 107 | + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); | |
| 108 | + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), | |
| 109 | + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); | |
| 110 | + }); | |
| 111 | + }); | |
| 112 | + } | |
| 113 | + | |
| 114 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/MesWmProductRecptPageReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | |
| 4 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 5 | +import lombok.Data; | |
| 6 | +import lombok.EqualsAndHashCode; | |
| 7 | +import lombok.ToString; | |
| 8 | +import org.springframework.format.annotation.DateTimeFormat; | |
| 9 | + | |
| 10 | +import java.time.LocalDateTime; | |
| 11 | + | |
| 12 | +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | |
| 13 | + | |
| 14 | +@Schema(description = "管理后台 - MES 产品收货单分页 Request VO") | |
| 15 | +@Data | |
| 16 | +@EqualsAndHashCode(callSuper = true) | |
| 17 | +@ToString(callSuper = true) | |
| 18 | +public class MesWmProductRecptPageReqVO extends PageParam { | |
| 19 | + | |
| 20 | + @Schema(description = "收货单编码", example = "PR202603010001") | |
| 21 | + private String code; | |
| 22 | + | |
| 23 | + @Schema(description = "收货单名称", example = "产品收货单-工单001") | |
| 24 | + private String name; | |
| 25 | + | |
| 26 | + @Schema(description = "生产工单编号", example = "1") | |
| 27 | + private Long workOrderId; | |
| 28 | + | |
| 29 | + @Schema(description = "产品物料编号", example = "1") | |
| 30 | + private Long itemId; | |
| 31 | + | |
| 32 | + @Schema(description = "状态", example = "0") | |
| 33 | + private Integer status; | |
| 34 | + | |
| 35 | + @Schema(description = "收货日期") | |
| 36 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 37 | + private LocalDateTime[] receiptDate; | |
| 38 | + | |
| 39 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/MesWmProductRecptRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo; | |
| 2 | + | |
| 3 | +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; | |
| 4 | +import cn.idev.excel.annotation.ExcelProperty; | |
| 5 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 6 | +import lombok.Data; | |
| 7 | + | |
| 8 | +import java.time.LocalDateTime; | |
| 9 | + | |
| 10 | +@Schema(description = "管理后台 - MES 产品收货单 Response VO") | |
| 11 | +@Data | |
| 12 | +@ExcelIgnoreUnannotated | |
| 13 | +public class MesWmProductRecptRespVO { | |
| 14 | + | |
| 15 | + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 16 | + @ExcelProperty("编号") | |
| 17 | + private Long id; | |
| 18 | + | |
| 19 | + @Schema(description = "收货单编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "PR202603010001") | |
| 20 | + @ExcelProperty("收货单编码") | |
| 21 | + private String code; | |
| 22 | + | |
| 23 | + @Schema(description = "收货单名称", example = "产品收货单-工单001") | |
| 24 | + @ExcelProperty("收货单名称") | |
| 25 | + private String name; | |
| 26 | + | |
| 27 | + @Schema(description = "生产工单编号", example = "1") | |
| 28 | + private Long workOrderId; | |
| 29 | + | |
| 30 | + @Schema(description = "生产工单编码", example = "WO202603010001") | |
| 31 | + @ExcelProperty("生产工单") | |
| 32 | + private String workOrderCode; | |
| 33 | + | |
| 34 | + @Schema(description = "产品物料编号", example = "1") | |
| 35 | + private Long itemId; | |
| 36 | + | |
| 37 | + @Schema(description = "产品物料编码", example = "P001") | |
| 38 | + @ExcelProperty("产品物料编码") | |
| 39 | + private String itemCode; | |
| 40 | + | |
| 41 | + @Schema(description = "产品物料名称", example = "成品A") | |
| 42 | + @ExcelProperty("产品物料名称") | |
| 43 | + private String itemName; | |
| 44 | + | |
| 45 | + @Schema(description = "规格型号", example = "标准型") | |
| 46 | + @ExcelProperty("规格型号") | |
| 47 | + private String specification; | |
| 48 | + | |
| 49 | + @Schema(description = "计量单位名称", example = "件") | |
| 50 | + @ExcelProperty("计量单位") | |
| 51 | + private String unitMeasureName; | |
| 52 | + | |
| 53 | + @Schema(description = "收货日期") | |
| 54 | + @ExcelProperty("收货日期") | |
| 55 | + private LocalDateTime receiptDate; | |
| 56 | + | |
| 57 | + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") | |
| 58 | + @ExcelProperty("状态") | |
| 59 | + private Integer status; | |
| 60 | + | |
| 61 | + @Schema(description = "备注", example = "备注") | |
| 62 | + @ExcelProperty("备注") | |
| 63 | + private String remark; | |
| 64 | + | |
| 65 | + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 66 | + @ExcelProperty("创建时间") | |
| 67 | + private LocalDateTime createTime; | |
| 68 | + | |
| 69 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/MesWmProductRecptSaveReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo; | |
| 2 | + | |
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | +import jakarta.validation.constraints.NotEmpty; | |
| 5 | +import jakarta.validation.constraints.NotNull; | |
| 6 | +import lombok.Data; | |
| 7 | + | |
| 8 | +import java.time.LocalDateTime; | |
| 9 | + | |
| 10 | +@Schema(description = "管理后台 - MES 产品收货单新增/修改 Request VO") | |
| 11 | +@Data | |
| 12 | +public class MesWmProductRecptSaveReqVO { | |
| 13 | + | |
| 14 | + @Schema(description = "编号", example = "1024") | |
| 15 | + private Long id; | |
| 16 | + | |
| 17 | + @Schema(description = "收货单编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "PR202603010001") | |
| 18 | + @NotEmpty(message = "收货单编码不能为空") | |
| 19 | + private String code; | |
| 20 | + | |
| 21 | + @Schema(description = "收货单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "产品收货单-工单001") | |
| 22 | + @NotEmpty(message = "收货单名称不能为空") | |
| 23 | + private String name; | |
| 24 | + | |
| 25 | + @Schema(description = "生产工单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 26 | + // TODO @AI:workOrderId 必须要非必传 | |
| 27 | + @NotNull(message = "生产工单不能为空") | |
| 28 | + private Long workOrderId; | |
| 29 | + | |
| 30 | + @Schema(description = "产品物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 31 | + @NotNull(message = "产品物料不能为空") | |
| 32 | + // TODO @AI:workOrderId 必须要非必传 | |
| 33 | + private Long itemId; | |
| 34 | + | |
| 35 | + @Schema(description = "收货日期", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 36 | + @NotNull(message = "收货日期不能为空") | |
| 37 | + private LocalDateTime receiptDate; | |
| 38 | + | |
| 39 | + @Schema(description = "备注", example = "备注") | |
| 40 | + private String remark; | |
| 41 | + | |
| 42 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/detail/MesWmProductRecptDetailRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.detail; | |
| 2 | + | |
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | +import lombok.Data; | |
| 5 | + | |
| 6 | +import java.math.BigDecimal; | |
| 7 | +import java.time.LocalDateTime; | |
| 8 | + | |
| 9 | +@Schema(description = "管理后台 - MES 产品收货单明细 Response VO") | |
| 10 | +@Data | |
| 11 | +public class MesWmProductRecptDetailRespVO { | |
| 12 | + | |
| 13 | + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 14 | + private Long id; | |
| 15 | + | |
| 16 | + @Schema(description = "收货单行编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 17 | + private Long lineId; | |
| 18 | + | |
| 19 | + @Schema(description = "收货单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 20 | + private Long recptId; | |
| 21 | + | |
| 22 | + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 23 | + private Long itemId; | |
| 24 | + | |
| 25 | + @Schema(description = "物料编码", example = "P001") | |
| 26 | + private String itemCode; | |
| 27 | + | |
| 28 | + @Schema(description = "物料名称", example = "成品A") | |
| 29 | + private String itemName; | |
| 30 | + | |
| 31 | + @Schema(description = "规格型号", example = "标准型") | |
| 32 | + private String specification; | |
| 33 | + | |
| 34 | + @Schema(description = "计量单位名称", example = "件") | |
| 35 | + private String unitMeasureName; | |
| 36 | + | |
| 37 | + @Schema(description = "上架数量", example = "100.00") | |
| 38 | + private BigDecimal quantity; | |
| 39 | + | |
| 40 | + @Schema(description = "批次编号", example = "1") | |
| 41 | + private Long batchId; | |
| 42 | + | |
| 43 | + @Schema(description = "仓库编号", example = "1") | |
| 44 | + private Long warehouseId; | |
| 45 | + | |
| 46 | + @Schema(description = "仓库名称", example = "成品仓") | |
| 47 | + private String warehouseName; | |
| 48 | + | |
| 49 | + @Schema(description = "库区编号", example = "1") | |
| 50 | + private Long locationId; | |
| 51 | + | |
| 52 | + @Schema(description = "库区名称", example = "A区") | |
| 53 | + private String locationName; | |
| 54 | + | |
| 55 | + @Schema(description = "库位编号", example = "1") | |
| 56 | + private Long areaId; | |
| 57 | + | |
| 58 | + @Schema(description = "库位名称", example = "A-01") | |
| 59 | + private String areaName; | |
| 60 | + | |
| 61 | + @Schema(description = "备注", example = "备注") | |
| 62 | + private String remark; | |
| 63 | + | |
| 64 | + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 65 | + private LocalDateTime createTime; | |
| 66 | + | |
| 67 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/detail/MesWmProductRecptDetailSaveReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.detail; | |
| 2 | + | |
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | +import jakarta.validation.constraints.NotNull; | |
| 5 | +import lombok.Data; | |
| 6 | + | |
| 7 | +import java.math.BigDecimal; | |
| 8 | + | |
| 9 | +@Schema(description = "管理后台 - MES 产品收货单明细新增/修改 Request VO") | |
| 10 | +@Data | |
| 11 | +public class MesWmProductRecptDetailSaveReqVO { | |
| 12 | + | |
| 13 | + @Schema(description = "编号", example = "1024") | |
| 14 | + private Long id; | |
| 15 | + | |
| 16 | + @Schema(description = "收货单行编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 17 | + @NotNull(message = "收货单行编号不能为空") | |
| 18 | + private Long lineId; | |
| 19 | + | |
| 20 | + @Schema(description = "收货单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 21 | + @NotNull(message = "收货单编号不能为空") | |
| 22 | + private Long recptId; | |
| 23 | + | |
| 24 | + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 25 | + @NotNull(message = "物料编号不能为空") | |
| 26 | + private Long itemId; | |
| 27 | + | |
| 28 | + @Schema(description = "上架数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") | |
| 29 | + @NotNull(message = "上架数量不能为空") | |
| 30 | + private BigDecimal quantity; | |
| 31 | + | |
| 32 | + @Schema(description = "批次编号", example = "1") | |
| 33 | + private Long batchId; | |
| 34 | + | |
| 35 | + @Schema(description = "仓库编号", example = "1") | |
| 36 | + private Long warehouseId; | |
| 37 | + | |
| 38 | + @Schema(description = "库区编号", example = "1") | |
| 39 | + private Long locationId; | |
| 40 | + | |
| 41 | + @Schema(description = "库位编号", example = "1") | |
| 42 | + private Long areaId; | |
| 43 | + | |
| 44 | + @Schema(description = "备注", example = "备注") | |
| 45 | + private String remark; | |
| 46 | + | |
| 47 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/line/MesWmProductRecptLinePageReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | |
| 4 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 5 | +import lombok.Data; | |
| 6 | +import lombok.EqualsAndHashCode; | |
| 7 | +import lombok.ToString; | |
| 8 | + | |
| 9 | +@Schema(description = "管理后台 - MES 产品收货单行分页 Request VO") | |
| 10 | +@Data | |
| 11 | +@EqualsAndHashCode(callSuper = true) | |
| 12 | +@ToString(callSuper = true) | |
| 13 | +public class MesWmProductRecptLinePageReqVO extends PageParam { | |
| 14 | + | |
| 15 | + @Schema(description = "收货单编号", example = "1") | |
| 16 | + private Long recptId; | |
| 17 | + | |
| 18 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/line/MesWmProductRecptLineRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line; | |
| 2 | + | |
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | +import lombok.Data; | |
| 5 | + | |
| 6 | +import java.math.BigDecimal; | |
| 7 | +import java.time.LocalDateTime; | |
| 8 | + | |
| 9 | +@Schema(description = "管理后台 - MES 产品收货单行 Response VO") | |
| 10 | +@Data | |
| 11 | +public class MesWmProductRecptLineRespVO { | |
| 12 | + | |
| 13 | + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 14 | + private Long id; | |
| 15 | + | |
| 16 | + @Schema(description = "收货单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 17 | + private Long recptId; | |
| 18 | + | |
| 19 | + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 20 | + private Long itemId; | |
| 21 | + | |
| 22 | + @Schema(description = "物料编码", example = "P001") | |
| 23 | + private String itemCode; | |
| 24 | + | |
| 25 | + @Schema(description = "物料名称", example = "成品A") | |
| 26 | + private String itemName; | |
| 27 | + | |
| 28 | + @Schema(description = "规格型号", example = "标准型") | |
| 29 | + private String specification; | |
| 30 | + | |
| 31 | + @Schema(description = "计量单位名称", example = "件") | |
| 32 | + private String unitMeasureName; | |
| 33 | + | |
| 34 | + @Schema(description = "收货数量", example = "100.00") | |
| 35 | + private BigDecimal quantity; | |
| 36 | + | |
| 37 | + @Schema(description = "批次编号", example = "1") | |
| 38 | + private Long batchId; | |
| 39 | + | |
| 40 | + @Schema(description = "批次号", example = "BATCH20260301001") | |
| 41 | + private String batchCode; | |
| 42 | + | |
| 43 | + @Schema(description = "备注", example = "备注") | |
| 44 | + private String remark; | |
| 45 | + | |
| 46 | + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 47 | + private LocalDateTime createTime; | |
| 48 | + | |
| 49 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/line/MesWmProductRecptLineSaveReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line; | |
| 2 | + | |
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | +import jakarta.validation.constraints.NotNull; | |
| 5 | +import lombok.Data; | |
| 6 | + | |
| 7 | +import java.math.BigDecimal; | |
| 8 | + | |
| 9 | +@Schema(description = "管理后台 - MES 产品收货单行新增/修改 Request VO") | |
| 10 | +@Data | |
| 11 | +public class MesWmProductRecptLineSaveReqVO { | |
| 12 | + | |
| 13 | + @Schema(description = "编号", example = "1024") | |
| 14 | + private Long id; | |
| 15 | + | |
| 16 | + @Schema(description = "收货单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 17 | + @NotNull(message = "收货单编号不能为空") | |
| 18 | + private Long recptId; | |
| 19 | + | |
| 20 | + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 21 | + @NotNull(message = "物料编号不能为空") | |
| 22 | + private Long itemId; | |
| 23 | + | |
| 24 | + @Schema(description = "收货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") | |
| 25 | + @NotNull(message = "收货数量不能为空") | |
| 26 | + private BigDecimal quantity; | |
| 27 | + | |
| 28 | + @Schema(description = "批次编号", example = "1") | |
| 29 | + private Long batchId; | |
| 30 | + | |
| 31 | + @Schema(description = "批次号", example = "BATCH20260301001") | |
| 32 | + private String batchCode; | |
| 33 | + | |
| 34 | + @Schema(description = "备注", example = "备注") | |
| 35 | + private String remark; | |
| 36 | + | |
| 37 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productrecpt/MesWmProductRecptDO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | |
| 4 | +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; | |
| 5 | +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; | |
| 6 | +import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductRecptStatusEnum; | |
| 7 | +import com.baomidou.mybatisplus.annotation.KeySequence; | |
| 8 | +import com.baomidou.mybatisplus.annotation.TableId; | |
| 9 | +import com.baomidou.mybatisplus.annotation.TableName; | |
| 10 | +import lombok.*; | |
| 11 | + | |
| 12 | +import java.time.LocalDateTime; | |
| 13 | + | |
| 14 | +/** | |
| 15 | + * MES 产品收货(入库)单 DO | |
| 16 | + */ | |
| 17 | +@TableName("mes_wm_product_recpt") | |
| 18 | +@KeySequence("mes_wm_product_recpt_seq") | |
| 19 | +@Data | |
| 20 | +@EqualsAndHashCode(callSuper = true) | |
| 21 | +@ToString(callSuper = true) | |
| 22 | +@Builder | |
| 23 | +@NoArgsConstructor | |
| 24 | +@AllArgsConstructor | |
| 25 | +public class MesWmProductRecptDO extends BaseDO { | |
| 26 | + | |
| 27 | + /** | |
| 28 | + * 编号 | |
| 29 | + */ | |
| 30 | + @TableId | |
| 31 | + private Long id; | |
| 32 | + /** | |
| 33 | + * 收货单编码 | |
| 34 | + */ | |
| 35 | + private String code; | |
| 36 | + /** | |
| 37 | + * 收货单名称 | |
| 38 | + */ | |
| 39 | + private String name; | |
| 40 | + /** | |
| 41 | + * 生产工单编号 | |
| 42 | + * | |
| 43 | + * 关联 {@link MesProWorkOrderDO#getId()} | |
| 44 | + */ | |
| 45 | + private Long workOrderId; | |
| 46 | + /** | |
| 47 | + * 产品物料编号 | |
| 48 | + * | |
| 49 | + * 关联 {@link MesMdItemDO#getId()} | |
| 50 | + */ | |
| 51 | + private Long itemId; | |
| 52 | + /** | |
| 53 | + * 收货日期 | |
| 54 | + */ | |
| 55 | + private LocalDateTime receiptDate; | |
| 56 | + /** | |
| 57 | + * 状态 | |
| 58 | + * | |
| 59 | + * 枚举 {@link MesWmProductRecptStatusEnum} | |
| 60 | + */ | |
| 61 | + private Integer status; | |
| 62 | + /** | |
| 63 | + * 备注 | |
| 64 | + */ | |
| 65 | + private String remark; | |
| 66 | + | |
| 67 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productrecpt/MesWmProductRecptDetailDO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | |
| 4 | +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; | |
| 5 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; | |
| 6 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; | |
| 7 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; | |
| 8 | +import com.baomidou.mybatisplus.annotation.KeySequence; | |
| 9 | +import com.baomidou.mybatisplus.annotation.TableId; | |
| 10 | +import com.baomidou.mybatisplus.annotation.TableName; | |
| 11 | +import lombok.*; | |
| 12 | + | |
| 13 | +import java.math.BigDecimal; | |
| 14 | + | |
| 15 | +/** | |
| 16 | + * MES 产品收货(入库)单明细 DO | |
| 17 | + */ | |
| 18 | +@TableName("mes_wm_product_recpt_detail") | |
| 19 | +@KeySequence("mes_wm_product_recpt_detail_seq") | |
| 20 | +@Data | |
| 21 | +@EqualsAndHashCode(callSuper = true) | |
| 22 | +@ToString(callSuper = true) | |
| 23 | +@Builder | |
| 24 | +@NoArgsConstructor | |
| 25 | +@AllArgsConstructor | |
| 26 | +public class MesWmProductRecptDetailDO extends BaseDO { | |
| 27 | + | |
| 28 | + /** | |
| 29 | + * 编号 | |
| 30 | + */ | |
| 31 | + @TableId | |
| 32 | + private Long id; | |
| 33 | + /** | |
| 34 | + * 收货单行编号 | |
| 35 | + * | |
| 36 | + * 关联 {@link MesWmProductRecptLineDO#getId()} | |
| 37 | + */ | |
| 38 | + private Long lineId; | |
| 39 | + /** | |
| 40 | + * 收货单编号 | |
| 41 | + * | |
| 42 | + * 关联 {@link MesWmProductRecptDO#getId()} | |
| 43 | + */ | |
| 44 | + private Long recptId; | |
| 45 | + /** | |
| 46 | + * 物料编号 | |
| 47 | + * | |
| 48 | + * 关联 {@link MesMdItemDO#getId()} | |
| 49 | + */ | |
| 50 | + private Long itemId; | |
| 51 | + /** | |
| 52 | + * 上架数量 | |
| 53 | + */ | |
| 54 | + private BigDecimal quantity; | |
| 55 | + /** | |
| 56 | + * 批次编号 | |
| 57 | + * | |
| 58 | + * TODO DONE @芋艿:保留。待 mes_wm_batch 模块迁移后补充 @link 关联 | |
| 59 | + */ | |
| 60 | + private Long batchId; | |
| 61 | + /** | |
| 62 | + * 仓库编号 | |
| 63 | + * | |
| 64 | + * 关联 {@link MesWmWarehouseDO#getId()} | |
| 65 | + */ | |
| 66 | + private Long warehouseId; | |
| 67 | + /** | |
| 68 | + * 库区编号 | |
| 69 | + * | |
| 70 | + * 关联 {@link MesWmWarehouseLocationDO#getId()} | |
| 71 | + */ | |
| 72 | + private Long locationId; | |
| 73 | + /** | |
| 74 | + * 库位编号 | |
| 75 | + * | |
| 76 | + * 关联 {@link MesWmWarehouseAreaDO#getId()} | |
| 77 | + */ | |
| 78 | + private Long areaId; | |
| 79 | + /** | |
| 80 | + * 备注 | |
| 81 | + */ | |
| 82 | + private String remark; | |
| 83 | + | |
| 84 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productrecpt/MesWmProductRecptLineDO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | |
| 4 | +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; | |
| 5 | +import com.baomidou.mybatisplus.annotation.KeySequence; | |
| 6 | +import com.baomidou.mybatisplus.annotation.TableId; | |
| 7 | +import com.baomidou.mybatisplus.annotation.TableName; | |
| 8 | +import lombok.*; | |
| 9 | + | |
| 10 | +import java.math.BigDecimal; | |
| 11 | + | |
| 12 | +/** | |
| 13 | + * MES 产品收货(入库)单行 DO | |
| 14 | + */ | |
| 15 | +@TableName("mes_wm_product_recpt_line") | |
| 16 | +@KeySequence("mes_wm_product_recpt_line_seq") | |
| 17 | +@Data | |
| 18 | +@EqualsAndHashCode(callSuper = true) | |
| 19 | +@ToString(callSuper = true) | |
| 20 | +@Builder | |
| 21 | +@NoArgsConstructor | |
| 22 | +@AllArgsConstructor | |
| 23 | +public class MesWmProductRecptLineDO extends BaseDO { | |
| 24 | + | |
| 25 | + /** | |
| 26 | + * 编号 | |
| 27 | + */ | |
| 28 | + @TableId | |
| 29 | + private Long id; | |
| 30 | + /** | |
| 31 | + * 收货单编号 | |
| 32 | + * | |
| 33 | + * 关联 {@link MesWmProductRecptDO#getId()} | |
| 34 | + */ | |
| 35 | + private Long recptId; | |
| 36 | + /** | |
| 37 | + * 物料编号 | |
| 38 | + * | |
| 39 | + * 关联 {@link MesMdItemDO#getId()} | |
| 40 | + */ | |
| 41 | + private Long itemId; | |
| 42 | + /** | |
| 43 | + * 收货数量 | |
| 44 | + */ | |
| 45 | + private BigDecimal quantity; | |
| 46 | + /** | |
| 47 | + * 批次编号 | |
| 48 | + * | |
| 49 | + * TODO DONE @芋艿:保留。待 mes_wm_batch 模块迁移后补充 @link 关联 | |
| 50 | + */ | |
| 51 | + private Long batchId; | |
| 52 | + /** | |
| 53 | + * 批次号 | |
| 54 | + */ | |
| 55 | + private String batchCode; | |
| 56 | + /** | |
| 57 | + * 备注 | |
| 58 | + */ | |
| 59 | + private String remark; | |
| 60 | + | |
| 61 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productrecpt/MesWmProductRecptDetailMapper.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.dal.mysql.wm.productrecpt; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | |
| 4 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDetailDO; | |
| 5 | +import org.apache.ibatis.annotations.Mapper; | |
| 6 | + | |
| 7 | +import java.util.List; | |
| 8 | + | |
| 9 | +/** | |
| 10 | + * MES 产品收货单明细 Mapper | |
| 11 | + */ | |
| 12 | +@Mapper | |
| 13 | +public interface MesWmProductRecptDetailMapper extends BaseMapperX<MesWmProductRecptDetailDO> { | |
| 14 | + | |
| 15 | + default List<MesWmProductRecptDetailDO> selectListByRecptId(Long recptId) { | |
| 16 | + return selectList(MesWmProductRecptDetailDO::getRecptId, recptId); | |
| 17 | + } | |
| 18 | + | |
| 19 | + default List<MesWmProductRecptDetailDO> selectListByLineId(Long lineId) { | |
| 20 | + return selectList(MesWmProductRecptDetailDO::getLineId, lineId); | |
| 21 | + } | |
| 22 | + | |
| 23 | + default void deleteByRecptId(Long recptId) { | |
| 24 | + delete(MesWmProductRecptDetailDO::getRecptId, recptId); | |
| 25 | + } | |
| 26 | + | |
| 27 | + default void deleteByLineId(Long lineId) { | |
| 28 | + delete(MesWmProductRecptDetailDO::getLineId, lineId); | |
| 29 | + } | |
| 30 | + | |
| 31 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productrecpt/MesWmProductRecptLineMapper.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.dal.mysql.wm.productrecpt; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 4 | +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | |
| 5 | +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | |
| 6 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line.MesWmProductRecptLinePageReqVO; | |
| 7 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptLineDO; | |
| 8 | +import org.apache.ibatis.annotations.Mapper; | |
| 9 | + | |
| 10 | +import java.util.List; | |
| 11 | + | |
| 12 | +/** | |
| 13 | + * MES 产品收货单行 Mapper | |
| 14 | + */ | |
| 15 | +@Mapper | |
| 16 | +public interface MesWmProductRecptLineMapper extends BaseMapperX<MesWmProductRecptLineDO> { | |
| 17 | + | |
| 18 | + default PageResult<MesWmProductRecptLineDO> selectPage(MesWmProductRecptLinePageReqVO reqVO) { | |
| 19 | + return selectPage(reqVO, new LambdaQueryWrapperX<MesWmProductRecptLineDO>() | |
| 20 | + .eqIfPresent(MesWmProductRecptLineDO::getRecptId, reqVO.getRecptId()) | |
| 21 | + .orderByDesc(MesWmProductRecptLineDO::getId)); | |
| 22 | + } | |
| 23 | + | |
| 24 | + default List<MesWmProductRecptLineDO> selectListByRecptId(Long recptId) { | |
| 25 | + return selectList(MesWmProductRecptLineDO::getRecptId, recptId); | |
| 26 | + } | |
| 27 | + | |
| 28 | + default void deleteByRecptId(Long recptId) { | |
| 29 | + delete(MesWmProductRecptLineDO::getRecptId, recptId); | |
| 30 | + } | |
| 31 | + | |
| 32 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productrecpt/MesWmProductRecptMapper.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.dal.mysql.wm.productrecpt; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 4 | +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | |
| 5 | +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | |
| 6 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.MesWmProductRecptPageReqVO; | |
| 7 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDO; | |
| 8 | +import org.apache.ibatis.annotations.Mapper; | |
| 9 | + | |
| 10 | +/** | |
| 11 | + * MES 产品收货单 Mapper | |
| 12 | + */ | |
| 13 | +@Mapper | |
| 14 | +public interface MesWmProductRecptMapper extends BaseMapperX<MesWmProductRecptDO> { | |
| 15 | + | |
| 16 | + default PageResult<MesWmProductRecptDO> selectPage(MesWmProductRecptPageReqVO reqVO) { | |
| 17 | + return selectPage(reqVO, new LambdaQueryWrapperX<MesWmProductRecptDO>() | |
| 18 | + .likeIfPresent(MesWmProductRecptDO::getCode, reqVO.getCode()) | |
| 19 | + .likeIfPresent(MesWmProductRecptDO::getName, reqVO.getName()) | |
| 20 | + .eqIfPresent(MesWmProductRecptDO::getWorkOrderId, reqVO.getWorkOrderId()) | |
| 21 | + .eqIfPresent(MesWmProductRecptDO::getItemId, reqVO.getItemId()) | |
| 22 | + .eqIfPresent(MesWmProductRecptDO::getStatus, reqVO.getStatus()) | |
| 23 | + .betweenIfPresent(MesWmProductRecptDO::getReceiptDate, reqVO.getReceiptDate()) | |
| 24 | + .orderByDesc(MesWmProductRecptDO::getId)); | |
| 25 | + } | |
| 26 | + | |
| 27 | + default MesWmProductRecptDO selectByCode(String code) { | |
| 28 | + return selectOne(MesWmProductRecptDO::getCode, code); | |
| 29 | + } | |
| 30 | + | |
| 31 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
| ... | ... | @@ -402,4 +402,15 @@ public interface ErrorCodeConstants { |
| 402 | 402 | ErrorCode WM_RETURN_VENDOR_LINE_NOT_EXISTS = new ErrorCode(1_040_711_100, "供应商退货单行不存在"); |
| 403 | 403 | ErrorCode WM_RETURN_VENDOR_DETAIL_NOT_EXISTS = new ErrorCode(1_040_711_200, "供应商退货单明细不存在"); |
| 404 | 404 | |
| 405 | + // ========== MES 仓库管理-产品收货单(1-040-712-000) ========== | |
| 406 | + ErrorCode WM_PRODUCT_RECPT_NOT_EXISTS = new ErrorCode(1_040_712_000, "产品收货单不存在"); | |
| 407 | + ErrorCode WM_PRODUCT_RECPT_CODE_DUPLICATE = new ErrorCode(1_040_712_001, "产品收货单编码已存在"); | |
| 408 | + ErrorCode WM_PRODUCT_RECPT_STATUS_NOT_PREPARE = new ErrorCode(1_040_712_002, "只有草稿或待上架状态才允许此操作"); | |
| 409 | + ErrorCode WM_PRODUCT_RECPT_NO_LINE = new ErrorCode(1_040_712_003, "至少需要一条行项目"); | |
| 410 | + ErrorCode WM_PRODUCT_RECPT_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_712_004, "明细上架总数与行收货数量不匹配"); | |
| 411 | + ErrorCode WM_PRODUCT_RECPT_STATUS_ERROR = new ErrorCode(1_040_712_005, "收货单状态不正确"); | |
| 412 | + ErrorCode WM_PRODUCT_RECPT_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_712_006, "已完成或已取消的收货单不允许取消"); | |
| 413 | + ErrorCode WM_PRODUCT_RECPT_LINE_NOT_EXISTS = new ErrorCode(1_040_712_100, "产品收货单行不存在"); | |
| 414 | + ErrorCode WM_PRODUCT_RECPT_DETAIL_NOT_EXISTS = new ErrorCode(1_040_712_200, "产品收货明细不存在"); | |
| 415 | + | |
| 405 | 416 | } | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductRecptStatusEnum.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.enums.wm; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.core.ArrayValuable; | |
| 4 | +import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; | |
| 5 | +import lombok.AllArgsConstructor; | |
| 6 | +import lombok.Getter; | |
| 7 | + | |
| 8 | +import java.util.Arrays; | |
| 9 | + | |
| 10 | +/** | |
| 11 | + * MES 产品收货单状态枚举 | |
| 12 | + * | |
| 13 | + * @author 芋道源码 | |
| 14 | + */ | |
| 15 | +@Getter | |
| 16 | +@AllArgsConstructor | |
| 17 | +public enum MesWmProductRecptStatusEnum implements ArrayValuable<Integer> { | |
| 18 | + | |
| 19 | + // TODO @AI:对应的方法;参考别的 MesWmProductionIssueStatusEnum | |
| 20 | + /** | |
| 21 | + * 草稿 | |
| 22 | + */ | |
| 23 | + PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), | |
| 24 | + /** | |
| 25 | + * 待上架 | |
| 26 | + */ | |
| 27 | + APPROVING(MesOrderStatusConstants.APPROVING, "待上架"), | |
| 28 | + /** | |
| 29 | + * 待执行入库 | |
| 30 | + */ | |
| 31 | + APPROVED(MesOrderStatusConstants.APPROVED, "待执行入库"), | |
| 32 | + /** | |
| 33 | + * 已完成 | |
| 34 | + */ | |
| 35 | + FINISHED(MesOrderStatusConstants.FINISHED, "已完成"), | |
| 36 | + /** | |
| 37 | + * 已取消 | |
| 38 | + */ | |
| 39 | + CANCELED(MesOrderStatusConstants.CANCELLED, "已取消"); | |
| 40 | + | |
| 41 | + public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmProductRecptStatusEnum::getStatus).toArray(Integer[]::new); | |
| 42 | + | |
| 43 | + /** | |
| 44 | + * 状态值 | |
| 45 | + */ | |
| 46 | + private final Integer status; | |
| 47 | + /** | |
| 48 | + * 状态名 | |
| 49 | + */ | |
| 50 | + private final String name; | |
| 51 | + | |
| 52 | + @Override | |
| 53 | + public Integer[] array() { | |
| 54 | + return ARRAYS; | |
| 55 | + } | |
| 56 | + | |
| 57 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productrecpt/MesWmProductRecptDetailService.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.service.wm.productrecpt; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.detail.MesWmProductRecptDetailSaveReqVO; | |
| 4 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDetailDO; | |
| 5 | +import jakarta.validation.Valid; | |
| 6 | + | |
| 7 | +import java.util.List; | |
| 8 | + | |
| 9 | +/** | |
| 10 | + * MES 产品收货单明细 Service 接口 | |
| 11 | + */ | |
| 12 | +public interface MesWmProductRecptDetailService { | |
| 13 | + | |
| 14 | + /** | |
| 15 | + * 创建产品收货单明细 | |
| 16 | + * | |
| 17 | + * @param createReqVO 创建信息 | |
| 18 | + * @return 编号 | |
| 19 | + */ | |
| 20 | + Long createProductRecptDetail(@Valid MesWmProductRecptDetailSaveReqVO createReqVO); | |
| 21 | + | |
| 22 | + /** | |
| 23 | + * 修改产品收货单明细 | |
| 24 | + * | |
| 25 | + * @param updateReqVO 修改信息 | |
| 26 | + */ | |
| 27 | + void updateProductRecptDetail(@Valid MesWmProductRecptDetailSaveReqVO updateReqVO); | |
| 28 | + | |
| 29 | + /** | |
| 30 | + * 删除产品收货单明细 | |
| 31 | + * | |
| 32 | + * @param id 编号 | |
| 33 | + */ | |
| 34 | + void deleteProductRecptDetail(Long id); | |
| 35 | + | |
| 36 | + /** | |
| 37 | + * 获得产品收货单明细 | |
| 38 | + * | |
| 39 | + * @param id 编号 | |
| 40 | + * @return 产品收货单明细 | |
| 41 | + */ | |
| 42 | + MesWmProductRecptDetailDO getProductRecptDetail(Long id); | |
| 43 | + | |
| 44 | + /** | |
| 45 | + * 按收货单编号获得明细列表 | |
| 46 | + * | |
| 47 | + * @param recptId 收货单编号 | |
| 48 | + * @return 明细列表 | |
| 49 | + */ | |
| 50 | + List<MesWmProductRecptDetailDO> getProductRecptDetailListByRecptId(Long recptId); | |
| 51 | + | |
| 52 | + /** | |
| 53 | + * 按收货单行编号获得明细列表 | |
| 54 | + * | |
| 55 | + * @param lineId 行编号 | |
| 56 | + * @return 明细列表 | |
| 57 | + */ | |
| 58 | + List<MesWmProductRecptDetailDO> getProductRecptDetailListByLineId(Long lineId); | |
| 59 | + | |
| 60 | + /** | |
| 61 | + * 按收货单行编号批量删除明细 | |
| 62 | + * | |
| 63 | + * @param lineId 行编号 | |
| 64 | + */ | |
| 65 | + void deleteProductRecptDetailByLineId(Long lineId); | |
| 66 | + | |
| 67 | + /** | |
| 68 | + * 按收货单编号批量删除明细 | |
| 69 | + * | |
| 70 | + * @param recptId 收货单编号 | |
| 71 | + */ | |
| 72 | + void deleteProductRecptDetailByRecptId(Long recptId); | |
| 73 | + | |
| 74 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productrecpt/MesWmProductRecptDetailServiceImpl.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.service.wm.productrecpt; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 4 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.detail.MesWmProductRecptDetailSaveReqVO; | |
| 5 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDetailDO; | |
| 6 | +import cn.iocoder.yudao.module.mes.dal.mysql.wm.productrecpt.MesWmProductRecptDetailMapper; | |
| 7 | +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; | |
| 8 | +import jakarta.annotation.Resource; | |
| 9 | +import org.springframework.context.annotation.Lazy; | |
| 10 | +import org.springframework.stereotype.Service; | |
| 11 | +import org.springframework.validation.annotation.Validated; | |
| 12 | + | |
| 13 | +import java.util.List; | |
| 14 | + | |
| 15 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | |
| 16 | +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; | |
| 17 | + | |
| 18 | +/** | |
| 19 | + * MES 产品收货单明细 Service 实现类 | |
| 20 | + */ | |
| 21 | +@Service | |
| 22 | +@Validated | |
| 23 | +public class MesWmProductRecptDetailServiceImpl implements MesWmProductRecptDetailService { | |
| 24 | + | |
| 25 | + @Resource | |
| 26 | + private MesWmProductRecptDetailMapper productRecptDetailMapper; | |
| 27 | + | |
| 28 | + @Resource | |
| 29 | + @Lazy | |
| 30 | + private MesWmProductRecptService productRecptService; | |
| 31 | + | |
| 32 | + @Resource | |
| 33 | + private MesWmWarehouseAreaService warehouseAreaService; | |
| 34 | + | |
| 35 | + @Override | |
| 36 | + public Long createProductRecptDetail(MesWmProductRecptDetailSaveReqVO createReqVO) { | |
| 37 | + // 校验父单据存在且为可编辑状态 | |
| 38 | + productRecptService.validateProductRecptEditable(createReqVO.getRecptId()); | |
| 39 | + // 校验库区关系 | |
| 40 | + warehouseAreaService.validateWarehouseAreaExists( | |
| 41 | + createReqVO.getWarehouseId(), createReqVO.getLocationId(), createReqVO.getAreaId()); | |
| 42 | + | |
| 43 | + MesWmProductRecptDetailDO detail = BeanUtils.toBean(createReqVO, MesWmProductRecptDetailDO.class); | |
| 44 | + productRecptDetailMapper.insert(detail); | |
| 45 | + return detail.getId(); | |
| 46 | + } | |
| 47 | + | |
| 48 | + @Override | |
| 49 | + public void updateProductRecptDetail(MesWmProductRecptDetailSaveReqVO updateReqVO) { | |
| 50 | + // 校验存在 | |
| 51 | + MesWmProductRecptDetailDO detail = validateProductRecptDetailExists(updateReqVO.getId()); | |
| 52 | + // 校验父单据存在且为可编辑状态 | |
| 53 | + productRecptService.validateProductRecptEditable(detail.getRecptId()); | |
| 54 | + // 校验库区关系 | |
| 55 | + warehouseAreaService.validateWarehouseAreaExists( | |
| 56 | + updateReqVO.getWarehouseId(), updateReqVO.getLocationId(), updateReqVO.getAreaId()); | |
| 57 | + | |
| 58 | + // 更新 | |
| 59 | + MesWmProductRecptDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductRecptDetailDO.class); | |
| 60 | + productRecptDetailMapper.updateById(updateObj); | |
| 61 | + } | |
| 62 | + | |
| 63 | + @Override | |
| 64 | + public void deleteProductRecptDetail(Long id) { | |
| 65 | + // 校验存在 | |
| 66 | + validateProductRecptDetailExists(id); | |
| 67 | + // 删除 | |
| 68 | + productRecptDetailMapper.deleteById(id); | |
| 69 | + } | |
| 70 | + | |
| 71 | + @Override | |
| 72 | + public MesWmProductRecptDetailDO getProductRecptDetail(Long id) { | |
| 73 | + return productRecptDetailMapper.selectById(id); | |
| 74 | + } | |
| 75 | + | |
| 76 | + @Override | |
| 77 | + public List<MesWmProductRecptDetailDO> getProductRecptDetailListByRecptId(Long recptId) { | |
| 78 | + return productRecptDetailMapper.selectListByRecptId(recptId); | |
| 79 | + } | |
| 80 | + | |
| 81 | + @Override | |
| 82 | + public List<MesWmProductRecptDetailDO> getProductRecptDetailListByLineId(Long lineId) { | |
| 83 | + return productRecptDetailMapper.selectListByLineId(lineId); | |
| 84 | + } | |
| 85 | + | |
| 86 | + @Override | |
| 87 | + public void deleteProductRecptDetailByLineId(Long lineId) { | |
| 88 | + productRecptDetailMapper.deleteByLineId(lineId); | |
| 89 | + } | |
| 90 | + | |
| 91 | + @Override | |
| 92 | + public void deleteProductRecptDetailByRecptId(Long recptId) { | |
| 93 | + productRecptDetailMapper.deleteByRecptId(recptId); | |
| 94 | + } | |
| 95 | + | |
| 96 | + private MesWmProductRecptDetailDO validateProductRecptDetailExists(Long id) { | |
| 97 | + MesWmProductRecptDetailDO detail = productRecptDetailMapper.selectById(id); | |
| 98 | + if (detail == null) { | |
| 99 | + throw exception(WM_PRODUCT_RECPT_DETAIL_NOT_EXISTS); | |
| 100 | + } | |
| 101 | + return detail; | |
| 102 | + } | |
| 103 | + | |
| 104 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productrecpt/MesWmProductRecptLineService.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.service.wm.productrecpt; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 4 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line.MesWmProductRecptLinePageReqVO; | |
| 5 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line.MesWmProductRecptLineSaveReqVO; | |
| 6 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptLineDO; | |
| 7 | +import jakarta.validation.Valid; | |
| 8 | + | |
| 9 | +import java.util.List; | |
| 10 | + | |
| 11 | +/** | |
| 12 | + * MES 产品收货单行 Service 接口 | |
| 13 | + */ | |
| 14 | +public interface MesWmProductRecptLineService { | |
| 15 | + | |
| 16 | + /** | |
| 17 | + * 创建产品收货单行 | |
| 18 | + * | |
| 19 | + * @param createReqVO 创建信息 | |
| 20 | + * @return 编号 | |
| 21 | + */ | |
| 22 | + Long createProductRecptLine(@Valid MesWmProductRecptLineSaveReqVO createReqVO); | |
| 23 | + | |
| 24 | + /** | |
| 25 | + * 修改产品收货单行 | |
| 26 | + * | |
| 27 | + * @param updateReqVO 修改信息 | |
| 28 | + */ | |
| 29 | + void updateProductRecptLine(@Valid MesWmProductRecptLineSaveReqVO updateReqVO); | |
| 30 | + | |
| 31 | + /** | |
| 32 | + * 删除产品收货单行(级联删除明细) | |
| 33 | + * | |
| 34 | + * @param id 编号 | |
| 35 | + */ | |
| 36 | + void deleteProductRecptLine(Long id); | |
| 37 | + | |
| 38 | + /** | |
| 39 | + * 获得产品收货单行 | |
| 40 | + * | |
| 41 | + * @param id 编号 | |
| 42 | + * @return 产品收货单行 | |
| 43 | + */ | |
| 44 | + MesWmProductRecptLineDO getProductRecptLine(Long id); | |
| 45 | + | |
| 46 | + /** | |
| 47 | + * 获得产品收货单行分页 | |
| 48 | + * | |
| 49 | + * @param pageReqVO 分页参数 | |
| 50 | + * @return 产品收货单行分页 | |
| 51 | + */ | |
| 52 | + PageResult<MesWmProductRecptLineDO> getProductRecptLinePage(MesWmProductRecptLinePageReqVO pageReqVO); | |
| 53 | + | |
| 54 | + /** | |
| 55 | + * 按收货单编号获得行列表 | |
| 56 | + * | |
| 57 | + * @param recptId 收货单编号 | |
| 58 | + * @return 行列表 | |
| 59 | + */ | |
| 60 | + List<MesWmProductRecptLineDO> getProductRecptLineListByRecptId(Long recptId); | |
| 61 | + | |
| 62 | + /** | |
| 63 | + * 按收货单编号批量删除行 | |
| 64 | + * | |
| 65 | + * @param recptId 收货单编号 | |
| 66 | + */ | |
| 67 | + void deleteProductRecptLineByRecptId(Long recptId); | |
| 68 | + | |
| 69 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productrecpt/MesWmProductRecptLineServiceImpl.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.service.wm.productrecpt; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 4 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 5 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line.MesWmProductRecptLinePageReqVO; | |
| 6 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line.MesWmProductRecptLineSaveReqVO; | |
| 7 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptLineDO; | |
| 8 | +import cn.iocoder.yudao.module.mes.dal.mysql.wm.productrecpt.MesWmProductRecptLineMapper; | |
| 9 | +import jakarta.annotation.Resource; | |
| 10 | +import org.springframework.context.annotation.Lazy; | |
| 11 | +import org.springframework.stereotype.Service; | |
| 12 | +import org.springframework.transaction.annotation.Transactional; | |
| 13 | +import org.springframework.validation.annotation.Validated; | |
| 14 | + | |
| 15 | +import java.util.List; | |
| 16 | + | |
| 17 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | |
| 18 | +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCT_RECPT_LINE_NOT_EXISTS; | |
| 19 | + | |
| 20 | +/** | |
| 21 | + * MES 产品收货单行 Service 实现类 | |
| 22 | + */ | |
| 23 | +@Service | |
| 24 | +@Validated | |
| 25 | +public class MesWmProductRecptLineServiceImpl implements MesWmProductRecptLineService { | |
| 26 | + | |
| 27 | + @Resource | |
| 28 | + private MesWmProductRecptLineMapper productRecptLineMapper; | |
| 29 | + | |
| 30 | + @Resource | |
| 31 | + @Lazy | |
| 32 | + private MesWmProductRecptService productRecptService; | |
| 33 | + | |
| 34 | + @Resource | |
| 35 | + private MesWmProductRecptDetailService productRecptDetailService; | |
| 36 | + | |
| 37 | + @Override | |
| 38 | + public Long createProductRecptLine(MesWmProductRecptLineSaveReqVO createReqVO) { | |
| 39 | + // 校验父单据存在且为可编辑状态 | |
| 40 | + productRecptService.validateProductRecptEditable(createReqVO.getRecptId()); | |
| 41 | + | |
| 42 | + // 新增 | |
| 43 | + MesWmProductRecptLineDO line = BeanUtils.toBean(createReqVO, MesWmProductRecptLineDO.class); | |
| 44 | + productRecptLineMapper.insert(line); | |
| 45 | + return line.getId(); | |
| 46 | + } | |
| 47 | + | |
| 48 | + @Override | |
| 49 | + public void updateProductRecptLine(MesWmProductRecptLineSaveReqVO updateReqVO) { | |
| 50 | + // 校验存在 | |
| 51 | + MesWmProductRecptLineDO line = validateProductRecptLineExists(updateReqVO.getId()); | |
| 52 | + // 校验父单据存在且为可编辑状态 | |
| 53 | + productRecptService.validateProductRecptEditable(line.getRecptId()); | |
| 54 | + | |
| 55 | + // 更新 | |
| 56 | + MesWmProductRecptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductRecptLineDO.class); | |
| 57 | + productRecptLineMapper.updateById(updateObj); | |
| 58 | + } | |
| 59 | + | |
| 60 | + @Override | |
| 61 | + @Transactional(rollbackFor = Exception.class) | |
| 62 | + public void deleteProductRecptLine(Long id) { | |
| 63 | + // 校验存在 | |
| 64 | + validateProductRecptLineExists(id); | |
| 65 | + | |
| 66 | + // 级联删除明细 | |
| 67 | + productRecptDetailService.deleteProductRecptDetailByLineId(id); | |
| 68 | + // 删除 | |
| 69 | + productRecptLineMapper.deleteById(id); | |
| 70 | + } | |
| 71 | + | |
| 72 | + @Override | |
| 73 | + public MesWmProductRecptLineDO getProductRecptLine(Long id) { | |
| 74 | + return productRecptLineMapper.selectById(id); | |
| 75 | + } | |
| 76 | + | |
| 77 | + @Override | |
| 78 | + public PageResult<MesWmProductRecptLineDO> getProductRecptLinePage(MesWmProductRecptLinePageReqVO pageReqVO) { | |
| 79 | + return productRecptLineMapper.selectPage(pageReqVO); | |
| 80 | + } | |
| 81 | + | |
| 82 | + @Override | |
| 83 | + public List<MesWmProductRecptLineDO> getProductRecptLineListByRecptId(Long recptId) { | |
| 84 | + return productRecptLineMapper.selectListByRecptId(recptId); | |
| 85 | + } | |
| 86 | + | |
| 87 | + @Override | |
| 88 | + public void deleteProductRecptLineByRecptId(Long recptId) { | |
| 89 | + productRecptLineMapper.deleteByRecptId(recptId); | |
| 90 | + } | |
| 91 | + | |
| 92 | + private MesWmProductRecptLineDO validateProductRecptLineExists(Long id) { | |
| 93 | + MesWmProductRecptLineDO line = productRecptLineMapper.selectById(id); | |
| 94 | + if (line == null) { | |
| 95 | + throw exception(WM_PRODUCT_RECPT_LINE_NOT_EXISTS); | |
| 96 | + } | |
| 97 | + return line; | |
| 98 | + } | |
| 99 | + | |
| 100 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productrecpt/MesWmProductRecptService.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.service.wm.productrecpt; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 4 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.MesWmProductRecptPageReqVO; | |
| 5 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.MesWmProductRecptSaveReqVO; | |
| 6 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDO; | |
| 7 | +import jakarta.validation.Valid; | |
| 8 | + | |
| 9 | +/** | |
| 10 | + * MES 产品收货单 Service 接口 | |
| 11 | + */ | |
| 12 | +public interface MesWmProductRecptService { | |
| 13 | + | |
| 14 | + /** | |
| 15 | + * 创建产品收货单 | |
| 16 | + * | |
| 17 | + * @param createReqVO 创建信息 | |
| 18 | + * @return 编号 | |
| 19 | + */ | |
| 20 | + Long createProductRecpt(@Valid MesWmProductRecptSaveReqVO createReqVO); | |
| 21 | + | |
| 22 | + /** | |
| 23 | + * 修改产品收货单 | |
| 24 | + * | |
| 25 | + * @param updateReqVO 修改信息 | |
| 26 | + */ | |
| 27 | + void updateProductRecpt(@Valid MesWmProductRecptSaveReqVO updateReqVO); | |
| 28 | + | |
| 29 | + /** | |
| 30 | + * 删除产品收货单(级联删除行+明细) | |
| 31 | + * | |
| 32 | + * @param id 编号 | |
| 33 | + */ | |
| 34 | + void deleteProductRecpt(Long id); | |
| 35 | + | |
| 36 | + /** | |
| 37 | + * 获得产品收货单 | |
| 38 | + * | |
| 39 | + * @param id 编号 | |
| 40 | + * @return 产品收货单 | |
| 41 | + */ | |
| 42 | + MesWmProductRecptDO getProductRecpt(Long id); | |
| 43 | + | |
| 44 | + /** | |
| 45 | + * 获得产品收货单分页 | |
| 46 | + * | |
| 47 | + * @param pageReqVO 分页参数 | |
| 48 | + * @return 产品收货单分页 | |
| 49 | + */ | |
| 50 | + PageResult<MesWmProductRecptDO> getProductRecptPage(MesWmProductRecptPageReqVO pageReqVO); | |
| 51 | + | |
| 52 | + /** | |
| 53 | + * 提交产品收货单(草稿 → 待上架) | |
| 54 | + * | |
| 55 | + * @param id 编号 | |
| 56 | + */ | |
| 57 | + void submitProductRecpt(Long id); | |
| 58 | + | |
| 59 | + /** | |
| 60 | + * 执行上架(待上架 → 待入库) | |
| 61 | + * | |
| 62 | + * @param id 编号 | |
| 63 | + */ | |
| 64 | + void stockProductRecpt(Long id); | |
| 65 | + | |
| 66 | + /** | |
| 67 | + * 执行入库(待入库 → 已完成),更新库存台账 | |
| 68 | + * | |
| 69 | + * @param id 编号 | |
| 70 | + */ | |
| 71 | + void executeProductRecpt(Long id); | |
| 72 | + | |
| 73 | + /** | |
| 74 | + * 取消产品收货单(任意非已完成/已取消状态 → 已取消) | |
| 75 | + * | |
| 76 | + * @param id 编号 | |
| 77 | + */ | |
| 78 | + void cancelProductRecpt(Long id); | |
| 79 | + | |
| 80 | + /** | |
| 81 | + * 校验产品收货单存在且处于可编辑状态(草稿或待上架) | |
| 82 | + * | |
| 83 | + * @param id 编号 | |
| 84 | + * @return 产品收货单 | |
| 85 | + */ | |
| 86 | + MesWmProductRecptDO validateProductRecptEditable(Long id); | |
| 87 | + | |
| 88 | +} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productrecpt/MesWmProductRecptServiceImpl.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mes.service.wm.productrecpt; | |
| 2 | + | |
| 3 | +import cn.hutool.core.collection.CollUtil; | |
| 4 | +import cn.hutool.core.util.ObjUtil; | |
| 5 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 6 | +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | |
| 7 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 8 | +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | |
| 9 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.MesWmProductRecptPageReqVO; | |
| 10 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.MesWmProductRecptSaveReqVO; | |
| 11 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDO; | |
| 12 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDetailDO; | |
| 13 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptLineDO; | |
| 14 | +import cn.iocoder.yudao.module.mes.dal.mysql.wm.productrecpt.MesWmProductRecptMapper; | |
| 15 | +import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductRecptStatusEnum; | |
| 16 | +import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; | |
| 17 | +import jakarta.annotation.Resource; | |
| 18 | +import org.springframework.stereotype.Service; | |
| 19 | +import org.springframework.transaction.annotation.Transactional; | |
| 20 | +import org.springframework.validation.annotation.Validated; | |
| 21 | + | |
| 22 | +import java.math.BigDecimal; | |
| 23 | +import java.util.List; | |
| 24 | + | |
| 25 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | |
| 26 | +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * MES 产品收货单 Service 实现类 | |
| 30 | + */ | |
| 31 | +@Service | |
| 32 | +@Validated | |
| 33 | +public class MesWmProductRecptServiceImpl implements MesWmProductRecptService { | |
| 34 | + | |
| 35 | + @Resource | |
| 36 | + private MesWmProductRecptMapper productRecptMapper; | |
| 37 | + | |
| 38 | + @Resource | |
| 39 | + private MesWmProductRecptLineService productRecptLineService; | |
| 40 | + | |
| 41 | + @Resource | |
| 42 | + private MesWmProductRecptDetailService productRecptDetailService; | |
| 43 | + | |
| 44 | + @Resource | |
| 45 | + private MesWmMaterialStockService materialStockService; | |
| 46 | + | |
| 47 | + @Override | |
| 48 | + public Long createProductRecpt(MesWmProductRecptSaveReqVO createReqVO) { | |
| 49 | + // 校验编码唯一 | |
| 50 | + validateCodeUnique(null, createReqVO.getCode()); | |
| 51 | + | |
| 52 | + // 插入 | |
| 53 | + MesWmProductRecptDO recpt = BeanUtils.toBean(createReqVO, MesWmProductRecptDO.class); | |
| 54 | + recpt.setStatus(MesWmProductRecptStatusEnum.PREPARE.getStatus()); | |
| 55 | + productRecptMapper.insert(recpt); | |
| 56 | + return recpt.getId(); | |
| 57 | + } | |
| 58 | + | |
| 59 | + @Override | |
| 60 | + public void updateProductRecpt(MesWmProductRecptSaveReqVO updateReqVO) { | |
| 61 | + // 校验存在 + 草稿状态 | |
| 62 | + validateProductRecptExistsAndDraft(updateReqVO.getId()); | |
| 63 | + // 校验编码唯一 | |
| 64 | + validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); | |
| 65 | + | |
| 66 | + // 更新 | |
| 67 | + MesWmProductRecptDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductRecptDO.class); | |
| 68 | + productRecptMapper.updateById(updateObj); | |
| 69 | + } | |
| 70 | + | |
| 71 | + @Override | |
| 72 | + @Transactional(rollbackFor = Exception.class) | |
| 73 | + public void deleteProductRecpt(Long id) { | |
| 74 | + // 校验存在 + 草稿状态 | |
| 75 | + validateProductRecptExistsAndDraft(id); | |
| 76 | + | |
| 77 | + // 级联删除明细和行 | |
| 78 | + productRecptDetailService.deleteProductRecptDetailByRecptId(id); | |
| 79 | + productRecptLineService.deleteProductRecptLineByRecptId(id); | |
| 80 | + // 删除 | |
| 81 | + productRecptMapper.deleteById(id); | |
| 82 | + } | |
| 83 | + | |
| 84 | + @Override | |
| 85 | + public MesWmProductRecptDO getProductRecpt(Long id) { | |
| 86 | + return productRecptMapper.selectById(id); | |
| 87 | + } | |
| 88 | + | |
| 89 | + @Override | |
| 90 | + public PageResult<MesWmProductRecptDO> getProductRecptPage(MesWmProductRecptPageReqVO pageReqVO) { | |
| 91 | + return productRecptMapper.selectPage(pageReqVO); | |
| 92 | + } | |
| 93 | + | |
| 94 | + @Override | |
| 95 | + @Transactional(rollbackFor = Exception.class) | |
| 96 | + public void submitProductRecpt(Long id) { | |
| 97 | + // 校验存在 + 草稿状态 | |
| 98 | + validateProductRecptExistsAndDraft(id); | |
| 99 | + // 校验至少有一条行 | |
| 100 | + List<MesWmProductRecptLineDO> lines = productRecptLineService.getProductRecptLineListByRecptId(id); | |
| 101 | + if (CollUtil.isEmpty(lines)) { | |
| 102 | + throw exception(WM_PRODUCT_RECPT_NO_LINE); | |
| 103 | + } | |
| 104 | + | |
| 105 | + // 提交(草稿 → 待上架) | |
| 106 | + productRecptMapper.updateById(new MesWmProductRecptDO() | |
| 107 | + .setId(id).setStatus(MesWmProductRecptStatusEnum.APPROVING.getStatus())); | |
| 108 | + } | |
| 109 | + | |
| 110 | + @Override | |
| 111 | + @Transactional(rollbackFor = Exception.class) | |
| 112 | + public void stockProductRecpt(Long id) { | |
| 113 | + // 校验存在 | |
| 114 | + MesWmProductRecptDO recpt = validateProductRecptExists(id); | |
| 115 | + if (ObjUtil.notEqual(MesWmProductRecptStatusEnum.APPROVING.getStatus(), recpt.getStatus())) { | |
| 116 | + throw exception(WM_PRODUCT_RECPT_STATUS_ERROR); | |
| 117 | + } | |
| 118 | + // 校验每行明细数量之和是否等于行收货数量 | |
| 119 | + List<MesWmProductRecptLineDO> lines = productRecptLineService.getProductRecptLineListByRecptId(id); | |
| 120 | + for (MesWmProductRecptLineDO line : lines) { | |
| 121 | + List<MesWmProductRecptDetailDO> details = productRecptDetailService.getProductRecptDetailListByLineId(line.getId()); | |
| 122 | + BigDecimal totalDetailQty = CollectionUtils.getSumValue(details, | |
| 123 | + MesWmProductRecptDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); | |
| 124 | + if (line.getQuantity() != null && totalDetailQty.compareTo(line.getQuantity()) != 0) { | |
| 125 | + throw exception(WM_PRODUCT_RECPT_DETAIL_QUANTITY_MISMATCH); | |
| 126 | + } | |
| 127 | + } | |
| 128 | + | |
| 129 | + // 执行上架(待上架 → 待入库) | |
| 130 | + productRecptMapper.updateById(new MesWmProductRecptDO() | |
| 131 | + .setId(id).setStatus(MesWmProductRecptStatusEnum.APPROVED.getStatus())); | |
| 132 | + } | |
| 133 | + | |
| 134 | + @Override | |
| 135 | + @Transactional(rollbackFor = Exception.class) | |
| 136 | + public void executeProductRecpt(Long id) { | |
| 137 | + // 校验存在 | |
| 138 | + MesWmProductRecptDO recpt = validateProductRecptExists(id); | |
| 139 | + if (ObjUtil.notEqual(MesWmProductRecptStatusEnum.APPROVED.getStatus(), recpt.getStatus())) { | |
| 140 | + throw exception(WM_PRODUCT_RECPT_STATUS_ERROR); | |
| 141 | + } | |
| 142 | + | |
| 143 | + // 遍历所有明细,更新库存台账 | |
| 144 | + List<MesWmProductRecptDetailDO> details = productRecptDetailService.getProductRecptDetailListByRecptId(id); | |
| 145 | + for (MesWmProductRecptDetailDO detail : details) { | |
| 146 | + materialStockService.increaseStock( | |
| 147 | + detail.getItemId(), detail.getWarehouseId(), detail.getLocationId(), detail.getAreaId(), | |
| 148 | + detail.getBatchId(), detail.getQuantity(), null, null, null); | |
| 149 | + } | |
| 150 | + | |
| 151 | + // 更新收货单状态 | |
| 152 | + productRecptMapper.updateById(new MesWmProductRecptDO() | |
| 153 | + .setId(id).setStatus(MesWmProductRecptStatusEnum.FINISHED.getStatus())); | |
| 154 | + } | |
| 155 | + | |
| 156 | + @Override | |
| 157 | + @Transactional(rollbackFor = Exception.class) | |
| 158 | + public void cancelProductRecpt(Long id) { | |
| 159 | + // 校验存在 | |
| 160 | + MesWmProductRecptDO recpt = validateProductRecptExists(id); | |
| 161 | + // 已完成和已取消不允许取消 | |
| 162 | + if (ObjectUtils.equalsAny(recpt.getStatus(), | |
| 163 | + MesWmProductRecptStatusEnum.FINISHED.getStatus(), | |
| 164 | + MesWmProductRecptStatusEnum.CANCELED.getStatus())) { | |
| 165 | + throw exception(WM_PRODUCT_RECPT_CANCEL_NOT_ALLOWED); | |
| 166 | + } | |
| 167 | + // 取消 | |
| 168 | + productRecptMapper.updateById(new MesWmProductRecptDO() | |
| 169 | + .setId(id).setStatus(MesWmProductRecptStatusEnum.CANCELED.getStatus())); | |
| 170 | + } | |
| 171 | + | |
| 172 | + @Override | |
| 173 | + public MesWmProductRecptDO validateProductRecptEditable(Long id) { | |
| 174 | + MesWmProductRecptDO recpt = validateProductRecptExists(id); | |
| 175 | + if (ObjUtil.notEqual(recpt.getStatus(), MesWmProductRecptStatusEnum.PREPARE.getStatus()) | |
| 176 | + && ObjUtil.notEqual(recpt.getStatus(), MesWmProductRecptStatusEnum.APPROVING.getStatus())) { | |
| 177 | + throw exception(WM_PRODUCT_RECPT_STATUS_NOT_PREPARE); | |
| 178 | + } | |
| 179 | + return recpt; | |
| 180 | + } | |
| 181 | + | |
| 182 | + private MesWmProductRecptDO validateProductRecptExists(Long id) { | |
| 183 | + MesWmProductRecptDO recpt = productRecptMapper.selectById(id); | |
| 184 | + if (recpt == null) { | |
| 185 | + throw exception(WM_PRODUCT_RECPT_NOT_EXISTS); | |
| 186 | + } | |
| 187 | + return recpt; | |
| 188 | + } | |
| 189 | + | |
| 190 | + /** | |
| 191 | + * 校验产品收货单存在且为草稿状态 | |
| 192 | + */ | |
| 193 | + private MesWmProductRecptDO validateProductRecptExistsAndDraft(Long id) { | |
| 194 | + MesWmProductRecptDO recpt = validateProductRecptExists(id); | |
| 195 | + if (ObjUtil.notEqual(MesWmProductRecptStatusEnum.PREPARE.getStatus(), recpt.getStatus())) { | |
| 196 | + throw exception(WM_PRODUCT_RECPT_STATUS_NOT_PREPARE); | |
| 197 | + } | |
| 198 | + return recpt; | |
| 199 | + } | |
| 200 | + | |
| 201 | + private void validateCodeUnique(Long id, String code) { | |
| 202 | + MesWmProductRecptDO recpt = productRecptMapper.selectByCode(code); | |
| 203 | + if (recpt == null) { | |
| 204 | + return; | |
| 205 | + } | |
| 206 | + if (ObjUtil.notEqual(id, recpt.getId())) { | |
| 207 | + throw exception(WM_PRODUCT_RECPT_CODE_DUPLICATE); | |
| 208 | + } | |
| 209 | + } | |
| 210 | + | |
| 211 | +} | ... | ... |
yudao-ui/yudao-ui-admin-vue3/src/api/mes/wm/productrecpt/detail/index.ts
0 → 100644
| 1 | +import request from '@/config/axios' | |
| 2 | + | |
| 3 | +// MES 产品收货单明细 VO | |
| 4 | +export interface WmProductRecptDetailVO { | |
| 5 | + id: number | |
| 6 | + lineId: number | |
| 7 | + recptId: number | |
| 8 | + itemId: number | |
| 9 | + itemCode: string | |
| 10 | + itemName: string | |
| 11 | + specification: string | |
| 12 | + unitMeasureName: string | |
| 13 | + quantity: number | |
| 14 | + batchId: number | |
| 15 | + warehouseId: number | |
| 16 | + warehouseName: string | |
| 17 | + locationId: number | |
| 18 | + locationName: string | |
| 19 | + areaId: number | |
| 20 | + areaName: string | |
| 21 | + remark: string | |
| 22 | + createTime: string | |
| 23 | +} | |
| 24 | + | |
| 25 | +// MES 产品收货单明细 API | |
| 26 | +export const WmProductRecptDetailApi = { | |
| 27 | + // 查询产品收货单明细详情 | |
| 28 | + getProductRecptDetail: async (id: number) => { | |
| 29 | + return await request.get({ url: '/mes/wm/product-recpt-detail/get?id=' + id }) | |
| 30 | + }, | |
| 31 | + | |
| 32 | + // 查询产品收货单明细列表(按行编号) | |
| 33 | + getProductRecptDetailListByLineId: async (lineId: number) => { | |
| 34 | + return await request.get({ url: '/mes/wm/product-recpt-detail/list-by-line?lineId=' + lineId }) | |
| 35 | + }, | |
| 36 | + | |
| 37 | + // 新增产品收货单明细 | |
| 38 | + createProductRecptDetail: async (data: WmProductRecptDetailVO) => { | |
| 39 | + return await request.post({ url: '/mes/wm/product-recpt-detail/create', data }) | |
| 40 | + }, | |
| 41 | + | |
| 42 | + // 修改产品收货单明细 | |
| 43 | + updateProductRecptDetail: async (data: WmProductRecptDetailVO) => { | |
| 44 | + return await request.put({ url: '/mes/wm/product-recpt-detail/update', data }) | |
| 45 | + }, | |
| 46 | + | |
| 47 | + // 删除产品收货单明细 | |
| 48 | + deleteProductRecptDetail: async (id: number) => { | |
| 49 | + return await request.delete({ url: '/mes/wm/product-recpt-detail/delete?id=' + id }) | |
| 50 | + } | |
| 51 | +} | ... | ... |
yudao-ui/yudao-ui-admin-vue3/src/api/mes/wm/productrecpt/index.ts
0 → 100644
| 1 | +import request from '@/config/axios' | |
| 2 | + | |
| 3 | +// MES 产品收货单 VO | |
| 4 | +export interface WmProductRecptVO { | |
| 5 | + id: number | |
| 6 | + code: string | |
| 7 | + name: string | |
| 8 | + workOrderId: number | |
| 9 | + workOrderCode: string | |
| 10 | + itemId: number | |
| 11 | + itemCode: string | |
| 12 | + itemName: string | |
| 13 | + specification: string | |
| 14 | + unitMeasureName: string | |
| 15 | + receiptDate: string | |
| 16 | + status: number | |
| 17 | + remark: string | |
| 18 | + createTime: string | |
| 19 | +} | |
| 20 | + | |
| 21 | +// MES 产品收货单 API | |
| 22 | +export const WmProductRecptApi = { | |
| 23 | + // 查询产品收货单分页 | |
| 24 | + getProductRecptPage: async (params: any) => { | |
| 25 | + return await request.get({ url: '/mes/wm/product-recpt/page', params }) | |
| 26 | + }, | |
| 27 | + | |
| 28 | + // 查询产品收货单详情 | |
| 29 | + getProductRecpt: async (id: number) => { | |
| 30 | + return await request.get({ url: '/mes/wm/product-recpt/get?id=' + id }) | |
| 31 | + }, | |
| 32 | + | |
| 33 | + // 新增产品收货单 | |
| 34 | + createProductRecpt: async (data: WmProductRecptVO) => { | |
| 35 | + return await request.post({ url: '/mes/wm/product-recpt/create', data }) | |
| 36 | + }, | |
| 37 | + | |
| 38 | + // 修改产品收货单 | |
| 39 | + updateProductRecpt: async (data: WmProductRecptVO) => { | |
| 40 | + return await request.put({ url: '/mes/wm/product-recpt/update', data }) | |
| 41 | + }, | |
| 42 | + | |
| 43 | + // 删除产品收货单 | |
| 44 | + deleteProductRecpt: async (id: number) => { | |
| 45 | + return await request.delete({ url: '/mes/wm/product-recpt/delete?id=' + id }) | |
| 46 | + }, | |
| 47 | + | |
| 48 | + // 提交产品收货单 | |
| 49 | + submitProductRecpt: async (id: number) => { | |
| 50 | + return await request.put({ url: '/mes/wm/product-recpt/submit?id=' + id }) | |
| 51 | + }, | |
| 52 | + | |
| 53 | + // 执行上架 | |
| 54 | + stockProductRecpt: async (id: number) => { | |
| 55 | + return await request.put({ url: '/mes/wm/product-recpt/stock?id=' + id }) | |
| 56 | + }, | |
| 57 | + | |
| 58 | + // 执行入库 | |
| 59 | + executeProductRecpt: async (id: number) => { | |
| 60 | + return await request.put({ url: '/mes/wm/product-recpt/execute?id=' + id }) | |
| 61 | + }, | |
| 62 | + | |
| 63 | + // 取消产品收货单 | |
| 64 | + cancelProductRecpt: async (id: number) => { | |
| 65 | + return await request.put({ url: '/mes/wm/product-recpt/cancel?id=' + id }) | |
| 66 | + }, | |
| 67 | + | |
| 68 | + // 导出产品收货单 Excel | |
| 69 | + exportProductRecpt: async (params: any) => { | |
| 70 | + return await request.download({ url: '/mes/wm/product-recpt/export-excel', params }) | |
| 71 | + } | |
| 72 | +} | ... | ... |
yudao-ui/yudao-ui-admin-vue3/src/api/mes/wm/productrecpt/line/index.ts
0 → 100644
| 1 | +import request from '@/config/axios' | |
| 2 | + | |
| 3 | +// MES 产品收货单行 VO | |
| 4 | +export interface WmProductRecptLineVO { | |
| 5 | + id: number | |
| 6 | + recptId: number | |
| 7 | + itemId: number | |
| 8 | + itemCode: string | |
| 9 | + itemName: string | |
| 10 | + specification: string | |
| 11 | + unitMeasureName: string | |
| 12 | + receivedQuantity: number | |
| 13 | + batchId: number | |
| 14 | + batchCode: string | |
| 15 | + remark: string | |
| 16 | + createTime: string | |
| 17 | +} | |
| 18 | + | |
| 19 | +// MES 产品收货单行 API | |
| 20 | +export const WmProductRecptLineApi = { | |
| 21 | + // 查询产品收货单行分页 | |
| 22 | + getProductRecptLinePage: async (params: any) => { | |
| 23 | + return await request.get({ url: '/mes/wm/product-recpt-line/page', params }) | |
| 24 | + }, | |
| 25 | + | |
| 26 | + // 查询产品收货单行详情 | |
| 27 | + getProductRecptLine: async (id: number) => { | |
| 28 | + return await request.get({ url: '/mes/wm/product-recpt-line/get?id=' + id }) | |
| 29 | + }, | |
| 30 | + | |
| 31 | + // 新增产品收货单行 | |
| 32 | + createProductRecptLine: async (data: WmProductRecptLineVO) => { | |
| 33 | + return await request.post({ url: '/mes/wm/product-recpt-line/create', data }) | |
| 34 | + }, | |
| 35 | + | |
| 36 | + // 修改产品收货单行 | |
| 37 | + updateProductRecptLine: async (data: WmProductRecptLineVO) => { | |
| 38 | + return await request.put({ url: '/mes/wm/product-recpt-line/update', data }) | |
| 39 | + }, | |
| 40 | + | |
| 41 | + // 删除产品收货单行 | |
| 42 | + deleteProductRecptLine: async (id: number) => { | |
| 43 | + return await request.delete({ url: '/mes/wm/product-recpt-line/delete?id=' + id }) | |
| 44 | + } | |
| 45 | +} | ... | ... |