ソースを参照

2022-12-21 逃生线路计算修改,物联控制接口开发。

chaiyunlong 3 年 前
コミット
825bfe3154

+ 14 - 0
zd-api/zd-system-api/src/main/java/com/zd/system/api/vo/SysLogoConfigVO.java

@@ -33,6 +33,10 @@ public class SysLogoConfigVO extends BaseEntity
     @Excel(name = "长方形logo")
     @ApiModelProperty(value = "长方形logo")
     private String rectangleLogo;
+    /** 物联控制 1.实验室负责人,2.安全责任人,3.安全准入人员,4.白名单,-1.全部 */
+    @Excel(name = "物联控制 1.实验室负责人,2.安全责任人,3.安全准入人员,4.白名单,-1.全部")
+    @ApiModelProperty(value = "物联控制 1.实验室负责人,2.安全责任人,3.安全准入人员,4.白名单,-1.全部")
+    private String lotControl;
     /** 签到签出示意图 */
     @Excel(name = "签到签出示意图")
     @ApiModelProperty(value = "签到签出示意图")
@@ -89,6 +93,16 @@ public class SysLogoConfigVO extends BaseEntity
     {
         return rectangleLogo;
     }
+
+    public String getLotControl() {
+        return lotControl;
+    }
+
+    public void setLotControl(String lotControl) {
+        this.lotControl = lotControl;
+    }
+
+
     public void setSignMap(String signMap)
     {
         this.signMap = signMap;

+ 1 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabExitLineVertexController.java

@@ -116,6 +116,7 @@ public class LabExitLineVertexController extends BaseController {
     @PostMapping("/endEvacuation")
     @ApiOperation(value = "结束疏散")
     public ResultData endEvacuation(@RequestBody LabExitLineEvacuationVo labExitLineEvacuationVo) {
+        new Thread(()->labExitLineVertexService.endEvacuation(labExitLineEvacuationVo)).start();
         //todo 结束疏散清空redis,以及下发通知
         redisService.deleteObject("exitLineBy"+labExitLineEvacuationVo.getBuildId()+""+labExitLineEvacuationVo.getFloorId());
         //todo 下发前端页面通知

+ 17 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/onemachine/controller/OneMachineController.java

@@ -397,4 +397,21 @@ public class OneMachineController extends BaseController {
     }
 
 
+    @ApiOperation("物联签到验证")
+    @GetMapping("/{subId}/LotInCheck/{username}")
+    public ResultData checkLot(@PathVariable("username") String username, @PathVariable("subId") Long subId, HttpServletRequest request) {
+        //获取指定用户信息
+        // 查询用户信息
+        R<SysUser> userResult = getSysUserR(username);
+
+        //验证用户账户状态
+        SysUser sysUser = userResult.getData();
+        if(sysUser.getStatus()==null || !sysUser.getStatus().equals("0")){
+            throw new ServiceException("用户:" + username + " 账户停用,请联系管理员");
+        }
+        oneMachineService.checkLotControl(subId,sysUser.getUserId());
+        //签证前置信息
+        return ResultData.success();
+    }
+
 }

+ 73 - 1
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/onemachine/service/OneMachineService.java

@@ -17,6 +17,7 @@ import com.zd.laboratory.domain.dto.LabViolationDTO;
 import com.zd.laboratory.domain.vo.*;
 import com.zd.laboratory.mapper.LabHardwareStateMapper;
 import com.zd.laboratory.mapper.LabSubjectAccessRecordMapper;
+import com.zd.laboratory.mapper.LabSubjectMapper;
 import com.zd.laboratory.mapper.LabSubjectSecurityconfigureMapper;
 import com.zd.laboratory.mqtt.service.impl.SubMessageSendManager;
 import com.zd.laboratory.onemachine.domain.SignInPerInfoVO;
@@ -25,6 +26,7 @@ import com.zd.laboratory.onemachine.domain.SingInUser;
 import com.zd.laboratory.onemachine.domain.SingInViolation;
 import com.zd.laboratory.service.*;
 import com.zd.model.constant.BaseConstants;
+import com.zd.model.constant.HttpStatus;
 import com.zd.model.constant.UserConstants;
 import com.zd.model.domain.R;
 import com.zd.model.domain.ResultData;
@@ -32,6 +34,7 @@ import com.zd.model.entity.SysUser;
 import com.zd.model.enums.SignEnum;
 import com.zd.system.api.entity.LabStudentsInfo;
 import com.zd.system.api.feign.RemoteUserService;
+import com.zd.system.api.vo.SysLogoConfigVO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -102,7 +105,13 @@ public class OneMachineService implements ValidationSignInPerInfo {
     @Autowired
     private ILabBuildFloorLayoutService labBuildFloorLayoutService;
 
-    private Map<SignEnum, Function<SignInfoVO, SignInPerInfoVO>> validMap;
+    @Autowired
+    private RemoteUserService remoteUserService;
+
+    @Autowired
+    private LabSubjectMapper labSubjectMapper;
+
+        private Map<SignEnum, Function<SignInfoVO, SignInPerInfoVO>> validMap;
 
     @PostConstruct
     public void initValid() {
@@ -588,4 +597,67 @@ public class OneMachineService implements ValidationSignInPerInfo {
     public List<SysUser> querySubOnlineUser(Map<String, Object> params) {
         return hardwareStateMapper.querySubOnlineUserByOnepc(params);
     }
+
+    public void checkLotControl(Long subId,Long userId){
+        //获取一体机logo图片信息
+        R<SysLogoConfigVO> configLogoResult = remoteUserService.getConfigLogo();
+        if (HttpStatus.SUCCESS == configLogoResult.getCode()) {
+            SysLogoConfigVO sysLogoConfig = configLogoResult.getData();
+            Boolean checkFlag = true;
+            if(sysLogoConfig.getLotControl()!=null && !"".equals(sysLogoConfig.getLotControl()) && !"-1".equals(sysLogoConfig.getLotControl())){
+                checkFlag = false;
+                String[] los = sysLogoConfig.getLotControl().split(",");
+                for(int i=0;i<los.length;i++){
+                    String lo = los[i];
+                    if("1".equals(lo)){
+                        //todo 实验室负责人
+                        LabSubject labSubject = labSubjectMapper.selectLabSubjectById(subId);
+                        if(StringUtils.isNotNull(labSubject)){
+                            if(userId.longValue() == labSubject.getAdminId().longValue()){
+                                checkFlag = true;
+                                break;
+                            }
+                        }
+                    }else if("2".equals(lo)){
+                        //todo 实验室负责人
+                        LabSubject labSubject = labSubjectMapper.selectLabSubjectById(subId);
+                        if(StringUtils.isNotNull(labSubject)){
+                            String[] safeUsers = labSubject.getSafeUserId().split(",");
+                            for(int s=0;s<safeUsers.length;s++){
+                                if(safeUsers[s].equals(userId+"")){
+                                    checkFlag = true;
+                                    break;
+                                }
+                            }
+                        }
+                    }else if("3".equals(lo)){
+                        //todo 安全准入人员
+                        //1 获取验证安全准入凭证
+                        LabSecurityApplyVO labSecurityApply = new LabSecurityApplyVO();
+                        labSecurityApply.setSubjectId(subId);
+                        labSecurityApply.setUserId(userId);
+                        labSecurityApply.setAuditStatus(2);
+                        List<LabSecurityApplyVO> listapply= iLabSecurityApplyService.selectLabSecurityApplyList(labSecurityApply);
+                        if(listapply.size()>0){
+                            checkFlag = true;
+                            break;
+                        }
+                    }else if("4".equals(lo)){
+                        //todo 白名单
+                        LabWhitelistVO labWhitelistVO = new LabWhitelistVO();
+                        labWhitelistVO.setUserId(userId);
+                        labWhitelistVO.setSubId(subId);
+                        List<LabWhitelist> list = iLabWhitelistService.selectLabWhiteJoinSubList(labWhitelistVO);
+                        if(list.size()>0){
+                            checkFlag = true;
+                            break;
+                        }
+                    }
+                }
+                if(!checkFlag){
+                    throw new ServiceException("未授权,无法操作!!");
+                }
+            }
+        }
+    }
 }

+ 8 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabExitLineVertexService.java

@@ -53,6 +53,14 @@ public interface ILabExitLineVertexService
     public Map<String,Object> executeEvacuation(LabExitLineEvacuationVo labExitLineEvacuationVo);
 
     /**
+     * 结束逃生线路主
+     *
+     * @param labExitLineEvacuationVo 逃生线路主主键
+     */
+    public void endEvacuation(LabExitLineEvacuationVo labExitLineEvacuationVo);
+
+
+    /**
      * 新增逃生线路主
      *
      * @param lineVertexVo 逃生线路主

+ 46 - 2
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabExitLineVertexServiceImpl.java

@@ -1,11 +1,16 @@
 package com.zd.laboratory.service.impl;
 
 import cn.hutool.core.date.StopWatch;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.alibaba.fastjson.parser.Feature;
 import com.alibaba.nacos.shaded.org.checkerframework.checker.nullness.Opt;
 import com.zd.algorithm.api.speaker.entity.ParamVo;
 import com.zd.algorithm.api.speaker.entity.PlayVo;
 import com.zd.algorithm.api.speaker.feign.RemoteSpeakService;
+import com.zd.common.core.redis.RedisService;
 import com.zd.common.core.utils.DateUtils;
 import com.zd.common.core.utils.SaveUtil;
 import com.zd.common.core.utils.SecurityUtils;
@@ -158,9 +163,11 @@ public class LabExitLineVertexServiceImpl implements ILabExitLineVertexService {
                         .filter(b->b.equals(a.getKey()))
                         .forEach(b->{
                             //调用坏点计算
-                            badPoints(newRelationalData, a.getPointName());
                             if(a.getKey().equals(floorLayoutVo.getPointName())){
+                                badPoints(newRelationalData, a.getPointName());
                                 labExitLineEvacuationVo.setStartPointName(a.getPointName());
+                            }else{
+                                crossPoints(newRelationalData, a.getPointName());
                             }
                         }));
 
@@ -181,7 +188,7 @@ public class LabExitLineVertexServiceImpl implements ILabExitLineVertexService {
                                 .filter(b->b.equals(a.getKey()))
                                 .forEach(b->{
                                     //调用坏点计算
-                                    badPoints(newRelationalData, a.getPointName());
+                                    crossPoints(newRelationalData, a.getPointName());
                                 }));
                 ArrayList <Integer[][]> oldList = flody(oldRelationalData);
                 //计算楼层各个实验室的逃生线路
@@ -194,6 +201,30 @@ public class LabExitLineVertexServiceImpl implements ILabExitLineVertexService {
         return null;
     }
 
+    @Override
+    public void endEvacuation(LabExitLineEvacuationVo labExitLineEvacuationVo) {
+        LabExitPointRelay exitPointRelay = new LabExitPointRelay();
+        exitPointRelay.setBuildId(labExitLineEvacuationVo.getBuildId());
+        exitPointRelay.setFloorId(labExitLineEvacuationVo.getFloorId());
+        List <LabExitPointRelay> labExitPointRelays = labExitPointRelayMapper.selectLabExitPointRelayList(exitPointRelay);
+        //todo  开启继电器开关
+        for(LabExitPointRelay relay : labExitPointRelays) {
+            try {
+                if (relay.getRelayType().intValue() == 1) {
+                    //这里打卡继电器的开关(老继电器)
+                    socketService.sendCommand(Symbol.order.control, relay.getRelayCode(), Symbol.command.close, relay.getRelayBit());
+                    Thread.sleep(timeWaitConfigUtils.getWaitTime());
+                } else {
+                    //这里打卡继电器的开关(新继电器)
+                    socketService.sendMqttCommand(relay.getRelayCode(), Symbol.command.close, relay.getRelayBit() + "");
+                    Thread.sleep(timeWaitConfigUtils.getWaitTime());
+                }
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
     //todo 计算坏点(目前只有发生预案的实验室需要标记为坏点),需要把非坏点关联坏点点位全部改成无限大
     public void badPoints(List <LabExitLineJoinPointVO> newRelationalData, String badPointName) {
         //这里计算预案发生的实验室坏点
@@ -207,6 +238,19 @@ public class LabExitLineVertexServiceImpl implements ILabExitLineVertexService {
                 );
     }
 
+    //todo 计算坏点(目前只有发生预案的实验室需要标记为坏点),需要把非坏点关联坏点点位全部改成无限大
+    public void crossPoints(List <LabExitLineJoinPointVO> newRelationalData, String badPointName) {
+        //这里计算预案发生的实验室坏点
+        Optional.ofNullable(newRelationalData).orElseGet(Collections::emptyList)
+                .parallelStream()
+                .filter(a -> !a.getPointName().equals(badPointName))
+                .forEach(a -> Optional.ofNullable(a.getPointVOList()).orElseGet(Collections::emptyList)
+                        .stream()
+                        .filter(b -> b.getPointName().equals(badPointName))
+                        .forEach(b -> b.setPointAttribute(5))
+                );
+    }
+
     //todo  计算完成的路线,灯的数据
     public Map <String, Object> displayPath(ArrayList <Integer[][]> list, List <LabExitLineJoinPointVO> linePointVOList, LabExitLineEvacuationVo labExitLineEvacuationVo, ArrayList <Integer[][]> oldList, List <LabExitLineJoinPointVO> oldRelationalData) {
 

+ 12 - 0
zd-modules/zd-modules-system/src/main/java/com/zd/system/domain/SysLogoConfig.java

@@ -33,6 +33,10 @@ public class SysLogoConfig extends BaseEntity
     @Excel(name = "长方形logo")
     @ApiModelProperty(value = "长方形logo")
     private String rectangleLogo;
+    /** 物联控制 1.实验室负责人,2.安全责任人,3.安全准入人员,4.白名单,-1.全部 */
+    @Excel(name = "物联控制 1.实验室负责人,2.安全责任人,3.安全准入人员,4.白名单,-1.全部")
+    @ApiModelProperty(value = "物联控制 1.实验室负责人,2.安全责任人,3.安全准入人员,4.白名单,-1.全部")
+    private String lotControl;
     /** 签到签出示意图 */
     @Excel(name = "签到签出示意图")
     @ApiModelProperty(value = "签到签出示意图")
@@ -97,6 +101,14 @@ public class SysLogoConfig extends BaseEntity
         this.rectangleLogo = rectangleLogo;
     }
 
+    public String getLotControl() {
+        return lotControl;
+    }
+
+    public void setLotControl(String lotControl) {
+        this.lotControl = lotControl;
+    }
+
     public String getRectangleLogo()
     {
         return rectangleLogo;

+ 8 - 2
zd-modules/zd-modules-system/src/main/resources/mapper/system/SysLogoConfigMapper.xml

@@ -9,6 +9,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="schoolName" column="school_name"/>
         <result property="circularLogo" column="circular_logo"/>
         <result property="rectangleLogo" column="rectangle_logo"/>
+        <result property="lotControl" column="lot_control"/>
         <result property="signMap" column="sign_map"/>
         <result property="videoCover" column="video_cover"/>
         <result property="operationGuide" column="operation_guide"/>
@@ -21,12 +22,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectSysLogoConfigVo">
-        select id, school_name, circular_logo, rectangle_logo, sign_map, video_cover, operation_guide, login_banner, homepage_banner,user_type,smart_lock,
+        select id, school_name, circular_logo, rectangle_logo, lot_control, sign_map, video_cover, operation_guide, login_banner, homepage_banner,user_type,smart_lock,
             air_bottle
         from sys_logo_config
     </sql>
     <sql id="selectSysLogoConfigListVo">
-        select t.id, t.school_name, t.circular_logo, t.rectangle_logo, t.sign_map, t.video_cover, t.operation_guide, t.login_banner, t.homepage_banner,t.user_type from sys_logo_config as t
+        select t.id, t.school_name, t.circular_logo, t.rectangle_logo, t.lot_control, t.sign_map, t.video_cover, t.operation_guide, t.login_banner, t.homepage_banner,t.user_type from sys_logo_config as t
     </sql>
     <select id="selectSysLogoConfigList" parameterType="com.zd.system.domain.SysLogoConfig" resultMap="SysLogoConfigResult">
         <include refid="selectSysLogoConfigVo"/>
@@ -34,6 +35,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="schoolName != null  and schoolName != ''"> and school_name like concat('%', #{schoolName}, '%')</if>
             <if test="circularLogo != null  and circularLogo != ''"> and circular_logo = #{circularLogo}</if>
             <if test="rectangleLogo != null  and rectangleLogo != ''"> and rectangle_logo = #{rectangleLogo}</if>
+            <if test="lotControl != null  and lotControl != ''"> and lot_control = #{lotControl}</if>
             <if test="signMap != null  and signMap != ''"> and sign_map = #{signMap}</if>
             <if test="videoCover != null  and videoCover != ''"> and video_cover = #{videoCover}</if>
             <if test="operationGuide != null  and operationGuide != ''"> and operation_guide = #{operationGuide}</if>
@@ -56,6 +58,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <if test="rectangleLogo != null">rectangle_logo,</if>
 
+    <if test="lotControl != null">lot_control,</if>
+
     <if test="signMap != null">sign_map,</if>
 
     <if test="videoCover != null">video_cover,</if>
@@ -76,6 +80,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <if test="schoolName != null">#{schoolName},</if>
     <if test="circularLogo != null">#{circularLogo},</if>
     <if test="rectangleLogo != null">#{rectangleLogo},</if>
+    <if test="lotControl != null">#{lotControl},</if>
     <if test="signMap != null">#{signMap},</if>
     <if test="videoCover != null">#{videoCover},</if>
     <if test="operationGuide != null">#{operationGuide},</if>
@@ -93,6 +98,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="schoolName != null">school_name = #{schoolName},</if>
             <if test="circularLogo != null">circular_logo = #{circularLogo},</if>
             <if test="rectangleLogo != null">rectangle_logo = #{rectangleLogo},</if>
+            <if test="lotControl != null">lot_control = #{lotControl},</if>
             <if test="signMap != null">sign_map = #{signMap},</if>
             <if test="videoCover != null">video_cover = #{videoCover},</if>
             <if test="operationGuide != null">operation_guide = #{operationGuide},</if>