|
|
@ -4,9 +4,6 @@ import cn.hutool.core.collection.CollUtil; |
|
|
|
import cn.hutool.core.date.DatePattern; |
|
|
|
import cn.hutool.core.date.DateUtil; |
|
|
|
import cn.hutool.core.lang.UUID; |
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
|
|
|
import com.win.framework.common.exception.ErrorCode; |
|
|
|
import com.win.module.mes.config.MesBaseConfig; |
|
|
|
import com.win.module.mes.controller.mesorderday.vo.*; |
|
|
|
import com.win.module.mes.dal.dataobject.mesorderdayroutesub.MesOrderDayRoutesubDO; |
|
|
|
import com.win.module.mes.dal.dataobject.mesworkscheduling.MesWorkSchedulingDO; |
|
|
@ -20,13 +17,13 @@ import com.win.module.mes.service.mesorderdayroutesub.MesOrderDayRoutesubService |
|
|
|
import com.win.module.mes.service.mesorderdayworker.MesOrderDayWorkerService; |
|
|
|
import com.win.module.mes.service.mesorderdayworkstation.MesOrderDayWorkstationService; |
|
|
|
import com.win.module.mes.service.mesworkscheduling.MesWorkSchedulingService; |
|
|
|
import com.win.module.mes.service.mesworkschedulingdetail.MesWorkSchedulingDetailService; |
|
|
|
import com.win.module.mes.config.InfaConfigUtil; |
|
|
|
import com.win.module.system.util.StringUtils; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
import javax.annotation.Resource; |
|
|
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
import org.springframework.validation.annotation.Validated; |
|
|
|
|
|
|
|
import java.time.LocalDateTime; |
|
|
|
import java.util.*; |
|
|
@ -62,7 +59,9 @@ public class MesOrderDayServiceImpl implements MesOrderDayService { |
|
|
|
private MesOrderDayWorkerService mesOrderDayWorkerService; |
|
|
|
@Resource |
|
|
|
private MesOrderDayWorkstationService mesOrderDayWorkstationService; |
|
|
|
|
|
|
|
@Resource |
|
|
|
InfaConfigUtil infaConfigUtil; |
|
|
|
private String WAITBEGIN; |
|
|
|
@Override |
|
|
|
@Transactional |
|
|
|
public Long createOrderDay(MesOrderDayCreateReqVO createReqVO) { |
|
|
@ -74,7 +73,7 @@ public class MesOrderDayServiceImpl implements MesOrderDayService { |
|
|
|
} |
|
|
|
//生成对应的数据模板
|
|
|
|
|
|
|
|
private void createRealationModels(MesOrderDayDO orderDay){ |
|
|
|
private void createRealationModels(MesOrderDayDO orderDay) { |
|
|
|
|
|
|
|
//生成工艺路线实例,产品工艺不存在时不允许录入计划
|
|
|
|
mesOrderDayRouteService.createOrderDayRouteModel(orderDay); |
|
|
@ -84,11 +83,12 @@ public class MesOrderDayServiceImpl implements MesOrderDayService { |
|
|
|
mesOrderDayEquipmentService.createOrderDayEquipmentModel(orderDay); |
|
|
|
// //生成工位信息实例 没有强制要求
|
|
|
|
//mesOrderDayWorkerService.createOrderDayWorkerModel(orderDay);
|
|
|
|
mesOrderDayWorkstationService.createOrderDayWorkstationModel(orderDay); |
|
|
|
mesOrderDayWorkstationService.createOrderDayWorkstationModel(orderDay); |
|
|
|
//生成工序模具信息
|
|
|
|
//-------------
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public Integer updateOrderDay(MesOrderDayUpdateReqVO updateReqVO) { |
|
|
|
// 校验存在
|
|
|
@ -105,11 +105,11 @@ public class MesOrderDayServiceImpl implements MesOrderDayService { |
|
|
|
///validateOrderDayExists(id);
|
|
|
|
// 删除2
|
|
|
|
MesOrderDayDO mesOrderDayDO = orderDayMapper.selectById(id); |
|
|
|
if(StringUtils.isNotNull(mesOrderDayDO)){ |
|
|
|
mesOrderDayRouteService.deleteOrderDayRouteModel(mesOrderDayDO); |
|
|
|
mesOrderDayBomService.deleteOrderDayBomModel(mesOrderDayDO); |
|
|
|
return orderDayMapper.deleteById(id); |
|
|
|
}else{ |
|
|
|
if (StringUtils.isNotNull(mesOrderDayDO)) { |
|
|
|
mesOrderDayRouteService.deleteOrderDayRouteModel(mesOrderDayDO); |
|
|
|
mesOrderDayBomService.deleteOrderDayBomModel(mesOrderDayDO); |
|
|
|
return orderDayMapper.deleteById(id); |
|
|
|
} else { |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
@ -151,6 +151,7 @@ public class MesOrderDayServiceImpl implements MesOrderDayService { |
|
|
|
|
|
|
|
return errorList; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 发布日生产计划: |
|
|
|
* 步骤:根据日生产计划的计划编号、产品号、计划数量、计划时间、工单模式、bom方式(是否可改)、工艺方式(是否可改) 生产模式 |
|
|
@ -158,60 +159,68 @@ public class MesOrderDayServiceImpl implements MesOrderDayService { |
|
|
|
* 生产模式:派工则根据工艺路线+工序的配置 生成默认的工位、人员、设备;领工方式 把人员、设备数据置空;人员和设备可以随时调整 |
|
|
|
* 如果bom方式使用了替代bom,则可以在发布时进行调整 |
|
|
|
* 如果工艺方式使用了临时工艺,则可以在发布时进行调整,发布后不可以调整 |
|
|
|
*job_mes_work_scheduling job_mes_work_scheduling_detail |
|
|
|
* */ |
|
|
|
* job_mes_work_scheduling job_mes_work_scheduling_detail |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
@Transactional |
|
|
|
public Integer publish(MesOrderDayCreateReqVO reqVO){ |
|
|
|
if(StringUtils.isNull(reqVO)){ |
|
|
|
throw exception(ORDER_DAY_IS_EMPTY); |
|
|
|
} |
|
|
|
Map<String, List> schedulingSingle = getSchedulingSingle(reqVO); |
|
|
|
//工作模式
|
|
|
|
int ret=mesWorkSchedulingService.inertBacthTrans(schedulingSingle.get("master"),schedulingSingle.get("sub")); |
|
|
|
MesOrderDayDO dayDO=new MesOrderDayDO(); |
|
|
|
dayDO.setPlanNoDay(reqVO.getPlanNoDay()); |
|
|
|
dayDO.setBatchCode(reqVO.getBatchCode()); |
|
|
|
dayDO.setProductCode(reqVO.getProductCode()); |
|
|
|
dayDO.setId(reqVO.getUpdateId()); |
|
|
|
dayDO.setStatus(PlanBillStatusEnum.PUBLISHED.getCode()); |
|
|
|
orderDayMapper.updateById(dayDO); |
|
|
|
return ret; |
|
|
|
public Integer publish(MesOrderDayCreateReqVO reqVO) { |
|
|
|
if (StringUtils.isNull(reqVO)) { |
|
|
|
throw exception(ORDER_DAY_IS_EMPTY); |
|
|
|
} |
|
|
|
//增加判断是否已经发布了该计划
|
|
|
|
if (!mesWorkSchedulingService.exisitWorkScheduling(reqVO)) { |
|
|
|
getPreCheckStauts();//获取前置参数配置
|
|
|
|
Map<String, List> schedulingSingle = getSchedulingSingle(reqVO); |
|
|
|
//工作模式
|
|
|
|
int ret = mesWorkSchedulingService.inertBacthTrans(schedulingSingle.get("master"), schedulingSingle.get("sub")); |
|
|
|
MesOrderDayDO dayDO = new MesOrderDayDO(); |
|
|
|
dayDO.setPlanNoDay(reqVO.getPlanNoDay()); |
|
|
|
dayDO.setBatchCode(reqVO.getBatchCode()); |
|
|
|
dayDO.setProductCode(reqVO.getProductCode()); |
|
|
|
dayDO.setId(reqVO.getUpdateId()); |
|
|
|
dayDO.setStatus(PlanBillStatusEnum.PUBLISHED.getCode()); |
|
|
|
orderDayMapper.updateById(dayDO); |
|
|
|
return ret; |
|
|
|
} else { |
|
|
|
throw exception(PLAN_SCHEDULED_EXISTS); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void publish(Long id){ |
|
|
|
public void publish(Long id) { |
|
|
|
|
|
|
|
} |
|
|
|
private Map<String,List> getSchedulingSingle(MesOrderDayCreateReqVO createReqVO){ |
|
|
|
Integer planCounts=createReqVO.getPlanCount(); |
|
|
|
Integer billCount=1; |
|
|
|
if(createReqVO.getWorkMode().equalsIgnoreCase(WorkModeEnum.BATCH.getCode())){ |
|
|
|
billCount=planCounts; |
|
|
|
}else{ |
|
|
|
billCount=1; |
|
|
|
|
|
|
|
private Map<String, List> getSchedulingSingle(MesOrderDayCreateReqVO createReqVO) { |
|
|
|
Integer planCounts = createReqVO.getPlanCount(); |
|
|
|
Integer billCount = 1; |
|
|
|
if (createReqVO.getWorkMode().equalsIgnoreCase(WorkModeEnum.BATCH.getCode())) { |
|
|
|
billCount = planCounts; |
|
|
|
} else { |
|
|
|
billCount = 1; |
|
|
|
} |
|
|
|
int counts=Math.floorDiv(planCounts,billCount); |
|
|
|
int perCounts=planCounts/counts; |
|
|
|
int counts = Math.floorDiv(planCounts, billCount); |
|
|
|
int perCounts = planCounts / counts; |
|
|
|
//获取工艺路线的实例的工序
|
|
|
|
OrderDayQueryParamVo orderVO =new OrderDayQueryParamVo(); |
|
|
|
OrderDayQueryParamVo orderVO = new OrderDayQueryParamVo(); |
|
|
|
orderVO.setBatchCode(createReqVO.getBatchCode()); |
|
|
|
orderVO.setPlanNoDay(createReqVO.getPlanNoDay()); |
|
|
|
orderVO.setProductCode(createReqVO.getProductCode()); |
|
|
|
orderVO.setProcessrouteCode(createReqVO.getProcessrouteCode()); |
|
|
|
List<MesOrderDayRoutesubDO> orderDayRoutesubList = mesOrderDayRoutesubService.getOrderDayRoutesubList(orderVO); |
|
|
|
Optional<MesOrderDayRoutesubDO> startNode = orderDayRoutesubList.stream().filter(item -> item.getPreProcessCode().equalsIgnoreCase("startNode")).findFirst(); |
|
|
|
List<MesWorkSchedulingDO> list=new ArrayList<>(); |
|
|
|
List<MesWorkSchedulingDetailDO> listSub=new ArrayList<>(); |
|
|
|
int leftCounts=planCounts; |
|
|
|
for(int i=0;i<counts;i++){ |
|
|
|
MesWorkSchedulingDO item=getBaseMesWorkSchedulingDO(createReqVO); |
|
|
|
List<MesWorkSchedulingDO> list = new ArrayList<>(); |
|
|
|
List<MesWorkSchedulingDetailDO> listSub = new ArrayList<>(); |
|
|
|
int leftCounts = planCounts; |
|
|
|
for (int i = 0; i < counts; i++) { |
|
|
|
MesWorkSchedulingDO item = getBaseMesWorkSchedulingDO(createReqVO); |
|
|
|
item.setPlanCount(perCounts); |
|
|
|
item.setWorkingNode(startNode.get().getProcessCode()); |
|
|
|
list.add(item); |
|
|
|
if(StringUtils.isNotEmpty(orderDayRoutesubList)){ //生成工序级任务
|
|
|
|
final int taskSort=i; |
|
|
|
orderDayRoutesubList.forEach(sub->{ |
|
|
|
MesWorkSchedulingDetailDO detailDO=new MesWorkSchedulingDetailDO(); |
|
|
|
if (StringUtils.isNotEmpty(orderDayRoutesubList)) { //生成工序级任务
|
|
|
|
final int taskSort = i; |
|
|
|
orderDayRoutesubList.forEach(sub -> { |
|
|
|
MesWorkSchedulingDetailDO detailDO = new MesWorkSchedulingDetailDO(); |
|
|
|
detailDO.setSchedulingCode(item.getSchedulingCode()); |
|
|
|
detailDO.setPlanCount(perCounts); |
|
|
|
detailDO.setStatus(WorkingScheduleEnum.READYTODO.getCode()); |
|
|
@ -223,19 +232,19 @@ public class MesOrderDayServiceImpl implements MesOrderDayService { |
|
|
|
listSub.add(detailDO); |
|
|
|
}); |
|
|
|
} |
|
|
|
leftCounts=leftCounts - perCounts; |
|
|
|
leftCounts = leftCounts - perCounts; |
|
|
|
} |
|
|
|
|
|
|
|
if(leftCounts>0){//有剩余工单的数量和计划数量不是整除关系时
|
|
|
|
final int taskSort=counts; |
|
|
|
if (leftCounts > 0) {//有剩余工单的数量和计划数量不是整除关系时
|
|
|
|
final int taskSort = counts; |
|
|
|
final int finalLeftCounts = leftCounts; |
|
|
|
MesWorkSchedulingDO item=getBaseMesWorkSchedulingDO(createReqVO); |
|
|
|
MesWorkSchedulingDO item = getBaseMesWorkSchedulingDO(createReqVO); |
|
|
|
item.setPlanCount(leftCounts); |
|
|
|
item.setWorkingNode(startNode.get().getProcessCode()); |
|
|
|
list.add(item); |
|
|
|
if(StringUtils.isNotEmpty(orderDayRoutesubList)){ //生成工序级任务
|
|
|
|
orderDayRoutesubList.forEach(sub->{ |
|
|
|
MesWorkSchedulingDetailDO detailDO=new MesWorkSchedulingDetailDO(); |
|
|
|
if (StringUtils.isNotEmpty(orderDayRoutesubList)) { //生成工序级任务
|
|
|
|
orderDayRoutesubList.forEach(sub -> { |
|
|
|
MesWorkSchedulingDetailDO detailDO = new MesWorkSchedulingDetailDO(); |
|
|
|
detailDO.setSchedulingCode(item.getSchedulingCode()); |
|
|
|
detailDO.setPlanCount(finalLeftCounts); |
|
|
|
detailDO.setStatus(WorkingScheduleEnum.READYTODO.getCode()); |
|
|
@ -248,23 +257,26 @@ public class MesOrderDayServiceImpl implements MesOrderDayService { |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
Map<String,List> map=new HashMap<>(); |
|
|
|
map.put("master",list); |
|
|
|
map.put("sub",listSub); |
|
|
|
Map<String, List> map = new HashMap<>(); |
|
|
|
map.put("master", list); |
|
|
|
map.put("sub", listSub); |
|
|
|
return map; |
|
|
|
} |
|
|
|
|
|
|
|
private MesWorkSchedulingDO getBaseMesWorkSchedulingDO(MesOrderDayCreateReqVO createReqVO){ |
|
|
|
MesWorkSchedulingDO item=new MesWorkSchedulingDO(); |
|
|
|
private void getPreCheckStauts(){ |
|
|
|
//从配置项中获取配置
|
|
|
|
if (infaConfigUtil.getBooleanValue(MesConfigKeys.PRE_START_CHECK_ON,Boolean.FALSE)) { |
|
|
|
WAITBEGIN = WorkingScheduleEnum.WAITBEGIN.getCode(); |
|
|
|
} else { |
|
|
|
WAITBEGIN = WorkingScheduleEnum.READYTODO.getCode(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private MesWorkSchedulingDO getBaseMesWorkSchedulingDO(MesOrderDayCreateReqVO createReqVO) { |
|
|
|
MesWorkSchedulingDO item = new MesWorkSchedulingDO(); |
|
|
|
item.setFlagDo(WorkStatusEnum.READY.getCode()); |
|
|
|
//是否需要齐套检查 如果需要
|
|
|
|
String status; |
|
|
|
if(MesBaseConfig.PRE_START_CHECK_ON){ |
|
|
|
status=WorkingScheduleEnum.WAITBEGIN.getCode(); |
|
|
|
}else{ |
|
|
|
status=WorkingScheduleEnum.READYTODO.getCode(); |
|
|
|
} |
|
|
|
item.setStatus(status); |
|
|
|
item.setStatus(WAITBEGIN); |
|
|
|
item.setFinishCount(0); |
|
|
|
item.setFormType(createReqVO.getWorkMode()); |
|
|
|
item.setLineCode(createReqVO.getLineCode()); |
|
|
@ -279,12 +291,14 @@ public class MesOrderDayServiceImpl implements MesOrderDayService { |
|
|
|
item.setWorkingTaskSort(0); |
|
|
|
return item; |
|
|
|
} |
|
|
|
private LocalDateTime getLocalDatetime( LocalDateTime date,String time){ |
|
|
|
String target=DateUtil.format( date, DatePattern.NORM_DATE_PATTERN)+" "+time; |
|
|
|
return DateUtil.parseLocalDateTime(target,DatePattern.NORM_DATETIME_PATTERN); |
|
|
|
|
|
|
|
private LocalDateTime getLocalDatetime(LocalDateTime date, String time) { |
|
|
|
String target = DateUtil.format(date, DatePattern.NORM_DATE_PATTERN) + " " + time; |
|
|
|
return DateUtil.parseLocalDateTime(target, DatePattern.NORM_DATETIME_PATTERN); |
|
|
|
} |
|
|
|
|
|
|
|
@Resource |
|
|
|
MesWorkSchedulingService mesWorkSchedulingService; |
|
|
|
@Resource |
|
|
|
MesOrderDayRoutesubService mesOrderDayRoutesubService; |
|
|
|
MesOrderDayRoutesubService mesOrderDayRoutesubService; |
|
|
|
} |
|
|
|