From 7737c1a11778a236592ff3677d54a44776fd440f Mon Sep 17 00:00:00 2001
From: skyouc <958836976@qq.com>
Date: 星期六, 11 十月 2025 15:15:46 +0800
Subject: [PATCH] 容器管理初始化功能
---
rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/QRCodeType.java | 20 +
rsf-admin/src/page/container/ContainerList.jsx | 21 +
rsf-admin/src/page/basicInfo/basContainer/PrintModal.jsx | 249 ++++++++++++++++++++
rsf-admin/src/page/basicInfo/basContainer/BasContainerInit.jsx | 134 +++++++++++
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/BasContainer.java | 7
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/BasContainerService.java | 3
rsf-admin/src/page/basicInfo/basContainer/BasContainerList.jsx | 76 +++++-
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/InitContainerParams.java | 31 ++
rsf-server/src/main/resources/application.yml | 2
rsf-admin/src/i18n/zh.js | 5
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/BasContainerController.java | 41 ++-
rsf-admin/src/i18n/en.js | 5
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/BasContainerServiceImpl.java | 67 +++++
rsf-server/src/main/resources/application-dev.yml | 10
14 files changed, 638 insertions(+), 33 deletions(-)
diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index 194a87e..b4c4cc8 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -126,6 +126,7 @@
},
create: {
title: 'Create',
+ init: 'Init',
empty: {
title: 'Data Empty',
desc: 'Please Create Data First',
@@ -227,6 +228,9 @@
basContainer: {
containerType: 'containerType',
codeType: 'codeType',
+ startNo: 'Start No',
+ code: 'Barcode',
+ endNo: 'End No',
areas: 'areas',
},
basStation: {
@@ -1310,6 +1314,7 @@
detail: "Detail",
unenable: 'unenable',
locInit: 'loc init',
+ init: "Init",
siteInit: 'site init',
batch: 'batch',
pick: 'Pick',
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 980968e..ee0284b 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -127,6 +127,7 @@
},
create: {
title: '娣诲姞',
+ init: '鍒濆鍖�',
empty: {
title: '鏆傛棤鏁版嵁',
desc: '璇峰厛娣诲姞鏁版嵁',
@@ -249,6 +250,9 @@
},
basContainer: {
containerType: '瀹瑰櫒绫诲瀷',
+ startNo: '璧峰鏁板��',
+ endNo: '缁撴潫鏁板��',
+ code: '鏉$爜',
codeType: '鏉$爜绫诲瀷',
areas: '鍙叆搴撳尯',
},
@@ -1332,6 +1336,7 @@
confirm: '纭',
start: '鑷姩涓嬪彂',
autoStartLocs: '鑷姩璺戝簱',
+ init: "鍒濆鍖�",
stopPub: '缁堟涓嬪彂',
pause: '鏆傚仠',
pick: '鎷f枡',
diff --git a/rsf-admin/src/page/basicInfo/basContainer/BasContainerInit.jsx b/rsf-admin/src/page/basicInfo/basContainer/BasContainerInit.jsx
new file mode 100644
index 0000000..53c0b1a
--- /dev/null
+++ b/rsf-admin/src/page/basicInfo/basContainer/BasContainerInit.jsx
@@ -0,0 +1,134 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+ CreateBase,
+ useTranslate,
+ TextInput,
+ NumberInput,
+ BooleanInput,
+ DateInput,
+ SaveButton,
+ SelectInput,
+ ReferenceInput,
+ ReferenceArrayInput,
+ AutocompleteInput,
+ Toolbar,
+ required,
+ useDataProvider,
+ useNotify,
+ Form,
+ useCreateController,
+ SelectArrayInput,
+} from 'react-admin';
+import {
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ Stack,
+ Grid,
+ Box,
+} from '@mui/material';
+import DialogCloseButton from "../../components/DialogCloseButton";
+import StatusSelectInput from "../../components/StatusSelectInput";
+import DictionarySelect from "../../components/DictionarySelect";
+import MemoInput from "../../components/MemoInput";
+
+
+const BasContainerCreate = (props) => {
+ const { open, setOpen } = props;
+ const translate = useTranslate();
+ const notify = useNotify();
+
+ const handleClose = (event, reason) => {
+ if (reason !== "backdropClick") {
+ setOpen(false);
+ }
+ };
+
+ const handleSuccess = async (data) => {
+ setOpen(false);
+ notify('common.response.success');
+ };
+
+ const handleError = async (error) => {
+ notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
+ };
+
+ return (
+ <>
+ <CreateBase
+ record={{}}
+ resource="/basContainer/init"
+ transform={(data) => {
+ return data;
+ }}
+ mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
+ >
+ <Dialog
+ open={open}
+ onClose={handleClose}
+ aria-labelledby="form-dialog-title"
+ fullWidth
+ disableRestoreFocus
+ maxWidth="md" // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
+ >
+ <Form>
+ <DialogTitle id="form-dialog-title" sx={{
+ position: 'sticky',
+ top: 0,
+ backgroundColor: 'background.paper',
+ zIndex: 1000
+ }}
+ >
+ {translate('create.init')}
+ <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+ <DialogCloseButton onClose={handleClose} />
+ </Box>
+ </DialogTitle>
+ <DialogContent sx={{ mt: 2 }}>
+ <Grid container rowSpacing={2} columnSpacing={2}>
+ <Grid item xs={6} display="flex" gap={1}>
+ <BooleanInput
+ label="table.field.deviceSite.flagInit"
+ source="flagInit"
+ parse={v => v}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <DictionarySelect
+ label={translate("table.field.basStation.containerType")}
+ name="containerType"
+ size="small"
+ validate={[required()]}
+ dictTypeCode="sys_container_type"
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TextInput
+ label="table.field.basContainer.startNo"
+ source="startNo"
+ parse={v => v}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TextInput
+ label="table.field.basContainer.endNo"
+ source="endNo"
+ parse={v => v}
+ />
+ </Grid>
+ </Grid>
+ </DialogContent>
+ <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+ <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }} >
+ <SaveButton />
+ </Toolbar>
+ </DialogActions>
+ </Form>
+ </Dialog>
+ </CreateBase>
+ </>
+ )
+}
+
+export default BasContainerCreate;
diff --git a/rsf-admin/src/page/basicInfo/basContainer/BasContainerList.jsx b/rsf-admin/src/page/basicInfo/basContainer/BasContainerList.jsx
index 722bb6e..224f9f3 100644
--- a/rsf-admin/src/page/basicInfo/basContainer/BasContainerList.jsx
+++ b/rsf-admin/src/page/basicInfo/basContainer/BasContainerList.jsx
@@ -31,6 +31,7 @@
ReferenceArrayInput,
AutocompleteInput,
DeleteButton,
+ Button,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
@@ -42,8 +43,11 @@
import PageDrawer from "../../components/PageDrawer";
import MyField from "../../components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
-import * as Common from '@/utils/common';
import CrossZoneAreaField from "../basStation/CrossZoneAreaField";
+import AllInclusiveIcon from '@mui/icons-material/AllInclusive';
+import BasContainerInit from "./BasContainerInit";
+import PrintModal from './PrintModal'
+
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
'& .css-1vooibu-MuiSvgIcon-root': {
@@ -61,8 +65,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="containerType" label="table.field.basContainer.containerType" />,
<TextInput source="codeType" label="table.field.basContainer.codeType" />,
@@ -85,6 +89,9 @@
const [areaFieldDialog, setAreaFieldDialog] = useState(false);
const [createDialog, setCreateDialog] = useState(false);
const [drawerVal, setDrawerVal] = useState(false);
+ const [open, setOpen] = useState(false);
+ const [print, setPrint] = useState(false);
+ const [selectPrints, setSelectPrints] = useState([]);
return (
<Box display="flex">
@@ -98,11 +105,12 @@
marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
}}
title={"menu.basContainer"}
- empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+ empty={false}
filters={filters}
sort={{ field: "create_time", order: "desc" }}
actions={(
<TopToolbar>
+ <InitButton setOpen={setOpen} />
<FilterButton />
<MyCreateButton onClick={() => { setCreateDialog(true) }} />
<SelectColumnsButton preferenceKey='basContainer' />
@@ -113,21 +121,18 @@
>
<StyledDatagrid
preferenceKey='basContainer'
- bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
- rowClick={(id, resource, record) => false}
+ bulkActionButtons={<>
+ <BulkPrintBarcode setPrint={setPrint} setSelectPrints={setSelectPrints} />
+ <BulkDeleteButton mutationMode={OPERATE_MODE} />
+ </>}
+ rowClick={(id, resource, record) => false}
expandSingle={true}
- omit={['id', 'createTime', 'createBy', 'memo','statusBool']}
+ omit={['id', 'statusBool']}
>
<NumberField source="id" />
<NumberField source="containerType$" label="table.field.basContainer.containerType" />
+ <TextField source="code" label="table.field.basContainer.code" />
<TextField source="codeType" label="table.field.basContainer.codeType" />
- <WrapperField cellClassName="areas" label="table.field.basContainer.areas">
- <CrossZoneAreaField
- open={areaFieldDialog}
- setOpen={setAreaFieldDialog}
- />
- </WrapperField>
-
<ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
<TextField source="nickname" />
</ReferenceField>
@@ -148,6 +153,15 @@
open={createDialog}
setOpen={setCreateDialog}
/>
+ <BasContainerInit
+ open={open}
+ setOpen={setOpen}
+ />
+ <PrintModal
+ open={print}
+ setOpen={setPrint}
+ rows={selectPrints}
+ />
<PageDrawer
title='BasContainer Detail'
drawerVal={drawerVal}
@@ -158,4 +172,38 @@
)
}
+//鍒濆鍖栨寜閽�
+const InitButton = ({ setOpen }) => {
+ const init = () => {
+ setOpen(true)
+ }
+ return (
+ <Button
+ label="toolbar.init"
+ variant="text"
+ size="small"
+ onClick={init}
+ startIcon={<AllInclusiveIcon />} />
+ )
+}
+
+const BulkPrintBarcode = ({ setPrint, setSelectPrints }) => {
+ const { selectedIds } = useListContext();
+ //鎵撳嵃
+ const print = () => {
+ setPrint(true);
+ setSelectPrints(selectedIds);
+ }
+
+ return (
+ <Button
+ label="toolbar.print"
+ variant="text"
+ size="small"
+ onClick={print}
+ startIcon={<AllInclusiveIcon />} />
+ )
+}
+
+
export default BasContainerList;
diff --git a/rsf-admin/src/page/basicInfo/basContainer/PrintModal.jsx b/rsf-admin/src/page/basicInfo/basContainer/PrintModal.jsx
new file mode 100644
index 0000000..0681623
--- /dev/null
+++ b/rsf-admin/src/page/basicInfo/basContainer/PrintModal.jsx
@@ -0,0 +1,249 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+ CreateBase,
+ useTranslate,
+ TextInput,
+ NumberInput,
+ BooleanInput,
+ DateInput,
+ SaveButton,
+ SelectInput,
+ ReferenceInput,
+ ReferenceArrayInput,
+ AutocompleteInput,
+ Toolbar,
+ required,
+ useDataProvider,
+ useNotify,
+ Form,
+ useCreateController,
+ useListContext,
+ useRefresh,
+} from 'react-admin';
+import {
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ Grid,
+ TextField,
+ Box,
+ Button,
+ Radio,
+ RadioGroup,
+ FormControlLabel,
+ FormControl,
+ FormLabel,
+ TableRow,
+ TableCell,
+ Tooltip,
+ IconButton,
+ styled
+
+
+} from '@mui/material';
+import DialogCloseButton from "../../components/DialogCloseButton";
+import DictionarySelect from "../../components/DictionarySelect";
+import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form";
+import SaveIcon from '@mui/icons-material/Save';
+import request from '@/utils/request';
+import { Add, Edit, Delete } from '@mui/icons-material';
+import _ from 'lodash';
+import { DataGrid } from '@mui/x-data-grid';
+import StatusSelectInput from "../../components/StatusSelectInput";
+
+import { useReactToPrint } from "react-to-print";
+import jsbarcode from 'jsbarcode'
+import { el } from "date-fns/locale";
+import { padding } from "@mui/system";
+
+const PrintModal = ({ open, setOpen, rows }) => {
+ const refresh = useRefresh();
+ const translate = useTranslate();
+ const notify = useNotify();
+ const contentRef = useRef();
+ const reactToPrintFn = useReactToPrint({
+ content: () => {
+ return contentRef.current
+ },
+ documentTitle: `鐗╂枡淇℃伅`,
+ pageStyle: `
+ @page {
+
+ margin: 10mm;
+ }
+ @media print {
+ html, body {
+ width: 70mm; // A4妯悜瀹藉害
+ height: 40mm; // A4妯悜楂樺害
+ }
+ }`
+ });
+
+ const handleClose = (event, reason) => {
+ if (reason !== "backdropClick") {
+ setOpen(false);
+ }
+ };
+
+ const [value, setValue] = useState('temp1');
+
+ const handleChange = (event) => {
+ setValue(event.target.value);
+ };
+
+ const handlePrint = () => {
+ // handleClose()
+ reactToPrintFn()
+ };
+
+ return (
+ <Dialog open={open} maxWidth="sm" fullWidth>
+ <DialogCloseButton onClose={handleClose} />
+ <DialogTitle>{translate('toolbar.print')}</DialogTitle>
+ <DialogContent >
+ <FormControl >
+ <RadioGroup
+ row
+ aria-labelledby="demo-controlled-radio-buttons-group"
+ name="controlled-radio-buttons-group"
+ value={value}
+ onChange={handleChange}
+ size="small"
+ sx={{ justifyContent: 'center' }}
+ >
+ <FormControlLabel value="temp1" control={<Radio />} label="妯℃澘1" size="small" />
+ </RadioGroup>
+ </FormControl>
+
+ <Box>
+ <div style={{ textAlign: 'center', display: 'flex', justifyContent: 'center' }}>
+ <table
+ className="contain"
+ style={{
+ overflow: 'hidden',
+ fontSize: 'small',
+ tableLayout: 'fixed',
+ width: '280px',
+ borderCollapse: 'collapse', // 鍚堝苟杈规
+ border: '1px solid black' // 璁剧疆琛ㄦ牸鏁翠綋杈规
+ }}
+ >
+ <tbody>
+ <tr style={{ height: '94px' ,padding: '5px', }}>
+ <td
+ align="center"
+ className="barcode"
+ colSpan={12}
+ style={{ border: '1px solid black' }}
+ >
+ <img className="template-code" src={'/img/barcode.jpeg'} style={{ width: '90%' }} alt="Barcode" />
+ <div style={{ letterSpacing: '2px', marginTop: '1px', textAlign: 'center' }}>
+ <span>{'xxxxxx'}</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <style>{`
+ @media print {
+ .print-content {
+ display: block!important;
+ }
+ }`} </style>
+ <div ref={contentRef} className="print-content" style={{ textAlign: 'center', display: 'none' }}>
+ <PrintTemp key={'bb'} rows={rows} />
+ </div>
+ </Box>
+ </DialogContent>
+ <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+ <Box sx={{ width: '100%', display: 'flex', justifyContent: 'space-between' }}>
+ <Button onClick={handlePrint} variant="contained" startIcon={<SaveIcon />}>
+ {translate('toolbar.confirm')}
+ </Button>
+ </Box>
+ </DialogActions>
+ </Dialog >
+ );
+}
+
+export default PrintModal;
+
+const PrintTemp = ({ rows }) => {
+ const notify = useNotify();
+ const [data, setData] = useState([]);
+ const http = async () => {
+ const res = await request.post(`/basContainer/many/${rows?.join()}`);
+ if (res?.data?.code === 200) {
+ let val = res.data.data.map((el => {
+ return {
+ barcode: '/img/barcode.jpeg',
+ code: el.code,
+ name: el.name,
+ memo: el.memo
+ }
+ }))
+ setData(val)
+ setTimeout(() => {
+ val.forEach((el) => {
+ jsbarcode(`#barcode${el.code}`, el.code, { height: 30 });
+ });
+ }, 10);
+
+
+
+ } else {
+ notify(res.data.msg);
+ }
+ }
+
+ useEffect(() => {
+ if (rows?.length > 0) {
+ http();
+ }
+
+ }, [rows]);
+
+
+ return (
+ <>
+ {data.map((item, index) => (
+ <table
+ key={index}
+ className="contain"
+ style={{
+ overflow: 'hidden',
+ fontSize: 'small',
+ tableLayout: 'fixed',
+ width: '520px',
+ borderCollapse: 'collapse',
+ borderSpacing: 0,
+ margin: '0 auto',
+ marginTop: '10px',
+ }}
+ >
+ <tbody>
+ <tr style={{ height: '74px' }}>
+ <td
+ align="center"
+ className="barcode"
+ colSpan={9}
+ style={{ border: '1px solid black' }}
+ >
+ {/* <img id={"barcode" + item.code} style={{ width: '70%', verticalAlign: 'middle' }} /> */}
+ <img className="template-code" src={item.barcode} style={{ width: '90%', verticalAlign: 'middle' }} alt="Barcode" />
+ <div style={{ letterSpacing: '2px', marginTop: '1px', textAlign: 'center' }}>
+ <span>{item.code}</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ ))}
+
+ </>
+ )
+}
+
+
diff --git a/rsf-admin/src/page/container/ContainerList.jsx b/rsf-admin/src/page/container/ContainerList.jsx
index b99b12a..7ab91e7 100644
--- a/rsf-admin/src/page/container/ContainerList.jsx
+++ b/rsf-admin/src/page/container/ContainerList.jsx
@@ -31,6 +31,7 @@
ReferenceArrayInput,
AutocompleteInput,
DeleteButton,
+ Button,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
@@ -43,6 +44,7 @@
import MyField from "../components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
+import AllInclusiveIcon from '@mui/icons-material/AllInclusive';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
'& .css-1vooibu-MuiSvgIcon-root': {
@@ -122,6 +124,7 @@
sort={{ field: "create_time", order: "desc" }}
actions={(
<TopToolbar>
+ <InitButton />
<FilterButton />
<MyCreateButton onClick={() => { setCreateDialog(true) }} />
<SelectColumnsButton preferenceKey='container' />
@@ -183,4 +186,22 @@
)
}
+//鍒濆鍖栨寜閽�
+const InitButton = ({ setOpen }) => {
+ const close = () => {
+ setOpen(false)
+ }
+ return (
+ <Button
+ label="toolbar.init"
+ variant="outlined"
+ size="medium"
+ onClick={close}
+ startIcon={<AllInclusiveIcon />}
+ sx={{ margin: '3.5em' }} />
+ )
+}
+
+
+
export default ContainerList;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/BasContainerController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/BasContainerController.java
index e352697..264d337 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/BasContainerController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/BasContainerController.java
@@ -9,6 +9,7 @@
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.manager.controller.params.InitContainerParams;
import com.vincent.rsf.server.manager.entity.BasContainer;
import com.vincent.rsf.server.manager.entity.BasStation;
import com.vincent.rsf.server.manager.service.BasContainerService;
@@ -32,18 +33,18 @@
BaseParam baseParam = buildParam(map, BaseParam.class);
PageParam<BasContainer, BaseParam> pageParam = new PageParam<>(baseParam, BasContainer.class);
PageParam<BasContainer, BaseParam> page = basContainerService.page(pageParam, pageParam.buildWrapper(true));
- for (BasContainer container : page.getRecords()) {
- if (!Cools.isEmpty(container.getAreas())) {
- String content = container.getAreas().substring(1, container.getAreas().length() - 1);
- String[] parts = content.split(",");
- Long[] longArray = new Long[parts.length];
- for (int i = 0; i < parts.length; i++) {
- longArray[i] = Long.parseLong(parts[i].trim());
- }
- container.setAreaIds(longArray);
- }
-
- }
+// for (BasContainer container : page.getRecords()) {
+// if (!Cools.isEmpty(container.getAreas())) {
+// String content = container.getAreas().substring(1, container.getAreas().length() - 1);
+// String[] parts = content.split(",");
+// Long[] longArray = new Long[parts.length];
+// for (int i = 0; i < parts.length; i++) {
+// longArray[i] = Long.parseLong(parts[i].trim());
+// }
+// container.setAreaIds(longArray);
+// }
+//
+// }
return R.ok().add(page);
}
@@ -133,6 +134,22 @@
return R.ok().add(vos);
}
+
+ /**
+ * 鍒濆鍖�
+ * @return
+ */
+ @PreAuthorize("hasAuthority('manager:basContainer:list')")
+ @OperationLog("瀹瑰櫒鍒濆鍖�")
+ @PostMapping("/basContainer/init/save")
+ public R init(@RequestBody InitContainerParams params) {
+ if (Objects.isNull(params)) {
+ return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+ }
+ return basContainerService.init(params, getLoginUserId());
+ }
+
+
@PreAuthorize("hasAuthority('manager:basContainer:list')")
@PostMapping("/basContainer/export")
public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/InitContainerParams.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/InitContainerParams.java
new file mode 100644
index 0000000..6977f0b
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/InitContainerParams.java
@@ -0,0 +1,31 @@
+package com.vincent.rsf.server.manager.controller.params;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "InitContainerParams", description = "瀹瑰櫒鍒濆鍖�")
+public class InitContainerParams {
+
+ @ApiModelProperty("璧峰鏁板��")
+ private Integer startNo;
+
+ @ApiModelProperty("缁撴潫鏁板��")
+ private Integer endNo;
+
+ @ApiModelProperty("瀹瑰櫒绫诲瀷")
+ private Long containerType;
+
+ @ApiModelProperty("闀垮害")
+ private Integer length = 6;
+
+ @ApiModelProperty("鍓嶇紑")
+ private String prefix = "31";
+
+ @ApiModelProperty("鏄惁鍒濆鍖�")
+ private Boolean flagInit = false;
+
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/BasContainer.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/BasContainer.java
index 1ea353c..65ac662 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/BasContainer.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/BasContainer.java
@@ -8,6 +8,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.vincent.rsf.server.system.entity.DictData;
import com.vincent.rsf.server.system.service.DictDataService;
+import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -24,6 +25,7 @@
import java.util.Date;
@Data
+@Accessors(chain = true)
@TableName("man_bas_container")
public class BasContainer implements Serializable {
@@ -35,6 +37,10 @@
@ApiModelProperty(value= "id")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
+
+
+ @ApiModelProperty("鍞竴缂栫爜")
+ private String code;
/**
* 瀹瑰櫒绫诲瀷
@@ -58,7 +64,6 @@
* 鏄惁鍒犻櫎 1: 鏄� 0: 鍚�
*/
@ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄� 0: 鍚� ")
- @TableLogic
private Integer deleted;
/**
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/QRCodeType.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/QRCodeType.java
new file mode 100644
index 0000000..74acda5
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/QRCodeType.java
@@ -0,0 +1,20 @@
+package com.vincent.rsf.server.manager.enums;
+
+/**
+ * 瀹瑰櫒缂栫爜绫诲瀷
+ */
+public enum QRCodeType {
+
+ //瀹瑰櫒缂栫爜绫诲瀷
+ QRCODE_TYPE_QRCODE(1, "浜岀淮鐮�"),
+ QRCODE_TYPE_BARCODE(0, "鏉″瀷鐮�")
+ ;
+
+ QRCodeType(Integer val, String desc) {
+ this.val = val;
+ this.desc = desc;
+ }
+
+ public Integer val;
+ public String desc;
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/BasContainerService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/BasContainerService.java
index 37fa24b..ac55cf5 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/BasContainerService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/BasContainerService.java
@@ -1,8 +1,11 @@
package com.vincent.rsf.server.manager.service;
import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.server.manager.controller.params.InitContainerParams;
import com.vincent.rsf.server.manager.entity.BasContainer;
public interface BasContainerService extends IService<BasContainer> {
+ R init(InitContainerParams params, Long loginUserId);
}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/BasContainerServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/BasContainerServiceImpl.java
index 5f36b75..b2c69ed 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/BasContainerServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/BasContainerServiceImpl.java
@@ -1,12 +1,79 @@
package com.vincent.rsf.server.manager.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.framework.exception.CoolException;
+import com.vincent.rsf.server.manager.controller.params.InitContainerParams;
+import com.vincent.rsf.server.manager.entity.WarehouseAreas;
+import com.vincent.rsf.server.manager.enums.QRCodeType;
import com.vincent.rsf.server.manager.mapper.BasContainerMapper;
import com.vincent.rsf.server.manager.entity.BasContainer;
import com.vincent.rsf.server.manager.service.BasContainerService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.vincent.rsf.server.manager.service.WarehouseAreasService;
+import org.apache.tika.utils.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
@Service("basContainerService")
public class BasContainerServiceImpl extends ServiceImpl<BasContainerMapper, BasContainer> implements BasContainerService {
+ @Autowired
+ private WarehouseAreasService warehouseAreasService;
+
+
+ /**
+ * 瀹瑰櫒鍒濆鍖�
+ *
+ * @param params
+ * @param loginUserId
+ * @return
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public R init(InitContainerParams params, Long loginUserId) {
+ if (Objects.isNull(params.getStartNo())) {
+ throw new CoolException("瀹瑰櫒璧峰鍊间笉鑳戒负绌猴紒锛�");
+ }
+ if (Objects.isNull(params.getEndNo())) {
+ throw new CoolException("瀹瑰櫒缁撴潫鍊间笉鑳戒负绌猴紒锛�");
+ }
+
+ WarehouseAreas areas = warehouseAreasService.getOne(new LambdaQueryWrapper<WarehouseAreas>().eq(WarehouseAreas::getId, 42L));
+ if (Objects.isNull(areas)) {
+ throw new CoolException("搴撳尯涓嶅瓨鍦紝璇疯仈绯荤鐞嗗憳锛侊紒");
+ }
+
+ if (params.getFlagInit()) {
+ this.remove(new LambdaQueryWrapper<>());
+ }
+
+ List<BasContainer> containerList = new ArrayList<>();
+ for (int i = params.getStartNo(); i <= params.getEndNo() ; i++) {
+ BasContainer container = new BasContainer();
+ String code = StringUtils.leftPad(i + "", params.getLength(), "0");
+
+ container.setAreas(areas.getName())
+ .setCodeType(QRCodeType.QRCODE_TYPE_BARCODE.desc)
+ .setCode(params.getPrefix() + code)
+ .setCreateTime(new Date())
+ .setCreateBy(loginUserId)
+ .setUpdateBy(loginUserId)
+ .setUpdateTime(new Date())
+ .setContainerType(params.getContainerType());
+ containerList.add(container);
+ }
+
+ if (!this.saveBatch(containerList)) {
+ throw new CoolException("瀹瑰櫒淇濆瓨澶辫触,璇锋鏌ョ紪鐮佹槸鍚︽湁閲嶅锛侊紒");
+ }
+
+ return R.ok();
+ }
}
diff --git a/rsf-server/src/main/resources/application-dev.yml b/rsf-server/src/main/resources/application-dev.yml
index af14af6..6373fc4 100644
--- a/rsf-server/src/main/resources/application-dev.yml
+++ b/rsf-server/src/main/resources/application-dev.yml
@@ -14,10 +14,10 @@
# url: jdbc:mysql://47.76.147.249:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
# username: rsf
username: root
- url: jdbc:mysql://10.10.10.200:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
- password: xltys1995
-# url: jdbc:mysql://127.0.0.1:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
-# password: 34821015
+# url: jdbc:mysql://10.10.10.200:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
+# password: xltys1995
+ url: jdbc:mysql://127.0.0.1:3306/rsf-xiri?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
+ password: 34821015
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 5
@@ -30,7 +30,7 @@
test-on-borrow: true
test-on-return: false
remove-abandoned: true
- remove-abandoned-timeout: 1800
+ remove-abandoned-timeout: 18
#pool-prepared-statements: false
#max-pool-prepared-statement-per-connection-size: 20
filters: stat, wall
diff --git a/rsf-server/src/main/resources/application.yml b/rsf-server/src/main/resources/application.yml
index 0c99aef..b5db333 100644
--- a/rsf-server/src/main/resources/application.yml
+++ b/rsf-server/src/main/resources/application.yml
@@ -25,7 +25,7 @@
# global-config:
# field-strategy: 0
configuration:
-# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
cache-enabled: true
call-setters-on-nulls: true
--
Gitblit v1.9.1