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 { 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> ) } 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; } 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位uuid 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位uuid // 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)) { 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')") 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位uuid String uuid16 = Cools.md5Chinese(sb.toString()); asnOrderItem.setFieldsIndex(uuid16); if (FieldsUtils.saveFields(params, uuid16)) { asnOrderItem.setFieldsIndex(uuid16); } } } catch (Exception e) { throw new RuntimeException(e);