소스 검색

aps-调度排程前数据清洗

sucheng 4 달 전
부모
커밋
b8cd513992

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

@@ -181,5 +181,5 @@ public interface ApsBlankOrderDao extends BaseMapper<ApsBlankOrderDo> {
 
     List<ApsBlankOrderDo> selectBlankByStartNum(@Param("startNum") String startNum);
 
-    int moveErrorProcessEqu(@Param("chongpaiEndDate") DateTime chongpaiEndDate, @Param("tenantId") String tenantId, @Param("workshopin") Integer workshopin, @Param("workshopcross") Integer workshopcross);
+    int moveErrorProcessEqu(@Param("chongpaiStartDate") DateTime chongpaiStartDate, @Param("chongpaiEndDate") DateTime chongpaiEndDate, @Param("tenantId") String tenantId, @Param("workshopin") Integer workshopin, @Param("workshopcross") Integer workshopcross);
 }

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

@@ -4352,7 +4352,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             //错误数据纠正挪动
             int safeCount = 0;
             while (true) {
-                int updateCount = this.baseMapper.moveErrorProcessEqu(chongpaiEndDate, CXCommonUtils.getCurrentUserFactoryId(currentUser), apsScheduleConfigDo.getWorkshopin(), apsScheduleConfigDo.getWorkshopcross());
+                int updateCount = this.baseMapper.moveErrorProcessEqu(chongpaiStartDate, chongpaiEndDate, CXCommonUtils.getCurrentUserFactoryId(currentUser), apsScheduleConfigDo.getWorkshopin(), apsScheduleConfigDo.getWorkshopcross());
                 if (updateCount <= 0) {
                     break;
                 }

+ 66 - 6
cx-aps/cx-aps-common/src/main/resources/mybatis/ApsBlankOrderDao.xml

@@ -294,6 +294,7 @@
           and apope.LOCKMARKDETAIL = 'y'
     </update>
     <update id="moveErrorProcessEqu">
+        -- 如果有前道,并且(计划开工时间在调度时间范围内,或者前道在计划开工时间在调度时间范围内,并且(前道完工时间+最大流转时间大于计划开工时间,或者小于调度结束时间)),则挪到前道完工时间+最大流转时间
         update
         aps_process_operation_process_equ apope
         join aps_process_operation apo on apo.ID = apope.PROCESSID
@@ -302,33 +303,92 @@
         apope.PLANENDDATE=date_add(apope.PLANENDDATE,
         INTERVAL TIMESTAMPdiff(SECOND,
         apope.PLANSTARTDATE,
-        date_add(preapope.PLANENDDATE, -- 计划开工时间 小于 前道计划完工时间 + 流转时间
+        LEAST(GREATEST(
+        date_add(preapope.PLANENDDATE, -- 前道计划完工时间 + 流转时间
         INTERVAL GREATEST(
         ifnull(apo.MINFLOWWAITMIN,0), -- 最小流转等待时间
         if(apope.PROCESSWORKSHOPID!=preapope.PROCESSWORKSHOPID,#{workshopcross}, -- 车间流转时间
         if(apope.PROCESSDEVICEID!=preapope.PROCESSDEVICEID,#{workshopin},0))) MINUTE -- 机台流转时间
-        )) SECOND),
+        ),
+        #{chongpaiStartDate} -- 调度开始时间)
+        ),
+        if(ifnull(apo.MAXFLOWWAITMIN,0)=0, -- 如果有最大流转等待时间,则取前道计划完工时间 + 最大流转等待时间,否则取调度结束时间
+        #{chongpaiEndDate}, -- 调度结束时间
+        date_add(preapope.PLANENDDATE, INTERVAL apo.MAXFLOWWAITMIN MINUTE))) -- 前道计划完工时间 + 最大流转等待时间
+        ) SECOND),
         apope.PLANSTARTDATE=date_add(apope.PLANSTARTDATE,
         INTERVAL TIMESTAMPdiff(SECOND,
         apope.PLANSTARTDATE,
-        date_add(preapope.PLANENDDATE, -- 计划开工时间 小于 前道计划完工时间 + 流转时间
+        LEAST(GREATEST(
+        date_add(preapope.PLANENDDATE, -- 前道计划完工时间 + 流转时间
         INTERVAL GREATEST(
         ifnull(apo.MINFLOWWAITMIN,0), -- 最小流转等待时间
         if(apope.PROCESSWORKSHOPID!=preapope.PROCESSWORKSHOPID,#{workshopcross}, -- 车间流转时间
         if(apope.PROCESSDEVICEID!=preapope.PROCESSDEVICEID,#{workshopin},0))) MINUTE -- 机台流转时间
-        )) SECOND)
+        ),
+        #{chongpaiStartDate} -- 调度开始时间)
+        ),
+        if(ifnull(apo.MAXFLOWWAITMIN,0)=0, -- 如果有最大流转等待时间,则取前道计划完工时间 + 最大流转等待时间,否则取调度结束时间
+        #{chongpaiEndDate}, -- 调度结束时间
+        date_add(preapope.PLANENDDATE, INTERVAL apo.MAXFLOWWAITMIN MINUTE))) -- 前道计划完工时间 + 最大流转等待时间
+        ) SECOND)
         WHERE
         apope.deleted = '0' AND apo.DELETED = '0' AND preapope.DELETED = '0'
         and apope.TENANTID = #{tenantId}
         and apo.PROCESS != '铸轧'
         and apope.WORKSTATUS = '待开工'
-        AND apope.PLANSTARTDATE &lt;= #{chongpaiEndDate} -- 调度结束时间之前
-        AND date_add(preapope.PLANENDDATE, -- 计划开工时间 小于 前道计划完工时间 + 流转时间
+        AND ((apope.PLANSTARTDATE between #{chongpaiStartDate} and #{chongpaiEndDate}) -- 在调度时间范围内开工
+        or ((preapope.PLANSTARTDATE between #{chongpaiStartDate} and #{chongpaiEndDate}) -- 前道在调度时间范围内开工
+        AND (
+        date_add(preapope.PLANENDDATE, -- 前道计划完工时间 + 流转时间 > 计划开工时间
         INTERVAL GREATEST(
         ifnull(apo.MINFLOWWAITMIN,0), -- 最小流转等待时间
         if(apope.PROCESSWORKSHOPID!=preapope.PROCESSWORKSHOPID,#{workshopcross}, -- 车间流转时间
         if(apope.PROCESSDEVICEID!=preapope.PROCESSDEVICEID,#{workshopin},0))) MINUTE -- 机台流转时间
         ) > apope.PLANSTARTDATE
+        or date_add(preapope.PLANENDDATE, -- 前道计划完工时间 + 流转时间 小于 调度结束时间
+        INTERVAL GREATEST(
+        ifnull(apo.MINFLOWWAITMIN,0), -- 最小流转等待时间
+        if(apope.PROCESSWORKSHOPID!=preapope.PROCESSWORKSHOPID,#{workshopcross}, -- 车间流转时间
+        if(apope.PROCESSDEVICEID!=preapope.PROCESSDEVICEID,#{workshopin},0))) MINUTE -- 机台流转时间
+        ) &lt; #{chongpaiEndDate} -- 调度结束时间
+        )
+        )
+        )
+        AND (apope.PLANENDDATE!=date_add(apope.PLANENDDATE,
+                                       INTERVAL TIMESTAMPdiff(SECOND,
+                                                              apope.PLANSTARTDATE,
+                                                              LEAST(GREATEST(
+                                                                            date_add(preapope.PLANENDDATE, -- 前道计划完工时间 + 流转时间
+                                                                                     INTERVAL GREATEST(
+                                                                                             ifnull(apo.MINFLOWWAITMIN,0), -- 最小流转等待时间
+                                                                                             if(apope.PROCESSWORKSHOPID!=preapope.PROCESSWORKSHOPID,#{workshopcross}, -- 车间流转时间
+                                                                                                if(apope.PROCESSDEVICEID!=preapope.PROCESSDEVICEID,#{workshopin},0))) MINUTE -- 机台流转时间
+                                                                            ),
+                                                                            #{chongpaiStartDate} -- 调度开始时间)
+                                                                    ),
+                                                                    if(ifnull(apo.MAXFLOWWAITMIN,0)=0, -- 如果有最大流转等待时间,则取前道计划完工时间 + 最大流转等待时间,否则取调度结束时间
+                                                                       #{chongpaiEndDate}, -- 调度结束时间
+                                                                       date_add(preapope.PLANENDDATE, INTERVAL apo.MAXFLOWWAITMIN MINUTE))) -- 前道计划完工时间 + 最大流转等待时间
+                                                ) SECOND)
+        OR apope.PLANSTARTDATE!=date_add(apope.PLANSTARTDATE,
+        INTERVAL TIMESTAMPdiff(SECOND,
+        apope.PLANSTARTDATE,
+        LEAST(GREATEST(
+        date_add(preapope.PLANENDDATE, -- 前道计划完工时间 + 流转时间
+        INTERVAL GREATEST(
+        ifnull(apo.MINFLOWWAITMIN,0), -- 最小流转等待时间
+        if(apope.PROCESSWORKSHOPID!=preapope.PROCESSWORKSHOPID,#{workshopcross}, -- 车间流转时间
+            if(apope.PROCESSDEVICEID!=preapope.PROCESSDEVICEID,#{workshopin},0))) MINUTE -- 机台流转时间
+            ),
+            #{chongpaiStartDate} -- 调度开始时间)
+            ),
+            if(ifnull(apo.MAXFLOWWAITMIN,0)=0, -- 如果有最大流转等待时间,则取前道计划完工时间 + 最大流转等待时间,否则取调度结束时间
+            #{chongpaiEndDate}, -- 调度结束时间
+            date_add(preapope.PLANENDDATE, INTERVAL apo.MAXFLOWWAITMIN MINUTE))) -- 前道计划完工时间 + 最大流转等待时间
+            ) SECOND)
+            )
+
     </update>
     <select id="checkConflictByBlankId" resultType="java.lang.Integer">
         select count(*) from aps_process_operation_process_equ