rev:空载具出入库分配逻辑修改,料箱出入库分配逻辑修改

This commit is contained in:
2025-09-15 09:57:39 +08:00
parent afec578c1c
commit c585ea5468
13 changed files with 825 additions and 51 deletions

View File

@@ -1,5 +1,6 @@
package org.nl.wms.basedata_manage.service.dao;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@@ -305,4 +306,10 @@ public class Structattr implements Serializable {
*/
private String remark;
/**
* 备注任务标识
*/
@TableField(exist = false)
private String task_id;
}

View File

@@ -0,0 +1,221 @@
package org.nl.wms.sch_manage.service.util.tasks;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
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.config.IdUtil;
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.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.util.ACSTaskTypeEnum;
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_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
* <p>
* 空载具出库移库任务类
* </p>
*
* @author Liuxy
* @since 2025-09-12
*/
@Component(value = "EmpOutMoveTask")
@TaskType("EmpOutMoveTask")
public class EmpOutMoveTask extends AbstractTask {
/**
* 任务服务类
*/
@Autowired
private ISchBaseTaskService taskService;
/**
* 仓位服务
*/
@Autowired
private IStructattrService iStructattrService;
@Override
public String create(JSONObject json) {
SchBaseTask task = new SchBaseTask();
task.setTask_id(IdUtil.getStringId());
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setTask_status(TaskStatus.CREATE.getCode());
task.setConfig_code(EmpOutMoveTask.class.getSimpleName());
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
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.setIs_wait(json.getString("is_wait"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
taskService.save(task);
// 下发任务
this.sendTaskOne(task.getTask_id());
return task.getTask_id();
}
@Override
public AcsTaskDto sendAcsParam(String taskId) {
SchBaseTask taskDao = taskService.getById(taskId);
// 组织下发给acs的数据
AcsTaskDto acsTaskDto = new AcsTaskDto();
acsTaskDto.setExt_task_id(taskDao.getTask_id());
acsTaskDto.setTask_code(taskDao.getTask_code());
acsTaskDto.setStart_device_code(taskDao.getPoint_code1());
acsTaskDto.setNext_device_code(taskDao.getPoint_code2());
acsTaskDto.setVehicle_code(taskDao.getVehicle_code());
acsTaskDto.setVehicle_type(IOSConstant.ONE);
acsTaskDto.setIs_wait(IOSConstant.ZERO);
acsTaskDto.setTask_type(ACSTaskTypeEnum.CTU_TASK.getCode());
acsTaskDto.setPriority(IOSConstant.ONE);
acsTaskDto.setAgv_system_type(IOSConstant.THREE);
acsTaskDto.setIs_get_pause(IOSConstant.ZERO);
acsTaskDto.setIs_put_pause(IOSConstant.ZERO);
return acsTaskDto;
}
@Override
@Transactional
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
@Transactional
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj);
}
@Override
@Transactional
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
throw new BadRequestException("只能取消生成中的任务!");
}
this.cancelTask(taskObj);
}
@Override
public void taskConfirm(String task_code) {
}
@Override
public JSONObject resultWeigh(SchBaseTask taskObj) {
return null;
}
@Transactional
public void finishTask(SchBaseTask taskObj) {
// 起点货位
Structattr startStruct = iStructattrService.getByCode(taskObj.getPoint_code1());
// 终点货位
Structattr endStruct = iStructattrService.getByCode(taskObj.getPoint_code2());
// 更新起点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code1())
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("空托盘出库锁"))
.set(Structattr::getStoragevehicle_code, endStruct.getStoragevehicle_code())
.set(Structattr::getIs_emptyvehicle,
endStruct.getIs_emptyvehicle().equals(IOSConstant.IS_DELETE_YES) ? IOSConstant.IS_DELETE_YES
: IOSConstant.IS_DELETE_NO
)
);
// 更新终点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code2())
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.set(Structattr::getStoragevehicle_code, startStruct.getStoragevehicle_code())
.set(Structattr::getIs_emptyvehicle,
startStruct.getIs_emptyvehicle().equals(IOSConstant.IS_DELETE_YES) ? IOSConstant.IS_DELETE_YES
: IOSConstant.IS_DELETE_NO
)
);
// 更新任务状态
taskObj.setRemark("已完成");
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskService.updateById(taskObj);
}
@Transactional
public void cancelTask(SchBaseTask taskObj) {
// 取消空载具出库任务
SchBaseTask empTask = taskService.getById(taskObj.getExt_group_data());
empTask.setRemark("已取消");
empTask.setTask_status(TaskStatus.CANCELED.getCode());
taskService.updateById(empTask);
// 更新起点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code1())
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
);
// 更新终点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code2())
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
);
// 更新当前任务状态
taskObj.setRemark("已取消");
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskService.updateById(taskObj);
}
}

View File

@@ -0,0 +1,250 @@
package org.nl.wms.sch_manage.service.util.tasks;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
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.config.IdUtil;
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.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.util.ACSTaskTypeEnum;
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_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.nl.wms.warehouse_management.service.dao.IOStorInvDis;
import org.nl.wms.warehouse_management.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;
/**
* <p>
* 出库单出库移库任务类
* </p>
*
* @author Liuxy
* @since 2025-09-12
*/
@Component(value = "IosOutMoveTask")
@TaskType("IosOutMoveTask")
public class IosOutMoveTask extends AbstractTask {
/**
* 任务服务类
*/
@Autowired
private ISchBaseTaskService taskService;
/**
* 仓位服务
*/
@Autowired
private IStructattrService iStructattrService;
/*
* 分配明细mapper
*/
@Resource
private IOStorInvDisMapper ioStorInvDisMapper;
@Override
public String create(JSONObject json) {
SchBaseTask task = new SchBaseTask();
task.setTask_id(IdUtil.getStringId());
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setTask_status(TaskStatus.CREATE.getCode());
task.setConfig_code(IosOutMoveTask.class.getSimpleName());
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setVehicle_code2(json.getString("vehicle_code2"));
task.setExt_group_data(json.getString("ext_group_data"));
task.setGroup_id(json.getString("group_id"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setIs_wait(json.getString("is_wait"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
taskService.save(task);
// 下发任务
this.sendTaskOne(task.getTask_id());
return task.getTask_id();
}
@Override
public AcsTaskDto sendAcsParam(String taskId) {
SchBaseTask taskDao = taskService.getById(taskId);
// 组织下发给acs的数据
AcsTaskDto acsTaskDto = new AcsTaskDto();
acsTaskDto.setExt_task_id(taskDao.getTask_id());
acsTaskDto.setTask_code(taskDao.getTask_code());
acsTaskDto.setStart_device_code(taskDao.getPoint_code1());
acsTaskDto.setNext_device_code(taskDao.getPoint_code2());
acsTaskDto.setVehicle_code(taskDao.getVehicle_code());
acsTaskDto.setVehicle_type(IOSConstant.ONE);
acsTaskDto.setIs_wait(IOSConstant.ZERO);
acsTaskDto.setTask_type(ACSTaskTypeEnum.CTU_TASK.getCode());
acsTaskDto.setPriority(IOSConstant.ONE);
acsTaskDto.setAgv_system_type(IOSConstant.THREE);
acsTaskDto.setIs_get_pause(IOSConstant.ZERO);
acsTaskDto.setIs_put_pause(IOSConstant.ZERO);
return acsTaskDto;
}
@Override
@Transactional
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
@Transactional
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj);
}
@Override
@Transactional
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
throw new BadRequestException("只能取消生成中的任务!");
}
this.cancelTask(taskObj);
}
@Override
public void taskConfirm(String task_code) {
}
@Override
public JSONObject resultWeigh(SchBaseTask taskObj) {
return null;
}
@Transactional
public void finishTask(SchBaseTask taskObj) {
// 起点货位
Structattr startStruct = iStructattrService.getByCode(taskObj.getPoint_code1());
// 终点货位
Structattr endStruct = iStructattrService.getByCode(taskObj.getPoint_code2());
// 更新起点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code1())
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("出库锁"))
.set(Structattr::getStoragevehicle_code, endStruct.getStoragevehicle_code())
.set(Structattr::getInv_id, endStruct.getInv_id())
.set(Structattr::getInv_code, endStruct.getInv_code())
.set(Structattr::getInv_type, endStruct.getInv_type())
.set(Structattr::getIs_emptyvehicle,
endStruct.getIs_emptyvehicle().equals(IOSConstant.IS_DELETE_YES) ? IOSConstant.IS_DELETE_YES
: IOSConstant.IS_DELETE_NO
)
);
// 更新终点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code2())
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.set(Structattr::getStoragevehicle_code, startStruct.getStoragevehicle_code())
.set(Structattr::getInv_id, null)
.set(Structattr::getInv_code, null)
.set(Structattr::getInv_type, null)
.set(Structattr::getIs_emptyvehicle,
startStruct.getIs_emptyvehicle().equals(IOSConstant.IS_DELETE_YES) ? IOSConstant.IS_DELETE_YES
: IOSConstant.IS_DELETE_NO
)
);
// 更新任务状态
taskObj.setRemark("已完成");
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskService.updateById(taskObj);
}
@Transactional
public void cancelTask(SchBaseTask taskObj) {
// 查询终点仓位信息
Structattr attrDao = iStructattrService.getByCode(taskObj.getPoint_code2());
// 还原出库分配明细仓位 / 取消分配明细任务
IOStorInvDis ioStorInvDis = ioStorInvDisMapper.selectById(taskObj.getExt_group_data());
// 取消分配明细任务
SchBaseTask disTask = taskService.getById(ioStorInvDis.getTask_id());
disTask.setRemark("已取消");
disTask.setTask_status(TaskStatus.CANCELED.getCode());
taskService.updateById(disTask);
ioStorInvDis.setStruct_id(attrDao.getStruct_id());
ioStorInvDis.setStruct_code(attrDao.getStruct_code());
ioStorInvDis.setStruct_name(attrDao.getStruct_name());
ioStorInvDis.setTask_id("");
ioStorInvDis.setPoint_code("");
ioStorInvDis.setIs_issued(IOSConstant.ZERO);
ioStorInvDis.setWork_status(IOSEnum.INBILL_DIS_STATUS.code("未生成"));
ioStorInvDisMapper.updateById(ioStorInvDis);
// 更新起点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code1())
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
);
// 更新终点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code2())
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("出库锁"))
);
// 更新任务状态
taskObj.setRemark("已取消");
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskService.updateById(taskObj);
}
}

View File

@@ -73,6 +73,9 @@ public enum IOSEnum {
"库存锁","7", "回库锁","8", "其他锁","99"
)),
// 仓位类型
PLACEMENT_TYPE(MapOf.of("深货位", "1", "浅货位", "2")),
// 库区编码
SECT_CODE(MapOf.of("合格区", "HG01", "待检区", "DJ01", "不合格区", "BHG01")),

View File

@@ -8,6 +8,7 @@ import org.nl.common.domain.query.PageQuery;
import org.nl.wms.basedata_manage.service.dto.MdPbStoragevehicleextDto;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.warehouse_management.service.dao.IOStorInv;
import org.nl.wms.warehouse_management.service.dao.IOStorInvDis;
import org.nl.wms.warehouse_management.service.dto.IOStorInvDisDto;
import org.nl.wms.warehouse_management.service.dto.IOStorInvDtlDto;
import org.springframework.data.domain.Pageable;
@@ -176,4 +177,19 @@ public interface IOutBillService extends IService<IOStorInv> {
* @return
*/
List<Map<String, Object>> getIoDisDtl(JSONObject param);
/**
* 一键设置:创建任务
* @param ioStorInvDis 分配明细实体类
* @param point_code 出库点位
* @param ioStorInv 主表实体类
*/
void createTask(IOStorInvDis ioStorInvDis, String point_code, IOStorInv ioStorInv);
/**
* 一键设置:下发任务校验是否阻挡
* @param ioStorInvDis 分配明细实体类
* @return struct_code 仓位编码
*/
String checkIsHinder(IOStorInvDis ioStorInvDis);
}

View File

@@ -1,5 +1,6 @@
package org.nl.wms.warehouse_management.service.dao;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@@ -132,4 +133,34 @@ public class IOStorInvDis implements Serializable {
*/
private BigDecimal check_qty;
/**
* 仓位放置类型
*/
@TableField(exist = false)
private String placement_type;
/**
* 仓位巷道
*/
@TableField(exist = false)
private String block_num;
/**
* 仓位排
*/
@TableField(exist = false)
private BigDecimal row_num;
/**
* 仓位列
*/
@TableField(exist = false)
private BigDecimal col_num;
/**
* 仓位层
*/
@TableField(exist = false)
private BigDecimal layer_num;
}

View File

@@ -25,4 +25,11 @@ public interface IOStorInvDisMapper extends BaseMapper<IOStorInvDis> {
List<IOStorInvDisDto> queryOutBillDisDtl(@Param("params") Map whereJson);
List<Map<String, Object>> getIoDisDtl(@Param("param") JSONObject param);
/**
* 获取下发任务的分配明细
* @param param /
* @return List<IOStorInvDis>
*/
List<IOStorInvDis> getListDisSend(@Param("param") JSONObject param);
}

View File

@@ -101,4 +101,26 @@
ORDER BY ios.bill_code, dis.seq_no ASC
</select>
<select id="getListDisSend" resultType="org.nl.wms.warehouse_management.service.dao.IOStorInvDis">
SELECT
dis.*,
attr.placement_type,
attr.row_num,
attr.col_num,
attr.layer_num,
attr.block_num
FROM
st_ivt_iostorinvdis dis
LEFT JOIN st_ivt_structattr attr ON attr.struct_id = dis.struct_id
<where>
dis.work_status = '00'
<if test="param.iostorinv_id != null and param.iostorinv_id != ''">
AND dis.iostorinv_id = #{param.iostorinv_id}
</if>
</where>
ORDER BY dis.is_check ASC, attr.placement_type DESC
</select>
</mapper>

View File

@@ -19,11 +19,13 @@ import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.IdUtil;
import org.nl.config.SpringContextHolder;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.basedata_manage.service.IBsrealStorattrService;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleextService;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.BsrealStorattr;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper;
import org.nl.wms.basedata_manage.service.dto.MdPbStoragevehicleextDto;
import org.nl.wms.pdm_manage.enums.BomEnum;
@@ -36,6 +38,7 @@ import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.TaskFactory;
import org.nl.wms.sch_manage.service.util.tasks.IosOutMoveTask;
import org.nl.wms.warehouse_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.nl.wms.warehouse_management.service.IOutBillService;
@@ -131,6 +134,18 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv>
@Resource
private IPdmBomCallMaterialService iPdmBomCallMaterialService;
/**
* 出库单服务
*/
@Autowired
private IOutBillService iOutBillService;
/**
* 出库单出库移库任务类
*/
@Autowired
private IosOutMoveTask iosOutMoveTask;
/**
* 任务工厂服务
*/
@@ -212,6 +227,7 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv>
}
@Override
@Transactional
public void update(JSONObject whereJson) {
String iostorinv_id = (String) whereJson.get("iostorinv_id");
@@ -268,6 +284,7 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv>
}
@Override
@Transactional
public void deleteAll(String[] ids) {
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
@@ -782,6 +799,7 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv>
}
@Override
@Transactional
public void autoCancel(JSONObject whereJson) {
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
@@ -1010,6 +1028,7 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv>
}
@Override
@Transactional
public void oneCancel(JSONObject whereJson) {
String currentUserId = SecurityUtils.getCurrentUserId();
@@ -1112,50 +1131,139 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv>
throw new BadRequestException("未查到相关出库单");
}
List<IOStorInvDis> ioStorInvDisList = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<>(IOStorInvDis.class)
.eq(IOStorInvDis::getIostorinv_id, iostorinv_id)
.eq(IOStorInvDis::getIs_issued, BaseDataEnum.IS_YES_NOT.code(""))
.and(wrapper -> wrapper.isNotNull(IOStorInvDis::getStruct_code).ne(IOStorInvDis::getStruct_code, ""))
.orderByAsc(IOStorInvDis::getIs_check)
List<IOStorInvDis> ioStorInvDisList = ioStorInvDisMapper.getListDisSend(whereJson);
);
if (ObjectUtil.isEmpty(ioStorInvDisList)) {
throw new BadRequestException("当前没有可设置的分配明细");
}
// 根据任务类创建任务
IOStorInv iosMstDao = ioStorInvMapper.selectById(ioStorInvDisList.get(0).getIostorinv_id());
for (IOStorInvDis ioStorInvDis : ioStorInvDisList) {
//创建任务
JSONObject task_form = new JSONObject();
task_form.put("task_type", "STOutTask");
task_form.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
task_form.put("point_code1", ioStorInvDis.getStruct_code());
task_form.put("point_code2", point_code);
task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code());
task_form.put("material_id", ioStorInvDis.getMaterial_id());
task_form.put("material_qty", ioStorInvDis.getPlan_qty());
if (ioStorInvDis.getIs_check().equals(IOSConstant.ONE)) {
task_form.put("is_wait", IOSConstant.ONE);
} else {
task_form.put("is_wait", IOSConstant.ZERO);
}
AbstractTask task = taskFactory.getTask(IOSEnum.OUT_CONFIG_CODE.code(iosMstDao.getBill_type()));
String task_id = task.create(task_form);
//分配明细表更新任务相关数据
IOStorInvDis dis = new IOStorInvDis();
dis.setIostorinvdis_id(ioStorInvDis.getIostorinvdis_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(point_code);
ioStorInvDisMapper.updateById(dis);
// 创建任务
iOutBillService.createTask(ioStorInvDis,point_code,ioStorInv);
}
}
@Override
public void createTask(IOStorInvDis ioStorInvDis, String point_code, IOStorInv ioStorInv) {
/*
* 判断是否是深浅货位
* 1.浅货位:直接创建任务
* 2.深货位
* 1判断浅货位没货直接创建任务
* 2浅货位有货且未锁定生成深浅货位互换移库后在下发出库任务
* 3浅货位有货且锁定判断是否此单据下的出库任务如果是则直接生成出库任务
* 如果不是则报错提示
*/
// 调用校验方法
String struct_code = iOutBillService.checkIsHinder(ioStorInvDis);
//创建任务
JSONObject task_form = new JSONObject();
task_form.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
task_form.put("point_code1", struct_code);
task_form.put("point_code2", point_code);
task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code());
task_form.put("material_id", ioStorInvDis.getMaterial_id());
task_form.put("material_qty", ioStorInvDis.getPlan_qty());
if (ioStorInvDis.getIs_check().equals(IOSConstant.ONE)) {
task_form.put("is_wait", IOSConstant.ONE);
} else {
task_form.put("is_wait", IOSConstant.ZERO);
}
AbstractTask task = taskFactory.getTask(IOSEnum.OUT_CONFIG_CODE.code(ioStorInv.getBill_type()));
String task_id = task.create(task_form);
//分配明细表更新任务相关数据
IOStorInvDis dis = new IOStorInvDis();
dis.setIostorinvdis_id(ioStorInvDis.getIostorinvdis_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(point_code);
ioStorInvDisMapper.updateById(dis);
}
@Override
public String checkIsHinder(IOStorInvDis ioStorInvDis) {
// 返回仓位
String struct_code;
// 1.判断仓位深浅货位
if (ioStorInvDis.getPlacement_type().equals(IOSEnum.PLACEMENT_TYPE.code("浅货位"))) {
// 浅货位直接生成任务
return ioStorInvDis.getStruct_code();
}
// 2.深货位:判断浅货位是否有货
// 查询浅货位
Structattr shallowAttr = iStructattrService.getOne(
new QueryWrapper<Structattr>().lambda()
.eq(Structattr::getBlock_num, ioStorInvDis.getBlock_num())
.eq(Structattr::getCol_num, ioStorInvDis.getCol_num())
.eq(Structattr::getLayer_num, ioStorInvDis.getLayer_num())
.eq(Structattr::getPlacement_type, IOSEnum.PLACEMENT_TYPE.code("浅货位"))
);
if (ObjectUtil.isEmpty(shallowAttr)) {
throw new BadRequestException("仓位【"+ioStorInvDis.getStruct_code()+"】对应的浅货位不存在,请检查数据!");
}
// 判断浅货位是否有货
if (ObjectUtil.isNotEmpty(shallowAttr.getStoragevehicle_code())) {
// 判断是否被锁定
if (shallowAttr.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
// 未锁定:生成出库移库任务
JSONObject jsonMoveTask = new JSONObject();
jsonMoveTask.put("point_code1", shallowAttr.getStruct_code());
jsonMoveTask.put("point_code2", ioStorInvDis.getStruct_code());
jsonMoveTask.put("vehicle_code", shallowAttr.getStoragevehicle_code());
jsonMoveTask.put("vehicle_code2", ioStorInvDis.getStoragevehicle_code());
jsonMoveTask.put("ext_group_data", ioStorInvDis.getIostorinvdis_id());
iosOutMoveTask.create(jsonMoveTask);
// 更新起点锁类型
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("移出锁"))
.eq(Structattr::getStruct_code, jsonMoveTask.getString("point_code1"))
);
// 更新终点锁类型
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("移入锁"))
.eq(Structattr::getStruct_code, jsonMoveTask.getString("point_code2"))
);
// 更新分配明细新仓位
ioStorInvDis.setStruct_id(shallowAttr.getStruct_id());
ioStorInvDis.setStruct_code(shallowAttr.getStruct_code());
ioStorInvDis.setStruct_name(shallowAttr.getStruct_name());
ioStorInvDisMapper.updateById(ioStorInvDis);
struct_code = shallowAttr.getStruct_code();
} else {
// 被锁定:判断是否是本单据
if (ObjectUtil.isNotEmpty(shallowAttr.getInv_id()) && shallowAttr.getInv_id().equals(ioStorInvDis.getIostorinv_id())) {
// 相同单据出库任务:直接生成出库任务
return ioStorInvDis.getStruct_code();
} else {
throw new BadRequestException("当前仓位【"+shallowAttr.getStruct_code()+"】被其他出库单据锁定或人工锁定,无法下发移库任务!");
}
}
} else {
// 浅货位无货
if (shallowAttr.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
// 直接生成出库任务
return ioStorInvDis.getStruct_code();
} else {
throw new BadRequestException("当前仓位【"+shallowAttr.getStruct_code()+"】有其他入库任务或人工锁定,无法下发出库任务,请等待任务完成或人工解锁!");
}
}
return struct_code;
}
@Override
@Transactional
public void confirm(JSONObject whereJson) {
String currentUserId = SecurityUtils.getCurrentUserId();

View File

@@ -771,6 +771,7 @@ public class RawAssistIStorServiceImpl extends ServiceImpl<IOStorInvMapper, IOSt
.eq(Structattr::getIs_delete, IOSConstant.IS_DELETE_NO)
.eq(Structattr::getIs_used, IOSConstant.IS_DELETE_YES)
.and(wrapper -> wrapper.isNull(Structattr::getStoragevehicle_code).or().eq(Structattr::getStoragevehicle_code, ""))
.orderByAsc(Structattr::getPlacement_type)
.orderByAsc(Structattr::getStruct_code)
);

View File

@@ -139,6 +139,7 @@ public class VehicleInServiceImpl implements VehicleInService {
.eq(Structattr::getIs_delete, IOSConstant.IS_DELETE_NO)
.eq(Structattr::getIs_used, IOSConstant.IS_DELETE_YES)
.and(wrapper -> wrapper.isNull(Structattr::getStoragevehicle_code).or().eq(Structattr::getStoragevehicle_code, ""))
.orderByAsc(Structattr::getPlacement_type)
.orderByAsc(Structattr::getStruct_code)
);

View File

@@ -3,13 +3,18 @@ package org.nl.wms.warehouse_management.service.impl;
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.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.dao.mapper.SchBaseTaskMapper;
import org.nl.wms.sch_manage.service.util.tasks.EmpOutMoveTask;
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;
@@ -34,11 +39,17 @@ import java.util.Map;
public class VehicleOutServiceImpl implements VehicleOutService {
/**
* 任务服务
* 任务mapper
*/
@Autowired
private SchBaseTaskMapper schBaseTaskMapper;
/**
* 任务服务
*/
@Autowired
private ISchBaseTaskService iSchBaseTaskService;
/**
* 仓位服务
*/
@@ -51,6 +62,12 @@ public class VehicleOutServiceImpl implements VehicleOutService {
@Resource
private EmpVehicleOutTask empVehicleOutTask;
/**
* 空载具出库移库任务类
*/
@Autowired
private EmpOutMoveTask empOutMoveTask;
@Override
public IPage<JSONObject> queryAll(Map whereJson, PageQuery page) {
whereJson.put("config_code", EmpVehicleOutTask.class.getSimpleName());
@@ -61,10 +78,55 @@ public class VehicleOutServiceImpl implements VehicleOutService {
@Transactional
public void create(JSONObject whereJson) {
// 根据库区找空载具
Structattr structattr = autoDivStruct(whereJson);
// 锁定仓位
structattr.setLock_type(IOSEnum.LOCK_TYPE.code("空托盘出库锁"));
iStructattrService.updateById(structattr);
List<Structattr> attrList = autoDivStruct(whereJson);
Structattr structattr = new Structattr();
for (Structattr attrDao : attrList) {
// 判断是深浅货位
if (attrDao.getPlacement_type().equals(IOSEnum.PLACEMENT_TYPE.code("浅货位"))) {
// 直接创建出库任务
structattr = attrDao;
break;
} else {
// 深货位:判断浅货位是否有货
// 查询浅货位
Structattr shallowAttr = iStructattrService.getOne(
new QueryWrapper<Structattr>().lambda()
.eq(Structattr::getBlock_num, attrDao.getBlock_num())
.eq(Structattr::getCol_num, attrDao.getCol_num())
.eq(Structattr::getLayer_num, attrDao.getLayer_num())
.eq(Structattr::getPlacement_type, IOSEnum.PLACEMENT_TYPE.code("浅货位"))
);
if (ObjectUtil.isEmpty(shallowAttr)) {
throw new BadRequestException("仓位【" + attrDao.getStruct_code() + "】对应的浅货位不存在,请检查数据!");
}
if (ObjectUtil.isEmpty(shallowAttr.getStoragevehicle_code())) {
// 浅货位空位
if (shallowAttr.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
// 直接创建出库任务
structattr = attrDao;
break;
} else {
continue;
}
} else {
// 浅货位有货
if (shallowAttr.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
// 创建移库任务
structattr = createMoveTask(attrDao, shallowAttr);
break;
} else {
continue;
}
}
}
}
if (ObjectUtil.isEmpty(structattr)) {
throw new BadRequestException("暂时没有可用的空载具!");
}
// 创建任务
JSONObject jsonTask = new JSONObject();
@@ -72,10 +134,54 @@ public class VehicleOutServiceImpl implements VehicleOutService {
jsonTask.put("point_code2", IOSConstant.CZW_POINT);
// 判断终点是否是称重位
jsonTask.put("point_code3", whereJson.getString("point_code").equals(IOSConstant.CZW_POINT)
? "" : whereJson.getString("point_code")
? "" : whereJson.getString("point_code")
);
jsonTask.put("vehicle_code", structattr.getStoragevehicle_code());
empVehicleOutTask.create(jsonTask);
String task_id = empVehicleOutTask.create(jsonTask);
if (ObjectUtil.isNotEmpty(structattr.getTask_id())) {
// 更新空载具出库任务类ext_group_data字段
iSchBaseTaskService.update(
new UpdateWrapper<SchBaseTask>().lambda()
.set(SchBaseTask::getExt_group_data, task_id)
.eq(SchBaseTask::getTask_id, structattr.getTask_id())
);
}
}
/**
* 创建移库任务
*
* @param attrDao 深货位
* @param shallowAttr 浅货位
* @return Structattr 新货位
*/
private Structattr createMoveTask(Structattr attrDao, Structattr shallowAttr) {
// 锁定起点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("移出锁"))
.eq(Structattr::getStruct_code, shallowAttr.getStruct_code())
);
// 锁定终点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("移入锁"))
.eq(Structattr::getStruct_code, attrDao.getStruct_code())
);
// 创建移库任务
JSONObject jsonMoveTask = new JSONObject();
jsonMoveTask.put("point_code1", shallowAttr.getStruct_code());
jsonMoveTask.put("point_code2", attrDao.getStruct_code());
jsonMoveTask.put("vehicle_code", shallowAttr.getStoragevehicle_code());
jsonMoveTask.put("vehicle_code2", attrDao.getStoragevehicle_code());
String task_id = empOutMoveTask.create(jsonMoveTask);
shallowAttr.setTask_id(task_id);
shallowAttr.setStoragevehicle_code(attrDao.getStoragevehicle_code());
return shallowAttr;
}
/**
@@ -84,24 +190,25 @@ public class VehicleOutServiceImpl implements VehicleOutService {
* @param whereJson {
* sect_code: 库区编码
* }
* @return Structattr 仓位实体类
* @return List<Structattr> 仓位实体类即可
*/
private Structattr autoDivStruct(JSONObject whereJson) {
private List<Structattr> autoDivStruct(JSONObject whereJson) {
// 根据库区查询对应载具
List<Structattr> structattr = iStructattrService.list(new LambdaQueryWrapper<>(Structattr.class)
List<Structattr> attrList = iStructattrService.list(new LambdaQueryWrapper<>(Structattr.class)
.eq(Structattr::getSect_code, whereJson.getString("sect_code"))
.eq(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.eq(Structattr::getIs_delete, IOSConstant.IS_DELETE_NO)
.eq(Structattr::getIs_used, IOSConstant.IS_DELETE_YES)
.eq(Structattr::getIs_emptyvehicle, IOSConstant.IS_DELETE_YES)
.and(wrapper -> wrapper.isNotNull(Structattr::getStoragevehicle_code).or().ne(Structattr::getStoragevehicle_code, ""))
.orderByDesc(Structattr::getPlacement_type)
.orderByAsc(Structattr::getStruct_code)
);
if (ObjectUtil.isEmpty(structattr)) {
throw new BadRequestException("未找到满足的仓位");
if (ObjectUtil.isEmpty(attrList)) {
throw new BadRequestException("库内没有空载具");
}
return structattr.get(0);
return attrList;
}
}