#修改优化
1. 字典优化修改
2. 编码规则优化
3. 出库单编码生成为空问题修复
12个文件已修改
234 ■■■■■ 已修改文件
rsf-admin/src/page/orders/outStock/OutOrderCreate.jsx 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/OutOrderList.jsx 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/dicts/dictType/DictDataList.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/dicts/dictType/DictTypeList.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/serialRule/SerialRuleCreate.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/serialRule/SerialRuleItemCreate.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockItemService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockItemServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/system/entity/SerialRule.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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$(){