diff --git a/ant-design-vue-jeecg/src/api/api.js b/ant-design-vue-jeecg/src/api/api.js index d38eb66..cec1eab 100644 --- a/ant-design-vue-jeecg/src/api/api.js +++ b/ant-design-vue-jeecg/src/api/api.js @@ -260,6 +260,8 @@ export const callShipmentBox = (params) => postAction('/shipment/shipmentHeader/ export const listReceiveByReceiveId = (params) => postAction('/receipt/receiveHeader/listReceiveByReceiveId', params); //收货 export const receive = (params) => postAction('/receipt/receiveHeader/receive', params); +//越库 +export const crossDocking = (params) => postAction('/receipt/receiptHeader/crossDocking?id=' + params, params); // 中转HTTP请求 export const transitRESTful = { get: (url, parameter) => getAction(getTransitURL(url), parameter), diff --git a/ant-design-vue-jeecg/src/views/system/receipt/ReceiptHeaderList.vue b/ant-design-vue-jeecg/src/views/system/receipt/ReceiptHeaderList.vue index 065876b..2afa07a 100644 --- a/ant-design-vue-jeecg/src/views/system/receipt/ReceiptHeaderList.vue +++ b/ant-design-vue-jeecg/src/views/system/receipt/ReceiptHeaderList.vue @@ -178,6 +178,11 @@ <span slot="action" slot-scope="text, record"> <a-popconfirm v-has="'receiptHeader:back'" v-if="record.lastStatus == 800" title="确定回传吗?" @confirm="() => hanleBack(record)"> <a><a-button type="default">回传</a-button></a> + <a-divider type="vertical"/> + </a-popconfirm> + <a-popconfirm v-has="'receiptHeader:crossDocking'" v-if="record.lastStatus == 0" title="确定越库吗?" @confirm="() => hanleCross(record)"> + <a><a-button type="primary">越库</a-button></a> + <a-divider type="vertical"/> </a-popconfirm> <a v-if="(record.lastStatus < 800 && record.firstStatus >= 15 && record.firstStatus != '20') || (flowOff == '0' && record.lastStatus < 800) " @click="receive(record)" v-has="'receiptHeader:receive'"> <a-button type="primary">组盘</a-button> @@ -230,7 +235,7 @@ import {initDictOptions, filterMultiDictText} from '@/components/dict/JDictSelec import '@/assets/less/TableExpand.less' import {getCompanyList} from '@/api/api' import {getReceiptTypeList} from '@/api/api' -import {getSupplierList, backErpReceipt,createReceiptAuditFlow,getDocumentAduitFlow} from '@/api/api' +import {getSupplierList, backErpReceipt,createReceiptAuditFlow,getDocumentAduitFlow, crossDocking} from '@/api/api' import ReceiptModal from "./modules/ReceiptModal"; import { notification } from 'ant-design-vue'; import FlowProcess from "../flow/FlowProcess"; @@ -537,6 +542,16 @@ export default { this.searchQuery(); }); }, + hanleCross(record) { + crossDocking(record.id).then((res) => { + if (res.success) { + this.$message.success(res.message); + } else { + this.$message.warning(res.message); + } + this.searchQuery(); + }); + }, loadFrom() { getCompanyList().then((res) => { if (res.success) { diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java index 54a8a6f..1429c51 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java @@ -403,4 +403,13 @@ public class ReceiptHeaderController extends JeecgController<ReceiptHeader, IRec } return result; } + + @AutoLog(value = "越库") + @ApiOperation(value = "越库", notes = "越库") + @PostMapping("/crossDocking") + @ResponseBody + @ApiLogger(apiName = "越库", from = "WMS") + public Result<?> crossDocking(@RequestParam(name = "id", required = true) String id, HttpServletRequest req) { + return receiptHeaderService.crossDocking(id); + } } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/IReceiptHeaderService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/IReceiptHeaderService.java index 116807a..584db7e 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/IReceiptHeaderService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/IReceiptHeaderService.java @@ -41,4 +41,5 @@ public interface IReceiptHeaderService extends IService<ReceiptHeader> { String createReceiptCode(String receiptType); + Result crossDocking(String id); } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java index 567ab3e..9c4f32d 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java @@ -3,6 +3,7 @@ package org.jeecg.modules.wms.receipt.receiptHeader.service.impl; import java.io.Serializable; import java.math.BigDecimal; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; @@ -15,6 +16,8 @@ import org.jeecg.modules.wms.audit.service.IAuditService; import org.jeecg.modules.wms.config.receiptType.entity.ReceiptType; import org.jeecg.modules.wms.config.receiptType.service.IReceiptTypeService; import org.jeecg.modules.wms.flow.service.IFlowDetailService; +import org.jeecg.modules.wms.inventory.inventoryTransaction.entity.InventoryTransaction; +import org.jeecg.modules.wms.inventory.inventoryTransaction.service.IInventoryTransactionService; import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail; import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptHeader; import org.jeecg.modules.wms.receipt.receiptHeader.mapper.ReceiptDetailMapper; @@ -29,6 +32,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -60,6 +64,8 @@ public class ReceiptHeaderServiceImpl extends ServiceImpl<ReceiptHeaderMapper, R private IFlowDetailService iFlowDetailService; @Resource private IAuditService iAuditService; + @Resource + private IInventoryTransactionService inventoryTransactionService; /** * @param id 入库单主表id @@ -148,6 +154,72 @@ public class ReceiptHeaderServiceImpl extends ServiceImpl<ReceiptHeaderMapper, R return code; } + @Override + @Transactional(rollbackFor = Exception.class) + public Result crossDocking(String id) { + ReceiptHeader receiptHeader = receiptHeaderService.getById(id); + if (receiptHeader == null) { + return Result.error("越库失败,没有找到入库单头" + id); + } + List<ReceiptDetail> receiptDetailList = receiptDetailService.selectByMainId(id); + if (CollectionUtils.isEmpty(receiptDetailList)) { + return Result.error("越库失败,没有找到入库详情" + id); + } + List<InventoryTransaction> inventoryTransactionList = new ArrayList<>(); + for (ReceiptDetail receiptDetail : receiptDetailList) { + BigDecimal qty = receiptDetail.getQty(); + receiptDetail.setTaskQty(qty); + receiptDetail.setReceiptQty(qty); + receiptDetail.setStatus(QuantityConstant.RECEIPT_HEADER_COMPLETED); + InventoryTransaction inventoryTransaction = new InventoryTransaction(); + inventoryTransaction.setType(QuantityConstant.INVENTORY_TRANSACTION_RECEIPT); + inventoryTransaction.setWarehouseCode(receiptDetail.getWarehouseCode()); + inventoryTransaction.setCompanyCode(receiptDetail.getCompanyCode()); + inventoryTransaction.setMaterialCode(receiptDetail.getMaterialCode()); + inventoryTransaction.setMaterialName(receiptDetail.getMaterialName()); + inventoryTransaction.setMaterialSpec(receiptDetail.getMaterialSpec()); + inventoryTransaction.setMaterialUnit(receiptDetail.getMaterialUnit()); + inventoryTransaction.setReceiptId(receiptDetail.getReceiptId()); + inventoryTransaction.setReceiptCode(receiptHeader.getCode()); + inventoryTransaction.setReceiptType(receiptHeader.getType()); + inventoryTransaction.setReceiptDetailId(receiptDetail.getId()); + inventoryTransaction.setBatch(receiptDetail.getBatch()); + inventoryTransaction.setLot(receiptDetail.getLot()); + inventoryTransaction.setProject(receiptDetail.getProject()); + inventoryTransaction.setInventoryStatus(receiptDetail.getInventoryStatus()); + inventoryTransaction.setQty(qty); + inventoryTransaction.setReceiptQty(qty); + inventoryTransactionList.add(inventoryTransaction); + + inventoryTransaction = new InventoryTransaction(); + inventoryTransaction.setType(QuantityConstant.INVENTORY_TRANSACTION_SHIPMENT); + inventoryTransaction.setWarehouseCode(receiptDetail.getWarehouseCode()); + inventoryTransaction.setCompanyCode(receiptDetail.getCompanyCode()); + inventoryTransaction.setMaterialCode(receiptDetail.getMaterialCode()); + inventoryTransaction.setMaterialName(receiptDetail.getMaterialName()); + inventoryTransaction.setMaterialSpec(receiptDetail.getMaterialSpec()); + inventoryTransaction.setMaterialUnit(receiptDetail.getMaterialUnit()); + inventoryTransaction.setInventoryStatus(receiptDetail.getInventoryStatus()); + inventoryTransaction.setBatch(receiptDetail.getBatch()); + inventoryTransaction.setLot(receiptDetail.getLot()); + inventoryTransaction.setProject(receiptDetail.getProject()); + inventoryTransaction.setQty(receiptDetail.getQty()); + inventoryTransaction.setShipmentQty(receiptDetail.getQty()); + inventoryTransactionList.add(inventoryTransaction); + } + + if (!receiptDetailService.updateBatchById(receiptDetailList)) { + throw new JeecgBootException("越库失败,批量更新入库单详情失败"); + } + if (!inventoryTransactionService.saveBatch(inventoryTransactionList)) { + throw new JeecgBootException("越库失败,批量保存库存交易记录失败"); + } + if (!receiptHeaderService.updateReceiptHeaderStatus(Integer.parseInt(id))) { + throw new JeecgBootException("越库失败,批更新入库单失败"); + } + return Result.ok("越库成功"); + } + /** * 更新入库单 头状态和尾状态 * 头状态是单据详情中最大的状态