rev:新增手持点对点任务

This commit is contained in:
2025-10-15 16:54:11 +08:00
parent 048a80d9ac
commit d14d7c40c1
7 changed files with 339 additions and 3 deletions

View File

@@ -31,4 +31,10 @@ public interface PdaIosOutService {
* @return PdaResponse
*/
PdaResponse confirm(JSONObject whereJson);
/**
* 创建出库单并下发
* @param whereJson 、
*/
void createIos(JSONObject whereJson);
}

View File

@@ -387,9 +387,14 @@ public class PdaIosInServiceImpl implements PdaIosInService {
Sectattr sectDao = iSectattrService.getById(whereJson.getString("sect_id"));
// 组织主数据
Map<String, Object> jsonMst = new HashMap<>();
jsonMst.put("checked", true);
jsonMst.put("sect_id", sectDao.getSect_id());
jsonMst.put("stor_id", sectDao.getStor_id());
if (ObjectUtil.isNotEmpty(whereJson.getString("struct_code"))) {
jsonMst.put("checked", false);
} else {
jsonMst.put("checked", true);
}
// 组织明细数据
IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne(
new QueryWrapper<IOStorInvDtl>().lambda()
@@ -402,6 +407,14 @@ public class PdaIosInServiceImpl implements PdaIosInService {
// 类型转换
ArrayList<LinkedHashMap> tableMater = new ArrayList<>();
disDtl.forEach(item -> {
if (ObjectUtil.isNotEmpty(whereJson.getString("struct_code"))) {
item.setSect_id(whereJson.getString("sect_id"));
item.setSect_code(whereJson.getString("sect_code"));
item.setSect_name(whereJson.getString("sect_name"));
item.setStruct_id(whereJson.getString("struct_id"));
item.setStruct_code(whereJson.getString("struct_code"));
item.setStruct_name(whereJson.getString("struct_name"));
}
tableMater.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class));
});
jsonMst.put("tableMater", tableMater);

View File

@@ -1,13 +1,18 @@
package org.nl.wms.pda.ios_manage.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.basedata_manage.service.IBsrealStorattrService;
import org.nl.wms.basedata_manage.service.IMdMeMaterialbaseService;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleextService;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.basedata_manage.service.dao.*;
import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper;
import org.nl.wms.pda.ios_manage.service.PdaIosOutService;
import org.nl.wms.pda.util.PdaResponse;
@@ -17,6 +22,7 @@ import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.util.tasks.BackInTask;
import org.nl.wms.warehouse_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.nl.wms.warehouse_management.service.IOutBillService;
import org.nl.wms.warehouse_management.service.IRawAssistIStorService;
import org.nl.wms.warehouse_management.service.dao.GroupPlate;
import org.nl.wms.warehouse_management.service.dao.IOStorInvDis;
@@ -31,6 +37,10 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
@@ -49,6 +59,12 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
@Autowired
private MdPbStoragevehicleextMapper mdPbStoragevehicleextMapper;
/**
* 库存信息服务
*/
@Autowired
private IMdPbStoragevehicleextService iMdPbStoragevehicleextService;
/**
* 点位服务
*/
@@ -94,6 +110,15 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
@Resource
private GroupPlateMapper groupPlateMapper;
@Resource
private IBsrealStorattrService iBsrealStorattrService;
@Resource
private IMdMeMaterialbaseService iMdMeMaterialbaseService;
@Resource
private IOutBillService iOutBillService;
@Override
public PdaResponse getDtl(JSONObject whereJson) {
return PdaResponse.requestParamOk(mdPbStoragevehicleextMapper.getIosDtl(whereJson));
@@ -186,4 +211,64 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
}
return PdaResponse.requestOk();
}
@Override
@Transactional
public void createIos(JSONObject whereJson) {
// --------------- 组织主表数据 ---------------
JSONObject jsonMst = new JSONObject();
jsonMst.put("bill_status", IOSEnum.BILL_STATUS.code("生成"));
jsonMst.put("bill_type", IOSEnum.BILL_TYPE_OUT.code("手工出库"));
jsonMst.put("biz_date", DateUtil.now());
jsonMst.put("detail_count", 1);
BsrealStorattr storDao = iBsrealStorattrService.getById(IOSConstant.STOR_ID);
jsonMst.put("stor_id", storDao.getStor_id());
jsonMst.put("stor_code", storDao.getStor_code());
jsonMst.put("stor_name", storDao.getStor_name());
// --------------- 组织明细数据 ---------------
JSONArray tableData = new JSONArray();
JSONObject jsonDtl = new JSONObject();
// 查询库存信息
MdPbStoragevehicleext ivtDao = iMdPbStoragevehicleextService.getOne(
new QueryWrapper<MdPbStoragevehicleext>().lambda()
.eq(MdPbStoragevehicleext::getStoragevehicle_code, whereJson.getString("vehicle_code"))
);
jsonDtl.put("frozen_qty", ivtDao.getFrozen_qty());
// 查询物料信息
MdMeMaterialbase materialDao = iMdMeMaterialbaseService.getById(ivtDao.getMaterial_id());
jsonDtl.put("material_id", materialDao.getMaterial_id());
jsonDtl.put("material_code", materialDao.getMaterial_code());
jsonDtl.put("material_name", materialDao.getMaterial_name());
jsonDtl.put("pcsn", ivtDao.getPcsn());
jsonDtl.put("plan_qty", ivtDao.getCanuse_qty());
jsonDtl.put("qty", ivtDao.getCanuse_qty());
jsonDtl.put("qty_unit_id", ivtDao.getQty_unit_id());
jsonDtl.put("qty_unit_name", ivtDao.getQty_unit_name());
jsonDtl.put("storagevehicleext_id", ivtDao.getStoragevehicleext_id());
jsonDtl.put("storagevehicle_code", ivtDao.getStoragevehicle_code());
// 查询仓位
Structattr attrDao = iStructattrService.getByCode(whereJson.getString("point_code1"));
jsonDtl.put("sect_id", attrDao.getSect_id());
jsonDtl.put("struct_id", attrDao.getStruct_id());
jsonDtl.put("turnout_sect_code", attrDao.getSect_code());
jsonDtl.put("turnout_sect_name", attrDao.getSect_name());
jsonDtl.put("turnout_struct_code", attrDao.getStruct_code());
tableData.add(jsonDtl);
jsonMst.put("total_qty", ivtDao.getCanuse_qty());
jsonMst.put("tableData", tableData);
// 调用新增
String iostorinv_id = iOutBillService.insertDtl(jsonMst);
// --------------- 调用分配 ---------------
whereJson.put("iostorinv_id",iostorinv_id);
iOutBillService.allDiv(whereJson);
// --------------- 调用下发 ---------------
whereJson.put("point_code", whereJson.getString("point_code2"));
whereJson.put("checked", false);
iOutBillService.allSetPoint(whereJson);
}
}

View File

@@ -53,4 +53,11 @@ public class PdaSchPointController {
return new ResponseEntity<>(pdaSchPointService.dissect(whereJson), HttpStatus.OK);
}
@PostMapping("/pointToPoint")
@Log("下发点对点任务")
@SaIgnore
public ResponseEntity<Object> pointToPoint(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaSchPointService.pointToPoint(whereJson), HttpStatus.OK);
}
}

View File

@@ -46,4 +46,16 @@ public interface PdaSchPointService extends IService<SchBasePoint> {
*/
PdaResponse dissect(JSONObject whereJson);
/**
* 下发点对点任务
* @param whereJson {
* "point_code1": "起点编码"
* "point_code2": "终点编码"
* "vehicle_code": "载具编码"
* "task_type": "载具任务类型" -- 【1-入库2-出库】
* "is_vehicle": "是否空载具" -- 【1-是2-否】
* }
* @return PdaResponse
*/
PdaResponse pointToPoint(JSONObject whereJson);
}

View File

@@ -1,17 +1,35 @@
package org.nl.wms.pda.sch_manage.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleextService;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleinfoService;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleext;
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.pda.ios_manage.service.PdaIosInService;
import org.nl.wms.pda.ios_manage.service.PdaIosOutService;
import org.nl.wms.pda.sch_manage.service.PdaSchPointService;
import org.nl.wms.pda.util.PdaResponse;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper;
import org.nl.wms.sch_manage.service.util.tasks.EmpVehicleInTask;
import org.nl.wms.sch_manage.service.util.tasks.EmpVehicleOutTask;
import org.nl.wms.warehouse_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.nl.wms.warehouse_management.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_management.service.dao.GroupPlate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* <p>
* 手持点位操作 实现类
@@ -29,6 +47,48 @@ public class PdaSchPointServiceImpl extends ServiceImpl<SchBasePointMapper, SchB
@Autowired
private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService;
/**
* 库存信息服务
*/
@Autowired
private IMdPbStoragevehicleextService iMdPbStoragevehicleextService;
/**
* 仓位信息服务
*/
@Autowired
private IStructattrService iStructattrService;
/**
* 组盘信息服务
*/
@Autowired
private IMdPbGroupplateService iMdPbGroupplateService;
/**
* 手持入库服务
*/
@Autowired
private PdaIosInService pdaIosInService;
/**
* 载具入库任务类
*/
@Autowired
private EmpVehicleInTask empVehicleInTask;
/**
* 手持出库服务类
*/
@Autowired
private PdaIosOutService pdaIosOutService;
/**
* 载具出库任务类
*/
@Autowired
private EmpVehicleOutTask empVehicleOutTask;
@Override
public PdaResponse getPoint(JSONObject whereJson) {
SchBasePoint pointDao = this.getById(whereJson.getString("point_code"));
@@ -60,4 +120,157 @@ public class PdaSchPointServiceImpl extends ServiceImpl<SchBasePointMapper, SchB
);
return PdaResponse.requestOk();
}
@Override
@Transactional
public PdaResponse pointToPoint(JSONObject whereJson) {
// 判断是入库还是出库
if (whereJson.getString("task_type").equals(IOSConstant.IS_DELETE_YES)) {
// 入库
inTask(whereJson);
} else {
outTask(whereJson);
}
return PdaResponse.requestOk();
}
/**
* 点对点入库
* @param whereJson 、
*/
private void inTask(JSONObject whereJson) {
// 校验起点
SchBasePoint pointDao = this.getById(whereJson.getString("point_code1"));
if (ObjectUtil.isEmpty(pointDao)) {
throw new BadRequestException("当前起点不存在【" + whereJson.getString("point_code1") + "");
}
// 校验终点
Structattr attrDao = iStructattrService.getByCode(whereJson.getString("point_code2"));
if (!attrDao.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
throw new BadRequestException("当前终点处于锁定状态不可使用!");
}
if (ObjectUtil.isNotEmpty(attrDao.getStoragevehicle_code())) {
throw new BadRequestException("当前终点已存在载具不可使用!");
}
if (attrDao.getIs_delete().equals(IOSConstant.IS_DELETE_YES) || attrDao.getIs_used().equals(IOSConstant.IS_DELETE_NO)) {
throw new BadRequestException("当前终点未启用或已删除不可使用!");
}
// --------------- 校验载具 ---------------
MdPbStoragevehicleinfo vehicleDao = iMdPbStoragevehicleinfoService.getByCode(whereJson.getString("vehicle_code"));
// 校验托盘是否在仓位中存在
List<Structattr> attrList = iStructattrService.list(
new QueryWrapper<Structattr>().lambda()
.eq(Structattr::getStoragevehicle_code, vehicleDao.getStoragevehicle_code())
);
if (ObjectUtil.isNotEmpty(attrList)) {
throw new BadRequestException("当前载具已入库!");
}
if (whereJson.getString("is_vehicle").equals(IOSConstant.UPDATE_IVT_TYPE_ADD_FROZEN)) {
// 入物料:校验是否有组盘信息
GroupPlate groupDao = iMdPbGroupplateService.getOne(
new QueryWrapper<GroupPlate>().lambda()
.eq(GroupPlate::getStoragevehicle_code, vehicleDao.getStoragevehicle_code())
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("组盘"))
);
if (ObjectUtil.isEmpty(groupDao)) {
throw new BadRequestException("托盘【"+vehicleDao.getStoragevehicle_code()+"】组盘信息不存在,请先进行物料组盘!");
}
// 调用成品入库
JSONObject jsonIosParam = new JSONObject();
jsonIosParam.put("storagevehicle_code", vehicleDao.getStoragevehicle_code());
jsonIosParam.put("point_code", whereJson.getString("point_code1"));
jsonIosParam.put("sect_id", attrDao.getSect_id());
jsonIosParam.put("sect_code", attrDao.getSect_code());
jsonIosParam.put("sect_name", attrDao.getSect_name());
jsonIosParam.put("struct_id", attrDao.getStruct_id());
jsonIosParam.put("struct_code", attrDao.getStruct_code());
jsonIosParam.put("struct_name", attrDao.getStruct_name());
pdaIosInService.confirmIn(jsonIosParam);
} else {
// 锁定仓位
attrDao.setLock_type(IOSEnum.LOCK_TYPE.code("空托盘入库锁"));
iStructattrService.updateById(attrDao);
// 创建载具入库任务
JSONObject jsonTask = new JSONObject();
jsonTask.put("point_code1", whereJson.getString("point_code1"));
jsonTask.put("point_code2", whereJson.getString("point_code2"));
jsonTask.put("vehicle_code", whereJson.getString("vehicle_code"));
jsonTask.put("Priority", IOSConstant.IS_DELETE_YES);
empVehicleInTask.create(jsonTask);
}
}
/**
* 点对点出库
* @param whereJson 、
*/
private void outTask(JSONObject whereJson) {
// 校验起点
Structattr attrDao = iStructattrService.getByCode(whereJson.getString("point_code1"));
if (!attrDao.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
throw new BadRequestException("当前起点处于锁定状态不可使用!");
}
if (ObjectUtil.isEmpty(attrDao.getStoragevehicle_code())) {
throw new BadRequestException("当前起点没有载具!");
}
if (attrDao.getIs_delete().equals(IOSConstant.IS_DELETE_YES) || attrDao.getIs_used().equals(IOSConstant.IS_DELETE_NO)) {
throw new BadRequestException("当前起点未启用或已删除不可使用!");
}
// 校验终点
SchBasePoint pointDao = this.getById(whereJson.getString("point_code2"));
if (ObjectUtil.isEmpty(pointDao)) {
throw new BadRequestException("当前终点不存在【" + whereJson.getString("point_code2") + "");
}
// --------------- 校验载具 ---------------
MdPbStoragevehicleinfo vehicleDao = iMdPbStoragevehicleinfoService.getByCode(whereJson.getString("vehicle_code"));
// 校验托盘是否在仓位中存在
Structattr attrVehicle = iStructattrService.getOne(
new QueryWrapper<Structattr>().lambda()
.eq(Structattr::getStoragevehicle_code, vehicleDao.getStoragevehicle_code())
.eq(Structattr::getIs_used, IOSConstant.IS_DELETE_YES)
.eq(Structattr::getIs_delete, IOSConstant.IS_DELETE_NO)
);
if (ObjectUtil.isEmpty(attrVehicle)) {
throw new BadRequestException("当前载具不在库内不可出库!");
}
if (!attrVehicle.getStruct_code().equals(whereJson.getString("point_code1"))) {
throw new BadRequestException("当前载具与仓位库存载具不符!");
}
if (whereJson.getString("is_vehicle").equals(IOSConstant.UPDATE_IVT_TYPE_ADD_FROZEN)) {
// 出物料:判断是否有库存
MdPbStoragevehicleext ivtDao = iMdPbStoragevehicleextService.getOne(
new QueryWrapper<MdPbStoragevehicleext>().lambda()
.eq(MdPbStoragevehicleext::getStoragevehicle_code, vehicleDao.getStoragevehicle_code())
);
if (ObjectUtil.isEmpty(ivtDao)) {
throw new BadRequestException("当前载具没有物料库存信息!");
}
// 调用创建出库单
pdaIosOutService.createIos(whereJson);
} else {
// 出空载具
if (ObjectUtil.isEmpty(attrVehicle.getIs_emptyvehicle()) || !attrVehicle.getIs_emptyvehicle().equals(IOSConstant.IS_DELETE_YES)) {
throw new BadRequestException("当前仓位不是空载具!");
}
// 锁定起点
attrVehicle.setLock_type(IOSEnum.LOCK_TYPE.code("空托盘出库锁"));
iStructattrService.updateById(attrVehicle);
// 创建任务
JSONObject jsonTask = new JSONObject();
jsonTask.put("point_code1", whereJson.getString("point_code1"));
jsonTask.put("point_code2", whereJson.getString("point_code2"));
jsonTask.put("vehicle_code", vehicleDao.getStoragevehicle_code());
jsonTask.put("Priority", IOSConstant.IS_DELETE_YES);
empVehicleOutTask.create(jsonTask);
}
}
}

View File

@@ -387,7 +387,7 @@ public class RawAssistIStorServiceImpl extends ServiceImpl<IOStorInvMapper, IOSt
if (structattr.getWidth().compareTo(mdPbStoragevehicleinfo.getVehicle_width()) <0 &&
structattr.getHeight().compareTo(mdPbStoragevehicleinfo.getVehicle_height()) <0 &&
structattr.getZdepth().compareTo(mdPbStoragevehicleinfo.getVehicle_long()) <0){
throw new BadRequestException("载具不符合,请检查!");
throw new BadRequestException("当前载具与仓位不匹配,请检查!");
}
sect_id = map.get("sect_id");
sect_code = map.get("sect_code");