diff --git a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 9c86caad8e..8e6d42e622 100644 --- a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -24,10 +24,13 @@ public interface ErrorCodeConstants { ErrorCode ORGANIZATION_PARENT_ERROR = new ErrorCode(5_0014, "不能设置自己为父产线工位"); ErrorCode ORGANIZATION_NAME_DUPLICATE = new ErrorCode(5_0015, "已经存在该组织名称的产线工位"); ErrorCode ORGANIZATION_PARENT_IS_CHILD = new ErrorCode(5_0016, "不能设置自己的子Organization为父Organization"); + ErrorCode ORGANIZATION_CODE_EXISTS = new ErrorCode(5_0011_001, "组织编号已存在,请重新提交"); ErrorCode TASK_NOT_EXISTS = new ErrorCode(5_002, "生产任务单不存在"); + ErrorCode TASK_CODE_EXISTS = new ErrorCode(5_002_001, "任务单号已存在,请重新提交"); ErrorCode TASK_EXISTS = new ErrorCode(5_003, "生产任务单已存在"); ErrorCode TASK_DETAIL_NOT_EXISTS = new ErrorCode(5_005, "任务单明细不存在"); ErrorCode PLAN_NOT_EXISTS = new ErrorCode(5_003, "生产计划不存在"); + ErrorCode PLAN_CODE_EXISTS = new ErrorCode(5_003_001, "生产计划已存在,请重新提交"); ErrorCode PLAN_EXISTS = new ErrorCode(5_003, "生产计划已经存在"); ErrorCode ITEM_REQUISITION_NOT_EXISTS = new ErrorCode(5_004, "生产领料不存在"); ErrorCode ITEM_REQUISITION_EXISTS = new ErrorCode(5_004, "生产领料已存在"); @@ -85,9 +88,6 @@ public interface ErrorCodeConstants { ErrorCode ENERGY_DEVICE_CODE_DUPLICATE = new ErrorCode(5_0082, "能耗设备编码已存在"); - - - ErrorCode MOLD_RECORD_SUBJECT_NOT_EXISTS = new ErrorCode(5_0086, "维保项目不存在"); ErrorCode MOLD_RECORD_ITEM_NOT_EXISTS = new ErrorCode(5_0087, "维保方案不存在"); ErrorCode MOLD_RECORD_NOT_EXISTS = new ErrorCode(5_0087, "模具维保不存在"); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/DashboardController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/DashboardController.java new file mode 100644 index 0000000000..bea9642fe7 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/DashboardController.java @@ -0,0 +1,246 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dashboard; + +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.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO; +import cn.iocoder.yudao.module.erp.service.product.ErpProductService; +import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.DeviceRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.TaskReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.TaskRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanRespVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.organization.OrganizationDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO; +import cn.iocoder.yudao.module.mes.dal.mysql.plan.PlanMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.task.TaskMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.ticketmanagement.TicketManagementMapper; +import cn.iocoder.yudao.module.mes.service.dvrepair.DvRepairService; +import cn.iocoder.yudao.module.mes.service.organization.OrganizationService; +import cn.iocoder.yudao.module.mes.service.plan.PlanService; +import cn.iocoder.yudao.module.mes.service.ticketmanagement.TicketManagementService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import java.util.ArrayList; +import java.util.Collection; +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 = "管理后台 - 首页") +@RestController +@RequestMapping("/mes/dashboard") +@Validated +public class DashboardController { + + + @Resource + private PlanService planService; + + @Resource + private ErpProductService productService; + + @Resource + private OrganizationService organizationService; + + @Resource + private DvRepairService dvRepairService; + + @Resource + private TicketManagementService ticketManagementService; + + @Resource + private PlanMapper planMapper; + + @Resource + private TaskMapper taskMapper; + + + @GetMapping("/getProduction") + @Operation(summary = "获得整体生产概况") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:bom:query')") + public CommonResult getProduction(@Valid TaskReqVO taskReqVO) { + TaskRespVO taskRespVO = new TaskRespVO(); + List taskItems = new ArrayList<>(); + List planItems = new ArrayList<>(); + // 生产任务总数 + TaskRespVO.Item item = new TaskRespVO.Item(); + item.setKey("1"); + item.setLabel("生产任务总数"); + item.setValue(taskMapper.selectCount(new LambdaQueryWrapperX() + .betweenIfPresent(TaskDO::getCreateTime, taskReqVO.getStartTime()))); // 创建时间 + taskItems.add(item); + // 未开工任务数 + item = new TaskRespVO.Item(); + item.setKey("2"); + item.setLabel("未开工任务数"); + Collection count1 = new ArrayList<>(); + count1.add(1L); + count1.add(2L); + count1.add(3L); + item.setValue(taskMapper.selectCount(new LambdaQueryWrapperX() + .in(TaskDO::getStatus, count1) + .betweenIfPresent(TaskDO::getOrderDate, taskReqVO.getStartTime()))); // 下达时间 + taskItems.add(item); + // 生产中任务数 + item = new TaskRespVO.Item(); + item.setKey("3"); + item.setLabel("生产中任务数"); + Collection count2 = new ArrayList<>(); + count2.add(4L); + item.setValue(taskMapper.selectCount(new LambdaQueryWrapperX() + .in(TaskDO::getStatus, count2) + .betweenIfPresent(TaskDO::getOrderDate, taskReqVO.getStartTime()))); + taskItems.add(item); + // 完工任务数 + item = new TaskRespVO.Item(); + item.setKey("4"); + item.setLabel("完工任务数"); + Collection count3 = new ArrayList<>(); + count3.add(5L); + count3.add(6L); + item.setValue(taskMapper.selectCount(new LambdaQueryWrapperX() + .in(TaskDO::getStatus, count3) + .betweenIfPresent(TaskDO::getOrderDate, taskReqVO.getStartTime()))); + taskItems.add(item); + // 生产计划总数 + item = new TaskRespVO.Item(); + item.setKey("5"); + item.setLabel("生产计划单数"); + item.setValue(planMapper.selectCount()); + planItems.add(item); + // 完成生产数量 + item = new TaskRespVO.Item(); + item.setKey("6"); + item.setLabel("产品计划总数"); + List planDOList = planMapper.selectList(); + long count = 0L; + for (PlanDO planDO : planDOList) { + if (planDO.getPlanNumber() != null) { + count = count + planDO.getPlanNumber(); + } + } + item.setValue(count); + planItems.add(item); + // 报工数量 + item = new TaskRespVO.Item(); + item.setKey("7"); + item.setLabel("报工总数"); + long baogong = 0L; + for (PlanDO planDO : planDOList) { + if (planDO.getWangongNumber() != null) { + baogong = baogong + planDO.getWangongNumber(); + } + } + item.setValue(baogong); + planItems.add(item); + // 未完成生产数量 + item = new TaskRespVO.Item(); + item.setKey("81"); + item.setLabel("产品合格数"); + long pass = 0L; + for (PlanDO planDO : planDOList) { + if (planDO.getPassNumber() != null) { + pass = pass + planDO.getPassNumber(); + } + } + item.setValue(pass); + planItems.add(item); + // 完工率 + item = new TaskRespVO.Item(); + item.setKey("8"); + item.setLabel("产品不合格数"); + long noPass = 0L; + for (PlanDO planDO : planDOList) { + if (planDO.getNoPassNumber() != null) { + noPass = noPass + planDO.getNoPassNumber(); + } + } + item.setValue(noPass); + planItems.add(item); + // 合格率 + item = new TaskRespVO.Item(); + item.setKey("9"); + item.setLabel("合格率"); + long passRate = 0; + if (baogong != 0) { + passRate = (long) (((double) pass / baogong) * 100); + + } + item.setValue(passRate); + planItems.add(item); + + taskRespVO.setTaskItems(taskItems); + taskRespVO.setPlanItems(planItems); + return success(taskRespVO); + } + + @GetMapping("/getPlan") + @Operation(summary = "获得实时生产进度") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:bom:query')") + public CommonResult> getPlan() { + List statusList = new ArrayList<>(); + statusList.add(1); + statusList.add(2); + statusList.add(3); + statusList.add(4); + statusList.add(5); + statusList.add(6); + List planDOList = planService.getPlanByStatus(statusList); + Map productMap = productService.getProductVOMap( + convertSet(planDOList, PlanDO::getProductId)); + Map organizationMap = organizationService.getOrganizationVOMap(convertSet(planDOList, PlanDO::getFeedingPipeline)); + return success(BeanUtils.toBean(planDOList, PlanRespVO.class, planRespVO ->{ + MapUtils.findAndThen(productMap, planRespVO.getProductId(), product -> planRespVO.setProductName(product.getName())); + MapUtils.findAndThen(organizationMap, planRespVO.getFeedingPipeline(), organization -> planRespVO.setFeedingPipelineName(organization.getName())); + })); + } + + + + @GetMapping("/getDevice") + @Operation(summary = "获得设备") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:bom:query')") + public CommonResult> getDevice() { + List deviceRespVOList = new ArrayList<>(); + DeviceRespVO deviceRespVO = new DeviceRespVO(); + // 设备维修 + deviceRespVO.setKey("1"); + deviceRespVO.setLabel("维修"); + deviceRespVO.setValue(dvRepairService.getRepairListCountByRepairStatus()); + deviceRespVO.setLevel("mini-danger"); + deviceRespVOList.add(deviceRespVO); + // 设备点检 + deviceRespVO = new DeviceRespVO(); + deviceRespVO.setKey("2"); + deviceRespVO.setLabel("点检"); + deviceRespVO.setValue(ticketManagementService.getDianjianListCountByJobStatus()); + deviceRespVO.setLevel("mini-normal"); + deviceRespVOList.add(deviceRespVO); + // 设备保养 + deviceRespVO = new DeviceRespVO(); + deviceRespVO.setKey("3"); + deviceRespVO.setLabel("保养"); + deviceRespVO.setValue(ticketManagementService.getBaoyangListCountByJobStatus()); + deviceRespVO.setLevel("mini-total"); + deviceRespVOList.add(deviceRespVO); + return success(deviceRespVOList); + + } +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/DeviceRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/DeviceRespVO.java new file mode 100644 index 0000000000..35ad450cd6 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/DeviceRespVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 首页设备 Response VO") +@Data +@ExcelIgnoreUnannotated +public class DeviceRespVO { + @Schema(description = "key") + private String key; + + @Schema(description = "label") + private String label; + + @Schema(description = "value") + private Long value; + + @Schema(description = "level") + private String level; + +} + diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/TaskReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/TaskReqVO.java new file mode 100644 index 0000000000..95dc231575 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/TaskReqVO.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 首页整体生产概况 Request VO") +@Data +public class TaskReqVO { + + @Schema(description = "开始时间") + private LocalDateTime[] startTime; + + +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/TaskRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/TaskRespVO.java new file mode 100644 index 0000000000..25d7e68500 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/TaskRespVO.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo; + +import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.out.ErpStockOutSaveReqVO; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +@Schema(description = "管理后台 - 产品BOM Response VO") +@Data +@ExcelIgnoreUnannotated +public class TaskRespVO { + @Schema(description = "任务") + private List taskItems; + + @Schema(description = "计划") + private List planItems; + + @Data + public static class Item { + @Schema(description = "key") + private String key; + + @Schema(description = "label") + private String label; + + @Schema(description = "value") + private Long value; + + } + } + diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/TaskVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/TaskVO.java new file mode 100644 index 0000000000..2b02dddf6a --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/TaskVO.java @@ -0,0 +1,4 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo; + +public class TaskVO { +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/DeviceLedgerController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/DeviceLedgerController.java index 104a6ad691..f66ad49ee9 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/DeviceLedgerController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/DeviceLedgerController.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.mes.controller.admin.deviceledger; +import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.utils.ResumeNameUtils; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; @@ -177,4 +178,20 @@ public class DeviceLedgerController { ExcelUtils.write(response, fileName, "数据", ErpProductVO.class,list); } + @GetMapping("/export-mold") + @Operation(summary = "根据设备Id导出模具") + @PreAuthorize("@ss.hasPermission('mes:device-ledger:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportMold(@RequestParam(name = "id") Long id, + HttpServletResponse response) throws IOException { + List list = deviceLedgerService.exportMold(id); + // 设置响应头 + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode("模具.xls", "UTF-8")); + response.setHeader("Content-Encoding", "identity"); + String fileName = String.format("模具_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + // 导出 Excel + ExcelUtils.write(response, fileName, "数据", MoldVO.class,list); + } } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/MoldVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/MoldVO.java new file mode 100644 index 0000000000..fbf2100f25 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/MoldVO.java @@ -0,0 +1,50 @@ +package cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo; + + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; + +@Schema(description = "管理后台 - 设备模具导出 Resp VO") +@Data +@ExcelIgnoreUnannotated +public class MoldVO { + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "32278") + @ExcelProperty("ID") + private Long id; + + @Schema(description = "模具编码", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("模具编码") + private String code; + + @Schema(description = "模具名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @ExcelProperty("模具名称") + private String name; + + + + @Schema(description = "入库时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("入库时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDateTime inTime; + + + @Schema(description = "备注", example = "你猜") + @ExcelProperty("备注") + private String remark; + + + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) +// @ExcelProperty("创建时间") + private LocalDateTime createTime; + + +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/PlanController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/PlanController.java index 3d9ab78462..eaec37ed9f 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/PlanController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/PlanController.java @@ -119,7 +119,7 @@ public class PlanController { //@PreAuthorize("@ss.hasPermission('mes:plan:query')") public CommonResult getPlan(@RequestParam("id") Long id) { PlanDO plan = planService.getPlan(id); - return success(BeanUtils.toBean(plan, PlanRespVO.class)); + return success(planService.getPlanRespVO(plan)); } @GetMapping("/page") @@ -250,6 +250,31 @@ public class PlanController { return success(planRespVOList); } + @GetMapping("/getByTicketType") + @Operation(summary = "获得质检工单下拉") + @Parameter(name = "status", description = "状态", required = true, example = "1024") + public CommonResult> getByTicketType(@RequestParam("status") Integer status) { + if (status == 1) { + List statusList = new ArrayList<>(); + statusList.add(status); + statusList.add(PlanStatusEnum.已排产.getValue()); + statusList.add(PlanStatusEnum.试产.getValue()); + statusList.add(PlanStatusEnum.量产.getValue()); + statusList.add(PlanStatusEnum.暂停.getValue()); + List proList = planService.getPlanByStatus(statusList); + List planRespVOList = planService.buildVOList(proList); + return success(planRespVOList); + } else if (status == 2) { + List statusList = new ArrayList<>(); + statusList.add(PlanStatusEnum.待入库.getValue()); + List proList = planService.getPlanByStatus(statusList); + List planRespVOList = planService.buildVOList(proList); + return success(planRespVOList); + } else { + return success(Collections.emptyList()); + } + } + @GetMapping("/setTop") @Operation(summary = "置顶生产计划") @Parameter(name = "id", description = "编号", required = true, example = "1024") diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/zjtask/vo/ZjTaskRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/zjtask/vo/ZjTaskRespVO.java index 155f8ec0bb..4f285be1b2 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/zjtask/vo/ZjTaskRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/zjtask/vo/ZjTaskRespVO.java @@ -45,8 +45,11 @@ public class ZjTaskRespVO { private String remark; @Schema(description = "工单", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("工单") - private String ticket; + private Long ticket; + + @Schema(description = "工单") + @ExcelProperty("生产计划") + private String ticketCode; @Schema(description = "工序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @ExcelProperty(value = "工序", converter = DictConvert.class) diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/plan/PlanDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/plan/PlanDO.java index e52b57d5e8..afb4ac7779 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/plan/PlanDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/plan/PlanDO.java @@ -141,4 +141,6 @@ public class PlanDO extends BaseDO { */ private BigDecimal passRate; + private Long workerId; + } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/zjtask/ZjTaskDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/zjtask/ZjTaskDO.java index 48f8f29598..a4ce3d06a2 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/zjtask/ZjTaskDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/zjtask/ZjTaskDO.java @@ -54,7 +54,12 @@ public class ZjTaskDO extends BaseDO { /** * 工单 */ - private String ticket; + private Long ticket; + /** + * 工单编码 + */ + @TableField(exist = false) + private String ticketCode; /** * 工序 */ diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerService.java index 64767d31bf..15aa7a2547 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerService.java @@ -78,4 +78,6 @@ public interface DeviceLedgerService { List exportSpareBased(Long id); + + List exportMold(Long id); } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerServiceImpl.java index b8042213bd..ea794c0e65 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerServiceImpl.java @@ -284,4 +284,32 @@ public class DeviceLedgerServiceImpl implements DeviceLedgerService { } + @Override + public List exportMold(Long id) { + DeviceLedgerDO deviceLedgerDO = deviceLedgerMapper.selectById(id); + if (deviceLedgerDO == null){ + throw exception(DEVICE_LEDGER_EXISTS); + } + + //模具列表 + List moldList = new ArrayList<>(); + if (StringUtils.isNotBlank(deviceLedgerDO.getMoldId())) { + // 将逗号分隔的字符串转换为Long类型的List + List idList = Arrays.stream(deviceLedgerDO.getMoldId().split(",")) + .map(String::trim) // 去除可能存在的空格 + .map(Long::valueOf) + .collect(Collectors.toList()); + for (Long moldId : idList) { + MoldDO moldDO = moldMapper.selectById(moldId); + if(moldDO!=null){ + moldList.add(moldDO); + } + } + } + + return BeanUtils.toBean(moldList, MoldVO.class); + } + + + } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairService.java index 7c82e18a24..492f2a8387 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairService.java @@ -70,4 +70,6 @@ public interface DvRepairService { void updateDvRepairStatus(@Valid DvRepirUpdateReqVO updateReqVO); List getRepairListByDeviceId(Long deviceId, String startTime, String endTime,String ids); + + Long getRepairListCountByRepairStatus(); } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java index 166820b2f8..ba4ca21eeb 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java @@ -268,6 +268,13 @@ public class DvRepairServiceImpl implements DvRepairService { return dvRepairLineRespVOS; } + @Override + public Long getRepairListCountByRepairStatus() { + return dvRepairMapper.selectCount(Wrappers.lambdaQuery() + .eq(DvRepairDO::getRepairStatus, 0)); + + } + private LocalDateTime parseToLocalDateTime(String timeStr) { if (StringUtils.isBlank(timeStr)) { diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/organization/OrganizationServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/organization/OrganizationServiceImpl.java index 7be0cae69f..11a1dce01a 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/organization/OrganizationServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/organization/OrganizationServiceImpl.java @@ -80,6 +80,10 @@ public class OrganizationServiceImpl implements OrganizationService { // } organization.setCode(autoCodeUtil.genSerialCode("ORG_CODE",null)); + } else { + if (organizationMapper.selectByNo(organization.getCode()) != null) { + throw exception(ORGANIZATION_CODE_EXISTS); + } } organizationMapper.insert(organization); // 返回 diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanService.java index 39c044c922..7d34d46b84 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanService.java @@ -96,4 +96,12 @@ public interface PlanService { List getPlanBy(PlanPageReqVO pageReqVO); void createPlanStockIn(PlanStatusUpdateVO statusUpdateVO,PlanDO planDO); + + /** + * 获得生产计划分页 + * + * @param pageReqVO 分页查询 + * @return 生产计划分页 + */ + PlanRespVO getPlanRespVO(PlanDO planDO); } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java index 4d1fb5fc5c..3051282b5a 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java @@ -29,6 +29,7 @@ import cn.iocoder.yudao.module.mes.dal.redis.no.MesNoRedisDAO; import cn.iocoder.yudao.module.mes.service.itemrequisition.ItemAnalysisService; import cn.iocoder.yudao.module.mes.service.itemrequisition.ItemRequisitionService; import cn.iocoder.yudao.module.mes.service.itemrequisition.entity.ItemRequisitionAndStock; +import cn.iocoder.yudao.module.mes.service.organization.OrganizationService; import cn.iocoder.yudao.module.mes.service.paigongrecord.PaigongRecordService; import cn.iocoder.yudao.module.mes.service.task.TaskService; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; @@ -48,6 +49,7 @@ import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PLAN_CODE_EXISTS; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PLAN_NOT_EXISTS; /** @@ -79,6 +81,9 @@ public class PlanServiceImpl implements PlanService { @Autowired private AutoCodeUtil autoCodeUtil; + @Resource + private OrganizationService organizationService; + @Override @Transactional(rollbackFor = Exception.class) public Long createPlan(PlanSaveReqVO createReqVO) { @@ -92,6 +97,10 @@ public class PlanServiceImpl implements PlanService { // } // plan.setCode(no); plan.setCode(autoCodeUtil.genSerialCode("PLAN_CODE",null)); + } else { + if (planMapper.selectByNo(plan.getCode()) != null) { + throw exception(PLAN_CODE_EXISTS); + } } if(plan.getProductId()==null && plan.getTaskDetailId()!=null){ TaskDetailDO taskDetailDO = taskService.getTaskDetail(plan.getTaskDetailId()); @@ -208,6 +217,15 @@ public class PlanServiceImpl implements PlanService { public PlanDO getPlan(Long id) { return planMapper.selectById(id); } + @Override + public PlanRespVO getPlanRespVO(PlanDO planDO) { + PlanRespVO planRespVO = BeanUtils.toBean(planDO, PlanRespVO.class); + planRespVO.setProductName(productService.getProduct(planDO.getProductId()).getName()); + planRespVO.setTaskCode(taskService.getTask(planDO.getTaskId()).getCode()); + planRespVO.setWorker(userService.getUser(planDO.getWorkerId()).getUsername()); + planRespVO.setFeedingPipelineName(organizationService.getOrganization(planDO.getFeedingPipeline()).getName()); + return planRespVO; + } @Override public PageResult getPlanPage(PlanPageReqVO pageReqVO) { diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java index b54326d818..8965994b14 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java @@ -36,8 +36,7 @@ import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.PURCHASE_ORDER_NO_EXISTS; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.TASK_DETAIL_NOT_EXISTS; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.TASK_NOT_EXISTS; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** * 生产任务单 Service 实现类 @@ -72,6 +71,10 @@ public class TaskServiceImpl implements TaskService { // } // task.setCode(no); task.setCode(autoCodeUtil.genSerialCode("TASK_CODE",null)); + } else { + if (taskMapper.selectByNo(task.getCode()) != null) { + throw exception(TASK_CODE_EXISTS); + } } createReqVO.setStatus(TaskStatusEnum.草稿.getValue()); taskMapper.insert(task); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementService.java index 5a8cf5fa70..baa3267a8e 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementService.java @@ -59,4 +59,8 @@ public interface TicketManagementService { List getInspectionByDeviceId(Long id,String startTime,String endTime,String ids); List getMaintenanceByDeviceId(Long id,String startTime,String endTime,String ids); + + Long getBaoyangListCountByJobStatus(); + + Long getDianjianListCountByJobStatus(); } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementServiceImpl.java index 9a38880469..d51dafafa4 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementServiceImpl.java @@ -2,12 +2,14 @@ package cn.iocoder.yudao.module.mes.service.ticketmanagement; import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums.PlanTypeEnum; import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairDO; import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairLineDO; import cn.iocoder.yudao.module.mes.dal.dataobject.ticketresults.TicketResultsDO; import cn.iocoder.yudao.module.mes.dal.mysql.deviceledger.DeviceLedgerMapper; import cn.iocoder.yudao.module.mes.dal.mysql.ticketresults.TicketResultsMapper; import com.alibaba.excel.util.StringUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -126,6 +128,22 @@ public class TicketManagementServiceImpl implements TicketManagementService { return inspectionList; } + @Override + public Long getBaoyangListCountByJobStatus() { + return ticketManagementMapper.selectCount(Wrappers.lambdaQuery() + .eq(TicketManagementDO::getJobStatus, 0) + .eq(TicketManagementDO::getPlanType,2)); + } + + @Override + public Long getDianjianListCountByJobStatus() { + return ticketManagementMapper.selectCount(Wrappers.lambdaQuery() + .eq(TicketManagementDO::getJobStatus, 0) + .eq(TicketManagementDO::getPlanType,1)); + } + + + /** * 解析逗号分隔的ID字符串 */ diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtask/ZjTaskServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtask/ZjTaskServiceImpl.java index 0d5c058e92..e4aeec034d 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtask/ZjTaskServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtask/ZjTaskServiceImpl.java @@ -1,14 +1,19 @@ package cn.iocoder.yudao.module.mes.service.zjtask; import cn.iocoder.yudao.framework.common.exception.ServiceException; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.module.mes.controller.admin.feedingrecord.vo.FeedingRecordRespVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.organization.OrganizationDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; import cn.iocoder.yudao.module.mes.dal.dataobject.zjitem.ZjItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.zjschema.ZjSchemaDO; import cn.iocoder.yudao.module.mes.dal.dataobject.zjtaskresults.ZjTaskResultsDO; import cn.iocoder.yudao.module.mes.dal.mysql.zjitem.ZjItemMapper; import cn.iocoder.yudao.module.mes.dal.mysql.zjschema.ZjSchemaMapper; import cn.iocoder.yudao.module.mes.dal.mysql.zjtaskresults.ZjTaskResultsMapper; +import cn.iocoder.yudao.module.mes.service.plan.PlanService; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -28,6 +33,8 @@ import cn.iocoder.yudao.module.mes.dal.mysql.zjtask.ZjTaskMapper; import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** @@ -51,6 +58,9 @@ public class ZjTaskServiceImpl implements ZjTaskService { @Resource private ZjItemMapper zjItemMapper; // 检验项目Mapper(用于关联查询方案下的项目) + @Resource + private PlanService planService; + @Override public Long createZjTask(ZjTaskSaveReqVO createReqVO) { // 插入 @@ -127,7 +137,11 @@ public class ZjTaskServiceImpl implements ZjTaskService { @Override public PageResult getZjTaskPage(ZjTaskPageReqVO pageReqVO) { - return zjTaskMapper.selectPage(pageReqVO); + PageResult pageResult = zjTaskMapper.selectPage(pageReqVO); + Map planMap = planService.getPlanMap(convertSet(pageResult.getList(), ZjTaskDO::getTicket)); + return BeanUtils.toBean(pageResult, ZjTaskDO.class, zjTaskDO -> { + MapUtils.findAndThen(planMap, zjTaskDO.getTicket(), planDO -> zjTaskDO.setTicketCode(planDO.getCode())); + }); } @Override