opt:界面优化,手持出入库优化;

This commit is contained in:
2025-07-14 09:27:19 +08:00
parent cebf2d2666
commit fe944cec89
43 changed files with 752 additions and 314 deletions

View File

@@ -80,6 +80,7 @@
INNER JOIN md_me_materialbase mater ON mater.material_id = ext.material_id
<where>
1 = 1
AND ext.status = '02'
<if test="param.stor_id != null and param.stor_id != ''">
AND
attr.stor_id = #{param.stor_id}

View File

@@ -7,6 +7,7 @@
gro.frozen_qty,
gro.create_time,
gro.qty_unit_name,
gro.qty_unit_id,
gro.material_id,
gro.pcsn,
gro.group_id,
@@ -60,6 +61,7 @@
gro.frozen_qty,
gro.create_time,
gro.qty_unit_name,
gro.qty_unit_id,
gro.material_id,
gro.pcsn,
gro.group_id,

View File

@@ -21,4 +21,9 @@ public class EXTConstant {
* ACS下发任务接口地址
*/
public final static String SEND_TASK_ACS_API = "api/wms/task";
/**
* RCS下发任务接口地址
*/
public final static String SEND_TASK_RCS_API = "ics/taskOrder/addTask";
}

View File

@@ -9,14 +9,39 @@ package org.nl.wms.ext.enums;
* @since 2025-06-09
*/
public enum ResultAcsStatus {
/**
* 执行中
*/
EXECUTING("1", "执行中", "执行中"),
CANCEL("3", "取消", "取消"),
/**
* 发送失败
*/
SEND_FAIL("5", "发送失败", "发送失败"),
/**
* 执行中
*/
EXECUTING("6", "执行中", "执行中"),
/**
* 执行失败
*/
EXECUTE_FAIL("7", "执行失败", "执行失败"),
/**
* 完成
*/
FINISHED("2", "完成", "完成");
FINISHED("8", "完成", "完成"),
/**
* 已下发
*/
ISSUE("9", "已下发", "已下发"),
/**
* 等待确认
*/
WAIT_CONFIRM("10", "等待确认", "等待确认");
ResultAcsStatus(String code, String name, String desc) {
@@ -24,7 +49,14 @@ public enum ResultAcsStatus {
this.name = name;
this.desc = desc;
}
public static ResultAcsStatus fromCode(String code) {
for (ResultAcsStatus value : values()) {
if (value.code.equals(code)) {
return value;
}
}
return null;
}
private String code;
private String name;
private String desc;

View File

@@ -28,6 +28,7 @@ public class NotifyUtil {
if (IOSConstant.IS_DELETE_NO.equals(connectValue)) {
log.info("未连接系统,跳过下发!");
}
log.info("下发ACS任务开始下发api:{}下发参数为:-------------------{}", api, param);
String url = getParam(sysParamService, systemType) + api;
try {
String response = HttpRequest.post(url).body(String.valueOf(param)).execute().body();

View File

@@ -2,6 +2,7 @@ package org.nl.wms.gateway.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.logging.annotation.Log;
import org.nl.wms.gateway.dto.FeedBackTaskDto;
import org.nl.wms.gateway.dto.InteracteDto;
import org.nl.wms.gateway.service.IGateWayService;
import org.springframework.http.HttpStatus;
@@ -27,10 +28,19 @@ public class GateWayController {
@Resource
private IGateWayService gateWayService;
@PostMapping("/apply")
@PostMapping("/apply1")
@SaIgnore
@Log("外层服务请求wms")
public ResponseEntity<Object> apply(@RequestBody InteracteDto form) {
return new ResponseEntity<>(TableDataInfo.buildJson(gateWayService.apply(form)),HttpStatus.OK);
}
@PostMapping("/apply")
@Log(value = "RCS给WMS反馈任务状态")
@SaIgnore
public ResponseEntity<Object> receiveTaskStatus(@RequestBody FeedBackTaskDto param) {
return new ResponseEntity<>(gateWayService.receiveTaskStatus(param), HttpStatus.OK);
}
}

View File

@@ -0,0 +1,52 @@
package org.nl.wms.gateway.dto;
import lombok.Data;
import java.io.Serializable;
@Data
public class FeedBackTaskDto implements Serializable {
private static final long serialVersionUID = 1L;
/** 货位号 */
private String storageNum;
/** 子任务状态 */
private String subTaskStatus;
/** 订单ID */
private String orderId;
/** 设备编码 */
private String deviceCode;
/** 模型流程编码 */
private String modelProcessCode;
/** 子任务类型ID */
private String subTaskTypeId;
/** 子任务ID */
private String subTaskId;
/** 设备编号 */
private String deviceNum;
/** 二维码内容 */
private String qrContent;
/** 子任务序号 */
private String subTaskSeq;
/** ICS任务单明细ID */
private String icsTaskOrderDetailId;
/** 状态码 */
private Integer status;
/** 错误描述 */
private String errorDesc;
/** 货架当前位置 */
private String shelfCurrPosition;
}

View File

@@ -3,6 +3,7 @@ package org.nl.wms.gateway.dto;
import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpStatus;
import lombok.Data;
import org.nl.wms.ext.service.util.AcsResponse;
/**
* @Author: gbx
@@ -43,5 +44,17 @@ public class RcsResponse {
return result;
}
/**
* 请求成功
* @return RcsResponse
*/
public static RcsResponse requestOk() {
RcsResponse result = new RcsResponse();
result.setCode(HttpStatus.HTTP_OK);
result.setDesc("请求成功");
result.setResponseDate(DateUtil.now());
return result;
}
}

View File

@@ -2,6 +2,7 @@ package org.nl.wms.gateway.service;
import com.alibaba.fastjson.JSONObject;
import org.nl.wms.ext.service.util.AcsResponse;
import org.nl.wms.gateway.dto.FeedBackTaskDto;
import org.nl.wms.gateway.dto.InteracteDto;
import org.nl.wms.gateway.dto.RcsResponse;
import org.springframework.stereotype.Service;
@@ -26,6 +27,8 @@ public interface IGateWayService {
JSONObject apply(InteracteDto<Map> param);
RcsResponse receiveTaskStatus(FeedBackTaskDto param);
/**
* 下发Rcs任务

View File

@@ -5,26 +5,36 @@ import cn.hutool.core.lang.Assert;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.RedissonUtils;
import org.nl.system.enums.SysParamConstant;
import org.nl.wms.ext.enums.EXTConstant;
import org.nl.wms.ext.enums.ResultAcsStatus;
import org.nl.wms.ext.util.NotifyUtil;
import org.nl.wms.gateway.dto.FeedBackTaskDto;
import org.nl.wms.gateway.dto.InteracteDto;
import org.nl.wms.gateway.dto.RcsResponse;
import org.nl.wms.gateway.service.IGateWayService;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.TaskFactory;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
/**
@@ -38,6 +48,10 @@ import java.util.concurrent.atomic.AtomicReference;
public class GateWayServiceImpl implements IGateWayService {
@Autowired
private TaskFactory taskFactory;
@Autowired
private RedissonClient redissonClient;
@Resource
private Map<String, AbstractTask> applyTaskMap;
@Autowired
@@ -122,8 +136,65 @@ public class GateWayServiceImpl implements IGateWayService {
*/
@Override
public RcsResponse renotifyRcs(List<String> list) {
return NotifyUtil.apiNotify(EXTConstant.SEND_TASK_ACS_API, SysParamConstant.IS_CONNECT_RCS, SysParamConstant.RCS_URL, list, RcsResponse.class);
return NotifyUtil.apiNotify(EXTConstant.SEND_TASK_RCS_API, SysParamConstant.IS_CONNECT_RCS, SysParamConstant.RCS_URL, list, RcsResponse.class);
}
@Override
@Transactional(rollbackFor = Exception.class)
@SneakyThrows
public RcsResponse receiveTaskStatus(FeedBackTaskDto param) {
//返回处理失败的任务
String orderId = param.getOrderId();
RLock lock = redissonClient.getLock(orderId);
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLock) {
SchBaseTask taskObj = iSchBaseTaskService.getByCode(orderId);
// rcs反馈的任务类型
String rcsTaskStatus = param.getStatus().toString();
ResultAcsStatus rcsStatusEnum = ResultAcsStatus.fromCode(rcsTaskStatus);
if (rcsStatusEnum == null) {
throw new BadRequestException("反馈的任务状态码不受支持: " + rcsTaskStatus);
}
TaskStatus status;
switch (rcsStatusEnum) {
case EXECUTING:
status = TaskStatus.EXECUTING;
break;
case FINISHED:
status = TaskStatus.FINISHED;
break;
case CANCEL:
status = TaskStatus.CANCELED;
break;
case SEND_FAIL:
status = TaskStatus.UNFINISHED;
break;
case EXECUTE_FAIL:
status = TaskStatus.UNFINISHED;
break;
case ISSUE:
status = TaskStatus.ISSUED;
break;
case WAIT_CONFIRM:
status = TaskStatus.CREATED;
break;
default:
throw new BadRequestException("反馈的任务状态码不受支持: " + rcsStatusEnum.getName());
}
// 根据配置编码执行相关配置内的方法
AbstractTask task = taskFactory.getTask(taskObj.getConfig_code());
task.updateTaskStatus(taskObj.getTask_code(), status);
} else {
throw new BadRequestException("任务编号为:" + orderId + "的任务正在执行逻辑处理中!");
}
} finally {
if (tryLock) {
lock.unlock();
}
}
return RcsResponse.requestOk();
}
}

View File

@@ -48,7 +48,6 @@ public class PdaIosOutController {
@PostMapping("/getMaterialDtl")
@Log("物料出库获取物料库存")
public ResponseEntity<Object> getMaterialDtl(@RequestBody JSONObject whereJson) {
assertNotBlankJson(whereJson, "请求参数不能为空", "search");
return new ResponseEntity<>(pdaIosOutService.getMaterialDtl(whereJson), HttpStatus.OK);
}
@@ -62,7 +61,7 @@ public class PdaIosOutController {
@PostMapping("/materialConfirm")
@Log("线边库物料出库确认")
public ResponseEntity<Object> materialConfirm(@RequestBody JSONObject whereJson) {
assertNotBlankJson(whereJson, "请求参数不能为空", "sect_id", "siteCode", "group_id");
assertNotBlankJson(whereJson, "请求参数不能为空", "sect_id", "siteCode");
RedissonUtils.lock(() -> {
pdaIosOutService.materialConfirm(whereJson);
}, "materialConfirm" + whereJson.getString("group_id"), null);
@@ -87,7 +86,7 @@ public class PdaIosOutController {
* 货架与站点绑定或解绑
*/
@PostMapping("bindOrUnbind")
@Log("货架与站点绑定或解绑")
@Log("绑定或解绑")
public ResponseEntity<Object> bindOrUnbind(@RequestBody JSONObject whereJson) {
assertNotBlankJson(whereJson, "请求参数不能为空", "siteCode", "shelfCode", "mode");
RedissonUtils.lock(() -> {

View File

@@ -23,7 +23,6 @@ import org.nl.wms.basedata_manage.service.dto.MaterialQuery;
import org.nl.wms.pda.ios_manage.service.PdaIosInService;
import org.nl.wms.pda.util.PdaResponse;
import org.nl.wms.sch_manage.enums.StatusEnum;
import org.nl.wms.sch_manage.enums.TaskEnum;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseRegionService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
@@ -39,6 +38,7 @@ import org.nl.wms.warehouse_management.service.dao.IOStorInvDtl;
import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDtlMapper;
import org.nl.wms.warehouse_management.service.dao.mapper.MdPbGroupplateMapper;
import org.nl.wms.warehouse_management.service.dto.IOStorInvDisDto;
import org.nl.wms.warehouse_management.service.util.UpdateIvtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -104,7 +104,11 @@ public class PdaIosInServiceImpl implements PdaIosInService {
*/
@Autowired
private ISchBasePointService iSchBasePointService;
/**
* 更新库存工具类
*/
@Autowired
private UpdateIvtUtils updateIvtUtils;
/**
* 仓库服务
@@ -292,6 +296,8 @@ public class PdaIosInServiceImpl implements PdaIosInService {
@Override
@Transactional
public PdaResponse confirmReturnMaterial(JSONObject whereJson) {
//校验仓库
Sectattr sectDao = updateIvtUtils.checkVehicleType(whereJson.getString("sect_id"),whereJson.getString("storagevehicle_code"));
//校验回库起点
SchBasePoint schBasePoint = iSchBasePointService.getOne(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getVehicle_code, whereJson.getString("storagevehicle_code")));
if (ObjectUtil.isEmpty(schBasePoint)) {
@@ -301,9 +307,6 @@ public class PdaIosInServiceImpl implements PdaIosInService {
whereJson.put("site_code",schBasePoint.getPoint_code());
whereJson.put("config_code", IOSConstant.BACK_IN_TASK);
whereJson.put("vehicle_code", whereJson.getString("storagevehicle_code"));
whereJson.put("Priority", TaskEnum.ACS_PRIORITY.code("1"));
// 查询库区
Sectattr sectDao = iSectattrService.getById(whereJson.getString("sect_id"));
whereJson.put("stor_id", sectDao.getStor_id());
whereJson.put("sect_code", sectDao.getSect_code());
//入库分配
@@ -375,8 +378,7 @@ public class PdaIosInServiceImpl implements PdaIosInService {
@Override
@Transactional
public PdaResponse confirmIn(JSONObject whereJson) {
// 查询库区
Sectattr sectDao = iSectattrService.getById(whereJson.getString("sect_id"));
Sectattr sectDao = updateIvtUtils.checkVehicleType(whereJson.getString("sect_id"),whereJson.getString("vehicle_code"));
whereJson.put("stor_id", sectDao.getStor_id());
whereJson.put("sect_code", sectDao.getSect_code());
//物料组盘入库
@@ -408,20 +410,21 @@ public class PdaIosInServiceImpl implements PdaIosInService {
//空载具入库
whereJson.put("qty", 1);
whereJson.put("pcsn", whereJson.getString("material_id"));
String materialCode = "1".equals(whereJson.getString("material_id")) ? StatusEnum.VEHICLE_TYPE.code("空托盘") : StatusEnum.VEHICLE_TYPE.code("空料箱");
String materialCode = "1".equals(whereJson.getString("material_id")) ? StatusEnum.VEHICLE_TYPE.code("空托盘") : "2".equals(whereJson.getString("material_id")) ? StatusEnum.VEHICLE_TYPE.code("空料箱") : StatusEnum.VEHICLE_TYPE.code("空货架");
whereJson.put("material_id", materialCode);
//组盘
groupPlate(whereJson);
// 生成空载具入库任务
whereJson.put("config_code", IOSConstant.VEHICLE_IN_TASK);
whereJson.put("vehicle_code", whereJson.getString("vehicle_code"));
whereJson.put("Priority", TaskEnum.ACS_PRIORITY.code("1"));
whereJson.put("storagevehicle_code", whereJson.getString("vehicle_code"));
//入库分配
divStructNoBills(whereJson);
}
return PdaResponse.requestOk();
}
/**
* 组织入库插入数据
* @param whereJson {

View File

@@ -26,7 +26,6 @@ import org.nl.wms.basedata_manage.service.dto.StrategyStructParam;
import org.nl.wms.pda.ios_manage.service.PdaIosOutService;
import org.nl.wms.pda.util.PdaResponse;
import org.nl.wms.sch_manage.enums.StatusEnum;
import org.nl.wms.sch_manage.enums.TaskEnum;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.util.AbstractTask;
@@ -201,23 +200,20 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
@Override
@Transactional
public PdaResponse materialConfirm(JSONObject whereJson) {
//创建出库单/明细/分配
GroupPlate plateDao = mdPbGroupplateMapper.selectOne(
new LambdaQueryWrapper<GroupPlate>()
.eq(GroupPlate::getGroup_id, whereJson.getString("group_id")));
JSONObject json = whereJson.getJSONObject("obj");
Structattr sectDao = iStructattrService.getOne(new LambdaQueryWrapper<Structattr>()
.eq(Structattr::getStruct_code, whereJson.getString("struct_code")));
MdMeMaterialbase materDao = iMdMeMaterialbaseService.getById(plateDao.getMaterial_id());
.eq(Structattr::getStruct_code, json.getString("struct_code")));
MdMeMaterialbase materDao = iMdMeMaterialbaseService.getById(json.getString("material_id"));
whereJson.put("material_id", materDao.getMaterial_id());
whereJson.put("material_code", materDao.getMaterial_code());
whereJson.put("store_id", sectDao.getStor_id());
whereJson.put("store_code", sectDao.getStor_code());
whereJson.put("store_name", sectDao.getStor_name());
whereJson.put("sec", sectDao.getSect_id());
whereJson.put("qty", plateDao.getQty());
whereJson.put("pcsn", plateDao.getPcsn());
whereJson.put("unit_id", plateDao.getQty_unit_id());
whereJson.put("unit_name", plateDao.getQty_unit_name());
whereJson.put("qty", json.getString("qty"));
whereJson.put("pcsn", json.getString("pcsn"));
whereJson.put("unit_id", json.getString("qty_unit_id"));
whereJson.put("unit_name", json.getString("qty_unit_name"));
//创建出库单据
String disId = createOutBills(whereJson);
//锁定货位
@@ -229,9 +225,9 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
JSONObject taskForm = new JSONObject();
taskForm.put("task_type", "STOutTask");
taskForm.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
taskForm.put("PickingLocation", whereJson.getString("struct_code"));
taskForm.put("PickingLocation", json.getString("struct_code"));
taskForm.put("PlacedLocation", whereJson.getString("siteCode"));
taskForm.put("vehicle_code", whereJson.getString("storagevehicle_code"));
taskForm.put("vehicle_code", json.getString("storagevehicle_code"));
StOutTask stOutTask = SpringContextHolder.getBean("STOutTask");
String taskId = stOutTask.create(taskForm);
//更新任务id
@@ -241,8 +237,8 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
);
//更新组盘记录表
mdPbGroupplateMapper.update(new GroupPlate(), new LambdaUpdateWrapper<>(GroupPlate.class)
.set(GroupPlate::getFrozen_qty, plateDao.getQty())
.eq(GroupPlate::getGroup_id, whereJson.getString("group_id"))
.set(GroupPlate::getFrozen_qty, json.getString("qty"))
.eq(GroupPlate::getGroup_id, json.getString("group_id"))
);
return PdaResponse.requestOk();
}
@@ -464,10 +460,8 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
if (ObjectUtils.isNotEmpty(cxPointLists)) {
throw new BadRequestException("该货架正在执行输送任务,状态为锁定,请等任务完成再做绑定或解绑!");
}
//更新点位
LambdaUpdateWrapper<SchBasePoint> wrapper = new LambdaUpdateWrapper<SchBasePoint>()
.eq(SchBasePoint::getPoint_code, whereJson.getString("siteCode"));
if ("1" .equals(whereJson.getString("mode"))) {
LambdaUpdateWrapper<SchBasePoint> wrapper = new LambdaUpdateWrapper<>();
if (IOSEnum.BIND_OR_UNBIND.code("绑定").equals(whereJson.getString("mode"))) {
if (StringUtils.isNotBlank(sitePoint.getVehicle_code())) {
throw new BadRequestException("当前站点已绑定货架:" + sitePoint.getVehicle_code() + ",请先解绑:" + sitePoint.getVehicle_code());
}
@@ -476,13 +470,29 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
if (shelfPoint != null) {
throw new BadRequestException("当前货架已绑定在站点:" + sitePoint.getPoint_code() + ",请先解绑。");
}
//绑定库存
GroupPlate plateDao = mdPbGroupplateMapper.selectOne(
new LambdaQueryWrapper<GroupPlate>()
.eq(GroupPlate::getStoragevehicle_code, whereJson.getString("shelfCode")).eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("组盘")));
if (plateDao != null) {
plateDao.setStatus(IOSEnum.GROUP_PLATE_STATUS.code("入库"));
mdPbGroupplateMapper.updateById(plateDao);
}
wrapper.set(SchBasePoint::getVehicle_code, whereJson.getString("shelfCode"))
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货"));
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货"))
.eq(SchBasePoint::getPoint_code, whereJson.getString("siteCode"));
} else {
if (StringUtils.isNotBlank(sitePoint.getParent_point_code())) {
List<SchBasePoint> sitePointList = iSchBasePointService.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getParent_point_code, sitePoint.getParent_point_code()).eq(SchBasePoint::getIs_used, true));
wrapper.in(SchBasePoint::getPoint_code, sitePointList);
} else {
wrapper.eq(SchBasePoint::getPoint_code, whereJson.getString("siteCode"));
}
wrapper.set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货"));
}
wrapper.set(SchBasePoint::getUpdate_time, DateUtil.now())
.set(SchBasePoint::getIs_has_workder, BaseDataEnum.IS_YES_NOT.code(""))
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName());
iSchBasePointService.update(wrapper);
return PdaResponse.requestOk();
@@ -514,6 +524,9 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
if ("1".equals(whereJson.getString("type"))) {
BigDecimal qty = groupPlate.getQty().subtract(groupPlate.getFrozen_qty()).abs();
updateWrapper.set(GroupPlate::getQty, qty).set(GroupPlate::getFrozen_qty, 0);
if (qty.compareTo(BigDecimal.ZERO) == 0) {
updateWrapper.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库"));
}
} else {
//强制确认
updateWrapper.set(GroupPlate::getQty, 0).set(GroupPlate::getFrozen_qty, 0);
@@ -525,7 +538,7 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
.eq(GroupPlate::getGroup_id, whereJson.getString("group_id"));
//更新组盘记录表
mdPbGroupplateMapper.update(new GroupPlate(), updateWrapper);
//库存绑定到出库点
//库存绑定到出库点
iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class)
.set(SchBasePoint::getVehicle_code, groupPlate.getStoragevehicle_code())
.set(SchBasePoint::getIos_id, BaseDataEnum.IS_YES_NOT.code(""))
@@ -564,7 +577,6 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
task.put("point_code1", schBasePoint.getPoint_code());
task.put("point_code2", pointCode);
task.put("vehicle_code", whereJson.getString("storagevehicle_code"));
task.put("Priority", TaskEnum.ACS_PRIORITY.code("1"));
pdaPointTask.create(task);
// 更新起点绑定id
iSchBasePointService.update(

View File

@@ -47,7 +47,6 @@ public class PdaSchPointController {
}
@PostMapping("/dissect")
@Log("绑定")
@SaIgnore
public ResponseEntity<Object> dissect(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaSchPointService.dissect(whereJson), HttpStatus.OK);

View File

@@ -36,7 +36,6 @@ public interface PdaSchPointService extends IService<SchBasePoint> {
PdaResponse binding(JSONObject whereJson);
/**
* 绑定
* @param whereJson {
* point_code: 点位编码
* point_name: 点位名称

View File

@@ -12,7 +12,7 @@ import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.ext.service.util.AcsResponse;
import org.nl.wms.pda.sch_manage.service.PdaSchTaskService;
import org.nl.wms.pda.util.PdaResponse;
import org.nl.wms.sch_manage.enums.TaskEnum;
import org.nl.wms.sch_manage.enums.StatusEnum;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
@@ -78,7 +78,6 @@ public class PdaSchTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
task.put("point_code1", whereJson.getString("start_point_code"));
task.put("point_code2", whereJson.getString("end_point_code"));
task.put("vehicle_code", whereJson.getString("storagevehicle_code"));
task.put("Priority", TaskEnum.ACS_PRIORITY.code("1"));
pdaPointTask.create(task);
return PdaResponse.requestOk();
}

View File

@@ -1,29 +0,0 @@
package org.nl.wms.sch_manage.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @Author: Liuxy
* @Description:
* @Date: 2025/5/20
*/
@Getter
@AllArgsConstructor
public enum PointStatusEnum {
/**
* 空位/无货
*/
EMPTY_POINT("1", "空位/无货"),
/**
* 有料
*/
FULL_POINT("3", "有料"),
/**
* 空载具/有货
*/
EMPTY_VEHICLE("2", "空载具/有货");
private final String code;
private final String label;
}

View File

@@ -49,25 +49,23 @@ public enum StatusEnum {
"SUB_PickMtrl", "19", "委外用料清单", "PRD_PPBOM", "20", "生产用料清单", "PRD_PickMtrl", "21", "生产领料单",
"SP_PickMtrl", "22", "简单生产领料单", "STK_TransferDirect", "23", "调拨出库单", "STK_MisDelivery", "26", "其他出库单", "PRD_ReturnMtrl", "27", "生产退料单", "PRD_FeedMtrl", "28", "生产补料单", "SUB_RETURNMTRL", "29", "委外退料单")),
/**
* 任务优先级
*/
PRIORITY_TYPE(ForkMap.of(
"最低", "1", null, "普通", "5", null, "较高", "6", null, "加急", "7", null, "移库", "8", null
)),
/**
* 任务类型
*/
TASK_TYPE(ForkMap.pushAll(IOBILL_TYPE_IN.code, IOBILL_TYPE_OUT.code, IOBILL_TYPE_MOVE.code, EXT_TASK_TYPE.code, OTHER_TASK_TYPE.code)),
ACS_TYPE(ForkMap.of(
"立库", "1", null, "AGV任务", "2", null, "CTU任务", "3", null,"三楼CTU", "4", null
)),
ACS_SYSTEM_TYPE(ForkMap.of(
"NDC", "1", null, "仙工", "2", null,"海柔CTU", "5", null, "海康CTU", "6", null
ACS_TASK_TYPE(ForkMap.of(
"叉车", "1", "ccbyrw01", "CTU", "2", "ctubyrw01", "潜伏车", "3", "qfbyrw01", "桁架任务", "4", null
)),
/**
* 任务优先级
*/
ACS_PRIORITY(ForkMap.of(
"最低", 8, null, "普通", 6, null, "", 4, null)),
/**
* 点位锁类型
*/
@@ -86,18 +84,14 @@ public enum StatusEnum {
STOCK_INFO(ForkMap.of("托盘库", "FStockPallet", null, "料箱库", "FStockId", null, "虚拟库", "FicStockId", null, "二楼ctu缓存库", "CStockId", null,
"二楼货架缓存库", "HStockId", null)),
SORT_TYPE(ForkMap.of(
"升序", "1", null, "降序", "2", null
)),
POINT_TYPE(ForkMap.of(
"空货架", "0", null, "满货架", "1", null
)),
BIND_TYPE(ForkMap.of(
"解绑", "0", null, "绑定", "1", null, "不操作", "3", null
)),
VEHICLE_TYPE(ForkMap.of(
"空托盘", "KT001", null, "空料箱", "KL001", null
"空托盘", "KT001", 1, "空料箱", "KL001", 2, "空货架", "KH001", 3
));
/**
@@ -115,9 +109,13 @@ public enum StatusEnum {
throw new BadRequestException(this.name() + "对应类型" + desc + "未定义");
}
public Integer intCode(String desc) {
return this.getCode().getNode(desc);
}
public String getR(String code) {
for (String key : this.getCode().getKeySet()) {
if (key.equals(code)){
if (key.equals(code)) {
String r = this.getCode().getR(key);
if (StringUtils.isEmpty(r)) {
throw new BadRequestException(this.name() + "对应编码" + code + "未定义R的数据");

View File

@@ -1,42 +0,0 @@
package org.nl.wms.sch_manage.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.MapOf;
import java.util.Map;
/**
* 任务枚举类
*
* @author Liuxy
* @Date 2025/05/26
*/
@AllArgsConstructor
@Getter
public enum TaskEnum {
// ACS优先级别
ACS_PRIORITY(MapOf.of("1", "1", "2", "2", "3", "3"))
;
private Map<String, String> code;
public String code(String desc) {
String code = this.getCode().get(desc);
if (StringUtils.isNotEmpty(code)) {
return code;
}
throw new BadRequestException(this.name() + "对应类型" + desc + "未定义");
}
public String check(String code) {
for (Map.Entry<String, String> entry : this.getCode().entrySet())
if (entry.getValue().equals("code")) {
return entry.getValue();
}
throw new BadRequestException(this.name() + "对应类型" + code + "未定义");
}
}

View File

@@ -103,7 +103,7 @@ public class SchBaseTask implements Serializable {
private String create_id;
private String priority;
private Integer priority;
private String create_name;

View File

@@ -16,7 +16,6 @@ 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.sch_manage.enums.PointStatusEnum;
import org.nl.wms.sch_manage.enums.StatusEnum;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
@@ -27,6 +26,7 @@ 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_management.enums.IOSEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -137,7 +137,7 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
}
String pointStatus = entity.getPoint_status();
// 根据点位状态来判断更新内容
if (ObjectUtil.isNotEmpty(pointStatus) && pointStatus.equals(PointStatusEnum.EMPTY_POINT.getCode())) {
if (ObjectUtil.isNotEmpty(pointStatus) && pointStatus.equals(IOSEnum.POINT_STATUS.code("无货"))) {
entity.setVehicle_type("");
entity.setVehicle_code("");
}

View File

@@ -1,7 +1,6 @@
package org.nl.wms.sch_manage.service.util;
import lombok.Data;
import org.nl.wms.sch_manage.service.util.tasks.TaskOrderDetail;
import java.util.List;
import java.util.Map;
@@ -79,7 +78,7 @@ public class AcsTaskDto {
/**
* 优先级
*/
String priority;
Integer priority;
/**
* 载具号

View File

@@ -1,4 +1,4 @@
package org.nl.wms.sch_manage.service.util.tasks;
package org.nl.wms.sch_manage.service.util;
import lombok.Data;
import java.util.Map;

View File

@@ -11,6 +11,7 @@ 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.StatusEnum;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
@@ -72,8 +73,9 @@ public class BackInTask extends AbstractTask {
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setVehicle_type(json.getString("vehicle_type"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setAcs_trace_id(json.getString("acs_task_type"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());

View File

@@ -8,6 +8,7 @@ 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.sch_manage.enums.StatusEnum;
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;
@@ -64,8 +65,9 @@ public class MoveTask extends AbstractTask {
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setVehicle_type(json.getString("vehicle_type"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setAcs_trace_id(json.getString("acs_task_type"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
@@ -76,14 +78,12 @@ public class MoveTask extends AbstractTask {
@Override
public AcsTaskDto sendAcsParam(String taskId) {
SchBaseTask taskDao = taskService.getById(taskId);
// 组织下发给acs的数据
AcsTaskDto acsTaskDto = new AcsTaskDto();
acsTaskDto.setExt_task_uuid(taskDao.getTask_id());
acsTaskDto.setTask_code(taskDao.getTask_code());
acsTaskDto.setStart_device_code(taskDao.getPoint_code1());
acsTaskDto.setNext_device_code(taskDao.getPoint_code2());
acsTaskDto.setPriority(taskDao.getPriority());
acsTaskDto.setTask_type("1");
return acsTaskDto;
}

View File

@@ -10,6 +10,7 @@ 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.StatusEnum;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
@@ -66,8 +67,9 @@ public class PdaPointTask extends AbstractTask {
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setVehicle_type(json.getString("vehicle_type"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setAcs_trace_id(json.getString("acs_task_type"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
@@ -143,8 +145,7 @@ public class PdaPointTask extends AbstractTask {
@Transactional
public void finishTask(SchBaseTask taskObj) {
// 更新起点
iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
iSchBasePointService.update(new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1())
.set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getIos_id, null)

View File

@@ -58,10 +58,11 @@ public class StInTask extends AbstractTask {
task.setConfig_code(json.getString("task_type"));
task.setPoint_code1(json.getString("PickingLocation"));
task.setPoint_code2(json.getString("PlacedLocation"));
task.setVehicle_type(json.getString("vehicle_type"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setGroup_id(json.getString("group_id"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setAcs_trace_id(json.getString("acs_task_type"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());

View File

@@ -8,6 +8,7 @@ import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.IdUtil;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.sch_manage.enums.StatusEnum;
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;
@@ -57,9 +58,10 @@ public class StOutTask extends AbstractTask {
task.setPoint_code1(json.getString("PickingLocation"));
task.setPoint_code2(json.getString("PlacedLocation"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setVehicle_type(json.getString("vehicle_type"));
task.setGroup_id(json.getString("group_id"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setAcs_trace_id(json.getString("acs_task_type"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());

View File

@@ -3,6 +3,7 @@ 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.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
@@ -19,6 +20,9 @@ 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.IOSEnum;
import org.nl.wms.warehouse_management.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_management.service.dao.GroupPlate;
import org.nl.wms.warehouse_management.service.dao.mapper.MdPbGroupplateMapper;
import org.nl.wms.warehouse_management.service.util.UpdateIvtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -32,6 +36,11 @@ import org.springframework.transaction.annotation.Transactional;
@Component(value = "VehicleInTask")
@TaskType("VehicleInTask")
public class VehicleInTask extends AbstractTask {
/**
* 组盘记录
*/
@Autowired
private IMdPbGroupplateService iMdPbGroupplateService;
/**
* 任务服务类
@@ -67,8 +76,9 @@ public class VehicleInTask extends AbstractTask {
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setVehicle_type(json.getString("vehicle_type"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setAcs_trace_id(json.getString("acs_task_type"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
@@ -79,7 +89,6 @@ public class VehicleInTask extends AbstractTask {
@Override
public AcsTaskDto sendAcsParam(String taskId) {
SchBaseTask taskDao = taskService.getById(taskId);
// 组织下发给acs的数据
AcsTaskDto acsTaskDto = new AcsTaskDto();
acsTaskDto.setExt_task_uuid(taskDao.getTask_id());
@@ -146,17 +155,23 @@ public class VehicleInTask extends AbstractTask {
// 更新终点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code2())
.set(Structattr::getStoragevehicle_code, taskObj.getVehicle_code())
.set(Structattr::getTaskdtl_id, null)
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.eq(Structattr::getStruct_code, taskObj.getPoint_code2())
.set(Structattr::getStoragevehicle_code, taskObj.getVehicle_code())
.set(Structattr::getTaskdtl_id, null)
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
);
// 更新起点
iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1())
.set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getIos_id, null)
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1())
.set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getIos_id, null)
);
// 更新库存
iMdPbGroupplateService.update(new GroupPlate(), new LambdaUpdateWrapper<>(GroupPlate.class)
.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库"))
.eq(GroupPlate::getStoragevehicle_code, taskObj.getVehicle_code())
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("组盘"))
);
// 更新任务
taskObj.setRemark("已完成");

View File

@@ -58,9 +58,10 @@ public class VehicleOutTask extends AbstractTask {
task.setPoint_code1(json.getString("PickingLocation"));
task.setPoint_code2(json.getString("PlacedLocation"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setVehicle_type(json.getString("vehicle_type"));
task.setGroup_id(json.getString("group_id"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setAcs_trace_id(json.getString("acs_task_type"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());

View File

@@ -42,7 +42,9 @@ public enum IOSEnum {
)),
// 点位状态
POINT_STATUS(MapOf.of("无货", "0", "有货", "1" )),
POINT_STATUS(MapOf.of("无货", "0", "有货", "1", "空载具", "2" )),
// 绑定操作
BIND_OR_UNBIND(MapOf.of("解绑", "0", "绑定", "1" )),
// 单据创建类型
CREATE_MODE(MapOf.of("PC产生", "1", "终端产生", "2", "外部接口产生", "3")),

View File

@@ -9,6 +9,7 @@ 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.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -28,6 +29,7 @@ import org.nl.wms.basedata_manage.service.dao.BsrealStorattr;
import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper;
import org.nl.wms.basedata_manage.service.dto.MdPbStoragevehicleextDto;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
@@ -61,8 +63,12 @@ import java.util.stream.Collectors;
* 2025/5/29
*/
@Service
public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper,IOStorInv> implements IOutBillService {
public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> implements IOutBillService {
/**
* 点位服务
*/
@Autowired
private ISchBasePointService iSchBasePointService;
@Resource
private IOStorInvMapper ioStorInvMapper;
@@ -1212,6 +1218,14 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper,IOStorInv> i
finish_map.put("inv_id", null);
finish_map.put("inv_code", null);
iStructattrService.updateStatusByCode("1", finish_map);
// 更新终点
iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, task.getPoint_code2())
.set(SchBasePoint::getVehicle_code, task.getVehicle_code())
.set(SchBasePoint::getIos_id, null)
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货"))
);
if (StringUtils.isBlank(task.getHandle_status())) {
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();

View File

@@ -12,9 +12,8 @@ import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleextService;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.sch_manage.enums.TaskEnum;
import org.nl.wms.sch_manage.enums.StatusEnum;
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.tasks.MoveTask;
import org.nl.wms.warehouse_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
@@ -90,7 +89,6 @@ public class StIvtMoveinvdtlServiceImpl extends ServiceImpl<StIvtMoveinvdtlMappe
jsonTask.put("point_code1",json.getString("turnout_struct_code"));
jsonTask.put("point_code2",json.getString("turnin_struct_code"));
jsonTask.put("vehicle_code",json.getString("storagevehicle_code"));
jsonTask.put("Priority", TaskEnum.ACS_PRIORITY.code("1"));
String task_id = moveTask.create(jsonTask);
// 明细数据
StIvtMoveinvdtl dtlDao = new StIvtMoveinvdtl();

View File

@@ -7,14 +7,20 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleextService;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleinfoService;
import org.nl.wms.basedata_manage.service.ISectattrService;
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo;
import org.nl.wms.basedata_manage.service.dao.Sectattr;
import org.nl.wms.sch_manage.enums.StatusEnum;
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.AcsTaskDto;
import org.nl.wms.sch_manage.service.util.tasks.TaskOrderDetail;
import org.nl.wms.sch_manage.service.util.TaskOrderDetail;
import org.nl.wms.warehouse_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.nl.wms.warehouse_management.service.IMdPbGroupplateService;
@@ -24,10 +30,7 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
@@ -44,6 +47,17 @@ public class UpdateIvtUtils {
*/
@Autowired
private IMdPbStoragevehicleextService iMdPbStoragevehicleextService;
/**
* 载具属性服务
*/
@Autowired
private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService;
/**
* 库区服务
*/
@Autowired
private ISectattrService iSectattrService;
/**
* 任务服务
@@ -124,6 +138,10 @@ public class UpdateIvtUtils {
if (CollectionUtils.isNotEmpty(list)) {
throw new BadRequestException("当前载具存在任务:" + list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(",")) + ",请在WMS任务列表中检查!");
}
MdPbStoragevehicleinfo mdPbStoragevehicleinfo = iMdPbStoragevehicleinfoService.getOne(new QueryWrapper<MdPbStoragevehicleinfo>().lambda().eq(MdPbStoragevehicleinfo::getStoragevehicle_code, where.getString("vehicle_code")));
String acsTaskType = StatusEnum.ACS_TASK_TYPE.getR(mdPbStoragevehicleinfo.getStoragevehicle_type());
where.put("acs_task_type", acsTaskType);
where.put("vehicle_type", mdPbStoragevehicleinfo.getStoragevehicle_type());
}
/**
@@ -334,11 +352,10 @@ public class UpdateIvtUtils {
public String sendRcsParam(SchBaseTask taskDao) {
AcsTaskDto acsTaskDto = new AcsTaskDto();
acsTaskDto.setModelProcessCode(taskDao.getVehicle_type());
acsTaskDto.setModelProcessCode(taskDao.getAcs_trace_id());
acsTaskDto.setOrderId(taskDao.getTask_code());
acsTaskDto.setFromSystem("WMS");
acsTaskDto.setPriority(taskDao.getPriority());
acsTaskDto.setShelfNumber(taskDao.getVehicle_code());
TaskOrderDetail detail = new TaskOrderDetail();
detail.setTaskPath(taskDao.getPoint_code2() + "," + taskDao.getPoint_code1());
detail.setShelfNumber(taskDao.getVehicle_code());
@@ -350,7 +367,26 @@ public class UpdateIvtUtils {
List<TaskOrderDetail> detailList = new ArrayList<>();
detailList.add(detail);
acsTaskDto.setTaskOrderDetail(detailList);
return JSON.toJSONString(acsTaskDto, true);
return JSON.toJSONString(acsTaskDto, true);
}
/**
* 校验仓库是否允许该载具类型出入库
*/
public Sectattr checkVehicleType(String sectId, String vehicleCode) {
//查询载具
MdPbStoragevehicleinfo mdPbStoragevehicleinfo = iMdPbStoragevehicleinfoService.getOne(new QueryWrapper<MdPbStoragevehicleinfo>().lambda().eq(MdPbStoragevehicleinfo::getStoragevehicle_code, vehicleCode));
String vehicleType = mdPbStoragevehicleinfo.getStoragevehicle_type();
// 查询库区
Sectattr sectDao = iSectattrService.getById(sectId);
String vehicleTypeList = sectDao.getExt_id();
if (StringUtils.isBlank(vehicleTypeList)) {
throw new BadRequestException("库区:【" + sectDao.getSect_code() + "】未配置允许的载具类型!");
}
List<String> allowedVehicleTypes = Arrays.asList(vehicleTypeList.split(","));
if (!allowedVehicleTypes.contains(vehicleType)) {
throw new BadRequestException("该载具类型【" + mdPbStoragevehicleinfo.getStoragevehicle_name() + "】不在仓库【"+sectDao.getSect_name()+"】的出入库范围内!");
}
return sectDao;
}
}

View File

@@ -9,7 +9,7 @@ spring:
druid:
db-type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://${DB_HOST:192.168.81.251}:${DB_PORT:3306}/${DB_NAME:wms_oulun}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:wms_oulun}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
# url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:wms_oulun}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
username: ${DB_USER:root}
password: ${DB_PWD:123456}

View File

@@ -0,0 +1,139 @@
server:
port: 8011
#配置数据源
spring:
main:
allow-bean-definition-overriding: true
allow-circular-references: true
datasource:
druid:
db-type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3302}/${DB_NAME:wms_oulun}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
# url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:wms_oulun}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
username: ${DB_USER:root}
password: ${DB_PWD:Noble123456.}
# 初始连接数
initial-size: 15
# 最小连接数
min-idle: 25
# 最大连接数
max-active: 40
# 是否自动回收超时连接
remove-abandoned: true
# 超时时间(以秒数为单位)
remove-abandoned-timeout: 180
# 获取连接超时时间
max-wait: 9000
# 连接有效性检测时间
time-between-eviction-runs-millis: 20000
# 连接在池中最小生存的时间
min-evictable-idle-time-millis: 300000
# 连接在池中最大生存的时间
max-evictable-idle-time-millis: 900000
# 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除
test-while-idle: true
# 指明是否在从池中取出连接前进行检验,如果检验失败, 则从池中去除连接并尝试取出另一个
test-on-borrow: false
# 是否在归还到池中前进行检验
test-on-return: false
# 检测连接是否有效
validation-query: select 1 from dual
# 配置监控统计
webStatFilter:
enabled: true
stat-view-servlet:
enabled: true
url-pattern: /druid/*
reset-enable: false
allow: 127.0.0.1
filters:
DruidFilter,stat
log-abandoned: false
keep-alive: true
keep-alive-between-time-millis: 20000
redis:
#数据库索引
database: ${REDIS_DB:1}
#host: ${REDIS_HOST:127.0.0.1}
host: ${REDIS_HOST:localhost}
port: ${REDIS_PORT:6379}
password: ${REDIS_PWD:}
#连接超时时间
timeout: 5000
redisson:
config: |
threads: 4
nettyThreads: 4
singleServerConfig:
connectionMinimumIdleSize: 8
connectionPoolSize: 8
address: redis://127.0.0.1:6379
idleConnectionTimeout: 10000
timeout: 3000
# 登录相关配置
login:
# 登录缓存
cache-enable: true
# 是否限制单用户登录
single-login: false
# 验证码
login-code:
# 验证码类型配置 查看 LoginProperties 类
code-type: arithmetic
# 登录图形验证码有效时间/分钟
expiration: 2
# 验证码高度
width: 111
# 验证码宽度
heigth: 36
# 内容长度
length: 2
# 字体名称,为空则使用默认字体
font-name:
# 字体大小
font-size: 25
#jwt
jwt:
header: Authorization
# 令牌前缀
token-start-with: Bearer
# 必须使用最少88位的Base64对该令牌进行编码
base64-secret: ZmQ0ZGI5NjQ0MDQwY2I4MjMxY2Y3ZmI3MjdhN2ZmMjNhODViOTg1ZGE0NTBjMGM4NDA5NzYxMjdjOWMwYWRmZTBlZjlhNGY3ZTg4Y2U3YTE1ODVkZDU5Y2Y3OGYwZWE1NzUzNWQ2YjFjZDc0NGMxZWU2MmQ3MjY1NzJmNTE0MzI=
# 令牌过期时间 此处单位/毫秒 默认4小时可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html
token-validity-in-seconds: 14400000
# 在线用户key
online-key: online-token-
# 验证码
code-key: code-key-
# token 续期检查时间范围默认30分钟单位毫秒在token即将过期的一段时间内用户操作了则给用户的token续期
detect: 1800000
# 续期时间范围默认1小时单位毫秒
renew: 3600000
sa-token:
# token 名称 (同时也是cookie名称)
token-name: Authorization
# token 有效期单位s 默认30天, -1代表永不过期
timeout: 2592000
# token 临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
activity-timeout: -1
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
is-share: false
# token风格
token-style: random-128
# 是否输出操作日志
is-log: false
jwt-secret-key: opsjajisdnnca0sdkksdfaaasdfwwq
# token 前缀
token-prefix:
is-read-cookie: false
is-print: false
lucene:
index:
path: D:\lms\lucene\index

View File

@@ -13,7 +13,7 @@ spring:
profiles:
active: dev
jackson:
time-zone: GMT+8
time-zone: GMT+8730 885 969
data:
redis:
repositories:
@@ -61,7 +61,7 @@ file:
avatarMaxSize: 5
logging:
file:
path: D:\log\beian\lms
path: D:\log\wms
config: classpath:logback-spring.xml
# sa-token白名单配置
security:

View File

@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<included>
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/>
<property name="LOG_HOME" value="${logPath}"/>
<!-- 按照每天生成日志文件 -->
<appender name="FILE_ERPTOWMS" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/ErpToWms/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
<!--单个日志最大容量 至少10MB才能看得出来-->
<maxFileSize>200MB</maxFileSize>
<!--所有日志最多占多大容量-->
<totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>${log.charset}</charset>
</encoder>
</appender>
<!-- 打印sql -->
<logger name="org.nl.wms.ext.service.impl.ErpToWmsServiceImpl" level="info" additivity="false">
<appender-ref ref="FILE_ERPTOWMS"/>
</logger>
</included>

View File

@@ -33,33 +33,12 @@
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<appender name="ErpLogFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/ErpLog/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数-->
<maxHistory>7</maxHistory>
<!--单个日志最大容量 至少10MB才能看得出来-->
<maxFileSize>100MB</maxFileSize>
<!--所有日志最多占多大容量-->
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--异步到文件-->
<appender name="asyncFileAppender" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender">
<discardingThreshold>2</discardingThreshold>
<queueSize>500</queueSize>
<appender-ref ref="FILE"/>
</appender>
<appender name="asyncERPFileAppender" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>2</discardingThreshold>
<queueSize>500</queueSize>
<appender-ref ref="ErpLogFile"/>
</appender>
<appender name="luceneAppender" class="org.nl.config.lucene.LuceneAppender" >
<properties>
<property>
@@ -102,39 +81,86 @@
<root level="info">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="CONSOLE"/>
<appender-ref ref="asyncFileAppender"/>
</root>
</springProfile>s
<logger name="jdbc" level="ERROR" additivity="true">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.nl.wms.system_manage.service.quartz.task" level="ERROR" additivity="true">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.springframework" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
<appender-ref ref="asyncLuceneAppender"/>
</logger>
<logger name="org.hibernate" level="ERROR" additivity="true">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.quartz" level="ERROR" additivity="true">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="com.google" level="ERROR" additivity="true">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.redisson" level="ERROR" additivity="true">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.nl.modules.wql" level="ERROR" additivity="true">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="asyncFileAppender"/>
</logger>
<logger name="org.springframework.data" level="ERROR" additivity="true">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="asyncFileAppender"/>
</logger>
</springProfile>
<springProfile name="prod">
<root level="info">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="asyncFileAppender"/>
<appender-ref ref="CONSOLE"/>
</root>
<logger name="jdbc" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
<appender-ref ref="asyncLuceneAppender"/>
</logger>
<logger name="org.nl.wms.system_manage.service.quartz.task" level="ERROR" additivity="true">
<appender-ref ref="asyncERPFileAppender"/>
<appender-ref ref="asyncFileAppender"/>
<appender-ref ref="asyncLuceneAppender"/>
</logger>
<logger name="org.springframework" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
<appender-ref ref="asyncLuceneAppender"/>
</logger>
<logger name="org.hibernate" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
<appender-ref ref="asyncLuceneAppender"/>
</logger>
<logger name="org.quartz" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
<appender-ref ref="asyncLuceneAppender"/>
</logger>
<logger name="com.google" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
<appender-ref ref="asyncLuceneAppender"/>
</logger>
<logger name="org.redisson" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
<appender-ref ref="asyncLuceneAppender"/>
</logger>
<logger name="org.nl.modules.wql" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
<appender-ref ref="asyncLuceneAppender"/>
</logger>
<logger name="org.springframework.data" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>
<appender-ref ref="asyncLuceneAppender"/>
</logger>
</springProfile>
<!--测试环境:打印控制台-->