add:新增手持功能

This commit is contained in:
2025-08-19 13:11:48 +08:00
parent aefc80ea27
commit 5141db3113
43 changed files with 2148 additions and 179 deletions

View File

@@ -32,13 +32,18 @@ public class TableDataInfo<T> implements Serializable {
/**
* 消息状态码
*/
private int code;
private String code;
/**
* 消息内容
*/
private String msg;
/**
* 反馈数据
*/
private Object data;
/**
* 分页
*
@@ -52,7 +57,7 @@ public class TableDataInfo<T> implements Serializable {
public static <T> TableDataInfo<T> build(IPage<T> page) {
TableDataInfo<T> rspData = new TableDataInfo<>();
rspData.setCode(HttpStatus.HTTP_OK);
rspData.setCode(String.valueOf(HttpStatus.HTTP_OK));
rspData.setMsg("查询成功");
rspData.setContent(page.getRecords());
rspData.setTotalElements(page.getTotal());
@@ -61,7 +66,7 @@ public class TableDataInfo<T> implements Serializable {
public static <T> TableDataInfo<T> build(List<T> list) {
TableDataInfo<T> rspData = new TableDataInfo<>();
rspData.setCode(HttpStatus.HTTP_OK);
rspData.setCode(String.valueOf(HttpStatus.HTTP_OK));
rspData.setMsg("查询成功");
rspData.setContent(list);
rspData.setTotalElements(list.size());
@@ -70,9 +75,17 @@ public class TableDataInfo<T> implements Serializable {
public static <T> TableDataInfo<T> build() {
TableDataInfo<T> rspData = new TableDataInfo<>();
rspData.setCode(HttpStatus.HTTP_OK);
rspData.setCode(String.valueOf(HttpStatus.HTTP_OK));
rspData.setMsg("查询成功");
return rspData;
}
public static <T> TableDataInfo<T> buildJson(Object result) {
TableDataInfo<T> rspData = new TableDataInfo<>();
rspData.setCode(String.valueOf(HttpStatus.HTTP_OK));
rspData.setData(result);
rspData.setMsg("操作成功");
return rspData;
}
}

View File

@@ -18,6 +18,8 @@ public class RsaUtils {
private static final String SRC = "123456";
public static final String KEY = "MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A==";
public static void main(String[] args) throws Exception {
System.out.println("\n");
RsaKeyPair keyPair = generateKeyPair();

View File

@@ -10,7 +10,9 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.base.TableDataInfo;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.RsaUtils;
import org.nl.common.utils.dto.CurrentUser;
@@ -52,52 +54,32 @@ public class MobileAuthorizationController {
@PostMapping(value = "/login")
@SaIgnore
public ResponseEntity<Object> login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception {
String salt = "salt";
// 密码解密 - 前端的加密规则: encrypt根据实际更改
String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword());
// 校验数据库
// 根据用户名查询,在比对密码
// 拿到多个已经抛出异常
SysUser userInfo = userService.getOne(new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getUsername, authUser.getUsername()));
if (ObjectUtil.isEmpty(userInfo) || !userInfo.getPassword().equals(SaSecureUtil.md5BySalt(password, salt))) {
throw new BadRequestException(LangProcess.msg("login_pwd"));
public ResponseEntity<Object> login(@RequestBody Map<String, String> whereJson) throws Exception {
SysUser userInfo = userService.getOne(new QueryWrapper<SysUser>().eq("username", whereJson.get("username")));
if (userInfo == null || !userInfo.getPassword().equals(SaSecureUtil.md5BySalt(RsaUtils.decryptByPrivateKey(RsaUtils.KEY, whereJson.get("password")), "salt"))) { // 这里需要密码加密
throw new BadRequestException("账号或密码错误");
}
// 获取权限列表 - 登录查找权限
List<String> permissionList = roleService.getPermissionList((JSONObject) JSON.toJSON(userInfo));
if (!userInfo.getIs_used()) {
throw new BadRequestException(LangProcess.msg("login_account"));
throw new BadRequestException("账号未激活");
}
List<String> permissionList = roleService.getPermissionList((JSONObject) JSON.toJSON(userInfo));
// 登录输入,登出删除
CurrentUser user = new CurrentUser();
user.setId(userInfo.getUser_id());
user.setUsername(userInfo.getUsername());
user.setPresonName(userInfo.getPerson_name());
user.setPresonName((userInfo.getPerson_name()));
user.setUser(userInfo);
user.setPermissions(permissionList);
// SaLoginModel 配置登录相关参数
/*
* PE: 此次登录的客户端设备类型, 用于[同端互斥登录]时指定此次登录的设备类型
* loginInfo: Token挂载的扩展参数 此方法只有在集成jwt插件时才会生效
*/
StpUtil.login(userInfo.getUser_id(), new SaLoginModel()
.setDevice("PE")
.setExtra("loginInfo", user)
.setDevice("PC") // 此次登录的客户端设备类型, 用于[同端互斥登录]时指定此次登录的设备类型
.setExtra("loginInfo", JSONObject.toJSONString(user)) // Token挂载的扩展参数 此方法只有在集成jwt插件时才会生效
);
// 返回 token 与 用户信息
JSONObject jsonObject = new JSONObject();
jsonObject.put("user", userInfo);
JSONObject authInfo = new JSONObject(2) {{
put("token", "Bearer " + StpUtil.getTokenValue());
put("user", jsonObject);
}};
return ResponseEntity.ok(authInfo);
JSONObject result = new JSONObject();
result.put("token", StpUtil.getTokenValue());
result.put("roles", permissionList);
result.put("user", user);
return new ResponseEntity<>(TableDataInfo.buildJson(result), HttpStatus.OK);
}
@PostMapping(value = "/authority")

View File

@@ -1,8 +1,12 @@
package org.nl.wms.basedata.material.service.dao.mapper;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.nl.wms.basedata.material.service.dao.MdMeMaterialbase;
import java.util.List;
/**
* <p>
* 物料基本信息表 Mapper 接口
@@ -13,4 +17,5 @@ import org.nl.wms.basedata.material.service.dao.MdMeMaterialbase;
*/
public interface MdMeMaterialbaseMapper extends BaseMapper<MdMeMaterialbase> {
List<JSONObject> queryMaterials(@Param("param") JSONObject whereJson);
}

View File

@@ -2,4 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.wms.basedata.material.service.dao.mapper.MdMeMaterialbaseMapper">
<select id="queryMaterials" resultType="com.alibaba.fastjson.JSONObject">
</select>
</mapper>

View File

@@ -18,6 +18,11 @@ public class MaterialQuery extends BaseQuery<MdMeMaterialbase> {
* 物料编码名称
*/
private String search;
/**
* 物料编码名称
*/
private String blurry;
/**
* 物料类型
*/

View File

@@ -146,7 +146,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
AbstractTask abstractTask = taskFactory.getTask(processingClass);
// 更新任务
try {
abstractTask.updateTaskStatus(taskInfo, status);
abstractTask.updateTaskStatus(taskInfo.getString("task_code"), status);
} catch (Exception e) {
log.error("任务状态更新失败: {}", message);
return BaseResponse.responseError(requestNo, "任务:[" + taskInfo.getString("task_code") + "]状态更新失败," + message);

View File

@@ -0,0 +1,135 @@
package org.nl.wms.pda.task.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.logging.annotation.Log;
import org.nl.wms.pda.task.service.PdaTaskService;
import org.nl.wms.pda.task.service.dao.vo.PdaResponseVo;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/hand")
@Slf4j
@SaIgnore
public class PdaTaskController {
private final PdaTaskService pdaTaskService;
@PostMapping("/getRegionByPoint")
@Log("根据点位获取区域")
public ResponseEntity<Object> getRegionByPoint(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.getRegionByPoint(whereJson), HttpStatus.OK);
}
@PostMapping("/getPointnByRegion")
@Log("根据区域获取点位")
public ResponseEntity<Object> getPointnByRegion(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.getPointnByRegion(whereJson), HttpStatus.OK);
}
@PostMapping("/selectMaterials")
@Log("查询物料信息")
public ResponseEntity<Object> selectMaterials(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.selectMaterials(whereJson), HttpStatus.OK);
}
@PostMapping("/getRegions")
@Log("获取所有区域")
public ResponseEntity<Object> getRegions() {
return new ResponseEntity<>(pdaTaskService.getRegions(), HttpStatus.OK);
}
@PostMapping("/getPointInfo")
@Log("获取点位信息")
public ResponseEntity<Object> getPointInfo(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.getPointInfo(whereJson), HttpStatus.OK);
}
@PostMapping("/getMaterialInfoByPoint")
@Log("根据点位获取物料信息")
public ResponseEntity<Object> getMaterialInfoByPoint(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.getMaterialInfoByPoint(whereJson), HttpStatus.OK);
}
@PostMapping("/loading")
@Log("产线上料")
public ResponseEntity<PdaResponseVo> loading(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.loading(whereJson), HttpStatus.OK);
}
@PostMapping("/blanking")
@Log("产线下料")
public ResponseEntity<PdaResponseVo> blanking(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.blanking(whereJson), HttpStatus.OK);
}
@PostMapping("/materialBinding")
@Log("人工放货-物料绑定")
public ResponseEntity<Object> materialBinding(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.materialBinding(whereJson), HttpStatus.OK);
}
@PostMapping("/vehicleBinding")
@Log("人工放货-空载具绑定")
public ResponseEntity<Object> vehicleBinding(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.vehicleBinding(whereJson), HttpStatus.OK);
}
@PostMapping("/comfirmGetting")
@Log("确认取货")
public ResponseEntity<PdaResponseVo> comfirmGetting(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.comfirmGetting(whereJson), HttpStatus.OK);
}
@PostMapping("/lock")
@Log("锁定")
public ResponseEntity<PdaResponseVo> lock(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.lock(whereJson), HttpStatus.OK);
}
@PostMapping("/unlock")
@Log("解锁")
public ResponseEntity<PdaResponseVo> unlock(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.unlock(whereJson), HttpStatus.OK);
}
@PostMapping("/sendPointTask")
@Log("下发定点任务")
public ResponseEntity<Object> sendPointTask(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.sendPointTask(whereJson), HttpStatus.OK);
}
@PostMapping("/queryTask")
@Log("查询未完成的任务")
@SaIgnore
public ResponseEntity<Object> queryTask(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.queryTask(whereJson), HttpStatus.OK);
}
@PostMapping("/againTask")
@Log("重新下发")
@SaIgnore
public ResponseEntity<Object> againTask(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.againTask(whereJson), HttpStatus.OK);
}
@PostMapping("/forceConfirm")
@Log("强制确认")
@SaIgnore
public ResponseEntity<Object> forceConfirm(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaTaskService.forceConfirm(whereJson), HttpStatus.OK);
}
}

View File

@@ -0,0 +1,51 @@
package org.nl.wms.pda.task.service;
import com.alibaba.fastjson.JSONObject;
import org.nl.common.base.TableDataInfo;
import org.nl.wms.basedata.material.service.dao.MdMeMaterialbase;
import org.nl.wms.pda.task.service.dao.dto.MoveDto;
import org.nl.wms.pda.task.service.dao.vo.PdaResponseVo;
import org.nl.wms.sch.region.service.dao.SchBaseRegion;
import java.util.List;
public interface PdaTaskService {
/**
* 产线叫料
* @param whereJson
* @return
*/
PdaResponseVo loading(JSONObject whereJson);
JSONObject getRegionByPoint(JSONObject whereJson);
PdaResponseVo blanking(JSONObject whereJson);
JSONObject getRegions();
JSONObject getPointnByRegion(JSONObject whereJson);
JSONObject selectMaterials(JSONObject whereJson);
JSONObject getMaterialInfoByPoint(JSONObject whereJson);
PdaResponseVo forceConfirm(JSONObject whereJson);
PdaResponseVo againTask(JSONObject whereJson);
JSONObject queryTask(JSONObject whereJson);
PdaResponseVo sendPointTask(JSONObject whereJson);
PdaResponseVo unlock(JSONObject whereJson);
PdaResponseVo lock(JSONObject whereJson);
PdaResponseVo comfirmGetting(JSONObject whereJson);
JSONObject vehicleBinding(JSONObject whereJson);
JSONObject materialBinding(JSONObject whereJson);
List<JSONObject> getPointInfo(JSONObject whereJson);
}

View File

@@ -0,0 +1,22 @@
package org.nl.wms.pda.task.service.dao.dto;
import lombok.Data;
@Data
public class MoveDto {
private String point_code;
/**
* 点位
*/
private String region;
/**
* 区域
*/
private String material_code;
/**
* 托盘数
*/
private String num;
}

View File

@@ -0,0 +1,9 @@
package org.nl.wms.pda.task.service.dao.mapper;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import java.util.List;
public interface PdaMapper {
List<SchBasePoint> getPointsByRegion(String region);
}

View File

@@ -0,0 +1,18 @@
package org.nl.wms.pda.task.service.dao.vo;
import lombok.Data;
@Data
public class PdaResponseVo {
/**
* 先提供一个message
*/
private String message;
public static PdaResponseVo pdaResultOk(String message) {
PdaResponseVo vo = new PdaResponseVo();
vo.setMessage(message);
return vo;
}
}

View File

@@ -0,0 +1,434 @@
package org.nl.wms.pda.task.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpStatus;
import com.alibaba.fastjson.JSONArray;
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.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.base.TableDataInfo;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.basedata.material.service.IMdMeMaterialbaseService;
import org.nl.wms.basedata.material.service.dao.MdMeMaterialbase;
import org.nl.wms.basedata.material.service.dao.mapper.MdMeMaterialbaseMapper;
import org.nl.wms.basedata.material.service.dto.MaterialQuery;
import org.nl.wms.pda.task.service.PdaTaskService;
import org.nl.wms.pda.task.service.dao.dto.MoveDto;
import org.nl.wms.pda.task.service.dao.mapper.PdaMapper;
import org.nl.wms.pda.task.service.dao.vo.PdaResponseVo;
import org.nl.wms.pda.util.PdaResponse;
import org.nl.wms.sch.group.service.dao.GroupPlate;
import org.nl.wms.sch.group.service.dao.mapper.MdPbGroupplateMapper;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.point.service.dao.mapper.SchBasePointMapper;
import org.nl.wms.sch.region.service.dao.SchBaseRegion;
import org.nl.wms.sch.region.service.dao.mapper.SchBaseRegionMapper;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task.service.dao.mapper.SchBaseTaskMapper;
import org.nl.wms.sch.task_manage.GeneralDefinition;
import org.nl.wms.sch.tasks.PdaPointTask;
import org.nl.wms.sch.tasks.netsl.NETSLTask;
import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
@Service
@RequiredArgsConstructor
@Slf4j
public class PdaTaskServiceImpl implements PdaTaskService {
@Autowired
private SchBasePointMapper pointMapper;
@Autowired
private PdaMapper pdaMapper;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private SchBaseRegionMapper regionMapper;
@Autowired
private MdMeMaterialbaseMapper mdMeMaterialbaseMapper;
@Autowired
private PdaPointTask pdaPointTask;
@Autowired
private MdPbGroupplateMapper groupplateMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public PdaResponseVo loading(JSONObject whereJson) {
String point_code = whereJson.getString("point_code");
String region_code = whereJson.getString("region_code");
String material_code = whereJson.getString("material_code");
String num = whereJson.getString("num");
if (ObjectUtil.isEmpty(region_code)) {
throw new BadRequestException("区域不能为空");
}
if (ObjectUtil.isEmpty(material_code)) {
throw new BadRequestException("物料编码不能为空");
}
if (ObjectUtil.isEmpty(num)) {
throw new BadRequestException("托盘数不能为空");
}
int num1 = Integer.parseInt(num);
if ("N1".equals(region_code) || "N3".equals(region_code)) {
if (num1 > 2) {
throw new BadRequestException("N1、N3区域托盘数不能大于2");
}
//找终点 查询该区域所有空闲点位
List<SchBasePoint> points = pointMapper.selectListByRegion(region_code);
if (points.size() == 0) {
throw new BadRequestException(region_code + "区域无空闲点位");
}
//根据托盘数
for (int i = 0; i < num1; i++) {
SchBasePoint point = points.get(i);
JSONObject param = new JSONObject();
param.put("device_code", point.getPoint_code());
param.put("material_code", material_code);
param.put("requestNo", IdUtil.simpleUUID());
param.put("material_code", material_code);
param.put("config_code", "NETSLTask");
param.put("vehicle_qty", "1");
param.put("user_id", "1");
taskService.apply(param);
}
} else if ("L1".equals(region_code) || "L2".equals(region_code)) {
SchBasePoint schBasePoint = pointMapper.selectOne(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_code, point_code));
for (int i = 0; i < num1; i++) {
//确定终点
SchBasePoint point = checkNextPoint(schBasePoint, region_code);
JSONObject param = new JSONObject();
param.put("device_code", point.getPoint_code());
param.put("requestNo", IdUtil.simpleUUID());
param.put("material_code", material_code);
param.put("config_code", "THSLTask");
param.put("vehicle_qty", "1");
param.put("user_id", "1");
taskService.apply(param);
}
} else {
throw new BadRequestException("当前区域" + region_code + "错误!");
}
return PdaResponseVo.pdaResultOk("任务创建成功");
}
private SchBasePoint checkNextPoint(SchBasePoint schBasePoint, String region_code) {
//如果是MB物料的上料点 需要下发二次分配点位
if ("MB".equals(schBasePoint.getPoint_code())) {
if ("L1".equals(region_code)) {
return getWaitPoint(region_code);
} else {
return getWaitPoint(region_code);
}
} else {
//查找该区域空闲的点位
List<SchBasePoint> list = pointMapper.selectList(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getRegion_code, region_code)
.eq(SchBasePoint::getPoint_type, "1")
.eq(SchBasePoint::getIs_used, "1")
.eq(SchBasePoint::getLock_type, "0")
.isNull(SchBasePoint::getIng_task_code)
.orderByAsc(SchBasePoint::getIn_order_seq));
if (list.size() == 0) {
throw new BadRequestException(region_code + "区域无空闲点位");
}
return list.get(0);
}
}
private SchBasePoint getWaitPoint(String region_code) {
//查找该区域空闲的等待点
SchBasePoint point = pointMapper.selectOne(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getRegion_code, region_code)
.eq(SchBasePoint::getPoint_status, "0")
.eq(SchBasePoint::getIs_used, "1")
.eq(SchBasePoint::getLock_type, "0")
.eq(SchBasePoint::getPoint_type, "4")
.isNull(SchBasePoint::getIng_task_code));
if (ObjectUtil.isEmpty(point)) {
if ("L1".equals(region_code)) {
throw new BadRequestException("L1区域无空闲的等待点位");
} else {
throw new BadRequestException("L2区域无空闲的等待点位");
}
}
return point;
}
@Override
public JSONObject getRegionByPoint(JSONObject whereJson) {
String point_code = whereJson.getString("point_code");
if (ObjectUtil.isEmpty(point_code)) {
throw new BadRequestException("点位不能为空");
}
SchBasePoint point = pointMapper.selectOne(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_code, point_code));
if (ObjectUtil.isEmpty(point)) {
throw new BadRequestException("点位" + point_code + "不存在!");
}
String region_code = point.getRegion_code();
String region_name = point.getRegion_name();
JSONObject jo = new JSONObject();
jo.put("region_code", region_code);
jo.put("region_name", region_name);
return jo;
}
@Override
public PdaResponseVo blanking(JSONObject whereJson) {
String point_code = whereJson.getString("point_code");
String region_code = whereJson.getString("region_code");
JSONArray data = whereJson.getJSONArray("data");
if (ObjectUtil.isEmpty(point_code)) {
throw new BadRequestException("点位不能为空");
}
if (ObjectUtil.isEmpty(region_code)) {
throw new BadRequestException("区域不能为空");
}
if (ObjectUtil.isEmpty(data)) {
throw new BadRequestException("物料信息不能为空");
}
SchBasePoint point = pointMapper.selectOne(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_code, point_code));
if (ObjectUtil.isEmpty(point)) {
throw new BadRequestException("点位" + point_code + "不存在!");
}
JSONObject jo = data.getJSONObject(0);
String material_name = jo.getString("material_name");
MdMeMaterialbase mdMeMaterialbase = mdMeMaterialbaseMapper.selectOne(new LambdaQueryWrapper<MdMeMaterialbase>().eq(MdMeMaterialbase::getMaterial_name, material_name));
if (mdMeMaterialbase == null) {
throw new BadRequestException("当前物料不存在【"+material_name+"");
}
String vehicleCode = "TP" + TaskUtils.getDateTime("yyMMddHHmmss") + CodeUtil.getNewCode("VEHICLE_CODE");
JSONObject param = new JSONObject();
param.put("device_code", point.getPoint_code());
param.put("material_code", mdMeMaterialbase.getMaterial_code());
param.put("requestNo", IdUtil.simpleUUID());
if ("N1".equals(point.getRegion_code())||"N2".equals(point.getRegion_code())) {
param.put("config_code", "NETXLTask");
} else if ("L1".equals(point.getRegion_code())||"L2".equals(point.getRegion_code())){
param.put("config_code", "THXLTask");
}
param.put("vehicle_code", vehicleCode);
param.put("vehicle_qty", "1");
param.put("user_id", "1");
taskService.apply(param);
//维护物料信息
packageData(data,point_code);
return PdaResponseVo.pdaResultOk("任务创建成功");
}
private void packageData(JSONArray data,String point_code) {
JSONObject jo = data.getJSONObject(0);
String material_name = jo.getString("material_name");
MdMeMaterialbase mdMeMaterialbase = mdMeMaterialbaseMapper.selectOne(new LambdaQueryWrapper<MdMeMaterialbase>().eq(MdMeMaterialbase::getMaterial_name, material_name));
if (mdMeMaterialbase == null) {
throw new BadRequestException("当前物料不存在【"+material_name+"");
}
String pscn = jo.getString("pscn");
String measure_unit_id = jo.getString("measure_unit_id");
List<String> list = new ArrayList<>();
for (int i = 0; i < data.size(); i++) {
JSONObject jsonObject = data.getJSONObject(i);
String container_code = jsonObject.getString("container_code");
list.add(container_code);
}
String ext_code = String.join(",", list);
String vehicleCode = "TP" + TaskUtils.getDateTime("yyMMddHHmmss") + CodeUtil.getNewCode("VEHICLE_CODE");
GroupPlate.GroupPlateBuilder groupPlateBuilder = GroupPlate.builder()
.group_id(org.nl.common.utils.IdUtil.getStringId())
.material_code(mdMeMaterialbase.getMaterial_code())
.pcsn(pscn)
.measure_unit_id(measure_unit_id)
.storagevehicle_code(vehicleCode)
.ext_code(ext_code)
.create_id(SecurityUtils.getCurrentUserId())
.create_name(SecurityUtils.getCurrentNickName())
.create_time(DateUtil.now());
groupplateMapper.insert(groupPlateBuilder.build());
SchBasePoint point = pointMapper.selectOne(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_code, point_code));
point.setStoragevehicle_code(vehicleCode);
point.setMaterial_code(mdMeMaterialbase.getMaterial_code());
point.setPoint_status("2");
pointMapper.updateById(point);
}
@Override
public JSONObject getRegions() {
List<SchBaseRegion> list = regionMapper.selectList(new LambdaQueryWrapper<SchBaseRegion>());
List<JSONObject> ja = new ArrayList<>();
list.forEach(region -> {
JSONObject jo = new JSONObject();
jo.put("region_code", region.getRegion_code());
jo.put("region_name", region.getRegion_name());
ja.add(jo);
});
JSONObject ret = new JSONObject();
if (ObjectUtil.isNotEmpty(list)) {
ret.put("code", String.valueOf(HttpStatus.HTTP_OK));
ret.put("message", "查询成功");
ret.put("data", ja);
return ret;
}
return ret;
}
@Override
public JSONObject getPointnByRegion(JSONObject whereJson) {
return null;
}
// @Override
// public TableDataInfo<MdMeMaterialbase> selectMaterials(JSONObject whereJson) {
// PageQuery pageQuery = new PageQuery();
// pageQuery.setPage(whereJson.getInteger("page") - 1);
// pageQuery.setSize(whereJson.getInteger("size"));
// MaterialQuery materialQuery = new MaterialQuery();
// if (StringUtils.isNotBlank(whereJson.getString("blurry"))) {
// materialQuery.setSearch(whereJson.getString("blurry").trim().toUpperCase());
// }
// Page mapPage = iMdMeMaterialbaseService.pageMaps(pageQuery.build(), materialQuery.build());
// return PdaResponse.build(mapPage);
// }
@Override
public JSONObject selectMaterials(JSONObject whereJson) {
List<MdMeMaterialbase> list = mdMeMaterialbaseMapper.selectList(
new LambdaQueryWrapper<MdMeMaterialbase>().eq(ObjectUtil.isNotEmpty(whereJson.getString("blurry")), MdMeMaterialbase::getMaterial_id, whereJson.getString("blurry"))
.or()
.eq(ObjectUtil.isNotEmpty(whereJson.getString("blurry")), MdMeMaterialbase::getMaterial_code, whereJson.getString("blurry"))
);
JSONObject ret = new JSONObject();
if (ObjectUtil.isNotEmpty(list)) {
ret.put("code", String.valueOf(HttpStatus.HTTP_OK));
ret.put("message", "查询成功");
ret.put("data", list);
return ret;
}
return ret;
}
@Override
public JSONObject getMaterialInfoByPoint(JSONObject whereJson) {
return null;
}
@Override
public PdaResponseVo forceConfirm(JSONObject whereJson) {
return null;
}
@Override
public PdaResponseVo againTask(JSONObject whereJson) {
return null;
}
@Override
public JSONObject queryTask(JSONObject whereJson) {
return null;
}
@Override
public PdaResponseVo sendPointTask(JSONObject whereJson) {
// 校验数据
checkPoint(whereJson);
// 创建任务
JSONObject task = new JSONObject();
task.put("config_code", "PointTask");
task.put("point_code1", whereJson.getString("start_point_code"));
task.put("point_code2", whereJson.getString("end_point_code"));
task.put("Priority", "1");
pdaPointTask.apply(task);
return PdaResponseVo.pdaResultOk("下发成功!");
}
@Override
public PdaResponseVo unlock(JSONObject whereJson) {
return null;
}
@Override
public PdaResponseVo lock(JSONObject whereJson) {
return null;
}
@Override
public PdaResponseVo comfirmGetting(JSONObject whereJson) {
String point_code = whereJson.getString("point_code");
return PdaResponseVo.pdaResultOk("取货完成");
}
@Override
public JSONObject vehicleBinding(JSONObject whereJson) {
String point_code = whereJson.getString("point_code");
SchBasePoint point = pointMapper.selectOne(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_code, point_code));
point.setPoint_status("1");
pointMapper.updateById(point);
JSONObject ret = new JSONObject();
ret.put("status", String.valueOf(HttpStatus.HTTP_OK));
ret.put("message","托盘绑定成功");
return ret;
}
@Override
public JSONObject materialBinding(JSONObject whereJson) {
String point_code = whereJson.getString("point_code");
JSONArray data = whereJson.getJSONArray("data");
if (ObjectUtil.isEmpty(point_code)){
throw new BadRequestException("点位不能为空");
}
if (ObjectUtil.isEmpty(data)){
throw new BadRequestException("物料数据不能为空");
}
packageData(data,point_code);
JSONObject ret = new JSONObject();
ret.put("status", String.valueOf(HttpStatus.HTTP_OK));
ret.put("message","物料绑定成功");
return ret;
}
@Override
public List<JSONObject> getPointInfo(JSONObject whereJson) {
List<JSONObject> list = pointMapper.queryPointInfo(whereJson);
return list;
}
/**
* 校验起点终点载具
* @param whereJson {
* start_point_code起点点位
* end_point_code终点点位
* storagevehicle_code终点点位
* }
*/
private void checkPoint(JSONObject whereJson) {
String start_point_code = whereJson.getString("start_point_code");
String end_point_code = whereJson.getString("end_point_code");
// 校验起点
SchBasePoint pointStartDao = pointMapper.selectOne(new LambdaQueryWrapper<SchBasePoint>()
.eq(SchBasePoint::getPoint_code, start_point_code));
pointStartDao.setPoint_status("2");
pointMapper.updateById(pointStartDao);
// 校验终点
SchBasePoint pointNextDao = pointMapper.selectOne(new LambdaQueryWrapper<SchBasePoint>()
.eq(SchBasePoint::getPoint_code, end_point_code));
pointNextDao.setPoint_status("1");
pointMapper.updateById(pointStartDao);
}
}

View File

@@ -0,0 +1,52 @@
package org.nl.wms.pda.util;
import cn.hutool.http.HttpStatus;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.Builder;
import lombok.Data;
import org.nl.common.base.TableDataInfo;
@Data
@Builder
public class PdaResponse<T> {
/**
* 信息
*/
private String message;
/**
* 返回数据
*/
private T data;
/**
* 不带数据反馈
* @return ErpResponse
*/
public static PdaResponse requestOk() {
return PdaResponse.builder()
.message("操作成功!")
.build();
}
/**
* 带数据反馈
* @return ErpResponse
*/
public static <T> PdaResponse requestParamOk(T data) {
return PdaResponse.builder()
.message("操作成功!")
.data(data)
.build();
}
public static <T> TableDataInfo<T> build(IPage<T> page) {
TableDataInfo<T> rspData = new TableDataInfo<>();
rspData.setCode(String.valueOf(HttpStatus.HTTP_OK));
rspData.setMsg("查询成功");
rspData.setContent(page.getRecords());
rspData.setTotalElements(page.getTotal());
return rspData;
}
}

View File

@@ -47,7 +47,7 @@ public class SchBasePointController {
@Log("修改点位管理")
public ResponseEntity<Object> update(@Validated @RequestBody SchBasePoint entity){
schBasePointService.update(entity);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
return new ResponseEntity<>(HttpStatus.OK);
}
@Log("删除点位管理")

View File

@@ -77,4 +77,6 @@ public interface ISchBasePointService extends IService<SchBasePoint> {
* 区域点位库存查看
* */
TableDataInfo<RegionStructIvtVo> queryStruct(RegionStructQuery query, PageQuery pageQuery);
SchBasePoint findByCode(String point_code);
}

View File

@@ -120,6 +120,8 @@ public class SchBasePoint implements Serializable {
private String update_id;
private String material_code;
private String update_name;
@@ -128,6 +130,8 @@ public class SchBasePoint implements Serializable {
private String source_id;
/** 位置 */
private String point_location;
/** 锁定类型 */
private String lock_type;
@TableField(exist = false)
@@ -145,6 +149,7 @@ public class SchBasePoint implements Serializable {
@TableField(exist = false)
private String group_id;
@TableField(exist = false)
private String device_code;
}

View File

@@ -1,5 +1,6 @@
package org.nl.wms.sch.point.service.dao.mapper;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
@@ -34,4 +35,8 @@ public interface SchBasePointMapper extends BaseMapper<SchBasePoint> {
IPage<SchBasePoint> selectPageLeftJoin(IPage<SchBasePoint> pages, SchBasePointQuery whereJson);
List<RegionStructIvtVo> queryStruct(@Param("query") RegionStructQuery query);
List<SchBasePoint> selectListByRegion(String region);
List<JSONObject> queryPointInfo(@Param("param") JSONObject whereJson);
}

View File

@@ -15,49 +15,40 @@
<select id="selectPageLeftJoin" resultType="org.nl.wms.sch.point.service.dao.SchBasePoint"
parameterType="org.nl.wms.sch.point.service.dto.SchBasePointQuery">
SELECT
p.*,
IF(LENGTH(vg.material_qty)>0,vg.material_qty,0) AS material_qty,
IF(LENGTH(mm.material_code)>0,mm.material_code,'-') AS material_code,
IF(LENGTH(mm.material_name)>0,mm.material_name,'-') AS material_name,
IF(LENGTH(mm.material_spec)>0,mm.material_spec,'-') AS material_spec,
IF(LENGTH(mm.material_model)>0,mm.material_model,'-') AS material_model,
IF(LENGTH(mm.raw_material_code)>0,mm.raw_material_code,'-') AS raw_material_code
*
FROM
`sch_base_point` p
LEFT JOIN sch_base_vehiclematerialgroup vg ON vg.vehicle_code = p.vehicle_code
AND vg.vehicle_type = p.vehicle_type AND vg.group_bind_material_status = '2'
LEFT JOIN md_base_material mm ON mm.material_id = vg.material_id
`sch_base_point`
<where>
<if test="whereJson.workshop_code != null and whereJson.workshop_code != ''">
p.workshop_code = #{whereJson.workshop_code}
workshop_code = #{whereJson.workshop_code}
</if>
<if test="whereJson.blurry != null">
AND (p.point_code LIKE '%${whereJson.blurry}%' OR p.point_name LIKE '%${whereJson.blurry}%')
AND (point_code LIKE '%${whereJson.blurry}%' OR point_name LIKE '%${whereJson.blurry}%')
</if>
<if test="whereJson.region_code != null">
AND p.region_code = #{whereJson.region_code}
AND region_code = #{whereJson.region_code}
</if>
<if test="whereJson.point_type != null">
AND p.point_type = #{whereJson.point_type}
AND point_type = #{whereJson.point_type}
</if>
<if test="whereJson.point_status != null">
AND p.point_status = #{whereJson.point_status}
AND point_status = #{whereJson.point_status}
</if>
<if test="whereJson.is_used != null">
AND p.is_used = #{whereJson.is_used}
AND is_used = #{whereJson.is_used}
</if>
<choose>
<!-- Case: whereJson.lock_type is true -->
<when test="whereJson.lock_type">
AND (p.ing_task_code IS NOT NULL AND p.ing_task_code <![CDATA[<>]]> '')
AND (ing_task_code IS NOT NULL AND ing_task_code <![CDATA[<>]]> '')
</when>
<!-- Case: whereJson.lock_type is false -->
<otherwise>
AND (p.ing_task_code IS NULL OR p.ing_task_code = '')
AND (ing_task_code IS NULL OR ing_task_code = '')
</otherwise>
</choose>
</where>
ORDER BY p.region_code, p.point_code, p.point_type
ORDER BY region_code, point_code, point_type
</select>
<select id="queryStruct" resultType="org.nl.wms.pdm.structivt.service.dto.RegionStructIvtVo">
select sch_base_point.point_code,
@@ -91,4 +82,50 @@
</if>
</select>
<select id="selectListByRegion" resultType="org.nl.wms.sch.point.service.dao.SchBasePoint"
parameterType="java.lang.String">
SELECT
*
FROM
`sch_base_point` p
WHERE
region_code = #{region_code}
AND 0 = (
SELECT COUNT(*)
FROM sch_base_task
WHERE (point_code1 = p.point_code
OR point_code2 = p.point_code)
AND task_status <![CDATA[<]]> '5'
AND is_delete = '0'
)
AND point_type = '1'
AND is_used = 1
</select>
<select id="queryPointInfo" resultType="com.alibaba.fastjson.JSONObject"
parameterType="com.alibaba.fastjson.JSONObject">
SELECT
plate.group_id,
plate.storagevehicle_code,
plate.qty_unit_name AS unit_code,
plate.qty,
plate.frozen_qty,
mater.material_code,
mater.material_name
FROM
md_pb_groupplate plate
LEFT JOIN md_me_materialbase mater ON mater.material_id = plate.material_id
LEFT JOIN st_ivt_structattr struct ON struct.storagevehicle_code = plate.storagevehicle_code
WHERE
1 =1
and plate.status='02'
and plate.qty > 0
<if test="param.struct_code != null and param.struct_code != ''">
AND
struct.struct_code = #{param.struct_code}
</if>
<if test="param.vehicle_code != null and param.vehicle_code != ''">
AND
plate.storagevehicle_code = #{param.vehicle_code}
</if>
</select>
</mapper>

View File

@@ -42,7 +42,7 @@ public class SchBasePointDto implements Serializable {
private String vehicle_type;
/** 载具编码 */
private String vehicle_code;
private String storagevehicle_code;
/** 载具数量 */
private Integer vehicle_qty;
@@ -112,4 +112,14 @@ public class SchBasePointDto implements Serializable {
/** 修改时间 */
private String update_time;
private String material_code;
private String source_id;
/** 位置 */
private String point_location;
/** 锁定类型 */
private String lock_type;
private String pcsn;
}

View File

@@ -57,26 +57,26 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
IPage<SchBasePoint> pages = new Page<>(page.getPage() + 1, page.getSize());
pages = pointMapper.selectPageLeftJoin(pages, whereJson);
// 可以存放的载具类型
pages.getRecords().forEach(point -> {
if (ObjectUtil.isNotEmpty(point.getCan_vehicle_type())) {
point.setCan_vehicle_types(Arrays.asList(point.getCan_vehicle_type().split(",")));
}
String pointStatus = point.getPoint_status(); // 点位状态
String pointType = point.getPoint_type(); // 点位类型
SchBaseRegion regionObj = regionMapper.selectById(point.getRegion_code());
if (ObjectUtil.isNotEmpty(regionObj)) {
if (ObjectUtil.isNotEmpty(pointStatus) && ObjectUtil.isNotEmpty(regionObj.getPoint_status_explain())) {
// 设置
point.setPoint_status_name(PointUtils.getStatusOrTypeName(
regionObj.getPoint_status_explain(), pointStatus));
}
if (ObjectUtil.isNotEmpty(pointType) && ObjectUtil.isNotEmpty(regionObj.getPoint_type_explain())) {
// 设置
point.setPoint_type_name(PointUtils.getStatusOrTypeName(
regionObj.getPoint_type_explain(), pointType));
}
}
});
// pages.getRecords().forEach(point -> {
// if (ObjectUtil.isNotEmpty(point.getCan_vehicle_type())) {
// point.setCan_vehicle_types(Arrays.asList(point.getCan_vehicle_type().split(",")));
// }
// String pointStatus = point.getPoint_status(); // 点位状态
// String pointType = point.getPoint_type(); // 点位类型
// SchBaseRegion regionObj = regionMapper.selectById(point.getRegion_code());
// if (ObjectUtil.isNotEmpty(regionObj)) {
// if (ObjectUtil.isNotEmpty(pointStatus) && ObjectUtil.isNotEmpty(regionObj.getPoint_status_explain())) {
// // 设置
// point.setPoint_status_name(PointUtils.getStatusOrTypeName(
// regionObj.getPoint_status_explain(), pointStatus));
// }
// if (ObjectUtil.isNotEmpty(pointType) && ObjectUtil.isNotEmpty(regionObj.getPoint_type_explain())) {
// // 设置
// point.setPoint_type_name(PointUtils.getStatusOrTypeName(
// regionObj.getPoint_type_explain(), pointType));
// }
// }
// });
return pages;
}
@@ -198,4 +198,10 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
build.setTotalElements(page.getTotal());
return build;
}
@Override
public SchBasePoint findByCode(String point_code) {
SchBasePoint point = pointMapper.selectOne(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_code, point_code));
return point;
}
}

View File

@@ -48,7 +48,7 @@ public class SchBaseRegionController {
public ResponseEntity<Object> update(@Validated @RequestBody SchBaseRegion entity){
regionService.update(entity);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
return new ResponseEntity<>(HttpStatus.OK);
}
@Log("删除区域管理")

View File

@@ -29,9 +29,6 @@ public class SchBaseTask implements Serializable {
/** 任务编码 */
private String task_code;
/** 任务类型 */
private String task_type;
/** 任务状态 */
private String task_status;
@@ -96,7 +93,11 @@ public class SchBaseTask implements Serializable {
/** 更新时间 */
private String update_time;
@TableField(exist = false)
private String task_type;
/** 配置表 -> 优先级 (默认会将配置表设置进来,如果需要自行更改则可在业务中设置) */
@TableField(exist = false)
private String priority;
/** 配置表 -> acs任务类型 */

View File

@@ -57,6 +57,17 @@ public class SchBaseTaskconfigServiceImpl extends ServiceImpl<SchBaseTaskconfigM
if (classstandard == null) {
throw new BadRequestException(LangProcess.msg("error_isNull", entity.getTask_type()));
}
if (ObjectUtil.isNotEmpty(entity.getStart_region_strs())) {
// 起点区域配置
String startRegion = String.join(",", entity.getStart_region_strs());
entity.setStart_region_str(startRegion);
}
if (ObjectUtil.isNotEmpty(entity.getNext_region_strs())) {
// 终点区域配置
String nextRegion = String.join(",", entity.getNext_region_strs());
entity.setNext_region_str(nextRegion);
}
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
@@ -83,6 +94,17 @@ public class SchBaseTaskconfigServiceImpl extends ServiceImpl<SchBaseTaskconfigM
if (classstandard == null) {
throw new BadRequestException(LangProcess.msg("error_isNull", entity.getTask_type()));
}
if (ObjectUtil.isNotEmpty(entity.getStart_region_strs())) {
// 起点区域配置
String startRegion = String.join(",", entity.getStart_region_strs());
entity.setStart_region_str(startRegion);
}
if (ObjectUtil.isNotEmpty(entity.getNext_region_strs())) {
// 终点区域配置
String nextRegion = String.join(",", entity.getNext_region_strs());
entity.setNext_region_str(nextRegion);
}
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();

View File

@@ -175,11 +175,11 @@ AbstractTask {
/**
* 更新任务状态,暴露给外围使用
* @param taskObj 任务信息
* @param taskCode 任务信息
* @param status 状态
*/
public void updateTaskStatus(JSONObject taskObj, TaskStatus status) {
this.updateStatus(taskObj, status);
public void updateTaskStatus(String taskCode, TaskStatus status) {
this.updateStatus(taskCode, status);
}
@@ -194,10 +194,10 @@ AbstractTask {
* 修改状态
* 以下改为public会出现自动注入类出现问题
*
* @param taskObj 任务信息
* @param task_code 任务信息
* @param status 状态
*/
public abstract void updateStatus(JSONObject taskObj, TaskStatus status);
public abstract void updateStatus(String task_code,TaskStatus status);
/**
@@ -265,29 +265,31 @@ AbstractTask {
String applyPointCode = param.getString("device_code");
String requestNo = param.getString("requestNo");
String configCode = param.getString("config_code");
String material_code = param.getString("material_code");
String isFlag = ObjectUtil.isNotEmpty(param.getString("sss")) ? param.getString("sss") : "0";
// 1、校验数据
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>()
.eq(SchBaseTaskconfig::getConfig_code, configCode));
Assert.notNull(taskConfig, LangProcess.msg("common_configTip", configCode));
// Assert.notNull(taskConfig, LangProcess.msg("common_configTip", configCode));
// 最大任务数
Integer tcmn = taskConfig.getTask_create_max_num();
// 获取执行中的任务(由配置文件设置,一般是最大值)
List<SchBaseTask> unFinishTasksByTaskConfig = taskService.findUnFinishTasksByTaskConfig(
taskConfig.getConfig_code(), taskConfig.getTask_direction());
Assert.isFalse(unFinishTasksByTaskConfig.size() >= tcmn, LangProcess.msg("common_maxTaskTip", applyPointCode));
// List<SchBaseTask> unFinishTasksByTaskConfig = taskService.findUnFinishTasksByTaskConfig(
// taskConfig.getConfig_code(), taskConfig.getTask_direction());
// Assert.isFalse(unFinishTasksByTaskConfig.size() >= tcmn, LangProcess.msg("common_maxTaskTip", applyPointCode));
// 校验同个点位,同种任务是否多次请求创建任务固定只能1个任务
List<SchBaseTask> applyPointTask = taskService.findUnFinishTasksByTaskConfig(
taskConfig.getConfig_code(), applyPointCode, taskConfig.getTask_direction());
if (applyPointTask.size() == 1) {
if (applyPointTask.size() == 1 && "1".equals(isFlag)) {
throw new BadRequestException(LangProcess.msg("common_taskCreatedTip", applyPointCode));
}
String vehicleType = param.getString("vehicle_type");
String vehicleCode = TaskUtils.defaultVehicleCode(param.getString("vehicle_code"));
String vehicleCode = param.getString("vehicle_code");
AbstractTask bean = SpringContextHolder.getBean(this.getClass());
// 2、创建申请任务
@@ -296,10 +298,11 @@ AbstractTask {
task.setConfig_code(configCode);
task.setVehicle_code(vehicleCode);
task.setVehicle_type(vehicleType);
task.setMaterial_code(material_code);
task.setTask_status(TaskStatus.APPLY.getCode());
// 将所有参数存到表中,后续需要可以提取
TaskUtils.setCreateByAcsOrPda(task, param);
setTaskPoint(taskConfig, task, param.getString("device_code"));
// 3、判断是否直接找点下发
// 立即创建吧组盘放到具体位置,免得重复创建
if (taskConfig.getIs_immediate_create()) {
@@ -307,7 +310,7 @@ AbstractTask {
} else {
// 不需要立即创建
// 设置组盘 - 需要的话由子类自行实现
task.setGroup_id(bean.setGroupPlate(param));
task.setGroup_data(bean.setGroupPlate(param));
// 创建一条单点任务。
taskService.save(task);
bean.create();

View File

@@ -15,33 +15,24 @@ import java.util.List;
* @Date: 2023/5/25
*/
@Getter
@AllArgsConstructor
public enum TaskDirectionEnum {
/**
* 送货
* 送货 1 //起点确认
*/
SEND,
SEND("1", "送货"),
/**
* 取货
* 取货 2 //终点确认
*/
CALL,
CALL("1", "取货"),
/**
* 移货
* 移货 3
*/
MOVE;
MOVE("1", "移货");
private String value;
private String label;
static {
SysDictServiceImpl bean = SpringContextHolder.getBean(SysDictServiceImpl.class);
List<Dict> taskDirection = bean.list(new LambdaQueryWrapper<Dict>()
.eq(Dict::getCode, "task_direction")
.orderByAsc(Dict::getDict_sort));
TaskDirectionEnum[] values = TaskDirectionEnum.values();
for (int i = 0; i < values.length; i++) {
values[i].value = taskDirection.get(i).getValue();
values[i].label = taskDirection.get(i).getLabel();
}
}
}

View File

@@ -0,0 +1,203 @@
package org.nl.wms.sch.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.LambdaQueryWrapper;
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.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.system.service.notice.ISysNoticeService;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.ISchBaseTaskconfigService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.GeneralDefinition;
import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum;
import org.nl.wms.sch.task_manage.enums.PointStatusEnum;
import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.task.TaskType;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import org.nl.wms.sch.tasks.netxl.mapper.NETXLMapper;
import org.nl.wms.util.PointUtils;
import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Component(value = "PdaPointTask")
@TaskType("PdaPointTask")
public class PdaPointTask extends AbstractTask {
private static final String TASK_CONFIG_CODE = "NETXLTask";
@Autowired
private ISchBasePointService pointService;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private ISchBaseTaskconfigService taskConfigService;
@Autowired
private ISysNoticeService noticeService;
@Autowired
private org.nl.wms.sch.tasks.netxl.mapper.NETXLMapper NETXLMapper;
@Override
public void create() throws BadRequestException {
// 获取任务
List<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY);
// 配置信息
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>()
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE));
for (SchBaseTask task : tasks) {
TaskUtils.setUpdateByAcs(task);
List<String> startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(","))
.collect(Collectors.toList());
// 找终点
SchBasePoint point = findStartPoint(startRegionStr);
if (ObjectUtil.isEmpty(point)) {
task.setRemark("未找到所需点位!");
taskService.updateById(task);
// 消息通知
noticeService.createNotice(task.getRemark(), TASK_CONFIG_CODE + task.getPoint_code1(),
NoticeTypeEnum.WARN.getCode());
continue;
}
// 设置终点并修改创建成功状态
task.setPoint_code1(point.getPoint_code());
task.setTask_status(TaskStatus.CREATED.getCode());
task.setRemark("");
taskService.updateById(task);
point.setIng_task_code(task.getTask_code());
PointUtils.setUpdateByAcs(point);
pointService.updateById(point);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void createCompletion(SchBaseTask task) {
// 配置信息
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>()
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE));
TaskUtils.setUpdateByAcs(task);
List<String> startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(","))
.collect(Collectors.toList());
// 找起点
SchBasePoint point = findStartPoint(startRegionStr);
if (ObjectUtil.isEmpty(point)) {
// 消息通知
noticeService.createNotice("货架暂无托盘!", TASK_CONFIG_CODE + task.getPoint_code2(),
NoticeTypeEnum.WARN.getCode());
throw new BadRequestException("货架暂无托盘!");
}
// 设置终点并修改创建成功状态
task.setPoint_code1(point.getPoint_code());
task.setRemark("");
task.setTask_status(TaskStatus.CREATED.getCode());
taskService.save(task);
// 点位更新
point.setIng_task_code(task.getTask_code());
PointUtils.setUpdateByAcs(point);
pointService.updateById(point);
}
private SchBasePoint findStartPoint(List<String> startRegionStr) {
// 钢托盘缓存区域的空盘是1 状态不同
List<SchBasePoint> points = NETXLMapper.findPointForNETXL(startRegionStr);
return ObjectUtil.isNotEmpty(points) ? points.get(0) : null;
}
@Override
public 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("执行中");
TaskUtils.setUpdateByAcs(taskObj);
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
}
@Override
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
@Override
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
@Transactional(rollbackFor = Exception.class)
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 获取参数
SchBasePoint startPointObj = pointService.getById(taskObj.getPoint_code1());
SchBasePoint endPointObj = pointService.getById(taskObj.getPoint_code2());
// 起点清空
if (ObjectUtil.isNotEmpty(startPointObj)) {
PointUtils.setUpdateByType(startPointObj, taskFinishedType);
PointUtils.clearPoint(startPointObj);
endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode());
// endPointObj.setVehicle_type(GeneralDefinition.STEEL_TRAY);
// endPointObj.setVehicle_qty(taskObj.getVehicle_qty());
endPointObj.setUpdate_time(DateUtil.now());
PointUtils.setUpdateByType(endPointObj, taskFinishedType);
pointService.updateById(endPointObj);
}
// 任务完成
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setRemark(GeneralDefinition.TASK_FINISH);
// taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
@Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 获取参数
SchBasePoint startPointObj = pointService.getById(taskObj.getPoint_code1());
// 起点解锁
if (ObjectUtil.isNotEmpty(startPointObj)) {
startPointObj.setIng_task_code("");
PointUtils.setUpdateByType(startPointObj, taskFinishedType);
pointService.updateById(startPointObj);
}
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskObj.setRemark(GeneralDefinition.TASK_CANCEL);
// taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
}

View File

@@ -0,0 +1,207 @@
package org.nl.wms.sch.tasks.netsl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.system.service.notice.ISysNoticeService;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.point.service.dto.SchBasePointDto;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.ISchBaseTaskconfigService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.GeneralDefinition;
import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum;
import org.nl.wms.sch.task_manage.enums.PointStatusEnum;
import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.task.TaskType;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import org.nl.wms.sch.tasks.netsl.mapper.NETSLMapper;
import org.nl.wms.util.PointUtils;
import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
// NET加工区上料任务
@Component(value = "NETSLTask")
@TaskType("NETSLTask")
public class NETSLTask extends AbstractTask {
private static final String TASK_CONFIG_CODE = "NETSLTask";
@Autowired
private ISchBasePointService pointService;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private ISchBaseTaskconfigService taskConfigService;
@Autowired
private ISysNoticeService noticeService;
@Autowired
private NETSLMapper netslMapper;
@Override
public void create() throws BadRequestException {
// 获取任务
List<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY);
// 配置信息
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>()
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE));
for (SchBaseTask task : tasks) {
TaskUtils.setUpdateByAcs(task);
List<String> startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(","))
.collect(Collectors.toList());
// 找终点
SchBasePoint point = findStartPoint(startRegionStr,task.getMaterial_code());
if (ObjectUtil.isEmpty(point)) {
task.setRemark("未找到所需点位!");
taskService.updateById(task);
// 消息通知
noticeService.createNotice(task.getRemark(), TASK_CONFIG_CODE + task.getPoint_code1(),
NoticeTypeEnum.WARN.getCode());
continue;
}
// 设置终点并修改创建成功状态
task.setPoint_code1(point.getPoint_code());
task.setVehicle_code(point.getStoragevehicle_code());
task.setTask_status(TaskStatus.CREATED.getCode());
task.setRemark("");
taskService.updateById(task);
point.setIng_task_code(task.getTask_code());
PointUtils.setUpdateByAcs(point);
pointService.updateById(point);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void createCompletion(SchBaseTask task) {
// 配置信息
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>()
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE));
TaskUtils.setUpdateByAcs(task);
List<String> startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(","))
.collect(Collectors.toList());
// 找起点
SchBasePoint point = findStartPoint(startRegionStr,task.getMaterial_code());
if (ObjectUtil.isEmpty(point)) {
// 消息通知
noticeService.createNotice("找不到可用的MB制布区点位", TASK_CONFIG_CODE + task.getPoint_code2(),
NoticeTypeEnum.WARN.getCode());
throw new BadRequestException("找不到可用的MB制布区点位");
}
// 设置终点并修改创建成功状态
task.setPoint_code1(point.getPoint_code());
task.setVehicle_code(point.getStoragevehicle_code());
task.setRemark("");
task.setTask_status(TaskStatus.CREATED.getCode());
taskService.save(task);
// 点位更新
point.setIng_task_code(task.getTask_code());
PointUtils.setUpdateByAcs(point);
pointService.updateById(point);
}
private SchBasePoint findStartPoint(List<String> startRegionStr,String material_code) {
// 查询该物料所存放的位置
List<SchBasePointDto> points = netslMapper.findPointForNETSL(startRegionStr, material_code);
//找到最小PCSN的点位
SchBasePointDto schBasePointDto = points.stream()
.min(Comparator.comparing(SchBasePointDto::getPcsn)).orElse( null);
return ObjectUtil.isNotEmpty(schBasePointDto) ? Convert.convert(SchBasePoint.class, schBasePointDto) : null;
}
@Override
public 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("执行中");
TaskUtils.setUpdateByAcs(taskObj);
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
}
@Override
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
@Override
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
@Transactional(rollbackFor = Exception.class)
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 获取参数
SchBasePoint startPointObj = pointService.getById(taskObj.getPoint_code1());
SchBasePoint endPointObj = pointService.getById(taskObj.getPoint_code2());
// 起点清空
if (ObjectUtil.isNotEmpty(startPointObj)) {
PointUtils.setUpdateByType(startPointObj, taskFinishedType);
PointUtils.clearPoint(startPointObj);
endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode());
endPointObj.setStoragevehicle_code(taskObj.getVehicle_code());
// endPointObj.setVehicle_qty(taskObj.getVehicle_qty());
endPointObj.setUpdate_time(DateUtil.now());
PointUtils.setUpdateByType(endPointObj, taskFinishedType);
pointService.updateById(endPointObj);
}
// 任务完成
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setRemark(GeneralDefinition.TASK_FINISH);
// taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
@Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 获取参数
SchBasePoint startPointObj = pointService.getById(taskObj.getPoint_code1());
// 起点解锁
if (ObjectUtil.isNotEmpty(startPointObj)) {
startPointObj.setIng_task_code("");
PointUtils.setUpdateByType(startPointObj, taskFinishedType);
pointService.updateById(startPointObj);
}
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskObj.setRemark(GeneralDefinition.TASK_CANCEL);
// taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
}

View File

@@ -0,0 +1,11 @@
package org.nl.wms.sch.tasks.netsl.mapper;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.point.service.dto.SchBasePointDto;
import java.util.List;
public interface NETSLMapper {
List<SchBasePointDto> findPointForNETSL(List<String> startRegionStr, String material_code);
}

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.wms.sch.tasks.netsl.mapper.NETSLMapper">
<select id="findPointForNETSL" resultType="org.nl.wms.sch.point.service.dto.SchBasePointDto">
SELECT p.*,
g.pcsn
FROM `sch_base_point` p
inner join md_pb_groupplate g on p.storagevehicle_code = g.storagevehicle_code
left join md_me_materialbase m on g.material_code = m.material_code
WHERE (
(p.point_type = '1' AND p.region_code = #{startRegionStr[0]})
)
AND (p.ing_task_code = '' OR p.ing_task_code IS NULL)
AND g.material_code = #{material_code}
AND p.point_status = '2'
AND p.is_used = 1
AND p.region_code IN
<foreach collection="startRegionStr" item="code" separator="," open="(" close=")">
#{code}
</foreach>
ORDER BY
g.inbound_time ASC
</select>
</mapper>

View File

@@ -0,0 +1,200 @@
package org.nl.wms.sch.tasks.netxl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.system.service.notice.ISysNoticeService;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.ISchBaseTaskconfigService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.GeneralDefinition;
import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum;
import org.nl.wms.sch.task_manage.enums.PointStatusEnum;
import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.task.TaskType;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import org.nl.wms.sch.tasks.netxl.mapper.NETXLMapper;
import org.nl.wms.util.PointUtils;
import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
//// NET加工区下料任务
@Component(value = "NETXLTask")
@TaskType("NETXLTask")
public class NETXLTask extends AbstractTask {
private static final String TASK_CONFIG_CODE = "NETXLTask";
@Autowired
private ISchBasePointService pointService;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private ISchBaseTaskconfigService taskConfigService;
@Autowired
private ISysNoticeService noticeService;
@Autowired
private NETXLMapper NETXLMapper;
@Override
public void create() throws BadRequestException {
// 获取任务
List<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY);
// 配置信息
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>()
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE));
for (SchBaseTask task : tasks) {
TaskUtils.setUpdateByAcs(task);
List<String> startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(","))
.collect(Collectors.toList());
// 找终点
SchBasePoint point = findStartPoint(startRegionStr);
if (ObjectUtil.isEmpty(point)) {
task.setRemark("未找到所需点位!");
taskService.updateById(task);
// 消息通知
noticeService.createNotice(task.getRemark(), TASK_CONFIG_CODE + task.getPoint_code1(),
NoticeTypeEnum.WARN.getCode());
continue;
}
// 设置终点并修改创建成功状态
task.setPoint_code1(point.getPoint_code());
task.setTask_status(TaskStatus.CREATED.getCode());
task.setRemark("");
taskService.updateById(task);
point.setIng_task_code(task.getTask_code());
PointUtils.setUpdateByAcs(point);
pointService.updateById(point);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void createCompletion(SchBaseTask task) {
// 配置信息
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>()
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE));
TaskUtils.setUpdateByAcs(task);
List<String> startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(","))
.collect(Collectors.toList());
// 找起点
SchBasePoint point = findStartPoint(startRegionStr);
if (ObjectUtil.isEmpty(point)) {
// 消息通知
noticeService.createNotice("货架暂无托盘!", TASK_CONFIG_CODE + task.getPoint_code2(),
NoticeTypeEnum.WARN.getCode());
throw new BadRequestException("货架暂无托盘!");
}
// 设置终点并修改创建成功状态
task.setPoint_code1(point.getPoint_code());
task.setRemark("");
task.setTask_status(TaskStatus.CREATED.getCode());
taskService.save(task);
// 点位更新
point.setIng_task_code(task.getTask_code());
PointUtils.setUpdateByAcs(point);
pointService.updateById(point);
}
private SchBasePoint findStartPoint(List<String> startRegionStr) {
// 钢托盘缓存区域的空盘是1 状态不同
List<SchBasePoint> points = NETXLMapper.findPointForNETXL(startRegionStr);
return ObjectUtil.isNotEmpty(points) ? points.get(0) : null;
}
@Override
public 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("执行中");
TaskUtils.setUpdateByAcs(taskObj);
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
}
@Override
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
@Override
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
@Transactional(rollbackFor = Exception.class)
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 获取参数
SchBasePoint startPointObj = pointService.getById(taskObj.getPoint_code1());
SchBasePoint endPointObj = pointService.getById(taskObj.getPoint_code2());
// 起点清空
if (ObjectUtil.isNotEmpty(startPointObj)) {
PointUtils.setUpdateByType(startPointObj, taskFinishedType);
PointUtils.clearPoint(startPointObj);
endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode());
// endPointObj.setVehicle_type(GeneralDefinition.STEEL_TRAY);
// endPointObj.setVehicle_qty(taskObj.getVehicle_qty());
endPointObj.setUpdate_time(DateUtil.now());
PointUtils.setUpdateByType(endPointObj, taskFinishedType);
pointService.updateById(endPointObj);
}
// 任务完成
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setRemark(GeneralDefinition.TASK_FINISH);
// taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
@Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 获取参数
SchBasePoint startPointObj = pointService.getById(taskObj.getPoint_code1());
// 起点解锁
if (ObjectUtil.isNotEmpty(startPointObj)) {
startPointObj.setIng_task_code("");
PointUtils.setUpdateByType(startPointObj, taskFinishedType);
pointService.updateById(startPointObj);
}
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskObj.setRemark(GeneralDefinition.TASK_CANCEL);
// taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
}

View File

@@ -0,0 +1,9 @@
package org.nl.wms.sch.tasks.netxl.mapper;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import java.util.List;
public interface NETXLMapper {
List<SchBasePoint> findPointForNETXL(List<String> startRegionStr);
}

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.wms.sch.tasks.netxl.mapper.NETXLMapper">
<select id="findPointForNETXL" resultType="org.nl.wms.sch.point.service.dao.SchBasePoint">
SELECT p.*
FROM `sch_base_point` p
WHERE (
(p.point_type = '1' AND p.region_code = #{regionCode[0]})
)
AND (p.ing_task_code = '' OR p.ing_task_code IS NULL)
AND p.point_status = '2'
AND p.is_used = 1
AND p.region_code IN
<foreach collection="regionCode" item="code" separator="," open="(" close=")">
#{code}
</foreach>
ORDER BY
p.out_empty_seq ASC
</select>
</mapper>

View File

@@ -0,0 +1,233 @@
package org.nl.wms.sch.tasks.thsl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.system.service.notice.ISysNoticeService;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.point.service.dao.mapper.SchBasePointMapper;
import org.nl.wms.sch.point.service.dto.SchBasePointDto;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.ISchBaseTaskconfigService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.GeneralDefinition;
import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum;
import org.nl.wms.sch.task_manage.enums.PointStatusEnum;
import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.task.TaskType;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import org.nl.wms.sch.tasks.netxl.mapper.NETXLMapper;
import org.nl.wms.sch.tasks.thsl.mapper.THSLMapper;
import org.nl.wms.util.PointUtils;
import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import oshi.driver.mac.net.NetStat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
//// 贴合区上料任务
@Component(value = "THSLTask")
@TaskType("THSLTask")
public class THSLTask extends AbstractTask {
private static final String TASK_CONFIG_CODE = "THSLTask";
@Autowired
private ISchBasePointService pointService;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private ISchBaseTaskconfigService taskConfigService;
@Autowired
private ISysNoticeService noticeService;
@Autowired
private THSLMapper thslMapper;
@Override
public void create() throws BadRequestException {
// 获取任务
List<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY);
// 配置信息
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>()
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE));
for (SchBaseTask task : tasks) {
TaskUtils.setUpdateByAcs(task);
List<String> startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(","))
.collect(Collectors.toList());
// 找起点
SchBasePoint point = findStartPoint(startRegionStr, task.getMaterial_code());
if (ObjectUtil.isEmpty(point)) {
task.setRemark("未找到所需点位!");
taskService.updateById(task);
// 消息通知
noticeService.createNotice(task.getRemark(), TASK_CONFIG_CODE + task.getPoint_code2(),
NoticeTypeEnum.WARN.getCode());
continue;
}
// 设置终起点并修改创建成功状态
task.setPoint_code1(point.getPoint_code());
task.setTask_status(TaskStatus.CREATED.getCode());
task.setVehicle_code(point.getStoragevehicle_code());
task.setRemark("");
taskService.updateById(task);
point.setIng_task_code(task.getTask_code());
PointUtils.setUpdateByAcs(point);
pointService.updateById(point);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void createCompletion(SchBaseTask task) {
// 配置信息
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>()
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE));
TaskUtils.setUpdateByAcs(task);
List<String> startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(","))
.collect(Collectors.toList());
// 找起点
SchBasePoint point = findStartPoint(startRegionStr, task.getMaterial_code());
if (ObjectUtil.isEmpty(point)) {
// 消息通知
noticeService.createNotice("货架暂无托盘!", TASK_CONFIG_CODE + task.getPoint_code2(),
NoticeTypeEnum.WARN.getCode());
throw new BadRequestException("货架暂无托盘!");
}
// 设置终点并修改创建成功状态
task.setPoint_code1(point.getPoint_code());
task.setVehicle_code(point.getStoragevehicle_code());
task.setRemark("");
task.setTask_status(TaskStatus.CREATED.getCode());
taskService.save(task);
// 点位更新
point.setIng_task_code(task.getTask_code());
PointUtils.setUpdateByAcs(point);
pointService.updateById(point);
}
private SchBasePoint findStartPoint(List<String> startRegionStr, String material_code) {
// 钢托盘缓存区域的空盘是1 状态不同
List<SchBasePointDto> points = thslMapper.findPointForTHSL(startRegionStr, material_code);
//找到最小PCSN的点位
SchBasePointDto schBasePointDto = points.stream()
.min(Comparator.comparing(SchBasePointDto::getPcsn)).orElse(null);
if (schBasePointDto == null) {
throw new BadRequestException("未找到物料编码为【" + material_code + "】所需点位!");
}
String region_code = schBasePointDto.getRegion_code();
String point_code = schBasePointDto.getPoint_code();
if ("E2".equals(region_code)) {
return getWaitPoint(point_code);
} else if ("H1".equals(schBasePointDto.getRegion_code())) {
return getWaitPoint(point_code);
} else if ("H2".equals(schBasePointDto.getRegion_code())) {
return getWaitPoint(point_code);
}else {
return ObjectUtil.isNotEmpty(schBasePointDto) ? Convert.convert(SchBasePoint.class, schBasePointDto) : null;
}
}
private SchBasePoint getWaitPoint(String point_code) {
//查找该区域空闲的等待点
SchBasePoint point = pointService.findByCode(point_code.substring(0, point_code.length() - 2) + "00");
if (ObjectUtil.isEmpty(point)){
throw new BadRequestException("未找到点位编码为【" + point_code + "】所需的等待点位!");
}
return point;
}
@Override
public 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("执行中");
TaskUtils.setUpdateByAcs(taskObj);
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
}
@Override
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
@Override
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
@Transactional(rollbackFor = Exception.class)
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 获取参数
SchBasePoint startPointObj = pointService.getById(taskObj.getPoint_code1());
SchBasePoint endPointObj = pointService.getById(taskObj.getPoint_code2());
// 起点清空
if (ObjectUtil.isNotEmpty(startPointObj)) {
PointUtils.setUpdateByType(startPointObj, taskFinishedType);
PointUtils.clearPoint(startPointObj);
endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode());
// endPointObj.setVehicle_type(GeneralDefinition.STEEL_TRAY);
// endPointObj.setVehicle_qty(taskObj.getVehicle_qty());
endPointObj.setUpdate_time(DateUtil.now());
PointUtils.setUpdateByType(endPointObj, taskFinishedType);
pointService.updateById(endPointObj);
}
// 任务完成
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setRemark(GeneralDefinition.TASK_FINISH);
// taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
@Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 获取参数
SchBasePoint startPointObj = pointService.getById(taskObj.getPoint_code1());
// 起点解锁
if (ObjectUtil.isNotEmpty(startPointObj)) {
startPointObj.setIng_task_code("");
PointUtils.setUpdateByType(startPointObj, taskFinishedType);
pointService.updateById(startPointObj);
}
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskObj.setRemark(GeneralDefinition.TASK_CANCEL);
// taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
}

View File

@@ -0,0 +1,10 @@
package org.nl.wms.sch.tasks.thsl.mapper;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.point.service.dto.SchBasePointDto;
import java.util.List;
public interface THSLMapper {
List<SchBasePointDto> findPointForTHSL(List<String> startRegionStr, String material_code);
}

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.wms.sch.tasks.thsl.mapper.THSLMapper">
<select id="findPointForTHSL" resultType="org.nl.wms.sch.point.service.dto.SchBasePointDto">
SELECT p.*
g.pcsn
FROM `sch_base_point` p
inner join md_pb_groupplate g on p.storagevehicle_code = g.storagevehicle_code
left join md_me_materialbase m on g.material_code = m.material_code
WHERE (
(p.point_type = '1' AND p.region_code = #{startRegionStr[0]})
)
AND (p.ing_task_code = '' OR p.ing_task_code IS NULL)
AND g.material_code = #{material_code}
AND p.point_status = '2'
AND p.is_used = 1
AND p.region_code IN
<foreach collection="startRegionStr" item="code" separator="," open="(" close=")">
#{code}
</foreach>
ORDER BY
g.inbound_time ASC
</select>
</mapper>

View File

@@ -0,0 +1,199 @@
package org.nl.wms.sch.tasks.thxl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.system.service.notice.ISysNoticeService;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.ISchBaseTaskconfigService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.GeneralDefinition;
import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum;
import org.nl.wms.sch.task_manage.enums.PointStatusEnum;
import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.task.TaskType;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import org.nl.wms.sch.tasks.netxl.mapper.NETXLMapper;
import org.nl.wms.util.PointUtils;
import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
//// 贴合区下料任务
@Component(value = "THXLTask")
@TaskType("THXLTask")
public class THXLTask extends AbstractTask {
private static final String TASK_CONFIG_CODE = "THXLTask";
@Autowired
private ISchBasePointService pointService;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private ISchBaseTaskconfigService taskConfigService;
@Autowired
private ISysNoticeService noticeService;
@Autowired
private NETXLMapper NETXLMapper;
@Override
public void create() throws BadRequestException {
// 获取任务
List<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY);
// 配置信息
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>()
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE));
for (SchBaseTask task : tasks) {
TaskUtils.setUpdateByAcs(task);
List<String> startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(","))
.collect(Collectors.toList());
// 找终点
SchBasePoint point = findStartPoint(startRegionStr);
if (ObjectUtil.isEmpty(point)) {
task.setRemark("未找到所需点位!");
taskService.updateById(task);
// 消息通知
noticeService.createNotice(task.getRemark(), TASK_CONFIG_CODE + task.getPoint_code1(),
NoticeTypeEnum.WARN.getCode());
continue;
}
// 设置终点并修改创建成功状态
task.setPoint_code1(point.getPoint_code());
task.setTask_status(TaskStatus.CREATED.getCode());
task.setRemark("");
taskService.updateById(task);
point.setIng_task_code(task.getTask_code());
PointUtils.setUpdateByAcs(point);
pointService.updateById(point);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void createCompletion(SchBaseTask task) {
// 配置信息
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>()
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE));
TaskUtils.setUpdateByAcs(task);
List<String> startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(","))
.collect(Collectors.toList());
// 找起点
SchBasePoint point = findStartPoint(startRegionStr);
if (ObjectUtil.isEmpty(point)) {
// 消息通知
noticeService.createNotice("货架暂无托盘!", TASK_CONFIG_CODE + task.getPoint_code2(),
NoticeTypeEnum.WARN.getCode());
throw new BadRequestException("货架暂无托盘!");
}
// 设置终点并修改创建成功状态
task.setPoint_code1(point.getPoint_code());
task.setRemark("");
task.setTask_status(TaskStatus.CREATED.getCode());
taskService.save(task);
// 点位更新
point.setIng_task_code(task.getTask_code());
PointUtils.setUpdateByAcs(point);
pointService.updateById(point);
}
private SchBasePoint findStartPoint(List<String> startRegionStr) {
// 钢托盘缓存区域的空盘是1 状态不同
List<SchBasePoint> points = NETXLMapper.findPointForNETXL(startRegionStr);
return ObjectUtil.isNotEmpty(points) ? points.get(0) : null;
}
@Override
public 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("执行中");
TaskUtils.setUpdateByAcs(taskObj);
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
}
@Override
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
@Override
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
@Transactional(rollbackFor = Exception.class)
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 获取参数
SchBasePoint startPointObj = pointService.getById(taskObj.getPoint_code1());
SchBasePoint endPointObj = pointService.getById(taskObj.getPoint_code2());
// 起点清空
if (ObjectUtil.isNotEmpty(startPointObj)) {
PointUtils.setUpdateByType(startPointObj, taskFinishedType);
PointUtils.clearPoint(startPointObj);
endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode());
// endPointObj.setVehicle_type(GeneralDefinition.STEEL_TRAY);
// endPointObj.setVehicle_qty(taskObj.getVehicle_qty());
endPointObj.setUpdate_time(DateUtil.now());
PointUtils.setUpdateByType(endPointObj, taskFinishedType);
pointService.updateById(endPointObj);
}
// 任务完成
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setRemark(GeneralDefinition.TASK_FINISH);
// taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
@Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 获取参数
SchBasePoint startPointObj = pointService.getById(taskObj.getPoint_code1());
// 起点解锁
if (ObjectUtil.isNotEmpty(startPointObj)) {
startPointObj.setIng_task_code("");
PointUtils.setUpdateByType(startPointObj, taskFinishedType);
pointService.updateById(startPointObj);
}
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskObj.setRemark(GeneralDefinition.TASK_CANCEL);
// taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
}

View File

@@ -13,6 +13,8 @@ import org.nl.wms.sch.task_manage.GeneralDefinition;
import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
/**
@@ -70,6 +72,20 @@ public class TaskUtils {
taskObj.setUpdate_time(DateUtil.now());
}
/**
* 获取指定格式的日期时间
* @param format 格式
* @return 字符串
*/
public static String getDateTime(String format) {
// 获取当前日期和时间
LocalDateTime now = LocalDateTime.now();
// 定义日期时间格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
// 格式化日期时间
return now.format(formatter);
}
public static void setUpdateAuto(SchBaseTask taskObj) {
String currentUserId = ObjectUtil.isNotEmpty(SecurityUtils.getCurrentUserId())
@@ -164,7 +180,7 @@ public class TaskUtils {
if (ObjectUtil.isEmpty(acsVehicleCode) || acsVehicleCode.equals(GeneralDefinition.NO)) {
return null;
}
return String.format("%04d", Integer.parseInt(acsVehicleCode));
return String.format("%04d", Integer.parseInt(acsVehicleCode.trim()));
}
/**