diff --git a/ant-design-vue-jeecg/src/views/system/config/modules/LocationHighForm.vue b/ant-design-vue-jeecg/src/views/system/config/modules/LocationHighForm.vue index 7ac6a3d..47537a3 100644 --- a/ant-design-vue-jeecg/src/views/system/config/modules/LocationHighForm.vue +++ b/ant-design-vue-jeecg/src/views/system/config/modules/LocationHighForm.vue @@ -15,7 +15,11 @@ </a-col> <a-col :span="24"> <a-form-model-item label="库位类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="locationTypeCode"> - <a-input v-model="model.locationTypeCode" placeholder="请输入库位类型"></a-input> + <a-select + v-model="model.locationTypeCode" + :options="locationTypeList" + placeholder="请选择库位类型"> + </a-select> </a-form-model-item> </a-col> <a-col :span="24"> @@ -52,7 +56,7 @@ import {httpAction, getAction} from '@/api/manage' import {validateDuplicateValue} from '@/utils/util' -import {getContainerTypeList, getZoneList} from "@api/api"; +import {getContainerTypeList, getLocationTypeList, getZoneList} from "@api/api"; export default { name: 'LocationHighForm', @@ -69,6 +73,7 @@ export default { return { model: {}, zoneList: [], + locationTypeList: [], labelCol: { xs: {span: 24}, sm: {span: 5}, @@ -86,7 +91,10 @@ export default { {required: true, message: '请输入名称!'}, ], locationTypeCode: [ - {required: true, message: '请输入库位类型!'}, + {required: true, message: '请选择库位类型!'}, + ], + zoneCode: [ + {required: true, message: '请选择库区!'}, ], high: [ {required: true, message: '请输入高度值!'}, @@ -123,6 +131,13 @@ export default { this.zoneList = res.result } }); + getLocationTypeList().then((res) => { + if (res.success) { + this.locationTypeList = res.result.map((item, index, arr) => { + return {label: item.name, value: item.code} + }) + } + }); }, submitForm() { const that = this; diff --git a/ant-design-vue-jeecg/src/views/system/inventory/InventoryDetailList.vue b/ant-design-vue-jeecg/src/views/system/inventory/InventoryDetailList.vue index b9f1c55..fa5e6e7 100644 --- a/ant-design-vue-jeecg/src/views/system/inventory/InventoryDetailList.vue +++ b/ant-design-vue-jeecg/src/views/system/inventory/InventoryDetailList.vue @@ -79,8 +79,8 @@ <span slot="action" slot-scope="text, record"> <a v-has="'inventoryDetail:edit'" @click="handleEdit(record)">编辑<a-divider type="vertical"/></a> - <a v-has="'inventoryDetail:addInventoryDetail'" @click="addInventoryDetail(record)">新增数量<a-divider type="vertical"/></a> - <a v-has="'inventoryDetail:reduceInventoryDetail'" @click="reduceInventoryDetail(record)">减少数量<a-divider type="vertical"/></a> + <a v-has="'inventoryDetail:addInventoryDetail'" v-if="(record.containerStatus == 'lock')" @click="addInventoryDetail(record)">新增数量<a-divider type="vertical"/></a> + <a v-has="'inventoryDetail:reduceInventoryDetail'" v-if="(record.containerStatus == 'lock')" @click="reduceInventoryDetail(record)">减少数量<a-divider type="vertical"/></a> <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> <a v-has="'inventoryDetail:delete'">删除</a> </a-popconfirm> diff --git a/ant-design-vue-jeecg/src/views/system/inventory/InventoryTransactionList.vue b/ant-design-vue-jeecg/src/views/system/inventory/InventoryTransactionList.vue index 7602156..7582ac9 100644 --- a/ant-design-vue-jeecg/src/views/system/inventory/InventoryTransactionList.vue +++ b/ant-design-vue-jeecg/src/views/system/inventory/InventoryTransactionList.vue @@ -61,15 +61,15 @@ </a-form-item> </a-col> <a-col :xl="6" :lg="7" :md="8" :sm="24"> - <a-form-item label="库存状态"> - <j-dict-select-tag placeholder="请选择库存状态" v-model="queryParam.inventoryStatus" - dictCode="inventory_status"/> + <a-form-item label="物料编码"> + <a-input placeholder="请输入物料编码" v-model="queryParam.materialCode"></a-input> </a-form-item> </a-col> <template v-if="toggleSearchStatus"> <a-col :xl="6" :lg="7" :md="8" :sm="24"> - <a-form-item label="物料编码"> - <a-input placeholder="请输入物料编码" v-model="queryParam.materialCode"></a-input> + <a-form-item label="库存状态"> + <j-dict-select-tag placeholder="请选择库存状态" v-model="queryParam.inventoryStatus" + dictCode="inventory_status"/> </a-form-item> </a-col> <a-col :xl="6" :lg="7" :md="8" :sm="24"> @@ -93,6 +93,11 @@ </a-form-item> </a-col> <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="序列号"> + <a-input placeholder="请输入序列号" v-model="queryParam.sn"></a-input> + </a-form-item> + </a-col> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> <a-form-item label="创建人"> <a-input placeholder="请输入创建人" v-model="queryParam.createBy"></a-input> </a-form-item> @@ -306,6 +311,11 @@ export default { dataIndex: 'materialUnit' }, { + title: '序列号', + align: "center", + dataIndex: 'sn' + }, + { title: '库存状态', align: "center", dataIndex: 'inventoryStatus_dictText', @@ -327,7 +337,7 @@ export default { dataIndex: 'shipmentQty' }, { - title: '库存数量', + title: '库存总数', align: "center", dataIndex: 'inventoryQty' }, diff --git a/ant-design-vue-jeecg/src/views/system/inventory/modules/InventoryDetailModifyModal.vue b/ant-design-vue-jeecg/src/views/system/inventory/modules/InventoryDetailModifyModal.vue index 8206249..163c1fb 100644 --- a/ant-design-vue-jeecg/src/views/system/inventory/modules/InventoryDetailModifyModal.vue +++ b/ant-design-vue-jeecg/src/views/system/inventory/modules/InventoryDetailModifyModal.vue @@ -41,7 +41,7 @@ export default { data() { return { title: "操作", - width: 800, + width: 400, visible: false, model: {}, flag: 0, diff --git a/ant-design-vue-jeecg/src/views/system/task/ReceiptTaskHeaderList.vue b/ant-design-vue-jeecg/src/views/system/task/ReceiptTaskHeaderList.vue index 79b5569..ea571bf 100644 --- a/ant-design-vue-jeecg/src/views/system/task/ReceiptTaskHeaderList.vue +++ b/ant-design-vue-jeecg/src/views/system/task/ReceiptTaskHeaderList.vue @@ -56,6 +56,11 @@ <a-input placeholder="请输入目标出入口" v-model="queryParam.toPortCode"></a-input> </a-form-item> </a-col> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="入库单ID"> + <a-input placeholder="请输入入库单ID" v-model="queryParam.receiptId"></a-input> + </a-form-item> + </a-col> <a-col :xl="12" :lg="14" :md="16" :sm="24"> <a-form-item label="创建日期"> <j-date :show-date="true" date-format="YYYY-MM-DD" placeholder="请选择开始时间" diff --git a/ant-design-vue-jeecg/src/views/system/task/ShipmentTaskHeaderList.vue b/ant-design-vue-jeecg/src/views/system/task/ShipmentTaskHeaderList.vue index ba685e0..5b7fe14 100644 --- a/ant-design-vue-jeecg/src/views/system/task/ShipmentTaskHeaderList.vue +++ b/ant-design-vue-jeecg/src/views/system/task/ShipmentTaskHeaderList.vue @@ -56,6 +56,11 @@ <a-input placeholder="请输入目标出入口" v-model="queryParam.toPortCode"></a-input> </a-form-item> </a-col> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="出库单ID"> + <a-input placeholder="请输入出库单ID" v-model="queryParam.shipmentId"></a-input> + </a-form-item> + </a-col> <a-col :xl="12" :lg="14" :md="16" :sm="24"> <a-form-item label="创建日期"> <j-date :show-date="true" date-format="YYYY-MM-DD" placeholder="请选择开始时间" diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/LocationAllocationService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/LocationAllocationService.java index 4666f31..714e487 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/LocationAllocationService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/LocationAllocationService.java @@ -5,14 +5,20 @@ import java.util.List; public interface LocationAllocationService { /** - * 获得库位分配的库位 + * 库位分配 */ String allocation(int locationRule, List<String> locationTypeCodeList, int high, String zoneCode, List<Integer> raodWays, String warehouseCode, String containerCode, String materialAreaCode, String materialCode, boolean bypass); + /** + * 双伸位库位分配 + */ String doubleRk(String zoneCode, List<Integer> roadWays, int high, String warehouseCode, List<String> locationTypeCodeList, String materialAreaCode, String materialCode, boolean bypass); + /** + * 单伸位库位分配 + */ String singleRk(String zoneCode, List<Integer> roadWays, int high, String warehouseCode, List<String> locationTypeCodeList, String materialAreaCode, String materialCode); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/LocationAllocationServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/LocationAllocationServiceImpl.java index 4ff19f8..30377b4 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/LocationAllocationServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/LocationAllocationServiceImpl.java @@ -28,10 +28,10 @@ import org.jeecg.utils.StringUtils; import org.jeecg.utils.constant.QuantityConstant; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -93,7 +93,7 @@ public class LocationAllocationServiceImpl implements LocationAllocationService case QuantityConstant.SINGLE_FORK: return locationAllocationService.singleRk(zoneCode, raodWays, high, warehouseCode, mergelocationTypeCodeList, materialAreaCode, materialCode); } - return null; + throw new JeecgBootException("分配库位时, 没有找到分配规则"); } /** @@ -103,7 +103,7 @@ public class LocationAllocationServiceImpl implements LocationAllocationService @Transactional(rollbackFor = Exception.class) public String doubleRk(String zoneCode, List<Integer> roadWays, int high, String warehouseCode, List<String> locationTypeCodeList, String materialAreaCode, String materialCode, boolean bypass) { - if (roadWays == null || roadWays.size() < 1) { + if (CollectionUtils.isEmpty(roadWays)) { roadWays = locationService.getRoadWayByZoneCode(zoneCode, warehouseCode); } String value = parameterConfigurationService.getValueByCode(QuantityConstant.DOUBLE_FORK_RESERVE_LOCATION); @@ -128,7 +128,6 @@ public class LocationAllocationServiceImpl implements LocationAllocationService LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery(); locationLambdaQueryWrapper.eq(Location::getZoneCode, zoneCode).eq(Location::getWarehouseCode, warehouseCode).eq(Location::getRoadWay, roadWay) .eq(Location::getStatus, QuantityConstant.STATUS_LOCATION_EMPTY).ge(Location::getHigh, high).eq(Location::getEnable, QuantityConstant.STATUS_ENABLE) - .eq(StringUtils.isNotEmpty(materialAreaCode), Location::getMaterialAreaCode, materialAreaCode) .in(Location::getLocationTypeCode, locationTypeCodeList).eq(Location::getContainerCode, QuantityConstant.EMPTY_STRING) .orderByAsc(true, Location::getHigh).orderByAsc(true, Location::getLayer).orderByAsc(true, Location::getId); Page<Location> page = new Page<Location>(1, searchNumber, false); @@ -154,7 +153,7 @@ public class LocationAllocationServiceImpl implements LocationAllocationService IPage iPage = locationService.page(page, locationLambda); List<Location> locationList = iPage.getRecords(); List<Location> removeLocaationList = new ArrayList<>(); - if (locationList.size() > 0) { + if (CollectionUtils.isNotEmpty(locationList)) { for (Location location1 : locationList) { // 旁边有任务的库位,不能用来分配库位 if (taskHeaderService.haveUncompleteTaskInNear(location1)) { @@ -163,7 +162,7 @@ public class LocationAllocationServiceImpl implements LocationAllocationService } } locationList.removeAll(removeLocaationList); - if (locationList.size() == 0) { + if (CollectionUtils.isEmpty(locationList)) { locationLambda = Wrappers.lambdaQuery(); locationLambda.eq(Location::getZoneCode, zoneCode).eq(Location::getWarehouseCode, warehouseCode).eq(Location::getRoadWay, roadWay) .eq(Location::getStatus, QuantityConstant.STATUS_LOCATION_EMPTY).ge(Location::getHigh, high).eq(Location::getEnable, QuantityConstant.STATUS_ENABLE) @@ -174,7 +173,7 @@ public class LocationAllocationServiceImpl implements LocationAllocationService iPage = locationService.page(page, locationLambda); locationList = iPage.getRecords(); removeLocaationList = new ArrayList<>(); - if (locationList != null && locationList.size() > 0) { + if (CollectionUtils.isNotEmpty(locationList)) { for (Location location1 : locationList) { if (taskHeaderService.haveUncompleteTaskInNear(location1)) { removeLocaationList.add(location1); @@ -183,8 +182,8 @@ public class LocationAllocationServiceImpl implements LocationAllocationService } locationList.removeAll(removeLocaationList); } - if (locationList == null || locationList.size() == 0) { - return null; + if (CollectionUtils.isEmpty(locationList)) { + throw new JeecgBootException("分配库位时,没有高度值" + high + "的库位可分配"); } Location location = locationList.stream().findFirst().orElse(null); return location.getCode(); @@ -197,7 +196,7 @@ public class LocationAllocationServiceImpl implements LocationAllocationService @Transactional(rollbackFor = Exception.class) public String singleRk(String zoneCode, List<Integer> roadWays, int high, String warehouseCode, List<String> locationTypeCodeList, String materialAreaCode, String materialCode) { - if (roadWays == null || roadWays.size() < 1) { + if (CollectionUtils.isEmpty(roadWays)) { roadWays = locationService.getRoadWayByZoneCode(zoneCode, warehouseCode); } List<Integer> removeRoadWays = new ArrayList<>(); @@ -212,12 +211,12 @@ public class LocationAllocationServiceImpl implements LocationAllocationService Page<Location> page = new Page<Location>(1, 10, false); IPage page1 = locationService.page(page, locationLambdaQueryWrapper); List<Location> totalLocationList = page1.getRecords(); - if (totalLocationList.size() <= 0) { + if (CollectionUtils.isEmpty(totalLocationList)) { removeRoadWays.add(roadWay); } } roadWays.removeAll(removeRoadWays); - if (roadWays == null || roadWays.size() == 0) { + if (CollectionUtils.isEmpty(roadWays)) { throw new JeecgBootException("分配库位时, 可用巷道为空"); } Integer roadWay = locationAllocationService.getRoadWay(roadWays, materialCode, zoneCode, warehouseCode); @@ -231,8 +230,8 @@ public class LocationAllocationServiceImpl implements LocationAllocationService Page page = new Page<Location>(1, 1, 1, false); IPage iPage = locationService.page(page, locationLambdaQueryWrapper); List<Location> locationList = iPage.getRecords(); - if (locationList == null || locationList.size() == 0) { - return null; + if (CollectionUtils.isEmpty(locationList)) { + throw new JeecgBootException("分配库位时,没有高度值" + high + "的库位可分配"); } Location location = locationList.stream().findFirst().orElse(null); return location.getCode(); @@ -302,7 +301,7 @@ public class LocationAllocationServiceImpl implements LocationAllocationService taskHeaderLambdaQueryWrapper.lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED).eq(TaskHeader::getZoneCode, zoneCode) .ne(TaskHeader::getToLocationCode, QuantityConstant.EMPTY_STRING); List<TaskHeader> taskHeaderList = taskHeaderService.list(taskHeaderLambdaQueryWrapper); - if (taskHeaderList.size() != 0) { + if (CollectionUtils.isNotEmpty(taskHeaderList)) { List<Integer> roadWayList = taskHeaderList.stream().map(TaskHeader::getRoadWay).collect(toList()); List<Integer> removeRoadWayList = new ArrayList<>(); for (Integer roadWay : roadWays) { @@ -319,7 +318,7 @@ public class LocationAllocationServiceImpl implements LocationAllocationService @Override public Integer getRoadWayByMinMaterial(List<Integer> roadWays, String materialCode, String zoneCode, String warehouseCode) { - if (roadWays == null || roadWays.size() == 0) { + if (CollectionUtils.isEmpty(roadWays)) { throw new JeecgBootException("分配库位时, 巷道为空"); } Collections.shuffle(roadWays);// 打乱巷道排序 @@ -329,7 +328,7 @@ public class LocationAllocationServiceImpl implements LocationAllocationService } int min = Integer.MAX_VALUE; List<InventoryDetail> inventoryDetailList = inventoryDetailService.getInventoryDetailListByMaterialCodeAndZoneCode(materialCode, zoneCode, warehouseCode); - if (inventoryDetailList.size() != 0) { + if (CollectionUtils.isNotEmpty(inventoryDetailList)) { List<Integer> roadWayList = inventoryDetailList.stream().map(InventoryDetail::getRoadWay).collect(toList()); roadWayList.removeAll(Collections.singleton(null)); for (Integer road : roadWays) { diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java index 0a09c47..cd1acd6 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java @@ -263,17 +263,17 @@ public class WcsServiceImpl implements WcsService { if (StringUtils.isNotEmpty(insideLocation.getContainerCode())) { Location destinationLocation = locationService.getEmptyLocation(insideLocation); if (destinationLocation == null) { - throw new JeecgBootException("创建移库任务失败, 目标库位为空"); + throw new JeecgBootException("分配库位时,创建移库任务失败目标库位为空"); } Result<TaskHeader> result = taskHeaderService.createTransferTask(insideLocation.getCode(), destinationLocation.getCode(), warehouseCode); if (!result.isSuccess()) { - throw new JeecgBootException("创建移库任务失败"); + throw new JeecgBootException("分配库位时,创建移库任务失败"); } preTaskNo = result.getResult().getId(); taskHeader.setPreTaskNo(preTaskNo); success = taskHeaderService.updatePreTaskNoById(preTaskNo, taskHeader.getId()); if (!success) { - throw new JeecgBootException("更新任务状态失败"); + throw new JeecgBootException("分配库位时,更新任务状态失败"); } } } else { @@ -297,7 +297,7 @@ public class WcsServiceImpl implements WcsService { taskHeader.setWeight(Integer.parseInt(warecellDomain.getWeight())); taskHeader.setToLocationCode(locationCode); if (!taskHeaderService.updateById(taskHeader)) { - throw new JeecgBootException("更新任务头表目标库位失败"); + throw new JeecgBootException("分配库位时,更新任务头表目标库位失败"); } WcsTask wcsTask = new WcsTask(); wcsTask.setToLocationCode(locationCode); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryDetailService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryDetailService.java index 5385b7a..096c013 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryDetailService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryDetailService.java @@ -38,6 +38,9 @@ public interface IInventoryDetailService extends IService<InventoryDetail> { // 求一种物料的库存之和(总数) BigDecimal getInventorySumQty(InventoryDetail inventoryDetail); + // 求一种物料的托盘库存之和(总数) + BigDecimal getContainerInventorySumQty(InventoryDetail inventoryDetail); + // 求一种物料的库存之和(扣除了配盘数量) BigDecimal getSumQty(InventoryDetail inventoryDetail); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryDetailServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryDetailServiceImpl.java index 22d8ab1..49d732c 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryDetailServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryDetailServiceImpl.java @@ -170,6 +170,21 @@ public class InventoryDetailServiceImpl extends ServiceImpl<InventoryDetailMappe } @Override + public BigDecimal getContainerInventorySumQty(InventoryDetail inventoryDetail) { + LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); + inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getInventoryStatus, inventoryDetail.getInventoryStatus()) + .eq(InventoryDetail::getMaterialCode, inventoryDetail.getMaterialCode()).eq(InventoryDetail::getWarehouseCode, inventoryDetail.getWarehouseCode()) + .eq(InventoryDetail::getContainerCode, inventoryDetail.getContainerCode()); + + List<InventoryDetail> inventoryDetailList = list(inventoryDetailLambdaQueryWrapper); + if (inventoryDetailList.size() == 0) { + return BigDecimal.ZERO; + } + BigDecimal totalQty = inventoryDetailList.stream().map(InventoryDetail::getQty).reduce(BigDecimal.ZERO, BigDecimal::add); + return totalQty; + } + + @Override public BigDecimal getSumQty(InventoryDetail inventoryDetail) { LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getInventoryStatus, inventoryDetail.getInventoryStatus()) diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryTransaction/entity/InventoryTransaction.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryTransaction/entity/InventoryTransaction.java index bdca244..eca01fc 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryTransaction/entity/InventoryTransaction.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryTransaction/entity/InventoryTransaction.java @@ -137,9 +137,13 @@ public class InventoryTransaction implements Serializable { @Excel(name = "出库数量", width = 15) @ApiModelProperty(value = "出库数量") private BigDecimal shipmentQty; - /** 库存数量 */ - @Excel(name = "库存数量", width = 15) - @ApiModelProperty(value = "库存数量") + /** 托盘库存数量 */ + @Excel(name = "托盘库存数量", width = 15) + @ApiModelProperty(value = "托盘库存数量") + private BigDecimal containerInventoryQty; + /** 库存总数 */ + @Excel(name = "库存总数", width = 15) + @ApiModelProperty(value = "库存总数") private BigDecimal inventoryQty; /** 批次, 批次主要用于成品,比如以生产日期为批次 */ @Excel(name = "批次", width = 15) 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 01749fb..4b179b9 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 @@ -53,6 +53,7 @@ import org.springframework.web.servlet.ModelAndView; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -106,6 +107,28 @@ public class TaskHeaderController extends HuahengBaseController { HuahengJwtUtil.setWarehouseCode(req, taskHeader); QueryWrapper<TaskHeader> queryWrapper = QueryGenerator.initQueryWrapper(taskHeader, req.getParameterMap()); queryWrapper.orderByDesc("id"); + LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = queryWrapper.lambda(); + Integer shipmentId = taskHeader.getShipmentId(); + Integer receiptId = taskHeader.getReceiptId(); + if (shipmentId != null) { + List<TaskDetail> taskDetailList = taskDetailService.getTaskDetailListByShipmentId(shipmentId); + if (CollectionUtils.isNotEmpty(taskDetailList)) { + List<Integer> taskHeaderIdList = taskDetailList.stream().distinct().map(TaskDetail::getTaskHeaderId).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(taskHeaderIdList)) { + taskHeaderLambdaQueryWrapper.in(TaskHeader::getId, taskHeaderIdList); + } + } + } + if (receiptId != null) { + List<TaskDetail> taskDetailList = taskDetailService.getTaskDetailListByReceiptId(receiptId); + if (CollectionUtils.isNotEmpty(taskDetailList)) { + List<Integer> taskHeaderIdList = taskDetailList.stream().distinct().map(TaskDetail::getTaskHeaderId).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(taskHeaderIdList)) { + taskHeaderLambdaQueryWrapper.in(TaskHeader::getId, taskHeaderIdList); + } + } + } + Page<TaskHeader> page = new Page<TaskHeader>(pageNo, pageSize); IPage<TaskHeader> pageList = taskHeaderService.page(page, queryWrapper); return Result.OK(pageList); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java index d4bba1f..f73bf1c 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java @@ -9,6 +9,7 @@ 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; @@ -190,4 +191,12 @@ public class TaskHeader implements Serializable { /** 完成时间(完成任务时间) */ @ApiModelProperty(value = "完成时间") private Date completeTime; + /** 出库单ID */ + @TableField(exist = false) + @ApiModelProperty(value = "出库单ID") + private Integer shipmentId; + /** 入库单ID */ + @TableField(exist = false) + @ApiModelProperty(value = "入库单ID") + private Integer receiptId; } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskDetailService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskDetailService.java index 2eb87ec..51b7fd3 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskDetailService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskDetailService.java @@ -1,10 +1,10 @@ package org.jeecg.modules.wms.task.taskHeader.service; -import com.baomidou.mybatisplus.extension.service.IService; -import org.jeecg.modules.wms.config.location.entity.Location; +import java.util.List; + import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail; -import java.util.List; +import com.baomidou.mybatisplus.extension.service.IService; /** * @Description: 任务详情 @@ -22,4 +22,18 @@ public interface ITaskDetailService extends IService<TaskDetail> { * @return */ List<TaskDetail> getTaskDetailListByTaskId(Integer id); + + /** + * 根据出库单ID查询任务明细 + * @param shipmentId + * @return + */ + List<TaskDetail> getTaskDetailListByShipmentId(Integer shipmentId); + + /** + * 根据出库单ID查询任务明细 + * @param receiptId + * @return + */ + List<TaskDetail> getTaskDetailListByReceiptId(Integer receiptId); } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskDetailServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskDetailServiceImpl.java index a522354..fca060b 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskDetailServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskDetailServiceImpl.java @@ -1,21 +1,20 @@ package org.jeecg.modules.wms.task.taskHeader.service.impl; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import org.jeecg.modules.wms.config.location.entity.Location; +import java.util.List; + +import javax.annotation.Resource; + import org.jeecg.modules.wms.config.location.service.ILocationService; import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail; -import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; import org.jeecg.modules.wms.task.taskHeader.mapper.TaskDetailMapper; import org.jeecg.modules.wms.task.taskHeader.service.ITaskDetailService; import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService; -import org.jeecg.utils.constant.QuantityConstant; -import org.springframework.stereotype.Service; -import java.util.List; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; -import javax.annotation.Resource; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; /** * @Description: 任务详情 @@ -46,4 +45,20 @@ public class TaskDetailServiceImpl extends ServiceImpl<TaskDetailMapper, TaskDet return taskDetailList; } + @Override + public List<TaskDetail> getTaskDetailListByShipmentId(Integer shipmentId) { + LambdaQueryWrapper<TaskDetail> taskDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); + taskDetailLambdaQueryWrapper.eq(TaskDetail::getShipmentId, shipmentId); + List<TaskDetail> taskDetailList = list(taskDetailLambdaQueryWrapper); + return taskDetailList; + } + + @Override + public List<TaskDetail> getTaskDetailListByReceiptId(Integer receiptId) { + LambdaQueryWrapper<TaskDetail> taskDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); + taskDetailLambdaQueryWrapper.eq(TaskDetail::getReceiptId, receiptId); + List<TaskDetail> taskDetailList = list(taskDetailLambdaQueryWrapper); + return taskDetailList; + } + } 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 b90d23c..2c4fe4a 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 @@ -1386,10 +1386,14 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea 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); } @@ -1620,7 +1624,10 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea inventoryTransaction.setQty(taskDetail.getQty()); inventoryTransaction.setShipmentQty(taskDetail.getQty()); BigDecimal inventoryQty = inventoryDetailService.getInventorySumQty(inventoryDetail); + // 获得物料在这个托盘上的库存数 + BigDecimal containerInventoryQty = inventoryDetailService.getContainerInventorySumQty(inventoryDetail); inventoryTransaction.setInventoryQty(inventoryQty); + inventoryTransaction.setContainerInventoryQty(containerInventoryQty); inventoryTransactionList.add(inventoryTransaction); shipmentIdList.add(taskDetail.getShipmentId()); } @@ -1714,7 +1721,10 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea inventoryTransaction.setQty(inventoryDetail.getQty()); inventoryTransaction.setShipmentQty(inventoryDetail.getQty()); BigDecimal inventoryQty = inventoryDetailService.getInventorySumQty(inventoryDetail); + // 获得物料在这个托盘上的库存数 + BigDecimal containerInventoryQty = inventoryDetailService.getContainerInventorySumQty(inventoryDetail); inventoryTransaction.setInventoryQty(inventoryQty); + inventoryTransaction.setContainerInventoryQty(containerInventoryQty); inventoryTransactionList.add(inventoryTransaction); if (!inventoryDetailService.removeById(inventoryDetail)) { throw new JeecgBootException("完成整盘出库任务,删除库存详情失败" + inventoryDetail.getId());