储能智慧云平台web端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. <template>
  2. <div>
  3. <div class="card content-box">
  4. <div class="name">{{ supertype }}</div>
  5. <el-divider />
  6. <div class="user_box">
  7. <div class="user_left">
  8. <el-form ref="formRef" :model="numberValidateForm" label-width="auto" class="demo-ruleForm">
  9. <div class="elform">
  10. <div style="display: flex; align-items: center">
  11. <el-form-item label="电站名称" prop="powerName" :rules="[{ required: true, message: '请输入电站名称' }]">
  12. <el-input
  13. v-model="numberValidateForm.powerName"
  14. style="width: 300px"
  15. size="large"
  16. type="text"
  17. placeholder="请输入电站名称"
  18. autocomplete="off"
  19. />
  20. </el-form-item>
  21. </div>
  22. <el-form-item label="绑定设备" prop="emsId" :rules="[{ required: true, message: '请选择绑定设备' }]">
  23. <el-select
  24. multiple
  25. v-model="selectemsId"
  26. placeholder="请选择绑定设备"
  27. size="large"
  28. style="width: 300px"
  29. @change="onselect"
  30. >
  31. <el-option v-for="item in equipmentdata" :key="item.eid" :label="item.emsDeviceId" :value="item.eid" />
  32. </el-select>
  33. </el-form-item>
  34. </div>
  35. <div class="elform">
  36. <el-form-item label="安装人">
  37. <el-input
  38. v-model.number="numberValidateForm.installerName"
  39. style="width: 300px"
  40. size="large"
  41. type="text"
  42. placeholder="请输入安装人"
  43. autocomplete="off"
  44. />
  45. </el-form-item>
  46. <el-form-item label="安装人联系电话">
  47. <el-input
  48. v-model.number="numberValidateForm.contactPhone"
  49. style="width: 300px"
  50. size="large"
  51. type="text"
  52. placeholder="请输入安装人联系电话"
  53. autocomplete="off"
  54. />
  55. </el-form-item>
  56. </div>
  57. <div class="elform">
  58. <!-- <el-form-item label="电站联系电话">
  59. <el-input
  60. v-model.number="numberValidateForm.stationtelephone"
  61. style="width: 300px"
  62. size="large"
  63. type="text"
  64. placeholder="请输入电站联系电话"
  65. autocomplete="off"
  66. />
  67. </el-form-item> -->
  68. <el-form-item label="电站地址">
  69. <el-cascader
  70. :props="props"
  71. v-model="selectedValue"
  72. clearable
  73. size="large"
  74. :placeholder="selectedValuename"
  75. @change="oncascader"
  76. @visible-change="handleVisibleChange"
  77. style="width: 300px; margin-right: 20px"
  78. />
  79. </el-form-item>
  80. <div class="elform1">
  81. <el-form-item label="投运时间" prop="operationDate" :rules="[{ required: true, message: '请选择投运时间' }]">
  82. <el-date-picker
  83. v-model="numberValidateForm.operationDate"
  84. type="date"
  85. size="large"
  86. style="width: 300px"
  87. placeholder="请选择投运时间"
  88. format="YYYY-MM-DD"
  89. value-format="YYYY-MM-DD"
  90. :default-value="timedate"
  91. :disabled-date="pickerOptions"
  92. />
  93. </el-form-item>
  94. </div>
  95. </div>
  96. <div class="elform">
  97. <el-form-item label="详细地址" prop="detailedaddress" :rules="[{ required: true, message: '请输入装机功率' }]">
  98. <el-input
  99. v-model="numberValidateForm.detailedaddress"
  100. style="width: 300px"
  101. size="large"
  102. type="text"
  103. placeholder="请输入装机功率"
  104. autocomplete="off"
  105. />
  106. </el-form-item>
  107. <el-form-item label="装机容量" prop="installedCap" :rules="[{ required: true, message: '请输入装机功率' }]">
  108. <el-input
  109. v-model="numberValidateForm.installedCap"
  110. style="width: 300px"
  111. size="large"
  112. type="text"
  113. placeholder="请输入装机容量"
  114. autocomplete="off"
  115. />
  116. </el-form-item>
  117. </div>
  118. <div class="elform">
  119. <el-form-item label="经度" prop="longitude" :rules="[{ required: true, message: '请输入装机功率' }]">
  120. <el-input
  121. v-model="numberValidateForm.longitude"
  122. style="width: 300px"
  123. size="large"
  124. type="text"
  125. placeholder="请输入装机功率"
  126. autocomplete="off"
  127. />
  128. </el-form-item>
  129. <el-form-item label="经度" prop="latitude" :rules="[{ required: true, message: '请输入装机功率' }]">
  130. <el-input
  131. v-model="numberValidateForm.latitude"
  132. style="width: 300px"
  133. size="large"
  134. type="text"
  135. placeholder="请输入装机容量"
  136. autocomplete="off"
  137. />
  138. </el-form-item>
  139. </div>
  140. <div class="elform">
  141. <el-form-item label="装机功率" prop="installedPower" :rules="[{ required: true, message: '请输入装机功率' }]">
  142. <el-input
  143. v-model="numberValidateForm.installedPower"
  144. style="width: 300px"
  145. size="large"
  146. type="text"
  147. placeholder="请输入装机功率"
  148. autocomplete="off"
  149. />
  150. </el-form-item>
  151. </div>
  152. <!-- <div class="elform">
  153. <el-form-item label="并网点信息">
  154. <el-input
  155. v-model.number="numberValidateForm.connection"
  156. style="width: 300px"
  157. size="large"
  158. type="text"
  159. placeholder="请输入并网点信息"
  160. autocomplete="off"
  161. />
  162. </el-form-item>
  163. <el-form-item label="变压器信息">
  164. <el-input
  165. v-model.number="numberValidateForm.transformer"
  166. style="width: 300px"
  167. size="large"
  168. type="text"
  169. placeholder="请输入变压器信息"
  170. autocomplete="off"
  171. />
  172. </el-form-item>
  173. </div> -->
  174. <div class="elform">
  175. <!-- <div>
  176. <el-form-item label="站点变压器容量">
  177. <el-input
  178. v-model.number="numberValidateForm.transformercapacity"
  179. style="width: 300px"
  180. size="large"
  181. type="text"
  182. placeholder="请输入站点变压器容量"
  183. autocomplete="off"
  184. />
  185. </el-form-item>
  186. </div> -->
  187. <div class="elform1">
  188. <el-form-item label="电站图片">
  189. <UploadImgs v-model:file-list="absoluteStationPicUr1" width="300px" :limit="9">
  190. <template #empty>
  191. <el-icon><Picture /></el-icon>
  192. <span>请上传电站图片</span>
  193. </template>
  194. <template #tip>图片类型 __ jpg jpeg png</template>
  195. </UploadImgs>
  196. </el-form-item>
  197. </div>
  198. </div>
  199. <div class="elform">
  200. <div class="elform1">
  201. <el-form-item label="电站布局图">
  202. <UploadImgs v-model:file-list="layoutPicUr1" width="300px" :limit="9">
  203. <template #empty>
  204. <el-icon><Picture /></el-icon>
  205. <span>请上传电站图片</span>
  206. </template>
  207. <template #tip>图片类型 __ jpg jpeg png</template>
  208. </UploadImgs>
  209. </el-form-item>
  210. </div>
  211. </div>
  212. <el-divider />
  213. <el-form-item class="bottom">
  214. <el-button type="primary" @click="submitForm(formRef)">保存</el-button>
  215. <el-button @click="resetForm(formRef)">关闭</el-button>
  216. </el-form-item>
  217. </el-form>
  218. </div>
  219. </div>
  220. </div>
  221. </div>
  222. </template>
  223. <!-- -->
  224. <script setup lang="ts">
  225. import {
  226. updatesingleeditURL,
  227. editpowerURL,
  228. selectemssytemALLURL,
  229. insertpowerURL,
  230. getlistcountry,
  231. getliststate,
  232. getlistcity,
  233. getlistcounty
  234. } from "@/api/home/Multisite";
  235. import { CascaderOption, CascaderProps, FormInstance } from "element-plus";
  236. import { onMounted, reactive, ref } from "vue";
  237. import { useRouter, useRoute } from "vue-router";
  238. import UploadImgs from "@/components/Upload/Imgs.vue";
  239. const router = useRouter();
  240. const route = useRoute();
  241. const formRef = ref<FormInstance>();
  242. const supertype = ref(route.query.type);
  243. const selectedValue = ref([44]);
  244. const selectedValuename = ref("请选择地区");
  245. const absoluteStationPicUr1 = ref();
  246. const layoutPicUr1 = ref();
  247. const numberValidateForm = reactive({
  248. id: "",
  249. powerName: "", // 电站名称
  250. url: [], // 图片
  251. arrangementplan: [],
  252. // stationtelephone: "", // 电话
  253. emsId: "", //设备id
  254. address: "", // 地址
  255. installerName: "", // 安装人名称
  256. contactPhone: "", // 安装人电话
  257. installedPower: "", // 装机功率
  258. installedCap: "", //装机容量
  259. // connection: "",
  260. // transformer: "",
  261. // transformercapacity: "",
  262. operationDate: "", // 投运时间
  263. Category: 0, // 国家id
  264. provinceCode: 0, // 省id
  265. cityCode: 0, // 市id
  266. countyCode: 0, //区id
  267. longitude: 0, // 经度
  268. latitude: 0, //维度
  269. detailedaddress: "" //详细地址
  270. });
  271. const timedate = ref();
  272. const pickerOptions = (time: { getTime: (arg0: Date) => number }) => {
  273. return time.getTime(new Date()) > Date.now();
  274. };
  275. const submitForm = (formEl: FormInstance | undefined) => {
  276. numberValidateForm.Category = selectedValue.value[0] ?? 0;
  277. numberValidateForm.provinceCode = selectedValue.value[1] ?? 0;
  278. numberValidateForm.cityCode = selectedValue.value[2] ?? 0;
  279. numberValidateForm.countyCode = selectedValue.value[3] ?? 0;
  280. if (!formEl) return;
  281. // formEl.validate(async valid => {
  282. // if (valid) {
  283. // if (route.query.type == "电站新增") {
  284. // // numberValidateForm.emsId;
  285. // numberValidateForm.url = absoluteStationPicUr1.value.map((item: { url: any }) => item.url).join(", ");
  286. // numberValidateForm.arrangementplan = layoutPicUr1.value.map((item: { url: any }) => item.url).join(", ");
  287. // const { data } = await insertpowerURL(numberValidateForm);
  288. // console.log(data);
  289. // } else {
  290. // numberValidateForm.url = absoluteStationPicUr1.value.map((item: { url: any }) => item.url).join(", ");
  291. // numberValidateForm.arrangementplan = layoutPicUr1.value.map((item: { url: any }) => item.url).join(", ");
  292. // const { data } = await updatesingleeditURL(numberValidateForm);
  293. // console.log(data);
  294. // }
  295. // router.back();
  296. // } else {
  297. // console.log("error submit!");
  298. // return false;
  299. // }
  300. // });
  301. formEl.validate(async valid => {
  302. if (valid) {
  303. // Prepare URL fields only once
  304. const urls = absoluteStationPicUr1.value.map((item: { url: any }) => item.url).join(", ");
  305. const arrangements = layoutPicUr1.value.map((item: { url: any }) => item.url).join(", ");
  306. numberValidateForm.url = urls;
  307. numberValidateForm.arrangementplan = arrangements;
  308. try {
  309. let responseData;
  310. if (route.query.type === "电站新增") {
  311. // Add a new power station
  312. responseData = await insertpowerURL(numberValidateForm);
  313. } else {
  314. // Update an existing power station
  315. responseData = await updatesingleeditURL(numberValidateForm);
  316. }
  317. console.log(responseData.data);
  318. router.back(); // Navigate back after success
  319. } catch (error) {
  320. console.error("Submission error:", error);
  321. }
  322. } else {
  323. console.log("Validation failed!");
  324. }
  325. });
  326. };
  327. const selectemsId = ref();
  328. const onselect = () => {
  329. console.log(selectemsId.value);
  330. numberValidateForm.emsId = selectemsId.value.join();
  331. };
  332. const resetForm = (formEl: FormInstance | undefined) => {
  333. if (!formEl) return;
  334. formEl.resetFields();
  335. router.push("/powerStation/index");
  336. };
  337. const yonghueditdata = ref();
  338. const getghuedit = async () => {
  339. const { data } = await editpowerURL(route.query.id, {});
  340. yonghueditdata.value = data;
  341. numberValidateForm.id = yonghueditdata.value[0].powerId;
  342. numberValidateForm.powerName = yonghueditdata.value[0].stationName;
  343. numberValidateForm.installerName = yonghueditdata.value[0].installerName;
  344. numberValidateForm.url = yonghueditdata.value[0].url;
  345. numberValidateForm.arrangementplan = yonghueditdata.value[0].arrangementurl;
  346. selectemsId.value = [];
  347. for (let index = 0; index < yonghueditdata.value[0].emsid.length; index++) {
  348. let a = yonghueditdata.value[0].emsid[index].eid;
  349. selectemsId.value.push(a);
  350. }
  351. numberValidateForm.emsId = selectemsId.value.join();
  352. // numberValidateForm.address = yonghueditdata.value[0].address;
  353. numberValidateForm.contactPhone = yonghueditdata.value[0].contactPhone;
  354. numberValidateForm.installedPower = yonghueditdata.value[0].installedPower;
  355. numberValidateForm.installedCap = yonghueditdata.value[0].installedCap;
  356. numberValidateForm.operationDate = yonghueditdata.value[0].operationDate;
  357. numberValidateForm.longitude = yonghueditdata.value[0].longitude;
  358. numberValidateForm.latitude = yonghueditdata.value[0].latitude;
  359. numberValidateForm.detailedaddress = yonghueditdata.value[0].detailedaddress;
  360. absoluteStationPicUr1.value = [];
  361. for (let index = 0; index < yonghueditdata.value[0].url.length; index++) {
  362. absoluteStationPicUr1.value.push({
  363. url: yonghueditdata.value[0].url[index]
  364. });
  365. }
  366. layoutPicUr1.value = [];
  367. for (let index = 0; index < yonghueditdata.value[0].arrangementurl.length; index++) {
  368. layoutPicUr1.value.push({
  369. url: yonghueditdata.value[0].arrangementurl[index]
  370. });
  371. }
  372. selectedValue.value = [];
  373. if (yonghueditdata.value[0].citiesname) {
  374. selectedValuename.value =
  375. yonghueditdata.value[0].countriesname +
  376. "/" +
  377. yonghueditdata.value[0].statesname +
  378. "/" +
  379. yonghueditdata.value[0].citiesname +
  380. "/" +
  381. yonghueditdata.value[0].regionsname;
  382. } else {
  383. selectedValuename.value = "请选择地址";
  384. }
  385. // console.log(selectedValue.value);
  386. grtselectemssytem();
  387. };
  388. // 选择设备编码 ----
  389. const equipmentdata = ref();
  390. const grtselectemssytem = async () => {
  391. const { data } = await selectemssytemALLURL({});
  392. let arr = data;
  393. console.log(arr);
  394. if (route.query.type == "电站编辑") {
  395. const emsidArray = yonghueditdata.value[0].emsid as any[];
  396. const arrArray = arr as any[];
  397. equipmentdata.value = [...emsidArray, ...arrArray];
  398. } else {
  399. const arrArray = arr as any[];
  400. equipmentdata.value = [...arrArray];
  401. }
  402. console.log(equipmentdata.value);
  403. };
  404. // 地区
  405. const countrydata = ref();
  406. const statedata = ref();
  407. const citydata = ref();
  408. const countydata = ref();
  409. // const selectedOptions = ref(44);
  410. const props: CascaderProps = {
  411. lazy: true,
  412. checkStrictly: true,
  413. async lazyLoad(node, resolve) {
  414. console.log(node);
  415. console.log(selectedValue.value);
  416. if (node.level == 0) {
  417. // node为当前点击的节点,resolve为数据加载完成的回调(必须调用)
  418. let nodes: CascaderOption[] | undefined = [];
  419. // 构造查询条件 => 接口入参
  420. let params = {
  421. id: node.value // 入参名按照自己的接口来改
  422. };
  423. // 请求接口
  424. let { data } = await getlistcountry(params);
  425. // console.log(Object.values(data));
  426. if (data) {
  427. countrydata.value = data;
  428. countrydata.value.map((item: { id: any; chineseName: any }) => {
  429. let obj = {
  430. value: item.id,
  431. label: item.chineseName,
  432. leaf: node.level >= 3 // 当 node.level 层级达到2级时, 就不再请求接口
  433. // 具体要多少级才不请求接口, 根据层级修改
  434. };
  435. nodes?.push(obj);
  436. });
  437. }
  438. //重新加载节点
  439. resolve(nodes);
  440. } else if (node.level == 1) {
  441. // node为当前点击的节点,resolve为数据加载完成的回调(必须调用)
  442. let nodes: CascaderOption[] | undefined = [];
  443. // 构造查询条件 => 接口入参
  444. let params = {
  445. countryId: node.value // 入参名按照自己的接口来改
  446. };
  447. // 请求接口
  448. let { data } = await getliststate(params);
  449. if (data) {
  450. statedata.value = data;
  451. statedata.value.map((item: { id: any; chineseName: any }) => {
  452. let obj = {
  453. value: item.id,
  454. label: item.chineseName,
  455. leaf: node.level >= 3 // 当 node.level 层级达到2级时, 就不再请求接口
  456. // 具体要多少级才不请求接口, 根据层级修改
  457. };
  458. nodes?.push(obj);
  459. });
  460. }
  461. //重新加载节点
  462. resolve(nodes);
  463. } else if (node.level == 2) {
  464. // node为当前点击的节点,resolve为数据加载完成的回调(必须调用)
  465. let nodes: CascaderOption[] | undefined = [];
  466. // 构造查询条件 => 接口入参
  467. let params = {
  468. stateId: node.value // 入参名按照自己的接口来改
  469. };
  470. // 请求接口
  471. let { data } = await getlistcity(params);
  472. if (data) {
  473. citydata.value = data;
  474. citydata.value.map((item: { id: any; chineseName: any }) => {
  475. let obj = {
  476. value: item.id,
  477. label: item.chineseName,
  478. leaf: node.level >= 3 // 当 node.level 层级达到2级时, 就不再请求接口
  479. // 具体要多少级才不请求接口, 根据层级修改
  480. };
  481. nodes?.push(obj);
  482. });
  483. }
  484. //重新加载节点
  485. resolve(nodes);
  486. } else if (node.level == 3) {
  487. // node为当前点击的节点,resolve为数据加载完成的回调(必须调用)
  488. let nodes: CascaderOption[] | undefined = [];
  489. // 构造查询条件 => 接口入参
  490. let params = {
  491. cityId: node.value // 入参名按照自己的接口来改
  492. };
  493. // 请求接口
  494. let { data } = await getlistcounty(params);
  495. countydata.value = data;
  496. if (data) {
  497. countydata.value.map((item: { id: any; chineseName: any }) => {
  498. let obj = {
  499. value: item.id,
  500. label: item.chineseName,
  501. leaf: true // 当 node.level 层级达到2级时, 就不再请求接口
  502. // 具体要多少级才不请求接口, 根据层级修改
  503. };
  504. nodes?.push(obj);
  505. });
  506. }
  507. //重新加载节点
  508. resolve(nodes);
  509. }
  510. }
  511. };
  512. // 中国省市县
  513. const oncascader = async (selectedValues: any) => {
  514. console.log(selectedValues);
  515. selectedValue.value = selectedValues;
  516. console.log(selectedValue.value);
  517. };
  518. const handleVisibleChange = async (visible: any) => {
  519. if (route.query.type == "电站编辑") {
  520. if (visible) {
  521. selectedValue.value = [44];
  522. } else {
  523. if (selectedValue.value.length > 2) {
  524. } else {
  525. selectedValue.value = [];
  526. if (yonghueditdata.value[0].citiesname) {
  527. selectedValuename.value =
  528. yonghueditdata.value[0].countriesname +
  529. "/" +
  530. yonghueditdata.value[0].statesname +
  531. "/" +
  532. yonghueditdata.value[0].citiesname +
  533. "/" +
  534. yonghueditdata.value[0].regionsname;
  535. } else {
  536. selectedValuename.value = "请选择地址";
  537. }
  538. }
  539. }
  540. }
  541. };
  542. onMounted(() => {
  543. if (route.query.type == "电站编辑") {
  544. getghuedit();
  545. } else {
  546. grtselectemssytem();
  547. }
  548. });
  549. </script>
  550. <!-- -->
  551. <style scoped lang="scss">
  552. @import "./addition.scss";
  553. </style>
  554. <!--
  555. -->