车车 6 mesi fa
parent
commit
a2417b2eed

+ 20 - 0
ktg-iscs/src/main/java/com/ktg/iscs/controller/HardwareApiController.java

@@ -122,4 +122,24 @@ public class HardwareApiController extends BaseController
         return CommonResult.success(hardwareApiService.updateSwitchStatus(dto));
     }
 
+    // ----------------------------------作业票及作业票的相关数据查询-------------------------------------------------------
+
+    @ApiOperation("上锁取钥匙前检查")
+    @Parameter(name = "ticketId", description = "ticketId")
+    @GetMapping(value = "/checkBeforeToLock")
+    public CommonResult<Boolean> checkBeforeToLock(Long ticketId)
+    {
+        return CommonResult.success(hardwareApiService.checkBeforeToLock(ticketId));
+    }
+
+    @ApiOperation("解锁取钥匙前检查")
+    @Parameter(name = "ticketId", description = "ticketId")
+    @GetMapping(value = "/checkBeforeToUnlock")
+    public CommonResult<Boolean> checkBeforeToUnlock(Long ticketId)
+    {
+        return CommonResult.success(hardwareApiService.checkBeforeToUnlock(ticketId));
+    }
+
+
+
 }

+ 4 - 0
ktg-iscs/src/main/java/com/ktg/iscs/domain/vo/hardwareApi/JobTicketVO.java

@@ -10,6 +10,7 @@ import lombok.EqualsAndHashCode;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
 
 /**
  * 作业票对象 is_job_ticket
@@ -77,4 +78,7 @@ public class JobTicketVO extends BaseBean
     @ApiModelProperty(value = "作业票关联隔离点")
     private List<JobTicketPointsVO> ticketPointsVOList;
 
+    @ApiModelProperty(value = "解锁时禁止解除的点位")
+    private Set<JobTicketPointsVO> noUnlockTicketPointsVOSet;
+
 }

+ 17 - 0
ktg-iscs/src/main/java/com/ktg/iscs/mapper/IsJobTicketMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ktg.common.mapper.BaseMapperX;
 import com.ktg.iscs.domain.IsJobTicket;
 import com.ktg.iscs.domain.dto.ticket.PageTicketDTO;
+import com.ktg.iscs.domain.vo.ticket.JobTicketDetailVO;
 import com.ktg.iscs.domain.vo.ticket.MonitorTicketPageVO;
 import com.ktg.iscs.domain.vo.ticket.PageTicketVO;
 import org.apache.ibatis.annotations.Mapper;
@@ -74,4 +75,20 @@ public interface IsJobTicketMapper extends BaseMapperX<IsJobTicket>
 
     List<IsJobTicket> getTicketListByAttrValue(@Param(value = "userId") Long userId);
 
+
+    /**
+     * 上锁取钥匙后未归还的重复点位作业票干扰
+     * @param pointIds
+     * @return
+     */
+    List<JobTicketDetailVO> selectConflictTicket1(@Param(value = "pointIds") List<Long> pointIds, @Param(value = "ticketId") Long ticketId);
+
+    /**
+     * 上锁取钥匙后已归还
+     * @param pointIds
+     * @return
+     */
+    List<JobTicketDetailVO> selectConflictTicket2(@Param(value = "pointIds") List<Long> pointIds, @Param(value = "ticketId") Long ticketId);
+
+
 }

+ 14 - 0
ktg-iscs/src/main/java/com/ktg/iscs/service/HardwareApiService.java

@@ -94,5 +94,19 @@ public interface HardwareApiService {
      */
     Boolean updateSwitchStatus(UpdateSwitchStatusDTO dto);
 
+    /**
+     * 上锁取钥匙前检查
+     * @param ticketId
+     * @return
+     */
+    Boolean checkBeforeToLock(Long ticketId);
+
+    /**
+     * 解锁取钥匙前检查
+     * @param ticketId
+     * @return
+     */
+    Boolean checkBeforeToUnlock(Long ticketId);
+
 
 }

+ 4 - 0
ktg-iscs/src/main/java/com/ktg/iscs/service/IIsJobTicketService.java

@@ -89,4 +89,8 @@ public interface IIsJobTicketService extends IService<IsJobTicket>
     Boolean updateJobToFinish(IsJobTicket isJobTicket);
 
     Boolean updateJobToCancel(IsJobTicket isJobTicket);
+
+    List<JobTicketDetailVO> selectConflictTicket1(List<Long> points, Long ticketId);
+
+    List<JobTicketDetailVO> selectConflictTicket2(List<Long> points, Long ticketId);
 }

+ 114 - 3
ktg-iscs/src/main/java/com/ktg/iscs/service/impl/HardwareApiServiceImpl.java

@@ -8,15 +8,17 @@ import com.ktg.iscs.domain.*;
 import com.ktg.iscs.domain.dto.hardwareApi.*;
 import com.ktg.iscs.domain.enums.*;
 import com.ktg.iscs.domain.vo.hardwareApi.*;
+import com.ktg.iscs.domain.vo.ticket.JobTicketDetailVO;
 import com.ktg.iscs.domain.vo.ticket.JobTicketUpdateProgressReqVO;
+import com.ktg.iscs.domain.vo.ticketPoints.IsJobTicketPointsVO;
 import com.ktg.iscs.service.*;
+import com.sun.org.apache.bcel.internal.generic.NEW;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -53,6 +55,8 @@ public class HardwareApiServiceImpl implements HardwareApiService {
     @Autowired
     private IIsJobCardService iIsJobCardService;
     @Autowired
+    private IIsJobTicketStepService iIsJobTicketStepService;
+    @Autowired
     private IIsSystemAttributeService isSystemAttributeService;
     // @Value("${ktg-mes.jtcolocker}")
     // private String jtcolocker;
@@ -589,6 +593,21 @@ public class HardwareApiServiceImpl implements HardwareApiService {
     @Override
     public JobTicketVO selectTicketDetailById(Long ticketId) {
         Assert.notNull(ticketId, "作业票id不可为空!");
+        // 0.作业前检查
+        List<IsJobTicketStep> steps = iIsJobTicketStepService.list(Wrappers.<IsJobTicketStep>lambdaQuery()
+                .eq(IsJobTicketStep::getTicketId, ticketId));
+        IsJobTicketStep isJobTicketStep3 = steps.stream().filter(o -> o.getStepIndex().equals(3)).collect(Collectors.toList()).get(0);
+        IsJobTicketStep isJobTicketStep4 = steps.stream().filter(o -> o.getStepIndex().equals(4)).collect(Collectors.toList()).get(0);
+        IsJobTicketStep isJobTicketStep6 = steps.stream().filter(o -> o.getStepIndex().equals(6)).collect(Collectors.toList()).get(0);
+        IsJobTicketStep isJobTicketStep7 = steps.stream().filter(o -> o.getStepIndex().equals(7)).collect(Collectors.toList()).get(0);
+        if (isJobTicketStep3.getStepStatus().equals("1") && isJobTicketStep4.getStepStatus().equals("0")) {
+            // 则是去上锁
+            checkBeforeToLock(ticketId);
+        }
+        if (isJobTicketStep6.getStepStatus().equals("1") && isJobTicketStep7.getStepStatus().equals("0")) {
+            // 则是去上锁
+            checkBeforeToUnlock(ticketId);
+        }
         // 1.查询作业票信息
         IsJobTicket isJobTicket = isJobTicketService.getById(ticketId);
         Assert.notNull(isJobTicket, "作业票信息丢失!");
@@ -614,12 +633,32 @@ public class HardwareApiServiceImpl implements HardwareApiService {
         List<IsJobTicketPoints> jobTicketPointsList = iIsJobTicketPointsService.list(Wrappers.<IsJobTicketPoints>lambdaQuery()
                 .eq(IsJobTicketPoints::getTicketId, ticketId));
         List<JobTicketPointsVO> ticketPointsVOList = BeanUtils.toBean(jobTicketPointsList, JobTicketPointsVO.class);
-        // 5.组装数据
+        // 7.解锁时,提供的不可解锁的点位数据
+        Set<JobTicketPointsVO> noUnlockTicketPointsVOSet = new HashSet<>();
+        List<Long> points = ticketPointsVOList.stream().map(JobTicketPointsVO::getPointId).collect(Collectors.toList());
+        List<JobTicketDetailVO> jobTicketDetailVOS2 = isJobTicketService.selectConflictTicket2(points, ticketId);
+        if (!jobTicketDetailVOS2.isEmpty()) {
+            // 代表存在不可解除的点位,查询出来
+            List<Long> longList = jobTicketDetailVOS2.stream().map(JobTicketDetailVO::getTicketId).collect(Collectors.toList());
+            List<IsJobTicketPoints> list = iIsJobTicketPointsService.list(Wrappers.<IsJobTicketPoints>lambdaQuery()
+                    .in(IsJobTicketPoints::getTicketId, longList));
+            // 可能有多个作业多个点位,去重一下
+            Set<IsJobTicketPoints> set = new HashSet<>(list);
+            for (JobTicketPointsVO isJobTicketPoints : ticketPointsVOList) {
+                for (IsJobTicketPoints jobTicketPoints : set) {
+                    if (isJobTicketPoints.getPointId().equals(jobTicketPoints.getPointId())) {
+                        noUnlockTicketPointsVOSet.add(isJobTicketPoints);
+                    }
+                }
+            }
+        }
+        // 8.组装数据
         jobTicketVO.setTicketKeyVOList(ticketKeyVOList);
         jobTicketVO.setTicketLockVOList(ticketLockVOList);
         jobTicketVO.setTicketLocksetVOList(ticketLocksetVOList);
         jobTicketVO.setTicketUserVOList(ticketUserVOList);
         jobTicketVO.setTicketPointsVOList(ticketPointsVOList);
+        jobTicketVO.setNoUnlockTicketPointsVOSet(noUnlockTicketPointsVOSet);
         return jobTicketVO;
     }
 
@@ -659,4 +698,76 @@ public class HardwareApiServiceImpl implements HardwareApiService {
                 .eq(IsIsolationPoint::getPointNfc, dto.getPointNfc())
                 .set(IsIsolationPoint::getSwitchStatus, dto.getSwitchStatus()));
     }
+
+    @Override
+    public Boolean checkBeforeToLock(Long ticketId) {
+        Assert.notNull(ticketId, "当前作业票id不能为空!");
+        // 1.查询当前作业票需要上锁的点位信息
+        List<IsJobTicketPoints> listByTicketId = iIsJobTicketPointsService.list(Wrappers.<IsJobTicketPoints>lambdaQuery()
+                .eq(IsJobTicketPoints::getTicketId, ticketId));
+        if (!listByTicketId.isEmpty()) {
+            // 如果存在冲突的作业,检查下到了哪个阶段(取了钥匙上锁还未归还、上锁钥匙已归还、取了钥匙去解锁未归还、解锁完成钥匙已归还)
+            List<Long> points = listByTicketId.stream().map(IsJobTicketPoints::getPointId).collect(Collectors.toList());
+            // 2.如果有重复点位,取了钥匙去上锁没有归还的作业
+            List<JobTicketDetailVO> jobTicketDetailVOS1 = isJobTicketService.selectConflictTicket1(points, ticketId);
+            if (!jobTicketDetailVOS1.isEmpty()) {
+                Assert.isFalse(true, "请等待作业票[" + jobTicketDetailVOS1.get(0).getTicketName() + "]上锁完成!");
+            }
+            // 3.如果上锁钥匙已经归还,需要使用别人的数据帮我们的重复点位上锁了
+            // 找到别人已经上锁的并且没有解锁的,而且点位和我重复的
+            List<JobTicketDetailVO> jobTicketDetailVOS2 = isJobTicketService.selectConflictTicket2(points, ticketId);
+            if (!jobTicketDetailVOS2.isEmpty()) {
+                List<Long> longList = jobTicketDetailVOS2.stream().map(JobTicketDetailVO::getTicketId).collect(Collectors.toList());
+                List<IsJobTicketPoints> list = iIsJobTicketPointsService.list(Wrappers.<IsJobTicketPoints>lambdaQuery()
+                        .in(IsJobTicketPoints::getTicketId, longList));
+                // 可能有多个作业多个点位,去重一下
+                Set<IsJobTicketPoints> set = new HashSet<>(list);
+                for (IsJobTicketPoints isJobTicketPoints : listByTicketId) {
+                    for (IsJobTicketPoints jobTicketPoints : set) {
+                        if (isJobTicketPoints.getPointId().equals(jobTicketPoints.getPointId())) {
+                            // isJobTicketPoints.setWorkshopId();
+                            // isJobTicketPoints.setWorkareaId();
+                            // isJobTicketPoints.setPointId();
+                            isJobTicketPoints.setPointStatus(jobTicketPoints.getPointStatus());
+                            isJobTicketPoints.setLockId(jobTicketPoints.getLockId());
+                            isJobTicketPoints.setLockedByKeyId(jobTicketPoints.getLockedByKeyId());
+                            // isJobTicketPoints.setUnlockedByKeyId();
+                            isJobTicketPoints.setLockTime(jobTicketPoints.getLockTime());
+                            // isJobTicketPoints.setUnlockTime();
+                            // isJobTicketPoints.setPrePointId();
+                            // isJobTicketPoints.setWorkstationId();
+                            // isJobTicketPoints.setMachineryId();
+                            iIsJobTicketPointsService.updateById(isJobTicketPoints);
+                        }
+                    }
+                }
+            }
+            // 4.如果别人拿了钥匙去解锁,那我直接弹全部,自己去上锁
+            // 5.如果别人解锁完成归还钥匙,则全部可以弹出去上锁
+        }
+        return true;
+    }
+
+    @Override
+    public Boolean checkBeforeToUnlock(Long ticketId) {
+        Assert.notNull(ticketId, "当前作业票id不能为空!");
+        // 1.查询当前作业票需要解锁的点位信息
+        List<IsJobTicketPoints> listByTicketId = iIsJobTicketPointsService.list(Wrappers.<IsJobTicketPoints>lambdaQuery()
+                .eq(IsJobTicketPoints::getTicketId, ticketId));
+        if (!listByTicketId.isEmpty()) {
+            // 如果存在冲突的作业,检查下到了哪个阶段(取了钥匙上锁还未归还、上锁钥匙已归还、取了钥匙去解锁未归还、解锁完成钥匙已归还)
+            List<Long> points = listByTicketId.stream().map(IsJobTicketPoints::getPointId).collect(Collectors.toList());
+            // 2.如果有重复点位,取了钥匙去上锁没有归还的作业
+            List<JobTicketDetailVO> jobTicketDetailVOS1 = isJobTicketService.selectConflictTicket1(points, ticketId);
+            if (!jobTicketDetailVOS1.isEmpty()) {
+                Assert.isFalse(true, "请等待作业票[" + jobTicketDetailVOS1.get(0).getTicketName() + "]上锁完成!");
+            }
+            // 3.如果取了钥匙去上锁已经归还,代表别的上锁已经完成,我可以解除不是重复的点位,然后手动完成作业,这样别人作业结束以后可以直接解除物理锁
+            List<JobTicketDetailVO> jobTicketDetailVOS2 = isJobTicketService.selectConflictTicket2(points, ticketId);
+            // 4.如果别人取了钥匙去解锁,说明都是去解锁,我可以解全部
+
+            // 5.如果别人解除完了回来完成了作业,我可以解除全部
+        }
+        return true;
+    }
 }

+ 10 - 0
ktg-iscs/src/main/java/com/ktg/iscs/service/impl/IsJobTicketServiceImpl.java

@@ -835,5 +835,15 @@ public class IsJobTicketServiceImpl extends ServiceImpl<IsJobTicketMapper, IsJob
         return true;
     }
 
+    @Override
+    public List<JobTicketDetailVO> selectConflictTicket1(List<Long> pointIds, Long ticketId) {
+        return isJobTicketMapper.selectConflictTicket1(pointIds, ticketId);
+    }
+
+    @Override
+    public List<JobTicketDetailVO> selectConflictTicket2(List<Long> pointIds, Long ticketId) {
+        return isJobTicketMapper.selectConflictTicket2(pointIds, ticketId);
+    }
+
 
 }

+ 44 - 1
ktg-iscs/src/main/resources/mapper/IsJobTicketMapper.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ktg.iscs.mapper.IsJobTicketMapper">
-    <cache/>
+    <!--<cache/>-->
     <resultMap type="IsJobTicket" id="IsJobTicketResult">
         <result property="ticketId"    column="ticket_id"    />
         <result property="ticketCode"    column="ticket_code"    />
@@ -228,4 +228,47 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 LEFT JOIN is_job_ticket_user u ON u.ticket_id = j.ticket_id and u.user_role = "jtlocker"
         where (j.create_by = #{userId} or u.user_id = #{userId}) and j.ticket_status &lt; 5
     </select>
+    <select id="selectConflictTicket1" resultType="com.ktg.iscs.domain.vo.ticket.JobTicketDetailVO">
+        SELECT
+        j.*
+        FROM
+        `is_job_ticket` j
+        LEFT JOIN is_job_ticket_points p ON p.ticket_id = j.ticket_id
+        LEFT JOIN is_job_ticket_key k ON k.ticket_id = j.ticket_id
+        WHERE
+        j.ticket_status &lt; 5
+        AND p.point_id IN
+        <foreach collection="pointIds" index="index" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+        AND k.collect_time is not null
+        and k.give_back_time is null
+        and k.ticket_type = 0
+        and j.ticket_id != #{ticketId}
+        GROUP BY
+        j.ticket_id
+    </select>
+    <select id="selectConflictTicket2" resultType="com.ktg.iscs.domain.vo.ticket.JobTicketDetailVO">
+        SELECT
+        j.*
+        FROM
+        `is_job_ticket` j
+        LEFT JOIN is_job_ticket_points p ON p.ticket_id = j.ticket_id
+        LEFT JOIN is_job_ticket_key k1 ON k1.ticket_id = j.ticket_id and k1.ticket_type = 0
+        LEFT JOIN is_job_ticket_key k2 ON k2.ticket_id = j.ticket_id and k2.ticket_type = 1
+        WHERE
+        j.ticket_status &lt; 5
+        AND p.point_id IN
+        <foreach collection="pointIds" index="index" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+        AND k1.collect_time is not null
+        and k1.give_back_time is not null
+        AND k2.collect_time is null
+        and k2.give_back_time is null
+        and j.ticket_id != #{ticketId}
+        GROUP BY
+        j.ticket_id
+    </select>
+
 </mapper>