opt:西门子优化,增加SD01重复入库功能

This commit is contained in:
2026-02-26 16:29:44 +08:00
parent 4fad5fc928
commit f76e7b1142
53 changed files with 1143 additions and 41 deletions

View File

@@ -19,6 +19,9 @@ public enum RegionEnum {
ZDZWQ("自动折弯区","ZDZWQ"),
NBGD("内部过道加工区","NBGDJGQ"),
QTJG("其他加工送料暂存区","111-22"),
LAG("S04存放点","LAG"),
S("空容器货架C","S"),
;
private final String region_name;
private final String region_code;

View File

@@ -5,6 +5,7 @@ import org.nl.common.domain.query.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.wms.database.vehicle.service.dao.MdBaseVehicle;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -46,4 +47,10 @@ public interface IMdBaseVehicleService extends IService<MdBaseVehicle> {
* @param vehicle_code
*/
MdBaseVehicle selectByVehicleCode(String vehicle_code);
/**
* 根据载具号查询
* @param vehicle_code_list
*/
List<MdBaseVehicle> selectListByVehicleCode(List<String> vehicle_code_list);
}

View File

@@ -19,6 +19,7 @@ import org.nl.wms.database.vehicle.service.dao.MdBaseVehicle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -89,4 +90,10 @@ public class MdBaseVehicleServiceImpl extends ServiceImpl<MdBaseVehicleMapper, M
.eq(MdBaseVehicle::getVehicle_code, vehicle_code));
}
@Override
public List<MdBaseVehicle> selectListByVehicleCode(List<String> vehicle_code_list) {
return mdBaseVehicleMapper.selectList(Wrappers.lambdaQuery(MdBaseVehicle.class)
.in(MdBaseVehicle::getVehicle_code, vehicle_code_list));
}
}

View File

@@ -8,9 +8,11 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.base.TableDataInfo;
import org.nl.common.exception.BadRequestException;
import org.nl.common.logging.annotation.Log;
import org.nl.wms.ext.fab.service.dto.CallEmpVo;
import org.nl.wms.ext.fab.service.impl.FabServiceImpl;
import org.nl.wms.ext.handheld.dto.EmptyVehicleWarehousingDto;
import org.nl.wms.ext.handheld.service.HandheldService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
@@ -42,6 +44,13 @@ public class HandheldController {
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/emptyVehicleWarehousing")
@Log("空载具入库")
public ResponseEntity<Object> emptyVehicleWarehousing(@RequestBody EmptyVehicleWarehousingDto dto) {
handheldService.emptyVehicleWarehousing(dto);
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/rack")
@Log("外协区空料架送回")
@@ -73,6 +82,12 @@ public class HandheldController {
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/getSD01GroupLog")
@Log("获取SD01出库组盘")
public ResponseEntity<Object> getSD01GroupLog(@RequestBody JSONObject param) {
return new ResponseEntity<>( handheldService.getSD01GroupLog(param),HttpStatus.OK);
}
@PostMapping("/lock")
@Log("点位锁定释放")

View File

@@ -0,0 +1,14 @@
package org.nl.wms.ext.handheld.dto;
import lombok.Data;
import java.util.List;
/**
* 空载具入库Dto
*/
@Data
public class EmptyVehicleWarehousingDto {
List<VehicleDto> vehicleList;
}

View File

@@ -0,0 +1,21 @@
package org.nl.wms.ext.handheld.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 空载具入库Dto
*/
@Data
public class VehicleDto {
@NotBlank
@ApiModelProperty(value = "点位不能为空")
private String point_code;
@NotBlank
@ApiModelProperty(value = "载具编码不能为空")
private String vehicle_code;
}

View File

@@ -2,6 +2,8 @@ package org.nl.wms.ext.handheld.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.nl.wms.ext.handheld.dto.EmptyVehicleWarehousingDto;
import org.nl.wms.sch.group_delete_log.service.dto.SD01GroupLogRespondDto;
import java.util.List;
@@ -18,6 +20,13 @@ public interface HandheldService {
*/
void emptyCageStorageTask(JSONObject param);
/**
* 空载具入库
* @param param
* @return
*/
void emptyVehicleWarehousing(EmptyVehicleWarehousingDto param);
/**
* 手持呼叫空料笼
@@ -32,6 +41,12 @@ public interface HandheldService {
*/
void cageBlankingTask(JSONObject param);
/**
* 获取SD01出库组盘
* @param param
*/
SD01GroupLogRespondDto getSD01GroupLog(JSONObject param);
/**
* 点位锁定
* @param param

View File

@@ -23,6 +23,12 @@ import org.nl.common.enums.VehicleTypeEnum;
import org.nl.common.enums.region.RegionEnum;
import org.nl.system.service.dict.ISysDictService;
import org.nl.system.service.dict.dao.Dict;
import org.nl.wms.ext.handheld.dto.EmptyVehicleWarehousingDto;
import org.nl.wms.ext.handheld.dto.VehicleDto;
import org.nl.wms.sch.group_delete_log.service.dao.SchBaseVehiclematerialgroupDeleteLog;
import org.nl.wms.sch.group_delete_log.service.ISchBaseVehiclematerialgroupDeleteLogService;
import org.nl.wms.sch.group_delete_log.service.dto.LogMaterialDto;
import org.nl.wms.sch.group_delete_log.service.dto.SD01GroupLogRespondDto;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum;
import org.nl.common.exception.BadRequestException;
@@ -53,6 +59,7 @@ import org.nl.wms.sch.task_manage.GeneralDefinition;
import org.nl.wms.sch.task_manage.task.TaskFactory;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import org.nl.wms.sch.task_manage.task.core.TaskType;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
@@ -101,6 +108,9 @@ public class HandheldServiceImpl implements HandheldService {
@Autowired
private ISysDictService dictService;
@Autowired
private ISchBaseVehiclematerialgroupDeleteLogService iSchBaseVehiclematerialgroupDeleteLogService;
@Autowired
private SchBasePointMapper schBasePointMapper;
static final Map<String, String> STATUS = MapOf.of("释放", "0", "锁定", "1");
@@ -132,6 +142,115 @@ public class HandheldServiceImpl implements HandheldService {
}
/**
* 手持创建空载具入库,批量
* @param param
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class) // 新增:事务控制,保证任务生成原子性
public void emptyVehicleWarehousing(EmptyVehicleWarehousingDto param) {
// 抽取魔法值为常量,便于后续维护
final String OUTSOURCE_TEMP_AREA = "外协加工暂存区";
final String MSG_VEHICLE_NOT_EXIST_BATCH = "载具%s不存在";
final String MSG_VEHICLE_OCCUPIED_BATCH = "以下载具已占用点位,无法入库:%s";
// 1. 提取载具列表并判空
List<VehicleDto> vehicleList = param.getVehicleList();
if (CollectionUtil.isEmpty(vehicleList)) {
throw new BadRequestException("载具列表不能为空!");
}
// 2. 提取载具编码过滤null/空字符串,避免无效查询),并校验
List<String> vehicleCodeList = vehicleList.stream()
.map(VehicleDto::getVehicle_code)
.filter(org.springframework.util.StringUtils::hasText) // 统一使用spring的字符串工具类过滤无效值
.collect(Collectors.toList());
if (CollectionUtil.isEmpty(vehicleCodeList)) {
throw new BadRequestException("载具编码不能为空!");
}
// 3. 查询数据库中存在的载具,批量校验无效载具
List<MdBaseVehicle> mdBaseVehicleList = iMdBaseVehicleService.selectListByVehicleCode(vehicleCodeList);
if (CollectionUtil.isEmpty(mdBaseVehicleList)) {
throw new BadRequestException("载具在系统中不存在,请在系统中维护!");
}
Set<String> existVehicleCodeSet = mdBaseVehicleList.stream()
.map(MdBaseVehicle::getVehicle_code)
.collect(Collectors.toSet());
// 批量收集所有无效载具,统一提示(优化用户体验)
List<String> invalidVehicleCodes = vehicleCodeList.stream()
.filter(vehicleCode -> !existVehicleCodeSet.contains(vehicleCode))
.collect(Collectors.toList());
if (!CollectionUtil.isEmpty(invalidVehicleCodes)) {
String invalidVehicleMsg = String.join(",", invalidVehicleCodes);
throw new BadRequestException(String.format(MSG_VEHICLE_NOT_EXIST_BATCH, invalidVehicleMsg));
}
// 4. 校验载具是否已占用有效点位,批量提示违规载具
List<SchBasePoint> occupiedPoints = iSchBasePointService.list(Wrappers.lambdaQuery(SchBasePoint.class)
.in(SchBasePoint::getVehicle_code, existVehicleCodeSet)
.ne(SchBasePoint::getRegion_name, OUTSOURCE_TEMP_AREA) // 使用常量,消除魔法值
.eq(SchBasePoint::getIs_used, true));
if (!CollectionUtil.isEmpty(occupiedPoints)) {
String occupiedMsg = occupiedPoints.stream()
.map(point -> String.format("%s点位%s", point.getVehicle_code(), point.getPoint_code()))
.collect(Collectors.joining(","));
throw new BadRequestException(String.format(MSG_VEHICLE_OCCUPIED_BATCH, occupiedMsg));
}
// 5. 点位校验(保留你的优化,仅统一工具类和冗余调用)
List<String> pointCodeList = vehicleList.stream()
.map(VehicleDto::getPoint_code)
.filter(org.springframework.util.StringUtils::hasText)
.collect(Collectors.toList());
if (CollectionUtil.isEmpty(pointCodeList)) {
throw new BadRequestException("点位编码不能为空!");
}
List<SchBasePoint> pointList = iSchBasePointService.selectListByPointCode(pointCodeList);
Set<String> existPointCodeSet = pointList.stream()
.map(SchBasePoint::getPoint_code)
.collect(Collectors.toSet());
List<String> invalidPointCodes = pointCodeList.stream()
.filter(pointCode -> !existPointCodeSet.contains(pointCode))
.collect(Collectors.toList());
if (!CollectionUtil.isEmpty(invalidPointCodes)) {
throw new BadRequestException("点位" + String.join(",", invalidPointCodes) + "不存在!");
}
// 6. 点位排序(保持原有逻辑)
List<SchBasePoint> sortedPointList = pointList.stream()
.sorted(Comparator.comparing(
SchBasePoint::getOut_empty_seq,
Comparator.nullsLast(Integer::compareTo)
))
.collect(Collectors.toList());
// 7. 匹配点位和载具生成任务优化构建Map消除双层嵌套循环提升性能
Map<String, List<VehicleDto>> point2VehicleMap = vehicleList.stream()
.collect(Collectors.groupingBy(VehicleDto::getPoint_code));
for (SchBasePoint schBasePoint : sortedPointList) {
String pointCode = schBasePoint.getPoint_code();
List<VehicleDto> matchVehicleDtos = point2VehicleMap.get(pointCode);
if (CollectionUtil.isNotEmpty(matchVehicleDtos)) {
for (VehicleDto vehicleDto : matchVehicleDtos) {
// 生成任务(可添加日志记录,便于生产环境排查问题)
artificialBendingNew(vehicleDto.getVehicle_code(), vehicleDto.getPoint_code());
}
}
}
}
/**
* 空载具送回货架
*/
@@ -192,6 +311,22 @@ public class HandheldServiceImpl implements HandheldService {
rackTask(param, vehicle, device_code, mdBaseVehicle);
}
/**
* 空料框送回
*/
private void artificialBendingNew(String vehicle_code, String point_code) {
SchBasePoint schBasePoint = iSchBasePointService.selectByPointCode(point_code);
if (ObjectUtil.isEmpty(schBasePoint)) throw new BadRequestException("设备点位不存在!");
AbstractTask connectorTask = taskFactory.getTask("EMPTYCAGENEWTask");
// 准备参数:设备编码
JSONObject jo = new JSONObject();
jo.put("device_code", point_code);
jo.put("config_code", "EMPTYCAGENEWTask");
jo.put("create_mode", GeneralDefinition.AUTO_CREATION);
jo.put("vehicle_code", vehicle_code);
connectorTask.apply(jo);
}
/**
* 空料框送回
*/
@@ -287,6 +422,43 @@ public class HandheldServiceImpl implements HandheldService {
String vehicle_code = param.getString("vehicle_code");
String type = param.getString("type");
AbstractTask connectorTask = taskFactory.getTask("BLANKINGTask");
//是否需要从日志表重新入库的标志
Boolean reentry_flag = param.getBoolean("reentry_flag");
reentry_flag = true;
//如果当前点位是SD01点位且当前载具在组盘表中不存在
List<Map> groups = iSchBaseVehiclematerialgroupService.selectGroupByVehicleCode(param.getString("vehicle_code"));
if (reentry_flag!= null && reentry_flag && "SD01".equals(device_code) && CollectionUtil.isEmpty(groups) ) {
List<Dict> dictList = dictService.getDictByName("sd01_interval_hour");
if(CollectionUtil.isNotEmpty(dictList)){
Dict dict = dictList.get(0);
if("hour".equals(dict.getLabel())){
String hour = dict.getValue();
List<SchBaseVehiclematerialgroupDeleteLog> logList = iSchBaseVehiclematerialgroupDeleteLogService
.list(Wrappers.lambdaQuery(SchBaseVehiclematerialgroupDeleteLog.class)
// 1. 对数据库字段用Lambda + 字段名MyBatis-Plus会自动转下划线
.eq(SchBaseVehiclematerialgroupDeleteLog::getVehicle_code, vehicle_code)
// 2. 对非数据库字段(@TableField(exist=false)改用apply手动拼接
.apply("point_code = {0}", device_code)
// 3. 核心新增:筛选 hour 小时内删除的数据
.apply("delete_time >= DATE_SUB(NOW(), INTERVAL {0} HOUR)", hour)
.orderByDesc(SchBaseVehiclematerialgroupDeleteLog::getDelete_time)
.last("LIMIT 1"));
//则自动将log表中的数据库插入到组盘表中
if(CollectionUtil.isNotEmpty(logList)){
SchBaseVehiclematerialgroupDeleteLog log = logList.get(0);
SchBaseVehiclematerialgroup group = new SchBaseVehiclematerialgroup();
BeanUtils.copyProperties(log,group);
iSchBaseVehiclematerialgroupService.save(group);
}
}
}
}
switch (type) {
case "1":
goShelves(schBasePoint, param, region_code, device_code, vehicle_code, connectorTask);
@@ -308,6 +480,63 @@ public class HandheldServiceImpl implements HandheldService {
}
}
@Override
public SD01GroupLogRespondDto getSD01GroupLog(JSONObject param) {
String device_code = param.getString("device_code");
String vehicle_code = param.getString("vehicle_code");
if(!"SD01".equals(device_code) || StringUtils.isBlank(vehicle_code)){
return null;
}
List<Dict> dictList = dictService.getDictByName("sd01_interval_hour");
if(CollectionUtil.isEmpty(dictList)){
return null;
}
Dict dict = dictList.get(0);
if(!"hour".equals(dict.getLabel())){
return null;
}
String hour = dict.getValue();
// 修复后的查询代码兼容下划线字段的Lambda写法
List<SchBaseVehiclematerialgroupDeleteLog> logList = iSchBaseVehiclematerialgroupDeleteLogService
.list(Wrappers.lambdaQuery(SchBaseVehiclematerialgroupDeleteLog.class)
// 1. 对数据库字段用Lambda + 字段名MyBatis-Plus会自动转下划线
.eq(SchBaseVehiclematerialgroupDeleteLog::getVehicle_code, vehicle_code)
// 2. 对非数据库字段(@TableField(exist=false)改用apply手动拼接
.apply("point_code = {0}", device_code)
// 3. 核心新增:筛选 hour 小时内删除的数据
.apply("delete_time >= DATE_SUB(NOW(), INTERVAL {0} HOUR)", hour)
.orderByDesc(SchBaseVehiclematerialgroupDeleteLog::getDelete_time)
.last("LIMIT 1"));
if(CollectionUtil.isEmpty(logList)){
return null;
}
SD01GroupLogRespondDto sd01GroupLogRespondDto = new SD01GroupLogRespondDto();
LogMaterialDto logMaterialDto = new LogMaterialDto();
logMaterialDto.setMaterial_qty(logList.get(0).getMaterial_qty());
logMaterialDto.setMaterial_code(logList.get(0).getMaterial_id());
logMaterialDto.setDue_date(logList.get(0).getDue_date());
logMaterialDto.setOrder_code(logList.get(0).getOrder_code());
List<LogMaterialDto> logMaterialDtos = new ArrayList<>();
logMaterialDtos.add(logMaterialDto);
sd01GroupLogRespondDto.setMaterial(logMaterialDtos);
sd01GroupLogRespondDto.setDevice_code(device_code);
sd01GroupLogRespondDto.setRegionCode(logList.get(0).getRegion_code());
sd01GroupLogRespondDto.setRegion_Code(logList.get(0).getRegion_code());
sd01GroupLogRespondDto.setVehicle_code(vehicle_code);
return sd01GroupLogRespondDto;
}
/**
* connector下料入库
*/

View File

@@ -0,0 +1,13 @@
package org.nl.wms.sch.group_delete_log.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.wms.sch.group_delete_log.service.dao.SchBaseVehiclematerialgroupDeleteLog;
/**
* @description 服务接口
* @author zxm
* @date 2026年2月25日10:54:29
**/
public interface ISchBaseVehiclematerialgroupDeleteLogService extends IService<SchBaseVehiclematerialgroupDeleteLog> {
}

View File

@@ -0,0 +1,197 @@
package org.nl.wms.sch.group_delete_log.service.dao;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/**
* @author lyd
* @description /
* @date 2023-05-16
**/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("sch_base_vehiclematerialgroup_delete_log")
public class SchBaseVehiclematerialgroupDeleteLog implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "group_id", type = IdType.NONE)
@ApiModelProperty(value = "组盘标识")
private String group_id;
@ApiModelProperty(value = "区域编码")
private String region_code;
@ApiModelProperty(value = "载具编码")
private String vehicle_code;
@ApiModelProperty(value = "物料标识")
private String material_id;
@ApiModelProperty(value = "载具类型")
private String vehicle_type;
@ApiModelProperty(value = "子载具编码")
private String child_vehicle_code;
@ApiModelProperty(value = "来源载具编码")
private String source_vehicle_code;
@TableField(exist = false)
@ApiModelProperty(value = "点位编码")
private String point_code;
@TableField(exist = false)
@ApiModelProperty(value = "点位名称")
private String point_name;
@ApiModelProperty(value = "是否满托")
private Boolean is_full;
@ApiModelProperty(value = "批次")
private String pcsn;
@ApiModelProperty(value = "入库时间")
private String instorage_time;
@ApiModelProperty(value = "静置时间(分钟)")
private Integer standing_time;
@ApiModelProperty(value = "物料数量")
private Integer material_qty;
@ApiModelProperty(value = "connector任务号")
private String job_name;
@ApiModelProperty(value = "物料重量")
private BigDecimal material_weight;
@ApiModelProperty(value = "搬运工单编码")
private String order_code;
@ApiModelProperty(value = "组盘次数")
private Integer group_number;
@ApiModelProperty(value = "任务编码")
private String task_code;
@ApiModelProperty(value = "额外信息")
private String ext_data;
@ApiModelProperty(value = "是否已加工")
private Boolean has_work;
@ApiModelProperty(value = "交期时间")
private String due_date;
@ApiModelProperty(value = "车间编码")
private String workshop_code;
@ApiModelProperty(value = "组盘状态")
private String group_status;
@ApiModelProperty(value = "业务表表名")
private String table_name;
@ApiModelProperty(value = "业务表表名主键字段")
private String table_fk;
@ApiModelProperty(value = "业务表表名主键值")
private String table_fk_id;
@ApiModelProperty(value = "业务链路标识")
private String buss_move_id;
@ApiModelProperty(value = "优先级")
private String priority;
@ApiModelProperty(value = "流程编码")
private String flow_code;
@ApiModelProperty(value = "流程顺序")
private BigDecimal flow_num;
@ApiModelProperty(value = "上一任务编码")
private String before_task_code;
@ApiModelProperty(value = "下一任务编码")
private String next_task_code;
@ApiModelProperty(value = "扩展")
private String extend;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "1:待绑定2:已绑定3:已解绑")
private String group_bind_material_status;
@ApiModelProperty(value = "是否删除")
private Boolean is_delete;
@ApiModelProperty(value = "创建人")
private String create_id;
@ApiModelProperty(value = "创建人")
private String create_name;
@ApiModelProperty(value = "创建时间")
private String create_time;
@ApiModelProperty(value = "修改人")
private String update_id;
@ApiModelProperty(value = "修改人")
private String update_name;
@ApiModelProperty(value = "修改时间")
private String update_time;
@ApiModelProperty(value = "移动途径")
private String move_way;
@ApiModelProperty(value = "物料图片路径")
private String material_path;
@ApiModelProperty(value = "托盘图片路径")
private String vehicle_path;
//货架待命 1 、任务中 2 、人工处理中 3
@ApiModelProperty(value = "状态")
private String status;
//货架待命 1 、任务中 2 、人工处理中 3
@ApiModelProperty(value = "删除时间")
private String delete_time;
@TableField(exist = false)
private String materialFile;
@TableField(exist = false)
private String daybetween;
@TableField(exist = false)
private String material_name;
@TableField(exist = false)
private String theLocation;
@TableField(exist = false)
private boolean hasChildren;
@TableField(exist = false)
private List<SchBaseVehiclematerialgroupDeleteLog> children;
@TableField(exist = false)
private String material_code;
@TableField(exist = false)
private String material_spec;
@TableField(exist = false)
private String region_name;
@TableField(exist = false)
private String group_bind_material_status_name;
}

View File

@@ -0,0 +1,22 @@
package org.nl.wms.sch.group_delete_log.service.dao.mapper;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.nl.wms.ext.fab.service.dto.SendVehicleVo;
import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup;
import org.nl.wms.sch.group.service.dto.SchBaseVehiclematerialgroupQuery;
import org.nl.wms.sch.group_delete_log.service.dao.SchBaseVehiclematerialgroupDeleteLog;
import java.util.List;
import java.util.Map;
/**
* @author zxm
* @date 2026年2月25日10:59:40
**/
public interface SchBaseVehiclematerialgroupDeleteLogMapper extends BaseMapper<SchBaseVehiclematerialgroupDeleteLog> {
}

View File

@@ -0,0 +1,11 @@
package org.nl.wms.sch.group_delete_log.service.dto;
import lombok.Data;
@Data
public class LogMaterialDto {
private String order_code;
private String material_code;
private Integer material_qty;
private String due_date;
}

View File

@@ -0,0 +1,16 @@
package org.nl.wms.sch.group_delete_log.service.dto;
import lombok.Data;
import java.util.List;
@Data
public class SD01GroupLogRespondDto {
private String device_code;
private String regionCode;
private String region_Code;
private String vehicle_code;
List<LogMaterialDto> material;
}

View File

@@ -0,0 +1,65 @@
package org.nl.wms.sch.group_delete_log.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
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.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.database.material.service.IMdBaseMaterialService;
import org.nl.wms.database.material.service.dao.MdBaseMaterial;
import org.nl.wms.database.vehicle.service.IMdBaseVehicleService;
import org.nl.wms.database.vehicle.service.dao.MdBaseVehicle;
import org.nl.wms.ext.fab.service.dto.SendVehicleVo;
import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService;
import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup;
import org.nl.wms.sch.group.service.dao.mapper.SchBaseVehiclematerialgroupMapper;
import org.nl.wms.sch.group.service.dto.SchBaseVehiclematerialgroupQuery;
import org.nl.wms.sch.group_delete_log.service.ISchBaseVehiclematerialgroupDeleteLogService;
import org.nl.wms.sch.group_delete_log.service.dao.SchBaseVehiclematerialgroupDeleteLog;
import org.nl.wms.sch.group_delete_log.service.dao.mapper.SchBaseVehiclematerialgroupDeleteLogMapper;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.process_flow.service.ProcessFlowService;
import org.nl.wms.sch.task_manage.task.tasks.pcoperation.PcOperationCMTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author lyd
* @description 服务实现
* @date 2023-05-16
**/
@Slf4j
@Service
public class SchBaseVehiclematerialgroupDeleteLogServiceImpl extends ServiceImpl<SchBaseVehiclematerialgroupDeleteLogMapper, SchBaseVehiclematerialgroupDeleteLog> implements ISchBaseVehiclematerialgroupDeleteLogService {
}

View File

@@ -107,11 +107,19 @@ public interface ISchBasePointService extends IService<SchBasePoint> {
/**
* 根据点位编码查询
*
* @param start_device_code
* @param device_code
* @return
*/
SchBasePoint selectByPointCode(String device_code);
/**
* 根据点位编码查询
*
* @param device_code
* @return
*/
List<SchBasePoint> selectListByPointCode(List<String> device_code_list);
/**
* 查询二次分配的虚拟站点
*

View File

@@ -317,6 +317,13 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
.eq(SchBasePoint::getIs_used, true));
}
@Override
public List<SchBasePoint> selectListByPointCode(List<String> device_code_list) {
return pointMapper.selectList(Wrappers.lambdaQuery(SchBasePoint.class)
.in(SchBasePoint::getPoint_code, device_code_list)
.eq(SchBasePoint::getIs_used, true));
}
@Override
public SchBasePoint selectByReassign(String region_code, String vehicleCode) {
synchronized (SchBasePointServiceImpl.class) {

View File

@@ -0,0 +1,243 @@
package org.nl.wms.sch.task_manage.task.tasks.handheld;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.nl.common.enums.GoodsEnum;
import org.nl.common.enums.VehicleTypeEnum;
import org.nl.common.enums.region.RegionEnum;
import org.nl.common.exception.BadRequestException;
import org.nl.config.MapOf;
import org.nl.system.service.notice.ISysNoticeService;
import org.nl.wms.database.vehicle.service.IMdBaseVehicleService;
import org.nl.wms.database.vehicle.service.dao.MdBaseVehicle;
import org.nl.wms.ext.acs.service.dto.to.BaseResponse;
import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.ISchBaseTaskconfigService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.GeneralDefinition;
import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum;
import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import org.nl.wms.util.PointUtils;
import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
/**
* 手持创建空料笼入库新,主要是新增小车
*/
@Component("EMPTYCAGENEWTask")
public class EmptyCageNewTask extends AbstractTask {
private static final String TASK_CONFIG_CODE = "EMPTYCAGENEWTask";
@Autowired
private ISchBasePointService pointService;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private ISchBaseTaskconfigService taskConfigService;
@Autowired
private ISysNoticeService noticeService;
@Autowired
private ISchBasePointService schBasePointService;
@Autowired
private ISchBaseVehiclematerialgroupService schBaseVehiclematerialgroupService;
@Autowired
private IMdBaseVehicleService iMdBaseVehicleService;
private static final HashMap<String,Integer> IS_VEHICLE = MapOf.of("vehicles",2,"vehicle_code",1);
private static final HashMap<String,Integer> POINT_TYPE = MapOf.of("空托盘",0,"满托盘",1);
@Override
protected void create() throws BadRequestException {
// 获取任务
List<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY);
// 配置信息
for (SchBaseTask task : tasks) {
String vehicle_type = getVehicleType(task);
SchBasePoint schBasePoint = null;
switch (vehicle_type) {
case "R01":
schBasePoint = schBasePointService.selectStackPoint(RegionEnum.S.getRegion_code(),
GoodsEnum.OUT_OF_STOCK.getValue(), VehicleTypeEnum.FRAME_R01.getVehicleCode(), IS_VEHICLE.get("vehicles"), POINT_TYPE.get("空托盘"));
break;
case "R02":
schBasePoint = schBasePointService.selectStackPoint(RegionEnum.S.getRegion_code(),
GoodsEnum.OUT_OF_STOCK.getValue(), VehicleTypeEnum.FRAME_R02.getVehicleCode(), IS_VEHICLE.get("vehicles"), POINT_TYPE.get("空托盘"));
break;
case "S04":
schBasePoint = schBasePointService.selectStackPoint(RegionEnum.LAG.getRegion_code(),
GoodsEnum.OUT_OF_STOCK.getValue(), VehicleTypeEnum.RACKS_S04.getVehicleCode(), IS_VEHICLE.get("vehicle_code"), POINT_TYPE.get("空托盘"));
if (ObjectUtil.isEmpty(schBasePoint)) {
schBasePoint = schBasePointService.selectStackPoint(RegionEnum.S.getRegion_code(),
GoodsEnum.OUT_OF_STOCK.getValue(), VehicleTypeEnum.RACKS_S04.getVehicleCode(), IS_VEHICLE.get("vehicle_code"), POINT_TYPE.get("空托盘"));
}
break;
case "S06":
schBasePoint = schBasePointService.selectStackPoint(RegionEnum.LAG.getRegion_code(),
GoodsEnum.OUT_OF_STOCK.getValue(), VehicleTypeEnum.RACKS_S06.getVehicleCode(), IS_VEHICLE.get("vehicle_code"), POINT_TYPE.get("空托盘"));
if (ObjectUtil.isEmpty(schBasePoint)) {
schBasePoint = schBasePointService.selectStackPoint(RegionEnum.S.getRegion_code(),
GoodsEnum.OUT_OF_STOCK.getValue(), VehicleTypeEnum.RACKS_S06.getVehicleCode(), IS_VEHICLE.get("vehicle_code"), POINT_TYPE.get("空托盘"));
}
break;
default:
break;
}
if (ObjectUtil.isEmpty(schBasePoint)) {
task.setRemark("未找到所需点位!");
taskService.updateById(task);
// 消息通知
noticeService.createNotice("未找到所需点位!", TASK_CONFIG_CODE + task.getTask_code(),
NoticeTypeEnum.WARN.getCode());
continue;
}
// 设置终点并修改创建成功状态
TaskUtils.setUpdateByAcs(task);
task.setPoint_code2(schBasePoint.getPoint_code());
task.setVehicle_type(vehicle_type);
task.setRemark("");
task.setTask_status(TaskStatus.CREATED.getCode());
taskService.updateById(task);
}
}
/**
* 获取托盘类型
* @param task 任务对象
* @return 托盘类型
*/
private String getVehicleType(SchBaseTask task) {
String vehicle_type = task.getVehicle_type();
String vehicle_code = task.getVehicle_code();
if (StrUtil.isNotEmpty(vehicle_code)) {
String vehicleCode = vehicle_code;
if(vehicle_code.contains(",")){
String[] split = vehicle_code.split(",");
vehicleCode = split[0];
}
MdBaseVehicle mdBaseVehicle = iMdBaseVehicleService.selectByVehicleCode(vehicleCode);
vehicle_type = mdBaseVehicle.getVehicle_type();
}
return vehicle_type;
}
@Override
protected void updateStatus(String task_code, TaskStatus status) {
//TODO:完成任务的时候将int_task_code的清除
}
@Override
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_CONNECTOR);
}
@Override
public void cancel(String task_code) {
//TODO:取消任务的时候将int_task_code的清除
SchBaseTask taskObj = taskService.getByCode(task_code);
cancelPoint(taskObj.getPoint_code1());
cancelPoint(taskObj.getPoint_code2());
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_CONNECTOR);
}
/**
* 取消任务还原点位状态
*
* @param pointCode 点位名称
*/
private void cancelPoint(String pointCode) {
SchBasePoint schBasePoint = schBasePointService.selectByPointCode(pointCode);
if (ObjectUtil.isNotEmpty(schBasePoint)) {
schBasePoint.setIs_lock(false);
PointUtils.setUpdateByAcs(schBasePoint);
schBasePointService.updateById(schBasePoint);
}
}
@Override
protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) {
}
/**
* 更新任务状态
*
* @param taskObj
* @param taskFinishedType
*/
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
updateStartPointStatus(taskObj);
updateEndPointStatus(taskObj);
// 任务完成
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setRemark(GeneralDefinition.TASK_FINISH);
taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
/**
* 更新起点点位状态
*
* @param taskObj 任务对象
*/
private void updateStartPointStatus(SchBaseTask taskObj) {
String startPoint = taskObj.getPoint_code1();
SchBasePoint schBasePoint = pointService.selectByPointCode(startPoint);
if (ObjectUtil.isNotEmpty(schBasePoint)) {
PointUtils.updateByIngTaskCode(schBasePoint);
pointService.update(Wrappers.lambdaUpdate(SchBasePoint.class)
.eq(SchBasePoint::getPoint_code, startPoint)
.set(SchBasePoint::getIs_lock, false));
}
}
/**
* 更新终点点位状态
*
* @param taskObj 任务对象
*/
private void updateEndPointStatus(SchBaseTask taskObj) {
String point_code2 = taskObj.getPoint_code2();
SchBasePoint schBasePoint2 = pointService.selectByPointCode(point_code2);
if (ObjectUtil.isNotEmpty(schBasePoint2)) {
String vehicle_type = taskObj.getVehicle_type();
if (vehicle_type.equals(VehicleTypeEnum.FRAME_R01.getVehicleCode()) || vehicle_type.equals(VehicleTypeEnum.FRAME_R02.getVehicleCode())) {
schBasePoint2.setVehicles(taskObj.getVehicle_code());
schBasePoint2.setVehicle_qty(taskObj.getVehicle_qty());
} else {
schBasePoint2.setVehicle_code(taskObj.getVehicle_code());
}
schBasePoint2.setPoint_status(GoodsEnum.EMPTY_PALLETS.getValue());
schBasePoint2.setIs_lock(false);
PointUtils.setUpdateByAcs(schBasePoint2);
pointService.updateById(schBasePoint2);
}
}
public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
taskObj.setRemark(GeneralDefinition.TASK_CANCEL);
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
}

View File

@@ -57,11 +57,21 @@ public class ToStoreHouseTask extends AbstractTask {
// 配置信息
for (SchBaseTask task : tasks) {
SchBasePoint schBasePoint = null;
//这个修改 优先拿在满拖库的
if (task.getVehicle_type().equals(VehicleTypeEnum.FRAME_R02.getVehicleCode()) || task.getVehicle_type().equals(VehicleTypeEnum.FRAME_R01.getVehicleCode())) {
schBasePoint = schBasePointService.selectByEmptyCage(RegionEnum.DDLK.getRegion_code(),
schBasePoint = schBasePointService.selectByEmptyCage(RegionEnum.S.getRegion_code(),
task.getVehicle_type(), GoodsEnum.EMPTY_PALLETS.getValue(), true, task);
if (ObjectUtil.isEmpty(schBasePoint)) {
schBasePoint = schBasePointService.selectByEmptyCage(RegionEnum.DDLK.getRegion_code(),
task.getVehicle_type(), GoodsEnum.EMPTY_PALLETS.getValue(), true, task);
}
} else if (task.getVehicle_type().equals(VehicleTypeEnum.RACKS_S04.getVehicleCode()) || task.getVehicle_type().equals(VehicleTypeEnum.RACKS_S06.getVehicleCode())) {
schBasePoint = schBasePointService.selectByEmptyCage(RegionEnum.LAG.getRegion_code(),
task.getVehicle_type(), GoodsEnum.EMPTY_PALLETS.getValue(), true, task);
if (ObjectUtil.isEmpty(schBasePoint)) {
schBasePoint = schBasePointService.selectByEmptyCage(RegionEnum.S.getRegion_code(),
task.getVehicle_type(), GoodsEnum.EMPTY_PALLETS.getValue(), true, task);
}
} else {
schBasePoint = schBasePointService.selectByVehicleQty(task.getVehicle_type());
}

View File

@@ -29,7 +29,7 @@ spring:
datasource:
mysql:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.251}:${DB_PORT:3306}/${DB_NAME:ximenzi_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
url: jdbc:log4jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:ximenzi_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
username: ${DB_USER:root}
password: ${DB_PWD:123456}
type: com.alibaba.druid.pool.DruidDataSource
@@ -42,11 +42,10 @@ spring:
redis:
#数据库索引
database: ${REDIS_DB:2}
database: ${REDIS_DB:1}
# host: ${REDIS_HOST:10.44.101.112}
host: ${REDIS_HOST:127.0.0.1}
port: ${REDIS_PORT:6379}
password: ${REDIS_PWD:}
# 登录相关配置
login:
@@ -141,16 +140,14 @@ sa-token:
token-session-check-login: false
alone-redis:
# Redis数据库索引默认为0
database: 2
database: 1
# Redis服务器地址
host: 127.0.0.1
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码默认为空
password:
# 连接超时时间
timeout: 10s
lucene:
index:
path: E:\lms\lucene\index
path: D:\lms\lucene\index

View File

@@ -112,6 +112,6 @@ mybatis-plus:
id-type: INPUT
lucene:
index:
path: E:\lms\lucene\index
path: D:\lms\lucene\index
tlog:
enable-invoke-time-print: true