|
@@ -88,6 +88,12 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
private ApsWorkInProgressInventoryService apsWorkInProgressInventoryService;
|
|
|
@Autowired
|
|
|
private ApsProcessOutputProductService apsProcessOutputProductService;
|
|
|
+ @Autowired
|
|
|
+ private ApsProcessOperationOutMaterService apsProcessOperationOutMaterService;
|
|
|
+ @Autowired
|
|
|
+ private ApsProcessOperationEquService apsProcessOperationEquService;
|
|
|
+ @Autowired
|
|
|
+ private ApsProcessOperationProcessEquService apsProcessOperationProcessEquService;
|
|
|
|
|
|
|
|
|
@Override
|
|
@@ -120,7 +126,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
// 校验取消的订单中是否存在已加工的工序作业
|
|
|
List<String> startWorkOrderNo = apsProcessOperationDao.getStartWorkById(apsProductionOrderIds);
|
|
|
if (!startWorkOrderNo.isEmpty()) {
|
|
|
- throw new CustomException(CollUtil.join(startWorkOrderNo, ",") + " 以上客户所对应的订单存在已开工的坯料计划,不可以取消排程=!");
|
|
|
+ throw new CustomException(CollUtil.join(startWorkOrderNo, ",") + " 以上客户所对应的订单存在已开工的坯料计划,不可以取消排程!");
|
|
|
}
|
|
|
List<String> blankids = blankOrderDos.stream().map(ApsBlankOrderDo::getId).collect(Collectors.toList());
|
|
|
//清除排程备份和状态修改
|
|
@@ -139,7 +145,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
// 校验取消的订单中是否存在已加工的工序作业
|
|
|
List<String> startWorkOrderNo = apsProcessOperationDao.getStartWorkByBlankId(apsBlankIds);
|
|
|
if (!startWorkOrderNo.isEmpty()) {
|
|
|
- throw new CustomException(CollUtil.join(startWorkOrderNo, ",") + " 以上客户所对应的订单存在已开工的坯料计划,不可以取消排程=!");
|
|
|
+ throw new CustomException(CollUtil.join(startWorkOrderNo, ",") + " 以上客户所对应的订单存在已开工的坯料计划,不可以取消排程!");
|
|
|
}
|
|
|
//获取订单ID
|
|
|
List<ApsBlankOrderDo> blankOrderDoList = this.list(new QueryWrapper<ApsBlankOrderDo>().lambda().in(ApsBlankOrderDo::getId, apsBlankIds));
|
|
@@ -469,13 +475,16 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void blankOrderAps(List<ApsBlankOrderVo> apsBlankOrders) {
|
|
|
+ // 当前等路人所属工厂
|
|
|
+ SysUserVo currentUser = CXCommonUtils.getCurrentUser();
|
|
|
+ String tenantId = currentUser.getOrganizationDoList().get(0).getFullpid().split(",")[1];
|
|
|
assert apsBlankOrders != null : "排程订单不能为空";
|
|
|
// 合并待发布未锁定的订单一起排程
|
|
|
List<String> hasIds = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
|
|
|
String idStrs = CollUtil.join(hasIds, "','");
|
|
|
idStrs = "'" + idStrs + "'";
|
|
|
// 查询存在未锁定的作业坯料计划
|
|
|
- List<ApsBlankOrderVo> fbNotLock = apsBlankOrderDao.getFbNotLock(idStrs);
|
|
|
+ List<ApsBlankOrderVo> fbNotLock = apsBlankOrderDao.getFbNotLock(idStrs,tenantId);
|
|
|
if (fbNotLock != null && fbNotLock.size() > 0) {
|
|
|
apsBlankOrders.addAll(fbNotLock);
|
|
|
}
|
|
@@ -491,6 +500,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
logger.info("排程数据:" + JSONUtil.toJsonStr(productionScheduleVo, jsonConfig));
|
|
|
// APS平台排程接口调用
|
|
|
ProductionScheduleRetVo productionScheduleRetVo = rwApsServer.productionSchedule(productionScheduleVo);
|
|
|
+ if(!"200".equals(productionScheduleRetVo.getCode())){
|
|
|
+ throw new CustomException(productionScheduleRetVo.getMsg());
|
|
|
+ }
|
|
|
// 排程结果保存
|
|
|
List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = new ArrayList<>();
|
|
|
// 最后节点集合
|
|
@@ -515,6 +527,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
apsProcessOperationProcessEqu.setConflictdes(process.getConflictDes());
|
|
|
apsProcessOperationProcessEqu.setSoftconflictdes(process.getSoftconflictdes());
|
|
|
apsProcessOperationProcessEqu.setDeleted("0");
|
|
|
+ apsProcessOperationProcessEqu.setUnfinishroll(process.getProducePcNum());
|
|
|
apsProcessOperationProcessEquDos.add(apsProcessOperationProcessEqu);
|
|
|
}
|
|
|
// 合并生产工序
|
|
@@ -547,6 +560,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
apsProcessOperationProcessEqu.setConflictdes(process.getConflictDes());
|
|
|
apsProcessOperationProcessEqu.setSoftconflictdes(process.getSoftconflictdes());
|
|
|
apsProcessOperationProcessEqu.setDeleted("0");
|
|
|
+ apsProcessOperationProcessEqu.setUnfinishroll(v.size());
|
|
|
apsProcessOperationProcessEquDos.add(apsProcessOperationProcessEqu);
|
|
|
});
|
|
|
}
|
|
@@ -650,7 +664,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
Map<String, Integer> roamTime = new HashMap<>();
|
|
|
Integer workshopin = new BigDecimal(apsScheduleConfig.getWorkshopin()).multiply((looseness.divide(new BigDecimal("100"))).add(new BigDecimal("1")))
|
|
|
.setScale(0, RoundingMode.CEILING).intValue();
|
|
|
- Integer workshopcross = new BigDecimal(apsScheduleConfig.getWorkshopin()).multiply((looseness.divide(new BigDecimal("100"))).add(new BigDecimal("1")))
|
|
|
+ Integer workshopcross = new BigDecimal(apsScheduleConfig.getWorkshopcross()).multiply((looseness.divide(new BigDecimal("100"))).add(new BigDecimal("1")))
|
|
|
.setScale(0, RoundingMode.CEILING).intValue();
|
|
|
roamTime.put("WORKSHOP_IN", workshopin);
|
|
|
roamTime.put("WORKSHOP_CROSS", workshopcross);
|
|
@@ -684,7 +698,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
if (apsBlankOrders != null && apsBlankOrders.size() > 0) {
|
|
|
for (ApsBlankOrderVo apsBlankOrderVo : apsBlankOrders) {
|
|
|
// 坯料计划订单
|
|
|
- ProduceOrder produceOrder = new ProduceOrder(apsBlankOrderVo.getId(), apsBlankOrderVo.getMaterialname(), apsBlankOrderVo.getDeliverydate());
|
|
|
+ ProduceOrder produceOrder = new ProduceOrder(apsBlankOrderVo.getId(), apsBlankOrderVo.getMaterialname(), DateUtil.offsetHour(apsBlankOrderVo.getDeliverydate(),-apsBlankOrderVo.getDeliverytime()));
|
|
|
// 获取所有订单工序
|
|
|
List<ApsProcessOperationDo> operationDos = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
|
|
|
.eq(ApsProcessOperationDo::getBlankid, apsBlankOrderVo.getId()));
|
|
@@ -721,15 +735,17 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
.orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
|
|
|
);
|
|
|
// 查询当前设备最后一个生产任务、连续生产需要考虑使用
|
|
|
- List<ApsProcessOperationProcessEquDo> processLastEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
+ List<ApsProcessOperationProcessEquDo> lastpros = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
.eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
|
|
|
.gt(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
|
|
|
- .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
|
|
|
+ .orderByDesc(ApsProcessOperationProcessEquDo::getPlanstartdate)
|
|
|
);
|
|
|
- if(processLastEqus != null && processLastEqus.size()>0){
|
|
|
- ApsProcessOperationProcessEquDo lastpro = processLastEqus.get(processLastEqus.size()-1);
|
|
|
+ if(lastpros != null && lastpros.size()>0){
|
|
|
+ ApsProcessOperationProcessEquDo lastpro = lastpros.get(0);
|
|
|
ApsProcessOperationDo lastop = apsProcessOperationService.getById(lastpro.getProcessid());
|
|
|
equipment.setLastProcessType(lastop.getProcess());
|
|
|
+ equipment.setLastProcessEndTime(lastpro.getPlanenddate());
|
|
|
+ equipment.setLastProcessCutfinishmin(lastop.getCutfinishmin() == null ? null : lastop.getCutfinishmin().intValue());
|
|
|
// 铸轧
|
|
|
if ("铸轧".equals(lastop.getProcess())) {
|
|
|
// 合金+宽度
|
|
@@ -740,6 +756,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
// 合金+输入物料+宽度
|
|
|
equipment.setLastSeriesProduceMark(lastop.getMetal() + "^_^" + lastop.getPlaninput() + "^_^" + lastop.getProwidth());
|
|
|
}
|
|
|
+ equipment.setLastProcessCutfinishmin(lastop.getCutfinishmin() == null ? null : lastop.getCutfinishmin().intValue());
|
|
|
}
|
|
|
// 查询相关工序作业
|
|
|
Set<String> processIds = new HashSet<>();
|
|
@@ -748,9 +765,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
processIds.add(equs.getProcessid());
|
|
|
}
|
|
|
List<ApsProcessOperationDo> processOperationDos = null;
|
|
|
- if(processIds.size()>0){
|
|
|
+ if (processIds.size() > 0) {
|
|
|
processOperationDos = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
|
|
|
- .in(ApsProcessOperationDo::getId,processIds));
|
|
|
+ .in(ApsProcessOperationDo::getId, processIds));
|
|
|
}
|
|
|
|
|
|
List<EquipmentRunTime> equipmentRunTimes = new ArrayList<>();
|
|
@@ -758,11 +775,10 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
EquipmentRunTime er = new EquipmentRunTime();
|
|
|
er.setStartRunTime(equs.getPlanstartdate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
|
|
|
er.setEndRunTime(equs.getPlanenddate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
|
|
|
- equipmentRunTimes.add(er);
|
|
|
// 设备占用时间设置连续生产标识,参与排程
|
|
|
- if(processOperationDos != null){
|
|
|
+ if (processOperationDos != null) {
|
|
|
List<ApsProcessOperationDo> pos = processOperationDos.stream().filter(v -> v.getId().equals(equs.getProcessid())).collect(Collectors.toList());
|
|
|
- if(pos != null && pos.size()>0){
|
|
|
+ if (pos != null && pos.size() > 0) {
|
|
|
ApsProcessOperationDo processesDo = pos.get(0);
|
|
|
er.setProcessType(processesDo.getProcess());
|
|
|
// 铸轧
|
|
@@ -775,8 +791,11 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
// 合金+输入物料+宽度
|
|
|
er.setSeriesProduceMark(operationDo.getMetal() + "^_^" + operationDo.getPlaninput() + "^_^" + operationDo.getProwidth());
|
|
|
}
|
|
|
+ er.setPrepressworkmin(processesDo.getPrepressworkmin() == null ? null : processesDo.getPrepressworkmin().intValue());
|
|
|
+ er.setCutfinishmin(processesDo.getCutfinishmin() == null ? null : processesDo.getCutfinishmin().intValue());
|
|
|
}
|
|
|
}
|
|
|
+ equipmentRunTimes.add(er);
|
|
|
}
|
|
|
equipment.setEquipmentRunTimes(equipmentRunTimes);
|
|
|
}
|
|
@@ -812,7 +831,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
processes.setUnitProduceTime(operationDo.getOnceprocessmin().intValue());
|
|
|
// processes.setProduceTime(processes.getUnitProduceTime()*processes.getProducePcNum());
|
|
|
processes.setProduceTime(operationDo.getProcesstotaltime().intValue());
|
|
|
- if(operationDo.getMinflowwaitmin() != null){
|
|
|
+ if (operationDo.getMinflowwaitmin() != null) {
|
|
|
processes.setMinWaitTime(operationDo.getMinflowwaitmin().intValue());
|
|
|
}
|
|
|
if (operationDo.getMaxflowwaitmin() != null) {
|
|
@@ -837,14 +856,15 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
// 合金+输入物料+宽度
|
|
|
processes.setSeriesProduceMark(operationDo.getMetal() + "^_^" + operationDo.getPlaninput() + "^_^" + operationDo.getProwidth());
|
|
|
}
|
|
|
-
|
|
|
+ processes.setPrepressworkmin(operationDo.getPrepressworkmin() == null ? null : operationDo.getPrepressworkmin().intValue());
|
|
|
+ processes.setCutfinishmin(operationDo.getCutfinishmin() == null ? null : operationDo.getCutfinishmin().intValue());
|
|
|
processesList.add(processes);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
// 合并生产工序
|
|
|
- List<ProductionProcesses> productionProcesses = mergeProcesses(processOperationMs, eqMaps,apsScheduleConfig);
|
|
|
+ List<ProductionProcesses> productionProcesses = mergeProcesses(processOperationMs, eqMaps, apsScheduleConfig);
|
|
|
processesList.addAll(productionProcesses);
|
|
|
// 加工时间松散度设置
|
|
|
/*if(looseness != null){
|
|
@@ -864,7 +884,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
* @param processOperationMs
|
|
|
* @return
|
|
|
*/
|
|
|
- private List<ProductionProcesses> mergeProcesses(List<ApsProcessOperationVo> processOperationMs, Map<String, AspCheckItemsDo> eqMaps,ApsScheduleConfigDo apsScheduleConfig) {
|
|
|
+ private List<ProductionProcesses> mergeProcesses(List<ApsProcessOperationVo> processOperationMs, Map<String, AspCheckItemsDo> eqMaps, ApsScheduleConfigDo apsScheduleConfig) {
|
|
|
// 最终的合并工序
|
|
|
List<ProductionProcesses> processesList = new ArrayList<>();
|
|
|
if (processOperationMs != null && processOperationMs.size() > 0) {
|
|
@@ -895,7 +915,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
aspCheckItemMap.put(aspCheckItemsDo.getId(), aspCheckItemsDo);
|
|
|
aspCheckItemUse.put(aspCheckItemsDo.getId(), 0);
|
|
|
// 退火炉套筒间隙扣除
|
|
|
- if(apsScheduleConfig != null){
|
|
|
+ if (apsScheduleConfig != null) {
|
|
|
aspCheckItemsDo.setEquipmentwidth(aspCheckItemsDo.getEquipmentwidth().subtract(apsScheduleConfig.getLooseness()));
|
|
|
}
|
|
|
}
|
|
@@ -1158,7 +1178,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void checkIfCanMerge(){
|
|
|
+ private void checkIfCanMerge() {
|
|
|
|
|
|
}
|
|
|
|
|
@@ -1196,8 +1216,8 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
// 更工序作业生产状态=待排程,是否锁定=否,
|
|
|
apsProcessOperationService.update(new LambdaUpdateWrapper<ApsProcessOperationDo>()
|
|
|
.in(ApsProcessOperationDo::getBlankid, blankids)
|
|
|
- .set(ApsProcessOperationDo::getProcessstatus,TO_BE_SCHEDULED)
|
|
|
- .set(ApsProcessOperationDo::getLockmark,LOCKMARK_N)
|
|
|
+ .set(ApsProcessOperationDo::getProcessstatus, TO_BE_SCHEDULED)
|
|
|
+ .set(ApsProcessOperationDo::getLockmark, LOCKMARK_N)
|
|
|
);
|
|
|
// 清空作业明细
|
|
|
processOperationProcessEquService.remove(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
|
|
@@ -1418,7 +1438,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
apsWorkInProgressInventoryService.updateById(apsWorkInProgressInventoryDo);
|
|
|
|
|
|
//借调逻辑
|
|
|
- if (progressWork.getWorkinprocessstatus().equals(SaveConstans.WorkInProgressStatus.WAIT_WORK)) {
|
|
|
+ if (ObjectUtil.isNotEmpty(progressWork) && ObjectUtil.isNotEmpty(progressWork.getWorkinprocessstatus()) && progressWork.getWorkinprocessstatus().equals(SaveConstans.WorkInProgressStatus.WAIT_WORK)) {
|
|
|
//获取该在制品的工序作业ID
|
|
|
String processoperationid = progressWork.getProcessoperationid();
|
|
|
//获取该在制品的批次号
|
|
@@ -1440,4 +1460,218 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
return R.ok();
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ public R checkBlankOrder(CheckAndSaveOrUpdateBlankReq req, int j) {
|
|
|
+ //获取坯料计划内容
|
|
|
+ ApsBlankOrderDo apsBlankOrderDo = req.getApsBlankOrderDo();
|
|
|
+ //获取当前用户信息
|
|
|
+ //获取当前用户的所属工厂
|
|
|
+ SysUserVo currentUser = CXCommonUtils.getCurrentUser();
|
|
|
+ String tenantId = currentUser.getOrganizationDoList().get(0).getFullpid().split(",")[1];
|
|
|
+
|
|
|
+
|
|
|
+ //=============校验坯料长度=================
|
|
|
+ //如果坯料产品类型对应产品外观类型是铝板或板锭,并且坯料长度为空,则提示:坯料是铝板和板锭时长度必填
|
|
|
+ if (ObjectUtil.isNotEmpty(apsBlankOrderDo.getProducttypeid())) {
|
|
|
+ //目前数据字典存在3层关系,选择只能选择最后一层,二开查询最后一层的父节点对应数据的父节点,判断是否为铝板或板锭的主键ID
|
|
|
+ String pid = this.baseMapper.selectDictAboutProductType(apsBlankOrderDo.getProductionorderid());
|
|
|
+ //如果是铝板或板锭
|
|
|
+ if (ObjectUtil.isNotEmpty(pid) && (pid.equals(SaveConstans.ProductionType.BANDING_ID) || pid.equals(SaveConstans.ProductionType.LVBAN_ID))) {
|
|
|
+ //坯料长度为空
|
|
|
+ if (ObjectUtil.isEmpty(apsBlankOrderDo.getProlength())) {
|
|
|
+ return R.error("第" + j + "个坯料计划 坯料是铝板和板锭时长度必填");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //==============拼接工艺路线输出成品==============
|
|
|
+ //查询坯料计划对应工艺路线的输出成品
|
|
|
+ List<String> processOutputList = this.baseMapper.selectProcessByBlankId(apsBlankOrderDo.getId());
|
|
|
+ if (processOutputList != null && processOutputList.size() > 0) {
|
|
|
+ String outputProcessMaterial = "";
|
|
|
+ //排序
|
|
|
+ processOutputList.sort(String::compareTo);
|
|
|
+ for (int i = 0; i < processOutputList.size(); i++) {
|
|
|
+ outputProcessMaterial += "[" + (i + 1) + "]" + processOutputList.get(i);
|
|
|
+ if (i < processOutputList.size() - 1) {
|
|
|
+ outputProcessMaterial += ",\r\n";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ apsBlankOrderDo.setOutputmaterial(outputProcessMaterial);
|
|
|
+ } else {
|
|
|
+ return R.error("第" + j + "个坯料计划 工艺路线没有输出成品");
|
|
|
+ }
|
|
|
+
|
|
|
+ //=============校验输出成品==============
|
|
|
+ //产品明细
|
|
|
+ List<ApsProductDetailDo> apsProductDetailDoList = req.getApsProductDetailDoList();
|
|
|
+ //输出成品
|
|
|
+ List<ApsProcessOutputProductDo> apsProcessOutputProductDoList = req.getApsProcessOutputProductDoList();
|
|
|
+
|
|
|
+ //如果坯料计划未开工(生产状态<=30)
|
|
|
+ if (apsBlankOrderDo.getProductstatus().compareTo(TO_BE_STARTED) <= 0) {
|
|
|
+ for (ApsProcessOutputProductDo apsProcessOutputProductDo : apsProcessOutputProductDoList) {
|
|
|
+ boolean haveProductDetail = false;
|
|
|
+ for (ApsProductDetailDo apsProductDetailDo : apsProductDetailDoList) {
|
|
|
+ //判断是否存在对应的产品明细
|
|
|
+ if (apsProcessOutputProductDo.getProductid().equals(apsProductDetailDo.getId())) {
|
|
|
+ haveProductDetail = true;
|
|
|
+
|
|
|
+ if (apsProductDetailDo.getInputmaterialdescription().equals(apsProcessOutputProductDo.getProductname())) {
|
|
|
+ //如果输出单卷重<单卷重(起)或 输出单卷重>单卷重(止),错误提示:输出成品:{订单产品} 输出单卷重不符合订单要求
|
|
|
+ if (apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProductDetailDo.getSinglerollweightstart()) < 0
|
|
|
+ || apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProductDetailDo.getSinglerollweightend()) > 0) {
|
|
|
+ return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出单卷重不符合订单要求");
|
|
|
+ }
|
|
|
+ } else {//如果对应订单产品明细的订单产品字段值不等于输出成品的订单产品字段值,错误提示:输出成品:{订单产品} 对应订单产品已修改或已删除,请重新选择订单产品
|
|
|
+ return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 对应订单产品已修改或已删除,请重新选择订单产品");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //存在对应的产品明细
|
|
|
+ if (haveProductDetail) {
|
|
|
+ //如果输出单卷重>坯料单卷重,错误提示:输出单卷重不能超过坯料单卷重
|
|
|
+ //(注意:成品重量和坯料重量单位吨和公斤需要转换后比较)
|
|
|
+ //转化单卷重 单位统一为 公斤(kg)
|
|
|
+
|
|
|
+ //输出的单卷重
|
|
|
+ BigDecimal outputWeight = new BigDecimal(0);
|
|
|
+ //坯料的单卷重
|
|
|
+ BigDecimal blankWeight = new BigDecimal(0);
|
|
|
+ //统一输出的重量
|
|
|
+ //公斤/千克
|
|
|
+ if (apsProcessOutputProductDo.getCountunit().equals(SaveConstans.CountUnit.KG)) {
|
|
|
+ outputWeight = apsProcessOutputProductDo.getOutputonerollweigth();
|
|
|
+ }
|
|
|
+ //吨
|
|
|
+ if (apsProcessOutputProductDo.getCountunit().equals(SaveConstans.CountUnit.TON)) {
|
|
|
+ outputWeight = apsProcessOutputProductDo.getOutputonerollweigth().multiply(new BigDecimal(1000));
|
|
|
+ }
|
|
|
+
|
|
|
+ //统一坯料的重量
|
|
|
+ if (apsBlankOrderDo.getNumberunit().equals(SaveConstans.CountUnit.KG)) {
|
|
|
+ blankWeight = apsBlankOrderDo.getSinglerollweight();
|
|
|
+ }
|
|
|
+ if (apsBlankOrderDo.getNumberunit().equals(SaveConstans.CountUnit.TON)) {
|
|
|
+ blankWeight = apsBlankOrderDo.getSinglerollweight().multiply(new BigDecimal(1000));
|
|
|
+ }
|
|
|
+ //输出单卷重>坯料单卷重
|
|
|
+ if (outputWeight.compareTo(blankWeight) > 0) {
|
|
|
+ return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出单卷重不能超过坯料单卷重");
|
|
|
+ }
|
|
|
+ } else {//不存在对应的产品明细
|
|
|
+ return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 对应订单产品已修改或已删除,请重新选择订单产品");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //不论坯料计划的状态,需要增加的判断
|
|
|
+ for (ApsProcessOutputProductDo apsProcessOutputProductDo : apsProcessOutputProductDoList) {
|
|
|
+ boolean haveProductDetail = false;
|
|
|
+ for (ApsProductDetailDo apsProductDetailDo : apsProductDetailDoList) {
|
|
|
+ //判断是否存在对应的产品明细
|
|
|
+ if (apsProcessOutputProductDo.getProductid().equals(apsProductDetailDo.getId())) {
|
|
|
+ haveProductDetail = true;
|
|
|
+ //计划输出订单重量 > 对应订单产品订单总数量;错误提示:输出成品 {订单产品} 计划输出订单重量 不能大于 订单总数量
|
|
|
+ if (apsProcessOutputProductDo.getPlanoutputonerollweight().compareTo(apsProductDetailDo.getTotalordercount()) > 0) {
|
|
|
+ return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 计划输出订单重量 不能大于 订单总数量");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!haveProductDetail && apsProcessOutputProductDo.getPlanoutputonerollweight().compareTo(new BigDecimal(0)) > 0) {
|
|
|
+ return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 已修改或已删除,并已开工,计划输出订单重量 不能大于 0");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //============校验工艺路线=============
|
|
|
+ //如果坯料需求的坯料输出成品字段值不等于坯料需求的工艺输出成品字段值,错误提示:工艺路线输出成品与坯料输出成品不一致
|
|
|
+ if (!apsBlankOrderDo.getOutputfinishproduct().equals(apsBlankOrderDo.getOutputmaterial())) {
|
|
|
+ return R.error("第" + j + "个坯料计划 工艺路线输出成品与坯料输出成品不一致");
|
|
|
+ }
|
|
|
+ //如果坯料需求的是否备料=是,并且首道工序作业的是否坯料工序=是,错误提示:工艺路线错误,首道工序作业是坯料工序,备料不能作为输入物料
|
|
|
+ //是否备料
|
|
|
+ if (apsBlankOrderDo.getPreparematerial().equals("是")) {
|
|
|
+ //查询坯料计划的工序作业
|
|
|
+ List<ApsProcessOperationDo> processOperationList = apsProcessOperationService.list(new QueryWrapper<ApsProcessOperationDo>().lambda().eq(ApsProcessOperationDo::getBlankid, apsBlankOrderDo.getId()));
|
|
|
+ for (ApsProcessOperationDo processOperationDo : processOperationList) {
|
|
|
+ //没有前道工序作业ID
|
|
|
+ if (ObjectUtil.isEmpty(processOperationDo.getPreviousprocessid())) {
|
|
|
+ if (processOperationDo.getIfblankprocess().equals("是")) {
|
|
|
+ return R.error("第" + j + "个坯料计划 工艺路线错误,首道工序作业是坯料工序,备料不能作为输入物料");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //============校验工序作业=============
|
|
|
+ Map<String, Object> params = new HashMap<>();
|
|
|
+ params.put("BLANKID", apsBlankOrderDo.getId());
|
|
|
+ if (req.getCheckDevice()) {
|
|
|
+ params.put("checkDeviceAndOrgCode", true);
|
|
|
+ }
|
|
|
+ R r = apsProcessOperationService.checkOperation(params);
|
|
|
+ if (!(r.getCode().equals("200"))) {
|
|
|
+ return R.error("第" + j + "个坯料计划 " + r.getMsg());
|
|
|
+ }
|
|
|
+ return R.ok();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public R removeBlankOrder(ApsBlankOrderDo req) {
|
|
|
+ if (ObjectUtil.isEmpty(req.getId())) {
|
|
|
+ return R.error("坯料Id不能为空");
|
|
|
+ }
|
|
|
+ ApsBlankOrderDo apsBlankOrderDo = this.getById(req.getId());
|
|
|
+ removeBlankOrderAndChild(apsBlankOrderDo);
|
|
|
+
|
|
|
+ //物理删除相关的工序作业备份
|
|
|
+ this.baseMapper.deleteProcessBackupByBlankId(req.getId());
|
|
|
+ //物理删除相关的作业明细备份
|
|
|
+ this.baseMapper.deleteProcessEquBackupByBlankId(req.getId());
|
|
|
+
|
|
|
+ //查询此订单的其他任一一个坯料计划的Id,重新更新订单的状态
|
|
|
+ CommonUpdateProductionStatusReq commonUpdateProductionStatusReq = new CommonUpdateProductionStatusReq();
|
|
|
+ ApsBlankOrderDo one = this.getOne(new QueryWrapper<ApsBlankOrderDo>().lambda().eq(ApsBlankOrderDo::getProductionorderid, apsBlankOrderDo.getProductionorderid()));
|
|
|
+ if (ObjectUtil.isNotEmpty(one)) {
|
|
|
+ commonUpdateProductionStatusReq.setBlankId(one.getId());
|
|
|
+ } else {
|
|
|
+ commonUpdateProductionStatusReq.setOrderId(apsBlankOrderDo.getProductionorderid());
|
|
|
+ }
|
|
|
+ apsProcessOperationProcessEquService.updateProductionStatus(commonUpdateProductionStatusReq);
|
|
|
+
|
|
|
+ return R.ok();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void removeBlankOrderAndChild(ApsBlankOrderDo req) {
|
|
|
+ //删除坯料计划
|
|
|
+ this.removeById(req.getId());
|
|
|
+
|
|
|
+ //如果是备料,删除计划后,备料的计划ID设置为空
|
|
|
+ if (req.getPreparematerial().equals("是")) {
|
|
|
+ ApsWorkInProgressInventoryDo needUpdate = new ApsWorkInProgressInventoryDo();
|
|
|
+ needUpdate.setPlanmaterialid("");
|
|
|
+ apsWorkInProgressInventoryService.update(needUpdate, new QueryWrapper<ApsWorkInProgressInventoryDo>().lambda().eq(ApsWorkInProgressInventoryDo::getPlanmaterialid, req.getId()));
|
|
|
+ }
|
|
|
+
|
|
|
+ //逻辑删除坯料计划输出成品
|
|
|
+ apsProcessOutputProductService.remove(new QueryWrapper<ApsProcessOutputProductDo>().lambda().eq(ApsProcessOutputProductDo::getBlankid, req.getId()));
|
|
|
+
|
|
|
+ //逻辑删除坯料计划工序作业
|
|
|
+ apsProcessOperationService.remove(new QueryWrapper<ApsProcessOperationDo>().lambda().eq(ApsProcessOperationDo::getBlankid, req.getId()));
|
|
|
+
|
|
|
+ //逻辑删除坯料计划工序作业-输出物料
|
|
|
+ apsProcessOperationOutMaterService.remove(new QueryWrapper<ApsProcessOperationOutMaterDo>().lambda().eq(ApsProcessOperationOutMaterDo::getBlankid, req.getId()));
|
|
|
+
|
|
|
+ //逻辑删除坯料计划工序作业-可选设备
|
|
|
+ apsProcessOperationEquService.remove(new QueryWrapper<ApsProcessOperationEquDo>().lambda().eq(ApsProcessOperationEquDo::getBlankid, req.getId()));
|
|
|
+
|
|
|
+ //逻辑删除坯料计划工序作业-作业明细
|
|
|
+ apsProcessOperationProcessEquService.remove(new QueryWrapper<ApsProcessOperationProcessEquDo>().lambda().eq(ApsProcessOperationProcessEquDo::getBlankid, req.getId()));
|
|
|
+
|
|
|
+ //逻辑删除坯料计划的工艺路线
|
|
|
+ this.baseMapper.removeMindMappingByBlankId(req.getId());
|
|
|
+ }
|
|
|
}
|