From 6732a988fe843cf59f12aae1460fc97fda5408dd Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期四, 08 五月 2025 19:59:10 +0800 Subject: [PATCH] 新增asn单,修改asn单,添加动态字段修改功能 --- rsf-admin/src/page/task/TaskItemList.jsx | 125 +++++++++++++++++------- rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java | 31 +++++ rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java | 91 ++++++++++------- rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskItemController.java | 14 ++ rsf-admin/src/page/orders/asnOrder/AsnOrderModal.jsx | 2 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java | 2 6 files changed, 184 insertions(+), 81 deletions(-) diff --git a/rsf-admin/src/page/orders/asnOrder/AsnOrderModal.jsx b/rsf-admin/src/page/orders/asnOrder/AsnOrderModal.jsx index bbba6ff..140bd65 100644 --- a/rsf-admin/src/page/orders/asnOrder/AsnOrderModal.jsx +++ b/rsf-admin/src/page/orders/asnOrder/AsnOrderModal.jsx @@ -567,7 +567,7 @@ headerName: el.fieldsAlise, minWidth: 100, flex: 1, - editable: false + editable: true })) setColumns([...columns, ...cols, action]) } else { diff --git a/rsf-admin/src/page/task/TaskItemList.jsx b/rsf-admin/src/page/task/TaskItemList.jsx index 8dcc14f..9fd01f6 100644 --- a/rsf-admin/src/page/task/TaskItemList.jsx +++ b/rsf-admin/src/page/task/TaskItemList.jsx @@ -14,18 +14,22 @@ BooleanField, ReferenceField, TextInput, + useRefresh, DateInput, + useNotify, SelectInput, + useListContext, NumberInput, useGetRecordId, } from 'react-admin'; -import { Box, Typography, Card, Stack } from '@mui/material'; +import { Box, Typography, Card, Stack, LinearProgress } from '@mui/material'; import { styled } from '@mui/material/styles'; import PageDrawer from "../components/PageDrawer"; import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting'; import MyCreateButton from "../components/MyCreateButton"; import TaskItemCreate from "./TaskItemCreate"; - +import request from '@/utils/request'; + const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { height: '.9em' @@ -43,8 +47,8 @@ const filters = [ <SearchInput source="condition" alwaysOn />, - <DateInput label='common.time.after' source="timeStart" />, - <DateInput label='common.time.before' source="timeEnd" />, + <DateInput label='common.time.after' source="timeStart" />, + <DateInput label='common.time.before' source="timeEnd" />, <NumberInput source="taskId" label="table.field.taskItem.taskId" />, <NumberInput source="orderId" label="table.field.taskItem.orderId" />, <NumberInput source="orderType" label="table.field.taskItem.orderType" />, @@ -91,7 +95,7 @@ empty={false} pagination={false} filters={filters} - filter={{taskId: recordId}} + filter={{ taskId: recordId }} sort={{ field: "create_time", order: "desc" }} actions={( <TopToolbar> @@ -103,39 +107,7 @@ )} perPage={DEFAULT_PAGE_SIZE} > - <StyledDatagrid - preferenceKey='taskItem' - bulkActionButtons={false} - rowClick={false} - // expand={() => <TaskItemPanel />} - expandSingle={true} - omit={['id', 'createTime', 'createBy', 'memo', 'taskId', 'orderId', 'orderItemId', 'matnrId']} - > - <NumberField source="id" /> - <NumberField source="taskId" label="table.field.taskItem.taskId" /> - <NumberField source="orderId" label="table.field.taskItem.orderId" /> - <NumberField source="orderType$" label="table.field.taskItem.orderType" /> - <NumberField source="orderItemId" label="table.field.taskItem.orderItemId" /> - <NumberField source="matnrId" label="table.field.taskItem.matnrId" /> - <TextField source="maktx" label="table.field.taskItem.maktx" /> - <TextField source="matnrCode" label="table.field.taskItem.matnrCode" /> - <TextField source="unit" label="table.field.taskItem.unit" /> - <NumberField source="anfme" label="table.field.taskItem.anfme" /> - <TextField source="batch" label="table.field.taskItem.batch" /> - <TextField source="isptResult$" label="table.field.taskItem.isptResult" /> - <TextField source="spec" label="table.field.taskItem.spec" /> - <TextField source="model" label="table.field.taskItem.model" /> - <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}> - <TextField source="nickname" /> - </ReferenceField> - <DateField source="updateTime" label="common.field.updateTime" showTime /> - <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}> - <TextField source="nickname" /> - </ReferenceField> - <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} /> - </StyledDatagrid> + <DynamicFields /> </List> <TaskItemCreate open={createDialog} @@ -151,3 +123,80 @@ } export default TaskItemList; + + +const DynamicFields = (props) => { + const translate = useTranslate(); + const notify = useNotify(); + const [columns, setColumns] = useState([]); + const { isLoading } = useListContext(); + const refresh = useRefresh(); + useEffect(() => { + getDynamicFields(); + }, []); + + const getDynamicFields = async () => { + const { data: { code, data, msg }, } = await request.get("/fields/enable/list"); + if (code == 200) { + const arr = [ + <NumberField source="id" />, + <NumberField source="taskId" label="table.field.taskItem.taskId" />, + <NumberField source="orderId" label="table.field.taskItem.orderId" />, + <NumberField source="orderType$" label="table.field.taskItem.orderType" />, + <NumberField source="orderItemId" label="table.field.taskItem.orderItemId" />, + <NumberField source="matnrId" label="table.field.taskItem.matnrId" />, + <TextField source="maktx" label="table.field.taskItem.maktx" />, + <TextField source="matnrCode" label="table.field.taskItem.matnrCode" />, + <TextField source="unit" label="table.field.taskItem.unit" />, + <NumberField source="anfme" label="table.field.taskItem.anfme" />, + <TextField source="batch" label="table.field.taskItem.batch" />, + <TextField source="isptResult$" label="table.field.taskItem.isptResult" />, + <TextField source="spec" label="table.field.taskItem.spec" />, + <TextField source="model" label="table.field.taskItem.model" />, + ] + const fields = data.map(el => <TextField key={el.fields} source={`extendFields.[${el.fields}]`} label={el.fieldsAlise} />) + const lastArr = [ + <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}> + <TextField source="nickname" /> + </ReferenceField>, + <DateField source="updateTime" label="common.field.updateTime" showTime />, + <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}> + <TextField source="nickname" /> + </ReferenceField>, + <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} />, + ] + setColumns([...arr, ...fields, ...lastArr]); + } else { + notify(msg); + } + } + + return ( + <Box sx={{ position: 'relative', minHeight: "60vh", }}> + {isLoading && ( + <LinearProgress + sx={{ + height: "2px", + position: 'absolute', + top: 0, + left: 0, + right: 0, + }} + /> + )} + {columns.length > 0 && + <StyledDatagrid + preferenceKey='taskItem' + bulkActionButtons={false} + rowClick={false} + // expand={() => <TaskItemPanel />} + expandSingle={true} + omit={['id', 'createTime', 'createBy', 'memo', 'taskId', 'orderId', 'orderItemId', 'matnrId']} + > + {columns.map((column) => column)} + </StyledDatagrid>} + </Box> + ) +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java index b1c5ce6..7e2eecd 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java @@ -99,7 +99,7 @@ private String platItemId; @ApiModelProperty("鎵╁睍瀛楁") - private List<Map<String, Object>> extendFields; + private Map<String, String> extendFields; } 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 00039ca..4538f27 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 @@ -172,12 +172,18 @@ List<AsnOrderItem> asnOrderItem = asnOrderItemMapper.selectList(new LambdaQueryWrapper<AsnOrderItem>() .eq(AsnOrderItem::getTrackCode, barcode)); - if (Objects.isNull(asnOrderItem)) { throw new CoolException("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�"); } - - return getAsnOrderItem(asnOrderItem); + List<AsnOrderItem> items = new ArrayList<>(); + for (AsnOrderItem record : asnOrderItem) { + if (!Objects.isNull(record.getFieldsIndex())) { + Map<String, String> fields = FieldsUtils.getFields(record.getFieldsIndex()); + record.setExtendFields(fields); + } + items.add(record); + } + return getAsnOrderItem(items); } /** @@ -268,29 +274,29 @@ .setStockUnit(dto.getStockUnit()) .setProdTime(dto.getProdTime()); - if (!Objects.isNull(rcpt)) { - try { - if (Objects.isNull(rcpt.get("fieldsindex")) || StringUtils.isBlank(rcpt.get("fieldsindex").toString())) { - StringBuffer sb = new StringBuffer(); - if (!dto.getExtendFields().isEmpty()) { - dto.getExtendFields().forEach(field -> { - field.keySet().forEach(key -> { - sb.append(field.get(key)); - }); - }); - } - sb.append(dto.getAsnCode() + dto.getMatnr() + dto.getSplrBatch() + orderItem.getIsptResult$()); - //鑾峰彇16浣島uid - String uuid16 = Cools.md5Chinese(sb.toString()); - rcpt.put("index", uuid16); - orderItem.setFieldsIndex(uuid16); - } - //淇濆瓨鎴栨洿鏂版墿灞曞瓧娈� - FieldsUtils.updateFieldsValue(rcpt); - } catch (Exception e) { - throw new RuntimeException(e); - } - } +// if (!Objects.isNull(rcpt)) { +// try { +// if (Objects.isNull(rcpt.get("fieldsindex")) || StringUtils.isBlank(rcpt.get("fieldsindex").toString())) { +// StringBuffer sb = new StringBuffer(); +// if (!dto.getExtendFields().isEmpty()) { +// dto.getExtendFields().forEach(field -> { +// field.keySet().forEach(key -> { +// sb.append(field.get(key)); +// }); +// }); +// } +// sb.append(dto.getAsnCode() + dto.getMatnr() + dto.getSplrBatch() + orderItem.getIsptResult$()); +// //鑾峰彇16浣島uid +// String uuid16 = Cools.md5Chinese(sb.toString()); +// rcpt.put("index", uuid16); +// orderItem.setFieldsIndex(uuid16); +// } +// //淇濆瓨鎴栨洿鏂版墿灞曞瓧娈� +// FieldsUtils.updateFieldsValue(rcpt); +// } catch (Exception e) { +// throw new RuntimeException(e); +// } +// } if (asnOrderItemMapper.updateById(orderItem) < 1) { throw new CoolException("閫氱煡鍗曟槑缁嗘暟閲忎慨鏀瑰け璐ワ紒锛�"); @@ -386,15 +392,7 @@ if (Objects.isNull(params.getAsnCode())) { throw new CoolException("閫氱煡鍗曚笉鑳戒负绌猴紒锛�"); } - List<AsnOrderItem> asnOrderItem = asnOrderItemMapper.selectList(new LambdaQueryWrapper<AsnOrderItem>() - .eq(AsnOrderItem::getAsnCode, params.getAsnCode()) - .eq(!Objects.isNull(params.getTrackCode()), AsnOrderItem::getTrackCode, params.getTrackCode()) - .eq(!Cools.isEmpty(params.getMatnrCode()), AsnOrderItem::getMatnrCode, params.getMatnrCode()) - ); - if (Objects.isNull(asnOrderItem)) { - throw new CoolException("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�"); - } List<Short> shorts = Arrays.asList(AsnExceStatus.ASN_EXCE_STATUS_TASK_CANCEL.val, AsnExceStatus.ASN_EXCE_STATUS_TASK_CLOSE .val, AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val); AsnOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>() @@ -404,7 +402,26 @@ throw new CoolException("璇锋鏌ヨ鍗曠姸鎬佹槸鍚﹀凡瀹屾垚鎴栧凡鍙栨秷锛侊紒"); } - return getAsnOrderItem(asnOrderItem); + List<AsnOrderItem> asnOrderItem = asnOrderItemMapper.selectList(new LambdaQueryWrapper<AsnOrderItem>() + .eq(AsnOrderItem::getAsnCode, params.getAsnCode()) + .eq(!Objects.isNull(params.getTrackCode()), AsnOrderItem::getTrackCode, params.getTrackCode()) + .eq(!Cools.isEmpty(params.getMatnrCode()), AsnOrderItem::getMatnrCode, params.getMatnrCode()) + ); + + if (Objects.isNull(asnOrderItem)) { + throw new CoolException("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�"); + } + + List<AsnOrderItem> items = new ArrayList<>(); + for (AsnOrderItem record : asnOrderItem) { + if (!Objects.isNull(record.getFieldsIndex())) { + Map<String, String> fields = FieldsUtils.getFields(record.getFieldsIndex()); + record.setExtendFields(fields); + } + items.add(record); + } + + return getAsnOrderItem(items); } @@ -1010,10 +1027,10 @@ .setAnfme(asnOrderItem.getAnfme()) .setPurQty(asnOrderItem.getPurQty()) .setSplrBatch(asnOrderItem.getSplrBatch()) + .setExtendFields(asnOrderItem.getExtendFields()) .setMatnr(asnOrderItem.getMatnrCode()) .setInspect(asnOrderItem.getIsptResult$()) //璐ㄦ缁撴灉 - .setPlatItemId(asnOrderItem.getPlatItemId()) - ; + .setPlatItemId(asnOrderItem.getPlatItemId()); Matnr matnr = matnrMapper.selectById(asnOrderItem.getMatnrId()); if (Objects.isNull(matnr)) { diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskItemController.java index ca1b80d..b9bbd68 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskItemController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskItemController.java @@ -9,6 +9,8 @@ import com.vincent.rsf.server.common.domain.BaseParam; import com.vincent.rsf.server.common.domain.KeyValVo; import com.vincent.rsf.server.common.domain.PageParam; +import com.vincent.rsf.server.common.utils.FieldsUtils; +import com.vincent.rsf.server.manager.entity.LocItem; import com.vincent.rsf.server.manager.entity.TaskItem; import com.vincent.rsf.server.manager.service.TaskItemService; import com.vincent.rsf.server.system.controller.BaseController; @@ -30,7 +32,17 @@ public R page(@RequestBody Map<String, Object> map) { BaseParam baseParam = buildParam(map, BaseParam.class); PageParam<TaskItem, BaseParam> pageParam = new PageParam<>(baseParam, TaskItem.class); - return R.ok().add(taskItemService.page(pageParam, pageParam.buildWrapper(true))); + /**鎷兼帴鎵╁睍瀛楁*/ + PageParam<TaskItem, BaseParam> page = taskItemService.page(pageParam, pageParam.buildWrapper(true)); + List<TaskItem> records = page.getRecords(); + for (TaskItem record : records) { + if (!Objects.isNull(record.getFieldsIndex())) { + Map<String, String> fields = FieldsUtils.getFields(record.getFieldsIndex()); + record.setExtendFields(fields); + } + } + page.setRecords(records); + return R.ok().add(page); } @PreAuthorize("hasAuthority('manager:taskItem:list')") diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java index 20b6d63..92480e9 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.manager.enums.OrderType; @@ -30,6 +31,7 @@ import com.vincent.rsf.server.manager.service.CompanysService; import com.vincent.rsf.server.manager.service.MatnrService; import com.vincent.rsf.server.system.constant.SerialRuleCode; +import com.vincent.rsf.server.system.service.DictDataService; import com.vincent.rsf.server.system.service.FieldsItemService; import com.vincent.rsf.server.system.service.FieldsService; import com.vincent.rsf.server.system.utils.SerialRuleUtils; @@ -62,6 +64,9 @@ @Autowired private CompanysService companysService; + + @Autowired + private DictDataService dictDataService; @Override public R generateBarcode(List<Long> orders) { @@ -115,6 +120,15 @@ if (Objects.isNull(date)) { throw new CoolException("鏃堕棿鏍煎紡閿欒锛侊紒"); } + if (Objects.isNull((OrderType.getTypeVal(template.getType())))) { + sbFaild.append(template.getCode()).append(",鍗曟嵁鐘舵�佷笉瀛樺湪锛侊紒"); + throw new CoolException(sbFaild.toString()); + } + if (Objects.isNull((OrderWorkType.getWorkType(template.getWkType())))) { + sbFaild.append(template.getCode()).append(",涓氬姟鐘舵�佷笉瀛樺湪锛侊紒"); + throw new CoolException(sbFaild.toString()); + } + order.setCode(template.getCode()) .setPoCode(template.getPoCode()) .setMemo(template.getMemo()) @@ -234,10 +248,21 @@ // } //淇濆瓨鎵╁睍瀛楁 try { - String uuid16 = CommonUtil.randomUUID16(); - Boolean fields = FieldsUtils.saveFields(params, uuid16); - if (fields) { + if (Objects.isNull(asnOrderItem.getFieldsIndex()) || StringUtils.isBlank(asnOrderItem.getFieldsIndex())) { + StringBuffer sb = new StringBuffer(); + if (!asnOrderItem.getExtendFields().isEmpty()) { + Map<String, String> fields = asnOrderItem.getExtendFields(); + asnOrderItem.getExtendFields().keySet().forEach(key -> { + sb.append(fields.get(key)); + }); + } + sb.append(asnOrderItem.getAsnCode() + asnOrderItem.getMatnrId() + asnOrderItem.getSplrBatch() + asnOrderItem.getIsptResult$()); + //鑾峰彇16浣島uid + String uuid16 = Cools.md5Chinese(sb.toString()); asnOrderItem.setFieldsIndex(uuid16); + if (FieldsUtils.saveFields(params, uuid16)) { + asnOrderItem.setFieldsIndex(uuid16); + } } } catch (Exception e) { throw new RuntimeException(e); -- Gitblit v1.9.1