|
|
@@ -20,6 +20,7 @@ import com.github.zuihou.business.operationManagementCenter.dto.OrderProductUpda
|
|
|
import com.github.zuihou.business.operationManagementCenter.dto.OrderUpdateDTO;
|
|
|
import com.github.zuihou.business.operationManagementCenter.entity.*;
|
|
|
import com.github.zuihou.business.operationManagementCenter.service.*;
|
|
|
+import com.github.zuihou.business.productionReadyCenter.dao.BBomMapper;
|
|
|
import com.github.zuihou.business.productionReadyCenter.dao.BomProcedureProductionresourceMapper;
|
|
|
import com.github.zuihou.business.productionReadyCenter.dao.BomProcedureProgramMapper;
|
|
|
import com.github.zuihou.business.productionReadyCenter.dao.MMeterialReceiveLogMapper;
|
|
|
@@ -125,6 +126,9 @@ public class OrderServiceImpl extends SuperServiceImpl<OrderMapper, Order> imple
|
|
|
@Autowired
|
|
|
private MMeterialReceiveLogService meterialReceiveLogService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private BBomMapper bBomMapper;
|
|
|
+
|
|
|
@Override
|
|
|
public IPage<Order> pageList(IPage page,String sustDesc, LbqWrapper<Order> wrapper) {
|
|
|
return baseMapper.pageList(page,sustDesc, wrapper, new DataScope());
|
|
|
@@ -332,12 +336,14 @@ public class OrderServiceImpl extends SuperServiceImpl<OrderMapper, Order> imple
|
|
|
List<Long> bomIdList = plan.getPlanProductList().stream().map(p -> p.getBomId()).collect(Collectors.toList());
|
|
|
//查出本次需要得工艺信息
|
|
|
Map<Long, List<BomProcedure>> bomProcedureMap = bomProcedureService.getBomProcedureMap(bomIdList);
|
|
|
+ List<BBom> bboms = bBomMapper.selectList(Wraps.<BBom>lbQ().in(BBom::getId,bomIdList));
|
|
|
+ Map<Long,BBom> bbomsMap = bboms.stream().collect(Collectors.toMap(BBom::getId, t->t));
|
|
|
|
|
|
for (PlanProduct planProduct : plan.getPlanProductList()) {
|
|
|
for (int partNum = 0; partNum < planProduct.getPlanBomNum(); partNum++) {
|
|
|
TWorkpiece workpiece = new TWorkpiece();
|
|
|
workpiece.setBomId(planProduct.getBomId()).setCompleteBatchNo(UUID.randomUUID().toString().replace("-", "")).setOrderId(planProduct.getOrderId()).setOrderNo(planProduct.getOrderNo())
|
|
|
- .setPlanId(planProduct.getPlanId()).setPlanNo(planProduct.getPlanNo());
|
|
|
+ .setPlanId(planProduct.getPlanId()).setPlanNo(planProduct.getPlanNo()).setBomName(bbomsMap.get(planProduct.getBomId()).getName());
|
|
|
workpieceMapper.insert(workpiece);
|
|
|
|
|
|
// 生成task表,因为工序定了以后不变,排产时只需更新预计开始时间和结束时间
|
|
|
@@ -711,9 +717,6 @@ public class OrderServiceImpl extends SuperServiceImpl<OrderMapper, Order> imple
|
|
|
|
|
|
@Override
|
|
|
public Order orderEnable(Order model){
|
|
|
- // 默认只有一键生产过后的订单可以暂停和启用,未一键生产过的订单无需暂停和启用,启用是找出所有的所有未加工的工件重新排序
|
|
|
- model.setProduceStatus("2");
|
|
|
- planMapper.updatePlanProduceStatus(model);
|
|
|
|
|
|
// 找出当前所有的订单计划还未开始加工的工件进行重排
|
|
|
QueryWrapper<Plan> planWrapper = new QueryWrapper<Plan>();
|
|
|
@@ -741,135 +744,140 @@ public class OrderServiceImpl extends SuperServiceImpl<OrderMapper, Order> imple
|
|
|
//查出本次需要得工艺信息
|
|
|
Map<Long, List<BomProcedure>> bomProcedureMap = bomProcedureService.getBomProcedureMap(bomIdList);
|
|
|
|
|
|
- // 可选设备集合(工序名称+可选设备列表)
|
|
|
- Map<String, List<CandidateProcess>> candidateProMap = new HashMap<>(); // 可选处理集合(可选设备以及对应的加工时间)
|
|
|
- // 工序集合(工序名+工序)
|
|
|
- Map<String, Operation> operationMap = new HashMap<>();
|
|
|
- // 设备集合(设备名+设备)
|
|
|
- Map<String, Machine> machineMap = new HashMap<>();
|
|
|
- // 零件集合(零件名称+零件)
|
|
|
- Map<String, Part> partMap = new HashMap<>();
|
|
|
- Map<Long,OrderProduct> orderProductMap = orderProductList.stream().collect(Collectors.toMap(OrderProduct::getId, t->t));
|
|
|
-
|
|
|
- List<TTask> taskList = new ArrayList<TTask>();
|
|
|
- //设置completeBatchNo
|
|
|
- Map<String,String> completeBatchNoMap = new HashMap<String,String>();
|
|
|
- double totalOpNum = 0.0;
|
|
|
-
|
|
|
- for(TWorkpiece tWorkpiece : tWorkpieces){
|
|
|
- Long bomId = planProductMap.get(tWorkpiece.getPlanId());
|
|
|
- List<BomProcedure> bomProcedureList = bomProcedureMap.get(bomId);
|
|
|
- Map<Long,BomProcedure> bomProcedureListMap = bomProcedureList.stream().collect(Collectors.toMap(BomProcedure::getId, t->t));
|
|
|
- Part part = new Part();
|
|
|
- List<CandidateProcess> candidateProcesses = new ArrayList<CandidateProcess>();
|
|
|
- // 根据工件id查找未加工的任务
|
|
|
- QueryWrapper<TTask> tTaskWrapper = new QueryWrapper<TTask>();
|
|
|
- planWrapper.in("completeBatchNo", tWorkpiece.getCompleteBatchNo());
|
|
|
- planWrapper.eq("status", "1");
|
|
|
- List<TTask> tTasks = taskMapper.selectList(tTaskWrapper);
|
|
|
- List<Operation> opList = new ArrayList<Operation>();
|
|
|
-
|
|
|
- for(TTask tTask : tTasks){
|
|
|
- BomProcedure bomProcedure = bomProcedureListMap.get(tTask.getProcedureId());
|
|
|
- if (bomProcedure.getProductionresourceList().size() > 0){
|
|
|
- Machine machine = new Machine();
|
|
|
- CandidateProcess candidateProcess = new CandidateProcess();
|
|
|
- for(BomProcedureProductionresource bomProcedureProductionresource : bomProcedure.getProductionresourceList()){
|
|
|
- if(!machineMap.containsKey(bomProcedureProductionresource.getResourceId())){
|
|
|
- machine.setId(bomProcedureProductionresource.getResourceId().longValue());
|
|
|
- // 添加设备维保时间片
|
|
|
- LbqWrapper<Repair> repairWrapper = new LbqWrapper<Repair>().eq(Repair::getProductionresourceId, bomProcedureProductionresource.getResourceId()).gt(Repair::getRepairStartTime, cn.hutool.core.date.DateUtil.toLocalDateTime(cn.hutool.core.date.DateUtil.date()));
|
|
|
- List<Repair> repairs = repairService.list(repairWrapper);
|
|
|
- for(Repair repair : repairs){
|
|
|
- machine.getNoUseTime().add(Timestamp.valueOf(repair.getRepairStartTime()).getTime() + "-" + Timestamp.valueOf(repair.getRepairEndTime()).getTime());
|
|
|
- }
|
|
|
- machineMap.put("M" + bomProcedureProductionresource.getResourceId(), machine);
|
|
|
- }
|
|
|
-
|
|
|
- if(!candidateProMap.containsKey(tWorkpiece.getCompleteBatchNo() + "_" + bomProcedure.getNo())){
|
|
|
- candidateProcess.setMachineId(bomProcedureProductionresource.getResourceId());
|
|
|
- LbqWrapper<BomProcedureProgram> bomProcedureProgramWrapper = new LbqWrapper<BomProcedureProgram>().eq(BomProcedureProgram::getResourceId, bomProcedureProductionresource.getResourceId()).eq(BomProcedureProgram::getProcedureId,bomProcedureProductionresource.getProcedureId());
|
|
|
- BomProcedureProgram bomProcedureProgram = bomProcedureProgramMapper.selectOne(bomProcedureProgramWrapper);
|
|
|
- // 人工上下料没有程序的情况直接用工序时间
|
|
|
- if(null != bomProcedureProgram && null != bomProcedureProgram.getWorkTime()){
|
|
|
- candidateProcess.setProcedureId(bomProcedureProgram.getProcedureId());
|
|
|
- candidateProcess.setDuration(bomProcedureProgram.getWorkTime().intValue());
|
|
|
- candidateProcess.setRunTime(bomProcedureProgram.getWorkTime());
|
|
|
- }else{
|
|
|
- candidateProcess.setProcedureId(bomProcedure.getId());
|
|
|
- //candidateProcess.setDuration(bomProcedure.getPrepareWorkhours().intValue() + bomProcedure.getRatedWorkhours().intValue());
|
|
|
- candidateProcess.setDuration(bomProcedure.getRatedWorkhours().intValue());
|
|
|
- candidateProcess.setRunTime( bomProcedure.getRatedWorkhours());
|
|
|
- }
|
|
|
- if(!candidateProcesses.contains(candidateProcess)){
|
|
|
- candidateProcesses.add(candidateProcess);
|
|
|
- }
|
|
|
- candidateProMap.put(tWorkpiece.getCompleteBatchNo() + "_" + bomProcedure.getNo(),candidateProcesses);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- // 组装排产所以的工序信息
|
|
|
- Operation operation = new Operation();
|
|
|
- operation.setId(String.valueOf(tTask.getId()));
|
|
|
- operation.setPartId(tTask.getCompleteBatchNo());
|
|
|
- operation.setName(tTask.getProcedureNo());
|
|
|
- operation.setSeq(tTask.getProcedureSort()+1);
|
|
|
- operation.setDueDate(orderProductListMap.get(tWorkpiece.getBomId()).getDeliveryTime().getTime());
|
|
|
- operation.setPlanQty(1);
|
|
|
- String operationKey = tTask.getCompleteBatchNo() + "_" + tTask.getProcedureNo();
|
|
|
- operationMap.put(operationKey,operation);
|
|
|
- opList.add(operation);
|
|
|
- totalOpNum ++;
|
|
|
- }
|
|
|
-
|
|
|
- part.setId(tWorkpiece.getCompleteBatchNo());
|
|
|
- part.setOperationNum(bomProcedureList.size());
|
|
|
- part.setOpList(opList);
|
|
|
- // 根据最终版本调整交互日期及优先级
|
|
|
- part.setDueDate(orderProductListMap.get(tWorkpiece.getBomId()).getDeliveryTime().getTime());
|
|
|
- part.setPartPrority(plansMap.get(tWorkpiece.getPlanId()).getPrority());
|
|
|
- partMap.put(tWorkpiece.getCompleteBatchNo(),part);
|
|
|
-
|
|
|
- }
|
|
|
+// // 可选设备集合(工序名称+可选设备列表)
|
|
|
+// Map<String, List<CandidateProcess>> candidateProMap = new HashMap<>(); // 可选处理集合(可选设备以及对应的加工时间)
|
|
|
+// // 工序集合(工序名+工序)
|
|
|
+// Map<String, Operation> operationMap = new HashMap<>();
|
|
|
+// // 设备集合(设备名+设备)
|
|
|
+// Map<String, Machine> machineMap = new HashMap<>();
|
|
|
+// // 零件集合(零件名称+零件)
|
|
|
+// Map<String, Part> partMap = new HashMap<>();
|
|
|
+// Map<Long,OrderProduct> orderProductMap = orderProductList.stream().collect(Collectors.toMap(OrderProduct::getId, t->t));
|
|
|
+//
|
|
|
+// List<TTask> taskList = new ArrayList<TTask>();
|
|
|
+// //设置completeBatchNo
|
|
|
+// Map<String,String> completeBatchNoMap = new HashMap<String,String>();
|
|
|
+// double totalOpNum = 0.0;
|
|
|
+//
|
|
|
+// for(TWorkpiece tWorkpiece : tWorkpieces){
|
|
|
+// Long bomId = planProductMap.get(tWorkpiece.getPlanId());
|
|
|
+// List<BomProcedure> bomProcedureList = bomProcedureMap.get(bomId);
|
|
|
+// Map<Long,BomProcedure> bomProcedureListMap = bomProcedureList.stream().collect(Collectors.toMap(BomProcedure::getId, t->t));
|
|
|
+// Part part = new Part();
|
|
|
+// List<CandidateProcess> candidateProcesses = new ArrayList<CandidateProcess>();
|
|
|
+// // 根据工件id查找未加工的任务
|
|
|
+// QueryWrapper<TTask> tTaskWrapper = new QueryWrapper<TTask>();
|
|
|
+// planWrapper.in("completeBatchNo", tWorkpiece.getCompleteBatchNo());
|
|
|
+// planWrapper.eq("status", "1");
|
|
|
+// List<TTask> tTasks = taskMapper.selectList(tTaskWrapper);
|
|
|
+// List<Operation> opList = new ArrayList<Operation>();
|
|
|
+//
|
|
|
+// for(TTask tTask : tTasks){
|
|
|
+// BomProcedure bomProcedure = bomProcedureListMap.get(tTask.getProcedureId());
|
|
|
+// if (bomProcedure.getProductionresourceList().size() > 0){
|
|
|
+// Machine machine = new Machine();
|
|
|
+// CandidateProcess candidateProcess = new CandidateProcess();
|
|
|
+// for(BomProcedureProductionresource bomProcedureProductionresource : bomProcedure.getProductionresourceList()){
|
|
|
+// if(!machineMap.containsKey(bomProcedureProductionresource.getResourceId())){
|
|
|
+// machine.setId(bomProcedureProductionresource.getResourceId().longValue());
|
|
|
+// // 添加设备维保时间片
|
|
|
+// LbqWrapper<Repair> repairWrapper = new LbqWrapper<Repair>().eq(Repair::getProductionresourceId, bomProcedureProductionresource.getResourceId()).gt(Repair::getRepairStartTime, cn.hutool.core.date.DateUtil.toLocalDateTime(cn.hutool.core.date.DateUtil.date()));
|
|
|
+// List<Repair> repairs = repairService.list(repairWrapper);
|
|
|
+// for(Repair repair : repairs){
|
|
|
+// machine.getNoUseTime().add(Timestamp.valueOf(repair.getRepairStartTime()).getTime() + "-" + Timestamp.valueOf(repair.getRepairEndTime()).getTime());
|
|
|
+// }
|
|
|
+// machineMap.put("M" + bomProcedureProductionresource.getResourceId(), machine);
|
|
|
+// }
|
|
|
+//
|
|
|
+// if(!candidateProMap.containsKey(tWorkpiece.getCompleteBatchNo() + "_" + bomProcedure.getNo())){
|
|
|
+// candidateProcess.setMachineId(bomProcedureProductionresource.getResourceId());
|
|
|
+// LbqWrapper<BomProcedureProgram> bomProcedureProgramWrapper = new LbqWrapper<BomProcedureProgram>().eq(BomProcedureProgram::getResourceId, bomProcedureProductionresource.getResourceId()).eq(BomProcedureProgram::getProcedureId,bomProcedureProductionresource.getProcedureId());
|
|
|
+// BomProcedureProgram bomProcedureProgram = bomProcedureProgramMapper.selectOne(bomProcedureProgramWrapper);
|
|
|
+// // 人工上下料没有程序的情况直接用工序时间
|
|
|
+// if(null != bomProcedureProgram && null != bomProcedureProgram.getWorkTime()){
|
|
|
+// candidateProcess.setProcedureId(bomProcedureProgram.getProcedureId());
|
|
|
+// candidateProcess.setDuration(bomProcedureProgram.getWorkTime().intValue());
|
|
|
+// candidateProcess.setRunTime(bomProcedureProgram.getWorkTime());
|
|
|
+// }else{
|
|
|
+// candidateProcess.setProcedureId(bomProcedure.getId());
|
|
|
+// //candidateProcess.setDuration(bomProcedure.getPrepareWorkhours().intValue() + bomProcedure.getRatedWorkhours().intValue());
|
|
|
+// candidateProcess.setDuration(bomProcedure.getRatedWorkhours().intValue());
|
|
|
+// candidateProcess.setRunTime( bomProcedure.getRatedWorkhours());
|
|
|
+// }
|
|
|
+// if(!candidateProcesses.contains(candidateProcess)){
|
|
|
+// candidateProcesses.add(candidateProcess);
|
|
|
+// }
|
|
|
+// candidateProMap.put(tWorkpiece.getCompleteBatchNo() + "_" + bomProcedure.getNo(),candidateProcesses);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// // 组装排产所以的工序信息
|
|
|
+// Operation operation = new Operation();
|
|
|
+// operation.setId(String.valueOf(tTask.getId()));
|
|
|
+// operation.setPartId(tTask.getCompleteBatchNo());
|
|
|
+// operation.setName(tTask.getProcedureNo());
|
|
|
+// operation.setSeq(tTask.getProcedureSort()+1);
|
|
|
+// operation.setDueDate(orderProductListMap.get(tWorkpiece.getBomId()).getDeliveryTime().getTime());
|
|
|
+// operation.setPlanQty(1);
|
|
|
+// String operationKey = tTask.getCompleteBatchNo() + "_" + tTask.getProcedureNo();
|
|
|
+// operationMap.put(operationKey,operation);
|
|
|
+// opList.add(operation);
|
|
|
+// totalOpNum ++;
|
|
|
+// }
|
|
|
+//
|
|
|
+// part.setId(tWorkpiece.getCompleteBatchNo());
|
|
|
+// part.setOperationNum(bomProcedureList.size());
|
|
|
+// part.setOpList(opList);
|
|
|
+// // 根据最终版本调整交互日期及优先级
|
|
|
+// part.setDueDate(orderProductListMap.get(tWorkpiece.getBomId()).getDeliveryTime().getTime());
|
|
|
+// part.setPartPrority(plansMap.get(tWorkpiece.getPlanId()).getPrority());
|
|
|
+// partMap.put(tWorkpiece.getCompleteBatchNo(),part);
|
|
|
+//
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 调用java简易排产
|
|
|
+// Instance instance = new Instance();
|
|
|
+// instance.setTotalOpNum(totalOpNum);
|
|
|
+// // 赋值设备map
|
|
|
+// instance.setMachineMap(machineMap);
|
|
|
+// // 创造零件map
|
|
|
+// instance.setPartMap(partMap);
|
|
|
+// // 创造工序map
|
|
|
+// instance.setOperationMap(operationMap);
|
|
|
+// // 创造工序可选设备集合map
|
|
|
+// instance.setCandidateProMap(candidateProMap);
|
|
|
+//
|
|
|
+// GAScheduler gaScheduler = new GAScheduler(instance, GAScheduler.PRIORITY_CODE);
|
|
|
+// try{
|
|
|
+// gaScheduler.schedule();
|
|
|
+// }catch(Exception e){
|
|
|
+// e.printStackTrace();
|
|
|
+// }
|
|
|
+// // 更新task表人工序任务的预计开始时间及结束时间
|
|
|
+// Iterator<Map.Entry<String, Operation>> it = instance.getOperationMap().entrySet().iterator();
|
|
|
+// while(it.hasNext()){
|
|
|
+// Operation operation = it.next().getValue();
|
|
|
+// for(TTask task : taskList){
|
|
|
+// if(task.getTmpId().equals(operation.getId())){
|
|
|
+// List<BomProcedureProductionresource> procedureProductionresourceList = procedureProductionresourceMapper.selectList(Wraps.<BomProcedureProductionresource>lbQ().eq(BomProcedureProductionresource::getProcedureId,task.getProcedureId()).
|
|
|
+// eq(BomProcedureProductionresource::getResourceId,operation.getMachineId()).orderByDesc(BomProcedureProductionresource::getCreateTime));
|
|
|
+// task.setExpectStartTime(new Date(operation.getStart()));
|
|
|
+// task.setExpectEndTime(new Date(operation.getFinish()));
|
|
|
+// task.setResourceId(operation.getMachineId());
|
|
|
+// if(CollectionUtil.isNotEmpty(procedureProductionresourceList)){
|
|
|
+// task.setResourceBusinessId(procedureProductionresourceList.get(0).getResourceBusinessId());
|
|
|
+// }
|
|
|
+// taskMapper.updateAllById(task);
|
|
|
+// break;
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// }
|
|
|
|
|
|
- // 调用java简易排产
|
|
|
- Instance instance = new Instance();
|
|
|
- instance.setTotalOpNum(totalOpNum);
|
|
|
- // 赋值设备map
|
|
|
- instance.setMachineMap(machineMap);
|
|
|
- // 创造零件map
|
|
|
- instance.setPartMap(partMap);
|
|
|
- // 创造工序map
|
|
|
- instance.setOperationMap(operationMap);
|
|
|
- // 创造工序可选设备集合map
|
|
|
- instance.setCandidateProMap(candidateProMap);
|
|
|
-
|
|
|
- GAScheduler gaScheduler = new GAScheduler(instance, GAScheduler.PRIORITY_CODE);
|
|
|
- try{
|
|
|
- gaScheduler.schedule();
|
|
|
- }catch(Exception e){
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- // 更新task表人工序任务的预计开始时间及结束时间
|
|
|
- Iterator<Map.Entry<String, Operation>> it = instance.getOperationMap().entrySet().iterator();
|
|
|
- while(it.hasNext()){
|
|
|
- Operation operation = it.next().getValue();
|
|
|
- for(TTask task : taskList){
|
|
|
- if(task.getTmpId().equals(operation.getId())){
|
|
|
- List<BomProcedureProductionresource> procedureProductionresourceList = procedureProductionresourceMapper.selectList(Wraps.<BomProcedureProductionresource>lbQ().eq(BomProcedureProductionresource::getProcedureId,task.getProcedureId()).
|
|
|
- eq(BomProcedureProductionresource::getResourceId,operation.getMachineId()).orderByDesc(BomProcedureProductionresource::getCreateTime));
|
|
|
- task.setExpectStartTime(new Date(operation.getStart()));
|
|
|
- task.setExpectEndTime(new Date(operation.getFinish()));
|
|
|
- task.setResourceId(operation.getMachineId());
|
|
|
- if(CollectionUtil.isNotEmpty(procedureProductionresourceList)){
|
|
|
- task.setResourceBusinessId(procedureProductionresourceList.get(0).getResourceBusinessId());
|
|
|
- }
|
|
|
- taskMapper.updateAllById(task);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
+ // 默认只有一键生产过后的订单可以暂停和启用,未一键生产过的订单无需暂停和启用,启用是找出所有的所有未加工的工件重新排序
|
|
|
+ model.setProduceStatus("2");
|
|
|
+ planMapper.updatePlanProduceStatus(model);
|
|
|
|
|
|
- }
|
|
|
return model;
|
|
|
}
|
|
|
|