储能智慧云平台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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  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="电站地址" prop="keywordcategory" :rules="[{ required: true, message: '请输入电站地址' }]">
  69. <el-cascader
  70. :props="props"
  71. v-model="numberValidateForm.keywordcategory"
  72. clearable
  73. size="large"
  74. placeholder="请选择服务地区"
  75. @change="oncascader"
  76. style="width: 300px; margin-right: 20px"
  77. />
  78. </el-form-item>
  79. <div class="elform1">
  80. <el-form-item label="投运时间" prop="operationDate" :rules="[{ required: true, message: '请选择投运时间' }]">
  81. <el-date-picker
  82. v-model="numberValidateForm.operationDate"
  83. type="date"
  84. size="large"
  85. style="width: 300px"
  86. placeholder="请选择投运时间"
  87. format="YYYY-MM-DD"
  88. value-format="YYYY-MM-DD"
  89. :default-value="timedate"
  90. :disabled-date="pickerOptions"
  91. />
  92. </el-form-item>
  93. </div>
  94. </div>
  95. <div class="elform">
  96. <el-form-item label="装机功率" prop="installedPower" :rules="[{ required: true, message: '请输入装机功率' }]">
  97. <el-input
  98. v-model="numberValidateForm.installedPower"
  99. style="width: 300px"
  100. size="large"
  101. type="text"
  102. placeholder="请输入装机功率"
  103. autocomplete="off"
  104. />
  105. </el-form-item>
  106. <el-form-item label="装机容量" prop="installedCap" :rules="[{ required: true, message: '请输入装机功率' }]">
  107. <el-input
  108. v-model="numberValidateForm.installedCap"
  109. style="width: 300px"
  110. size="large"
  111. type="text"
  112. placeholder="请输入装机容量"
  113. autocomplete="off"
  114. />
  115. </el-form-item>
  116. </div>
  117. <!-- <div class="elform">
  118. <el-form-item label="并网点信息">
  119. <el-input
  120. v-model.number="numberValidateForm.connection"
  121. style="width: 300px"
  122. size="large"
  123. type="text"
  124. placeholder="请输入并网点信息"
  125. autocomplete="off"
  126. />
  127. </el-form-item>
  128. <el-form-item label="变压器信息">
  129. <el-input
  130. v-model.number="numberValidateForm.transformer"
  131. style="width: 300px"
  132. size="large"
  133. type="text"
  134. placeholder="请输入变压器信息"
  135. autocomplete="off"
  136. />
  137. </el-form-item>
  138. </div> -->
  139. <div class="elform">
  140. <!-- <div>
  141. <el-form-item label="站点变压器容量">
  142. <el-input
  143. v-model.number="numberValidateForm.transformercapacity"
  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="elform1">
  153. <el-form-item label="电站图片">
  154. <UploadImgs v-model:file-list="absoluteStationPicUr1" width="300px" :limit="9">
  155. <template #empty>
  156. <el-icon><Picture /></el-icon>
  157. <span>请上传电站图片</span>
  158. </template>
  159. <template #tip>图片类型 __ jpg jpeg png</template>
  160. </UploadImgs>
  161. </el-form-item>
  162. </div>
  163. </div>
  164. <div class="elform">
  165. <div class="elform1">
  166. <el-form-item label="电站布局图">
  167. <UploadImgs v-model:file-list="layoutPicUr1" width="300px" :limit="9">
  168. <template #empty>
  169. <el-icon><Picture /></el-icon>
  170. <span>请上传电站图片</span>
  171. </template>
  172. <template #tip>图片类型 __ jpg jpeg png</template>
  173. </UploadImgs>
  174. </el-form-item>
  175. </div>
  176. </div>
  177. <el-divider />
  178. <el-form-item class="bottom">
  179. <el-button type="primary" @click="submitForm(formRef)">保存</el-button>
  180. <el-button @click="resetForm(formRef)">关闭</el-button>
  181. </el-form-item>
  182. </el-form>
  183. </div>
  184. </div>
  185. </div>
  186. </div>
  187. </template>
  188. <!-- -->
  189. <script setup lang="ts">
  190. import {
  191. updatesingleeditURL,
  192. editpowerURL,
  193. selectemssytemALLURL,
  194. insertpowerURL,
  195. getlistcountry,
  196. getliststate,
  197. getlistcity,
  198. getlistcounty
  199. } from "@/api/home/Multisite";
  200. import { CascaderOption, CascaderProps, FormInstance } from "element-plus";
  201. import { onMounted, reactive, ref } from "vue";
  202. import { useRouter, useRoute } from "vue-router";
  203. import UploadImgs from "@/components/Upload/Imgs.vue";
  204. const router = useRouter();
  205. const route = useRoute();
  206. const formRef = ref<FormInstance>();
  207. const supertype = ref(route.query.type);
  208. const selectedValue = ref([44]);
  209. const absoluteStationPicUr1 = ref();
  210. const layoutPicUr1 = ref();
  211. const numberValidateForm = reactive({
  212. id: "",
  213. powerName: "", // 电站名称
  214. url: [], // 图片
  215. arrangementplan: [],
  216. // stationtelephone: "", // 电话
  217. emsId: "", //设备id
  218. address: "", // 地址
  219. installerName: "", // 安装人名称
  220. contactPhone: "", // 安装人电话
  221. installedPower: "", // 装机功率
  222. installedCap: "", //装机容量
  223. // connection: "",
  224. // transformer: "",
  225. // transformercapacity: "",
  226. operationDate: "", // 投运时间
  227. keywordcategory: selectedValue.value[0], // 国家id
  228. provinceCode: selectedValue.value[1], // 省id
  229. cityCode: selectedValue.value[2], // 市id
  230. countyCode: selectedValue.value[3] //区id
  231. });
  232. const timedate = ref();
  233. const pickerOptions = (time: { getTime: (arg0: Date) => number }) => {
  234. return time.getTime(new Date()) > Date.now();
  235. };
  236. const submitForm = (formEl: FormInstance | undefined) => {
  237. console.log(numberValidateForm.emsId);
  238. if (!formEl) return;
  239. formEl.validate(async valid => {
  240. if (valid) {
  241. if (route.query.type == "电站新增") {
  242. // numberValidateForm.emsId;
  243. numberValidateForm.url = absoluteStationPicUr1.value.map((item: { url: any }) => item.url).join(", ");
  244. numberValidateForm.arrangementplan = layoutPicUr1.value.map((item: { url: any }) => item.url).join(", ");
  245. const { data } = await insertpowerURL(numberValidateForm);
  246. console.log(data);
  247. } else {
  248. numberValidateForm.url = absoluteStationPicUr1.value.map((item: { url: any }) => item.url).join(", ");
  249. numberValidateForm.arrangementplan = layoutPicUr1.value.map((item: { url: any }) => item.url).join(", ");
  250. const { data } = await updatesingleeditURL(numberValidateForm);
  251. console.log(data);
  252. }
  253. router.back();
  254. } else {
  255. console.log("error submit!");
  256. return false;
  257. }
  258. });
  259. };
  260. const selectemsId = ref();
  261. const onselect = () => {
  262. numberValidateForm.emsId = selectemsId.value.join();
  263. };
  264. const resetForm = (formEl: FormInstance | undefined) => {
  265. if (!formEl) return;
  266. formEl.resetFields();
  267. router.push("/powerStation/index");
  268. };
  269. const yonghueditdata = ref();
  270. const getghuedit = async () => {
  271. const { data } = await editpowerURL(route.query.id, {});
  272. yonghueditdata.value = data;
  273. numberValidateForm.id = yonghueditdata.value[0].powerId;
  274. numberValidateForm.powerName = yonghueditdata.value[0].stationName;
  275. numberValidateForm.installerName = yonghueditdata.value[0].installerName;
  276. numberValidateForm.url = yonghueditdata.value[0].url;
  277. numberValidateForm.arrangementplan = yonghueditdata.value[0].arrangementurl;
  278. selectemsId.value = [];
  279. for (let index = 0; index < yonghueditdata.value[0].emsid.length; index++) {
  280. let a = yonghueditdata.value[0].emsid[index].eid;
  281. selectemsId.value.push(a);
  282. }
  283. numberValidateForm.emsId = yonghueditdata.value[0].emsid;
  284. // numberValidateForm.address = yonghueditdata.value[0].address;
  285. numberValidateForm.contactPhone = yonghueditdata.value[0].contactPhone;
  286. numberValidateForm.installedPower = yonghueditdata.value[0].installedPower;
  287. numberValidateForm.installedCap = yonghueditdata.value[0].installedCap;
  288. numberValidateForm.operationDate = yonghueditdata.value[0].operationDate;
  289. absoluteStationPicUr1.value = [];
  290. for (let index = 0; index < yonghueditdata.value[0].url.length; index++) {
  291. absoluteStationPicUr1.value.push({
  292. url: yonghueditdata.value[0].url[index]
  293. });
  294. }
  295. layoutPicUr1.value = [];
  296. for (let index = 0; index < yonghueditdata.value[0].arrangementurl.length; index++) {
  297. layoutPicUr1.value.push({
  298. url: yonghueditdata.value[0].arrangementurl[index]
  299. });
  300. }
  301. grtselectemssytem();
  302. };
  303. // 选择设备编码
  304. const equipmentdata = ref();
  305. const grtselectemssytem = async () => {
  306. const { data } = await selectemssytemALLURL({});
  307. let arr = data;
  308. console.log(arr);
  309. const emsidArray = yonghueditdata.value[0].emsid as any[];
  310. const arrArray = arr as any[];
  311. equipmentdata.value = [...emsidArray, ...arrArray];
  312. console.log(equipmentdata.value);
  313. };
  314. // 地区
  315. const countrydata = ref();
  316. const statedata = ref();
  317. const citydata = ref();
  318. const countydata = ref();
  319. // const selectedOptions = ref(44);
  320. const props: CascaderProps = {
  321. lazy: true,
  322. checkStrictly: true,
  323. async lazyLoad(node, resolve) {
  324. if (node.level == 0) {
  325. // node为当前点击的节点,resolve为数据加载完成的回调(必须调用)
  326. let nodes: CascaderOption[] | undefined = [];
  327. // 构造查询条件 => 接口入参
  328. let params = {
  329. id: node.value // 入参名按照自己的接口来改
  330. };
  331. // 请求接口
  332. let { data } = await getlistcountry(params);
  333. // console.log(Object.values(data));
  334. if (data) {
  335. countrydata.value = data;
  336. countrydata.value.map((item: { id: any; chineseName: any }) => {
  337. let obj = {
  338. value: item.id,
  339. label: item.chineseName,
  340. leaf: node.level >= 3 // 当 node.level 层级达到2级时, 就不再请求接口
  341. // 具体要多少级才不请求接口, 根据层级修改
  342. };
  343. nodes?.push(obj);
  344. });
  345. }
  346. //重新加载节点
  347. resolve(nodes);
  348. } else if (node.level == 1) {
  349. // node为当前点击的节点,resolve为数据加载完成的回调(必须调用)
  350. let nodes: CascaderOption[] | undefined = [];
  351. // 构造查询条件 => 接口入参
  352. let params = {
  353. countryId: node.value // 入参名按照自己的接口来改
  354. };
  355. // 请求接口
  356. let { data } = await getliststate(params);
  357. if (data) {
  358. statedata.value = data;
  359. statedata.value.map((item: { id: any; chineseName: any }) => {
  360. let obj = {
  361. value: item.id,
  362. label: item.chineseName,
  363. leaf: node.level >= 3 // 当 node.level 层级达到2级时, 就不再请求接口
  364. // 具体要多少级才不请求接口, 根据层级修改
  365. };
  366. nodes?.push(obj);
  367. });
  368. }
  369. //重新加载节点
  370. resolve(nodes);
  371. } else if (node.level == 2) {
  372. // node为当前点击的节点,resolve为数据加载完成的回调(必须调用)
  373. let nodes: CascaderOption[] | undefined = [];
  374. // 构造查询条件 => 接口入参
  375. let params = {
  376. stateId: node.value // 入参名按照自己的接口来改
  377. };
  378. // 请求接口
  379. let { data } = await getlistcity(params);
  380. if (data) {
  381. citydata.value = data;
  382. citydata.value.map((item: { id: any; chineseName: any }) => {
  383. let obj = {
  384. value: item.id,
  385. label: item.chineseName,
  386. leaf: node.level >= 3 // 当 node.level 层级达到2级时, 就不再请求接口
  387. // 具体要多少级才不请求接口, 根据层级修改
  388. };
  389. nodes?.push(obj);
  390. });
  391. }
  392. //重新加载节点
  393. resolve(nodes);
  394. } else if (node.level == 3) {
  395. // node为当前点击的节点,resolve为数据加载完成的回调(必须调用)
  396. let nodes: CascaderOption[] | undefined = [];
  397. // 构造查询条件 => 接口入参
  398. let params = {
  399. cityId: node.value // 入参名按照自己的接口来改
  400. };
  401. // 请求接口
  402. let { data } = await getlistcounty(params);
  403. countydata.value = data;
  404. if (data) {
  405. countydata.value.map((item: { id: any; chineseName: any }) => {
  406. let obj = {
  407. value: item.id,
  408. label: item.chineseName,
  409. leaf: true // 当 node.level 层级达到2级时, 就不再请求接口
  410. // 具体要多少级才不请求接口, 根据层级修改
  411. };
  412. nodes?.push(obj);
  413. });
  414. }
  415. //重新加载节点
  416. resolve(nodes);
  417. }
  418. }
  419. };
  420. // 中国省市县
  421. const oncascader = async (selectedValues: any) => {
  422. console.log(selectedValues);
  423. selectedValue.value = selectedValues;
  424. };
  425. onMounted(() => {
  426. if (route.query.type == "电站编辑") {
  427. getghuedit();
  428. } else {
  429. grtselectemssytem();
  430. }
  431. });
  432. </script>
  433. <!-- 电站 -->
  434. <style scoped lang="scss">
  435. @import "./addition.scss";
  436. </style>
  437. <!-- -->