From 83667e5248bbdff77e0ef87ed6fdf9ec2b49e1f9 Mon Sep 17 00:00:00 2001 From: lld <15027638633@163.com> Date: Mon, 16 Feb 2026 01:52:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9E=9A=E4=B8=BE=E4=BB=A3=E6=9B=BF=E7=A1=AC?= =?UTF-8?q?=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/agri/common/enums/AgriEnum.java | 32 +++ .../service/impl/SysAgriInfoServiceImpl.java | 186 ++++++++++-------- 2 files changed, 139 insertions(+), 79 deletions(-) create mode 100644 agri-common/src/main/java/com/agri/common/enums/AgriEnum.java diff --git a/agri-common/src/main/java/com/agri/common/enums/AgriEnum.java b/agri-common/src/main/java/com/agri/common/enums/AgriEnum.java new file mode 100644 index 0000000..5a60a1a --- /dev/null +++ b/agri-common/src/main/java/com/agri/common/enums/AgriEnum.java @@ -0,0 +1,32 @@ +package com.agri.common.enums; + +public enum AgriEnum { + + + SCAN(0, "扫码"), + INVITE(1, "邀请"), + OWNER(3, "大棚所有者"), + MANUAL(0, "手动模式"), + ALARM_CLOSE(0, "告警关闭"), + NO_DELETE(0, "未删除"), + ENABLED(1, "已生效"), + PENDING_ACCEPTANCE(2, "待接受邀请"), + WARN(0, "警告"), + SUCCESS(1, "成功"); + + private final Integer code; + private final String desc; + AgriEnum(Integer code, String desc) + { + this.code = code; + this.desc = desc; + } + + public Integer getCode() { + return code; + } + + public String getDesc() { + return desc; + } +} diff --git a/agri-system/src/main/java/com/agri/system/service/impl/SysAgriInfoServiceImpl.java b/agri-system/src/main/java/com/agri/system/service/impl/SysAgriInfoServiceImpl.java index 6e1f847..446efe2 100644 --- a/agri-system/src/main/java/com/agri/system/service/impl/SysAgriInfoServiceImpl.java +++ b/agri-system/src/main/java/com/agri/system/service/impl/SysAgriInfoServiceImpl.java @@ -1,8 +1,10 @@ package com.agri.system.service.impl; import com.agri.common.core.domain.entity.SysUser; +import com.agri.common.enums.AgriEnum; import com.agri.common.utils.DateUtils; import com.agri.common.utils.SecurityUtils; +import com.agri.common.utils.wechat.WxUtil; import com.agri.system.domain.SysAgriInfo; import com.agri.system.domain.SysUserAgri; import com.agri.system.domain.vo.AgriInfoView; @@ -131,102 +133,128 @@ public class SysAgriInfoServiceImpl extends ServiceImpl addAgriFromMobile(SysAgriInfo sysAgriInfo) { - Map resultMap = new HashMap<>(); - resultMap.put("code", 1); + resultMap.put("code", AgriEnum.SUCCESS.getCode()); resultMap.put("msg", "添加大棚成功"); Integer sourceCode = sysAgriInfo.getSourceCode(); - // 邀请是前端传值,扫码是自己获取 + // 1. 区分扫码/邀请的userId来源 Long userId; - if (sourceCode.equals(0)) { + if (sourceCode.equals(AgriEnum.WARN.getCode())) { + // 扫码:userId取当前登录用户 userId = SecurityUtils.getUserId(); } else { + // 邀请:userId取前端传入的值 userId = sysAgriInfo.getUserId(); } sysAgriInfo.setUserId(userId); - SysAgriInfo agriInfo = super.lambdaQuery() - .eq(SysAgriInfo::getImei, sysAgriInfo.getImei()) - .one(); - // 默认手动模式 - sysAgriInfo.setWorkMode(0); - // 默认关闭告警开关 - sysAgriInfo.setAlarmStatus(0); - sysAgriInfo.setIsDeleted(0); - SysUserAgri sysUserAgri = new SysUserAgri(); - sysUserAgri.setAgriId(sysAgriInfo.getImei()); - sysUserAgri.setUserId(userId); - sysUserAgri.setInviteBy(SecurityUtils.getUserId()); - sysUserAgri.setInviteTime(new Date()); - sysUserAgri.setRemark("用户所有者绑定"); + try { - // 大棚未添加。没有大棚信息就是没有 - if (ObjectUtils.isEmpty(agriInfo)) { - int insert = baseMapper.insert(sysAgriInfo); - if (insert > 0 && !SecurityUtils.isAdmin()) { - sysUserAgri.setRole(3); - sysUserAgri.setStatus(1); - sysUserAgri.setAcceptTime(new Date()); - userAgriService.save(sysUserAgri); + // 2. 查询大棚是否已存在 + SysAgriInfo agriInfo = super.lambdaQuery() + .eq(SysAgriInfo::getImei, sysAgriInfo.getImei()) + .one(); + + // 3. 大棚默认参数设置 + sysAgriInfo.setWorkMode(AgriEnum.MANUAL.getCode());// 默认手动模式 + sysAgriInfo.setAlarmStatus(AgriEnum.ALARM_CLOSE.getCode());// 默认关闭告警开关 + sysAgriInfo.setIsDeleted(AgriEnum.NO_DELETE.getCode()); + + // 4. 构建用户-大棚绑定基础对象 + SysUserAgri sysUserAgri = new SysUserAgri(); + sysUserAgri.setAgriId(sysAgriInfo.getImei()); + sysUserAgri.setUserId(userId); + sysUserAgri.setInviteBy(SecurityUtils.getUserId()); + sysUserAgri.setInviteTime(new Date()); + sysUserAgri.setRemark("用户所有者绑定"); + + // 方法开头先判断管理员(如需放行新增操作,可在新增逻辑内处理) + if (SecurityUtils.isAdmin()) { + // 管理员仅执行大棚新增,不绑定用户 + if (ObjectUtils.isEmpty(agriInfo)) { + baseMapper.insert(sysAgriInfo); + } + resultMap.put("msg", "添加大棚成功"); return resultMap; } - } - // 管理员无需添加直接返回 - if (SecurityUtils.isAdmin()) { - resultMap.put("msg", "添加大棚成功"); - return resultMap; - } - /// 1. 大棚已添加 - /// 1).当前大棚已添加但未绑定用户 - List userAgriList = userAgriService.lambdaQuery() - .eq(SysUserAgri::getAgriId, sysAgriInfo.getImei()) - .list(); - if (CollectionUtils.isEmpty(userAgriList)) { - sysUserAgri.setRole(3); - sysUserAgri.setStatus(1); - sysUserAgri.setAcceptTime(new Date()); + + // 5. 大棚未添加:新增大棚 + 绑定用户(仅非管理员) + if (ObjectUtils.isEmpty(agriInfo)) { + int insert = baseMapper.insert(sysAgriInfo); + if (insert > 0) { + // 扫码/首次绑定场景:后端设置固定值(非邀请场景) + sysUserAgri.setRole(AgriEnum.OWNER.getCode()); + sysUserAgri.setStatus(AgriEnum.ENABLED.getCode()); + sysUserAgri.setAcceptTime(new Date()); + userAgriService.save(sysUserAgri); + return resultMap; + } + } + // 6. 管理员逻辑:仅新增大棚,不绑定用户 ----->前移 + + // 7. 大棚已存在:处理绑定逻辑 + List userAgriList = userAgriService.lambdaQuery() + .eq(SysUserAgri::getAgriId, sysAgriInfo.getImei()) + .list(); + + // 7.1 大棚已存在但未绑定任何用户:扫码绑定(后端设固定值) + if (CollectionUtils.isEmpty(userAgriList)) { + sysUserAgri.setRole(AgriEnum.OWNER.getCode()); + sysUserAgri.setStatus(AgriEnum.ENABLED.getCode()); + sysUserAgri.setAcceptTime(new Date()); + userAgriService.save(sysUserAgri); + resultMap.put("msg", "关联用户成功!"); + return resultMap; + } + + // 7.2 校验当前用户是否已绑定该大棚 + Optional optional = userAgriList.stream() + .filter(userAgri -> userAgri.getUserId().equals(userId)).findFirst(); + + // 7.3 扫码场景:大棚已绑定其他用户 → 直接提示返回 + if (AgriEnum.SCAN.getCode().equals(sourceCode) + && (!optional.isPresent() || !optional.get().getRole().equals(3))) { + resultMap.put("code", AgriEnum.WARN.getCode()); + resultMap.put("msg","当前大棚已被关联,请联系大棚所有者!"); + return resultMap; + } + + // 7.4 重复绑定/重复邀请 → 提示返回 + if (optional.isPresent()) { + resultMap.put("code", AgriEnum.WARN.getCode()); + resultMap.put("msg","已关联当前大棚,请勿重复绑定!"); + if (sourceCode.equals(AgriEnum.INVITE.getCode())) { + resultMap.put("msg","该用户已被邀请,请勿重复关联!"); + } + return resultMap; + } + // ---------扫码场景到此为止,强制返回,避免进入邀请逻辑-------- + if (AgriEnum.INVITE.getCode().equals(sourceCode)) { + return resultMap; + } + // 8. 邀请场景(仅sourceCode=1能走到这里) + // 8.1 校验绑定数量上限 + if (userAgriList.size()>=agriManagerNum) { + resultMap.put("code", AgriEnum.WARN.getCode()); + resultMap.put("msg","当前大棚关联超过限制,请联系大棚所有者!"); + return resultMap; + } + + // 8.2 邀请场景:从前端入参获取role、status、acceptTime(核心规则) + sysUserAgri.setStatus(AgriEnum.PENDING_ACCEPTANCE.getCode()); + sysUserAgri.setRemark("用户邀请"); userAgriService.save(sysUserAgri); - resultMap.put("msg", "关联用户成功!"); - return resultMap; - } - // 大棚已经扫码 过来只有所有者和非所有者 - /// 2).当前大棚已绑定当前用户且又扫了次码 - Optional optional = userAgriList.stream() - .filter(userAgri -> userAgri.getUserId().equals(userId)).findFirst(); - // 扫码,没关联上大棚,大棚有关联用户,但是没当前用户 提示大棚已被关联 - if (Integer.valueOf(0).equals(sourceCode) - && (!optional.isPresent() || !optional.get().getRole().equals(3))) { - resultMap.put("code", 0); - resultMap.put("msg","当前大棚已被关联,请联系大棚所有者!"); - return resultMap; - } - // 扫码或邀请,是关联着者,就应该提示不应重复绑定; - if (optional.isPresent()) { - resultMap.put("code", 0); - resultMap.put("msg","已关联当前大棚,请勿重复绑定!"); - if (sourceCode.equals(1)) { - resultMap.put("msg","该用户已被邀请,请勿重复关联!"); + // todo 向对应人发送通知 + if (AgriEnum.WARN.getCode().equals(sourceCode)) { + resultMap.put("msg", "邀请已发送,请等待确认"); } return resultMap; - } - // ---------扫码场景到此为止,强制返回,避免进入邀请逻辑-------- 扫码有用户。但是没绑定 - if (Integer.valueOf(0).equals(sourceCode)) { + } catch (Exception e) { + log.error("绑定大棚用户失败,agriId={}, msg={}", e); + resultMap.put("code", AgriEnum.WARN.getCode()); + resultMap.put("msg", "系统异常,绑定失败"); + WxUtil.pushText("【移动端添加大棚失败】来源:"+(sourceCode==0?"扫码":"邀请")+"\nuserId: 【"+userId+"】\ncause: "+e); return resultMap; } - /// 3).绑定用户超过数量 - if (userAgriList.size()>=agriManagerNum) { - resultMap.put("code", 0); - resultMap.put("msg","当前大棚关联超过限制,请联系大棚所有者!"); - return resultMap; - } - - /// 4).有所有者,当前用户非所有者 此处只可能为邀请时逻辑 - sysUserAgri.setStatus(2); - sysUserAgri.setRemark("用户邀请"); - userAgriService.save(sysUserAgri); - if (Integer.valueOf(1).equals(sourceCode)) { - resultMap.put("msg", "邀请已发送,请等待确认"); - } - return resultMap; }