From a38aec3e88ad5caceb7cba9f8b366092ac6a4325 Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Wed, 12 Jul 2023 08:36:29 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E4=B8=8Emes=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/nl/wms/autotask/FeedbackMes.java | 30 +++ .../acs/service/impl/AcsToWmsServiceImpl.java | 2 + .../mes/rest/FeedbackRecordController.java | 77 ++++++++ .../wms/ext/mes/rest/MesToWmsController.java | 14 ++ .../mes/service/FeedbackRecordService.java | 79 ++++++++ .../wms/ext/mes/service/MesToWmsService.java | 4 + .../mes/service/dto/FeedbackRecordDto.java | 54 ++++++ .../impl/FeedbackRecordServiceImpl.java | 127 +++++++++++++ .../mes/service/impl/MesToWmsServiceImpl.java | 76 +++++++- .../wms/ext/wql/QUERY_MES_FEEDBACK_RECORD.wql | 58 ++++++ .../nl/wms/pdm/service/dto/WorkorderDto.java | 3 + .../service/impl/WorkorderServiceImpl.java | 2 +- .../org/nl/wms/pdm/wql/MPS_PRODUCEDURE001.wql | 5 +- .../src/main/java/org/nl/wms/sch/MesUtil.java | 76 +++++++- .../org/nl/wms/sch/service/dto/PointDto.java | 3 + .../sch/service/impl/PointServiceImpl.java | 2 + .../tasks/autoTask/DPJCallVehicleTask.java | 2 +- .../callMaterial/YqxCallMaterialTask.java | 15 +- .../wql/QSCH_yqxCallMAterial_01.wql | 21 +-- .../sendMaterial/GjxSendMaterialTask.java | 4 +- .../src/main/java/org/nl/wms/wms.xls | Bin 303616 -> 269824 bytes lms/nladmin-ui/src/api/feedbackRecord.js | 35 ++++ .../src/views/system/record/index.vue | 178 ++++++++++++++++++ .../src/views/wms/pdm/workerorder/index.vue | 14 +- .../src/views/wms/sch/point/index.vue | 7 +- 25 files changed, 854 insertions(+), 34 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/autotask/FeedbackMes.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/FeedbackRecordController.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/FeedbackRecordService.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/dto/FeedbackRecordDto.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/FeedbackRecordServiceImpl.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/ext/wql/QUERY_MES_FEEDBACK_RECORD.wql create mode 100644 lms/nladmin-ui/src/api/feedbackRecord.js create mode 100644 lms/nladmin-ui/src/views/system/record/index.vue diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/autotask/FeedbackMes.java b/lms/nladmin-system/src/main/java/org/nl/wms/autotask/FeedbackMes.java new file mode 100644 index 0000000..780f3d2 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/autotask/FeedbackMes.java @@ -0,0 +1,30 @@ +package org.nl.wms.autotask; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.MesUtil; +import org.springframework.stereotype.Component; + +/** + * @Author: lyd + * @Description: 反馈mes + * @Date: 2023/7/6 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class FeedbackMes { + public void run(){ + WQLObject feedbackRecord = WQLObject.getWQLObject("mes_feedback_record"); + // 获取未反馈完成的数据 + JSONArray array = feedbackRecord.query("is_success = '0'").getResultJSONArray(0); + for (int i = 0; i < array.size(); i++) { + JSONObject record = array.getJSONObject(i); + // 重发 + MesUtil.retransmission(record); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index d8782be..ca55666 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -222,6 +222,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { param.put("vehicle_code", vehicle_code); param.put("task_code", whereJson.getString("task_code")); param.put("workorder_code", whereJson.getString("workorder_code")); + param.put("container_id", whereJson.getString("container_id")); GjxSendMaterialTask taskBean = SpringContextHolder.getBean(GjxSendMaterialTask.class); String task_id = taskBean.createTask(param); // 创建任务 @@ -245,6 +246,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { param.put("vehicle_code", vehicle_code); param.put("material_num", material_num); param.put("material_code", whereJson.getString("material_code")); + param.put("container_id", whereJson.getString("container_id")); param.put("task_code", whereJson.getString("task_code")); // 创建任务 YqxCallMaterialTask taskBean = SpringContextHolder.getBean(YqxCallMaterialTask.class); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/FeedbackRecordController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/FeedbackRecordController.java new file mode 100644 index 0000000..1bda799 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/FeedbackRecordController.java @@ -0,0 +1,77 @@ + +package org.nl.wms.ext.mes.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.ext.mes.service.FeedbackRecordService; +import org.nl.wms.ext.mes.service.dto.FeedbackRecordDto; +import org.springframework.data.domain.Pageable; +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; + +/** +* @author lyd +* @date 2023-07-06 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "mes对接信息记录管理") +@RequestMapping("/api/feedbackRecord") +@Slf4j +public class FeedbackRecordController { + + private final FeedbackRecordService feedbackRecordService; + + @GetMapping + @Log("查询mes对接信息记录") + @ApiOperation("查询mes对接信息记录") + //@SaCheckPermission("@el.check('feedbackRecord:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(feedbackRecordService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增mes对接信息记录") + @ApiOperation("新增mes对接信息记录") + //@SaCheckPermission("@el.check('feedbackRecord:add')") + public ResponseEntity create(@Validated @RequestBody FeedbackRecordDto dto){ + feedbackRecordService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改mes对接信息记录") + @ApiOperation("修改mes对接信息记录") + //@SaCheckPermission("@el.check('feedbackRecord:edit')") + public ResponseEntity update(@Validated @RequestBody FeedbackRecordDto dto){ + feedbackRecordService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除mes对接信息记录") + @ApiOperation("删除mes对接信息记录") + //@SaCheckPermission("@el.check('feedbackRecord:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody String[] ids) { + feedbackRecordService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/retransmission") + @Log("重发") + @ApiOperation("重发") + //@SaCheckPermission("@el.check('feedbackRecord:add')") + public ResponseEntity retransmission(@RequestBody JSONObject row){ + feedbackRecordService.retransmission(row); + return new ResponseEntity<>(HttpStatus.CREATED); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToWmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToWmsController.java index ff51ee4..baecf88 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToWmsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToWmsController.java @@ -83,5 +83,19 @@ public class MesToWmsController { public ResponseEntity releaseCpPointArea(@RequestBody JSONObject param) { return new ResponseEntity<>(mesToWmsService.releaseCpPointArea(param), HttpStatus.OK); } + @PostMapping("/outboundReport") + @Log("出库上报") + @ApiOperation("出库上报") + @SaIgnore + public ResponseEntity outboundReport(@RequestBody JSONObject param) { + return new ResponseEntity<>(mesToWmsService.outboundReport(param), HttpStatus.OK); + } + @PostMapping("/inboundReport") + @Log("入库上报") + @ApiOperation("入库上报") + @SaIgnore + public ResponseEntity inboundReport(@RequestBody JSONObject param) { + return new ResponseEntity<>(mesToWmsService.inboundReport(param), HttpStatus.OK); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/FeedbackRecordService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/FeedbackRecordService.java new file mode 100644 index 0000000..9f543ab --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/FeedbackRecordService.java @@ -0,0 +1,79 @@ +package org.nl.wms.ext.mes.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.ext.mes.service.dto.FeedbackRecordDto; +import org.springframework.data.domain.Pageable; + +import java.util.Map; +import java.util.List; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; + +/** + * @author lyd + * @description 服务接口 + * @date 2023-07-06 + **/ +public interface FeedbackRecordService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * + * @param feedback_id ID + * @return FeedbackRecord + */ + FeedbackRecordDto findById(String feedback_id); + + /** + * 根据编码查询 + * + * @param code code + * @return FeedbackRecord + */ + FeedbackRecordDto findByCode(String code); + + + /** + * 创建 + * + * @param dto / + */ + void create(FeedbackRecordDto dto); + + /** + * 编辑 + * + * @param dto / + */ + void update(FeedbackRecordDto dto); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(String[] ids); + + /** + * 重发 + * @param row + */ + void retransmission(JSONObject row); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToWmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToWmsService.java index 434ef13..53a6d67 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToWmsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToWmsService.java @@ -25,4 +25,8 @@ public interface MesToWmsService { JSONObject finishMaterialOut(JSONObject param); JSONObject releaseCpPointArea(JSONObject param); + + JSONObject outboundReport(JSONObject param); + + JSONObject inboundReport(JSONObject param); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/dto/FeedbackRecordDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/dto/FeedbackRecordDto.java new file mode 100644 index 0000000..b479637 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/dto/FeedbackRecordDto.java @@ -0,0 +1,54 @@ +package org.nl.wms.ext.mes.service.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author lyd + * @description / + * @date 2023-07-06 + **/ +@Data +public class FeedbackRecordDto implements Serializable { + + /** + * 反馈标识 + */ + private String feedback_id; + + /** + * 反馈编码 + */ + private String feedback_code; + + /** + * 相应编码 + */ + private String code; + + /** + * 响应信息 + */ + private String message; + + /** + * 请求报文 + */ + private String request_param; + + /** + * 响应结果 + */ + private String response_param; + + /** + * 是否成功 + */ + private String is_success; + + /** + * 记录时间 + */ + private String record_time; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/FeedbackRecordServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/FeedbackRecordServiceImpl.java new file mode 100644 index 0000000..e80b4ad --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/FeedbackRecordServiceImpl.java @@ -0,0 +1,127 @@ + +package org.nl.wms.ext.mes.service.impl; + + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.config.MapOf; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.core.engine.object.WO; +import org.nl.modules.wql.util.WqlUtil; +import org.nl.wms.ext.mes.service.FeedbackRecordService; +import org.nl.wms.ext.mes.service.dto.FeedbackRecordDto; +import org.nl.wms.sch.MesUtil; +import org.slf4j.MDC; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +/** + * @author lyd + * @description 服务实现 + * @date 2023-07-06 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class FeedbackRecordServiceImpl implements FeedbackRecordService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String feedback_code = ObjectUtil.isNotEmpty(whereJson.get("feedback_code")) + ? whereJson.get("feedback_code").toString() + : null; + String is_success = ObjectUtil.isNotEmpty(whereJson.get("is_success")) + ? whereJson.get("is_success").toString() + : null; + WO queryMesFeedbackRecord = WQL.getWO("QUERY_MES_FEEDBACK_RECORD"); + JSONObject jsonObject = queryMesFeedbackRecord + .addParamMap(MapOf.of("flag", "1", "feedback_code", feedback_code, "is_success", is_success)) + .pageQuery(WqlUtil.getHttpContext(page), "record_time DESC"); + return jsonObject; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("mes_feedback_record"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(FeedbackRecordDto.class); + return null; + } + + @Override + public FeedbackRecordDto findById(String feedback_id) { + WQLObject wo = WQLObject.getWQLObject("mes_feedback_record"); + JSONObject json = wo.query("feedback_id = '" + feedback_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(FeedbackRecordDto.class); + } + return null; + } + + @Override + public FeedbackRecordDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("mes_feedback_record"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(FeedbackRecordDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(FeedbackRecordDto dto) { + + WQLObject wo = WQLObject.getWQLObject("mes_feedback_record"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(FeedbackRecordDto dto) { + FeedbackRecordDto entity = this.findById(dto.getFeedback_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + WQLObject wo = WQLObject.getWQLObject("mes_feedback_record"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(String[] ids) { + WQLObject wo = WQLObject.getWQLObject("mes_feedback_record"); + for (String feedback_id : ids) { + wo.delete("feedback_id = '" + feedback_id + "'"); + } + } + + @Override + public void retransmission(JSONObject row) { + MDC.put("log_file_type", "WMS手动重发反馈给MES"); + WQLObject wo = WQLObject.getWQLObject("mes_feedback_record"); + JSONObject feedbackCode = wo.query("feedback_code = '" + row.getString("feedback_code") + "'") + .uniqueResult(0); + if (ObjectUtil.isEmpty(feedbackCode)) { + throw new BadRequestException("反馈数据不存在!"); + } +// if (feedbackCode.getString("is_success").equals("1")) { +// throw new BadRequestException("任务号:" + feedbackCode.getString("feedback_code") + " 已经反馈成功!"); +// } + // 重发反馈 + MesUtil.retransmission(row); + MDC.remove("log_file_type"); + } + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToWmsServiceImpl.java index ca7fa74..e78b2e0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToWmsServiceImpl.java @@ -3,7 +3,6 @@ package org.nl.wms.ext.mes.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -44,6 +43,9 @@ public class MesToWmsServiceImpl implements MesToWmsService { throw new BadRequestException("工单不能为空"); } JSONObject materialCode = materialTab.query("material_code = '" + param.getString("material_code") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(materialCode)) { + throw new BadRequestException("物料为空,请同步物料!"); + } JSONObject deviceCode = deviceTab.query("extend_code = '" + param.getString("device_code") + "'").uniqueResult(0); if (ObjectUtil.isEmpty(deviceCode)) { throw new BadRequestException("设备编码错误!"); @@ -82,7 +84,7 @@ public class MesToWmsServiceImpl implements MesToWmsService { // param.put("workorder_id", IdUtil.getSnowflake(1,1).nextIdStr()); // param.put("device_id", "1654663217064054784"); // param.put("device_code", deviceCodeKX); - workOrderTab.insert(param); +// workOrderTab.insert(param); String deviceCodeWX = deviceCode.getString("device_code") + "WX"; String deviceCodeKS = deviceCode.getString("device_code") + "KS"; String deviceCodeKX = deviceCode.getString("device_code") + "KX"; @@ -281,4 +283,74 @@ public class MesToWmsServiceImpl implements MesToWmsService { result.put("message", "操作成功"); return result; } + + @Override + public JSONObject outboundReport(JSONObject param) { + MDC.put("log_file_type", "MES人工出库"); + String pointCode = param.getString("point_code"); + log.info("出库点位:{}", pointCode); + // 清空点位 + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + JSONObject pointObj = pointTable.query("point_code = '" + pointCode + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(pointObj)) { + throw new BadRequestException("货位号不能为空!"); + } + pointObj.put("lock_type", "1"); + pointObj.put("point_status", "1"); + pointObj.put("vehicle_type", ""); + pointObj.put("vehicle_code", ""); + pointObj.put("vehicle_qty", "0"); + pointObj.put("container_id", ""); + pointObj.put("material_id", ""); + pointObj.put("pcsn", ""); + pointObj.put("ivt_qty", ""); + pointObj.put("instorage_time", ""); + pointObj.put("update_optid", "3"); + pointObj.put("update_optname", "MES系统"); + pointObj.put("update_time", DateUtil.now()); + pointTable.update(pointObj); + JSONObject result = new JSONObject(); + result.put("status", 200); + result.put("message", "操作成功"); + MDC.remove("log_file_type"); + return result; + } + + @Override + public JSONObject inboundReport(JSONObject param) { + MDC.put("log_file_type", "MES人工入库"); + log.info("入库参数:{}", param); + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); // 点位 + WQLObject materialTable = WQLObject.getWQLObject("md_me_materialbase"); // 点位 + String materialCode = param.getString("material_code"); + String pointCode = param.getString("point_code"); + if (ObjectUtil.isEmpty(materialCode)) { + throw new BadRequestException("物料编码不能为空!"); + } + if (ObjectUtil.isEmpty(pointCode)) { + throw new BadRequestException("货位编码不能为空!"); + } + JSONObject materialObj = materialTable.query("material_code = '" + materialCode + "'") + .uniqueResult(0); + JSONObject pointObj = pointTable.query("point_code = '" + pointCode + "'") + .uniqueResult(0); + pointObj.put("lock_type", "1"); + pointObj.put("point_status", "3"); + pointObj.put("vehicle_type", param.getString("vehicle_type")); + pointObj.put("vehicle_code", param.getString("vehicle_code")); + pointObj.put("vehicle_qty", "1"); + pointObj.put("container_id", param.getString("container_id")); + pointObj.put("material_id", materialObj.getString("material_id")); + pointObj.put("ivt_qty", param.getString("qty")); + pointObj.put("instorage_time", DateUtil.now()); + pointObj.put("update_optid", "3"); + pointObj.put("update_optname", "MES系统"); + pointObj.put("update_time", DateUtil.now()); + pointTable.update(pointObj); + JSONObject result = new JSONObject(); + result.put("status", 200); + result.put("message", "操作成功"); + MDC.remove("log_file_type"); + return result; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/wql/QUERY_MES_FEEDBACK_RECORD.wql b/lms/nladmin-system/src/main/java/org/nl/wms/ext/wql/QUERY_MES_FEEDBACK_RECORD.wql new file mode 100644 index 0000000..329b7da --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/wql/QUERY_MES_FEEDBACK_RECORD.wql @@ -0,0 +1,58 @@ +[交易说明] + 交易名: 反馈记录表 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.feedback_code TYPEAS s_string + 输入.is_success TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + IF 输入.flag = "1" + QUERY + SELECT + * + FROM + mes_feedback_record + WHERE + 1 = 1 + OPTION 输入.feedback_code <> "" + feedback_code like "%" 输入.feedback_code "%" + ENDOPTION + OPTION 输入.is_success <> "" + is_success = 输入.is_success + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/WorkorderDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/WorkorderDto.java index d864d69..cba041d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/WorkorderDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/WorkorderDto.java @@ -31,6 +31,9 @@ public class WorkorderDto implements Serializable { /** 物料标识 */ private Long material_id; + /** 货柜id */ + private String container_id; + /** 载具类型 */ private String vehicle_type; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java index 442100b..c092338 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java @@ -396,7 +396,7 @@ public class WorkorderServiceImpl implements WorkordeService { row.put("update_time", now); row.put("order_status", "5"); workorderTab.update(row); - if (deviceCode.equals("YQX01WX") || deviceCode.equals("YQX01KS")) { + if (deviceCode.equals("YQX01WX") || deviceCode.equals("YQX01KS") || deviceCode.equals("YQX01KX")) { JSONObject jsonObject = workOrderCacheTab.query("device_code = '" + deviceCode + "'", "update_time").uniqueResult(0); if (ObjectUtil.isEmpty(jsonObject)) { // 找不到就推出 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/MPS_PRODUCEDURE001.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/MPS_PRODUCEDURE001.wql index 634533b..926b8ab 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/MPS_PRODUCEDURE001.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/MPS_PRODUCEDURE001.wql @@ -88,13 +88,14 @@ ShiftOrder.produce_date <= 输入.end_time ENDOPTION OPTION 输入.produceorder_code <> "" - ShiftOrder.produceorder_code like 输入.produceorder_code + ShiftOrder.workorder_code like 输入.produceorder_code ENDOPTION OPTION 输入.material <> "" ( material.material_code like 输入.material or material.material_name like 输入.material or - material.material_spec like 输入.material + material.material_spec like 输入.material or + ShiftOrder.container_id like 输入.material ) ENDOPTION ENDSELECT diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/MesUtil.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/MesUtil.java index 7202913..1a8348b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/MesUtil.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/MesUtil.java @@ -1,5 +1,7 @@ package org.nl.wms.sch; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; @@ -13,7 +15,9 @@ import org.apache.http.impl.client.HttpClientBuilder; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; +import org.nl.modules.wql.core.bean.WQLObject; import org.slf4j.MDC; +import org.springframework.beans.factory.annotation.Value; import java.io.BufferedReader; import java.io.InputStreamReader; @@ -29,12 +33,14 @@ import java.util.Map; */ @Slf4j public class MesUtil { + +// static final String endpointUrl = "http://helptimely.com:7722/Timely4100_15_yonyu/services/HtWebService"; // 替换为实际的 WebService 地址 + static final String endpointUrl = "http://192.168.4.111:8080/mes/services/HtWebService"; // 替换为实际的 WebService 地址 public static JSONObject taskFeedback(JSONObject param, String finterfaceid) { MDC.put("log_file_type", "WMS任务完成反馈给MES"); -// String endpointUrl = "http://helptimely.com:7722/Timely4100_15_yonyu/services/HtWebService"; // 替换为实际的 WebService 地址 - String endpointUrl = "http://192.168.4.111:8080/mes/services/HtWebService"; // 替换为实际的 WebService 地址 JSONObject result = new JSONObject(); JSONObject resObj = new JSONObject(); + String requestXml = null; // 请求报文 String fsn502 = param.getString("fsn502"); String fscanserialid001 = param.getString("fscanserialid001"); String fpacknumberpl695 = param.getString("fpacknumberpl695"); @@ -69,7 +75,7 @@ public class MesUtil { items.add(ir); req.put("items", items); // xml报文 - String requestXml = parseXmlStr(JSON.toJSONString(req)); + requestXml = parseXmlStr(JSON.toJSONString(req)); // 设置请求体 StringEntity entity = new StringEntity(requestXml, "UTF-8"); httpPost.setEntity(entity); @@ -106,12 +112,74 @@ public class MesUtil { result.put("message", resObj.get("ErrorMessage")); } finally { // 不管成不成功,记录数据 - + WQLObject feedbackRecord = WQLObject.getWQLObject("mes_feedback_record"); + JSONObject feedbacks = new JSONObject(); + feedbacks.put("feedback_id", IdUtil.getSnowflake(1, 1).nextIdStr()); + feedbacks.put("feedback_code", task_code); + feedbacks.put("code", resObj.getString("ErrorCode")); + feedbacks.put("message", resObj.getString("ErrorMessage")); + feedbacks.put("request_param", requestXml); + feedbacks.put("response_param", resObj); + feedbacks.put("is_success", resObj.getString("ErrorCode").equals("0") ? "1" : "0"); + feedbacks.put("record_time", DateUtil.now()); + feedbackRecord.insert(feedbacks); } MDC.remove("log_file_type"); return result; } + /** 重发 */ + public static void retransmission(JSONObject param) { + log.info("反馈数据: {}", param); + // 获取请求报文 + String requestParam = param.getString("request_param"); + log.info("请求报文: {}", requestParam); + Map stringMap = new HashMap<>(); + JSONObject resObj = new JSONObject(); + try { + // 创建 HttpClient + HttpClient httpClient = HttpClientBuilder.create().build(); + + // 创建请求 + HttpPost httpPost = new HttpPost(endpointUrl); + httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8"); + // 设置请求体 + StringEntity entity = new StringEntity(requestParam, "UTF-8"); + httpPost.setEntity(entity); + + // 发送请求并获取响应 + HttpResponse response = httpClient.execute(httpPost); + + // 读取响应 + BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); + String line; + StringBuilder responseContent = new StringBuilder(); + while ((line = reader.readLine()) != null) { + responseContent.append(line); + } + reader.close(); + // 处理响应结果 + int statusCode = response.getStatusLine().getStatusCode(); + stringMap = parseXml2Map(String.valueOf(responseContent), new HashMap<>()); + log.info("Response Code: " + statusCode); + log.info("Response Body: " + stringMap); + String s = stringMap.get("Body.postResponse.return"); + resObj = JSON.parseObject(s); + log.info("响应结果: {}", resObj); + } catch (Exception e) { + log.error(e.getMessage()); + } finally { + // 不管成不成功,修改数据 + WQLObject feedbackRecord = WQLObject.getWQLObject("mes_feedback_record"); + param.put("code", resObj.getString("ErrorCode")); + param.put("message", resObj.getString("ErrorMessage")); + param.put("response_param", resObj); + param.put("is_success", resObj.getString("ErrorCode").equals("0") ? "1" : "0"); + param.put("record_time", DateUtil.now()); + feedbackRecord.update(param); + } + } + /** * 获得要发送的webservice的xml形式的参数 * diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java index ce4d721..7421239 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java @@ -48,6 +48,9 @@ public class PointDto implements Serializable { /** 设备编码 */ private String device_code; + /** 货柜id */ + private String container_id; + /** MES设备编码 */ private String mes_device_code; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java index dbb18db..b09e13f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java @@ -347,10 +347,12 @@ public class PointServiceImpl implements PointService { JSONArray data = jsonObject.getJSONArray("data"); JSONObject object = new JSONObject(); object.put("point_status", "1"); + object.put("vehicle_code", ""); object.put("vehicle_type", ""); object.put("vehicle_qty", "0"); object.put("task_id", ""); object.put("material_id", ""); + object.put("container_id", ""); object.put("pcsn", ""); object.put("ivt_qty", ""); object.put("instorage_time", ""); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/DPJCallVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/DPJCallVehicleTask.java index 2d42c9b..e53fdf7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/DPJCallVehicleTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/DPJCallVehicleTask.java @@ -148,7 +148,7 @@ public class DPJCallVehicleTask extends AbstractAcsTask { .addParamMap(query) .process() .getResultJSONArray(0); -// PointUpdateUtil.updatePoint(array); + PointUpdateUtil.updatePoint(array); // 选择一个空位 JSONObject endPoint = WQL.getWO("DPJ_AUTOTASK") diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java index 1546b8c..1f1d739 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java @@ -88,6 +88,7 @@ public class YqxCallMaterialTask extends AbstractAcsTask { material_point.put("lock_type", "1"); material_point.put("point_status", "1"); material_point.put("material_id", ""); + material_point.put("container_id", ""); material_point.put("vehicle_type", ""); material_point.put("vehicle_code", ""); pointTab.update(material_point); @@ -137,11 +138,15 @@ public class YqxCallMaterialTask extends AbstractAcsTask { JSONObject taskObj = taskArr.getJSONObject(i); String material_id = taskObj.getString("material_id"); String vehicle_type = taskObj.getString("vehicle_type"); + String request_param = taskObj.getString("request_param"); + JSONObject requestObj = JSONObject.parseObject(request_param); + String containerId = requestObj.getString("container_id"); // 柜号id JSONObject queryParam = new JSONObject(); queryParam.put("flag", "1"); queryParam.put("material_id", material_id); queryParam.put("region_code", "YSQA01"); - queryParam.put("vehicle_type", vehicle_type ); +// queryParam.put("vehicle_type", vehicle_type); + queryParam.put("containerId", containerId); // 查找养生A区,如果最后一个位置有货,直接搬走,如果没货,就作为等待点。先让agv到达等待点 // 1、根据物料id查找养生A区物料点 JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(queryParam).process().uniqueResult(0); @@ -176,7 +181,7 @@ public class YqxCallMaterialTask extends AbstractAcsTask { } // 等待点上锁 // waitPoints.put("lock_type", "2"); - pointTab.update(waitPoints); +// pointTab.update(waitPoints); taskObj.put("point_code3", waitPoints.getString("point_code")); taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); @@ -326,13 +331,17 @@ public class YqxCallMaterialTask extends AbstractAcsTask { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 JSONObject hcTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + String request_param = hcTask.getString("request_param"); + JSONObject requestObj = JSONObject.parseObject(request_param); + String containerId = requestObj.getString("container_id"); // 柜号id if (ObjectUtil.isEmpty(hcTask)) throw new BadRequestException("任务ID: " + task_id + "的任务不存在!"); JSONObject waitPoint = pointTab.query("point_code = '" + hcTask.getString("point_code3") + "'").uniqueResult(0); if (ObjectUtil.isEmpty(waitPoint)) throw new BadRequestException("油漆线二次下发等待点编码错误!"); JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(MapOf.of( "flag", "3", "material_id", hcTask.getString("material_id"), "region_code", "YSQA01", "vehicle_type", hcTask.getString("vehicle_type"), - "block_num", waitPoint.getString("block_num"), "row_num", waitPoint.getString("row_num") + "block_num", waitPoint.getString("block_num"), "row_num", waitPoint.getString("row_num"), + "containerId", containerId )).process().uniqueResult(0); if (ObjectUtil.isEmpty(materialPoint)) { throw new BadRequestException("养生A区暂无所需物料!"); // 此时车会停止 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql index 1b34b35..f5028b1 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql @@ -16,6 +16,7 @@ 输入.flag TYPEAS s_string 输入.region_code TYPEAS s_string 输入.material_id TYPEAS s_string + 输入.containerId TYPEAS s_string 输入.vehicle_type TYPEAS s_string 输入.block_num TYPEAS s_string 输入.row_num TYPEAS s_string @@ -46,12 +47,7 @@ IF 输入.flag = "1" QUERY SELECT - p.point_id, - p.point_code, - p.point_name, - p.block_num, - p.col_num, - p.row_num + p.* FROM SCH_BASE_Point p WHERE @@ -61,6 +57,9 @@ OPTION 输入.material_id <> "" p.material_id = 输入.material_id ENDOPTION + OPTION 输入.containerId <> "" + p.container_id = 输入.containerId + ENDOPTION OPTION 输入.region_code <> "" p.region_code = 输入.region_code ENDOPTION @@ -96,12 +95,7 @@ IF 输入.flag = "3" QUERY SELECT - p.point_id, - p.point_code, - p.point_name, - p.block_num, - p.col_num, - p.row_num + p.* FROM SCH_BASE_Point p WHERE @@ -111,6 +105,9 @@ OPTION 输入.material_id <> "" p.material_id = 输入.material_id ENDOPTION + OPTION 输入.containerId <> "" + p.container_id = 输入.containerId + ENDOPTION OPTION 输入.region_code <> "" p.region_code = 输入.region_code ENDOPTION diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java index cfdedfc..df80b23 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java @@ -94,8 +94,7 @@ public class GjxSendMaterialTask extends AbstractAcsTask { JSONObject requestObj = task.getJSONObject("request_param"); JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); //工单标识 - String workorder_id = requestObj.getString("material_info_id"); - JSONObject workorderObj = workOrderTab.query("workorder_id", workorder_id).uniqueResult(0); + JSONObject workorderObj = workOrderTab.query("workorder_id = '" + workOrderId + "'").uniqueResult(0); JSONObject order = orderTab.query("workorder_id = '" + workOrderId + "'").uniqueResult(0); if (ObjectUtil.isNotEmpty(endPoint)) { @@ -114,6 +113,7 @@ public class GjxSendMaterialTask extends AbstractAcsTask { endPoint.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); endPoint.put("ivt_qty", requestObj.getString("qty")); endPoint.put("standing_time", workorderObj.getString("standing_time")); + endPoint.put("container_id", workorderObj.getString("container_id")); endPoint.put("vehicle_code", taskObj.getString("vehicle_code")); endPoint.put("vehicle_type", taskObj.getString("vehicle_type")); endPoint.put("update_time", DateUtil.now()); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls b/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls index 90196ef57360c1f3a9c9af37839ad75f48558547..41bbdd7485ce3957423ca43c2a3ca878859b7e34 100644 GIT binary patch delta 29512 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 SDc?9gI$i*>F?0LW@&5yAr_xXW diff --git a/lms/nladmin-ui/src/api/feedbackRecord.js b/lms/nladmin-ui/src/api/feedbackRecord.js new file mode 100644 index 0000000..b9f13fc --- /dev/null +++ b/lms/nladmin-ui/src/api/feedbackRecord.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/feedbackRecord', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/feedbackRecord/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/feedbackRecord', + method: 'put', + data + }) +} + +export function retransmission(data) { + return request({ + url: 'api/feedbackRecord/retransmission', + method: 'post', + data + }) +} + +export default { add, edit, del, retransmission } diff --git a/lms/nladmin-ui/src/views/system/record/index.vue b/lms/nladmin-ui/src/views/system/record/index.vue new file mode 100644 index 0000000..18b3656 --- /dev/null +++ b/lms/nladmin-ui/src/views/system/record/index.vue @@ -0,0 +1,178 @@ + + + + + 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 c56bb90..6807111 100644 --- a/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue +++ b/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue @@ -232,6 +232,9 @@ style="width: 200px;" /> + + + + @@ -335,6 +339,7 @@ const defaultForm = { producedeviceorder_code: null, shift_type_scode: '01', workprocedure_id: null, + container_id: null, produce_date: null, plan_qty: null, real_qty: null, @@ -364,7 +369,7 @@ const defaultForm = { is_canupdate_update: '1', material_spec: null, sale_id: null, - workorder_type: '1' + workorder_type: '2' } export default { name: 'Produceshiftorder', @@ -412,11 +417,8 @@ export default { material_code: [ { required: true, message: '物料编码不能为空', trigger: 'change' } ], - planproducestart_date: [ - { required: true, message: '计划生产开始时间不能为空', trigger: 'blur' } - ], - planproduceend_date: [ - { required: true, message: '计划生产结束时间不能为空', trigger: 'blur' } + container_id: [ + { required: true, message: '货柜ID不能为空', trigger: 'blur' } ], order_status: [ { required: true, message: '工单状态不能为空', trigger: 'blur' } diff --git a/lms/nladmin-ui/src/views/wms/sch/point/index.vue b/lms/nladmin-ui/src/views/wms/sch/point/index.vue index 9854bee..7136444 100644 --- a/lms/nladmin-ui/src/views/wms/sch/point/index.vue +++ b/lms/nladmin-ui/src/views/wms/sch/point/index.vue @@ -285,9 +285,12 @@ /> - + + + + @@ -354,6 +357,7 @@ + @@ -422,6 +426,7 @@ const defaultForm = { can_vehicle_types: null, vehicle_qty: null, source_id: null, + container_id: null, remark: null, is_used: null, is_delete: null,