外协分批功能;

转厂内审批通过后处理包装工序 并且工艺能力包含 包装 并且加工单位为空的
liweidong
qinyulong 4 weeks ago
parent 101f08b620
commit e9736985de
  1. 10
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/entity/MeasurementRecordsEntity.java
  2. 10
      blade-service/blade-desk/src/main/java/org/springblade/desk/oem/controller/OemOrderController.java
  3. 3
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderService.java
  4. 35
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PdaLoadServiceImpl.java
  5. 12
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderRunServiceImpl.java
  6. 110
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderServiceImpl.java

@ -1,15 +1,13 @@
package org.springblade.desk.device.pojo.entity;
import jakarta.validation.constraints.NotNull;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema;
import com.baomidou.mybatisplus.annotation.TableName;
import java.math.BigDecimal;
import java.util.Date;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
import org.springblade.core.tenant.mp.TenantEntity;
import java.io.Serial;
@ -57,7 +55,7 @@ public class MeasurementRecordsEntity extends BaseEntity {
* 编号(测量设备编码)
*/
@Schema(description = "编号(测量设备编码)")
@NotNull(message = "编号不能为空")
// @NotNull(message = "编号不能为空")
private String mcCode;
/**
* 使用单位(试用部门)
@ -83,6 +81,7 @@ public class MeasurementRecordsEntity extends BaseEntity {
* 启用日期
*/
@Schema(description = "启用日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date enableDate;
/**
* 检定日期
@ -103,11 +102,13 @@ public class MeasurementRecordsEntity extends BaseEntity {
* 到期日期(有效日期)
*/
@Schema(description = "到期日期(有效日期)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date dueDate;
/**
* 报废日期
*/
@Schema(description = "报废日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date date2;
/**
* 状态
@ -118,6 +119,7 @@ public class MeasurementRecordsEntity extends BaseEntity {
* 停用日期
*/
@Schema(description = "停用日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date whenBuy;
/**
* 检定部门

@ -29,6 +29,7 @@ import org.springblade.desk.oem.pojo.request.*;
import org.springblade.desk.oem.pojo.vo.*;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.desk.order.service.IYieldOrderService;
import org.springblade.desk.produce.pojo.dto.InBatchesDTO;
import org.springblade.desk.produce.pojo.entity.WorkOrder;
import org.springblade.desk.produce.pojo.entity.WorkOrderRun;
import org.springblade.desk.produce.pojo.vo.WorkOrderVO;
@ -133,6 +134,15 @@ public class OemOrderController extends BladeController {
return R.data(WorkOrderWrapper.build().entityVO(newWorkOrder));
}
@PostMapping(value = "/inOemBatches")
@ApiOperationSupport(order = 6)
@Operation(summary = "外协分批", description = "")
public R inOemBatches(@RequestBody InBatchesDTO inBatchesDTO) {
Long userId = AuthUtil.getUserId();
return workOrderService.inOemBatches(inBatchesDTO.getId(), inBatchesDTO, userId);
}
/**
* 更改外协厂商
*/

@ -2,6 +2,7 @@ package org.springblade.desk.produce.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.core.tool.api.R;
import org.springblade.desk.produce.pojo.dto.*;
import org.springblade.desk.produce.pojo.entity.WorkOrder;
import org.springblade.desk.produce.pojo.entity.WorkOrderRun;
@ -191,4 +192,6 @@ public interface IWorkOrderService extends BaseService<WorkOrder> {
boolean updatePriority(UpdatePriorityDTO updatePriorityDTO);
void dataValidation(Long wpId);
R inOemBatches(Long oldWoId, InBatchesDTO inBatchesDTO, Long userId);
}

@ -1,6 +1,7 @@
package org.springblade.desk.produce.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
@ -12,6 +13,7 @@ import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.desk.basic.mapper.CraftAbilityMapper;
import org.springblade.desk.basic.pojo.entity.RelTeamSetUser;
import org.springblade.desk.basic.service.IRelTeamSetUserService;
import org.springblade.desk.dashboard.pojo.entity.*;
@ -34,6 +36,7 @@ import org.springblade.desk.quality.pojo.vo.WorkPlanItemVO;
import org.springblade.desk.quality.service.IInspectionTaskService;
import org.springblade.desk.quality.service.IPlanTestService;
import org.springblade.desk.quality.service.IWorkPlanItemService;
import org.springblade.scheduling.pojo.entity.CraftAbilityEntity;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
@ -94,6 +97,10 @@ public class PdaLoadServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPlan
private final IMesQcProduceRunService mesQcProduceRunService;
private final CraftAbilityMapper craftAbilityMapper;
private final WorkPlanMapper workPlanMapper;
@Override
public WorkPlan loadBindData(BladeUser user, String cardNo) {
WorkPlan prWorkPlan = this.getCurrentWorkPlan(cardNo, user, false, false);
@ -266,25 +273,37 @@ public class PdaLoadServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPlan
@Override
public void handleBaoZhuangWorkPlan(List<WorkPlan> wpList, YieldOrder yo) {
/*if (wpList == null || wpList.size() == 0) {
if (wpList == null || wpList.size() == 0) {
return;
}
for (WorkPlan wp : wpList) {
// 如果工序是包装,并且工艺能力是包装、加工单位为空
if ("包装".equals(wp.getProcedureSet().getPpsName()) && (wp.getBsCraftAbility() != null && wp.getBsCraftAbility().getCaName().contains("包装"))
&& wp.getMakeTeam() == null && wp.getOemCustomer() == null) {
BsProcessSetEntity processSet = bsProcessSetService.getById(wp.getPpsId());
CraftAbilityEntity craftAbility = new CraftAbilityEntity();
if (null != wp.getCaId()) {
craftAbility = craftAbilityMapper.selectById(wp.getCaId());
}
if ("包装".equals(processSet.getName()) && (wp.getCaId() != null && craftAbility.getCaName().contains("包装"))
&& wp.getMakeTeam() == null && wp.getOcId() == null) {
// 获取当前工序之前的主工序
PrWorkPlan prWorkPlan = prWorkPlanService.fontMainProcess(wp.getPrWorkOrder().getWoId());
if (prWorkPlan != null && prWorkPlan.getWpId() != null) {
if (prWorkPlan.getOemCustomer() != null && prWorkPlan.getOemCustomer().getOcId() != null) {
wp.setOemCustomer(prWorkPlan.getOemCustomer());
// 或者使用 LambdaQueryWrapper(推荐,类型安全)
LambdaQueryWrapper<WorkPlan> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(WorkPlan::getWoId, wp.getWoId())
.eq(WorkPlan::getCruxProcess, "1")
.orderByDesc(WorkPlan::getOrders);
WorkPlan prWorkPlan = workPlanMapper.selectOne(lambdaQueryWrapper);
if (prWorkPlan != null && prWorkPlan.getId() != null) {
if (prWorkPlan.getOcId() != null) {
wp.setOcId(prWorkPlan.getOcId());
wp.setOem("1");
// } else {
// wp.setMakeTeam(prWorkPlan.getMakeTeam());
}
}
}
}*/
}
workPlanMapper.insertOrUpdate(wpList);
}
private WorkOrder checkWo(String cardNo) {

@ -226,7 +226,8 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
}
wo.setWorId(workOrderRun.getId());
workOrderRun.setRunStatus(WorkOrderRun.RUN_STATUS_ISSUED);
//新增状态:外协状态,转外协审批通过后,置为待外协
workOrderRun.setOemStatus(WorkOrderRun.OEM_STATUS_TO);
//调用转外协自动分派处理
if (wpList != null && wpList.size() > 0) {
//判断工序是否存在外协商,如果存在不进行二次分派
@ -275,8 +276,8 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
} else {
workOrderRun.setInCustomer(wp.getOcId());
}
//todo 更新车间订单主责任单位
// prWorkOrderService.updateHostWorkUnit(wo.getId());
//更新车间订单主责任单位
workOrderService.updateHostWorkUnit(wo);
} else {
//转厂内业务
@ -321,7 +322,7 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
// pjAutomaticDispatchService.runAutomaticDispatch(wpList, yo, Boolean.TRUE, null);
//周新昊 20241015 增加调用下方方法
//处理包装工序 并且工艺能力包含 包装 并且加工单位为空的
//todo 手持移动端数据查询接口类未实现
//手持移动端数据查询接口
pdaLoadService.handleBaoZhuangWorkPlan(wpList, yo);
} else {
PlateAround prPlateAround = new PlateAround();
@ -358,8 +359,7 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl<WorkOrderRunMapper,
TeamSet makeTeam = teamSetMapper.selectById(wo.getTsId());
workOrderService.maintainOrder(wo, makeTeam.getPlanner(), makeTeam.getDispatcher(), workOrderRun, false);
//更新车间订单主责任单位
//todo 更新车间订单主责任单位
// prWorkOrderService.updateHostWorkUnit(wo.getId());
workOrderService.updateHostWorkUnit(wo);
//关闭erp外协订单,程序调用存储过程
if (!yo.getManualIncrease()) {

@ -173,7 +173,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
@Transactional(rollbackFor = Exception.class)
public boolean inBatches(Long oldWoId, InBatchesDTO inBatchesDTO, Long userId) {
WorkOrder oldWo = this.getById(oldWoId);
WorkOrder newWo = this.addWorkOrderAndYieldOrder(oldWo, inBatchesDTO);
WorkOrder newWo = this.addWorkOrderAndYieldOrder(oldWo, inBatchesDTO, false);
List<WorkPlan> oldList = workPlanService.list(Wrappers.lambdaQuery(WorkPlan.class).eq(WorkPlan::getWoId, oldWoId));
//保存作业计划
List<WorkPlan> wpList = this.saveWorkPlan(oldList, newWo, oldWoId);
@ -200,7 +200,13 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
return true;
}
private WorkOrder addWorkOrderAndYieldOrder(WorkOrder oldWo, InBatchesDTO inBatchesDTO) {
/**
* @param oldWo
* @param inBatchesDTO
* @param oem 是否外协分批
* @return
*/
private WorkOrder addWorkOrderAndYieldOrder(WorkOrder oldWo, InBatchesDTO inBatchesDTO, boolean oem) {
WorkOrder newWo = new WorkOrder();
YieldOrder newYie = new YieldOrder();
YieldOrder oldYie = yieldOrderService.getById(oldWo.getYoId());
@ -221,6 +227,10 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
newWo.setWoCode(inBatchesDTO.getWoCode());
newWo.setBatchNo(inBatchesDTO.getBatchNo());
newWo.setOemType(-1);
if (oem) {
//外协分批需要更新此状态,其他不变
newWo.setOemOut("0");
}
newWo.setCardNo(inBatchesDTO.getCardNo());
newWo.setMemo(inBatchesDTO.getMemo());
newWo.setMesCardNo(oldWo.getMesCardNo() != null ? this.nextMesCardNo(oldWo.getMesCardNo()) : "");
@ -770,10 +780,10 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
yieldOrderService.updateYieldStatus(workOrder.getYoId(), YieldOrder.CUR_STATUS_COMPLETED, workOrder.getInventoryQty());
} else if (WorkOrder.RUN_STATUS_ISSUED.equals(runStatus)) {
workOrder.setApprovalStatus(WorkOrder.APPROVAL_STATUS_NORMAL);
// if (workOrder.getPrWorkPlan().getMakeTeam() != null) {
// if (workOrder.getWorkPlan().getMakeTeam() != null) {
// String msgContent = "车间订单:【" + workOrder.getWoCode() + "】,零件号:【" + workOrder.getPjYieldOrder()
// .getPartCode() + ",】批次号:【" + workOrder.getBatchNo() + "】,已下达,请班组长分配工作!!";
// pfMessageService.sendMessage(msgContent, workOrder.getPrWorkPlan().getMakeTeam().getDispatcher().getUserId(),
// pfMessageService.sendMessage(msgContent, workOrder.getWorkPlan().getMakeTeam().getDispatcher().getUserId(),
// PfMessageType.MTCODE_0200, userInfo, Boolean.FALSE, null);
// }
@ -1722,6 +1732,98 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
}
@Override
public R inOemBatches(Long oldWoId, InBatchesDTO inBatchesDTO, Long userId) {
WorkOrder oldWo = this.getById(oldWoId);
WorkOrder newWo = this.addWorkOrderAndYieldOrder(oldWo, inBatchesDTO, true);
List<WorkPlan> oldList = workPlanService.list(Wrappers.lambdaQuery(WorkPlan.class).eq(WorkPlan::getWoId, oldWoId));
//保存作业计划
List<WorkPlan> wpList = this.saveWorkPlan(oldList, newWo, oldWoId);
// 获取旧工单的运行记录,用于复用字段
WorkOrderRun oldWr = workOrderRunService.getById(oldWo.getWorId());
// 产生车间运行记录信息(完整设置所有字段)
WorkOrderRun wr = new WorkOrderRun();
// 基础关联信息
wr.setWoId(newWo.getId()); // 新工单对象
wr.setWoCode(newWo.getWoCode()); // 新工单编号
wr.setRunType(WorkOrderRun.RUN_TYPE_1); // 运行类型改为外协
wr.setOemStatus(WorkOrderRun.OEM_STATUS_TO);//外协状态改为待外协
// 复用旧运行记录的班组和供应商信息
wr.setOutTeam(oldWr.getOutTeam()); // 转出班组
wr.setInTeam(oldWr.getInTeam()); // 转入班组
wr.setOutCustomer(oldWr.getOutCustomer()); // 转出供应商
wr.setInCustomer(oldWr.getInCustomer()); // 转入供应商
// 备注信息修改
wr.setMemo("分批(外协)"); // 备注改成分批(外协)
// 时间和人员信息
wr.setCreateTime(new Date()); // 创建时间为当前时间
wr.setCreateUser(userId); // 创建人
wr.setApprovalMan(oldWr.getApprovalMan()); // 审批人(复用旧记录)
wr.setApprovalTime(oldWr.getApprovalTime()); // 审批时间(复用旧记录)
wr.setApprovalMemo(oldWr.getApprovalMemo()); // 审批意见(复用旧记录)
// 其他状态字段
wr.setPrintFlag(oldWr.getPrintFlag()); // 打印标记
wr.setDeliverKey(oldWr.getDeliverKey()); // 交件单号
wr.setRunStatus(oldWr.getRunStatus()); // 订单状态
wr.setSystemData(oldWr.getSystemData()); // 系统数据标识
wr.setPrintMan(oldWr.getPrintMan()); // 打印人
wr.setCollaborate(newWo.getCollaborate()); // 是否协作计划(取自新工单)
// 保存新的运行记录并关联到新工单
workOrderRunService.save(wr);
newWo.setWorId(wr.getId());
//保存作业计划
this.calculationWp(newWo, wpList);
// 转存工序的加工信息
this.saveProcessMarkRec(oldList, wpList);
// 创建并保存工序运行明细记录
// 获取旧工单对应的工序运行记录列表
List<WorkPlanRun> oldWprList = workPlanRunService.list(Wrappers.lambdaQuery(WorkPlanRun.class).eq(WorkPlanRun::getWorId, oldWr.getId()));
if (oldWprList != null && !oldWprList.isEmpty()) {
// 创建映射表,方便通过wpId查找对应的旧工序运行记录
Map<String, WorkPlanRun> oldWprMap = new HashMap<>();
for (WorkPlanRun oldWpr : oldWprList) {
WorkPlan oldWp = workPlanService.getById(oldWpr.getWpId());
// 假设"工序顺序_工序集合ID"是唯一标识
String key = oldWp.getOrders() + "_" + oldWp.getPpsId();
oldWprMap.put(key, oldWpr);
}
// 为每个新作业计划创建对应的工序运行记录
List<WorkPlanRun> newWprList = new ArrayList<>();
for (WorkPlan newWp : wpList) {
String key = newWp.getOrders() + "_" + newWp.getPpsId();
WorkPlanRun oldWpr = oldWprMap.get(key);
if (oldWpr != null) {
WorkPlanRun newWpr = new WorkPlanRun();
// 设置新生成的关联字段
newWpr.setWorId(wr.getId()); // 关联新生成的工单运行记录
newWpr.setWpId(newWp.getId()); // 关联新生成的作业计划
newWpr.setCaId(newWp.getCaId()); // 使用新作业计划的工艺能力
// 复用旧记录中的字段
newWpr.setHandle(oldWpr.getHandle()); // 处理工序标记
newWpr.setStartTime(oldWpr.getStartTime()); // 计划开始时间
newWpr.setEndTime(oldWpr.getEndTime()); // 计划结束时间
newWprList.add(newWpr);
}
}
if (!newWprList.isEmpty()) {
for (WorkPlanRun wpr : newWprList) {
workPlanRunService.save(wpr); // 调用单条保存方法
}
}
}
return R.success("操作完成");
}
private void workPlanEnd(WorkPlan workPlan, Date newDate, Double makeQty) {
if (workPlan == null) {
return;

Loading…
Cancel
Save