From b610e067cf2c44fdcc99ec3a3190820d1a5b7bcb Mon Sep 17 00:00:00 2001
From: zjj <zjj123456>
Date: 星期三, 10 一月 2024 16:55:56 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/ghtzwcsOld' into ghtzwcsOld

---
 src/main/java/com/zy/asrs/controller/MapController.java        |    1 
 src/main/java/com/zy/asrs/task/TaskLogScheduler.java           |    4 
 src/main/java/com/zy/asrs/controller/SiteController.java       |    2 
 src/main/java/com/zy/asrs/controller/LocMastController.java    |    4 
 src/main/java/com/zy/asrs/entity/TaskWrk.java                  |   15 
 src/main/webapp/views/realtimeWatch/crn2.html                  |   78 +-
 src/main/webapp/static/wms/js/saasLog/saasLog.js               |  252 ++++++++++
 src/main/webapp/views/commandManage/commandManage.html         |    2 
 src/main/webapp/views/realtimeWatch/console.html               |   29 +
 src/main/webapp/views/taskWrkLog/taskWrkLog.html               |    2 
 src/main/java/com/zy/core/model/protocol/StaProtocol.java      |    3 
 src/main/webapp/views/taskWrk/taskWrk.html                     |  133 ++++-
 src/main/webapp/views/saasLog/saasLog.html                     |  121 +++++
 src/main/java/com/zy/asrs/service/impl/SaasLogServiceImpl.java |   12 
 src/main/java/com/zy/asrs/entity/SaasLog.java                  |   97 ++++
 src/main/webapp/static/wcs/css/render.css                      |   58 ++
 src/main/java/com/zy/asrs/entity/LocMast.java                  |    8 
 src/main/java/com/zy/common/service/CommonService.java         |    8 
 src/main/java/com/zy/asrs/utils/SaasUtils.java                 |   22 
 src/main/java/com/zy/asrs/service/SaasLogService.java          |    8 
 src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java |    6 
 src/main/webapp/views/commandManageLog/commandManageLog.html   |    2 
 src/main/java/com/zy/asrs/domain/param/CrnOperatorParam.java   |    5 
 src/main/webapp/static/wcs/css/crn.css                         |    6 
 src/main/java/com/zy/asrs/entity/ViewLocMapDto.java            |    6 
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java    |    5 
 src/main/resources/mapper/SaasLogMapper.xml                    |   18 
 src/main/java/com/zy/asrs/controller/CrnController.java        |   88 +++
 src/main/java/com/zy/common/CodeBuilder.java                   |    2 
 src/main/java/com/zy/asrs/mapper/SaasLogMapper.java            |   12 
 src/main/webapp/views/home/map.html                            |    7 
 src/main/webapp/static/wms/js/locMast/locMast.js               |    4 
 src/main/webapp/views/deviceOperate/devpOperate.html           |    4 
 src/main/webapp/static/wms/js/user/user.js                     |    4 
 src/main/webapp/views/user/user.html                           |    6 
 src/main/java/com/zy/asrs/controller/SaasLogController.java    |  123 +++++
 src/main/java/com/zy/asrs/controller/TaskWrkController.java    |  118 ++++
 src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java           |    1 
 src/main/webapp/views/deviceOperate/crnOperate.html            |   62 ++
 src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java    |   30 +
 40 files changed, 1,230 insertions(+), 138 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/CrnController.java b/src/main/java/com/zy/asrs/controller/CrnController.java
index c2d5639..80c78cf 100644
--- a/src/main/java/com/zy/asrs/controller/CrnController.java
+++ b/src/main/java/com/zy/asrs/controller/CrnController.java
@@ -1,6 +1,7 @@
 package com.zy.asrs.controller;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.annotations.ManagerAuth;
 import com.core.common.Cools;
@@ -15,12 +16,15 @@
 import com.zy.asrs.domain.vo.CrnStateTableVo;
 import com.zy.asrs.entity.*;
 import com.zy.asrs.mapper.BasCrnErrorMapper;
+import com.zy.asrs.service.ApiLogService;
 import com.zy.asrs.service.BasCrnpService;
 import com.zy.asrs.service.LocMastService;
 import com.zy.asrs.service.WrkMastService;
 import com.zy.asrs.service.impl.MainServiceImpl;
 import com.zy.asrs.utils.CommandUtils;
+import com.zy.asrs.utils.Utils;
 import com.zy.asrs.utils.VersionUtils;
+import com.zy.common.utils.HttpHandler;
 import com.zy.core.CrnThread;
 import com.zy.core.cache.MessageQueue;
 import com.zy.core.cache.OutputQueue;
@@ -35,6 +39,7 @@
 import com.zy.core.properties.SlaveProperties;
 import com.zy.core.properties.SystemProperties;
 import lombok.extern.slf4j.Slf4j;
+import org.hibernate.validator.internal.engine.messageinterpolation.parser.ELState;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
@@ -59,7 +64,8 @@
     private String movePath;
 
 
-
+    @Autowired
+    private ApiLogService apiLogService;
     @Autowired
     private SlaveProperties slaveProperties;
     @Autowired
@@ -392,6 +398,12 @@
         command.setDestinationPosX(param.getBay());     // 鐩爣搴撲綅鍒�
         command.setDestinationPosY(param.getLev());     // 鐩爣搴撲綅灞�
         command.setCommand((short)1);
+        String locNo =String.format("%2d",param.getRow()) + String.format("%3d",param.getBay()) + String.format("%2d",param.getLev());
+        String startlocNo =String.format("%2d",param.getSourceRow()) + String.format("%3d",param.getSourceBay()) + String.format("%2d",param.getSourceLev());
+        boolean wmsLocStatus = toWmsLocStatus(1, startlocNo, locNo, param.getBarcode(), param.getBarcodeType(), param.getEmptyContainer());
+        if (!wmsLocStatus){
+            return R.error("搴撲綅鏇存柊澶辫触");
+        }
         return crnControl(command)?R.ok():R.error();
     }
 
@@ -413,6 +425,12 @@
         command.setDestinationPosZ(param.getRow());     // 鐩爣搴撲綅鎺�
         command.setDestinationPosX(param.getBay());     // 鐩爣搴撲綅鍒�
         command.setDestinationPosY(param.getLev());     // 鐩爣搴撲綅灞�
+        String locNo =String.format("%2d",param.getRow()) + String.format("%3d",param.getBay()) + String.format("%2d",param.getLev());
+        String startlocNo =String.format("%2d",param.getSourceRow()) + String.format("%3d",param.getSourceBay()) + String.format("%2d",param.getSourceLev());
+        boolean wmsLocStatus = toWmsLocStatus(2, startlocNo, locNo, param.getBarcode(), param.getBarcodeType(), param.getEmptyContainer());
+        if (!wmsLocStatus){
+            return R.error("搴撲綅鏇存柊澶辫触");
+        }
         return crnControl(command)?R.ok():R.error();
     }
 
@@ -440,6 +458,12 @@
         LocMast loc = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", command.getDestinationPosX())
                 .eq("bay1", command.getDestinationPosY()).eq("lev1", command.getDestinationPosZ()));
         VersionUtils.locMoveCheckLocType(sourceLoc, loc);
+        String locNo =String.format("%2d",param.getRow()) + String.format("%3d",param.getBay()) + String.format("%2d",param.getLev());
+        String startlocNo =String.format("%2d",param.getSourceRow()) + String.format("%3d",param.getSourceBay()) + String.format("%2d",param.getSourceLev());
+        boolean wmsLocStatus = toWmsLocStatus(3, startlocNo, locNo, param.getBarcode(), param.getBarcodeType(), param.getEmptyContainer());
+        if (!wmsLocStatus){
+            return R.error("搴撲綅鏇存柊澶辫触");
+        }
         return crnControl(command)?R.ok():R.error();
     }
 
@@ -864,5 +888,67 @@
         return R.ok().add(list);
     }
 
+    public boolean toWmsLocStatus(Integer type,String startlocNo,String locNo,String barcode,String barcodeType,String emptyContainer){
+        Map<String, Object> map = new HashMap<>();
+        map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2");
+        WmsLocStatus param = new WmsLocStatus();
+        param.setWarehouseId("1688469798893297665");
+        param.setLocationCode(Utils.getWmsLocNo(locNo));
+        if (emptyContainer.equals("1")){
+            param.setEmptyContainer("Y");
+        }else {
+            param.setEmptyContainer("N");
+        }
+        param.setStatus("QY");
+        param.setContainerCode(barcode);
+        param.setContainerTypeCode(barcodeType);
+
+        String response = null;
+        try {
+            response = new HttpHandler.Builder()
+                    .setHeaders(map)
+                    .setUri(wmsUrl)
+                    .setPath("wcsManager/wcsInterface/locationUpdate")
+                    .setJson(JSON.toJSONString(param))
+                    .build()
+                    .doPost();
+        }catch (Exception e){
+            log.error("搴撲綅鏇存柊澶辫触");
+        }
+        JSONObject jsonObject = JSON.parseObject(response);
+        if (jsonObject.getInteger("code").equals(200)){
+            LocMast originLoc = locMastService.selectByLocNo(startlocNo);
+            LocMast locMast = locMastService.selectByLocNo(locNo);
+            if (type == 1){
+                locMast.setBarcode(barcode);
+                locMast.setLocSts("Z");
+                locMastService.updateById(locMast);
+            }else if (type == 2){
+                originLoc.setLocSts("K");
+                originLoc.setBarcode("");
+                locMastService.updateById(originLoc);
+            }else if (type == 3){
+                originLoc.setLocSts("K");
+                originLoc.setBarcode("");
+                locMast.setBarcode(barcode);
+                locMast.setLocSts("Z");
+                locMastService.updateById(originLoc);
+                locMastService.updateById(locMast);
+            }
+
+            apiLogService.save("Wms鍙樻洿璐т綅鐘舵��"
+                    ,wmsUrl+"wcsManager/wcsInterface/inboundTaskApply"
+                    ,null
+                    ,"127.0.0.1"
+                    ,JSON.toJSONString(param)
+                    ,response
+                    ,true
+            );
+            return true;
+        }
+        return false;
+
+    }
+
 
 }
diff --git a/src/main/java/com/zy/asrs/controller/LocMastController.java b/src/main/java/com/zy/asrs/controller/LocMastController.java
index 84e79dd..c7ad697 100644
--- a/src/main/java/com/zy/asrs/controller/LocMastController.java
+++ b/src/main/java/com/zy/asrs/controller/LocMastController.java
@@ -154,7 +154,7 @@
                 return R.error("瀹瑰櫒缂栫爜鎴栧鍣ㄧ被鍨嬫湁璇�");
             }
         }
-        if (locMast.getLocSts().equals("O")){
+        if (locMast.getLocSts().equals("K")){
             locMast.setBarcode(null);
         }
         locMast.setModiUser(getUserId());
@@ -186,7 +186,7 @@
                     Date now =  new Date();
                     LocMast locMast = new LocMast();
                     locMast.setLocNo(locNo);
-                    locMast.setLocSts("O");
+                    locMast.setLocSts("K");
                     locMast.setRow1(r); // 鎺�
                     locMast.setBay1(b); // 鍒�
                     locMast.setLev1(l); // 灞�
diff --git a/src/main/java/com/zy/asrs/controller/MapController.java b/src/main/java/com/zy/asrs/controller/MapController.java
index 7489168..46f72a1 100644
--- a/src/main/java/com/zy/asrs/controller/MapController.java
+++ b/src/main/java/com/zy/asrs/controller/MapController.java
@@ -93,6 +93,7 @@
                         jsonObject.put("value", 10);//灏嗙鐢ㄥ簱浣嶈繘琛岃缃�
                     }
                     jsonObject.put("locNo", locMast.getLocNo());//璁剧疆搴撲綅鍙�
+                    jsonObject.put("locNo$", locMast.getLocNo$());//璁剧疆搴撲綅鍙�
                     jsonObject.put("locSts", locMast.getLocSts());//搴撲綅鐘舵��
                     jsonObject.put("barcode", Optional.ofNullable(locMast.getBarcode()).orElse("鏃�"));//鎵樼洏鍙�
 
diff --git a/src/main/java/com/zy/asrs/controller/SaasLogController.java b/src/main/java/com/zy/asrs/controller/SaasLogController.java
new file mode 100644
index 0000000..7dbe97c
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/SaasLogController.java
@@ -0,0 +1,123 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.core.common.DateUtils;
+import com.zy.asrs.entity.SaasLog;
+import com.zy.asrs.service.SaasLogService;
+import com.core.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+@RestController
+public class SaasLogController extends BaseController {
+
+    @Autowired
+    private SaasLogService saasLogService;
+
+    @RequestMapping(value = "/saasLog/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(saasLogService.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/saasLog/list/auth")
+    @ManagerAuth
+    public R list(@RequestParam(defaultValue = "1")Integer curr,
+                  @RequestParam(defaultValue = "10")Integer limit,
+                  @RequestParam(required = false)String orderByField,
+                  @RequestParam(required = false)String orderByType,
+                  @RequestParam Map<String, Object> param){
+        EntityWrapper<SaasLog> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        return R.ok(saasLogService.selectPage(new Page<>(curr, limit), wrapper));
+    }
+
+    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
+        for (Map.Entry<String, Object> entry : map.entrySet()){
+            String val = String.valueOf(entry.getValue());
+            if (val.contains(RANGE_TIME_LINK)){
+                String[] dates = val.split(RANGE_TIME_LINK);
+                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
+                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
+            } else {
+                wrapper.like(entry.getKey(), val);
+            }
+        }
+    }
+
+    @RequestMapping(value = "/saasLog/add/auth")
+    @ManagerAuth
+    public R add(SaasLog saasLog) {
+        saasLogService.insert(saasLog);
+        return R.ok();
+    }
+
+	@RequestMapping(value = "/saasLog/update/auth")
+	@ManagerAuth
+    public R update(SaasLog saasLog){
+        if (Cools.isEmpty(saasLog) || null==saasLog.getId()){
+            return R.error();
+        }
+        saasLogService.updateById(saasLog);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/saasLog/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value="ids[]") Long[] ids){
+         for (Long id : ids){
+            saasLogService.deleteById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/saasLog/export/auth")
+    @ManagerAuth
+    public R export(@RequestBody JSONObject param){
+        EntityWrapper<SaasLog> wrapper = new EntityWrapper<>();
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        Map<String, Object> map = excludeTrash(param.getJSONObject("saasLog"));
+        convert(map, wrapper);
+        List<SaasLog> list = saasLogService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/saasLogQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<SaasLog> wrapper = new EntityWrapper<>();
+        wrapper.like("id", condition);
+        Page<SaasLog> page = saasLogService.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (SaasLog saasLog : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", saasLog.getId());
+            map.put("value", saasLog.getId());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/saasLog/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<SaasLog> wrapper = new EntityWrapper<SaasLog>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != saasLogService.selectOne(wrapper)){
+            return R.parse(BaseRes.REPEAT).add(getComment(SaasLog.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/controller/SiteController.java b/src/main/java/com/zy/asrs/controller/SiteController.java
index 45efdff..1768651 100644
--- a/src/main/java/com/zy/asrs/controller/SiteController.java
+++ b/src/main/java/com/zy/asrs/controller/SiteController.java
@@ -18,6 +18,7 @@
 import com.zy.core.model.protocol.StaProtocol;
 import com.zy.core.properties.SlaveProperties;
 import com.zy.core.DevpThread;
+import com.zy.core.thread.BarcodeThread;
 import com.zy.core.thread.SiemensDevpThread;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -113,6 +114,7 @@
             vo.setStaNo(staProtocol.getStaNo());                // 鐩爣绔�
 //            vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "浣�" : "楂�");     //楂樹綆搴撲綅
             vo.setLocType1(devp.getDevNo()==102 ? "楂�" : "浣�");
+            vo.setBarcode(staProtocol.getBarcode());
         }
         return R.ok().add(list);
     }
diff --git a/src/main/java/com/zy/asrs/controller/TaskWrkController.java b/src/main/java/com/zy/asrs/controller/TaskWrkController.java
index 46ee865..2ec6529 100644
--- a/src/main/java/com/zy/asrs/controller/TaskWrkController.java
+++ b/src/main/java/com/zy/asrs/controller/TaskWrkController.java
@@ -16,6 +16,8 @@
 import com.core.common.BaseRes;
 import com.core.common.Cools;
 import com.core.common.R;
+import com.zy.asrs.utils.SaasUtils;
+import com.zy.asrs.utils.Utils;
 import com.zy.common.utils.HttpHandler;
 import com.zy.common.web.BaseController;
 import lombok.extern.slf4j.Slf4j;
@@ -23,7 +25,11 @@
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.*;
+
+import static com.zy.asrs.entity.param.TaskStatusFeedbackParam.getTaskType;
 
 @RestController
 @Slf4j
@@ -90,7 +96,7 @@
 
     @RequestMapping(value = "/taskWrk/updatePoint/auth")
     @ManagerAuth
-    public R updatePoint(TaskWrk taskWrk){
+    public R updatePoint(TaskWrk taskWrk) throws UnknownHostException {
         if (Cools.isEmpty(taskWrk) || null == taskWrk.getTaskNo()) {
             return R.error();
         }
@@ -98,10 +104,25 @@
         if (taskWrk1 == null) {
             return R.error();
         }
+        InetAddress localHost = InetAddress.getLocalHost();
+        String ipAddress = localHost.getHostAddress();
+
+        SaasUtils.insertLog(1,taskWrk1.getStartPoint()+"-"+taskWrk1.getTargetPoint(),taskWrk.getStartPoint()+"-"+taskWrk.getTargetPoint(), ipAddress,getUser().getUsername());
+
+
         taskWrk1.setStartPoint(taskWrk.getStartPoint());
         taskWrk1.setTargetPoint(taskWrk.getTargetPoint());
+        if (taskWrk1.getIoType() == 1){
+            taskWrk1.setOriginTargetPoint(Utils.getWmsLocNo(taskWrk.getTargetPoint()));
+        } else if (taskWrk1.getIoType() == 2) {
+            taskWrk1.setOriginStartPoint(Utils.getWmsLocNo(taskWrk.getStartPoint()));
+        } else if (taskWrk1.getIoType() == 3) {
+            taskWrk1.setOriginTargetPoint(Utils.getWmsLocNo(taskWrk.getTargetPoint()));
+            taskWrk1.setOriginStartPoint(Utils.getWmsLocNo(taskWrk.getStartPoint()));
+        }
         taskWrk1.setModiTime(new Date());
         taskWrk1.setModiUser(getUserId());
+
         taskWrkService.updateById(taskWrk1);
         return R.ok();
     }
@@ -246,21 +267,64 @@
         if (taskWrk == null) {
             return R.error();
         }
-        if (taskWrk.getStatus().equals(TaskStatusType.CANCEL.id)) {
-            return R.error(taskWrk.getTaskNo() + "宸茶鍙栨秷");
+        String wmsCancelledtask = toWmsCancelledtask(taskWrk);
+        JSONObject jsonObject = JSON.parseObject(wmsCancelledtask);
+        if (Cools.isEmpty(jsonObject)){
+            return R.error("瓒呮椂鎴栨湭鐭ラ敊璇�");
         }
-        Date now = new Date();
-        taskWrk.setStatus(TaskStatusType.CANCEL.id);
-        taskWrk.setModiTime(now);//鎿嶄綔鏃堕棿
-        try{
-            taskWrk.setModiUser(getUserId());//鎿嶄綔鍛�
-        }catch (Exception e){
-            taskWrk.setModiUser(9999L);//鎿嶄綔鍛�
+        if (jsonObject.getInteger("code").equals(200)){
+            if (!taskWrkService.delete(new EntityWrapper<TaskWrk>().eq("task_no",taskNo))){
+                return R.error("鍒犻櫎浠诲姟澶辫触");
+            }
+        }else if (jsonObject.getInteger("code").equals(500)){
+            return R.error(jsonObject.get("msg").toString());
+        }else {
+            return R.error("瓒呮椂鎴栨湭鐭ラ敊璇�");
         }
-        taskWrk.setCompleteTime(now);//瀹岀粨鏃堕棿
-        taskWrkService.updateById(taskWrk);
+
         return R.ok();
     }
+
+    public String toWmsCancelledtask(TaskWrk taskWrk){
+        Map<String, Object> map = new HashMap<>();
+        map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2");
+        TaskOverToWms taskOverToWms = new TaskOverToWms();
+        taskOverToWms.setFeedbackFrom("WCS"); //鏉ユ簮
+        taskOverToWms.setWarehouseId("1688469798893297665"); //浠撳簱鏍囪瘑
+        taskOverToWms.setTaskNo(taskWrk.getTaskNo()); //浠诲姟鍙�
+        taskOverToWms.setTaskType(getTaskType(taskWrk.getIoType())); // 浠诲姟绫诲瀷
+        taskOverToWms.setContainerCode(taskWrk.getBarcode()); // 瀹瑰櫒缂栫爜
+        if (taskWrk.getIoType() ==1 ){
+            taskOverToWms.setEquipmentCode(String.valueOf(taskWrk.getCrnNo())); //璁惧缂栫爜
+            taskOverToWms.setTargetLocationCode(taskWrk.getOriginTargetPoint()); //鐩爣搴撲綅
+        }else if (taskWrk.getIoType() ==2){
+            Map<Integer,String> map1 = new HashMap<>();
+            map1.put(102,"J-1101");
+            map1.put(106,"J-1103");
+            map1.put(110,"J-1105");
+            map1.put(114,"J-1107");
+            map1.put(118,"J-1109");
+            map1.put(122,"J-1111");
+            taskOverToWms.setEquipmentCode(map1.get(taskWrk.getTargetPoint())); //璁惧缂栫爜
+            taskOverToWms.setSourceLocationCode(taskWrk.getOriginStartPoint()); //婧愬簱浣�
+        }
+
+        taskOverToWms.setTaskStatus("cancelled"); //浠诲姟鐘舵��
+        String response = null;
+        try {
+            response = new HttpHandler.Builder()
+                    .setHeaders(map)
+                    .setUri(wmsUrl)
+                    .setPath("wcsManager/wcsInterface/taskStatusFeedback")
+                    .setJson(JSON.toJSONString(taskOverToWms))
+                    .build()
+                    .doPost();
+        }catch (Exception e){
+            log.error("wms杩炴帴澶辫触");
+        }
+        return response;
+    }
+
 
     @PostMapping(value = "/taskWrk/updateCommandStep")
     @ManagerAuth(memo = "鏇存柊姝ュ簭")
@@ -276,6 +340,36 @@
         taskWrkService.updateById(taskWrk);
         return R.ok();
     }
+    @PostMapping(value = "/taskWrk/upIoPri")
+    public R upIoPri(@RequestParam String taskNo){
+        TaskWrk taskWrk = taskWrkService.selectByTaskNo(taskNo);
+        if (taskWrk.getIoPri() > 300){
+            return R.error("浼樺厛绾у凡鏈�楂�");
+        }
+        Map<Integer,Integer> map = new HashMap<>();
+        map.put(100,200);map.put(200,300);map.put(300,400);
+        Integer pri = map.get(taskWrk.getIoPri());
+        taskWrk.setIoPri(pri);
+        if (!taskWrkService.updateById(taskWrk)){
+            return R.error("澧炲姞浼樺厛绾уけ璐�");
+        }
+        return R.ok();
+    }
+    @PostMapping(value = "/taskWrk/downIoPri")
+    public R downIoPri(@RequestParam String taskNo){
+        TaskWrk taskWrk = taskWrkService.selectByTaskNo(taskNo);
+        if (taskWrk.getIoPri() <200){
+            return R.error("浼樺厛绾у凡鏈�浣�");
+        }
+        Map<Integer,Integer> map = new HashMap<>();
+        map.put(200,100);map.put(300,200);map.put(400,300);
+        Integer pri = map.get(taskWrk.getIoPri());
+        taskWrk.setIoPri(pri);
+        if (!taskWrkService.updateById(taskWrk)){
+            return R.error("闄嶄綆浼樺厛绾уけ璐�");
+        }
+        return R.ok();
+    }
 
     public static String getTaskType(Integer paramIoType){
         switch (paramIoType){
diff --git a/src/main/java/com/zy/asrs/domain/param/CrnOperatorParam.java b/src/main/java/com/zy/asrs/domain/param/CrnOperatorParam.java
index f85698e..244d7d8 100644
--- a/src/main/java/com/zy/asrs/domain/param/CrnOperatorParam.java
+++ b/src/main/java/com/zy/asrs/domain/param/CrnOperatorParam.java
@@ -34,5 +34,10 @@
 
     // 鐩爣搴撲綅-灞�
     private Short lev;
+    //鏉$爜
+    private String barcode;
+    //鏉$爜绫诲瀷
+    private String barcodeType;
+    private String emptyContainer;
 
 }
diff --git a/src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java b/src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java
index 6007fce..6771134 100644
--- a/src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java
+++ b/src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java
@@ -38,4 +38,5 @@
     //楂樹綆搴撲綅
     private String locType1 = "-";
     private String car = "-";
+    private String barcode = "-";
 }
diff --git a/src/main/java/com/zy/asrs/entity/LocMast.java b/src/main/java/com/zy/asrs/entity/LocMast.java
index 03aca14..6260958 100644
--- a/src/main/java/com/zy/asrs/entity/LocMast.java
+++ b/src/main/java/com/zy/asrs/entity/LocMast.java
@@ -7,6 +7,7 @@
 import com.core.common.Cools;
 import com.core.common.SpringUtils;
 import com.zy.asrs.service.BasLocStsService;
+import com.zy.asrs.utils.Utils;
 import com.zy.system.entity.User;
 import com.zy.system.service.UserService;
 import io.swagger.annotations.ApiModelProperty;
@@ -185,6 +186,13 @@
     @TableField(exist = false)
     private String emptyContainer;
 
+    public String getLocNo$(){
+        if (Cools.isEmpty(this.locNo)){
+            return "";
+        }
+        return Utils.getWmsLocNo(this.locNo);
+    }
+
     public String getEmptyContainer$(){
         if (Cools.isEmpty(this.emptyContainer)){
             return "";
diff --git a/src/main/java/com/zy/asrs/entity/SaasLog.java b/src/main/java/com/zy/asrs/entity/SaasLog.java
new file mode 100644
index 0000000..ef3ea8e
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/SaasLog.java
@@ -0,0 +1,97 @@
+package com.zy.asrs.entity;
+
+import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableField;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+@Data
+@TableName("sys_saas_log")
+public class SaasLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @ApiModelProperty(value= "id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * {0:鍏ュ簱,1:鍑哄簱,2:绉昏浆,3:鎵嬪姩璋冩暣}
+     */
+    @ApiModelProperty(value= "{0:鍏ュ簱,1:鍑哄簱,2:绉昏浆,3:鎵嬪姩璋冩暣}")
+    private Integer type;
+
+    @ApiModelProperty(value= "")
+    @TableField("origin_data")
+    private String originData;
+
+    @ApiModelProperty(value= "")
+    private String data;
+
+    @ApiModelProperty(value= "")
+    @TableField("io_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date ioTime;
+
+    @ApiModelProperty(value= "")
+    @TableField("create_by")
+    private Long createBy;
+
+    @ApiModelProperty(value= "")
+    private String ip;
+
+    @ApiModelProperty(value= "")
+    @TableField("create_by_name")
+    private String createByName;
+
+    public SaasLog() {}
+
+    public SaasLog(Integer type,String originData,String data,Date ioTime,Long createBy,String ip,String createByName) {
+        this.type = type;
+        this.originData = originData;
+        this.data = data;
+        this.ioTime = ioTime;
+        this.createBy = createBy;
+        this.ip = ip;
+        this.createByName = createByName;
+    }
+
+//    SaasLog saasLog = new SaasLog(
+//            null,    // {0:鍏ュ簱,1:鍑哄簱,2:绉昏浆,3:鎵嬪姩璋冩暣}
+//            null,    // 
+//            null,    // 
+//            null,    // 
+//            null,    // 
+//            null,    // 
+//            null    // 
+//    );
+
+    public String getType$(){
+
+            switch (type){
+                case 1: return "淇敼搴撲綅";
+                case 2: return "";
+                default:
+                    return "鏈煡";
+            }
+
+    }
+    public String getIoTime$(){
+        if (Cools.isEmpty(this.ioTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.ioTime);
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/TaskWrk.java b/src/main/java/com/zy/asrs/entity/TaskWrk.java
index 677c090..b384567 100644
--- a/src/main/java/com/zy/asrs/entity/TaskWrk.java
+++ b/src/main/java/com/zy/asrs/entity/TaskWrk.java
@@ -247,6 +247,21 @@
                 return String.valueOf(this.status);
         }
     }
+    public String getIoPri$(){
+        if (null == this.ioPri){ return null; }
+        switch (this.ioPri){
+            case 100:
+                return "浣�";
+            case 200:
+                return "涓�";
+            case 300:
+                return "楂�";
+            case 400:
+                return "绱ф��";
+            default:
+                return String.valueOf(this.ioPri);
+        }
+    }
 
     public String getCreateTime$(){
         if (Cools.isEmpty(this.createTime)){
diff --git a/src/main/java/com/zy/asrs/entity/ViewLocMapDto.java b/src/main/java/com/zy/asrs/entity/ViewLocMapDto.java
index 53fbbc4..5aceb1d 100644
--- a/src/main/java/com/zy/asrs/entity/ViewLocMapDto.java
+++ b/src/main/java/com/zy/asrs/entity/ViewLocMapDto.java
@@ -52,11 +52,11 @@
                 this.bgc = "#00B271";
                 this.color = "#fff";
                 break;
-            case "F":
+            case "Z":
                 this.bgc = "#479AC7";
                 this.color = "#fff";
                 break;
-            case "O":
+            case "K":
                 this.bgc = "#B45B3E";
                 this.color = "#fff";
                 break;
@@ -76,7 +76,7 @@
                 this.bgc = "#F0DAD2";
                 this.color = "#000";
                 break;
-            case "X":
+            case "J":
                 this.bgc = "#bac296";
                 this.color = "#fff";
                 break;
diff --git a/src/main/java/com/zy/asrs/mapper/SaasLogMapper.java b/src/main/java/com/zy/asrs/mapper/SaasLogMapper.java
new file mode 100644
index 0000000..d5b02fc
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/SaasLogMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.zy.asrs.entity.SaasLog;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface SaasLogMapper extends BaseMapper<SaasLog> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/SaasLogService.java b/src/main/java/com/zy/asrs/service/SaasLogService.java
new file mode 100644
index 0000000..7a16352
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/SaasLogService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.zy.asrs.entity.SaasLog;
+import com.baomidou.mybatisplus.service.IService;
+
+public interface SaasLogService extends IService<SaasLog> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
index 6265873..5c58614 100644
--- a/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
@@ -89,12 +89,12 @@
         param.setWarehouseId("1688469798893297665");
         param.setLocationCode(Utils.getWmsLocNo(locMast.getLocNo()));
         param.setEmptyContainer(locMast.getEmptyContainer$());
-        if (locMast.getLocSts().equals("Z")){
+        if (locMast.getLocSts().equals("J")){
             param.setStatus("JY");
         }else {
             param.setStatus("QY");
         }
-        if (Cools.isEmpty(locMast.getBarcode()) || locMast.getLocSts().equals("O")){
+        if (Cools.isEmpty(locMast.getBarcode()) || locMast.getLocSts().equals("K")){
             param.setContainerCode("");
             param.setContainerTypeCode("");
         }else {
@@ -111,7 +111,7 @@
                     .build()
                     .doPost();
         }catch (Exception e){
-            log.error("鍫嗗灈鏈轰换鍔″畬鎴愶紝璇锋眰wms浠诲姟瀹屾垚鎺ュ彛澶辫触");
+            log.error("搴撲綅鏇存柊澶辫触");
         }
         JSONObject jsonObject = JSON.parseObject(response);
 
diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index d4f93e1..57e662c 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -181,6 +181,7 @@
                         continue;
                     }
                     String barcode = barcodeThread.getBarcode();
+                    staProtocol.setBarcode(barcode);
                     if(!Cools.isEmpty(barcode)) {
                         StaDescService staDescService = SpringUtils.getBean(StaDescService.class);
 
@@ -1007,7 +1008,7 @@
 
                 //鏇存柊搴撲綅鐘舵��
                 LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());
-                locMast.setLocSts("F");//F.鍦ㄥ簱
+                locMast.setLocSts("Z");//F.鍦ㄥ簱
                 locMast.setBarcode(taskWrk.getBarcode());//鎵樼洏鐮�
                 locMast.setModiTime(now);
                 locMast.setModiUser(9999L);
@@ -1021,7 +1022,7 @@
 
                 //鏇存柊搴撲綅鐘舵��
                 LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint());
-                locMast.setLocSts("O");//O.绌哄簱浣�
+                locMast.setLocSts("K");//O.绌哄簱浣�
                 locMast.setBarcode("");//鎵樼洏鐮�
                 locMast.setModiTime(now);
                 locMast.setModiUser(9999L);
diff --git a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
index 2438af2..5ce4875 100644
--- a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -7,16 +7,11 @@
 import com.core.common.R;
 import com.core.exception.CoolException;
 import com.zy.asrs.domain.enums.TaskStatusType;
-import com.zy.asrs.entity.StaDesc;
-import com.zy.asrs.entity.TaskWrk;
-import com.zy.asrs.entity.ToWmsDTO;
+import com.zy.asrs.entity.*;
 import com.zy.asrs.entity.param.TaskOverParam;
 import com.zy.asrs.entity.param.WMSAndAGVInterfaceParam;
 import com.zy.asrs.entity.param.taskCreateParam;
-import com.zy.asrs.service.ApiLogService;
-import com.zy.asrs.service.OpenService;
-import com.zy.asrs.service.StaDescService;
-import com.zy.asrs.service.TaskWrkService;
+import com.zy.asrs.service.*;
 import com.zy.asrs.utils.Utils;
 import com.zy.common.utils.HttpHandler;
 import com.zy.core.DevpThread;
@@ -48,6 +43,11 @@
     @Autowired
     private StaDescService staDescService;
 
+    @Autowired
+    private BasCrnpService basCrnpService;
+    @Autowired
+    private LocMastService locMastService;
+
 
 
     @Value("${wms.url}")
@@ -61,6 +61,22 @@
 
     @Override
     public R taskCreate(taskCreateParam param) {
+        //绂佺敤鍫嗗灈鏈哄悗涓嶅彲涓嬪彂浠诲姟
+        BasCrnp basCrnp = basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no", param.getCrn()));
+        if ((param.getIoType() == 3 || param.getIoType() == 1 ) && basCrnp.getInEnable().equals("N")){
+            throw new CoolException("鐢熸垚浠诲姟澶辫触锛屽爢鍨涙満涓嶅彲鐢�");
+        } else if (param.getIoType() == 2 && basCrnp.getOutEnable().equals("N")) {
+            throw new CoolException("鐢熸垚浠诲姟澶辫触锛屽爢鍨涙満涓嶅彲鐢�");
+        }
+        //绂佺敤搴撲綅鍚庝笉鍙笅鍙戝嚭搴撲换鍔�
+        if (param.getIoType() == 2){
+            String wcsLocNo = Utils.getWcsLocNo(param.getStartPoint());
+            LocMast locMast = locMastService.selectByLocNo(wcsLocNo);
+            if (locMast.getLocSts().equals("J")){
+                throw new CoolException("鐢熸垚鍑哄簱浠诲姟澶辫触锛屽簱浣嶈绂佺敤");
+            }
+        }
+
         TaskWrk taskWrk = taskWrkService.selectByTaskNo(param.getTaskNo());
         if (taskWrk != null) {
             throw new CoolException(param.getTaskNo() + "浠诲姟宸插瓨鍦紝璇峰嬁閲嶅鎻愪氦");
diff --git a/src/main/java/com/zy/asrs/service/impl/SaasLogServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/SaasLogServiceImpl.java
new file mode 100644
index 0000000..306b192
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/SaasLogServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.zy.asrs.mapper.SaasLogMapper;
+import com.zy.asrs.entity.SaasLog;
+import com.zy.asrs.service.SaasLogService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("saasLogService")
+public class SaasLogServiceImpl extends ServiceImpl<SaasLogMapper, SaasLog> implements SaasLogService {
+
+}
diff --git a/src/main/java/com/zy/asrs/task/TaskLogScheduler.java b/src/main/java/com/zy/asrs/task/TaskLogScheduler.java
index 5a61e26..6a33663 100644
--- a/src/main/java/com/zy/asrs/task/TaskLogScheduler.java
+++ b/src/main/java/com/zy/asrs/task/TaskLogScheduler.java
@@ -81,7 +81,7 @@
                     Date now = new Date();
                     //鏇存柊搴撲綅鐘舵��
                     LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint());
-                    locMast.setLocSts("O");//O.绌哄簱浣�
+                    locMast.setLocSts("K");//O.绌哄簱浣�
                     locMast.setBarcode("");//鎵樼洏鐮�
                     locMast.setModiTime(now);
                     locMast.setModiUser(9999L);
@@ -89,7 +89,7 @@
 
                     //鏇存柊搴撲綅鐘舵��
                     LocMast locMast2 = locMastService.selectByLocNo(taskWrk.getTargetPoint());
-                    locMast2.setLocSts("F");//F.鍦ㄥ簱
+                    locMast2.setLocSts("Z");//F.鍦ㄥ簱
                     locMast2.setBarcode(taskWrk.getBarcode());//鎵樼洏鐮�
                     locMast2.setModiTime(now);
                     locMast2.setModiUser(9999L);
diff --git a/src/main/java/com/zy/asrs/utils/SaasUtils.java b/src/main/java/com/zy/asrs/utils/SaasUtils.java
new file mode 100644
index 0000000..5344138
--- /dev/null
+++ b/src/main/java/com/zy/asrs/utils/SaasUtils.java
@@ -0,0 +1,22 @@
+package com.zy.asrs.utils;
+
+import com.core.common.SpringUtils;
+import com.zy.asrs.entity.SaasLog;
+import com.zy.asrs.service.SaasLogService;
+
+import java.util.Date;
+
+public class SaasUtils {
+    public static void insertLog(Integer type, String locNo, String matnr,String ip,String user){
+        SaasLogService bean = SpringUtils.getBean(SaasLogService.class);
+        SaasLog saasLog = new SaasLog();
+        saasLog.setType(type);
+        saasLog.setOriginData(locNo);
+        saasLog.setData(matnr);
+        saasLog.setIoTime(new Date());
+        saasLog.setIp(ip);
+        saasLog.setCreateBy(1L);
+        saasLog.setCreateByName(user);
+        bean.insert(saasLog);
+    }
+}
diff --git a/src/main/java/com/zy/common/CodeBuilder.java b/src/main/java/com/zy/common/CodeBuilder.java
index 79cbcbc..79e22e1 100644
--- a/src/main/java/com/zy/common/CodeBuilder.java
+++ b/src/main/java/com/zy/common/CodeBuilder.java
@@ -20,7 +20,7 @@
         generator.url="127.0.0.1:1433;databasename=ghtzasrs";
         generator.username="sa";
         generator.password="sa@123";
-        generator.table="man_api_log";
+        generator.table="sys_saas_log";
         generator.packagePath="com.zy.asrs";
         generator.js = false;
         generator.html = false;
diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index ea237b8..2019ffb 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -146,7 +146,7 @@
                 String shallowLocNo = Utils.getShallowLoc(slaveProperties, locNo);
                 // 妫�娴嬬洰鏍囧簱浣嶆槸鍚︿负绌哄簱浣�
                 LocMast shallowLoc = locMastService.selectById(shallowLocNo);
-                if (shallowLoc != null && shallowLoc.getLocSts().equals("O")) {
+                if (shallowLoc != null && shallowLoc.getLocSts().equals("K")) {
                     if (basCrnpService.checkSiteError(shallowLoc.getCrnNo(), true)) {
                         if (VersionUtils.locMoveCheckLocType(shallowLoc, locTypeDto)) {
                             locMast = shallowLoc;
@@ -169,7 +169,7 @@
                     String shallowLocNo = Utils.getShallowLoc(slaveProperties,  loc.getLocNo());
                     // 妫�娴嬬洰鏍囧簱浣嶆槸鍚︿负绌哄簱浣�
                     LocMast shallowLoc = locMastService.selectById(shallowLocNo);
-                    if (shallowLoc != null && shallowLoc.getLocSts().equals("O")) {
+                    if (shallowLoc != null && shallowLoc.getLocSts().equals("K")) {
                         if (basCrnpService.checkSiteError(shallowLoc.getCrnNo(), true)) {
                             locMast = shallowLoc;
                             crnNo = locMast.getCrnNo();
@@ -272,14 +272,14 @@
                 // 鐩爣搴撲綅 ===>> 娴呭簱浣嶏紝 鍒欐牎楠屽叾娣卞簱浣嶆槸鍚︿负 F D X
                 if (null != locMast && Utils.isShallowLoc(slaveProperties, locMast.getLocNo())) {
                     LocMast deepLoc = locMastService.selectById(Utils.getDeepLoc(slaveProperties, locMast.getLocNo()));
-                    if (!deepLoc.getLocSts().equals("F") && !deepLoc.getLocSts().equals("D") && !deepLoc.getLocSts().equals("X")) {
+                    if (!deepLoc.getLocSts().equals("Z") && !deepLoc.getLocSts().equals("D") && !deepLoc.getLocSts().equals("X")) {
                         locMast = null;
                     }
                 }
                 // 鐩爣搴撲綅 ===>> 娣卞簱浣嶏紝 鍒欐牎楠屽叾娴呭簱浣嶆槸鍚︿负 O
                 if (null != locMast && Utils.isDeepLoc(slaveProperties, locMast.getLocNo())) {
                     LocMast shallowLoc = locMastService.selectById(Utils.getShallowLoc(slaveProperties, locMast.getLocNo()));
-                    if (!shallowLoc.getLocSts().equals("O")) {
+                    if (!shallowLoc.getLocSts().equals("K")) {
                         locMast = null;
                     }
                 }
diff --git a/src/main/java/com/zy/core/model/protocol/StaProtocol.java b/src/main/java/com/zy/core/model/protocol/StaProtocol.java
index a848f98..a7a3460 100644
--- a/src/main/java/com/zy/core/model/protocol/StaProtocol.java
+++ b/src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -65,6 +65,9 @@
     //鎸囦护ID
     private Integer commandId;
 
+    //鏉$爜
+    private String barcode = null;
+
     // 澶栧舰妫�娴� ------------------------------------------------------------------------
 
     // 鍓嶈秴闄�
diff --git a/src/main/resources/mapper/SaasLogMapper.xml b/src/main/resources/mapper/SaasLogMapper.xml
new file mode 100644
index 0000000..0205806
--- /dev/null
+++ b/src/main/resources/mapper/SaasLogMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.mapper.SaasLogMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.SaasLog">
+        <id column="id" property="id" />
+        <result column="type" property="type" />
+        <result column="origin_data" property="originData" />
+        <result column="data" property="data" />
+        <result column="io_time" property="ioTime" />
+        <result column="create_by" property="createBy" />
+        <result column="ip" property="ip" />
+        <result column="create_by_name" property="createByName" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/webapp/static/wcs/css/crn.css b/src/main/webapp/static/wcs/css/crn.css
index 1bb7c73..84b7d42 100644
--- a/src/main/webapp/static/wcs/css/crn.css
+++ b/src/main/webapp/static/wcs/css/crn.css
@@ -52,7 +52,7 @@
 /* 鍙� */
 .crn-state {
     height: 100%;
-    width: 79%;
+    width: 100%;
     overflow: auto;
     float: left;
 }
@@ -83,7 +83,7 @@
 .crn-msg {
     /*overflow: auto;*/
     margin-top: 10px;
-    height: 250px;
+    height: 350px;
     background-color: #fff;
     border-radius: 5px;
     box-shadow: 0 0 3px rgba(0,0,0,.3);
@@ -232,7 +232,7 @@
 /* -------------------- 绗洓妯″潡 -------------------- */
 .crn-output-board {
     margin-top: 10px;
-    height: 350px;
+    height: 200px;
     background-color: #fff;
     border-radius: 5px;
     box-shadow: 0 0 3px rgba(0,0,0,.3);
diff --git a/src/main/webapp/static/wcs/css/render.css b/src/main/webapp/static/wcs/css/render.css
index c00b658..773e21a 100644
--- a/src/main/webapp/static/wcs/css/render.css
+++ b/src/main/webapp/static/wcs/css/render.css
@@ -19,7 +19,7 @@
 }
 .head-left {
     height: 100%;
-    width: 20%;
+    width: 50%;
     display: inline-block;
 }
 .head-right {
@@ -552,4 +552,60 @@
 .layui-table-cell {
     height: auto ;
     white-space: normal;
+}
+.barcode1{
+    position: absolute;
+    width: 100px;
+    height: 50px;
+    left: 220px;
+    top: 250px;
+}
+.barcode2{
+    position: absolute;
+    width: 100px;
+    height: 50px;
+    left: 220px;
+    top: 340px;
+}
+.barcode3{
+    position: absolute;
+    width: 100px;
+    height: 50px;
+    left: 220px;
+    top: 430px;
+}
+.barcode4{
+    position: absolute;
+    width: 100px;
+    height: 50px;
+    left: 220px;
+    top: 545px;
+}
+.barcode5{
+    position: absolute;
+    width: 100px;
+    height: 50px;
+    left: 220px;
+    top: 660px;
+}
+.barcode6{
+    position: absolute;
+    width: 100px;
+    height: 50px;
+    left: 220px;
+    top: 770px;
+}
+.barcode7{
+    position: absolute;
+    width: 100px;
+    height: 50px;
+    left: 1450px;
+    top: 685px;
+}
+.barcode8{
+    position: absolute;
+    width: 100px;
+    height: 50px;
+    left: 1450px;
+    top: 570px;
 }
\ No newline at end of file
diff --git a/src/main/webapp/static/wms/js/locMast/locMast.js b/src/main/webapp/static/wms/js/locMast/locMast.js
index 7f33483..4d17c76 100644
--- a/src/main/webapp/static/wms/js/locMast/locMast.js
+++ b/src/main/webapp/static/wms/js/locMast/locMast.js
@@ -22,13 +22,15 @@
             {type: 'checkbox', fixed: 'left'}
 //            ,{field: 'id', title: 'ID', sort: true,align: 'center', fixed: 'left', width: 80}
             ,{field: 'locNo', align: 'center',title: '搴撲綅鍙�',sort:true}
+            ,{field: 'locNo$', align: 'center',title: '搴撲綅鍙�',sort:true}
             ,{field: 'locSts$', align: 'center',title: '搴撲綅鐘舵��',width:200}
             // ,{field: 'whsType$', align: 'center',title: '搴撲綅绫诲瀷'}
             // ,{field: 'pltType', align: 'center',title: ''}
             // ,{field: 'ctnType', align: 'center',title: ''}
             // ,{field: 'locSts', align: 'center',title: ''}
             // ,{field: 'sheetNo', align: 'center',title: ''}
-            // ,{field: 'crnNo', align: 'center',title: '鍫嗗灈鏈哄彿'}
+             ,{field: 'crnNo', align: 'center',title: '宸烽亾'}
+            ,{field: 'barcode', align: 'center',title: '鎵樼洏鐮�'}
             ,{field: 'row1', align: 'center',title: '鎺�', sort:true}
             ,{field: 'bay1', align: 'center',title: '鍒�', sort:true}
             ,{field: 'lev1', align: 'center',title: '灞�', sort:true}
diff --git a/src/main/webapp/static/wms/js/saasLog/saasLog.js b/src/main/webapp/static/wms/js/saasLog/saasLog.js
new file mode 100644
index 0000000..2167f76
--- /dev/null
+++ b/src/main/webapp/static/wms/js/saasLog/saasLog.js
@@ -0,0 +1,252 @@
+var pageCurr;
+layui.config({
+    base: baseUrl + "/static/wms/layui/lay/modules/"
+}).use(['table','laydate', 'form', 'admin'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var admin = layui.admin;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#saasLog',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/saasLog/list/auth',
+        page: true,
+        limit: 15,
+        limits: [15, 30, 50, 100, 200, 500],
+        // toolbar: '#toolbar',
+        cellMinWidth: 50,
+        height: 'full-120',
+        cols: [[
+            {type: 'checkbox'}
+            ,{field: 'id', align: 'center',title: 'id', hide:true}
+            ,{field: 'type$', align: 'center',title: '鎿嶄綔绫诲瀷'}
+            ,{field: 'originData', align: 'center',title: '婧愭暟鎹�'}
+            ,{field: 'data', align: 'center',title: '淇敼鏁版嵁'}
+            ,{field: 'ip', align: 'center',title: 'ip鍦板潃'}
+            ,{field: 'createByName', align: 'center',title: '鎿嶄綔浜�'}
+            ,{field: 'ioTime$', align: 'center',title: '鎿嶄綔鏃堕棿'}
+            ,{field: 'createBy', align: 'center',title: '', hide:true}
+
+
+        ]],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function(res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            limit();
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(saasLog)', function (obj) {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        searchData['orderByField'] = obj.field;
+        searchData['orderByType'] = obj.type;
+        tableIns.reload({
+            where: searchData,
+            page: {curr: 1}
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(saasLog)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id).data;
+        switch(obj.event) {
+            case 'addData':
+                showEditModel();
+                break;
+            case 'deleteData':
+               if (checkStatus.length === 0) {
+                   layer.msg('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁', {icon: 2});
+                   return;
+               }
+               del(checkStatus.map(function (d) {
+                   return d.id;
+               }));
+               break;
+            case 'exportData':
+                admin.confirm('纭畾瀵煎嚭Excel鍚�', {shadeClose: true}, function(){
+                    var titles=[];
+                    var fields=[];
+                    obj.config.cols[0].map(function (col) {
+                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
+                            titles.push(col.title);
+                            fields.push(col.field);
+                        }
+                    });
+                    var exportData = {};
+                    $.each($('#search-box [name]').serializeArray(), function() {
+                        exportData[this.name] = this.value;
+                    });
+                    var param = {
+                        'saasLog': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/saasLog/export/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        dataType:'json',
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            layer.closeAll();
+                            if (res.code === 200) {
+                                table.exportFile(titles,res.data,'xls');
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg, {icon: 2})
+                            }
+                        }
+                    });
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(saasLog)', function(obj){
+        var data = obj.data;
+        switch (obj.event) {
+            case 'edit':
+                showEditModel(data);
+                break;
+            case "del":
+                del([data.id]);
+                break;
+        }
+    });
+
+    /* 寮圭獥 - 鏂板銆佷慨鏀� */
+    function showEditModel(mData) {
+        admin.open({
+            type: 1,
+            area: '600px',
+            title: (mData ? '淇敼' : '娣诲姞') + '璁㈠崟鐘舵��',
+            content: $('#editDialog').html(),
+            success: function (layero, dIndex) {
+                layDateRender(mData);
+                form.val('detail', mData);
+                form.on('submit(editSubmit)', function (data) {
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/saasLog/"+(mData?'update':'add')+"/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: data.field,
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            if (res.code === 200){
+                                layer.close(dIndex);
+                                layer.msg(res.msg, {icon: 1});
+                                tableReload();
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            }else {
+                                layer.msg(res.msg, {icon: 2});
+                            }
+                        }
+                    })
+                    return false;
+                });
+                $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                layui.form.render('select');
+            }
+        });
+    }
+
+    /* 鍒犻櫎 */
+    function del(ids) {
+        layer.confirm('纭畾瑕佸垹闄ら�変腑鏁版嵁鍚楋紵', {
+            skin: 'layui-layer-admin',
+            shade: .1
+        }, function (i) {
+            layer.close(i);
+            var loadIndex = layer.load(2);
+            $.ajax({
+                url: baseUrl+"/saasLog/delete/auth",
+                headers: {'token': localStorage.getItem('token')},
+                data: {ids: ids},
+                method: 'POST',
+                success: function (res) {
+                    layer.close(loadIndex);
+                    if (res.code === 200){
+                        layer.msg(res.msg, {icon: 1});
+                        tableReload();
+                    } else if (res.code === 403){
+                        top.location.href = baseUrl+"/";
+                    } else {
+                        layer.msg(res.msg, {icon: 2});
+                    }
+                }
+            })
+        });
+    }
+
+    // 鎼滅储
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+    // 閲嶇疆
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    function layDateRender(data) {
+        setTimeout(function () {
+            layDate.render({
+                elem: '#ioTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['ioTime\\$']:null
+            });
+
+        }, 300);
+    }
+    layDateRender();
+
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(document).on('click','#data-detail-close', function () {
+    parent.layer.closeAll();
+});
+
+function tableReload(child) {
+    var searchData = {};
+    $.each($('#search-box [name]').serializeArray(), function() {
+        searchData[this.name] = this.value;
+    });
+    tableIns.reload({
+        where: searchData,
+        page: {curr: pageCurr}
+     });
+}
diff --git a/src/main/webapp/static/wms/js/user/user.js b/src/main/webapp/static/wms/js/user/user.js
index 6579a71..5423704 100644
--- a/src/main/webapp/static/wms/js/user/user.js
+++ b/src/main/webapp/static/wms/js/user/user.js
@@ -25,8 +25,8 @@
             {type: 'checkbox'}
             // ,{field: 'hostName', align: 'center',title: '鎺堟潈鍟嗘埛', templet: '#hostTpl', width: 140}
             // ,{field: 'nickname', align: 'center',title: '鐢ㄦ埛鍚�'}
-            ,{field: 'username', align: 'center',title: '鐧诲綍璐︽埛'}
-            ,{field: 'mobile', align: 'center',title: '鎵嬫満鍙�'}
+            ,{field: 'username', align: 'center',title: '鐢ㄦ埛鍚�'}
+            ,{field: 'mobile', align: 'center',title: '璐﹀彿'}
             // ,{field: 'deptName', align: 'center',title: '鎵�灞為儴闂�'}
             ,{field: 'roleName', align: 'center',title: '瑙掕壊'}
             ,{field: 'email', align: 'center',title: '閭'}
diff --git a/src/main/webapp/views/commandManage/commandManage.html b/src/main/webapp/views/commandManage/commandManage.html
index 539c90c..8e3e6e2 100644
--- a/src/main/webapp/views/commandManage/commandManage.html
+++ b/src/main/webapp/views/commandManage/commandManage.html
@@ -40,7 +40,7 @@
 							<el-button type="primary" @click="resetParam">閲嶇疆</el-button>
 						</el-form-item>
 					</el-form>
-					<el-table ref="singleTable" :data="tableData" style="width: 100%;" :row-class-name="tableRowClassName">
+					<el-table border ref="singleTable" :data="tableData" style="width: 100%;" :row-class-name="tableRowClassName">
 						<el-table-column label="鎿嶄綔" width="100">
 							<template slot-scope="scope">
 								<el-dropdown @command="(command)=>{handleCommand(command, scope.row)}">
diff --git a/src/main/webapp/views/commandManageLog/commandManageLog.html b/src/main/webapp/views/commandManageLog/commandManageLog.html
index ea404b8..005d827 100644
--- a/src/main/webapp/views/commandManageLog/commandManageLog.html
+++ b/src/main/webapp/views/commandManageLog/commandManageLog.html
@@ -33,7 +33,7 @@
                     <el-button type="primary" @click="resetParam">閲嶇疆</el-button>
                 </el-form-item>
             </el-form>
-            <el-table ref="singleTable" :data="tableData" style="width: 100%;" :row-class-name="tableRowClassName">
+            <el-table border ref="singleTable" :data="tableData" style="width: 100%;" :row-class-name="tableRowClassName">
                 <el-table-column property="id" label="#ID">
                 </el-table-column>
                 <el-table-column property="wrkNo" label="宸ヤ綔鍙�">
diff --git a/src/main/webapp/views/deviceOperate/crnOperate.html b/src/main/webapp/views/deviceOperate/crnOperate.html
index f606a22..d09d214 100644
--- a/src/main/webapp/views/deviceOperate/crnOperate.html
+++ b/src/main/webapp/views/deviceOperate/crnOperate.html
@@ -14,7 +14,7 @@
 <body>
 	<div id="app" style="display: flex;justify-content: center;flex-wrap: wrap;">
 		<div style="width: 100%;">
-			<el-table ref="singleTable" :data="tableData" highlight-current-row @row-click="handleRowClick"
+			<el-table border ref="singleTable" :data="tableData" highlight-current-row @row-click="handleRowClick"
 				max-height="350" style="width: 100%">
 				<el-table-column property="crnNo" label="鍫嗗灈鏈�">
 				</el-table-column>
@@ -37,32 +37,51 @@
 					</div>
 					<div>
 						<el-form :model="formParam" label-position="top" :inline="true" class="demo-form-inline">
-							<el-form-item label="婧愮珯/婧愬簱浣�">
-								<el-input v-model="formParam.sourceStaNo" placeholder="婧愮珯/婧愬簱浣�"></el-input>
-							</el-form-item>
-							<el-form-item label="鎺�">
+<!--							<el-form-item label="婧愮珯/婧愬簱浣�">-->
+<!--								<el-input v-model="formParam.sourceStaNo" placeholder="婧愮珯/婧愬簱浣�"></el-input>-->
+<!--							</el-form-item>-->
+							<el-form-item label="婧愭帓">
 								<el-input v-model="formParam.sourceRow" placeholder="鎺�"></el-input>
 							</el-form-item>
-							<el-form-item label="鍒�">
+							<el-form-item label="婧愬垪">
 								<el-input v-model="formParam.sourceBay" placeholder="鍒�"></el-input>
 							</el-form-item>
-							<el-form-item label="灞�">
+							<el-form-item label="婧愬眰">
 								<el-input v-model="formParam.sourceLev" placeholder="灞�"></el-input>
 							</el-form-item>
 						</el-form>
 						<el-form :model="formParam" label-position="top" :inline="true" class="demo-form-inline">
-							<el-form-item label="鐩爣绔�/鐩爣搴撲綅">
-								<el-input v-model="formParam.staNo" placeholder="鐩爣绔�/鐩爣搴撲綅"></el-input>
-							</el-form-item>
-							<el-form-item label="鎺�">
+<!--							<el-form-item label="鐩爣绔�/鐩爣搴撲綅">-->
+<!--								<el-input v-model="formParam.staNo" placeholder="鐩爣绔�/鐩爣搴撲綅"></el-input>-->
+<!--							</el-form-item>-->
+							<el-form-item label="鐩爣鎺�">
 								<el-input v-model="formParam.row" placeholder="鎺�"></el-input>
 							</el-form-item>
-							<el-form-item label="鍒�">
+							<el-form-item label="鐩爣鍒�">
 								<el-input v-model="formParam.bay" placeholder="鍒�"></el-input>
 							</el-form-item>
-							<el-form-item label="灞�">
+							<el-form-item label="鐩爣灞�">
 								<el-input v-model="formParam.lev" placeholder="灞�"></el-input>
 							</el-form-item>
+						</el-form>
+						<el-form :model="formParam" label-position="top" :inline="true" class="demo-form-inline">
+							<el-form-item label="鎵樼洏鐮�">
+								<el-input v-model="formParam.barcode" placeholder="鏉$爜"></el-input>
+							</el-form-item>
+							<el-form-item label="鎵樼洏绫诲瀷">
+								<el-input v-model="formParam.barcodeType" placeholder="绫诲瀷"></el-input>
+							</el-form-item>
+							<el-form-item label="绌烘墭鐩�">
+								<el-select v-model="formParam.emptyContainer" placeholder="鏄惁涓虹┖鎵樼洏">
+									<el-option
+											v-for="item in options"
+											:key="item.value"
+											:label="item.label"
+											:value="item.value">
+									</el-option>
+								</el-select>
+							</el-form-item>
+
 						</el-form>
 						<el-form label-position="top" :inline="true" class="demo-form-inline">
 							<el-form-item label="">
@@ -188,10 +207,23 @@
 					staNo: null,
 					row: 1,
 					bay: 0,
-					lev: 1
+					lev: 1,
+					barcode:null,
+					barcodeType:null,
+					emptyContainer:null
 				},
 				enableIn: false,
-				enableOut: false
+				enableOut: false,
+				options:[
+					{
+						value:'1',
+						label:'鏄�'
+					},
+					{
+						value:'0',
+						label:'鍚�'
+					}
+				]
 			},
 			created() {
 				this.init()
diff --git a/src/main/webapp/views/deviceOperate/devpOperate.html b/src/main/webapp/views/deviceOperate/devpOperate.html
index 8dd7e98..b3a6b63 100644
--- a/src/main/webapp/views/deviceOperate/devpOperate.html
+++ b/src/main/webapp/views/deviceOperate/devpOperate.html
@@ -14,7 +14,7 @@
 <body>
 	<div id="app" style="display: flex;justify-content: center;flex-wrap: wrap;">
 		<div style="width: 100%;">
-			<el-table ref="singleTable" :data="tableData" highlight-current-row @row-click="handleRowClick"
+			<el-table border ref="singleTable" :data="tableData" highlight-current-row @row-click="handleRowClick"
 				max-height="450" style="width: 100%">
 				<el-table-column property="devNo" label="绔欏彿">
 				</el-table-column>
@@ -24,6 +24,8 @@
 				</el-table-column>
 				<el-table-column property="pakMk" label="鍏ュ簱鏍囪">
 				</el-table-column>
+				<el-table-column property="barcode" label="鏉$爜">
+				</el-table-column>
 			</el-table>
 		</div>
 
diff --git a/src/main/webapp/views/home/map.html b/src/main/webapp/views/home/map.html
index d9be059..fff16b3 100644
--- a/src/main/webapp/views/home/map.html
+++ b/src/main/webapp/views/home/map.html
@@ -390,8 +390,8 @@
 
                         <!--搴撲綅-->
                         <div v-else-if="map[index][idx].value  == 0" @contextmenu.prevent="rightEvent(index,idx,$event)">
-                            <div v-if="map[index][idx].locSts == 'O'" :class="{'pointBoxSearch':map[index][idx].searchStatus}" class="pointBox pointBoxBlue">{{ map[index][idx].locSts }}</div>
-                            <div v-else-if="map[index][idx].locSts == 'F'" @click.left="selectLoc(index,idx)" :class="{'pointBoxSelected':map[index][idx].locOutSelected,'pointBoxSearch':map[index][idx].searchStatus}" class="pointBox pointBoxRed">{{ map[index][idx].locSts }}</div>
+                            <div v-if="map[index][idx].locSts == 'K'" :class="{'pointBoxSearch':map[index][idx].searchStatus}" class="pointBox pointBoxBlue">{{ map[index][idx].locSts }}</div>
+                            <div v-else-if="map[index][idx].locSts == 'Z'" @click.left="selectLoc(index,idx)" :class="{'pointBoxSelected':map[index][idx].locOutSelected,'pointBoxSearch':map[index][idx].searchStatus}" class="pointBox pointBoxRed">{{ map[index][idx].locSts }}</div>
                             <div v-else-if="map[index][idx].locSts == 'D'" :class="{'pointBoxSearch':map[index][idx].searchStatus}" class="pointBox pointBoxEmpty">{{ map[index][idx].locSts }}</div>
                             <div v-else-if="map[index][idx].locSts == 'P'" :class="{'pointBoxSearch':map[index][idx].searchStatus}" class="pointBox pointBoxOut">{{ map[index][idx].locSts }}</div>
                             <div v-else-if="map[index][idx].locSts == 'R'" :class="{'pointBoxSearch':map[index][idx].searchStatus}" class="pointBox pointBoxOutYy">{{ map[index][idx].locSts }}</div>
@@ -538,6 +538,9 @@
                     搴撲綅鍙�: {{ map[mapI][mapJ].locNo }}
                 </div>
                 <div style="margin-top: 10px;">
+                    搴撲綅鍙�: {{ map[mapI][mapJ].locNo$}}
+                </div>
+                <div style="margin-top: 10px;">
                     搴撲綅鐘舵��: {{ getLocSts(map[mapI][mapJ].locSts) }}
                 </div>
                 <div style="margin-top: 10px;">
diff --git a/src/main/webapp/views/realtimeWatch/console.html b/src/main/webapp/views/realtimeWatch/console.html
index fbbfd6a..aa3bb0a 100644
--- a/src/main/webapp/views/realtimeWatch/console.html
+++ b/src/main/webapp/views/realtimeWatch/console.html
@@ -31,10 +31,36 @@
                 <h6>AUTOMATIC WAREHOUSE WCS MONITORING DIAGRAM</h6>
             </div>
         </div>
+        <div class="barcode1">
+            <span style="color: red" id="code1">1</span>
+        </div>
+        <div class="barcode2">
+            <span style="color: red" id="code2">2</span>
+        </div>
+        <div class="barcode3">
+            <span style="color: red" id="code3">3</span>
+        </div>
+        <div class="barcode4">
+            <span style="color: red" id="code4">4</span>
+        </div>
+        <div class="barcode5">
+            <span style="color: red" id="code5">5</span>
+        </div>
+        <div class="barcode6">
+            <span style="color: red" id="code6">6</span>
+        </div>
+        <div class="barcode7">
+            <span style="color: red" id="code7">7</span>
+        </div>
+        <div class="barcode8">
+            <span style="color: red" id="code8">8</span>
+        </div>
+
         <!-- 璐ф灦 + 鍫嗗灈鏈� + 鍏ュ簱绔欑偣 -->
         <div class="main-part">
 
         </div>
+
 
 <!--        &lt;!&ndash;璁惧鍒楄〃&ndash;&gt;-->
 <!--        <div class="device-info">-->
@@ -42,6 +68,7 @@
 <!--        </div>-->
 
         <div id="body">
+
             <!-- 鎬诲紑鍏� -->
             <div class="system-state">
                 <div class="body-head">鎬诲紑鍏�</div>
@@ -670,7 +697,7 @@
                 if (res.code === 200) {
                     var barcodes = res.data;
                     for (var i = 0; i < barcodes.length; i++) {
-                        $("#code-decoder-data-" + barcodes[i].barcodeId).html(barcodes[i].codeValue);
+                        $("#code" + barcodes[i].barcodeId).html(barcodes[i].codeValue);
                     }
                 } else if (res.code === 403) {
                     parent.location.href = baseUrl + "/login";
diff --git a/src/main/webapp/views/realtimeWatch/crn2.html b/src/main/webapp/views/realtimeWatch/crn2.html
index ad83a14..797c73e 100644
--- a/src/main/webapp/views/realtimeWatch/crn2.html
+++ b/src/main/webapp/views/realtimeWatch/crn2.html
@@ -51,45 +51,45 @@
       <!-- 鎵ц鍛戒护 -->
 
       <!-- 鎵ц鍛戒护 -->
-      <div class="command-log" style="overflow: auto;">
-        <h3>鎵ц涓殑鍛戒护</h3>
-        <div class="crn-command-item">
-          <label>1#</label>
-<!--          <button id="demoBtn-1" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
-          <!--            <span>&nbsp;</span>-->
-          <input id="crn1" disabled="disabled">
-        </div>
-        <div class="crn-command-item">
-          <label>2#</label>
-<!--          <button id="demoBtn-2" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
-          <!--            <span>&nbsp;</span>-->
-          <input id="crn2" disabled="disabled">
-        </div>
-        <div class="crn-command-item">
-          <label>3#</label>
-<!--          <button id="demoBtn-3" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
-          <!--            <span>&nbsp;</span>-->
-          <input id="crn3" disabled="disabled">
-        </div>
-        <div class="crn-command-item">
-          <label>4#</label>
-<!--          <button id="demoBtn-4" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
-          <!--            <span>&nbsp;</span>-->
-          <input id="crn4" disabled="disabled">
-        </div>
-        <div class="crn-command-item">
-          <label>5#</label>
-<!--          <button id="demoBtn-5" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
-          <!--            <span>&nbsp;</span>-->
-          <input id="crn5" disabled="disabled">
-        </div>
-        <div class="crn-command-item">
-          <label>6#</label>
-<!--          <button id="demoBtn-6" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
-          <!--            <span>&nbsp;</span>-->
-          <input id="crn6" disabled="disabled">
-        </div>
-      </div>
+<!--      <div class="command-log" style="overflow: auto;">-->
+<!--        <h3>鎵ц涓殑鍛戒护</h3>-->
+<!--        <div class="crn-command-item">-->
+<!--          <label>1#</label>-->
+<!--&lt;!&ndash;          <button id="demoBtn-1" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>&ndash;&gt;-->
+<!--          &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--          <input id="crn1" disabled="disabled">-->
+<!--        </div>-->
+<!--        <div class="crn-command-item">-->
+<!--          <label>2#</label>-->
+<!--&lt;!&ndash;          <button id="demoBtn-2" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>&ndash;&gt;-->
+<!--          &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--          <input id="crn2" disabled="disabled">-->
+<!--        </div>-->
+<!--        <div class="crn-command-item">-->
+<!--          <label>3#</label>-->
+<!--&lt;!&ndash;          <button id="demoBtn-3" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>&ndash;&gt;-->
+<!--          &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--          <input id="crn3" disabled="disabled">-->
+<!--        </div>-->
+<!--        <div class="crn-command-item">-->
+<!--          <label>4#</label>-->
+<!--&lt;!&ndash;          <button id="demoBtn-4" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>&ndash;&gt;-->
+<!--          &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--          <input id="crn4" disabled="disabled">-->
+<!--        </div>-->
+<!--        <div class="crn-command-item">-->
+<!--          <label>5#</label>-->
+<!--&lt;!&ndash;          <button id="demoBtn-5" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>&ndash;&gt;-->
+<!--          &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--          <input id="crn5" disabled="disabled">-->
+<!--        </div>-->
+<!--        <div class="crn-command-item">-->
+<!--          <label>6#</label>-->
+<!--&lt;!&ndash;          <button id="demoBtn-6" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>&ndash;&gt;-->
+<!--          &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--          <input id="crn6" disabled="disabled">-->
+<!--        </div>-->
+<!--      </div>-->
       <!-- 鍫嗗灈鏈虹姸鎬佷綅淇℃伅 -->
       <div class="crn-state">
         <table id="crn-state-table">
diff --git a/src/main/webapp/views/saasLog/saasLog.html b/src/main/webapp/views/saasLog/saasLog.html
new file mode 100644
index 0000000..5be361c
--- /dev/null
+++ b/src/main/webapp/views/saasLog/saasLog.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/wms/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/wms/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/wms/css/cool.css" media="all">
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-form toolbar" id="search-box">
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <label class="layui-form-label">搴撲綅鍙�:</label>
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="loc_no" placeholder="璇疯緭鍏ュ簱浣嶅彿" autocomplete="off">
+                        </div>
+                        <label class="layui-form-label">鐗╂枡鍙�:</label>
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="matnr" placeholder="璇疯緭鍏ョ墿鏂欏彿" autocomplete="off">
+                        </div>
+                        <label class="layui-form-label">鎿嶄綔浜�:</label>
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="create_by_name" placeholder="璇疯緭鍏ユ搷浣滀汉" autocomplete="off">
+                        </div>
+                    </div>
+                    <div class="layui-inline">&emsp;
+                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
+                            <i class="layui-icon">&#xe615;</i>鎼滅储
+                        </button>
+                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
+                            <i class="layui-icon">&#xe666;</i>閲嶇疆
+                        </button>
+                    </div>
+                </div>
+            </div>
+            <table class="layui-hide" id="saasLog" lay-filter="saasLog"></table>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">鏂板</button>
+        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">瀵煎嚭</button>
+    </div>
+</script>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">淇敼</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">鍒犻櫎</a>
+</script>
+
+<script type="text/javascript" src="../../static/wms/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/wms/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/wms/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/wms/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/wms/js/saasLog/saasLog.js" charset="utf-8"></script>
+</body>
+<!-- 琛ㄥ崟寮圭獥 -->
+<script type="text/html" id="editDialog">
+    <form id="detail" lay-filter="detail" class="layui-form admin-form model-form">
+        <input name="id" type="hidden">
+        <div class="layui-row">
+            <div class="layui-col-md12">
+                <div class="layui-form-item">
+                    <label class="layui-form-label layui-form-required">id: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="id" placeholder="璇疯緭鍏d" lay-vertype="tips" lay-verify="required">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">{0:鍏ュ簱,1:鍑哄簱}: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="type" placeholder="璇疯緭鍏0:鍏ュ簱,1:鍑哄簱}">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="locNo" placeholder="璇疯緭鍏�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="matnr" placeholder="璇疯緭鍏�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="ioTime" id="ioTime$" placeholder="璇疯緭鍏�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="createBy" placeholder="璇疯緭鍏�">
+                    </div>
+                </div>
+
+             </div>
+        </div>
+        <hr class="layui-bg-gray">
+        <div class="layui-form-item text-right">
+            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">淇濆瓨</button>
+            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button>
+        </div>
+    </form>
+</script>
+</html>
+
diff --git a/src/main/webapp/views/taskWrk/taskWrk.html b/src/main/webapp/views/taskWrk/taskWrk.html
index befd375..aaabdef 100644
--- a/src/main/webapp/views/taskWrk/taskWrk.html
+++ b/src/main/webapp/views/taskWrk/taskWrk.html
@@ -17,19 +17,22 @@
 			<div style="width: 100%;">
 				<el-card class="box-card">
 					<el-form :inline="true" :model="tableSearchParam" class="demo-form-inline">
-						<el-form-item label="">
+						<el-form-item style="width: 100px;" label="">
 							<el-input v-model="tableSearchParam.task_no" placeholder="浠诲姟鍙�"></el-input>
 						</el-form-item>
-						<el-form-item label="">
-							<el-select v-model="tableSearchParam.status" placeholder="浠诲姟鐘舵��">
+						<el-form-item style="width: 100px;" label="">
+							<el-select v-model="tableSearchParam.status" placeholder="鐘舵��">
 								<el-option label="鎺ユ敹" value="1"></el-option>
 								<el-option label="娲惧彂" value="2"></el-option>
 								<el-option label="瀹岀粨" value="3"></el-option>
 								<el-option label="鍙栨秷" value="4"></el-option>
 							</el-select>
 						</el-form-item>
-						<el-form-item label="">
+						<el-form-item style="width: 100px;" label="">
 							<el-input v-model="tableSearchParam.wrk_no" placeholder="宸ヤ綔鍙�"></el-input>
+						</el-form-item>
+						<el-form-item label="">
+							<el-input v-model="tableSearchParam.barcode" placeholder="鎵樼洏鐮�"></el-input>
 						</el-form-item>
 						<el-form-item label="">
 							<el-date-picker
@@ -46,13 +49,40 @@
 							<el-button type="primary" @click="resetParam">閲嶇疆</el-button>
 						</el-form-item>
 					</el-form>
-					<el-table ref="singleTable" :data="tableData" style="width: 100%;">
-						<el-table-column label="鎿嶄綔" width="100">
+					<el-table border ref="singleTable" :data="tableData" style="width: 100%;">
+
+						<el-table-column sortable align="center" property="taskNo" label="浠诲姟鍙�" width="90">
+						</el-table-column>
+						<el-table-column sortable align="center" property="status$" label="浠诲姟鐘舵��" width="110">
+						</el-table-column>
+						<el-table-column sortable align="center" property="wrkNo" label="宸ヤ綔鍙�" width="90">
+						</el-table-column>
+						<el-table-column sortable align="center" property="createTime$" label="浠诲姟鏃堕棿" width="170">
+						</el-table-column>
+<!--						<el-table-column sortable align="center" property="durationTime" label="鎸佺画鏃堕暱">-->
+<!--						</el-table-column>-->
+						<el-table-column sortable align="center" property="ioType$" label="浠诲姟绫诲瀷">
+						</el-table-column>
+						<el-table-column sortable align="center" property="startPoint" label="璧风偣浣嶇疆">
+						</el-table-column>
+						<el-table-column sortable align="center" property="targetPoint" label="缁堢偣浣嶇疆">
+						</el-table-column>
+						<el-table-column sortable align="center" property="wrkSts$" label="宸ヤ綔鐘舵��">
+						</el-table-column>
+						<el-table-column sortable align="center" property="barcode" label="鎵樼洏鐮�">
+						</el-table-column>
+						<el-table-column sortable align="center" property="crnNo" label="鍫嗗灈鏈哄彿">
+						</el-table-column>
+						<el-table-column sortable align="center" property="ioPri$" label="浼樺厛绾�">
+						</el-table-column>
+						<el-table-column label="鎿嶄綔" width="100" align="center">
 							<template slot-scope="scope">
 								<el-dropdown @command="(command)=>{handleCommand(command, scope.row)}">
 									<el-button icon="el-icon-more" size="mini" type="primary"></el-button>
 									<el-dropdown-menu slot="dropdown">
 										<el-dropdown-item command="showCommand">鏌ョ湅鎸囦护</el-dropdown-item>
+										<el-dropdown-item command="upIoPri">澧炲姞浼樺厛绾�</el-dropdown-item>
+										<el-dropdown-item command="downIoPri">闄嶄綆浼樺厛绾�</el-dropdown-item>
 										<el-dropdown-item command="changeCommand">淇敼</el-dropdown-item>
 										<el-dropdown-item command="assign">娲惧彂</el-dropdown-item>
 										<el-dropdown-item command="complete">瀹岀粨</el-dropdown-item>
@@ -60,30 +90,6 @@
 									</el-dropdown-menu>
 								</el-dropdown>
 							</template>
-						</el-table-column>
-						<el-table-column property="taskNo" label="浠诲姟鍙�">
-						</el-table-column>
-						<el-table-column property="status$" label="浠诲姟鐘舵��">
-						</el-table-column>
-						<el-table-column property="wrkNo" label="宸ヤ綔鍙�">
-						</el-table-column>
-						<el-table-column property="createTime$" label="浠诲姟鏃堕棿">
-						</el-table-column>
-						<el-table-column property="durationTime" label="鎸佺画鏃堕暱">
-						</el-table-column>
-						<el-table-column property="ioType$" label="浠诲姟绫诲瀷">
-						</el-table-column>
-						<el-table-column property="startPoint" label="璧风偣浣嶇疆">
-						</el-table-column>
-						<el-table-column property="targetPoint" label="缁堢偣浣嶇疆">
-						</el-table-column>
-						<el-table-column property="wrkSts$" label="宸ヤ綔鐘舵��">
-						</el-table-column>
-						<el-table-column property="barcode" label="鎵樼洏鐮�">
-						</el-table-column>
-						<el-table-column property="crnNo" label="鍫嗗灈鏈哄彿">
-						</el-table-column>
-						<el-table-column property="ioPri" label="浼樺厛绾�">
 						</el-table-column>
 					</el-table>
 
@@ -130,6 +136,7 @@
 						status: null,
 						wrk_no: null,
 						datetime: null,
+						barcode:null
 					},
 					taskWrkFormVisible: false,
 					taskWrkForm: {},
@@ -209,6 +216,14 @@
 								//鏌ョ湅鎸囦护
 								this.showCommand(row)
 								break;
+							case "upIoPri":
+								//鏌ョ湅鎸囦护
+								this.upIoPri(row)
+								break;
+							case "downIoPri":
+								//鏌ョ湅鎸囦护
+								this.downIoPri(row)
+								break;
 							case "changeCommand":
 								//淇敼鎸囦护
 								this.changeCommand(row);
@@ -240,6 +255,64 @@
 							success: function(layero, index) {}
 						});
 					},
+					upIoPri(row) {
+						let that = this
+						$.ajax({
+							url: baseUrl + "/taskWrk/upIoPri",
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							data: {
+								taskNo: row.taskNo
+							},
+							method: 'POST',
+							success: function(res) {
+								if (res.code == 200) {
+									that.$message({
+										message: "澧炲姞鎴愬姛",
+										type: 'success'
+									});
+									that.getTableData()
+								} else if (res.code === 403) {
+									top.location.href = baseUrl + "/";
+								} else {
+									that.$message({
+										message: res.msg,
+										type: 'error'
+									});
+								}
+							}
+						});
+					},
+					downIoPri(row) {
+						let that = this
+						$.ajax({
+							url: baseUrl + "/taskWrk/downIoPri",
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							data: {
+								taskNo: row.taskNo
+							},
+							method: 'POST',
+							success: function(res) {
+								if (res.code == 200) {
+									that.$message({
+										message: "闄嶄綆鎴愬姛",
+										type: 'success'
+									});
+									that.getTableData()
+								} else if (res.code === 403) {
+									top.location.href = baseUrl + "/";
+								} else {
+									that.$message({
+										message: res.msg,
+										type: 'error'
+									});
+								}
+							}
+						});
+					},
 					changeCommand(row) {
 						//淇敼鎸囦护
 						this.taskWrkFormVisible = true
diff --git a/src/main/webapp/views/taskWrkLog/taskWrkLog.html b/src/main/webapp/views/taskWrkLog/taskWrkLog.html
index f99e294..2c57eb4 100644
--- a/src/main/webapp/views/taskWrkLog/taskWrkLog.html
+++ b/src/main/webapp/views/taskWrkLog/taskWrkLog.html
@@ -28,7 +28,7 @@
 							<el-button type="primary" @click="resetParam">閲嶇疆</el-button>
 						</el-form-item>
 					</el-form>
-					<el-table ref="singleTable" :data="tableData" style="width: 100%;">
+					<el-table border ref="singleTable" :data="tableData" style="width: 100%;">
 						<el-table-column label="鎿嶄綔" width="100">
 							<template slot-scope="scope">
 								<el-dropdown @command="(command)=>{handleCommand(command, scope.row)}">
diff --git a/src/main/webapp/views/user/user.html b/src/main/webapp/views/user/user.html
index ef2d052..acb747a 100644
--- a/src/main/webapp/views/user/user.html
+++ b/src/main/webapp/views/user/user.html
@@ -38,7 +38,7 @@
                                 </div>
                             </div>
                             <div class="layui-inline">
-                                <label class="layui-form-label">鎵嬫満鍙�:</label>
+                                <label class="layui-form-label">璐﹀彿:</label>
                                 <div class="layui-input-inline">
                                     <input name="mobile" class="layui-input" placeholder="杈撳叆鎵嬫満鍙�"/>
                                 </div>
@@ -103,7 +103,7 @@
 
             <div class="layui-col-md6">
                 <div class="layui-form-item">
-                    <label class="layui-form-label layui-form-required">鐧诲綍璐︽埛</label>
+                    <label class="layui-form-label layui-form-required">鐢ㄦ埛鍚�</label>
                     <div class="layui-input-block">
                         <input name="username" placeholder="璇疯緭鍏ョ櫥褰曡处鎴�" class="layui-input" lay-vertype="tips" lay-verify="required" required="">
                     </div>
@@ -125,7 +125,7 @@
 
             <div class="layui-col-md6">
                 <div class="layui-form-item">
-                    <label class="layui-form-label layui-form-required">鎵嬫満鍙�</label>
+                    <label class="layui-form-label layui-form-required">璐﹀彿</label>
                     <div class="layui-input-block">
                         <input name="mobile" placeholder="璇疯緭鍏ユ墜鏈哄彿" class="layui-input" lay-vertype="tips" lay-verify="required" required="">
                     </div>

--
Gitblit v1.9.1