add:增加现场开会确定后的6个新增需求;

This commit is contained in:
2026-04-28 20:11:17 +08:00
parent 6c28e7d38e
commit a0834a4ee7
10 changed files with 378 additions and 135 deletions

View File

@@ -98,6 +98,9 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
if (StrUtil.isNotEmpty(search)) {
if (search.contains("CT")) {
if (search.length() < 12) {
throw new BadRequestException("输入长度有误,请输入正确的仓位信息:" + search);
}
String suffix = search.substring(search.length() - 6);
int rowNum = Integer.parseInt(suffix.substring(0, 2));
int colNum = Integer.parseInt(suffix.substring(2, 4));
@@ -122,8 +125,8 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
queryWrapper.and(wrapper ->
wrapper.like(Structattr::getStruct_code, search)
.or()
.like(Structattr::getStruct_code, search).or()
.like(Structattr::getStruct_name, search)
.like(Structattr::getStruct_name, search).or()
.like(Structattr::getStoragevehicle_code, search)
);
}
}
@@ -320,14 +323,18 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
@Override
public Structattr getByCode(String struct_code) {
Structattr one = this.getOne(
List<Structattr> list = this.list(
new QueryWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, struct_code)
.eq(Structattr::getIs_used, BaseDataEnum.IS_YES_NOT.code(""))
);
if (ObjectUtil.isEmpty(one)) {
throw new BadRequestException("此仓位编码不存在【"+struct_code+"");
if (ObjectUtil.isEmpty(list)) {
throw new BadRequestException("此仓位编码不存在或未启用" + struct_code + "");
}
return one;
if (list.size() > 1) {
throw new BadRequestException("此仓位编码存在多个,请检查!【" + struct_code + "");
}
return list.get(0);
}
@@ -399,7 +406,8 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
List<String> strategy = one.getStrategy();
Map<String, Decisioner> decisionerMap = SpringContextHolder.getBeansOfType(Decisioner.class);
QueryWrapper<Structattr> query = new QueryWrapper<>();
//一楼车辆特殊分配
//分配规则:一楼车辆特殊分配H1AD01、H1AVB01开头 width =1 专门放蝴蝶龙托盘,
// 起点是H1开头的stor_type =1 ,是专门放超托的托盘;
if ("firstfloorBC".equals(param.getStor_code())) {
if ("3".equals(param.getSuitable_car())) {
query.eq("is_used", true)
@@ -407,9 +415,7 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
.eq("sect_code", param.getSect_code())
.isNull("width")
.isNull("stor_type")
.and(wrapper -> wrapper.isNull("storagevehicle_code")
.or()
.eq("storagevehicle_code", " "));
.isNull("storagevehicle_code");
} else if ("2".equals(param.getSuitable_car())) {
query.eq("is_used", true)
.eq("lock_type", IOSEnum.LOCK_TYPE.code("未锁定"))
@@ -417,21 +423,17 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
.eq("width", 1)
.ne("layer_num", maxLayerNum)
.isNull("stor_type")
.and(wrapper -> wrapper.isNull("storagevehicle_code")
.or()
.eq("storagevehicle_code", " "));
.isNull("storagevehicle_code");
} else if ("1".equals(param.getSuitable_car())) {
query.eq("is_used", true)
.eq("lock_type", IOSEnum.LOCK_TYPE.code("未锁定"))
.eq("sect_code", param.getSect_code())
.eq("layer_num", maxLayerNum)
.isNull("stor_type")
.and(wrapper -> wrapper.isNull("storagevehicle_code")
.or()
.eq("storagevehicle_code", " "));
.isNull("storagevehicle_code");
}
} else {
//特殊物料优先放3层
//2楼特殊物料优先放3层
if ("2FCP3C".equals(param.getStoragevehicle_type())) {
query.eq("layer_num", maxLayerNum);
} else {
@@ -440,21 +442,17 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
query.eq("is_used", true)
.eq("lock_type", IOSEnum.LOCK_TYPE.code("未锁定"))
.eq("sect_code", param.getSect_code())
.and(wrapper -> wrapper.isNull("storagevehicle_code")
.or()
.eq("storagevehicle_code", " "));
.isNull("storagevehicle_code");
}
List<Structattr> list = this.list(query);
if ("BCPCTZB".equals(param.getStoragevehicle_type())) {
if ("BCPCTZB".equals(param.getStoragevehicle_type()) || "DJQCT".equals(param.getStoragevehicle_type())) {
list = structattrMapper.getctnextcode();
}
if ("2FCP3C".equals(param.getStoragevehicle_type()) && ObjectUtil.isEmpty(list)) {
query.eq("is_used", true)
.eq("lock_type", IOSEnum.LOCK_TYPE.code("未锁定"))
.eq("sect_code", param.getSect_code())
.and(wrapper -> wrapper.isNull("storagevehicle_code")
.or()
.eq("storagevehicle_code", " "));
.isNull("storagevehicle_code");
list = this.list(query);
}
for (String decisionerType : strategy) {

View File

@@ -17,6 +17,7 @@ import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.sch_manage.enums.PointStatusEnum;
import org.nl.wms.sch_manage.enums.StatusEnum;
import org.nl.wms.sch_manage.service.ISchBasePointService;
@@ -28,7 +29,6 @@ import org.nl.wms.sch_manage.service.dao.mapper.SchBaseRegionMapper;
import org.nl.wms.sch_manage.service.dao.mapper.SchBaseTaskMapper;
import org.nl.wms.sch_manage.service.dto.SchBasePointQuery;
import org.nl.wms.sch_manage.service.util.PointUtils;
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -180,10 +180,10 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
public SchBasePoint getByCode(String point_code){
SchBasePoint one = this.getOne(
new QueryWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, point_code)
.eq(SchBasePoint::getPoint_code, point_code).eq(SchBasePoint::getIs_used, BaseDataEnum.IS_YES_NOT.code(""))
);
if (ObjectUtil.isEmpty(one)) {
throw new BadRequestException("点位编码为【"+point_code+"】的不存在!");
throw new BadRequestException("点位编码为【" + point_code + "】的不存在或未启用!");
}
return one;
}

View File

@@ -90,6 +90,7 @@ public abstract class AbstractTask {
public AcsResponse sendTaskOne(String task_id) {
List<AcsTaskDto> taskDtoList = new ArrayList<>();
taskDtoList.add(this.sendAcsParam(task_id));
//return AcsResponse.requestOk();
return this.renotifyAcs(taskDtoList);
}

View File

@@ -1,6 +1,7 @@
package org.nl.wms.sch_manage.service.util;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
@@ -16,14 +17,20 @@ import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.sql.Time;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Slf4j
@Component
@RequiredArgsConstructor
public class AutoTask {
private static final ScheduledExecutorService DELAY_EXECUTOR = Executors.newSingleThreadScheduledExecutor();
/**
* 任务服务
*/
@@ -53,22 +60,107 @@ public class AutoTask {
}
}
/**
* 定时下发任务
*/
// private void sendTask() {
// List<SchBaseTask> taskList = taskService.list(new LambdaQueryWrapper<SchBaseTask>()
// .eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO)
// .eq(SchBaseTask::getTask_status, TaskStatus.CREATE.getCode()));
// if (ObjectUtil.isEmpty(taskList)) {
// return;
// }
// // 找出需要间隔的任务列表
// List<SchBaseTask> delayTaskList = taskList.stream()
// .filter(r -> "STInTask".equals(r.getConfig_code()))
// .collect(Collectors.toList());
// List<SchBaseTask> immediatelyTaskList = new ArrayList<>(taskList);
// immediatelyTaskList.removeAll(delayTaskList);
// //优先发送正常的任务列表
// if (ObjectUtil.isNotEmpty(immediatelyTaskList)) {
// // 整理下发acs参数
// for (SchBaseTask taskDao : immediatelyTaskList) {
// //任务优先级
// taskDao.setPriority(StringUtils.isBlank(taskDao.getPriority()) ? "1" : taskDao.getPriority());
// AbstractTask task = taskFactory.getTask(taskDao.getConfig_code());
// task.sendTaskOne(taskDao.getTask_id());
// }
// }
// //间隔3秒发一个任务
// if (ObjectUtil.isNotEmpty(delayTaskList)) {
// DELAY_EXECUTOR.execute(() -> {
// try {
// for (SchBaseTask taskDao : delayTaskList) {
// //间隔3秒发一个任务
// Thread.sleep(2000);
// //任务优先级
// taskDao.setPriority(StringUtils.isBlank(taskDao.getPriority()) ? "1" : taskDao.getPriority());
// AbstractTask task = taskFactory.getTask(taskDao.getConfig_code());
// task.sendTaskOne(taskDao.getTask_id());
// }
// } catch (InterruptedException e) {
// Thread.currentThread().interrupt();
// log.error("延迟任务被中断", e);
// } catch (Exception e) {
// log.error("延迟下发任务执行失败", e);
// }
// });
// }
// }
/**
* 定时下发任务
*/
private void sendTask() {
// 1. 查询待发送的任务
List<SchBaseTask> taskList = taskService.list(new LambdaQueryWrapper<SchBaseTask>()
.eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO)
.eq(SchBaseTask::getTask_status, TaskStatus.CREATE.getCode()));
if (ObjectUtil.isEmpty(taskList)) {
return;
}
// 整理下发acs参数
for (SchBaseTask taskDao : taskList) {
//任务优先级
taskDao.setPriority(StringUtils.isBlank(taskDao.getPriority()) ? "0" : taskDao.getPriority());
AbstractTask task = taskFactory.getTask(taskDao.getConfig_code());
task.sendTaskOne(taskDao.getTask_id());
// 2. 统一设置默认优先级并分组
Map<Boolean, List<SchBaseTask>> partitioned = taskList.stream()
.peek(task -> {
if (StringUtils.isBlank(task.getPriority())) {
task.setPriority("1");
}
})
.collect(Collectors.partitioningBy(r -> "STInTask".equals(r.getConfig_code())));
List<SchBaseTask> immediatelyTaskList = partitioned.get(false);
List<SchBaseTask> delayTaskList = partitioned.get(true);
// 3. 立即下发任务
if (ObjectUtil.isNotEmpty(immediatelyTaskList)) {
//log.info("开始下发立即任务, 数量: {}", immediatelyTaskList.size());
for (SchBaseTask task : immediatelyTaskList) {
try {
AbstractTask taskExecutor = taskFactory.getTask(task.getConfig_code());
taskExecutor.sendTaskOne(task.getTask_id());
// log.info("任务下发成功: taskId={}, configCode={}", task.getTask_id(), task.getConfig_code());
} catch (Exception e) {
log.error("任务下发失败: taskId={}, configCode={}", task.getTask_id(), task.getConfig_code(), e);
}
}
//log.info("立即任务下发完成");
}
// 4. 延迟下发任务(间隔 7 秒,异步执行)
if (ObjectUtil.isNotEmpty(delayTaskList)) {
delayTaskList.sort(Comparator.comparing(SchBaseTask::getTask_code));
//log.info("开始调度延迟任务, 数量: {}, 间隔: 7秒", delayTaskList.size());
long delaySeconds = 0;
for (SchBaseTask task : delayTaskList) {
DELAY_EXECUTOR.schedule(() -> {
try {
AbstractTask taskExecutor = taskFactory.getTask(task.getConfig_code());
taskExecutor.sendTaskOne(task.getTask_id());
log.info("延迟任务下发成功: taskCode={}, configCode={}", task.getTask_code(), task.getConfig_code());
} catch (Exception e) {
log.error("延迟任务下发失败: taskId={}, configCode={}", task.getTask_id(), task.getConfig_code(), e);
}
}, delaySeconds, TimeUnit.SECONDS);
delaySeconds += 7;
}
//log.info("延迟任务已全部提交调度");
}
}
}

View File

@@ -326,11 +326,12 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
ioStorInvDtl.put("plan_qty", row.get("qty"));
Double qty = new Double(String.valueOf(row.get("qty")));
total_qty = total_qty.add(new BigDecimal(qty));
//判断该载具编号是否已经存在库内
Structattr structattr = iStructattrService.getOne(new LambdaQueryWrapper<>(Structattr.class).eq(Structattr::getStoragevehicle_code, whereJson.get("storagevehicle_code")));
if (ObjectUtil.isNotEmpty(structattr)) {
throw new BadRequestException("载具编码:" + row.get("storagevehicle_code") + "已存在库内,请对数据进行核实!");
if (!Boolean.parseBoolean((String) whereJson.get("notStructCheck"))) {
//判断该载具编号是否已经存在库内
Structattr structattr = iStructattrService.getOne(new LambdaQueryWrapper<>(Structattr.class).eq(Structattr::getStoragevehicle_code, whereJson.get("storagevehicle_code")));
if (ObjectUtil.isNotEmpty(structattr)) {
throw new BadRequestException("载具编码:" + row.get("storagevehicle_code") + "已存在库内,请对数据进行核实!");
}
}
IOStorInvDtl invDtl = ioStorInvDtl.toJavaObject(IOStorInvDtl.class);
ioStorInvDtlMapper.insert(invDtl);
@@ -467,6 +468,7 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
return ioStorInvMapper.getIODtl(whereJson);
}
//默认分配,废弃
@Override
@Transactional(rollbackFor = Exception.class)
public void divStruct(JSONObject param) {
@@ -494,31 +496,31 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
//是否自动分配仓位
// Boolean checked = mst.getBoolean("checked");
// if (ObjectUtil.isNotEmpty(checked) && checked) {
//根据载具进行分配货位
List<StrategyMater> maters = new ArrayList<>();
for (IOStorInvDis dis : disList) {
StrategyMater mater = new StrategyMater();
mater.setPcsn(dis.getPcsn());
mater.setMaterial_code(dis.getMaterial_code());
mater.setMaterial_id(dis.getMaterial_id());
mater.setQty(dis.getPlan_qty());
maters.add(mater);
}
List<Structattr> structattrs = iStructattrService.inBoundSectDiv(
StrategyStructParam.builder()
.ioType(param.getString("ioType"))
.sect_code(param.getString("sect_code"))
.stor_code(param.getString("stor_code"))
.storagevehicle_code(param.getString("storagevehicle_code"))
.strategyMaters(maters)
.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();
//根据载具进行分配货位
List<StrategyMater> maters = new ArrayList<>();
for (IOStorInvDis dis : disList) {
StrategyMater mater = new StrategyMater();
mater.setPcsn(dis.getPcsn());
mater.setMaterial_code(dis.getMaterial_code());
mater.setMaterial_id(dis.getMaterial_id());
mater.setQty(dis.getPlan_qty());
maters.add(mater);
}
List<Structattr> structattrs = iStructattrService.inBoundSectDiv(
StrategyStructParam.builder()
.ioType(param.getString("ioType"))
.sect_code(param.getString("sect_code"))
.stor_code(param.getString("stor_code"))
.storagevehicle_code(param.getString("storagevehicle_code"))
.strategyMaters(maters)
.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();
// }
// else {
// Structattr structattr = iStructattrService.findById(map.getString("struct_id"));
@@ -594,9 +596,13 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
JSONObject mst = JSONObject.parseObject(JSON.toJSONString(param));
String iostorinvId = param.getString("iostorinv_id");
String storagevehicleCode = param.getString("storagevehicle_code");
String storagevehicle_stype=param.getString("storagevehicle_type");
MdPbStoragevehicletype mdPbStoragevehicletype=iMdPbStoragevehicletypeService.getByCode(storagevehicle_stype);
String suitable_car=mdPbStoragevehicletype.getSuitable_car();
String storagevehicle_stype = param.getString("storagevehicle_type");
MdPbStoragevehicletype mdPbStoragevehicletype = iMdPbStoragevehicletypeService.getByCode(storagevehicle_stype);
//处理不同库区,一楼半成品特殊区域待检区
if ("DJQHDL".equals(storagevehicle_stype) || "DJQMZB".equals(storagevehicle_stype) || "DJQCT".equals(storagevehicle_stype)) {
param.put("sect_code", "1BCDJQ");
}
String suitable_car = mdPbStoragevehicletype.getSuitable_car();
//判断该分配明细是否已经分配货位
List<IOStorInvDis> disList = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<>(IOStorInvDis.class)
.eq(IOStorInvDis::getIostorinv_id, iostorinvId)
@@ -974,11 +980,16 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
//获取出入库单标识
String iostorinv_id = item1.getIostorinv_id();
IOStorInv ioStorInv = ioStorInvMapper.selectOne(new LambdaQueryWrapper<IOStorInv>().eq(IOStorInv::getIostorinv_id, iostorinv_id));
//获取单据编号
String bill_code = ioStorInv.getBill_code();
String source_name = ioStorInv.getSource_name();
//acs完成任务状态为5,PC端完成为0
if ("5".equals(task.getTask_status()) || "0".equals(task.getTask_status())) {
if (!"1".equals(task.getTask_status())) {
//转库解锁原库位
if (ObjectUtil.isNotEmpty(iStructattrService.getOne(new LambdaQueryWrapper<Structattr>().eq(Structattr::getStruct_code, task.getPoint_code1())))) {
LambdaUpdateWrapper<Structattr> wrapper = new LambdaUpdateWrapper<>();
wrapper.set(Structattr::getStoragevehicle_code, null)
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.eq(Structattr::getStruct_code, task.getPoint_code1());
iStructattrService.update(wrapper);
}
//解锁库位
JSONObject finish_map = new JSONObject();
finish_map.put("struct_code", structCode);
@@ -1009,6 +1020,9 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
invDtl.setIostorinvdtl_id(dtl_id);
invDtl.setReal_qty(dtlMap.get(dtl_id));
invDtl.setBill_status(IOSEnum.BILL_STATUS.code("完成"));
if (!"5".equals(task.getTask_status())) {
invDtl.setRemark("该任务为PC端手动强制完成" + now);
}
ioStorInvDtlMapper.updateById(invDtl);
}
// 查看明细是否全部完成
@@ -1029,6 +1043,7 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
}
}
//回传给wms
String source_name = ioStorInv.getSource_name();
TOWMSMSG towmsmsg = new TOWMSMSG();
towmsmsg.setType(task.getConfig_code().contains("In") ? "0" : "1");
towmsmsg.setBill_code(source_name);
@@ -1082,9 +1097,9 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
String structCode = ioStorInvDis.get(0).getStruct_code();
IOStorInvDis item1 = ioStorInvDis.get(0);
//获取出入库单标识
String iostorinv_id=item1.getIostorinv_id();
IOStorInv ioStorInv=ioStorInvMapper.selectOne(new LambdaQueryWrapper<IOStorInv>().eq(IOStorInv::getIostorinv_id,iostorinv_id));
String source_name=ioStorInv.getSource_name();
String iostorinv_id = item1.getIostorinv_id();
IOStorInv ioStorInv = ioStorInvMapper.selectOne(new LambdaQueryWrapper<IOStorInv>().eq(IOStorInv::getIostorinv_id, iostorinv_id));
String source_name = ioStorInv.getSource_name();
TOWMSMSG towmsmsg=new TOWMSMSG();
towmsmsg.setType("0");
towmsmsg.setBill_code(source_name);

View File

@@ -1486,15 +1486,15 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper,IOStorInv> i
);
// 完成当前任务对应的所有分配明细
for (IOStorInvDis ioStorInvDis : disList) {
ioStorInvDisMapper.update(ioStorInvDis,new LambdaUpdateWrapper<>(IOStorInvDis.class)
.set(IOStorInvDis::getWork_status,IOSEnum.INBILL_DIS_STATUS.code("完成"))
.eq(IOStorInvDis::getIostorinvdis_id,ioStorInvDis.getIostorinvdis_id()));
ioStorInvDisMapper.update(ioStorInvDis, new LambdaUpdateWrapper<>(IOStorInvDis.class)
.set(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("完成"))
.eq(IOStorInvDis::getIostorinvdis_id, ioStorInvDis.getIostorinvdis_id()));
}
IOStorInvDis item = disList.get(0);
//获取出入库单标识
String iostorinv_id=item.getIostorinv_id();
IOStorInv ioStorInv=ioStorInvMapper.selectOne(new LambdaQueryWrapper<IOStorInv>().eq(IOStorInv::getIostorinv_id,iostorinv_id));
String source_name=ioStorInv.getSource_name();
String iostorinv_id = item.getIostorinv_id();
IOStorInv ioStorInv = ioStorInvMapper.selectOne(new LambdaQueryWrapper<IOStorInv>().eq(IOStorInv::getIostorinv_id, iostorinv_id));
String source_name = ioStorInv.getSource_name();
TOWMSMSG towmsmsg=new TOWMSMSG();
towmsmsg.setType("1");
towmsmsg.setBill_code(source_name);

View File

@@ -37,6 +37,7 @@ public class StIvtCheckdtl implements Serializable {
/**
* 任务标识
*/
private String task_id;
/**

View File

@@ -58,6 +58,23 @@ public class WmsToIWmscontroller {
public ResponseEntity<Object> outBillTask(@RequestBody JSONObject param) {
return new ResponseEntity<>(wmsToIWmsService.outBillTask(param), HttpStatus.OK);
}
@PostMapping("/OutCheck")
@Log("查询点位信息")
@SaIgnore
public ResponseEntity<Object> outCheck(@RequestBody JSONObject param) {
return new ResponseEntity<>(wmsToIWmsService.outCheck(param), HttpStatus.OK);
}
@PostMapping("/inventory")
@Log("盘点信息")
@SaIgnore
public ResponseEntity<Object> inventory(@RequestBody JSONObject param) {
return new ResponseEntity<>(wmsToIWmsService.inventory(param), HttpStatus.OK);
}
@PostMapping("/move")
@Log("WMS移库任务推送")
@SaIgnore

View File

@@ -11,6 +11,10 @@ public interface WmsToIWmsService {
WmstoIWmsResponse groupTask (JSONObject param);
WmstoIWmsResponse groupCheck(JSONObject param);
WmstoIWmsResponse outBillTask (JSONObject param);
WmstoIWmsResponse outCheck (JSONObject param);
WmstoIWmsResponse inventory (JSONObject param);
WmstoIWmsResponse moveTask(JSONObject param);
WmstoIWmsResponse checkBillTask(JSONObject param);
}

View File

@@ -1,7 +1,6 @@
package org.nl.wms.wbwms.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -9,7 +8,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.protocol.HTTP;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil;
@@ -21,7 +19,6 @@ import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleinfoMapper;
import org.nl.wms.basedata_manage.service.dao.mapper.StructattrMapper;
import org.nl.wms.sch_manage.enums.PointStatusEnum;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
@@ -29,11 +26,10 @@ import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper;
import org.nl.wms.sch_manage.service.util.tasks.CheckInTask;
import org.nl.wms.sch_manage.service.util.tasks.CheckOutTask;
import org.nl.wms.sch_manage.service.util.tasks.MoveTask;
import org.nl.wms.sch_manage.service.util.tasks.StInTask;
import org.nl.wms.warehouse_manage.enums.IOSConstant;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService;
import org.nl.wms.warehouse_manage.inAndOut.service.IOutBillService;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDis;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper;
import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_manage.service.IStIvtCheckmstService;
@@ -57,9 +53,9 @@ import java.util.List;
@Slf4j
@Service
public class WmsToIWmsServiceImpl implements WmsToIWmsService {
@Autowired
private IStructattrService iStructattrService;
@Autowired
@Autowired
private IStructattrService iStructattrService;
@Autowired
private ISchBasePointService iSchBasePointService;
@Autowired
private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService;
@@ -69,8 +65,6 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService {
private IOStorInvDisMapper ioStorInvDisMapper;
@Resource
private SchBasePointMapper schBasePointMapper;
@Resource
private StructattrMapper structattrMapper;
@Autowired
IInBillService iInBillService;
@Autowired
@@ -132,40 +126,53 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService {
@Transactional
public WmstoIWmsResponse groupTask(JSONObject parm) {
log.info("WMS入库请求参数参数为-------------------" + parm.toString());
if(StringUtils.isBlank(parm.getString("point_code"))){
if (StringUtils.isBlank(parm.getString("point_code"))) {
throw new BadRequestException("未传入地面入库点");
}
if(!ObjectUtil.isNotEmpty(iSchBasePointService.getByCode(parm.getString("point_code")))){
throw new BadRequestException("传入的地面入库点不存在");
}
if(StringUtils.isBlank(parm.getString("storagevehicle_code"))){
if (StringUtils.isBlank(parm.getString("storagevehicle_code"))) {
throw new BadRequestException("未传入载具码");
}
String point_code=parm.getString("point_code");
String storagevehicle_code=parm.getString("storagevehicle_code");
String storagevehicle_code = parm.getString("storagevehicle_code");
SchBasePoint one = iSchBasePointService.getOne(
new QueryWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, parm.getString("point_code")).eq(SchBasePoint::getIs_used, BaseDataEnum.IS_YES_NOT.code(""))
);
//起点校验
if (ObjectUtil.isEmpty(one)) {
if (ObjectUtil.isNotEmpty(iStructattrService.getByCode(parm.getString("point_code")))) {
Structattr structattr = iStructattrService.getByCode(parm.getString("point_code"));
if (!storagevehicle_code.equals(structattr.getStoragevehicle_code())) {
throw new BadRequestException("该仓位存放托盘与所传托盘的编码不对" + "传入的托盘号:" + storagevehicle_code + ",现在存放的托盘号:" + structattr.getStoragevehicle_code());
}
if (!"0".equals(structattr.getLock_type())) {
throw new BadRequestException("传入仓位有正在执行的任务,无法生成,请检查仓位管理的仓位信息!");
}
parm.put("notStructCheck", "true");
}
}
WmstoIWmsResponse result = new WmstoIWmsResponse();
//生成载具信息
iMdPbStoragevehicleinfoService.create(parm);
//生成组盘记录
groupController.createSingle(parm);
//新增入库表
String iostorinv_id = iInBillService.insertDtl1(parm);
//入库分配货位
parm.put("iostorinv_id",iostorinv_id);
String point_code1=iInBillService.divStruct1(parm);
parm.put("struct_code",point_code1);
//判断是否已经分配好货位
iInBillService.divPoint1(parm);
//生成载具信息
iMdPbStoragevehicleinfoService.create(parm);
//生成组盘记录
groupController.createSingle(parm);
//新增入库表
String iostorinv_id = iInBillService.insertDtl1(parm);
//入库分配货位
parm.put("iostorinv_id", iostorinv_id);
String point_code1 = iInBillService.divStruct1(parm);
parm.put("struct_code", point_code1);
//判断是否已经分配好货位
iInBillService.divPoint1(parm);
result.setCode(String.valueOf(HttpStatus.OK.value()));
result.setMsg("入库任务生成成功");
result.setTotalElements(0);
JSONObject data=new JSONObject();
data.put("bill_code",iostorinv_id);
data.put("urnin_struct_code",point_code1);
data.put("bill_code",parm.getString("bill_code"));
result.setData(data);
JSONObject data = new JSONObject();
data.put("bill_code", iostorinv_id);
data.put("urnin_struct_code", point_code1);
data.put("bill_code", parm.getString("bill_code"));
result.setData(data);
log.info("WMS入库返回参数为-------------------" + result.toString());
return result;
return result;
}
@Override
@Transactional
@@ -183,12 +190,12 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService {
String car_type=null;
String car_width="685";
if("1".equals(parm.getString("task_type"))){
List<Structattr> regionCode = structattrMapper.selectList(new LambdaQueryWrapper<Structattr>()
List<Structattr> regionCode = iStructattrService.list(new LambdaQueryWrapper<Structattr>()
.eq(Structattr::getSect_code, "1BCDJQ")
.eq(Structattr::getIs_used,true)
.eq(Structattr::getLock_type,IOSEnum.LOCK_TYPE.code("未锁定"))
.eq(Structattr::getIs_used, true)
.eq(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.isNull(Structattr::getStoragevehicle_code));
String pointCode=regionCode.get(0).getStruct_code();
String pointCode = regionCode.get(0).getStruct_code();
if(StringUtils.isBlank(pointCode)){
throw new BadRequestException("待检区域无库存");
}
@@ -235,24 +242,132 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService {
return result;
}
@Override
public WmstoIWmsResponse inventory(JSONObject parm) {
log.info("WMS发起盘点请求参数为-------------------" + parm.toString());
JSONArray tableData = parm.getJSONArray("tableData");
String storageCode = tableData.getJSONObject(0).getString("storage_code");
//盘点数量
String qty = tableData.getJSONObject(0).getString("plan_qty");
String structCode = parm.getString("turnout_struct_code");
if (StringUtils.isBlank(storageCode) || StringUtils.isBlank(structCode)) {
throw new BadRequestException("未传入载具或仓位信息!");
}
Structattr struct = iStructattrService.getByCode(structCode);
if (!storageCode.equals(struct.getStoragevehicle_code())) {
throw new BadRequestException("该仓位存放托盘与所传托盘的编码不对" + "传入的托盘号:" + storageCode + ",现在存放的托盘号:" + struct.getStoragevehicle_code());
}
if (!"0".equals(struct.getLock_type())) {
throw new BadRequestException("传入仓位被锁定或有任务,需要检查仓位或任务列表,暂不能盘点!" + structCode);
}
GroupPlate groupPlate = iMdPbGroupplateService.getByCode(storageCode);
String oldQty = groupPlate.getQty().toString();
BigDecimal newQty = new BigDecimal(qty);
BigDecimal oldQtyDecimal = groupPlate.getQty();
if (newQty.compareTo(oldQtyDecimal) == 0) {
WmstoIWmsResponse result = new WmstoIWmsResponse();
result.setCode(String.valueOf(HttpStatus.OK.value()));
result.setMsg("盘点数量与当前库存一致,无需调整!");
result.setTotalElements(0);
JSONObject data = new JSONObject();
result.setData(data);
log.info("WMS执行盘点操作-------------------" + "仓位:" + structCode + ",托盘:" + storageCode + ",当前数量:" + oldQty + ",盘点数量:" + qty + ",无需调整");
return result;
}
List<JSONObject> updateIvtList = new ArrayList<>();
JSONObject jsonIvt = new JSONObject();
if (newQty.compareTo(BigDecimal.ZERO) == 0) {
jsonIvt.put("type", IOSConstant.UPDATE_IVT_TYPE_SUB_CANUSE_IVT);
jsonIvt.put("change_qty", groupPlate.getQty());
groupPlate.setStatus(IOSEnum.GROUP_PLATE_STATUS.code("出库"));
} else {
jsonIvt.put("type", IOSConstant.UPDATE_IVT_TYPE_ADD_CANUSE_IVT);
BigDecimal changeQty = newQty.subtract(groupPlate.getQty());
jsonIvt.put("change_qty", changeQty.abs());
}
jsonIvt.put("storagevehicle_code", storageCode);
jsonIvt.put("material_id", groupPlate.getMaterial_id());
jsonIvt.put("pcsn", groupPlate.getPcsn());
jsonIvt.put("qty_unit_id", groupPlate.getQty_unit_id());
jsonIvt.put("qty_unit_name", groupPlate.getQty_unit_name());
jsonIvt.put("remark", "盘点调整,仓位:" + structCode + ",原数量:" + oldQty + ",调整后数量:" + qty);
updateIvtList.add(jsonIvt);
iMdPbGroupplateService.updateIvt(updateIvtList);
if (newQty.compareTo(BigDecimal.ZERO) == 0) {
groupPlate.setQty(BigDecimal.ZERO);
groupPlate.setRemark("盘点调整,仓位:" + structCode + ",原数量:" + oldQty + ",调整后数量:" + qty);
iMdPbGroupplateService.update(groupPlate);
}
WmstoIWmsResponse result = new WmstoIWmsResponse();
result.setCode(String.valueOf(HttpStatus.OK.value()));
result.setMsg("盘点操作执行成功!");
result.setTotalElements(0);
JSONObject data = new JSONObject();
result.setData(data);
log.info("WMS执行盘点操作:-------------------" + "盘点调整,仓位:" + structCode + ",托盘:" + storageCode + ",变更前数量:" + oldQty + ",变更后数量:" + qty);
return result;
}
@Override
public WmstoIWmsResponse outCheck(JSONObject parm) {
log.info("WMS查询点位状态请求参数为-------------------" + parm.toString());
String pointCode = parm.getString("point_code");
if (StringUtils.isBlank(pointCode)) {
throw new BadRequestException("未传点位区域!");
}
String regionCode;
String canMaterialType;
switch (pointCode) {
case "InFloor1":
regionCode = "RKQ";
canMaterialType = "1";
break;
case "Floor1":
regionCode = "CKQ";
canMaterialType = "1";
break;
case "InFloor2":
regionCode = "RKQ";
canMaterialType = "2";
break;
case "Floor2":
regionCode = "CKQ";
canMaterialType = "2";
break;
default:
throw new BadRequestException("不支持的该区域类型查询:" + pointCode);
}
LambdaQueryWrapper<SchBasePoint> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SchBasePoint::getRegion_code, regionCode)
.eq(SchBasePoint::getCan_material_type, canMaterialType)
.eq(SchBasePoint::getIs_used, BaseDataEnum.IS_YES_NOT.code(""))
.orderByAsc(SchBasePoint::getPoint_code);
List<SchBasePoint> list = iSchBasePointService.list(queryWrapper);
JSONArray dataList = new JSONArray();
if (CollectionUtils.isNotEmpty(list)) {
for (SchBasePoint point : list) {
JSONObject pointData = new JSONObject();
pointData.put("point_code", point.getPoint_code());
pointData.put("status", point.getPoint_status().equals(IOSEnum.POINT_STATUS.code("空位")) ? "0" : "1");
dataList.add(pointData);
}
}
WmstoIWmsResponse result = new WmstoIWmsResponse();
result.setCode(String.valueOf(HttpStatus.OK.value()));
result.setMsg("查询成功");
result.setTotalElements(dataList.size());
JSONObject responseData = new JSONObject();
responseData.put("data", dataList);
result.setData(responseData);
return result;
}
@Override
@Transactional
public WmstoIWmsResponse outBillTask(JSONObject parm) {
// log.info("WMS出库请求参数参数为-------------------" + parm.toString());
// WmstoIWmsResponse result = new WmstoIWmsResponse();
// JSONArray tableData = parm.getJSONArray("tableData");
// String storage_code=tableData.getJSONObject(0).getString("storage_code");
// String turnout_struct_code=tableData.getJSONObject(0).getString("turnout_struct_code");
// Structattr structattr=iStructattrService.getByCode(turnout_struct_code);
// if(ObjectUtil.isEmpty(structattr)){
// throw new BadRequestException("wms上不存在该点位");
// }
// if(!storage_code.equals(structattr.getStoragevehicle_code())){
// throw new BadRequestException("该点位存放托盘与所传托盘的编码不对");
// }
// if(!structattr.getLock_type().equals("0")){
// throw new BadRequestException("传入点位有任务");
// }
log.info("WMS 出库请求参数参数为:-------------------" + parm.toString());
WmstoIWmsResponse result = new WmstoIWmsResponse();
JSONArray tableData = parm.getJSONArray("tableData");
@@ -280,7 +395,7 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService {
throw new BadRequestException("wms上不存在该点位" + turnout_struct_code);
}
if (!storage_code.equals(structattr.getStoragevehicle_code())) {
throw new BadRequestException("位存放托盘与所传托盘的编码不对" + turnout_struct_code);
throw new BadRequestException("位存放托盘与所传托盘的编码不对" + "传入的托盘号:" + storage_code + ",现在存放的托盘号:" + structattr.getStoragevehicle_code());
}
if (!"0".equals(structattr.getLock_type())) {
throw new BadRequestException("传入点位有任务:" + turnout_struct_code);