配合示方生成混炼示方完善
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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:【胶料】名称/编码唯一校验-----------
|
||||
}
|
||||
|
||||
@@ -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:【密炼物料】名称/编码唯一校验-----------
|
||||
}
|
||||
|
||||
@@ -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:【胶料】名称/编码唯一校验-----------
|
||||
}
|
||||
|
||||
@@ -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:【密炼物料】名称/编码唯一校验-----------
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user