| src/main/java/com/zy/api/controller/HmesApiController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/api/controller/params/HmesBackLocParams.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/api/entity/dto/HmesDeviceFreezeStatusDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/api/entity/dto/HmesStationFreezeStatusDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/api/service/HmesApiService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/api/service/impl/HmesApiServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| version/doc/HMES对接接口说明_20260320.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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); } } src/main/java/com/zy/api/controller/params/HmesBackLocParams.java
New file @@ -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("æ¡ç ï¼locNoãworkNo为空æ¶ä½¿ç¨è¯¥å段å®ä½ä»»å¡") private String barcode; @ApiModelProperty("ååºç±»åï¼EMPTY/4/空桶/ç©ºæ¿ æ SURPLUS/5/使") private String backType; } src/main/java/com/zy/api/entity/dto/HmesDeviceFreezeStatusDto.java
New file @@ -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("å»ç»æ è®°ï¼Y:å»ç» N:æªå»ç»") private String freeze; @ApiModelProperty("å·¥ä½å»ç»æç»") private List<HmesStationFreezeStatusDto> stationList; } src/main/java/com/zy/api/entity/dto/HmesStationFreezeStatusDto.java
New file @@ -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("å»ç»æ è®°ï¼Y:å»ç» N:æªå»ç»") private String freeze; } 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); } 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); } } version/doc/HMES¶Ô½Ó½Ó¿Ú˵Ã÷_20260320.md
New file @@ -0,0 +1,238 @@ # HMES å¯¹æ¥æ¥å£è¯´æ ## 1. ææ¡£è¯´æ - ææ¡£ä¸»é¢ï¼HMES ä¸ WCS æ°å¢æ¥å£å¯¹æ¥è¯´æ - éç¨èå´ï¼æºå°å»ç»ç¶ææ¥è¯¢ã空桶/使ååº - æ´æ°æ¶é´ï¼2026-03-20 - æå¡åç¼ï¼`/api` ## 2. éç¨çº¦å® ### 2.1 请æ±åè®® - åè®®ï¼HTTP - æ°æ®æ ¼å¼ï¼`application/json` - å符éï¼`UTF-8` ### 2.2 ååºæ ¼å¼ ç³»ç»ç»ä¸ä½¿ç¨ `R` ç»æè¿åï¼åºç¡æ ¼å¼å¦ä¸ï¼ ```json { "code": 200, "msg": "æä½æå", "data": {} } ``` åæ®µè¯´æï¼ - `code`ï¼ä¸å¡ç¶æç ï¼`200` 表示æåï¼`500` 表示失败 - `msg`ï¼ä¸å¡æç¤ºä¿¡æ¯ - `data`ï¼è¿åæ°æ®ä½ï¼ä» 对象/æ°ç»ç±»æåç»æè¿åè¯¥åæ®µ 说æï¼ - 彿¥å£è¿å `R.ok(对象/æ°ç»)` æ¶ï¼ä¸å¡æ°æ®æ¾å¨ `data` - 彿¥å£è¿å `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 å¤±è´¥åºæ¯ 该æ¥å£æ£å¸¸æ åµä¸è¿åæåï¼è¥æå¡å¼å¸¸ï¼åè¿åï¼ ```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`ï¼åºä½å·ï¼MES æ¨è使ç¨è¯¥å段ï¼ç³»ç»æä»»å¡æ¡£ç®æ åºä½ `loc_no` å¹é - `workNo`ï¼å·¥ä½å·ï¼å ¼å®¹ä¿ç - `barcode`ï¼æ¡ç ï¼å ¼å®¹ä¿ç - `backType`ï¼ååºç±»åï¼å¿ å¡« `backType` æ¯æå¼ï¼ - `EMPTY` - `4` - `空桶` - `空æ¿` - `SURPLUS` - `5` - `使` ç±»åæ å°è§åï¼ - `EMPTY / 4 / 空桶 / 空æ¿`ï¼æç©ºæ¡¶ååºå¤çï¼ç³»ç»å 鍿 å°ä¸º `isSuplus = 0` - `SURPLUS / 5 / 使`ï¼æä½æååºå¤çï¼ç³»ç»å 鍿 å°ä¸º `isSuplus = 1` ### 4.4 å¤çè§å 1. è¥ä¼ å ¥ `locNo`ï¼ç³»ç»ä¼å æä»»å¡æ¡£ç®æ åºä½ `loc_no = locNo` æ¥è¯¢ 2. è¥ `locNo` æªä¼ ï¼åæ `workNo` æ¥è¯¢ 3. è¥ `locNo`ã`workNo` å为空ï¼åæ `barcode` æ¥è¯¢ 4. å½å䏿¡ä»¶å½ä¸å¤æ¡ä»»å¡æ¡£æ¶ï¼ä¼å å `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` çææ°ä»»å¡ - ååºæ¥å£åªè´è´£çæååºä»»å¡ï¼ä¸ä»£è¡¨å åæºå·²å®æå ¥åº - æºå°å»ç»æ¥è¯¢æ¥å£è¿åçæ¯å½åç³»ç»å®æ¶ç¶æï¼MES ä¸åºèªè¡ç¼åè¿ä¹ ## 6. æ¬æ¬¡æ°å¢æ¥å£æ¸ å - `GET /api/work/freeze/status` - `POST /api/work/back/loc`