feat(mes): 重构生产入库单行相关逻辑,更新字段及接口

重命名和更新了生产入库单行的请求和响应对象,调整了字段名称以更好地反映业务逻辑。同时,优化了控制器中的相关方法,确保与新的数据结构一致。此变更旨在提升代码的可读性和维护性。
This commit is contained in:
YunaiV
2026-03-21 21:23:57 +08:00
parent 6a2a05b32e
commit 89ae4e1c74
20 changed files with 59 additions and 1107 deletions

View File

@@ -1,175 +0,0 @@
package cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.MesWmProductProducePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.MesWmProductProduceRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.MesWmProductProduceSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDO;
import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService;
import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService;
import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceService;
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.Collections;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@Tag(name = "管理后台 - MES 生产入库单")
@RestController
@RequestMapping("/mes/wm/product-produce")
@Validated
public class MesWmProductProduceController {
@Resource
private MesWmProductProduceService produceService;
@Resource
private MesMdWorkstationService workstationService;
@Resource
private MesProWorkOrderService workOrderService;
@Resource
private MesProProcessService processService;
@Resource
private MesProTaskService taskService;
@PostMapping("/create")
@Operation(summary = "创建生产入库单")
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:create')")
public CommonResult<Long> createProductProduce(@Valid @RequestBody MesWmProductProduceSaveReqVO createReqVO) {
return success(produceService.createProductProduce(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "修改生产入库单")
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:update')")
public CommonResult<Boolean> updateProductProduce(@Valid @RequestBody MesWmProductProduceSaveReqVO updateReqVO) {
produceService.updateProductProduce(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除生产入库单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:delete')")
public CommonResult<Boolean> deleteProductProduce(@RequestParam("id") Long id) {
produceService.deleteProductProduce(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得生产入库单")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:query')")
public CommonResult<MesWmProductProduceRespVO> getProductProduce(@RequestParam("id") Long id) {
MesWmProductProduceDO produce = produceService.getProductProduce(id);
if (produce == null) {
return success(null);
}
return success(buildRespVOList(Collections.singletonList(produce)).get(0));
}
@GetMapping("/page")
@Operation(summary = "获得生产入库单分页")
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:query')")
public CommonResult<PageResult<MesWmProductProduceRespVO>> getProductProducePage(
@Valid MesWmProductProducePageReqVO pageReqVO) {
PageResult<MesWmProductProduceDO> pageResult = produceService.getProductProducePage(pageReqVO);
return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal()));
}
@GetMapping("/export-excel")
@Operation(summary = "导出生产入库单 Excel")
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportProductProduceExcel(@Valid MesWmProductProducePageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
PageResult<MesWmProductProduceDO> pageResult = produceService.getProductProducePage(pageReqVO);
ExcelUtils.write(response, "生产入库单.xls", "数据", MesWmProductProduceRespVO.class,
buildRespVOList(pageResult.getList()));
}
@PutMapping("/finish")
@Operation(summary = "完成生产入库单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:update-status')")
public CommonResult<Boolean> finishProductProduce(@RequestParam("id") Long id) {
produceService.finishProductProduce(id);
return success(true);
}
@PutMapping("/cancel")
@Operation(summary = "取消生产入库单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:update-status')")
public CommonResult<Boolean> cancelProductProduce(@RequestParam("id") Long id) {
produceService.cancelProductProduce(id);
return success(true);
}
@GetMapping("/check-quantity")
@Operation(summary = "校验生产入库单数量", description = "校验每行明细数量之和是否等于行入库数量")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:query')")
public CommonResult<Boolean> checkProductProduceQuantity(@RequestParam("id") Long id) {
return success(produceService.checkProductProduceQuantity(id));
}
// ==================== 拼接 VO ====================
private List<MesWmProductProduceRespVO> buildRespVOList(List<MesWmProductProduceDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 1. 获得关联数据
Map<Long, MesMdWorkstationDO> workstationMap = workstationService.getWorkstationMap(
convertSet(list, MesWmProductProduceDO::getWorkstationId));
Map<Long, MesProWorkOrderDO> workOrderMap = workOrderService.getWorkOrderMap(
convertSet(list, MesWmProductProduceDO::getWorkOrderId));
Map<Long, MesProProcessDO> processMap = processService.getProcessMap(
convertSet(list, MesWmProductProduceDO::getProcessId));
Map<Long, MesProTaskDO> taskMap = taskService.getTaskMap(
convertSet(list, MesWmProductProduceDO::getTaskId));
// 2. 构建结果
return BeanUtils.toBean(list, MesWmProductProduceRespVO.class, vo -> {
// 2.1 填充工作站名称
MapUtils.findAndThen(workstationMap, vo.getWorkstationId(),
workstation -> vo.setWorkstationName(workstation.getName()));
// 2.2 填充工单编号
MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(),
workOrder -> vo.setWorkOrderCode(workOrder.getCode()));
// 2.3 填充工序名称
MapUtils.findAndThen(processMap, vo.getProcessId(),
process -> vo.setProcessName(process.getName()));
// 2.4 填充任务编号
MapUtils.findAndThen(taskMap, vo.getTaskId(),
task -> vo.setTaskCode(task.getCode()));
});
}
}

View File

@@ -1,140 +0,0 @@
package cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.detail.MesWmProductProduceDetailRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.detail.MesWmProductProduceDetailSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDetailDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceDetailService;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
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.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@Tag(name = "管理后台 - MES 生产入库明细")
@RestController
@RequestMapping("/mes/wm/product-produce-detail")
@Validated
public class MesWmProductProduceDetailController {
@Resource
private MesWmProductProduceDetailService produceDetailService;
@Resource
private MesMdItemService itemService;
@Resource
private MesMdUnitMeasureService unitMeasureService;
@Resource
private MesWmWarehouseService warehouseService;
@Resource
private MesWmWarehouseLocationService locationService;
@Resource
private MesWmWarehouseAreaService areaService;
@PostMapping("/create")
@Operation(summary = "创建生产入库明细")
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:create')")
public CommonResult<Long> createProductProduceDetail(@Valid @RequestBody MesWmProductProduceDetailSaveReqVO createReqVO) {
return success(produceDetailService.createProductProduceDetail(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "修改生产入库明细")
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:update')")
public CommonResult<Boolean> updateProductProduceDetail(@Valid @RequestBody MesWmProductProduceDetailSaveReqVO updateReqVO) {
produceDetailService.updateProductProduceDetail(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除生产入库明细")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:delete')")
public CommonResult<Boolean> deleteProductProduceDetail(@RequestParam("id") Long id) {
produceDetailService.deleteProductProduceDetail(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得生产入库明细")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:query')")
public CommonResult<MesWmProductProduceDetailRespVO> getProductProduceDetail(@RequestParam("id") Long id) {
MesWmProductProduceDetailDO detail = produceDetailService.getProductProduceDetail(id);
if (detail == null) {
return success(null);
}
return success(buildRespVOList(Collections.singletonList(detail)).get(0));
}
@GetMapping("/list-by-line")
@Operation(summary = "获得生产入库明细列表(按行编号)")
@Parameter(name = "lineId", description = "行编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:query')")
public CommonResult<List<MesWmProductProduceDetailRespVO>> getProductProduceDetailListByLineId(
@RequestParam("lineId") Long lineId) {
List<MesWmProductProduceDetailDO> list = produceDetailService.getProductProduceDetailListByLineId(lineId);
return success(buildRespVOList(list));
}
// ==================== 拼接 VO ====================
private List<MesWmProductProduceDetailRespVO> buildRespVOList(List<MesWmProductProduceDetailDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 1. 获得关联数据
Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
convertSet(list, MesWmProductProduceDetailDO::getItemId));
Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
convertSet(list, MesWmProductProduceDetailDO::getWarehouseId));
Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
convertSet(list, MesWmProductProduceDetailDO::getLocationId));
Map<Long, MesWmWarehouseAreaDO> areaMap = areaService.getWarehouseAreaMap(
convertSet(list, MesWmProductProduceDetailDO::getAreaId));
// 2. 构建结果
return BeanUtils.toBean(list, MesWmProductProduceDetailRespVO.class, vo -> {
MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification());
MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName()));
});
MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(),
warehouse -> vo.setWarehouseName(warehouse.getName()));
MapUtils.findAndThen(locationMap, vo.getLocationId(),
location -> vo.setLocationName(location.getName()));
MapUtils.findAndThen(areaMap, vo.getAreaId(),
area -> vo.setAreaName(area.getName()));
});
}
}

View File

@@ -5,9 +5,8 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.line.MesWmProductProduceLinePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.line.MesWmProductProduceLineRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.line.MesWmProductProduceLineSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.MesWmProductProduceLinePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.MesWmProductProduceLineRespVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO;
@@ -15,13 +14,14 @@ import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceLineService;
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.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.List;
@@ -37,69 +37,22 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
public class MesWmProductProduceLineController {
@Resource
private MesWmProductProduceLineService produceLineService;
private MesWmProductProduceLineService productProduceLineService;
@Resource
private MesMdItemService itemService;
@Resource
private MesMdUnitMeasureService unitMeasureService;
@PostMapping("/create")
@Operation(summary = "创建生产入库单行")
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:create')")
public CommonResult<Long> createProductProduceLine(@Valid @RequestBody MesWmProductProduceLineSaveReqVO createReqVO) {
return success(produceLineService.createProductProduceLine(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "修改生产入库单行")
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:update')")
public CommonResult<Boolean> updateProductProduceLine(@Valid @RequestBody MesWmProductProduceLineSaveReqVO updateReqVO) {
produceLineService.updateProductProduceLine(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除生产入库单行")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:delete')")
public CommonResult<Boolean> deleteProductProduceLine(@RequestParam("id") Long id) {
produceLineService.deleteProductProduceLine(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得生产入库单行")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:query')")
public CommonResult<MesWmProductProduceLineRespVO> getProductProduceLine(@RequestParam("id") Long id) {
MesWmProductProduceLineDO line = produceLineService.getProductProduceLine(id);
if (line == null) {
return success(null);
}
return success(buildRespVOList(Collections.singletonList(line)).get(0));
}
@GetMapping("/page")
@Operation(summary = "获得生产入库单行分页")
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:query')")
public CommonResult<PageResult<MesWmProductProduceLineRespVO>> getProductProduceLinePage(
@Valid MesWmProductProduceLinePageReqVO pageReqVO) {
PageResult<MesWmProductProduceLineDO> pageResult = produceLineService.getProductProduceLinePage(pageReqVO);
PageResult<MesWmProductProduceLineDO> pageResult = productProduceLineService.getProductProduceLinePage(
pageReqVO);
return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal()));
}
@GetMapping("/list-by-produce")
@Operation(summary = "获得生产入库单行列表(按入库单编号)")
@Parameter(name = "produceId", description = "入库单编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('mes:wm-product-produce:query')")
public CommonResult<List<MesWmProductProduceLineRespVO>> getProductProduceLineListByProduceId(
@RequestParam("produceId") Long produceId) {
List<MesWmProductProduceLineDO> list = produceLineService.getProductProduceLineListByProduceId(produceId);
return success(buildRespVOList(list));
}
// ==================== 拼接 VO ====================
private List<MesWmProductProduceLineRespVO> buildRespVOList(List<MesWmProductProduceLineDO> list) {

View File

@@ -1,4 +1,4 @@
package cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.line;
package cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -13,8 +13,8 @@ import lombok.ToString;
@ToString(callSuper = true)
public class MesWmProductProduceLinePageReqVO extends PageParam {
@Schema(description = "入库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "入库单编号不能为空")
private Long produceId;
@Schema(description = "报工单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "报工单编号不能为空")
private Long feedbackId;
}

View File

@@ -1,4 +1,4 @@
package cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.line;
package cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

View File

@@ -1,34 +0,0 @@
package cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - MES 生产入库单分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
public class MesWmProductProducePageReqVO extends PageParam {
@Schema(description = "生产工单ID", example = "1")
private Long workOrderId;
@Schema(description = "工作站ID", example = "1")
private Long workstationId;
@Schema(description = "工序ID", example = "1")
private Long processId;
@Schema(description = "状态", example = "10")
private Integer status;
@Schema(description = "入库日期范围")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] produceDate;
}

View File

@@ -1,54 +0,0 @@
package cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - MES 生产入库单 Response VO")
@Data
public class MesWmProductProduceRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "生产工单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long workOrderId;
@Schema(description = "生产工单编号", example = "WO20250226001")
private String workOrderCode;
@Schema(description = "报工单 ID", example = "1")
private Long feedbackId;
@Schema(description = "生产任务 ID", example = "1")
private Long taskId;
@Schema(description = "生产任务编号", example = "TASK20250226001")
private String taskCode;
@Schema(description = "工作站 ID", example = "1")
private Long workstationId;
@Schema(description = "工作站名称", example = "装配工作站")
private String workstationName;
@Schema(description = "工序 ID", example = "1")
private Long processId;
@Schema(description = "工序名称", example = "组装工序")
private String processName;
@Schema(description = "入库日期")
private LocalDateTime produceDate;
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
private Integer status;
@Schema(description = "备注", example = "备注")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@@ -1,38 +0,0 @@
package cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - MES 生产入库单新增/修改 Request VO")
@Data
public class MesWmProductProduceSaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "生产工单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "生产工单 ID 不能为空")
private Long workOrderId;
@Schema(description = "报工单 ID", example = "1")
private Long feedbackId;
@Schema(description = "生产任务 ID", example = "1")
private Long taskId;
@Schema(description = "工作站 ID", example = "1")
private Long workstationId;
@Schema(description = "工序 ID", example = "1")
private Long processId;
@Schema(description = "入库日期")
private LocalDateTime produceDate;
@Schema(description = "备注", example = "备注")
private String remark;
}

View File

@@ -1,70 +0,0 @@
package cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.detail;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - MES 生产入库明细 Response VO")
@Data
public class MesWmProductProduceDetailRespVO {
@Schema(description = "编号", example = "1")
private Long id;
@Schema(description = "入库单编号", example = "1")
private Long produceId;
@Schema(description = "行编号", example = "1")
private Long lineId;
@Schema(description = "物料编号", example = "1")
private Long itemId;
@Schema(description = "物料编码", example = "ITEM001")
private String itemCode;
@Schema(description = "物料名称", example = "螺丝")
private String itemName;
@Schema(description = "规格型号", example = "M8*20")
private String specification;
@Schema(description = "计量单位名称", example = "")
private String unitMeasureName;
@Schema(description = "入库数量", example = "300.00")
private BigDecimal quantity;
@Schema(description = "批次编号", example = "1")
private Long batchId;
@Schema(description = "批次号", example = "BATCH20260101001")
private String batchCode;
@Schema(description = "仓库编号", example = "1")
private Long warehouseId;
@Schema(description = "仓库名称", example = "成品仓库")
private String warehouseName;
@Schema(description = "库区编号", example = "1")
private Long locationId;
@Schema(description = "库区名称", example = "A区")
private String locationName;
@Schema(description = "库位编号", example = "1")
private Long areaId;
@Schema(description = "库位名称", example = "A01")
private String areaName;
@Schema(description = "备注", example = "备注")
private String remark;
@Schema(description = "创建时间")
private LocalDateTime createTime;
}

View File

@@ -1,50 +0,0 @@
package cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.detail;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
@Schema(description = "管理后台 - MES 生产入库明细新增/修改 Request VO")
@Data
public class MesWmProductProduceDetailSaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "入库单行编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "入库单行编号不能为空")
private Long lineId;
@Schema(description = "入库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "入库单编号不能为空")
private Long produceId;
@Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "物料编号不能为空")
private Long itemId;
@Schema(description = "入库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "300.00")
@NotNull(message = "入库数量不能为空")
private BigDecimal quantity;
@Schema(description = "批次编号", example = "1")
private Long batchId;
@Schema(description = "批次号", example = "BATCH20260101001")
private String batchCode;
@Schema(description = "仓库编号", example = "1")
private Long warehouseId;
@Schema(description = "库区编号", example = "1")
private Long locationId;
@Schema(description = "库位编号", example = "1")
private Long areaId;
@Schema(description = "备注", example = "备注")
private String remark;
}

View File

@@ -1,52 +0,0 @@
package cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.line;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - MES 生产入库单行 Save Request VO")
@Data
public class MesWmProductProduceLineSaveReqVO {
@Schema(description = "行ID", example = "1")
private Long id;
@Schema(description = "入库单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "入库单ID不能为空")
private Long produceId;
@Schema(description = "报工单 ID", example = "1")
private Long feedbackId;
@Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "物料ID不能为空")
private Long itemId;
@Schema(description = "入库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@NotNull(message = "入库数量不能为空")
@DecimalMin(value = "0", inclusive = false, message = "入库数量必须大于 0")
private BigDecimal quantity;
@Schema(description = "批次ID", example = "1")
private Long batchId;
@Schema(description = "批次号", example = "BATCH20260101001")
private String batchCode;
@Schema(description = "有效期")
private LocalDateTime expireDate;
@Schema(description = "批号", example = "LOT001")
private String lotNumber;
@Schema(description = "质检状态", example = "1")
private Integer qualityStatus;
@Schema(description = "备注", example = "备注")
private String remark;
}

View File

@@ -18,12 +18,4 @@ public interface MesWmProductProduceDetailMapper extends BaseMapperX<MesWmProduc
return selectList(MesWmProductProduceDetailDO::getLineId, lineId);
}
default List<MesWmProductProduceDetailDO> selectListByProduceId(Long produceId) {
return selectList(MesWmProductProduceDetailDO::getProduceId, produceId);
}
default void deleteByProduceId(Long produceId) {
delete(MesWmProductProduceDetailDO::getProduceId, produceId);
}
}

View File

@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.line.MesWmProductProduceLinePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.MesWmProductProduceLinePageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO;
import org.apache.ibatis.annotations.Mapper;
@@ -19,7 +19,7 @@ public interface MesWmProductProduceLineMapper extends BaseMapperX<MesWmProductP
default PageResult<MesWmProductProduceLineDO> selectPage(MesWmProductProduceLinePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<MesWmProductProduceLineDO>()
.eqIfPresent(MesWmProductProduceLineDO::getProduceId, reqVO.getProduceId())
.eqIfPresent(MesWmProductProduceLineDO::getFeedbackId, reqVO.getFeedbackId())
.orderByDesc(MesWmProductProduceLineDO::getId));
}
@@ -27,10 +27,6 @@ public interface MesWmProductProduceLineMapper extends BaseMapperX<MesWmProductP
return selectList(MesWmProductProduceLineDO::getProduceId, produceId);
}
default void deleteByProduceId(Long produceId) {
delete(MesWmProductProduceLineDO::getProduceId, produceId);
}
default List<MesWmProductProduceLineDO> selectListByFeedbackId(Long feedbackId) {
return selectList(MesWmProductProduceLineDO::getFeedbackId, feedbackId);
}

View File

@@ -1,9 +1,6 @@
package cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.MesWmProductProducePageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDO;
import org.apache.ibatis.annotations.Mapper;
@@ -15,14 +12,4 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface MesWmProductProduceMapper extends BaseMapperX<MesWmProductProduceDO> {
default PageResult<MesWmProductProduceDO> selectPage(MesWmProductProducePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<MesWmProductProduceDO>()
.eqIfPresent(MesWmProductProduceDO::getWorkOrderId, reqVO.getWorkOrderId())
.eqIfPresent(MesWmProductProduceDO::getWorkstationId, reqVO.getWorkstationId())
.eqIfPresent(MesWmProductProduceDO::getProcessId, reqVO.getProcessId())
.eqIfPresent(MesWmProductProduceDO::getStatus, reqVO.getStatus())
.betweenIfPresent(MesWmProductProduceDO::getProduceDate, reqVO.getProduceDate())
.orderByDesc(MesWmProductProduceDO::getId));
}
}

View File

@@ -1,8 +1,6 @@
package cn.iocoder.yudao.module.mes.service.wm.productproduce;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.detail.MesWmProductProduceDetailSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDetailDO;
import jakarta.validation.Valid;
import java.util.List;
@@ -12,34 +10,11 @@ import java.util.List;
public interface MesWmProductProduceDetailService {
/**
* 创建生产入库明细
* 创建生产入库明细(内部使用)
*
* @param createReqVO 创建信息
* @return 编号
* @param detail 明细数据
*/
Long createProductProduceDetail(@Valid MesWmProductProduceDetailSaveReqVO createReqVO);
/**
* 更新生产入库明细
*
* @param updateReqVO 更新信息
*/
void updateProductProduceDetail(@Valid MesWmProductProduceDetailSaveReqVO updateReqVO);
/**
* 删除生产入库明细
*
* @param id 编号
*/
void deleteProductProduceDetail(Long id);
/**
* 获得生产入库明细
*
* @param id 编号
* @return 生产入库明细
*/
MesWmProductProduceDetailDO getProductProduceDetail(Long id);
void createProductProduceDetail(MesWmProductProduceDetailDO detail);
/**
* 根据行ID获取明细列表
@@ -49,19 +24,4 @@ public interface MesWmProductProduceDetailService {
*/
List<MesWmProductProduceDetailDO> getProductProduceDetailListByLineId(Long lineId);
/**
* 根据入库单ID获取明细列表
*
* @param produceId 入库单ID
* @return 明细列表
*/
List<MesWmProductProduceDetailDO> getProductProduceDetailListByProduceId(Long produceId);
/**
* 根据入库单ID删除明细
*
* @param produceId 入库单ID
*/
void deleteProductProduceDetailByProduceId(Long produceId);
}

View File

@@ -1,19 +1,13 @@
package cn.iocoder.yudao.module.mes.service.wm.productproduce;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.detail.MesWmProductProduceDetailSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDetailDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceDetailMapper;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCT_PRODUCE_DETAIL_NOT_EXISTS;
/**
* MES 生产入库明细 Service 实现类
*/
@@ -22,67 +16,16 @@ import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCT_PR
public class MesWmProductProduceDetailServiceImpl implements MesWmProductProduceDetailService {
@Resource
private MesWmProductProduceDetailMapper produceDetailMapper;
@Resource
@Lazy
private MesWmProductProduceLineService produceLineService;
private MesWmProductProduceDetailMapper productProduceDetailMapper;
@Override
public Long createProductProduceDetail(MesWmProductProduceDetailSaveReqVO createReqVO) {
// 校验父数据存在
produceLineService.validateProductProduceLineExists(createReqVO.getLineId());
// 插入
MesWmProductProduceDetailDO detail = BeanUtils.toBean(createReqVO, MesWmProductProduceDetailDO.class);
produceDetailMapper.insert(detail);
return detail.getId();
}
@Override
public void updateProductProduceDetail(MesWmProductProduceDetailSaveReqVO updateReqVO) {
// 校验存在
validateProductProduceDetailExists(updateReqVO.getId());
// 校验父数据存在
produceLineService.validateProductProduceLineExists(updateReqVO.getLineId());
// 更新
MesWmProductProduceDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductProduceDetailDO.class);
produceDetailMapper.updateById(updateObj);
}
@Override
public void deleteProductProduceDetail(Long id) {
// 校验存在
validateProductProduceDetailExists(id);
// 删除
produceDetailMapper.deleteById(id);
}
@Override
public MesWmProductProduceDetailDO getProductProduceDetail(Long id) {
return produceDetailMapper.selectById(id);
public void createProductProduceDetail(MesWmProductProduceDetailDO detail) {
productProduceDetailMapper.insert(detail);
}
@Override
public List<MesWmProductProduceDetailDO> getProductProduceDetailListByLineId(Long lineId) {
return produceDetailMapper.selectListByLineId(lineId);
}
@Override
public List<MesWmProductProduceDetailDO> getProductProduceDetailListByProduceId(Long produceId) {
return produceDetailMapper.selectListByProduceId(produceId);
}
@Override
public void deleteProductProduceDetailByProduceId(Long produceId) {
produceDetailMapper.deleteByProduceId(produceId);
}
private void validateProductProduceDetailExists(Long id) {
if (produceDetailMapper.selectById(id) == null) {
throw exception(WM_PRODUCT_PRODUCE_DETAIL_NOT_EXISTS);
}
return productProduceDetailMapper.selectListByLineId(lineId);
}
}

View File

@@ -1,10 +1,8 @@
package cn.iocoder.yudao.module.mes.service.wm.productproduce;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.line.MesWmProductProduceLinePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.line.MesWmProductProduceLineSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.MesWmProductProduceLinePageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO;
import jakarta.validation.Valid;
import java.util.List;
@@ -14,72 +12,34 @@ import java.util.List;
public interface MesWmProductProduceLineService {
/**
* 创建生产入库单行
* 创建生产入库单行(内部使用)
*
* @param createReqVO 创建信息
* @return 编号
* @param line 行数据
*/
Long createProductProduceLine(@Valid MesWmProductProduceLineSaveReqVO createReqVO);
void createProductProduceLine(MesWmProductProduceLineDO line);
/**
* 更新生产入库单行
* 根据入库单 ID 获取行列表
*
* @param updateReqVO 更新信息
*/
void updateProductProduceLine(@Valid MesWmProductProduceLineSaveReqVO updateReqVO);
/**
* 删除生产入库单行
*
* @param id 编号
*/
void deleteProductProduceLine(Long id);
/**
* 获得生产入库单行
*
* @param id 编号
* @return 生产入库单行
*/
MesWmProductProduceLineDO getProductProduceLine(Long id);
/**
* 获得生产入库单行分页
*
* @param pageReqVO 分页查询
* @return 生产入库单行分页
*/
PageResult<MesWmProductProduceLineDO> getProductProduceLinePage(MesWmProductProduceLinePageReqVO pageReqVO);
/**
* 根据入库单ID获取行列表
*
* @param produceId 入库单ID
* @param produceId 入库单 ID
* @return 行列表
*/
List<MesWmProductProduceLineDO> getProductProduceLineListByProduceId(Long produceId);
/**
* 根据入库单ID删除行
* 根据报工记录 ID 获取行列表
*
* @param produceId 入库单ID
*/
void deleteProductProduceLineByProduceId(Long produceId);
/**
* 校验生产入库单行是否存在
*
* @param id 编号
* @return 生产入库单行
*/
MesWmProductProduceLineDO validateProductProduceLineExists(Long id);
/**
* 根据报工记录ID获取行列表
*
* @param feedbackId 报工记录ID
* @param feedbackId 报工记录 ID
* @return 行列表
*/
List<MesWmProductProduceLineDO> getProductProduceLineListByFeedbackId(Long feedbackId);
/**
* 获得生产入库单行分页
*
* @param pageReqVO 分页查询参数
* @return 行分页列表
*/
PageResult<MesWmProductProduceLineDO> getProductProduceLinePage(MesWmProductProduceLinePageReqVO pageReqVO);
}

View File

@@ -1,22 +1,15 @@
package cn.iocoder.yudao.module.mes.service.wm.productproduce;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.line.MesWmProductProduceLinePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.line.MesWmProductProduceLineSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.MesWmProductProduceLinePageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceLineMapper;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCT_PRODUCE_LINE_NOT_EXISTS;
/**
* MES 生产入库单行 Service 实现类
*/
@@ -25,81 +18,26 @@ import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCT_PR
public class MesWmProductProduceLineServiceImpl implements MesWmProductProduceLineService {
@Resource
private MesWmProductProduceLineMapper produceLineMapper;
@Resource
@Lazy
private MesWmProductProduceService produceService;
@Resource
private MesMdItemService itemService;
private MesWmProductProduceLineMapper productProduceLineMapper;
@Override
public Long createProductProduceLine(MesWmProductProduceLineSaveReqVO createReqVO) {
// 校验父数据存在
produceService.validateProductProduceExists(createReqVO.getProduceId());
// 校验物料存在
itemService.validateItemExists(createReqVO.getItemId());
// 插入
MesWmProductProduceLineDO line = BeanUtils.toBean(createReqVO, MesWmProductProduceLineDO.class);
produceLineMapper.insert(line);
return line.getId();
}
@Override
public void updateProductProduceLine(MesWmProductProduceLineSaveReqVO updateReqVO) {
// 校验存在
validateProductProduceLineExists(updateReqVO.getId());
// 校验父数据存在
produceService.validateProductProduceExists(updateReqVO.getProduceId());
// 校验物料存在
itemService.validateItemExists(updateReqVO.getItemId());
// 更新
MesWmProductProduceLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductProduceLineDO.class);
produceLineMapper.updateById(updateObj);
}
@Override
public void deleteProductProduceLine(Long id) {
// 校验存在
validateProductProduceLineExists(id);
// 删除
produceLineMapper.deleteById(id);
}
@Override
public MesWmProductProduceLineDO getProductProduceLine(Long id) {
return produceLineMapper.selectById(id);
}
@Override
public PageResult<MesWmProductProduceLineDO> getProductProduceLinePage(MesWmProductProduceLinePageReqVO pageReqVO) {
return produceLineMapper.selectPage(pageReqVO);
public void createProductProduceLine(MesWmProductProduceLineDO line) {
productProduceLineMapper.insert(line);
}
@Override
public List<MesWmProductProduceLineDO> getProductProduceLineListByProduceId(Long produceId) {
return produceLineMapper.selectListByProduceId(produceId);
}
@Override
public void deleteProductProduceLineByProduceId(Long produceId) {
produceLineMapper.deleteByProduceId(produceId);
}
@Override
public MesWmProductProduceLineDO validateProductProduceLineExists(Long id) {
MesWmProductProduceLineDO line = produceLineMapper.selectById(id);
if (line == null) {
throw exception(WM_PRODUCT_PRODUCE_LINE_NOT_EXISTS);
}
return line;
return productProduceLineMapper.selectListByProduceId(produceId);
}
@Override
public List<MesWmProductProduceLineDO> getProductProduceLineListByFeedbackId(Long feedbackId) {
return produceLineMapper.selectListByFeedbackId(feedbackId);
return productProduceLineMapper.selectListByFeedbackId(feedbackId);
}
@Override
public PageResult<MesWmProductProduceLineDO> getProductProduceLinePage(MesWmProductProduceLinePageReqVO pageReqVO) {
return productProduceLineMapper.selectPage(pageReqVO);
}
}

View File

@@ -1,55 +1,13 @@
package cn.iocoder.yudao.module.mes.service.wm.productproduce;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.MesWmProductProducePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.MesWmProductProduceSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDO;
import jakarta.validation.Valid;
/**
* MES 生产入库单 Service 接口
*/
public interface MesWmProductProduceService {
/**
* 创建生产入库单
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createProductProduce(@Valid MesWmProductProduceSaveReqVO createReqVO);
/**
* 修改生产入库单
*
* @param updateReqVO 修改信息
*/
void updateProductProduce(@Valid MesWmProductProduceSaveReqVO updateReqVO);
/**
* 删除生产入库单
*
* @param id 编号
*/
void deleteProductProduce(Long id);
/**
* 获得生产入库单
*
* @param id 编号
* @return 生产入库单
*/
MesWmProductProduceDO getProductProduce(Long id);
/**
* 获得生产入库单分页
*
* @param pageReqVO 分页参数
* @return 生产入库单分页
*/
PageResult<MesWmProductProduceDO> getProductProducePage(MesWmProductProducePageReqVO pageReqVO);
/**
* 校验生产入库单是否存在
*
@@ -65,21 +23,6 @@ public interface MesWmProductProduceService {
*/
void finishProductProduce(Long id);
/**
* 取消生产入库单(非已完成/已取消状态 → 已取消)
*
* @param id 编号
*/
void cancelProductProduce(Long id);
/**
* 校验生产入库单的数量:每行明细数量之和是否等于行入库数量
*
* @param id 编号
* @return 是否全部一致
*/
Boolean checkProductProduceQuantity(Long id);
/**
* 根据报工记录,自动生成产品产出单(头 + 行 + 明细)
*

View File

@@ -3,25 +3,17 @@ package cn.iocoder.yudao.module.mes.service.wm.productproduce;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.MesWmProductProducePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.MesWmProductProduceSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDetailDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceDetailMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceLineMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceMapper;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductProduceStatusEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
import jakarta.annotation.Resource;
@@ -46,98 +38,31 @@ public class MesWmProductProduceServiceImpl implements MesWmProductProduceServic
@Resource
private MesWmProductProduceMapper productProduceMapper;
// TODO @芋艿:需要优化,不要直接调用对方的 mapper
@Resource
private MesWmProductProduceLineMapper produceLineMapper;
// TODO @芋艿:需要优化,不要直接调用对方的 mapper
@Resource
private MesWmProductProduceDetailMapper produceDetailMapper;
@Resource
private MesWmProductProduceLineService produceLineService;
private MesWmProductProduceLineService productProduceLineService;
@Resource
private MesWmProductProduceDetailService produceDetailService;
@Resource
private MesMdWorkstationService workstationService;
private MesWmProductProduceDetailService productProduceDetailService;
@Resource
private MesProWorkOrderService workOrderService;
@Resource
private MesWmBatchService batchService;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createProductProduce(MesWmProductProduceSaveReqVO createReqVO) {
// 1. 校验关联数据
if (createReqVO.getWorkOrderId() != null) {
workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId());
}
if (createReqVO.getWorkstationId() != null) {
workstationService.validateWorkstationExists(createReqVO.getWorkstationId());
}
// 2. 插入主表
MesWmProductProduceDO produce = BeanUtils.toBean(createReqVO, MesWmProductProduceDO.class);
produce.setStatus(MesWmProductProduceStatusEnum.PREPARE.getStatus());
productProduceMapper.insert(produce);
return produce.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateProductProduce(MesWmProductProduceSaveReqVO updateReqVO) {
// 1.1 校验存在 + 准备中状态
validateProductProduceExistsAndPrepare(updateReqVO.getId());
// 1.2 校验关联数据
if (updateReqVO.getWorkOrderId() != null) {
workOrderService.validateWorkOrderExists(updateReqVO.getWorkOrderId());
}
if (updateReqVO.getWorkstationId() != null) {
workstationService.validateWorkstationExists(updateReqVO.getWorkstationId());
}
// 2. 更新主表
MesWmProductProduceDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductProduceDO.class);
productProduceMapper.updateById(updateObj);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteProductProduce(Long id) {
// 1. 校验存在 + 准备中状态
validateProductProduceExistsAndPrepare(id);
// 2.1 级联删除明细
produceDetailService.deleteProductProduceDetailByProduceId(id);
// 2.2 级联删除行
produceLineService.deleteProductProduceLineByProduceId(id);
// 2.3 删除主表
productProduceMapper.deleteById(id);
}
@Override
public MesWmProductProduceDO getProductProduce(Long id) {
return productProduceMapper.selectById(id);
}
@Override
public PageResult<MesWmProductProduceDO> getProductProducePage(MesWmProductProducePageReqVO pageReqVO) {
return productProduceMapper.selectPage(pageReqVO);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void finishProductProduce(Long id) {
// 1.1 校验存在 + 草稿状态
validateProductProduceExistsAndPrepare(id);
// 1.2 校验至少有一条行
List<MesWmProductProduceLineDO> lines = produceLineService.getProductProduceLineListByProduceId(id);
List<MesWmProductProduceLineDO> lines = productProduceLineService.getProductProduceLineListByProduceId(id);
if (CollUtil.isEmpty(lines)) {
throw exception(WM_PRODUCT_PRODUCE_NO_LINE);
}
// 2. 校验每行明细数量之和等于行数量
for (MesWmProductProduceLineDO line : lines) {
List<MesWmProductProduceDetailDO> details = produceDetailService.getProductProduceDetailListByLineId(line.getId());
List<MesWmProductProduceDetailDO> details = productProduceDetailService.getProductProduceDetailListByLineId(
line.getId());
BigDecimal totalDetailQty = CollectionUtils.getSumValue(details,
MesWmProductProduceDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO);
if (line.getQuantity() != null && totalDetailQty.compareTo(line.getQuantity()) != 0) {
@@ -152,37 +77,6 @@ public class MesWmProductProduceServiceImpl implements MesWmProductProduceServic
.setId(id).setStatus(MesWmProductProduceStatusEnum.FINISHED.getStatus()));
}
@Override
@Transactional(rollbackFor = Exception.class)
public void cancelProductProduce(Long id) {
// 1. 校验存在
MesWmProductProduceDO produce = validateProductProduceExists(id);
// 已完成和已取消不允许取消
if (ObjectUtils.equalsAny(produce.getStatus(),
MesWmProductProduceStatusEnum.FINISHED.getStatus(),
MesWmProductProduceStatusEnum.CANCELED.getStatus())) {
throw exception(WM_PRODUCT_PRODUCE_CANCEL_NOT_ALLOWED);
}
// 2. 取消
productProduceMapper.updateById(new MesWmProductProduceDO()
.setId(id).setStatus(MesWmProductProduceStatusEnum.CANCELED.getStatus()));
}
@Override
public Boolean checkProductProduceQuantity(Long id) {
List<MesWmProductProduceLineDO> lines = produceLineService.getProductProduceLineListByProduceId(id);
for (MesWmProductProduceLineDO line : lines) {
List<MesWmProductProduceDetailDO> details = produceDetailService.getProductProduceDetailListByLineId(line.getId());
BigDecimal totalDetailQty = CollectionUtils.getSumValue(details,
MesWmProductProduceDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO);
if (line.getQuantity() != null && totalDetailQty.compareTo(line.getQuantity()) != 0) {
return false;
}
}
return true;
}
@Override
@Transactional(rollbackFor = Exception.class)
public MesWmProductProduceDO generateProductProduce(MesProFeedbackDO feedback, boolean checkFlag) {
@@ -217,7 +111,7 @@ public class MesWmProductProduceServiceImpl implements MesWmProductProduceServic
// 3.1 需要检验:创建一条行(质量状态=待检验),不生成明细
MesWmProductProduceLineDO line = buildProduceLine(produce, feedback, batchId, batchCode,
feedback.getFeedbackQuantity(), MesWmQualityStatusEnum.PENDING.getStatus());
produceLineMapper.insert(line);
productProduceLineService.createProductProduceLine(line);
// TODO @芋艿:先不生成明细行,等待检验完成时,再根据行的质量状态生成明细行
} else {
// 3.2 无需检验:按合格品/不合格品各生成一行 + 明细
@@ -227,19 +121,19 @@ public class MesWmProductProduceServiceImpl implements MesWmProductProduceServic
if (unqualifiedQty.compareTo(BigDecimal.ZERO) > 0) {
MesWmProductProduceLineDO unqualifiedLine = buildProduceLine(produce, feedback, batchId, batchCode,
unqualifiedQty, MesWmQualityStatusEnum.FAIL.getStatus());
produceLineMapper.insert(unqualifiedLine);
productProduceLineService.createProductProduceLine(unqualifiedLine);
MesWmProductProduceDetailDO unqualifiedDetail = buildProduceDetail(produce, feedback, batchId, batchCode,
unqualifiedLine.getId(), unqualifiedQty);
produceDetailMapper.insert(unqualifiedDetail);
productProduceDetailService.createProductProduceDetail(unqualifiedDetail);
}
// 3.2.2 合格品行 + 明细
if (qualifiedQty.compareTo(BigDecimal.ZERO) > 0) {
MesWmProductProduceLineDO qualifiedLine = buildProduceLine(produce, feedback, batchId, batchCode,
qualifiedQty, MesWmQualityStatusEnum.PASS.getStatus());
produceLineMapper.insert(qualifiedLine);
productProduceLineService.createProductProduceLine(qualifiedLine);
MesWmProductProduceDetailDO qualifiedDetail = buildProduceDetail(produce, feedback, batchId, batchCode,
qualifiedLine.getId(), qualifiedQty);
produceDetailMapper.insert(qualifiedDetail);
productProduceDetailService.createProductProduceDetail(qualifiedDetail);
}
}
return produce;
@@ -288,5 +182,4 @@ public class MesWmProductProduceServiceImpl implements MesWmProductProduceServic
return produce;
}
}