whychdw
2025-05-13 07d36c1f6f0398f56769ce88c89dc2a87f03fa8a
src/views/dataMager/components/AddBattGroup.vue
@@ -15,6 +15,7 @@
              v-model="params.stationName1"
              placeholder="请选择省"
              @change="provinceChange"
              allow-create
              :filterable="true"
            >
              <el-option
@@ -34,6 +35,7 @@
              v-model="params.stationName2"
              placeholder="请选择市"
              @change="cityChange"
              allow-create
              :filterable="true"
            >
              <el-option
@@ -114,8 +116,10 @@
        <el-col :span="layout.span">
          <el-form-item label="设备类型" prop="fbsdeviceId">
            <el-select
              filterable
              v-model="params.fbsdeviceId"
              placeholder="请选择设备类型"
              @change="handleDevTypeChange"
            >
              <el-option
                v-for="item in devTypes"
@@ -138,10 +142,10 @@
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span" v-if="isInversion">
        <el-col :span="layout.span" v-if="isHasBuscouple">
          <el-form-item label="母联状态">
            <el-select
              v-model="params.buscouplestate"
              v-model="params.buscoupleState"
              placeholder="请选择母联状态"
            >
              <el-option
@@ -154,9 +158,9 @@
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="电池组类型" prop="battGroupNum">
          <el-form-item label="电池组类型" prop="cellShowType">
            <el-select
              v-model="params.battGroupNum"
              v-model="params.cellShowType"
              placeholder="请选择电池类型"
            >
              <el-option
@@ -164,6 +168,22 @@
                :key="item.value"
                :label="item.label"
                :value="item.value"
              ></el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="电路图类型" prop="topologyMapType">
            <el-select
              v-model="params.topologyMapType"
              placeholder="请选择电池类型"
              @change="handleMapTypeChange"
            >
              <el-option
                v-for="item in pictureTypes"
                :key="item.value"
                :label="item.label"
                :value="item.key"
              ></el-option>
            </el-select>
          </el-form-item>
@@ -188,8 +208,13 @@
            <el-input v-model="params.battFloatCurrent"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span" v-if="isLithiumPack">
          <el-form-item label="锂电池包个数" prop="PackCount">
            <el-input v-model="params.packCount"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="单体数量" prop="monCount">
          <el-form-item :label="monCountText" prop="monCount">
            <!--                        <el-select v-model="params.MonCount" placeholder="请选择单体数量">-->
            <!--                            <el-option label="4" value="4"></el-option>-->
            <!--                            <el-option label="24" value="24"></el-option>-->
@@ -229,7 +254,7 @@
        <!--                </el-col>-->
        <el-col :span="layout.span">
          <el-form-item label="负载电流(A)" prop="loadCurr">
            <el-input v-model="params.Load_curr"></el-input>
            <el-input v-model="params.loadCurr"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
@@ -265,7 +290,7 @@
          <el-form-item label="电池生产日期" prop="battProductDate">
            <el-date-picker
              v-model="params.battProductDate"
              size="small"
              size="mini"
              type="date"
              placeholder="选择日期"
              value-format="yyyy-MM-dd"
@@ -276,7 +301,7 @@
          <el-form-item label="投入使用日期" prop="battInUseDate">
            <el-date-picker
              v-model="params.battInUseDate"
              size="small"
              size="mini"
              type="date"
              placeholder="选择日期"
              value-format="yyyy-MM-dd"
@@ -300,8 +325,88 @@
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="基站号码">
            <el-input v-model="params.stationPhone"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="验签格式">
            <el-select v-model="params.signType" placeholder="请选择">
              <el-option
                v-for="item in signTypes"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              >
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="通信端口号">
            <el-input v-model="params.commPort"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span" v-if="isDfBms">
          <el-form-item label="BMS设备ID">
            <el-select filterable size="mini" v-model="params.deviceId">
              <el-option
                v-for="(item, key) in bmsList" :key="'key'+key"
                :disabled="item.isUsed"
                :label="item.label" :value="item.id"></el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="交直流监控屏启用">
            <el-switch
              v-model="acdcSecuityFlag"
              active-color="#13ce66"
              inactive-color="#aaa"
              active-text="启用"
              inactive-text="关闭"
              size="mini">
            </el-switch>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span" v-if="isSzdt">
          <el-form-item label="地铁线路">
            <el-select size="mini" v-model="params.stationName9" @change="subwayLineChange">
              <el-option label="无" value=""></el-option>
              <el-option
                v-for="(item, key) in subwayLines" :key="'key'+key"
                :label="item.label" :value="item.value"></el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span" v-if="isSzdt">
          <el-form-item label="地铁站点名称">
            <el-select size="mini" v-model="params.stationName8">
              <el-option label="无" value=""></el-option>
              <el-option
                v-for="(item, key) in subwayStations" :key="'key'+key"
                :label="item.label" :value="item.value"></el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="16" v-if="tabList.length">
          <el-form-item label="实时监控标签">
            <el-select v-model="tabValue" multiple placeholder="请选择">
              <el-option
                v-for="item in tabList"
                :key="item.name"
                :label="item.label"
                :value="item.name">
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <div class="form-footer">
        <three-btn @click="autoComputeIp" v-if="params.fbsdeviceId == '9100'"
          >自动计算IP</three-btn
        >
        <three-btn @click="submitFrom">确定</three-btn>
      </div>
    </el-form>
@@ -464,14 +569,21 @@
  searchCounty,
  getExistStations,
} from "@/assets/js/api.js";
import systemConfig from '@/assets/js/config';
import { searchTplAll } from "../js/eletmp";
import { searchBattProducer, add } from "../js/battGroupMager";
import { searchBattProducer, add, getMaxIp, dfBmsDevicesAPI } from "../js/battGroupMager";
import {
  const_province_city_county,
  const_battGroup,
  const_devType,
  const_battery_type,
  const_61850,
} from "@/assets/js/const";
import const_rules from "@/assets/js/const/const_rules";
import getDevIp from "@/assets/js/tools/getDevIp";
import getTabList from "@/assets/js/tools/getTabList";
export default {
  props: {
@@ -484,11 +596,24 @@
  },
  data() {
    let rules = const_battGroup.rules;
    let constRules = const_rules;
    let devTypes = const_devType.batt;
    let pictureTypes = const_devType.pictureTypes;
    let batteryTypes = const_battery_type.types;
    const subRules = {
      validator(rule, value, callback) {
        testVal(rule, value, callback, constRules.noSpecialChar);
      },
      trigger: "change",
    };
    return {
      clientName: systemConfig.clientName.name,
      jsonData: {},
      bmsList: [],
      tabValue: [],
      tabList: [],
      layout: {
        span: 8,
        span: 6,
        gutter: 16,
      },
      params: {
@@ -512,6 +637,7 @@
        floatVolLevel: "53.6", // 浮充电压阀值(V)(自动计算)
        offlineVolLevel: "51.5", // 离线电压阀值(V)(自动计算)
        battFloatCurrent: "5", // 浮充电流阀值(A)
        packCount: 1, // 锂电池包个数
        monCount: 4, // 单体数量
        monCapStd: 150, // 标称容量(AH)
        monVolStd: "2", // 标称单体电压(V)
@@ -520,16 +646,16 @@
        monVolLowToAvg: "0.05", // 单体电压次低偏移量(V)
        loadCurr: "15", // 负载电流(A)
        disCurrMax: "0", // 最大核容电流(A)
        stationPhone: "123456", // 基站号码
        stationPhone: "", // 基站号码
        battProducer: "", // 电池品牌
        battModel: "", // 电池型号
        battProductDate: "2000-01-01", // 电池生产日期
        battInUseDate: new Date().format("yyyy-MM-dd"), // 投入使用日期
        videoUrl: "", // 萤石云视频监控序列号
        chargeType: 1, // 充电类型
        buscouplestate: 0, // 母联状态
        buscoupleState: 0, // 母联状态
        tmpId: 0, // 电价模板id
        devNum: 0,
        volGrade: 0, // 电压等级(kV)
        manufacturers: "", // 生产厂家
        assetequipment: "", // 是否资产级设备
@@ -546,7 +672,16 @@
        remotemonitor: "", // 是否实现远程监控
        batttIndependentPlaced: "", // 是否独立蓄电池室放置
        junChargeVoltageValue: 0, // 均充电压设定值
        signType: 0, // 验签格式
        cellShowType: 0, // 电池类型
        topologyMapType: 0, // 拓扑图类型
        commPort: 102,    // 连接端口
        labelCfg: '',     // 实时监控的标签,使用,分隔的字符串
        deviceId: '',     // BMS设备ID
        stationName9: '',       // 地铁线路名称
        stationName8: '',       // 地铁站点名称
      },
      signTypes: const_61850.signTypes,
      tmpList: [],
      rules: {
        stationName1: [
@@ -555,6 +690,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        stationName2: [
          {
@@ -562,6 +698,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        stationName5: [
          {
@@ -569,6 +706,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        stationName3: [
          {
@@ -576,6 +714,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        stationName4: [
          {
@@ -583,6 +722,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        fbsdeviceName: [
          {
@@ -590,6 +730,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        fbsdeviceIp: [
          {
@@ -624,6 +765,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        tmpId: [
          {
@@ -631,6 +773,7 @@
            message: "请先录入电价分布模板",
            trigger: "change",
          },
          { ...subRules },
        ],
        battGroupNum: [
          {
@@ -638,6 +781,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        floatVolLevel: [
          {
@@ -645,6 +789,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        offlineVolLevel: [
          {
@@ -652,6 +797,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        battFloatCurrent: [
          {
@@ -659,6 +805,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        monResStd: [
          {
@@ -666,6 +813,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        monSerStd: [
          {
@@ -680,6 +828,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        disCurrMax: [
          {
@@ -687,6 +836,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        battGroupName: [
          {
@@ -694,6 +844,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        monVolStd: [
          {
@@ -701,6 +852,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        monCapStd: [
          {
@@ -708,6 +860,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        loadCurr: [
          {
@@ -715,6 +868,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        battProducer: [
          {
@@ -722,6 +876,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        battModel: [
          {
@@ -729,6 +884,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        battProductDate: [
          {
@@ -736,6 +892,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        battInUseDate: [
          {
@@ -743,6 +900,15 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        packCount: [
          {
            required: true,
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
        monCount: [
          {
@@ -750,6 +916,7 @@
            message: "不能为空",
            trigger: "change",
          },
          { ...subRules },
        ],
      },
      linkage: {
@@ -815,6 +982,8 @@
          value: 1,
        },
      ],
      pictureTypes: pictureTypes,
      acdcSecuityFlag: false,
    };
  },
  watch: {
@@ -823,6 +992,54 @@
    },
  },
  methods: {
    async getJson() {
      const dynamicPath = `mapJson/subway/suzhou1.json`;
      try {
        const response = await fetch(dynamicPath);
        if (!response.ok) {
          throw new Error(`HTTP error! status: ${response.status}`);
        }
        const data = await response.json();
        // console.log("data", data, "=============");
        // this.defaultData = data.l;
        return data;
      } catch (error) {
        console.error("加载 JSON 出错:", error);
      }
    },
    subwayLineChange() {
      this.params.stationName8 = "";
    },
    sortTabList(tabValue, tabList) {
      let result = [];
      for(let i=0; i<tabList.length; i++) {
        for(let j=0; j<tabValue.length;j++) {
          if(tabList[i].name === tabValue[j]) {
            result.push(tabValue[j]);
            break;
          }
        }
      }
      return result;
    },
    handleDevTypeChange() {
      let tabList = getTabList(this.params.fbsdeviceId);
      this.tabList = tabList;
      this.tabValue = [];
      tabList.forEach(item=>{
        this.tabValue.push(item.name);
      });
    },
    handleMapTypeChange() {
      // 对于假负载带母联进行特殊处理
      if (this.params.topologyMapType === 11) {
        this.params.buscoupleState = 1;
      } else {
        this.params.buscoupleState = 0;
      }
    },
    searchProvince() {
      // 省
      // 查询后台
@@ -881,7 +1098,7 @@
      // 查询后台
      getExistStations(searchParams).then((res) => {
        res = res.data;
        console.log(res, 'res======99');
        console.log(res, "res======99");
        var data = [];
        if (res.code) {
          data = res.data.map((v) => {
@@ -1155,7 +1372,11 @@
      }
    },
    battProducerOk() {
      var value = this.battProducer.value;
      var value = this.battProducer.value.trim();
      if (!value) {
        this.$message.error("不能为空");
        return false;
      }
      // 获取选择的值
      this.params.battProducer = value;
      // 记录选择的内容
@@ -1168,10 +1389,16 @@
    },
    // 提交表单设置参数
    submitFrom() {
      // 对于东峰BMS设备提前做校验
      if(this.isDfBms && !this.params.deviceId) {
        this.$layer.msg("请选择BMS设备ID");
        return;
      }
      this.$refs.ruleForm.validate((valid) => {
        // 校验通过
        if (valid) {
          var tmp = {};
          let tmp = {};
          Object.keys(this.params).forEach((key, value) => {
            tmp[key] = this.params[key];
          });
@@ -1185,6 +1412,10 @@
            tmp.stationName3 +
            "-" +
            tmp.stationName4;
          tmp.acdcSecuityFlag = this.acdcSecuityFlag * 1;
          let tabValue = this.sortTabList(this.tabValue, this.tabList);
          tmp.labelCfg = this.tabList.length !== 0?tabValue.join(','):'';
          // 添加机房
          this.addHome(tmp);
        } else {
@@ -1206,18 +1437,24 @@
              message: "添加" + batt.stationName + "成功!",
            });
            // 触发事件
            this.$emit("success");
          } else {
            this.$message({
              type: "error",
              message: "添加" + batt.stationName + "失败!",
            });
          }
          this.$emit("success");
          // 关闭加载框
          this.$layer.close(loading);
        })
        .catch((error) => {
          console.log(error);
          this.$message({
            type: "error",
            message: "修改" + batt.stationName + "失败!",
          });
          // 触发事件
          this.$emit("success");
          // 关闭加载框
          this.$layer.close(loading);
        });
@@ -1233,6 +1470,10 @@
        this.params.stationName4 = batt.stationName4;
        this.params.fbsdeviceIp = batt.fbsdeviceIp;
        this.params.fbsdeviceId = batt.fbsdeviceId;
        this.params.devNum = batt.devNum;
        this.params.videoUrl = batt.videoUrl;
        this.params.battProducer = batt.battProducer;
        this.params.battModel = batt.battModel;
      }
      let dev_id = this.params.fbsdeviceId;
      this.devTypes.forEach((item) => {
@@ -1278,19 +1519,121 @@
        this.params.tmpId = 0;
      }
    },
    dfBmsDevices() {
      dfBmsDevicesAPI()
        .then((res) => {
          res = res.data;
          console.log(res);
          if (res.code) {
            this.bmsList = res.data.map(item=>{
              item.label=item.deviceName;
              item.value = item.deviceId;
              return item;
            });
          }else {
            this.bmsList = [];
          }
        }).catch((error) => {
          this.bmsList = [];
          console.log(error);
        });
    },
    autoComputeIp() {
      let loading = this.$layer.loading();
      getMaxIp(this.params.fbsdeviceId)
        .then((res) => {
          res = res.data;
          if (res.code) {
            let dev_id = res.data;
            let ipInfo = getDevIp(dev_id);
            if (ipInfo.code == 1) {
              this.$alert(
                "设备IP:" + ipInfo.data + ",已自动更新到设备IP",
                "系统提示",
                {
                  confirmButtonText: "确定",
                }
              );
              this.params.fbsdeviceIp = ipInfo.data;
            } else {
              this.$layer.msg(ipInfo.data);
            }
          }
          // 关闭等待框
          this.$layer.close(loading);
        })
        .catch((error) => {
          // 关闭等待框
          this.$layer.close(loading);
          console.log(error);
        });
    },
  },
  computed: {
    isSzdt() {
      return this.clientName === "szdt";
    },
    subwayLines() {
      let jsonData = this.jsonData;
      let list = [];
      if(jsonData.l) {
        list = jsonData.l.map(item=>{
          return {
            label: item.ln,
            value: item.ln,
          }
        })
      }
      return list;
    },
    subwayStations() {
      let list = [];
      let jsonData = this.jsonData;
      if(jsonData.l) {
        for(let i=0; i<jsonData.l.length; i++) {
          let itemData = jsonData.l[i];
          if(itemData.ln === this.params.stationName9) {
            list = itemData.st.map(item=>{
              return {
                label: item.n,
                value: item.n
              }
            })
          }
        }
      }
      return list;
    },
    isInversion() {
      let dev_id = this.params.FBSDeviceId;
      return regEquipType(dev_id, "BTS9120");
      let dev_id = this.params.fbsdeviceId;
      return regEquipType(dev_id, ["BTS9120", 'fbo6187']);
    },
    isHasBuscouple() {
      let dev_id = this.params.fbsdeviceId;
      return regEquipType(dev_id, ["BTS9120", "BTS9110", 'fbo6187']);
    },
    isLithium() {
      // 锂电BTS
      let dev_id = this.params.FBSDeviceId;
      return regEquipType(dev_id, ["lithium"]);
      let dev_id = this.params.fbsdeviceId;
      return regEquipType(dev_id, ["lithium", "li9132", "kgdy"]);
    },
    isLithiumPack() {
      // 锂电池包
      let dev_id = this.params.fbsdeviceId;
      return regEquipType(dev_id, ["lithiumPack"]);
    },
    isDfBms() {
      // BMS
      let dev_id = this.params.fbsdeviceId;
      return regEquipType(dev_id, ["dfBms"]);
    },
    monCountText() {
      let isLithiumPack = this.isLithiumPack;
      return isLithiumPack ? "锂电池包单体个数" : "单体个数";
    },
  },
  mounted() {
  async mounted() {
    // 设置省市区县的数据
    this.linkagePlus.setData(const_province_city_county);
    // 初始化值
@@ -1304,6 +1647,12 @@
    // 查询所有的电价分布模板
    this.searchTplAll();
    this.handleDevTypeChange();
    this.dfBmsDevices();
    this.jsonData = await this.getJson();
  },
};
</script>
@@ -1323,7 +1672,7 @@
.form-footer .three-btn {
  margin-left: 12px;
}
>>> ::-webkit-input-placeholder {
::-webkit-input-placeholder {
  color: #666 !important;
}
</style>
</style>