Przeglądaj źródła

新增根据挂锁状态允许归还功能

车车 3 miesięcy temu
rodzic
commit
8ff401acde

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

@@ -166,6 +166,12 @@ public class HardwareApiController extends BaseController
         return CommonResult.success(hardwareApiService.getMySelfState());
     }
 
+    @ApiOperation("判断当前锁还入时能不能锁")
+    @GetMapping(value = "/getLockStateByNfc")
+    public CommonResult<Integer> getLockStateByNfc(String nfc)
+    {
+        return CommonResult.success(hardwareApiService.getLockStateByNfc(nfc, null));
+    }
 
 
 }

+ 2 - 0
ktg-iscs/src/main/java/com/ktg/iscs/mapper/IsJobTicketLockMapper.java

@@ -66,4 +66,6 @@ public interface IsJobTicketLockMapper extends BaseMapperX<IsJobTicketLock>
     int deleteIsJobTicketLockByRecordIds(Long[] recordIds);
 
     List<JobTicketLockVO> getTicketLockByTicketId(@Param(value = "ticketId") Long ticketId);
+
+    IsJobTicketLock getLockJobByBfc(@Param(value = "nfc") String nfc, @Param(value = "ticketId") Long ticketId);
 }

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

@@ -129,4 +129,11 @@ public interface HardwareApiService {
      */
     Boolean getMySelfState();
 
+    /**
+     * 通过nfc查询当前锁能不能锁
+     * @param nfc
+     * @return
+     */
+    Integer getLockStateByNfc(String nfc, Long ticketId);
+
 }

+ 7 - 0
ktg-iscs/src/main/java/com/ktg/iscs/service/IIsJobTicketLockService.java

@@ -65,4 +65,11 @@ public interface IIsJobTicketLockService extends IService<IsJobTicketLock>
     List<IsJobTicketLock> selectByTicketId(Long ticketId);
 
     List<JobTicketLockVO> getTicketLockByTicketId(Long ticketId);
+
+    /**
+     * 通过锁的nfc查询当前关联的未完成的作业
+     * @param nfc
+     * @return
+     */
+    IsJobTicketLock getLockJobByBfc(String nfc, Long ticketId);
 }

+ 96 - 22
ktg-iscs/src/main/java/com/ktg/iscs/service/impl/HardwareApiServiceImpl.java

@@ -370,12 +370,26 @@ public class HardwareApiServiceImpl implements HardwareApiService {
         Assert.notNull(isHardware, "该序列号无对应的硬件信息!");
         // 2.开始更新归还信息
         if (dto.getTicketId() != null) {
-            // 2.1登陆后归还
-            iIsJobTicketLockService.update(Wrappers.<IsJobTicketLock>lambdaUpdate()
-                    .eq(IsJobTicketLock::getTicketId, dto.getTicketId())
-                    .eq(IsJobTicketLock::getLockId, lock.getLockId())
-                    .set(IsJobTicketLock::getToHardwareId, isHardware.getId())
-                    .set(IsJobTicketLock::getLockStatus, LockStatusEnum.RETURN_LOCK.status));
+            // 2.1登陆后归还, 判断钥匙在哪个阶段,根据不同阶段更新不一样
+            Integer lockStateByNfc = getLockStateByNfc(dto.getLockNfc(), dto.getTicketId());
+            if (lockStateByNfc.equals(0)) {
+                // 0-上锁未取钥匙(可锁-需更改还锁逻辑)
+                iIsJobTicketLockService.update(Wrappers.<IsJobTicketLock>lambdaUpdate()
+                        .eq(IsJobTicketLock::getTicketId, dto.getTicketId())
+                        .eq(IsJobTicketLock::getLockId, lock.getLockId())
+                        .set(IsJobTicketLock::getLockId, null)
+                        .set(IsJobTicketLock::getFromHardwareId, null)
+                        .set(IsJobTicketLock::getLockStatus, LockStatusEnum.WAIT_TAKE.status));
+            } else if (lockStateByNfc.equals(1)) {
+                // 1-上锁取了钥匙(不可锁)
+                return true;
+            } else {
+                iIsJobTicketLockService.update(Wrappers.<IsJobTicketLock>lambdaUpdate()
+                        .eq(IsJobTicketLock::getTicketId, dto.getTicketId())
+                        .eq(IsJobTicketLock::getLockId, lock.getLockId())
+                        .set(IsJobTicketLock::getToHardwareId, isHardware.getId())
+                        .set(IsJobTicketLock::getLockStatus, LockStatusEnum.RETURN_LOCK.status));
+            }
         } else {
             // 2.2不登陆状态下归还
             // 查一下哪个作业票用了这个挂锁,而且还没有完成
@@ -386,11 +400,26 @@ public class HardwareApiServiceImpl implements HardwareApiService {
                 log.error("当前挂锁未找到关联的作业票, nfc: {}, name : {}", dto.getLockNfc(), lock.getLockName());
                 return null;
             } else if (jobTicketLockList.size() == 1) {
-                // 说明找到的就是
-                iIsJobTicketLockService.update(Wrappers.<IsJobTicketLock>lambdaUpdate()
-                        .eq(IsJobTicketLock::getLockId, lock.getLockId())
-                        .set(IsJobTicketLock::getToHardwareId, isHardware.getId())
-                        .set(IsJobTicketLock::getLockStatus, LockStatusEnum.RETURN_LOCK.status));
+                // 2.1登陆后归还, 判断钥匙在哪个阶段,根据不同阶段更新不一样
+                Integer lockStateByNfc = getLockStateByNfc(dto.getLockNfc(), jobTicketLockList.get(0).getTicketId());
+                if (lockStateByNfc.equals(0)) {
+                    // 0-上锁未取钥匙(可锁-需更改还锁逻辑)
+                    iIsJobTicketLockService.update(Wrappers.<IsJobTicketLock>lambdaUpdate()
+                            .eq(IsJobTicketLock::getTicketId, dto.getTicketId())
+                            .eq(IsJobTicketLock::getLockId, lock.getLockId())
+                            .set(IsJobTicketLock::getLockId, null)
+                            .set(IsJobTicketLock::getFromHardwareId, null)
+                            .set(IsJobTicketLock::getLockStatus, LockStatusEnum.WAIT_TAKE.status));
+                } else if (lockStateByNfc.equals(1)) {
+                    // 1-上锁取了钥匙(不可锁)
+                    return true;
+                } else {
+                    // 说明找到的就是
+                    iIsJobTicketLockService.update(Wrappers.<IsJobTicketLock>lambdaUpdate()
+                            .eq(IsJobTicketLock::getLockId, lock.getLockId())
+                            .set(IsJobTicketLock::getToHardwareId, isHardware.getId())
+                            .set(IsJobTicketLock::getLockStatus, LockStatusEnum.RETURN_LOCK.status));
+                }
             } else {
                 // 出现了多条对应
                 log.error("当前挂锁找到多条关联的作业票, nfc: {}, name : {}", dto.getLockNfc(), lock.getLockName());
@@ -556,11 +585,11 @@ public class HardwareApiServiceImpl implements HardwareApiService {
 
     /**
      * 需要增加上锁还钥匙的时候锁的验证
-     *       1)、强制共享锁,交叉点位的锁rfid还钥匙时必须相同
-     *       2)、强制多锁,交叉点位的锁rfid还钥匙时必须不同
-     *       3)、非强制共享锁,交叉点位的锁rfid还钥匙时可相同
-     *
-     *       上锁后还钥匙
+     * 1)、强制共享锁,交叉点位的锁rfid还钥匙时必须相同
+     * 2)、强制多锁,交叉点位的锁rfid还钥匙时必须不同
+     * 3)、非强制共享锁,交叉点位的锁rfid还钥匙时可相同
+     * <p>
+     * 上锁后还钥匙
      */
     private void checkBeforeLockKeyBack(String type, IsIsolationPoint point, IsLock lock) {
         if (type.equals("1")) {
@@ -839,13 +868,13 @@ public class HardwareApiServiceImpl implements HardwareApiService {
                     }
                 }
             }*/
-            // 查找点位相同并且用了同一个锁没有解锁的作业点位(存在虚拟锁的冲突点位)
-            for (JobTicketPointsVO jobTicketPointsVO : ticketPointsVOList) {
-                List<IsJobTicketPoints> virtualLockConflictPoint = iIsJobTicketPointsService.getVirtualLockConflictPoint(jobTicketPointsVO.getPointId(), jobTicketPointsVO.getLockId(), jobTicketPointsVO.getTicketId());
-                if (!virtualLockConflictPoint.isEmpty()) {
-                    noUnlockTicketPointsVOSet.add(jobTicketPointsVO);
-                }
+        // 查找点位相同并且用了同一个锁没有解锁的作业点位(存在虚拟锁的冲突点位)
+        for (JobTicketPointsVO jobTicketPointsVO : ticketPointsVOList) {
+            List<IsJobTicketPoints> virtualLockConflictPoint = iIsJobTicketPointsService.getVirtualLockConflictPoint(jobTicketPointsVO.getPointId(), jobTicketPointsVO.getLockId(), jobTicketPointsVO.getTicketId());
+            if (!virtualLockConflictPoint.isEmpty()) {
+                noUnlockTicketPointsVOSet.add(jobTicketPointsVO);
             }
+        }
         // }
 
         // 8.组装数据
@@ -1168,4 +1197,49 @@ public class HardwareApiServiceImpl implements HardwareApiService {
         }
         return false;
     }
+
+    /**
+     * 判断挂锁关联作业处于哪个阶段 0-上锁未取钥匙(可锁-需更改还锁逻辑) 1-上锁取了钥匙(不可锁) 2-上锁归还了钥匙(可锁) 3-解锁取了钥匙(可锁) 4-解锁归还了钥匙(可锁) 5-和作业无关(可锁)
+     *
+     * @param nfc
+     * @return
+     */
+    @Override
+    public Integer getLockStateByNfc(String nfc, Long ticketId) {
+        Assert.notBlank(nfc, "该锁nfc不能为空!");
+        // 查询当前锁是否存在
+        IsLock lock = iIsLockService.getOne(Wrappers.<IsLock>lambdaQuery()
+                .eq(IsLock::getLockNfc, nfc));
+        Assert.isFalse(lock == null, nfc + "对应的挂锁数据不存在!");
+        // 查询这个挂锁有没有不是完成或者取消的作业,然后判断作业能不能
+        IsJobTicketLock lockJobByBfc = iIsJobTicketLockService.getLockJobByBfc(nfc, ticketId);
+        if (lockJobByBfc != null) {
+            // 判断作业到了什么阶段
+            // 获取上锁时钥匙的最新一条数据
+            IsJobTicketKey lockLast = iIsJobTicketKeyService.getOne(Wrappers.<IsJobTicketKey>lambdaQuery()
+                    .eq(IsJobTicketKey::getTicketId, lockJobByBfc.getTicketId())
+                    .eq(IsJobTicketKey::getTicketType, 0)
+                    .orderByDesc(IsJobTicketKey::getRecordId)
+                    .last("limit 1"));
+            // 获取解锁时钥匙的最新一条数据
+            IsJobTicketKey unlockLast = iIsJobTicketKeyService.getOne(Wrappers.<IsJobTicketKey>lambdaQuery()
+                    .eq(IsJobTicketKey::getTicketId, lockJobByBfc.getTicketId())
+                    .eq(IsJobTicketKey::getTicketType, 1)
+                    .orderByDesc(IsJobTicketKey::getRecordId)
+                    .last("limit 1"));
+            // 判断阶段
+            if (lockLast.getKeyStatus().equals("0")) {
+                return 0;
+            } else if (lockLast.getKeyStatus().equals("1")) {
+                return 1;
+            } else if (lockLast.getKeyStatus().equals("2") &&  unlockLast.getKeyStatus().equals("0")) {
+                return 2;
+            } else if (unlockLast.getKeyStatus().equals("1")) {
+                return 3;
+            } else if (unlockLast.getKeyStatus().equals("2")) {
+                return 4;
+            }
+        }
+        return 5;
+    }
 }

+ 5 - 0
ktg-iscs/src/main/java/com/ktg/iscs/service/impl/IsJobTicketLockServiceImpl.java

@@ -110,4 +110,9 @@ public class IsJobTicketLockServiceImpl extends ServiceImpl<IsJobTicketLockMappe
     public List<JobTicketLockVO> getTicketLockByTicketId(Long ticketId) {
         return isJobTicketLockMapper.getTicketLockByTicketId(ticketId);
     }
+
+    @Override
+    public IsJobTicketLock getLockJobByBfc(String nfc, Long ticketId) {
+        return isJobTicketLockMapper.getLockJobByBfc(nfc, ticketId);
+    }
 }

+ 16 - 0
ktg-iscs/src/main/resources/mapper/IsJobTicketLockMapper.xml

@@ -109,4 +109,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             left join is_lock l on l.lock_id = j.lock_id
         where j.ticket_id = #{ticketId}
     </select>
+    <select id="getLockJobByBfc" resultType="com.ktg.iscs.domain.IsJobTicketLock">
+        SELECT tl.*
+        FROM is_job_ticket_lock tl
+                 LEFT JOIN is_lock l on l.lock_id = tl.lock_id
+                 LEFT JOIN is_job_ticket j ON j.ticket_id = tl.ticket_id
+        <where>
+            j.ticket_status != 5
+            AND j.ticket_status != 6
+            AND l.lock_nfc = #{nfc}
+            <if test="ticketId != null">
+                AND tl.ticket_id = #{ticketId}
+            </if>
+        </where>
+        order by tl.record_id desc
+        limit 1
+    </select>
 </mapper>