|
@@ -8,6 +8,7 @@ import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.json.JSONConfig;
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.rongwei.bscommon.sys.dao.ApsBlankOrderDao;
|
|
|
import com.rongwei.bscommon.sys.fegin.RwApsServer;
|
|
|
import com.rongwei.bscommon.sys.service.*;
|
|
@@ -21,6 +22,7 @@ import com.rongwei.rwcommon.utils.SecurityUtil;
|
|
|
import com.rongwei.rwcommon.utils.StringUtils;
|
|
|
import com.rongwei.safecommon.utils.CXCommonUtils;
|
|
|
import com.rongwei.safecommon.utils.SaveConstans;
|
|
|
+import org.apache.commons.math3.stat.descriptive.summary.Product;
|
|
|
import org.redisson.api.RLock;
|
|
|
import org.redisson.api.RedissonClient;
|
|
|
import org.slf4j.Logger;
|
|
@@ -33,6 +35,7 @@ import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.ZoneId;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
import java.util.stream.Collectors;
|
|
@@ -65,6 +68,10 @@ public class ApsServiceImpl implements ApsService {
|
|
|
private ApsEquipmentCalendarService apsEquipmentCalendarService;
|
|
|
@Autowired
|
|
|
private ApsProcessOperationOutMaterService apsProcessOperationOutMaterService;
|
|
|
+ @Autowired
|
|
|
+ private ApsFurnaceInstallationService apsFurnaceInstallationService;
|
|
|
+ @Autowired
|
|
|
+ private ApsMergeFurnaceService apsMergeFurnaceService;
|
|
|
|
|
|
@Override
|
|
|
// @Async("customThreadPool")
|
|
@@ -166,14 +173,18 @@ public class ApsServiceImpl implements ApsService {
|
|
|
}
|
|
|
return a;
|
|
|
});
|
|
|
+ // 排程前解锁所有待排程订单
|
|
|
+ List<String> blankOrderIds = new ArrayList<>();
|
|
|
+ apsBlankOrders.forEach((bo)->{
|
|
|
+ blankOrderIds.add(bo.getId());
|
|
|
+ });
|
|
|
+ processOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().set(ApsProcessOperationProcessEquDo::getLockmark,"n")
|
|
|
+ .in(ApsProcessOperationProcessEquDo::getBlankid,blankOrderIds));
|
|
|
// 排程
|
|
|
List<ProductionScheduleVo> productionScheduleVos = new ArrayList<>();
|
|
|
Map<String,List<ApsBlankOrderVo>> dataMap = new HashMap<>();
|
|
|
- // 自动排序
|
|
|
- List<List<ApsBlankOrderVo>> apsOrders = new ArrayList<>();
|
|
|
- for (ApsBlankOrderVo apsBlankOrder : apsBlankOrders) {
|
|
|
+ Map<String,ApsBlankOrderVo> dataMapOrder = new HashMap<>();
|
|
|
|
|
|
- }
|
|
|
// 所有设备
|
|
|
List<AspCheckItemsDo> eqs = aspCheckItemsService.list(new LambdaQueryWrapper<>());
|
|
|
Map<String, AspCheckItemsDo> eqMaps = new HashMap<>();
|
|
@@ -183,14 +194,18 @@ public class ApsServiceImpl implements ApsService {
|
|
|
apsBlankOrders.forEach((bo)->{
|
|
|
List<ApsBlankOrderVo> v = new ArrayList<>();
|
|
|
v.add(bo);
|
|
|
+ dataMapOrder.put(bo.getId(),bo);
|
|
|
// 模型转换
|
|
|
ProductionScheduleVo productionScheduleVo = apsProductionScheduleInit(v);
|
|
|
productionScheduleVos.add(productionScheduleVo);
|
|
|
dataMap.put(productionScheduleVo.getProductionScheduleId(),v);
|
|
|
});
|
|
|
if(productionScheduleVos != null && productionScheduleVos.size()>0){
|
|
|
+ JSONConfig jsonConfig = JSONConfig.create();
|
|
|
+ jsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ List<ApsScheduleConfigDo> apsConfigs = apsScheduleConfigService.list();
|
|
|
// 提前退火排程
|
|
|
- ProductionScheduleVo productionScheduleThVo = new ProductionScheduleVo();
|
|
|
+ /*ProductionScheduleVo productionScheduleThVo = new ProductionScheduleVo();
|
|
|
productionScheduleThVo.setProductionScheduleId("提前退火排程-"+SecurityUtil.getUUID());
|
|
|
productionScheduleThVo.setApsPlanStartDate(productionScheduleVos.get(0).getApsPlanStartDate());
|
|
|
productionScheduleThVo.setPlanSeconds(productionScheduleVos.get(0).getPlanSeconds());
|
|
@@ -223,25 +238,166 @@ public class ApsServiceImpl implements ApsService {
|
|
|
List<Equipment> equipmentList = new ArrayList<>();
|
|
|
List<ApsProcessOperationDo> operationDos = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
|
|
|
.in(ApsProcessOperationDo::getBlankid, thBlankIds));
|
|
|
- List<ApsScheduleConfigDo> apsConfigs = apsScheduleConfigService.list();
|
|
|
for (ApsProcessOperationDo operationDo : operationDos) {
|
|
|
- List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList,eqMaps,thBlankIds,productionScheduleThVo,apsConfigs.get(0));
|
|
|
+ List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList,eqMaps,thBlankIds,null,productionScheduleThVo,apsConfigs.get(0));
|
|
|
}
|
|
|
productionScheduleThVo.setEquipmentList(equipmentList);
|
|
|
|
|
|
// 退火排程
|
|
|
- JSONConfig jsonConfig = JSONConfig.create();
|
|
|
- jsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
System.out.println("排程数据:" + JSONUtil.toJsonStr(productionScheduleThVo, jsonConfig));
|
|
|
logger.info("排程数据:" + JSONUtil.toJsonStr(productionScheduleThVo, jsonConfig));
|
|
|
// APS平台排程接口调用
|
|
|
ProductionScheduleRetVo productionScheduleRetThVo = rwApsServer.productionThSchedule(productionScheduleThVo);
|
|
|
if (!"200".equals(productionScheduleRetThVo.getCode())) {
|
|
|
throw new CustomException(productionScheduleRetThVo.getMsg());
|
|
|
- }
|
|
|
+ }*/
|
|
|
|
|
|
- // 全部排程
|
|
|
+ // 全部排程,每4个一组
|
|
|
+ Map<String,ProductionProcesses> allProcesses = new HashMap<>();
|
|
|
+ List<ProductionProcesses> rootProcesses = new ArrayList<>();
|
|
|
for (ProductionScheduleVo productionScheduleVo : productionScheduleVos) {
|
|
|
+ for (ProductionProcesses process : productionScheduleVo.getProcesses()) {
|
|
|
+ allProcesses.put(process.getId(),process);
|
|
|
+ if(process.getPreviousProcessesIds() == null || process.getPreviousProcessesIds().size() == 0){
|
|
|
+ rootProcesses.add(process);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 坯料计划排序
|
|
|
+ Collections.sort(rootProcesses,(v1,v2)->{
|
|
|
+ // 合金
|
|
|
+ String alloy1 = v1.getVolumeMetal();
|
|
|
+ String alloy2 = v2.getVolumeMetal();
|
|
|
+ // 合金状态
|
|
|
+ String alloystatus1 = v1.getVolumeMetalstate();
|
|
|
+ String alloystatus2 = v2.getVolumeMetalstate();
|
|
|
+ // 产品类型
|
|
|
+ String producttype1 = v1.getProducttype();
|
|
|
+ String producttype2 = v2.getProducttype();
|
|
|
+ // 宽度
|
|
|
+ BigDecimal prowidth1 = v1.getVolumeWidth();
|
|
|
+ BigDecimal prowidth2 = v2.getVolumeWidth();
|
|
|
+ // 厚度
|
|
|
+ BigDecimal thickness1 = v1.getVolumeThickness();
|
|
|
+ BigDecimal thickness2 = v2.getVolumeThickness();
|
|
|
+ // 重量
|
|
|
+ BigDecimal singlerollweight1 = v1.getSinglerollweight();
|
|
|
+ BigDecimal singlerollweight2 = v2.getSinglerollweight();
|
|
|
+
|
|
|
+ int a = 0;
|
|
|
+ // 宽度
|
|
|
+ if(prowidth1.compareTo(prowidth2) == 0){
|
|
|
+ // 合金
|
|
|
+ if(alloy1.compareTo(alloy2) == 0){
|
|
|
+ // 产品类型
|
|
|
+ if(producttype1 == null || producttype2 == null || producttype1.compareTo(producttype2) == 0){
|
|
|
+ // 厚度
|
|
|
+ if(thickness1.compareTo(thickness2) == 0){
|
|
|
+ // 合金状态
|
|
|
+ if(alloystatus1 == null || alloystatus2 == null || alloystatus1.compareTo(alloystatus2) == 0){
|
|
|
+ // 重量
|
|
|
+ if(singlerollweight1.compareTo(singlerollweight2) == 0){
|
|
|
+ a = 0;
|
|
|
+ }else if(singlerollweight1.compareTo(singlerollweight2) > 0){
|
|
|
+ a = -1;
|
|
|
+ }else{
|
|
|
+ a = 1;
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ a = alloystatus1.compareTo(alloystatus2);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ if(thickness1.compareTo(thickness2) > 0){
|
|
|
+ a = -1;
|
|
|
+ }else{
|
|
|
+ a = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ a = producttype1.compareTo(producttype2);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ a = alloy1.compareTo(alloy2);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ if(prowidth1.compareTo(prowidth2) > 0){
|
|
|
+ a = -1;
|
|
|
+ }else{
|
|
|
+ a = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return a;
|
|
|
+ });
|
|
|
+ List<List<ProductionProcesses>> chunks = new ArrayList<>();
|
|
|
+ int listSize = rootProcesses.size();
|
|
|
+ for (int i = 0; i < listSize; i += 4) {
|
|
|
+ chunks.add(rootProcesses.subList(i, Math.min(i + 4, listSize)));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 全部排程,每4个一组
|
|
|
+ for (List<ProductionProcesses> rootpros : chunks) {
|
|
|
+ ProductionScheduleVo productionScheduleVo = productionScheduleVoInit();
|
|
|
+ // 工序作业ID
|
|
|
+ Set<String> opId = new LinkedHashSet<>();
|
|
|
+ Set<String> orderIds = new LinkedHashSet<>();
|
|
|
+ List<ProductionProcesses> pssall = new ArrayList<>();
|
|
|
+ for (ProductionProcesses processes : rootpros) {
|
|
|
+ pssall.add(processes);
|
|
|
+ for (String s : processes.getBsProcessesId()) {
|
|
|
+ opId.add(s);
|
|
|
+ }
|
|
|
+ for (ProduceOrder produceOrder : processes.getProduceOrder()) {
|
|
|
+ orderIds.add(produceOrder.getId());
|
|
|
+ }
|
|
|
+ getAllNextPross(processes,allProcesses,pssall,opId);
|
|
|
+ }
|
|
|
+ // 退火工序锁定
|
|
|
+ /*if(productionScheduleRetThVo.getProcesses() != null && productionScheduleRetThVo.getProcesses().size()>0){
|
|
|
+ for (ProductionProcesses process : pssall) {
|
|
|
+ for (ProductionProcesses productionScheduleRetThVoProcess : productionScheduleRetThVo.getProcesses()) {
|
|
|
+ if(productionScheduleRetThVoProcess.getId().equals(process.getId())){
|
|
|
+ process.setEquipmentId(productionScheduleRetThVoProcess.getEquipmentId());
|
|
|
+ List<String> opeqs = new ArrayList<>();
|
|
|
+ opeqs.add(productionScheduleRetThVoProcess.getEquipmentId());
|
|
|
+ process.setOptionalEquipments(opeqs);
|
|
|
+ process.setDelay(0);
|
|
|
+ process.setStartTime(productionScheduleRetThVoProcess.getStartTime());
|
|
|
+ process.setEndTime(productionScheduleRetThVoProcess.getEndTime());
|
|
|
+ process.setIfLock(true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }*/
|
|
|
+ // 排程计划设备集合
|
|
|
+ List<Equipment> equipmentList1 = new ArrayList<>();
|
|
|
+ List<ApsProcessOperationDo> operationDos1 = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
|
|
|
+ .in(ApsProcessOperationDo::getId, opId));
|
|
|
+ for (ApsProcessOperationDo operationDo : operationDos1) {
|
|
|
+ List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList1,eqMaps,null,opId,productionScheduleVo,apsConfigs.get(0));
|
|
|
+ }
|
|
|
+ productionScheduleVo.setEquipmentList(equipmentList1);
|
|
|
+ productionScheduleVo.setProcesses(pssall);
|
|
|
+
|
|
|
+ System.out.println("排程数据:" + JSONUtil.toJsonStr(productionScheduleVo, jsonConfig));
|
|
|
+ logger.info("排程数据:" + JSONUtil.toJsonStr(productionScheduleVo, jsonConfig));
|
|
|
+ // APS平台排程接口调用
|
|
|
+ ProductionScheduleRetVo productionScheduleRetVo = rwApsServer.productionSchedule(productionScheduleVo);
|
|
|
+ if (!"200".equals(productionScheduleRetVo.getCode())) {
|
|
|
+ throw new CustomException(productionScheduleRetVo.getMsg());
|
|
|
+ }
|
|
|
+ // 获取坯料计划
|
|
|
+ List<ApsBlankOrderVo> apsBlankOrderss = new ArrayList<>();
|
|
|
+ for (String orderId : orderIds) {
|
|
|
+ ApsBlankOrderVo apsBlankOrderVo = dataMapOrder.get(orderId);
|
|
|
+ if(apsBlankOrderVo != null){
|
|
|
+ apsBlankOrderss.add(apsBlankOrderVo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ apsBlankOrderService.apsAfter(productionScheduleRetVo,apsBlankOrderss);
|
|
|
+ }
|
|
|
+
|
|
|
+ /*for (ProductionScheduleVo productionScheduleVo : productionScheduleVos) {
|
|
|
// 退火工序锁定
|
|
|
if(productionScheduleRetThVo.getProcesses() != null && productionScheduleRetThVo.getProcesses().size()>0){
|
|
|
for (ProductionProcesses process : productionScheduleVo.getProcesses()) {
|
|
@@ -272,7 +428,7 @@ public class ApsServiceImpl implements ApsService {
|
|
|
List<ApsProcessOperationDo> operationDos1 = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
|
|
|
.in(ApsProcessOperationDo::getBlankid, blankIds));
|
|
|
for (ApsProcessOperationDo operationDo : operationDos1) {
|
|
|
- List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList1,eqMaps,blankIds,productionScheduleVo,apsConfigs.get(0));
|
|
|
+ List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList1,eqMaps,blankIds,null,productionScheduleVo,apsConfigs.get(0));
|
|
|
}
|
|
|
productionScheduleVo.setEquipmentList(equipmentList1);
|
|
|
|
|
@@ -284,7 +440,7 @@ public class ApsServiceImpl implements ApsService {
|
|
|
throw new CustomException(productionScheduleRetVo.getMsg());
|
|
|
}
|
|
|
apsBlankOrderService.apsAfter(productionScheduleRetVo,dataMap.get(productionScheduleVo.getProductionScheduleId()));
|
|
|
- }
|
|
|
+ }*/
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
@@ -297,16 +453,22 @@ public class ApsServiceImpl implements ApsService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 原始订单表数据转换APS平台模型数据
|
|
|
- *
|
|
|
- * @param apsBlankOrders
|
|
|
- * @return
|
|
|
- */
|
|
|
- @Override
|
|
|
- public ProductionScheduleVo apsProductionScheduleInit(List<ApsBlankOrderVo> apsBlankOrders) {
|
|
|
- // 待排程坯料计划ID集合
|
|
|
- List<String> blankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
|
|
|
+ private void getAllNextPross(ProductionProcesses rootProcesses,Map<String,ProductionProcesses> allProcesses,List<ProductionProcesses> pss,Set<String> opId){
|
|
|
+ if(rootProcesses.getNextProcessesIds() != null && rootProcesses.getNextProcessesIds().size()>0){
|
|
|
+ for (String nextProcessesId : rootProcesses.getNextProcessesIds()) {
|
|
|
+ ProductionProcesses processes = allProcesses.get(nextProcessesId);
|
|
|
+ if(processes != null){
|
|
|
+ pss.add(processes);
|
|
|
+ for (String s : processes.getBsProcessesId()) {
|
|
|
+ opId.add(s);
|
|
|
+ }
|
|
|
+ getAllNextPross(processes,allProcesses,pss,opId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private ProductionScheduleVo productionScheduleVoInit(){
|
|
|
ProductionScheduleVo productionScheduleVo = new ProductionScheduleVo();
|
|
|
productionScheduleVo.setProductionScheduleId("批量排程-"+SecurityUtil.getUUID());
|
|
|
List<ApsScheduleConfigDo> apsConfigs = apsScheduleConfigService.list();
|
|
@@ -341,7 +503,26 @@ public class ApsServiceImpl implements ApsService {
|
|
|
// 洗炉合金配置数据设置
|
|
|
List<WashingMetal> washingMetalConfig = apsBlankOrderDao.getWashingMetalConfig();
|
|
|
productionScheduleVo.setClosealloynames(washingMetalConfig);
|
|
|
+ // 小卷退火合并
|
|
|
+ List<ApsFurnaceInstallationDo> furnaceInstallationDos = apsFurnaceInstallationService.list();
|
|
|
+ productionScheduleVo.setFurnaceInstallations(furnaceInstallationDos);
|
|
|
+ // 小卷退火兼容
|
|
|
+ List<ApsMergeFurnaceDo> mergeFurnaceDos = apsMergeFurnaceService.list();
|
|
|
+ productionScheduleVo.setMergeFurnaces(mergeFurnaceDos);
|
|
|
+ return productionScheduleVo;
|
|
|
+ }
|
|
|
|
|
|
+ /**
|
|
|
+ * 原始订单表数据转换APS平台模型数据
|
|
|
+ *
|
|
|
+ * @param apsBlankOrders
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ProductionScheduleVo apsProductionScheduleInit(List<ApsBlankOrderVo> apsBlankOrders) {
|
|
|
+ // 待排程坯料计划ID集合
|
|
|
+ List<String> blankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
|
|
|
+ ProductionScheduleVo productionScheduleVo = productionScheduleVoInit();
|
|
|
// 排程计划工序任务集合
|
|
|
List<ProductionProcesses> processesList = new ArrayList<>();
|
|
|
// 坯料计划ID和所属工序作业ID对应关系
|
|
@@ -398,7 +579,7 @@ public class ApsServiceImpl implements ApsService {
|
|
|
}
|
|
|
|
|
|
private List<String> equipmentListInit(ApsProcessOperationDo operationDo,List<Equipment> equipmentList,Map<String, AspCheckItemsDo> eqMaps
|
|
|
- ,List<String> blankids,ProductionScheduleVo productionScheduleVo,ApsScheduleConfigDo apsScheduleConfig){
|
|
|
+ ,List<String> blankids,Set<String> opId,ProductionScheduleVo productionScheduleVo,ApsScheduleConfigDo apsScheduleConfig){
|
|
|
// 设备列表
|
|
|
List<String> optionalEquipments = new ArrayList<>();
|
|
|
if (StringUtils.isNotBlank(operationDo.getCanchoosedeviceid())) {
|
|
@@ -429,19 +610,45 @@ public class ApsServiceImpl implements ApsService {
|
|
|
ep.setFurnace(apsScheduleConfig.getFurnace());
|
|
|
equipment.setEquipmentParameter(ep);
|
|
|
// 查询设备锁定的已排程的时间段
|
|
|
- List<ApsProcessOperationProcessEquDo> processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
- .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
|
|
|
- .notIn(ApsProcessOperationProcessEquDo::getBlankid, blankids)
|
|
|
- .ge(ApsProcessOperationProcessEquDo::getPlanenddate, productionScheduleVo.getApsPlanStartDate())
|
|
|
- .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
|
|
|
- );
|
|
|
+ List<ApsProcessOperationProcessEquDo> processEqus = null;
|
|
|
+ if(blankids != null && blankids.size()>0){
|
|
|
+ processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
+ .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
|
|
|
+ .eq(ApsProcessOperationProcessEquDo::getLockmark, "y")
|
|
|
+// .notIn(ApsProcessOperationProcessEquDo::getBlankid, blankids)
|
|
|
+ .ge(ApsProcessOperationProcessEquDo::getPlanenddate, productionScheduleVo.getApsPlanStartDate())
|
|
|
+ .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
|
|
|
+ );
|
|
|
+ }else if(opId != null && opId.size()>0){
|
|
|
+ processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
+ .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
|
|
|
+ .eq(ApsProcessOperationProcessEquDo::getLockmark, "y")
|
|
|
+// .notIn(ApsProcessOperationProcessEquDo::getProcessid, opId)
|
|
|
+ .ge(ApsProcessOperationProcessEquDo::getPlanenddate, productionScheduleVo.getApsPlanStartDate())
|
|
|
+ .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
// 查询当前设备最后一个生产任务、连续生产需要考虑使用
|
|
|
- List<ApsProcessOperationProcessEquDo> lastpros = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
- .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
|
|
|
- .notIn(ApsProcessOperationProcessEquDo::getBlankid, blankids)
|
|
|
- .lt(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
|
|
|
- .orderByDesc(ApsProcessOperationProcessEquDo::getPlanstartdate)
|
|
|
- );
|
|
|
+ List<ApsProcessOperationProcessEquDo> lastpros = null;
|
|
|
+ if(blankids != null && blankids.size()>0){
|
|
|
+ lastpros = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
+ .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
|
|
|
+ .eq(ApsProcessOperationProcessEquDo::getLockmark, "y")
|
|
|
+// .notIn(ApsProcessOperationProcessEquDo::getBlankid, blankids)
|
|
|
+ .lt(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
|
|
|
+ .orderByDesc(ApsProcessOperationProcessEquDo::getPlanstartdate)
|
|
|
+ );
|
|
|
+ }else if(opId != null && opId.size()>0){
|
|
|
+ lastpros = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
+ .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
|
|
|
+ .eq(ApsProcessOperationProcessEquDo::getLockmark, "y")
|
|
|
+// .notIn(ApsProcessOperationProcessEquDo::getProcessid, opId)
|
|
|
+ .lt(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
|
|
|
+ .orderByDesc(ApsProcessOperationProcessEquDo::getPlanstartdate)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
if (lastpros != null && lastpros.size() > 0) {
|
|
|
boolean hasLast = true;
|
|
|
ApsProcessOperationProcessEquDo lastpro = lastpros.get(0);
|
|
@@ -629,6 +836,7 @@ public class ApsServiceImpl implements ApsService {
|
|
|
for (String equIds : sbIds) {
|
|
|
optionalEquipments.add(equIds);
|
|
|
}
|
|
|
+ // 锁定的作业
|
|
|
if(LOCKMARK_Y.equals(operationDo.getLockmark())){
|
|
|
List<ApsProcessOperationProcessEquDo> processDetails = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
.eq(ApsProcessOperationProcessEquDo::getProcessid, operationDo.getId()));
|
|
@@ -645,24 +853,104 @@ public class ApsServiceImpl implements ApsService {
|
|
|
operationProcess.add(processes);
|
|
|
}
|
|
|
}else{
|
|
|
- for (Integer i = 0; i < operationDo.getPlanprocessrall(); i++) {
|
|
|
- ProductionProcesses processes = productionProcessesDetailInit(operationDo, produceOrder, optionalEquipments,outMaterDos);
|
|
|
- if(apsBlankOrderVo.getPlanhavematerialdate() != null){
|
|
|
- // 全局配置
|
|
|
- ApsOverallConfig apsOverallConfig = new ApsOverallConfig();
|
|
|
- Date startDate = apsBlankOrderVo.getPlanhavematerialdate();
|
|
|
- LocalDateTime startTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
|
|
|
- apsOverallConfig.setStartTimeLong(startDate.getTime());
|
|
|
- apsOverallConfig.setStartTime(startTime);
|
|
|
- // 排程全局配置
|
|
|
- apsOverallConfig.setRoamTime(productionScheduleVo.getRoamTime());
|
|
|
- apsOverallConfig.setWashingtime(productionScheduleVo.getWashingtime());
|
|
|
- apsOverallConfig.setStandingtime(productionScheduleVo.getStandingtime());
|
|
|
- apsOverallConfig.setClosealloynames(productionScheduleVo.getClosealloynames());
|
|
|
- apsOverallConfig.setLooseness(productionScheduleVo.getLooseness());
|
|
|
- processes.setApsOverallConfig(apsOverallConfig);
|
|
|
+ if("小卷成退".equals(operationDo.getProcess())){
|
|
|
+ String previousprocessid = operationDo.getPreviousprocessid();
|
|
|
+ ApsProcessOperationDo preprocess = apsProcessOperationService.getById(previousprocessid);
|
|
|
+ if(preprocess == null){
|
|
|
+ throw new CustomException("小卷成退没有前道工序:"+operationDo.getId());
|
|
|
+ }
|
|
|
+ Integer planprocessrall = preprocess.getPlanprocessrall();
|
|
|
+ Integer ys = operationDo.getPlanprocessrall() % planprocessrall;
|
|
|
+ Integer js = operationDo.getPlanprocessrall() / planprocessrall;
|
|
|
+ for (Integer i = 0; i < planprocessrall; i++) {
|
|
|
+ ProductionProcesses processes = productionProcessesDetailInit(operationDo, produceOrder, optionalEquipments,outMaterDos);
|
|
|
+ if(apsBlankOrderVo.getPlanhavematerialdate() != null){
|
|
|
+ // 全局配置
|
|
|
+ ApsOverallConfig apsOverallConfig = new ApsOverallConfig();
|
|
|
+ Date startDate = apsBlankOrderVo.getPlanhavematerialdate();
|
|
|
+ LocalDateTime startTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
|
|
|
+ apsOverallConfig.setStartTimeLong(startDate.getTime());
|
|
|
+ apsOverallConfig.setStartTime(startTime);
|
|
|
+ // 排程全局配置
|
|
|
+ apsOverallConfig.setRoamTime(productionScheduleVo.getRoamTime());
|
|
|
+ apsOverallConfig.setWashingtime(productionScheduleVo.getWashingtime());
|
|
|
+ apsOverallConfig.setStandingtime(productionScheduleVo.getStandingtime());
|
|
|
+ apsOverallConfig.setClosealloynames(productionScheduleVo.getClosealloynames());
|
|
|
+ apsOverallConfig.setFurnaceInstallations(productionScheduleVo.getFurnaceInstallations());
|
|
|
+ apsOverallConfig.setMergeFurnaces(productionScheduleVo.getMergeFurnaces());
|
|
|
+ apsOverallConfig.setLooseness(productionScheduleVo.getLooseness());
|
|
|
+ processes.setApsOverallConfig(apsOverallConfig);
|
|
|
+ }
|
|
|
+ Integer alls = js;
|
|
|
+ if(i<ys){
|
|
|
+ alls = alls + 1;
|
|
|
+ }
|
|
|
+ processes.setSinglerollweight(operationDo.getSinglerollweight().multiply(new BigDecimal(alls)));
|
|
|
+
|
|
|
+ operationProcess.add(processes);
|
|
|
+ }
|
|
|
+
|
|
|
+ } else if ("小卷包装".equals(operationDo.getProcess())) {
|
|
|
+ String previousprocessid = operationDo.getPreviousprocessid();
|
|
|
+ ApsProcessOperationDo preprocess = apsProcessOperationService.getById(previousprocessid);
|
|
|
+ if(preprocess == null){
|
|
|
+ throw new CustomException("小卷成退没有前道工序:"+operationDo.getId());
|
|
|
+ }
|
|
|
+ if("小卷成退".equals(preprocess.getProcess())){
|
|
|
+ preprocess = apsProcessOperationService.getById(preprocess.getPreviousprocessid());
|
|
|
+ }
|
|
|
+ Integer planprocessrall = preprocess.getPlanprocessrall();
|
|
|
+ Integer ys = operationDo.getPlanprocessrall() % planprocessrall;
|
|
|
+ Integer js = operationDo.getPlanprocessrall() / planprocessrall;
|
|
|
+ for (Integer i = 0; i < planprocessrall; i++) {
|
|
|
+ ProductionProcesses processes = productionProcessesDetailInit(operationDo, produceOrder, optionalEquipments,outMaterDos);
|
|
|
+ if(apsBlankOrderVo.getPlanhavematerialdate() != null){
|
|
|
+ // 全局配置
|
|
|
+ ApsOverallConfig apsOverallConfig = new ApsOverallConfig();
|
|
|
+ Date startDate = apsBlankOrderVo.getPlanhavematerialdate();
|
|
|
+ LocalDateTime startTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
|
|
|
+ apsOverallConfig.setStartTimeLong(startDate.getTime());
|
|
|
+ apsOverallConfig.setStartTime(startTime);
|
|
|
+ // 排程全局配置
|
|
|
+ apsOverallConfig.setRoamTime(productionScheduleVo.getRoamTime());
|
|
|
+ apsOverallConfig.setWashingtime(productionScheduleVo.getWashingtime());
|
|
|
+ apsOverallConfig.setStandingtime(productionScheduleVo.getStandingtime());
|
|
|
+ apsOverallConfig.setClosealloynames(productionScheduleVo.getClosealloynames());
|
|
|
+ apsOverallConfig.setFurnaceInstallations(productionScheduleVo.getFurnaceInstallations());
|
|
|
+ apsOverallConfig.setMergeFurnaces(productionScheduleVo.getMergeFurnaces());
|
|
|
+ apsOverallConfig.setLooseness(productionScheduleVo.getLooseness());
|
|
|
+ processes.setApsOverallConfig(apsOverallConfig);
|
|
|
+ }
|
|
|
+ Integer alls = js;
|
|
|
+ if(i<ys){
|
|
|
+ alls = alls + 1;
|
|
|
+ }
|
|
|
+ processes.setProduceTime(operationDo.getOnceprocessmin().intValue() * alls);
|
|
|
+
|
|
|
+ operationProcess.add(processes);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ for (Integer i = 0; i < operationDo.getPlanprocessrall(); i++) {
|
|
|
+ ProductionProcesses processes = productionProcessesDetailInit(operationDo, produceOrder, optionalEquipments,outMaterDos);
|
|
|
+ if(apsBlankOrderVo.getPlanhavematerialdate() != null){
|
|
|
+ // 全局配置
|
|
|
+ ApsOverallConfig apsOverallConfig = new ApsOverallConfig();
|
|
|
+ Date startDate = apsBlankOrderVo.getPlanhavematerialdate();
|
|
|
+ LocalDateTime startTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
|
|
|
+ apsOverallConfig.setStartTimeLong(startDate.getTime());
|
|
|
+ apsOverallConfig.setStartTime(startTime);
|
|
|
+ // 排程全局配置
|
|
|
+ apsOverallConfig.setRoamTime(productionScheduleVo.getRoamTime());
|
|
|
+ apsOverallConfig.setWashingtime(productionScheduleVo.getWashingtime());
|
|
|
+ apsOverallConfig.setStandingtime(productionScheduleVo.getStandingtime());
|
|
|
+ apsOverallConfig.setClosealloynames(productionScheduleVo.getClosealloynames());
|
|
|
+ apsOverallConfig.setFurnaceInstallations(productionScheduleVo.getFurnaceInstallations());
|
|
|
+ apsOverallConfig.setMergeFurnaces(productionScheduleVo.getMergeFurnaces());
|
|
|
+ apsOverallConfig.setLooseness(productionScheduleVo.getLooseness());
|
|
|
+ processes.setApsOverallConfig(apsOverallConfig);
|
|
|
+ }
|
|
|
+ operationProcess.add(processes);
|
|
|
}
|
|
|
- operationProcess.add(processes);
|
|
|
}
|
|
|
}
|
|
|
processesList.addAll(operationProcess);
|
|
@@ -687,6 +975,9 @@ public class ApsServiceImpl implements ApsService {
|
|
|
processes.setProducePcNum(operationDo.getPlanprocessrall());
|
|
|
processes.setProcessType(operationDo.getProcess());
|
|
|
// 单次加工时长
|
|
|
+ if(operationDo.getOnceprocessmin() == null){
|
|
|
+ throw new CustomException("坯料计划ID:"+operationDo.getBlankid()+" 作业类型:"+operationDo.getProcess()+" 作业名称:"+operationDo.getProcessname()+"的作业单卷加工时间为空");
|
|
|
+ }
|
|
|
processes.setUnitProduceTime(operationDo.getOnceprocessmin().intValue());
|
|
|
processes.setProduceTime(operationDo.getOnceprocessmin().intValue());
|
|
|
// 单卷宽度和重量
|
|
@@ -706,6 +997,7 @@ public class ApsServiceImpl implements ApsService {
|
|
|
}else{
|
|
|
processes.setVolumeMetalstate(operationDo.getMetalstate());
|
|
|
}
|
|
|
+ processes.setProducttype(operationDo.getProducttype());
|
|
|
// 连续生产标识设置
|
|
|
// 合金+输入物料+宽度+输入物料厚度+输出物料厚度(取第一个冷轧工序使用)
|
|
|
processes.setSeriesProduceMark(operationDo.getMetal() + "^_^" + operationDo.getProducttype() + "^_^" + operationDo.getProwidth() + "^_^" + operationDo.getThickness() + "^_^" + outMaterDos.get(0).getThickness());
|