From 519f42d527a1dd4917455609855f732b1eb0f7a0 Mon Sep 17 00:00:00 2001
From: zwl <1051256694@qq.com>
Date: 星期五, 20 三月 2026 11:08:11 +0800
Subject: [PATCH] 新增接口: 给mes提供机台及对应机台工位的冻结情况

---
 src/main/java/com/zy/api/service/HmesApiService.java                |    5 
 src/main/java/com/zy/api/service/impl/HmesApiServiceImpl.java       |  131 ++++++++++++++
 src/main/java/com/zy/api/entity/dto/HmesDeviceFreezeStatusDto.java  |   27 +++
 src/main/java/com/zy/api/controller/HmesApiController.java          |   38 ++++
 src/main/java/com/zy/api/entity/dto/HmesStationFreezeStatusDto.java |   26 ++
 version/doc/HMES对接接口说明_20260320.md                                  |  238 ++++++++++++++++++++++++++
 src/main/java/com/zy/api/controller/params/HmesBackLocParams.java   |   26 ++
 7 files changed, 491 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/zy/api/controller/HmesApiController.java b/src/main/java/com/zy/api/controller/HmesApiController.java
index cff31d2..f6c4a4f 100644
--- a/src/main/java/com/zy/api/controller/HmesApiController.java
+++ b/src/main/java/com/zy/api/controller/HmesApiController.java
@@ -5,6 +5,7 @@
 import com.core.annotations.ManagerAuth;
 import com.core.common.Cools;
 import com.core.common.R;
+import com.zy.api.controller.params.HmesBackLocParams;
 import com.zy.api.controller.params.ReceviceTaskParams;
 import com.zy.api.service.HmesApiService;
 import com.zy.asrs.entity.param.OpenOrderPakoutParam;
@@ -16,6 +17,7 @@
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.GetMapping;
 
 import java.util.Objects;
 
@@ -76,5 +78,41 @@
         return hmesApiService.releaseLock(params);
     }
 
+    /**
+     * 鑾峰彇鏈哄彴鍙婂搴斿伐浣嶅喕缁撴儏鍐�
+     * @author Ryan
+     * @date 2026/3/20 11:06
+     * @return com.core.common.R
+     */
+//    @ManagerAuth
+    @ApiOperation("鑾峰彇鏈哄彴鍙婂搴斿伐浣嶅喕缁撴儏鍐�")
+    @GetMapping("/work/freeze/status")
+    public R getDeviceFreezeStatus() {
+        return hmesApiService.getDeviceFreezeStatus();
+    }
+
+    /**
+     * 绌烘《/浣欐枡鍥炲簱
+     * @author Ryan
+     * @date 2026/3/20 11:28
+     * @param params
+     * @return com.core.common.R
+     */
+//    @ManagerAuth
+    @ApiOperation("绌烘《/浣欐枡鍥炲簱")
+    @PostMapping("/work/back/loc")
+    public R backLoc(@RequestBody HmesBackLocParams params) {
+        if (Objects.isNull(params)) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        if (Cools.isEmpty(params.getLocNo()) && Cools.isEmpty(params.getWorkNo()) && Cools.isEmpty(params.getBarcode())) {
+            return R.error("搴撲綅鍙穂locNo]銆佸伐浣滃彿[workNo]銆佹潯鐮乕barcode]涓嶈兘鍚屾椂涓虹┖");
+        }
+        if (Cools.isEmpty(params.getBackType())) {
+            return R.error("鍥炲簱绫诲瀷[backType]涓嶈兘涓虹┖");
+        }
+        return hmesApiService.backLoc(params);
+    }
+
 
 }
diff --git a/src/main/java/com/zy/api/controller/params/HmesBackLocParams.java b/src/main/java/com/zy/api/controller/params/HmesBackLocParams.java
new file mode 100644
index 0000000..b2861d8
--- /dev/null
+++ b/src/main/java/com/zy/api/controller/params/HmesBackLocParams.java
@@ -0,0 +1,26 @@
+package com.zy.api.controller.params;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "HmesBackLocParams", description = "HMES绌烘《/浣欐枡鍥炲簱鍙傛暟")
+public class HmesBackLocParams implements Serializable {
+
+    @ApiModelProperty("搴撲綅鍙凤紝MES浼樺厛浣跨敤璇ュ瓧娈靛畾浣嶄换鍔℃。鐩爣搴撲綅")
+    private String locNo;
+
+    @ApiModelProperty("宸ヤ綔鍙凤紝浼樺厛浣跨敤璇ュ瓧娈靛畾浣嶅洖搴撲换鍔�")
+    private String workNo;
+
+    @ApiModelProperty("鏉$爜锛宭ocNo銆亀orkNo涓虹┖鏃朵娇鐢ㄨ瀛楁瀹氫綅浠诲姟")
+    private String barcode;
+
+    @ApiModelProperty("鍥炲簱绫诲瀷锛欵MPTY/4/绌烘《/绌烘澘 鎴� SURPLUS/5/浣欐枡")
+    private String backType;
+}
diff --git a/src/main/java/com/zy/api/entity/dto/HmesDeviceFreezeStatusDto.java b/src/main/java/com/zy/api/entity/dto/HmesDeviceFreezeStatusDto.java
new file mode 100644
index 0000000..f290b95
--- /dev/null
+++ b/src/main/java/com/zy/api/entity/dto/HmesDeviceFreezeStatusDto.java
@@ -0,0 +1,27 @@
+package com.zy.api.entity.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "HmesDeviceFreezeStatusDto", description = "HMES鏈哄彴鍐荤粨鐘舵��")
+public class HmesDeviceFreezeStatusDto implements Serializable {
+
+    @ApiModelProperty("鏈哄彴鍙�")
+    private String devNo;
+
+    @ApiModelProperty("鏈哄彴绫诲瀷缂栫爜")
+    private String devType;
+
+    @ApiModelProperty("鍐荤粨鏍囪锛孻:鍐荤粨 N:鏈喕缁�")
+    private String freeze;
+
+    @ApiModelProperty("宸ヤ綅鍐荤粨鏄庣粏")
+    private List<HmesStationFreezeStatusDto> stationList;
+}
diff --git a/src/main/java/com/zy/api/entity/dto/HmesStationFreezeStatusDto.java b/src/main/java/com/zy/api/entity/dto/HmesStationFreezeStatusDto.java
new file mode 100644
index 0000000..a5d6f26
--- /dev/null
+++ b/src/main/java/com/zy/api/entity/dto/HmesStationFreezeStatusDto.java
@@ -0,0 +1,26 @@
+package com.zy.api.entity.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "HmesStationFreezeStatusDto", description = "HMES鏈哄彴宸ヤ綅鍐荤粨鐘舵��")
+public class HmesStationFreezeStatusDto implements Serializable {
+
+    @ApiModelProperty("宸ヤ綅搴撲綅鍙�")
+    private String locNo;
+
+    @ApiModelProperty("鏈哄彴宸ヤ綅椤哄簭")
+    private Integer orderNo;
+
+    @ApiModelProperty("宸ヤ綅绫诲瀷")
+    private String locType;
+
+    @ApiModelProperty("鍐荤粨鏍囪锛孻:鍐荤粨 N:鏈喕缁�")
+    private String freeze;
+}
diff --git a/src/main/java/com/zy/api/service/HmesApiService.java b/src/main/java/com/zy/api/service/HmesApiService.java
index 8930fae..b776adb 100644
--- a/src/main/java/com/zy/api/service/HmesApiService.java
+++ b/src/main/java/com/zy/api/service/HmesApiService.java
@@ -1,6 +1,7 @@
 package com.zy.api.service;
 
 import com.core.common.R;
+import com.zy.api.controller.params.HmesBackLocParams;
 import com.zy.api.controller.params.ReceviceTaskParams;
 import com.zy.asrs.entity.param.OpenOrderPakoutParam;
 
@@ -9,4 +10,8 @@
     R pubWorkTask(OpenOrderPakoutParam params);
 
     R releaseLock(ReceviceTaskParams params);
+
+    R getDeviceFreezeStatus();
+
+    R backLoc(HmesBackLocParams params);
 }
diff --git a/src/main/java/com/zy/api/service/impl/HmesApiServiceImpl.java b/src/main/java/com/zy/api/service/impl/HmesApiServiceImpl.java
index f00ac7f..045807b 100644
--- a/src/main/java/com/zy/api/service/impl/HmesApiServiceImpl.java
+++ b/src/main/java/com/zy/api/service/impl/HmesApiServiceImpl.java
@@ -6,6 +6,9 @@
 import com.core.common.R;
 import com.core.common.SnowflakeIdWorker;
 import com.core.exception.CoolException;
+import com.zy.api.controller.params.HmesBackLocParams;
+import com.zy.api.entity.dto.HmesDeviceFreezeStatusDto;
+import com.zy.api.entity.dto.HmesStationFreezeStatusDto;
 import com.zy.api.controller.params.ReceviceTaskParams;
 import com.zy.api.service.HmesApiService;
 import com.zy.api.service.WcsApiService;
@@ -28,6 +31,8 @@
 @Service
 @Slf4j
 public class HmesApiServiceImpl implements HmesApiService {
+
+    private static final Long HMES_USER_ID = 9995L;
 
     @Autowired
     private BasDeviceService basDeviceService;
@@ -61,6 +66,12 @@
     private OrderDetlPakoutServiceImpl orderDetlPakoutService;
     @Autowired
     private LocDetlServiceImpl locDetlService;
+
+    @Autowired
+    private WrkMastService wrkMastService;
+
+    @Autowired
+    private WorkService workService;
 
 
     /**
@@ -238,4 +249,124 @@
         });
         return R.ok(s+"鎴愬姛 锛侊紒");
     }
+
+    @Override
+    public R getDeviceFreezeStatus() {
+        List<BasDevice> devices = basDeviceService.selectList(new EntityWrapper<BasDevice>()
+                .eq("status", 1)
+                .orderBy("dev_no", true));
+        if (Cools.isEmpty(devices)) {
+            return R.ok(Collections.emptyList());
+        }
+
+        List<LocAroundBind> binds = locAroundBindService.selectList(new EntityWrapper<LocAroundBind>()
+                .orderBy("dev_no", true)
+                .orderBy("order_no", true)
+                .orderBy("id", true));
+        Map<String, List<LocAroundBind>> bindMap = new HashMap<>();
+        if (!Cools.isEmpty(binds)) {
+            bindMap = binds.stream()
+                    .filter(bind -> !Cools.isEmpty(bind.getDevNo()))
+                    .collect(Collectors.groupingBy(LocAroundBind::getDevNo, LinkedHashMap::new, Collectors.toList()));
+        }
+
+        List<HmesDeviceFreezeStatusDto> result = new ArrayList<>();
+        for (BasDevice device : devices) {
+            List<LocAroundBind> deviceBinds = bindMap.getOrDefault(device.getType(), Collections.emptyList());
+            List<HmesStationFreezeStatusDto> stationList = deviceBinds.stream()
+                    .sorted(Comparator.comparing(LocAroundBind::getOrderNo, Comparator.nullsLast(Integer::compareTo))
+                            .thenComparing(LocAroundBind::getId, Comparator.nullsLast(Long::compareTo)))
+                    .map(this::buildStationFreezeStatus)
+                    .collect(Collectors.toList());
+            boolean frozen = stationList.stream().anyMatch(station -> "Y".equals(station.getFreeze()));
+            result.add(new HmesDeviceFreezeStatusDto()
+                    .setDevNo(device.getDevNo())
+                    .setDevType(device.getType())
+                    .setFreeze(toFreezeFlag(frozen ? 1 : 0))
+                    .setStationList(stationList));
+        }
+        return R.ok(result);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R backLoc(HmesBackLocParams params) {
+        Integer backType = parseBackType(params.getBackType());
+        if (backType == null) {
+            return R.error("鍥炲簱绫诲瀷[backType]浠呮敮鎸� EMPTY/4/绌烘《/绌烘澘 鎴� SURPLUS/5/浣欐枡");
+        }
+
+        WrkMast mast = findBackLocWrkMast(params);
+        if (Objects.isNull(mast)) {
+            return R.error("鏈煡璇㈠埌鍙洖搴撶殑浠诲姟妗�");
+        }
+        if (!Objects.equals(mast.getWrkSts(), 15L)) {
+            return R.error("褰撳墠浠诲姟鐘舵�佷笉鑳芥墽琛屽洖搴擄紒");
+        }
+
+        workService.updateWrkIsSuplus(String.valueOf(mast.getWrkNo()), HMES_USER_ID, backType);
+        return workService.backLocOperation(String.valueOf(mast.getWrkNo()), HMES_USER_ID);
+    }
+
+    private HmesStationFreezeStatusDto buildStationFreezeStatus(LocAroundBind bind) {
+        return new HmesStationFreezeStatusDto()
+                .setLocNo(bind.getBlocNo())
+                .setOrderNo(bind.getOrderNo())
+                .setLocType(bind.getLocType())
+                .setFreeze(toFreezeFlag(bind.getFreeze()));
+    }
+
+    private String toFreezeFlag(Integer freeze) {
+        return Objects.equals(freeze, 1) ? "Y" : "N";
+    }
+
+    private Integer parseBackType(String backType) {
+        if (Cools.isEmpty(backType)) {
+            return null;
+        }
+        String normalized = backType.trim().toUpperCase(Locale.ROOT);
+        if ("4".equals(normalized) || "EMPTY".equals(normalized) || "EMPTY_BUCKET".equals(normalized)
+                || "EMPTY_PLATE".equals(normalized) || "绌烘《".equals(backType.trim())
+                || "绌烘澘".equals(backType.trim())) {
+            return 4;
+        }
+        if ("5".equals(normalized) || "SURPLUS".equals(normalized) || "SUPLUS".equals(normalized)
+                || "LEFTOVER".equals(normalized) || "浣欐枡".equals(backType.trim())) {
+            return 5;
+        }
+        return null;
+    }
+
+    private WrkMast findBackLocWrkMast(HmesBackLocParams params) {
+        if (!Cools.isEmpty(params.getLocNo())) {
+            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                    .eq("loc_no", params.getLocNo())
+                    .orderBy("appe_time", false)
+                    .orderBy("wrk_no", false));
+            WrkMast matched = pickLatestCompletedWrkMast(wrkMasts);
+            if (matched != null) {
+                return matched;
+            }
+        }
+        if (!Cools.isEmpty(params.getWorkNo())) {
+            return wrkMastService.selectById(params.getWorkNo());
+        }
+        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                .eq("barcode", params.getBarcode())
+                .orderBy("appe_time", false)
+                .orderBy("wrk_no", false));
+        return pickLatestCompletedWrkMast(wrkMasts);
+    }
+
+    private WrkMast pickLatestCompletedWrkMast(List<WrkMast> wrkMasts) {
+        if (Cools.isEmpty(wrkMasts)) {
+            return null;
+        }
+        for (WrkMast wrkMast : wrkMasts) {
+            if (Objects.equals(wrkMast.getWrkSts(), 15L)) {
+                return wrkMast;
+            }
+        }
+        return wrkMasts.get(0);
+    }
 }
diff --git "a/version/doc/HMES\345\257\271\346\216\245\346\216\245\345\217\243\350\257\264\346\230\216_20260320.md" "b/version/doc/HMES\345\257\271\346\216\245\346\216\245\345\217\243\350\257\264\346\230\216_20260320.md"
new file mode 100644
index 0000000..80d34db
--- /dev/null
+++ "b/version/doc/HMES\345\257\271\346\216\245\346\216\245\345\217\243\350\257\264\346\230\216_20260320.md"
@@ -0,0 +1,238 @@
+# HMES 瀵规帴鎺ュ彛璇存槑
+
+## 1. 鏂囨。璇存槑
+
+- 鏂囨。涓婚锛欻MES 涓� WCS 鏂板鎺ュ彛瀵规帴璇存槑
+- 閫傜敤鑼冨洿锛氭満鍙板喕缁撶姸鎬佹煡璇€�佺┖妗�/浣欐枡鍥炲簱
+- 鏇存柊鏃堕棿锛�2026-03-20
+- 鏈嶅姟鍓嶇紑锛歚/api`
+
+## 2. 閫氱敤绾﹀畾
+
+### 2.1 璇锋眰鍗忚
+
+- 鍗忚锛欻TTP
+- 鏁版嵁鏍煎紡锛歚application/json`
+- 瀛楃闆嗭細`UTF-8`
+
+### 2.2 鍝嶅簲鏍煎紡
+
+绯荤粺缁熶竴浣跨敤 `R` 缁撴瀯杩斿洖锛屽熀纭�鏍煎紡濡備笅锛�
+
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛",
+  "data": {}
+}
+```
+
+瀛楁璇存槑锛�
+
+- `code`锛氫笟鍔$姸鎬佺爜锛宍200` 琛ㄧず鎴愬姛锛宍500` 琛ㄧず澶辫触
+- `msg`锛氫笟鍔℃彁绀轰俊鎭�
+- `data`锛氳繑鍥炴暟鎹綋锛屼粎瀵硅薄/鏁扮粍绫绘垚鍔熺粨鏋滆繑鍥炶瀛楁
+
+璇存槑锛�
+
+- 褰撴帴鍙h繑鍥� `R.ok(瀵硅薄/鏁扮粍)` 鏃讹紝涓氬姟鏁版嵁鏀惧湪 `data`
+- 褰撴帴鍙h繑鍥� `R.ok("鎴愬姛娑堟伅")` 鏃讹紝浠呰繑鍥� `code` + `msg`锛屼笉杩斿洖 `data`
+
+## 3. 鎺ュ彛涓�锛氳幏鍙栨満鍙板強瀵瑰簲宸ヤ綅鍐荤粨鎯呭喌
+
+### 3.1 鎺ュ彛鐩爣
+
+渚� MES 鏌ヨ褰撳墠鎵�鏈夊惎鐢ㄦ満鍙帮紝浠ュ強姣忓彴鏈哄彴缁戝畾宸ヤ綅鐨勫喕缁撶姸鎬併��
+
+### 3.2 璇锋眰淇℃伅
+
+- 璇锋眰璺緞锛歚GET /api/work/freeze/status`
+- 璇锋眰鏂瑰紡锛歚GET`
+- 璇锋眰鍙傛暟锛氭棤
+
+### 3.3 杩斿洖瑙勫垯
+
+- 鏌ヨ鑼冨洿锛歚asr_bas_device.status = 1` 鐨勫惎鐢ㄦ満鍙�
+- 宸ヤ綅鏁版嵁鏉ユ簮锛歚asr_loc_around_bind`
+- 鏈哄彴鍐荤粨鐘舵�佸垽瀹氾細
+  - 鍙璇ユ満鍙颁换涓�缁戝畾宸ヤ綅 `freeze = 1`锛屽垯鏈哄彴 `freeze = "Y"`
+  - 鍚﹀垯鏈哄彴 `freeze = "N"`
+- 宸ヤ綅鍐荤粨鐘舵�佸垽瀹氾細
+  - `freeze = 1` 杩斿洖 `"Y"`
+  - 鍏朵粬杩斿洖 `"N"`
+
+### 3.4 鎴愬姛杩斿洖绀轰緥
+
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛",
+  "data": [
+    {
+      "devNo": "M01",
+      "devType": "JT01",
+      "freeze": "Y",
+      "stationList": [
+        {
+          "locNo": "01010101",
+          "orderNo": 1,
+          "locType": "R",
+          "freeze": "Y"
+        },
+        {
+          "locNo": "01010102",
+          "orderNo": 2,
+          "locType": "R",
+          "freeze": "N"
+        }
+      ]
+    },
+    {
+      "devNo": "M02",
+      "devType": "JT02",
+      "freeze": "N",
+      "stationList": []
+    }
+  ]
+}
+```
+
+### 3.5 杩斿洖瀛楁璇存槑
+
+鏈哄彴瀛楁锛�
+
+- `devNo`锛氭満鍙板彿
+- `devType`锛氭満鍙扮被鍨嬬紪鐮�
+- `freeze`锛氭満鍙板喕缁撴爣璁帮紝`Y` 鍐荤粨锛宍N` 鏈喕缁�
+- `stationList`锛氳鏈哄彴缁戝畾宸ヤ綅鍒楄〃
+
+宸ヤ綅瀛楁锛�
+
+- `locNo`锛氬伐浣嶅搴斿簱浣嶅彿
+- `orderNo`锛氭満鍙板伐浣嶉『搴�
+- `locType`锛氬伐浣嶇姸鎬佺被鍨�
+- `freeze`锛氬伐浣嶅喕缁撴爣璁帮紝`Y` 鍐荤粨锛宍N` 鏈喕缁�
+
+### 3.6 澶辫触鍦烘櫙
+
+璇ユ帴鍙f甯告儏鍐典笅杩斿洖鎴愬姛锛涜嫢鏈嶅姟寮傚父锛屽垯杩斿洖锛�
+
+```json
+{
+  "code": 500,
+  "msg": "鏈嶅姟鍣ㄩ敊璇�"
+}
+```
+
+## 4. 鎺ュ彛浜岋細绌烘《/浣欐枡鍥炲簱
+
+### 4.1 鎺ュ彛鐩爣
+
+渚� MES 鍦ㄦ満鍙颁綔涓氬畬鎴愬悗锛屽彂璧风┖妗跺洖搴撴垨浣欐枡鍥炲簱銆�
+
+### 4.2 璇锋眰淇℃伅
+
+- 璇锋眰璺緞锛歚POST /api/work/back/loc`
+- 璇锋眰鏂瑰紡锛歚POST`
+- 璇锋眰绫诲瀷锛歚application/json`
+
+### 4.3 璇锋眰鍙傛暟
+
+```json
+{
+  "locNo": "01010101",
+  "backType": "EMPTY"
+}
+```
+
+瀛楁璇存槑锛�
+
+- `locNo`锛氬簱浣嶅彿锛孧ES 鎺ㄨ崘浣跨敤璇ュ瓧娈碉紝绯荤粺鎸変换鍔℃。鐩爣搴撲綅 `loc_no` 鍖归厤
+- `workNo`锛氬伐浣滃彿锛屽吋瀹逛繚鐣�
+- `barcode`锛氭潯鐮侊紝鍏煎淇濈暀
+- `backType`锛氬洖搴撶被鍨嬶紝蹇呭~
+
+`backType` 鏀寔鍊硷細
+
+- `EMPTY`
+- `4`
+- `绌烘《`
+- `绌烘澘`
+- `SURPLUS`
+- `5`
+- `浣欐枡`
+
+绫诲瀷鏄犲皠瑙勫垯锛�
+
+- `EMPTY / 4 / 绌烘《 / 绌烘澘`锛氭寜绌烘《鍥炲簱澶勭悊锛岀郴缁熷唴閮ㄦ槧灏勪负 `isSuplus = 0`
+- `SURPLUS / 5 / 浣欐枡`锛氭寜浣欐枡鍥炲簱澶勭悊锛岀郴缁熷唴閮ㄦ槧灏勪负 `isSuplus = 1`
+
+### 4.4 澶勭悊瑙勫垯
+
+1. 鑻ヤ紶鍏� `locNo`锛岀郴缁熶紭鍏堟寜浠诲姟妗g洰鏍囧簱浣� `loc_no = locNo` 鏌ヨ
+2. 鑻� `locNo` 鏈紶锛屽啀鎸� `workNo` 鏌ヨ
+3. 鑻� `locNo`銆乣workNo` 鍧囦负绌猴紝鍒欐寜 `barcode` 鏌ヨ
+4. 褰撳悓涓�鏉′欢鍛戒腑澶氭潯浠诲姟妗f椂锛屼紭鍏堝彇 `wrk_sts = 15` 鐨勬渶鏂颁换鍔�
+5. 浠诲姟鐘舵�佸繀椤讳负 `15`锛屽惁鍒欎笉鍏佽鎵ц鍥炲簱
+6. 绯荤粺鍏堟洿鏂颁换鍔℃。鍥炲簱绫诲瀷锛屽啀璋冪敤鐜版湁鍥炲簱浠诲姟鐢熸垚娴佺▼
+
+### 4.5 鎴愬姛杩斿洖绀轰緥
+
+```json
+{
+  "code": 200,
+  "msg": "鐢熸垚鍥炲簱浠诲姟鎴愬姛锛侊紒"
+}
+```
+
+### 4.6 澶辫触杩斿洖绀轰緥
+
+1. 鍙傛暟缂哄け
+
+```json
+{
+  "code": 500,
+  "msg": "搴撲綅鍙穂locNo]銆佸伐浣滃彿[workNo]銆佹潯鐮乕barcode]涓嶈兘鍚屾椂涓虹┖"
+}
+```
+
+2. 鍥炲簱绫诲瀷閿欒
+
+```json
+{
+  "code": 500,
+  "msg": "鍥炲簱绫诲瀷[backType]浠呮敮鎸� EMPTY/4/绌烘《/绌烘澘 鎴� SURPLUS/5/浣欐枡"
+}
+```
+
+3. 鏈壘鍒颁换鍔�
+
+```json
+{
+  "code": 500,
+  "msg": "鏈煡璇㈠埌鍙洖搴撶殑浠诲姟妗�"
+}
+```
+
+4. 浠诲姟鐘舵�佷笉鍏佽鍥炲簱
+
+```json
+{
+  "code": 500,
+  "msg": "褰撳墠浠诲姟鐘舵�佷笉鑳芥墽琛屽洖搴擄紒"
+}
+```
+
+## 5. 鑱旇皟娉ㄦ剰浜嬮」
+
+- 寤鸿 MES 鍙戣捣鍥炲簱鏃朵紭鍏堜紶 `workNo`锛岄伩鍏嶅悓涓�鏉$爜瀛樺湪澶氭潯鍘嗗彶浠诲姟鏃跺畾浣嶆涔�
+- 褰撳墠鎺ㄨ崘 MES 鐩存帴浼� `locNo + backType`
+- 鑻ュ悓涓�搴撲綅鍛戒腑澶氭潯鍘嗗彶浠诲姟锛岀郴缁熶細浼樺厛閫夊彇鐘舵�佷负 `15` 鐨勬渶鏂颁换鍔�
+- 鑻� MES 鍙紶鏉$爜锛岀郴缁熶篃浼氫紭鍏堥�夊彇鐘舵�佷负 `15` 鐨勬渶鏂颁换鍔�
+- 鍥炲簱鎺ュ彛鍙礋璐g敓鎴愬洖搴撲换鍔★紝涓嶄唬琛ㄥ爢鍨涙満宸插畬鎴愬叆搴�
+- 鏈哄彴鍐荤粨鏌ヨ鎺ュ彛杩斿洖鐨勬槸褰撳墠绯荤粺瀹炴椂鐘舵�侊紝MES 涓嶅簲鑷缂撳瓨杩囦箙
+
+## 6. 鏈鏂板鎺ュ彛娓呭崟
+
+- `GET /api/work/freeze/status`
+- `POST /api/work/back/loc`

--
Gitblit v1.9.1