Merge remote-tracking branch 'origin/master'

This commit is contained in:
2025-07-30 13:28:15 +08:00
14 changed files with 638 additions and 181 deletions

View File

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.base.TableDataInfo;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.logging.annotation.Log;

View File

@@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.IdUtil;
@@ -263,6 +264,7 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
.set(Structattr::getInv_type, jsonObject.getString("inv_type"))
.set(Structattr::getStoragevehicle_code, jsonObject.getString("storagevehicle_code"))
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.set(StringUtils.isNotBlank(jsonObject.getString("occupancy_state")),Structattr::getOccupancy_state, jsonObject.getString("occupancy_state"))
.eq(Structattr::getStruct_code, jsonObject.getString("struct_code"))
);
break;

View File

@@ -0,0 +1,44 @@
package org.nl.wms.decision_manage.service.strategyConfig.decisioner.impl.diy;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.decision_manage.service.strategyConfig.decisioner.Decisioner;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 原料出库规则
* @Author: zhengxuming
* @Date: 2025年7月29日14:11:10
*/
@Slf4j
@Service("rawInRuleHandle")
public class RawInRuleHandle extends Decisioner<Structattr, JSONObject> {
/**
* 出入库明细服务
*/
@Autowired
private IStructattrService iStructattrService;
@Override
public List<Structattr> handler(List<Structattr> list, JSONObject param) {
QueryWrapper<Structattr> query = new QueryWrapper<Structattr>()
.eq("is_used", true)
.eq("lock_type", IOSEnum.LOCK_TYPE.code("未锁定"))
.eq("sect_code", param.getString("sect_code"))
.isNotNull("storagevehicle_code")
.isNull("Task_code")
.eq("occupancy_state",2)
.orderByAsc("update_time");
List<Structattr> querylList = iStructattrService.list(query);
return querylList;
}
}

View File

@@ -5,9 +5,13 @@ import cn.dev33.satoken.annotation.SaIgnore;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.base.TableDataInfo;
import org.nl.common.logging.annotation.Log;
import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase;
import org.nl.wms.pda_manage.ios_manage.dto.ZwConfirmInDto;
import org.nl.wms.pda_manage.ios_manage.dto.ZwConfirmInParamDto;
import org.nl.wms.pda_manage.ios_manage.service.PdaIosInService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
@@ -106,9 +110,16 @@ public class PdaIosInController {
@PostMapping("/zwConfirmIn")
@Log("中钨组盘入库确认")
public ResponseEntity<Object> zwConfirmIn(@RequestBody JSONObject whereJson) {
assertNotBlankJson(whereJson, "请求参数不能为空", "vehicle_code", "site_code");
return new ResponseEntity<>(pdaIosInService.zwConfirmIn(whereJson), HttpStatus.OK);
public ResponseEntity<Object> zwConfirmIn(@RequestBody ZwConfirmInDto dto) {
if(CollectionUtils.isEmpty(dto.getParamList())){
throw new IllegalArgumentException("请传入参数!");
}
for(ZwConfirmInParamDto paramDto : dto.getParamList()){
if(StringUtils.isBlank(paramDto.getVehicle_code())||StringUtils.isBlank(paramDto.getSite_code()))
throw new IllegalArgumentException("载具且卸货区点位不能为空!");
}
return new ResponseEntity<>(pdaIosInService.zwConfirmIn(dto), HttpStatus.OK);
}

View File

@@ -0,0 +1,10 @@
package org.nl.wms.pda_manage.ios_manage.dto;
import lombok.Data;
import java.util.List;
@Data
public class ZwConfirmInDto {
private List<ZwConfirmInParamDto> paramList;
}

View File

@@ -0,0 +1,9 @@
package org.nl.wms.pda_manage.ios_manage.dto;
import lombok.Data;
@Data
public class ZwConfirmInParamDto {
private String site_code;
private String vehicle_code;
}

View File

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import org.nl.common.base.TableDataInfo;
import org.nl.common.domain.vo.SelectItemVo;
import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase;
import org.nl.wms.pda_manage.ios_manage.dto.ZwConfirmInDto;
import org.nl.wms.pda_manage.util.PdaResponse;
import java.util.List;
@@ -110,13 +111,17 @@ public interface PdaIosInService {
* 株洲中钨入库确认
* 步骤1入库确认
* 步骤2空托盘出库
* @param whereJson {
* vehicle_code载具编码
* sect_code库区
* }
* @param dto [{
* vehicle_code载具编码
* site_code库区
* },
* {
* vehicle_code载具编码
* site_code库区
* }]
* @return PdaResponse
*/
PdaResponse zwConfirmIn(JSONObject whereJson);
PdaResponse zwConfirmIn(ZwConfirmInDto dto);
/**

View File

@@ -27,6 +27,8 @@ 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.dto.ZwConfirmInDto;
import org.nl.wms.pda_manage.ios_manage.dto.ZwConfirmInParamDto;
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;
@@ -445,180 +447,297 @@ public class PdaIosInServiceImpl implements PdaIosInService {
@Override
@Transactional
public PdaResponse zwConfirmIn(JSONObject whereJson) {
public PdaResponse zwConfirmIn(ZwConfirmInDto dto) {
//查询字典表
List<Dict> dictList = sysDictMapper.selectList(new LambdaQueryWrapper<Dict>()
.eq(Dict::getCode, "MATERIAL_MODEL_SECT"));
//组盘入库
//根据组盘编号获取物料型号
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<Dict> dictList = sysDictMapper.selectList(new LambdaQueryWrapper<Dict>()
.eq(Dict::getCode, "MATERIAL_MODEL_SECT")
.eq(Dict::getPara1, material_model));
if(CollectionUtils.isEmpty(dictList)){
throw new BadRequestException("字典MATERIAL_MODEL_SECT未配置物料类型与库区的对应关系请核对");
if (CollectionUtils.isEmpty(dictList)) {
throw new BadRequestException("字典MATERIAL_MODEL_SECT未配置请核对");
}
String sect_code = dictList.get(0).getValue();
//根据库区编码获取库区id sect_id
List<Sectattr> sectattrList = sectattrMapper.selectList(new LambdaQueryWrapper<Sectattr>()
.eq(Sectattr::getSect_code, sect_code));
//循环判断每个 如果有问题,则抛出异常
String lastSchBasePoint = null;
Integer priority = 0 ;
List<JSONObject> jsonObjectList = new ArrayList<>();
for (ZwConfirmInParamDto paramDto : dto.getParamList()) {
priority++;
//当前点位
String schBasePointString = lastSchBasePoint;
JSONObject whereJson = new JSONObject();
whereJson.put("vehicle_code", paramDto.getVehicle_code());
whereJson.put("search", paramDto.getVehicle_code());
//起点
whereJson.put("site_code", paramDto.getSite_code());
whereJson.put("noEmptyVehicle", "1");
String material_model = getVehicleMaterial(whereJson).getString("material_model");
if (StringUtils.isEmpty(material_model)) {
throw new BadRequestException("组盘的物料未配置【物料型号】!");
}
//判断每个物料是否都已经配置库区
List<Dict> dicts = dictList.stream().filter(a -> material_model.equals(a.getPara1())).collect(Collectors.toList());
if (CollectionUtils.isEmpty(dicts)) {
throw new BadRequestException("字典MATERIAL_MODEL_SECT未配置物料类型" + material_model + "与库区的对应关系,请核对!");
}
String sect_code = dicts.get(0).getValue();
//根据库区编码获取库区id sect_id
List<Sectattr> sectattrList = sectattrMapper.selectList(new LambdaQueryWrapper<Sectattr>()
.eq(Sectattr::getSect_code, sect_code));
if (CollectionUtils.isEmpty(sectattrList)) {
throw new BadRequestException("库区" + sect_code + "不存在,请核对!");
}
whereJson.put("sect_id",sectattrList.get(0).getSect_id());
//获取起点
SchBasePoint schBasePoint = iSchBasePointService
.getOne(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getVehicle_code, whereJson.get("vehicle_code")));
if (ObjectUtil.isEmpty(schBasePoint)) {
throw new BadRequestException("未找到载具所在的点位信息,请检查该载具是否绑定点位");
}
//如果是第一个,则不知道搬出来的托盘应该放哪里,因此需要计算得出,其他的则是【上一个点位】
if (StringUtils.isBlank(lastSchBasePoint)) {
LambdaQueryWrapper<SchBasePoint> 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<SchBasePoint> schBasePointList = schBasePointMapper.selectList(queryWrapper);
if (CollectionUtils.isEmpty(schBasePointList)) {
throw new BadRequestException("原料卸车区不存在空的点位");
}
schBasePointString = schBasePointList.get(0).getPoint_code();
}
//point1为库存空托盘点
//point2为卸货区空托盘应该放置的点
//point3为入库起始点位
//起始点 对于task point3
whereJson.put ("point_code", whereJson.getString("site_code"));
//卸货区空托盘应该放置的点,对应task point2
whereJson.put("sch_base_point", schBasePointString);
whereJson.put("bill_type",StatusEnum.IOBILL_TYPE_IN.code("来料入库"));
whereJson.put("priority",priority);
jsonObjectList.add(whereJson);
//下一个的托盘放置点为本次的起点
lastSchBasePoint = whereJson.getString("site_code");
if(CollectionUtils.isEmpty(sectattrList)){
throw new BadRequestException("库区"+sect_code+"不存在,请核对!");
}
//赋值给whereJson
whereJson.put("sect_id",sectattrList.get(0).getSect_id());
//校验没有问题,则进行入库世纪操作
for(JSONObject whereJson:jsonObjectList){
// 预组织出入库单据实体
Map<String, Object> jsonMst = organizeInsertData(whereJson);
// 调用服务新增出入库单
String iostorinv_id = iRawAssistIStorService.insertDtl(jsonMst);
// 预组织出入库单据明细的分配数据
whereJson.put("iostorinv_id", iostorinv_id);
Map<String, Object> jsonDtl = organizeDivData(whereJson);
// 调用分配,默认自动分配库位
iRawAssistIStorService.zwInDivStruct(new JSONObject(jsonDtl));
// 下发任务
sendZwTask(whereJson);
//更新组盘表状态
mdPbGroupplateMapper.update(new GroupPlate(), new LambdaUpdateWrapper<GroupPlate>()
.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库"))
.eq(GroupPlate::getStoragevehicle_code, whereJson.getString("storagevehicle_code"))
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("组盘")));
//获取起点
SchBasePoint schBasePoint = iSchBasePointService
.getOne(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getVehicle_code, whereJson.get("vehicle_code")));
if (ObjectUtil.isEmpty(schBasePoint)) {
throw new BadRequestException("未找到载具所在的点位信息,请检查该载具是否绑定点位");
}
whereJson.put("point_code",whereJson.getString("site_code"));
// 预组织出入库单据实体
Map<String, Object> jsonMstO = organizeInsertData(whereJson);
// 调用服务新增出入库单
String iostorinv_id = iRawAssistIStorService.insertDtl(jsonMstO);
// 预组织出入库单据明细的分配数据
whereJson.put("iostorinv_id", iostorinv_id);
Map<String, Object> jsonDtl = organizeDivData(whereJson);
// 调用分配,默认自动分配库位
iRawAssistIStorService.divStruct(new JSONObject(jsonDtl));
// 组织主数据
Map<String, Object> jsonMst = new HashMap<>();
jsonMst.put("point_code", whereJson.getString("point_code"));
// 组织明细数据
IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne(
new QueryWrapper<IOStorInvDtl>().lambda()
.eq(IOStorInvDtl::getIostorinv_id, whereJson.getString("iostorinv_id"))
);
// 查找分配明细
Map<String, Object> map = new HashMap<>();
map.put("iostorinvdtl_id",dtlDao.getIostorinvdtl_id());
List<IOStorInvDisDto> disDtl = iRawAssistIStorService.getDisDtl(map);
// 类型转换
ArrayList<LinkedHashMap> 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<SchBasePoint> 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<SchBasePoint> schBasePointList = schBasePointMapper.selectList(queryWrapper);
if (CollectionUtils.isEmpty(schBasePointList)) {
throw new BadRequestException("原料卸车区不存在空的点位");
}
//从库区拉一个空托盘到这个点位
whereJson.put("siteCode", schBasePointList.get(0).getPoint_code());
LambdaQueryWrapper<MdMeMaterialbase> 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<StrategyStructMaterialVO> 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", structList.get(0).getStruct_code());
//拉到卸货区空余的位置
taskForm.put("point_code2", whereJson.getString("siteCode"));
taskForm.put("point_code3", whereJson.getString("site_code"));
//计算入库库位
taskForm.put("point_code4", point_code2);
taskForm.put("vehicle_code", structList.get(0).getStoragevehicle_code());
InBillTask inBillTask = SpringContextHolder.getBean("InBillTask");
String task_id = inBillTask.create(taskForm);
Set<String> vehicleCodeSet = structList.stream()
.map(StrategyStructMaterialVO::getStoragevehicle_code)
.collect(Collectors.toSet());
mdPbGroupplateMapper.update(
new GroupPlate(),
new LambdaUpdateWrapper<GroupPlate>()
.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库"))
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库"))
.in(GroupPlate::getStoragevehicle_code, vehicleCodeSet)
);
//锁定仓位
Set<String> structCodeSet = structList.stream()
.map(StrategyStructMaterialVO::getStruct_code)
.collect(Collectors.toSet());
iStructattrService.update(
new LambdaUpdateWrapper<Structattr>()
.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();
}
// @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<Dict> dictList = sysDictMapper.selectList(new LambdaQueryWrapper<Dict>()
// .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<Sectattr> sectattrList = sectattrMapper.selectList(new LambdaQueryWrapper<Sectattr>()
// .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<SchBasePoint>().eq(SchBasePoint::getVehicle_code, whereJson.get("vehicle_code")));
// if (ObjectUtil.isEmpty(schBasePoint)) {
// throw new BadRequestException("未找到载具所在的点位信息,请检查该载具是否绑定点位");
// }
// whereJson.put("point_code",whereJson.getString("site_code"));
// // 预组织出入库单据实体
// Map<String, Object> jsonMstO = organizeInsertData(whereJson);
// // 调用服务新增出入库单
// String iostorinv_id = iRawAssistIStorService.insertDtl(jsonMstO);
// // 预组织出入库单据明细的分配数据
// whereJson.put("iostorinv_id", iostorinv_id);
// Map<String, Object> jsonDtl = organizeDivData(whereJson);
// // 调用分配,默认自动分配库位
// iRawAssistIStorService.divStruct(new JSONObject(jsonDtl));
// // 组织主数据
// Map<String, Object> jsonMst = new HashMap<>();
// jsonMst.put("point_code", whereJson.getString("point_code"));
// // 组织明细数据
// IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne(
// new QueryWrapper<IOStorInvDtl>().lambda()
// .eq(IOStorInvDtl::getIostorinv_id, whereJson.getString("iostorinv_id"))
// );
// // 查找分配明细
// Map<String, Object> map = new HashMap<>();
// map.put("iostorinvdtl_id",dtlDao.getIostorinvdtl_id());
// List<IOStorInvDisDto> disDtl = iRawAssistIStorService.getDisDtl(map);
// // 类型转换
// ArrayList<LinkedHashMap> 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<SchBasePoint> 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<SchBasePoint> schBasePointList = schBasePointMapper.selectList(queryWrapper);
// if (CollectionUtils.isEmpty(schBasePointList)) {
// throw new BadRequestException("原料卸车区不存在空的点位");
// }
// //从库区拉一个空托盘到这个点位
// whereJson.put("siteCode", schBasePointList.get(0).getPoint_code());
// LambdaQueryWrapper<MdMeMaterialbase> 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<StrategyStructMaterialVO> 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", structList.get(0).getStruct_code());
// //拉到卸货区空余的位置
// taskForm.put("point_code2", whereJson.getString("siteCode"));
// taskForm.put("point_code3", whereJson.getString("site_code"));
// //计算入库库位
// taskForm.put("point_code4", point_code2);
// taskForm.put("vehicle_code", structList.get(0).getStoragevehicle_code());
// InBillTask inBillTask = SpringContextHolder.getBean("InBillTask");
// String task_id = inBillTask.create(taskForm);
// Set<String> vehicleCodeSet = structList.stream()
// .map(StrategyStructMaterialVO::getStoragevehicle_code)
// .collect(Collectors.toSet());
// mdPbGroupplateMapper.update(
// new GroupPlate(),
// new LambdaUpdateWrapper<GroupPlate>()
// .set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库"))
// .eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库"))
// .in(GroupPlate::getStoragevehicle_code, vehicleCodeSet)
// );
// //锁定仓位
// Set<String> structCodeSet = structList.stream()
// .map(StrategyStructMaterialVO::getStruct_code)
// .collect(Collectors.toSet());
// iStructattrService.update(
// new LambdaUpdateWrapper<Structattr>()
// .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 {
@@ -651,7 +770,9 @@ public class PdaIosInServiceImpl implements PdaIosInService {
jsonMst.put("bill_status", IOSEnum.BILL_STATUS.code("生成"));
jsonMst.put("total_qty", total_qty);
jsonMst.put("detail_count", 1);
jsonMst.put("bill_type", StatusEnum.IOBILL_TYPE_IN.code("生产入库"));
if(!jsonMst.containsKey("bill_type")) {
jsonMst.put("bill_type", StatusEnum.IOBILL_TYPE_IN.code("来料入库"));
}
jsonMst.put("biz_date", DateUtil.now());
// 组织明细数据
ArrayList<HashMap> tableData = new ArrayList<>();
@@ -745,6 +866,42 @@ public class PdaIosInServiceImpl implements PdaIosInService {
}
/**
* 下发任务-中钨原料入库
* @param whereJson {
* storagevehicle_code载具编码
* point_code点位编码
* sect_code库区
* iostorinv_id: id
* }
*/
private void sendZwTask(JSONObject whereJson) {
// 组织主数据
Map<String, Object> jsonMst = new HashMap<>();
jsonMst.put("bill_type",StatusEnum.IOBILL_TYPE_IN.code("来料入库"));
jsonMst.put("point_code2", whereJson.getString("sch_base_point"));
jsonMst.put("point_code3", whereJson.getString("point_code"));
jsonMst.put("priority", whereJson.getString("priority"));
jsonMst.put("vehicle_code", whereJson.getString("vehicle_code"));
// 组织明细数据
IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne(
new QueryWrapper<IOStorInvDtl>().lambda()
.eq(IOStorInvDtl::getIostorinv_id, whereJson.getString("iostorinv_id"))
);
// 查找分配明细
Map<String, Object> map = new HashMap<>();
map.put("iostorinvdtl_id",dtlDao.getIostorinvdtl_id());
List<IOStorInvDisDto> disDtl = iRawAssistIStorService.getDisDtl(map);
// 类型转换
ArrayList<LinkedHashMap> tableMater = new ArrayList<>();
disDtl.forEach(item -> {
tableMater.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class));
});
jsonMst.put("tableMater", tableMater);
iRawAssistIStorService.divPoint(jsonMst);
}

View File

@@ -28,7 +28,7 @@ public enum StatusEnum {
* 出入库单据类型退货出库
*/
IOBILL_TYPE_IN(ForkMap.of("生产入库", "10", "inStorageTask", "调拨入库", "11", "inStorageTask", "退货入库", "12", "inStorageTask", "拣选回库",
"13", "inStorageTask", "盘点入库", "14", "inStorageTask", "托盘入库", "30", "inStorageTask", "二楼CTU入库", "80", "inStorageTask")),
"13", "inStorageTask", "盘点入库", "14", "inStorageTask", "托盘入库", "30", "inStorageTask", "二楼CTU入库", "80", "inStorageTask","来料入库", "1013", "inStorageTask")),
IOBILL_TYPE_OUT(ForkMap.of("销售出库", "20", "outStorageTask", "生产出库", "21", "outStorageTask", "调拨出库", "22", "outStorageTask",
"拣选出库", "23", "conveyorOutStorageTask", "盘点出库", "24", "outStorageTask", "出库拣选", "25", "toPickPlatformTask",
"退货出库", "26", "outStorageTask", "托盘出库", "40", "outStorageTask", "二楼CTU出库", "81", "inStorageTask", "二楼出库AGV搬运",

View File

@@ -3,6 +3,7 @@ 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.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.exception.BadRequestException;
@@ -25,11 +26,14 @@ 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.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
* @Author: zhengxuming
@@ -55,15 +59,25 @@ public class InBillTask extends AbstractTask {
private IOStorInvDisMapper ioStorInvDisMapper;
@Resource
private IOutBillService outBillService;
private IMdPbGroupplateService iMdPbGroupplateService;
@Resource
private ISchBasePointService pointService;
/**
* 仓位服务
*/
@Resource
private IStructattrService iStructattrService;
@Override
public String create(JSONObject json) {
SchBaseTask task = new SchBaseTask();
task.setTask_id(IdUtil.getStringId());
task.setTask_code(json.getString("TaskCode"));
task.setTask_code(json.getString("task_code"));
task.setTask_status(TaskStatus.CREATE.getCode());
task.setConfig_code(json.getString("task_type"));
task.setConfig_code(json.getString("config_code"));
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setPoint_code3(json.getString("point_code3"));
@@ -72,7 +86,7 @@ public class InBillTask extends AbstractTask {
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.setPriority(json.getString("priority"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
@@ -153,6 +167,25 @@ public class InBillTask extends AbstractTask {
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setRemark("已完成");
taskService.updateById(taskObj);
//更改点位的托盘信息,空托盘的点位 2为空托盘放置点位
pointService.update(new LambdaUpdateWrapper<SchBasePoint>()
.set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code())
.set(SchBasePoint::getPoint_status, "1")
.set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId())
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName())
.set(SchBasePoint::getUpdate_time, DateUtil.now())
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()));
//更改点位的托盘信息,卸货的点位 3为起始点
pointService.update(new LambdaUpdateWrapper<SchBasePoint>()
.set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getPoint_status, "1")
.set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId())
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName())
.set(SchBasePoint::getUpdate_time, DateUtil.now())
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code3()));
rawAssistIStorService.taskFinish(taskObj);
}
@@ -167,6 +200,29 @@ public class InBillTask extends AbstractTask {
.eq(SchBaseTask::getTask_id,taskObj.getTask_id())
);
List<IOStorInvDis> ioStorInvDisList = ioStorInvDisMapper.selectList(new LambdaUpdateWrapper<>(IOStorInvDis.class)
.eq(IOStorInvDis::getTask_id, taskObj.getTask_id()));
for(IOStorInvDis ioStorInvDis:ioStorInvDisList){
//库存表解锁 lock_type inv_type inv_id inv_code
//解锁库位
JSONObject finish_map = new JSONObject();
finish_map.put("struct_code", ioStorInvDis.getStruct_code());
finish_map.put("inv_type", null);
finish_map.put("inv_id", null);
finish_map.put("inv_code", null);
//解绑库位
iStructattrService.updateStatusByCode("2", finish_map);
//更新组盘表 status 20->10
iMdPbGroupplateService.update(new LambdaUpdateWrapper<>(GroupPlate.class)
.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("组盘"))
.eq(GroupPlate::getStoragevehicle_code,ioStorInvDis.getStoragevehicle_code()));
}
//分配表清除任务
ioStorInvDisMapper.update(new IOStorInvDis(),new LambdaUpdateWrapper<>(IOStorInvDis.class)
.set(IOStorInvDis::getTask_id,null)

View File

@@ -40,7 +40,7 @@ public interface IInBillService extends IService<IOStorInv> {
void divStruct(JSONObject whereJson);
void zwInDivStruct(JSONObject whereJson);
void unDivStruct(Map whereJson);

View File

@@ -35,6 +35,7 @@ import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.util.tasks.StInTask;
import org.nl.wms.sch_manage.service.util.tasks.jb.JbBackAgvTask;
import org.nl.wms.sch_manage.service.util.tasks.jb.JbDownAgvTask;
import org.nl.wms.sch_manage.service.util.tasks.zw.InBillTask;
import org.nl.wms.warehouse_manage.enums.IOSConstant;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
@@ -95,6 +96,8 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
private JbDownAgvTask jbDownAgvTask;
@Resource
private JbBackAgvTask jbBackAgvTask;
@Resource
private InBillTask inBillTask;
@Override
public IPage<IOStorInv> pageQuery(Map whereJson, PageQuery page) {
@@ -442,6 +445,123 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
ioStorInvMapper.updateById(ios);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void zwInDivStruct(JSONObject param) {
Assert.noNullElements(new Object[]{param.getString("stor_code"),param.getString("sect_code")},"参数异常");
ArrayList<HashMap> rows = (ArrayList<HashMap>) param.get("tableMater");
JSONObject mst = JSONObject.parseObject(JSON.toJSONString(param));
HashMap<String, String> map = rows.get(0);
//判断该分配明细是否已经分配货位
IOStorInvDis ioStorInvDis = ioStorInvDisMapper.selectOne(new LambdaQueryWrapper<>(IOStorInvDis.class)
.eq(IOStorInvDis::getIostorinvdis_id,map.get("iostorinvdis_id"))
.isNull(IOStorInvDis::getStruct_code));
if (ioStorInvDis ==null){
throw new BadRequestException("当前明细已经分配过库位");
}
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
String sect_id = "";
String sect_code = "";
String sect_name = "";
String struct_id = "";
String struct_code = "";
String struct_name = "";
String storagevehicle_code = "";
//是否自动分配仓位
Boolean checked = mst.getBoolean("checked");
if (ObjectUtil.isNotEmpty(checked) && checked) {
param.put("qty", map.get("plan_qty"));
param.put("material_code", map.get("material_code"));
param.put("pcsn", map.get("pcsn"));
param.put("ioType", StatusEnum.STRATEGY_TYPE.code("入库"));
List<Structattr> structattrs = iStructattrService.inBoundSectDiv(
StrategyStructParam.builder()
.ioType(param.getString("ioType"))
.sect_code(param.getString("sect_code"))
.stor_code(param.getString("stor_code"))
.material_code(param.getString("material_code"))
.qty(new BigDecimal(param.getString("qty")))
.pcsn(param.getString("pcsn"))
.dis_id(map.get("iostorinvdis_id"))
.build());
Structattr struct = structattrs.get(0);
sect_id = struct.getSect_id();
sect_code = struct.getSect_code();
sect_name = struct.getSect_name();
struct_id = struct.getStruct_id();
struct_code = struct.getStruct_code();
struct_name = struct.getStruct_name();
storagevehicle_code = struct.getStoragevehicle_code();
} else {
Structattr structattr = iStructattrService.findById(map.get("struct_id"));
MdPbStoragevehicleinfo mdPbStoragevehicleinfo = mdPbStoragevehicleinfoMapper.selectOne(new LambdaQueryWrapper<>(MdPbStoragevehicleinfo.class)
.eq(MdPbStoragevehicleinfo::getStoragevehicle_code, map.get("storagevehicle_code"))
);
sect_id = map.get("sect_id");
sect_code = map.get("sect_code");
sect_name = map.get("sect_name");
struct_id = map.get("struct_id");
struct_code = map.get("struct_code");
struct_name = map.get("struct_name");
storagevehicle_code = map.get("storagevehicle_code");
}
JSONObject dis_map = new JSONObject();
dis_map.put("sect_id", sect_id);
dis_map.put("sect_code", sect_code);
dis_map.put("sect_name", sect_name);
dis_map.put("struct_id", struct_id);
dis_map.put("struct_code", struct_code);
dis_map.put("struct_name", struct_name);
dis_map.put("storagevehicle_code", storagevehicle_code);
//锁定货位
IOStorInv ioStorInv = ioStorInvMapper.selectById(map.get("iostorinv_id"));
JSONObject lock_map = new JSONObject();
lock_map.put("struct_code", struct_code);
lock_map.put("inv_id", ioStorInv.getIostorinv_id());
lock_map.put("inv_code", ioStorInv.getBill_code());
lock_map.put("inv_type", ioStorInv.getBill_type());
lock_map.put("lock_type", IOSEnum.LOCK_TYPE.code("入库锁"));
iStructattrService.updateStatusByCode("0",lock_map);
//更新组盘表状态
mdPbGroupplateService.update(new LambdaUpdateWrapper<GroupPlate>()
.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库"))
.eq(GroupPlate::getStoragevehicle_code, map.get("storagevehicle_code"))
.eq(GroupPlate::getStatus,IOSEnum.GROUP_PLATE_STATUS.code("组盘")));
// 更新分配明细表
ioStorInvDisMapper.update(dis_map.toJavaObject(IOStorInvDis.class),new LambdaUpdateWrapper<>(IOStorInvDis.class)
.set(IOStorInvDis::getSect_id,dis_map.getString("sect_id"))
.set(IOStorInvDis::getSect_code,dis_map.getString("sect_code"))
.set(IOStorInvDis::getSect_name,dis_map.getString("sect_name"))
.set(IOStorInvDis::getStruct_id,dis_map.getString("struct_id"))
.set(IOStorInvDis::getStoragevehicle_code,dis_map.getString("storagevehicle_code"))
.set(IOStorInvDis::getStruct_code,dis_map.getString("struct_code"))
.set(IOStorInvDis::getStruct_name,dis_map.getString("struct_name"))
.eq(IOStorInvDis::getIostorinvdis_id,map.get("iostorinvdis_id"))
);
//维护单据明细表里 分配数量
JSONObject jsonObject = new JSONObject();
jsonObject.put("iostorinvdtl_id",map.get("iostorinvdtl_id"));
jsonObject.put("bill_status",IOSEnum.BILL_STATUS.code("分配完"));
jsonObject.put("assign_qty",map.get("plan_qty"));
jsonObject.put("unassign_qty","0");
ioStorInvDtlMapper.updateById(jsonObject.toJavaObject(IOStorInvDtl.class));
//根据单据标识判断分配明细是否都已经分配完成
int disCount = ioStorInvDisMapper.selectCount(new LambdaQueryWrapper<>(IOStorInvDis.class)
.eq(IOStorInvDis::getIostorinv_id, map.get("iostorinv_id"))
.and(wrapper -> wrapper.isNull(IOStorInvDis::getStruct_code).or().eq(IOStorInvDis::getStruct_code, "")));
// 根据分配货位情况 更新主表单据状态
IOStorInv ios = new IOStorInv();
ios.setIostorinv_id(map.get("iostorinv_id"));
ios.setUpdate_optid(currentUserId);
ios.setUpdate_optname(nickName);
ios.setUpdate_time(now);
ios.setBill_status(disCount > 0 ? IOSEnum.BILL_STATUS.code("分配中") : IOSEnum.BILL_STATUS.code("分配完"));
ioStorInvMapper.updateById(ios);
}
/**
* 根据库区策略获取仓位
@@ -649,6 +769,26 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
task.put("point_code3", fullPoint.getPoint_code());
task.put("point_code4", structCode);
jbBackAgvTask.create(task);
} else if (StatusEnum.IOBILL_TYPE_IN.code("来料入库").equals(invObj.getBill_type())) {
// 获取组盘信息
GroupPlate groupPlate = mdPbGroupplateService.getOne(new LambdaQueryWrapper<GroupPlate>()
.eq(GroupPlate::getStoragevehicle_code, whereJson.get("vehicle_code"))
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")));
JSONObject task = new JSONObject();
task.put("config_code", IOSConstant.IN_BILL_TASK);
task.put("group_id", groupPlate.getGroup_id());
task.put("priority",whereJson.get("priority"));
task.put("task_code", CodeUtil.getNewCode("TASK_CODE"));
task.put("point_code1",ioStorInvDis.getStruct_code());
task.put("point_code2", whereJson.get("point_code2"));
task.put("point_code3", whereJson.get("point_code3"));
task.put("point_code4", ioStorInvDis.getStruct_code());
//第一个载具为计算得到的,第二个载具为起始点载具
task.put("vehicle_code", ioStorInvDis.getStoragevehicle_code());
task.put("vehicle_code2", whereJson.get("vehicle_code"));
task_id = inBillTask.create(task);
} else {
//创建任务
JSONObject task_form = new JSONObject();
@@ -809,6 +949,7 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
finish_map.put("inv_type", null);
finish_map.put("inv_id", null);
finish_map.put("inv_code", null);
finish_map.put("occupancy_state","3");
iStructattrService.updateStatusByCode("1",finish_map);
//库存变动
StructattrChangeDto changeDto = StructattrChangeDto.builder()