Pārlūkot izejas kodu

aps-甘特图换线/拆分接口计算剩余待开工/待报工卷数以及待开工料卷批次号详情testin1812

zhoudazhuang 7 mēneši atpakaļ
vecāks
revīzija
af3b402af1

+ 522 - 380
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationProcessEquServiceImpl.java

@@ -31,6 +31,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
@@ -53,6 +54,13 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
         implements ApsProcessOperationProcessEquService {
     public static final String CHANGING_WIRES_ERROR_MSG = "订单%s-%s的作业%s已完工,不能换线";
     private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
+
+    //换线锁
+    private final ConcurrentHashMap<String, String> changeWiresLock = new ConcurrentHashMap<>();
+
+    //拆分锁
+    private final ConcurrentHashMap<String, String> splitLock = new ConcurrentHashMap<>();
+
     @Autowired
     private ApsProcessOperationProcessEquDao apsProcessOperationProcessEquDao;
     @Autowired
@@ -279,183 +287,247 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
         }
         // 工序作业明细ID
         List<String> detailIds = changingWiresVos.stream().map(ChangingWiresVo::getId).collect(Collectors.toList());
-        // 需要返回的相关ID
-        List<String> returnAboutIds = changingWiresVos.stream().map(ChangingWiresVo::getReturnAboutIds).flatMap(Collection::stream).collect(Collectors.toList());
-        if (detailIds.isEmpty()) {
-            log.error("需要换线的工序作业id为空");
-            return R.error("需要换线的工序作业id为空");
-        }
-        // 换线作业受影响的工序作业ID
-        List<String> affectedIdList = new ArrayList<>(detailIds);
-        affectedIdList.addAll(returnAboutIds);
-
-        // 获取工序作业明细
-        List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = this.baseMapper.selectBatchIds(detailIds);
-        if (apsProcessOperationProcessEquDos.isEmpty()) {
-            log.error("无法获取到工序作业明细");
-            return R.error("无法获取到工序作业明细");
-        }
-        if (apsProcessOperationProcessEquDos.size() != changingWiresVos.size()) {
-            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("存在已完工的工序作业无法换线");
-        }
-        //对于换线作业的数据进行排序
-        Optional<Date> minDate = apsProcessOperationProcessEquDos.stream()
-                .map(ApsProcessOperationProcessEquDo::getPlanstartdate).min(Comparator.naturalOrder());
-        // 获取开工时间间隔=所选作业明细最早计划开工时间-所选加工开始时间
-        long timeInterval = minDate.get().getTime() - changingWiresVos.get(0).getProcessingTime().getTime();
-        Set<String> blankIds = new HashSet<>();
-        // 是否需要清空备份
-        AtomicReference<Boolean> emptyBackup = new AtomicReference<>(false);
-        List<CheckConflictVo> checkConflictVos = new ArrayList<>();
-        List<ApsProcessOperationProcessEquDo> saveList = new ArrayList<>();
-        List<UpdateConflictVo> updateConflictVoList = new ArrayList<>();
-        UpdateConflictVo updateConflictVo;
-        for (ChangingWiresVo changingWiresVo : changingWiresVos) {
-            updateConflictVo = new UpdateConflictVo();
-            // 工序作业明细
-            ApsProcessOperationProcessEquDo processEqus = apsProcessOperationProcessEquDos.stream()
-                    .filter(info -> changingWiresVo.getId().equals(info.getId()))
-                    .findFirst().orElse(null);
-            if (processEqus == null) {
-                log.error("无法根据ID:{}找到对应的工序作业明细信息", changingWiresVo.getId());
-                throw new RuntimeException("无法获取到正确的工序作业明细信息");
+//        SysUserVo nowWorkUser = CXCommonUtils.getCurrentUser();
+//        for (String equId:detailIds){
+//            if (changeWiresLock.containsKey(equId)) {
+//                log.error("该作业明细已被:{}其他操作员换线", changeWiresLock.get(equId));
+//                return R.error("该作业明细已被其他操作员换线");
+//            }
+//            changeWiresLock.put(equId, nowWorkUser.getId());
+//        }
+//        try {
+            // 需要返回的相关ID
+            List<String> returnAboutIds = changingWiresVos.stream().map(ChangingWiresVo::getReturnAboutIds).flatMap(Collection::stream).collect(Collectors.toList());
+            if (detailIds.isEmpty()) {
+                log.error("需要换线的工序作业id为空");
+                return R.error("需要换线的工序作业id为空");
             }
-            // 加工中切设备不变  不更新作业
-            if (JOBSTATUS_TO_BE_STARTING.equals(processEqus.getWorkstatus()) &&
-                    processEqus.getProcessdeviceid().equals(changingWiresVo.getEquId())) {
-                log.debug("该工序作业明细:{}加工中且设备未发生变化无需换线", processEqus.getId());
-                continue;
+            // 换线作业受影响的工序作业ID
+            List<String> affectedIdList = new ArrayList<>(detailIds);
+            affectedIdList.addAll(returnAboutIds);
+
+            // 获取工序作业明细
+            List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = this.baseMapper.selectBatchIds(detailIds);
+            if (apsProcessOperationProcessEquDos.isEmpty()) {
+                log.error("无法获取到工序作业明细");
+                return R.error("无法获取到工序作业明细");
             }
-            // 加工卷数 = 已报工卷数+已取消卷数时 不更新作业
-            if (processEqus.getPlanprocessrall() == processEqus.getStartingroll() + processEqus.getCancelroll()) {
-                log.debug("该工序作业明细:{}已全部报工无需换线", processEqus.getId());
-                continue;
+            if (apsProcessOperationProcessEquDos.size() != changingWiresVos.size()) {
+                log.error("本次换线操作存在无法获取作业明细的数据");
+                return R.error("本次换线操作存在无法获取作业明细的数据!请联系系统管理员");
             }
-            blankIds.add(processEqus.getBlankid());
-            // 获取该工序作业最早的计划开始时间
-            Date planstartdate = processEqus.getPlanstartdate();
-            Date planenddate = processEqus.getPlanenddate();
-            ApsProcessOperationDo apsProcessOperationDo = apsProcessOperationService.getById(processEqus.getProcessid());
-            String processWay = apsProcessOperationDo.getProcessway();
-            // 单卷加工时长
-            BigDecimal onceprocessmin = apsProcessOperationDo.getOnceprocessmin();
-            updateConflictVo.setOldPlanEnddate(planstartdate);
-            updateConflictVo.setOldPlanStartdate(planenddate);
-            updateConflictVo.setCurrentProcessWay(processWay);
-            updateConflictVo.setOldEquId(processEqus.getProcessdeviceid());
-            // 待开工的直接修改
-            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(new Date(planstartdate.getTime() - timeInterval));
-                // 计划完工时间=计划完工时间-开工时间间隔
-                processEqus.setPlanenddate(new Date(processEqus.getPlanenddate().getTime() - timeInterval));
-
-                checkConflictVos.add(new CheckConflictVo(processEqus.getId(), processEqus.getProcessdeviceid(),
-                        processEqus.getPlanstartdate(), processEqus.getPlanenddate()));
-                saveList.add(processEqus);
-                updateConflictVo.setApsProcessOperationProcessEquDo(processEqus);
-                updateConflictVoList.add(updateConflictVo);
+            // 校验是否存在已完工的工序作业
+            boolean hasCompletedWork = apsProcessOperationProcessEquDos.stream()
+                    .anyMatch(info -> JOBSTATUS_TO_BE_END.equals(info.getWorkstatus()));
+            if (hasCompletedWork) {
+                log.error("存在已完工的工序作业无法换线");
+                return R.error("存在已完工的工序作业无法换线");
             }
-            //加工中的状态 将未加工的改变为重新生成
-            if (JOBSTATUS_TO_BE_STARTING.equals(processEqus.getWorkstatus())) {
-                emptyBackup.set(true);
-                // 获取加工时长
-                //  long processingTime = DateUtil.between(processEqus.getPlanenddate(), processEqus.getPlanstartdate(), DateUnit.SECOND, false);
-                // 需要拆分工序作业
-                if (processEqus.getPlanprocessrall() - processEqus.getStartingroll() - processEqus.getCancelroll() > 0) {
-                    ApsProcessOperationProcessEquDo newProcessEqu = new ApsProcessOperationProcessEquDo();
-                    BeanUtils.copyProperties(processEqus, newProcessEqu);
-                    newProcessEqu.setId(SecurityUtil.getUUID());
-                    newProcessEqu.setProcessworkshopid(changingWiresVo.getWorkshopId());
-                    newProcessEqu.setProcessworkshop(changingWiresVo.getWorkshopName());
-                    newProcessEqu.setProcessdeviceid(changingWiresVo.getEquId());
-                    newProcessEqu.setProcessdevice(changingWiresVo.getEquName());
-                    newProcessEqu.setActualstartdate(null);
-                    newProcessEqu.setActualfinishdate(null);
-                    newProcessEqu.setCancelroll(0);
-                    //计划加工卷数=计划加工卷数-已开工卷数
-                    newProcessEqu.setPlanprocessrall(newProcessEqu.getPlanprocessrall() - newProcessEqu.getStartingroll());
+            //对于换线作业的数据进行排序
+            Optional<Date> minDate = apsProcessOperationProcessEquDos.stream()
+                    .map(ApsProcessOperationProcessEquDo::getPlanstartdate).min(Comparator.naturalOrder());
+            // 获取开工时间间隔=所选作业明细最早计划开工时间-所选加工开始时间
+            long timeInterval = minDate.get().getTime() - changingWiresVos.get(0).getProcessingTime().getTime();
+            Set<String> blankIds = new HashSet<>();
+            // 是否需要清空备份
+            AtomicReference<Boolean> emptyBackup = new AtomicReference<>(false);
+            List<CheckConflictVo> checkConflictVos = new ArrayList<>();
+            List<ApsProcessOperationProcessEquDo> saveList = new ArrayList<>();
+            List<UpdateConflictVo> updateConflictVoList = new ArrayList<>();
+            UpdateConflictVo updateConflictVo;
+            for (ChangingWiresVo changingWiresVo : changingWiresVos) {
+                updateConflictVo = new UpdateConflictVo();
+                // 工序作业明细
+                ApsProcessOperationProcessEquDo processEqus = apsProcessOperationProcessEquDos.stream()
+                        .filter(info -> changingWiresVo.getId().equals(info.getId()))
+                        .findFirst().orElse(null);
+                if (processEqus == null) {
+                    log.error("无法根据ID:{}找到对应的工序作业明细信息", changingWiresVo.getId());
+                    throw new RuntimeException("无法获取到正确的工序作业明细信息");
+                }
+                // 加工中切设备不变  不更新作业
+                if (JOBSTATUS_TO_BE_STARTING.equals(processEqus.getWorkstatus()) &&
+                        processEqus.getProcessdeviceid().equals(changingWiresVo.getEquId())) {
+                    log.debug("该工序作业明细:{}加工中且设备未发生变化无需换线", processEqus.getId());
+                    continue;
+                }
+                // 加工卷数 = 已报工卷数+已取消卷数时 不更新作业
+                if (processEqus.getPlanprocessrall() == processEqus.getStartingroll() + processEqus.getCancelroll()) {
+                    log.debug("该工序作业明细:{}已全部报工无需换线", processEqus.getId());
+                    continue;
+                }
+                blankIds.add(processEqus.getBlankid());
+                // 获取该工序作业最早的计划开始时间
+                Date planstartdate = processEqus.getPlanstartdate();
+                Date planenddate = processEqus.getPlanenddate();
+                ApsProcessOperationDo apsProcessOperationDo = apsProcessOperationService.getById(processEqus.getProcessid());
+                String processWay = apsProcessOperationDo.getProcessway();
+                // 单卷加工时长
+                BigDecimal onceprocessmin = apsProcessOperationDo.getOnceprocessmin();
+                updateConflictVo.setOldPlanEnddate(planstartdate);
+                updateConflictVo.setOldPlanStartdate(planenddate);
+                updateConflictVo.setCurrentProcessWay(processWay);
+                updateConflictVo.setOldEquId(processEqus.getProcessdeviceid());
+                // 待开工的直接修改
+                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(new Date(planstartdate.getTime() - timeInterval));
+                    // 计划完工时间=计划完工时间-开工时间间隔
+                    processEqus.setPlanenddate(new Date(processEqus.getPlanenddate().getTime() - timeInterval));
+
+                    checkConflictVos.add(new CheckConflictVo(processEqus.getId(), processEqus.getProcessdeviceid(),
+                            processEqus.getPlanstartdate(), processEqus.getPlanenddate()));
+                    saveList.add(processEqus);
+                    updateConflictVo.setApsProcessOperationProcessEquDo(processEqus);
+                    updateConflictVoList.add(updateConflictVo);
+                }
+                //加工中的状态 将未加工的改变为重新生成
+                if (JOBSTATUS_TO_BE_STARTING.equals(processEqus.getWorkstatus())) {
+                    emptyBackup.set(true);
+                    // 获取加工时长
+                    //  long processingTime = DateUtil.between(processEqus.getPlanenddate(), processEqus.getPlanstartdate(), DateUnit.SECOND, false);
+                    // 需要拆分工序作业
+                    /**
+                     * 新增需求:计算剩余待开工/报工卷数
+                     * 剩余待开工卷数=计划加工卷数-已开工卷数-已取消卷数合计
+                     * 剩余待报工卷数=计划加工卷数-已报工卷数-已取消卷数合计
+                     * 如果剩余待开工卷数=0,则完工状态=已完工
+                     * 如果剩余待开工卷数>0,则完工状态=未完工
+                     * 临时计算待加工料卷批次号数量
+                     * 如果剩余待开工卷数<待加工料卷批次号数量,则表示有多余的批次号,去掉待加工料卷批次号最后多余的{待加工料卷批次号数量-剩余待开工卷数}个批次号,给拆分的新的作业明细
+                     */
+                    Integer newPlanProcessRall = processEqus.getPlanprocessrall()-(processEqus.getPlanprocessrall()-processEqus.getStartingroll()-processEqus.getCancelroll());
+                    Integer leaveWaitWorkRoll = newPlanProcessRall-processEqus.getStartingroll()-processEqus.getCancelroll();
+                    Integer leaveWaitJobRoll = newPlanProcessRall-processEqus.getReportroll()-processEqus.getCancelroll();
+                    processEqus.setLeavewaitworkroll(leaveWaitWorkRoll);
+                    processEqus.setLeavewaitjobroll(leaveWaitJobRoll);
+                    List<String> newBachMaterProcess = new ArrayList<>();
+                    if (ObjectUtil.isNotEmpty(processEqus.getBachmaterialprocess())){
+                        String[] bachMaterialProcessArr = processEqus.getBachmaterialprocess().split(",");
+                        if (leaveWaitWorkRoll < bachMaterialProcessArr.length) {
+                            List<String> newBach = new ArrayList<>();
+                            List<String> oldBach = new ArrayList<>();
+                            for (String mater : bachMaterialProcessArr) {
+                                if (oldBach.size() < leaveWaitWorkRoll) {
+                                    oldBach.add(mater);
+                                }else {
+                                    newBach.add(mater);
+                                }
+                            }
+                            newBachMaterProcess = newBach;
+                            processEqus.setBachmaterialprocess(String.join(",", oldBach));
+                        }
+                    }
+                    if (processEqus.getPlanprocessrall() - processEqus.getStartingroll() - processEqus.getCancelroll() > 0) {
+                        ApsProcessOperationProcessEquDo newProcessEqu = new ApsProcessOperationProcessEquDo();
+                        BeanUtils.copyProperties(processEqus, newProcessEqu);
+                        newProcessEqu.setId(SecurityUtil.getUUID());
+                        newProcessEqu.setProcessworkshopid(changingWiresVo.getWorkshopId());
+                        newProcessEqu.setProcessworkshop(changingWiresVo.getWorkshopName());
+                        newProcessEqu.setProcessdeviceid(changingWiresVo.getEquId());
+                        newProcessEqu.setProcessdevice(changingWiresVo.getEquName());
+                        newProcessEqu.setActualstartdate(null);
+                        newProcessEqu.setActualfinishdate(null);
+                        newProcessEqu.setCancelroll(0);
+                        //计划加工卷数=计划加工卷数-已开工卷数
+                        newProcessEqu.setPlanprocessrall(newProcessEqu.getPlanprocessrall() - newProcessEqu.getStartingroll());
+                        // 更新计划完工时间
+                        if (PROCESS_WAY_MERGE.equals(apsProcessOperationDo.getProcessway())) {
+                            // 如果工序作业的加工方式是合并加工,则计划完工时间=计划开工时间+工序作业单卷加工时长 - 开工时间间隔
+                            newProcessEqu.setPlanenddate(new Date(newProcessEqu.getPlanstartdate().getTime() + TimeUnit.MINUTES.toMillis(onceprocessmin.intValue()) - timeInterval));
+                        } else {
+                            // 如果工序作业的加工方式不是合并加工,则计划完工时间=计划开工时间+工序作业单卷加工时长*(计划加工卷数) - 开工时间间隔
+                            newProcessEqu.setPlanenddate(new Date(newProcessEqu.getPlanstartdate().getTime() + TimeUnit.MINUTES.toMillis((long) timeInterval * newProcessEqu.getPlanprocessrall()) - timeInterval));
+                        }
+                        newProcessEqu.setPlanstartdate(new Date(newProcessEqu.getPlanstartdate().getTime() - timeInterval));
+                        newProcessEqu.setStartingroll(0);
+                        newProcessEqu.setReportroll(0);
+                        newProcessEqu.setCheckoutroll(0);
+
+                        newProcessEqu.setUnfinishroll(newProcessEqu.getPlanprocessrall());
+                        newProcessEqu.setWorkstatus(JOBSTATUS_TO_BE_START);
+                        newProcessEqu.setClosestatus(UNFINISHED);
+                        /**
+                         * 新增需求:已借调卷数=0,已取消卷数=0,输入不合格卷数=0,输入已取消卷数=0,已取消卷数合计=0,剩余待开工卷数=计划加工卷数,剩余待报工卷数=计划加工卷数
+                         * 如果原作业有多余的待加工料卷批次号,则待加工料卷批次号=原作业明细的多余的待加工料卷批次号
+                         */
+                        newProcessEqu.setWaitreportid(null);
+                        newProcessEqu.setDoingbatchnumber(null);
+                        newProcessEqu.setReportbatchnumber(null);
+                        newProcessEqu.setSecondroll(0);
+                        newProcessEqu.setCancelrollno(0);
+                        newProcessEqu.setInputunqualifiednum(0);
+                        newProcessEqu.setInputunqualifiedroll(0);
+                        newProcessEqu.setCancelroll(0);
+                        newProcessEqu.setLeavewaitworkroll(newProcessEqu.getPlanprocessrall());
+                        newProcessEqu.setLeavewaitjobroll(newProcessEqu.getPlanprocessrall());
+                        if (ObjectUtil.isNotEmpty(newBachMaterProcess)){
+                            newProcessEqu.setBachmaterialprocess(String.join(",", newBachMaterProcess));
+                        }
+                        affectedIdList.add(newProcessEqu.getId());
+                        updateConflictVo.setApsProcessOperationProcessEquDo(newProcessEqu);
+                        checkConflictVos.add(new CheckConflictVo(processEqus.getId(), newProcessEqu.getProcessdeviceid(),
+                                newProcessEqu.getPlanstartdate(), newProcessEqu.getPlanenddate()));
+                        saveList.add(newProcessEqu);
+                        updateConflictVoList.add(updateConflictVo);
+                        // 获取上一个工序作业明细ID
+                        String previousprocessesids = newProcessEqu.getPreviousprocessesids();
+                        if (StringUtils.isNotBlank(previousprocessesids)) {
+                            ApsProcessOperationProcessEquDo previousProcessEqu = this.getById(previousprocessesids);
+                            if (previousProcessEqu == null) {
+                                throw new CustomException("无法找到上一个工序作业明细信息");
+                            }
+                            this.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
+                                    .eq(ApsProcessOperationProcessEquDo::getId, previousprocessesids)
+                                    .set(ApsProcessOperationProcessEquDo::getNextprocessesids,
+                                            strAppendListConvertStr(previousProcessEqu.getNextprocessesids(), Arrays.asList(previousprocessesids))));
+                        }
+                    }
+                    /************更新换线后工序作业的信息********************/
+
+                    //更新计划加工卷数
+                    processEqus.setPlanprocessrall(processEqus.getStartingroll() + processEqus.getCancelroll());
+
                     // 更新计划完工时间
                     if (PROCESS_WAY_MERGE.equals(apsProcessOperationDo.getProcessway())) {
-                        // 如果工序作业的加工方式是合并加工,则计划完工时间=计划开工时间+工序作业单卷加工时长 - 开工时间间隔
-                        newProcessEqu.setPlanenddate(new Date(newProcessEqu.getPlanstartdate().getTime() + TimeUnit.MINUTES.toMillis(onceprocessmin.intValue()) - timeInterval));
+                        // 如果工序作业的加工方式是合并加工,则计划完工时间=计划开工时间+工序作业单卷加工时长
+                        processEqus.setPlanenddate(new Date(processEqus.getPlanstartdate().getTime() + TimeUnit.MINUTES.toMillis(onceprocessmin.intValue())));
                     } else {
-                        // 如果工序作业的加工方式不是合并加工,则计划完工时间=计划开工时间+工序作业单卷加工时长*(计划加工卷数) - 开工时间间隔
-                        newProcessEqu.setPlanenddate(new Date(newProcessEqu.getPlanstartdate().getTime() + TimeUnit.MINUTES.toMillis((long) timeInterval * newProcessEqu.getPlanprocessrall()) - timeInterval));
+                        // 如果工序作业的加工方式不是合并加工,则计划完工时间=计划开工时间+工序作业单卷加工时长*计划加工卷数
+                        processEqus.setPlanenddate(new Date(processEqus.getPlanstartdate().getTime() + TimeUnit.MINUTES.toMillis((long) onceprocessmin.intValue() * processEqus.getPlanprocessrall())));
                     }
-                    newProcessEqu.setPlanstartdate(new Date(newProcessEqu.getPlanstartdate().getTime() - timeInterval));
-                    newProcessEqu.setStartingroll(0);
-                    newProcessEqu.setReportroll(0);
-                    newProcessEqu.setCheckoutroll(0);
-
-                    newProcessEqu.setUnfinishroll(newProcessEqu.getPlanprocessrall());
-                    newProcessEqu.setWorkstatus(JOBSTATUS_TO_BE_START);
-                    newProcessEqu.setClosestatus(UNFINISHED);
-                    affectedIdList.add(newProcessEqu.getId());
-                    updateConflictVo.setApsProcessOperationProcessEquDo(newProcessEqu);
-                    checkConflictVos.add(new CheckConflictVo(processEqus.getId(), newProcessEqu.getProcessdeviceid(),
-                            newProcessEqu.getPlanstartdate(), newProcessEqu.getPlanenddate()));
-                    saveList.add(newProcessEqu);
-                    updateConflictVoList.add(updateConflictVo);
-                    // 获取上一个工序作业明细ID
-                    String previousprocessesids = newProcessEqu.getPreviousprocessesids();
-                    if (StringUtils.isNotBlank(previousprocessesids)) {
-                        ApsProcessOperationProcessEquDo previousProcessEqu = this.getById(previousprocessesids);
-                        if (previousProcessEqu == null) {
-                            throw new CustomException("无法找到上一个工序作业明细信息");
+                    processEqus.setPlanstartdate(new Date(processEqus.getPlanstartdate().getTime() - timeInterval));
+                    // 更新未完工卷数
+                    processEqus.setUnfinishroll(processEqus.getPlanprocessrall() - processEqus.getReportroll());
+                    // 作业状态
+                    processEqus.setWorkstatus(processEqus.getUnfinishroll() - processEqus.getCancelroll() == 0 ? JOBSTATUS_TO_BE_END : JOBSTATUS_TO_BE_STARTING);
+                    /**
+                     * 更新完工状态
+                     * 如果作业明细的完工状态=未完工,并且作业明细的已开工卷数=0,则作业状态=待开工;
+                     * 如果作业明细的完工状态=未完工,并且作业明细的已开工卷数>0,则作业状态=加工中;
+                     * 如果作业明细的完工状态=已完工,则作业状态=已完工
+                     */
+                    if (JOBSTATUS_TO_BE_END.equals(processEqus.getWorkstatus())) {
+                        processEqus.setClosestatus(JOBSTATUS_TO_BE_END);
+                    } else {
+                        processEqus.setClosestatus(processEqus.getStartingroll() > 0 ? JOBSTATUS_TO_BE_STARTING : JOBSTATUS_TO_BE_START);
+                    }
+                    if (leaveWaitJobRoll>0){
+                        processEqus.setClosestatus("未完工");
+                    }else {
+                        if (leaveWaitJobRoll==0){
+                            processEqus.setClosestatus("已完工");
                         }
-                        this.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
-                                .eq(ApsProcessOperationProcessEquDo::getId, previousprocessesids)
-                                .set(ApsProcessOperationProcessEquDo::getNextprocessesids,
-                                        strAppendListConvertStr(previousProcessEqu.getNextprocessesids(), Arrays.asList(previousprocessesids))));
                     }
+                    saveList.add(processEqus);
                 }
-                /************更新换线后工序作业的信息********************/
-
-                //更新计划加工卷数
-                processEqus.setPlanprocessrall(processEqus.getStartingroll() + processEqus.getCancelroll());
-
-                // 更新计划完工时间
-                if (PROCESS_WAY_MERGE.equals(apsProcessOperationDo.getProcessway())) {
-                    // 如果工序作业的加工方式是合并加工,则计划完工时间=计划开工时间+工序作业单卷加工时长
-                    processEqus.setPlanenddate(new Date(processEqus.getPlanstartdate().getTime() + TimeUnit.MINUTES.toMillis(onceprocessmin.intValue())));
-                } else {
-                    // 如果工序作业的加工方式不是合并加工,则计划完工时间=计划开工时间+工序作业单卷加工时长*计划加工卷数
-                    processEqus.setPlanenddate(new Date(processEqus.getPlanstartdate().getTime() + TimeUnit.MINUTES.toMillis((long) onceprocessmin.intValue() * processEqus.getPlanprocessrall())));
-                }
-                processEqus.setPlanstartdate(new Date(processEqus.getPlanstartdate().getTime() - timeInterval));
-                // 更新未完工卷数
-                processEqus.setUnfinishroll(processEqus.getPlanprocessrall() - processEqus.getReportroll());
-                // 作业状态
-                processEqus.setWorkstatus(processEqus.getUnfinishroll() - processEqus.getCancelroll() == 0 ? JOBSTATUS_TO_BE_END : JOBSTATUS_TO_BE_STARTING);
-                /**
-                 * 更新完工状态
-                 * 如果作业明细的完工状态=未完工,并且作业明细的已开工卷数=0,则作业状态=待开工;
-                 * 如果作业明细的完工状态=未完工,并且作业明细的已开工卷数>0,则作业状态=加工中;
-                 * 如果作业明细的完工状态=已完工,则作业状态=已完工
-                 */
-                if (JOBSTATUS_TO_BE_END.equals(processEqus.getWorkstatus())) {
-                    processEqus.setClosestatus(JOBSTATUS_TO_BE_END);
-                } else {
-                    processEqus.setClosestatus(processEqus.getStartingroll() > 0 ? JOBSTATUS_TO_BE_STARTING : JOBSTATUS_TO_BE_START);
-                }
-                saveList.add(processEqus);
             }
-        }
-        // 换线拆单后 需要校验 是否存在冲突 如果存在冲突 提示
+            // 换线拆单后 需要校验 是否存在冲突 如果存在冲突 提示
 //        if (!checkConflictVos.isEmpty()) {
 //            List<String> promptInformation = this.baseMapper.checkConflict(checkConflictVos);
 //            if (!promptInformation.isEmpty()) {
@@ -464,34 +536,39 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
 //                //return R.error(promptInformation.get(0));
 //            }
 //        }
-        if (emptyBackup.get()) {
-            SysUserVo currentUser = CXCommonUtils.getCurrentUser();
-            // 删除工序作业备份
-            ApsUtils.clearBackup(currentUser);
-        }
-        if (!saveList.isEmpty()) {
-            this.saveOrUpdateBatch(saveList);
-        }
-        if (!updateConflictVoList.isEmpty()) {
-            updateConflictVoList.forEach(data -> {
-                ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo = data.getApsProcessOperationProcessEquDo();
-                affectedIdList.addAll(checkProcessingTimeConflict(apsProcessOperationProcessEquDo,
-                        data.getOldPlanStartdate(), data.getOldPlanEnddate(), data.getOldEquId(), data.getCurrentProcessWay(),returnAboutIds));
-                // 判断是否存在设备不可用
-                inspectionEquipmentIsAvailable(apsProcessOperationProcessEquDo,
-                        apsProcessOperationProcessEquDo.getProcessdeviceid(),
-                        apsProcessOperationProcessEquDo.getPlanstartdate(),
-                        apsProcessOperationProcessEquDo.getPlanenddate());
+            if (emptyBackup.get()) {
+                SysUserVo currentUser = CXCommonUtils.getCurrentUser();
+                // 删除工序作业备份
+                ApsUtils.clearBackup(currentUser);
+            }
+            if (!saveList.isEmpty()) {
+                this.saveOrUpdateBatch(saveList);
+            }
+            if (!updateConflictVoList.isEmpty()) {
+                updateConflictVoList.forEach(data -> {
+                    ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo = data.getApsProcessOperationProcessEquDo();
+                    affectedIdList.addAll(checkProcessingTimeConflict(apsProcessOperationProcessEquDo,
+                            data.getOldPlanStartdate(), data.getOldPlanEnddate(), data.getOldEquId(), data.getCurrentProcessWay(),returnAboutIds));
+                    // 判断是否存在设备不可用
+                    inspectionEquipmentIsAvailable(apsProcessOperationProcessEquDo,
+                            apsProcessOperationProcessEquDo.getProcessdeviceid(),
+                            apsProcessOperationProcessEquDo.getPlanstartdate(),
+                            apsProcessOperationProcessEquDo.getPlanenddate());
+                });
+            }
+            List<String> aboutIds= affectedIdList.stream().distinct().collect(Collectors.toList());
+            blankIds.forEach(data -> {
+                // 更新坯料交货期
+                aboutIds.addAll(apsBlankOrderService.updateBlankDeliveryDate(null, data));
             });
-        }
-        List<String> aboutIds= affectedIdList.stream().distinct().collect(Collectors.toList());
-        blankIds.forEach(data -> {
-            // 更新坯料交货期
-            aboutIds.addAll(apsBlankOrderService.updateBlankDeliveryDate(null, data));
-        });
 
-        // 重新获取甘特图数据并返回前段
-        return R.ok(ganttService.getListById(aboutIds));
+            // 重新获取甘特图数据并返回前段
+            return R.ok(ganttService.getListById(aboutIds));
+//        }finally {
+//            for (String equId:detailIds){
+//                changeWiresLock.remove(equId);
+//            }
+//        }
     }
 
     /**
@@ -774,210 +851,275 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
             log.error("无法找到对应工序作业明细");
             throw new CustomException("参数异常,工序作业明细ID为空");
         }
-        // 所有的工序作业明细
-        List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = (List<ApsProcessOperationProcessEquDo>) this.listByIds(ids);
-        // 前一个工序作业明细Id
-        List<String> previousIds = apsProcessOperationProcessEquDos.stream()
-                .map(ApsProcessOperationProcessEquDo::getPreviousprocessesids)
-                .distinct()
-                .filter(StringUtils::isNotBlank)
-                .collect(Collectors.toList());
-        if (previousIds.isEmpty()) {
-            log.error("无法找到当前工序作业明细的上一个工序作业明细信息");
-            throw new CustomException("无法找到前道工序作业明细信息");
-        }
-        List<ApsProcessOperationProcessEquDo> previousApsProcessOperationProcessEquDos = this.getBaseMapper().selectBatchIds(previousIds);
-        // 获取工序作业信息
-        List<String> processId = apsProcessOperationProcessEquDos.stream()
-                .map(ApsProcessOperationProcessEquDo::getProcessid)
-                .distinct()
-                .filter(StringUtils::isNotBlank)
-                .collect(Collectors.toList());
-        if (processId.isEmpty()) {
-            log.error("无法根据工序作业明细获取工序作业信息");
-            throw new CustomException("无法获取到工序作业信息");
-        }
-        List<ApsProcessOperationDo> apsProcessOperationDos = (List<ApsProcessOperationDo>) apsProcessOperationService.listByIds(processId);
-        // 合并加工
-        boolean mergeProcessing = apsProcessOperationDos.stream().anyMatch(data -> !PROCESS_WAY_MERGE.equals(data.getProcessway()));
-        if (mergeProcessing) {
-            log.error("存在非合并加工的工序作业无法拆分");
-            throw new CustomException("存在非合并加工的工序作业无法拆分");
-        }
-        List<String> affectedIdList = new ArrayList<>();
-        List<ApsProcessOperationProcessEquDo> newDataList = new ArrayList<>();
-        processOperationDetailSplitVos.forEach(data -> {
-            affectedIdList.addAll(data.getReturnAboutIds());
-            int splitQty = data.getSplitQty();
-            ApsProcessOperationProcessEquDo currentProcessEquDo = apsProcessOperationProcessEquDos.stream()
-                    .filter(equs -> equs.getId().equals(data.getId()))
-                    .findFirst()
-                    .orElse(null);
-            if (currentProcessEquDo == null) {
-                log.error("无法根据id:{}获取到工序作业明细", data.getId());
-                throw new CustomException("无法获取到工序作业明细!请联系系统管理员");
-            }
-            // 当前的工序作业信息
-            ApsProcessOperationDo currentProcessOperationDo = apsProcessOperationDos.stream()
-                    .filter(process -> process.getId().equals(currentProcessEquDo.getProcessid()))
-                    .findFirst()
-                    .orElse(null);
-            if (currentProcessOperationDo == null) {
-                log.error("无法获取工序作业明细:{}所对应的工序作业信息", currentProcessOperationDo.getId());
-                throw new CustomException("找不到对应工序作业信息!请联系系统管理员");
-            }
-            // 剩余待加工卷数
-            int unFinishRoll = currentProcessEquDo.getPlanprocessrall() - currentProcessEquDo.getStartingroll() - currentProcessEquDo.getCancelroll();
-            if (unFinishRoll <= 0) {
-                log.error("当前暂无可拆分的卷数信息");
-                throw new CustomException("该作业已全部开工,不能拆分");
-            }
-            if (splitQty > unFinishRoll) {
-                log.error("拆分数量:{}大于待加工卷数:{}", splitQty, unFinishRoll);
-                throw new CustomException("拆分数量大于待加工卷数,不能拆分");
+//        SysUserVo nowWorkUser = CXCommonUtils.getCurrentUser();
+//        for (String equId:ids){
+//            if (splitLock.containsKey(equId)) {
+//                log.error("该作业明细已被:{}其他操作员拆分", splitLock.get(equId));
+//                throw new CustomException("该作业明细已被其他操作员拆分");
+//            }
+//            splitLock.put(equId, nowWorkUser.getId());
+//        }
+//        try {
+            // 所有的工序作业明细
+            List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = (List<ApsProcessOperationProcessEquDo>) this.listByIds(ids);
+            // 前一个工序作业明细Id
+            List<String> previousIds = apsProcessOperationProcessEquDos.stream()
+                    .map(ApsProcessOperationProcessEquDo::getPreviousprocessesids)
+                    .distinct()
+                    .filter(StringUtils::isNotBlank)
+                    .collect(Collectors.toList());
+            if (previousIds.isEmpty()) {
+                log.error("无法找到当前工序作业明细的上一个工序作业明细信息");
+                throw new CustomException("无法找到前道工序作业明细信息");
             }
-            ApsProcessOperationProcessEquDo newDo = new ApsProcessOperationProcessEquDo();
-            BeanUtils.copyProperties(currentProcessEquDo, newDo);
-            if (StringUtils.isNotBlank(data.getEquName())) {
-                newDo.setProcessdevice(data.getEquName());
-            } else {
-                newDo.setProcessdevice(currentProcessEquDo.getProcessdevice());
+            List<ApsProcessOperationProcessEquDo> previousApsProcessOperationProcessEquDos = this.getBaseMapper().selectBatchIds(previousIds);
+            // 获取工序作业信息
+            List<String> processId = apsProcessOperationProcessEquDos.stream()
+                    .map(ApsProcessOperationProcessEquDo::getProcessid)
+                    .distinct()
+                    .filter(StringUtils::isNotBlank)
+                    .collect(Collectors.toList());
+            if (processId.isEmpty()) {
+                log.error("无法根据工序作业明细获取工序作业信息");
+                throw new CustomException("无法获取到工序作业信息");
             }
-
-            if (StringUtils.isNotBlank(data.getEquId())) {
-                newDo.setProcessdeviceid(data.getEquId());
-            } else {
-                newDo.setProcessdeviceid(currentProcessEquDo.getProcessdeviceid());
+            List<ApsProcessOperationDo> apsProcessOperationDos = (List<ApsProcessOperationDo>) apsProcessOperationService.listByIds(processId);
+            // 合并加工
+            boolean mergeProcessing = apsProcessOperationDos.stream().anyMatch(data -> !PROCESS_WAY_MERGE.equals(data.getProcessway()));
+            if (mergeProcessing) {
+                log.error("存在非合并加工的工序作业无法拆分");
+                throw new CustomException("存在非合并加工的工序作业无法拆分");
             }
-
-            if (StringUtils.isNotBlank(data.getWorkshopName())) {
-                newDo.setProcessworkshop(data.getWorkshopName());
-            } else {
-                newDo.setProcessworkshop(currentProcessEquDo.getProcessworkshop());
-            }
-
-            if (StringUtils.isNotBlank(data.getWorkshopId())) {
-                newDo.setProcessworkshopid(data.getWorkshopId());
-            } else {
-                newDo.setProcessworkshop(currentProcessEquDo.getProcessworkshop());
-            }
-            // 数量和待加工数量相同直接修改原数据
-            if (splitQty == unFinishRoll) {
-                newDo.setId(currentProcessEquDo.getId());
-                if (data.getPlanStartTime() != null) {
-                    newDo.setPlanstartdate(data.getPlanStartTime());
-                    // 自动计算计划完工时间=原完工时间+新计划开工时间-原计划开工时间
-                    newDo.setPlanenddate(new Date(newDo.getPlanenddate().getTime() +
-                            data.getPlanStartTime().getTime() - currentProcessEquDo.getPlanstartdate().getTime()));
+            List<String> affectedIdList = new ArrayList<>();
+            List<ApsProcessOperationProcessEquDo> newDataList = new ArrayList<>();
+            processOperationDetailSplitVos.forEach(data -> {
+                affectedIdList.addAll(data.getReturnAboutIds());
+                int splitQty = data.getSplitQty();
+                ApsProcessOperationProcessEquDo currentProcessEquDo = apsProcessOperationProcessEquDos.stream()
+                        .filter(equs -> equs.getId().equals(data.getId()))
+                        .findFirst()
+                        .orElse(null);
+                if (currentProcessEquDo == null) {
+                    log.error("无法根据id:{}获取到工序作业明细", data.getId());
+                    throw new CustomException("无法获取到工序作业明细!请联系系统管理员");
                 }
-                newDo.setCreatedate(new Date());
-                newDo.setModifydate(new Date());
-                newDataList.add(newDo);
-                this.updateById(newDo);
-                affectedIdList.add(newDo.getId());
-                // 增加受影响的工序作业信息
-                affectedIdList.addAll(checkProcessingTimeConflict(newDo, currentProcessEquDo.getPlanstartdate(),
-                        currentProcessEquDo.getPlanenddate(), currentProcessEquDo.getProcessdeviceid(),
-                        currentProcessOperationDo.getProcessway(),new ArrayList<>()));
-            } else {
-                /**************************拆分逻辑处理***********************************/
-                newDo.setId(SecurityUtil.getUUID());
-                newDo.setPlanprocessrall(splitQty);
-                newDo.setCancelroll(0);
-                if (data.getPlanStartTime() != null) {
-                    newDo.setPlanstartdate(data.getPlanStartTime());
-                } else {
-                    newDo.setPlanstartdate(currentProcessOperationDo.getPlanstartdate());
+                // 当前的工序作业信息
+                ApsProcessOperationDo currentProcessOperationDo = apsProcessOperationDos.stream()
+                        .filter(process -> process.getId().equals(currentProcessEquDo.getProcessid()))
+                        .findFirst()
+                        .orElse(null);
+                if (currentProcessOperationDo == null) {
+                    log.error("无法获取工序作业明细:{}所对应的工序作业信息", currentProcessOperationDo.getId());
+                    throw new CustomException("找不到对应工序作业信息!请联系系统管理员");
+                }
+                // 剩余待加工卷数
+                int unFinishRoll = currentProcessEquDo.getPlanprocessrall() - currentProcessEquDo.getStartingroll() - currentProcessEquDo.getCancelroll();
+                if (unFinishRoll <= 0) {
+                    log.error("当前暂无可拆分的卷数信息");
+                    throw new CustomException("该作业已全部开工,不能拆分");
                 }
-                if (PROCESS_WAY_MERGE.equals(currentProcessOperationDo.getProcessway())) {
-                    // 如果工序作业的加工方式是合并加工,则计划完工时间=计划开工时间+工序作业单卷作业时长
-                    newDo.setPlanenddate(new Date(newDo.getPlanstartdate().getTime() + TimeUnit.MINUTES.toMillis(currentProcessOperationDo.getOnceprocessmin().longValue())));
+                if (splitQty > unFinishRoll) {
+                    log.error("拆分数量:{}大于待加工卷数:{}", splitQty, unFinishRoll);
+                    throw new CustomException("拆分数量大于待加工卷数,不能拆分");
+                }
+                ApsProcessOperationProcessEquDo newDo = new ApsProcessOperationProcessEquDo();
+                BeanUtils.copyProperties(currentProcessEquDo, newDo);
+                if (StringUtils.isNotBlank(data.getEquName())) {
+                    newDo.setProcessdevice(data.getEquName());
                 } else {
-                    // 如果工序作业的加工方式不是合并加工,则计划完工时间=计划开工时间+工序作业单卷作业时长*(计划加工卷数-已取消卷数)
-                    newDo.setPlanenddate(new Date(newDo.getPlanstartdate().getTime() + TimeUnit.MINUTES.toMillis(currentProcessOperationDo.getOnceprocessmin().longValue() * splitQty)));
+                    newDo.setProcessdevice(currentProcessEquDo.getProcessdevice());
                 }
-                newDo.setStartingroll(0);
-                newDo.setReportroll(0);
-                newDo.setCheckoutroll(0);
-                newDo.setUnfinishroll(splitQty);
-                newDo.setWorkstatus(JOBSTATUS_TO_BE_START);
-                newDo.setClosestatus(UNFINISHED);
-                newDo.setActualstartdate(null);
-                newDo.setWaitreportid(null);
-                newDo.setBachmaterialprocess(null);
-                newDo.setCreatedate(new Date());
-                newDo.setModifydate(new Date());
-                affectedIdList.add(newDo.getId());
-                // 增加受影响的工序作业信息
-                affectedIdList.addAll(checkProcessingTimeConflict(newDo, newDo.getPlanstartdate(),
-                        newDo.getPlanenddate(), newDo.getProcessdeviceid(),
-                        currentProcessOperationDo.getProcessway(),new ArrayList<>()));
-                this.save(newDo);
-                newDataList.add(newDo);
-                /**************************原数据逻辑处理***********************************/
-                ApsProcessOperationProcessEquDo oldDo = new ApsProcessOperationProcessEquDo();
-                oldDo.setId(currentProcessEquDo.getId());
-                oldDo.setPlanprocessrall(unFinishRoll - splitQty);
-                if (data.getPlanStartTime() != null) {
-                    oldDo.setPlanstartdate(data.getPlanStartTime());
+
+                if (StringUtils.isNotBlank(data.getEquId())) {
+                    newDo.setProcessdeviceid(data.getEquId());
                 } else {
-                    oldDo.setPlanstartdate(currentProcessEquDo.getPlanstartdate());
+                    newDo.setProcessdeviceid(currentProcessEquDo.getProcessdeviceid());
                 }
-                if (PROCESS_WAY_MERGE.equals(currentProcessOperationDo.getProcessway())) {
-                    // 如果工序作业的加工方式是合并加工,则计划完工时间=计划开工时间+工序作业单卷作业时长
-                    oldDo.setPlanenddate(new Date(newDo.getPlanstartdate().getTime() +
-                            TimeUnit.MINUTES.toMillis(currentProcessOperationDo.getOnceprocessmin().longValue())));
+
+                if (StringUtils.isNotBlank(data.getWorkshopName())) {
+                    newDo.setProcessworkshop(data.getWorkshopName());
                 } else {
-                    // 如果工序作业的加工方式不是合并加工,计划开工时间+工序作业单卷作业时长*(计划加工卷数-已取消卷数)
-                    oldDo.setPlanenddate(new Date(newDo.getPlanstartdate().getTime() +
-                            TimeUnit.MINUTES.toMillis(currentProcessOperationDo.getOnceprocessmin().longValue() * oldDo.getPlanprocessrall())));
+                    newDo.setProcessworkshop(currentProcessEquDo.getProcessworkshop());
                 }
-                oldDo.setUnfinishroll(oldDo.getPlanprocessrall() - currentProcessEquDo.getReportroll());
-                // 完工状态更新
-                if (oldDo.getPlanprocessrall() - currentProcessEquDo.getReportroll() - currentProcessEquDo.getCancelroll() > 0) {
-                    oldDo.setClosestatus(UNFINISHED);
+
+                if (StringUtils.isNotBlank(data.getWorkshopId())) {
+                    newDo.setProcessworkshopid(data.getWorkshopId());
                 } else {
-                    oldDo.setClosestatus(SaveConstans.CloseStatus.COMPLETED);
+                    newDo.setProcessworkshop(currentProcessEquDo.getProcessworkshop());
                 }
-                if (SaveConstans.CloseStatus.COMPLETED.equals(oldDo.getClosestatus())) {
-                    // 作业状态更新
-                    oldDo.setWorkstatus(JOBSTATUS_TO_BE_END);
+                // 数量和待加工数量相同直接修改原数据
+                if (splitQty == unFinishRoll) {
+                    newDo.setId(currentProcessEquDo.getId());
+                    if (data.getPlanStartTime() != null) {
+                        newDo.setPlanstartdate(data.getPlanStartTime());
+                        // 自动计算计划完工时间=原完工时间+新计划开工时间-原计划开工时间
+                        newDo.setPlanenddate(new Date(newDo.getPlanenddate().getTime() +
+                                data.getPlanStartTime().getTime() - currentProcessEquDo.getPlanstartdate().getTime()));
+                    }
+                    newDo.setCreatedate(new Date());
+                    newDo.setModifydate(new Date());
+                    newDataList.add(newDo);
+                    this.updateById(newDo);
+                    affectedIdList.add(newDo.getId());
+                    // 增加受影响的工序作业信息
+                    affectedIdList.addAll(checkProcessingTimeConflict(newDo, currentProcessEquDo.getPlanstartdate(),
+                            currentProcessEquDo.getPlanenddate(), currentProcessEquDo.getProcessdeviceid(),
+                            currentProcessOperationDo.getProcessway(),new ArrayList<>()));
                 } else {
-                    oldDo.setWorkstatus(currentProcessEquDo.getReportroll() == 0 ? JOBSTATUS_TO_BE_START : JOBSTATUS_TO_BE_STARTING);
+                    /**************************原数据逻辑处理***********************************/
+                    ApsProcessOperationProcessEquDo oldDo = new ApsProcessOperationProcessEquDo();
+                    oldDo.setId(currentProcessEquDo.getId());
+                    oldDo.setPlanprocessrall(currentProcessEquDo.getPlanprocessrall() - splitQty);
+                    if (data.getPlanStartTime() != null) {
+                        oldDo.setPlanstartdate(data.getPlanStartTime());
+                    } else {
+                        oldDo.setPlanstartdate(currentProcessEquDo.getPlanstartdate());
+                    }
+                    if (PROCESS_WAY_MERGE.equals(currentProcessOperationDo.getProcessway())) {
+                        // 如果工序作业的加工方式是合并加工,则计划完工时间=计划开工时间+工序作业单卷作业时长
+                        oldDo.setPlanenddate(new Date(newDo.getPlanstartdate().getTime() +
+                                TimeUnit.MINUTES.toMillis(currentProcessOperationDo.getOnceprocessmin().longValue())));
+                    } else {
+                        // 如果工序作业的加工方式不是合并加工,计划开工时间+工序作业单卷作业时长*(计划加工卷数-已取消卷数)
+                        oldDo.setPlanenddate(new Date(newDo.getPlanstartdate().getTime() +
+                                TimeUnit.MINUTES.toMillis(currentProcessOperationDo.getOnceprocessmin().longValue() * oldDo.getPlanprocessrall())));
+                    }
+                    oldDo.setUnfinishroll(oldDo.getPlanprocessrall() - currentProcessEquDo.getReportroll());
+                    // 完工状态更新
+                    if (oldDo.getPlanprocessrall() - currentProcessEquDo.getReportroll() - currentProcessEquDo.getCancelroll() > 0) {
+                        oldDo.setClosestatus(UNFINISHED);
+                    } else {
+                        oldDo.setClosestatus(SaveConstans.CloseStatus.COMPLETED);
+                    }
+                    if (SaveConstans.CloseStatus.COMPLETED.equals(oldDo.getClosestatus())) {
+                        // 作业状态更新
+                        oldDo.setWorkstatus(JOBSTATUS_TO_BE_END);
+                    } else {
+                        oldDo.setWorkstatus(currentProcessEquDo.getReportroll() == 0 ? JOBSTATUS_TO_BE_START : JOBSTATUS_TO_BE_STARTING);
+                    }
+                    /**
+                     * 新增需求:计算剩余待开工/报工卷数
+                     * 剩余待开工卷数=计划加工卷数-已开工卷数-已取消卷数合计
+                     * 剩余待报工卷数=计划加工卷数-已报工卷数-已取消卷数合计
+                     * 如果剩余待开工卷数=0,则完工状态=已完工
+                     * 如果剩余待开工卷数>0,则完工状态=未完工
+                     * 临时计算待加工料卷批次号数量
+                     * 如果剩余待开工卷数<待加工料卷批次号数量,则表示有多余的批次号,去掉待加工料卷批次号最后多余的{待加工料卷批次号数量-剩余待开工卷数}个批次号,给拆分的新的作业明细
+                     */
+                    Integer leaveWaitWorkRoll = oldDo.getPlanprocessrall()-currentProcessEquDo.getStartingroll()-currentProcessEquDo.getCancelroll();
+                    Integer leaveWaitJobRoll = oldDo.getPlanprocessrall()-currentProcessEquDo.getReportroll()-currentProcessEquDo.getCancelroll();
+                    oldDo.setLeavewaitworkroll(leaveWaitWorkRoll);
+                    oldDo.setLeavewaitjobroll(leaveWaitJobRoll);
+                    if (leaveWaitJobRoll>0){
+                        oldDo.setClosestatus("未完工");
+                    }else {
+                        if (leaveWaitJobRoll==0){
+                            oldDo.setClosestatus("已完工");
+                        }
+                    }
+                    List<String> newBachMaterProcess = new ArrayList<>();
+                    if (ObjectUtil.isNotEmpty(currentProcessEquDo.getBachmaterialprocess())){
+                        String[] bachMaterialProcessArr = currentProcessEquDo.getBachmaterialprocess().split(",");
+                        if (leaveWaitWorkRoll < bachMaterialProcessArr.length) {
+                            List<String> newBach = new ArrayList<>();
+                            List<String> oldBach = new ArrayList<>();
+                            for (String mater : bachMaterialProcessArr) {
+                                if (oldBach.size() < leaveWaitWorkRoll) {
+                                    oldBach.add(mater);
+                                }else {
+                                    newBach.add(mater);
+                                }
+                            }
+                            newBachMaterProcess = newBach;
+                            oldDo.setBachmaterialprocess(String.join(",", oldBach));
+                        }
+                    }
+                    affectedIdList.add(oldDo.getId());
+                    oldDo.setModifydate(new Date());
+                    this.updateById(oldDo);
+//                    // 增加受影响的工序作业信息
+//                    affectedIdList.addAll(checkProcessingTimeConflict(oldDo,
+//                            currentProcessEquDo.getPlanstartdate(), currentProcessEquDo.getPlanenddate(),
+//                            oldDo.getProcessdeviceid(), currentProcessOperationDo.getProcessway(),new ArrayList<>()));
+                    /**************************拆分逻辑处理***********************************/
+                    newDo.setId(SecurityUtil.getUUID());
+                    newDo.setPlanprocessrall(splitQty);
+                    newDo.setCancelroll(0);
+                    if (data.getPlanStartTime() != null) {
+                        newDo.setPlanstartdate(data.getPlanStartTime());
+                    } else {
+                        newDo.setPlanstartdate(currentProcessOperationDo.getPlanstartdate());
+                    }
+                    if (PROCESS_WAY_MERGE.equals(currentProcessOperationDo.getProcessway())) {
+                        // 如果工序作业的加工方式是合并加工,则计划完工时间=计划开工时间+工序作业单卷作业时长
+                        newDo.setPlanenddate(new Date(newDo.getPlanstartdate().getTime() + TimeUnit.MINUTES.toMillis(currentProcessOperationDo.getOnceprocessmin().longValue())));
+                    } else {
+                        // 如果工序作业的加工方式不是合并加工,则计划完工时间=计划开工时间+工序作业单卷作业时长*(计划加工卷数-已取消卷数)
+                        newDo.setPlanenddate(new Date(newDo.getPlanstartdate().getTime() + TimeUnit.MINUTES.toMillis(currentProcessOperationDo.getOnceprocessmin().longValue() * splitQty)));
+                    }
+                    newDo.setStartingroll(0);
+                    newDo.setReportroll(0);
+                    newDo.setCheckoutroll(0);
+                    newDo.setUnfinishroll(splitQty);
+                    /**
+                     * 新增需求:已借调卷数=0,已取消卷数=0,输入不合格卷数=0,输入已取消卷数=0,已取消卷数合计=0,剩余待开工卷数=计划加工卷数,剩余待报工卷数=计划加工卷数
+                     * 如果原作业有多余的待加工料卷批次号,则待加工料卷批次号=原作业明细的多余的待加工料卷批次号
+                     */
+                    newDo.setSecondroll(0);
+                    newDo.setCancelrollno(0);
+                    newDo.setInputunqualifiednum(0);
+                    newDo.setInputunqualifiedroll(0);
+                    newDo.setCancelroll(0);
+                    newDo.setLeavewaitworkroll(splitQty);
+                    newDo.setLeavewaitjobroll(splitQty);
+                    if (ObjectUtil.isNotEmpty(newBachMaterProcess)){
+                        newDo.setBachmaterialprocess(String.join(",", newBachMaterProcess));
+                    }
+                    newDo.setWorkstatus(JOBSTATUS_TO_BE_START);
+                    newDo.setClosestatus(UNFINISHED);
+                    newDo.setActualstartdate(null);
+                    newDo.setWaitreportid(null);
+                    newDo.setReportbatchnumber(null);
+                    newDo.setCreatedate(new Date());
+                    newDo.setModifydate(new Date());
+                    affectedIdList.add(newDo.getId());
+                    // 增加受影响的工序作业信息
+                    affectedIdList.addAll(checkProcessingTimeConflict(newDo, newDo.getPlanstartdate(),
+                            newDo.getPlanenddate(), newDo.getProcessdeviceid(),
+                            currentProcessOperationDo.getProcessway(),new ArrayList<>()));
+                    this.save(newDo);
+                    newDataList.add(newDo);
                 }
-                affectedIdList.add(oldDo.getId());
-                oldDo.setModifydate(new Date());
-                this.updateById(oldDo);
-                // 增加受影响的工序作业信息
-                affectedIdList.addAll(checkProcessingTimeConflict(oldDo,
-                        currentProcessEquDo.getPlanstartdate(), currentProcessEquDo.getPlanenddate(),
-                        oldDo.getProcessdeviceid(), currentProcessOperationDo.getProcessway(),new ArrayList<>()));
-            }
-        });
-        this.saveOrUpdateBatch(newDataList);
-        newDataList.forEach(newDo -> {
-            // 判断是否存在设备不可用
-            inspectionEquipmentIsAvailable(newDo, newDo.getProcessdeviceid()
-                    , newDo.getPlanstartdate(), newDo.getPlanenddate());
-        });
-        List<String> aboutIds= affectedIdList.stream().distinct().collect(Collectors.toList());
-        apsProcessOperationDos.forEach(data -> {
-            // 更新坯料交货期
-            aboutIds.addAll(apsBlankOrderService.updateBlankDeliveryDate(null, data.getBlankid()));
-        });
-        // 将工序作业明细ID 加入到上一个工序作业信息的中
-        Map<String, List<ApsProcessOperationProcessEquDo>> collect = newDataList.stream().collect(Collectors.groupingBy(ApsProcessOperationProcessEquDo::getPreviousprocessesids));
-        collect.forEach((k, v) -> {
-            List<String> collect1 = v.stream().map(ApsProcessOperationProcessEquDo::getId).collect(Collectors.toList());
-            ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo = previousApsProcessOperationProcessEquDos.stream()
-                    .filter(info -> k.equals(info.getId()))
-                    .findFirst()
-                    .orElse(null);
-            this.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
-                    .eq(ApsProcessOperationProcessEquDo::getId, k)
-                    .set(ApsProcessOperationProcessEquDo::getNextprocessesids, strAppendListConvertStr(apsProcessOperationProcessEquDo.getNextprocessesids(), collect1)));
-        });
-        return R.ok(this.ganttService.getListById(aboutIds));
+            });
+            this.saveOrUpdateBatch(newDataList);
+            newDataList.forEach(newDo -> {
+                // 判断是否存在设备不可用
+                inspectionEquipmentIsAvailable(newDo, newDo.getProcessdeviceid()
+                        , newDo.getPlanstartdate(), newDo.getPlanenddate());
+            });
+            List<String> aboutIds= affectedIdList.stream().distinct().collect(Collectors.toList());
+            apsProcessOperationDos.forEach(data -> {
+                // 更新坯料交货期
+                aboutIds.addAll(apsBlankOrderService.updateBlankDeliveryDate(null, data.getBlankid()));
+            });
+            // 将工序作业明细ID 加入到上一个工序作业信息的中
+            Map<String, List<ApsProcessOperationProcessEquDo>> collect = newDataList.stream().collect(Collectors.groupingBy(ApsProcessOperationProcessEquDo::getPreviousprocessesids));
+            collect.forEach((k, v) -> {
+                List<String> collect1 = v.stream().map(ApsProcessOperationProcessEquDo::getId).collect(Collectors.toList());
+                ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo = previousApsProcessOperationProcessEquDos.stream()
+                        .filter(info -> k.equals(info.getId()))
+                        .findFirst()
+                        .orElse(null);
+                this.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
+                        .eq(ApsProcessOperationProcessEquDo::getId, k)
+                        .set(ApsProcessOperationProcessEquDo::getNextprocessesids, strAppendListConvertStr(apsProcessOperationProcessEquDo.getNextprocessesids(), collect1)));
+            });
+            return R.ok(this.ganttService.getListById(aboutIds));
+//        }finally {
+//            for (String equId:ids){
+//                splitLock.remove(equId);
+//            }
+//        }
     }
 
     public void updateBlank(String processOperationId) {