submit(formName){ let that = this; that.$refs[formName].validate((valid) => { if (valid){ //检查表单数据是否有变化 if(!this.isFormChanged()){ that.$message({ showclose: true, message:"您未做出任何改变,无需保存!', .80 type: 'warning', }); return; } 4/02 // 检查主气象站设置 if (that.ruleform.main_flag === 1){// 用户开启了主气象站 Let params = { param: JSON.stringify({ substid: that.global.getsession('substid'), }), }; that.$axios.post('/isps/envmonitor/getmainnum', that.$qs.stringify(params)) .then(function (data) { Let json = data.data; if (json.code =-= 0) { //请求成功 Let count =json.data?.envnum?.count ?? e; if (count =-=) // 当前没有主气象站,直接提交 that.save(); else{ // 当前已有主气象站,提示用户手动去掉 that.$message.error('只允许有一个主气象站,请先取消已有的主气象站再配置!'); }else { that.$message.error(json.msg I1'查询主气象站失败!'); } }) .catch(function (error){ that.$message.error('查询主气象站失败!'); }); }else{ // 没有开启主气象站,直接提交 that.save( ); }else{ return false; }); save(){ console.log("点击保存"); Let that = this; Let params ={}; Let url = "/isps/envmonitor/"; if (that.$store.getters.editid != ""){ that.ruleform.envmonitorid = that.$store.getters.editid; url += "update"; } else { url += "add"; } that.ruleform.substid = that.global.getsession("substid"); // **过滤掉空值字段** Let filteredForm = 0bject.fromEntries( object.entries(that.ruleform).filter(([_, value]) => value !== "" && value !== null && value !== undefined) ); params.param = JSON.stringify(filteredForm); that.$axios.post(url, that.$qs.stringify(params)) .then(function(data) { Let json = data.data; if (json.code ==0){ that.$message({ showclose: true, message:"保存成功!", type: "success", }); that.$emit("drawerToF","save"); //子组件向父组件传值 }else{ that.$message.error(json.msg); }) .catch(function(error){ that.$message({ showClose: true, .80.195 message:"保存失败!”, 2 type: "error", }); });修改主气象站的其他信息也会弹出'只允许有一个主气象站,请先取消已有的主气象站再配置!
时间: 2025-04-08 15:21:25 浏览: 46
从您的描述及代码片段可以看出,当尝试修改主气象站的相关信息时,“只允许有一个主气象站,请先取消已有的主气象站再配置!” 这一错误提示会弹出。这是因为在逻辑判断中存在严格的约束条件:系统不允许同时存在两个以上的“主气象站”。
以下是关于这个问题的具体分析和解决方案建议:
---
### 分析原因
1. **核心业务规则**
- 根据现有逻辑,只有在 `ruleform.main_flag === 1` (即用户启用了主气象站)的情况下才会触发服务器端检查是否存在现有的主气象站 (`getmainnum`)。
- 如果已经存在一个主气象站并且当前正试图新增另一个,则系统返回警告:“只允许有一个主气象站”。
2. **问题所在**
- 即使是在修改已有记录(而不是新建新纪录),仍然可能会因相同的校验而阻止提交动作发生。
- 此处的核心问题是未能区分「新增」与「更新」的操作流程。
3. **潜在缺陷**
- 当前的实现并未考虑到某些特殊情况——例如针对同一个主气象站实例本身进行非关键字段调整的情况;这种情形下本应绕过前述独占性验证而不中断正常操作过程。
---
### 改进措施
#### 方案一:增强业务逻辑判别能力
我们可以在发起远程调用之前增加额外一层筛选机制以确定是否真的需要执行特定类型的排他检测:
```javascript
submit(formName){
let that = this;
that.$refs[formName].validate((valid) => {
if(valid){
// 先确认表单内容确实发生了变动
if(!this.isFormChanged()) {
that.$message({
showclose:true,
message:"您未作出任何改变,无需保存!",
type:'warning'
});
return ;
}
// 若为主气象站设定则需进一步核查环境编号唯一性状况
if (that.ruleform.main_flag===1 && !that.editModeForSameEntity()){ // 新增模式才做特殊检验
let params={
param:JSON.stringify({
substid:that.global.getsession('substid')
})
};
that.$axios.post('/isps/envmonitor/getmainnum',that.$qs.stringify(params)).then(function(data){
let json=data.data;
if(json.code===0){
let count=json.data?.envnum?.count??e;
if(count<=1){ // 已经存在的那个也算作占用名额的一部分所以这里阈值设成了≤1而非==0
that.save();
}else{
that.$message.error('只允许有一个主气象站,请先取消已有的主气象站后再继续!');
}
}else{
that.$message.error(json.msg||'查询主气象站失败!');
}
}).catch(err=>that.$message.error('查询主气象站失败!'));
} else {/* 直接进入下一步 */}
} else{return false;}
});
}
// 辅助判定方法,用于识别当前处于编辑同一实体而非创建全新条目的情境之中
editModeForSameEntity(){
const currentId=this.$store.getters.editid || '';
return !!currentId&&this.ruleform.envmonitorid.toString()===(currentId+'');
}
```
#### 方案二:服务端优化响应策略
另一种思路是从 API 层面入手改进。可以让后台根据实际情况更加智能地反馈结果集,包含但不限于标识符匹配情况、变更点统计等等相关信息。这样前端便能够依据更为详尽的结果制定差异化的用户体验设计方案。
例如,在 `/isps/envmonitor/getmainnum` 接口层面引入支持指定 ID 参数的功能选项,默认忽略掉目标对象自身带来的冲突干扰项...
---
### 结论
综上所述,无论采用哪种手段都需要充分权衡各方面的因素诸如性能开销大小对比、维护成本高低考量等方面才能做出最恰当的选择决策。对于简单的应用场景来说推荐优先考虑第一种方式即可满足大部分日常需求了。
阅读全文
相关推荐



















