diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkOrder.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkOrder.java index 75e4d871..6cbc23a4 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkOrder.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkOrder.java @@ -123,24 +123,11 @@ public class WorkOrder extends BaseEntity { */ public static Integer PICKING_STATUS_OK = 1; - public static Map runStatusMap = new HashMap<>(11); public static Map priorityMap = new HashMap(5); public static Map approvalStatusMap = new HashMap(4); public static Map pickingStatusMap = new HashMap(2); static { - runStatusMap.put(RUN_STATUS_NORMAL, "未下达"); - runStatusMap.put(RUN_STATUS_ISSUED, "已下达"); - runStatusMap.put(RUN_STATUS_RECEIVE, "加工中"); - runStatusMap.put(RUN_STATUS_CHECK, "检验中"); - runStatusMap.put(RUN_STATUS_CRAFT_CHANGE, "工艺变更"); - runStatusMap.put(RUN_STATUS_HEAR, "审理中"); - runStatusMap.put(RUN_STATUS_COMPLETED, "已完工"); - runStatusMap.put(RUN_STATUS_HANDOVER, "已交接"); - runStatusMap.put(RUN_STATUS_REWORK, "已返工"); - runStatusMap.put(RUN_STATUS_SCRAP, "已报废"); - runStatusMap.put(RUN_STATUS_VOIDED, "已关闭"); - priorityMap.put(PRIORITY_NORMAL, "正常"); priorityMap.put(PRIORITY_PRO_IMP, "项目要求日期急件"); priorityMap.put(PRIORITY_PACT_IMP, "合同急件"); diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkOrderRun.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkOrderRun.java index 4ed0e144..f57f01bd 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkOrderRun.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkOrderRun.java @@ -71,7 +71,6 @@ public class WorkOrderRun extends BaseEntity { runStatusMap.put(RUN_STATUS_DELIVERED, "已交件"); runStatusMap.put(RUN_STATUS_COMPLETED, "已完工"); runStatusMap.put(RUN_STATUS_VOIDED, "已作废"); - } public String getRunStatusTitle() { diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkPlan.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkPlan.java index d404f46b..fc12a2b6 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkPlan.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkPlan.java @@ -60,12 +60,20 @@ public class WorkPlan extends BaseEntity { * 解绑 */ public static Short BIND_STATUS_FREE = 3; - public static Map statusMap = new HashMap(3); + public static Map statusMap = new HashMap<>(5); /** * 生产过程 */ public static Short PRINT_TYPE_PROCESS = 1; + static { + statusMap.put(STATUS_NO_START, "未接收"); + statusMap.put(STATUS_START, "加工中"); + statusMap.put(STATUS_WORK_OK, "报工完成"); + statusMap.put(STATUS_COMPLETE, "已完工"); + statusMap.put(STATUS_VOIDED, "返工"); + } + @Serial private static final long serialVersionUID = 1L; diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/vo/ProduceMonitorDsPartVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/vo/ProduceMonitorDsPartVO.java new file mode 100644 index 00000000..54c19421 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/vo/ProduceMonitorDsPartVO.java @@ -0,0 +1,57 @@ +package org.springblade.desk.produce.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 生产监控零件信息 视图实体类 + * + * @author litao + * @since 2026-2-27 + */ +@Data +public class ProduceMonitorDsPartVO { + + @Schema(description = "零件名称") + private String partName; + + @Schema(description = "产品型号") + private String productType; + + @Schema(description = "硬度") + private String hardness; + + @Schema(description = "镀种") + private String plate; + + @Schema(description = "面积") + private Double area; + + @Schema(description = "材料") + private String material; + + @Schema(description = "标记要求") + private String signMemo; + + @Schema(description = "关键信息") + private String keyInfo; + + @Schema(description = "工艺路线") + private String craftWay; + + @Schema(description = "涂色标个数") + private String tsbNum; + + @Schema(description = "涂色带个数") + private String tsdNum; + + @Schema(description = "涂箭头个数") + private String tjtNum; + + @Schema(description = "产品系列") + private String productSeries; + + @Schema(description = "是否印字:1、否,2、单,3、双") + private String isPrint; + +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/vo/ProduceMonitorOrderDataVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/vo/ProduceMonitorOrderDataVO.java new file mode 100644 index 00000000..0586730c --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/vo/ProduceMonitorOrderDataVO.java @@ -0,0 +1,94 @@ +package org.springblade.desk.produce.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springblade.desk.dashboard.pojo.vo.DsPartVO; + +import java.util.Date; +import java.util.List; + +/** + * 生产监控订单信息 视图实体类 + * + * @author litao + * @since 2026-2-27 + */ +@Data +public class ProduceMonitorOrderDataVO { + + @Schema(description = "车间订单号") + private String woCode; + + @Schema(description = "订单编码") + private String orderCode; + + @Schema(description = "流程卡号") + private String cardNo; + + @Schema(description = "零件号") + private String partCode; + + @Schema(description = "批次号") + private String batchNo; + + @Schema(description = "订单数量") + private Double ypQty; + + @Schema(description = "状态") + private String curStatus; + + @Schema(description = "优先级") + private String priority; + + @Schema(description = "调度员") + private String dispatcher; + + @Schema(description = "订单下达时间") + private Date sendDownTime; + + @Schema(description = "生产数量") + private Double makeQty; + + @Schema(description = "计划完工时间") + private Date planEndDate; + + @Schema(description = "需求交期") + private Date demandDate; + + @Schema(description = "生产标识") + private String prodIdent; + + @Schema(description = "镀后入库时间") + private Date putStoreTime; + + @Schema(description = "试验数量") + private Double testQty; + + @Schema(description = "消耗数量") + private Double lossQty; + + @Schema(description = "报废数量") + private Double scrapQty; + + @Schema(description = "工作订单备注") + private String ypMemo; + + @Schema(description = "会议要求周期") + private String meetCycle; + + @Schema(description = "审理单号") + private String reworkCode; + + @Schema(description = "订单类型") + private Integer yieldType; + + @Schema(description = "返工单号(仅状态为19的车间订单在生产监控展示)") + private String qcReworkCode; + + @Schema(description = "零件信息") + private ProduceMonitorDsPartVO dsPart; + + @Schema(description = "工序集合") + private List planList; + +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/vo/ProduceMonitorWorkPlanVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/vo/ProduceMonitorWorkPlanVO.java new file mode 100644 index 00000000..899da51c --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/vo/ProduceMonitorWorkPlanVO.java @@ -0,0 +1,70 @@ +package org.springblade.desk.produce.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 生产监控工序信息 视图实体类 + * + * @author litao + * @since 2026-2-27 + */ +@Data +public class ProduceMonitorWorkPlanVO { + + @Schema(description = "工序id") + private Long id; + + @Schema(description = "工艺号") + private String orders; + + @Schema(description = "工序名称") + private String ppsName; + + @Schema(description = "状态") + private Integer status; + + @Schema(description = "是否主工序:0-否 1-是") + private String mainProcess; + + @Schema(description = "加工班组") + private String makeTeam; + + @Schema(description = "接收人ID") + private Long receiveMan; + + @Schema(description = "接收人") + private String receiveManName; + + @Schema(description = "计划加工人") + private String planWorkMan; + + @Schema(description = "报工人ID") + private Long workMan; + + @Schema(description = "报工人") + private String workManName; + + @Schema(description = "报工数量") + private Double workQty; + + @Schema(description = "额定工时") + private Double hourQuota; + + @Schema(description = "实际工时") + private Long hourActual; + + @Schema(description = "计划开始时间") + private LocalDateTime planStartTime; + + @Schema(description = "计划结束时间") + private LocalDateTime planEndTime; + + @Schema(description = "实际开始时间") + private LocalDateTime factStartTime; + + @Schema(description = "实际结束时间") + private LocalDateTime factEndTime; +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/controller/ProduceMonitorController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/controller/ProduceMonitorController.java new file mode 100644 index 00000000..0922552e --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/controller/ProduceMonitorController.java @@ -0,0 +1,39 @@ +package org.springblade.desk.produce.controller; + +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.tool.api.R; +import org.springblade.desk.produce.pojo.vo.ProduceMonitorOrderDataVO; +import org.springblade.desk.produce.service.IWorkOrderService; +import org.springframework.web.bind.annotation.*; + +/** + * 生产监控 + * @author litao + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/workOrder") +@Tag(name = "生产监控", description = "接口") +public class ProduceMonitorController extends BladeController { + + private final IWorkOrderService workOrderService; + + @GetMapping("/getOrderDetail") + @ApiOperationSupport(order = 1) + @Operation(summary = "获取订单详情:订单基础信息、零件信息、工序列表信息", description = "") + public R getOrderDetail(@RequestParam Long woId, @RequestParam String partCode) { + return R.data(workOrderService.getOrderDetail(woId, partCode)); + } + + @GetMapping("/getPlanDetail") + @ApiOperationSupport(order = 2) + @Operation(summary = "获取工序详情", description = "") + public R getPlanDetail(@RequestParam Long wpId) { + return R.data(null); + } + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/mapper/WorkPlanMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/mapper/WorkPlanMapper.java index a27a61ce..4efcc2b5 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/mapper/WorkPlanMapper.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/mapper/WorkPlanMapper.java @@ -3,6 +3,7 @@ package org.springblade.desk.produce.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; import org.springblade.desk.produce.pojo.entity.WorkPlan; +import org.springblade.desk.produce.pojo.vo.ProduceMonitorWorkPlanVO; import org.springblade.scheduling.pojo.entity.WorkPlanEntity; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.desk.produce.pojo.entity.WorkPlan; @@ -25,4 +26,6 @@ public interface WorkPlanMapper extends BaseMapper { IPage queryWorkPlan(IPage page, String cardNo, List tsIds); List loadPrMacToolUseByMtnCode(@Param("mtnCode") String mtnCode); + + List getProduceMonitorWorkPlanList(Long woId); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/mapper/WorkPlanMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/mapper/WorkPlanMapper.xml index 63b85f2e..df2d9508 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/mapper/WorkPlanMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/mapper/WorkPlanMapper.xml @@ -68,5 +68,28 @@ + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderService.java index 72ba4658..1935873f 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderService.java @@ -131,4 +131,16 @@ public interface IWorkOrderService extends BaseService { */ void maintainOrder(WorkOrder workOrder, Long planner, Long dispatcher, WorkOrderRun workOrderRun, Boolean oem) throws Exception; + + /** + *

方法名: getOrderDetail

+ *

方法描述: 获取订单详情:订单基础信息、零件信息、工序列表信息

+ * + * @param woId 订单id + * @param partCode 零件号 + * @return org.springblade.desk.produce.pojo.vo.ProduceMonitorOrderDataVO + * @author lyj + * @date 2022-10-29 15:13 + */ + ProduceMonitorOrderDataVO getOrderDetail(Long woId, String partCode); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkPlanService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkPlanService.java index 384d18f2..88efd7bb 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkPlanService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkPlanService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseService; import org.springblade.desk.produce.pojo.entity.WorkOrder; import org.springblade.desk.produce.pojo.entity.WorkPlan; +import org.springblade.desk.produce.pojo.vo.ProduceMonitorWorkPlanVO; import org.springblade.scheduling.pojo.entity.WorkPlanEntity; import org.springblade.desk.produce.pojo.vo.WorkPlanVO; @@ -37,4 +38,5 @@ public interface IWorkPlanService extends BaseService { IPage queryWorkPlan(IPage page, String cardNo); + List getProduceMonitorWorkPlanList(Long woId); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderServiceImpl.java index 944033ec..f4bc3590 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderServiceImpl.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.sourceforge.barbecue.Barcode; @@ -36,6 +35,7 @@ import org.springblade.desk.produce.pojo.dto.ListProProcessDTO; import org.springblade.desk.produce.pojo.dto.QueryByReadStatusDTO; import org.springblade.desk.produce.pojo.dto.WorkOrderDTO; import org.springblade.desk.produce.pojo.entity.*; +import org.springblade.desk.produce.pojo.enums.WorkOrderEnum; import org.springblade.desk.produce.pojo.vo.*; import org.springblade.desk.produce.service.*; import org.springblade.desk.quality.pojo.entity.InspectionTask; @@ -47,6 +47,8 @@ import org.springblade.scheduling.pojo.entity.WorkOrderEntity; import org.springblade.erpdata.feign.IErpDataProduceClient; import org.springblade.system.cache.DictCache; import org.springblade.system.pojo.enums.DictEnum; +import org.springblade.system.cache.UserCache; +import org.springblade.system.pojo.entity.User; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -54,6 +56,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; +import java.time.Duration; import java.time.Instant; import java.time.LocalDateTime; import java.util.*; @@ -1070,6 +1073,53 @@ public class WorkOrderServiceImpl extends BaseServiceImpl workPlans = workPlanService.getProduceMonitorWorkPlanList(woId); + if (yieldOrder == null || CollectionUtils.isEmpty(workPlans) || workOrderRun == null) { + return null; + } + ProduceMonitorOrderDataVO orderDataVO = new ProduceMonitorOrderDataVO(); + ProduceMonitorDsPartVO dsPartVO = new ProduceMonitorDsPartVO(); + // 组装订单基础信息 + BeanUtils.copyProperties(workOrder, orderDataVO); + orderDataVO.setOrderCode(workOrderRun.getWoCode()); + orderDataVO.setPartCode(partCode); + orderDataVO.setYpQty(yieldOrder.getYpQty()); + orderDataVO.setYieldType(yieldOrder.getYieldType()); + orderDataVO.setCurStatus(WorkOrderEnum.getName(workOrder.getRunStatus())); + orderDataVO.setPriority(WorkOrder.priorityMap.get(workOrder.getPriority())); + User user = UserCache.getUser(workOrder.getDispatcher()); + orderDataVO.setDispatcher(user != null ? user.getRealName() : ""); + orderDataVO.setProdIdent(yieldOrder.getProductIdent()); + orderDataVO.setYpMemo(yieldOrder.getYpMemo()); + + // 组装零件信息 + BeanUtils.copyProperties(dsPartEntity, dsPartVO); + orderDataVO.setDsPart(dsPartVO); + + // 组装工序信息 + for (ProduceMonitorWorkPlanVO workPlan : workPlans) { + User receiveMan = UserCache.getUser(workPlan.getReceiveMan()); + workPlan.setReceiveManName(receiveMan != null ? receiveMan.getRealName() : ""); + workPlan.setPlanWorkMan(""); + User workMan = UserCache.getUser(workPlan.getWorkMan()); + workPlan.setWorkManName(workMan != null ? workMan.getRealName() : ""); + if (workPlan.getPlanStartTime() != null && workPlan.getPlanEndTime() != null) { + workPlan.setHourActual(Duration.between(workPlan.getPlanStartTime(), workPlan.getPlanEndTime()).toMinutes()); + } + } + orderDataVO.setPlanList(workPlans); + return orderDataVO; + } + public String prefix(String stringToFix, String fixChar, int targetLen) { int len = stringToFix.length(); for(int i = 0; i < targetLen - len; i += fixChar.length()) { diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkPlanServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkPlanServiceImpl.java index 0cdf5444..da783499 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkPlanServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkPlanServiceImpl.java @@ -16,6 +16,7 @@ import org.springblade.desk.dashboard.pojo.entity.DsProcessProjectEntity; import org.springblade.desk.dashboard.service.*; import org.springblade.desk.produce.mapper.WorkPlanMapper; import org.springblade.desk.produce.pojo.entity.*; +import org.springblade.desk.produce.pojo.vo.ProduceMonitorWorkPlanVO; import org.springblade.desk.produce.pojo.vo.WorkPlanVO; import org.springblade.desk.produce.service.*; import org.springblade.desk.quality.pojo.entity.InspectionTask; @@ -238,4 +239,9 @@ public class WorkPlanServiceImpl extends BaseServiceImpl getProduceMonitorWorkPlanList(Long woId) { + return baseMapper.getProduceMonitorWorkPlanList(woId); + } }