diff --git a/nladmin-system/nlsso-server/nlsso-server.iml b/nladmin-system/nlsso-server/nlsso-server.iml new file mode 100644 index 0000000..6fe4a4b --- /dev/null +++ b/nladmin-system/nlsso-server/nlsso-server.iml @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.xml b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.xml index bda358b..2b3d9ce 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.xml +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.xml @@ -136,10 +136,17 @@ AND - (mater.material_code LIKE #{param.material_code} or - mater.material_name LIKE #{param.material_code} ) + (mater.material_code LIKE CONCAT('%', #{param.material_code} , '%') or + mater.material_name LIKE CONCAT('%', #{param.material_code} , '%')) + + + AND + ext.storagevehicle_code LIKE CONCAT('%', #{param.storagevehicle_code} , '%') + + + AND ext.pcsn LIKE #{param.pcsn} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/base/FIFORuleHandler.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/base/FIFORuleHandler.java index beb8b16..f153bed 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/base/FIFORuleHandler.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/base/FIFORuleHandler.java @@ -1,6 +1,5 @@ package org.nl.wms.decision_manage.service.strategyConfig.decisioner.impl.base; -import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.nl.common.exception.BadRequestException; @@ -16,8 +15,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; -import java.util.*; -import java.util.stream.Collectors; +import java.util.ArrayList; +import java.util.List; /* * @author ZZQ @@ -50,7 +49,7 @@ public class FIFORuleHandler extends Decisioner divStruct = new ArrayList<>(); for (StructattrVechielDto vechielDto : vechielDtos) { diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/AcsToWmsServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/AcsToWmsServiceImpl.java index 88ef434..dd3f1c0 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/AcsToWmsServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/AcsToWmsServiceImpl.java @@ -35,9 +35,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** *

@@ -261,9 +262,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { "该任务申请托盘["+vehicle_code+"]为空,无法申请任务!"); } //判断该子托盘是否存在未完成任务 - Integer sub_tray_lists = iSchBaseTaskService.findUnFinishTasksBySub_tray(vehicle_code); - Assert.isFalse(sub_tray_lists>0, - "该任务申请托盘["+vehicle_code+"]已存在未完成的任务,无法申请任务!"); + // Integer sub_tray_lists = iSchBaseTaskService.findUnFinishTasksBySub_tray(vehicle_code); + // Assert.isFalse(sub_tray_lists>0, + // "该任务申请托盘["+vehicle_code+"]已存在未完成的任务,无法申请任务!"); //todo 仅生成任务,不生成单据 // 校验数据 @@ -275,44 +276,39 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { throw new BadRequestException(LangBehavior.language("pda_manage.start_point_not_exist")); } + //查询是否有执行中的点位 + //找到空点位正在执行的任务 + List taskingSchBaseTaskList = iSchBaseTaskService.list(new LambdaQueryWrapper() + .eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO) + .le(SchBaseTask::getTask_status, TaskStatus.EXECUTING.getCode())); + + + List pointList = Optional.ofNullable(taskingSchBaseTaskList) + .orElse(Collections.emptyList()) + .stream() + .flatMap(task -> Stream.of(task.getPoint_code1(), task.getPoint_code2())) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + //计算终点点位 List end_point_code_list = iStructattrService.list(new LambdaUpdateWrapper() .eq(Structattr::getSect_code,"FJError") .eq(Structattr::getIs_used, 1) .isNull(Structattr::getStoragevehicle_code) + .notIn(CollectionUtils.isNotEmpty(pointList),Structattr::getStruct_code,pointList) .eq(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) - .orderByDesc(Structattr::getUpdate_time)); + .orderByDesc(Structattr::getUpdate_time) + .last("LIMIT 1")); if(CollectionUtils.isEmpty(end_point_code_list)){ throw new BadRequestException(LangBehavior.language("pda_manage.end_point_not_exist")); } - - // 校验终点 Structattr end_point = end_point_code_list.get(0); - - //查询是否有执行中的点位 - //找到空点位正在执行的任务 - List taskingSchBaseTaskList = iSchBaseTaskService.list(new LambdaQueryWrapper() - .eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO) - .and(wp -> wp - .eq(SchBaseTask::getPoint_code1, end_point.getStruct_code()) - .or() - .eq(SchBaseTask::getPoint_code2, end_point.getStruct_code()) - .or() - .eq(SchBaseTask::getPoint_code1, start_point.getStruct_code()) - .or() - .eq(SchBaseTask::getPoint_code2, start_point.getStruct_code()) - ) - .le(SchBaseTask::getTask_status, TaskStatus.EXECUTING.getCode())); - - if (CollectionUtils.isNotEmpty(taskingSchBaseTaskList)) { - throw new BadRequestException(LangBehavior.language("pda_manage.ongoing_task_at_point")); - } - start_point.setLock_type(IOSEnum.LOCK_TYPE.code("其他锁")); - iStructattrService.updateById(start_point); - end_point.setLock_type(IOSEnum.LOCK_TYPE.code("其他锁")); - iStructattrService.updateById(end_point); + start_point.setLock_type(IOSEnum.LOCK_TYPE.code("其他锁")); + iStructattrService.updateById(start_point); + end_point.setLock_type(IOSEnum.LOCK_TYPE.code("其他锁")); + iStructattrService.updateById(end_point); // 创建任务 JSONObject task = new JSONObject(); task.put("config_code", IOSConstant.ACS_ERROR_TASK); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/controller/PdaIosOutController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/controller/PdaIosOutController.java index fea3c6c..5d85fa0 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/controller/PdaIosOutController.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/controller/PdaIosOutController.java @@ -16,6 +16,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import static org.nl.common.utils.ValidationUtil.assertNotBlankJson; + /** * 手持出库管理 * @@ -64,6 +66,26 @@ public class PdaIosOutController { return new ResponseEntity<>(pdaIosOutService.callMaterialConfirm(whereJson), HttpStatus.OK); } + /** + * 出库分拣提交 + */ + @PostMapping("/outSortingSubmit") + @Log("出库分拣提交") + public ResponseEntity outSortingSubmit(@RequestBody JSONObject whereJson) { + assertNotBlankJson(whereJson, "请求参数不能为空", "out_struct_code", "out_vehicle_code","return_vehicle_code"); + return new ResponseEntity<>(pdaIosOutService.outSortingSubmit(whereJson), HttpStatus.OK); + } + + /** + * 出库分拣 + */ + @PostMapping("/getOutAndReturnNumByReturnVehicleCode") + @Log("根据回库托盘码获取回库数量和出库数量") + public ResponseEntity getOutAndReturnNumByReturnVehicleCode(@RequestBody JSONObject whereJson) { + assertNotBlankJson(whereJson, "请求参数不能为空", "return_vehicle_code"); + return new ResponseEntity<>(pdaIosOutService.getOutAndReturnNumByReturnVehicleCode(whereJson), HttpStatus.OK); + } + /** * 出库确认获取物料明细 diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosOutService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosOutService.java index 3408226..8fcdcd2 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosOutService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosOutService.java @@ -23,6 +23,16 @@ public interface PdaIosOutService { */ PdaResponse getDtl(JSONObject whereJson); + /** + * 获取库存明细 + * + * @param whereJson { + * vehicle_code: 载具码 + * } + * @return PdaResponse + */ + JSONObject getOutAndReturnNumByReturnVehicleCode(JSONObject whereJson); + /** * 获取物料库存明细 @@ -58,5 +68,17 @@ public interface PdaIosOutService { */ JSONObject callMaterialConfirm(JSONObject whereJson); + /** + * 出库分拣提交 + * + * @param whereJson { + * return_vehicle_code: 载具码 + * out_vehicle_code: 点位编码, + * out_struct_code: 楼层 + * } + * @return PdaResponse + */ + JSONObject outSortingSubmit(JSONObject whereJson); + } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosOutServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosOutServiceImpl.java index cb74364..083e803 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosOutServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosOutServiceImpl.java @@ -6,26 +6,43 @@ import cn.hutool.http.HttpStatus; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.CodeUtil; import org.nl.common.utils.IdUtil; -import org.nl.language.LangBehavior; import org.nl.common.utils.MapOf; import org.nl.common.utils.SecurityUtils; import org.nl.config.SpringContextHolder; +import org.nl.language.LangBehavior; import org.nl.wms.basedata_manage.enums.BaseDataEnum; +import org.nl.wms.basedata_manage.service.IBsrealStorattrService; import org.nl.wms.basedata_manage.service.IMdMeMaterialbaseService; +import org.nl.wms.basedata_manage.service.ISectattrService; import org.nl.wms.basedata_manage.service.IStructattrService; -import org.nl.wms.basedata_manage.service.dao.*; +import org.nl.wms.basedata_manage.service.dao.BsrealStorattr; +import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase; +import org.nl.wms.basedata_manage.service.dao.Sectattr; +import org.nl.wms.basedata_manage.service.dao.Structattr; import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper; +import org.nl.wms.basedata_manage.service.dto.StrategyStructParam; import org.nl.wms.pda_manage.ios_manage.service.PdaIosOutService; import org.nl.wms.pda_manage.util.PdaResponse; import org.nl.wms.sch_manage.enums.StatusEnum; +import org.nl.wms.sch_manage.enums.TaskEnum; +import org.nl.wms.sch_manage.enums.TaskStatus; import org.nl.wms.sch_manage.service.ISchBasePointService; +import org.nl.wms.sch_manage.service.ISchBaseTaskService; import org.nl.wms.sch_manage.service.dao.SchBasePoint; +import org.nl.wms.sch_manage.service.dao.SchBaseTask; +import org.nl.wms.sch_manage.service.util.tasks.MovePointTask; import org.nl.wms.sch_manage.service.util.tasks.StOutTask; +import org.nl.wms.warehouse_manage.enums.IOSConstant; import org.nl.wms.warehouse_manage.enums.IOSEnum; +import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService; +import org.nl.wms.warehouse_manage.service.IOutBillService; import org.nl.wms.warehouse_manage.service.dao.GroupPlate; import org.nl.wms.warehouse_manage.service.dao.IOStorInv; import org.nl.wms.warehouse_manage.service.dao.IOStorInvDis; @@ -34,11 +51,14 @@ import org.nl.wms.warehouse_manage.service.dao.mapper.IOStorInvDisMapper; import org.nl.wms.warehouse_manage.service.dao.mapper.IOStorInvDtlMapper; import org.nl.wms.warehouse_manage.service.dao.mapper.IOStorInvMapper; import org.nl.wms.warehouse_manage.service.dao.mapper.MdPbGroupplateMapper; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; + import javax.annotation.Resource; -import java.util.List; +import java.math.BigDecimal; +import java.util.*; import static org.nl.wms.warehouse_manage.enums.IOSEnum.GROUP_PLATE_STATUS; @@ -62,6 +82,16 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { */ @Autowired private ISchBasePointService iSchBasePointService; + + @Resource + private ISectattrService iSectattrService; + + /** + * 仓库实物表服务 + */ + @Autowired + private IBsrealStorattrService iBsrealStorattrService; + /** * 出入库单主表 */ @@ -73,12 +103,21 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { */ @Autowired private IMdMeMaterialbaseService iMdMeMaterialbaseService; + + @Resource + private IOutBillService outBillService; /** * 载具扩展属性服务 */ @Resource private MdPbStoragevehicleextMapper mdPbStoragevehicleextMapper; + @Resource + private IMdPbGroupplateService iMdPbGroupplateService; + + @Autowired + private ISchBaseTaskService schBaseTaskService; + /** * 仓位服务 */ @@ -102,6 +141,41 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { return PdaResponse.requestParamOk(mdPbStoragevehicleextMapper.getIosDtl(whereJson)); } + @Override + public JSONObject getOutAndReturnNumByReturnVehicleCode(JSONObject whereJson) { + if(StringUtils.isBlank(whereJson.getString("return_vehicle_code"))){ + throw new BadRequestException("未传入载具编码"); + } + + List groupPlates = iMdPbGroupplateService.list(new QueryWrapper() + .eq("storagevehicle_code", whereJson.getString("return_vehicle_code")) + .eq("status", IOSEnum.GROUP_PLATE_STATUS.code("入库"))); + + if(CollectionUtils.isEmpty(groupPlates)){ + throw new BadRequestException("回库托盘码"+whereJson.getString("return_vehicle_code")+"不存在,请核对!"); + } + + List structattrList = iStructattrService.list(new LambdaUpdateWrapper() + .eq(Structattr::getSect_code,"FJOutboundSorting") + .eq(Structattr::getIs_used, 1) + .eq(Structattr::getStoragevehicle_code, whereJson.getString("return_vehicle_code")) + ); + + if(CollectionUtils.isEmpty(structattrList)){ + throw new BadRequestException("回库托盘码"+whereJson.getString("return_vehicle_code")+"在分拣库区不存在,请核对!"); + } + + Map outMap = new HashMap<>(); + outMap.put("out_num",groupPlates.get(0).getFrozen_qty().toString()); + outMap.put("return_num",(groupPlates.get(0).getQty().subtract(groupPlates.get(0).getFrozen_qty())).toString()); + + JSONObject ret = new JSONObject(); + ret.put("status", String.valueOf(HttpStatus.HTTP_OK)); + ret.put("message","查询成功"); + ret.put("data",outMap); + return ret; + } + @Override public JSONObject getMaterialDtl(JSONObject whereJson) { @@ -205,6 +279,196 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { return ret; } + @Override + @Transactional + public JSONObject outSortingSubmit(JSONObject whereJson) { + String return_vehicle_code = whereJson.getString("return_vehicle_code"); + String out_vehicle_code = whereJson.getString("out_vehicle_code"); + String out_struct_code = whereJson.getString("out_struct_code"); + + List structattrList = iStructattrService.list(new LambdaUpdateWrapper() + .eq(Structattr::getStoragevehicle_code, return_vehicle_code) + .eq(Structattr::getSect_code,"FJOutboundSorting")); + if(CollectionUtils.isEmpty(structattrList)){ + throw new BadRequestException("回库点位,请核对"); + } + Structattr structattr = structattrList.get(0); + + + + //找到空点位正在执行的任务 + List taskingSchBaseTaskList = schBaseTaskService.list(new LambdaQueryWrapper() + .eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO) + .and(wp -> wp + .eq(SchBaseTask::getPoint_code1, out_struct_code) + .or() + .eq(SchBaseTask::getPoint_code2, out_struct_code) + .or() + .eq(SchBaseTask::getVehicle_code, out_vehicle_code) + .or() + .eq(SchBaseTask::getVehicle_code, return_vehicle_code) + ) + .le(SchBaseTask::getTask_status, TaskStatus.EXECUTING.getCode())); + + if (CollectionUtils.isNotEmpty(taskingSchBaseTaskList)) { + throw new BadRequestException(LangBehavior.language("pda_manage.ongoing_task_at_point")); + } + + //根据旧的托盘查找组盘表 + List groupPlates = iMdPbGroupplateService.list(new QueryWrapper() + .eq("storagevehicle_code", whereJson.getString("return_vehicle_code")) + .eq("status", IOSEnum.GROUP_PLATE_STATUS.code("入库"))); + + if(CollectionUtils.isEmpty(groupPlates)){ + throw new BadRequestException("回库托盘码"+whereJson.getString("return_vehicle_code")+"不存在,请核对!"); + } + + GroupPlate newGroupPlate = new GroupPlate(); + + //插入新的组盘表 + BeanUtils.copyProperties(groupPlates.get(0),newGroupPlate); + newGroupPlate.setGroup_id(IdUtil.getStringId()); + newGroupPlate.setStoragevehicle_code(out_vehicle_code); + newGroupPlate.setQty(newGroupPlate.getFrozen_qty()); + + //判断是否存在这个托盘 + List outGroupPlates = iMdPbGroupplateService.list(new QueryWrapper() + .eq("storagevehicle_code", whereJson.getString("out_vehicle_code")) + .eq("status", IOSEnum.GROUP_PLATE_STATUS.code("入库"))); + + if(CollectionUtils.isNotEmpty(outGroupPlates)){ + throw new BadRequestException("出库托盘码"+whereJson.getString("out_vehicle_code")+"重复,请核对!"); + } + iMdPbGroupplateService.save(newGroupPlate); + + //修改旧的组盘表的数量 + GroupPlate oldGroupPlate = groupPlates.get(0); + oldGroupPlate.setQty(oldGroupPlate.getQty().subtract(oldGroupPlate.getFrozen_qty())); + oldGroupPlate.setFrozen_qty(new BigDecimal(0)); + iMdPbGroupplateService.updateById(oldGroupPlate); + + //1、下发一个回去任务,通过接口查询回库点位 + + JSONObject lock_map = new JSONObject(); + lock_map.put("struct_code", structattr.getStruct_code()); + lock_map.put("lock_type", IOSEnum.LOCK_TYPE.code("入库锁")); + iStructattrService.updateStatusByCode("0", lock_map); + + JSONObject jsonTask = new JSONObject(); + jsonTask.put("config_code", IOSConstant.MOVE_POINT_CONFIG_TASK); + jsonTask.put("point_code1", structattr.getStruct_code()); + //计算 + + // 查询所有库区 + // 查询所有库区 + List allSects = iSectattrService.list(new LambdaQueryWrapper<>(Sectattr.class) + .eq(Sectattr::getIs_delete,"0") + .eq(Sectattr::getSect_code,"FJ01") + .ne(Sectattr::getSect_code,"SSX") + .ne(Sectattr::getSect_code,"FJOutboundSorting") + .ne(Sectattr::getSect_code,"FJError") + .ne(Sectattr::getSect_code,"FJWaitingMaterial")); + + if (CollectionUtils.isEmpty(allSects)) { + throw new BadRequestException(LangBehavior.language("warehouse_manage.cannot_find_available_sector")); + } + + // 判断库区货位占有率 + Map sectOccupancyRateMap = new HashMap<>(); + for (Sectattr sect : allSects) { + BigDecimal occupancyRate = iStructattrService.calculateSectOccupancyRate(sect.getSect_code()); + sectOccupancyRateMap.put(sect, occupancyRate); + } + + JSONObject dis_form = new JSONObject(); + + // 选择占有率小的库区 + Optional> minEntry = sectOccupancyRateMap.entrySet().stream() + .min(Map.Entry.comparingByValue()); + if (minEntry.isPresent()) { + dis_form.put("sect_id", minEntry.get().getKey().getSect_id()); + dis_form.put("stor_id", minEntry.get().getKey().getStor_id()); + dis_form.put("sect_code", minEntry.get().getKey().getSect_id()); + dis_form.put("stor_code", minEntry.get().getKey().getStor_id()); + } else { + throw new BadRequestException(LangBehavior.language("warehouse_manage.cannot_select_suitable_sector")); + } + + BsrealStorattr stor = iBsrealStorattrService.findById(dis_form.getString("stor_code")); + Sectattr sect = iSectattrService.findById(dis_form.getString("sect_code")); + MdMeMaterialbase mdMeMaterialbase = iMdMeMaterialbaseService.getByCode(oldGroupPlate.getMaterial_id()); + List structattrs = iStructattrService.inBoundSectDiv( + StrategyStructParam.builder() + .ioType(StatusEnum.STRATEGY_TYPE.code("入库")) + .sect_code(sect.getSect_code()) + .stor_code(stor.getStor_code()) + .material_code(mdMeMaterialbase.getMaterial_code()) + .qty(oldGroupPlate.getQty()) + .pcsn(oldGroupPlate.getPcsn()) + .build()); + Structattr struct = structattrs.get(0); + + lock_map = new JSONObject(); + lock_map.put("struct_code", struct.getStruct_code()); + lock_map.put("lock_type", IOSEnum.LOCK_TYPE.code("入库锁")); + iStructattrService.updateStatusByCode("0", lock_map); + + jsonTask.put("point_code2", struct.getStruct_code()); + jsonTask.put("vehicle_code", oldGroupPlate.getStoragevehicle_code()); + jsonTask.put("Priority", TaskEnum.ACS_PRIORITY.code("1")); + MovePointTask movePointTask = SpringContextHolder.getBean("MovePointTask"); + String task_id = movePointTask.create(jsonTask); + + //2、下发出库任务,需要将旧托盘 + //需要修改IOS分配表(看一下三张表是否都需要修改)、 出库区的当前托盘码,需要加锁,需要修改分配表的库区出库点位,需要更新TASKID + //需要修改IOS分配表(看一下三张表是否都需要修改)、 需要修改分配表的库区出库点位,需要更新TASKID + List disList = ioStorInvDisMapper.selectList( + new QueryWrapper().lambda() + .eq(IOStorInvDis::getStoragevehicle_code, oldGroupPlate.getStoragevehicle_code() + ) + .eq(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("生成") + ) + ); + + if(CollectionUtils.isEmpty(disList)){ + throw new BadRequestException("托盘编码为空"); + } + IOStorInvDis updateDis = disList.get(0); + + lock_map = new JSONObject(); + lock_map.put("struct_code", out_struct_code); + lock_map.put("lock_type", IOSEnum.LOCK_TYPE.code("出库锁")); + iStructattrService.updateStatusByCode("0", lock_map); + + JSONObject task_form = new JSONObject(); + task_form.put("task_type", "STOutTask"); + task_form.put("TaskCode",CodeUtil.getNewCode("TASK_CODE")); + task_form.put("PickingLocation", out_struct_code); + task_form.put("PlacedLocation", updateDis.getPoint_code()); + task_form.put("floor_code",updateDis.getFloor_code()); + task_form.put("vehicle_code", out_vehicle_code); + StOutTask stOutTask = SpringContextHolder.getBean("STOutTask"); + String out_task_id = stOutTask.create(task_form); + + Structattr outStructattr = iStructattrService.getByCode(out_struct_code); + + updateDis.setSect_id(outStructattr.getSect_id()); + updateDis.setSect_code(outStructattr.getSect_code()); + updateDis.setSect_name(outStructattr.getSect_name()); + updateDis.setStruct_id(outStructattr.getStruct_id()); + updateDis.setStruct_code(outStructattr.getStruct_code()); + updateDis.setStruct_name(outStructattr.getStruct_name()); + updateDis.setTask_id(out_task_id); + updateDis.setStoragevehicle_code(out_vehicle_code); + ioStorInvDisMapper.updateById(updateDis); + + JSONObject ret = new JSONObject(); + ret.put("status", String.valueOf(HttpStatus.HTTP_OK)); + ret.put("message","提交成功"); + ret.put("data",null); + return ret; + } + private String createOutBills(JSONObject whereJson) { String now = DateUtil.now(); String currentUserId = SecurityUtils.getCurrentUserId(); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/sch_manage/service/impl/PdaSchPointServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/sch_manage/service/impl/PdaSchPointServiceImpl.java index 96933be..4fe7418 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/sch_manage/service/impl/PdaSchPointServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/sch_manage/service/impl/PdaSchPointServiceImpl.java @@ -4,7 +4,9 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpStatus; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.apache.commons.collections4.CollectionUtils; import org.nl.common.exception.BadRequestException; import org.nl.language.LangBehavior; import org.nl.wms.basedata_manage.service.IStructattrService; @@ -39,12 +41,22 @@ public class PdaSchPointServiceImpl implements PdaSchPointService { public JSONObject getPoint(JSONObject whereJson) { // 载具号 List list = stIvtMoveinvdtlMapper.querydtl(whereJson); - JSONObject ret = new JSONObject(); + + if(CollectionUtils.isEmpty(list)){ + List structattrList = iStructattrService.list(new LambdaUpdateWrapper() + .eq(Structattr::getStruct_code, whereJson.getString("struct_code"))); + if (CollectionUtils.isNotEmpty(structattrList)){ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("group_id","1"); + jsonObject.put("storagevehicle_code",structattrList.get(0).getStoragevehicle_code()); + list.add(jsonObject); + } + } + ret.put("data",list); ret.put("status", String.valueOf(HttpStatus.HTTP_OK)); ret.put("message","查询成功"); - ret.put("data",list); - return ret; + return ret; } @Override @Transactional @@ -107,7 +119,7 @@ public class PdaSchPointServiceImpl implements PdaSchPointService { throw new BadRequestException(LangBehavior.language("pda_manage.point_not_found", struct_code)); } if(ObjectUtil.isEmpty(struct.getStoragevehicle_code())){ - throw new BadRequestException(LangBehavior.language("pda_manage.point_no_vehicle_need_unbind", struct_code, vehicle_code)); + throw new BadRequestException(LangBehavior.language("pda_manage.point_no_vehicle_need_unbind", struct_code, "")); } iStructattrService.update( diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pm_manage/service/dao/mapper/xml/PmFormDataMapper.xml b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pm_manage/service/dao/mapper/xml/PmFormDataMapper.xml index 3218e4b..f0b460b 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pm_manage/service/dao/mapper/xml/PmFormDataMapper.xml +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pm_manage/service/dao/mapper/xml/PmFormDataMapper.xml @@ -179,6 +179,9 @@ and form_data LIKE '%${query.search}%' + + and vehicle_code LIKE '%${query.vehicle_code}%' + and form_type = #{query.form_type} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pm_manage/service/dto/FormDataQuery.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pm_manage/service/dto/FormDataQuery.java index c2014fb..d0bcd30 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pm_manage/service/dto/FormDataQuery.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pm_manage/service/dto/FormDataQuery.java @@ -26,6 +26,7 @@ public class FormDataQuery extends BaseQuery { private String[] status; private String start_time; private String end_time; + private String vehicle_code; private Map form_query; @Override diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java index 42a84c4..e523c3a 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java @@ -7,14 +7,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.apache.commons.collections4.CollectionUtils; import org.nl.common.exception.BadRequestException; -import org.nl.config.language.LangProcess; -import org.nl.common.utils.SecurityUtils; import org.nl.common.utils.IdUtil; +import org.nl.common.utils.SecurityUtils; import org.nl.language.LangBehavior; import org.nl.wms.basedata_manage.enums.BaseDataEnum; import org.nl.wms.sch_manage.enums.TaskStatus; import org.nl.wms.sch_manage.service.ISchBaseTaskService; -import org.nl.wms.sch_manage.service.dao.SchBaseRegion; import org.nl.wms.sch_manage.service.dao.SchBaseTask; import org.nl.wms.sch_manage.service.util.AbstractTask; import org.nl.wms.sch_manage.service.util.AcsTaskDto; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/enums/IOSConstant.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/enums/IOSConstant.java index 36cef80..70fa81b 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/enums/IOSConstant.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/enums/IOSConstant.java @@ -57,6 +57,11 @@ public class IOSConstant { */ public final static String MOVE_CONFIG_TASK = "MoveTask"; + /** + * 移库点位任务类编码 + */ + public final static String MOVE_POINT_CONFIG_TASK = "MovePointTask"; + /** * 余料回库任务类编码 */ diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/impl/OutBillServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/impl/OutBillServiceImpl.java index a1f5355..4347924 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/impl/OutBillServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/impl/OutBillServiceImpl.java @@ -12,35 +12,35 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.collections4.CollectionUtils; import org.nl.common.domain.query.PageQuery; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.CodeUtil; import org.nl.common.utils.IdUtil; import org.nl.common.utils.SecurityUtils; -import org.nl.config.language.LangProcess; -import org.nl.language.LangBehavior; import org.nl.config.SpringContextHolder; import org.nl.language.LangBehavior; import org.nl.wms.basedata_manage.enums.BaseDataEnum; import org.nl.wms.basedata_manage.service.IBsrealStorattrService; -import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleextService; import org.nl.wms.basedata_manage.service.ISectattrService; import org.nl.wms.basedata_manage.service.IStructattrService; import org.nl.wms.basedata_manage.service.dao.BsrealStorattr; import org.nl.wms.basedata_manage.service.dao.Sectattr; +import org.nl.wms.basedata_manage.service.dao.Structattr; import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper; -import org.nl.wms.basedata_manage.service.dto.MdPbStoragevehicleextDto; import org.nl.wms.basedata_manage.service.dto.StrategyStructMaterialVO; import org.nl.wms.basedata_manage.service.dto.StrategyStructParam; import org.nl.wms.basedata_manage.service.dto.StructattrChangeDto; import org.nl.wms.pm_manage.service.IPmFormDataService; import org.nl.wms.pm_manage.service.dao.PmFormData; import org.nl.wms.pm_manage.service.dao.mapper.PmFormDataMapper; +import org.nl.wms.sch_manage.enums.TaskEnum; import org.nl.wms.sch_manage.enums.TaskStatus; import org.nl.wms.sch_manage.service.ISchBaseTaskService; import org.nl.wms.sch_manage.service.dao.SchBasePoint; import org.nl.wms.sch_manage.service.dao.SchBaseTask; import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper; +import org.nl.wms.sch_manage.service.util.tasks.MovePointTask; import org.nl.wms.sch_manage.service.util.tasks.StOutTask; import org.nl.wms.warehouse_manage.enums.IOSConstant; import org.nl.wms.warehouse_manage.enums.IOSEnum; @@ -53,10 +53,8 @@ import org.nl.wms.warehouse_manage.service.dao.IOStorInvDtl; import org.nl.wms.warehouse_manage.service.dao.mapper.IOStorInvDisMapper; import org.nl.wms.warehouse_manage.service.dao.mapper.IOStorInvDtlMapper; import org.nl.wms.warehouse_manage.service.dao.mapper.IOStorInvMapper; -import org.nl.wms.warehouse_manage.service.dao.mapper.MdPbGroupplateMapper; import org.nl.wms.warehouse_manage.service.dto.IOStorInvDisDto; import org.nl.wms.warehouse_manage.service.dto.IOStorInvDtlDto; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -437,14 +435,19 @@ public class OutBillServiceImpl extends ServiceImpl i lock_map.put("inv_type", ioStorInv.getBill_type()); lock_map.put("lock_type", IOSEnum.LOCK_TYPE.code("出库锁")); iStructattrService.updateStatusByCode("0",lock_map); - //更新组盘表冻结数量状态 - iMdPbGroupPlateService.update(new LambdaUpdateWrapper() - .set(GroupPlate::getFrozen_qty, outAllocation.getFrozen_qty()) - .set(GroupPlate::getUpdate_time, now) - .eq(GroupPlate::getStoragevehicle_code, outAllocation.getStoragevehicle_code()) - .eq(GroupPlate::getPcsn, outAllocation.getPcsn()) - .eq(GroupPlate::getMaterial_id, outAllocation.getMaterial_id()) - .eq(GroupPlate::getStatus,IOSEnum.GROUP_PLATE_STATUS.code("入库"))); + //更新库存 加冻结减可用 + List updateIvtList = new ArrayList<>(); + JSONObject jsonIvt = new JSONObject(); + jsonIvt.put("type", IOSConstant.UPDATE_IVT_TYPE_ADD_FROZEN); + jsonIvt.put("storagevehicle_code", outAllocation.getStoragevehicle_code()); + jsonIvt.put("material_id", outAllocation.getMaterial_id()); + jsonIvt.put("pcsn",outAllocation.getPcsn()); + jsonIvt.put("qty_unit_id", dtl.getQty_unit_id()); + jsonIvt.put("qty_unit_name", dtl.getQty_unit_name()); + jsonIvt.put("change_qty", outAllocation.getFrozen_qty()); + updateIvtList.add(jsonIvt); + iMdPbGroupPlateService.updateIvt(updateIvtList); + //生成分配明细 ioStorInvDisMapper.insert(ioStorInvDis); allocation_canuse_qty = allocation_canuse_qty.add(outAllocation.getFrozen_qty()); @@ -994,17 +997,61 @@ public class OutBillServiceImpl extends ServiceImpl i task_form.put("floor_code",floor_code); task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code()); - StOutTask stOutTask = SpringContextHolder.getBean("STOutTask"); - String task_id = stOutTask.create(task_form); + iMdPbGroupPlateService.update(new LambdaUpdateWrapper() + .set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")) + .set(GroupPlate::getUpdate_time, DateUtil.now()) + .eq(GroupPlate::getStoragevehicle_code, ioStorInvDis.getStoragevehicle_code())); - //分配明细表更新任务相关数据 + //通过托盘编码查询,如果冻结数<总数,则表明需要去分拣区 + List groupPlates = iMdPbGroupPlateService.list(new QueryWrapper() + .eq("storagevehicle_code", ioStorInvDis.getStoragevehicle_code()) + .eq("status",IOSEnum.GROUP_PLATE_STATUS.code("入库"))); + if(CollectionUtils.isEmpty(groupPlates)){ + throw new BadRequestException("找不到托盘"+ioStorInvDis.getStoragevehicle_code()); + } + if(groupPlates.get(0).getQty().compareTo(ioStorInvDis.getPlan_qty())>0) { + ioStorInvDis.setIs_issued(BaseDataEnum.IS_YES_NOT.code("是")); + } + + String task_id =""; + if(BaseDataEnum.IS_YES_NOT.code("否").equals(ioStorInvDis.getIs_issued())) { + StOutTask stOutTask = SpringContextHolder.getBean("STOutTask"); + task_id = stOutTask.create(task_form); + } + else { //如果出库数量和托盘数量不相同,则移库到分拣区 + MovePointTask movePointTask = SpringContextHolder.getBean("MovePointTask"); + task_form.put("config_code", IOSConstant.MOVE_POINT_CONFIG_TASK); + task_form.put("point_code1",ioStorInvDis.getStruct_code()); + //通过方法计算 + //todo + List structattrList = iStructattrService.list(new LambdaUpdateWrapper() + .eq(Structattr::getSect_code,"FJOutboundSorting") + .eq(Structattr::getIs_used, 1) + .isNull(Structattr::getStoragevehicle_code) + .eq(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + .orderByDesc(Structattr::getUpdate_time)); + if(CollectionUtils.isEmpty(structattrList)){ + throw new BadRequestException("出库分拣区库位不足,请先清理后再执行"); + } + + JSONObject lock_map = new JSONObject(); + lock_map.put("struct_code", structattrList.get(0).getStruct_code()); + lock_map.put("lock_type", IOSEnum.LOCK_TYPE.code("入库锁")); + iStructattrService.updateStatusByCode("0", lock_map); + + task_form.put("point_code2",structattrList.get(0).getStruct_code()); + task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code()); + task_form.put("Priority", TaskEnum.ACS_PRIORITY.code("1")); + task_id = movePointTask.create(task_form); + } IOStorInvDis dis = new IOStorInvDis(); dis.setIostorinvdis_id(ioStorInvDis.getIostorinvdis_id()); + //分配明细表更新任务相关数据 + dis.setPoint_code(point_code); dis.setWork_status(IOSEnum.INBILL_DIS_STATUS.code("生成")); dis.setTask_id(task_id); dis.setIs_issued(BaseDataEnum.IS_YES_NOT.code("是")); - dis.setPoint_code(point_code); dis.setFloor_code(floor_code); ioStorInvDisMapper.updateById(dis); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/impl/RawAssistIStorServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/impl/RawAssistIStorServiceImpl.java index a413267..e9d2ff5 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/impl/RawAssistIStorServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/impl/RawAssistIStorServiceImpl.java @@ -18,7 +18,6 @@ import org.nl.common.utils.CodeUtil; import org.nl.common.utils.IdUtil; import org.nl.common.utils.SecurityUtils; import org.nl.config.SpringContextHolder; -import org.nl.config.language.LangProcess; import org.nl.language.LangBehavior; import org.nl.wms.basedata_manage.enums.BaseDataEnum; import org.nl.wms.basedata_manage.service.IBsrealStorattrService; @@ -872,7 +871,11 @@ public class RawAssistIStorServiceImpl extends ServiceImpl allSects = iSectattrService.list(new LambdaQueryWrapper<>(Sectattr.class) .eq(Sectattr::getIs_delete,"0") - .ne(Sectattr::getSect_code,"SSX")); + .eq(Sectattr::getSect_code,"FJ01") + .ne(Sectattr::getSect_code,"SSX") + .ne(Sectattr::getSect_code,"FJOutboundSorting") + .ne(Sectattr::getSect_code,"FJError") + .ne(Sectattr::getSect_code,"FJWaitingMaterial")); if (CollectionUtils.isEmpty(allSects)) { throw new BadRequestException(LangBehavior.language("warehouse_manage.cannot_find_available_sector")); } diff --git a/nladmin-system/nlsso-server/src/main/resources/language/i18n/zh.js b/nladmin-system/nlsso-server/src/main/resources/language/i18n/zh.js index 6603e3b..57d0a91 100644 --- a/nladmin-system/nlsso-server/src/main/resources/language/i18n/zh.js +++ b/nladmin-system/nlsso-server/src/main/resources/language/i18n/zh.js @@ -928,7 +928,33 @@ var config = { "task_code": "任务号" }, "outbill": { + "outbound_weight":"出库重量", + "edit_out_bill":"出库单编辑", + "out_detail":"出库明细", + "quantity":"数量", + "material_list":"用料清单物料", + "manual_add_material":"手工添加物料", + "divide_allocation":"出库分配", + "outbound_details":"出库明细", + "allocation_area":"分配库区", + "allocation_all":"全部分配", + "cancel_all":"全部取消", + "auto_allocation":"自动分配", + "auto_cancel":"自动取消", + "manual_allocation":"手工分配", + "set_all":"一键设置", + "assigned_qty":"已分配重量", + "unassigned_qty":"未分配重量", + "allocation_details":"分配明细", + "to_be_allocated":"待分配", + "allocated":"已分配", + "outbound_point":"出库点", + "target_floor":"目的楼层", "vehicle_material_details":"载具物料明细", + "allocation_success":"分配成功", + "please_select_point":"请先选择站点", + "please_select_floor":"请先选择楼层", + "set_success":"设置成功", "warehouse_area":"库区", "auto_allocate_location":"自动分配货位", "allocate_location":"分配货位", @@ -1053,6 +1079,14 @@ var config = { "operation": "操作" }, "common": { + "Close":"关闭", + "material_code":"物料编码", + "material_name":"物料名称", + "vehicle_code":"托盘号", + "position_code":"仓位编码", + "position_name":"仓位名称", + "storage_time":"入库时间", + "task_code":"任务号", "status": "状态", "unit":"单位", "all":"全部", diff --git a/nladmin-ui/src/views/wms/pm_manage/form_data/index.vue b/nladmin-ui/src/views/wms/pm_manage/form_data/index.vue index b7f15ca..7af7d6e 100644 --- a/nladmin-ui/src/views/wms/pm_manage/form_data/index.vue +++ b/nladmin-ui/src/views/wms/pm_manage/form_data/index.vue @@ -69,6 +69,17 @@ class="filter-item" /> + + + - +