From d5d20f04ef9435e539aa815e89fd7f94d6dd2ed8 Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Sun, 30 Jul 2023 15:42:52 +0800 Subject: [PATCH 1/4] =?UTF-8?q?opt:=20=E4=B8=8EACS=E9=80=9A=E4=BF=A1?= =?UTF-8?q?=E4=B8=8E=E6=95=B0=E6=8D=AE=E8=BF=94=E5=9B=9E=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/ext/acs/service/WmsToAcsService.java | 13 ++++ .../wms/ext/acs/service/dto/ResultForAcs.java | 44 +++++++++++ .../service/dto/to/acs/PutActionRequest.java | 1 + .../acs/service/impl/AcsToWmsServiceImpl.java | 10 +-- .../acs/service/impl/WmsToAcsServiceImpl.java | 33 +++++++- .../service/ISysInteractRecordService.java | 4 + .../impl/SysInteractRecordServiceImpl.java | 17 +++++ .../controller/PdmBdWorkorderController.java | 9 +++ .../service/IPdmBdWorkorderService.java | 6 ++ .../impl/PdmBdWorkorderServiceImpl.java | 57 ++++++++++++++ .../nl/wms/sch/task_manage/AbstractTask.java | 5 +- .../sch/task_manage/GeneralDefinition.java | 5 ++ .../nl/wms/sch/task_manage/task/AcsUtil.java | 76 +++++-------------- .../task_manage/task/tasks/fj/FJMKTask.java | 23 ++++-- .../task_manage/task/tasks/fj/FJQKTask.java | 1 + .../task_manage/task/tasks/fj/FJQLTask.java | 7 ++ .../main/java/org/nl/wms/util/PointUtils.java | 4 + .../test/java/org/nl/point/PointCreate.java | 24 ++++++ .../src/views/wms/pdm/workerorder/index.vue | 23 +++++- .../wms/pdm/workerorder/pdmBdWorkorder.js | 10 ++- 20 files changed, 298 insertions(+), 74 deletions(-) create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/ResultForAcs.java diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java index dab2890..a62cec5 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java @@ -1,9 +1,22 @@ package org.nl.wms.ext.acs.service; +import com.alibaba.fastjson.JSONArray; +import org.nl.wms.ext.acs.service.dto.ResultForAcs; +import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder; + +import java.util.Map; + /** * @Author: lyd * @Description: Wms请求Acs * @Date: 2023/6/30 */ public interface WmsToAcsService { + + /** + * 下发工单 + * @param workorder + * @return + */ + ResultForAcs order(PdmBdWorkorder workorder); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/ResultForAcs.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/ResultForAcs.java new file mode 100644 index 0000000..a578c53 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/ResultForAcs.java @@ -0,0 +1,44 @@ +package org.nl.wms.ext.acs.service.dto; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.http.HttpStatus; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; + +/** + * @Author: lyd + * @Description: 统一接口返回 - 请求ACS返回的数据类型 + * @Date: 2023/7/28 + */ +@Data +public class ResultForAcs { + private int status; + private String message; + private String timestamp; + private JSONObject data; + + public static ResultForAcs requestRefuse(String message) { + ResultForAcs result = new ResultForAcs(); + result.setStatus(HttpStatus.HTTP_BAD_REQUEST); + result.setMessage(message); + result.setTimestamp(DateUtil.now()); + return result; + } + + public static ResultForAcs requestOk() { + ResultForAcs result = new ResultForAcs(); + result.setStatus(HttpStatus.HTTP_OK); + result.setMessage("请求成功"); + result.setTimestamp(DateUtil.now()); + return result; + } + + public static ResultForAcs requestOk(String message, JSONObject data) { + ResultForAcs result = new ResultForAcs(); + result.setStatus(HttpStatus.HTTP_OK); + result.setMessage(message); + result.setTimestamp(DateUtil.now()); + result.setData(data); + return result; + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/acs/PutActionRequest.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/acs/PutActionRequest.java index c5cc3ce..1fa8b43 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/acs/PutActionRequest.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/acs/PutActionRequest.java @@ -18,6 +18,7 @@ public class PutActionRequest extends BaseRequest { * 设备号 */ private String device_code; + private String vehicle_type; /** * 信号数据 diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index 41d0937..f1c77e0 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -554,7 +554,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { try { abstractTask.updateTaskStatus(taskCode, status); } catch (Exception e) { - log.error("任务状态更新失败:{}", message); + log.error("任务状态更新失败: {}", message); return BaseResponse.responseError(requestNo, "任务:[" + taskCode + "]状态更新失败," + message); } return BaseResponse.responseOk(requestNo, "任务状态反馈成功!"); @@ -587,7 +587,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { String requestNo = actionRequest.getRequestNo(); String deviceCode = actionRequest.getDevice_code(); List list = actionRequest.getList(); -// String vehicleType = actionRequest.getVehicle_type(); + String vehicleType = actionRequest.getVehicle_type(); if (deviceCode == null) { return BaseResponse.responseError(requestNo, "设备编码不能为空"); } @@ -610,9 +610,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { && move.equals(PointStatusEnum.EMPTY_VEHICLE.getCode())) || (pointStatus.equals(move))) { // 不做操作 return BaseResponse.responseOk(requestNo); } -// if (vehicleType != null) { -// schBasePoint.setVehicle_type(vehicleType); -// } + if (vehicleType != null) { + schBasePoint.setVehicle_type(vehicleType); + } schBasePoint.setPoint_status(move); PointUtils.setUpdateByAcs(schBasePoint); pointService.updateById(schBasePoint); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java index 87d87cb..75d467f 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java @@ -1,15 +1,46 @@ package org.nl.wms.ext.acs.service.impl; +import cn.hutool.core.date.DateUtil; +import cn.hutool.http.HttpStatus; import lombok.extern.slf4j.Slf4j; import org.nl.wms.ext.acs.service.WmsToAcsService; +import org.nl.wms.ext.acs.service.dto.ResultForAcs; +import org.nl.wms.ext.record.service.ISysInteractRecordService; +import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder; +import org.nl.wms.sch.task_manage.GeneralDefinition; +import org.nl.wms.sch.task_manage.task.AcsUtil; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + /** * @Author: lyd - * @Description: + * @Description: WMS请求ACS - 业务开发 * @Date: 2023/6/30 */ @Slf4j @Service public class WmsToAcsServiceImpl implements WmsToAcsService { + @Autowired + private ISysInteractRecordService interactRecordService; + @Override + public ResultForAcs order(PdmBdWorkorder workorder) { + String api = "api/wms/order"; + List list = new ArrayList<>(); + list.add(workorder); + ResultForAcs resultForAcs = ResultForAcs.requestOk(); + try { + resultForAcs = AcsUtil.notifyAcs(api, list); + } catch (Exception e) { + log.error(api + ": {}", e.getMessage()); + resultForAcs.setTimestamp(DateUtil.now()); + resultForAcs.setStatus(HttpStatus.HTTP_BAD_REQUEST); + resultForAcs.setMessage(e.getMessage()); + } + // 记录日志 + interactRecordService.saveRecord(workorder, resultForAcs, GeneralDefinition.LMS_ACS); + return resultForAcs; + } } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/record/service/ISysInteractRecordService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/record/service/ISysInteractRecordService.java index bfdfc1d..fe92fdf 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/record/service/ISysInteractRecordService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/record/service/ISysInteractRecordService.java @@ -4,8 +4,10 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import org.nl.common.domain.query.PageQuery; +import org.nl.wms.ext.acs.service.dto.ResultForAcs; import org.nl.wms.ext.acs.service.dto.to.BaseResponse; import org.nl.wms.ext.record.service.dao.SysInteractRecord; +import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder; import java.util.Map; import java.util.Set; @@ -47,4 +49,6 @@ public interface ISysInteractRecordService extends IService { * 创建记录 */ void saveRecord(Object request, BaseResponse response, String direction); + + void saveRecord(PdmBdWorkorder workorder, ResultForAcs resultForAcs, String lmsAcs); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/record/service/impl/SysInteractRecordServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/record/service/impl/SysInteractRecordServiceImpl.java index 8882582..3ced7c8 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/record/service/impl/SysInteractRecordServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/record/service/impl/SysInteractRecordServiceImpl.java @@ -11,10 +11,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.nl.common.domain.query.PageQuery; import org.nl.common.exception.BadRequestException; +import org.nl.wms.ext.acs.service.dto.ResultForAcs; import org.nl.wms.ext.acs.service.dto.to.BaseResponse; import org.nl.wms.ext.record.service.ISysInteractRecordService; import org.nl.wms.ext.record.service.dao.mapper.SysInteractRecordMapper; import org.nl.wms.ext.record.service.dao.SysInteractRecord; +import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -77,4 +79,19 @@ public class SysInteractRecordServiceImpl extends ServiceImpl(HttpStatus.OK); } + + @PostMapping("/submits") + @Log("工单下发") + @ApiOperation("工单下发") + public ResponseEntity submits(@RequestBody PdmBdWorkorder entity){ + pdmBdWorkorderService.submits(entity); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/IPdmBdWorkorderService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/IPdmBdWorkorderService.java index b4d71f6..fed29d7 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/IPdmBdWorkorderService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/IPdmBdWorkorderService.java @@ -49,4 +49,10 @@ public interface IPdmBdWorkorderService extends IService { PdmBdWorkorder getDeviceProductionTask(String deviceCode); PdmBdWorkorder getByCode(String orderCode); + + /** + * 工单下发 + * @param entity + */ + void submits(PdmBdWorkorder entity); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/impl/PdmBdWorkorderServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/impl/PdmBdWorkorderServiceImpl.java index 3d1bbff..9161ccc 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/impl/PdmBdWorkorderServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/impl/PdmBdWorkorderServiceImpl.java @@ -2,6 +2,8 @@ package org.nl.wms.pdm.workorder.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpStatus; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -12,15 +14,21 @@ 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.system.service.notice.ISysNoticeService; +import org.nl.wms.ext.acs.service.WmsToAcsService; +import org.nl.wms.ext.acs.service.dto.ResultForAcs; import org.nl.wms.pdm.workorder.service.IPdmBdWorkorderService; import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder; import org.nl.wms.pdm.workorder.service.dao.mapper.PdmBdWorkorderMapper; import org.nl.wms.pdm.workorder.service.dto.PdmBdWorkorderQuery; 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.WorkOrderStatusEnum; +import org.nl.wms.util.TaskUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Map; import java.util.Set; /** @@ -35,6 +43,11 @@ public class PdmBdWorkorderServiceImpl extends ServiceImpl queryAll(PdmBdWorkorderQuery query, PageQuery page){ IPage pages = new Page<>(page.getPage() + 1, page.getSize()); @@ -96,4 +109,48 @@ public class PdmBdWorkorderServiceImpl extends ServiceImpl lam = new QueryWrapper().lambda(); + lam.eq(PdmBdWorkorder::getPoint_code, entity.getPoint_code()) + .eq(PdmBdWorkorder::getWorkorder_status, WorkOrderStatusEnum.PRODUCING.getCode()) + .eq(PdmBdWorkorder::getIs_delete, false); + PdmBdWorkorder bdWorkorder = pdmBdWorkorderMapper.selectOne(lam); + if (ObjectUtil.isNotEmpty(bdWorkorder)) { + throw new BadRequestException("该设备已有生产工单,不能重复下发"); + } + ResultForAcs resultForAcs = null; + try { + resultForAcs = wmsToAcsService.order(pdmBdWorkorder); + } catch (Exception e) { + log.error("工单下发异常:" + e.getMessage()); + // 通知 + noticeService.createNotice("工单下发失败: " + e.getMessage(), "工单下发失败: " + + pdmBdWorkorder.getWorkorder_code(), NoticeTypeEnum.EXCEPTION.getCode()); + throw new BadRequestException("工单下发失败"); + } + if (resultForAcs.getStatus() != HttpStatus.HTTP_OK) { + // 不成功 + noticeService.createNotice(resultForAcs.getMessage(), "工单下发失败: " + pdmBdWorkorder.getWorkorder_code(), + NoticeTypeEnum.EXCEPTION.getCode()); + throw new BadRequestException("工单下发失败"); + } + // 修改工单数据 + pdmBdWorkorder.setWorkorder_status(WorkOrderStatusEnum.ISSUED.getCode()); + TaskUtils.setWorkOrderUpdateByAcs(pdmBdWorkorder); + pdmBdWorkorderMapper.updateById(pdmBdWorkorder); + } + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java index b275391..e1dd81c 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.nl.common.exception.BadRequestException; +import org.nl.wms.ext.acs.service.dto.ResultForAcs; import org.nl.wms.pdm.workorder.service.IPdmBdWorkorderService; import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder; import org.nl.wms.sch.point.service.ISchBasePointService; @@ -57,7 +58,7 @@ public abstract class AbstractTask { * @author ldjun * @created 2020年6月12日 下午5:52:28 */ - protected JSONObject renotifyAcs(SchBaseTask task) { + protected ResultForAcs renotifyAcs(SchBaseTask task) { Assert.notNull(task); List taskList = new ArrayList<>(); taskList.add(task); @@ -70,7 +71,7 @@ public abstract class AbstractTask { * @author ldjun * @created 2020年6月12日 下午5:52:28 */ - protected JSONObject renotifyAcs(List taskList) { + protected ResultForAcs renotifyAcs(List taskList) { //1、获取任务 //2、根据任务配置补全任务 //3、下发 diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java index 21fa657..2fd17fe 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java @@ -62,4 +62,9 @@ public class GeneralDefinition { public static final String UPPER_CONVEYOR_LINE = "3"; /** 下输送线 */ public static final String LOWER_CONVEYOR_LINE = "4"; + // 参数名称 + /** 是否连接 */ + public static final String IS_CONNECT_ACS = "is_connect_acs"; + /** ACS路径 */ + public static final String ACS_URL = "acs_url"; } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/AcsUtil.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/AcsUtil.java index fd5c9a6..c472d52 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/AcsUtil.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/AcsUtil.java @@ -1,105 +1,67 @@ - package org.nl.wms.sch.task_manage.task; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; -import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.nl.common.exception.BadRequestException; import org.nl.config.SpringContextHolder; import org.nl.system.service.param.dao.Param; import org.nl.system.service.param.impl.SysParamServiceImpl; -import org.nl.wms.ext.record.service.ISysInteractRecordService; -import org.nl.wms.ext.record.service.impl.SysInteractRecordServiceImpl; -import org.nl.wms.sch.task_manage.AcsTaskDto; +import org.nl.wms.ext.acs.service.dto.ResultForAcs; import org.nl.wms.sch.task_manage.GeneralDefinition; -import org.springframework.http.HttpStatus; import java.util.List; /** - * ACS连接工具类: + * ACS连接工具类: 不允许直接操作结果,将其封装到ResultForAcs,由实现类操作 */ @Slf4j public class AcsUtil { /** - * 统一多数据入口 + * 统一多数据入口: 默认执行的参数都是jsonArray * @param api * @param list * @return * @param */ - public static JSONObject notifyAcs(String api, List list) { + public static ResultForAcs notifyAcs(String api, List list) { SysParamServiceImpl sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class); + // list转JSONArray + String s = JSON.toJSONString(list); //判断是否连接ACS系统 - Param isConnectAcs = sysParamService.findByCode("IS_CONNECT_ACS"); + Param isConnectAcs = sysParamService.findByCode(GeneralDefinition.IS_CONNECT_ACS); if (ObjectUtil.isEmpty(isConnectAcs)) { - throw new BadRequestException("参数表中:IS_CONNECT_ACS不存在"); + throw new BadRequestException("参数表中:" + GeneralDefinition.IS_CONNECT_ACS + "不存在"); } String isConnect = isConnectAcs.getValue(); - JSONObject result = new JSONObject(); - if (StrUtil.equals(GeneralDefinition.NO, isConnect)) { - result.put("status", HttpStatus.BAD_REQUEST.value()); - result.put("message", "未连接ACS!"); - result.put("data", new JSONObject()); - return result; - } //ACS地址:127.0.0.1:8010 - Param acsUrlObj = sysParamService.findByCode("ACS_URL"); + Param acsUrlObj = sysParamService.findByCode(GeneralDefinition.ACS_URL); if (ObjectUtil.isEmpty(acsUrlObj)) { - throw new BadRequestException("参数表中:ACS_URL不存在"); + throw new BadRequestException("参数表中:" + GeneralDefinition.ACS_URL + "不存在"); } String acsUrl = acsUrlObj.getValue(); - String url = acsUrl + api; - log.info("下发acs任务的参数为:{}", list.toString()); - try { - String resultMsg = HttpRequest.post(url) - .body(String.valueOf(list)) - .execute().body(); - result = JSONObject.parseObject(resultMsg); - } catch (Exception e) { - String msg = e.getMessage(); - //ConnectException: Connection refused: connect - //网络不通 - log.error("连接失败:{}", msg); - result.put("status", HttpStatus.BAD_REQUEST); - result.put("message", "网络不通,操作失败!"); - result.put("data", new JSONObject()); - } - return result; - } - public static JSONObject notifyAcs(String api, T object) { - //判断是否连接ACS系统 - String isConnect = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("IS_CONNECT_ACS").getValue(); - JSONObject result = new JSONObject(); + JSONObject result; if (StrUtil.equals(GeneralDefinition.NO, isConnect)) { - result.put("status", HttpStatus.BAD_REQUEST.value()); - result.put("message", "未连接ACS!"); - result.put("data", new JSONObject()); - return result; + return ResultForAcs.requestRefuse("未连接ACS!"); } - //ACS地址:127.0.0.1:8010 - String acsUrl = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("ACS_URL").getValue(); - String url = acsUrl + api; - log.info("下发acs任务的参数为:{}", object.toString()); + log.info("下发acs任务的参数为:{}", list.toString()); + ResultForAcs resultForAcs; try { String resultMsg = HttpRequest.post(url) - .body(String.valueOf(object)) + .body(s) .execute().body(); result = JSONObject.parseObject(resultMsg); + resultForAcs = JSONObject.toJavaObject(result, ResultForAcs.class); } catch (Exception e) { String msg = e.getMessage(); - //ConnectException: Connection refused: connect //网络不通 log.error("连接失败:{}", msg); - result.put("status", HttpStatus.BAD_REQUEST); - result.put("message", "网络不通,操作失败!"); - result.put("data", new JSONObject()); + return ResultForAcs.requestRefuse("网络不通,操作失败!"); } - // 记录交互表 - return result; + return resultForAcs; } } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJMKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJMKTask.java index 3986fc3..f8d2c09 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJMKTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJMKTask.java @@ -73,6 +73,7 @@ public class FJMKTask extends AbstractTask { String requestParam = task.getRequest_param();// 任务的其他数据 JSONObject jsonObject = JSONObject.parseObject(requestParam); // 找终点 + /** 包装位 */ SchBasePoint packagePoint = findNextPoint(nextRegionStr, jsonObject); if (ObjectUtil.isEmpty(packagePoint)) { task.setRemark("包装线不可用!"); @@ -87,6 +88,7 @@ public class FJMKTask extends AbstractTask { // 1 获取点位相应数量 // 2 获取库存数量 // 3 木托盘需要多少块 + /** 覆膜机木托盘位 */ SchBasePoint LaminatePoint = findStartPoint(startRegionStr, jsonObject); if (ObjectUtil.isEmpty(LaminatePoint)) { task.setRemark("覆膜区不可用!"); @@ -101,7 +103,7 @@ public class FJMKTask extends AbstractTask { // 设置终点并修改创建成功状态 task.setPoint_code3(LaminatePoint.getParent_point_code()); task.setPoint_code4(task.getPoint_code1()); - task.setVehicle_code2(vehicleCode); + task.setVehicle_code2(vehicleCode); // 覆膜机下的木托盘编码 task.setTask_status(TaskStatus.CREATED.getCode()); task.setRemark(""); taskService.updateById(task); @@ -109,6 +111,7 @@ public class FJMKTask extends AbstractTask { packagePoint.setIng_task_code(task.getTask_code()); PointUtils.setUpdateByAcs(packagePoint); pointService.updateById(packagePoint); + // 覆膜机对接位 SchBasePoint basePoint = pointService.getById(LaminatePoint.getParent_point_code()); basePoint.setIng_task_code(task.getTask_code()); basePoint.setVehicle_code(vehicleCode); @@ -283,15 +286,23 @@ public class FJMKTask extends AbstractTask { SchBasePoint fjcPointObj = pointService.getById(fjcPoint); if (ObjectUtil.isNotEmpty(bzxPointObj)) { // 包装位: 解锁 + PointUtils.setUpdateByType(bzxPointObj, taskFinishedType); PointUtils.clearPoint(bzxPointObj); // 覆膜位: 解锁 . 清空 + PointUtils.setUpdateByType(fmPointObj, taskFinishedType); PointUtils.clearPoint(fmPointObj); - // 机械手对接位: 赋值 - fjcPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode()); - fjcPointObj.setVehicle_qty(1); - fjcPointObj.setVehicle_type(taskObj.getVehicle_type()); + // 分拣机械手: 清空 PointUtils.setUpdateByType(fjcPointObj, taskFinishedType); - pointService.updateById(fjcPointObj); + PointUtils.clearPoint(fjcPointObj); + if (ObjectUtil.isNotEmpty(fmPointObj)) { + // 机械手对接位: 赋值 + fjcPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode()); + fjcPointObj.setVehicle_qty(1); + fjcPointObj.setVehicle_type(taskObj.getVehicle_type()); + fjcPointObj.setVehicle_code(taskObj.getVehicle_code2()); // 拿过来的载具编码 + PointUtils.setUpdateByType(fjcPointObj, taskFinishedType); + pointService.updateById(fjcPointObj); + } // 组盘设置已经解绑 SchBaseVehiclematerialgroup vehicleMaterialGroupObj = vehiclematerialgroupService.getById(taskObj.getGroup_id()); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQKTask.java index 22e724e..1df8f2d 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQKTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQKTask.java @@ -86,6 +86,7 @@ public class FJQKTask extends AbstractTask { task.setTask_status(TaskStatus.CREATED.getCode()); // 生产木托盘编码 String vehicleCode = CodeUtil.getNewCode("VEHICLE_CODE"); + // todo: 未确认是否放在1还是2,目前规定四点任务空盘的载具编码是2 task.setVehicle_code(vehicleCode); task.setRemark(""); task.setGroup_id(point.getGroup_id()); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQLTask.java index a9c1404..4497489 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQLTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQLTask.java @@ -21,6 +21,7 @@ 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.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; @@ -191,6 +192,12 @@ public class FJQLTask extends AbstractTask { processTracking.setProcess_location(endPoint); processTracking.setRecord_time(DateUtil.now()); processTrackingService.create(processTracking); + // 终点设置对应的参数 + endPointObj.setVehicle_code(startPointObj.getVehicle_code()); + endPointObj.setVehicle_type(startPointObj.getVehicle_type()); + endPointObj.setPoint_status(PointStatusEnum.FULL_POINT.getCode()); + PointUtils.setUpdateByType(endPointObj, taskFinishedType); + pointService.updateById(endPointObj); } // 任务完成 taskObj.setTask_status(TaskStatus.FINISHED.getCode()); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/PointUtils.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/PointUtils.java index 239b725..0d52fa1 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/PointUtils.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/PointUtils.java @@ -1,6 +1,7 @@ package org.nl.wms.util; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import org.nl.common.utils.SecurityUtils; import org.nl.config.SpringContextHolder; @@ -39,6 +40,9 @@ public class PointUtils { * @param point */ public static void clearPoint(SchBasePoint point) { + if (ObjectUtil.isEmpty(point)) { + return; // 空直接退出 + } SchBasePointServiceImpl pointService = SpringContextHolder.getBean(SchBasePointServiceImpl.class); point.setPoint_status(PointStatusEnum.EMPTY_POINT.getCode()); point.setVehicle_type(""); diff --git a/lms/nladmin-system/nlsso-server/src/test/java/org/nl/point/PointCreate.java b/lms/nladmin-system/nlsso-server/src/test/java/org/nl/point/PointCreate.java index 41c98c7..363ac9f 100644 --- a/lms/nladmin-system/nlsso-server/src/test/java/org/nl/point/PointCreate.java +++ b/lms/nladmin-system/nlsso-server/src/test/java/org/nl/point/PointCreate.java @@ -208,4 +208,28 @@ public class PointCreate { } pointService.saveBatch(pointList); } + @Test + void test07() { // 码垛机械手 + // 创建YJ01JLW01 + List pointList = new ArrayList<>(); + for (int i = 1; i <= 8; i++) { + String pointName = "压制不合格位0"; + String pointCode = "YZBHGW0"; + String papointCode = "YJ0"; + pointName = pointName + i; + pointCode = pointCode + i; + papointCode = papointCode + i; + SchBasePoint point = new SchBasePoint(); + point.setPoint_code(pointCode); + point.setPoint_name(pointName); + point.setRegion_code("YZ"); + point.setRegion_name("压制区域"); + point.setPoint_type("3"); + point.setParent_point_code(papointCode); + point.setIs_has_workder(false); + point.setIs_auto(false); + pointList.add(point); + } + pointService.saveBatch(pointList); + } } diff --git a/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue b/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue index f282fc2..8c14f22 100644 --- a/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue +++ b/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue @@ -60,7 +60,19 @@ - + + + 开工 + + { + this.crud.notify('下发成功', CRUD.NOTIFICATION_TYPE.SUCCESS) + this.crud.toQuery() + }) + }, } } diff --git a/lms/nladmin-ui/src/views/wms/pdm/workerorder/pdmBdWorkorder.js b/lms/nladmin-ui/src/views/wms/pdm/workerorder/pdmBdWorkorder.js index a47b51b..c32297c 100644 --- a/lms/nladmin-ui/src/views/wms/pdm/workerorder/pdmBdWorkorder.js +++ b/lms/nladmin-ui/src/views/wms/pdm/workerorder/pdmBdWorkorder.js @@ -24,4 +24,12 @@ export function edit(data) { }) } -export default { add, edit, del } +export function submits(param) { + return request({ + url: 'api/pdmBdWorkorder/submits', + method: 'post', + data: param + }) +} + +export default { add, edit, del, submits } From c22898668652344ca1def6bd69cfd898f476857a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E4=BF=8A=E6=9D=B0?= <9463626+zhou-junjiezjj@user.noreply.gitee.com> Date: Mon, 31 Jul 2023 09:57:33 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E9=80=89=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/DeviceServiceImpl.java | 3 ++ .../nl/acs/device/wql/Qdevice_query_002.wql | 9 +++- acs/nladmin-ui/src/views/acs/device/index.vue | 47 +++++++++++++++---- 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java index 3eea3af..c51ff77 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java @@ -89,6 +89,9 @@ public class DeviceServiceImpl implements DeviceService, ApplicationAutoInitial if (whereJson.get("device_type") != null) { param.put("device_type", whereJson.get("device_type")); } + if (whereJson.get("is_config") != null) { + param.put("is_config", whereJson.get("is_config")); + } JSONObject json = WQL.getWO("Qdevice_query_002").addParamMap(param).pageQuery(WqlUtil.getHttpContext(page), "is_config asc,seq_num desc,update_time desc"); return json; diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device/wql/Qdevice_query_002.wql b/acs/nladmin-system/src/main/java/org/nl/acs/device/wql/Qdevice_query_002.wql index 57817df..2f4f6eb 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device/wql/Qdevice_query_002.wql +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device/wql/Qdevice_query_002.wql @@ -24,6 +24,7 @@ 输入.methods_id TYPEAS s_string 输入.blurry TYPEAS s_string 输入.region TYPEAS s_string + 输入.is_config TYPEAS s_string [临时表] --这边列出来的临时表就会在运行期动态创建 @@ -49,13 +50,16 @@ PAGEQUERY SELECT d.*, dict.label AS device_type_name, - dict2.label AS region_name + dict2.label AS region_name, + dict3.label AS config FROM ACS_DEVICE d LEFT JOIN sys_dict_detail dict ON dict.value = d.device_type AND dict.`name` = 'device_type' LEFT JOIN sys_dict_detail dict2 ON dict2.value = d.region AND dict2.`name` = 'region_type' + LEFT JOIN sys_dict_detail dict3 ON dict3.value = d.is_config + AND dict3.`name` = 'is_config' WHERE is_delete = '0' OPTION 输入.blurry <> "" @@ -67,6 +71,9 @@ OPTION 输入.device_type <> "" d.device_type = 输入.device_type ENDOPTION + OPTION 输入.is_config <> "" + d.is_config = 输入.is_config + ENDOPTION ENDSELECT ENDPAGEQUERY ENDIF diff --git a/acs/nladmin-ui/src/views/acs/device/index.vue b/acs/nladmin-ui/src/views/acs/device/index.vue index 24fb48d..4917edd 100644 --- a/acs/nladmin-ui/src/views/acs/device/index.vue +++ b/acs/nladmin-ui/src/views/acs/device/index.vue @@ -38,17 +38,29 @@ > + + + 导出模型 + slot="right" + class="filter-item" + size="mini" + type="warning" + icon="el-icon-download" + @click="crud.doExport" + >导出模型 + + + + + @@ -194,8 +216,8 @@ import udOperation from '@crud/UD.operation' import pagination from '@crud/Pagination' import { get } from '@/api/system/dictDetail' import UploadDialog from '@/views/acs/device/UploadDialog' -import {download} from '@/api/data' -import {downloadFile} from '@/utils' +import { download } from '@/api/data' +import { downloadFile } from '@/utils' const defaultForm = { manufacturer: null, @@ -239,8 +261,9 @@ export default { }, device_types: [], regions: [], + is_configs: [], uploadShow: false, - + regions: [], rules: { device_code: [ @@ -268,6 +291,10 @@ export default { get('region').then(data => { this.regions = data.content }) + //获取是否配置 + get('is_config').then(data => { + this.is_configs = data.content + }) }) }, methods: { From fb3130e2e6dd31f2aa4e3ee16ae5fb6aeb8ba2eb Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Mon, 31 Jul 2023 11:33:15 +0800 Subject: [PATCH 3/4] =?UTF-8?q?add:=20=E8=AE=B0=E5=BD=95=E5=88=86=E6=8B=A3?= =?UTF-8?q?=E6=89=98=E7=9B=98=E5=AF=B9=E5=BA=94=E5=85=B3=E8=81=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lms/nladmin-system/doc/wms.xls | Bin 360960 -> 356864 bytes .../handler/GlobalExceptionHandler.java | 14 ++ .../FeedBackSplitPalletStationRequest.java | 48 +++++++ .../acs/service/impl/AcsToWmsServiceImpl.java | 55 ++++++-- .../PdmBdVehicleBindingController.java | 66 +++++++++ .../service/IPdmBdVehicleBindingService.java | 43 ++++++ .../service/dao/PdmBdVehicleBinding.java | 58 ++++++++ .../dao/mapper/PdmBdVehicleBindingMapper.java | 12 ++ .../dao/mapper/PdmBdVehicleBindingMapper.xml | 5 + .../service/dto/PdmBdVehicleBindingDto.java | 46 +++++++ .../service/dto/PdmBdVehicleBindingQuery.java | 12 ++ .../impl/PdmBdVehicleBindingServiceImpl.java | 67 ++++++++++ .../report/controller/ReportController.java | 8 ++ .../service/impl/SchBaseTaskServiceImpl.java | 2 +- .../task_manage/task/tasks/hn/HNMLTask.java | 20 +-- .../task/tasks/hn/mapper/HNMapper.java | 2 +- .../task/tasks/hn/mapper/HNMapper.xml | 2 +- .../task_manage/task/tasks/yz/YZQKTask.java | 4 +- .../src/views/wms/pdm/vehiclebiding/index.vue | 126 ++++++++++++++++++ .../pdm/vehiclebiding/pdmBdVehicleBinding.js | 27 ++++ 20 files changed, 596 insertions(+), 21 deletions(-) create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/wms/FeedBackSplitPalletStationRequest.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/controller/PdmBdVehicleBindingController.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/IPdmBdVehicleBindingService.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dao/PdmBdVehicleBinding.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dao/mapper/PdmBdVehicleBindingMapper.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dao/mapper/PdmBdVehicleBindingMapper.xml create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dto/PdmBdVehicleBindingDto.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dto/PdmBdVehicleBindingQuery.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/impl/PdmBdVehicleBindingServiceImpl.java create mode 100644 lms/nladmin-ui/src/views/wms/pdm/vehiclebiding/index.vue create mode 100644 lms/nladmin-ui/src/views/wms/pdm/vehiclebiding/pdmBdVehicleBinding.js diff --git a/lms/nladmin-system/doc/wms.xls b/lms/nladmin-system/doc/wms.xls index 99dc07db1f483f64c8a81856eb2cebf8e9358fca..9f3fd9ea4d8af6c9560bfe4c2b2cc245423b5db7 100644 GIT binary patch delta 15749 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 YcTQqit_>F7$XJ>Ju0qXJE`b4(eO^Fer&J86$Gv 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 handleNullPointerException(NullPointerException ex) { + // 在这里处理空指针异常 + noticeService.createNotice("异常信息:" + ex.getMessage(), "空指针异常发", + NoticeTypeEnum.EXCEPTION.getCode()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("空指针异常发生了"); + } + /** * 处理所有不可知的异常 */ diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/wms/FeedBackSplitPalletStationRequest.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/wms/FeedBackSplitPalletStationRequest.java new file mode 100644 index 0000000..0be5f70 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/wms/FeedBackSplitPalletStationRequest.java @@ -0,0 +1,48 @@ +package org.nl.wms.ext.acs.service.dto.to.wms; + +import lombok.Data; +import org.nl.wms.ext.acs.service.dto.to.BaseRequest; + +/** + * @Author: lyd + * @Description: 分拣反馈记录木托盘与钢托盘的绑定 + * @Date: 2023/7/31 + */ +@Data +public class FeedBackSplitPalletStationRequest extends BaseRequest { + + /** + * 取货点位 + */ + private String get_station; + + /** + * 放货点位 + */ + private String put_station; + + + /** + * 取货点位载具号 + */ + private String get_station_vehicle_code; + + + /** + * 放货点位载具号 + */ + private String put_station_vehicle_code; + + /** + * 取货点当前数量 + */ + private String get_station_qty; + + /** + * 放货点当前数量 + */ + private String put_station_qty; + + +} + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index f1c77e0..dbdf01a 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -18,6 +18,7 @@ import org.nl.wms.database.material.service.dao.MdBaseMaterial; import org.nl.wms.ext.acs.service.dto.*; import org.nl.wms.ext.acs.service.dto.to.acs.PutActionRequest; import org.nl.wms.ext.acs.service.dto.to.wms.ApplyTaskRequest; +import org.nl.wms.ext.acs.service.dto.to.wms.FeedBackSplitPalletStationRequest; import org.nl.wms.ext.acs.service.dto.to.wms.FeedBackTaskStatusRequest; import org.nl.wms.ext.acs.service.dto.to.wms.GetPalletizeRequest; import org.nl.wms.ext.acs.service.dto.to.BaseResponse; @@ -30,6 +31,8 @@ import org.nl.wms.pdm.record.service.dao.PdmBdRequestMaterialRecord; import org.nl.wms.pdm.residue.service.IPdmBdMaterialResidueService; import org.nl.wms.pdm.track.service.IPdmBdProductionProcessTrackingService; import org.nl.wms.pdm.track.service.dao.PdmBdProductionProcessTracking; +import org.nl.wms.pdm.vehiclebiding.service.IPdmBdVehicleBindingService; +import org.nl.wms.pdm.vehiclebiding.service.dao.PdmBdVehicleBinding; import org.nl.wms.pdm.workorder.service.IPdmBdWorkorderService; import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder; import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; @@ -96,6 +99,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { private RedissonClient redissonClient; @Autowired private IPdmBdMaterialResidueService materialResidueService; + @Autowired + private IPdmBdVehicleBindingService vehicleBindingService; @Override public BaseResponse acsApply(JSONObject param) { @@ -311,6 +316,38 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { return requestNo; } + /** 分拣 - 记录钢托与木托的绑定 */ + public BaseResponse recordVehicleBiding(JSONObject param) { + FeedBackSplitPalletStationRequest request = param.toJavaObject(FeedBackSplitPalletStationRequest.class); + String getStation = request.getGet_station(); // 取货点 + String putStation = request.getPut_station(); // 放货点 + // 查找当前点位中的信息,如果acs没有提供,就获取点位上的数据,如果点位没有,则数据失效 + SchBasePoint pickupPoint = pointService.getById(getStation); + SchBasePoint putPoint = pointService.getById(putStation); + if (request.getGet_station_vehicle_code() == null) { + request.setGet_station_vehicle_code(pickupPoint.getVehicle_code()); + } + if (request.getPut_station_vehicle_code() == null) { + request.setPut_station_vehicle_code(putPoint.getVehicle_code()); + } + // 获取工单 + PdmBdWorkorder productionTask = workorderService.getDeviceProductionTask(pickupPoint.getParent_point_code()); + // 插入数据 + PdmBdVehicleBinding vehicleBinding = new PdmBdVehicleBinding(); + vehicleBinding.setOrigin_vehicle_code(request.getGet_station_vehicle_code()); + vehicleBinding.setOrigin_vehicle_type(pickupPoint.getVehicle_type()); + vehicleBinding.setOrigin_qty(request.getGet_station_qty()); + vehicleBinding.setTarget_vehicle_code(request.getPut_station_vehicle_code()); + vehicleBinding.setTarget_vehicle_type(putPoint.getVehicle_type()); + vehicleBinding.setTarget_qty(request.getPut_station_qty()); + if (productionTask != null) { + vehicleBinding.setOrder_code(productionTask.getWorkorder_code()); + } + vehicleBindingService.create(vehicleBinding); + return BaseResponse.responseOk(request.getRequestNo()); + + } + /** 反馈压机残留重量*/ public BaseResponse applyFeedbackWeight(JSONObject param) { ApplyTaskRequest applyTaskRequest = param.toJavaObject(ApplyTaskRequest.class); @@ -351,34 +388,36 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { /** 人工排产确认 */ public BaseResponse orderVerify(JSONObject param) { // 执行中 String requestNo = param.getString("requestNo"); - String workorderId = param.getString("workorder_id"); - if (workorderId == null) { + String workorderCode = param.getString("order_code"); + if (workorderCode == null) { return BaseResponse.responseError(requestNo, "工单标识不能为空!"); } - PdmBdWorkorder bdWorkorder = workorderService.getById(workorderId); + PdmBdWorkorder bdWorkorder = workorderService.getByCode(workorderCode); if (bdWorkorder == null) { return BaseResponse.responseError(requestNo, "物料信息为空!"); } bdWorkorder.setWorkorder_status(WorkOrderStatusEnum.PRODUCING.getCode()); bdWorkorder.setRealproducestart_date(DateUtil.now()); - workorderService.update(bdWorkorder); + TaskUtils.setWorkOrderUpdateByAcs(bdWorkorder); + workorderService.updateById(bdWorkorder); return BaseResponse.responseOk(requestNo); } /** 工单完成 */ public BaseResponse orderFinish(JSONObject param) { // 完成 String requestNo = param.getString("requestNo"); - String workorderId = param.getString("workorder_id"); - if (workorderId == null) { + String workorderCode = param.getString("order_code"); + if (workorderCode == null) { return BaseResponse.responseError(requestNo, "工单标识不能为空!"); } - PdmBdWorkorder bdWorkorder = workorderService.getById(workorderId); + PdmBdWorkorder bdWorkorder = workorderService.getByCode(workorderCode); if (bdWorkorder == null) { return BaseResponse.responseError(requestNo, "物料信息为空!"); } bdWorkorder.setWorkorder_status(WorkOrderStatusEnum.COMPLETE.getCode()); bdWorkorder.setRealproduceend_date(DateUtil.now()); - workorderService.update(bdWorkorder); + TaskUtils.setWorkOrderUpdateByAcs(bdWorkorder); + workorderService.updateById(bdWorkorder); return BaseResponse.responseOk(requestNo); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/controller/PdmBdVehicleBindingController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/controller/PdmBdVehicleBindingController.java new file mode 100644 index 0000000..faefb0e --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/controller/PdmBdVehicleBindingController.java @@ -0,0 +1,66 @@ +package org.nl.wms.pdm.vehiclebiding.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.logging.annotation.Log; +import org.nl.wms.pdm.vehiclebiding.service.IPdmBdVehicleBindingService; +import org.nl.wms.pdm.vehiclebiding.service.dao.PdmBdVehicleBinding; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; +import java.util.Set; +/** +* @author lyd +* @date 2023-07-31 +**/ +@Slf4j +@RestController +@Api(tags = "分拣载具关联记录管理") +@RequestMapping("/api/pdmBdVehicleBinding") +public class PdmBdVehicleBindingController { + + @Autowired + private IPdmBdVehicleBindingService pdmBdVehicleBindingService; + + @GetMapping + @Log("查询分拣载具关联记录") + @ApiOperation("查询分拣载具关联记录") + //@SaCheckPermission("@el.check('pdmBdVehicleBinding:list')") + public ResponseEntity query(@RequestParam Map whereJson, PageQuery page){ + return new ResponseEntity<>(TableDataInfo.build(pdmBdVehicleBindingService.queryAll(whereJson,page)),HttpStatus.OK); + } + + @PostMapping + @Log("新增分拣载具关联记录") + @ApiOperation("新增分拣载具关联记录") + //@SaCheckPermission("@el.check('pdmBdVehicleBinding:add')") + public ResponseEntity create(@Validated @RequestBody PdmBdVehicleBinding entity){ + pdmBdVehicleBindingService.create(entity); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改分拣载具关联记录") + @ApiOperation("修改分拣载具关联记录") + //@SaCheckPermission("@el.check('pdmBdVehicleBinding:edit')") + public ResponseEntity update(@Validated @RequestBody PdmBdVehicleBinding entity){ + pdmBdVehicleBindingService.update(entity); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除分拣载具关联记录") + @ApiOperation("删除分拣载具关联记录") + //@SaCheckPermission("@el.check('pdmBdVehicleBinding:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + pdmBdVehicleBindingService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/IPdmBdVehicleBindingService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/IPdmBdVehicleBindingService.java new file mode 100644 index 0000000..5b93bf1 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/IPdmBdVehicleBindingService.java @@ -0,0 +1,43 @@ +package org.nl.wms.pdm.vehiclebiding.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.common.domain.query.PageQuery; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.wms.pdm.vehiclebiding.service.dao.PdmBdVehicleBinding; + +import java.util.Map; +import java.util.Set; + +/** +* @description 服务接口 +* @author lyd +* @date 2023-07-31 +**/ +public interface IPdmBdVehicleBindingService extends IService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param pageable 分页参数 + * @return IPage + */ + IPage queryAll(Map whereJson, PageQuery pageable); + + /** + * 创建 + * @param entity / + */ + void create(PdmBdVehicleBinding entity); + + /** + * 编辑 + * @param entity / + */ + void update(PdmBdVehicleBinding entity); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Set ids); +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dao/PdmBdVehicleBinding.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dao/PdmBdVehicleBinding.java new file mode 100644 index 0000000..d95462d --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dao/PdmBdVehicleBinding.java @@ -0,0 +1,58 @@ +package org.nl.wms.pdm.vehiclebiding.service.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** +* @description / +* @author lyd +* @date 2023-07-31 +**/ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("pdm_bd_vehicle_binding") +public class PdmBdVehicleBinding implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "associate_id", type = IdType.NONE) + @ApiModelProperty(value = "对应标识") + private String associate_id; + + @ApiModelProperty(value = "源载具编码") + private String origin_vehicle_code; + + @ApiModelProperty(value = "源载具类型") + private String origin_vehicle_type; + + @ApiModelProperty(value = "目标载具编码") + private String target_vehicle_code; + + @ApiModelProperty(value = "目标载具类型") + private String target_vehicle_type; + + @ApiModelProperty(value = "源当前物料数量") + private String origin_qty; + + @ApiModelProperty(value = "目标当前物料数量") + private String target_qty; + + @ApiModelProperty(value = "取货点") + private String get_station; + + @ApiModelProperty(value = "放货点") + private String put_station; + + @ApiModelProperty(value = "工单号") + private String order_code; + + @ApiModelProperty(value = "记录时间") + private String record_time; + +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dao/mapper/PdmBdVehicleBindingMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dao/mapper/PdmBdVehicleBindingMapper.java new file mode 100644 index 0000000..b3d37a9 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dao/mapper/PdmBdVehicleBindingMapper.java @@ -0,0 +1,12 @@ +package org.nl.wms.pdm.vehiclebiding.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.wms.pdm.vehiclebiding.service.dao.PdmBdVehicleBinding; + +/** +* @author lyd +* @date 2023-07-31 +**/ +public interface PdmBdVehicleBindingMapper extends BaseMapper { + +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dao/mapper/PdmBdVehicleBindingMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dao/mapper/PdmBdVehicleBindingMapper.xml new file mode 100644 index 0000000..bc73a08 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dao/mapper/PdmBdVehicleBindingMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dto/PdmBdVehicleBindingDto.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dto/PdmBdVehicleBindingDto.java new file mode 100644 index 0000000..a0808ab --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dto/PdmBdVehicleBindingDto.java @@ -0,0 +1,46 @@ +package org.nl.wms.pdm.vehiclebiding.service.dto; + +import lombok.Data; +import java.io.Serializable; + +/** +* @description / +* @author lyd +* @date 2023-07-31 +**/ +@Data +public class PdmBdVehicleBindingDto implements Serializable { + + /** 对应标识 */ + private String associate_id; + + /** 源载具编码 */ + private String origin_vehicle_code; + + /** 源载具类型 */ + private String origin_vehicle_type; + + /** 目标载具编码 */ + private String target_vehicle_code; + + /** 目标载具类型 */ + private String target_vehicle_type; + + /** 源当前物料数量 */ + private String origin_qty; + + /** 目标当前物料数量 */ + private String target_qty; + + /** 取货点 */ + private String get_station; + + /** 放货点 */ + private String put_station; + + /** 工单号 */ + private String order_code; + + /** 记录时间 */ + private String record_time; +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dto/PdmBdVehicleBindingQuery.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dto/PdmBdVehicleBindingQuery.java new file mode 100644 index 0000000..e2b5584 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/dto/PdmBdVehicleBindingQuery.java @@ -0,0 +1,12 @@ +package org.nl.wms.pdm.vehiclebiding.service.dto; + +import org.nl.common.domain.query.BaseQuery; +import org.nl.wms.pdm.vehiclebiding.service.dao.PdmBdVehicleBinding; + +/** +* @author lyd +* @date 2023-07-31 +**/ +public class PdmBdVehicleBindingQuery extends BaseQuery { + +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/impl/PdmBdVehicleBindingServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/impl/PdmBdVehicleBindingServiceImpl.java new file mode 100644 index 0000000..a615e5f --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/vehiclebiding/service/impl/PdmBdVehicleBindingServiceImpl.java @@ -0,0 +1,67 @@ +package org.nl.wms.pdm.vehiclebiding.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.SecurityUtils; +import org.nl.wms.pdm.vehiclebiding.service.IPdmBdVehicleBindingService; +import org.nl.wms.pdm.vehiclebiding.service.dao.mapper.PdmBdVehicleBindingMapper; +import org.nl.wms.pdm.vehiclebiding.service.dao.PdmBdVehicleBinding; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Map; +import java.util.Set; + +/** +* @description 服务实现 +* @author lyd +* @date 2023-07-31 +**/ +@Slf4j +@Service +public class PdmBdVehicleBindingServiceImpl extends ServiceImpl implements IPdmBdVehicleBindingService { + + @Autowired + private PdmBdVehicleBindingMapper pdmBdVehicleBindingMapper; + + @Override + public IPage queryAll(Map whereJson, PageQuery page){ + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + IPage pages = new Page<>(page.getPage() + 1, page.getSize()); + pdmBdVehicleBindingMapper.selectPage(pages, lam); + return pages; + } + + @Override + public void create(PdmBdVehicleBinding entity) { + String now = DateUtil.now(); + entity.setAssociate_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + entity.setRecord_time(now); + pdmBdVehicleBindingMapper.insert(entity); + } + + @Override + public void update(PdmBdVehicleBinding entity) { + PdmBdVehicleBinding dto = pdmBdVehicleBindingMapper.selectById(entity.getAssociate_id()); + if (dto == null) throw new BadRequestException("被删除或无权限,操作失败!"); + String now = DateUtil.now(); + entity.setRecord_time(now); + + pdmBdVehicleBindingMapper.updateById(entity); + } + + @Override + public void deleteAll(Set ids) { + // 真删除 + pdmBdVehicleBindingMapper.deleteBatchIds(ids); + } + +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/report/controller/ReportController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/report/controller/ReportController.java index 4fd8098..64f993f 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/report/controller/ReportController.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/report/controller/ReportController.java @@ -36,4 +36,12 @@ public class ReportController { // return new ResponseEntity<>(TableDataInfo.build(reportService.mudTransfer(json,page)), HttpStatus.OK); return null; } + + @PostMapping("/inventoryAlert") + @Log("库存物料提示记录表") + @ApiOperation("库存物料提示记录表") + public ResponseEntity inventoryAlert(JSONObject json, PageQuery page){ +// return new ResponseEntity<>(TableDataInfo.build(reportService.inventoryAlert(json,page)), HttpStatus.OK); + return null; + } } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java index e86f792..b11ed3c 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java @@ -210,7 +210,7 @@ public class SchBaseTaskServiceImpl extends ServiceImpl= Integer.parseInt(TaskStatus.FINISHED.getCode())) { throw new BadRequestException("任务已完成或已取消!"); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNMLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNMLTask.java index 4d34732..d76e795 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNMLTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNMLTask.java @@ -124,7 +124,7 @@ public class HNMLTask extends AbstractTask { task.setRemark(""); task.setVehicle_type(GeneralDefinition.MATERIAL_CUP); // 告知acs去左边右边 - String deviceCode = point.getDevice_code(); + String deviceCode = point.getParent_point_code(); int number = Integer.parseInt(deviceCode.replaceAll("[^0-9]", "")); // 1左边2右边 number = (number % 2) == 0 ? 2 : (number % 2); @@ -136,7 +136,7 @@ public class HNMLTask extends AbstractTask { pointService.updateById(point); //下发 - this.renotifyAcs(task); +// this.renotifyAcs(task); } } @@ -152,15 +152,13 @@ public class HNMLTask extends AbstractTask { // *: 混碾无工单 String materialCode = requestParam.getString("material_code"); // 混碾编码 Assert.notNull(materialCode, "物料编码不能为空!"); - MdBaseMaterial baseMaterialObj = materialService.findByCode(materialCode); - Assert.notNull(baseMaterialObj, "物料: " + materialCode + "未找到!"); // 根据工单物料标识寻找点位 - List points = hnMapper.findPointForHNMLAndWorkOrder(nextRegionStr, baseMaterialObj.getMaterial_id()); + List points = hnMapper.findPointForHNMLAndWorkOrder(nextRegionStr, materialCode); return ObjectUtil.isNotEmpty(points) ? points.get(0) : null; } @Override - public void forceFinish(String task_code) { + public void forceFinish(String task_code) { // 人工完成任务 SchBaseTask taskObj = taskService.getByCode(task_code); if (ObjectUtil.isEmpty(taskObj)) { throw new BadRequestException("该任务不存在"); @@ -169,12 +167,13 @@ public class HNMLTask extends AbstractTask { } @Override - public void cancel(String task_code) { + 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); + // todo: 通知acs取消任务 } public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { @@ -211,6 +210,10 @@ public class HNMLTask extends AbstractTask { // 找到父点位 SchBasePoint serviceOne = pointService.getOne(new LambdaQueryWrapper() .eq(SchBasePoint::getPoint_code, parentPointCode)); + // 父点位(设备)需要切换成非空状态 + PointUtils.setUpdateByType(serviceOne, taskFinishedType); + serviceOne.setPoint_status(PointStatusEnum.FULL_POINT.getCode()); + pointService.updateById(serviceOne); // 找压机工单 PdmBdWorkorder one = workorderService.getOne(new LambdaQueryWrapper() .eq(serviceOne != null, PdmBdWorkorder::getPoint_code, serviceOne.getPoint_code()) @@ -270,7 +273,7 @@ public class HNMLTask extends AbstractTask { String vehicleType = param.getString("vehicle_type"); // 泥料物料对应不出物料标识 String materialCode = param.getString("material_code"); // 泥料编码 - String mixTimes = param.getString("bag_number"); // 碾次 + String mixTimes = param.getString("mix_times"); // 碾次 // 载具类型默认料盅 if (vehicleType == null) { vehicleType = GeneralDefinition.MATERIAL_CUP; @@ -292,6 +295,7 @@ public class HNMLTask extends AbstractTask { // 要把数据存到组盘表 SchBaseVehiclematerialgroup groupEntity = new SchBaseVehiclematerialgroup(); groupEntity.setGroup_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + groupEntity.setMaterial_id("-"); groupEntity.setRedundance_material_code(materialCode); groupEntity.setCreate_id(GeneralDefinition.ACS_ID); groupEntity.setCreate_name(GeneralDefinition.ACS_NAME); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.java index 149d8b3..d0e4f78 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.java @@ -13,5 +13,5 @@ import java.util.List; */ public interface HNMapper extends BaseMapper { List findPointForHNML(List regionCode, String materialId); - List findPointForHNMLAndWorkOrder(List regionCode, String materialId); + List findPointForHNMLAndWorkOrder(List regionCode, String materialCode); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.xml index 3376f3e..374e787 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.xml +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.xml @@ -33,7 +33,7 @@ AND p.parent_point_code LIKE CONCAT('%', (SELECT p2.point_code FROM sch_base_point p2 WHERE p2.point_code IN ( - SELECT w.point_code FROM pdm_bd_workorder w WHERE w.material_id = #{materialId} AND w.workorder_status = '3' + SELECT w.point_code FROM pdm_bd_workorder w WHERE w.raw_material_code = #{materialCode} AND w.workorder_status = '3' ) AND p2.point_status = '1' ORDER BY p2.update_time LIMIT 1), '%') diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZQKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZQKTask.java index d85a7d7..c20e0c0 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZQKTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZQKTask.java @@ -159,10 +159,10 @@ public class YZQKTask extends AbstractTask { PointUtils.setUpdateByType(startPointObj, taskFinishedType); PointUtils.clearPoint(startPointObj); endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode()); - endPointObj.setVehicle_type("2"); + endPointObj.setVehicle_type(GeneralDefinition.STEEL_TRAY); endPointObj.setVehicle_qty(1); PointUtils.setUpdateByType(endPointObj, taskFinishedType); - pointService.update(endPointObj); + pointService.updateById(endPointObj); } // 任务完成 taskObj.setTask_status(TaskStatus.FINISHED.getCode()); diff --git a/lms/nladmin-ui/src/views/wms/pdm/vehiclebiding/index.vue b/lms/nladmin-ui/src/views/wms/pdm/vehiclebiding/index.vue new file mode 100644 index 0000000..7cf04f9 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/pdm/vehiclebiding/index.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/pdm/vehiclebiding/pdmBdVehicleBinding.js b/lms/nladmin-ui/src/views/wms/pdm/vehiclebiding/pdmBdVehicleBinding.js new file mode 100644 index 0000000..2bff8e8 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/pdm/vehiclebiding/pdmBdVehicleBinding.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/pdmBdVehicleBinding', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/pdmBdVehicleBinding/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/pdmBdVehicleBinding', + method: 'put', + data + }) +} + +export default { add, edit, del } From d2c3a0d9aba81579541933fbe1f786819bedb063 Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Mon, 31 Jul 2023 16:33:31 +0800 Subject: [PATCH 4/4] =?UTF-8?q?add:=20=E4=B8=8B=E5=8F=91=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=9C=A8=E6=89=98=E7=9B=98=E4=BF=A1=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lms/nladmin-system/doc/wms.xls | Bin 356864 -> 320512 bytes .../wms/ext/acs/service/WmsToAcsService.java | 9 +++++ .../acs/service/impl/WmsToAcsServiceImpl.java | 18 +++++++++ .../task_manage/task/tasks/fj/FJMKTask.java | 10 ++++- .../task_manage/task/tasks/fj/FJQKTask.java | 14 +++++-- .../task_manage/task/tasks/hn/HNMLTask.java | 16 ++++---- .../task/tasks/hn/mapper/HNMapper.xml | 36 +++++++++++------- .../task_manage/task/tasks/yz/YZSKTask.java | 2 +- .../java/org/nl/wms/util/CommonUtils.java | 22 +++++++++++ 9 files changed, 100 insertions(+), 27 deletions(-) diff --git a/lms/nladmin-system/doc/wms.xls b/lms/nladmin-system/doc/wms.xls index 9f3fd9ea4d8af6c9560bfe4c2b2cc245423b5db7..a27399d4974f627916857cab7bd1789790bf09dd 100644 GIT binary patch delta 18733 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 delta 50116 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

1<&1y3rX+q|W`7=usP`4|@bfXRnne+Imc| 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 list); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java index 75d467f..0db6851 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.http.HttpStatus; import lombok.extern.slf4j.Slf4j; import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.ext.acs.service.dto.ResultForAcs; +import org.nl.wms.ext.acs.service.dto.to.acs.PutActionRequest; import org.nl.wms.ext.record.service.ISysInteractRecordService; import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder; import org.nl.wms.sch.task_manage.GeneralDefinition; @@ -43,4 +44,21 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { interactRecordService.saveRecord(workorder, resultForAcs, GeneralDefinition.LMS_ACS); return resultForAcs; } + + @Override + public ResultForAcs getVehicleForLaminatingMachine(List list) { + String api = "api/wms/order"; // todo: ??? + ResultForAcs resultForAcs = ResultForAcs.requestOk(); + try { + resultForAcs = AcsUtil.notifyAcs(api, list); + } catch (Exception e) { + log.error(api + ": {}", e.getMessage()); + resultForAcs.setTimestamp(DateUtil.now()); + resultForAcs.setStatus(HttpStatus.HTTP_BAD_REQUEST); + resultForAcs.setMessage(e.getMessage()); + } + // 记录日志 +// interactRecordService.saveRecord(workorder, resultForAcs, GeneralDefinition.LMS_ACS); + return resultForAcs; + } } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJMKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJMKTask.java index f8d2c09..42c22ce 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJMKTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJMKTask.java @@ -7,7 +7,9 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.CodeUtil; +import org.nl.config.MapOf; import org.nl.system.service.notice.ISysNoticeService; +import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.pdm.workorder.service.IPdmBdWorkorderService; import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder; import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; @@ -24,6 +26,7 @@ import org.nl.wms.sch.task_manage.enums.*; import org.nl.wms.sch.task_manage.task.TaskType; import org.nl.wms.sch.task_manage.task.core.TaskStatus; import org.nl.wms.sch.task_manage.task.tasks.fj.mapper.FJMapper; +import org.nl.wms.util.CommonUtils; import org.nl.wms.util.PointUtils; import org.nl.wms.util.TaskUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -57,6 +60,8 @@ public class FJMKTask extends AbstractTask { private FJMapper fjMapper; @Autowired private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + @Autowired + private WmsToAcsService wmsToAcsService; @Override protected void create() throws BadRequestException { // 获取任务 @@ -205,7 +210,10 @@ public class FJMKTask extends AbstractTask { // 向ACS请求所需木托盘在那个栈拆盘机?已经实时更新,故只需要自己查询即可 SchBasePoint endPointObj = fjMapper.findPointForFJQK(startRegionStr, new JSONObject() .fluentPut("vehicleType", vehicleType).fluentPut("pointType", GeneralDefinition.DEVICE_POINT)); - // todo: 请求ACS释放一个木托盘 + // 请求ACS释放一个木托盘 + List list = CommonUtils.requestAcsReleaseVehicle(MapOf.of("to_command", "1"), + endPointObj.getDevice_code()); + wmsToAcsService.getVehicleForLaminatingMachine(list); // 这个点的父点位为起点 return ObjectUtil.isNotEmpty(endPointObj) ? endPointObj : null; } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQKTask.java index 1df8f2d..6aa55c4 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQKTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/fj/FJQKTask.java @@ -5,7 +5,9 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.CodeUtil; +import org.nl.config.MapOf; import org.nl.system.service.notice.ISysNoticeService; +import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.ext.acs.service.dto.SignalData; import org.nl.wms.ext.acs.service.dto.to.BaseRequest; import org.nl.wms.ext.acs.service.dto.to.acs.PutActionRequest; @@ -26,6 +28,7 @@ import org.nl.wms.sch.task_manage.task.AcsUtil; import org.nl.wms.sch.task_manage.task.TaskType; import org.nl.wms.sch.task_manage.task.core.TaskStatus; import org.nl.wms.sch.task_manage.task.tasks.fj.mapper.FJMapper; +import org.nl.wms.util.CommonUtils; import org.nl.wms.util.PointUtils; import org.nl.wms.util.TaskUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -53,10 +56,11 @@ public class FJQKTask extends AbstractTask { private ISchBaseTaskconfigService taskConfigService; @Autowired private IPdmBdWorkorderService workorderService; - @Autowired private ISysNoticeService noticeService; @Autowired + private WmsToAcsService wmsToAcsService; + @Autowired private FJMapper fjMapper; @Override protected void create() throws BadRequestException { @@ -124,14 +128,18 @@ public class FJQKTask extends AbstractTask { // 向ACS请求所需木托盘在那个栈拆盘机?已经实时更新,故只需要自己查询即可 SchBasePoint endPointObj = fjMapper.findPointForFJQK(startRegionStr, new JSONObject() .fluentPut("vehicleType", vehicleType).fluentPut("pointType", GeneralDefinition.DEVICE_POINT)); - // todo: 请求ACS释放一个木托盘 + // 请求ACS释放一个木托盘 + List list = CommonUtils.requestAcsReleaseVehicle(MapOf.of("to_command", "1"), + endPointObj.getDevice_code()); // SignalData signalData = SignalData.buildSignalData("to_command", "1"); // List signalList = new ArrayList<>(); // signalList.add(signalData); // PutActionRequest putActionRequest = (PutActionRequest) BaseRequest.createRequest(); // putActionRequest.setDevice_code(endPointObj.getDevice_code()); // putActionRequest.setList(signalList); -// AcsUtil.notifyAcs("", putActionRequest); +// List list = new ArrayList<>(); +// list.add(putActionRequest); + wmsToAcsService.getVehicleForLaminatingMachine(list); // 这个点的父点位为起点 return ObjectUtil.isNotEmpty(endPointObj) ? endPointObj : null; } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNMLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNMLTask.java index d76e795..52aa2f7 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNMLTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNMLTask.java @@ -124,7 +124,7 @@ public class HNMLTask extends AbstractTask { task.setRemark(""); task.setVehicle_type(GeneralDefinition.MATERIAL_CUP); // 告知acs去左边右边 - String deviceCode = point.getParent_point_code(); + String deviceCode = point.getDevice_code(); // 获取设备编码 int number = Integer.parseInt(deviceCode.replaceAll("[^0-9]", "")); // 1左边2右边 number = (number % 2) == 0 ? 2 : (number % 2); @@ -136,7 +136,7 @@ public class HNMLTask extends AbstractTask { pointService.updateById(point); //下发 -// this.renotifyAcs(task); + this.renotifyAcs(task); } } @@ -234,11 +234,11 @@ public class HNMLTask extends AbstractTask { } } // 更新组盘数据 - groupEntity.setGroup_bind_material_status(GroupBindMaterialStatusEnum.BOUND.getValue()); + groupEntity.setGroup_bind_material_status(GroupBindMaterialStatusEnum.UNBOUND.getValue()); TaskUtils.setGroupUpdateByType(groupEntity, taskFinishedType); vehiclematerialgroupService.updateById(groupEntity); - // 起点清空 - PointUtils.clearPoint(startPointObj); + // 起点清空 - 由ACS请求修改 +// PointUtils.clearPoint(startPointObj); taskObj.setRemark("任务完成"); taskObj.setTask_status(TaskStatus.FINISHED.getCode()); taskObj.setFinished_type(taskFinishedType.getCode()); @@ -273,7 +273,7 @@ public class HNMLTask extends AbstractTask { String vehicleType = param.getString("vehicle_type"); // 泥料物料对应不出物料标识 String materialCode = param.getString("material_code"); // 泥料编码 - String mixTimes = param.getString("mix_times"); // 碾次 + String mixTimes = param.getString("grinding_number"); // 碾次 // 载具类型默认料盅 if (vehicleType == null) { vehicleType = GeneralDefinition.MATERIAL_CUP; @@ -288,7 +288,7 @@ public class HNMLTask extends AbstractTask { } // 找到相同组盘信息就直接返回id,避免任务取消组盘信息还存在,重复插入 SchBaseVehiclematerialgroup groupObject = vehiclematerialgroupService.getGroupInfo(vehicleCode, vehicleType, - GroupBindMaterialStatusEnum.WAIT_BIND.getValue()); + GroupBindMaterialStatusEnum.BOUND.getValue()); if (groupObject != null) { return groupObject.getGroup_id(); } @@ -311,7 +311,7 @@ public class HNMLTask extends AbstractTask { groupEntity.setMaterial_weight(ObjectUtil.isNotEmpty(weight)// 重量 ? weight : BigDecimal.valueOf(0)); - groupEntity.setGroup_bind_material_status(GroupBindMaterialStatusEnum.WAIT_BIND.getValue()); // 待绑定 + groupEntity.setGroup_bind_material_status(GroupBindMaterialStatusEnum.BOUND.getValue()); // 待绑定 groupEntity.setGroup_status(GroupStatusEnum.IN_STORAGE.getType()); // 暂时不维护。 groupEntity.setIs_delete(false); vehiclematerialgroupService.save(groupEntity); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.xml index 374e787..04536bf 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.xml +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.xml @@ -23,23 +23,31 @@ diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZSKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZSKTask.java index a789a25..c75fdf9 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZSKTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZSKTask.java @@ -33,7 +33,7 @@ import java.util.stream.Collectors; /** * @Author: lyd - * @Description: 压制送空载具任务 x + * @Description: 压制送空盅任务 * @Date: 2023/5/25 */ @Component diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/CommonUtils.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/CommonUtils.java index 2939914..3eaadb8 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/CommonUtils.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/CommonUtils.java @@ -2,10 +2,18 @@ package org.nl.wms.util; import com.alibaba.fastjson.JSONObject; import org.nl.wms.ext.acs.service.dto.PalletizeDto; +import org.nl.wms.ext.acs.service.dto.SignalData; +import org.nl.wms.ext.acs.service.dto.to.BaseRequest; +import org.nl.wms.ext.acs.service.dto.to.acs.PutActionRequest; import java.time.Duration; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; /** * @Author: lyd @@ -33,4 +41,18 @@ public class CommonUtils { return jsonObject.toJavaObject(clazz); } + // 请求ACS释放一个木托盘 + public static List requestAcsReleaseVehicle(HashMap map, String deviceCode) { + List list = new CopyOnWriteArrayList<>(); + PutActionRequest putActionRequest = (PutActionRequest) BaseRequest.createRequest(); + putActionRequest.setDevice_code(deviceCode); + List signalList = new CopyOnWriteArrayList<>(); + for (Map.Entry entry : map.entrySet()) { + SignalData signalData = SignalData.buildSignalData(entry.getKey(), entry.getValue()); + signalList.add(signalData); + } + putActionRequest.setList(signalList); + list.add(putActionRequest); + return list; + } }