diff --git a/ant-design-vue-jeecg/src/api/api.js b/ant-design-vue-jeecg/src/api/api.js index be3b7fd..a78b413 100644 --- a/ant-design-vue-jeecg/src/api/api.js +++ b/ant-design-vue-jeecg/src/api/api.js @@ -139,6 +139,8 @@ export const execute = (params) => postAction('/task/taskHeader/execute', params export const cancelTask = (params) => postAction('/task/taskHeader/cancelTask?ids=' + params, params); //自动配盘 export const autoCombination = (params) => postAction('/shipment/shipmentCombination/autoCombination', params); +//自动出库 +export const autoShipment = (params) => postAction('/shipment/shipmentHeader/autoShipment', params); //创建出库任务 export const createShipmentTask = (params) => postAction('/shipment/shipmentCombination/createShipmentTask', params); //批量创建出库任务 diff --git a/ant-design-vue-jeecg/src/views/system/shipment/ShipmentHeaderList.vue b/ant-design-vue-jeecg/src/views/system/shipment/ShipmentHeaderList.vue index 2e18a95..38d876a 100644 --- a/ant-design-vue-jeecg/src/views/system/shipment/ShipmentHeaderList.vue +++ b/ant-design-vue-jeecg/src/views/system/shipment/ShipmentHeaderList.vue @@ -196,6 +196,8 @@ </a-popconfirm> <a v-if="((record.firstStatus >= 15 && record.firstStatus != '20' && record.lastStatus <= 200)) || (flowOff == '0' && record.lastStatus <= 200)" @click="autoShipmentCombine(record)" v-has="'shipmentHeader:autoShipmentCombine'"><a-button type="primary">自动配盘</a-button> <a-divider type="vertical"/></a> + <a v-if="((record.firstStatus >= 15 && record.firstStatus != '20' && record.lastStatus < 800)) + || (flowOff == '0' && record.lastStatus < 800)" @click="openAutoShipmentCombine(record)" v-has="'shipmentHeader:autoShipment'"><a-button type="primary">自动出库</a-button> <a-divider type="vertical"/></a> <a-dropdown> <a class="ant-dropdown-link">更多 <a-icon type="down"/></a> <a-menu slot="overlay"> @@ -223,8 +225,9 @@ </a-tabs> <shipmentHeader-modal ref="modalForm" @ok="modalFormOk"></shipmentHeader-modal> - <shipment-audit-modal ref="auditForm"></shipment-audit-modal> - <flow-process ref="porcessForm"></flow-process> + <shipment-audit-modal ref="auditForm" @ok="modalFormOk"></shipment-audit-modal> + <flow-process ref="porcessForm" @ok="modalFormOk"></flow-process> + <auto-shipment-select-modal ref="autoShipmentForm" @ok="modalFormOk"></auto-shipment-select-modal> </a-card> </template> @@ -240,15 +243,17 @@ import {getCompanyList, backErpShipment} from '@/api/api' import {getShipmentTypeList} from '@/api/api' import {getCustomerList} from '@/api/api' import {autoCombination} from '@/api/api' -import {createShipmentAuditFlow, getDocumentAduitFlow, mergeShipment} from '@/api/api' +import {createShipmentAuditFlow, getDocumentAduitFlow, mergeShipment, autoShipment} from '@/api/api' import store from '@/store' import ShipmentAuditModal from "./modules/ShipmentAuditModal"; import FlowProcess from "../flow/FlowProcess"; +import AutoShipmentSelectModal from "@views/system/shipment/modules/AutoShipmentSelectModal"; export default { name: "ShipmentHeaderList", mixins: [JeecgListMixin], components: { + AutoShipmentSelectModal, ShipmentAuditModal, ShipmentDetailList, ShipmentHeaderModal, @@ -557,6 +562,10 @@ export default { }) return actions.join('') }, + openAutoShipmentCombine(record) { + this.$refs.autoShipmentForm.title = "自动出库"; + this.$refs.autoShipmentForm.edit(record); + }, autoShipmentCombine(record) { this.loading = true; autoCombination(record).then((res) => { @@ -569,6 +578,18 @@ export default { this.searchQuery(); }); }, + autoShipment(record) { + this.loading = true; + autoShipment(record).then((res) => { + if (res.success) { + this.$message.success(res.message); + } else { + this.$message.warning(res.message) + } + this.loading = false; + this.searchQuery(); + }); + }, loadData(arg) { if (!this.url.list) { this.$message.error("请设置url.list属性!") diff --git a/ant-design-vue-jeecg/src/views/system/shipment/modules/AutoShipmentSelectModal.vue b/ant-design-vue-jeecg/src/views/system/shipment/modules/AutoShipmentSelectModal.vue new file mode 100644 index 0000000..9cdf356 --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/shipment/modules/AutoShipmentSelectModal.vue @@ -0,0 +1,107 @@ +<template> + <j-modal + :title="title" + :width="width" + :visible="visible" + :confirmLoading="confirmLoading" + switchFullscreen + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭"> + <a-spin :spinning="confirmLoading"> + <a-form-model ref="form" :model="model" :rules="validatorRules"> + <a-row> + <a-col :span="24"> + <a-col :span="24"> + <a-form-model-item label="出库口" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toPort"> + <a-input v-model="model.toPort" placeholder="请输入出库口" style="width: 100%"/> + </a-form-model-item> + </a-col> + </a-col> + </a-row> + </a-form-model> + </a-spin> + </j-modal> +</template> + +<script> + +import {httpAction} from '@/api/manage' +import {validateDuplicateValue} from '@/utils/util' +import {autoShipment} from '@/api/api' +import {selectSortingPort} from '@/api/api' + +export default { + name: "AutoShipmentSelectModal", + components: {}, + props: { + mainId: { + type: String, + required: false, + default: '' + } + }, + data() { + return { + portList: [], + flag:'0', + shipmentContainerHeaderList:[], + title: "操作", + width: 500, + visible: false, + model: {}, + labelCol: { + xs: {span: 24}, + sm: {span: 5}, + }, + wrapperCol: { + xs: {span: 24}, + sm: {span: 16}, + }, + + confirmLoading: false, + validatorRules: {}, + url: { + createTask: "/shipment/shipmentContainerHeader/createShipmentTask", + } + + } + }, + created() { + //备份model原始值 + this.modelDefault = JSON.parse(JSON.stringify(this.model)); + }, + methods: { + add() { + this.edit(this.modelDefault); + }, + edit(record) { + this.model = Object.assign({}, record); + this.visible = true; + }, + close() { + this.$emit('close'); + this.visible = false; + this.$refs.form.clearValidate(); + }, + handleOk() { + const that = this; + this.confirmLoading = true; + autoShipment(this.model).then((res) => { + if (res.success) { + this.$message.success(res.message); + } else { + this.$message.warning(res.message) + } + this.confirmLoading = false; + that.close(); + that.$emit('ok'); + }); + }, + handleCancel() { + this.close() + }, + + } +} +</script> diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/IHuahengMultiHandlerService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/IHuahengMultiHandlerService.java index bf56550..40fadd4 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/IHuahengMultiHandlerService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/IHuahengMultiHandlerService.java @@ -36,6 +36,8 @@ public interface IHuahengMultiHandlerService { Result autoCombination(String shipmentCode, String warehouseCode); + Result autoShipment(String shipmentCode, String toPort, String warehouseCode); + Result createShipmentTask(ShipmentContainerHeader shipmentContainerHeader, String warehouseCode, long shipmentOrder, int sequence, int sequenceNumber); Result callBox(CallBoxBean bean, String warehouseCode); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/impl/HuahengMultiHandlerServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/impl/HuahengMultiHandlerServiceImpl.java index 70c0c6d..e9bd497 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/impl/HuahengMultiHandlerServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/impl/HuahengMultiHandlerServiceImpl.java @@ -25,6 +25,7 @@ import org.jeecg.modules.wms.shipment.shipmentHeader.entity.CombinationParam; import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentDetail; import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentHeader; import org.jeecg.modules.wms.shipment.shipmentHeader.service.IShipmentDetailService; +import org.jeecg.modules.wms.shipment.shipmentHeader.service.IShipmentHeaderService; import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService; import org.springframework.scheduling.annotation.Async; @@ -49,6 +50,9 @@ public class HuahengMultiHandlerServiceImpl extends HuahengBaseController implem private IShipmentCombinationService shipmentCombinationService; @Resource + private IShipmentHeaderService shipmentHeaderService; + + @Resource private IShipmentDetailService shipmentDetailService; @Resource @@ -176,6 +180,18 @@ public class HuahengMultiHandlerServiceImpl extends HuahengBaseController implem } @Override + public Result autoShipment(String shipmentCode, String toPort, String warehouseCode) { + Result result = handleMultiProcess("combination", new MultiProcessListener() { + @Override + public Result<?> doProcess() { + Result result = shipmentHeaderService.autoShipment(shipmentCode, toPort, warehouseCode); + return result; + } + }); + return result; + } + + @Override public Result createShipmentTask(ShipmentContainerHeader shipmentContainerHeader, String warehouseCode, long shipmentOrder, int sequence, int sequenceNumber) { Result result = handleMultiProcess("createShipmentTask", new MultiProcessListener() { @Override diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/controller/ShipmentHeaderController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/controller/ShipmentHeaderController.java index 78a03bd..0dfd7c5 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/controller/ShipmentHeaderController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/controller/ShipmentHeaderController.java @@ -398,4 +398,16 @@ public class ShipmentHeaderController extends JeecgController<ShipmentHeader, IS Result result = huahengMultiHandlerService.callBox(bean, warehouseCode); return result; } + + @AutoLog(value = "快速出库") + @ApiOperation(value = "快速出库", notes = "快速出库") + @PostMapping("/autoShipment") + @ResponseBody + public Result<TaskHeader> autoShipment(@RequestBody ShipmentHeader shipmentHeader, HttpServletRequest req) { + String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req); + String toPort = shipmentHeader.getToPort(); + String shipmentCode = shipmentHeader.getCode(); + Result result = huahengMultiHandlerService.autoShipment(shipmentCode, toPort, warehouseCode); + return result; + } } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/entity/ShipmentHeader.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/entity/ShipmentHeader.java index fadc650..76e9618 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/entity/ShipmentHeader.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/entity/ShipmentHeader.java @@ -1,18 +1,19 @@ package org.jeecg.modules.wms.shipment.shipmentHeader.entity; import java.io.Serializable; -import java.io.UnsupportedEncodingException; import java.util.Date; + +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecgframework.poi.excel.annotation.Excel; + import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import org.jeecgframework.poi.excel.annotation.Excel; -import lombok.Data; -import com.fasterxml.jackson.annotation.JsonFormat; -import org.springframework.format.annotation.DateTimeFormat; -import org.jeecg.common.aspect.annotation.Dict; + import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** * @Description: 出库单 @@ -80,6 +81,9 @@ public class ShipmentHeader implements Serializable { @Excel(name = "出库单备注", width = 15) @ApiModelProperty(value = "出库单备注") private String remark; + /** 出库口 */ + @TableField(exist = false) + private String toPort; /** 备用字段1 */ @Excel(name = "备用字段1", width = 15) @ApiModelProperty(value = "备用字段1") diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/service/IShipmentHeaderService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/service/IShipmentHeaderService.java index 6cd53a4..672c65c 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/service/IShipmentHeaderService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/service/IShipmentHeaderService.java @@ -42,4 +42,6 @@ public interface IShipmentHeaderService extends IService<ShipmentHeader> { boolean updateFirstStatusAndLastStatusById(Integer firstStatus, Integer lastStatus, int id); public Result<Object> mergeShipment(List<ShipmentHeader> shipmentHeaderList); + + Result autoShipment(String shipmentCode, String toPort, String warehouseCode); } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/service/impl/ShipmentHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/service/impl/ShipmentHeaderServiceImpl.java index e7403b6..e65b56a 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/service/impl/ShipmentHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/service/impl/ShipmentHeaderServiceImpl.java @@ -15,10 +15,17 @@ import org.jeecg.common.exception.JeecgBootException; import org.jeecg.modules.wms.config.container.service.IContainerService; import org.jeecg.modules.wms.config.location.service.ILocationService; import org.jeecg.modules.wms.config.parameterConfiguration.service.IParameterConfigurationService; +import org.jeecg.modules.wms.config.port.entity.Port; +import org.jeecg.modules.wms.config.port.service.IPortService; import org.jeecg.modules.wms.config.shipmentType.entity.ShipmentType; import org.jeecg.modules.wms.config.shipmentType.service.IShipmentTypeService; +import org.jeecg.modules.wms.framework.service.IHuahengMultiHandlerService; import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryDetailService; +import org.jeecg.modules.wms.shipment.shipmentCombination.service.IShipmentCombinationService; +import org.jeecg.modules.wms.shipment.shipmentContainerHeader.entity.ShipmentContainerDetail; +import org.jeecg.modules.wms.shipment.shipmentContainerHeader.entity.ShipmentContainerHeader; import org.jeecg.modules.wms.shipment.shipmentContainerHeader.service.IShipmentContainerDetailService; +import org.jeecg.modules.wms.shipment.shipmentContainerHeader.service.IShipmentContainerHeaderService; import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentDetail; import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentHeader; import org.jeecg.modules.wms.shipment.shipmentHeader.mapper.ShipmentDetailMapper; @@ -26,6 +33,7 @@ import org.jeecg.modules.wms.shipment.shipmentHeader.mapper.ShipmentHeaderMapper import org.jeecg.modules.wms.shipment.shipmentHeader.service.IShipmentDetailService; import org.jeecg.modules.wms.shipment.shipmentHeader.service.IShipmentHeaderService; import org.jeecg.modules.wms.shipment.shipmentHeaderHistory.service.IShipmentHeaderHistoryService; +import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService; import org.jeecg.utils.StringUtils; import org.jeecg.utils.constant.QuantityConstant; @@ -86,6 +94,14 @@ public class ShipmentHeaderServiceImpl extends ServiceImpl<ShipmentHeaderMapper, @Resource private IShipmentHeaderHistoryService shipmentHeaderHistoryService; + @Resource + private IShipmentCombinationService shipmentCombinationService; + @Resource + private IShipmentContainerHeaderService shipmentContainerHeaderService; + @Resource + private IHuahengMultiHandlerService huahengMultiHandlerService; + @Resource + private IPortService portService; @Override @Transactional @@ -329,4 +345,74 @@ public class ShipmentHeaderServiceImpl extends ServiceImpl<ShipmentHeaderMapper, } return Result.OK("合并成功"); } + + @Override + @Transactional(rollbackFor = JeecgBootException.class) + public Result autoShipment(String shipmentCode, String toPort, String warehouseCode) { + if (StringUtils.isEmpty(shipmentCode)) { + return Result.error("自动出库, 出库单编码为空"); + } + if (StringUtils.isEmpty(toPort)) { + return Result.error("自动出库, 出库口为空"); + } + if (StringUtils.isEmpty(warehouseCode)) { + return Result.error("自动出库, 仓库编码为空"); + } + Port port = portService.getPortByCode(toPort, warehouseCode); + if (port == null) { + return Result.error("自动出库, 出库口为空"); + } + int type = Integer.parseInt(port.getType()); + if (type == QuantityConstant.PORT_TYPE_IN) { + return Result.error("自动出库, 不能选择入库口来出库"); + } + Result result = shipmentCombinationService.autoCombination(shipmentCode, warehouseCode); + if (!result.isSuccess()) { + throw new JeecgBootException("自动出库," + result.getMessage()); + } + List<ShipmentContainerDetail> shipmentContainerDetailList = shipmentContainerDetailService.getShipmentContainerDetailListByShipmentCode(shipmentCode); + if (shipmentContainerDetailList == null) { + throw new JeecgBootException("自动出库, 没有找到出库配盘详情"); + } + List<Integer> shipmentContainerIdList = + shipmentContainerDetailList.stream().map(ShipmentContainerDetail::getShipmentContainerId).distinct().collect(Collectors.toList()); + long shipmentOrder = System.currentTimeMillis(); + int sequenceNumber = shipmentContainerIdList.size(); + int sequence = 0; + for (int shipmentContainerId : shipmentContainerIdList) { + sequence++; + ShipmentContainerHeader shipmentContainerHeader = shipmentContainerHeaderService.getById(shipmentContainerId); + if (shipmentContainerHeader == null) { + throw new JeecgBootException("自动出库, 没有找到出库表头:" + shipmentContainerId); + } + shipmentContainerHeader.setToPort(toPort); + boolean success = shipmentContainerHeaderService.updateById(shipmentContainerHeader); + if (!success) { + throw new JeecgBootException("自动出库, 更新出库组盘头失败"); + } + result = huahengMultiHandlerService.createShipmentTask(shipmentContainerHeader, warehouseCode, shipmentOrder, sequence, sequenceNumber); + if (!result.isSuccess()) { + throw new JeecgBootException("自动出库, " + result.getMessage()); + } + String containerCode = shipmentContainerHeader.getContainerCode(); + if (StringUtils.isEmpty(containerCode)) { + throw new JeecgBootException("自动出库, 容器号为空"); + } + TaskHeader taskHeader = taskHeaderService.getUnCompleteTaskByContainerCode(containerCode, warehouseCode); + if (taskHeader == null) { + throw new JeecgBootException("自动出库, 没有找到容器号对应任务" + containerCode); + } + if (taskHeader.getTaskType() == QuantityConstant.TASK_TYPE_WHOLESHIPMENT) { + if (type != QuantityConstant.PORT_TYPE_OUT) { + throw new JeecgBootException("自动出库, 出库口和整出任务不匹配" + toPort); + } + } + if (taskHeader.getTaskType() == QuantityConstant.TASK_TYPE_SORTINGSHIPMENT) { + if (type != QuantityConstant.PORT_TYPE_PICK) { + throw new JeecgBootException("自动出库, 出库口和分拣任务不匹配" + toPort); + } + } + } + return Result.OK("自动出库成功"); + } } diff --git a/huaheng-wms-core/src/main/resources/application-dev.yml b/huaheng-wms-core/src/main/resources/application-dev.yml index 7bcba6a..35b729a 100644 --- a/huaheng-wms-core/src/main/resources/application-dev.yml +++ b/huaheng-wms-core/src/main/resources/application-dev.yml @@ -138,7 +138,7 @@ spring: master: url: jdbc:log4jdbc:mysql://localhost:3306/wms4?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true username: root - password: 123456 + password: HHsoft123. driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy # sqlserver 数据源配置 # url: jdbc:sqlserver://172.16.29.88:1433;DatabaseName=wms4;encrypt=false;SelectMethod=cursor; @@ -161,7 +161,7 @@ spring: database: 0 host: 127.0.0.1 port: 6379 - password: + password: 123456 timeout: 5000 #超时时间ms lettuce: pool: @@ -283,7 +283,7 @@ jeecg: #分布式锁配置 redisson: address: 127.0.0.1:6379 - password: + password: 123456 type: STANDALONE enabled: true #cas单点登录