diff --git a/ant-design-vue-jeecg/src/api/api.js b/ant-design-vue-jeecg/src/api/api.js index be32270..c980b75 100644 --- a/ant-design-vue-jeecg/src/api/api.js +++ b/ant-design-vue-jeecg/src/api/api.js @@ -283,6 +283,8 @@ export const cantaleverReceipt = (params) => postAction('/task/taskHeader/cantal export const receiptStageingReceipt = (params) => postAction('/task/taskHeader/receiptStageingReceipt', params) //快速入库 export const stageingReceipt = (params) => postAction('/task/taskHeader/stageingReceipt', params) +//铁芯库入库 +export const ironCoreReceipt = (params) => postAction('/task/taskHeader/ironCoreReceipt', params) //快速出库,批量快速出整托 export const shipmentInventoryHeader = (params) => postAction('/inventory/inventoryHeader/shipmentInventoryHeader', params) //快速出库,批量快速出库存详情 diff --git a/ant-design-vue-jeecg/src/views/system/task/AllTaskHeaderList.vue b/ant-design-vue-jeecg/src/views/system/task/AllTaskHeaderList.vue index 5ea9936..6b0e8ce 100644 --- a/ant-design-vue-jeecg/src/views/system/task/AllTaskHeaderList.vue +++ b/ant-design-vue-jeecg/src/views/system/task/AllTaskHeaderList.vue @@ -94,6 +94,7 @@ <a-button v-has="'taskHeader:quickReceipt'" @click="stageingReceipt()" type="primary">货架暂存区入库</a-button> <a-button v-has="'taskHeader:quickReceipt'" @click="cantaleverReceipt()" type="primary">悬臂库入库</a-button> <a-button v-has="'taskHeader:quickReceipt'" @click="cantaleverStageingReceipt()" type="primary">悬臂库暂存区入库</a-button> + <a-button v-has="'taskHeader:quickReceipt'" @click="ironCoreReceipt()" type="primary">铁芯库入库</a-button> <a-button v-has="'taskHeader:callReceiptBox'" @click="callReceiptBox()" type="primary" >呼叫入库有货托盘</a-button> <a-button v-has="'taskHeader:callReceiptBox'" @click="callReceiptEmptyBox()" type="primary" >呼叫入库空托盘</a-button> <a-button v-has="'taskHeader:emptyOut'" @click="createEmptyOut()" type="primary">空托出库</a-button> @@ -214,6 +215,7 @@ <shipment-material-modal ref="shipmentMaterialModal" @ok="modalFormOk"></shipment-material-modal> <CantaleverShipmentModal ref="cantaleverShipmentModal" @ok="modalFormOk"></CantaleverShipmentModal> <CantaleverStageingReceiptModal ref="cantaleverStageingReceiptModal" @ok="modalFormOk"></CantaleverStageingReceiptModal> + <IronCoreReceiptModal ref="ironCoreReceiptModal" @ok="modalFormOk"></IronCoreReceiptModal> </a-card> </template> @@ -226,7 +228,7 @@ import {getAction} from '@/api/manage' import TaskDetailList from './TaskDetailList' import {initDictOptions, filterMultiDictText} from '@/components/dict/JDictSelectUtil' import '@/assets/less/TableExpand.less' -import {completeTaskByWMS, cancelTask, switchTask} from '@/api/api' +import {completeTaskByWMS, cancelTask, switchTask, ironCoreReceipt} from '@/api/api' import {execute} from '@/api/api' import {getZoneList, handleEmptyOut, handlePickupError, handleDoubleIn} from '@/api/api' import EmptyInTaskModal from './modules/EmptyInTaskModal' @@ -247,11 +249,13 @@ import ShipmentMaterialModal from "@views/system/task/modules/ShipmentMaterialMo import CantaleverTaskModal from "@views/system/task/modules/CantaleverTaskModal.vue"; import CantaleverShipmentModal from "@views/system/task/modules/CantaleverShipmentModal.vue"; import CantaleverStageingReceiptModal from "@views/system/task/modules/CantaleverStageingReceiptModal.vue"; +import IronCoreReceiptModal from "@views/system/task/modules/IronCoreReceiptModal.vue"; export default { name: "AllTaskHeaderList", mixins: [JeecgListMixin], components: { + IronCoreReceiptModal, CantaleverStageingReceiptModal, CantaleverShipmentModal, CantaleverTaskModal, @@ -604,6 +608,10 @@ export default { this.$refs.cantaleverStageingReceiptModal.edit(); this.$refs.cantaleverStageingReceiptModal.title = "悬臂暂存区入库"; }, + ironCoreReceipt(){ + this.$refs.ironCoreReceiptModal.edit(); + this.$refs.ironCoreReceiptModal.title = "铁芯库入库"; + }, callReceiptBox() { this.$refs.modalForm5.edit(); this.$refs.modalForm5.title = "呼叫入库有货托盘"; diff --git a/ant-design-vue-jeecg/src/views/system/task/modules/IronCoreReceiptModal.vue b/ant-design-vue-jeecg/src/views/system/task/modules/IronCoreReceiptModal.vue new file mode 100644 index 0000000..e6ff8aa --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/task/modules/IronCoreReceiptModal.vue @@ -0,0 +1,179 @@ +<template> + <a-modal + :title="title" + :width="800" + :visible="visible" + :maskClosable="false" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel"> + + <a-spin :spinning="confirmLoading"> + <a-form-model ref="form" :label-col="labelCol" :wrapper-col="wrapperCol" :model="model"> + <!-- 主表单区域 --> + <a-row class="form-row" :gutter="24"> + <a-col :lg="8"> + <a-form-model-item label="托盘号" :rules="[{ required: true, message: '请输入托盘号!' }]"> + <a-input placeholder="请输入托盘号" v-model="quickMainModel.containerCode"/> + </a-form-model-item> + </a-col> + <a-col :lg="10"> + <a-form-model-item label="入库口"> +<!-- <a-input placeholder="请输入入库口" v-model="quickMainModel.toPort"/>--> + <j-search-select-tag + placeholder="请选择入库口" + v-model="quickMainModel.toPort" + dict="port,name,code,type='3'" + :pageSize="5" + :async="true"> + </j-search-select-tag> + </a-form-model-item> + </a-col> + </a-row> + <!-- 子表单区域 --> + <a-tabs defaultActiveKey="1"> + <a-tab-pane tab="物料信息" key="1"> + <div> + <a-row type="flex" style="margin-bottom:10px" :gutter="24"> + <a-col :span="12">物料编码</a-col> + <a-col :span="8">数量</a-col> + <a-col :span="4">操作</a-col> + </a-row> + <a-row type="flex" style="margin-bottom:-20px" :gutter="24" v-for="(item, index) in quickMainModel.receiptEntityList" :key="index"> + <a-col style="display: none"> + <a-form-model-item> + <a-input placeholder="id" v-model="item.id"/> + </a-form-model-item> + </a-col> + <a-col :span="12"> + <a-form-model-item> + <j-search-select-tag + placeholder="请选择" + v-model="item.materialCode" + :dict="'material,name,code'" + :pageSize="8" + :async="true"> + </j-search-select-tag> + </a-form-model-item> + </a-col> + <a-col :span="8"> + <a-form-model-item> + <a-input placeholder="数量" v-model="item.qty"/> + </a-form-model-item> + </a-col> + <a-col :span="4"> + <a-form-model-item> + <a-icon type="minus-circle" @click="delRowCustom(index)" style="fontSize :20px"/> + </a-form-model-item> + </a-col> + </a-row> + <a-button type="dashed" style="width: 100%;margin-top: 10px" @click="addRowCustom"><a-icon type="plus"/>添加物料信息</a-button> + </div> + </a-tab-pane> + </a-tabs> + </a-form-model> + </a-spin> + </a-modal> +</template> + +<script> + +import JEditableTable from '@/components/jeecg/JEditableTable' +import {execute, ironCoreReceipt, quickReceipt} from '@/api/api' +import JDate from '@/components/jeecg/JDate' +import JSelectMultiCanUseContainer from "../../../../components/jeecgbiz/JSelectMultiCanUseContainer"; + +export default { + name: 'IronCoreReceiptModal', + components: { + JDate, JEditableTable,JSelectMultiCanUseContainer + }, + data() { + return { + title: '铁芯库入库', + visible: false, + confirmLoading: false, + model: {}, + labelCol: { + xs: {span: 24}, + sm: {span: 4} + }, + wrapperCol: { + xs: {span: 24}, + sm: {span: 24} + }, + activeKey: '1', + quickMainModel: { + receiptEntityList: [{}], + }, + // 客户信息 + url: { + add: '/test/jeecgOrderMain/add', + edit: '/test/jeecgOrderMain/edit', + } + } + }, + created() { + }, + methods: { + handleOk() { + this.validateFields() + }, + handleCancel() { + this.visible = false + }, + + addRowCustom() { + this.quickMainModel.receiptEntityList.push({}); + this.$forceUpdate(); + }, + delRowCustom(index) { + console.log(index) + this.quickMainModel.receiptEntityList.splice(index, 1); + this.$forceUpdate(); + }, + addRowTicket() { + this.quickMainModel.jeecgOrderTicketList.push({}); + console.log(this.quickMainModel.jeecgOrderTicketList) + this.$forceUpdate(); + }, + delRowTicket(index) { + console.log(index) + this.quickMainModel.jeecgOrderTicketList.splice(index, 1); + this.$forceUpdate(); + }, + + edit(record) { + this.visible = true + this.activeKey = '1' + this.quickMainModel = Object.assign({ + receiptEntityList: [{}] + }, record); + }, + /** 触发表单验证 */ + validateFields() { + // 触发表单验证 + this.$refs.form.validate(valid => { + //alert(JSON.stringify(this.quickMainModel)); + this.receipt(this.quickMainModel); + }) + }, + + receipt(record) { + this.confirmLoading = true + this.model = Object.assign({}, record); + ironCoreReceipt(this.model).then((res) => { + this.loading = false; + if (res.success) { + this.$message.success(res.message); + this.$emit('ok'); + this.visible = false + } else { + this.$message.error(res.message); + } + this.confirmLoading = false + }); + }, + } +} +</script> \ No newline at end of file diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/entity/WcsTask.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/entity/WcsTask.java index a6ac212..e59c797 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/entity/WcsTask.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/entity/WcsTask.java @@ -122,4 +122,13 @@ public class WcsTask { @ApiModelProperty(value = "顺序数量") private int sequenceNumber; + /** + * 位置 + */ + private int position; + + /** + * 长度 + */ + private int length; } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerDetail.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerDetail.java index 0d754b0..d273aa8 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerDetail.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerDetail.java @@ -128,6 +128,10 @@ public class ReceiptContainerDetail implements Serializable { @ApiModelProperty(value = "更新日期") private Date updateTime; + /** 位置 */ + @ApiModelProperty(value = "位置") + private Integer position; + public void setQty(BigDecimal qty) { if (qty.compareTo(BigDecimal.ZERO) <= 0) { throw new JeecgBootException("入库组盘数量必须大于0"); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java index 3729c4d..8bfb22a 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java @@ -240,6 +240,7 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai taskDetail.setLot(receiptContainerDetail.getLot()); taskDetail.setProject(receiptContainerDetail.getProject()); taskDetail.setSn(receiptContainerDetail.getSn()); + taskDetail.setPosition(receiptContainerDetail.getPosition()); taskDetail.setReceiveTime(receiptContainerDetail.getReceiveTime()); taskDetailList.add(taskDetail); ReceiptDetail receiptDetail = receiptDetailService.getById(receiptContainerDetail.getReceiptDetailId()); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/IReceiveService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/IReceiveService.java index 7043373..b00a4b6 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/IReceiveService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/IReceiveService.java @@ -25,6 +25,11 @@ public interface IReceiveService extends IService<Receive> { Result<ReceiptContainerHeader> receivingB(List<Receive> receiveList, String warehouseCode); /** + * 铁芯堆垛组盘 + */ + Result<ReceiptContainerHeader> receivingIronCore(List<Receive> receiveList, String warehouseCode); + + /** * 立库组盘和生成任务 */ Result<TaskHeader> receivingAndCreateTask(List<Receive> receiveList, String warehouseCode); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java index a6d8324..001f984 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java @@ -369,6 +369,217 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> impl @Override @Transactional(rollbackFor = Exception.class) + public Result<ReceiptContainerHeader> receivingIronCore(List<Receive> receiveList, String warehouseCode) { + log.info("开始入库组盘"); + boolean success = false; + if (receiveList == null || receiveList.size() == 0) { + return Result.error("入库组盘,收货信息为空"); + } + if (StringUtils.isEmpty(warehouseCode)) { + return Result.error("入库组盘,仓库编码为空"); + } + String containerCode = receiveList.get(0).getContainerCode(); + if (StringUtils.isEmpty(containerCode)) { + return Result.error("入库组盘,容器编码为空"); + } + Container container = containerService.getContainerByCode(containerCode, warehouseCode); + if (container == null) { + return Result.error("入库组盘,根据容器编码 " + containerCode + ", 没有找到容器"); + } + String fromLocationCode = container.getLocationCode(); + if (StringUtils.isNotEmpty(fromLocationCode)) { + Location location = locationService.getLocationByCode(fromLocationCode, warehouseCode); + if (location == null) { + return Result.error("入库组盘,根据库位编码 " + fromLocationCode + ", 没有找到库位"); + } + String value = parameterConfigurationService.getValueByZoneCode(QuantityConstant.RULE_RECEIPT_TASK, container.getZoneCode()); + if (StringUtils.isNotEmpty(value)) { + int shipmentTaskRule = Integer.parseInt(value); + if (shipmentTaskRule == QuantityConstant.RULE_TASK_WHOLE) { + return Result.error("入库组盘," + containerCode + "不允许有补充入库"); + } + } + } + int callBox = QuantityConstant.NOT_CALL_BOX; + TaskHeader callBoxTask = taskHeaderService.getUnCompleteTaskByContainerCode(containerCode, warehouseCode); + if (callBoxTask != null) { + callBox = callBoxTask.getCallBox(); + } + // 如果不是呼叫料盒,那么要判断容器状态 + if (callBox == QuantityConstant.NOT_CALL_BOX) { + String containerStatus = container.getStatus(); + if (containerStatus.equals(QuantityConstant.STATUS_CONTAINER_LOCK)) { + return Result.error("入库组盘,容器被锁定不能用于收货" + containerCode); + } + String containerFillStatus = container.getFillStatus(); + if (!StringUtils.isEmpty(containerFillStatus) && containerFillStatus.equals(QuantityConstant.STATUS_CONTAINER_FILL_FULL)) { + return Result.error("入库组盘,容器已经是满盘不能用于收货" + containerCode); + } + } + String containerTypeCode = container.getContainerTypeCode(); + if (StringUtils.isEmpty(containerTypeCode)) { + return Result.error("入库组盘,容器类型编码为空" + containerCode); + } + ContainerType containerType = containerTypeService.getContainerTypeByCode(containerTypeCode, warehouseCode); + if (containerType == null) { + return Result.error("入库组盘,容器类型为空" + containerCode); + } + ShipmentContainerHeader shipmentContainerHeader = shipmentContainerHeaderService.getUnCompleteShipmentContainerByCode(containerCode, warehouseCode); + if (shipmentContainerHeader != null) { + return Result.error("入库组盘,容器" + containerCode + "不能有出库配盘"); + } + int taskType = QuantityConstant.TASK_TYPE_WHOLERECEIPT; + if (StringUtils.isNotEmpty(fromLocationCode)) { + taskType = QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT; + throw new JeecgBootException("铁芯库组盘,不能做补充入库"); + } + ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderService.getUnCompleteReceiptContainerByCode(containerCode, warehouseCode); + if (receiptContainerHeader != null) { + if (receiptContainerHeader.getStatus() >= QuantityConstant.RECEIPT_CONTAINER_TASK) { + throw new JeecgBootException("入库组盘,容器已经生成任务,不能放物料了!"); + } + } else { + receiptContainerHeader = new ReceiptContainerHeader(); + receiptContainerHeader.setWarehouseCode(warehouseCode); + receiptContainerHeader.setContainerCode(containerCode); + receiptContainerHeader.setContainerTypeCode(containerTypeCode); + receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_BUILD); + receiptContainerHeader.setTaskType(taskType); + receiptContainerHeader.setFromLocationCode(fromLocationCode); + if (taskType == QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT) { + String value = parameterConfigurationService.getValueByZoneCode(QuantityConstant.RULE_TASK_LOCATION, container.getZoneCode()); + int taskLocationRule = Integer.parseInt(value); + if (taskLocationRule == QuantityConstant.RULE_TASK_SET_LOCATION) { + receiptContainerHeader.setToLocationCode(fromLocationCode); + } + } + success = receiptContainerHeaderService.save(receiptContainerHeader); + if (!success) { + throw new JeecgBootException("入库组盘,保存入库组盘头失败"); + } + } + List<ReceiptDetail> receiptDetailList = new ArrayList<>(); + List<ReceiptContainerDetail> receiptContainerDetailList = new ArrayList<>(); + int position = 0; + for (Receive receive : receiveList) { + position++; + ReceiptDetail receiptDetail = receiptDetailService.getById(receive.getId()); + if (receiptDetail == null) { + throw new JeecgBootException("入库组盘,没有找到入库单详情ID:" + receive.getId()); + } + // 可收数量 + BigDecimal qty = receiptDetail.getQty().subtract(receiptDetail.getTaskQty()); + // 收货数量 + BigDecimal taskQty = receive.getTaskQty(); + if (qty == null || taskQty == null) { + throw new JeecgBootException("入库组盘,物料编码:" + receive.getMaterialCode() + " 收货数量或可收数量为空"); + } + if (taskQty.compareTo(BigDecimal.ZERO) < 0) { + throw new JeecgBootException("入库组盘,物料编码:" + receive.getMaterialCode() + " 收货数量不能小于0,收货数量:" + taskQty + "可收数量:" + qty); + } + if (taskQty.compareTo(qty) > 0) { + throw new JeecgBootException("入库组盘,物料编码:" + receive.getMaterialCode() + " 收货数量不能大于可收数量,收货数量:" + taskQty + "可收数量:" + qty); + } + // 入库单明细为0 跳过组盘 + if (taskQty.compareTo(BigDecimal.ZERO) <= 0) { + continue; + } + ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId()); + if (receiptHeader == null) { + throw new JeecgBootException("入库组盘,没有找到入库单ID:" + receiptDetail.getReceiptId()); + } + if (!receiptHeader.getWarehouseCode().equals(warehouseCode)) { + throw new JeecgBootException("入库组盘,入库单操作仓库错误,请选择 " + receiptHeader.getWarehouseCode() + " 操作"); + } + String materialCode = receiptDetail.getMaterialCode(); + if (StringUtils.isEmpty(materialCode)) { + throw new JeecgBootException("入库组盘,物料编码为空"); + } + Material material = materialService.getMaterialByCode(materialCode); + if (material == null) { + throw new JeecgBootException("入库组盘," + materialCode + "物料不存在"); + } + BigDecimal receiptQty = receiptDetail.getQty(); + BigDecimal receiptTaskQty = receiptDetail.getTaskQty(); + receiptTaskQty = receiptTaskQty.add(taskQty); + if (receiptTaskQty.compareTo(receiptQty) > 0) { + throw new JeecgBootException("入库组盘,收货数量不能大于单据数量"); + } + + receiptDetail.setTaskQty(receiptTaskQty); + ReceiptDetail receiptDetail1 = new ReceiptDetail(); + receiptDetail1.setReceiptId(receiptDetail.getReceiptId()); + receiptDetail1.setId(receiptDetail.getId()); + receiptDetail1.setTaskQty(receiptTaskQty); + receiptDetail1.setStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING); + if (receiptTaskQty.equals(receiptQty)) { + receiptDetail1.setStatus(QuantityConstant.RECEIPT_HEADER_WAIT_SHELF); + } + receiptDetailList.add(receiptDetail1); + +// LambdaQueryWrapper<ReceiptContainerDetail> receiptContainerDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); +// receiptContainerDetailLambdaQueryWrapper.eq(ReceiptContainerDetail::getReceiptId, receiptDetail.getReceiptId()) +// .eq(ReceiptContainerDetail::getReceiptDetailId, receiptDetail.getId()) +// .eq(StringUtils.isNotEmpty(receive.getSn()), ReceiptContainerDetail::getSn, receive.getSn()) +// .eq(ReceiptContainerDetail::getReceiptContainerId, receiptContainerHeader.getId()); +// ReceiptContainerDetail receiptContainerDetail = receiptContainerDetailService.getOne(receiptContainerDetailLambdaQueryWrapper); +// if (receiptContainerDetail != null) { +// // 如果是已经组过的详情,那么直接相加收货数量 +// ReceiptContainerDetail receiptContainerDetail1 = new ReceiptContainerDetail(); +// receiptContainerDetail1.setId(receiptContainerDetail.getId()); +// receiptContainerDetail1.setQty(receiptContainerDetail.getQty().add(taskQty)); +// if (!receiptContainerDetailService.updateById(receiptContainerDetail1)) { +// throw new JeecgBootException("入库组盘, 更新入库组盘明细失败"); +// } +// } else { + ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail(); + receiptContainerDetail.setCompanyCode(receiptDetail.getCompanyCode()); + receiptContainerDetail.setReferCode(receiptDetail.getReferCode()); + receiptContainerDetail.setSn(receive.getSn()); + receiptContainerDetail.setContainerCode(receive.getContainerCode()); + receiptContainerDetail.setReceiptDetailId(receiptDetail.getId()); + receiptContainerDetail.setReceiptId(receiptDetail.getReceiptId()); + receiptContainerDetail.setReceiptCode(receiptDetail.getReceiptCode()); + receiptContainerDetail.setReceiptContainerId(receiptContainerHeader.getId()); + receiptContainerDetail.setWarehouseCode(receiptDetail.getWarehouseCode()); + receiptContainerDetail.setMaterialCode(receiptDetail.getMaterialCode()); + receiptContainerDetail.setMaterialName(receiptDetail.getMaterialName()); + receiptContainerDetail.setMaterialSpec(receiptDetail.getMaterialSpec()); + receiptContainerDetail.setMaterialUnit(receiptDetail.getMaterialUnit()); + receiptContainerDetail.setQty(taskQty); + receiptContainerDetail.setBatch(receiptDetail.getBatch()); + receiptContainerDetail.setLot(receiptDetail.getLot()); + receiptContainerDetail.setPosition(position); + receiptContainerDetail.setProject(receiptDetail.getProject()); + receiptContainerDetail.setInventoryStatus(receiptDetail.getInventoryStatus()); + receiptContainerDetailList.add(receiptContainerDetail); + } + if (CollectionUtils.isEmpty(receiptDetailList)) { + throw new JeecgBootException("入库组盘,请填入收货数量"); + } + success = receiptDetailService.updateBatchById(receiptDetailList); + if (!success) { + throw new JeecgBootException("入库组盘,批量更新入库单详情失败"); + } + List<Integer> receiptIdList = receiptDetailList.stream().map(ReceiptDetail::getReceiptId).distinct().collect(Collectors.toList()); + for (Integer receiptId : receiptIdList) { + if (!receiptHeaderService.updateReceiptHeaderStatus(receiptId)) { + throw new JeecgBootException("入库组盘, 更新入库单明细失败"); + } + } + if (receiptContainerDetailList.size() > 0) { + success = receiptContainerDetailService.saveBatch(receiptContainerDetailList); + if (!success) { + throw new JeecgBootException("入库组盘,保存入库组盘详情失败"); + } + } + LogRecordContext.putVariable("extraJsonString", JSON.toJSONString(receiptContainerDetailList)); + log.info("完成入库组盘"); + return Result.OK("入库组盘成功", receiptContainerHeader); + } + + @Override + @Transactional(rollbackFor = Exception.class) public Result flatReceive(List<Receive> receiveList, String containerCode, String warehouseCode) { log.info("开始平库入库组盘"); boolean success = false; diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java index 5041eb4..54e065e 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java @@ -1009,6 +1009,26 @@ public class TaskHeaderController extends HuahengBaseController { } /** + * 铁芯库入库 + * @return + */ + @AutoLog(value = "铁芯库入库", operateType = 2) + @PostMapping("ironCoreReceipt") + @ApiOperation("铁芯库入库") + public Result ironCoreReceipt(@RequestBody QucikReceiptEntity qucikReceiptEntity, HttpServletRequest req) { + String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req); + qucikReceiptEntity.setWarehouseCode(warehouseCode); + Result result = handleMultiProcess("ironCoreReceipt", new MultiProcessListener() { + @Override + public Result<?> doProcess() { + Result result = taskHeaderService.ironCoreReceipt(qucikReceiptEntity); + return result; + } + }); + return result; + } + + /** * 质检登记 * @return */ diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java index 9a358ca..fcd8084 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java @@ -303,6 +303,14 @@ public interface ITaskHeaderService extends IService<TaskHeader> { */ Result completeCantaleverReceiptTask(TaskHeader taskHeader); + + /** + * 完成入库 + * @param taskHeader + * @return + */ + Result completeIconCoreReceiptTask(TaskHeader taskHeader); + /** * 完成出库 * @param taskHeader @@ -511,6 +519,12 @@ public interface ITaskHeaderService extends IService<TaskHeader> { * add * @return */ + Result ironCoreReceipt(QucikReceiptEntity qucikReceiptEntity); + + /** + * add + * @return + */ Result receiptStageingReceipt(QucikReceiptEntity qucikReceiptEntity); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java index 55907e5..865e166 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java @@ -277,6 +277,9 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (fromLocation.getZoneCode().equals(QuantityConstant.ZONE_B)) { return Result.error("创建移库任务时,悬架式立库不支持这种移库方式"); } + if (fromLocation.getZoneCode().equals(QuantityConstant.ZONE_C)) { + return Result.error("创建移库任务时,铁芯库不支持移库"); + } Location toLocation = locationService.getLocationByCode(toLocationCode, warehouseCode); if (toLocation == null) { return Result.error("创建移库任务时,目标库位:" + toLocationCode + "未找到"); @@ -1109,6 +1112,8 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea case QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT: if (zoneCode.equals(QuantityConstant.ZONE_B)) { result = taskHeaderService.completeCantaleverReceiptTask(taskHeader); + } else if (zoneCode.equals(QuantityConstant.ZONE_C)) { + result = taskHeaderService.completeIconCoreReceiptTask(taskHeader); } else { result = taskHeaderService.completeReceiptTask(taskHeader); } @@ -2128,6 +2133,182 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea return Result.ok("完成入库任务"); } + @Override + @Transactional(rollbackFor = Exception.class) + public Result completeIconCoreReceiptTask(TaskHeader taskHeader) { + if (taskHeader == null) { + return Result.error("入库任务未找到,执行中止"); + } + log.info("开始完成入库任务, 任务号" + taskHeader.getId()); + String warehouseCode = taskHeader.getWarehouseCode(); + String fromLocationCode = taskHeader.getFromLocationCode(); + String toLocationCode = taskHeader.getToLocationCode(); + String containerCode = taskHeader.getContainerCode(); + String zoneCode = taskHeader.getZoneCode(); + int taskType = taskHeader.getTaskType(); + List<TaskDetail> taskDetailList = taskDetailService.getTaskDetailListByTaskId(taskHeader.getId()); + boolean success = false; + if (taskHeader.getStatus().equals(QuantityConstant.TASK_STATUS_COMPLETED)) { + return Result.ok("入库任务(" + taskHeader.getId() + ")已经是完成的!"); + } + if (taskDetailList.isEmpty()) { + throw new JeecgBootException("完成入库任务时, 入库任务明细为空"); + } + Location toLocation = locationService.getLocationByCode(toLocationCode, warehouseCode); + if (toLocation == null) { + return Result.error("完成入库任务时,没有找到目的库位"); + } + if (StringUtils.isEmpty(zoneCode)) { + return Result.error("完成入库任务时,没有找到目的库区编码"); + } + Zone zone = zoneService.getZoneByCode(zoneCode, warehouseCode); + if (zone == null) { + return Result.error("完成入库任务时,没有找到库区"); + } + String zoneType = zone.getType(); + InventoryHeader inventoryHeader = inventoryHeaderService.getInventoryHeaderByContainerCode(containerCode, warehouseCode); + if (inventoryHeader == null) { + inventoryHeader = new InventoryHeader(); + inventoryHeader.setWarehouseCode(warehouseCode); + inventoryHeader.setCompanyCode(taskHeader.getCompanyCode()); + inventoryHeader.setZoneCode(zoneCode); + inventoryHeader.setContainerCode(containerCode); + inventoryHeader.setLocationCode(toLocationCode); + inventoryHeader.setTotalWeight(taskHeader.getWeight()); + inventoryHeader.setCreateBy(taskHeader.getCreateBy()); + inventoryHeader.setContainerStatus(QuantityConstant.STATUS_CONTAINER_EMPTY); + inventoryHeader.setEnable(QuantityConstant.STATUS_ENABLE); + if (!inventoryHeaderService.save(inventoryHeader)) { + throw new JeecgBootException("完成入库任务时, 添加库存头失败"); + } + } + + List<InventoryDetail> inventoryDetailList = new ArrayList<>(); + List<InventoryTransaction> inventoryTransactionList = new ArrayList<>(); + List<ReceiptDetail> receiptDetaiList = new ArrayList<>(); + for (TaskDetail taskDetail : taskDetailList) { + ReceiptDetail receiptDetail = receiptDetailService.getById(taskDetail.getReceiptDetailId()); + if (receiptDetail == null) { + throw new JeecgBootException("未找到ID:" + taskDetail.getReceiptDetailId() + "入库单明细"); + } + ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId()); + if (receiptHeader == null) { + throw new JeecgBootException("未找到ID:" + receiptDetail.getReceiptId() + "入库单头"); + } + // 操作记录统计用 + taskDetail.setReceiptCode(receiptDetail.getReceiptCode()); + BigDecimal qty = receiptDetail.getQty(); + BigDecimal receiptDetailReceiptQty = receiptDetail.getReceiptQty(); + receiptDetailReceiptQty = receiptDetailReceiptQty.add(taskDetail.getQty()); + int receiptId = receiptDetail.getReceiptId(); + ReceiptDetail updateReceiptDetail = new ReceiptDetail(); + updateReceiptDetail.setId(receiptDetail.getId()); + updateReceiptDetail.setReceiptId(receiptId); + updateReceiptDetail.setReceiptQty(receiptDetailReceiptQty); + if (receiptDetailReceiptQty.compareTo(qty) >= 0) { + updateReceiptDetail.setStatus(QuantityConstant.RECEIPT_HEADER_COMPLETED); + } else { + updateReceiptDetail.setStatus(QuantityConstant.RECEIPT_HEADER_SHELF); + } + receiptDetaiList.add(updateReceiptDetail); + if (!receiptDetailService.updateById(updateReceiptDetail)) { + throw new JeecgBootException("完成入库任务时,更新入库单详情失败"); + } + // 计算换算单位数量 + materialMultipleService.materialMultiple(taskDetail); + InventoryDetail inventoryDetail = new InventoryDetail(); + inventoryDetail.setInventoryHeaderId(inventoryHeader.getId()); + inventoryDetail.setWarehouseCode(warehouseCode); + inventoryDetail.setCompanyCode(taskDetail.getCompanyCode()); + inventoryDetail.setZoneCode(zoneCode); + inventoryDetail.setZoneType(zoneType); + inventoryDetail.setContainerCode(taskHeader.getContainerCode()); + inventoryDetail.setLocationCode(toLocationCode); + inventoryDetail.setMaterialCode(taskDetail.getMaterialCode()); + inventoryDetail.setMaterialName(taskDetail.getMaterialName()); + inventoryDetail.setMaterialSpec(taskDetail.getMaterialSpec()); + inventoryDetail.setMaterialUnit(taskDetail.getMaterialUnit()); + inventoryDetail.setQty(taskDetail.getQty()); + inventoryDetail.setInventoryStatus(taskDetail.getInventoryStatus()); + inventoryDetail.setBatch(taskDetail.getBatch()); + inventoryDetail.setLot(taskDetail.getLot()); + inventoryDetail.setProject(taskDetail.getProject()); + inventoryDetail.setSn(taskDetail.getSn()); + inventoryDetail.setPosition(taskDetail.getPosition()); + inventoryDetail.setReceiveTime(taskDetail.getReceiveTime()); + inventoryDetail.setReceiptDate(new Date()); + inventoryDetailList.add(inventoryDetail); + + InventoryTransaction inventoryTransaction = new InventoryTransaction(); + inventoryTransaction.setType(QuantityConstant.INVENTORY_TRANSACTION_RECEIPT); + inventoryTransaction.setWarehouseCode(taskDetail.getWarehouseCode()); + inventoryTransaction.setCompanyCode(taskDetail.getCompanyCode()); + inventoryTransaction.setContainerCode(containerCode); + inventoryTransaction.setZoneCode(zoneCode); + inventoryTransaction.setToLocationCode(toLocationCode); + inventoryTransaction.setMaterialCode(taskDetail.getMaterialCode()); + inventoryTransaction.setMaterialName(taskDetail.getMaterialName()); + inventoryTransaction.setMaterialSpec(taskDetail.getMaterialSpec()); + inventoryTransaction.setMaterialUnit(taskDetail.getMaterialUnit()); + inventoryTransaction.setReceiptId(taskDetail.getReceiptId()); + inventoryTransaction.setReceiptCode(receiptHeader.getCode()); + inventoryTransaction.setReceiptType(receiptHeader.getType()); + inventoryTransaction.setReceiptDetailId(taskDetail.getReceiptDetailId()); + inventoryTransaction.setReceiptContainerDetailId(taskDetail.getReceiptContainerDetailId()); + inventoryTransaction.setBatch(taskDetail.getBatch()); + inventoryTransaction.setLot(taskDetail.getLot()); + inventoryTransaction.setProject(taskDetail.getProject()); + inventoryTransaction.setSn(taskDetail.getSn()); + inventoryTransaction.setInventoryStatus(taskDetail.getInventoryStatus()); + inventoryTransaction.setReceiptQty(taskDetail.getQty()); + inventoryTransaction.setQty(taskDetail.getQty()); + // 获得库存总数 + BigDecimal inventoryQty = inventoryDetailService.getInventorySumQty(inventoryDetail); + // 获得物料在这个托盘上的库存数 + BigDecimal containerInventoryQty = inventoryDetailService.getContainerInventorySumQty(inventoryDetail); + inventoryQty = inventoryQty.add(taskDetail.getQty()); + containerInventoryQty = containerInventoryQty.add(taskDetail.getQty()); + inventoryTransaction.setInventoryQty(inventoryQty); + inventoryTransaction.setContainerInventoryQty(containerInventoryQty); + inventoryTransactionList.add(inventoryTransaction); + } + + success = receiptContainerHeaderService.updateStatusById(QuantityConstant.RECEIPT_CONTAINER_FINISHED, taskHeader.getReceiptContainerHeaderId()); + if (!success) { + throw new JeecgBootException("完成入库任务时,更新入库组盘头表状态失败"); + } + success = inventoryDetailService.saveBatch(inventoryDetailList); + if (!success) { + throw new JeecgBootException("完成入库任务时,保存库存详情失败"); + } + success = inventoryTransactionService.saveBatch(inventoryTransactionList); + if (!success) { + throw new JeecgBootException("完成入库任务时,保存库存交易失败"); + } +// if (!taskHeaderService.combineInventoryDetail(containerCode, warehouseCode)) { +// throw new JeecgBootException("完成入库任务时, 合并入库库存失败"); +// } + List<Integer> receiptIdList = receiptDetaiList.stream().map(ReceiptDetail::getReceiptId).distinct().collect(Collectors.toList()); + for (Integer receiptId : receiptIdList) { + success = receiptHeaderService.updateReceiptHeaderStatus(receiptId); + if (!success) { + throw new JeecgBootException("完成入库任务时,更新入库单头失败"); + } + } + Result result = taskHeaderService.completeTaskUnLockContainerAndLocation(taskHeader.getContainerFillStatus(), taskType, containerCode, fromLocationCode, + toLocationCode, warehouseCode); + if (!result.isSuccess()) { + throw new JeecgBootException(result.getMessage()); + } + success = taskHeaderService.updateStatusById(QuantityConstant.TASK_STATUS_COMPLETED, taskHeader.getId()); + if (!success) { + throw new JeecgBootException("完成入库任务时,保存任务头失败"); + } + receiptDetaiList = receiptDetaiList.stream().filter(t -> t.getStatus().equals(QuantityConstant.RECEIPT_HEADER_COMPLETED)).collect(Collectors.toList()); + log.info("完成入库任务, 任务号:" + taskHeader.getId()); + return Result.ok("完成入库任务"); + } + /** * 完成出库任务 * @param taskHeader 任务 @@ -3309,6 +3490,124 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea @Override @Transactional(rollbackFor = Exception.class) + public Result ironCoreReceipt(QucikReceiptEntity qucikReceiptEntity) { + boolean success = false; + String containerCode = qucikReceiptEntity.getContainerCode(); + List<ReceiptEntity> receiptEntityList = qucikReceiptEntity.getReceiptEntityList(); + String toPort = qucikReceiptEntity.getToPort(); + String warehouseCode = qucikReceiptEntity.getWarehouseCode(); + List<Receive> receiveList = new ArrayList<>(); + if (StringUtils.isEmpty(containerCode)) { + return Result.error("快速入库,容器编码为空"); + } + if (StringUtils.isEmpty(warehouseCode)) { + return Result.error("快速入库,仓库编码为空"); + } + if (StringUtils.isEmpty(receiptEntityList)) { + return Result.error("快速入库,入库信息为空"); + } + Container container = containerService.getContainerByCode(containerCode, warehouseCode); + if (container == null) { + return Result.error("快速入库,没有找到容器" + containerCode); + } + Port port = portService.getPortByCode(toPort, warehouseCode); + if (port != null) { + int portType = Integer.parseInt(port.getType()); + if (portType == QuantityConstant.PORT_TYPE_OUT) { + return Result.error("快速入库,不能选择出库口" + toPort); + } + } + String receiptType = QuantityConstant.RECEIPT_BILL_TYPE_QTR; + String remark = "快速入库"; + ReceiptHeader receiptHeader = new ReceiptHeader(); + receiptHeader.setWarehouseCode(warehouseCode); + receiptHeader.setCompanyCode(QuantityConstant.DEFAULT_COMPANY); + receiptHeader.setType(receiptType); + receiptHeader.setRemark(remark); + Result result = receiptHeaderService.saveReceiptHeader(receiptHeader); + if (!result.isSuccess()) { + throw new JeecgBootException("快速入库, 创建入库单头失败" + result.getMessage()); + } + for (ReceiptEntity receiptEntity : receiptEntityList) { + BigDecimal qty = receiptEntity.getQty(); + String materialCode = receiptEntity.getMaterialCode(); + if (StringUtils.isEmpty(materialCode)) { + throw new JeecgBootException("快速入库, 物料编码为空"); + } + if (qty == null) { + throw new JeecgBootException("快速入库, 数量必须填写"); + } + if (qty.compareTo(BigDecimal.ZERO) <= 0) { + throw new JeecgBootException("快速入库, 数量必须大于0"); + } + ReceiptDetail receiptDetail = new ReceiptDetail(); + receiptDetail.setWarehouseCode(warehouseCode); + receiptDetail.setCompanyCode(QuantityConstant.DEFAULT_COMPANY); + receiptDetail.setReceiptCode(receiptHeader.getCode()); + receiptDetail.setReceiptId(receiptHeader.getId()); + receiptDetail.setStatus(QuantityConstant.RECEIPT_HEADER_BUILD); + receiptDetail.setQty(qty); + Material material = materialService.getMaterialByCode(materialCode); + if (material == null) { + throw new JeecgBootException("快速入库, 获取物料:" + materialCode + " 信息失败"); + } + receiptDetail.setInventoryStatus(QuantityConstant.QUALITY_GOOD); + receiptDetail.setMaterialCode(materialCode); + receiptDetail.setMaterialName(material.getName()); + receiptDetail.setMaterialSpec(material.getSpec()); + receiptDetail.setMaterialUnit(material.getUnit()); + success = receiptDetailService.save(receiptDetail); + if (!success) { + throw new JeecgBootException("快速入库, 保存入库单详情失败"); + } + + Receive receive = new Receive(); + receive.setId(receiptDetail.getId()); + receive.setContainerCode(containerCode); + receive.setMaterialCode(materialCode); + receive.setMaterialName(receiptDetail.getMaterialName()); + receive.setMaterialSpec(receiptDetail.getMaterialSpec()); + receive.setMaterialUnit(receiptDetail.getMaterialUnit()); + receive.setInventoryStatus(receiptDetail.getInventoryStatus()); + receive.setQty(receiptDetail.getQty()); + receive.setTaskQty(receiptDetail.getQty()); + receiveList.add(receive); + } + Result<ReceiptContainerHeader> taskResult = receiveService.receivingIronCore(receiveList, warehouseCode); + if (!taskResult.isSuccess()) { + throw new JeecgBootException(result.getMessage()); + } +// result = receiptContainerHeaderService.createReceiptTask(taskResult.getResult(), warehouseCode); +// if (!success) { +// throw new JeecgBootException(result.getMessage()); +// } + ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderService.getUnCompleteReceiptContainerByCode(containerCode, warehouseCode); + if (receiptContainerHeader == null) { + throw new JeecgBootException(result.getMessage()); + } + receiptContainerHeader.setToPort(toPort); + success = receiptContainerHeaderService.updateById(receiptContainerHeader); + if (!success) { + throw new JeecgBootException("快速入库,更新入库组盘头失败"); + } + result = receiptContainerHeaderService.createReceiptTask(receiptContainerHeader, warehouseCode); + if (!result.isSuccess()) { + throw new JeecgBootException(result.getMessage()); + } + TaskHeader taskHeader = (TaskHeader)result.getResult(); + if (taskHeader.getTaskType() == QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT) { + if (port == null) { + throw new JeecgBootException("快速入库, 生成补充任务时必须有入库口"); + } + } + if (!receiptHeaderService.updateReceiptHeader(receiptHeader.getId())) { + throw new JeecgBootException("快速入库, 更新入库表单头失败"); + } + return Result.OK("快速入库成功"); + } + + @Override + @Transactional(rollbackFor = Exception.class) public Result receiptStageingReceipt(QucikReceiptEntity qucikReceiptEntity) { boolean success = false; String containerCode = qucikReceiptEntity.getContainerCode();