配合示方生成混炼示方完善

This commit is contained in:
2026-07-30 11:28:26 +08:00
parent 2310f79f43
commit 5c27bacd11
231 changed files with 33361 additions and 184 deletions

View File

@@ -606,3 +606,26 @@ jeecgboot-vue3/src/views/xslmes/mesXslRubberQuickTestRecord/components/MesXslRub
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/im/service/impl/SysImChatServiceImpl.java
jeecgboot-vue3/src/views/system/im/imCache.ts
jeecgboot-vue3/src/views/system/im/ImChat.vue
-- author:jiangxh---date:20260729--for: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>ϡ<EFBFBD><CFA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<E0BCAD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ψһ ---
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/IMesMixerMaterialService.java
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/impl/MesMixerMaterialServiceImpl.java
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/controller/MesMixerMaterialController.java
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/IMesMaterialService.java
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/impl/MesMaterialServiceImpl.java
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/controller/MesMaterialController.java
jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.api.ts
jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.data.ts
jeecgboot-vue3/src/views/mes/material/MesMaterial.api.ts
jeecgboot-vue3/src/views/mes/material/MesMaterial.data.ts
-- author:jiangxh---date:20260729--for: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD><CFA1><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD>365<36><35> ---
jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.data.ts
-- author:jiangxh---date:20260729--for: <20><>WebSocket<65><74><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Redis<69>ذ<EFBFBD><D8B0><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ---
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java
jeecgboot-vue3/src/hooks/web/useWebSocket.ts
-- author:jiangxh---date:20260729--for: <20><><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD><CFA1>б<EFBFBD>/<2F><><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD>ֶ<EFBFBD> ---
jeecgboot-vue3/src/views/mes/material/MesMaterial.data.ts
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/controller/MesMaterialController.java

View File

@@ -10,11 +10,13 @@ import jakarta.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.mes.material.entity.MesMaterial;
import org.jeecg.modules.mes.material.service.IMesMaterialService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -59,6 +61,12 @@ public class MesMaterialController extends JeecgController<MesMaterial, IMesMate
@RequiresPermissions("mes:mes_material:add")
@PostMapping("/add")
public Result<String> add(@RequestBody MesMaterial model) {
//update-begin---author:jiangxh ---date:20260729 for【胶料】名称/编码唯一校验-----------
String err = validateUnique(model, null);
if (err != null) {
return Result.error(err);
}
//update-end---author:jiangxh ---date:20260729 for【胶料】名称/编码唯一校验-----------
mesMaterialService.save(model);
mesMaterialService.notifyMaterialChanged("material.created", model);
return Result.OK("添加成功!");
@@ -69,6 +77,12 @@ public class MesMaterialController extends JeecgController<MesMaterial, IMesMate
@RequiresPermissions("mes:mes_material:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
public Result<String> edit(@RequestBody MesMaterial model) {
//update-begin---author:jiangxh ---date:20260729 for【胶料】名称/编码唯一校验-----------
String err = validateUnique(model, model.getId());
if (err != null) {
return Result.error(err);
}
//update-end---author:jiangxh ---date:20260729 for【胶料】名称/编码唯一校验-----------
mesMaterialService.updateById(model);
mesMaterialService.notifyMaterialChanged("material.updated", model);
return Result.OK("编辑成功!");
@@ -106,6 +120,57 @@ public class MesMaterialController extends JeecgController<MesMaterial, IMesMate
return Result.OK(mesMaterialService.getById(id));
}
//update-begin---author:jiangxh ---date:20260729 for【胶料】名称/编码唯一校验接口-----------
@Operation(summary = "校验胶料编码是否重复")
@GetMapping("/checkMaterialCode")
public Result<String> checkMaterialCode(
@RequestParam(name = "materialCode", required = true) String materialCode,
@RequestParam(name = "dataId", required = false) String dataId) {
if (oConvertUtils.isEmpty(materialCode) || materialCode.trim().isEmpty()) {
return Result.OK("该值可用!");
}
if (mesMaterialService.isMaterialCodeDuplicated(materialCode, dataId)) {
return Result.error("胶料编码不能重复");
}
return Result.OK("该值可用!");
}
@Operation(summary = "校验胶料名称是否重复")
@GetMapping("/checkMaterialName")
public Result<String> checkMaterialName(
@RequestParam(name = "materialName", required = true) String materialName,
@RequestParam(name = "dataId", required = false) String dataId) {
if (oConvertUtils.isEmpty(materialName) || materialName.trim().isEmpty()) {
return Result.OK("该值可用!");
}
if (mesMaterialService.isMaterialNameDuplicated(materialName, dataId)) {
return Result.error("胶料名称不能重复");
}
return Result.OK("该值可用!");
}
private String validateUnique(MesMaterial model, String excludeId) {
if (model == null) {
return "数据不能为空";
}
if (oConvertUtils.isEmpty(model.getMaterialName()) || StringUtils.isBlank(model.getMaterialName())) {
return "胶料名称不能为空";
}
model.setMaterialName(model.getMaterialName().trim());
//update-begin---author:jiangxh ---date:20260730 for【胶料】保存时编号与名称保持一致界面隐藏编号-----------
// 表单/列表不展示编号,保存时自动用胶料名称回填胶料编号
model.setMaterialCode(model.getMaterialName());
//update-end---author:jiangxh ---date:20260730 for【胶料】保存时编号与名称保持一致界面隐藏编号-----------
if (mesMaterialService.isMaterialNameDuplicated(model.getMaterialName(), excludeId)) {
return "胶料名称不能重复";
}
if (mesMaterialService.isMaterialCodeDuplicated(model.getMaterialCode(), excludeId)) {
return "胶料编码不能重复";
}
return null;
}
//update-end---author:jiangxh ---date:20260729 for【胶料】名称/编码唯一校验接口-----------
@RequiresPermissions("mes:mes_material:exportXls")
@RequestMapping("/exportXls")
public ModelAndView exportXls(HttpServletRequest request, MesMaterial model) {

View File

@@ -11,11 +11,13 @@ import jakarta.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.mes.material.entity.MesMixerMaterial;
import org.jeecg.modules.mes.material.service.IMesMixerMaterialService;
import org.springframework.messaging.simp.SimpMessagingTemplate;
@@ -52,6 +54,12 @@ public class MesMixerMaterialController extends JeecgController<MesMixerMaterial
@RequiresPermissions("mes:mes_mixer_material:add")
@PostMapping("/add")
public Result<String> add(@RequestBody MesMixerMaterial model) {
//update-begin---author:jiangxh ---date:20260729 for【密炼物料】名称/编码唯一校验-----------
String err = validateUnique(model, null);
if (err != null) {
return Result.error(err);
}
//update-end---author:jiangxh ---date:20260729 for【密炼物料】名称/编码唯一校验-----------
service.save(model);
publishChanged("add", model.getId());
return Result.OK("添加成功!");
@@ -62,6 +70,12 @@ public class MesMixerMaterialController extends JeecgController<MesMixerMaterial
@RequiresPermissions("mes:mes_mixer_material:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
public Result<String> edit(@RequestBody MesMixerMaterial model) {
//update-begin---author:jiangxh ---date:20260729 for【密炼物料】名称/编码唯一校验-----------
String err = validateUnique(model, model.getId());
if (err != null) {
return Result.error(err);
}
//update-end---author:jiangxh ---date:20260729 for【密炼物料】名称/编码唯一校验-----------
service.updateById(model);
publishChanged("edit", model.getId());
return Result.OK("编辑成功!");
@@ -110,6 +124,12 @@ public class MesMixerMaterialController extends JeecgController<MesMixerMaterial
@Operation(summary = "MES-密炼物料信息-免密添加")
@PostMapping("/anon/add")
public Result<String> anonAdd(@RequestBody MesMixerMaterial model) {
//update-begin---author:jiangxh ---date:20260729 for【密炼物料】名称/编码唯一校验-----------
String err = validateUnique(model, null);
if (err != null) {
return Result.error(err);
}
//update-end---author:jiangxh ---date:20260729 for【密炼物料】名称/编码唯一校验-----------
service.save(model);
publishChanged("add", model.getId());
return Result.OK("添加成功!");
@@ -118,6 +138,12 @@ public class MesMixerMaterialController extends JeecgController<MesMixerMaterial
@Operation(summary = "MES-密炼物料信息-免密编辑")
@RequestMapping(value = "/anon/edit", method = {RequestMethod.PUT, RequestMethod.POST})
public Result<String> anonEdit(@RequestBody MesMixerMaterial model) {
//update-begin---author:jiangxh ---date:20260729 for【密炼物料】名称/编码唯一校验-----------
String err = validateUnique(model, model.getId());
if (err != null) {
return Result.error(err);
}
//update-end---author:jiangxh ---date:20260729 for【密炼物料】名称/编码唯一校验-----------
boolean ok = service.updateById(model);
if (!ok) {
return Result.error("数据已被他人修改,请刷新后重试");
@@ -148,6 +174,57 @@ public class MesMixerMaterialController extends JeecgController<MesMixerMaterial
return Result.OK(service.getById(id));
}
//update-begin---author:jiangxh ---date:20260729 for【密炼物料】名称/编码唯一校验接口-----------
@Operation(summary = "校验物料编码是否重复")
@GetMapping("/checkMaterialCode")
public Result<String> checkMaterialCode(
@RequestParam(name = "materialCode", required = true) String materialCode,
@RequestParam(name = "dataId", required = false) String dataId) {
if (oConvertUtils.isEmpty(materialCode) || materialCode.trim().isEmpty()) {
return Result.OK("该值可用!");
}
if (service.isMaterialCodeDuplicated(materialCode, dataId)) {
return Result.error("物料编码不能重复");
}
return Result.OK("该值可用!");
}
@Operation(summary = "校验物料名称是否重复")
@GetMapping("/checkMaterialName")
public Result<String> checkMaterialName(
@RequestParam(name = "materialName", required = true) String materialName,
@RequestParam(name = "dataId", required = false) String dataId) {
if (oConvertUtils.isEmpty(materialName) || materialName.trim().isEmpty()) {
return Result.OK("该值可用!");
}
if (service.isMaterialNameDuplicated(materialName, dataId)) {
return Result.error("物料名称不能重复");
}
return Result.OK("该值可用!");
}
private String validateUnique(MesMixerMaterial model, String excludeId) {
if (model == null) {
return "数据不能为空";
}
if (oConvertUtils.isEmpty(model.getMaterialCode()) || StringUtils.isBlank(model.getMaterialCode())) {
return "物料编码不能为空";
}
model.setMaterialCode(model.getMaterialCode().trim());
if (service.isMaterialCodeDuplicated(model.getMaterialCode(), excludeId)) {
return "物料编码不能重复";
}
if (oConvertUtils.isEmpty(model.getMaterialName()) || StringUtils.isBlank(model.getMaterialName())) {
return "物料名称不能为空";
}
model.setMaterialName(model.getMaterialName().trim());
if (service.isMaterialNameDuplicated(model.getMaterialName(), excludeId)) {
return "物料名称不能重复";
}
return null;
}
//update-end---author:jiangxh ---date:20260729 for【密炼物料】名称/编码唯一校验接口-----------
@RequiresPermissions("mes:mes_mixer_material:exportXls")
@RequestMapping("/exportXls")
public ModelAndView exportXls(HttpServletRequest request, MesMixerMaterial model) {

View File

@@ -5,4 +5,10 @@ import org.jeecg.modules.mes.material.entity.MesMaterial;
public interface IMesMaterialService extends IService<MesMaterial> {
void notifyMaterialChanged(String eventType, MesMaterial material);
//update-begin---author:jiangxh ---date:20260729 for【胶料】名称/编码唯一校验-----------
boolean isMaterialCodeDuplicated(String materialCode, String excludeId);
boolean isMaterialNameDuplicated(String materialName, String excludeId);
//update-end---author:jiangxh ---date:20260729 for【胶料】名称/编码唯一校验-----------
}

View File

@@ -3,4 +3,11 @@ package org.jeecg.modules.mes.material.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.mes.material.entity.MesMixerMaterial;
public interface IMesMixerMaterialService extends IService<MesMixerMaterial> {}
public interface IMesMixerMaterialService extends IService<MesMixerMaterial> {
//update-begin---author:jiangxh ---date:20260729 for【密炼物料】名称/编码唯一校验-----------
boolean isMaterialCodeDuplicated(String materialCode, String excludeId);
boolean isMaterialNameDuplicated(String materialName, String excludeId);
//update-end---author:jiangxh ---date:20260729 for【密炼物料】名称/编码唯一校验-----------
}

View File

@@ -1,9 +1,11 @@
package org.jeecg.modules.mes.material.service.impl;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.modules.mes.material.entity.MesMaterial;
import org.jeecg.modules.mes.material.mapper.MesMaterialMapper;
import org.jeecg.modules.mes.material.service.IMesMaterialService;
@@ -25,4 +27,32 @@ public class MesMaterialServiceImpl extends ServiceImpl<MesMaterialMapper, MesMa
event.put("timestamp", System.currentTimeMillis());
webSocket.sendMessage(JSON.toJSONString(event));
}
//update-begin---author:jiangxh ---date:20260729 for【胶料】名称/编码唯一校验-----------
@Override
public boolean isMaterialCodeDuplicated(String materialCode, String excludeId) {
if (StringUtils.isBlank(materialCode)) {
return false;
}
LambdaQueryWrapper<MesMaterial> wrapper =
new LambdaQueryWrapper<MesMaterial>().eq(MesMaterial::getMaterialCode, materialCode.trim());
if (StringUtils.isNotBlank(excludeId)) {
wrapper.ne(MesMaterial::getId, excludeId.trim());
}
return this.count(wrapper) > 0;
}
@Override
public boolean isMaterialNameDuplicated(String materialName, String excludeId) {
if (StringUtils.isBlank(materialName)) {
return false;
}
LambdaQueryWrapper<MesMaterial> wrapper =
new LambdaQueryWrapper<MesMaterial>().eq(MesMaterial::getMaterialName, materialName.trim());
if (StringUtils.isNotBlank(excludeId)) {
wrapper.ne(MesMaterial::getId, excludeId.trim());
}
return this.count(wrapper) > 0;
}
//update-end---author:jiangxh ---date:20260729 for【胶料】名称/编码唯一校验-----------
}

View File

@@ -1,6 +1,8 @@
package org.jeecg.modules.mes.material.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.modules.mes.material.entity.MesMixerMaterial;
import org.jeecg.modules.mes.material.mapper.MesMixerMaterialMapper;
import org.jeecg.modules.mes.material.service.IMesMixerMaterialService;
@@ -8,4 +10,33 @@ import org.springframework.stereotype.Service;
@Service
public class MesMixerMaterialServiceImpl extends ServiceImpl<MesMixerMaterialMapper, MesMixerMaterial>
implements IMesMixerMaterialService {}
implements IMesMixerMaterialService {
//update-begin---author:jiangxh ---date:20260729 for【密炼物料】名称/编码唯一校验-----------
@Override
public boolean isMaterialCodeDuplicated(String materialCode, String excludeId) {
if (StringUtils.isBlank(materialCode)) {
return false;
}
LambdaQueryWrapper<MesMixerMaterial> wrapper =
new LambdaQueryWrapper<MesMixerMaterial>().eq(MesMixerMaterial::getMaterialCode, materialCode.trim());
if (StringUtils.isNotBlank(excludeId)) {
wrapper.ne(MesMixerMaterial::getId, excludeId.trim());
}
return this.count(wrapper) > 0;
}
@Override
public boolean isMaterialNameDuplicated(String materialName, String excludeId) {
if (StringUtils.isBlank(materialName)) {
return false;
}
LambdaQueryWrapper<MesMixerMaterial> wrapper =
new LambdaQueryWrapper<MesMixerMaterial>().eq(MesMixerMaterial::getMaterialName, materialName.trim());
if (StringUtils.isNotBlank(excludeId)) {
wrapper.ne(MesMixerMaterial::getId, excludeId.trim());
}
return this.count(wrapper) > 0;
}
//update-end---author:jiangxh ---date:20260729 for【密炼物料】名称/编码唯一校验-----------
}

View File

@@ -61,16 +61,30 @@ public class WebSocket {
@OnOpen
public void onOpen(Session session, @PathParam(value = "userId") String userId) {
try {
sessionPool.put(userId, session);
//update-begin---author:jiangxh ---date:20260729 for【WebSocket】同 userId 新连接顶替旧连接,避免双连接互踢-----------
Session previous = sessionPool.put(userId, session);
if (previous != null && previous.isOpen() && !previous.getId().equals(session.getId())) {
try {
previous.close();
} catch (Exception ignore) {
// ignore
}
}
//update-end---author:jiangxh ---date:20260729 for【WebSocket】同 userId 新连接顶替旧连接,避免双连接互踢-----------
log.info("【系统 WebSocket】连接建立 userId={}, sessionId={}, online={}", userId, session.getId(), sessionPool.size());
} catch (Exception e) {
}
}
@OnClose
public void onClose(@PathParam("userId") String userId) {
public void onClose(Session session, @PathParam("userId") String userId) {
try {
sessionPool.remove(userId);
//update-begin---author:jiangxh ---date:20260729 for【WebSocket】仅移除当前 session避免旧连接 onClose 清掉新连接-----------
Session current = sessionPool.get(userId);
if (current != null && session != null && current.getId().equals(session.getId())) {
sessionPool.remove(userId, current);
}
//update-end---author:jiangxh ---date:20260729 for【WebSocket】仅移除当前 session避免旧连接 onClose 清掉新连接-----------
log.info("【系统 WebSocket】连接断开 userId={}, online={}", userId, sessionPool.size());
} catch (Exception e) {
e.printStackTrace();
@@ -155,13 +169,24 @@ public class WebSocket {
* ws接受客户端消息
*/
@OnMessage
public void onMessage(String message, @PathParam(value = "userId") String userId) {
public void onMessage(String message, Session session, @PathParam(value = "userId") String userId) {
String normalized = message == null ? "" : message.trim();
if (isHeartbeatOrBlank(normalized)) {
log.debug("【系统 WebSocket】收到客户端心跳/空消息:{}", normalized);
if ("ping".equalsIgnoreCase(normalized) || WebsocketConst.CMD_CHECK.equalsIgnoreCase(normalized)) {
//update-begin---author:jiangxh ---date:20260729 for【WebSocket】心跳直接回包避免走 Redis 导致 pong 超时断线-----------
// 代码逻辑说明: 【issues/1161】前端websocket因心跳导致监听不起作用---
this.sendMessage(userId, "ping");
// 心跳必须同连接即时回包;走 Redis 发布订阅可能延迟/失败,触发前端 pongTimeout 断线重连
try {
if (session != null && session.isOpen()) {
synchronized (session) {
session.getBasicRemote().sendText("ping");
}
}
} catch (Exception e) {
log.warn("【系统 WebSocket】心跳回包失败 userId={}, err={}", userId, e.getMessage());
}
//update-end---author:jiangxh ---date:20260729 for【WebSocket】心跳直接回包避免走 Redis 导致 pong 超时断线-----------
}
return;
}