From f2b48ce0cfdf9b68ecc7c9d84937d69500590f81 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期四, 15 五月 2025 17:15:28 +0800 Subject: [PATCH] Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop --- rsf-admin/src/page/basicInfo/basStation/BasStationList.jsx | 17 ++- rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseAreasItemController.java | 3 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java | 47 +++++++++ rsf-admin/src/i18n/zh.js | 4 rsf-admin/src/page/basicInfo/basStation/CrossZoneAreaField.jsx | 118 +++++++++++++++++++++++ rsf-server/src/main/java/com/vincent/rsf/server/api/service/AgvService.java | 4 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/AgvController.java | 20 ++++ rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java | 7 rsf-admin/src/config/setting.js | 2 rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx | 64 +++++++----- 10 files changed, 248 insertions(+), 38 deletions(-) diff --git a/rsf-admin/src/config/setting.js b/rsf-admin/src/config/setting.js index aca143f..901ad17 100644 --- a/rsf-admin/src/config/setting.js +++ b/rsf-admin/src/config/setting.js @@ -25,7 +25,7 @@ export const ABORT_SIGNAL = false; -export const DEFAULT_PAGE_SIZE = 20; +export const DEFAULT_PAGE_SIZE = 10; export const DEFAULT_ITEM_PAGE_SIZE = 10; diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index 7e9dc69..3627f6e 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -206,9 +206,9 @@ outAble: '鑳藉嚭', useStatus: '鐘舵��', status: '鐘舵��', - area: '鎵�灞炲簱鍖虹被鍨�', + area: '鎵�灞炲簱鍖�', isCrossZone: '鏄惁璺ㄥ尯', - crossZoneArea: '鍙法鍖虹被鍨�', + crossZoneArea: '鍙法搴撳尯', isWcs: '鏄惁WCS绔欑珯鐐�', wcsData: 'wcs鏁版嵁', containerType: '瀹瑰櫒绫诲瀷', diff --git a/rsf-admin/src/page/basicInfo/basStation/BasStationList.jsx b/rsf-admin/src/page/basicInfo/basStation/BasStationList.jsx index 6509b57..f82f9c9 100644 --- a/rsf-admin/src/page/basicInfo/basStation/BasStationList.jsx +++ b/rsf-admin/src/page/basicInfo/basStation/BasStationList.jsx @@ -45,6 +45,7 @@ import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting'; import * as Common from '@/utils/common'; import WarehouseAreaField from "./WarehouseAreaField"; +import CrossZoneAreaField from "./CrossZoneAreaField"; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { @@ -95,7 +96,7 @@ const [createDialog, setCreateDialog] = useState(false); const [drawerVal, setDrawerVal] = useState(false); - + const [areaFieldDialog, setAreaFieldDialog] = useState(false); return ( <Box display="flex"> <List @@ -147,8 +148,12 @@ label="table.field.basStation.isCrossZone" render={record => record.inAble === 1 ? '鏄�' : '鍚�'} /> - <TextField source="crossZoneArea" label="table.field.basStation.crossZoneArea" /> - + <WrapperField cellClassName="crossZoneArea" label="table.field.basStation.crossZoneArea"> + <CrossZoneAreaField + open={areaFieldDialog} + setOpen={setAreaFieldDialog} + /> + </WrapperField> <FunctionField source="isWcs" label="table.field.basStation.isWcs" @@ -170,16 +175,18 @@ </ReferenceField> <DateField source="createTime" label="common.field.createTime" showTime /> <TextField source="memo" label="common.field.memo" sortable={false} /> - <WrapperField cellClassName="opt" label="common.field.opt"> + <WrapperField cellClassName="opt" label="common.field.opt"> <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} /> <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} /> - </WrapperField> + </WrapperField> </StyledDatagrid> + </List> <BasStationCreate open={createDialog} setOpen={setCreateDialog} /> + <PageDrawer title='BasStation Detail' drawerVal={drawerVal} diff --git a/rsf-admin/src/page/basicInfo/basStation/CrossZoneAreaField.jsx b/rsf-admin/src/page/basicInfo/basStation/CrossZoneAreaField.jsx new file mode 100644 index 0000000..115901a --- /dev/null +++ b/rsf-admin/src/page/basicInfo/basStation/CrossZoneAreaField.jsx @@ -0,0 +1,118 @@ +import * as React from 'react'; +import { Stack, Chip, Dialog, DialogTitle, DialogContent, IconButton, CircularProgress } from '@mui/material'; +import { useTranslate, useRecordContext } from 'react-admin'; +import CloseIcon from '@mui/icons-material/Close'; +import request from '@/utils/request'; + +const CrossZoneAreaField = () => { + const translate = useTranslate(); + const record = useRecordContext(); + const [open, setOpen] = React.useState(false); + const [areaNames, setAreaNames] = React.useState([]); + const [loading, setLoading] = React.useState(false); + + const handleOpen = () => { + setOpen(true); + }; + + const handleClose = () => { + setOpen(false); + }; + + const fetchAreaNames = async () => { + if (!record?.areaIds || record.areaIds.length === 0) return; + + setLoading(true); + try { + const res = await request.post(`/warehouseAreas/many/${record.areaIds.join(',')}`); + if (res?.data?.code === 200) { + setAreaNames(res.data.data || []); + } + } catch (error) { + console.error('鑾峰彇鍖哄煙鍚嶇О澶辫触:', error); + } finally { + setLoading(false); + } + }; + + React.useEffect(() => { + if (record?.areaIds && record.areaIds.length > 0) { + fetchAreaNames(); + } + }, [record]); + + if (loading) { + return <CircularProgress size={20} />; + } + + return ( + <> + <Stack + direction="row" + gap={1} + flexWrap="wrap" + onClick={handleOpen} + sx={{ cursor: 'pointer' }} + > + {areaNames.slice(0, 1).map((item, idx) => ( + <Chip + size="small" + key={item.id} + label={item.name || item.id} + /> + ))} + {areaNames.length > 1 && ( + <Chip + size="small" + label={`+${areaNames.length - 1}`} + /> + )} + {areaNames.length === 0 && record.areaIds && record.areaIds.length > 0 && ( + <Chip + size="small" + label={`${record.areaIds.length} 涓尯鍩焋} + /> + )} + </Stack> + + <Dialog + open={open} + onClose={handleClose} + maxWidth="md" + fullWidth + > + <DialogTitle> + {translate('table.field.basStation.crossZoneArea')} + <IconButton + aria-label="close" + onClick={handleClose} + sx={{ + position: 'absolute', + right: 8, + top: 8, + }} + > + <CloseIcon /> + </IconButton> + </DialogTitle> + <DialogContent> + {loading ? ( + <CircularProgress /> + ) : ( + <Stack direction="row" gap={1} flexWrap="wrap" sx={{ mt: 1 }}> + {areaNames.map((item) => ( + <Chip + size="small" + key={item.id} + label={item.name || item.id} + /> + ))} + </Stack> + )} + </DialogContent> + </Dialog> + </> + ); +}; + +export default CrossZoneAreaField; \ No newline at end of file diff --git a/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx b/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx index 13e72c0..a435d24 100644 --- a/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx +++ b/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx @@ -170,17 +170,17 @@ const { data: { code, data, msg }, } = await request.get("/fields/enable/list"); if (code == 200) { const arr = [ - <NumberField source="id" />, - <TextField source="asnCode" label="table.field.warehouseAreasItem.asnCode" />, - <NumberField source="areaId" label="table.field.warehouseAreasItem.areaId" />, - <TextField source="areaName" label="table.field.warehouseAreasItem.areaName" />, - <NumberField source="matnrId" label="table.field.warehouseAreasItem.matnrId" />, - <TextField source="maktx" label="table.field.warehouseAreasItem.matnrName" />, - <TextField source="matnrCode" label="table.field.warehouseAreasItem.matnrCode" />, - <TextField source="trackCode" label="table.field.warehouseAreasItem.barcode" />, - <NumberField source="anfme" label="table.field.warehouseAreasItem.anfme" />, - <NumberField source="workQty" label="table.field.warehouseAreasItem.workQty" />, - <NumberField source="qty" label="table.field.warehouseAreasItem.qty" />, + <NumberField key="id" source="id" />, + <TextField key="asnCode" source="asnCode" label="table.field.warehouseAreasItem.asnCode" />, + <NumberField key="areaId" source="areaId" label="table.field.warehouseAreasItem.areaId" />, + <TextField key="areaName" source="areaName" label="table.field.warehouseAreasItem.areaName" />, + <NumberField key="matnrId" source="matnrId" label="table.field.warehouseAreasItem.matnrId" />, + <TextField key="maktx" source="maktx" label="table.field.warehouseAreasItem.matnrName" />, + <TextField key="matnrCode" source="matnrCode" label="table.field.warehouseAreasItem.matnrCode" />, + <TextField key="trackCode" source="trackCode" label="table.field.warehouseAreasItem.barcode" />, + <NumberField key="anfme" source="anfme" label="table.field.warehouseAreasItem.anfme" />, + <NumberField key="workQty" source="workQty" label="table.field.warehouseAreasItem.workQty" />, + <NumberField key="qty" source="qty" label="table.field.warehouseAreasItem.qty" />, // <MyField source="isptQty" label="table.field.qlyIsptItem.anfme" // onClick={(event, record, val) => { // event.stopPropagation(); @@ -188,27 +188,37 @@ // setDrawerVal(!!drawerVal && drawerVal === val ? null : val); // }} // />, - <TextField source="splrBatch" label="table.field.warehouseAreasItem.splrBtch" />, - <TextField source="batch" label="table.field.warehouseAreasItem.batch" />, - <TextField source="unit" label="table.field.warehouseAreasItem.unit" />, - <TextField source="stockUnit" label="table.field.warehouseAreasItem.stockUnit" />, - <TextField source="brand" label="table.field.warehouseAreasItem.brand" />, - <TextField source="shipperId" label="table.field.warehouseAreasItem.shipperId" />, - <TextField source="splrId" label="table.field.warehouseAreasItem.splrId" />, - <TextField source="isptResult$" label="table.field.warehouseAreasItem.isptResult" sortable={false} />, - <NumberField source="weight" label="table.field.warehouseAreasItem.weight" />, - <TextField source="prodTime" label="table.field.warehouseAreasItem.prodTime" />, + <TextField key="splrBatch" source="splrBatch" label="table.field.warehouseAreasItem.splrBtch" />, + <TextField key="batch" source="batch" label="table.field.warehouseAreasItem.batch" />, + <TextField key="unit" source="unit" label="table.field.warehouseAreasItem.unit" />, + <TextField key="stockUnit" source="stockUnit" label="table.field.warehouseAreasItem.stockUnit" />, + <TextField key="brand" source="brand" label="table.field.warehouseAreasItem.brand" />, + <TextField key="shipperId" source="shipperId" label="table.field.warehouseAreasItem.shipperId" />, + <TextField key="splrId" source="splrId" label="table.field.warehouseAreasItem.splrId" />, + <TextField key="isptResult" source="isptResult$" label="table.field.warehouseAreasItem.isptResult" sortable={false} />, + <NumberField key="weight" source="weight" label="table.field.warehouseAreasItem.weight" />, + <TextField key="prodTime" source="prodTime" label="table.field.warehouseAreasItem.prodTime" />, ] const fields = data.map(el => <TextField key={el.fields} source={`extendFields.[${el.fields}]`} label={el.fieldsAlise} />) const lastArr = [ - <TextField source="updateBy$" label="common.field.updateBy" />, - <DateField source="updateTime" label="common.field.updateTime" showTime />, - <TextField source="createBy$" label="common.field.createBy" />, - <DateField source="createTime" label="common.field.createTime" showTime />, - <BooleanField source="statusBool" label="common.field.status" sortable={false} />, - <TextField source="memo" label="common.field.memo" sortable={false} />, + <TextField key="updateBy" source="updateBy$" label="common.field.updateBy" />, + <DateField key="updateTime" source="updateTime" label="common.field.updateTime" showTime />, + <TextField key="createBy" source="createBy$" label="common.field.createBy" />, + <DateField key="createTime" source="createTime" label="common.field.createTime" showTime />, + <BooleanField key="statusBool" source="statusBool" label="common.field.status" sortable={false} />, + <TextField key="memo" source="memo" label="common.field.memo" sortable={false} />, ] setColumns([...arr, ...fields, ...lastArr]); + //filters娣诲姞杩囨护瀛楁 + data.map(el => { + var i =0; + filters.map((item) =>{ + if(item.key === el.fields){ + i = 1; + } + }) + i===0 && filters.push(<TextInput key={el.fields} source={el.fields} label={el.fieldsAlise} />) + }) } else { notify(msg); } 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 e4e8939..f244c17 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 @@ -34,6 +34,16 @@ return agvService.getStaBindList(params); } + @ApiOperation("绔欑偣鏌ヨ") + @PreAuthorize("hasAuthority('manager:basStation:list')") + @PostMapping("/staMsg/select") + public R getStaMsgSelect(@RequestBody Map<String, Object> params) { + if (Objects.isNull(params)) { + return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒"); + } + return agvService.getStaMsgSelect(params); + } + @PreAuthorize("hasAuthority('manager:basStation:list')") @ApiOperation("绔欑偣缁戝畾") @PostMapping("/AGV/staBind") @@ -63,4 +73,14 @@ } return agvService.AGVInTaskStart(params, getLoginUserId()); } + + @PreAuthorize("hasAuthority('manager:basStation:list')") + @ApiOperation("AGV缁戝畾&鍏ュ簱") + @PostMapping("/AGV/bindAndIn/start") + public R AGVBindAndInTaskStart(@RequestBody Map<String, Object> params) { + if (Objects.isNull(params)) { + return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒"); + } + return agvService.AGVBindAndInTaskStart(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 16335f2..6869ebf 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 @@ -12,4 +12,8 @@ R AGVStaUnBind(Map<String, Object> params); R AGVInTaskStart(Map<String, Object> params ,Long loginUserId); + + R getStaMsgSelect(Map<String, Object> params); + + R AGVBindAndInTaskStart(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 f1524b2..dc2d1f8 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 @@ -35,6 +35,51 @@ @Autowired private TaskService taskService; + @Override + @Transactional(rollbackFor = Exception.class) + public R AGVBindAndInTaskStart(Map<String, Object> params, Long loginUserId) { + //鍏堢粦瀹� + getAGVStaBind(params); + //鐢熸垚浠诲姟 + AGVInTaskStart(params, loginUserId); + return R.ok(); + } + + @Override + public R getStaMsgSelect(Map<String, Object> params) { + String sta = params.get("sta").toString(); + if (Cools.isEmpty(sta)){ + throw new CoolException("鎺ラ┏浣嶆潯鐮佷笉鑳戒负绌�"); + } + BasStation basStation = basStationService.getOne(new LambdaQueryWrapper<BasStation>() + .eq(BasStation::getStationName, sta) + .eq(BasStation::getUseStatus,StaUseStatusType.TYPE_O.type) + ); + if (Cools.isEmpty(basStation)){ + 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("warehouseAreasList", warehouseAreasList) + .add("area", basStation.getArea()) + ); + } + + + @Override public R AGVInTaskStart(Map<String, Object> params,Long loginUserId ) { @@ -70,6 +115,8 @@ return R.ok(); } + + @Override public R AGVStaUnBind(Map<String, Object> params) { String sta = params.get("sta").toString(); diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java index 5f955a8..ec306f3 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java @@ -924,14 +924,15 @@ */ @Override public R getUnItemByContainer(Map<String, Object> params) { - if (Objects.isNull(params.get("barcode"))) { - throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒"); + if (Cools.isEmpty(params.get("barcode")) && Cools.isEmpty(params.get("code"))){ + throw new CoolException("瀹瑰櫒鍙蜂笌缁勬墭妗g紪鐮佷笉鑳藉叏涓虹┖"); } //鑾峰彇缁勬嫋鏈敓鎴愪换鍔$殑缁勬嫋妗� // List<Short> asList = Arrays.asList(Short.valueOf(PakinIOStatus.PAKIN_IO_STATUS_DONE.val), Short.valueOf(PakinIOStatus.PAKIN_IO_STATUS_DONE.val)); WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>() - .eq(WaitPakin::getBarcode, params.get("barcode").toString()) + .eq(!Cools.isEmpty(params.get("barcode")),WaitPakin::getBarcode, params.get("barcode").toString()) + .eq(!Cools.isEmpty(params.get("code")),WaitPakin::getCode, params.get("code").toString()) .eq(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val)); if (Objects.isNull(waitPakin)) { return R.error("鏈壘鍒拌瀹瑰櫒鐮佺殑缁勬墭鏄庣粏锛岃妫�鏌ョ粍鎵樼姸鎬�"); diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseAreasItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseAreasItemController.java index d9dc12b..3ed3d9f 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseAreasItemController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseAreasItemController.java @@ -13,6 +13,7 @@ import com.vincent.rsf.server.common.domain.PageParam; import com.vincent.rsf.server.common.utils.FieldsUtils; import com.vincent.rsf.server.manager.entity.AsnOrderItem; +import com.vincent.rsf.server.manager.entity.Matnr; import com.vincent.rsf.server.manager.entity.WarehouseAreasItem; import com.vincent.rsf.server.manager.service.WarehouseAreasItemService; import com.vincent.rsf.server.system.controller.BaseController; @@ -37,6 +38,8 @@ BaseParam baseParam = buildParam(map, BaseParam.class); PageParam<WarehouseAreasItem, BaseParam> pageParam = new PageParam<>(baseParam, WarehouseAreasItem.class); QueryWrapper<WarehouseAreasItem> queryWrapper = pageParam.buildWrapper(true); + /**鎷兼帴鎵╁睍瀛楁杩囨护*/ + FieldsUtils.setFieldsFilters(queryWrapper,pageParam, WarehouseAreasItem.class); /**鎷兼帴鎵╁睍瀛楁*/ PageParam<WarehouseAreasItem, BaseParam> page = warehouseAreasItemService.page(pageParam, queryWrapper); List<WarehouseAreasItem> records = page.getRecords(); -- Gitblit v1.9.1