rsf-admin/src/page/orders/outStock/OutOrderCreate.jsx
@@ -27,13 +27,14 @@ Grid, Box, } from '@mui/material'; import DialogCloseButton from "../components/DialogCloseButton"; import StatusSelectInput from "../components/StatusSelectInput"; import MemoInput from "../components/MemoInput"; import DialogCloseButton from "../../components/DialogCloseButton"; import StatusSelectInput from "../../components/StatusSelectInput"; import MemoInput from "../../components/MemoInput"; const OutOrderCreate = (props) => { const { open, setOpen } = props; const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_order_type')) || []; const business = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_business_type')) || []; const translate = useTranslate(); const notify = useNotify(); @@ -69,7 +70,9 @@ disableRestoreFocus maxWidth="md" // 'xs' | 'sm' | 'md' | 'lg' | 'xl' > <Form> <Form resource="outStock" > <DialogTitle id="form-dialog-title" sx={{ position: 'sticky', top: 0, @@ -84,71 +87,57 @@ </DialogTitle> <DialogContent sx={{ mt: 2 }}> <Grid container rowSpacing={2} columnSpacing={2}> {/* <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.asnOrder.code" source="code" parse={v => v} autoFocus /> </Grid> */} <Grid item xs={6} display="flex" gap={1}> <Grid item xs={12} display="flex" gap={1}> <TextInput label="table.field.asnOrder.poCode" source="poCode" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.asnOrder.poId" source="poId" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput <AutocompleteInput choices={dicts} optionText="label" label="table.field.asnOrder.type" source="type" parse={v => v} optionValue="value" validate={required()} parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput <Grid item xs={12} display="flex" gap={1}> <AutocompleteInput choices={business} optionText="label" label="table.field.asnOrder.wkType" source="wkType" parse={v => v} optionValue="value" validate={required()} parse={v => v} /> </Grid> {/* <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.asnOrder.anfme" source="anfme" validate={required()} /> </Grid> */} {/* <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.asnOrder.qty" source="qty" validate={required()} /> </Grid> */} <Grid item xs={6} display="flex" gap={1}> </Grid> <Grid item xs={12} display="flex" gap={1}> <TextInput label="table.field.asnOrder.logisNo" source="logisNo" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <DateInput label="table.field.asnOrder.arrTime" source="arrTime" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <SelectInput label="table.field.asnOrder.rleStatus" source="rleStatus" @@ -158,8 +147,7 @@ ]} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <Grid item xs={4} display="flex" gap={1}> <StatusSelectInput /> </Grid> <Grid item xs={12} display="flex" gap={1}> rsf-admin/src/page/orders/outStock/OutOrderList.jsx
@@ -47,16 +47,13 @@ import ConfirmButton from '../../components/ConfirmButton'; import PageDrawer from "../../components/PageDrawer"; import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting'; import ConstructionIcon from "@mui/icons-material/Construction"; import EditIcon from '@mui/icons-material/Edit'; import TaskIcon from '@mui/icons-material/Task'; import CloseIcon from '@mui/icons-material/Close'; import request from '@/utils/request'; import DictionarySelect from "../../components/DictionarySelect"; import ExitToAppIcon from '@mui/icons-material/ExitToApp'; import ImportButton from "../../components/ImportButton"; import DetailsIcon from '@mui/icons-material/Details'; import CancelIcon from '@mui/icons-material/Cancel'; import OutOrderCreate from "./OutOrderCreate"; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { height: '.9em' @@ -112,6 +109,7 @@ const OutOrderList = (props) => { const translate = useTranslate(); const [createDialog, setCreateDialog] = useState(false); const [manualDialog, setManualDialog] = useState(false); const [drawerVal, setDrawerVal] = useState(false); const [modalType, setmodalType] = useState(0); const [select, setSelect] = useState(0); @@ -131,14 +129,14 @@ marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, }} title={"menu.outStock"} empty={<EmptyData onClick={() => { setCreateDialog(true); setmodalType(0) }} />} empty={false} filters={filters} filter={{ deleted: 0, type: 'out' }} sort={{ field: "create_time", order: "desc" }} actions={( <TopToolbar> <FilterButton /> <MyCreateButton onClick={() => { setCreateDialog(true); setmodalType(0) }} /> <MyCreateButton onClick={() => { setManualDialog(true) }} /> <SelectColumnsButton preferenceKey='outStock' /> <ImportButton value={'asnOrderItem'} /> <MyExportButton /> @@ -152,7 +150,6 @@ bulkActionButtons={ <> <MyExportButton /> {/* <BtnBulkExport></BtnBulkExport> */} <BulkDeleteButton mutationMode={OPERATE_MODE} /> </>} @@ -180,10 +177,10 @@ <EditButton label="toolbar.detail" icon={(<DetailsIcon />)}></EditButton> <MyButton setCreateDialog={setCreateDialog} setmodalType={setmodalType} /> <CancelButton></CancelButton> {/* <CompleteButton /> */} </WrapperField> </StyledDatagrid> </List> <OutOrderCreate open={manualDialog} setOpen={setManualDialog} /> <AsnOrderModal open={createDialog} setOpen={setCreateDialog} @@ -222,36 +219,14 @@ ) } const CompleteButton = () => { const record = useRecordContext(); const notify = useNotify(); const refresh = useRefresh(); const requestComplete = async () => { const { data: { code, data, msg } } = await request.post(`/asnOrder/complete/${record.id}`); if (code === 200) { notify(msg); refresh() } else { notify(msg); } } return ( record.exceStatus === 1 && (record.anfme === record.qty ? <Button onClick={requestComplete} label={"toolbar.complete"} color="success"> <TaskIcon /> </Button> : <ConfirmButton label={"toolbar.complete"} color="success" data={'当前收货数量小于计划数量,是否确认完成'} startIcon={<TaskIcon />} onConfirm={requestComplete} />) ) } const CancelButton = () => { const record = useRecordContext(); const notify = useNotify(); const refresh = useRefresh(); const cancelOrder = async () => { const { data: { code, data, msg } } = await request.post(`/outStock/cancel/${record.id}`); const cancelOrder = async (event) => { event.stopPropagation(); const { data: { code, data, msg } } = await request.get(`/outStock/cancel/${record.id}`); if (code === 200) { notify(msg); refresh() @@ -261,26 +236,6 @@ } return ( <ConfirmButton label={"toolbar.cancel"} startIcon={<CancelIcon />} onConfirm={cancelOrder} /> ) } const CloseButton = () => { const record = useRecordContext(); const notify = useNotify(); const refresh = useRefresh(); const requestClose = async () => { const { data: { code, data, msg } } = await request.post(`/outStock/close/${record.id}`); if (code === 200) { notify(msg); refresh() } else { notify(msg); } } return ( <ConfirmButton label={"toolbar.close"} color="error" data={'确认是否关闭?'} startIcon={<CloseIcon />} onConfirm={requestClose} /> <ConfirmButton label={"toolbar.cancel"} startIcon={<CancelIcon />} onConfirm={cancelOrder} /> ) } rsf-admin/src/page/system/dicts/dictType/DictDataList.jsx
@@ -108,7 +108,7 @@ empty={false} filters={filters} filter={{ dictTypeId: dictId }} sort={{ field: "create_time", order: "desc" }} sort={{ field: "sort", order: "asc" }} actions={( <TopToolbar> <FilterButton /> rsf-admin/src/page/system/dicts/dictType/DictTypeList.jsx
@@ -91,7 +91,7 @@ title={"menu.dictType"} empty={<EmptyData onClick={() => { setCreateDialog(true) }} />} filters={filters} sort={{ field: "create_time", order: "desc" }} sort={{ field: "sort", order: "asc" }} actions={( <TopToolbar> <FilterButton /> rsf-admin/src/page/system/serialRule/SerialRuleCreate.jsx
@@ -47,7 +47,7 @@ setOpen(false); notify("common.response.success"); }; const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_task_reset_type')) || []; const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_rule_type')) || []; const handleError = async (error) => { notify(error.message || "common.response.fail", { rsf-admin/src/page/system/serialRule/SerialRuleItemCreate.jsx
@@ -98,7 +98,7 @@ choices={dicts} optionText="label" label="table.field.serialRuleItem.wkType" source="type" source="wkType" optionValue="value" parse={v => v} validate={[required()]} /> rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
@@ -26,6 +26,7 @@ import com.vincent.rsf.server.system.utils.SerialRuleUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -76,9 +77,12 @@ public R save(@RequestBody AsnOrder asnOrder) { asnOrder.setCreateBy(getLoginUserId()) .setUpdateBy(getLoginUserId()); if (!Objects.isNull(asnOrder.getCode())) { String code = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_OUT_STOCK_CODE, asnOrder); asnOrder.setCode(code); if (Objects.isNull(asnOrder.getCode())) { String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_OUT_STOCK_CODE, asnOrder); if (Objects.isNull(ruleCode) || StringUtils.isBlank(ruleCode)) { return R.error("编码规则错误:编码「SYS_OUT_STOCK_CODE」是未设置成功!!"); } asnOrder.setCode(ruleCode); } if (!outStockService.save(asnOrder)) { return R.error("Save Fail"); rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java
@@ -37,36 +37,36 @@ public class OutStockItemController extends BaseController { @Autowired private OutStockItemService asnOrderItemService; private OutStockItemService outStockItemService; @Autowired private CompanysService companysService; // @PreAuthorize("hasAuthority('manager:outStockItem:list')") // @ApiOperation("分页获取列表") // @PostMapping("/outStockItem/page") // public R page(@RequestBody Map<String, Object> map) { // BaseParam baseParam = buildParam(map, BaseParam.class); // PageParam<AsnOrderItem, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrderItem.class); // return R.ok().add(asnOrderItemService.listByAsnId(pageParam, pageParam.buildWrapper(true))); // } @PreAuthorize("hasAuthority('manager:outStockItem:list')") @ApiOperation("分页获取列表") @PostMapping("/outStockItem/page") public R page(@RequestBody Map<String, Object> map) { BaseParam baseParam = buildParam(map, BaseParam.class); PageParam<AsnOrderItem, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrderItem.class); return R.ok().add(outStockItemService.listByAsnId(pageParam, pageParam.buildWrapper(true))); } @PreAuthorize("hasAuthority('manager:outStockItem:list')") @PostMapping("/outStockItem/list") public R list(@RequestBody Map<String, Object> map) { return R.ok().add(asnOrderItemService.list()); return R.ok().add(outStockItemService.list()); } @PreAuthorize("hasAuthority('manager:outStockItem:list')") @PostMapping({"/outStockItem/many/{ids}", "/outStockItems/many/{ids}"}) public R many(@PathVariable Long[] ids) { return R.ok().add(asnOrderItemService.listByIds(Arrays.asList(ids))); return R.ok().add(outStockItemService.listByIds(Arrays.asList(ids))); } @PreAuthorize("hasAuthority('manager:outStockItem:list')") @GetMapping("/outStockItem/{id}") public R get(@PathVariable("id") Long id) { return R.ok().add(asnOrderItemService.getById(id)); return R.ok().add(outStockItemService.getById(id)); } @PreAuthorize("hasAuthority('manager:outStockItem:save')") @@ -79,7 +79,7 @@ params.put("createBy", getLoginUserId()); params.put("updateBy", getLoginUserId()); if (!asnOrderItemService.fieldsSave(params)) { if (!outStockItemService.fieldsSave(params)) { return R.error("Save Fail"); } return R.ok("Save Success"); @@ -100,7 +100,7 @@ asnOrderItem.setSplrCode(companys.getCode()).setSplrName(companys.getName()); } } if (!asnOrderItemService.updateById(asnOrderItem)) { if (!outStockItemService.updateById(asnOrderItem)) { return R.error("Update Fail"); } return R.ok("Update Success").add(asnOrderItem); @@ -110,7 +110,7 @@ @OperationLog("Delete 出库单明细") @PostMapping("/outStockItem/remove/{ids}") public R remove(@PathVariable Long[] ids) { if (!asnOrderItemService.removeByIds(Arrays.asList(ids))) { if (!outStockItemService.removeByIds(Arrays.asList(ids))) { return R.error("Delete Fail"); } return R.ok("Delete Success").add(ids); @@ -124,7 +124,7 @@ if (!Cools.isEmpty(condition)) { wrapper.like(AsnOrderItem::getId, condition); } asnOrderItemService.page(new Page<>(1, 30), wrapper).getRecords().forEach( outStockItemService.page(new Page<>(1, 30), wrapper).getRecords().forEach( item -> vos.add(new KeyValVo(item.getId(), item.getId())) ); return R.ok().add(vos); @@ -138,14 +138,14 @@ if (!Objects.isNull(map.get("ids"))) { List<Long> ids = JSONArray.parseArray(JSONObject.toJSONString(map.get("ids")), Long.class); if (!ids.isEmpty()) { orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>() orderItems = outStockItemService.list(new LambdaQueryWrapper<AsnOrderItem>() .in(AsnOrderItem::getId, ids) .eq(AsnOrderItem::getStatus, 1)); } else { orderItems = asnOrderItemService.list(new LambdaQueryWrapper<>()); orderItems = outStockItemService.list(new LambdaQueryWrapper<>()); } } else { orderItems = asnOrderItemService.list(new LambdaQueryWrapper<>()); orderItems = outStockItemService.list(new LambdaQueryWrapper<>()); } ExcelUtil.build(ExcelUtil.create(orderItems, AsnOrderItem.class, true), response); @@ -164,7 +164,7 @@ R.error("文件不能为空!!"); } HashMap<String, Object> hashMap = new HashMap<>(); return asnOrderItemService.excelImport(file, hashMap, getLoginUserId()); return outStockItemService.excelImport(file, hashMap, getLoginUserId()); } /** rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockItemService.java
@@ -19,4 +19,7 @@ R excelImport(MultipartFile file, HashMap<String, Object> hashMap, Long loginUserId) throws Exception; IPage<Map<String, Object>> listByAsnId(PageParam<AsnOrderItem, BaseParam> pageParam, QueryWrapper<AsnOrderItem> buildWrapper); } rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockItemServiceImpl.java
@@ -4,12 +4,16 @@ import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.api.entity.enums.OrderType; import com.vincent.rsf.server.api.entity.enums.OrderWorkType; import com.vincent.rsf.server.common.domain.BaseParam; import com.vincent.rsf.server.common.domain.PageParam; import com.vincent.rsf.server.common.utils.CommonUtil; import com.vincent.rsf.server.common.utils.ExcelUtil; import com.vincent.rsf.server.common.utils.FieldsUtils; @@ -84,6 +88,13 @@ return true; } /** * @author Ryan * @description 出库单模板导入 * @param * @return * @time 2025/4/22 12:40 */ @Override @Transactional(rollbackFor = Exception.class) public R excelImport(MultipartFile file, HashMap<String, Object> hashMap, Long loginUserId) throws Exception { @@ -156,4 +167,22 @@ return R.ok("操作成功!!"); } /** * @author Ryan * @description 获取Page页 * @param * @return * @time 2025/4/22 12:39 */ @Override public IPage<Map<String, Object>> listByAsnId(PageParam<AsnOrderItem, BaseParam> pageParam, QueryWrapper<AsnOrderItem> buildWrapper) { IPage<Map<String, Object>> hsahMap = this.baseMapper.resultForMap(pageParam, buildWrapper); if (hsahMap.getRecords().isEmpty()) { return hsahMap.setRecords(new ArrayList<>()); } hsahMap.setRecords(FieldsUtils.getExtendFields(hsahMap.getRecords())); return hsahMap; } } rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
@@ -165,7 +165,7 @@ throw new CoolException("单据不存在!!"); } if (!order.getExceStatus().equals(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val)) { throw new CoolException("当前单据状态为:" + AsnExceStatus.getExceStatus(order.getExceStatus()) + ", 不可执行取消操作!!"); throw new CoolException("当前单据状态为" + AsnExceStatus.getExceStatus(order.getExceStatus()) + ", 不可执行取消操作!!"); } order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_TASK_CANCEL.val).setStatus(0); rsf-server/src/main/java/com/vincent/rsf/server/system/entity/SerialRule.java
@@ -4,6 +4,8 @@ import java.text.SimpleDateFormat; import java.util.Date; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.server.system.service.DictDataService; import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; import java.text.SimpleDateFormat; @@ -173,18 +175,13 @@ public String getReset$(){ if (null == this.reset){ return null; } switch (this.reset){ case "year": return " 年"; case "month": return " 月"; case "dd": return " 天"; case "non": return " 无"; default: return String.valueOf(this.reset); DictDataService dictDataService = SpringUtils.getBean(DictDataService.class); DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>() .eq(DictData::getDictTypeCode,"sys_rule_type").eq(DictData::getValue, this.reset)); if (null != dictData){ return dictData.getLabel(); } return String.valueOf(this.reset); } public String getStatus$(){