From 392d87eca7b990bad5e2db95da8b5c322357874b Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期六, 22 三月 2025 14:43:43 +0800 Subject: [PATCH] Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop --- rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocAreaMatRela.java | 221 +++++++++++++++++ rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx | 6 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocAreaMatRelaServiceImpl.java | 110 ++++++++ rsf-admin/package.json | 1 rsf-server/src/main/resources/mapper/manager/LocAreaMatRelaMapper.xml | 5 rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java | 4 rsf-admin/src/page/basicInfo/loc/LocList.jsx | 19 rsf-admin/src/page/basicInfo/matnr/PrintModal.jsx | 130 ++++++++- rsf-admin/src/page/basicInfo/loc/InitModal.jsx | 6 rsf-admin/src/page/basicInfo/loc/LocCreate.jsx | 2 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocAreaMatRelaController.java | 135 ++++++++++ rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocAreaMatRelaMapper.java | 12 rsf-admin/src/i18n/zh.js | 12 rsf-admin/src/page/basicInfo/loc/LocEdit.jsx | 2 rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx | 3 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocTypeController.java | 2 rsf-server/src/main/java/locAreaMatRela.sql | 27 ++ rsf-admin/pnpm-lock.yaml | 3 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocAreaMatsParam.java | 35 ++ rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocAreaMatRelaService.java | 11 20 files changed, 708 insertions(+), 38 deletions(-) diff --git a/rsf-admin/package.json b/rsf-admin/package.json index 3bf09ac..fb022cd 100644 --- a/rsf-admin/package.json +++ b/rsf-admin/package.json @@ -21,6 +21,7 @@ "axios": "^1.7.4", "date-fns": "^3.6.0", "framer-motion": "^12.4.10", + "jsbarcode": "^3.11.6", "lodash": "^4.17.21", "motion": "^12.4.1", "papaparse": "^5.4.1", diff --git a/rsf-admin/pnpm-lock.yaml b/rsf-admin/pnpm-lock.yaml index f66ce5c..1e1c44c 100644 --- a/rsf-admin/pnpm-lock.yaml +++ b/rsf-admin/pnpm-lock.yaml @@ -41,6 +41,9 @@ framer-motion: specifier: ^12.4.10 version: 12.4.10(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + jsbarcode: + specifier: ^3.11.6 + version: 3.11.6 lodash: specifier: ^4.17.21 version: 4.17.21 diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index f94b280..2f2f96b 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -13,8 +13,8 @@ id: 'ID', uuid: '缂栧彿', name: '鍚嶇О', - createTime: '娣诲姞鏃堕棿', - createBy: '娣诲姞浜哄憳', + createTime: '鍒涘缓鏃堕棿', + createBy: '鍒涘缓浜哄憳', updateTime: '淇敼鏃堕棿', updateBy: '淇敼浜哄憳', status: '鐘舵��', @@ -122,11 +122,11 @@ userLogin: '鐧诲綍鏃ュ織', customer: '瀹㈡埛琛�', shipper: '璐т富淇℃伅', - matnr: '鐗╂枡鏁版嵁', + matnr: '鐗╂枡', matnrGroup: '鐗╂枡鍒嗙粍', - warehouse: '浠撳簱淇℃伅', - warehouseAreas: '浠撳簱搴撳尯', - loc: '鍩虹搴撲綅', + warehouse: '浠撳簱', + warehouseAreas: '搴撳尯', + loc: '搴撲綅', locType: '搴撲綅绫诲瀷', locArea: '閫昏緫鍒嗗尯', container: '瀹瑰櫒绠$悊', diff --git a/rsf-admin/src/page/basicInfo/loc/InitModal.jsx b/rsf-admin/src/page/basicInfo/loc/InitModal.jsx index a02d8b9..16a287a 100644 --- a/rsf-admin/src/page/basicInfo/loc/InitModal.jsx +++ b/rsf-admin/src/page/basicInfo/loc/InitModal.jsx @@ -61,6 +61,7 @@ const notify = useNotify(); + const [disabled, setDisabled] = useState(false) const [formData, setFormData] = useState({ "warehouseId": null, @@ -94,6 +95,7 @@ }; const handleSubmit = async () => { + setDisabled(true) const res = await request.post(`/loc/init`, formData); if (res?.data?.code === 200) { setOpen(false); @@ -101,6 +103,7 @@ } else { notify(res.data.msg); } + setDisabled(false) } @@ -232,10 +235,11 @@ </DialogContent> <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}> <Box sx={{ width: '100%', display: 'flex', justifyContent: 'space-between' }}> - <Button type="submit" variant="contained" startIcon={<SaveIcon />}> + <Button disabled={disabled} type="submit" variant="contained" startIcon={<SaveIcon />} > {translate('toolbar.confirm')} </Button> </Box> + </DialogActions> </Form> </Dialog> diff --git a/rsf-admin/src/page/basicInfo/loc/LocCreate.jsx b/rsf-admin/src/page/basicInfo/loc/LocCreate.jsx index 3f63d03..e5eb67a 100644 --- a/rsf-admin/src/page/basicInfo/loc/LocCreate.jsx +++ b/rsf-admin/src/page/basicInfo/loc/LocCreate.jsx @@ -154,7 +154,7 @@ validate={[required()]} /> */} <ReferenceArrayInput source="typeIds" reference="locType" > - <SelectArrayInput label="table.field.loc.type" /> + <SelectArrayInput label="table.field.loc.type" validate={[required()]} /> </ReferenceArrayInput> </Grid> {/* <Grid item xs={6} display="flex" gap={1}> diff --git a/rsf-admin/src/page/basicInfo/loc/LocEdit.jsx b/rsf-admin/src/page/basicInfo/loc/LocEdit.jsx index b1b1ed5..5c640c5 100644 --- a/rsf-admin/src/page/basicInfo/loc/LocEdit.jsx +++ b/rsf-admin/src/page/basicInfo/loc/LocEdit.jsx @@ -121,7 +121,7 @@ validate={[required()]} /> */} <ReferenceArrayInput source="typeIds" reference="locType" > - <SelectArrayInput label="table.field.loc.type" /> + <SelectArrayInput label="table.field.loc.type" validate={[required()]} /> </ReferenceArrayInput> </Grid> <Grid item xs={6} display="flex" gap={1}> diff --git a/rsf-admin/src/page/basicInfo/loc/LocList.jsx b/rsf-admin/src/page/basicInfo/loc/LocList.jsx index dda2264..d07243d 100644 --- a/rsf-admin/src/page/basicInfo/loc/LocList.jsx +++ b/rsf-admin/src/page/basicInfo/loc/LocList.jsx @@ -54,6 +54,7 @@ import EditIcon from '@mui/icons-material/Edit'; import request from '@/utils/request'; import DiscountIcon from '@mui/icons-material/Discount'; +import { textAlign } from "@mui/system"; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { @@ -67,6 +68,9 @@ '& .opt': { width: 200 }, + '& .RaDatagrid-headerCell': { + textAlign: 'left' + } })); const filters = [ @@ -140,6 +144,7 @@ > <StyledDatagrid preferenceKey='loc' + align="left" bulkActionButtons={ <> <BatchButton /> @@ -152,9 +157,9 @@ > <NumberField source="id" /> <NumberField source="warehouseId$" label="table.field.loc.warehouseId" /> - <NumberField source="areaId$" label="table.field.loc.areaId" /> - <TextField source="code" label="table.field.loc.code" /> - <TextField source="typeIds$" label="table.field.loc.type" /> + <NumberField source="areaId$" label="table.field.loc.areaId" align="left" /> + <TextField source="code" label="table.field.loc.code" align="left" /> + <TextField source="typeIds$" label="table.field.loc.type" align="left" /> {/* <TextField source="name" label="table.field.loc.name" /> */} {/* <NumberField source="flagLogic" label="table.field.loc.flagLogic" /> <TextField source="fucAtrrs" label="table.field.loc.fucAtrrs" /> @@ -175,12 +180,12 @@ <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}> + <DateField source="updateTime" label="common.field.updateTime" showTime align="left" /> + <ReferenceField source="createBy" label="common.field.createBy" align="left" 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} /> + <DateField source="createTime" label="common.field.createTime" showTime align="left" /> + <BooleanField source="statusBool" label="common.field.status" sortable={false} align="left" /> <TextField source="memo" label="common.field.memo" sortable={false} /> <WrapperField cellClassName="opt" label="common.field.opt"> diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx index 3140810..e27b5e6 100644 --- a/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx +++ b/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx @@ -156,7 +156,6 @@ const [columns, setColumns] = useState([]); const refresh = useRefresh(); - const { refetch } = useListContext(); useEffect(() => { getDynamicFields(); @@ -360,6 +359,7 @@ const PrintButton = () => { const record = useRecordContext(); + const { resource, selectedIds } = useListContext(); const notify = useNotify(); const refresh = useRefresh(); @@ -374,6 +374,7 @@ <PrintModal open={createDialog} setOpen={setCreateDialog} + rows={selectedIds} /> </> diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx index 9f4d75c..dd93b57 100644 --- a/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx +++ b/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx @@ -19,7 +19,7 @@ const { setFilters } = useListContext(); // 鑾峰彇鍒楄〃涓婁笅鏂� const [selectedOption, setSelectedOption] = useState(null); const [treeData, setTreeData] = useState([]); - const [defaultIds, setDefaultIds] = useState(['29']); + const [defaultIds, setDefaultIds] = useState(['65']); const [condition, setCondition] = useState(''); const haveChildren = (item) => { @@ -96,12 +96,12 @@ border: theme.palette.mode === 'light' && '1px solid #e0e0e3', width: 250, minWidth: 150, - height: `calc(100% - 120px)`, + height: `100%`, }} > <CardContent> <Input - placeholder="鎼滅储鐗╂枡鍒嗗尯" + placeholder="鎼滅储鐗╂枡鍒嗙粍" sx={{ '--Input-focused': 1, marginBottom: '10px' }} onChange={handleSearch} /> diff --git a/rsf-admin/src/page/basicInfo/matnr/PrintModal.jsx b/rsf-admin/src/page/basicInfo/matnr/PrintModal.jsx index 83df0e0..7513fbe 100644 --- a/rsf-admin/src/page/basicInfo/matnr/PrintModal.jsx +++ b/rsf-admin/src/page/basicInfo/matnr/PrintModal.jsx @@ -53,8 +53,10 @@ import StatusSelectInput from "../../components/StatusSelectInput"; import { useReactToPrint } from "react-to-print"; +import jsbarcode from 'jsbarcode' +import { el } from "date-fns/locale"; -const PrintModal = ({ open, setOpen }) => { +const PrintModal = ({ open, setOpen, rows }) => { const refresh = useRefresh(); const translate = useTranslate(); const notify = useNotify(); @@ -98,8 +100,76 @@ </FormControl> <Box> - <div style={{ textAlign: 'center' }}> - <PrintTemp /> + <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: '74px' }}> + <td + align="center" + colSpan={3} + style={{ border: '1px solid black' }} // 璁剧疆鍗曞厓鏍艰竟妗� + > + 鍟嗗搧缂栫爜 + </td> + <td + align="center" + className="barcode" + colSpan={9} + 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> + <tr style={{ height: '74px' }}> + <td + align="center" + colSpan={3} + style={{ border: '1px solid black' }} + > + 鍟嗗搧 + </td> + <td + align="center" + colSpan={5} + style={{ + overflow: 'hidden', + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + border: '1px solid black' + }} + > + {'xxxxxxxx'} + </td> + <td + align="center" + colSpan={2} + style={{ border: '1px solid black' }} + > + 澶囨敞 + </td> + <td + align="center" + colSpan={2} + style={{ border: '1px solid black' }} + > + {'xx'} + </td> + </tr> + </tbody> + </table> </div> <style>{` @media print { @@ -108,7 +178,7 @@ } }`} </style> <div ref={contentRef} className="print-content" style={{ textAlign: 'center', display: 'none' }}> - <PrintTemp /> + <PrintTemp key={'bb'} rows={rows} /> </div> </Box> </DialogContent> @@ -125,12 +195,39 @@ export default PrintModal; -const PrintTemp = (props) => { - const [data, setData] = useState([{ - barcode: '/img/barcode.jpeg', - product: 'xxxxxx-xx/xx', - remark: 'xx' - }]); +const PrintTemp = ({ rows }) => { + const notify = useNotify(); + const [data, setData] = useState([]); + const http = async () => { + const res = await request.post(`/matnrs/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) + val.forEach((el) => { + jsbarcode(`#barcode${el.code}`, el.code, { height: 30 }); + }); + + + } else { + notify(res.data.msg); + } + } + + useEffect(() => { + if (rows?.length > 0) { + http(); + } + + }, [rows]); + + return ( <> {data.map((item, index) => ( @@ -159,10 +256,11 @@ colSpan={9} style={{ border: '1px solid black' }} > - <img className="template-code" src={item.barcode} style={{ width: '90%', verticalAlign: 'middle' }} alt="Barcode" /> - <div style={{ letterSpacing: '2px', marginTop: '1px', textAlign: 'center' }}> - <span>{'xxxxxx'}</span> - </div> + <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> <tr style={{ height: '74px' }}> @@ -183,7 +281,7 @@ border: '1px solid black' }} > - {item.product} + {item.name} </td> <td align="center" @@ -197,7 +295,7 @@ colSpan={2} style={{ border: '1px solid black' }} > - {item.remark} + {item.memo} </td> </tr> </tbody> diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java index ee4f1a5..25a2013 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java @@ -22,8 +22,8 @@ // generator.username="sa"; // generator.password="Zoneyung@zy56$"; - generator.table="man_loc_area_rela"; - generator.tableDesc="loc areas rela"; + generator.table="man_loc_area_mat_rela"; + generator.tableDesc="loc areas mats rela"; generator.packagePath="com.vincent.rsf.server.manager"; generator.build(); diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocAreaMatRelaController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocAreaMatRelaController.java new file mode 100644 index 0000000..be23646 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocAreaMatRelaController.java @@ -0,0 +1,135 @@ +package com.vincent.rsf.server.manager.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +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.common.utils.ExcelUtil; +import com.vincent.rsf.server.common.annotation.OperationLog; +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.LocAreaMatsParam; +import com.vincent.rsf.server.manager.entity.LocAreaMatRela; +import com.vincent.rsf.server.manager.service.LocAreaMatRelaService; +import com.vincent.rsf.server.system.controller.BaseController; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +@Api(tags = "搴撳尯鐗╂枡鍏崇郴缁戝畾") +@RestController +public class LocAreaMatRelaController extends BaseController { + + @Autowired + private LocAreaMatRelaService locAreaMatRelaService; + + @PreAuthorize("hasAuthority('manager:locAreaMatRela:list')") + @PostMapping("/locAreaMatRela/page") + public R page(@RequestBody Map<String, Object> map) { + BaseParam baseParam = buildParam(map, BaseParam.class); + PageParam<LocAreaMatRela, BaseParam> pageParam = new PageParam<>(baseParam, LocAreaMatRela.class); + return R.ok().add(locAreaMatRelaService.page(pageParam, pageParam.buildWrapper(true))); + } + + @PreAuthorize("hasAuthority('manager:locAreaMatRela:list')") + @PostMapping("/locAreaMatRela/list") + public R list(@RequestBody Map<String, Object> map) { + return R.ok().add(locAreaMatRelaService.list()); + } + + @PreAuthorize("hasAuthority('manager:locAreaMatRela:list')") + @PostMapping({"/locAreaMatRela/many/{ids}", "/locAreaMatRelas/many/{ids}"}) + public R many(@PathVariable Long[] ids) { + return R.ok().add(locAreaMatRelaService.listByIds(Arrays.asList(ids))); + } + + @PreAuthorize("hasAuthority('manager:locAreaMatRela:list')") + @GetMapping("/locAreaMatRela/{id}") + public R get(@PathVariable("id") Long id) { + return R.ok().add(locAreaMatRelaService.getById(id)); + } + + @PreAuthorize("hasAuthority('manager:locAreaMatRela:save')") + @OperationLog("Create loc areas mats rela") + @PostMapping("/locAreaMatRela/save") + public R save(@RequestBody LocAreaMatRela locAreaMatRela) { + locAreaMatRela.setCreateBy(getLoginUserId()); + locAreaMatRela.setCreateTime(new Date()); + locAreaMatRela.setUpdateBy(getLoginUserId()); + locAreaMatRela.setUpdateTime(new Date()); + if (!locAreaMatRelaService.save(locAreaMatRela)) { + return R.error("Save Fail"); + } + return R.ok("Save Success").add(locAreaMatRela); + } + + @PreAuthorize("hasAuthority('manager:locAreaMatRela:update')") + @OperationLog("Update loc areas mats rela") + @PostMapping("/locAreaMatRela/update") + public R update(@RequestBody LocAreaMatRela locAreaMatRela) { + locAreaMatRela.setUpdateBy(getLoginUserId()); + locAreaMatRela.setUpdateTime(new Date()); + if (!locAreaMatRelaService.updateById(locAreaMatRela)) { + return R.error("Update Fail"); + } + return R.ok("Update Success").add(locAreaMatRela); + } + + @PreAuthorize("hasAuthority('manager:locAreaMatRela:remove')") + @OperationLog("Delete loc areas mats rela") + @PostMapping("/locAreaMatRela/remove/{ids}") + public R remove(@PathVariable Long[] ids) { + if (!locAreaMatRelaService.removeByIds(Arrays.asList(ids))) { + return R.error("Delete Fail"); + } + return R.ok("Delete Success").add(ids); + } + + @PreAuthorize("hasAuthority('manager:locAreaMatRela:list')") + @PostMapping("/locAreaMatRela/query") + public R query(@RequestParam(required = false) String condition) { + List<KeyValVo> vos = new ArrayList<>(); + LambdaQueryWrapper<LocAreaMatRela> wrapper = new LambdaQueryWrapper<>(); + if (!Cools.isEmpty(condition)) { + wrapper.like(LocAreaMatRela::getAreaId, condition); + } + locAreaMatRelaService.page(new Page<>(1, 30), wrapper).getRecords().forEach( + item -> vos.add(new KeyValVo(item.getId(), item.getAreaId())) + ); + return R.ok().add(vos); + } + + @PreAuthorize("hasAuthority('manager:locAreaMatRela:list')") + @PostMapping("/locAreaMatRela/export") + public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { + ExcelUtil.build(ExcelUtil.create(locAreaMatRelaService.list(), LocAreaMatRela.class), response); + } + + @PreAuthorize("hasAuthority('manager:locAreaMatRela:update')") + @PostMapping("/locAreaMatRela/matnr/bind") + @ApiOperation("鐗╂枡缁戝畾搴撳尯") + public R matnrBindArea(@RequestBody LocAreaMatsParam param) { + if (Objects.isNull(param)) { + throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒"); + } + if (Objects.isNull(param.getAreaId())) { + throw new CoolException("搴撳尯涓嶈兘涓虹┖锛侊紒"); + } + if (param.getLocId().isEmpty() || param.getTypeId().isEmpty()) { + throw new CoolException("搴撲綅绫诲瀷鎴栧簱浣嶄笉鑳戒负绌猴紒锛�"); + } + if (Objects.isNull(param.getGroupId()) || param.getMatnrId().isEmpty()) { + throw new CoolException("鐗╂枡鎴栫墿鏂欏垎绫讳笉鑳戒负绌猴紒锛�"); + } + return locAreaMatRelaService.binMatnrs(param); + } + + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocTypeController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocTypeController.java index 49f2ff4..b273c77 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocTypeController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocTypeController.java @@ -14,6 +14,7 @@ import com.vincent.rsf.server.manager.entity.MatnrGroup; import com.vincent.rsf.server.manager.service.LocTypeService; import com.vincent.rsf.server.system.controller.BaseController; +import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; @@ -22,6 +23,7 @@ import javax.servlet.http.HttpServletResponse; import java.util.*; +@Api(tags = "搴撲綅绫诲瀷") @RestController public class LocTypeController extends BaseController { diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocAreaMatsParam.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocAreaMatsParam.java new file mode 100644 index 0000000..514452a --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocAreaMatsParam.java @@ -0,0 +1,35 @@ +package com.vincent.rsf.server.manager.controller.params; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author Ryan + * @version 1.0 + * @title LocAreaMatsParam + * @description + * @create 2025/3/22 10:58 + */ +@Data +@ApiModel(value = "LocAreaMatsParam", description = "搴撳尯鐗╂枡鍏崇郴缁戝畾") +public class LocAreaMatsParam { + + @ApiModelProperty("鐗╂枡ID") + private List<Long> matnrId; + + @ApiModelProperty("鐗╂枡鍒嗙粍ID") + private Long groupId; + + @ApiModelProperty("搴撳尯ID") + private Long areaId; + + @ApiModelProperty("搴撲綅绫诲瀷") + private List<Long> typeId; + + @ApiModelProperty("搴撲綅ID") + private List<Long> locId; + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocAreaMatRela.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocAreaMatRela.java new file mode 100644 index 0000000..5007896 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocAreaMatRela.java @@ -0,0 +1,221 @@ +package com.vincent.rsf.server.manager.entity; + +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.text.SimpleDateFormat; +import java.util.Date; + +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import com.vincent.rsf.framework.common.Cools; +import com.vincent.rsf.framework.common.SpringUtils; +import com.vincent.rsf.server.system.service.UserService; +import com.vincent.rsf.server.system.entity.User; +import java.io.Serializable; +import java.util.Date; + +@Data +@Accessors(chain = true) +@TableName("man_loc_area_mat_rela") +public class LocAreaMatRela implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ApiModelProperty(value= "ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 鐗╂枡ID + */ + @ApiModelProperty(value= "鐗╂枡ID") + private Long areaId; + + /** + * 缂栧彿 + */ + @ApiModelProperty(value= "缂栧彿") + private String code; + + /** + * 鐗╂枡ID + */ + @ApiModelProperty(value= "鐗╂枡ID") + private Long matnrId; + + /** + * 鐗╂枡鍒嗙粍ID + */ + @ApiModelProperty(value= "鐗╂枡鍒嗙粍ID") + private Long groupId; + + /** + * 搴撲綅绫诲瀷ID + */ + @ApiModelProperty(value= "搴撲綅绫诲瀷ID") + private Long locTypeId; + + /** + * 搴撲綅ID + */ + @ApiModelProperty(value= "搴撲綅ID") + private Long locId; + + /** + * 鐘舵�� 1: 姝e父 0: 鍐荤粨 + */ + @ApiModelProperty(value= "鐘舵�� 1: 姝e父 0: 鍐荤粨 ") + private Integer status; + + /** + * 鏄惁鍒犻櫎 1: 鏄� 0: 鍚� + */ + @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄� 0: 鍚� ") + @TableLogic + private Integer deleted; + + /** + * 绉熸埛 + */ + @ApiModelProperty(value= "绉熸埛") + private Integer tenantId; + + /** + * 娣诲姞浜哄憳 + */ + @ApiModelProperty(value= "娣诲姞浜哄憳") + private Long createBy; + + /** + * 娣诲姞鏃堕棿 + */ + @ApiModelProperty(value= "娣诲姞鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 淇敼浜哄憳 + */ + @ApiModelProperty(value= "淇敼浜哄憳") + private Long updateBy; + + /** + * 淇敼鏃堕棿 + */ + @ApiModelProperty(value= "淇敼鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 澶囨敞 + */ + @ApiModelProperty(value= "澶囨敞") + private String memo; + + public LocAreaMatRela() {} + + public LocAreaMatRela(Long areaId,String code,Long matnrId,Long groupId,Long locTypeId,Long locId,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { + this.areaId = areaId; + this.code = code; + this.matnrId = matnrId; + this.groupId = groupId; + this.locTypeId = locTypeId; + this.locId = locId; + this.status = status; + this.deleted = deleted; + this.tenantId = tenantId; + this.createBy = createBy; + this.createTime = createTime; + this.updateBy = updateBy; + this.updateTime = updateTime; + this.memo = memo; + } + +// LocAreaMatRela locAreaMatRela = new LocAreaMatRela( +// null, // 鐗╂枡ID +// null, // 缂栧彿 +// null, // 鐗╂枡ID +// null, // 鐗╂枡鍒嗙粍ID +// null, // 搴撲綅绫诲瀷ID +// null, // 搴撲綅ID +// null, // 鐘舵�乕闈炵┖] +// null, // 鏄惁鍒犻櫎[闈炵┖] +// null, // 绉熸埛 +// null, // 娣诲姞浜哄憳 +// null, // 娣诲姞鏃堕棿[闈炵┖] +// null, // 淇敼浜哄憳 +// null, // 淇敼鏃堕棿[闈炵┖] +// null // 澶囨敞 +// ); + + public String getStatus$(){ + if (null == this.status){ return null; } + switch (this.status){ + case 1: + return "姝e父"; + case 0: + return "鍐荤粨"; + default: + return String.valueOf(this.status); + } + } + + public String getCreateBy$(){ + UserService service = SpringUtils.getBean(UserService.class); + User user = service.getById(this.createBy); + if (!Cools.isEmpty(user)){ + return String.valueOf(user.getNickname()); + } + return null; + } + + public String getCreateTime$(){ + if (Cools.isEmpty(this.createTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime); + } + + public String getUpdateBy$(){ + UserService service = SpringUtils.getBean(UserService.class); + User user = service.getById(this.updateBy); + if (!Cools.isEmpty(user)){ + return String.valueOf(user.getNickname()); + } + return null; + } + + public String getUpdateTime$(){ + if (Cools.isEmpty(this.updateTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); + } + + + + public Boolean getStatusBool(){ + if (null == this.status){ return null; } + switch (this.status){ + case 1: + return true; + case 0: + return false; + default: + return null; + } + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocAreaMatRelaMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocAreaMatRelaMapper.java new file mode 100644 index 0000000..793f1fc --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocAreaMatRelaMapper.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.mapper; + +import com.vincent.rsf.server.manager.entity.LocAreaMatRela; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Mapper +@Repository +public interface LocAreaMatRelaMapper extends BaseMapper<LocAreaMatRela> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocAreaMatRelaService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocAreaMatRelaService.java new file mode 100644 index 0000000..a8d0b3c --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocAreaMatRelaService.java @@ -0,0 +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.LocAreaMatsParam; +import com.vincent.rsf.server.manager.entity.LocAreaMatRela; + +public interface LocAreaMatRelaService extends IService<LocAreaMatRela> { + + R binMatnrs(LocAreaMatsParam param); +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocAreaMatRelaServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocAreaMatRelaServiceImpl.java new file mode 100644 index 0000000..f4d140a --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocAreaMatRelaServiceImpl.java @@ -0,0 +1,110 @@ +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.LocAreaMatsParam; +import com.vincent.rsf.server.manager.entity.LocTypeRela; +import com.vincent.rsf.server.manager.entity.Matnr; +import com.vincent.rsf.server.manager.mapper.LocAreaMatRelaMapper; +import com.vincent.rsf.server.manager.entity.LocAreaMatRela; +import com.vincent.rsf.server.manager.service.LocAreaMatRelaService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.vincent.rsf.server.manager.service.LocService; +import com.vincent.rsf.server.manager.service.LocTypeRelaService; +import com.vincent.rsf.server.manager.service.MatnrService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +@Service("locAreaMatRelaService") +public class LocAreaMatRelaServiceImpl extends ServiceImpl<LocAreaMatRelaMapper, LocAreaMatRela> implements LocAreaMatRelaService { + + @Autowired + private MatnrService matnrService; + + @Autowired + private LocService locService; + + @Autowired + private LocTypeRelaService locTypeRelaService; + + + /** + * @author Ryan + * @description 搴撳尯缁戝畾鐗╂枡 + * @param + * @return + * @time 2025/3/22 11:32 + */ + @Override + public R binMatnrs(LocAreaMatsParam param) { + List<Matnr> matnrIds = new ArrayList<>(); + if (!Objects.isNull(param.getGroupId())) { + List<Matnr> list = matnrService.list(new LambdaQueryWrapper<Matnr>().eq(Matnr::getGroupId, param.getGroupId()).select(Matnr::getId, Matnr::getGroupId)); + if (list.isEmpty()) { + throw new CoolException("鐗╂枡鍒嗙粍娌℃湁鐗╂枡"); + } + matnrIds.addAll(list); + } + if (!param.getMatnrId().isEmpty()) { + List<Matnr> matnrs = matnrService.list(new LambdaQueryWrapper<Matnr>() + .select(Matnr::getId, Matnr::getGroupId) + .in(Matnr::getId, param.getMatnrId())); + if (matnrs.isEmpty()) { + throw new CoolException("鐗╂枡涓嶅瓨鍦紒锛�"); + } + matnrIds.addAll(matnrs); + } + List<LocAreaMatRela> locAreaMatRelas = new ArrayList<>(); + if (!param.getTypeId().isEmpty()) { + for (Long typeId : param.getTypeId()) { + List<LocTypeRela> list = locTypeRelaService.list(new LambdaQueryWrapper<LocTypeRela>() + .select(LocTypeRela::getLocId).eq(LocTypeRela::getTypeId, typeId)); + if (list.isEmpty()) { + continue; + } + List<Long> longs = list.stream().map(LocTypeRela::getLocId).collect(Collectors.toList()); + for (Long locId : longs) { + for (Matnr matnrId : matnrIds) { + LocAreaMatRela locAreaMatRela = new LocAreaMatRela(); + locAreaMatRela + .setAreaId(param.getAreaId()) + .setLocId(locId) + .setLocTypeId(typeId) + .setMatnrId(matnrId.getId()) + .setGroupId(matnrId.getGroupId()); + locAreaMatRelas.add(locAreaMatRela); + } + } + } + } + + if (!param.getLocId().isEmpty()) { + List<LocTypeRela> list = locTypeRelaService.list(new LambdaQueryWrapper<LocTypeRela>().in(LocTypeRela::getLocId, param.getTypeId()).select(LocTypeRela::getTypeId, LocTypeRela::getLocId)); + if (list.isEmpty()) { + throw new CoolException("鏁版嵁閿欒锛氬簱浣嶆湭缁戝畾搴撲綅绫诲瀷锛侊紒"); + } + for (LocTypeRela locTypeRela : list) { + for (Matnr matnr : matnrIds) { + LocAreaMatRela locAreaMatRela = new LocAreaMatRela(); + locAreaMatRela + .setAreaId(param.getAreaId()) + .setLocId(locTypeRela.getLocId()) + .setLocTypeId(locTypeRela.getTypeId()) + .setMatnrId(matnr.getId()) + .setGroupId(matnr.getGroupId()); + locAreaMatRelas.add(locAreaMatRela); + } + } + } + if (!this.saveBatch(locAreaMatRelas)) { + throw new CoolException("鐗╂枡搴撲綅绫诲瀷缁戝畾澶辫触锛侊紒"); + } + return R.ok("缁戝畾鎴愬姛锛侊紒"); + } +} diff --git a/rsf-server/src/main/java/locAreaMatRela.sql b/rsf-server/src/main/java/locAreaMatRela.sql new file mode 100644 index 0000000..5c5e032 --- /dev/null +++ b/rsf-server/src/main/java/locAreaMatRela.sql @@ -0,0 +1,27 @@ +-- save locAreaMatRela record +-- mysql +insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.locAreaMatRela', '0', '/manager/locAreaMatRela', 'locAreaMatRela', '0' , '0', '1' , '1'); + +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query loc areas mats rela', '', '1', 'manager:locAreaMatRela:list', '0', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create loc areas mats rela', '', '1', 'manager:locAreaMatRela:save', '1', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update loc areas mats rela', '', '1', 'manager:locAreaMatRela:update', '2', '1', '1'); +insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete loc areas mats rela', '', '1', 'manager:locAreaMatRela:remove', '3', '1', '1'); + +-- locale menu name +locAreaMatRela: 'LocAreaMatRela', + +-- locale field +locAreaMatRela: { + areaId: "areaId", + code: "code", + matnrId: "matnrId", + groupId: "groupId", + locTypeId: "locTypeId", + locId: "locId", +}, + +-- ResourceContent +import locAreaMatRela from './locAreaMatRela'; + +case 'locAreaMatRela': + return locAreaMatRela; diff --git a/rsf-server/src/main/resources/mapper/manager/LocAreaMatRelaMapper.xml b/rsf-server/src/main/resources/mapper/manager/LocAreaMatRelaMapper.xml new file mode 100644 index 0000000..7d22dd0 --- /dev/null +++ b/rsf-server/src/main/resources/mapper/manager/LocAreaMatRelaMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.vincent.rsf.server.manager.mapper.LocAreaMatRelaMapper"> + +</mapper> -- Gitblit v1.9.1