rev:无人车对接

This commit is contained in:
2026-03-10 18:02:24 +08:00
parent 3feb5fcd9f
commit ce2220dc83
20 changed files with 608 additions and 779 deletions

View File

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase;
import org.nl.wms.pda.util.PdaResponse;
import java.util.List;
import java.util.Map;
@@ -48,4 +49,14 @@ public interface MdMeMaterialbaseMapper extends BaseMapper<MdMeMaterialbase> {
* @return List<JSONObject>
*/
List<JSONObject> pdaQueryMaterialInfo(@Param("param") JSONObject whereJson);
/**
* 手持 - 仓库送料 - 查询列表信息(二级页面)
* @param whereJson {
* class_code: 物料类别
* material_code: 关键字
* }
* @return List<JSONObject>
*/
List<JSONObject> pdaMaterialInfo(@Param("param") JSONObject whereJson);
}

View File

@@ -73,4 +73,35 @@
ORDER BY mater.update_time Desc
</select>
<select id="pdaMaterialInfo" resultType="com.alibaba.fastjson.JSONObject">
SELECT
mater.*,
class.class_name,
class.class_code,
supp.supp_name,
unit.unit_code,
unit.unit_name
FROM
md_me_materialbase mater
LEFT JOIN md_pb_classstandard class ON class.class_id = mater.material_type_id
LEFT JOIN md_cs_supplierbase supp ON supp.supp_code = mater.supp_code
LEFT JOIN md_pb_measureunit unit ON unit.measure_unit_id = mater.base_unit_id
<where>
mater.is_used = '1'
AND mater.is_delete = '0'
AND class.class_code IN ('YL001','FL001','WBC001','NBC001','OTHER01')
<if test="param.class_code != null and param.class_code != ''">
AND
(class.class_code = #{param.class_code}
</if>
<if test="param.material_code != null and param.material_code != ''">
AND
(mater.material_code LIKE #{param.material_code} or
mater.material_name LIKE #{param.material_code})
</if>
</where>
ORDER BY mater.update_time Desc
</select>
</mapper>

View File

@@ -29,13 +29,6 @@ public class NotCarToWmsController {
@Autowired
private NotCarToWmsService notCarToWmsService;
@PostMapping("/sendTask")
@Log(value = "无人车给下发WMS搬运任务")
@SaIgnore
public ResponseEntity<Object> sendTask(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(notCarToWmsService.sendTask(whereJson), HttpStatus.OK);
}
@PostMapping("/arrive")
@Log(value = "无人车到达")
@SaIgnore

View File

@@ -29,11 +29,11 @@ public class WmsToNotCarController {
@Autowired
private WmsToNotCarService wmsToNotCarService;
@PostMapping("/resultUnloadTask")
@Log(value = "卸货任务完成反馈")
@PostMapping("/isGoBack")
@Log(value = "是否有成品配送")
@SaIgnore
public ResponseEntity<Object> resultUnloadTask(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(wmsToNotCarService.resultUnloadTask(whereJson), HttpStatus.OK);
public ResponseEntity<Object> isGoBack(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(wmsToNotCarService.isGoBack(whereJson), HttpStatus.OK);
}
@PostMapping("/callNotCat")

View File

@@ -13,21 +13,6 @@ import org.nl.wms.ext.util.NoCarResponse;
*/
public interface NotCarToWmsService {
/**
* 无人车给下发WMS搬运任务
*
* @param whereJson {
* "id": “111” 唯一标识id
* "item": [
* {
* "point_code": "WRCCB01" 卸货点位
* }
* ]
* }
* @return NoCarResponse
*/
NoCarResponse sendTask(JSONObject whereJson);
/**
* 无人车到达
*

View File

@@ -14,20 +14,20 @@ import org.nl.wms.ext.util.NoCarResponse;
public interface WmsToNotCarService {
/**
* 卸货任务完成反馈
* 是否有成品配送
*
* @param whereJson {
* "requestType": "WCS_118",
* "accessId": "1",
* "requestId": "唯一标识",
* "data": {
* "id"”111“
* "to_command":"1"
* "taskNo"”111“
* "isGoback":"1" 0-有 1-没有
* }
* }
* @return BaseResponse
*/
NoCarResponse resultUnloadTask(JSONObject whereJson);
NoCarResponse isGoBack(JSONObject whereJson);
/**
* 呼叫无人车
@@ -40,7 +40,7 @@ public interface WmsToNotCarService {
* "detail": [
* {
* "taskNo": "TASK00000001", 唯一标识
* "taskType": "MV", 任务类型(固定)
* "taskType": "MMV", 任务类型(固定)
* "taskDate": "2023-03-13 12:00:00", 任务时间
* "taskState": "00", 任务状态 00创建
* "priority": "1", 优先级 - 1-最高2-普通+3-普通4-普通-5-最低

View File

@@ -1,24 +1,27 @@
package org.nl.wms.ext.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.config.IdUtil;
import org.nl.config.SpringContextHolder;
import org.nl.system.service.param.ISysParamService;
import org.nl.system.service.param.dao.Param;
import org.nl.system.service.param.impl.SysParamServiceImpl;
import org.nl.wms.ext.service.NotCarToWmsService;
import org.nl.wms.ext.util.NoCarResponse;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.pda.general_management.service.PdaNotCarService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.util.tasks.NoCarUnloadTask;
import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper;
import org.nl.wms.sch_manage.service.util.tasks.NoCarBackCpTask;
import org.nl.wms.warehouse_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
@@ -43,16 +46,22 @@ public class NotCarToWmsServiceImpl implements NotCarToWmsService {
private RedissonClient redissonClient;
/**
* 点位服务
* 点位mapper
*/
@Resource
private ISchBasePointService iSchBasePointService;
private SchBasePointMapper schBasePointMapper;
/**
* 无人车卸货任务类
* 无人车手持服务类
*/
@Resource
private NoCarUnloadTask noCarUnloadTask;
private PdaNotCarService pdaNotCarService;
/**
* 无人车装货任务类
*/
@Resource
private NoCarBackCpTask noCarBackCpTask;
/**
* 系统参数服务
@@ -61,67 +70,7 @@ public class NotCarToWmsServiceImpl implements NotCarToWmsService {
private ISysParamService iSysParamService;
@Override
@SneakyThrows
public NoCarResponse sendTask(JSONObject whereJson) {
log.info("无人车下发搬运任务输入参数:{}", whereJson);
RLock lock = redissonClient.getLock("lock:sendTask");
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLock) {
String id = whereJson.getString("id");
List<JSONObject> itemList = whereJson.getJSONArray("item").toJavaList(JSONObject.class);
// 数据校验
if (ObjectUtil.isEmpty(id)) {
log.info("无人车下发搬运任务输出参数:{}", NoCarResponse.requestError("唯一标识不能为空!").toString());
return NoCarResponse.requestError("唯一标识不能为空!");
}
if (ObjectUtil.isEmpty(itemList)) {
log.info("无人车下发搬运任务输出参数:{}", NoCarResponse.requestError("卸货点位不能为空!").toString());
return NoCarResponse.requestError("卸货点位不能为空!");
}
// 查询【无人车卸货缓存区】是否有空位
List<SchBasePoint> pointList = iSchBasePointService.list(
new QueryWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getRegion_code, IOSEnum.SECT_CODE.code("无人车卸货缓存1区"))
.eq(SchBasePoint::getPoint_status, IOSConstant.ONE)
.eq(SchBasePoint::getIs_used, IOSConstant.ONE)
.and(row -> row.isNull(SchBasePoint::getIng_task_code)
.or().eq(SchBasePoint::getIng_task_code, "")
)
);
if (ObjectUtil.isEmpty(pointList)) {
log.info("无人车下发搬运任务输出参数:{}", NoCarResponse.requestError("当前卸货缓存点位没有空位!").toString());
return NoCarResponse.requestError("当前卸货缓存点位没有空位!");
}
if (itemList.size() > pointList.size()) {
log.info("无人车下发搬运任务输出参数:{}", NoCarResponse.requestError("当前卸货缓存点位空位不够用!当前可用点位为【" + pointList.size() + "").toString());
return NoCarResponse.requestError("当前卸货缓存点位空位不够用!当前可用点位为【" + pointList.size() + "");
}
for (int i = 0; i < itemList.size(); i++) {
JSONObject json = itemList.get(i);
SchBasePoint schBasePoint = pointList.get(i);
// 准备任务参数
JSONObject jsonTask = new JSONObject();
jsonTask.put("point_code1", json.getString("point_code"));
jsonTask.put("point_code2", schBasePoint.getPoint_code());
jsonTask.put("contact_task", id);
noCarUnloadTask.create(jsonTask);
}
} else {
log.info("无人车下发搬运任务输出参数:{}", NoCarResponse.requestError("当前任务正在执行中,请稍后在试...").toString());
return NoCarResponse.requestError("当前任务正在执行中,请稍后在试...");
}
} finally {
if (tryLock) {
lock.unlock();
}
}
log.info("无人车下发搬运任务输出参数:{}", NoCarResponse.responseOk().toString());
return NoCarResponse.responseOk();
}
@Override
@Transactional
@SneakyThrows
public NoCarResponse arrive(JSONObject whereJson) {
log.info("无人车到达输入参数:{}", whereJson);
@@ -138,11 +87,18 @@ public class NotCarToWmsServiceImpl implements NotCarToWmsService {
if (!taskNo.equals(sysParamService.getValue())) {
return NoCarResponse.requestError("任务号与呼叫时不一致!");
}
// 更新值为1
sysParamService.setRemark(IOSConstant.ONE);
iSysParamService.updateById(sysParamService);
// 判断到达点位系统参数类型
Param sysParam = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("IS_ARRIVE");
String value = sysParam.getValue();
if (value.equals(IOSConstant.ONE)) {
// 1.下发车间卸货任务
unLoadSend();
} else if (value.equals(IOSConstant.TWO)) {
// 2.下发车间装货任务
loading();
}
}
// 前往点位
} else {
log.info("无人车到达输出参数:{}", NoCarResponse.requestError("当前任务正在执行中,请稍后在试...").toString());
return NoCarResponse.requestError("当前任务正在执行中,请稍后在试...");
@@ -155,4 +111,57 @@ public class NotCarToWmsServiceImpl implements NotCarToWmsService {
log.info("无人车到达输出参数:{}", NoCarResponse.responseOk().toString());
return NoCarResponse.responseOk();
}
/**
* 创建卸货任务
*/
private void unLoadSend() {
// 查询 无人车有货点位
List<JSONObject> rows = schBasePointMapper.queryNotCarPoint();
JSONObject param = new JSONObject();
param.put("rows", rows);
// 调用手持卸货
pdaNotCarService.unload(param);
}
/**
* 创建装货任务
*/
private void loading() {
// 查询成品库存
List<SchBasePoint> pointIvtList = schBasePointMapper.selectList(
new QueryWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getRegion_code, "CPQ01")
.eq(SchBasePoint::getIs_used, IOSConstant.ONE)
.eq(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有箱有料"))
.orderByDesc(SchBasePoint::getOut_order_seq)
.last("LIMIT 3")
);
// 查询无人车点位
List<SchBasePoint> pointList = schBasePointMapper.selectList(
new QueryWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getRegion_code, IOSConstant.WRC01)
.eq(SchBasePoint::getIs_used, IOSConstant.ONE)
.eq(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位"))
);
if (pointList.size() < pointIvtList.size()) {
throw new BadRequestException("无人车空位异常!当前需求空位【" + pointIvtList.size() + "");
}
String task_group_id = IdUtil.getStringId();
for (int i = 0; i < pointIvtList.size(); i++) {
SchBasePoint jsonIvt = pointIvtList.get(i);
SchBasePoint pointDao = pointList.get(i);
JSONObject jsonTask = new JSONObject();
jsonTask.put("point_code1", jsonIvt.getPoint_code());
jsonTask.put("point_code2", pointDao.getPoint_code());
jsonTask.put("task_group_id", task_group_id);
jsonTask.put("material_id", jsonIvt.getMaterial_id());
jsonTask.put("material_qty", jsonIvt.getMaterial_qty());
noCarBackCpTask.create(jsonTask);
}
}
}

View File

@@ -26,8 +26,8 @@ import org.springframework.stereotype.Service;
public class WmsToNotCarServiceImpl implements WmsToNotCarService {
@Override
public NoCarResponse resultUnloadTask(JSONObject param) {
log.info("下发无人车接口resultUnloadTask的输入参数为-------------------" + param.toString());
public NoCarResponse isGoBack(JSONObject param) {
log.info("下发无人车接口isGoBack的输入参数为-------------------" + param.toString());
// 返回参数
NoCarResponse resultCar;
@@ -48,7 +48,7 @@ public class WmsToNotCarServiceImpl implements WmsToNotCarService {
return NoCarResponse.requestError("系统参数表中:" + SysParamConstant.CAR_URL + "不存在");
}
String url = acsUrlParam.getValue() + "openapi/callback/externalTaskCallback";
String url = acsUrlParam.getValue() + "openapi/callback/isGoBack";
try {
String resultMsg = HttpRequest.post(url)
.body(String.valueOf(param))
@@ -56,7 +56,7 @@ public class WmsToNotCarServiceImpl implements WmsToNotCarService {
// 格式转换
JSONObject result = JSONObject.parseObject(resultMsg);
resultCar = JSONObject.toJavaObject(result, NoCarResponse.class);
log.info("下发无人车接口resultUnloadTask的输出参数为-------------------" + resultMsg);
log.info("下发无人车接口isGoBack的输出参数为-------------------" + resultMsg);
} catch (Exception e) {
//网络不通
String msg = e.getMessage();

View File

@@ -32,25 +32,11 @@ public class PdaNotCarController {
@Autowired
private PdaNotCarService notCarService;
@PostMapping("/queryXhRegion")
@Log("无人车卸货 - 查询卸货区下拉框")
@PostMapping("/queryNotCarPoint")
@Log("无人车卸货 - 查询无人车点位信息")
@SaIgnore
public ResponseEntity<Object> queryXhRegion() {
return new ResponseEntity<>(notCarService.queryXhRegion(), HttpStatus.OK);
}
@PostMapping("/queryEndRegion")
@Log("无人车卸货 - 查询目的区域下拉框")
@SaIgnore
public ResponseEntity<Object> queryEndRegion() {
return new ResponseEntity<>(notCarService.queryEndRegion(), HttpStatus.OK);
}
@PostMapping("/queryRegionPoint")
@Log("无人车卸货 - 查询区域点位信息")
@SaIgnore
public ResponseEntity<Object> queryRegionPoint(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(notCarService.queryRegionPoint(whereJson), HttpStatus.OK);
public ResponseEntity<Object> queryNotCarPoint() {
return new ResponseEntity<>(notCarService.queryNotCarPoint(), HttpStatus.OK);
}
@PostMapping("/unload")
@@ -60,13 +46,6 @@ public class PdaNotCarController {
return new ResponseEntity<>(notCarService.unload(whereJson), HttpStatus.OK);
}
@PostMapping("/waiting")
@Log("无人车卸货 - 等待")
@SaIgnore
public ResponseEntity<Object> waiting(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(notCarService.waiting(whereJson), HttpStatus.OK);
}
@PostMapping("/back")
@Log("无人车卸货 - 回库")
@SaIgnore
@@ -74,15 +53,8 @@ public class PdaNotCarController {
return new ResponseEntity<>(notCarService.back(whereJson), HttpStatus.OK);
}
@PostMapping("/queryZhRegion")
@Log("无人车装货 - 查询装货区下拉框")
@SaIgnore
public ResponseEntity<Object> queryZhRegion() {
return new ResponseEntity<>(notCarService.queryZhRegion(), HttpStatus.OK);
}
@PostMapping("/queryZhPoint")
@Log("无人车装货 - 查询装货区下的点位")
@Log("无人车装货 - 二级页面查询(物料维护)")
@SaIgnore
public ResponseEntity<Object> queryZhPoint(JSONObject whereJson) {
return new ResponseEntity<>(notCarService.queryZhPoint(whereJson), HttpStatus.OK);
@@ -109,5 +81,40 @@ public class PdaNotCarController {
return new ResponseEntity<>(notCarService.installConfirm(), HttpStatus.OK);
}
@PostMapping("/queryCarPoint")
@Log("仓库送料 - 查询无人车点位下拉框(二级页面)")
@SaIgnore
public ResponseEntity<Object> queryCarPoint() {
return new ResponseEntity<>(notCarService.queryCarPoint(), HttpStatus.OK);
}
@PostMapping("/queryClassType")
@Log("仓库送料 - 查询物料类别下拉框(二级页面)")
@SaIgnore
public ResponseEntity<Object> queryClassType() {
return new ResponseEntity<>(notCarService.queryClassType(), HttpStatus.OK);
}
@PostMapping("/queryMaterialInfo")
@Log("仓库送料 - 查询列表信息(二级页面)")
@SaIgnore
public ResponseEntity<Object> queryMaterialInfo(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(notCarService.queryMaterialInfo(whereJson), HttpStatus.OK);
}
@PostMapping("/callCarIos")
@Log("仓库送料 - 呼叫无人车")
@SaIgnore
public ResponseEntity<Object> callCarIos(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(notCarService.callCarIos(whereJson), HttpStatus.OK);
}
@PostMapping("/sendTask")
@Log("仓库送料 - 确认送料")
@SaIgnore
public ResponseEntity<Object> sendTask(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(notCarService.sendTask(whereJson), HttpStatus.OK);
}
}

View File

@@ -14,28 +14,11 @@ import org.nl.wms.pda.util.PdaResponse;
public interface PdaNotCarService {
/**
* 无人车卸货 - 查询卸货区下拉框
* 无人车卸货 - 查询无人车点位信息
*
* @return PdaResponse
*/
PdaResponse queryXhRegion();
/**
* 无人车卸货 - 查询目的区域下拉框
*
* @return PdaResponse
*/
PdaResponse queryEndRegion();
/**
* 无人车卸货 - 查询区域点位信息
*
* @param whereJson {
* region_code: 区域编码
* }
* @return PdaResponse
*/
PdaResponse queryRegionPoint(JSONObject whereJson);
PdaResponse queryNotCarPoint();
/**
* 无人车卸货 - 卸货
@@ -48,16 +31,6 @@ public interface PdaNotCarService {
*/
PdaResponse unload(JSONObject whereJson);
/**
* 无人车卸货 - 等待
*
* @param whereJson {
* <p>
* }
* @return PdaResponse
*/
PdaResponse waiting(JSONObject whereJson);
/**
* 无人车卸货 - 回库
*
@@ -68,44 +41,110 @@ public interface PdaNotCarService {
*/
PdaResponse back(JSONObject whereJson);
/**
* 无人车装货 - 查询装货区下拉框
* @return PdaResponse
*/
PdaResponse queryZhRegion();
/**
* 无人车装货 - 查询装货区下的点位
*
* @param whereJson {
* region_code: 区域编码
* }
* point_code: 货位编码
* }
* @return PdaResponse
*/
PdaResponse queryZhPoint(JSONObject whereJson);
/**
* 无人车装货 - 呼叫无人车
*
* @param whereJson {
* region_code: 区域编码
* rows: [明细]
* }
* }
* @return PdaResponse
*/
PdaResponse callCar(JSONObject whereJson);
/**
* 无人车装货 - 装货
*
* @param whereJson {
* region_code: 区域编码
* rows: [明细]
* }
* }
* @return PdaResponse
*/
PdaResponse install(JSONObject whereJson);
/**
* 无人车装货 - 装货完成
*
* @return PdaResponse
*/
PdaResponse installConfirm();
/**
* 查询无人车点位下拉框(二级页面)
*
* @return PdaResponse
*/
PdaResponse queryCarPoint();
/**
* 查询物料类别下拉框(二级页面)
*
* @return PdaResponse
*/
PdaResponse queryClassType();
/**
* 查询列表信息(二级页面)
*
* @param whereJson {
* class_code: 物料类别
* material_code: 关键字
* }
* @return PdaResponse
*/
PdaResponse queryMaterialInfo(JSONObject whereJson);
/**
* 仓库送料 - 呼叫无人车
*
* @param whereJson {
* <p>
* }
* @return PdaResponse
*/
PdaResponse callCarIos(JSONObject whereJson);
/**
* 仓库送料 - 确认送料
*
* @param whereJson {
* rows: 列表明细
* }
* @return PdaResponse
*/
PdaResponse sendTask(JSONObject whereJson);
/**
* 公共 - 呼叫无人车
*
* @param whereJson {
* point_code 无人车对接点
* }
*/
void publicCallCar(JSONObject whereJson);
/**
* 公共 - 是否有成品配送
*
* @param whereJson {
* isGoback 0-有成品 1-无成品
* }
*/
void publicIsGoBack(JSONObject whereJson);
/**
* 公共 - 装货任务完成
*/
void publicLoadingConfirm();
}

View File

@@ -1,24 +1,24 @@
package org.nl.wms.pda.general_management.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.config.IdUtil;
import org.nl.config.SpringContextHolder;
import org.nl.system.enums.SysParamConstant;
import org.nl.system.service.param.ISysParamService;
import org.nl.system.service.param.dao.Param;
import org.nl.system.service.param.impl.SysParamServiceImpl;
import org.nl.wms.basedata_manage.service.dao.mapper.MdMeMaterialbaseMapper;
import org.nl.wms.ext.service.WmsToNotCarService;
import org.nl.wms.pda.general_management.service.PdaNotCarService;
import org.nl.wms.pda.util.PDAEnum;
import org.nl.wms.pda.util.PdaResponse;
import org.nl.wms.sch_manage.service.ISchBaseRegionService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseRegion;
import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper;
import org.nl.wms.sch_manage.service.util.tasks.NoCarInstallTask;
import org.nl.wms.sch_manage.service.util.tasks.PdaNotCarUnloadTask;
import org.nl.wms.sch_manage.service.util.tasks.NoCarBackCpTask;
import org.nl.wms.sch_manage.service.util.tasks.NoCarUnloadTask;
import org.nl.wms.warehouse_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.springframework.stereotype.Service;
@@ -26,7 +26,10 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* <p>
@@ -40,10 +43,10 @@ import java.util.List;
public class PdaNotCarServiceImpl implements PdaNotCarService {
/**
* 区域服务
* 无人车装货任务类
*/
@Resource
private ISchBaseRegionService iSchBaseRegionService;
private NoCarBackCpTask noCarBackCpTask;
/**
* 点位mapper
@@ -55,7 +58,7 @@ public class PdaNotCarServiceImpl implements PdaNotCarService {
* 无人车卸货任务类
*/
@Resource
private PdaNotCarUnloadTask pdaNotCarUnloadTask;
private NoCarUnloadTask noCarUnloadTask;
/**
* wms调用无人车系统服务
@@ -70,87 +73,245 @@ public class PdaNotCarServiceImpl implements PdaNotCarService {
private ISysParamService iSysParamService;
/**
* 无人车装货任务服务
* 物料信息mapper
*/
@Resource
private NoCarInstallTask noCarInstallTask;
private MdMeMaterialbaseMapper mdMeMaterialbaseMapper;
@Override
public PdaResponse queryXhRegion() {
List<SchBaseRegion> list = iSchBaseRegionService.list(
new QueryWrapper<SchBaseRegion>().lambda()
.in(SchBaseRegion::getRegion_code, IOSEnum.REGION_CODE.code("无人车对接区(拆包)"),
IOSEnum.REGION_CODE.code("无人车对接区(成品)")
)
);
return PdaResponse.requestParamOk(list);
}
@Override
public PdaResponse queryEndRegion() {
List<SchBaseRegion> list = iSchBaseRegionService.list(
new QueryWrapper<SchBaseRegion>().lambda()
.in(SchBaseRegion::getRegion_code, IOSEnum.REGION_CODE.code("无人车卸货缓存区"))
);
return PdaResponse.requestParamOk(list);
}
@Override
public PdaResponse queryRegionPoint(JSONObject whereJson) {
return PdaResponse.requestParamOk(schBasePointMapper.queryRegionPoint(whereJson));
public PdaResponse queryNotCarPoint() {
return PdaResponse.requestParamOk(schBasePointMapper.queryNotCarPoint());
}
@Override
@Transactional
public PdaResponse unload(JSONObject whereJson) {
List<JSONObject> rows = whereJson.getJSONArray("rows").toJavaList(JSONObject.class);
// 查询可用点位
List<SchBasePoint> pointList = divPoint(rows.size(), whereJson.getString("region_code"));
String task_group_id = IdUtil.getStringId();
for (int i = 0; i < rows.size(); i++) {
JSONObject json = rows.get(i);
JSONObject jsonTask = new JSONObject();
jsonTask.put("point_code1", json.getString("point_code"));
jsonTask.put("point_code2", pointList.get(i).getPoint_code());
jsonTask.put("material_id", json.getString("class_code"));
pdaNotCarUnloadTask.create(jsonTask);
// 根据物料类型查询目的点位
List<SchBasePoint> pointList = new ArrayList<>();
if (json.getString("class_code").equals(IOSConstant.WBC001)) {
// 查询存放外包材区域
pointList = schBasePointMapper.getNoTaskPointByRegionAndType(IOSConstant.AGVDJ01, IOSConstant.ONE, IOSConstant.ONE);
} else {
// 查询无人车卸货缓存区域
pointList = schBasePointMapper.getNoTaskPointByRegionAndType(IOSConstant.WXHHC01, IOSConstant.ONE, IOSConstant.ONE);
}
if (ObjectUtil.isEmpty(pointList)) {
throw new BadRequestException("卸货点位无空位可用!");
}
// 按照入库顺序进行排序
pointList = pointList.stream()
.sorted(Comparator.comparing(SchBasePoint::getIn_order_seq))
.collect(Collectors.toList());
jsonTask.put("point_code2", pointList.get(0).getPoint_code());
jsonTask.put("material_id", json.getString("material_id"));
jsonTask.put("material_qty", json.getString("material_qty"));
jsonTask.put("task_group_id", task_group_id);
noCarUnloadTask.create(jsonTask);
}
return PdaResponse.requestOk();
}
@Override
@Transactional
public PdaResponse waiting(JSONObject whereJson) {
return PdaResponse.requestOk();
}
@Override
@Transactional
public PdaResponse back(JSONObject whereJson) {
JSONObject param = new JSONObject();
param.put("isGoback", IOSConstant.ONE);
this.publicIsGoBack(param);
return PdaResponse.requestOk();
}
@Override
public PdaResponse queryZhRegion() {
return null;
}
@Override
public PdaResponse queryZhPoint(JSONObject whereJson) {
// 查询此区域下的空位
List<SchBasePoint> pointList = schBasePointMapper.selectList(
new QueryWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getRegion_code, whereJson.getString("region_code"))
.eq(SchBasePoint::getIs_used, IOSConstant.ONE)
.eq(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有箱有料"))
);
List<SchBasePoint> pointList = schBasePointMapper.getNoTaskPointByRegionAndType("CPQ01", IOSConstant.ONE, IOSConstant.TWO);
if (ObjectUtil.isNotEmpty(whereJson.getString("point_code"))) {
pointList = pointList.stream()
.filter(row -> row.getPoint_code().equals(whereJson.getString("point_code")))
.collect(Collectors.toList());
}
pointList = pointList.stream()
.sorted(Comparator.comparing(SchBasePoint::getOut_order_seq))
.collect(Collectors.toList());
return PdaResponse.requestParamOk(pointList);
}
@Override
@Transactional
public PdaResponse callCar(JSONObject whereJson) {
whereJson.put("point_code", IOSConstant.WRC_POINT02);
this.publicCallCar(whereJson);
// 更新到达点位系统参数
Param sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("IS_ARRIVE");
sysParamService.setValue(IOSConstant.ZERO);
iSysParamService.updateById(sysParamService);
return PdaResponse.requestOk();
}
@Override
@Transactional
public PdaResponse install(JSONObject whereJson) {
// 查询成品库存
List<JSONObject> pointIvtList = whereJson.getJSONArray("rows").toJavaList(JSONObject.class);
if (pointIvtList.size() > 3) {
throw new BadRequestException("不能超过3条任务");
}
// 查询无人车点位
List<SchBasePoint> pointList = schBasePointMapper.selectList(
new QueryWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getRegion_code, IOSConstant.WRC01)
.eq(SchBasePoint::getIs_used, IOSConstant.ONE)
.eq(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位"))
);
if (pointList.size() < pointIvtList.size()) {
throw new BadRequestException("无人车空位异常!当前需求空位【" + pointIvtList.size() + "");
}
// 任务组id
String task_group_id = IdUtil.getStringId();
for (int i = 0; i < pointIvtList.size(); i++) {
JSONObject jsonIvt = pointIvtList.get(i);
SchBasePoint pointDao = pointList.get(i);
JSONObject jsonTask = new JSONObject();
jsonTask.put("point_code1", jsonIvt.getString("point_code"));
jsonTask.put("point_code2", pointDao.getPoint_code());
jsonTask.put("task_group_id", task_group_id);
jsonTask.put("material_id", jsonIvt.getString("material_id"));
jsonTask.put("material_qty", jsonIvt.getString("material_qty"));
noCarBackCpTask.create(jsonTask);
}
return PdaResponse.requestOk();
}
@Override
public PdaResponse installConfirm() {
this.publicLoadingConfirm();
return PdaResponse.requestOk();
}
@Override
public PdaResponse queryCarPoint() {
List<SchBasePoint> pointList = schBasePointMapper.selectList(
new QueryWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getRegion_code, IOSConstant.WRC01)
.eq(SchBasePoint::getIs_used, IOSConstant.ONE)
);
List<JSONObject> resultList = new ArrayList<>();
pointList.forEach(item -> {
JSONObject json = new JSONObject();
json.put("text", item.getPoint_code());
json.put("value", item.getPoint_code());
resultList.add(json);
});
return PdaResponse.requestParamOk(resultList);
}
@Override
public PdaResponse queryClassType() {
return PdaResponse.requestParamOk(PDAEnum.CLASS_TYPE.getDict());
}
@Override
public PdaResponse queryMaterialInfo(JSONObject whereJson) {
return PdaResponse.requestParamOk(mdMeMaterialbaseMapper.pdaMaterialInfo(whereJson));
}
@Override
@Transactional
public PdaResponse callCarIos(JSONObject whereJson) {
whereJson.put("point_code", IOSConstant.WRC_POINT01);
this.publicCallCar(whereJson);
// 更新到达点位系统参数
Param sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("IS_ARRIVE");
sysParamService.setValue(IOSConstant.ZERO);
iSysParamService.updateById(sysParamService);
return PdaResponse.requestOk();
}
@Override
@Transactional
public PdaResponse sendTask(JSONObject whereJson) {
List<JSONObject> pointList = whereJson.getJSONArray("rows").toJavaList(JSONObject.class);
// ---------------校验组盘---------------
// 根据点位分组
Map<String, List<JSONObject>> pointMapList = pointList.stream()
.collect(Collectors.groupingBy(obj -> obj.getString("point_code")));
// 外包位
int wbClass = 0;
// 无人车卸货缓存
int materialClass = 0;
// 只有其他类型的物料可以有多条数据
String flag = "YL001,FL001,WBC001,NBC001";
for (String point : pointMapList.keySet()) {
List<JSONObject> list = pointMapList.get(point);
// 查询点位信息
SchBasePoint schBasePoint = schBasePointMapper.selectById(point);
schBasePoint.setPoint_status(IOSEnum.POINT_STATUS.code("有箱有料"));
schBasePoint.setMaterial_id(list.get(0).getString("material_id"));
boolean is_class = list.stream()
.anyMatch(row -> flag.contains(row.getString("class_code")));
if (is_class) {
// 不是其他类型物料类型:判断是否是一种相同物料
boolean is_like = list.stream()
.allMatch(row -> row.getString("material_code").equals(list.get(0).getString("material_code")));
if (!is_like) {
// 不相同:报错
throw new BadRequestException("当前点位【" + point + "】存在不相同物料,请处理!");
}
schBasePoint.setMaterial_qty(list.get(0).getString("qty"));
// 更新需要用到的货位数量
if (list.get(0).getString("class_code").equals(IOSConstant.WBC001)) {
wbClass += 1;
} else {
materialClass += 1;
}
} else {
// 其他类型物料 - 合计数量
double qty = list.stream()
.map(row -> row.getDoubleValue("qty"))
.reduce(Double::sum).orElse(0.0);
schBasePoint.setMaterial_qty(String.valueOf(qty));
// 更新需要用到的货位数量
materialClass = +1;
}
// 更新点位信息
schBasePointMapper.updateById(schBasePoint);
}
// ---------------校验车间空位---------------
if (wbClass > 0) {
// 查询外包材空位
List<SchBasePoint> wbPointList = schBasePointMapper.getNoTaskPointByRegionAndType(IOSConstant.WBC001, IOSConstant.ONE, IOSConstant.ONE);
if (wbClass > wbPointList.size()) {
throw new BadRequestException("存放外包材空位不足,当前需要空位【" + wbClass + "】当前已有空位【" + wbPointList.size() + "");
}
}
if (materialClass > 0) {
List<SchBasePoint> xhPointList = schBasePointMapper.getNoTaskPointByRegionAndType(IOSConstant.WXHHC01, IOSConstant.ONE, IOSConstant.ONE);
if (materialClass > xhPointList.size()) {
throw new BadRequestException("卸货缓存区空位不足,当前需要空位【" + materialClass + "】当前已有空位【" + xhPointList.size() + "");
}
}
// ---------------下发无人车装货完成反馈---------------
this.publicLoadingConfirm();
// 更新已到达点位系统参数1-下发车间卸货任务
Param sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("IS_ARRIVE");
sysParamService.setValue(IOSConstant.ONE);
iSysParamService.updateById(sysParamService);
return PdaResponse.requestOk();
}
@Override
public void publicCallCar(JSONObject whereJson) {
// 根据区域找对应的无人车对接点
String taskNo = IdUtil.getStringId();
// 将任务号存在系统中
@@ -167,83 +328,48 @@ public class PdaNotCarServiceImpl implements PdaNotCarService {
List<JSONObject> detail = new ArrayList<>();
JSONObject json = new JSONObject();
json.put("taskNo", taskNo);
json.put("taskType", "MV");
json.put("taskType", "MMV");
json.put("taskDate", DateUtil.now());
json.put("taskState", "00");
json.put("priority", IOSConstant.ONE);
json.put("wareCode", "W02");
json.put("wareCode", "W01");
// 目标点位
json.put("toLoc", "");
// 地图
json.put("udf02", "");
json.put("toLoc", whereJson.getString("point_code"));
detail.add(json);
data.put("detail", detail);
param.put("data", data);
// 呼叫无人车
wmsToNotCarService.callNotCat(param);
return PdaResponse.requestOk();
}
@Override
@Transactional
public PdaResponse install(JSONObject whereJson) {
// 判断无人车是否到位
public void publicIsGoBack(JSONObject whereJson) {
JSONObject param = new JSONObject();
param.put("requestType", "WCS_118");
param.put("accessId", IOSConstant.ONE);
param.put("requestId", IdUtil.getStringId());
JSONObject data = new JSONObject();
Param sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("NO_CAR_TASK");
if (!sysParamService.getRemark().equals(IOSConstant.ONE)) {
throw new BadRequestException("无人车未到位!");
}
// 查询无人车上的点位
// 创建装货任务
List<JSONObject> rows = whereJson.getJSONArray("rows").toJavaList(JSONObject.class);
if (rows.size() > 2) {
throw new BadRequestException("选择物料不能大于2条!");
}
for (int i = 0; i < rows.size(); i++) {
JSONObject json = rows.get(i);
JSONObject task = new JSONObject();
task.put("point_code1", json.getString("point_code"));
task.put("point_code2", "");
task.put("contact_task", sysParamService.getValue());
noCarInstallTask.create(task);
}
return PdaResponse.requestOk();
data.put("taskNo", sysParamService.getValue());
data.put("isGoback", whereJson.getString("isGoback"));
param.put("data", data);
// 是否有成品配送
wmsToNotCarService.isGoBack(param);
}
@Override
public PdaResponse installConfirm() {
// 判断无人车是否到位
public void publicLoadingConfirm() {
JSONObject param = new JSONObject();
param.put("requestType", "WCS_110");
param.put("accessId", IOSConstant.ONE);
param.put("requestId", IdUtil.getStringId());
JSONObject data = new JSONObject();
Param sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("NO_CAR_TASK");
sysParamService.setRemark(IOSConstant.ZERO);
iSysParamService.updateById(sysParamService);
// 调用无人装货任务类
noCarInstallTask.backParam(sysParamService.getValue());
return PdaResponse.requestOk();
}
/**
* 根据数量找到对应可用点位
*
* @param size 数量
* @param region_code 区域编码
* @return List<SchBasePoint>
*/
private List<SchBasePoint> divPoint(int size, String region_code) {
List<SchBasePoint> pointList = schBasePointMapper.selectList(
new QueryWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位"))
.eq(SchBasePoint::getRegion_code, region_code)
.eq(SchBasePoint::getIs_used, IOSConstant.ONE)
.and(row -> row.isNull(SchBasePoint::getIng_task_code)
.or().eq(SchBasePoint::getIng_task_code, "")
)
.orderByAsc(SchBasePoint::getPoint_code)
);
if (pointList.size() < size) {
throw new BadRequestException("当前区域空位不够,当前区域剩余空位【" + pointList.size() + "");
}
return pointList;
data.put("taskNo", sysParamService.getValue());
param.put("data", data);
wmsToNotCarService.continueTask(param);
}
}

View File

@@ -40,6 +40,9 @@ public enum PDAEnum {
// 运送类型
TASK_TYPE(MapOf.of("小料箱", "1", "大料箱或其他", "2")),
// 物料类别
CLASS_TYPE(MapOf.of("原料", "YL001", "辅料", "FL001", "内包材", "NBC001", "外包材", "WBC001", "其他", "OTHER01")),
;
private Map<String, String> code;

View File

@@ -131,6 +131,8 @@ public class SchBasePoint implements Serializable {
// 入库库区
private String in_sect;
private String material_id;
@TableField(exist = false)
private List<String> can_vehicle_types;

View File

@@ -60,13 +60,10 @@ public interface SchBasePointMapper extends BaseMapper<SchBasePoint> {
List<SchBasePoint> getCanUsePointByRegion(String regionCode);
/**
* 无人车卸货 - 查询区域点位信息
* @param whereJson {
* region_code: 区域编码
* }
* 无人车卸货 - 查询无人车点位信息
* @return PdaResponse
*/
List<JSONObject> queryRegionPoint(@Param("param") JSONObject whereJson);
List<JSONObject> queryNotCarPoint();
/**
* 手持功能

View File

@@ -124,21 +124,21 @@
OR t.point_code2 = p.point_code ))
</select>
<select id="queryRegionPoint" resultType="com.alibaba.fastjson.JSONObject">
<select id="queryNotCarPoint" resultType="com.alibaba.fastjson.JSONObject">
SELECT
point.*,
mater.material_code,
mater.material_name,
class.class_code,
class.class_name
FROM
sch_base_point point
LEFT JOIN md_pb_classstandard class ON point.can_material_type = class.class_code
LEFT JOIN md_me_materialbase mater ON point.material_id = mater.material_id
LEFT JOIN md_pb_classstandard class ON mater.material_type_id = class.class_id
<where>
IFNULL(point.can_material_type, '') != ''
<if test="param.region_code != null and param.region_code != ''">
AND
point.region_code = #{param.region_code}
</if>
IFNULL(point.material_id, '') != ''
AND point.point_status != '1'
AND point.region_code = 'WRC01'
</where>
</select>

View File

@@ -9,6 +9,11 @@ import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.IdUtil;
import org.nl.config.SpringContextHolder;
import org.nl.system.service.param.ISysParamService;
import org.nl.system.service.param.dao.Param;
import org.nl.system.service.param.impl.SysParamServiceImpl;
import org.nl.wms.pda.general_management.service.PdaNotCarService;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
@@ -20,9 +25,6 @@ import org.nl.wms.sch_manage.service.util.AcsTaskDto;
import org.nl.wms.sch_manage.service.util.TaskType;
import org.nl.wms.warehouse_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.nl.wms.warehouse_management.service.IStIvtMoveinvService;
import org.nl.wms.warehouse_management.service.IStIvtMoveinvdtlService;
import org.nl.wms.warehouse_management.service.dao.StIvtMoveinvdtl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@@ -55,10 +57,16 @@ public class NoCarBackCpTask extends AbstractTask {
private ISchBasePointService iSchBasePointService;
/**
* 无人车卸货任务类
* 无人车对接服务
*/
@Resource
private NoCarUnloadTask noCarUnloadTask;
private PdaNotCarService pdaNotCarService;
/**
* 系统参数服务
*/
@Resource
private ISysParamService iSysParamService;
@Override
public String create(JSONObject json) {
@@ -69,10 +77,11 @@ public class NoCarBackCpTask extends AbstractTask {
task.setConfig_code(NoCarBackCpTask.class.getSimpleName());
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setGroup_id(json.getString("group_id"));
task.setMaterial_id(json.getString("material_id"));
task.setMaterial_qty(json.getBigDecimal("material_qty"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setContact_task(json.getString("contact_task"));
task.setTask_group_id(json.getString("task_group_id"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
@@ -156,9 +165,9 @@ public class NoCarBackCpTask extends AbstractTask {
// 更新起点
iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1())
.set(SchBasePoint::getVehicle_code, "")
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位"))
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1())
.set(SchBasePoint::getIng_task_code, "")
);
@@ -170,13 +179,17 @@ public class NoCarBackCpTask extends AbstractTask {
// 判断任务是否全部完成
List<SchBaseTask> list = taskService.list(
new QueryWrapper<SchBaseTask>().lambda()
.eq(SchBaseTask::getContact_task, taskObj.getContact_task())
.eq(SchBaseTask::getTask_group_id, taskObj.getTask_group_id())
.eq(SchBaseTask::getIs_delete, IOSConstant.ZERO)
.lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode())
);
if (ObjectUtil.isEmpty(list)) {
// 通知货完成回库
noCarUnloadTask.resultNoCar(taskObj.getContact_task());
// 通知货完成回库
pdaNotCarService.publicLoadingConfirm();
// 获取系统参数:无人车到达点位处理
Param sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("IS_ARRIVE");
sysParamService.setValue(IOSConstant.ZERO);
iSysParamService.updateById(sysParamService);
}
}

View File

@@ -1,218 +0,0 @@
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.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.IdUtil;
import org.nl.config.SpringContextHolder;
import org.nl.system.service.param.ISysParamService;
import org.nl.system.service.param.dao.Param;
import org.nl.system.service.param.impl.SysParamServiceImpl;
import org.nl.wms.ext.service.WmsToNotCarService;
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.ACSTaskTypeEnum;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
import org.nl.wms.sch_manage.service.util.TaskType;
import org.nl.wms.warehouse_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
* <p>
* 无人车装货任务类
* </p>
*
* @author Liuxy
* @since 2026-02-06
*/
@Component(value = "NoCarInstallTask")
@TaskType("NoCarInstallTask")
public class NoCarInstallTask extends AbstractTask {
/**
* 任务服务类
*/
@Autowired
private ISchBaseTaskService taskService;
/**
* 点位服务
*/
@Resource
private ISchBasePointService iSchBasePointService;
/**
* 系统参数服务
*/
@Resource
private ISysParamService iSysParamService;
/**
* wms调用无人车服务
*/
@Resource
private WmsToNotCarService wmsToNotCarService;
@Override
public String create(JSONObject json) {
SchBaseTask task = new SchBaseTask();
task.setTask_id(IdUtil.getStringId());
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setTask_status(TaskStatus.CREATE.getCode());
task.setConfig_code(NoCarInstallTask.class.getSimpleName());
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setGroup_id(json.getString("group_id"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setContact_task(json.getString("contact_task"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
taskService.save(task);
// 下发任务
this.sendTaskOne(task.getTask_id());
return task.getTask_id();
}
@Override
public AcsTaskDto sendAcsParam(String taskId) {
SchBaseTask taskDao = taskService.getById(taskId);
// 组织下发给acs的数据
AcsTaskDto acsTaskDto = new AcsTaskDto();
acsTaskDto.setExt_task_id(taskDao.getTask_id());
acsTaskDto.setTask_code(taskDao.getTask_code());
acsTaskDto.setStart_device_code(taskDao.getPoint_code1());
acsTaskDto.setNext_device_code(taskDao.getPoint_code2());
acsTaskDto.setVehicle_code(taskDao.getVehicle_code());
acsTaskDto.setTask_type(ACSTaskTypeEnum.AGV_TASK.getCode());
acsTaskDto.setPriority(IOSConstant.ONE);
acsTaskDto.setAgv_system_type(IOSConstant.TWO);
return acsTaskDto;
}
@Override
@Transactional
protected void updateStatus(String task_code, TaskStatus status) {
// 校验任务
SchBaseTask taskObj = taskService.getByCode(task_code);
if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) {
throw new BadRequestException("该任务已完成!");
}
if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) {
throw new BadRequestException("该任务已取消!");
}
// 根据传来的类型去对任务进行操作
if (status.equals(TaskStatus.EXECUTING)) {
taskObj.setTask_status(TaskStatus.EXECUTING.getCode());
taskObj.setRemark("执行中");
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj);
}
}
@Override
@Transactional
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj);
}
@Override
@Transactional
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.cancelTask(taskObj);
}
@Override
public void taskConfirm(String task_code) {
}
@Transactional
public void finishTask(SchBaseTask taskObj) {
// 更新起点
iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
.set(SchBasePoint::getVehicle_code, "")
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位"))
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1())
.set(SchBasePoint::getIng_task_code, "")
);
// 更新任务状态
taskObj.setRemark("已完成");
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskService.updateById(taskObj);
// 判断任务是否全部完成
List<SchBaseTask> list = taskService.list(
new QueryWrapper<SchBaseTask>().lambda()
.eq(SchBaseTask::getContact_task, taskObj.getContact_task())
.eq(SchBaseTask::getIs_delete, IOSConstant.ZERO)
.lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode())
);
if (ObjectUtil.isEmpty(list)) {
// 更新系统参数为0
Param sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("NO_CAR_TASK");
sysParamService.setRemark(IOSConstant.ZERO);
iSysParamService.updateById(sysParamService);
// 通知装货完成回库
this.backParam(taskObj.getContact_task());
}
}
@Transactional
public void cancelTask(SchBaseTask taskObj) {
// 更新任务状态
taskObj.setRemark("已取消");
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskService.updateById(taskObj);
}
/**
* 装货完成
*/
public void backParam(String taskNo) {
JSONObject param = new JSONObject();
param.put("requestType", "WCS_110");
param.put("accessId", IOSConstant.ONE);
param.put("requestId", IdUtil.getStringId());
JSONObject data = new JSONObject();
data.put("taskNo", taskNo);
param.put("data", data);
// 调用服务
wmsToNotCarService.continueTask(param);
}
}

View File

@@ -9,7 +9,11 @@ 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.ext.service.WmsToNotCarService;
import org.nl.config.SpringContextHolder;
import org.nl.system.service.param.ISysParamService;
import org.nl.system.service.param.dao.Param;
import org.nl.system.service.param.impl.SysParamServiceImpl;
import org.nl.wms.pda.general_management.service.PdaNotCarService;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
@@ -53,16 +57,16 @@ public class NoCarUnloadTask extends AbstractTask {
private ISchBasePointService iSchBasePointService;
/**
* wms调用无人车服务
* 手持无人车服务
*/
@Resource
private WmsToNotCarService wmsToNotCarService;
private PdaNotCarService pdaNotCarService;
/**
* 无人车卸货回库带成品任务类
* 系统参数服务
*/
@Resource
private NoCarBackCpTask noCarBackCpTask;
private ISysParamService iSysParamService;
@Override
public String create(JSONObject json) {
@@ -75,21 +79,16 @@ public class NoCarUnloadTask extends AbstractTask {
task.setPoint_code2(json.getString("point_code2"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setMaterial_id(json.getString("material_id"));
task.setTask_group_id(json.getString("task_group_id"));
task.setMaterial_qty(json.getBigDecimal("material_qty"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setContact_task(json.getString("contact_task"));
task.setRemark(json.getString("remark"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
taskService.save(task);
// 更新终点任务号
SchBasePoint pointDao = iSchBasePointService.getById(task.getPoint_code2());
pointDao.setIng_task_code(task.getTask_id());
iSchBasePointService.updateById(pointDao);
// 下发任务
this.sendTaskOne(task.getTask_id());
return task.getTask_id();
@@ -178,14 +177,15 @@ public class NoCarUnloadTask extends AbstractTask {
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1())
.set(SchBasePoint::getVehicle_code, "")
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位"))
.set(SchBasePoint::getIng_task_code, "")
.set(SchBasePoint::getMaterial_id, "")
);
// 更新终点
iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2())
.set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code())
.set(SchBasePoint::getIng_task_code, "")
.set(SchBasePoint::getMaterial_id, taskObj.getMaterial_id())
.set(SchBasePoint::getMaterial_qty, taskObj.getMaterial_qty())
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有箱有料"))
);
// 更新任务
@@ -196,33 +196,45 @@ public class NoCarUnloadTask extends AbstractTask {
// 判断卸货任务是否全部完成
List<SchBaseTask> list = taskService.list(
new QueryWrapper<SchBaseTask>().lambda()
.eq(SchBaseTask::getContact_task, taskObj.getContact_task())
.eq(SchBaseTask::getTask_group_id, taskObj.getTask_group_id())
.eq(SchBaseTask::getIs_delete, IOSConstant.ZERO)
.lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode())
);
if (ObjectUtil.isEmpty(list)) {
// 判断成品区是否有货,有就生成任务
// 判断成品区是否有货
List<SchBasePoint> pointList = iSchBasePointService.list(
new QueryWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getRegion_code, "CPQ01")
.eq(SchBasePoint::getIs_used, IOSConstant.ONE)
.eq(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有箱有料"))
.last("LIMIT 2")
.orderByDesc(SchBasePoint::getOut_order_seq)
.last("LIMIT 3")
);
if (ObjectUtil.isNotEmpty(pointList)) {
// 创建装货任务
for (SchBasePoint dao : pointList) {
JSONObject taskParam = new JSONObject();
taskParam.put("point_code1", dao.getPoint_code());
taskParam.put("point_code2", "成品对接点");
taskParam.put("contact_task", taskObj.getContact_task());
noCarBackCpTask.create(taskParam);
}
} else {
// 调用无人车卸货完成
this.resultNoCar(taskObj.getContact_task());
}
// 获取系统参数:无人车到达点位处理
Param sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("IS_ARRIVE");
JSONObject isGoBackParam = new JSONObject();
if (ObjectUtil.isNotEmpty(pointList)) {
// 更新系统参数到达参数
sysParamService.setValue(IOSConstant.TWO);
iSysParamService.updateById(sysParamService);
// 返回有成品配送
isGoBackParam.put("isGoback", IOSConstant.ZERO);
pdaNotCarService.publicIsGoBack(isGoBackParam);
// 呼叫无人车
JSONObject param = new JSONObject();
param.put("point_code", IOSConstant.WRC_POINT02);
pdaNotCarService.publicCallCar(param);
} else {
// 返回没有成品配送
isGoBackParam.put("isGoback", IOSConstant.ONE);
pdaNotCarService.publicIsGoBack(isGoBackParam);
// 更新系统参数到达参数
sysParamService.setValue(IOSConstant.ZERO);
iSysParamService.updateById(sysParamService);
}
}
}
@@ -232,36 +244,16 @@ public class NoCarUnloadTask extends AbstractTask {
iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1())
.set(SchBasePoint::getIng_task_code, "")
);
// 更新终点
iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2())
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位"))
.set(SchBasePoint::getIng_task_code, "")
);
// 更新任务
taskObj.setRemark("已取消");
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskService.updateById(taskObj);
}
/**
* 卸货任务完成反馈
*
* @param id 无人车下发任务标识
*/
public void resultNoCar(String id) {
JSONObject param = new JSONObject();
param.put("requestType", "WCS_118");
param.put("accessId", IOSConstant.ONE);
param.put("requestId", IdUtil.getStringId());
JSONObject data = new JSONObject();
data.put("id", id);
data.put("to_command", IOSConstant.TWO);
param.put("data", data);
wmsToNotCarService.resultUnloadTask(param);
}
}

View File

@@ -1,191 +0,0 @@
package org.nl.wms.sch_manage.service.util.tasks;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.IdUtil;
import org.nl.wms.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.ACSTaskTypeEnum;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
import org.nl.wms.sch_manage.service.util.TaskType;
import org.nl.wms.warehouse_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
/**
* <p>
* 无人车卸货任务类
* </p>
*
* @author Liuxy
* @since 2026-01-06
*/
@Component(value = "PdaNotCarUnloadTask")
@TaskType("PdaNotCarUnloadTask")
public class PdaNotCarUnloadTask extends AbstractTask {
/**
* 任务服务类
*/
@Autowired
private ISchBaseTaskService taskService;
/**
* 点位服务
*/
@Resource
private ISchBasePointService iSchBasePointService;
@Override
public String create(JSONObject json) {
SchBaseTask task = new SchBaseTask();
task.setTask_id(IdUtil.getStringId());
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setTask_status(TaskStatus.CREATE.getCode());
task.setConfig_code(PdaNotCarUnloadTask.class.getSimpleName());
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setMaterial_id(json.getString("material_id"));
task.setMaterial_qty(json.getBigDecimal("material_qty"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setRemark(json.getString("remark"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
taskService.save(task);
// 下发任务
this.sendTaskOne(task.getTask_id());
return task.getTask_id();
}
@Override
public AcsTaskDto sendAcsParam(String taskId) {
SchBaseTask taskDao = taskService.getById(taskId);
// 组织下发给acs的数据
AcsTaskDto acsTaskDto = new AcsTaskDto();
acsTaskDto.setExt_task_id(taskDao.getTask_id());
acsTaskDto.setTask_code(taskDao.getTask_code());
acsTaskDto.setStart_device_code(taskDao.getPoint_code1());
acsTaskDto.setNext_device_code(taskDao.getPoint_code2());
acsTaskDto.setPriority(taskDao.getPriority());
acsTaskDto.setVehicle_code(taskDao.getVehicle_code());
acsTaskDto.setVehicle_type(IOSConstant.ONE);
acsTaskDto.setTask_type(ACSTaskTypeEnum.AGV_TASK.getCode());
acsTaskDto.setPriority(IOSConstant.ONE);
acsTaskDto.setAgv_system_type(IOSConstant.TWO);
return acsTaskDto;
}
@Override
@Transactional
protected void updateStatus(String task_code, TaskStatus status) {
// 校验任务
SchBaseTask taskObj = taskService.getByCode(task_code);
if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) {
throw new BadRequestException("该任务已完成!");
}
if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) {
throw new BadRequestException("该任务已取消!");
}
// 根据传来的类型去对任务进行操作
if (status.equals(TaskStatus.EXECUTING)) {
// 更新明细状态
this.executingTask(taskObj);
taskObj.setTask_status(TaskStatus.EXECUTING.getCode());
taskObj.setRemark("执行中");
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj);
}
}
@Override
@Transactional
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj);
}
@Override
@Transactional
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
throw new BadRequestException("只能取消生成中的任务!");
}
this.cancelTask(taskObj);
}
@Override
public void taskConfirm(String task_code) {
}
@Transactional
public void finishTask(SchBaseTask taskObj) {
// 更新起点
iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1())
.set(SchBasePoint::getVehicle_code, "")
.set(SchBasePoint::getCan_material_type, "")
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位"))
);
// 更新终点
iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2())
.set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code())
.set(SchBasePoint::getCan_material_type, taskObj.getMaterial_id())
.set(SchBasePoint::getIng_task_code, "")
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有箱有料"))
);
// 更新任务
taskObj.setRemark("已完成");
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskService.updateById(taskObj);
}
@Transactional
public void cancelTask(SchBaseTask taskObj) {
// 更新终点
iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2())
.set(SchBasePoint::getIng_task_code, "")
);
// 更新任务
taskObj.setRemark("已取消");
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskService.updateById(taskObj);
}
}

View File

@@ -122,4 +122,34 @@ public class IOSConstant {
*/
public final static String CL001 = "CL001";
/**
* 分类编码:外包材
*/
public final static String WBC001 = "WBC001";
/**
* 点位区域:外包材储存区
*/
public final static String AGVDJ01 = "AGVDJ01";
/**
* 点位区域:无人车卸货缓存区
*/
public final static String WXHHC01 = "WXHHC01";
/**
* 点位区域:无人车运货区
*/
public final static String WRC01 = "WRC01";
/**
* 无人车对接点:仓库
*/
public final static String WRC_POINT01 = "WRC01";
/**
* 无人车对接点:车间
*/
public final static String WRC_POINT02 = "WRC02";
}