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/impl/HmesApiServiceImpl.java | 213 +++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 181 insertions(+), 32 deletions(-)
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 4bd4a81..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;
@@ -17,6 +20,7 @@
import com.zy.asrs.service.impl.OrderDetlPakoutServiceImpl;
import com.zy.asrs.service.impl.OrderPakoutServiceImpl;
import com.zy.common.model.DetlDto;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -25,7 +29,10 @@
import java.util.stream.Collectors;
@Service
+@Slf4j
public class HmesApiServiceImpl implements HmesApiService {
+
+ private static final Long HMES_USER_ID = 9995L;
@Autowired
private BasDeviceService basDeviceService;
@@ -60,6 +67,12 @@
@Autowired
private LocDetlServiceImpl locDetlService;
+ @Autowired
+ private WrkMastService wrkMastService;
+
+ @Autowired
+ private WorkService workService;
+
/**
* 鎺ユ敹MES绌跨嚎浠诲姟
@@ -75,12 +88,60 @@
// 濡傛灉鍗曟嵁涓嶅瓨鍦ㄥ垯娣诲姞锛涘鏋滃崟鎹瓨鍦紝浣滀笟涓棤娉曚慨鏀癸紝鍙嶄箣鍒欎慨鏀瑰崟鎹�
if (!Cools.isEmpty(order)) {
if (order.getSettle() > 1L) {
+ log.error(param.getOrderNo() + "姝e湪鍑哄簱锛屾棤娉曚慨鏀瑰崟鎹�");
throw new CoolException(param.getOrderNo() + "姝e湪鍑哄簱锛屾棤娉曚慨鏀瑰崟鎹�");
}
orderPakoutService.remove(order.getId());
}
DocType docType = docTypeService.selectOrAdd(param.getBillType(), Boolean.FALSE);
Date now = new Date();
+
+ // 鍗曟嵁鏄庣粏妗�
+ List<DetlDto> list = new ArrayList<>();
+ List<DetlDto> orderDetails = param.getMatList();
+ for (DetlDto detail : orderDetails) {
+ DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(),detail.getBrand(),detail.getDevNo(),detail.getStandby2(),detail.getStandby3(),detail.getLineNumber(),
+ detail.getBoxType1(),detail.getBoxType2(),detail.getBoxType3(), detail.getAnfme());
+ if (DetlDto.hasLineNumber(list, dto)) {
+ DetlDto detlDto = DetlDto.findLineNumber(list, dto.getMatnr(), dto.getBatch(),dto.getBrand(),dto.getDevNo(),dto.getStandby2(),dto.getStandby3(),dto.getLineNumber(),
+ dto.getBoxType1(),dto.getBoxType2(),dto.getBoxType3());
+ assert detlDto != null;
+ detlDto.setAnfme(detlDto.getAnfme() + detail.getAnfme());
+ } else {
+ list.add(dto);
+ }
+ }
+
+ //涓嬪彂鐨勮鍗曟槑缁嗭紝鏌ョ湅搴撳瓨鏄惁鏈夎冻澶熺殑搴撳瓨锛屾帓闄ゆ満鍙扮殑搴撲綅
+ for (DetlDto detail : list) {
+ List<LocDetl> matnr = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("matnr", detail.getMatnr()));
+ Double count=0.0;
+ for (LocDetl detl : matnr) {
+ LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", detl.getLocNo()).eq("loc_sts","F"));
+ if (locMast != null) {
+ LocAroundBind bLocNo = locAroundBindService.selectOne(new EntityWrapper<LocAroundBind>().eq("b_loc_no", locMast.getLocNo()));
+ if (Cools.isEmpty(bLocNo)) {
+ count=detl.getAnfme()+count;
+ }
+ }
+ }
+ if (count<detail.getAnfme()) {
+ return R.error("鐗╂枡="+detail.getMatnr()+"搴撳瓨涓嶈冻鏃犳硶鐢熸垚璁㈠崟");
+ }
+ //鏈哄彴鏈夊喕缁撴椂绂佹鍛煎彨鐗╂枡
+ BasDevice basDevice = basDeviceService.selectOne(new EntityWrapper<BasDevice>()
+ .eq("status", 1)
+ .eq("dev_no", detail.getStandby1()));
+ if (Objects.isNull(basDevice)) {
+ return R.error(detail.getStandby1()+"鏈哄彴淇℃伅涓嶅瓨鍦ㄦ垨宸茬鐢紒锛�");
+ }
+ List<LocAroundBind> binds = locAroundBindService.selectList(new EntityWrapper<LocAroundBind>()
+ .eq("dev_no", basDevice.getType())
+ .eq("freeze", 1));
+ if (!Cools.isEmpty(binds)) {
+ return R.error(detail.getStandby1()+"鏈哄彴琚喕缁撴棤娉曞懠鍙墿鏂�");
+ }
+ }
// 鍗曟嵁涓绘。
order = new OrderPakout(
String.valueOf(snowflakeIdWorker.nextId()), // 缂栧彿[闈炵┖]
@@ -120,38 +181,6 @@
);
if (!orderPakoutService.insert(order)) {
throw new CoolException("鐢熸垚鍗曟嵁涓绘。澶辫触锛岃鑱旂郴绠$悊鍛�");
- }
- // 鍗曟嵁鏄庣粏妗�
- List<DetlDto> list = new ArrayList<>();
- List<DetlDto> orderDetails = param.getMatList();
- for (DetlDto detail : orderDetails) {
- DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(),detail.getBrand(),detail.getDevNo(),detail.getStandby2(),detail.getStandby3(),detail.getLineNumber(),
- detail.getBoxType1(),detail.getBoxType2(),detail.getBoxType3(), detail.getAnfme());
- if (DetlDto.hasLineNumber(list, dto)) {
- DetlDto detlDto = DetlDto.findLineNumber(list, dto.getMatnr(), dto.getBatch(),dto.getBrand(),dto.getDevNo(),dto.getStandby2(),dto.getStandby3(),dto.getLineNumber(),
- dto.getBoxType1(),dto.getBoxType2(),dto.getBoxType3());
- assert detlDto != null;
- detlDto.setAnfme(detlDto.getAnfme() + detail.getAnfme());
- } else {
- list.add(dto);
- }
- }
- //涓嬪彂鐨勮鍗曟槑缁嗭紝鏌ョ湅搴撳瓨鏄惁鏈夎冻澶熺殑搴撳瓨锛屾帓闄ゆ満鍙扮殑搴撲綅
- for (DetlDto detail : list) {
- List<LocDetl> matnr = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("matnr", detail.getMatnr()));
- Double count=0.0;
- for (LocDetl detl : matnr) {
- LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", detl.getLocNo()).eq("loc_sts","F"));
- if (locMast != null) {
- LocAroundBind bLocNo = locAroundBindService.selectOne(new EntityWrapper<LocAroundBind>().eq("b_loc_no", locMast.getLocNo()));
- if (Cools.isEmpty(bLocNo)) {
- count=detl.getAnfme()+count;
- }
- }
- }
- if (count<detail.getAnfme()) {
- return R.error("鐗╂枡="+detail.getMatnr()+"搴撳瓨涓嶈冻鏃犳硶鐢熸垚璁㈠崟");
- }
}
for (DetlDto detlDto : list) {
Mat mat = matService.selectByMatnr(detlDto.getMatnr());
@@ -220,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);
+ }
}
--
Gitblit v1.9.1