From ee608e161f17082b9fd6e1ed236214a0ac5c2f0e Mon Sep 17 00:00:00 2001 From: skyouc <creaycat@gmail.com> Date: 星期五, 02 五月 2025 17:55:09 +0800 Subject: [PATCH] Asn订单功优化 --- rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java | 10 +++++ rsf-admin/src/page/components/ImportButton.jsx | 2 rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx | 6 ++- rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java | 58 ++++++++++++++++++++-------- rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx | 9 +++- rsf-admin/src/page/components/ImportModal.jsx | 8 +-- rsf-admin/src/i18n/core/chineseMessages.js | 2 rsf-admin/src/i18n/zh.js | 7 ++- rsf-admin/src/i18n/en.js | 5 ++ rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java | 10 ++++- 10 files changed, 83 insertions(+), 34 deletions(-) diff --git a/rsf-admin/src/i18n/core/chineseMessages.js b/rsf-admin/src/i18n/core/chineseMessages.js index d61dfd5..55cf186 100644 --- a/rsf-admin/src/i18n/core/chineseMessages.js +++ b/rsf-admin/src/i18n/core/chineseMessages.js @@ -85,7 +85,7 @@ auth_error: "An error occurred while validating the authentication token.", bulk_delete_content: - "Are you sure you want to delete this %{name}? |||| Are you sure you want to delete these %{smart_count} items?", + "纭畾瑕佸垹闄よ繖涓� %{name}? |||| 纭瑕佸垹闄よ繖浜� %{smart_count} 鏄庣粏?", bulk_delete_title: "鍒犻櫎 %{name} |||| 鍒犻櫎 %{smart_count} %{name}", bulk_update_content: "Are you sure you want to update this %{name}? |||| Are you sure you want to update these %{smart_count} items?", diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js index d569c3d..a58cbe5 100644 --- a/rsf-admin/src/i18n/en.js +++ b/rsf-admin/src/i18n/en.js @@ -576,6 +576,8 @@ poDetlCode: "poDetlCode", matnrId: "matnrId", maktx: "maktx", + spec: "Spec", + model: "Model", anfme: "anfme", stockUnit: "stockUnit", purQty: "purQty", @@ -1033,7 +1035,8 @@ }, request: { error: { - stock: "Insufficient inventory to deliver 锛侊紒" + stock: "Insufficient inventory to deliver 锛侊紒", + select_error_order: "Please Select Asn Orders", } } diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index cd137a4..6cb7348 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -565,6 +565,8 @@ poDetlCode: "PO鍗�", matnrId: "鐗╂枡鏍囪瘑", maktx: "鐗╂枡鍚嶇О", + spec: "瑙勬牸", + model: "鍨嬪彿", matnrCode: "鐗╂枡缂栫爜", anfme: "璁″垝鏀惰揣鏁�", stockUnit: "搴撳瓨鍗曚綅", @@ -611,7 +613,7 @@ poId: "PO鏍囪瘑", type: "鍗曟嵁绫诲瀷", wkType: "涓氬姟绫诲瀷", - anfme: "鏁伴噺", + anfme: "璁″垝鏁伴噺", qty: "宸插畬鎴愭暟閲�", logisNo: "鐗╂祦鍗曞彿", arrTime: "棰勮鍒拌揪鏃堕棿", @@ -1048,7 +1050,8 @@ }, request: { error: { - stock: "搴撳瓨涓嶈冻锛屾棤娉曟彁浜わ紒锛�" + stock: "搴撳瓨涓嶈冻锛屾棤娉曟彁浜わ紒锛�", + select_error_order: "璇烽�夋嫨閫氱煡鍗�", } } diff --git a/rsf-admin/src/page/components/ImportButton.jsx b/rsf-admin/src/page/components/ImportButton.jsx index 147ec9e..3b6e7a4 100644 --- a/rsf-admin/src/page/components/ImportButton.jsx +++ b/rsf-admin/src/page/components/ImportButton.jsx @@ -4,7 +4,7 @@ import ImportModal from './ImportModal'; const ImportButton = (props) => { - const [modalOpen, setModalOpen] = useState(false); + const [modalOpen, setModalOpen, refresh, notify] = useState(false); const handleOpenModal = () => { setModalOpen(true); diff --git a/rsf-admin/src/page/components/ImportModal.jsx b/rsf-admin/src/page/components/ImportModal.jsx index 703a018..71328ff 100644 --- a/rsf-admin/src/page/components/ImportModal.jsx +++ b/rsf-admin/src/page/components/ImportModal.jsx @@ -22,7 +22,7 @@ import MatnrList from '../basicInfo/matnr/MatnrList'; import request from '@/utils/request' -const ImportModal = ({ open, onClose, importTemp, useCodeImport, onceBatch = 10, value, parmas = {} }) => { +const ImportModal = ({ open, onClose, importTemp, useCodeImport, onceBatch = 10, value, parmas = {}}) => { const refresh = useRefresh(); const translate = useTranslate(); @@ -57,17 +57,15 @@ } form.append('file', file); const { data: { code, data, msg } } = await request.post(`/${value}/import`, form) - if (code === 200) { handleClose() + notify(msg); + refresh() } else { notify(msg); - } }; - - const handleClose = () => { reset(); diff --git a/rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx b/rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx index a34f785..177912b 100644 --- a/rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx +++ b/rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx @@ -115,7 +115,7 @@ marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, }} title={"menu.asnOrderItem"} - empty={<EmptyData onClick={() => { setCreateDialog(true) }} />} + empty={false} filter={{ asnId: asnId, deleted: 0 }} filters={filters} sort={{ field: "create_time", order: "desc" }} @@ -136,7 +136,7 @@ setSelect(record) setEditDialog(true) }} - omit={['id', 'createTime', 'purQty','purUnit', 'createBy', 'memo', 'poDetlId', 'matnrId', 'asnId']} + omit={['id', 'createTime', 'purQty','purUnit','poDetlCode', 'createBy', 'memo', 'packName','poDetlId', 'matnrId', 'asnId']} > <NumberField source="id" /> <NumberField source="asnId" label="table.field.asnOrderItem.asnId" /> @@ -146,6 +146,8 @@ <TextField source="matnrId" label="table.field.asnOrderItem.matnrId" /> <TextField source="matnrCode" label="table.field.asnOrderItem.matnrCode" /> <TextField source="maktx" label="table.field.asnOrderItem.maktx" /> + <TextField source="spec" label="table.field.asnOrderItem.spec" /> + <TextField source="model" label="table.field.asnOrderItem.spec" /> <NumberField source="anfme" label="table.field.asnOrderItem.anfme" /> <TextField source="stockUnit" label="table.field.asnOrderItem.stockUnit" /> <NumberField source="purQty" label="table.field.asnOrderItem.purQty" /> diff --git a/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx b/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx index 4644ed6..345c3a1 100644 --- a/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx +++ b/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx @@ -114,6 +114,8 @@ const [modalType, setmodalType] = useState(0); const [select, setSelect] = useState(0); const billReload = useRef(); + const notify = useNotify(); + const refresh = useRefresh(); const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_business_type')) || []; return ( <Box display="flex"> @@ -128,7 +130,7 @@ marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, }} title={"menu.asnOrder"} - empty={<EmptyData onClick={() => { setCreateDialog(true); setmodalType(0) }} />} + empty={false} filters={filters} filter={{deleted: 0}} sort={{ field: "create_time", order: "desc" }} @@ -137,7 +139,7 @@ <FilterButton /> <MyCreateButton onClick={() => { setCreateDialog(true); setmodalType(0) }} /> <SelectColumnsButton preferenceKey='asnOrder' /> - <ImportButton value={'asnOrderItem'} /> + <ImportButton value={'asnOrderItem'} /> <MyExportButton /> </TopToolbar> )} @@ -254,10 +256,11 @@ const { selectedIds, onUnselectItems, data } = useListContext(); const notify = useNotify(); const refresh = useRefresh(); + const translate = useTranslate(); const inspection = (btn) => { btn.stopPropagation(); if (selectedIds.length === 0) { - notify('璇烽�夋嫨閫氱煡鍗�'); + notify(translate("request.error.select_error_order")); return; } else { const rows = data.filter((item) => selectedIds.includes(item.id)) diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java index 6724931..9a2e1f0 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java @@ -31,6 +31,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -111,10 +112,19 @@ @PreAuthorize("hasAuthority('manager:asnOrder:remove')") @OperationLog("Delete ASN鍗曟嵁") @PostMapping("/asnOrder/remove/{ids}") + @Transactional(rollbackFor = Exception.class) public R remove(@PathVariable Long[] ids) { if (!asnOrderService.removeByIds(Arrays.asList(ids))) { return R.error("Delete Fail"); } + for (Long id : ids) { + List<AsnOrderItem> list = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getAsnId, id)); + if (!list.isEmpty()) { + if (!asnOrderItemService.remove(new LambdaQueryWrapper<AsnOrderItem>().in(AsnOrderItem::getAsnId, ids))) { + throw new CoolException("Details Delete Fail"); + } + } + } return R.ok("Delete Success").add(ids); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java index 4af2a41..70dfef1 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java @@ -102,6 +102,12 @@ @ApiModelProperty(value= "鐗╂枡鍚嶇О") private String maktx; + @ApiModelProperty("瑙勬牸") + private String spec; + + @ApiModelProperty("鍨嬪彿") + private String model; + /** * 閫佽揣鏁伴噺 */ @@ -183,13 +189,13 @@ private Integer ntyStatus; /** - * 鐘舵�� 1: 姝e父 0: 鍐荤粨 + * 鐘舵�� 1: 姝e父 0: 鍐荤粨 */ @ApiModelProperty(value= "鐘舵�� 1: 姝e父 0: 鍐荤粨 ") private Integer status; /** - * 鏄惁鍒犻櫎 1: 鏄� 0: 鍚� + * 鏄惁鍒犻櫎 1: 鏄� 0: 鍚� */ @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄� 0: 鍚� ") private Integer deleted; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java index 40753d9..a74e45b 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java @@ -17,6 +17,7 @@ import com.vincent.rsf.server.common.utils.ExcelUtil; import com.vincent.rsf.server.common.utils.FieldsUtils; import com.vincent.rsf.server.manager.entity.AsnOrder; +import com.vincent.rsf.server.manager.entity.Companys; import com.vincent.rsf.server.manager.entity.Matnr; import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate; import com.vincent.rsf.server.manager.mapper.AsnOrderItemMapper; @@ -24,6 +25,7 @@ import com.vincent.rsf.server.manager.service.AsnOrderItemService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vincent.rsf.server.manager.service.AsnOrderService; +import com.vincent.rsf.server.manager.service.CompanysService; import com.vincent.rsf.server.manager.service.MatnrService; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.service.FieldsItemService; @@ -54,6 +56,9 @@ @Autowired private AsnOrderItemService asnOrderItemService; + + @Autowired + private CompanysService companysService; @Override public R generateBarcode(List<Long> orders) { @@ -90,13 +95,15 @@ } List<AsnOrderTemplate> resultList = result.getList(); Map<String, List<AsnOrderTemplate>> listMap = resultList.stream().collect(Collectors.groupingBy(AsnOrderTemplate::getCode)); + StringBuffer sbFaild = new StringBuffer(); for (String key : listMap.keySet()) { AsnOrderTemplate template = listMap.get(key).stream().findFirst().get(); - AsnOrder asnOrder = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getCode, template.getCode())); - if (!Objects.isNull(asnOrder)) { + AsnOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getCode, key)); + if (!Objects.isNull(order)) { + sbFaild.append(template.getCode()).append(",宸叉坊鍔狅紒锛�"); continue; } - AsnOrder order = new AsnOrder(); + order = new AsnOrder(); order.setCode(template.getCode()) .setPoCode(template.getPoCode()) .setMemo(template.getMemo()) @@ -111,28 +118,42 @@ List<AsnOrderItem> items = new ArrayList<>(); for (AsnOrderTemplate orderTemplate : listMap.get(key)) { AsnOrderItem orderItem = new AsnOrderItem(); - Matnr matnr = null; - if (!Objects.isNull(orderTemplate.getMatnrCode()) || StringUtils.isNotBlank(orderTemplate.getMatnrCode())) { - matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>() - .eq(Matnr::getCode, orderTemplate.getMatnrCode())); + if (StringUtils.isBlank(orderTemplate.getMatnrCode())) { + continue; + } + Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>() + .eq(Matnr::getCode, orderTemplate.getMatnrCode())); + if (Objects.isNull(matnr)) { + sbFaild.append(orderTemplate.getMatnrCode()).append("鐗╂枡涓嶅瓨鍦�"); + continue; } orderItem.setAsnId(order.getId()) .setAsnCode(order.getCode()) .setSplrBatch(orderTemplate.getSplrBatch()) .setAnfme(Double.parseDouble(orderTemplate.getAnfme())) .setQty(Double.parseDouble(orderTemplate.getQty())) - .setSplrName(orderTemplate.getSplrName()) .setBarcode(orderTemplate.getBarcode()) .setTrackCode(orderTemplate.getTrackCode()) - .setSplrCode(orderTemplate.getSplrCode()) .setPoCode(orderTemplate.getPoCode()) - .setMaktx(orderTemplate.getMaktx()) - .setMatnrCode(orderTemplate.getMatnrCode()) .setPurUnit(orderTemplate.getPurUnit()) - .setPurQty(Double.parseDouble(orderTemplate.getPurQty())); - if (!Objects.isNull(matnr)) { - orderItem.setMaktx(matnr.getName()).setMatnrCode(matnr.getCode()).setMatnrId(matnr.getId()); + .setCreateBy(loginUserId) + .setUpdateBy(loginUserId) + .setSpec(matnr.getSpec()) + .setModel(matnr.getModel()) + .setPurQty(Double.parseDouble(orderTemplate.getPurQty())) + .setMaktx(matnr.getName()) + .setMatnrCode(matnr.getCode()) + .setMatnrId(matnr.getId()) + .setStockUnit(matnr.getUnit()); + if (!Objects.nonNull(orderTemplate.getSplrCode())) { + Companys companys = companysService.getOne(new LambdaQueryWrapper<Companys>().eq(Companys::getCode, orderTemplate.getSplrCode())); + if (!Objects.isNull(companys)) { + orderItem.setSplrCode(companys.getCode()).setSplrName(companys.getName()); + } else { + orderItem.setSplrCode(orderTemplate.getSplrCode()).setSplrName(companys.getName() + "(渚涘簲鍟嗕笉瀛樺湪锛侊紒)"); + } } + items.add(orderItem); if (!asnOrderItemService.saveBatch(items)) { throw new CoolException("鍗曟嵁鏄庣粏淇濆瓨澶辫触锛侊紒"); @@ -140,14 +161,17 @@ } if (!items.isEmpty()) { double qty = items.stream().mapToDouble(AsnOrderItem::getQty).sum(); - double purQty = items.stream().mapToDouble(AsnOrderItem::getPurQty).sum(); - if (!asnOrderMapper.update(new LambdaUpdateWrapper<AsnOrder>().set(AsnOrder::getQty, qty).set(AsnOrder::getAnfme, purQty).eq(AsnOrder::getId, order.getId()))) { + double anfme = items.stream().mapToDouble(AsnOrderItem::getAnfme).sum(); + if (!asnOrderMapper.update(new LambdaUpdateWrapper<AsnOrder>() + .set(AsnOrder::getQty, qty) + .set(AsnOrder::getAnfme, anfme) + .eq(AsnOrder::getId, order.getId()))) { throw new CoolException("鍗曟嵁鏁伴噺淇敼澶辫触锛侊紒"); } } } - return R.ok("鎿嶄綔鎴愬姛锛侊紒"); + return R.ok("鎿嶄綔鎴愬姛," + sbFaild.toString()); } /** -- Gitblit v1.9.1