commit
02dce1834f
47 changed files with 1213 additions and 411 deletions
@ -0,0 +1,34 @@ |
||||
package org.springblade.desk.dashboard.pojo.vo; |
||||
|
||||
import lombok.Data; |
||||
|
||||
import java.io.Serial; |
||||
import java.io.Serializable; |
||||
|
||||
/** |
||||
* 零件加工所需工装信息表 视图实体类 |
||||
* |
||||
* @author BladeX |
||||
* @since 2025-11-12 |
||||
*/ |
||||
@Data |
||||
public class DsPartToolVO implements Serializable { |
||||
@Serial |
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
/** |
||||
* 名称 |
||||
*/ |
||||
private String name; |
||||
|
||||
/** |
||||
* 编码 |
||||
*/ |
||||
private String code; |
||||
|
||||
/** |
||||
* 备注 |
||||
*/ |
||||
private String memo; |
||||
|
||||
} |
||||
@ -0,0 +1,22 @@ |
||||
package org.springblade.desk.produce.pojo.dto; |
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema; |
||||
import lombok.Data; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 获取转外协所需数据 数据传输对象实体类 |
||||
* @author litao |
||||
*/ |
||||
@Data |
||||
public class ListProProcessDTO { |
||||
|
||||
@Schema(description = "车间订单ID集合") |
||||
private List<Long> woIds; |
||||
|
||||
@Schema(description = "转换类型:1-外协,2-厂内") |
||||
private Integer runType; |
||||
|
||||
|
||||
} |
||||
@ -0,0 +1,23 @@ |
||||
package org.springblade.desk.produce.pojo.dto; |
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema; |
||||
import lombok.Data; |
||||
import org.springblade.desk.produce.pojo.entity.WorkOrderRun; |
||||
import org.springblade.desk.produce.pojo.entity.WorkPlanRun; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 转外协(单个/批量) 数据传输对象实体类 |
||||
* @author litao |
||||
*/ |
||||
@Data |
||||
public class TransferBillDTO { |
||||
|
||||
@Schema(description = "车间订单运行记录") |
||||
private List<WorkOrderRun> workOrderRuns; |
||||
|
||||
@Schema(description = "作业计划运行明细") |
||||
private List<WorkPlanRun> workPlanRuns; |
||||
|
||||
} |
||||
@ -0,0 +1,22 @@ |
||||
package org.springblade.desk.produce.pojo.dto; |
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema; |
||||
import lombok.Data; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 转烧结 数据传输对象实体类 |
||||
* @author litao |
||||
*/ |
||||
@Data |
||||
public class TurnTypeDTO { |
||||
|
||||
@Schema(description = "生产订单id") |
||||
private Long id; |
||||
|
||||
@Schema(description = "订单类型") |
||||
private Integer yieldType; |
||||
|
||||
|
||||
} |
||||
@ -0,0 +1,21 @@ |
||||
package org.springblade.desk.produce.pojo.dto; |
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema; |
||||
import lombok.Data; |
||||
|
||||
import java.util.Date; |
||||
|
||||
/** |
||||
* 更改车间订单优先级 数据传输对象实体类 |
||||
* @author litao |
||||
*/ |
||||
@Data |
||||
public class UpdatePriorityDTO { |
||||
|
||||
@Schema(description = "生产订单id") |
||||
private Long id; |
||||
|
||||
@Schema(description = "需求交期") |
||||
private Date demandDate; |
||||
|
||||
} |
||||
@ -0,0 +1,25 @@ |
||||
package org.springblade.desk.produce.pojo.dto; |
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema; |
||||
import lombok.Data; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 修改订单状态 数据传输对象实体类 |
||||
* @author litao |
||||
*/ |
||||
@Data |
||||
public class UpdateStatusDTO { |
||||
|
||||
@Schema(description = "车间订单ID集合") |
||||
private List<Long> idArr; |
||||
|
||||
@Schema(description = "状态") |
||||
private Integer status; |
||||
|
||||
@Schema(description = "备注") |
||||
private String memo; |
||||
|
||||
|
||||
} |
||||
@ -0,0 +1,77 @@ |
||||
package org.springblade.desk.produce.pojo.entity; |
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName; |
||||
import io.swagger.v3.oas.annotations.media.Schema; |
||||
import lombok.Data; |
||||
import lombok.EqualsAndHashCode; |
||||
import org.springblade.core.mp.base.BaseEntity; |
||||
|
||||
import java.io.Serial; |
||||
import java.util.Date; |
||||
|
||||
/** |
||||
* 镀前镀后 实体类 |
||||
* |
||||
* @author BladeX |
||||
*/ |
||||
@Data |
||||
@TableName("MES_PLATE_AROUND") |
||||
@Schema(description = "PlateAround对象") |
||||
@EqualsAndHashCode(callSuper = true) |
||||
public class PlateAround extends BaseEntity { |
||||
|
||||
@Serial |
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
/** |
||||
* 镀前入库 |
||||
*/ |
||||
public static Short BEFORE_PLAT_IN = 1; |
||||
/** |
||||
* 镀前出库 |
||||
*/ |
||||
public static Short BEFORE_PLAN_OUT = 2; |
||||
/** |
||||
* 镀后入库 |
||||
*/ |
||||
public static Short AFTER_PLAN_IN = 3; |
||||
/** |
||||
* 状态 新建 |
||||
*/ |
||||
public static Short CUR_STATUS_NEW = 1; |
||||
/** |
||||
* 状态 完成 |
||||
*/ |
||||
public static Short CUR_STATUS_OK = 2; |
||||
|
||||
@Schema(description = "单号") |
||||
private String paCode; |
||||
|
||||
@Schema(description = "作业计划") |
||||
private Long wpId; |
||||
|
||||
@Schema(description = "班组") |
||||
private Long tsId; |
||||
|
||||
@Schema(description = "供应商") |
||||
private Long ocId; |
||||
|
||||
@Schema(description = "类型") |
||||
private Short paType; |
||||
|
||||
@Schema(description = "数量") |
||||
private Double quantity = 0d; |
||||
|
||||
@Schema(description = "重量") |
||||
private Double weight = 0d; |
||||
|
||||
@Schema(description = "制单时间") |
||||
private Date makeTime; |
||||
|
||||
@Schema(description = "制单人") |
||||
private Long makeMan; |
||||
|
||||
@Schema(description = "状态") |
||||
private Short curStatus = 1; |
||||
|
||||
} |
||||
@ -0,0 +1,45 @@ |
||||
package org.springblade.desk.produce.pojo.entity; |
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName; |
||||
import io.swagger.v3.oas.annotations.media.Schema; |
||||
import lombok.Builder; |
||||
import lombok.Data; |
||||
import lombok.EqualsAndHashCode; |
||||
import org.springblade.core.mp.base.BaseEntity; |
||||
|
||||
import java.io.Serial; |
||||
import java.util.Date; |
||||
|
||||
/** |
||||
* 作业计划运行明细 实体类 |
||||
* |
||||
* @author BladeX |
||||
*/ |
||||
@Data |
||||
@TableName("MES_WORK_ORDER_RUN") |
||||
@Schema(description = "WorkPlanRun对象") |
||||
@EqualsAndHashCode(callSuper = true) |
||||
public class WorkPlanRun extends BaseEntity { |
||||
|
||||
@Serial |
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
@Schema(description = "车间订单运行记录") |
||||
private Long worId; |
||||
|
||||
@Schema(description = "作业计划工序") |
||||
private Long wpId; |
||||
|
||||
@Schema(description = "工艺能力") |
||||
private Long caId; |
||||
|
||||
@Schema(description = "处理工序") |
||||
private Boolean handle; |
||||
|
||||
@Schema(description = "计划开始") |
||||
private Date startTime; |
||||
|
||||
@Schema(description = "计划结束") |
||||
private Date endTime; |
||||
|
||||
} |
||||
@ -0,0 +1,31 @@ |
||||
package org.springblade.desk.util.json.serializer; |
||||
|
||||
import com.fasterxml.jackson.core.JsonGenerator; |
||||
import com.fasterxml.jackson.databind.SerializerProvider; |
||||
import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
/** |
||||
* 自定义Long序列化器:0L值 或 null 序列化为空字符串,其他值正常序列化 |
||||
*/ |
||||
public class IdSerializer extends StdScalarSerializer<Long> { |
||||
|
||||
/** |
||||
* 提供无参构造器,指定处理的类型为Integer |
||||
*/ |
||||
public IdSerializer() { |
||||
super(Long.class); |
||||
} |
||||
|
||||
@Override |
||||
public void serialize(Long value, JsonGenerator gen, SerializerProvider provider) |
||||
throws IOException { |
||||
// 核心逻辑:判断值是否为null或0,是则写空字符串,否则写原数值
|
||||
if (value == null || value == 0L) { |
||||
gen.writeString(""); // 0或null时返回空字符串
|
||||
} else { |
||||
gen.writeString("" + value); // 返回字符串类型
|
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,13 @@ |
||||
package org.springblade.desk.produce.mapper; |
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
import org.springblade.desk.produce.pojo.entity.PlateAround; |
||||
|
||||
/** |
||||
* 镀前镀后 Mapper 接口 |
||||
* |
||||
* @author BladeX |
||||
*/ |
||||
public interface PlateAroundMapper extends BaseMapper<PlateAround> { |
||||
|
||||
} |
||||
@ -0,0 +1,13 @@ |
||||
package org.springblade.desk.produce.mapper; |
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
import org.springblade.desk.produce.pojo.entity.WorkPlanRun; |
||||
|
||||
/** |
||||
* 作业计划运行明细 Mapper 接口 |
||||
* |
||||
* @author BladeX |
||||
*/ |
||||
public interface WorkPlanRunMapper extends BaseMapper<WorkPlanRun> { |
||||
|
||||
} |
||||
@ -0,0 +1,14 @@ |
||||
package org.springblade.desk.produce.service; |
||||
|
||||
import org.springblade.core.mp.base.BaseService; |
||||
import org.springblade.desk.produce.pojo.entity.PlateAround; |
||||
|
||||
/** |
||||
* 镀前镀后 服务类 |
||||
* |
||||
* @author BladeX |
||||
*/ |
||||
public interface IPlateAroundService extends BaseService<PlateAround> { |
||||
|
||||
|
||||
} |
||||
@ -0,0 +1,14 @@ |
||||
package org.springblade.desk.produce.service; |
||||
|
||||
import org.springblade.core.mp.base.BaseService; |
||||
import org.springblade.desk.produce.pojo.entity.WorkPlanRun; |
||||
|
||||
/** |
||||
* 作业计划运行明细 服务类 |
||||
* |
||||
* @author BladeX |
||||
*/ |
||||
public interface IWorkPlanRunService extends BaseService<WorkPlanRun> { |
||||
|
||||
|
||||
} |
||||
@ -0,0 +1,21 @@ |
||||
package org.springblade.desk.produce.service.impl; |
||||
|
||||
import lombok.RequiredArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springblade.core.mp.base.BaseServiceImpl; |
||||
import org.springblade.desk.produce.mapper.PlateAroundMapper; |
||||
import org.springblade.desk.produce.pojo.entity.PlateAround; |
||||
import org.springblade.desk.produce.service.IPlateAroundService; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
/** |
||||
* 镀前镀后 服务实现类 |
||||
* |
||||
* @author BladeX |
||||
*/ |
||||
@Slf4j |
||||
@Service |
||||
@RequiredArgsConstructor |
||||
public class PlateAroundServiceImpl extends BaseServiceImpl<PlateAroundMapper, PlateAround> implements IPlateAroundService { |
||||
|
||||
} |
||||
@ -1,20 +1,141 @@ |
||||
package org.springblade.desk.produce.service.impl; |
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
||||
import lombok.RequiredArgsConstructor; |
||||
import org.apache.commons.lang3.StringUtils; |
||||
import org.springblade.core.log.exception.ServiceException; |
||||
import org.springblade.core.mp.base.BaseServiceImpl; |
||||
import org.springblade.desk.dashboard.pojo.entity.BsProcessSetEntity; |
||||
import org.springblade.desk.dashboard.service.IBsProcessSetService; |
||||
import org.springblade.desk.produce.mapper.WorkOrderRunMapper; |
||||
import org.springblade.desk.produce.pojo.dto.ListProProcessDTO; |
||||
import org.springblade.desk.produce.pojo.entity.WorkOrderRun; |
||||
import org.springblade.desk.produce.pojo.entity.WorkPlan; |
||||
import org.springblade.desk.produce.pojo.entity.WorkPlanRun; |
||||
import org.springblade.desk.produce.service.IWorkOrderRunService; |
||||
import org.springblade.desk.produce.service.IWorkPlanService; |
||||
import org.springframework.stereotype.Service; |
||||
import org.springframework.util.CollectionUtils; |
||||
|
||||
import java.time.Instant; |
||||
import java.time.LocalDateTime; |
||||
import java.util.ArrayList; |
||||
import java.util.Date; |
||||
import java.util.List; |
||||
|
||||
import static com.alibaba.fastjson2.util.DateUtils.DEFAULT_ZONE_ID; |
||||
|
||||
/** |
||||
* 车间订单运行记录表 服务实现类 |
||||
* |
||||
* @author BladeX |
||||
* @since 2025-11-28 |
||||
*/ |
||||
@Service |
||||
@RequiredArgsConstructor |
||||
public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper, WorkOrderRun> implements IWorkOrderRunService { |
||||
|
||||
private final IWorkPlanService prWorkPlanService; |
||||
|
||||
private final IBsProcessSetService bsProcessSetService; |
||||
|
||||
@Override |
||||
public List<WorkPlanRun> listProProcess(ListProProcessDTO listProProcessDTO) { |
||||
List<Long> woIds = listProProcessDTO.getWoIds(); |
||||
Integer runType = listProProcessDTO.getRunType(); |
||||
if (CollectionUtils.isEmpty(woIds) || runType == null) { |
||||
return null; |
||||
} |
||||
Long curWoId = woIds.get(0); |
||||
List<WorkPlan> wpList = prWorkPlanService.list(Wrappers.lambdaQuery(WorkPlan.class).eq(WorkPlan::getWoId, curWoId)); |
||||
List<WorkPlanRun> wprList = new ArrayList<>(wpList.size()); |
||||
// 拿出第一个单子对应的可以派外协的工序
|
||||
String proName = ""; |
||||
for (WorkPlan wp : wpList) { |
||||
WorkPlanRun wpr = new WorkPlanRun(); |
||||
//验证
|
||||
if (!this.checkWp(wp, runType)) { |
||||
continue; |
||||
} |
||||
//转厂内时所有工序自动标记
|
||||
if (WorkOrderRun.RUN_TYPE_2.equals(runType)) { |
||||
wpr.setHandle(Boolean.TRUE); |
||||
} else { |
||||
wpr.setHandle(Boolean.FALSE); |
||||
} |
||||
|
||||
//组装工序号和工序id,用于批量验证是否一致
|
||||
if (StringUtils.isBlank(proName)) { |
||||
proName = wp.getOrders() + "_" + wp.getPpsId(); |
||||
} else { |
||||
proName = proName + "," + wp.getOrders() + "_" + wp.getPpsId(); |
||||
} |
||||
wpr.setCaId(wp.getCaId()); |
||||
wpr.setStartTime(localDateTimeToDate(wp.getStartTime())); |
||||
wpr.setEndTime(localDateTimeToDate(wp.getEndTime())); |
||||
wpr.setWpId(wp.getWoId()); |
||||
wprList.add(wpr); |
||||
} |
||||
|
||||
//如果是批量操作
|
||||
if (woIds.size() > 1) { |
||||
//从集合里面提出首单id
|
||||
woIds.remove(curWoId); |
||||
|
||||
//验证其他车间订单是否满足条件
|
||||
for (Long aLong : woIds) { |
||||
wpList = prWorkPlanService.list(Wrappers.lambdaQuery(WorkPlan.class).eq(WorkPlan::getWoId, aLong)); |
||||
// 拿出其他单子可以派外协的工序与第一条做对比
|
||||
String otherProName = ""; |
||||
for (WorkPlan wp : wpList) { |
||||
|
||||
//验证
|
||||
if (!this.checkWp(wp, runType)) { |
||||
continue; |
||||
} |
||||
//组装工序号和工序id,用于批量验证是否一致
|
||||
if (StringUtils.isBlank(otherProName)) { |
||||
otherProName = wp.getOrders() + "_" + wp.getPpsId(); |
||||
} else { |
||||
otherProName = otherProName + "," + wp.getOrders() + "_" + wp.getPpsId(); |
||||
} |
||||
} |
||||
if (!proName.equals(otherProName)) { |
||||
throw new ServiceException("请选择相同的可转出的工序进行操作!!!"); |
||||
} |
||||
} |
||||
} |
||||
return wprList; |
||||
} |
||||
|
||||
private boolean checkWp(WorkPlan wp, Integer runType) { |
||||
//不分派工序不能操作
|
||||
BsProcessSetEntity processSet = bsProcessSetService.getById(wp.getPpsId()); |
||||
if (processSet == null) { |
||||
return false; |
||||
} |
||||
if ("1".equals(processSet.getIsDispatch())) { |
||||
return false; |
||||
} |
||||
//如果是转厂内,则非厂外的工序跳过
|
||||
if (WorkOrderRun.RUN_TYPE_2.equals(runType) && "0".equals(wp.getOem())) { |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
/** |
||||
* LocalDateTime 转 Date |
||||
* @param localDateTime |
||||
* @return |
||||
*/ |
||||
private Date localDateTimeToDate(LocalDateTime localDateTime) { |
||||
// 空值校验,避免空指针异常
|
||||
if (localDateTime == null) { |
||||
return null; |
||||
} |
||||
// 1. LocalDateTime + 时区 → ZonedDateTime → Instant
|
||||
Instant instant = localDateTime.atZone(DEFAULT_ZONE_ID).toInstant(); |
||||
// 2. Instant → Date
|
||||
return Date.from(instant); |
||||
} |
||||
} |
||||
|
||||
@ -0,0 +1,21 @@ |
||||
package org.springblade.desk.produce.service.impl; |
||||
|
||||
import lombok.RequiredArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springblade.core.mp.base.BaseServiceImpl; |
||||
import org.springblade.desk.produce.mapper.WorkPlanRunMapper; |
||||
import org.springblade.desk.produce.pojo.entity.WorkPlanRun; |
||||
import org.springblade.desk.produce.service.IWorkPlanRunService; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
/** |
||||
* 作业计划运行明细 服务实现类 |
||||
* |
||||
* @author BladeX |
||||
*/ |
||||
@Slf4j |
||||
@Service |
||||
@RequiredArgsConstructor |
||||
public class WorkPlanRunServiceImpl extends BaseServiceImpl<WorkPlanRunMapper, WorkPlanRun> implements IWorkPlanRunService { |
||||
|
||||
} |
||||
Loading…
Reference in new issue