Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master' into mode-min-unit

fangpy před 1 rokem
rodič
revize
2e10acaa19

+ 2 - 1
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsProcessOperationProcessEquDao.java

@@ -42,7 +42,8 @@ public interface ApsProcessOperationProcessEquDao extends BaseMapper<ApsProcessO
                                     @Param("orderNos") List<String> orderNo,
                                     @Param("processids") String processids,
                                     @Param("productionLineIds")List<String> productionLineId,
-                                    @Param("equIds") List<String> equId);
+                                    @Param("equIds") List<String> equId,
+                                    @Param("ids")List<String> ids);
 
     void updateAboutStateByProcessId(@Param("updateIds") List<ProcessIdRelationVo> updateIds);
 

+ 3 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/GanttService.java

@@ -1,5 +1,6 @@
 package com.rongwei.bscommon.sys.service;
 
+import com.rongwei.bsentity.vo.ScheduleGanttVo;
 import com.rongwei.rwcommon.base.R;
 
 import java.util.Date;
@@ -15,4 +16,6 @@ public interface GanttService {
 
     R getListByCondition(Date startDate,Date endDate, String factoryId, List<String> workshopId, List<String> orderNo,
                          List<String> productionLineId,List<String> equId);
+
+    List<ScheduleGanttVo> getListById(List<String> ids);
 }

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

@@ -8,8 +8,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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.bscommon.sys.utils.ApsUtils;
@@ -33,8 +31,8 @@ import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
-import static com.rongwei.safecommon.utils.SaveConstans.ForcedConflictsDescription.EQ_TIME_CROSS;
 import static com.rongwei.safecommon.utils.SaveConstans.ForcedConflictsDescription.EQUIPMENT_RUN_TIME;
+import static com.rongwei.safecommon.utils.SaveConstans.ForcedConflictsDescription.EQ_TIME_CROSS;
 import static com.rongwei.safecommon.utils.SaveConstans.JobStatus.*;
 import static com.rongwei.safecommon.utils.SaveConstans.LockmarkType.LOCKMARK_N;
 import static com.rongwei.safecommon.utils.SaveConstans.LockmarkType.LOCKMARK_Y;
@@ -59,6 +57,8 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
     private ApsProductDetailService apsProductDetailService;
     @Autowired
     private ApsEquipmentCalendarServiceImpl apsEquipmentCalendarService;
+    @Autowired
+    private GanttService ganttService;
 
     /**
      * 更新工序的待加工批次号信息
@@ -67,7 +67,7 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
      * @param batchNumn
      */
     public void updateBachmaterialprocessByIds(List<String> ids, String batchNumn) {
-        if(StringUtils.isNotBlank(batchNumn)){
+        if (StringUtils.isNotBlank(batchNumn)) {
             apsProcessOperationProcessEquDao.updateBachmaterialprocessByIds(ids, batchNumn);
         }
     }
@@ -221,12 +221,15 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
             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为空");
         }
+        // 换线作业受影响的工序作业ID
+        List<String> affectedIdList = new ArrayList<>(detailIds);
         // 获取工序作业明细
         List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = this.baseMapper.selectBatchIds(detailIds);
         if (apsProcessOperationProcessEquDos.isEmpty()) {
@@ -253,7 +256,7 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
             // 获取该工序作业最早的计划开始时间
             Date planstartdate = processEqus.getPlanstartdate();
             // 获取开工时间间隔=所选作业明细最早计划开工时间-所选加工开始时间
-            long timeInterval = planstartdate.getTime()- changingWiresVo.getProcessingTime().getTime();
+            long timeInterval = planstartdate.getTime() - changingWiresVo.getProcessingTime().getTime();
 
             // 待开工的直接修改
             if (JOBSTATUS_TO_BE_START.equals(processEqus.getWorkstatus())) {
@@ -263,14 +266,14 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                 processEqus.setProcessdeviceid(changingWiresVo.getEquId());
                 processEqus.setProcessdevice(changingWiresVo.getEquName());
                 // 计计划开工时间=计划开工时间-开工时间间隔
-                processEqus.setPlanstartdate(new Date(planstartdate.getTime()-timeInterval));
+                processEqus.setPlanstartdate(new Date(planstartdate.getTime() - timeInterval));
                 // 计划完工时间=计划完工时间-开工时间间隔
-                processEqus.setPlanenddate(new Date(processEqus.getPlanenddate().getTime()-timeInterval));
+                processEqus.setPlanenddate(new Date(processEqus.getPlanenddate().getTime() - timeInterval));
                 checkConflictVos.add(new CheckConflictVo(processEqus.getId(), processEqus.getProcessdeviceid(),
                         processEqus.getPlanstartdate(), processEqus.getPlanenddate()));
                 // 判断是否存在设备不可用
-                inspectionEquipmentIsAvailable(processEqus,processEqus.getProcessdeviceid(),processEqus.getPlanstartdate()
-                        ,processEqus.getPlanenddate());
+                inspectionEquipmentIsAvailable(processEqus, processEqus.getProcessdeviceid(), processEqus.getPlanstartdate()
+                        , processEqus.getPlanenddate());
                 saveList.add(processEqus);
             }
             //加工中的状态 将未加工的改变为重新生成
@@ -280,9 +283,10 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                 BeanUtils.copyProperties(processEqus, saveProcessEqu);
 
                 // 获取加工时长
-                long processingTime = DateUtil.between(processEqus.getPlanenddate(), processEqus.getPlanstartdate(), DateUnit.SECOND,false);
+                long processingTime = DateUtil.between(processEqus.getPlanenddate(), processEqus.getPlanstartdate(), DateUnit.SECOND, false);
                 /************更新换线后工序作业的信息********************/
                 saveProcessEqu.setId(SecurityUtil.getUUID());
+                affectedIdList.add(saveProcessEqu.getId());
                 saveProcessEqu.setProcessworkshopid(changingWiresVo.getWorkshopId());
                 saveProcessEqu.setProcessworkshop(changingWiresVo.getWorkshopName());
                 saveProcessEqu.setProcessdeviceid(changingWiresVo.getEquId());
@@ -299,11 +303,11 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                 saveProcessEqu.setUnfinishroll(saveProcessEqu.getPlanprocessrall());
                 saveProcessEqu.setWorkstatus(JOBSTATUS_TO_BE_START);
                 saveProcessEqu.setClosestatus(SaveConstans.CloseStatus.UNFINISHED);
-                checkConflictVos.add(new CheckConflictVo(processEqus.getId(),saveProcessEqu.getProcessdeviceid(),
+                checkConflictVos.add(new CheckConflictVo(processEqus.getId(), saveProcessEqu.getProcessdeviceid(),
                         saveProcessEqu.getPlanstartdate(), saveProcessEqu.getPlanenddate()));
                 // 判断是否存在设备不可用
-                inspectionEquipmentIsAvailable(saveProcessEqu,saveProcessEqu.getProcessdeviceid(),saveProcessEqu.getPlanstartdate()
-                        ,saveProcessEqu.getPlanenddate());
+                inspectionEquipmentIsAvailable(saveProcessEqu, saveProcessEqu.getProcessdeviceid(), saveProcessEqu.getPlanstartdate()
+                        , saveProcessEqu.getPlanenddate());
                 saveList.add(saveProcessEqu);
                 /************更新原数据的数量信息***********************/
                 // 更新计划完工时间
@@ -316,15 +320,15 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                 processEqus.setWorkstatus(processEqus.getUnfinishroll() == 0 ? JOBSTATUS_TO_BE_END : JOBSTATUS_TO_BE_STARTING);
                 processEqus.setClosestatus(processEqus.getUnfinishroll() > 0 ? SaveConstans.CloseStatus.UNFINISHED : SaveConstans.CloseStatus.COMPLETED);
                 // 判断是否存在设备不可用
-                inspectionEquipmentIsAvailable(processEqus,processEqus.getProcessdeviceid(),processEqus.getPlanstartdate()
-                        ,processEqus.getPlanenddate());
+                inspectionEquipmentIsAvailable(processEqus, processEqus.getProcessdeviceid(), processEqus.getPlanstartdate()
+                        , processEqus.getPlanenddate());
                 saveList.add(processEqus);
             }
         });
         // 换线拆单后 需要校验 是否存在冲突 如果存在冲突 提示
         if (!checkConflictVos.isEmpty()) {
             List<String> promptInformation = this.baseMapper.checkConflict(checkConflictVos);
-            if(!promptInformation.isEmpty()){
+            if (!promptInformation.isEmpty()) {
                 log.error("存在冲突的工序作业");
                 return R.error(promptInformation.get(0));
             }
@@ -335,7 +339,9 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
             ApsUtils.clearBackup(currentUser);
         }
         this.saveOrUpdateBatch(saveList);
-        return R.ok();
+
+        // 重新获取甘特图数据并返回前段
+        return R.ok(ganttService.getListById(affectedIdList));
     }
 
     /**
@@ -385,8 +391,11 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
     @Override
     @Transactional(rollbackFor = Exception.class)
     public R changeStartTime(List<ChangeStartTimeVo> changeStartTimeVos) {
+        /// 设计到修改的工序作业ID
+        List<String> affectedIdList = new ArrayList<>();
         changeStartTimeVos.forEach(changeStartTimeVo -> {
             String id = changeStartTimeVo.getId();
+            affectedIdList.add(id);
             ApsProcessOperationProcessEquDo processEquDo = this.getById(id);
             ApsProcessOperationDo operationDo = apsProcessOperationService.getById(processEquDo.getProcessid());
             if (operationDo == null) {
@@ -400,13 +409,13 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
             // 获取更新之前的存在冲突的工序作业
             List<ApsProcessOperationProcessEquDo> beforeUpdatingConflictId = this.baseMapper.getConflictId(changeStartTimeVo.getEquId(), changeStartTimeVo.getId(),
                     processEquDo.getPlanstartdate(), processEquDo.getPlanenddate());
-
+            affectedIdList.addAll(beforeUpdatingConflictId.stream().map(ApsProcessOperationProcessEquDo::getId).collect(Collectors.toList()));
             // 找到更新时间之后存在冲突的工序作业
             List<ApsProcessOperationProcessEquDo> afterTheUpdateConflictId = this.baseMapper.getConflictId(changeStartTimeVo.getEquId(), changeStartTimeVo.getId(),
                     changeStartTimeVo.getPlanStartTime(), changeStartTimeVo.getPlanEndTime());
-
+            affectedIdList.addAll(afterTheUpdateConflictId.stream().map(ApsProcessOperationProcessEquDo::getId).collect(Collectors.toList()));
             if (!beforeUpdatingConflictId.isEmpty()) {
-                updateProcessEquBeforeAddConflictsDesc(beforeUpdatingConflictId,EQ_TIME_CROSS);
+                updateProcessEquBeforeAddConflictsDesc(beforeUpdatingConflictId, EQ_TIME_CROSS);
             }
 
             if (!afterTheUpdateConflictId.isEmpty()) {
@@ -414,8 +423,8 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                 // 更当前工序作业增加新的冲突
                 String newConflictsDesc = addNewConflictsDesc(processEquDo.getConflictdes(), EQ_TIME_CROSS);
                 processEquDo.setConflictdes(newConflictsDesc);
-                updateProcessEquAfterAddConflictsDesc(afterTheUpdateConflictId,EQ_TIME_CROSS);
-            }else{
+                updateProcessEquAfterAddConflictsDesc(afterTheUpdateConflictId, EQ_TIME_CROSS);
+            } else {
                 String newConflictsDesc = removeConflictsDesc(processEquDo.getConflictdes(), EQ_TIME_CROSS);
                 processEquDo.setConflictdes(newConflictsDesc);
                 processEquDo.setHasconflict(StringUtils.isBlank(processEquDo.getConflictdes()) &&
@@ -423,14 +432,15 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                         LOCKMARK_N : LOCKMARK_Y);
             }
             // 判断是否存在设备不可用
-            inspectionEquipmentIsAvailable(processEquDo,changeStartTimeVo.getEquId(),changeStartTimeVo.getPlanStartTime()
-                    ,changeStartTimeVo.getPlanEndTime());
+            inspectionEquipmentIsAvailable(processEquDo, changeStartTimeVo.getEquId(), changeStartTimeVo.getPlanStartTime()
+                    , changeStartTimeVo.getPlanEndTime());
 
             processEquDo.setPlanstartdate(changeStartTimeVo.getPlanStartTime());
             processEquDo.setPlanenddate(changeStartTimeVo.getPlanEndTime());
             this.updateById(processEquDo);
         });
-        return R.ok();
+        // 返回受影响的数据
+        return R.ok(this.ganttService.getListById(affectedIdList));
     }
 
 
@@ -443,7 +453,9 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
     @Override
     @Transactional(rollbackFor = Exception.class)
     public R updateDetails(JobDetailsVo jobDetailsVo) {
+        List<String> affectedIdList = new ArrayList<>();
         String id = jobDetailsVo.getId();
+        affectedIdList.add(id);
         if (StringUtils.isBlank(id)) {
             log.error("工序作业ID 必传");
             return R.error("参数异常");
@@ -467,7 +479,7 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
             log.error("根据ID:{} 获取工序作业失败", apsProcessOperationProcessEquDo.getProcessid());
         }
         if (!TO_BE_PUBLISHED.equals(apsProcessOperationDo.getProcessstatus())) {
-            log.error("工序作业状态:{}异常",apsProcessOperationDo.getProcessstatus());
+            log.error("工序作业状态:{}异常", apsProcessOperationDo.getProcessstatus());
             return R.error("只有待发布的工序作业才可以修改");
         }
         // 更新开工时间 jobDetailsVo
@@ -489,17 +501,18 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
             long timeInterval = DateUtil.between(planStartTime, oldPlanstartdate, DateUnit.SECOND, false);
             apsProcessOperationProcessEquDo.setPlanstartdate(planStartTime);
             // 自动计算计划完工时间=原完工时间+新计划开工时间-原计划开工时间
-            apsProcessOperationProcessEquDo.setPlanenddate(new Date(apsProcessOperationProcessEquDo.getPlanenddate().getTime()+jobDetailsVo.getPlanStartTime().getTime()-oldPlanstartdate.getTime()));
+            apsProcessOperationProcessEquDo.setPlanenddate(new Date(apsProcessOperationProcessEquDo.getPlanenddate().getTime() + jobDetailsVo.getPlanStartTime().getTime() - oldPlanstartdate.getTime()));
             // 获取更新之前的存在冲突的工序作业
             List<ApsProcessOperationProcessEquDo> beforeUpdatingConflictId = this.baseMapper.getConflictId(
                     oldEquId, id, oldPlanstartdate, oldPlanenddate);
+            affectedIdList.addAll(beforeUpdatingConflictId.stream().map(ApsProcessOperationProcessEquDo::getId).collect(Collectors.toList()));
             // 找到更新时间之后存在冲突的工序作业
             List<ApsProcessOperationProcessEquDo> afterTheUpdateConflictId = this.baseMapper.getConflictId(
                     apsProcessOperationProcessEquDo.getProcessdeviceid(), id,
                     apsProcessOperationProcessEquDo.getPlanstartdate(), apsProcessOperationProcessEquDo.getPlanenddate());
-
+            affectedIdList.addAll(afterTheUpdateConflictId.stream().map(ApsProcessOperationProcessEquDo::getId).collect(Collectors.toList()));
             if (!beforeUpdatingConflictId.isEmpty()) {
-                updateProcessEquBeforeAddConflictsDesc(beforeUpdatingConflictId,EQ_TIME_CROSS);
+                updateProcessEquBeforeAddConflictsDesc(beforeUpdatingConflictId, EQ_TIME_CROSS);
             }
 
             if (!afterTheUpdateConflictId.isEmpty()) {
@@ -507,9 +520,9 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                 // 更当前工序作业增加新的冲突
                 String newConflictsDesc = addNewConflictsDesc(apsProcessOperationProcessEquDo.getConflictdes(), EQ_TIME_CROSS);
                 apsProcessOperationProcessEquDo.setConflictdes(newConflictsDesc);
-                updateProcessEquAfterAddConflictsDesc(afterTheUpdateConflictId,EQ_TIME_CROSS);
+                updateProcessEquAfterAddConflictsDesc(afterTheUpdateConflictId, EQ_TIME_CROSS);
                 this.updateBatchById(afterTheUpdateConflictId);
-            }else{
+            } else {
                 // 更当前工序作业增加新的冲突
                 String newConflictsDesc = removeConflictsDesc(apsProcessOperationProcessEquDo.getConflictdes(), EQ_TIME_CROSS);
                 apsProcessOperationProcessEquDo.setConflictdes(newConflictsDesc);
@@ -519,10 +532,10 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
             }
         }
         // 判断是否存在设备不可用
-        inspectionEquipmentIsAvailable(apsProcessOperationProcessEquDo,apsProcessOperationProcessEquDo.getProcessdeviceid()
-                ,apsProcessOperationProcessEquDo.getPlanstartdate(),apsProcessOperationProcessEquDo.getPlanenddate());
+        inspectionEquipmentIsAvailable(apsProcessOperationProcessEquDo, apsProcessOperationProcessEquDo.getProcessdeviceid()
+                , apsProcessOperationProcessEquDo.getPlanstartdate(), apsProcessOperationProcessEquDo.getPlanenddate());
         this.updateById(apsProcessOperationProcessEquDo);
-        return R.ok();
+        return R.ok(this.ganttService.getListById(affectedIdList));
     }
 
     public void updateBlank(String processOperationId) {
@@ -586,7 +599,7 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
         //根据最小生产状态和最大生产状态,判断当前最新的生产状态,等待更新
         String maxProductionStatus = item.getMaxProductionStatus();
         String minProductionStatus = item.getMinProductionStatus();
-        if(ObjectUtil.isEmpty(maxProductionStatus) || ObjectUtil.isEmpty(minProductionStatus)){
+        if (ObjectUtil.isEmpty(maxProductionStatus) || ObjectUtil.isEmpty(minProductionStatus)) {
             return;
         }
         /*
@@ -683,18 +696,19 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
 
     /**
      * 更新设备或者时间之后 更新冲突描述
+     *
      * @param beforeUpdatingConflictId 当前作业更新设备或者时间之后与该作业存在冲突的工序作业信息
-     * @param removeConflictsDesc 需要被删除的冲突描述
+     * @param removeConflictsDesc      需要被删除的冲突描述
      */
     public void updateProcessEquBeforeAddConflictsDesc(List<ApsProcessOperationProcessEquDo> beforeUpdatingConflictId,
-                                                      String removeConflictsDesc) {
+                                                       String removeConflictsDesc) {
         if (beforeUpdatingConflictId.isEmpty()) {
             return;
         }
-        beforeUpdatingConflictId.forEach(info->{
+        beforeUpdatingConflictId.forEach(info -> {
             // 判断是否和其他工序作业明细存在从头
             List<ApsProcessOperationProcessEquDo> conflictId = this.baseMapper.getConflictId(info.getProcessdeviceid(), info.getId(), info.getPlanstartdate(), info.getPlanenddate());
-            if(!conflictId.isEmpty()){
+            if (!conflictId.isEmpty()) {
                 info.setConflictdes(removeConflictsDesc(info.getConflictdes(), removeConflictsDesc));
                 info.setHasconflict(StringUtils.isBlank(info.getConflictdes()) &&
                         StringUtils.isBlank(info.getSoftconflictdes()) ?
@@ -708,8 +722,9 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
 
     /**
      * 更新设备或者时间之后 更新冲突描述
+     *
      * @param afterTheUpdateConflictId 当前作业更新设备或者时间之后与该作业存在冲突的工序作业信息
-     * @param conflictsDesc 冲突描述
+     * @param conflictsDesc            冲突描述
      */
     public void updateProcessEquAfterAddConflictsDesc(List<ApsProcessOperationProcessEquDo> afterTheUpdateConflictId,
                                                       String conflictsDesc) {
@@ -726,30 +741,32 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
     }
 
     /**
-     *  增加 新的冲突
+     * 增加 新的冲突
+     *
      * @param oldConflictDesc 工序作业的旧冲突
      * @param newConflictDesc 需要新增的冲突
      * @return
      */
-    public String addNewConflictsDesc(String oldConflictDesc, String newConflictDesc){
-        if(StringUtils.isBlank(oldConflictDesc)){
+    public String addNewConflictsDesc(String oldConflictDesc, String newConflictDesc) {
+        if (StringUtils.isBlank(oldConflictDesc)) {
             return newConflictDesc;
         }
         List<String> conflictdeList = new ArrayList<>(Arrays.asList(oldConflictDesc.split(";")));
         if (!conflictdeList.contains(newConflictDesc)) {
             conflictdeList.add(newConflictDesc);
         }
-       return CollUtil.join(conflictdeList, ";");
+        return CollUtil.join(conflictdeList, ";");
     }
 
     /**
      * 删除旧冲突
-     * @param oldConflictDesc 工序作业的旧冲突
+     *
+     * @param oldConflictDesc    工序作业的旧冲突
      * @param removeConflictDesc 需要删除的冲突
      * @return
      */
-    public String removeConflictsDesc(String oldConflictDesc, String removeConflictDesc){
-        if(StringUtils.isBlank(oldConflictDesc)){
+    public String removeConflictsDesc(String oldConflictDesc, String removeConflictDesc) {
+        if (StringUtils.isBlank(oldConflictDesc)) {
             return oldConflictDesc;
         }
         List<String> conflictdeList = new ArrayList<>(Arrays.asList(oldConflictDesc.split(";")));
@@ -764,22 +781,22 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
      * @param startDate
      * @param endDate
      */
-    public void inspectionEquipmentIsAvailable(ApsProcessOperationProcessEquDo processEquDo,String equId, Date startDate, Date endDate) {
+    public void inspectionEquipmentIsAvailable(ApsProcessOperationProcessEquDo processEquDo, String equId, Date startDate, Date endDate) {
         // 查询当前设备当前时间段是否存在不可用设备
         List<ApsEquipmentCalendarDo> list = apsEquipmentCalendarService.list(new LambdaQueryWrapper<ApsEquipmentCalendarDo>()
                 .eq(ApsEquipmentCalendarDo::getProcessdeviceid, equId)
-                .and(wapper-> wapper.apply("{0}   BETWEEN sdstarttime AND sdendtime",startDate)
-                                .or()
-                        .apply("{0}   BETWEEN sdstarttime AND sdendtime",endDate))
-               );
+                .and(wapper -> wapper.apply("{0}   BETWEEN sdstarttime AND sdendtime", startDate)
+                        .or()
+                        .apply("{0}   BETWEEN sdstarttime AND sdendtime", endDate))
+        );
         String newConflictdes;
-        if(list.isEmpty()){
-            newConflictdes=removeConflictsDesc(processEquDo.getConflictdes(), EQUIPMENT_RUN_TIME);
-        }else{
-            newConflictdes= addNewConflictsDesc(processEquDo.getConflictdes(), EQUIPMENT_RUN_TIME);
+        if (list.isEmpty()) {
+            newConflictdes = removeConflictsDesc(processEquDo.getConflictdes(), EQUIPMENT_RUN_TIME);
+        } else {
+            newConflictdes = addNewConflictsDesc(processEquDo.getConflictdes(), EQUIPMENT_RUN_TIME);
         }
         processEquDo.setConflictdes(newConflictdes);
-        processEquDo.setHasconflict(StringUtils.isBlank(newConflictdes) && StringUtils.isBlank(processEquDo.getSoftconflictdes()) ?LOCKMARK_N:LOCKMARK_Y);
+        processEquDo.setHasconflict(StringUtils.isBlank(newConflictdes) && StringUtils.isBlank(processEquDo.getSoftconflictdes()) ? LOCKMARK_N : LOCKMARK_Y);
     }
 }
 

+ 8 - 8
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsReportOutputServiceImpl.java

@@ -86,8 +86,8 @@ public class ApsReportOutputServiceImpl extends ServiceImpl<ApsReportOutputDao,
                         apsReportOutputDo.setWidth(apsProcessOperationOutMaterDo.getProwidth());
                         apsReportOutputDo.setLength(apsProcessOperationOutMaterDo.getProlength());
                         apsReportOutputDo.setWeight(apsProcessOperationOutMaterDo.getSinglerollweight());
-                        apsReportOutputDo.setInsepctionlevel(B);
-                        apsReportOutputDo.setQualified("是");;
+//                        apsReportOutputDo.setInsepctionlevel(B);
+//                        apsReportOutputDo.setQualified("是");
                         resList.add(apsReportOutputDo);
                     }
                 }
@@ -115,8 +115,8 @@ public class ApsReportOutputServiceImpl extends ServiceImpl<ApsReportOutputDao,
                         apsReportOutputDo.setWidth(apsProcessOperationOutMaterDo.getProwidth());
                         apsReportOutputDo.setLength(apsProcessOperationOutMaterDo.getProlength());
                         apsReportOutputDo.setWeight(apsProcessOperationOutMaterDo.getSinglerollweight());
-                        apsReportOutputDo.setInsepctionlevel(B);
-                        apsReportOutputDo.setQualified("是");
+//                        apsReportOutputDo.setInsepctionlevel(B);
+//                        apsReportOutputDo.setQualified("是");
                         resList.add(apsReportOutputDo);
                     }
                 }
@@ -137,8 +137,8 @@ public class ApsReportOutputServiceImpl extends ServiceImpl<ApsReportOutputDao,
                 apsReportOutputDo.setWidth(list.get(0).getProwidth());
                 apsReportOutputDo.setLength(list.get(0).getProlength());
                 apsReportOutputDo.setWeight(list.get(0).getSinglerollweight());
-                apsReportOutputDo.setInsepctionlevel(B);
-                apsReportOutputDo.setQualified("是");
+//                apsReportOutputDo.setInsepctionlevel(B);
+//                apsReportOutputDo.setQualified("是");
                 JSONObject json = new JSONObject();
                 json.put("batchNumber", req.getInputBatchNumber());
                 //生成二维码
@@ -185,8 +185,8 @@ public class ApsReportOutputServiceImpl extends ServiceImpl<ApsReportOutputDao,
                         apsReportOutputDo.setWidth(apsProcessOperationOutMaterDo.getProwidth());
                         apsReportOutputDo.setLength(apsProcessOperationOutMaterDo.getProlength());
                         apsReportOutputDo.setWeight(apsProcessOperationOutMaterDo.getSinglerollweight());
-                        apsReportOutputDo.setInsepctionlevel(B);
-                        apsReportOutputDo.setQualified("是");
+//                        apsReportOutputDo.setInsepctionlevel(B);
+//                        apsReportOutputDo.setQualified("是");
                         resList.add(apsReportOutputDo);
                     }
                 }

+ 54 - 2
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsReportRecordsServiceImpl.java

@@ -11,6 +11,7 @@ import com.rongwei.bsentity.domain.*;
 import com.rongwei.bsentity.vo.*;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.base.exception.CustomException;
 import com.rongwei.rwcommon.utils.SecurityUtil;
 import com.rongwei.rwcommon.utils.StringUtils;
 import com.rongwei.rwcommonentity.commonservers.vo.SysSerialVo;
@@ -67,6 +68,8 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
     private ApsCraftStepService apsCraftStepService;
     @Autowired
     private ApsCraftEquService apsCraftEquService;
+    @Autowired
+    private ReportCheckServiceImpl reportCheckService;
 
     @Override
     @Transactional
@@ -205,7 +208,7 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
         ApsCraftStepDo craftStepDo = apsCraftStepService.getOne(new QueryWrapper<ApsCraftStepDo>().lambda().eq(ApsCraftStepDo::getStepnum, stepnum));
         if (ObjectUtil.isNotEmpty(craftStepDo)) {
             //查询设备参数子表
-            ApsCraftEquDo apsCraftEquDo = apsCraftEquService.getOne(new QueryWrapper<ApsCraftEquDo>().lambda().eq(ApsCraftEquDo::getMainid, craftStepDo.getId()).eq(ApsCraftEquDo::getResourceid, apsProcessOperationProcessEquDo.getProcessdeviceid()));
+            ApsCraftEquDo apsCraftEquDo = apsCraftEquService.getOne(new QueryWrapper<ApsCraftEquDo>().lambda().eq(ApsCraftEquDo::getMainid, craftStepDo.getId()).eq(ApsCraftEquDo::getResourceid, apsProcessOperationProcessEquDo.getProcessdeviceid()).eq(ApsCraftEquDo::getTenantid, tenantId));
             if (ObjectUtil.isNotEmpty(apsCraftEquDo)) {
                 equparames = apsCraftEquDo.getEquparames();
             }
@@ -504,7 +507,7 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
         //报工状态
         apsReportRecordsDo.setReportworkstatus("已报工");
         //如过报工时间为空,填入当前时间
-        if(ObjectUtil.isEmpty(apsReportRecordsDo.getReportworktime())){
+        if (ObjectUtil.isEmpty(apsReportRecordsDo.getReportworktime())) {
             apsReportRecordsDo.setReportworktime(DateUtil.date());
         }
 
@@ -536,6 +539,18 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
             return R.error(r.getMsg());
         }
 
+        //查询新的输出物料
+        List<ApsReportOutputDo> newOutputDos = apsReportOutputService.list(new QueryWrapper<ApsReportOutputDo>().lambda().eq(ApsReportOutputDo::getMainid, apsReportRecordsDo.getId()));
+        //填补对应的检验等级和是否合格
+        if(apsReportOutputDoList.size() == newOutputDos.size()){
+            for (int i = 0; i < newOutputDos.size(); i++) {
+                newOutputDos.get(i).setInsepctionlevel(apsReportOutputDoList.get(i).getInsepctionlevel());
+                newOutputDos.get(i).setQualified(apsReportOutputDoList.get(i).getQualified());
+            }
+        }
+        //更新输出物料
+        apsReportOutputService.updateBatchById(newOutputDos);
+
         //=================新增在制品库存=================
         //查询报工记录对应的物料子表
         List<ApsReportOutputDo> apsReportOutputDos = apsReportOutputService.list(new QueryWrapper<ApsReportOutputDo>().lambda().eq(ApsReportOutputDo::getMainid, apsReportRecordsDo.getId()));
@@ -576,6 +591,43 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
             return R.error(r2.getMsg());
         }
 
+        //===========提交校验================
+        //如果输出物料中不存在 检验等级 为 待判 的,则直接提交校验
+        //获取当前的输出物料
+        List<ApsReportOutputDo> outputDos = apsReportOutputService.list(new QueryWrapper<ApsReportOutputDo>().lambda().eq(ApsReportOutputDo::getMainid, apsReportRecordsDo.getId()));
+        List<ApsReportOutputDo> collect = outputDos.stream().filter(item -> item.getInsepctionlevel().equals(SaveConstans.CheckLevel.WAITING_JUDGMENT)).collect(Collectors.toList());
+        if (collect.size() > 0) {
+            return R.ok();
+        }
+        //遍历输出物料 拼接输出物料描述,并更新
+        for (ApsReportOutputDo outputDo : outputDos) {
+            ApsReportOutputDo needUpdate = new ApsReportOutputDo();
+            needUpdate.setId(outputDo.getId());
+            String outputdesc = "";
+            outputdesc += outputDo.getOutputmaterial().split(" ")[0];
+            outputdesc += " 厚" + outputDo.getThickness() + "*宽" + outputDo.getWidth();
+            if (ObjectUtil.isNotEmpty(outputDo.getLength())) {
+                outputdesc += "*长" + outputDo.getLength();
+            }
+            outputdesc += " mm " + outputDo.getWeight() + "吨";
+            needUpdate.setOutputdesc(outputdesc);
+            apsReportOutputService.updateById(needUpdate);
+        }
+        //调用提交检验接口
+        R r1 = reportCheckService.updateRelevantInformation(apsReportRecordsDo.getId());
+        if (!r1.getCode().equals("200")) {
+            throw new CustomException(r1.getMsg());
+        }
+        //当前登录人
+        SysUserVo currentUser = CXCommonUtils.getCurrentUser();
+        //更新检查记录的检验人、检验时间
+        ApsReportRecordsDo needUpdate = new ApsReportRecordsDo();
+        needUpdate.setId(apsReportRecordsDo.getId());
+        needUpdate.setCheckid(currentUser.getId());
+        needUpdate.setCheckusername(currentUser.getName());
+        needUpdate.setCheckdate(DateUtil.date());
+        this.updateById(needUpdate);
+
         return R.ok();
     }
 

+ 178 - 159
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/GanttServiceImpl.java

@@ -1,10 +1,8 @@
 package com.rongwei.bscommon.sys.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.service.additional.query.impl.LambdaQueryChainWrapper;
 import com.rongwei.bscommon.sys.dao.ApsProcessOperationProcessEquDao;
 import com.rongwei.bscommon.sys.service.ApsProcessOperationService;
 import com.rongwei.bscommon.sys.service.GanttService;
@@ -34,10 +32,6 @@ import java.util.stream.Collectors;
  */
 @Service
 public class GanttServiceImpl implements GanttService {
-    private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
-
-    @Autowired
-    private ApsProcessOperationProcessEquDao apsProcessOperationProcessEquDao;
     public static final String GANTT_ITEM_NAME = "%s %d卷 %s %s %tF";
     public static final String GANTT_ITEM_NAME_PREFIX = "%s %s";
     public static final String GANTT_DESC_PREFIX = " 计划时间:%s-%s </br>" +
@@ -45,25 +39,26 @@ public class GanttServiceImpl implements GanttService {
             "加工设备:%s/%s </br>";
     public static final String GANTT_DESC =
             "输入物料:%s %d卷</br>" +
-            "工序:%s </br>" +
-            "作业状态:%s </br>"+
-            "完成情况:已开工 %d/已报工 %d/已检验 %d/未完工 %d </br>"+
-            "客户订单号:%s </br>"+
-            "客户名称:%s </br>"+
-            "交货期:%tF </br>" +
-            "订单产品:%s </br>";
-
-
+                    "工序:%s </br>" +
+                    "作业状态:%s </br>" +
+                    "完成情况:已开工 %d/已报工 %d/已检验 %d/未完工 %d </br>" +
+                    "客户订单号:%s </br>" +
+                    "客户名称:%s </br>" +
+                    "交货期:%tF </br>" +
+                    "订单产品:%s </br>";
     public static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
     public static final String DEFAULT_TYPE = "project";
     public static final String DEFAULT_RENDER = "split";
-
+    public static final String COMBINED_PROCESSING = "合并加工";
+    private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
+    @Autowired
+    private ApsProcessOperationProcessEquDao apsProcessOperationProcessEquDao;
     @Autowired
     private ApsProcessOperationService apsProcessOperationService;
 
     /**
      * 根据条件获取gantt
+     *
      * @param searchDate
      * @param factoryId
      * @param workShopIdList
@@ -73,20 +68,15 @@ public class GanttServiceImpl implements GanttService {
      * @return
      */
     @Override
-    public R getListByCondition(Date startDate,
-                                Date endDate,
-                                String factoryId,
-                                List<String> workShopIdList,
-                                List<String> orderNoList,
-                                List<String> productionLineId,
-                                List<String> equId) {
-        log.info("甘特图查询开始时间:"+ DateUtil.now());
-        if(endDate == null && startDate !=null){
+    public R getListByCondition(Date startDate, Date endDate, String factoryId,
+                                List<String> workShopIdList, List<String> orderNoList,
+                                List<String> productionLineId, List<String> equId) {
+        log.info("甘特图查询开始时间:" + DateUtil.now());
+        if (endDate == null && startDate != null) {
             List<Date> searchDateList = getSearchDate(startDate);
             startDate = searchDateList.get(0);
             endDate = searchDateList.get(1);
         }
-
         List<GanttVos> apsProcessOperationProcessEquDos = apsProcessOperationProcessEquDao.getGanttDataList(
                 startDate,
                 endDate,
@@ -95,117 +85,11 @@ public class GanttServiceImpl implements GanttService {
                 orderNoList,
                 null,
                 productionLineId,
-                equId);
-        // 需要返回给前端的数据
-        List<ScheduleGanttVo> resultVo = new ArrayList<>();
-        if (apsProcessOperationProcessEquDos.isEmpty()) {
-            return R.ok(resultVo);
-        }
-
-        // 对数据按照加工车间分组
-        LinkedHashMap<String, List<GanttVos>> dataMap = apsProcessOperationProcessEquDos.stream()
-                .collect(Collectors.groupingBy(GanttVos::getProcessworkshopid,
-                        LinkedHashMap::new, Collectors.toList()));
-        /**
-         * 工序的对象
-         */
-        ScheduleGanttVo workShopVo;
-        // 设备的对象
-        ScheduleGanttVo deviceVo;
-        // 具体工序作业的对象
-        ScheduleGanttVo dateVo;
-        int workShopIndex = 1;
-        for (Map.Entry<String, List<GanttVos>> workShopEntry : dataMap.entrySet()) {
-            workShopVo = new ScheduleGanttVo();
-            workShopVo.setId(workShopIndex++);
-            workShopVo.setText(workShopEntry.getValue().get(0).getProcessworkshop());
-            workShopVo.setOpen(true);
-            workShopVo.setType(DEFAULT_TYPE);
-            workShopVo.setStart_date(workShopEntry.getValue().get(0).getPlanstartdate());
-            resultVo.add(workShopVo);
-            // 对数据按照设备进行分组
-            LinkedHashMap<String, List<GanttVos>> processMap = workShopEntry.getValue().stream().collect(Collectors.groupingBy(info -> info.getProcessdeviceid(),
-                    LinkedHashMap::new, Collectors.toList()));
-            // 对数据按照 设备进行分组
-            for (Map.Entry<String, List<GanttVos>> deviceEntry : processMap.entrySet()) {
-                deviceVo = new ScheduleGanttVo();
-                deviceVo.setId(workShopIndex++);
-                deviceVo.setText(deviceEntry.getValue().get(0).getProcessdevice());
-                deviceVo.setOpen(true);
-                deviceVo.setType(DEFAULT_TYPE);
-                deviceVo.setParent(workShopVo.getId());
-                deviceVo.setDevicetype(deviceEntry.getValue().get(0).getDevicetype());
-                deviceVo.setRender(DEFAULT_RENDER);
-                deviceVo.setStart_date(deviceEntry.getValue().get(0).getPlanstartdate());
-                resultVo.add(deviceVo);
-                // 对数据按照 计划开始时间+计划结束时间 分组
-                LinkedHashMap<String, List<GanttVos>> planDataMap = deviceEntry.getValue().stream().collect(Collectors.groupingBy(info -> info.getPlanstartdate().toString() + info.getPlanenddate().toString(),
-                        LinkedHashMap::new, Collectors.toList()));
-
-                for (Map.Entry<String, List<GanttVos>> planDateEntry : planDataMap.entrySet()) {
-                    List<GanttVos> ganttVos = planDateEntry.getValue();
-                    List<String> itemNames=new ArrayList<>();
-                    // 按照工序作业明细ID 进行分组 并且获取 图列的 名称和描述
-                    LinkedHashMap<String, List<GanttVos>> collect = ganttVos.stream().collect(Collectors.groupingBy(GanttVos::getId, LinkedHashMap::new, Collectors.toList()));
-
-                    String itemName = collect.values().stream().map(info -> {
-//                        String prefix = info.stream().map(data -> String.format(GANTT_ITEM_NAME_PREFIX, data.getCustomerabbreviation(), data.getProductname()))
-//                                .collect(Collectors.joining(","));
-                        return String.format(GANTT_ITEM_NAME, info.get(0).getInmatercondition(), info.get(0).getPlanprocessrall(),
-                                info.get(0).getCustomorderno(),info.get(0).getCustomerabbreviation(),info.get(0).getDeliverydate());
-                    }).collect(Collectors.joining("</br>"));
-                    itemNames.add(itemName);
-
-                    String itemPrefix=String.format(GANTT_DESC_PREFIX,
-                            dateFormat(ganttVos.get(0).getPlanstartdate()),
-                            dateFormat(ganttVos.get(0).getPlanenddate()),
-                            dateFormat(ganttVos.get(0).getActualstartdate()),
-                            dateFormat(ganttVos.get(0).getActualfinishdate()),
-                            ganttVos.get(0).getProcessworkshop(),ganttVos.get(0).getProcessdevice());
-                    String itemDesc= ganttVos.stream().map(info->{
-                        return String.format(GANTT_DESC,info.getInmatercondition(), info.getPlanprocessrall(),
-                                info.getProcessname(),info.getWorkstatus(),
-                                info.getStartingroll(),info.getReportroll(),
-                                info.getCheckoutroll(),info.getUnfinishroll(),
-                                info.getCustomorderno(),info.getCustomerabbreviation(),
-                                info.getDeliverydate(),info.getOutputorderproduct());
-                    }).collect(Collectors.joining("</br>"));
-                    dateVo = new ScheduleGanttVo();
-                    dateVo.setId(workShopIndex++);
-                    dateVo.setParent(deviceVo.getId());
-                    dateVo.setText(StringUtils.join(itemNames,"</br>"));
-                    dateVo.setTooltip(itemPrefix+itemDesc);
-                    dateVo.setOpen(false);
-                    dateVo.setStart_date(planDateEntry.getValue().get(0).getPlanstartdate());
-                    dateVo.setEnd_date(planDateEntry.getValue().get(0).getPlanenddate());
-                    dateVo.setName(StringUtils.join(itemNames,"</br>"));
-                    dateVo.setDesc(itemPrefix+itemDesc);
-                    dateVo.setProcessdetailids(ganttVos.stream().map(GanttVos::getId).distinct().collect(Collectors.joining(",")));
-                    dateVo.setProcessids(ganttVos.stream().map(GanttVos::getProcessid).distinct().collect(Collectors.joining(",")));
-                    dateVo.setGanttVos(ganttVos);
-                    dateVo.setWorkstatus(ganttVos.stream().map(GanttVos::getWorkstatus).distinct().collect(Collectors.joining(",")));
-                    dateVo.setLockmark(ganttVos.stream().map(GanttVos::getLockmark).distinct().collect(Collectors.joining(",")));
-                    dateVo.setConflict(ganttVos.get(0).getConflict());
-                    dateVo.setProductionorderid(ganttVos.stream().map(GanttVos::getProductionorderid).collect(Collectors.joining(",")));
-                    // 冲突描述
-                    List<GanttVos> conflictdes = ganttVos.stream().filter(v -> StringUtils.isNotBlank(v.getConflictdes())).collect(Collectors.toList());
-                    if(conflictdes != null && conflictdes.size()>0){
-                        String desc = conflictdes.stream().map(GanttVos::getConflictdes).collect(Collectors.joining(";"));
-                        dateVo.setConflictdes(desc);
-                        dateVo.setSoftconflictdes(conflictdes.stream().map(GanttVos::getSoftconflictdes).collect(Collectors.joining(";")));
-                        // 有冲突描述时
-                        if(StringUtils.isBlank(dateVo.getConflictdes()) && StringUtils.isBlank(dateVo.getSoftconflictdes())){
-                            dateVo.setConflict(true);
-                        }else{
-                            dateVo.setConflict(false);
-                        }
-                    }
-
-                    resultVo.add(dateVo);
-                }
-            }
-
-        }
+                equId,
+                null);
+        List<ScheduleGanttVo> scheduleGanttVos = assembleGanttData(apsProcessOperationProcessEquDos);
+        log.info("甘特图查询结束时间:" + DateUtil.now());
+        return R.ok(scheduleGanttVos);
 //        dataMap.forEach((k, v) -> {
 //            ScheduleGanttVo vo = new ScheduleGanttVo();
 //
@@ -254,24 +138,32 @@ public class GanttServiceImpl implements GanttService {
 //            vo.setProcessworkshop(v.get(0).getProcessworkshop());
 //            resultVo.add(vo);
 //        });
-        log.info("甘特图查询结束时间:"+ DateUtil.now());
-        return R.ok(resultVo);
+
     }
 
-    public String dateFormat(Date date){
-        if(date==null){
+    @Override
+    public List<ScheduleGanttVo> getListById(List<String> ids) {
+        List<GanttVos> apsProcessOperationProcessEquDos = apsProcessOperationProcessEquDao.getGanttDataList(
+                null,null, null, null, null,
+                null, null, null, ids);
+        return assembleGanttData(apsProcessOperationProcessEquDos);
+    }
+
+    public String dateFormat(Date date) {
+        if (date == null) {
             return "";
         }
-        return  dateFormat.format(date);
+        return dateFormat.format(date);
     }
 
     /**
      * 根据传入日期获取 该日期的前6天和后6天
+     *
      * @param date
      * @return
      */
-    private List<Date> getSearchDate(Date date){
-        if(date==null){
+    private List<Date> getSearchDate(Date date) {
+        if (date == null) {
             return null;
         }
         LocalDateTime now = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
@@ -289,45 +181,172 @@ public class GanttServiceImpl implements GanttService {
 
     /**
      * 查找上一个或者下一个工序节点
+     *
      * @param ganttVosList
-     * @param operatorType  next:下一节点,pre:上一节点
+     * @param operatorType next:下一节点,pre:上一节点
      * @return
      */
-    public List<GanttVos> getNextProcess(List<GanttVos> ganttVosList,String operatorType){
+    public List<GanttVos> getNextProcess(List<GanttVos> ganttVosList, String operatorType) {
         List<GanttVos> retGantvos = null;
         // 获取下一个或者上一个工序
-        if(ganttVosList != null && ganttVosList.size()>0){
-            List<String> processids = ganttVosList.stream().map(v->v.getProcessid()).collect(Collectors.toList());
+        if (ganttVosList != null && ganttVosList.size() > 0) {
+            List<String> processids = ganttVosList.stream().map(v -> v.getProcessid()).collect(Collectors.toList());
             // 获取上一节点或者下一节点
             List<ApsProcessOperationDo> processOperations = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
                     .in(ApsProcessOperationDo::getId, processids));
             List<String> queryProcessids = new ArrayList<>();
-            if(processOperations != null && processOperations.size()>0){
+            if (processOperations != null && processOperations.size() > 0) {
                 for (ApsProcessOperationDo processOperation : processOperations) {
-                    if("next".equals(operatorType)){
-                        if(processOperation.getNextprocessid() != null){
+                    if ("next".equals(operatorType)) {
+                        if (processOperation.getNextprocessid() != null) {
                             queryProcessids.addAll(Arrays.asList(processOperation.getNextprocessid().split(",")));
                         }
-                    }else{
-                        if(processOperation.getPreviousprocessid() != null){
+                    } else {
+                        if (processOperation.getPreviousprocessid() != null) {
                             queryProcessids.addAll(Arrays.asList(processOperation.getPreviousprocessid().split(",")));
                         }
                     }
                 }
-                if(queryProcessids != null && queryProcessids.size()>0){
+                if (queryProcessids != null && queryProcessids.size() > 0) {
                     String joinids = "'" + CollUtil.join(queryProcessids, "','") + "'";
                     retGantvos = apsProcessOperationProcessEquDao.getGanttDataList(
-                            null,null,null,null,null,joinids,null,null);
+                            null, null, null, null, null, joinids, null, null, null);
                 }
             }
 
-        }else{
-            if("next".equals(operatorType)){
+        } else {
+            if ("next".equals(operatorType)) {
                 throw new CustomException("没有下一工序");
-            }else{
+            } else {
                 throw new CustomException("没有上一工序");
             }
         }
         return retGantvos;
     }
+
+    /**
+     * 工序名为 成退和中退 的清空下 加工时间相同的才可以合并
+     * @param apsProcessOperationProcessEquDos
+     * @return
+     */
+    public List<ScheduleGanttVo> assembleGanttData(List<GanttVos> apsProcessOperationProcessEquDos) {
+        // 需要返回给前端的数据
+        List<ScheduleGanttVo> resultVo;
+        if (apsProcessOperationProcessEquDos.isEmpty()) {
+            return new ArrayList<>();
+        }
+        resultVo = new ArrayList<>();
+        // 对数据按照加工车间分组
+        LinkedHashMap<String, List<GanttVos>> dataMap = apsProcessOperationProcessEquDos.stream()
+                .collect(Collectors.groupingBy(GanttVos::getProcessworkshopid,
+                        LinkedHashMap::new, Collectors.toList()));
+        /**
+         * 工序的对象
+         */
+        ScheduleGanttVo workShopVo;
+        // 设备的对象
+        ScheduleGanttVo deviceVo;
+        // 具体工序作业的对象
+        ScheduleGanttVo dateVo;
+        int workShopIndex = 1;
+        for (Map.Entry<String, List<GanttVos>> workShopEntry : dataMap.entrySet()) {
+            workShopVo = new ScheduleGanttVo();
+            workShopVo.setId(workShopIndex++);
+            workShopVo.setText(workShopEntry.getValue().get(0).getProcessworkshop());
+            workShopVo.setOpen(true);
+            workShopVo.setType(DEFAULT_TYPE);
+            workShopVo.setStart_date(workShopEntry.getValue().get(0).getPlanstartdate());
+            resultVo.add(workShopVo);
+            // 对数据按照设备进行分组
+            LinkedHashMap<String, List<GanttVos>> processMap = workShopEntry.getValue().stream().collect(Collectors.groupingBy(info -> info.getProcessdeviceid(),
+                    LinkedHashMap::new, Collectors.toList()));
+            // 对数据按照 设备进行分组
+            for (Map.Entry<String, List<GanttVos>> deviceEntry : processMap.entrySet()) {
+                deviceVo = new ScheduleGanttVo();
+                deviceVo.setId(workShopIndex++);
+                deviceVo.setText(deviceEntry.getValue().get(0).getProcessdevice());
+                deviceVo.setOpen(true);
+                deviceVo.setType(DEFAULT_TYPE);
+                deviceVo.setParent(workShopVo.getId());
+                deviceVo.setDevicetype(deviceEntry.getValue().get(0).getDevicetype());
+                deviceVo.setRender(DEFAULT_RENDER);
+                deviceVo.setStart_date(deviceEntry.getValue().get(0).getPlanstartdate());
+                resultVo.add(deviceVo);
+
+                // 对数据按照 计划开始时间+计划结束时间 分组
+                LinkedHashMap<String, List<GanttVos>> planDataMap = deviceEntry.getValue().stream().collect(Collectors.groupingBy(info -> {
+                        if(COMBINED_PROCESSING.equals(info.getProcessway())){
+                            return info.getPlanstartdate().toString() + info.getPlanenddate().toString();
+                        }
+                         return info.getUuid();
+                        },
+                        LinkedHashMap::new, Collectors.toList()));
+
+                for (Map.Entry<String, List<GanttVos>> planDateEntry : planDataMap.entrySet()) {
+                    List<GanttVos> ganttVos = planDateEntry.getValue();
+                    List<String> itemNames = new ArrayList<>();
+                    // 按照工序作业明细ID 进行分组 并且获取 图列的 名称和描述
+                    LinkedHashMap<String, List<GanttVos>> collect = ganttVos.stream().collect(Collectors.groupingBy(GanttVos::getId, LinkedHashMap::new, Collectors.toList()));
+
+                    String itemName = collect.values().stream().map(info -> {
+//                        String prefix = info.stream().map(data -> String.format(GANTT_ITEM_NAME_PREFIX, data.getCustomerabbreviation(), data.getProductname()))
+//                                .collect(Collectors.joining(","));
+                        return String.format(GANTT_ITEM_NAME, info.get(0).getInmatercondition(), info.get(0).getPlanprocessrall(),
+                                info.get(0).getCustomorderno(), info.get(0).getCustomerabbreviation(), info.get(0).getDeliverydate());
+                    }).collect(Collectors.joining("</br>"));
+                    itemNames.add(itemName);
+
+                    String itemPrefix = String.format(GANTT_DESC_PREFIX,
+                            dateFormat(ganttVos.get(0).getPlanstartdate()),
+                            dateFormat(ganttVos.get(0).getPlanenddate()),
+                            dateFormat(ganttVos.get(0).getActualstartdate()),
+                            dateFormat(ganttVos.get(0).getActualfinishdate()),
+                            ganttVos.get(0).getProcessworkshop(), ganttVos.get(0).getProcessdevice());
+                    String itemDesc = ganttVos.stream().map(info -> {
+                        return String.format(GANTT_DESC, info.getInmatercondition(), info.getPlanprocessrall(),
+                                info.getProcessname(), info.getWorkstatus(),
+                                info.getStartingroll(), info.getReportroll(),
+                                info.getCheckoutroll(), info.getUnfinishroll(),
+                                info.getCustomorderno(), info.getCustomerabbreviation(),
+                                info.getDeliverydate(), info.getOutputorderproduct());
+                    }).collect(Collectors.joining("</br>"));
+                    dateVo = new ScheduleGanttVo();
+                    dateVo.setId(workShopIndex++);
+                    dateVo.setParent(deviceVo.getId());
+                    dateVo.setText(StringUtils.join(itemNames, "</br>"));
+                    dateVo.setTooltip(itemPrefix + itemDesc);
+                    dateVo.setOpen(false);
+                    dateVo.setStart_date(planDateEntry.getValue().get(0).getPlanstartdate());
+                    dateVo.setEnd_date(planDateEntry.getValue().get(0).getPlanenddate());
+                    dateVo.setName(StringUtils.join(itemNames, "</br>"));
+                    dateVo.setDesc(itemPrefix + itemDesc);
+                    dateVo.setProcessdetailids(ganttVos.stream().map(GanttVos::getId).distinct().collect(Collectors.joining(",")));
+                    dateVo.setProcessids(ganttVos.stream().map(GanttVos::getProcessid).distinct().collect(Collectors.joining(",")));
+                    dateVo.setGanttVos(ganttVos);
+                    dateVo.setWorkstatus(ganttVos.stream().map(GanttVos::getWorkstatus).distinct().collect(Collectors.joining(",")));
+                    dateVo.setLockmark(ganttVos.stream().map(GanttVos::getLockmark).distinct().collect(Collectors.joining(",")));
+                    dateVo.setConflict(ganttVos.get(0).getConflict());
+                    dateVo.setProductionorderid(ganttVos.stream().map(GanttVos::getProductionorderid).collect(Collectors.joining(",")));
+                    // 冲突描述
+                    List<GanttVos> conflictdes = ganttVos.stream().filter(v -> StringUtils.isNotBlank(v.getConflictdes())).collect(Collectors.toList());
+                    if (conflictdes != null && conflictdes.size() > 0) {
+                        String desc = conflictdes.stream().map(GanttVos::getConflictdes).collect(Collectors.joining(";"));
+                        dateVo.setConflictdes(desc);
+                        dateVo.setSoftconflictdes(conflictdes.stream().map(GanttVos::getSoftconflictdes).collect(Collectors.joining(";")));
+                        // 有冲突描述时
+                        if (StringUtils.isBlank(dateVo.getConflictdes()) && StringUtils.isBlank(dateVo.getSoftconflictdes())) {
+                            dateVo.setConflict(true);
+                        } else {
+                            dateVo.setConflict(false);
+                        }
+                    }
+
+                    resultVo.add(dateVo);
+                }
+            }
+
+        }
+        return resultVo;
+    }
+
 }

+ 9 - 1
cx-aps/cx-aps-common/src/main/resources/mybatis/ApsProcessOperationProcessEquDao.xml

@@ -139,6 +139,7 @@
 
     <select id="getGanttDataList" resultType="com.rongwei.bsentity.vo.GanttVos">
         SELECT
+        UUID_SHORT() as uuid,
         a4.PRODUCTNAME,
         a1.PLANPROCESSRALL,
         a2.PROCESSSTATUS,
@@ -182,7 +183,8 @@
         a2.INMATERCONDITION,
         a6.CUSTOMORDERNO,
         a3.OUTPUTORDERPRODUCT,
-        c.NAME AS DEVICETYPE
+        c.NAME AS DEVICETYPE,
+        a2.PROCESSWAY
         FROM
         aps_process_operation_process_equ a1
         LEFT JOIN aps_process_operation a2 ON a1.PROCESSID = a2.ID
@@ -204,6 +206,12 @@
             AND a4.DELETED = '0'
             AND a5.DELETED = '0'
             AND a6.DELETED='0'
+            <if test="ids != null and ids.size()>0">
+                and a1.ID in
+                <foreach collection="ids" item="id" open="(" close=")" separator=",">
+                    #{id}
+                </foreach>
+            </if>
             <if test="productionLineIds != null and productionLineIds.size()>0">
                 AND ape.DELETED = '0'
                 AND apl.DELETED = '0'

+ 9 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/GanttVos.java

@@ -12,6 +12,10 @@ import java.util.Date;
  */
 @Data
 public class GanttVos {
+    /**
+     * 分组的唯一标识
+     */
+    private String uuid;
     /**
      * 订单产品
      */
@@ -168,4 +172,9 @@ public class GanttVos {
      */
     private String devicetype;
 
+    /**
+     * 加工方式
+     */
+    private String processway;
+
 }

+ 1 - 1
cx-safe-check/cx-save-check-common/src/main/resources/mybatis/AccidentDao.xml

@@ -31,7 +31,7 @@
         LEFT JOIN sys_user_org suo ON FIND_IN_SET( suo.ORGID, c.orgids )
         AND suo.DELETED = '0'
         GROUP BY
-        C.ID
+        c.ID
         ) SELECT
         ouc.ID as departid,
         max( ouc.FULLNAME ) AS departname,