diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IStructattrService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IStructattrService.java index a019e9c..e85e53b 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IStructattrService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IStructattrService.java @@ -101,6 +101,10 @@ public interface IStructattrService extends IService { List collectVechicle(Map query); + + + List collectVechicleNoGroup(Map query); + /** * 出库规则 */ diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.java index 75ab678..9b858d4 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.java @@ -17,4 +17,6 @@ public interface StructattrMapper extends BaseMapper{ List collectVehicle(Map query); + List collectVehicleNoGroup(Map query); + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml index 3028084..39e4848 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml @@ -56,4 +56,32 @@ + + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dto/StrategyStructParam.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dto/StrategyStructParam.java index e0f4241..671a2de 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dto/StrategyStructParam.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dto/StrategyStructParam.java @@ -56,4 +56,9 @@ public class StrategyStructParam { * 出入库类型 */ private String ioType; + + /** + * 出入库类型 + */ + private String stragegyType; } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java index ad59146..4231f6c 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java @@ -319,6 +319,14 @@ public class StructattrServiceImpl extends ServiceImpl collectVechicleNoGroup(Map query) { + return this.baseMapper.collectVehicleNoGroup(query); + } + /** * 出库分配 @@ -342,8 +350,8 @@ public class StructattrServiceImpl extends ServiceImpl { +public class FIFORuleHandler extends Decisioner { /** * 出入库明细服务 @@ -33,22 +34,22 @@ public class FIFORuleHandler extends Decisioner handler(List list, StrategyStructParam param) { + public List handler(List list, JSONObject param) { //分配数量 //当前条件只有id,批次 log.info("---------执行fifo出库分配规则---------"); - BigDecimal planQty = param.getQty(); + BigDecimal planQty = param.getBigDecimal("qty"); List vechielDtos = - iStructattrService.collectVechicle(MapOf.of("material_id", param.getMaterial_id() - , "pcsn", param.getPcsn() - , "stor_code", param.getStor_code() - , "sect_code", param.getSect_code() + iStructattrService.collectVechicle(MapOf.of("material_id", param.getString("material_id") + , "pcsn", param.getString("pcsn") + , "stor_code", param.getString("stor_code") + , "sect_code", param.getString("sect_code") , "plan_qty", planQty , "is_lock", "false" , "order_by", "gro.update_time asc") ); if (ObjectUtils.isEmpty(vechielDtos)) { - throw new BadRequestException("当前出库策略:先进先出,库存分配失败,失败原因:库存不足!"); + throw new BadRequestException("当前出库策略:先进先出,库存分配失败,失败原因:库存不足!或未组盘!"); } List divStruct = new ArrayList<>(); for (StructattrVechielDto vechielDto : vechielDtos) { diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/diy/FIFOAndVehicleHandler.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/diy/FIFOAndVehicleHandler.java new file mode 100644 index 0000000..dbf0c93 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/diy/FIFOAndVehicleHandler.java @@ -0,0 +1,100 @@ +package org.nl.wms.decision_manage.service.strategyConfig.decisioner.impl.diy; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.MapOf; +import org.nl.wms.basedata_manage.service.IStructattrService; +import org.nl.wms.basedata_manage.service.dao.StructattrVechielDto; +import org.nl.wms.basedata_manage.service.dto.StrategyStructMaterialVO; +import org.nl.wms.decision_manage.service.strategyConfig.decisioner.Decisioner; +import org.nl.wms.decision_manage.service.strategyConfig.enums.StragegyTypeEnum; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * @author zhengxuming + * @Date 2025-7-25 11:24:52 + * 先进先出/空托盘出库策略 + */ +@Service("fifoAndVehicle") +@Slf4j +public class FIFOAndVehicleHandler extends Decisioner { + + /** + * 出入库明细服务 + */ + @Autowired + private IStructattrService iStructattrService; + + @Override + public List handler(List list, JSONObject param) { + //如果是空托盘出库任务,则执行空托盘出库 + if (StragegyTypeEnum.STRAGEGY_TYPE.code("空托盘").equals(param.getString("strategyType"))) { + //查新空托盘 + //当前条件只有id,批次 + log.info("---------执行空托盘出库分配规则---------"); + BigDecimal planQty = param.getBigDecimal("qty"); + List vechielDtos = + iStructattrService.collectVechicleNoGroup(MapOf.of( + "stor_code", param.getString("stor_code") + , "sect_code", param.getString("sect_code") + , "is_lock", "false" + , "order_by", "ivt.update_time asc")); + if (ObjectUtils.isEmpty(vechielDtos)) { + throw new BadRequestException("库存分配失败,失败原因:没有空托盘"); + } + + List divStruct = new ArrayList<>(); + for (StructattrVechielDto vechielDto : vechielDtos) { + StrategyStructMaterialVO materialVO = new StrategyStructMaterialVO(); + BeanUtils.copyProperties(vechielDto, materialVO); + divStruct.add(materialVO); + } + return divStruct; + } else { + + //分配数量 + //当前条件只有id,批次 + log.info("---------执行fifo出库分配规则---------"); + BigDecimal planQty = param.getBigDecimal("qty"); + List vechielDtos = + iStructattrService.collectVechicle(MapOf.of("material_id", param.getString("material_id") + , "pcsn", param.getString("pcsn") + , "stor_code", param.getString("stor_code") + , "sect_code", param.getString("sect_code") + , "plan_qty", planQty + , "is_lock", "false" + , "order_by", "gro.update_time asc") + ); + if (ObjectUtils.isEmpty(vechielDtos)) { + throw new BadRequestException("当前出库策略:先进先出,库存分配失败,失败原因:库存不足!或未组盘!"); + } + List divStruct = new ArrayList<>(); + for (StructattrVechielDto vechielDto : vechielDtos) { + if (planQty.intValue() <= 0) { + break; + } + BigDecimal qty = vechielDto.getQty(); + BigDecimal subQty = planQty.subtract(qty); + if (subQty.doubleValue() >= 0) { + vechielDto.setFrozen_qty(vechielDto.getQty()); + } else { + vechielDto.setFrozen_qty(planQty); + } + planQty = subQty; + StrategyStructMaterialVO materialVO = new StrategyStructMaterialVO(); + BeanUtils.copyProperties(vechielDto, materialVO); + divStruct.add(materialVO); + } + return divStruct; + } + } + +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/enums/StragegyTypeEnum.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/enums/StragegyTypeEnum.java new file mode 100644 index 0000000..8a808af --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/enums/StragegyTypeEnum.java @@ -0,0 +1,42 @@ +package org.nl.wms.decision_manage.service.strategyConfig.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.MapOf; + +import java.util.Map; + +/** + * 任务枚举类 + * + * @author zhengxuming + * @Date 2025/05/26 + */ +@AllArgsConstructor +@Getter +public enum StragegyTypeEnum { + + // 策略类型 + STRAGEGY_TYPE(MapOf.of("1", "空托盘", "2", "正常策略")) + ; + + private Map code; + + public String code(String desc) { + String code = this.getCode().get(desc); + if (StringUtils.isNotEmpty(code)) { + return code; + } + throw new BadRequestException(this.name() + "对应类型" + desc + "未定义"); + } + + public String check(String code) { + for (Map.Entry entry : this.getCode().entrySet()) + if (entry.getValue().equals("code")) { + return entry.getValue(); + } + throw new BadRequestException(this.name() + "对应类型" + code + "未定义"); + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/controller/PdaIosInController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/controller/PdaIosInController.java index ed362c4..088f0ec 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/controller/PdaIosInController.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/controller/PdaIosInController.java @@ -104,6 +104,14 @@ public class PdaIosInController { } + @PostMapping("/zwConfirmIn") + @Log("中钨组盘入库确认") + public ResponseEntity zwConfirmIn(@RequestBody JSONObject whereJson) { + assertNotBlankJson(whereJson, "请求参数不能为空", "vehicle_code", "site_code"); + return new ResponseEntity<>(pdaIosInService.zwConfirmIn(whereJson), HttpStatus.OK); + } + + /** * 拣选余料回库物料查询 */ diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosInService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosInService.java index 1ce8ba8..ee79ae0 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosInService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosInService.java @@ -105,6 +105,20 @@ public interface PdaIosInService { */ PdaResponse confirmIn(JSONObject whereJson); + + /** + * 株洲中钨入库确认 + * 步骤1:入库确认 + * 步骤2:空托盘出库 + * @param whereJson { + * vehicle_code:载具编码 + * sect_code:库区 + * } + * @return PdaResponse + */ + PdaResponse zwConfirmIn(JSONObject whereJson); + + /** * 拣选余料回库物料查询 * diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosOutService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosOutService.java index c7b8f20..0894f09 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosOutService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosOutService.java @@ -106,6 +106,4 @@ public interface PdaIosOutService { PdaResponse vehicleOutConfirm(JSONObject whereJson); - - } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosInServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosInServiceImpl.java index c6b8d92..a40a42d 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosInServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosInServiceImpl.java @@ -2,6 +2,7 @@ package org.nl.wms.pda_manage.ios_manage.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,12 +16,19 @@ import org.nl.common.base.TableDataInfo; import org.nl.common.domain.query.PageQuery; import org.nl.common.domain.vo.SelectItemVo; 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.SpringContextHolder; +import org.nl.wms.basedata_manage.enums.BaseDataEnum; import org.nl.wms.basedata_manage.service.*; import org.nl.wms.basedata_manage.service.dao.*; +import org.nl.wms.basedata_manage.service.dao.mapper.SectattrMapper; import org.nl.wms.basedata_manage.service.dto.MaterialQuery; +import org.nl.wms.basedata_manage.service.dto.StrategyStructMaterialVO; +import org.nl.wms.basedata_manage.service.dto.StrategyStructParam; import org.nl.wms.pda_manage.ios_manage.service.PdaIosInService; +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; @@ -28,10 +36,18 @@ import org.nl.wms.sch_manage.service.ISchBasePointService; import org.nl.wms.sch_manage.service.ISchBaseRegionService; import org.nl.wms.sch_manage.service.dao.SchBasePoint; import org.nl.wms.sch_manage.service.dao.SchBaseRegion; +import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper; import org.nl.wms.sch_manage.service.util.AbstractTask; import org.nl.wms.sch_manage.service.util.tasks.BackInTask; +import org.nl.wms.sch_manage.service.util.tasks.VehicleOutTask; +import org.nl.wms.sch_manage.service.util.tasks.zw.InBillTask; +import org.nl.wms.system_manage.service.dict.dao.Dict; +import org.nl.wms.system_manage.service.dict.dao.mapper.SysDictMapper; +import org.nl.wms.system_manage.service.logicflow.dao.StageImage; import org.nl.wms.warehouse_manage.enums.IOSConstant; import org.nl.wms.warehouse_manage.enums.IOSEnum; +import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDis; +import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper; import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService; import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService; import org.nl.wms.warehouse_manage.service.dao.GroupPlate; @@ -46,6 +62,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; +import java.util.stream.Collectors; import static org.nl.wms.warehouse_manage.enums.IOSEnum.GROUP_PLATE_STATUS; @@ -62,12 +79,17 @@ public class PdaIosInServiceImpl implements PdaIosInService { @Autowired private Map applyTaskMap; + /** * 组盘记录mapper */ @Autowired private MdPbGroupplateMapper mdPbGroupplateMapper; + + @Resource + private IOStorInvDisMapper ioStorInvDisMapper; + /** * 组盘记录服务 */ @@ -87,6 +109,12 @@ public class PdaIosInServiceImpl implements PdaIosInService { @Autowired private IMdPbMeasureunitService iMdPbMeasureunitService; + /** + * 库区 + */ + @Autowired + private SectattrMapper sectattrMapper; + /** * 载具服务 */ @@ -112,6 +140,9 @@ public class PdaIosInServiceImpl implements PdaIosInService { @Autowired private IBsrealStorattrService iSrealStorattrService; + @Autowired + private PdaIosOutService pdaIosOutService; + /** * 入库服务 */ @@ -128,6 +159,18 @@ public class PdaIosInServiceImpl implements PdaIosInService { @Autowired private IOStorInvDtlMapper ioStorInvDtlMapper; + /** + * 点位基础信息 + */ + @Autowired + private SchBasePointMapper schBasePointMapper; + + /** + * + */ + @Autowired + private SysDictMapper sysDictMapper; + /** * 区域服务 @@ -246,6 +289,7 @@ public class PdaIosInServiceImpl implements PdaIosInService { public JSONObject getVehicleMaterial(JSONObject whereJson) { whereJson.put("status", GROUP_PLATE_STATUS.code("组盘")); whereJson.put("vehicleCode", whereJson.getString("search")); + whereJson.put("noEmptyVehicle", whereJson.getString("noEmptyVehicle")); List list = mdPbGroupplateMapper.getVehicleMaterial(whereJson); if (CollectionUtils.isEmpty(list)) { throw new BadRequestException("此载具未组盘,请检查!"); @@ -399,6 +443,181 @@ public class PdaIosInServiceImpl implements PdaIosInService { return PdaResponse.requestOk(); } + @Override + @Transactional + public PdaResponse zwConfirmIn(JSONObject whereJson) { + + //组盘入库 + //根据组盘编号获取物料型号 + whereJson.put("vehicleCode", whereJson.getString("vehicle_code")); + whereJson.put("noEmptyVehicle", "1"); + String material_model = getVehicleMaterial(whereJson).getString("material_model"); + if(StringUtils.isEmpty(material_model)){ + throw new BadRequestException("组盘的物料未配置【物料型号】!"); + } + //根据物料型号匹配字典表获取入库编码 + List dictList = sysDictMapper.selectList(new LambdaQueryWrapper() + .eq(Dict::getCode, "MATERIAL_MODEL_SECT") + .eq(Dict::getPara1, material_model)); + if(CollectionUtils.isEmpty(dictList)){ + throw new BadRequestException("字典MATERIAL_MODEL_SECT未配置物料类型与库区的对应关系,请核对!"); + } + + String sect_code = dictList.get(0).getValue(); + //根据库区编码获取库区id sect_id + List sectattrList = sectattrMapper.selectList(new LambdaQueryWrapper() + .eq(Sectattr::getSect_code, sect_code)); + + if(CollectionUtils.isEmpty(sectattrList)){ + throw new BadRequestException("库区"+sect_code+"不存在,请核对!"); + } + + //赋值给whereJson + whereJson.put("sect_id",sectattrList.get(0).getSect_id()); + + //获取起点 + SchBasePoint schBasePoint = iSchBasePointService + .getOne(new LambdaQueryWrapper().eq(SchBasePoint::getVehicle_code, whereJson.get("vehicle_code"))); + if (ObjectUtil.isEmpty(schBasePoint)) { + throw new BadRequestException("未找到载具所在的点位信息,请检查该载具是否绑定点位"); + } + whereJson.put("point_code",whereJson.getString("site_code")); + // 预组织出入库单据实体 + Map jsonMstO = organizeInsertData(whereJson); + // 调用服务新增出入库单 + String iostorinv_id = iRawAssistIStorService.insertDtl(jsonMstO); + // 预组织出入库单据明细的分配数据 + whereJson.put("iostorinv_id", iostorinv_id); + Map jsonDtl = organizeDivData(whereJson); + // 调用分配,默认自动分配库位 + iRawAssistIStorService.divStruct(new JSONObject(jsonDtl)); + + // 组织主数据 + Map jsonMst = new HashMap<>(); + jsonMst.put("point_code", whereJson.getString("point_code")); + // 组织明细数据 + IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne( + new QueryWrapper().lambda() + .eq(IOStorInvDtl::getIostorinv_id, whereJson.getString("iostorinv_id")) + ); + // 查找分配明细 + Map map = new HashMap<>(); + map.put("iostorinvdtl_id",dtlDao.getIostorinvdtl_id()); + List disDtl = iRawAssistIStorService.getDisDtl(map); + // 类型转换 + ArrayList tableMater = new ArrayList<>(); + disDtl.forEach(item -> { + tableMater.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class)); + }); + jsonMst.put("tableMater", tableMater); + + String point_code2 = iRawAssistIStorService.divPointNoTask(jsonMst); + + //空托盘出库 + // 需要计算新的siteCode 根据方案 找region_code=YLXCQ 原料卸车区的 + // 已启用的 编号最大的 空的 point_type = 1 点位 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(SchBasePoint.class) + .select(SchBasePoint::getPoint_code) + .eq(SchBasePoint::getRegion_code, "YLXCQ") + .eq(SchBasePoint::getIs_used, true) + .eq(SchBasePoint::getPoint_status, 1) + .eq(SchBasePoint::getPoint_type, "1") + .orderByDesc(SchBasePoint::getOut_empty_seq); + + List schBasePointList = schBasePointMapper.selectList(queryWrapper); + if (CollectionUtils.isEmpty(schBasePointList)) { + throw new BadRequestException("原料卸车区不存在空的点位"); + } + + //从库区拉一个空托盘到这个点位 + whereJson.put("siteCode", schBasePointList.get(0).getPoint_code()); + + LambdaQueryWrapper maQueryWrapper = new LambdaQueryWrapper<>(); + maQueryWrapper.eq(MdMeMaterialbase::getMaterial_code, StatusEnum.VEHICLE_TYPE.code("空托盘")); + + MdMeMaterialbase materDao = iMdMeMaterialbaseService.getOne(maQueryWrapper); + if (materDao == null) { + throw new BadRequestException("未找到空载具物料信息!"); + } + whereJson.put("material_id", materDao.getMaterial_id()); + whereJson.put("material_code", materDao.getMaterial_code()); + Sectattr sectattr = iSectattrService.getOne(new LambdaQueryWrapper<>(Sectattr.class) + .eq(Sectattr::getSect_id, whereJson.getString("sect_id")) + .eq(Sectattr::getIs_used, BaseDataEnum.IS_YES_NOT.code("是")) + ); + if (ObjectUtil.isEmpty(sectattr)) { + throw new BadRequestException("该仓位所属的库区已禁用,请先启用该库区!"); + } + BsrealStorattr storeDao = iSrealStorattrService.getById(sectattr.getStor_id()); + whereJson.put("stor_code", storeDao.getStor_code()); + whereJson.put("sect_code", sectattr.getSect_code()); + StrategyStructParam strategyStructParam = StrategyStructParam.builder() + .ioType(whereJson.getString(StatusEnum.STRATEGY_TYPE.code("出库"))) + .sect_code(whereJson.getString("sect_code")) + .stor_code(whereJson.getString("stor_code")) + .material_id(whereJson.getString("material_id")) + .material_code(whereJson.getString("material_code")) + .qty(new BigDecimal(1)) + .stragegyType("1") + .build(); + List structList = iStructattrService.outBoundSectDiv(strategyStructParam); + if (CollectionUtils.isEmpty(structList)) { + throw new BadRequestException("无可用空托盘库存!"); + } + + //创建任务 + JSONObject taskForm = new JSONObject(); + taskForm.put("task_type", IOSConstant.IN_BILL_TASK); + taskForm.put("config_code", IOSConstant.IN_BILL_TASK); + taskForm.put("TaskCode", CodeUtil.getNewCode("TASK_CODE")); + taskForm.put("point_code1", whereJson.getString("site_code")); + //计算入库库位 + taskForm.put("point_code2", point_code2); + + //空托盘出库库位 + taskForm.put("point_code3", structList.get(0).getStruct_code()); + taskForm.put("point_code4", whereJson.getString("siteCode")); + taskForm.put("vehicle_code", structList.get(0).getStoragevehicle_code()); + InBillTask inBillTask = SpringContextHolder.getBean("InBillTask"); + String task_id = inBillTask.create(taskForm); + + Set vehicleCodeSet = structList.stream() + .map(StrategyStructMaterialVO::getStoragevehicle_code) + .collect(Collectors.toSet()); + mdPbGroupplateMapper.update( + new GroupPlate(), + new LambdaUpdateWrapper() + .set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")) + .eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")) + .in(GroupPlate::getStoragevehicle_code, vehicleCodeSet) + ); + + //锁定仓位 + Set structCodeSet = structList.stream() + .map(StrategyStructMaterialVO::getStruct_code) + .collect(Collectors.toSet()); + iStructattrService.update( + new LambdaUpdateWrapper() + .set(Structattr::getInv_id, null) + .set(Structattr::getInv_code, null) + .set(Structattr::getInv_type, null) + .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("出库锁")) + .in(Structattr::getStruct_code, structCodeSet) + ); + + + //分配明细表更新任务相关数据 + IOStorInvDis dis = new IOStorInvDis(); + dis.setIostorinvdis_id(dtlDao.getIostorinvdtl_id()); + dis.setWork_status(IOSEnum.INBILL_DIS_STATUS.code("生成")); + dis.setTask_id(task_id); + dis.setIs_issued(BaseDataEnum.IS_YES_NOT.code("是")); + dis.setPoint_code(whereJson.getString("site_code")); + ioStorInvDisMapper.updateById(dis); + + return PdaResponse.requestOk(); + } + /** * 组织入库插入数据 * @param whereJson { diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/controller/SchBasePointController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/controller/SchBasePointController.java index a71de9e..e78c935 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/controller/SchBasePointController.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/controller/SchBasePointController.java @@ -49,6 +49,14 @@ public class SchBasePointController { return new ResponseEntity<>(HttpStatus.NO_CONTENT); } + @PostMapping("/updatePointType") + @Log("修改点位类型") + public ResponseEntity updatePointType(@Validated @RequestBody SchBasePoint entity) { + schBasePointService.updatePointType(entity); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除点位管理") @DeleteMapping public ResponseEntity delete(@RequestBody Set ids) { diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java index 41c2650..9755f04 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java @@ -40,6 +40,13 @@ public interface ISchBasePointService extends IService { */ void update(SchBasePoint entity); + /** + * 编辑点位类型 + * + * @param entity / + */ + void updatePointType(SchBasePoint entity); + /** * 多选删除 * diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java index 7bbf441..99e52b4 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java @@ -144,6 +144,22 @@ public class SchBasePointServiceImpl extends ServiceImpl ids) { @@ -173,6 +189,9 @@ public class SchBasePointServiceImpl extends ServiceImpl() .eq(SchBasePoint::getRegion_code, region.getRegion_code()) + + //点位类型,根据传入的值是否为空增加判断 + .eq(StringUtils.isNotBlank(region.getPoint_type()), SchBasePoint::getPoint_type, region.getPoint_type()) .eq(SchBasePoint::getIs_has_workder, true)); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/zw/InBillTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/zw/InBillTask.java new file mode 100644 index 0000000..8ffbc8e --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/zw/InBillTask.java @@ -0,0 +1,184 @@ +package org.nl.wms.sch_manage.service.util.tasks.zw; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.common.utils.IdUtil;; +import org.nl.wms.basedata_manage.enums.BaseDataEnum; +import org.nl.wms.basedata_manage.service.IStructattrService; +import org.nl.wms.basedata_manage.service.dao.Structattr; +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.AbstractTask; +import org.nl.wms.sch_manage.service.util.AcsTaskDto; +import org.nl.wms.sch_manage.service.util.TaskType; +import org.nl.wms.warehouse_manage.enums.IOSEnum; +import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService; +import org.nl.wms.warehouse_manage.inAndOut.service.IOutBillService; +import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDis; +import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +/** + * @Author: zhengxuming + * @Description: 来料入库 + * @Date: 2025年7月24日13:19:24 + */ +@Component(value = "InBillTask") +@TaskType("InBillTask") +public class InBillTask extends AbstractTask { + + /** + * 任务服务类 + */ + @Resource + private ISchBaseTaskService taskService; + + + @Resource + private IInBillService rawAssistIStorService; + + + @Resource + private IOStorInvDisMapper ioStorInvDisMapper; + + @Resource + private IOutBillService outBillService; + + @Override + public String create(JSONObject json) { + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getStringId()); + task.setTask_code(json.getString("TaskCode")); + task.setTask_status(TaskStatus.CREATE.getCode()); + task.setConfig_code(json.getString("task_type")); + task.setPoint_code1(json.getString("point_code1")); + task.setPoint_code2(json.getString("point_code2")); + task.setPoint_code3(json.getString("point_code3")); + task.setPoint_code4(json.getString("point_code4")); + task.setVehicle_code(json.getString("vehicle_code")); + task.setVehicle_code2(json.getString("vehicle_code2")); + task.setGroup_id(json.getString("group_id")); + task.setRequest_param(json.toString()); + task.setPriority(json.getString("Priority")); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setCreate_time(DateUtil.now()); + taskService.save(task); + return task.getTask_id(); + } + + @Override + public AcsTaskDto sendAcsParam(String taskId) { + SchBaseTask taskDao = taskService.getById(taskId); + // 组织下发给acs的数据 + AcsTaskDto acsTaskDto = new AcsTaskDto(); + acsTaskDto.setExt_task_uuid(taskDao.getTask_id()); + acsTaskDto.setTask_code(taskDao.getTask_code()); + acsTaskDto.setStart_device_code(taskDao.getPoint_code1()); + acsTaskDto.setNext_device_code(taskDao.getPoint_code2()); + acsTaskDto.setStart_device_code2(taskDao.getPoint_code3()); + acsTaskDto.setNext_device_code2(taskDao.getPoint_code4()); + acsTaskDto.setPriority(taskDao.getPriority()); + acsTaskDto.setTask_type("1"); + return acsTaskDto; + } + + @Override + protected void updateStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getByCode(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + taskService.updateById(taskObj); + } + if (status.equals(TaskStatus.FINISHED)) { + this.finishTask(taskObj); + } + if (status.equals(TaskStatus.CANCELED)) { + this.cancelTask(taskObj); + } + } + + @Override + public void forceFinish(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj); + } + + @Override + public void cancel(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + if (!TaskStatus.CREATE.getCode().equals(taskObj.getTask_status())) { + throw new BadRequestException("任务状态必须为生成才能取消任务"); + } + this.cancelTask(taskObj); + } + + @Override + public void backMes(String task_code) { + + } + + + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask taskObj) { + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("已完成"); + taskService.updateById(taskObj); + rawAssistIStorService.taskFinish(taskObj); + } + + @Transactional(rollbackFor = Exception.class) + public void cancelTask(SchBaseTask taskObj) { + + // 取消任务 + taskService.update(new LambdaUpdateWrapper() + .set(SchBaseTask::getIs_delete, BaseDataEnum.IS_YES_NOT.code("是")) + .set(SchBaseTask::getTask_status, TaskStatus.CANCELED.getCode()) + .set(SchBaseTask::getRemark,"已取消") + .eq(SchBaseTask::getTask_id,taskObj.getTask_id()) + ); + + //分配表清除任务 + ioStorInvDisMapper.update(new IOStorInvDis(),new LambdaUpdateWrapper<>(IOStorInvDis.class) + .set(IOStorInvDis::getTask_id,null) + .set(IOStorInvDis::getPoint_code,null) + .set(IOStorInvDis::getIs_issued,0) + .set(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("未生成")) + .eq(IOStorInvDis::getTask_id,taskObj.getTask_id()) + ); + + // 更新任务状态 + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setRemark("已取消"); + taskService.updateById(taskObj); + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/enums/IOSConstant.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/enums/IOSConstant.java index 02e606c..41bef6b 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/enums/IOSConstant.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/enums/IOSConstant.java @@ -78,4 +78,11 @@ public class IOSConstant { */ public final static String VEHICLE_OUT_TASK = "VehicleOutTask"; + + /** + * 来料入库 + * 一共需要4个点位 1、卸货区点 2、原料仓上架点 3、空托盘出库点 4、空托盘卸货区放置点 + */ + public final static String IN_BILL_TASK = "InBillTask"; + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/IInBillService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/IInBillService.java index 3475de9..bcbce41 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/IInBillService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/IInBillService.java @@ -46,6 +46,8 @@ public interface IInBillService extends IService { void divPoint(Map whereJson); + String divPointNoTask(Map whereJson); + void confirm(Map whereJson); void taskFinish(SchBaseTask task); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java index a8f638b..9dc1e7d 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java @@ -551,6 +551,22 @@ public class InBillServiceImpl extends ServiceImpl i ioStorInvDisMapper.updateById(dis); } + @Override + public String divPointNoTask(Map whereJson) { + ArrayList rows = (ArrayList) whereJson.get("tableMater"); + String point_code = (String) whereJson.get("point_code"); + HashMap map = rows.get(0); + + //判断是否已经分配好货位 + IOStorInvDis ioStorInvDis = ioStorInvDisMapper.selectOne(new LambdaQueryWrapper<>(IOStorInvDis.class) + .eq(IOStorInvDis::getIostorinvdis_id, map.get("iostorinvdis_id")) + .and(wrapper -> wrapper.isNotNull(IOStorInvDis::getStruct_code).or().ne(IOStorInvDis::getStruct_code, ""))); + if (ObjectUtil.isEmpty(ioStorInvDis)) { + throw new BadRequestException("该明细还没分配货位,请先分配货位"); + } + return ioStorInvDis.getStruct_code(); + } + @Override @Transactional(rollbackFor = Exception.class) public void confirm(Map whereJson) { diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/dao/mapper/MdPbGroupplateMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/dao/mapper/MdPbGroupplateMapper.xml index ff9d975..119ff19 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/dao/mapper/MdPbGroupplateMapper.xml +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/dao/mapper/MdPbGroupplateMapper.xml @@ -58,7 +58,8 @@ gro.*, mater.material_id, mater.material_code, - mater.material_name + mater.material_name, + mater.material_model FROM md_pb_groupplate gro LEFT JOIN md_me_materialbase mater ON mater.material_id = gro.material_id @@ -68,6 +69,10 @@ AND gro.storagevehicle_code = #{params.vehicleCode} + + AND + mater.material_name ]]> '空托盘' + AND gro.status = #{params.status} @@ -76,6 +81,7 @@ AND gro.qty>0 + ORDER BY gro.create_time Desc diff --git a/lms/nladmin-ui/src/views/wms/st/inbill/DivDialog.vue b/lms/nladmin-ui/src/views/wms/st/inbill/DivDialog.vue index fa4d219..238ca2e 100644 --- a/lms/nladmin-ui/src/views/wms/st/inbill/DivDialog.vue +++ b/lms/nladmin-ui/src/views/wms/st/inbill/DivDialog.vue @@ -259,9 +259,12 @@ export default { this.sects = res.content }) - const area_type = 'RKQ' + const area_type = 'YLXCQ' - crudPoint.getPointList({ 'region_code': area_type }).then(res => { + // 点位类型,因为卸货区的点位类型(出库区、入库区)会变动,因需要增加点位类型字段进行判断 + // 1-入库区,2-出库区 + const region_type = '1' + crudPoint.getPointList({ 'region_code': area_type, 'region_type': region_type }).then(res => { this.pointlist = res }) }, diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue b/lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue index 2c7bf93..761e17e 100644 --- a/lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue +++ b/lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue @@ -323,10 +323,12 @@ export default { crudSectattr.getSect({ 'stor_id': this.storId }).then(res => { this.sects = res.content }) - - const area_type = 'CKQ' - crudPoint.getPointList({ 'region_code': area_type }).then(res => { - this.pointList = res + const area_type = 'YLXCQ' + // 点位类型,因为卸货区的点位类型(出库区、入库区)会变动,因需要增加点位类型字段进行判断 + // 1-入库区,2-出库区 + const region_type = '2' + crudPoint.getPointList({ 'region_code': area_type, 'region_type': region_type }).then(res => { + this.pointlist = res }) }, close() {