From feb9933a4640c0d02eace5a9a3ade4a8a33890ea Mon Sep 17 00:00:00 2001
From: lty <876263681@qq.com>
Date: 星期二, 20 一月 2026 19:24:42 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/webSocketConfig/LedCommand.java      |   53 ++++
 src/main/java/com/zy/asrs/mapper/WrkDetlMapper.java            |    1 
 src/main/java/com/zy/asrs/service/impl/WrkDetlServiceImpl.java |    5 
 src/main/java/com/zy/common/web/WcsController.java             |   25 ++
 pom.xml                                                        |   10 
 src/main/java/com/zy/asrs/entity/param/MatDto.java             |   80 +++++++
 src/main/java/com/zy/asrs/webSocketConfig/WebSocketServer.java |  116 ++++++++++
 src/main/resources/mapper/WrkDetlMapper.xml                    |    3 
 src/main/java/com/zy/asrs/webSocketConfig/WebSocketConfig.java |   17 +
 src/main/java/com/zy/asrs/entity/TaskMsg.java                  |   26 ++
 src/main/java/com/zy/common/utils/RedisUtil.java               |   28 ++
 src/main/resources/application.yml                             |    8 
 src/main/java/com/zy/asrs/service/WrkDetlService.java          |    1 
 src/main/java/com/zy/asrs/webSocketConfig/LedWebsocket.java    |  285 +++++++++++++++++++++++++
 14 files changed, 651 insertions(+), 7 deletions(-)

diff --git a/pom.xml b/pom.xml
index 9524c69..8030344 100644
--- a/pom.xml
+++ b/pom.xml
@@ -112,8 +112,18 @@
             <artifactId>truelicense-core</artifactId>
             <version>1.33</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.26</version>
+        </dependency>
     </dependencies>
 
+
     <build>
         <finalName>ddthwms</finalName>
         <plugins>
diff --git a/src/main/java/com/zy/asrs/entity/TaskMsg.java b/src/main/java/com/zy/asrs/entity/TaskMsg.java
new file mode 100644
index 0000000..24ae62e
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/TaskMsg.java
@@ -0,0 +1,26 @@
+package com.zy.asrs.entity;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class TaskMsg {
+    /**
+     * 浠撳簱缂栫爜
+     */
+    @JsonProperty(value = "warehouse")
+    private String warehouse;
+
+    /**
+     * 搴撳彛缂栫爜
+     */
+    @JsonProperty(value = "portCode")
+    private String portCode;
+
+    /**
+     * 浠诲姟鍙�
+     *
+     */
+    @JsonProperty(value = "taskNo")
+    private String taskNo;
+}
diff --git a/src/main/java/com/zy/asrs/entity/param/MatDto.java b/src/main/java/com/zy/asrs/entity/param/MatDto.java
new file mode 100644
index 0000000..2dbe915
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/param/MatDto.java
@@ -0,0 +1,80 @@
+package com.zy.asrs.entity.param;
+
+import lombok.Data;
+
+/**
+ * Created by vincent on 2020/8/6
+ */
+@Data
+public class MatDto {
+
+    // 鐗╂枡缂栧彿
+    private String matnr;
+
+    // 鐗╂枡鍚嶇О
+    private String maknx;
+
+    private String batch;
+
+    private String specs;
+
+    // 瀹㈡埛淇℃伅
+    private String manu;
+
+    // 澶囨敞
+    private String memo;
+
+    // 鐗╂枡鏁伴噺
+    private Double count;
+
+    private Double total;
+
+    private String orderNo;
+
+    private String customer;
+
+    public MatDto() {
+    }
+    public MatDto(String matnr, String maknx, String batch, String specs, String manu, String memo, Double count, Double total) {
+        this.matnr = matnr;
+        this.maknx = maknx;
+        this.batch = batch;
+        this.specs = specs;
+        this.manu = manu;
+        this.memo = memo;
+        this.count = count;
+        this.total = total;
+    }
+
+    public MatDto(String matnr, String maknx, String batch, String specs, String manu, String memo, Double count, Double total, String orderNo, String customer) {
+        this.matnr = matnr;
+        this.maknx = maknx;
+        this.batch = batch;
+        this.specs = specs;
+        this.manu = manu;
+        this.memo = memo;
+        this.count = count;
+        this.total = total;
+        this.orderNo = orderNo;
+        this.customer = customer;
+    }
+
+    public MatDto(String matNo, String maknx, Double count) {
+        this.matnr = matNo;
+        this.maknx = maknx;
+        this.count = count;
+    }
+    public MatDto(String matNo, String maknx, Double count, String specs) {
+        this.specs = specs;
+        this.matnr = matNo;
+        this.maknx = maknx;
+        this.count = count;
+    }
+    public MatDto(String matNo, String maknx, Double count, Double total, String specs) {
+        this.specs = specs;
+        this.matnr = matNo;
+        this.maknx = maknx;
+        this.count = count;
+        this.total = total;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/mapper/WrkDetlMapper.java b/src/main/java/com/zy/asrs/mapper/WrkDetlMapper.java
index 291d977..023b7a9 100644
--- a/src/main/java/com/zy/asrs/mapper/WrkDetlMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/WrkDetlMapper.java
@@ -28,6 +28,7 @@
     List<WrkDetl> selectPakoutQuery(@Param("staNo")Integer staNo, @Param("matnr")String matnr);
 
     List<WrkDetl> selectAndLogByOrderNoGroupByMatnrOfSum(String orderNo);
+    List<WrkDetl> findByWorkNo(Integer workNo);
 
     int updateIoTime(@Param("workNo") Integer workNo, @Param("ioTime") Date ioTime);
 
diff --git a/src/main/java/com/zy/asrs/service/WrkDetlService.java b/src/main/java/com/zy/asrs/service/WrkDetlService.java
index 5997bcb..e643794 100644
--- a/src/main/java/com/zy/asrs/service/WrkDetlService.java
+++ b/src/main/java/com/zy/asrs/service/WrkDetlService.java
@@ -27,6 +27,7 @@
     List<WrkDetl> selectAndLogByOrderNoGroupByMatnrOfSum(String orderNo);
 
     boolean updateIoTime(Integer workNo, Date ioTime);
+    List<WrkDetl> findByWorkNo(Integer wrkNo);
 
 
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/WrkDetlServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WrkDetlServiceImpl.java
index 1c5eaf5..84d033a 100644
--- a/src/main/java/com/zy/asrs/service/impl/WrkDetlServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WrkDetlServiceImpl.java
@@ -89,7 +89,10 @@
     public List<WrkDetl> selectAndLogByOrderNoGroupByMatnrOfSum(String orderNo) {
         return this.baseMapper.selectAndLogByOrderNoGroupByMatnrOfSum(orderNo);
     }
-
+    @Override
+    public List<WrkDetl> findByWorkNo(Integer workNo) {
+        return this.baseMapper.findByWorkNo(workNo);
+    }
     @Override
     public boolean updateIoTime(Integer workNo, Date ioTime) {
         return this.baseMapper.updateIoTime(workNo, ioTime) > 0;
diff --git a/src/main/java/com/zy/asrs/webSocketConfig/LedCommand.java b/src/main/java/com/zy/asrs/webSocketConfig/LedCommand.java
new file mode 100644
index 0000000..1460d39
--- /dev/null
+++ b/src/main/java/com/zy/asrs/webSocketConfig/LedCommand.java
@@ -0,0 +1,53 @@
+package com.zy.asrs.webSocketConfig;
+
+import com.core.common.Cools;
+import com.zy.asrs.entity.param.MatDto;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * led鍛戒护鎶ユ枃
+ * Created by vincent on 2020/8/11
+ */
+@Data
+public class LedCommand extends Object {
+
+    private String title;
+
+    private Integer workNo;
+
+    private Integer staNo;
+
+    private Integer sourceStaNo;
+
+    private String locNo;
+
+    private String sourceLocNo;
+
+    private List<MatDto> matDtos = new ArrayList<>();
+
+    private boolean emptyMk = false;
+
+    private Integer ioType;
+    private String barcode;
+
+    @Override
+    public String toString() {
+        StringBuffer s = new StringBuffer();
+        s.append("宸ヤ綔鍙穂" + this.workNo + "]\n");
+        s.append("宸ヤ綔绫诲瀷[" + this.title + "]\n");
+        if (!Cools.isEmpty(this.barcode)) {
+            s.append("鎵樼洏鐮乕" + this.barcode + "]\n");
+        }
+        if (!this.emptyMk){
+
+            for (MatDto matDto : matDtos) {
+                s.append("[鍟嗗搧缂栫爜:" + matDto.getMatnr() + ", 鏁伴噺:" + matDto.getCount() + "]\n");
+            }
+        }
+
+        return s.toString();
+    }
+}
diff --git a/src/main/java/com/zy/asrs/webSocketConfig/LedWebsocket.java b/src/main/java/com/zy/asrs/webSocketConfig/LedWebsocket.java
new file mode 100644
index 0000000..951ffaf
--- /dev/null
+++ b/src/main/java/com/zy/asrs/webSocketConfig/LedWebsocket.java
@@ -0,0 +1,285 @@
+package com.zy.asrs.webSocketConfig;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.common.Arith;
+import com.core.common.Cools;
+import com.core.exception.CoolException;
+import com.zy.asrs.entity.WorkChartAxis;
+import com.zy.asrs.entity.LocChartPie;
+import com.zy.asrs.entity.*;
+import com.zy.asrs.entity.param.MatDto;
+import com.zy.asrs.mapper.ReportQueryMapper;
+import com.zy.asrs.service.*;
+import com.zy.common.service.CommonService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Component
+@Slf4j
+public class LedWebsocket {
+
+    private static final String[] WEEK = {"鏄熸湡鏃�","鏄熸湡涓�","鏄熸湡浜�","鏄熸湡涓�","鏄熸湡鍥�","鏄熸湡浜�","鏄熸湡鍏�"};
+
+    @Autowired
+    private ReportQueryMapper reportQueryMapper;
+    @Autowired
+    private WebSocketServer webSocketServer;
+    @Autowired
+    private LocDetlService locDetlService;
+    @Autowired
+    private BasDevpService basDevpService;
+    @Autowired
+    private WrkMastService wrkMastService;
+    @Autowired
+    private WrkDetlService wrkDetlService;
+    @Autowired
+    private OrderDetlService orderDetlService;
+    @Value("${led.id}")
+    private String ledId;
+
+    @Scheduled(cron = "0/2 * * * * ? ")
+    private void send() {
+
+        //楗煎浘
+        List<Map<String, Object>> pie = new ArrayList<>();
+        LocChartPie locUseRate = reportQueryMapper.getLocUseRate();
+        if(locUseRate!=null) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("name", "鍦ㄥ簱");
+            map.put("value", locUseRate.getFqty());
+            pie.add(map);
+
+            Map<String, Object> map1 = new HashMap<>();
+            map1.put("name", "绌�");
+            map1.put("value", locUseRate.getOqty());
+            pie.add(map1);
+
+            Map<String, Object> map2 = new HashMap<>();
+            map2.put("name", "浣跨敤");
+            map2.put("value", locUseRate.getUqty());
+            pie.add(map2);
+
+            Map<String, Object> map3 = new HashMap<>();
+            map3.put("name", "绂佺敤");
+            map3.put("value", locUseRate.getXqty());
+            pie.add(map3);
+        }
+        // 鎬诲簱浣嶆暟
+        Integer total = (int) Arith.add(0, locUseRate.getFqty(), locUseRate.getOqty(), locUseRate.getUqty(), locUseRate.getXqty());
+        // 浣跨敤涓�
+        Integer used = locUseRate.getFqty() + locUseRate.getUqty();
+        // 搴撲綅浣跨敤鐜�
+        double usedDivides = Arith.divides(3, used, total);
+        double usedPr = Arith.multiplys(1, usedDivides, 100);
+
+        //鎶樼嚎鍥�
+        Map<String,Object> map=new HashMap<String, Object>();
+        List<AxisBean> list = new ArrayList<AxisBean>();
+        List<WorkChartAxis> listChart = reportQueryMapper.getChartAxis();
+
+        if(listChart!=null) {
+            ArrayList<Integer> data1 = new ArrayList<Integer>();
+            ArrayList<Integer> data2 = new ArrayList<Integer>();
+
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
+            Calendar calendar = Calendar.getInstance();
+            calendar.add(Calendar.DATE, -12);
+            for(int i=0;i<12;i++) {
+                boolean flag = true;
+                calendar.add(Calendar.DATE, 1);
+                String str = sf.format(calendar.getTime());
+                for(WorkChartAxis workChart : listChart) {
+                    if(str.equals(workChart.getYmd())) {
+                        data1.add(workChart.getInqty());
+                        data2.add(workChart.getOutqty());
+                        flag = false;
+                        break;
+                    }
+                }
+                if(flag) {
+                    data1.add(0);
+                    data2.add(0);
+                }
+            }
+            AxisBean inqty = new AxisBean();
+            inqty.setName("鍏ュ簱鏁伴噺");
+            Integer[] array1 = new Integer[data1.size()];
+            inqty.setData(data1.toArray(array1));
+            list.add(inqty);
+            AxisBean outqty = new AxisBean();
+            outqty.setName("鍑哄簱鏁伴噺");
+            Integer[] array2 = new Integer[data2.size()];
+            outqty.setData(data2.toArray(array2));
+            list.add(outqty);
+        }
+        //浠撳簱鏁版嵁
+        EntityWrapper<LocDetl> locDetlEntityWrapper = new EntityWrapper<>();
+        locDetlEntityWrapper.setSqlSelect("TOP 5 matnr,SUM(anfme) as matnrCount").groupBy("matnr").orderBy("matnrCount",false);
+        List<Map<String, Object>>  selectMap = locDetlService.selectMaps(locDetlEntityWrapper);
+
+        Date now = new Date();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(now);
+//         Map<String, Object> map = new HashMap<>();
+         map.put("to","all");
+         map.put("message", Cools.add("type", "default").add("pie", pie)
+                 .add("stockCunt", locUseRate.getFqty())
+                 .add("emptyCount", locUseRate.getOqty())
+                 .add("noneCount", locUseRate.getXqty())
+                 .add("total", total)
+                 .add("used", used)
+                 .add("usedPr", usedPr)
+                 .add("rows",list)
+                 .add("year", calendar.get(Calendar.YEAR))
+                 .add("month", CommonService.zerofill(String.valueOf(calendar.get(Calendar.MONTH)+1), 2))
+                 .add("day", CommonService.zerofill(String.valueOf(calendar.get(Calendar.DATE)), 2))
+                 .add("hour", CommonService.zerofill(String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)), 2))
+                 .add("minute", CommonService.zerofill(String.valueOf(calendar.get(Calendar.MINUTE)), 2))
+                 .add("second", CommonService.zerofill(String.valueOf(calendar.get(Calendar.SECOND)) , 2))
+                 .add("week", WEEK[calendar.get(Calendar.DAY_OF_WEEK)-1])
+                 .add("inventoryData",selectMap));
+        webSocketServer.onMessage(JSONObject.toJSONString(map),null,"all");
+
+    }
+
+    @Scheduled(cron = "0/2 * * * * ? ")
+    private void ErrorSend(){
+        Map<String,Object> map=new HashMap<>();
+        map.put("to",ledId);
+        BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", ledId).eq("dev_mk","N"));
+        if (basDevp == null ){
+            return;
+        }
+        map.put("message",Cools.add("type", "error").add("errMsg",basDevp.getDecDesc()));
+        webSocketServer.onMessage(JSONObject.toJSONString(map),null,ledId);
+    }
+
+
+    @Scheduled(cron = "0/2 * * * * ? ")
+    private void TaskSend(){
+        Map<String,Object> map=new HashMap<>();
+        map.put("to",ledId);
+        BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", ledId).eq("dev_mk","Y"));
+        if (basDevp == null ){
+            return;
+        }
+        if (basDevp.getDevMk().equals("O")){
+            basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", 1001));
+        }
+
+
+        List<LedCommand> commandList = new ArrayList<>();
+
+        if (basDevp.getWrkNo() != 0 && basDevp.getLoading().equals("Y")){
+            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", basDevp.getWrkNo()));
+            if (null != wrkMast){
+                commandList = getCommandList(basDevp.getWrkNo().toString());
+            }
+        }
+        map.put("message",Cools.add("type", "task").add("taskList",commandList));
+        webSocketServer.onMessage(JSONObject.toJSONString(map),null,ledId);
+    }
+
+    public List<LedCommand> getCommandList(String taskNo){
+        List<LedCommand> commands = new ArrayList<>();
+        // 宸ヤ綔妗i泦鍚�
+        List<WrkMast> wrkMasts = new ArrayList<>();
+        // 鑾峰彇宸ヤ綔妗f暟鎹�
+        WrkMast wrkMast = wrkMastService.selectById(taskNo);
+        if (null == wrkMast) { return null; }
+        wrkMasts.add(wrkMast);
+        // 缁勮鍛戒护
+        LedCommand ledCommand = new LedCommand();
+        ledCommand.setWorkNo(wrkMast.getWrkNo());
+        ledCommand.setIoType(wrkMast.getIoType());
+        wrkMasts.add(wrkMast);
+        // 鍑哄簱妯″紡
+        switch (wrkMast.getIoType()) {
+            case 1:
+                ledCommand.setTitle("鍏ㄦ澘鍏ュ簱");
+                break;
+            case 10:
+                ledCommand.setTitle("绌烘澘鍏ュ簱");
+                break;
+            case 101:
+                ledCommand.setTitle("鍏ㄦ澘鍑哄簱");
+                break;
+            case 103:
+                ledCommand.setTitle("鎷f枡鍑哄簱");
+                break;
+            case 104:
+                ledCommand.setTitle("骞舵澘鍑哄簱");
+                break;
+            case 107:
+                ledCommand.setTitle("鐩樼偣鍑哄簱");
+                break;
+            case 110:
+                ledCommand.setTitle("绌烘澘鍑哄簱");
+                ledCommand.setEmptyMk(true);
+                break;
+            default:
+                break;
+        }
+        ledCommand.setSourceLocNo(wrkMast.getSourceLocNo());
+        ledCommand.setStaNo(wrkMast.getStaNo());
+        ledCommand.setBarcode(wrkMast.getBarcode());
+        if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) {
+            List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo());
+
+            wrkDetls.forEach(wrkDetl -> {
+                Double total = 0.0;
+                EntityWrapper<LocDetl> wrapper = new EntityWrapper<>();
+                LocDetl locDetl = locDetlService.selectOne(wrapper.eq("zpallet", wrkDetl.getZpallet()).eq("matnr", wrkDetl.getMatnr()));
+                if (Cools.isEmpty(locDetl)) {
+                    total = wrkDetl.getAnfme();
+                } else {
+                    total = locDetl.getAnfme();
+                }
+                if (!Cools.isEmpty(wrkDetl.getOrderNo())){
+                    OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper<OrderDetl>().eq("order_no", wrkDetl.getOrderNo())
+                            .eq("matnr", wrkDetl.getMatnr()).eq("batch", wrkDetl.getBatch()));
+                    if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 1) {
+                        ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total,orderDetl.getSuppCode(),orderDetl.getSku()));
+                    }
+                    if (wrkMast.getIoType() == 103 && (null == wrkDetl.getInspect() || 0 == wrkDetl.getInspect())) {
+                        ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total,orderDetl.getSuppCode(),orderDetl.getSku()));
+                    }
+                    if (wrkMast.getIoType() == 107 || wrkMast.getIoType() == 104) {
+                        ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total,orderDetl.getSuppCode(),orderDetl.getSku()));
+                    }
+                }else {
+                    if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 1) {
+                        ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total));
+                    }
+                    if (wrkMast.getIoType() == 103 && (null == wrkDetl.getInspect() || 0 == wrkDetl.getInspect())) {
+                        ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total));
+                    }
+                    if (wrkMast.getIoType() == 107 || wrkMast.getIoType() == 104) {
+                        ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total));
+                    }
+                }
+            });
+        }
+        commands.add(ledCommand);
+
+        Set<Integer> workNos = wrkMasts.stream().map(WrkMast::getWrkNo).collect(Collectors.toSet());
+        // 淇敼涓绘。led鏍囪
+        for (WrkMast wrkMast1 : wrkMasts) {
+            wrkMast1.setOveMk("Y");
+            wrkMast1.setModiTime(new Date());
+            if (!wrkMastService.update(wrkMast1,new EntityWrapper<WrkMast>().eq("wrk_No",wrkMast1.getWrkNo()))) {
+                throw new CoolException("鏇存柊宸ヤ綔妗eけ璐�");
+            }
+        }
+
+        return commands;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/webSocketConfig/WebSocketConfig.java b/src/main/java/com/zy/asrs/webSocketConfig/WebSocketConfig.java
new file mode 100644
index 0000000..12bc36d
--- /dev/null
+++ b/src/main/java/com/zy/asrs/webSocketConfig/WebSocketConfig.java
@@ -0,0 +1,17 @@
+package com.zy.asrs.webSocketConfig;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+@Configuration
+public class WebSocketConfig {
+    /**
+     * 娉ㄥ叆涓�涓猄erverEndpointExporter,璇ean浼氳嚜鍔ㄦ敞鍐屼娇鐢ˊServerEndpoint娉ㄨВ鐢虫槑鐨剋ebsocket endpoint
+     */
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+}
+
diff --git a/src/main/java/com/zy/asrs/webSocketConfig/WebSocketServer.java b/src/main/java/com/zy/asrs/webSocketConfig/WebSocketServer.java
new file mode 100644
index 0000000..ee8f75e
--- /dev/null
+++ b/src/main/java/com/zy/asrs/webSocketConfig/WebSocketServer.java
@@ -0,0 +1,116 @@
+package com.zy.asrs.webSocketConfig;
+
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@ServerEndpoint(value = "/led/{username}")
+@Component
+@Service
+public class WebSocketServer {
+    private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);
+    /**
+     * 璁板綍褰撳墠鍦ㄧ嚎杩炴帴鏁�
+     */
+    public static final Map<String, Session> sessionMap = new ConcurrentHashMap<>();
+    /**
+     * 杩炴帴寤虹珛鎴愬姛璋冪敤鐨勬柟娉�
+     */
+    @OnOpen
+    public void onOpen(Session session, @PathParam("username") String username) {
+        sessionMap.put(username, session);
+        log.info("鏈夋柊鐢ㄦ埛鍔犲叆锛寀sername={}, 褰撳墠鍦ㄧ嚎浜烘暟涓猴細{}", username, sessionMap.size());
+        JSONObject result = new JSONObject();
+        JSONArray array = new JSONArray();
+        result.set("users", array);
+        for (Object key : sessionMap.keySet()) {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.set("username", key);
+            // {"username", "zhang", "username": "admin"}
+            array.add(jsonObject);
+        }
+//        {"users": [{"username": "zhang"},{ "username": "admin"}]}
+        sendAllMessage(JSONUtil.toJsonStr(result));  // 鍚庡彴鍙戦�佹秷鎭粰鎵�鏈夌殑瀹㈡埛绔�
+    }
+    /**
+     * 杩炴帴鍏抽棴璋冪敤鐨勬柟娉�
+     */
+    @OnClose
+    public void onClose(Session session, @PathParam("username") String username) {
+        sessionMap.remove(username);
+        log.info("鏈変竴杩炴帴鍏抽棴锛岀Щ闄sername={}鐨勭敤鎴穝ession, 褰撳墠鍦ㄧ嚎浜烘暟涓猴細{}", username, sessionMap.size());
+    }
+    /**
+     * 鏀跺埌瀹㈡埛绔秷鎭悗璋冪敤鐨勬柟娉�
+     * 鍚庡彴鏀跺埌瀹㈡埛绔彂閫佽繃鏉ョ殑娑堟伅
+     * onMessage 鏄竴涓秷鎭殑涓浆绔�
+     * 鎺ュ彈 娴忚鍣ㄧ socket.send 鍙戦�佽繃鏉ョ殑 json鏁版嵁
+     * @param message 瀹㈡埛绔彂閫佽繃鏉ョ殑娑堟伅
+     */
+    @OnMessage
+    public void onMessage(String message, Session session, @PathParam("username") String username) {
+//        log.info("鏈嶅姟绔敹鍒扮敤鎴穟sername={}鐨勬秷鎭�:{}", username, message);
+        JSONObject obj = JSONUtil.parseObj(message);
+        String toUsername = obj.getStr("to"); // to琛ㄧず鍙戦�佺粰鍝釜鐢ㄦ埛锛屾瘮濡� admin
+        String text = obj.getStr("message"); // 鍙戦�佺殑娑堟伅鏂囨湰  hello
+        // {"to": "admin", "text": "鑱婂ぉ鏂囨湰"}
+        if ("heartBeat".equals(toUsername)) {
+            log.info("蹇冭烦");
+        }else if ("all".equals(toUsername)) {
+            sendAllMessage(text);
+        }else {
+            Session toSession = sessionMap.get(toUsername); // 鏍规嵁 to鐢ㄦ埛鍚嶆潵鑾峰彇 session锛屽啀閫氳繃session鍙戦�佹秷鎭枃鏈�
+            if (toSession != null) {
+                // 鏈嶅姟鍣ㄧ 鍐嶆妸娑堟伅缁勮涓�涓嬶紝缁勮鍚庣殑娑堟伅鍖呭惈鍙戦�佷汉鍜屽彂閫佺殑鏂囨湰鍐呭
+                // {"from": "zhang", "text": "hello"}
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.set("from", username);  // from 鏄� zhang
+                jsonObject.set("text", text);  // text 鍚屼笂闈㈢殑text
+                this.sendMessage(text, toSession);
+//            log.info("鍙戦�佺粰鐢ㄦ埛username={}锛屾秷鎭細{}", toUsername, jsonObject.toString());
+            } else {
+//                log.info("鍙戦�佸け璐ワ紝鏈壘鍒扮敤鎴穟sername={}鐨剆ession", toUsername);
+            }
+        }
+
+    }
+    @OnError
+    public void onError(Session session, Throwable error) {
+        log.error("鍙戠敓閿欒");
+        error.printStackTrace();
+    }
+    /**
+     * 鏈嶅姟绔彂閫佹秷鎭粰瀹㈡埛绔�
+     */
+    private void sendMessage(String message, Session toSession) {
+        try {
+//            log.info("鏈嶅姟绔粰瀹㈡埛绔痆{}]鍙戦�佹秷鎭瘂}", toSession.getId(), message);
+            toSession.getBasicRemote().sendText(message);
+        } catch (Exception e) {
+            log.error("鏈嶅姟绔彂閫佹秷鎭粰瀹㈡埛绔け璐�", e);
+        }
+    }
+    /**
+     * 鏈嶅姟绔彂閫佹秷鎭粰鎵�鏈夊鎴风
+     */
+    private void sendAllMessage(String message) {
+        try {
+            for (Session session : sessionMap.values()) {
+//                log.info("鏈嶅姟绔粰瀹㈡埛绔痆{}]鍙戦�佹秷鎭瘂}", session.getId(), message);
+                session.getBasicRemote().sendText(message);
+            }
+        } catch (Exception e) {
+            log.error("鏈嶅姟绔彂閫佹秷鎭粰瀹㈡埛绔け璐�", e);
+        }
+    }
+}
diff --git a/src/main/java/com/zy/common/utils/RedisUtil.java b/src/main/java/com/zy/common/utils/RedisUtil.java
index b2df114..dd3e607 100644
--- a/src/main/java/com/zy/common/utils/RedisUtil.java
+++ b/src/main/java/com/zy/common/utils/RedisUtil.java
@@ -2,8 +2,10 @@
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -13,13 +15,16 @@
  * redisTemplate灏佽
  *
  */
-//@Component
+@Component
 public class RedisUtil {
 
-    @Autowired
-    private RedisTemplate<String, Object> redisTemplate;
+//    @Autowired
+//    private RedisTemplate<String, Object> redisTemplate;
 
-    public RedisUtil(RedisTemplate<String, Object> redisTemplate) {
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+    public RedisUtil(RedisTemplate redisTemplate) {
         this.redisTemplate = redisTemplate;
     }
 
@@ -96,6 +101,21 @@
     }
 
     /**
+     * 鑾峰彇鍏ㄩ儴鏁版嵁
+     * @return
+     */
+    public HashMap<Object, Object> getRedis() {
+        Set<String> keys = redisTemplate.keys("*");
+        HashMap<Object, Object> map = new HashMap<>();
+        for (String key : keys) {
+            Object value = redisTemplate.opsForValue().get(key);
+            map.put(key, value);
+        }
+
+        return map;//杩斿洖鍏ㄩ儴鏁版嵁闆嗗悎
+    }
+
+    /**
      * 鏅�氱紦瀛樻斁鍏�
      *
      * @param key   閿�
diff --git a/src/main/java/com/zy/common/web/WcsController.java b/src/main/java/com/zy/common/web/WcsController.java
index 585814e..c4245cc 100644
--- a/src/main/java/com/zy/common/web/WcsController.java
+++ b/src/main/java/com/zy/common/web/WcsController.java
@@ -213,7 +213,30 @@
         if(!param.getWarehouse().equals(warehouse)){
             return Re.error("浠撳簱缂栧彿涓嶅尮閰�");
         }
-        return Re.ok();
+        BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", param.getPortCode()));
+        if(param.getErrorMsg()!=null){
+            basDevp.setDecDesc(param.getErrorMsg());
+            basDevp.setDevMk("N");
+        }
+        return Re.ok(basDevpService.updateById(basDevp));
+    }
+
+    @PostMapping("/fromwcs/taskReport")
+    @ResponseBody
+    public synchronized Re taskReport(@RequestBody TaskMsg param){
+        log.info("鏀跺埌WCS浠诲姟鍏ュ簱寮傚父涓婃姤===>>鍏ュ弬:{}",param);
+        if(Cools.isEmpty(param.getWarehouse())){
+            return Re.error("浠撳簱缂栧彿涓嶈兘涓虹┖");
+        }
+        if(!param.getWarehouse().equals(warehouse)){
+            return Re.error("浠撳簱缂栧彿涓嶅尮閰�");
+        }
+        BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", param.getPortCode()));
+        if(param.getTaskNo()!=null){
+            basDevp.setWrkNo(Integer.valueOf(param.getTaskNo()));
+            basDevp.setDevMk("Y");
+        }
+        return Re.ok(basDevpService.updateById(basDevp));
     }
 
     @PostMapping("/fromwcs/applyChangeEnd")
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 7284bbf..575e835 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -61,7 +61,7 @@
 #    {rowList: [8,9,10,11,12,13],minBay: 33,maxBay: 49},
   ]
   #鏄惁寮�鍚痺ms涓嬪彂浠诲姟缁檞cs
-  workIssued-fig : true
+  workIssued-fig : false
   #鍦板潃
   url : 10.10.10.122:8082
   #wms涓嬪彂浠诲姟缁檞cs
@@ -94,6 +94,12 @@
 comb:
   limit: 5000
 
+led:
+  ip: localhost
+  url: ddthwms
+  port: 8080
+  id: 1001
+
 #erp瀵规帴
 erp:
   #  寮�鍏�
diff --git a/src/main/resources/mapper/WrkDetlMapper.xml b/src/main/resources/mapper/WrkDetlMapper.xml
index 037f5ed..ff24668 100644
--- a/src/main/resources/mapper/WrkDetlMapper.xml
+++ b/src/main/resources/mapper/WrkDetlMapper.xml
@@ -130,5 +130,8 @@
         where 1=1
           and wrk_no = #{workNo}
     </update>
+    <select id="findByWorkNo" resultMap="BaseResultMap">
+        select wrk_no, matnr, maktx, anfme ,specs,batch from asr_wrk_detl where 1=1 and wrk_no = #{workNo}
+    </select>
 
 </mapper>

--
Gitblit v1.9.1