From 4e6d844962ae71bfa593de96e68bae5628ad5ffa Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期六, 22 六月 2024 12:50:03 +0800
Subject: [PATCH] #

---
 zy-asrs-flow/src/pages/deviceConfig/basConveyorSta/components/edit.jsx                 |    7 
 zy-asrs-flow/src/pages/deviceConfig/basConveyorSta/index.jsx                           |   13 +
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/entity/BasConveyorSta.java              |    6 
 zy-asrs-flow/src/pages/device/conveyor/index.less                                      |   15 +
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/model/protocol/StaProtocol.java          |    1 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/ConveyorWebSocket.java                |  171 +++++++++++++++++
 zy-asrs-flow/src/pages/device/conveyor/index.jsx                                       |  242 ++++++++++++++++++++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ConveyorOperatorParam.java |   23 ++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasConveyorController.java   |   65 ++++++
 9 files changed, 539 insertions(+), 4 deletions(-)

diff --git a/zy-asrs-flow/src/pages/device/conveyor/index.jsx b/zy-asrs-flow/src/pages/device/conveyor/index.jsx
new file mode 100644
index 0000000..8c902d8
--- /dev/null
+++ b/zy-asrs-flow/src/pages/device/conveyor/index.jsx
@@ -0,0 +1,242 @@
+import React, { useEffect, useRef, useState } from "react";
+import { getToken } from '@/utils/token-util'
+import Http from '@/utils/http';
+import { Badge, Button, Descriptions, Drawer, Input, Card, Select, message } from 'antd';
+import {
+    PageContainer,
+} from '@ant-design/pro-components';
+import './index.less'
+import { WEBSOCKET_BASE_URL } from '@/config/setting';
+
+const Main = () => {
+    const [deviceInfos, setDeviceInfos] = useState([]);
+    const [ws, setWs] = useState(null);
+    const [openOpera, setOpenOpera] = useState(false);
+    const [currentData, setCurrentData] = useState(null);
+    const [taskNo, setTaskNo] = useState(null);
+    const [staNo, setStaNo] = useState(null);
+
+    useEffect(() => {
+        console.log('yes');
+        connect();
+
+        return () => {
+            if (ws) {
+                ws.close();
+            }
+        }
+    }, [])
+
+    useEffect(() => {
+        console.log('yes');
+        if (ws) {
+            ws.onopen = function () {
+                console.log("open");
+
+                sendWs(JSON.stringify({
+                    "url": "login",
+                    "data": {
+                        "token": getToken()
+                    }
+                }))
+            }
+
+            ws.onmessage = function (e) {
+                const result = JSON.parse(e.data);
+                if (result.url == "login") {
+                    setInterval(function () {
+                        getDeviceInfo();
+                    }, 1000)
+                } else if (result.url == "/conveyor/list") {
+                    const data = JSON.parse(result.data);
+                    setDeviceInfos(data);
+                }
+            }
+
+            ws.onclose = function (e) {
+                console.log("close");
+                reconnect();
+            }
+
+            ws.onerror = function (e) {
+                console.log(e);
+            }
+        }
+    }, [ws]);
+
+    const connect = () => {
+        var newWs = new WebSocket(WEBSOCKET_BASE_URL + "/ws/conveyor/websocket");
+        setWs(newWs);
+    }
+
+    const reconnect = () => {
+        setTimeout(() => {
+            console.log('WebSocketClient: Attempting to reconnect...');
+            connect();
+        }, 3000);
+    }
+
+    const sendWs = (message) => {
+        if (ws.readyState == WebSocket.OPEN) {
+            ws.send(message)
+        }
+    }
+
+    const getDeviceInfo = () => {
+        sendWs(JSON.stringify({
+            "url": "/conveyor/list",
+            "data": {}
+        }))
+    }
+
+    const showOpera = (data) => {
+        setOpenOpera(true);
+        setCurrentData(data);
+
+        setTaskNo(data.taskNo);
+        setStaNo(data.staNo);
+    };
+
+    const closeOpera = () => {
+        setOpenOpera(false);
+    };
+
+    const taskNoChange = (e) => {
+        setTaskNo(e.target.value)
+    }
+
+    const staNoChange = (e) => {
+        setStaNo(e.target.value)
+    }
+
+    const conveyorOperator = async (type) => {
+        try {
+            const resp = await Http.doPost('api/basConveyor/operator/sta', {
+                conveyorNo: currentData.conveyorNo,
+                siteNo: currentData.siteNo,
+                taskMode: type,
+                taskNo: taskNo,
+                staNo: staNo
+            });
+            if (resp.code === 200) {
+                message.success("璇锋眰鎴愬姛");
+                return true;
+            } else {
+                message.warning(resp.msg);
+                return false;
+            }
+        } catch (error) {
+            message.warning("璇锋眰澶辫触");
+            return false;
+        }
+    }
+
+    let codeContent = (<PageContainer
+        header={{
+            breadcrumb: {},
+        }}
+    >
+        <div style={{ display: 'flex', flexWrap: 'wrap', justifyContent: 'space-around' }}>
+            {deviceInfos.map(item => {
+                if (item == null) {
+                    return;
+                }
+                let tmpTitle = item.siteNo + "绔�"
+                let tmpData = [
+                    {
+                        key: '1',
+                        label: '浠诲姟鍙�',
+                        children: item.taskNo,
+                    },
+                    {
+                        key: '2',
+                        label: '鑷姩',
+                        children: item.autoing,
+                    },
+                    {
+                        key: '3',
+                        label: '鏈夌墿',
+                        children: item.loading,
+                    },
+                    {
+                        key: '4',
+                        label: '鍙叆',
+                        children: item.inEnable,
+                    },
+                    {
+                        key: '5',
+                        label: '鍙嚭',
+                        children: item.outEnable,
+                    },
+                    {
+                        key: '6',
+                        label: '鑳藉叆',
+                        children: item.canining,
+                    },
+                    {
+                        key: '7',
+                        label: '鑳藉嚭',
+                        children: item.canouting,
+                    },
+                    {
+                        key: '8',
+                        label: '楂樹綆绫诲瀷',
+                        children: item.locType1$,
+                    },
+                    {
+                        key: '9',
+                        label: '瀹界獎绫诲瀷',
+                        children: item.locType2$,
+                    },
+                    {
+                        key: '10',
+                        label: '杞婚噸绫诲瀷',
+                        children: item.locType3$,
+                    },
+                    {
+                        key: '11',
+                        label: '宸ヤ綔妯″紡',
+                        children: item.workMode$,
+                    },
+                    {
+                        key: '12',
+                        label: '鐩爣绔�',
+                        children: item.staNo,
+                    },
+                ];
+                return <div key={item.id} style={{ width: '45%', marginBottom: '30px' }}>
+                    <div style={{ marginBottom: '10px' }}>
+                        <span style={{ marginRight: '10px' }}>{tmpTitle}</span>
+                        <Button type="primary" onClick={() => showOpera(item)}>鎿嶄綔</Button>
+                    </div>
+                    <Descriptions size="small" bordered items={tmpData} />
+                </div>
+            })}
+        </div>
+    </PageContainer>);
+
+    if (currentData) {
+        codeContent = (
+            <>
+                {codeContent}
+                <Drawer title="鎿嶄綔闈㈡澘" onClose={closeOpera} open={openOpera}>
+                    <h2 style={{ marginBottom: '15px' }}>{currentData.siteNo}绔�</h2>
+
+                    <div style={{ marginBottom: '15px' }}>
+                        <Card title="鐩稿叧鎸囦护" style={{ width: 300 }}>
+                            <div className="commandItem">
+                                <Input value={taskNo} addonBefore="宸ヤ綔鍙�" onChange={taskNoChange} />
+                                <Input value={staNo} addonBefore="鐩爣绔�" onChange={staNoChange} />
+                                <Button type="primary" onClick={() => conveyorOperator('taskNoAndStaNo')}>淇濆瓨</Button>
+                            </div>
+                        </Card>
+                    </div>
+                </Drawer>
+            </>
+        )
+    }
+
+    return (codeContent);
+}
+
+export default Main;
\ No newline at end of file
diff --git a/zy-asrs-flow/src/pages/device/conveyor/index.less b/zy-asrs-flow/src/pages/device/conveyor/index.less
new file mode 100644
index 0000000..d70f38a
--- /dev/null
+++ b/zy-asrs-flow/src/pages/device/conveyor/index.less
@@ -0,0 +1,15 @@
+.commandItem {
+    display: flex;
+    justify-content: space-between;
+    flex-wrap: wrap;
+}
+
+.commandItem > Button {
+    width: 120px;
+    margin-bottom: 10px;
+}
+
+.commandItem > div {
+    width: 120px;
+    margin-bottom: 10px;
+}
\ No newline at end of file
diff --git a/zy-asrs-flow/src/pages/deviceConfig/basConveyorSta/components/edit.jsx b/zy-asrs-flow/src/pages/deviceConfig/basConveyorSta/components/edit.jsx
index 886f8d0..3cbbfa0 100644
--- a/zy-asrs-flow/src/pages/deviceConfig/basConveyorSta/components/edit.jsx
+++ b/zy-asrs-flow/src/pages/deviceConfig/basConveyorSta/components/edit.jsx
@@ -223,6 +223,13 @@
                             colProps={{ md: 12, xl: 12 }}
                         />
                     </ProForm.Group>
+                    <ProForm.Group>
+                        <ProFormText
+                            name="staNo"
+                            label="鐩爣绔�"
+                            colProps={{ md: 12, xl: 12 }}
+                        />
+                    </ProForm.Group>
 
                 </ProForm>
             </Modal>
diff --git a/zy-asrs-flow/src/pages/deviceConfig/basConveyorSta/index.jsx b/zy-asrs-flow/src/pages/deviceConfig/basConveyorSta/index.jsx
index 9fb2b63..35e04a0 100644
--- a/zy-asrs-flow/src/pages/deviceConfig/basConveyorSta/index.jsx
+++ b/zy-asrs-flow/src/pages/deviceConfig/basConveyorSta/index.jsx
@@ -407,6 +407,19 @@
                 setSearchParam={setSearchParam}
             />,
         },
+        {
+            title: '鐩爣绔�',
+            dataIndex: 'staNo',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <TextFilter
+                name='staNo'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
 
         {
             title: '鎿嶄綔',
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasConveyorController.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasConveyorController.java
index 1de4108..d3b99ec 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasConveyorController.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasConveyorController.java
@@ -8,19 +8,35 @@
 import com.zy.asrs.wcs.common.domain.BaseParam;
 import com.zy.asrs.wcs.common.domain.KeyValVo;
 import com.zy.asrs.wcs.common.domain.PageParam;
+import com.zy.asrs.wcs.core.domain.param.ConveyorOperatorParam;
+import com.zy.asrs.wcs.core.domain.param.ShuttleOperatorParam;
 import com.zy.asrs.wcs.core.entity.BasConveyor;
+import com.zy.asrs.wcs.core.entity.Motion;
+import com.zy.asrs.wcs.core.entity.Task;
+import com.zy.asrs.wcs.core.entity.TaskCtg;
+import com.zy.asrs.wcs.core.model.enums.DeviceCtgType;
+import com.zy.asrs.wcs.core.model.enums.TaskCtgType;
+import com.zy.asrs.wcs.core.model.enums.TaskStsType;
 import com.zy.asrs.wcs.core.service.BasConveyorService;
+import com.zy.asrs.wcs.core.utils.Utils;
+import com.zy.asrs.wcs.rcs.News;
+import com.zy.asrs.wcs.rcs.cache.SlaveConnection;
+import com.zy.asrs.wcs.rcs.entity.Device;
+import com.zy.asrs.wcs.rcs.model.enums.LiftProtocolStatusType;
+import com.zy.asrs.wcs.rcs.model.enums.SlaveType;
+import com.zy.asrs.wcs.rcs.service.DeviceService;
+import com.zy.asrs.wcs.rcs.thread.DevpThread;
+import com.zy.asrs.wcs.rcs.thread.LiftThread;
+import com.zy.asrs.wcs.rcs.thread.ShuttleThread;
 import com.zy.asrs.wcs.system.controller.BaseController;
 import com.zy.asrs.wcs.utils.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @RestController
 @RequestMapping("/api")
@@ -28,6 +44,8 @@
 
     @Autowired
     private BasConveyorService basConveyorService;
+    @Autowired
+    private DeviceService deviceService;
 
     @PreAuthorize("hasAuthority('core:basConveyor:list')")
     @PostMapping("/basConveyor/page")
@@ -99,4 +117,43 @@
         ExcelUtil.build(ExcelUtil.create(basConveyorService.list(), BasConveyor.class), response);
     }
 
+    //鎵嬪姩鎿嶄綔
+    @PreAuthorize("hasAuthority('core:basConveyor:operator')")
+    @PostMapping("/basConveyor/operator/sta")
+    @Transactional
+    public synchronized R conveyorOperator(@RequestBody ConveyorOperatorParam param) {
+        if (Cools.isEmpty(param.getConveyorNo(), param.getTaskMode())) {
+            return R.error("鍙傛暟涓虹┖");
+        }
+
+        Integer conveyorNo = param.getConveyorNo();
+
+        Device device = deviceService.getOne(new LambdaQueryWrapper<Device>()
+                .eq(Device::getDeviceType, DeviceCtgType.CONVEYOR.val())
+                .eq(Device::getStatus, 1)
+                .eq(Device::getDeviceNo, conveyorNo));
+        if (device == null) {
+            return R.error("璁惧涓嶅瓨鍦�");
+        }
+
+        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, device.getId().intValue());
+        if (devpThread == null) {
+            return R.error("璁惧绂荤嚎");
+        }
+
+        if (param.getTaskMode().equals("taskNoAndStaNo")) {
+            //鍐欏叆宸ヤ綔鍙峰拰鐩爣绔�
+            if (Cools.isEmpty(param.getSiteNo())) {
+                return R.error("绔欑偣涓嶅瓨鍦�");
+            }
+
+            boolean result = devpThread.writeWorkSta(param.getSiteNo(), Short.parseShort(param.getTaskNo()), param.getStaNo().shortValue());
+            if (!result) {
+                return R.error("淇濆瓨澶辫触");
+            }
+            return R.ok("淇濆瓨鎴愬姛");
+        }
+        return R.ok();
+    }
+
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ConveyorOperatorParam.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ConveyorOperatorParam.java
new file mode 100644
index 0000000..a83dde5
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ConveyorOperatorParam.java
@@ -0,0 +1,23 @@
+package com.zy.asrs.wcs.core.domain.param;
+
+import lombok.Data;
+
+@Data
+public class ConveyorOperatorParam {
+
+    // 杈撻�佺嚎鍙�
+    private Integer conveyorNo;
+
+    // 绔欑偣鍙�
+    private Integer siteNo;
+
+    // 鍛戒护绫诲瀷
+    private String taskMode;
+
+    // 宸ヤ綔鍙�
+    private String taskNo;
+
+    // 鐩爣绔�
+    private Integer staNo;
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/entity/BasConveyorSta.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/entity/BasConveyorSta.java
index b16abef..4629b03 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/entity/BasConveyorSta.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/entity/BasConveyorSta.java
@@ -179,6 +179,12 @@
     @ApiModelProperty(value= "宸ヤ綔妯″紡")
     private Integer workMode;
 
+    /**
+     * 鐩爣绔�
+     */
+    @ApiModelProperty(value= "鐩爣绔�")
+    private Integer staNo;
+
     public BasConveyorSta() {}
 
     public BasConveyorSta(Long conveyorId,Integer conveyorNo,Long updateBy,Long createBy,Date createTime,Date updateTime,String memo,Integer deleted,Long hostId,Integer siteNo,String inEnable,String outEnable,String autoing,String loading,String canining,String canouting,Integer locType1,Integer locType2,Integer locType3,String locNo,String qrCodeValue) {
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/model/protocol/StaProtocol.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/model/protocol/StaProtocol.java
index c1a8775..3af0a8a 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/model/protocol/StaProtocol.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/model/protocol/StaProtocol.java
@@ -92,6 +92,7 @@
         station.setInEnable(inEnable?"Y":"N");
         station.setOutEnable(outEnable?"Y":"N");
         station.setWorkMode(workMode);
+        station.setStaNo((int) staNo);
         station.setLocType1(0);  // 楂樹綆绫诲瀷{0:鏈煡,1:浣庡簱浣�,2:楂樺簱浣峿
         station.setLocType2(0);  // 瀹界獎绫诲瀷{0:鏈煡,1:绐勫簱浣�,2:瀹藉簱浣峿
         station.setLocType3(0);  // 杞婚噸绫诲瀷{0:鏈煡,1:杞诲簱浣�,2:閲嶅簱浣峿
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/ConveyorWebSocket.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/ConveyorWebSocket.java
new file mode 100644
index 0000000..ae3c263
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/ConveyorWebSocket.java
@@ -0,0 +1,171 @@
+package com.zy.asrs.wcs.rcs.ws;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.zy.asrs.framework.common.R;
+import com.zy.asrs.framework.common.SpringUtils;
+import com.zy.asrs.wcs.common.config.ConfigProperties;
+import com.zy.asrs.wcs.common.security.JwtSubject;
+import com.zy.asrs.wcs.core.entity.BasConveyorSta;
+import com.zy.asrs.wcs.core.service.BasConveyorStaService;
+import com.zy.asrs.wcs.rcs.ws.model.WebSocketMessage;
+import com.zy.asrs.wcs.utils.JwtUtil;
+import io.jsonwebtoken.Claims;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+
+import javax.websocket.*;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+@Component
+@Slf4j
+@Service
+@ServerEndpoint("/ws/conveyor/websocket")
+@Data
+public class ConveyorWebSocket {
+
+    //瀹㈡埛绔湪绾夸汉鏁�
+    private static int onlineClient = 0;
+
+    //瀹㈡埛绔睜
+    private static CopyOnWriteArraySet<ConveyorWebSocket> webSocketServers = new CopyOnWriteArraySet<>();
+
+    private Session session;
+
+    private String username;
+
+    private Long hostId;
+
+    //绠¢亾ID
+    private String sessionId;
+
+    @OnOpen
+    public void onOpen(Session session) {
+        this.session = session;
+        this.sessionId = session.getId();
+
+        //灏唚ebsocket瀵硅薄杩涜淇濆瓨
+        webSocketServers.add(this);
+        //娣诲姞鍦ㄧ嚎浜烘暟
+        addOnlineClient();
+        log.info("鏈夋柊绐楀彛寮�濮嬬洃鍚�:" + session.getId() + ",褰撳墠鍦ㄧ嚎浜烘暟涓�:" + getOnlineClient());
+    }
+
+    /**
+     * 杩炴帴鍏抽棴璋冪敤鐨勬柟娉�
+     */
+    @OnClose
+    public void onClose() {
+        webSocketServers.remove(this);  //浠巗et涓垹闄�
+        subOnlineClient();           //鍦ㄧ嚎鏁板噺1
+        log.info("鍏抽棴鐨勮繛鎺ワ細" + sessionId);
+        log.info("鏈変竴杩炴帴鍏抽棴锛佸綋鍓嶅湪绾夸汉鏁颁负" + getOnlineClient());
+    }
+
+    /**
+     * 鏀跺埌瀹㈡埛绔秷鎭悗璋冪敤鐨勬柟娉�
+     * @ Param message 瀹㈡埛绔彂閫佽繃鏉ョ殑娑堟伅
+     */
+    @OnMessage
+    public void onMessage(String message, Session session) throws IOException {
+        BasConveyorStaService basConveyorStaService = SpringUtils.getBean(BasConveyorStaService.class);
+        WebSocketMessage socketMessage = JSON.parseObject(message, WebSocketMessage.class);
+        if (socketMessage.getUrl().equals("login")) {
+            try {
+                // 瑙f瀽token
+                ConfigProperties configProperties = SpringUtils.getBean(ConfigProperties.class);
+                JSONObject data = JSON.parseObject(socketMessage.getData());
+                Claims claims = JwtUtil.parseToken(data.getString("token"), configProperties.getTokenKey());
+                JwtSubject jwtSubject = JwtUtil.getJwtSubject(claims);
+                this.username = jwtSubject.getUsername();
+                this.hostId = jwtSubject.getHostId();
+                socketMessage.setData(JSON.toJSONString(R.ok("auth success")));
+            } catch (Exception e) {
+                e.printStackTrace();
+                socketMessage.setData(JSON.toJSONString(R.error("auth fail")));
+            }
+            this.sendMessage(JSON.toJSONString(socketMessage));
+        } else if (socketMessage.getUrl().equals("/conveyor/list")) {
+            if (this.hostId != null) {
+                // 鏍规嵁杈撻�佺嚎plc閬嶅巻
+                List<BasConveyorSta> list = basConveyorStaService.list();
+                socketMessage.setData(JSON.toJSONString(list));
+                this.sendMessage(JSON.toJSONString(socketMessage));
+            }
+        }
+//        log.info("鏀跺埌鏉ヨ嚜杩炴帴锛�" + sessionId + "鐨勪俊鎭�:" + message);
+    }
+
+    /**
+     * @ Param session
+     * @ Param error
+     */
+    @OnError
+    public void onError(Session session, Throwable error) {
+        log.error("鍙戠敓閿欒");
+        error.printStackTrace();
+    }
+
+    /**
+     * 瀹炵幇鏈嶅姟鍣ㄤ富鍔ㄦ帹閫�
+     */
+    public void sendMessage(String message) throws IOException {
+        this.session.getBasicRemote().sendText(message);
+    }
+
+    /**
+     * 鏈嶅姟鍣ㄤ富鍔ㄦ帹閫佺粰鎸囧畾鐢ㄦ埛
+     */
+    public void sendMessage(String message, String account) throws IOException {
+        for (ConveyorWebSocket item : webSocketServers) {
+            item.sendMessage(message);
+        }
+    }
+
+    public void sendMessage(String message, int userId) throws IOException {
+        for (ConveyorWebSocket item : webSocketServers) {
+            item.sendMessage(message);
+        }
+    }
+
+    /**
+     * 鏈嶅姟鍣ㄤ富鍔ㄦ帹閫佺粰鎸囧畾鐢ㄦ埛
+     */
+    public static boolean sendMessageGlobal(String message, String account) throws IOException {
+        boolean tag = false;
+        for (ConveyorWebSocket item : webSocketServers) {
+            tag = true;
+            item.sendMessage(message);
+        }
+        return tag;
+    }
+
+    public static boolean sendMessageGlobal(String message, int userId) throws IOException {
+        boolean tag = false;
+        for (ConveyorWebSocket item : webSocketServers) {
+            tag = true;
+            item.sendMessage(message);
+        }
+        return tag;
+    }
+
+    public static synchronized int getOnlineClient() {
+        return onlineClient;
+    }
+
+    public static synchronized void addOnlineClient() {
+        ConveyorWebSocket.onlineClient++;
+    }
+
+    public static synchronized void subOnlineClient() {
+        if (ConveyorWebSocket.onlineClient > 0) {
+            ConveyorWebSocket.onlineClient--;
+        }
+    }
+
+}

--
Gitblit v1.9.1