|
@@ -1,28 +1,42 @@
|
|
|
package com.rongwei.bscommon.sys.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.date.DateUnit;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.google.common.collect.Lists;
|
|
|
+import com.rongwei.bscommon.sys.dao.ApsProcessOperationBackupDao;
|
|
|
+import com.rongwei.bscommon.sys.dao.ApsProcessOperationProcessEquBackupDao;
|
|
|
import com.rongwei.bscommon.sys.dao.ApsProcessOperationProcessEquDao;
|
|
|
import com.rongwei.bscommon.sys.service.*;
|
|
|
import com.rongwei.bsentity.domain.*;
|
|
|
-import com.rongwei.bsentity.vo.ChangingWiresVo;
|
|
|
-import com.rongwei.bsentity.vo.CommonUpdateProductionStatusReq;
|
|
|
-import com.rongwei.bsentity.vo.OptionalEquipmentVo;
|
|
|
-import com.rongwei.bsentity.vo.ProcessIdRelationVo;
|
|
|
+import com.rongwei.bsentity.vo.*;
|
|
|
+import com.rongwei.rwadmincommon.system.domain.SysOrganizationDo;
|
|
|
+import com.rongwei.rwadmincommon.system.vo.SysOrganizationVo;
|
|
|
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
|
|
|
import com.rongwei.rwcommon.base.R;
|
|
|
+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.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
import java.util.LinkedList;
|
|
|
import java.util.List;
|
|
|
+import java.util.concurrent.atomic.AtomicReference;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
+import static com.rongwei.safecommon.utils.SaveConstans.JobStatus.*;
|
|
|
+import static com.rongwei.safecommon.utils.SaveConstans.MINUS_ONE;
|
|
|
import static com.rongwei.safecommon.utils.SaveConstans.ProductionStatus.*;
|
|
|
|
|
|
/**
|
|
@@ -42,6 +56,10 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
|
|
|
private ApsProductionOrderService apsProductionOrderService;
|
|
|
@Autowired
|
|
|
private ApsProductDetailService apsProductDetailService;
|
|
|
+ @Autowired
|
|
|
+ private ApsProcessOperationBackupDao apsProcessOperationBackupDao;
|
|
|
+ @Autowired
|
|
|
+ private ApsProcessOperationProcessEquBackupDao apsProcessOperationProcessEquBackupDao;
|
|
|
|
|
|
/**
|
|
|
* 更新工序的待加工批次号信息
|
|
@@ -193,8 +211,140 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
+ @Transactional
|
|
|
public R changingWires(List<ChangingWiresVo> changingWiresVos) {
|
|
|
- return null;
|
|
|
+ if (changingWiresVos.isEmpty()) {
|
|
|
+ log.error("换线作业的工序作业不为空");
|
|
|
+ return R.error("工序作业不能为空");
|
|
|
+ }
|
|
|
+ // 工序作业明细ID
|
|
|
+ List<String> detailIds = changingWiresVos.stream().map(ChangingWiresVo::getId).collect(Collectors.toList());
|
|
|
+ if (detailIds.isEmpty()) {
|
|
|
+ log.error("需要换线的工序作业id为空");
|
|
|
+ return R.error("需要换线的工序作业id为空");
|
|
|
+ }
|
|
|
+ // 获取工序作业明细
|
|
|
+ List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = this.baseMapper.selectBatchIds(detailIds);
|
|
|
+ if (apsProcessOperationProcessEquDos.isEmpty()) {
|
|
|
+ log.error("无法获取到工序作业明细");
|
|
|
+ return R.error("无法获取到工序作业明细");
|
|
|
+ }
|
|
|
+ // 校验是否存在已完工的工序作业
|
|
|
+ boolean hasCompletedWork = apsProcessOperationProcessEquDos.stream()
|
|
|
+ .anyMatch(info -> JOBSTATUS_TO_BE_END.equals(info.getWorkstatus()));
|
|
|
+ if (hasCompletedWork) {
|
|
|
+ log.error("存在已完工的工序作业无法换线");
|
|
|
+ return R.error("存在已完工的工序作业无法换线");
|
|
|
+ }
|
|
|
+ // 是否需要清空备份
|
|
|
+ AtomicReference<Boolean> emptyBackup = new AtomicReference<>(false);
|
|
|
+ List<CheckConflictVo> checkConflictVos = new ArrayList<>();
|
|
|
+ List<ApsProcessOperationProcessEquDo> saveList = new ArrayList<>();
|
|
|
+ changingWiresVos.forEach(changingWiresVo -> {
|
|
|
+ // 工序作业明细
|
|
|
+ ApsProcessOperationProcessEquDo processEqus = apsProcessOperationProcessEquDos.stream()
|
|
|
+ .filter(info -> changingWiresVo.getId().equals(info.getId()))
|
|
|
+ .findFirst().orElse(null);
|
|
|
+
|
|
|
+ // 获取该工序作业最早的计划开始时间
|
|
|
+ Date planstartdate = processEqus.getPlanstartdate();
|
|
|
+ // 获取开工时间间隔=所选作业明细最早计划开工时间-所选加工开始时间
|
|
|
+ long timeInterval = DateUtil.between(changingWiresVo.getProcessingTime(), planstartdate, DateUnit.SECOND,false);
|
|
|
+
|
|
|
+ // 待开工的直接修改
|
|
|
+ if (JOBSTATUS_TO_BE_START.equals(processEqus.getWorkstatus())) {
|
|
|
+ // 待开工的工序作业明细 直接更换加工设备 和车间
|
|
|
+ processEqus.setProcessworkshopid(changingWiresVo.getWorkshopId());
|
|
|
+ processEqus.setProcessworkshop(changingWiresVo.getWorkshopName());
|
|
|
+ processEqus.setProcessdeviceid(changingWiresVo.getEquId());
|
|
|
+ processEqus.setProcessdevice(changingWiresVo.getEquName());
|
|
|
+ processEqus.setPlanstartdate(DateUtil.offsetSecond(processEqus.getPlanstartdate(), (int) timeInterval));
|
|
|
+ processEqus.setPlanenddate(DateUtil.offsetSecond(processEqus.getPlanenddate(), (int) timeInterval));
|
|
|
+ checkConflictVos.add(new CheckConflictVo(processEqus.getId(), processEqus.getProcessdeviceid(),
|
|
|
+ processEqus.getPlanstartdate(), processEqus.getPlanenddate()));
|
|
|
+ saveList.add(processEqus);
|
|
|
+ }
|
|
|
+ //加工中的状态 将未加工的改变为重新生成
|
|
|
+ if (JOBSTATUS_TO_BE_STARTING.equals(processEqus.getWorkstatus())) {
|
|
|
+ emptyBackup.set(true);
|
|
|
+ ApsProcessOperationProcessEquDo saveProcessEqu = new ApsProcessOperationProcessEquDo();
|
|
|
+ BeanUtils.copyProperties(processEqus, saveProcessEqu);
|
|
|
+
|
|
|
+ // 获取加工时长
|
|
|
+ long processingTime = DateUtil.between(processEqus.getPlanenddate(), processEqus.getPlanstartdate(), DateUnit.SECOND,false);
|
|
|
+ /************更新换线后工序作业的信息********************/
|
|
|
+ saveProcessEqu.setId(SecurityUtil.getUUID());
|
|
|
+ saveProcessEqu.setProcessworkshopid(changingWiresVo.getWorkshopId());
|
|
|
+ saveProcessEqu.setProcessworkshop(changingWiresVo.getWorkshopName());
|
|
|
+ saveProcessEqu.setProcessdeviceid(changingWiresVo.getEquId());
|
|
|
+ saveProcessEqu.setProcessdevice(changingWiresVo.getEquName());
|
|
|
+ // 更新计划完工时间
|
|
|
+ saveProcessEqu.setPlanenddate(CalculateCompletionTime(saveProcessEqu.getPlanstartdate(), processingTime,
|
|
|
+ saveProcessEqu.getPlanprocessrall() - saveProcessEqu.getStartingroll(),
|
|
|
+ saveProcessEqu.getPlanprocessrall()));
|
|
|
+ //计划加工卷数=计划加工卷数-已开工卷数
|
|
|
+ saveProcessEqu.setPlanprocessrall(saveProcessEqu.getPlanprocessrall() - saveProcessEqu.getStartingroll());
|
|
|
+ saveProcessEqu.setStartingroll(0);
|
|
|
+ saveProcessEqu.setReportroll(0);
|
|
|
+ saveProcessEqu.setCheckoutroll(0);
|
|
|
+ saveProcessEqu.setUnfinishroll(saveProcessEqu.getPlanprocessrall());
|
|
|
+ saveProcessEqu.setWorkstatus(JOBSTATUS_TO_BE_START);
|
|
|
+ saveProcessEqu.setClosestatus(SaveConstans.CloseStatus.UNFINISHED);
|
|
|
+ checkConflictVos.add(new CheckConflictVo(processEqus.getId(),saveProcessEqu.getProcessdeviceid(),
|
|
|
+ saveProcessEqu.getPlanstartdate(), saveProcessEqu.getPlanenddate()));
|
|
|
+ saveList.add(saveProcessEqu);
|
|
|
+ /************更新原数据的数量信息***********************/
|
|
|
+ // 更新计划完工时间
|
|
|
+ processEqus.setPlanenddate(CalculateCompletionTime(processEqus.getPlanstartdate(), processingTime,
|
|
|
+ processEqus.getStartingroll(), processEqus.getPlanprocessrall()));
|
|
|
+ //更新计划加工卷数
|
|
|
+ processEqus.setPlanprocessrall(processEqus.getStartingroll());
|
|
|
+ // 更新未完工卷数
|
|
|
+ processEqus.setUnfinishroll(processEqus.getPlanprocessrall() - processEqus.getReportroll());
|
|
|
+ processEqus.setWorkstatus(processEqus.getUnfinishroll() == 0 ? JOBSTATUS_TO_BE_END : JOBSTATUS_TO_BE_STARTING);
|
|
|
+ processEqus.setClosestatus(processEqus.getUnfinishroll() > 0 ? SaveConstans.CloseStatus.UNFINISHED : SaveConstans.CloseStatus.COMPLETED);
|
|
|
+ saveList.add(processEqus);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // 换线拆单后 需要校验 是否存在冲突 如果存在冲突 提示
|
|
|
+ if (!checkConflictVos.isEmpty()) {
|
|
|
+ List<String> promptInformation = this.baseMapper.checkConflict(checkConflictVos);
|
|
|
+ if(!promptInformation.isEmpty()){
|
|
|
+ log.error("存在冲突的工序作业");
|
|
|
+ return R.error(promptInformation.get(0));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (emptyBackup.get()) {
|
|
|
+ SysUserVo currentUser = CXCommonUtils.getCurrentUser();
|
|
|
+ List<SysOrganizationVo> organizationDoList = currentUser.getOrganizationDoList();
|
|
|
+ String factoryId = organizationDoList.stream()
|
|
|
+ .filter(org -> MINUS_ONE.equals(org.getPid()))
|
|
|
+ .map(SysOrganizationDo::getId)
|
|
|
+ .distinct()
|
|
|
+ .collect(Collectors.joining(","));
|
|
|
+ if (StringUtils.isBlank(factoryId)) {
|
|
|
+ factoryId = organizationDoList.stream().map(info -> info.getFullpid().split(",")[1]).distinct().collect(Collectors.joining(","));
|
|
|
+ }
|
|
|
+ apsProcessOperationBackupDao.deletedByBlankId(null, factoryId);
|
|
|
+ apsProcessOperationProcessEquBackupDao.deletedByBlankId(null, factoryId);
|
|
|
+ }
|
|
|
+ this.saveOrUpdateBatch(saveList);
|
|
|
+ return R.ok();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算计划完工时间
|
|
|
+ * = 计划开工时间+加工时长*已开工卷数/计划加工卷数
|
|
|
+ *
|
|
|
+ * @param planStartTime
|
|
|
+ * @param processingTime
|
|
|
+ * @param startingroll
|
|
|
+ * @param planprocessrall
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Date CalculateCompletionTime(Date planStartTime, long processingTime, int startingroll, int planprocessrall) {
|
|
|
+ int i = new BigDecimal(processingTime).multiply(new BigDecimal(startingroll)).divide(new BigDecimal(planprocessrall)).intValue();
|
|
|
+ return DateUtil.offsetSecond(planStartTime, i);
|
|
|
}
|
|
|
|
|
|
/**
|