rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx
@@ -43,10 +43,10 @@ import PageDrawer from "../../components/PageDrawer"; import DialogCloseButton from "../../components/DialogCloseButton"; import request from '@/utils/request'; import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE, DEFAULT_ITEM_PAGE_SIZE } from '@/config/setting'; import AsnOrderItemEdit from "./AsnOrderItemEdit"; import ImportButton from "../../components/ImportButton"; import request from '@/utils/request'; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { rsf-admin/src/page/orders/stock/OrderItemList.jsx
@@ -28,12 +28,13 @@ SelectInput, NumberInput, ReferenceInput, useRefresh, ReferenceArrayInput, AutocompleteInput, DeleteButton, 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 OrderItemCreate from "./OrderItemCreate"; import EmptyData from "../../components/EmptyData"; @@ -43,6 +44,7 @@ import MyField from "../../components/MyField"; import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_ITEM_PAGE_SIZE } from '@/config/setting'; import * as Common from '@/utils/common'; import request from '@/utils/request'; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { @@ -126,43 +128,7 @@ )} perPage={DEFAULT_ITEM_PAGE_SIZE} > <StyledDatagrid preferenceKey='stockItem' bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} rowClick={(id, resource, record) => false} expand={false} expandSingle={true} omit={['id', 'createTime', 'orderId', 'sourceItemId', 'matnrId', 'purUnit','splrCode', 'purQty', 'createBy', 'packName', 'prodTime', 'splrName', 'splrCode', 'batch', 'packName', 'updateBy$', 'createBy$', 'memo']} > <NumberField source="id" /> <NumberField source="orderId" label="table.field.stockItem.orderId" /> <TextField source="orderCode" label="table.field.stockItem.orderCode" /> <TextField source="sourceItemId" label="table.field.stockItem.sourceItemId" /> <TextField source="matnrId" label="table.field.stockItem.matnrId" /> <TextField source="matnrCode" label="table.field.stockItem.matnrCode" /> <TextField source="maktx" label="table.field.stockItem.maktx" /> <NumberField source="anfme" label="table.field.stockItem.anfme" /> <TextField source="stockUnit" label="table.field.stockItem.stockUnit" /> <NumberField source="workQty" label="table.field.stockItem.workQty" /> <TextField source="locCode" label="table.field.loc.code" />, <TextField source="barcode" label="table.field.task.barcode" />, <NumberField source="purQty" label="table.field.stockItem.purQty" /> <TextField source="purUnit" label="table.field.stockItem.purUnit" /> <NumberField source="qty" label="table.field.stockItem.qty" /> <TextField source="splrCode" label="table.field.stockItem.splrCode" /> <TextField source="batch" label="table.field.stockItem.batch" /> <TextField source="splrBatch" label="table.field.stockItem.splrBatch" /> <TextField source="splrName" label="table.field.stockItem.splrName" /> <TextField source="trackCode" label="table.field.stockItem.trackCode" /> <TextField source="prodTime" label="table.field.stockItem.prodTime" /> <TextField source="packName" label="table.field.stockItem.packName" /> <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} /> </StyledDatagrid> <DynamicFields /> </List> <PageDrawer title='stockItem Detail' @@ -175,3 +141,85 @@ } export default OrderItemList; 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="orderId" label="table.field.stockItem.orderId" />, <TextField source="orderCode" label="table.field.stockItem.orderCode" />, <TextField source="sourceItemId" label="table.field.stockItem.sourceItemId" />, <TextField source="matnrId" label="table.field.stockItem.matnrId" />, <TextField source="matnrCode" label="table.field.stockItem.matnrCode" />, <TextField source="maktx" label="table.field.stockItem.maktx" />, <NumberField source="anfme" label="table.field.stockItem.anfme" />, <TextField source="stockUnit" label="table.field.stockItem.stockUnit" />, <NumberField source="workQty" label="table.field.stockItem.workQty" />, <TextField source="locCode" label="table.field.loc.code" />, <TextField source="barcode" label="table.field.task.barcode" />, <NumberField source="purQty" label="table.field.stockItem.purQty" />, <TextField source="purUnit" label="table.field.stockItem.purUnit" />, <NumberField source="qty" label="table.field.stockItem.qty" />, <TextField source="splrCode" label="table.field.stockItem.splrCode" />, <TextField source="batch" label="table.field.stockItem.batch" />, <TextField source="splrBatch" label="table.field.stockItem.splrBatch" />, <TextField source="splrName" label="table.field.stockItem.splrName" />, <TextField source="trackCode" label="table.field.stockItem.trackCode" />, <TextField source="prodTime" label="table.field.stockItem.prodTime" />, <TextField source="packName" label="table.field.stockItem.packName" /> ] 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} /> ] 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='stockItem' bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} rowClick={(id, resource, record) => false} expand={false} expandSingle={true} omit={['id', 'createTime', 'orderId', 'sourceItemId', 'matnrId', 'purUnit', 'splrCode', 'purQty', 'createBy', 'packName', 'prodTime', 'splrName', 'splrCode', 'batch', 'trackCode', 'updateBy$', 'createBy$', 'memo']} > {columns.map((column) => column)} </StyledDatagrid>} </Box> ) } rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java
@@ -12,16 +12,23 @@ import com.vincent.rsf.server.manager.enums.AsnExceStatus; import com.vincent.rsf.server.manager.enums.TaskStsType; import com.vincent.rsf.server.manager.service.*; import com.vincent.rsf.server.manager.service.impl.StockItemServiceImpl; import com.vincent.rsf.server.manager.service.impl.StockServiceImpl; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.entity.Fields; import com.vincent.rsf.server.system.entity.FieldsItem; import com.vincent.rsf.server.system.service.FieldsItemService; import com.vincent.rsf.server.system.service.FieldsService; import com.vincent.rsf.server.system.service.impl.FieldsItemServiceImpl; import com.vincent.rsf.server.system.service.impl.FieldsServiceImpl; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import com.vincent.rsf.server.system.utils.SystemAuthUtils; import lombok.Synchronized; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; @@ -50,6 +57,10 @@ private FieldsItemService fieldsItemService; @Autowired private FieldsService fieldsService; @Autowired private StockService stockService; @Autowired private StockItemServiceImpl stockItemService; @Override public R getOutStockTaskItem(String barcode) { @@ -270,12 +281,41 @@ throw new CoolException("出库单明细更新失败!!"); } Stock stock = new Stock(); String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("当前业务:" + SerialRuleCode.SYS_STOCK_CODE + ",编码规则不存在!!"); } Double sum = taskItems.stream().mapToDouble(TaskItem::getAnfme).sum(); stock.setCode(ruleCode) .setUpdateBy(SystemAuthUtils.getLoginUserId()) .setBarcode(task.getBarcode()) .setLocCode(task.getOrgLoc()) .setType(order.getType()) .setWkType(Short.parseShort(order.getWkType())) .setSourceId(orderItem.getOrderId()) .setSourceCode(orderItem.getOrderCode()) .setUpdateTime(new Date()) .setAnfme(sum); if (!stockService.save(stock)) { throw new CoolException("出入库历史保存失败!!"); } List<StockItem> stockItems = new ArrayList<>(); items.forEach(taskItem -> { taskItem.setQty(taskItem.getAnfme()); if (!taskItemService.updateById(taskItem)) { throw new CoolException("状态完成失败!!"); } StockItem stockItem = new StockItem(); BeanUtils.copyProperties(taskItem, stockItem); stockItem.setStockId(stock.getId()).setStockCode(stock.getCode()).setSourceItemId(orderItem.getId()); stockItems.add(stockItem); }); if (!stockItemService.saveBatch(stockItems)) { throw new CoolException("出入库历史明细保存失败!!"); } }); List<WkOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, params.getOrderId())); @@ -292,8 +332,13 @@ throw new CoolException("出库单更新状态失败"); } } return R.ok(); } private void saveOrderToStock(Order order) { } /** @@ -329,13 +374,13 @@ } }); orderItems.forEach(orderItem -> { try { taskService.saveOutStockItem(taskItems, orderItem, null, null, SystemAuthUtils.getLoginUserId()); } catch (Exception e) { throw new RuntimeException(e); } }); // orderItems.forEach(orderItem -> { // try { // taskService.saveOutStockItem(taskItems, orderItem, null, null, SystemAuthUtils.getLoginUserId()); // } catch (Exception e) { // throw new RuntimeException(e); // } // }); // containerWaveParam.getOrderItems().forEach(orderItem -> { // rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/StockItemController.java
@@ -9,7 +9,9 @@ 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.StockItem; import com.vincent.rsf.server.manager.entity.WkOrderItem; import com.vincent.rsf.server.manager.service.StockItemService; import com.vincent.rsf.server.system.controller.BaseController; import io.swagger.annotations.Api; @@ -32,7 +34,16 @@ public R page(@RequestBody Map<String, Object> map) { BaseParam baseParam = buildParam(map, BaseParam.class); PageParam<StockItem, BaseParam> pageParam = new PageParam<>(baseParam, StockItem.class); return R.ok().add(stockItemService.page(pageParam, pageParam.buildWrapper(true))); PageParam<StockItem, BaseParam> page = stockItemService.page(pageParam, pageParam.buildWrapper(true)); List<StockItem> records = page.getRecords(); for (StockItem 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:stock:list')") rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java
@@ -57,8 +57,6 @@ private ReportMsgService reportMsgService; /** * @param * @return @@ -108,8 +106,6 @@ throw new CoolException(e.getMessage()); } } /** @@ -190,7 +186,7 @@ // if (orders.isEmpty()) { // throw new CoolException("数据错误:关联表信息不存在!!"); // } // Set<Long> orderIds = orders.stream().map(TransferOrder::getOrderId).collect(Collectors.toSet()); // Set<Long> orderIds = orders.stream().map(TransferOrder::getOrd erId).collect(Collectors.toSet()); // if (!asnOrderItemService.remove(new LambdaQueryWrapper<WkOrderItem>() // .in(WkOrderItem::getOrderId, orderIds))) { // throw new CoolException("原单据明细删除失败!!"); rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -1159,11 +1159,11 @@ if (Objects.isNull(waveItem)) { throw new CoolException("波次明细不存在!!"); } try { saveOutStockItem(maps.get(key), null, waveItem, null, loginUserId); } catch (Exception e) { throw new CoolException(e.getMessage()); } // try { // saveOutStockItem(maps.get(key), null, waveItem, null, loginUserId); // } catch (Exception e) { // throw new CoolException(e.getMessage()); // } } else if (task.getResource().equals(TaskResouceType.TASK_RESOUCE_ORDER_TYPE.val)) { WkOrderItem orderItem = asnOrderItemService.getById(key); if (Objects.isNull(orderItem)) {