From b60d6c1abc9a41456c683a79d4ee27e7bdf7071b Mon Sep 17 00:00:00 2001
From: zjj <3272660260@qq.com>
Date: 星期二, 13 五月 2025 14:23:38 +0800
Subject: [PATCH] #Agv启动入库
---
rsf-admin/src/page/basicInfo/basStation/BasStationCreate.jsx | 120 ++++++++++++++----------
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java | 84 ++++++++++++++++
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java | 64 +++++++++++-
rsf-server/src/main/java/com/vincent/rsf/server/api/service/AgvService.java | 2
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/BasStation.java | 3
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/AgvController.java | 14 ++
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/BasStationController.java | 4
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java | 2
8 files changed, 235 insertions(+), 58 deletions(-)
diff --git a/rsf-admin/src/page/basicInfo/basStation/BasStationCreate.jsx b/rsf-admin/src/page/basicInfo/basStation/BasStationCreate.jsx
index 5d82fd9..fa8921b 100644
--- a/rsf-admin/src/page/basicInfo/basStation/BasStationCreate.jsx
+++ b/rsf-admin/src/page/basicInfo/basStation/BasStationCreate.jsx
@@ -17,6 +17,7 @@
useNotify,
Form,
useCreateController,
+ SelectArrayInput,
} from 'react-admin';
import {
Dialog,
@@ -30,6 +31,7 @@
import DialogCloseButton from "../../components/DialogCloseButton";
import StatusSelectInput from "../../components/StatusSelectInput";
import MemoInput from "../../components/MemoInput";
+import DictionarySelect from "../../components/DictionarySelect";
const BasStationCreate = (props) => {
const { open, setOpen } = props;
@@ -93,79 +95,97 @@
/>
</Grid>
<Grid item xs={6} display="flex" gap={1}>
- <NumberInput
+ <SelectInput
label="table.field.basStation.inAble"
source="inAble"
+ choices={[
+ { id: 0, name: '鍚�' },
+ { id: 1, name: '鏄�' },
+ ]}
/>
</Grid>
<Grid item xs={6} display="flex" gap={1}>
- <NumberInput
+ <SelectInput
label="table.field.basStation.outAble"
source="outAble"
+ choices={[
+ { id: 0, name: '鍚�' },
+ { id: 1, name: '鏄�' },
+ ]}
/>
</Grid>
<Grid item xs={6} display="flex" gap={1}>
- <TextInput
- label="table.field.basStation.useStatus"
- source="useStatus"
- parse={v => v}
+ <DictionarySelect
+ label={translate("table.field.basStation.useStatus")}
+ name="useStatus"
+ size="small"
+ validate={[required()]}
+ dictTypeCode="sys_sta_use_stas"
/>
</Grid>
<Grid item xs={6} display="flex" gap={1}>
- <NumberInput
- label="table.field.basStation.area"
- source="area"
- />
+ <ReferenceInput source="area" reference="warehouseAreas">
+ <SelectInput
+ label="table.field.basStation.area"
+ optionText="name"
+ optionValue="id"
+ fullWidth
+ validate={[required()]}
+ />
+ </ReferenceInput>
</Grid>
<Grid item xs={6} display="flex" gap={1}>
- <NumberInput
- label="table.field.basStation.isCrossZone"
- source="isCrossZone"
- />
+ <SelectInput
+ label="table.field.basStation.isCrossZone"
+ source="isCrossZone"
+ choices={[
+ { id: 0, name: '鍚�' },
+ { id: 1, name: '鏄�' },
+ ]}
+ validate={[required()]}
+ />
</Grid>
<Grid item xs={6} display="flex" gap={1}>
- <TextInput
- label="table.field.basStation.crossZoneArea"
- source="crossZoneArea"
- parse={v => v}
- />
+ <ReferenceArrayInput source="areaIds" reference="warehouseAreas">
+ <SelectArrayInput
+ label="table.field.basStation.crossZoneArea"
+ optionText="name"
+ optionValue="id"
+ fullWidth
+ />
+ </ReferenceArrayInput>
</Grid>
<Grid item xs={6} display="flex" gap={1}>
- <NumberInput
- label="table.field.basStation.isWcs"
- source="isWcs"
- />
- </Grid>
+ <SelectInput
+ label="table.field.basStation.isWcs"
+ source="isWcs"
+ choices={[
+ { id: 0, name: '鍚�' },
+ { id: 1, name: '鏄�' },
+ ]}
+ validate={[required()]}
+ />
+ </Grid>
<Grid item xs={6} display="flex" gap={1}>
- <TextInput
- label="table.field.basStation.wcsData"
- source="wcsData"
- parse={v => v}
- />
- </Grid>
+ <DictionarySelect
+ label={translate("table.field.basStation.containerType")}
+ name="containerType"
+ size="small"
+ validate={[required()]}
+ dictTypeCode="sys_container_type"
+ />
+ </Grid>
<Grid item xs={6} display="flex" gap={1}>
- <NumberInput
- label="table.field.basStation.containerType"
- source="containerType"
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <TextInput
- label="table.field.basStation.barcode"
- source="barcode"
- parse={v => v}
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <NumberInput
- label="table.field.basStation.autoTransfer"
- source="autoTransfer"
- />
+ <SelectInput
+ label="table.field.basStation.autoTransfer"
+ source="autoTransfer"
+ choices={[
+ { id: 0, name: '鍚�' },
+ { id: 1, name: '鏄�' },
+ ]}
+ />
</Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <StatusSelectInput />
- </Grid>
<Grid item xs={12} display="flex" gap={1}>
<Stack direction="column" spacing={1} width={'100%'}>
<MemoInput />
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/AgvController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/AgvController.java
index 1d6c105..e4e8939 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/AgvController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/AgvController.java
@@ -25,7 +25,7 @@
private AgvService agvService;
@ApiOperation("绔欑偣缁戝畾鏌ヨ")
- @PreAuthorize("hasAuthority('manager:qlyInspect:list')")
+ @PreAuthorize("hasAuthority('manager:basStation:list')")
@PostMapping("/staBind/list")
public R getStaBindList(@RequestBody Map<String, Object> params) {
if (Objects.isNull(params)) {
@@ -44,7 +44,7 @@
return agvService.getAGVStaBind(params);
}
- @PreAuthorize("hasAuthority('manager:asnOrderItem:list')")
+ @PreAuthorize("hasAuthority('manager:basStation:list')")
@ApiOperation("绔欑偣瑙g粦")
@PostMapping("/AGV/staUnBind")
public R getAGVStaUnBind(@RequestBody Map<String, Object> params) {
@@ -53,4 +53,14 @@
}
return agvService.AGVStaUnBind(params);
}
+
+ @PreAuthorize("hasAuthority('manager:basStation:list')")
+ @ApiOperation("AGV鍚姩鍏ュ簱")
+ @PostMapping("/AGV/task/start")
+ public R AGVInTaskStart(@RequestBody Map<String, Object> params) {
+ if (Objects.isNull(params)) {
+ return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+ }
+ return agvService.AGVInTaskStart(params, getLoginUserId());
+ }
}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/AgvService.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/AgvService.java
index d981b1a..16335f2 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/AgvService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/AgvService.java
@@ -10,4 +10,6 @@
R getStaBindList(Map<String, Object> params);
R AGVStaUnBind(Map<String, Object> params);
+
+ R AGVInTaskStart(Map<String, Object> params ,Long loginUserId);
}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java
index 11eba46..f1524b2 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java
@@ -8,15 +8,16 @@
import com.vincent.rsf.server.manager.entity.BasStation;
import com.vincent.rsf.server.manager.entity.WaitPakin;
import com.vincent.rsf.server.manager.entity.WaitPakinItem;
+import com.vincent.rsf.server.manager.entity.WarehouseAreas;
import com.vincent.rsf.server.manager.enums.PakinIOStatus;
import com.vincent.rsf.server.manager.enums.StaUseStatusType;
-import com.vincent.rsf.server.manager.service.BasStationService;
-import com.vincent.rsf.server.manager.service.WaitPakinItemService;
-import com.vincent.rsf.server.manager.service.WaitPakinService;
+import com.vincent.rsf.server.manager.service.*;
+import com.vincent.rsf.server.manager.utils.LocManageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -29,6 +30,45 @@
private BasStationService basStationService;
@Autowired
private WaitPakinItemService waitPakinItemService;
+ @Autowired
+ private WarehouseAreasService warehouseAreasService;
+ @Autowired
+ private TaskService taskService;
+
+
+ @Override
+ public R AGVInTaskStart(Map<String, Object> params,Long loginUserId ) {
+ String sta = params.get("sta").toString();
+ String area = params.get("area").toString();
+ if (Cools.isEmpty(sta)){
+ throw new CoolException("鎺ラ┏浣嶆潯鐮佷笉鑳戒负绌�");
+ }
+ if (Cools.isEmpty(area)){
+ throw new CoolException("鐩爣搴撳尯涓嶈兘涓虹┖");
+ }
+ BasStation basStation = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
+ .eq(BasStation::getStationName, sta)
+ .eq(BasStation::getUseStatus,StaUseStatusType.TYPE_F.type)
+ );
+ if (Cools.isEmpty(basStation)){
+ throw new CoolException("鏈壘鍒版帴椹崇珯鐐逛俊鎭紝璇锋鏌ョ珯鐐圭姸鎬�");
+ }
+ if (Cools.isEmpty(basStation.getBarcode())){
+ throw new CoolException("鏁版嵁閿欒锛屾帴椹崇珯鏃犳潯鐮佷俊鎭�");
+ }
+ WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
+ .eq(WaitPakin::getBarcode, basStation.getBarcode())
+ .eq(WaitPakin::getIoStatus,PakinIOStatus.PAKIN_IO_STATUS_DONE.val)
+ );
+ if (Cools.isEmpty(waitPakin)){
+ throw new CoolException("鏈壘鍒扮粍鎵樻暟鎹�,璇锋鏌ョ姸鎬�");
+ }
+ String targetLoc = LocManageUtil.getTargetLoc(Long.parseLong(area));
+
+ taskService.generateAGVTasks(waitPakin,targetLoc,sta,loginUserId);
+
+ return R.ok();
+ }
@Override
public R AGVStaUnBind(Map<String, Object> params) {
@@ -61,6 +101,8 @@
return R.ok("瑙g粦鎴愬姛");
}
+
+
@Override
public R getStaBindList(Map<String, Object> params) {
String sta = params.get("sta").toString();
@@ -88,12 +130,24 @@
if (Cools.isEmpty(waitPakinItems)){
throw new CoolException("鏁版嵁閿欒锛屾湭鎵惧埌缁勬墭鏄庣粏");
}
-
-
+ List<Long> ids = new ArrayList<>();
+ ids.add(basStation.getArea());
+ if (basStation.getIsCrossZone() == 1){
+ String content = basStation.getCrossZoneArea().substring(1, basStation.getCrossZoneArea().length() - 1);
+ String[] parts = content.split(",");
+ for (int i = 0; i < parts.length; i++) {
+ ids.add(Long.parseLong(parts[i].trim()));
+ }
+ }
+ List<WarehouseAreas> warehouseAreasList = warehouseAreasService.list(new LambdaQueryWrapper<WarehouseAreas>()
+ .in(WarehouseAreas::getId, ids)
+ );
return R.ok(Cools
.add("barcode", basStation.getBarcode())
.add("list", waitPakinItems)
+ .add("warehouseAreasList", warehouseAreasList)
+ .add("area", basStation.getArea())
);
}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/BasStationController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/BasStationController.java
index 7a5e03e..f9fa107 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/BasStationController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/BasStationController.java
@@ -10,6 +10,7 @@
import com.vincent.rsf.server.common.domain.KeyValVo;
import com.vincent.rsf.server.common.domain.PageParam;
import com.vincent.rsf.server.manager.entity.BasStation;
+import com.vincent.rsf.server.manager.enums.StaUseStatusType;
import com.vincent.rsf.server.manager.service.BasStationService;
import com.vincent.rsf.server.system.controller.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
@@ -99,6 +100,9 @@
if (null !=basStation.getAreaIds()){
basStation.setCrossZoneArea(Arrays.toString(basStation.getAreaIds()));
}
+ if (null !=basStation.getUseStatus() && basStation.getUseStatus().equals(StaUseStatusType.TYPE_O.type)){
+ basStation.setBarcode(null);
+ }
if (!basStationService.updateById(basStation)) {
return R.error("鏇存柊澶辫触");
}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/BasStation.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/BasStation.java
index 206ebef..bfa10a0 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/BasStation.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/BasStation.java
@@ -66,7 +66,7 @@
* 鎵�灞炲簱鍖篿d
*/
@ApiModelProperty(value= "鎵�灞炲簱鍖篿d")
- private Integer area;
+ private Long area;
/**
* 鏄惁鍙法鍖�
@@ -102,6 +102,7 @@
* 鏉$爜
*/
@ApiModelProperty(value= "鏉$爜")
+ @TableField(updateStrategy = FieldStrategy.IGNORED)
private String barcode;
/**
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
index 1b330a1..2ad9a14 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
@@ -14,6 +14,8 @@
R generateFlatWarehouseTasks(WaitPakin waitPakins,String locCode, Long loginUserId);
+ R generateAGVTasks(WaitPakin waitPakins,String locCode,String orgSta, Long loginUserId);
+
// R completeTask(String id);
void completeTask(List<Task> task) throws Exception;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
index 426b81f..c8291e1 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -64,6 +64,90 @@
@Autowired
private WarehouseAreasItemService warehouseAreasItemService;
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public synchronized R generateAGVTasks(WaitPakin pakins,String locCode,String orgSta, Long loginUserId) {
+ if (Cools.isEmpty(pakins) || Cools.isEmpty(locCode)) {
+ throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+ }
+ /**鑾峰彇缁勬嫋*/
+// List<Long> ids = pakins.stream().map(WaitPakin::getId).collect(Collectors.toList());
+ List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>()
+ .in(WaitPakin::getId, pakins.getId())
+ .eq(WaitPakin::getIoStatus, Short.parseShort(PakinIOStatus.PAKIN_IO_STATUS_DONE.val)));
+ if (waitPakins.isEmpty()) {
+ throw new CoolException("璇锋鏌ョ粍鎵樼姸鎬佹槸鍚﹀畬鎴愶紒锛�");
+ }
+ waitPakins.forEach(pakin -> {
+ /**鑾峰彇搴撲綅*/
+ String targetLoc = locCode;
+ if (Cools.isEmpty(targetLoc)) {
+ throw new CoolException("璇ョ珯鐐瑰搴斿簱鍖烘湭鎵惧埌搴撲綅");
+ }
+
+ List<TaskItem> taskItems = new ArrayList<>();
+ String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null);
+ if (StringUtils.isBlank(ruleCode)) {
+ throw new CoolException("缂栫爜閿欒锛氳纭缂栫爜銆孲YS_TASK_CODE銆嶆槸鍚﹀凡鐢熸垚!!");
+ }
+ Task task = new Task();
+ task.setTaskCode(ruleCode)
+ .setTaskStatus(TaskStsType.GENERATE_IN.id.shortValue())
+ .setTaskType(TaskType.TASK_TYPE_AGV_IN.type.shortValue())
+ .setTargLoc(targetLoc)
+ .setOrgSite(orgSta)
+ .setBarcode(pakin.getBarcode())
+ .setCreateBy(loginUserId)
+ .setUpdateBy(loginUserId);
+
+ if (!this.save(task)) {
+ throw new CoolException("浠诲姟淇濆瓨澶辫触锛侊紒");
+ }
+ if (!locService.update(new LambdaUpdateWrapper<Loc>().eq(Loc::getCode, task.getTargLoc())
+ .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_S.type).set(Loc::getBarcode, pakin.getBarcode()))) {
+ throw new CoolException("搴撲綅棰勭害澶辫触锛侊紒");
+ }
+ /**鑾峰彇缁勬嫋鏄庣粏**/
+ List<WaitPakinItem> waitPakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, pakin.getId()));
+ if (waitPakinItems.isEmpty()) {
+ throw new CoolException("鏁版嵁閿欒锛氱粍鎷栨槑缁嗕笉瀛樺湪");
+ }
+ waitPakinItems.forEach(item -> {
+ TaskItem taskItem = new TaskItem();
+ BeanUtils.copyProperties(item, taskItem);
+ taskItem.setTaskId(task.getId())
+ .setOrderType(OrderType.ORDER_IN.type)
+ .setSource(item.getId())
+ .setTrackCode(item.getTrackCode())
+ .setCreateBy(loginUserId)
+ .setUpdateBy(loginUserId)
+ .setExtendFields(item.getExtendFields())
+ .setOrderId(item.getAsnId())
+ .setOrderItemId(item.getAsnItemId());
+ taskItems.add(taskItem);
+ });
+ if (!taskItemService.saveBatch(taskItems)) {
+ throw new CoolException("浠诲姟鏄庣粏淇濆瓨澶辫触锛侊紒");
+ }
+ waitPakinItems.forEach(item -> {
+ if (! waitPakinItemService.update(new LambdaUpdateWrapper<WaitPakinItem>()
+ .set(WaitPakinItem::getWorkQty, item.getAnfme())
+ .eq(WaitPakinItem::getId, item.getId()))) {
+ throw new CoolException("缁勬墭鏄庣粏淇墽琛屾暟閲忎慨鏀瑰け璐ワ紒锛�");
+ }
+ });
+ });
+
+ if (!waitPakinService.update(new LambdaUpdateWrapper<WaitPakin>()
+ .in(WaitPakin::getId, pakins.getId())
+ .set(WaitPakin::getUpdateBy, loginUserId)
+ .set(WaitPakin::getCreateBy, loginUserId)
+ .set(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val))) {
+ throw new CoolException("缁勬墭鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+ }
+ return R.ok("浠诲姟鐢熸垚瀹屾瘯锛�");
+ }
+
@Override
@Transactional(rollbackFor = Exception.class)
--
Gitblit v1.9.1