From d2ea33b96cb1394b5546b1bfc557c1c984e4bc5b Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期二, 22 四月 2025 12:36:50 +0800
Subject: [PATCH] 出库单明细功能优化
---
rsf-admin/src/page/orders/outStock/OutOrderItemList.jsx | 10
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java | 177 +++++++++++++++++++
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java | 15 +
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java | 43 +++-
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockItemService.java | 22 ++
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java | 19 +-
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java | 1
rsf-admin/src/page/orders/outStock/OutOrderList.jsx | 55 ++++-
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockItemServiceImpl.java | 159 +++++++++++++++++
9 files changed, 456 insertions(+), 45 deletions(-)
diff --git a/rsf-admin/src/page/orders/outStock/OutOrderItemList.jsx b/rsf-admin/src/page/orders/outStock/OutOrderItemList.jsx
index 70a88a0..dea641b 100644
--- a/rsf-admin/src/page/orders/outStock/OutOrderItemList.jsx
+++ b/rsf-admin/src/page/orders/outStock/OutOrderItemList.jsx
@@ -64,11 +64,11 @@
const filters = [
<SearchInput source="condition" alwaysOn />,
<NumberInput source="asnId" label="table.field.outStockItem.asnId" />,
- <TextInput source="asnCode" label="table.field.outStockItem.asnCode" />,
+ <TextInput source="asnCode" label="table.field.outStockItem.asnCode" alwaysOn/>,
<TextInput source="poDetlId" label="table.field.outStockItem.poDetlId" />,
- <TextInput source="poDetlCode" label="table.field.outStockItem.poDetlCode" />,
<TextInput source="matnrId" label="table.field.outStockItem.matnrId" />,
- <TextInput source="maktx" label="table.field.outStockItem.maktx" />,
+ <TextInput source="maktx" label="table.field.outStockItem.maktx" alwaysOn/>,
+ <TextInput source="matnrCode" label="table.field.outStockItem.matnrCode" alwaysOn/>,
<NumberInput source="anfme" label="table.field.outStockItem.anfme" />,
<TextInput source="stockUnit" label="table.field.outStockItem.stockUnit" />,
<NumberInput source="purQty" label="table.field.outStockItem.purQty" />,
@@ -105,6 +105,7 @@
<Box display="flex">
<List
resource="outStockItem"
+ storeKey='outStockItem'
sx={{
flexGrow: 1,
transition: (theme) =>
@@ -114,7 +115,7 @@
marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
}}
title={"menu.outStockItem"}
- empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+ empty={false}
filter={{ asnId: asnId, deleted: 0 }}
filters={filters}
sort={{ field: "create_time", order: "desc" }}
@@ -141,7 +142,6 @@
<NumberField source="asnId" label="table.field.outStockItem.asnId" />
<TextField source="asnCode" label="table.field.outStockItem.asnCode" />
<TextField source="poDetlId" label="table.field.outStockItem.poDetlId" />
- <TextField source="poDetlCode" label="table.field.outStockItem.poDetlCode" />
<TextField source="matnrId" label="table.field.outStockItem.matnrId" />
<TextField source="matnrCode" label="table.field.outStockItem.matnrCode" />
<TextField source="maktx" label="table.field.outStockItem.maktx" />
diff --git a/rsf-admin/src/page/orders/outStock/OutOrderList.jsx b/rsf-admin/src/page/orders/outStock/OutOrderList.jsx
index f5b9dd5..dfff8b0 100644
--- a/rsf-admin/src/page/orders/outStock/OutOrderList.jsx
+++ b/rsf-admin/src/page/orders/outStock/OutOrderList.jsx
@@ -56,7 +56,7 @@
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';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
'& .css-1vooibu-MuiSvgIcon-root': {
height: '.9em'
@@ -79,18 +79,20 @@
const filters = [
<SearchInput source="condition" alwaysOn />,
- <TextInput source="code" label="table.field.asnOrder.code" />,
- <TextInput source="poCode" label="table.field.asnOrder.poCode" />,
- <NumberInput source="poId" label="table.field.asnOrder.poId" />,
- <TextInput source="type" label="table.field.asnOrder.type" />,
- <ReferenceInput source="wkType" reference="dictData" filter={{ dictTypeCode: 'sys_business_type' }} label="table.field.asnOrder.wkType">
- <AutocompleteInput label="table.field.asnOrder.wkType" optionValue="value" />
+ <TextInput source="code" label="table.field.outStock.code" alwaysOn />,
+ <TextInput source="poCode" label="table.field.outStock.poCode" />,
+ <NumberInput source="poId" label="table.field.outStock.poId" />,
+ <ReferenceInput source="type" reference="dictData" filter={{ dictTypeCode: 'sys_business_type' }} label="table.field.outStock.type" alwaysOn>
+ <AutocompleteInput label="table.field.outStock.type" optionValue="value" />
</ReferenceInput>,
- <NumberInput source="anfme" label="table.field.asnOrder.anfme" />,
- <NumberInput source="qty" label="table.field.asnOrder.qty" />,
- <TextInput source="logisNo" label="table.field.asnOrder.logisNo" />,
- <DateInput source="arrTime" label="table.field.asnOrder.arrTime" />,
- <SelectInput source="rleStatus" label="table.field.asnOrder.rleStatus"
+ <ReferenceInput source="wkType" reference="dictData" filter={{ dictTypeCode: 'sys_business_type' }} label="table.field.outStock.wkType" alwaysOn>
+ <AutocompleteInput label="table.field.outStock.wkType" optionValue="value" />
+ </ReferenceInput>,
+ <NumberInput source="anfme" label="table.field.outStock.anfme" />,
+ <NumberInput source="qty" label="table.field.outStock.qty" />,
+ <TextInput source="logisNo" label="table.field.outStock.logisNo" />,
+ <DateInput source="arrTime" label="table.field.outStock.arrTime" />,
+ <SelectInput source="rleStatus" label="table.field.outStock.rleStatus"
choices={[
{ id: 0, name: ' 姝e父' },
{ id: 1, name: ' 宸查噴鏀�' },
@@ -99,7 +101,7 @@
<TextInput label="common.field.memo" source="memo" />,
<DictionarySelect
- label='table.field.asnOrder.exceStatus'
+ label='table.field.outStock.exceStatus'
name="exceStatus"
dictTypeCode="sys_asn_exce_status"
alwaysOn
@@ -131,14 +133,14 @@
title={"menu.outStock"}
empty={<EmptyData onClick={() => { setCreateDialog(true); setmodalType(0) }} />}
filters={filters}
- filter={{deleted: 0, type: 'out'}}
+ filter={{ deleted: 0, type: 'out' }}
sort={{ field: "create_time", order: "desc" }}
actions={(
<TopToolbar>
<FilterButton />
<MyCreateButton onClick={() => { setCreateDialog(true); setmodalType(0) }} />
<SelectColumnsButton preferenceKey='outStock' />
- <ImportButton value={'asnOrderItem'} />
+ <ImportButton value={'asnOrderItem'} />
<MyExportButton />
</TopToolbar>
)}
@@ -177,6 +179,7 @@
<WrapperField cellClassName="opt" label="common.field.opt" >
<EditButton label="toolbar.detail" icon={(<DetailsIcon />)}></EditButton>
<MyButton setCreateDialog={setCreateDialog} setmodalType={setmodalType} />
+ <CancelButton></CancelButton>
{/* <CompleteButton /> */}
</WrapperField>
</StyledDatagrid>
@@ -242,12 +245,32 @@
)
}
+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}`);
+ if (code === 200) {
+ notify(msg);
+ refresh()
+ } else {
+ notify(msg);
+ }
+ }
+
+ 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(`/asnOrder/close/${record.id}`);
+ const { data: { code, data, msg } } = await request.post(`/outStock/close/${record.id}`);
if (code === 200) {
notify(msg);
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
index 73618e0..152d98d 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
@@ -19,6 +19,8 @@
import com.vincent.rsf.server.manager.enums.AsnExceStatus;
import com.vincent.rsf.server.manager.service.AsnOrderItemService;
import com.vincent.rsf.server.manager.service.AsnOrderService;
+import com.vincent.rsf.server.manager.service.OutStockItemService;
+import com.vincent.rsf.server.manager.service.OutStockService;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.system.controller.BaseController;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
@@ -36,35 +38,35 @@
public class OutStockController extends BaseController {
@Autowired
- private AsnOrderService asnOrderService;
+ private OutStockService outStockService;
@Autowired
- private AsnOrderItemService asnOrderItemService;
+ private OutStockItemService outStockItemService;
@PreAuthorize("hasAuthority('manager:outStock:list')")
@PostMapping("/outStock/page")
public R page(@RequestBody Map<String, Object> map) {
BaseParam baseParam = buildParam(map, BaseParam.class);
PageParam<AsnOrder, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrder.class);
- return R.ok().add(asnOrderService.page(pageParam, pageParam.buildWrapper(true)));
+ return R.ok().add(outStockService.page(pageParam, pageParam.buildWrapper(true)));
}
@PreAuthorize("hasAuthority('manager:outStock:list')")
@PostMapping("/outStock/list")
public R list(@RequestBody Map<String, Object> map) {
- return R.ok().add(asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getType, OrderType.ORDER_OUT.type)));
+ return R.ok().add(outStockService.list(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getType, OrderType.ORDER_OUT.type)));
}
@PreAuthorize("hasAuthority('manager:outStock:list')")
@PostMapping({"/outStock/many/{ids}", "/asnOrders/many/{ids}"})
public R many(@PathVariable Long[] ids) {
- return R.ok().add(asnOrderService.listByIds(Arrays.asList(ids)));
+ return R.ok().add(outStockService.listByIds(Arrays.asList(ids)));
}
- @PreAuthorize("hasAuthority('manager:asnOrder:list')")
+ @PreAuthorize("hasAuthority('manager:outStock:list')")
@OperationLog("琛ㄥ崟鏌ヨ")
@GetMapping("/outStock/{id}")
public R get(@PathVariable("id") Long id) {
- return R.ok().add(asnOrderService.getById(id));
+ return R.ok().add(outStockService.getById(id));
}
@PreAuthorize("hasAuthority('manager:outStock:save')")
@@ -78,7 +80,7 @@
String code = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_OUT_STOCK_CODE, asnOrder);
asnOrder.setCode(code);
}
- if (!asnOrderService.save(asnOrder)) {
+ if (!outStockService.save(asnOrder)) {
return R.error("Save Fail");
}
return R.ok("Save Success").add(asnOrder);
@@ -92,7 +94,7 @@
asnOrder.setType(OrderType.ORDER_OUT.type)
.setUpdateBy(getLoginUserId())
.setUpdateTime(new Date());
- if (!asnOrderService.updateById(asnOrder)) {
+ if (!outStockService.updateById(asnOrder)) {
return R.error("Update Fail");
}
return R.ok("Update Success").add(asnOrder);
@@ -102,7 +104,7 @@
@OperationLog("Delete 鍑哄簱鍗曟嵁")
@PostMapping("/outStock/remove/{ids}")
public R remove(@PathVariable Long[] ids) {
- if (!asnOrderService.removeByIds(Arrays.asList(ids))) {
+ if (!outStockService.removeByIds(Arrays.asList(ids))) {
return R.error("Delete Fail");
}
return R.ok("Delete Success").add(ids);
@@ -117,11 +119,22 @@
if (!Cools.isEmpty(condition)) {
wrapper.like(AsnOrder::getCode, condition);
}
- asnOrderService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+ outStockService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
item -> vos.add(new KeyValVo(item.getId(), item.getCode()))
);
return R.ok().add(vos);
}
+
+ @PreAuthorize("hasAuthority('manager:outStock:update')")
+ @ApiOperation("鍙栨秷鍑哄簱鍗曟嵁")
+ @GetMapping("/outStock/cancel/{id}")
+ public R cancel(@PathVariable String id) {
+ if (Objects.isNull(id)) {
+ return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+ }
+ return outStockService.cancelOutOrder(id);
+ }
+
@PreAuthorize("hasAuthority('manager:outStock:list')")
@PostMapping("/outStock/export")
@@ -131,16 +144,16 @@
if (!Objects.isNull(map.get("ids"))) {
List<Long> ids = JSONArray.parseArray(JSONObject.toJSONString(map.get("ids")), Long.class);
if (!ids.isEmpty()) {
- orders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().in(AsnOrder::getId, ids));
+ orders = outStockService.list(new LambdaQueryWrapper<AsnOrder>().in(AsnOrder::getId, ids));
} else {
- orders = asnOrderService.list(new LambdaQueryWrapper<>());
+ orders = outStockService.list(new LambdaQueryWrapper<>());
}
} else {
- orders = asnOrderService.list();
+ orders = outStockService.list();
}
List<AsnOrderTemplate> orderTemplates = new ArrayList<>();
for (AsnOrder order : orders) {
- List<AsnOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getAsnId, order.getId()));
+ List<AsnOrderItem> orderItems = outStockItemService.list(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getAsnId, order.getId()));
for (AsnOrderItem item : orderItems) {
if (Objects.isNull(item)) {
continue;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java
index 7504205..629367b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java
@@ -19,6 +19,7 @@
import com.vincent.rsf.server.manager.enums.CompanysType;
import com.vincent.rsf.server.manager.service.AsnOrderItemService;
import com.vincent.rsf.server.manager.service.CompanysService;
+import com.vincent.rsf.server.manager.service.OutStockItemService;
import com.vincent.rsf.server.system.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -36,19 +37,19 @@
public class OutStockItemController extends BaseController {
@Autowired
- private AsnOrderItemService asnOrderItemService;
+ private OutStockItemService asnOrderItemService;
@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(asnOrderItemService.listByAsnId(pageParam, pageParam.buildWrapper(true)));
+// }
@PreAuthorize("hasAuthority('manager:outStockItem:list')")
@PostMapping("/outStockItem/list")
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java
index ee9376f..2132c30 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java
@@ -24,4 +24,5 @@
R completeOrder(Long id, Long loginUserId);
R closeOrder(Long id);
+
}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockItemService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockItemService.java
new file mode 100644
index 0000000..3927235
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockItemService.java
@@ -0,0 +1,22 @@
+package com.vincent.rsf.server.manager.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.manager.entity.AsnOrderItem;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public interface OutStockItemService extends IService<AsnOrderItem> {
+
+ boolean fieldsSave(Map<String, Object> params);
+
+ R excelImport(MultipartFile file, HashMap<String, Object> hashMap, Long loginUserId) throws Exception;
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java
new file mode 100644
index 0000000..ec3e03f
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java
@@ -0,0 +1,15 @@
+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.AsnOrderAndItemsParams;
+import com.vincent.rsf.server.manager.controller.params.BatchUpdateParam;
+import com.vincent.rsf.server.manager.entity.AsnOrder;
+
+import java.util.List;
+import java.util.Map;
+
+public interface OutStockService extends IService<AsnOrder> {
+
+ R cancelOutOrder(String id);
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockItemServiceImpl.java
new file mode 100644
index 0000000..819b08a
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockItemServiceImpl.java
@@ -0,0 +1,159 @@
+package com.vincent.rsf.server.manager.service.impl;
+
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+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.update.LambdaUpdateWrapper;
+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.utils.CommonUtil;
+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.AsnOrderItem;
+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;
+import com.vincent.rsf.server.manager.service.MatnrService;
+import com.vincent.rsf.server.manager.service.OutStockItemService;
+import com.vincent.rsf.server.manager.service.OutStockService;
+import com.vincent.rsf.server.system.constant.SerialRuleCode;
+import com.vincent.rsf.server.system.utils.SerialRuleUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author Ryan
+ * @version 1.0
+ * @title OutStockItemServiceImpl
+ * @description
+ * @create 2025/4/22 11:35
+ */
+@Service("outStockItemServiceImpl")
+public class OutStockItemServiceImpl extends ServiceImpl<AsnOrderItemMapper, AsnOrderItem> implements OutStockItemService {
+
+ @Autowired
+ private OutStockService outStockService;
+ @Autowired
+ private MatnrService matnrService;
+ @Autowired
+ private OutStockItemService outStockItemService;
+
+ /**
+ * @param
+ * @return
+ * @author Ryan
+ * @description ASN鏄庣粏鍗曟嵁淇濆瓨锛屽強鎵╁睍瀛楁淇濆瓨
+ * @time 2025/4/7 09:59
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean fieldsSave(Map<String, Object> params) {
+ AsnOrderItem asnOrderItem = JSONObject.parseObject(JSONObject.toJSONString(params), AsnOrderItem.class);
+ if (StringUtils.isBlank(asnOrderItem.getTrackCode())) {
+ String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, asnOrderItem);
+ asnOrderItem.setTrackCode(ruleCode).setBarcode(ruleCode);
+ ;
+ }
+ if (Objects.isNull(asnOrderItem.getAnfme()) || Double.compare(asnOrderItem.getAnfme(), 0.0) <= 0) {
+ throw new CoolException("璁″垝鏀惰揣鏁颁笉鑳戒负绌猴紒锛�");
+ }
+ //淇濆瓨鎵╁睍瀛楁
+ try {
+ String uuid16 = CommonUtil.randomUUID16();
+ Boolean fields = FieldsUtils.saveFields(params, uuid16);
+ if (fields) {
+ asnOrderItem.setFieldsIndex(uuid16);
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ if (!this.saveOrUpdate(asnOrderItem)) {
+ throw new CoolException("鏀惰揣閫氱煡鍗曟槑缁嗕繚瀛樺け璐ワ紒锛�");
+ }
+ return true;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public R excelImport(MultipartFile file, HashMap<String, Object> hashMap, Long loginUserId) throws Exception {
+ ExcelImportResult result = ExcelImportUtil.importExcelMore(file.getInputStream(), AsnOrderTemplate.class, ExcelUtil.getDefaultImportParams());
+ if (result.getList().isEmpty()) {
+ throw new CoolException("鐗╂枡瀵煎叆澶辫触锛侊紒");
+ }
+ if (result.getList().isEmpty()) {
+ throw new CoolException("琛ㄦ牸鍐呭涓嶈兘涓虹┖锛侊紒");
+ }
+ List<AsnOrderTemplate> resultList = result.getList();
+ Map<String, List<AsnOrderTemplate>> listMap = resultList.stream().collect(Collectors.groupingBy(AsnOrderTemplate::getCode));
+ for (String key : listMap.keySet()) {
+ AsnOrderTemplate template = listMap.get(key).stream().findFirst().get();
+ AsnOrder asnOrder = outStockService.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getCode, template.getCode()));
+ if (Objects.isNull(asnOrder)) {
+ continue;
+ }
+ AsnOrder order = new AsnOrder();
+ order.setCode(template.getCode())
+ .setPoCode(template.getPoCode())
+ .setMemo(template.getMemo())
+ .setUpdateBy(loginUserId)
+ .setCreateBy(loginUserId)
+ .setPoId(Long.parseLong(template.getPoId()))
+ .setType(OrderType.getTypeVal(template.getType()))
+ .setWkType(OrderWorkType.getWorkType(template.getWkType()));
+ if (!outStockService.save(order)) {
+ throw new CoolException("鍗曟嵁淇濆瓨澶辫触锛侊紒");
+ }
+ 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()));
+ }
+ 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());
+ }
+ items.add(orderItem);
+ if (!outStockItemService.saveBatch(items)) {
+ throw new CoolException("鍗曟嵁鏄庣粏淇濆瓨澶辫触锛侊紒");
+ }
+ }
+ if (!items.isEmpty()) {
+ double qty = items.stream().mapToDouble(AsnOrderItem::getQty).sum();
+ double purQty = items.stream().mapToDouble(AsnOrderItem::getPurQty).sum();
+ if (!outStockService.update(new LambdaUpdateWrapper<AsnOrder>().set(AsnOrder::getQty, qty).set(AsnOrder::getAnfme, purQty).eq(AsnOrder::getId, order.getId()))) {
+ throw new CoolException("鍗曟嵁鏁伴噺淇敼澶辫触锛侊紒");
+ }
+ }
+ }
+
+ return R.ok("鎿嶄綔鎴愬姛锛侊紒");
+ }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
new file mode 100644
index 0000000..c9c49cd
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
@@ -0,0 +1,177 @@
+package com.vincent.rsf.server.manager.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.api.entity.dto.PoItemsDto;
+import com.vincent.rsf.server.api.service.ReceiveMsgService;
+import com.vincent.rsf.server.api.service.ReportMsgService;
+import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
+import com.vincent.rsf.server.manager.controller.params.BatchUpdateParam;
+import com.vincent.rsf.server.manager.entity.AsnOrder;
+import com.vincent.rsf.server.manager.entity.AsnOrderItem;
+import com.vincent.rsf.server.manager.entity.AsnOrderItemLog;
+import com.vincent.rsf.server.manager.entity.AsnOrderLog;
+import com.vincent.rsf.server.manager.enums.AsnExceStatus;
+import com.vincent.rsf.server.manager.mapper.AsnOrderMapper;
+import com.vincent.rsf.server.manager.mapper.PurchaseMapper;
+import com.vincent.rsf.server.manager.service.*;
+import com.vincent.rsf.server.system.constant.SerialRuleCode;
+import com.vincent.rsf.server.system.mapper.SerialRuleMapper;
+import com.vincent.rsf.server.system.utils.SerialRuleUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author Ryan
+ * @description
+ * @throws
+ * @return
+ * @time 2025/3/7 08:02
+ */
+@Service("outStockServiceImpl")
+public class OutStockServiceImpl extends ServiceImpl<AsnOrderMapper, AsnOrder> implements OutStockService {
+
+ @Autowired
+ private ReceiveMsgService receiveMsgService;
+ @Autowired
+ private ReportMsgService reportMsgService;
+ @Resource
+ private PurchaseMapper purchaseMapper;
+ @Autowired
+ private AsnOrderItemService asnOrderItemService;
+ @Autowired
+ private AsnOrderLogService asnOrderLogService;
+ @Autowired
+ private AsnOrderItemLogService asnOrderItemLogService;
+ @Resource
+ private SerialRuleMapper serialRuleMapper;
+
+ /**
+ * @author Ryan
+ * @description 鏇存柊鎴栦繚瀛樻槑缁�
+ * @param
+ * @return
+ * @time 2025/4/7 13:28
+ */
+ @Transactional(rollbackFor = Exception.class)
+ private void svaeOrUpdateOrderItem(AsnOrderAndItemsParams params, Long loginUserId) throws Exception{
+ AsnOrder orders = params.getOrders();
+
+ params.getItems().forEach(item -> {
+ item.put("asnId", orders.getId());
+ item.put("asnCode", orders.getCode());
+ item.put("poCode", orders.getPoCode());
+ item.put("createBy", loginUserId);
+ item.put("updateBy", loginUserId);
+ if (!asnOrderItemService.fieldsSave(item)) {
+ throw new CoolException("鏄庣粏淇濆瓨澶辫触锛侊紒");
+ }
+ });
+ List<AsnOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>()
+ .eq(AsnOrderItem::getAsnId, params.getOrders().getId()));
+ double sum = orderItems.stream().mapToDouble(AsnOrderItem::getAnfme).sum();
+ orders.setAnfme(sum);
+ if (!this.updateById(orders)) {
+ throw new CoolException("璁″垝鏀惰揣鏁伴噺淇敼澶辫触锛侊紒");
+ }
+ }
+
+
+ /**
+ * @author Ryan
+ * @description 鍒犻櫎鍘熶富鍗曞強鏄庣粏锛屽姞鍏ュ巻鍙叉。
+ * @param
+ * @return
+ * @time 2025/3/19 19:53
+ */
+ @Transactional(rollbackFor = Exception.class)
+ private void operateOrderLogs(AsnOrder asrder) throws Exception{
+ if (Objects.isNull(asrder) || Objects.isNull(asrder.getId())) {
+ throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+ }
+ asrder.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_TASK_CLOSE.val);
+
+ if (!this.updateById(asrder)) {
+ throw new CoolException("鍗曟嵁鍏抽棴澶辫触锛侊紒");
+ }
+ List<AsnOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getAsnId, asrder.getId()));
+ if (orderItems.isEmpty()) {
+ throw new CoolException("鏀惰揣鏄庣粏涓虹┖锛侊紒");
+ }
+// if (Objects.isNull(asrder.getAnfme()) || asrder.getAnfme().compareTo(0.00) == 0) {
+// throw new CoolException("鏀惰揣鏁伴噺涓嶈兘涓洪浂锛侊紒");
+// }
+ AsnOrder order = this.getById(asrder.getId());
+ AsnOrderLog orderLog = new AsnOrderLog();
+ order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val);
+ BeanUtils.copyProperties(order, orderLog);
+ orderLog.setId(null);
+ orderLog.setAsnId(order.getId());
+
+ if (!this.saveOrUpdate(order)) {
+ throw new CoolException("鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+ }
+ orderLog.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_TASK_CLOSE.val);
+ if (!asnOrderLogService.save(orderLog)) {
+ throw new CoolException("涓诲崟鍘嗗彶妗f坊鍔犲け璐ワ紒锛�");
+ }
+ List<AsnOrderItemLog> logs = new ArrayList<>();
+ List<AsnOrderItem> items = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getAsnId, order.getId()));
+ items.forEach(item -> {
+ AsnOrderItemLog itemLog = new AsnOrderItemLog();
+ BeanUtils.copyProperties(item, itemLog);
+ itemLog.setAsnItemId(itemLog.getId())
+ .setLogId(orderLog.getId())
+ .setAsnId(item.getAsnId());
+ logs.add(itemLog);
+ });
+
+ if (!asnOrderItemLogService.saveBatch(logs)) {
+ throw new CoolException("閫氱煡鍗曟槑缁嗗巻鍙叉。淇濆瓨澶辫触锛侊紒");
+ }
+ if (!asnOrderItemService.remove(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getAsnId, order.getId()))) {
+ throw new CoolException("鍘熷崟鎹槑缁嗗垹闄ゅけ璐ワ紒锛�");
+ }
+ if (!this.removeById(asrder.getId())) {
+ throw new CoolException("鍘熷崟鎹垹闄ゅけ璐ワ紒锛�");
+ }
+ }
+
+ /**
+ * @author Ryan
+ * @description 鍙栨秷鍑哄簱鍗曟嵁
+ * @param
+ * @return
+ * @time 2025/4/22 10:40
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public R cancelOutOrder(String id) {
+ if (Cools.isEmpty(id)) {
+ throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+ }
+ AsnOrder order = this.getById(id);
+ if (Objects.isNull(order)) {
+ throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�");
+ }
+ if (!order.getExceStatus().equals(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val)) {
+ throw new CoolException("褰撳墠鍗曟嵁鐘舵�佷负:" + AsnExceStatus.getExceStatus(order.getExceStatus()) + "锛� 涓嶅彲鎵ц鍙栨秷鎿嶄綔锛侊紒");
+ }
+ order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_TASK_CANCEL.val).setStatus(0);
+
+ if (!this.saveOrUpdate(order)) {
+ throw new CoolException("鍗曟嵁鍙栨秷澶辫触锛侊紒");
+ }
+ return R.ok("鎿嶄綔鎴愬姛");
+ }
+}
--
Gitblit v1.9.1