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

addition.vue 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  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>
  8. <el-form ref="formRef" :model="numberValidateForm" label-width="auto" class="demo-ruleForm">
  9. <div class="user_div">
  10. <el-form-item
  11. prop="departmentId"
  12. :rules="[
  13. {
  14. required: true,
  15. type: 'array',
  16. validator: (rule: any, value: any, callback: any) => {
  17. if (value.length == 0) {
  18. callback(new Error('请分配电站!'));
  19. } else {
  20. if (value.length == 1 && value[0] == '') {
  21. callback(new Error('请分配电站!'));
  22. } else {
  23. callback();
  24. }
  25. }
  26. },
  27. trigger: 'change'
  28. }
  29. ]"
  30. >
  31. <div class="user_right">
  32. <TreeFilter
  33. multiple
  34. title="电站权限"
  35. label="powerName"
  36. :data="TreeDatalist"
  37. id="powerId"
  38. :default-value="numberValidateForm.departmentId"
  39. @change="changeTreeFilter"
  40. />
  41. </div>
  42. </el-form-item>
  43. <div class="user_left">
  44. <div class="elform">
  45. <el-form-item label="用户名称:" prop="userName" :rules="[{ required: true, message: '请输入用户名称' }]">
  46. <el-input
  47. v-model.number="numberValidateForm.userName"
  48. style="width: 300px"
  49. size="large"
  50. type="text"
  51. placeholder="请输入用户名称"
  52. autocomplete="off"
  53. />
  54. </el-form-item>
  55. <el-form-item label="归属部门:" prop="deptId">
  56. <!-- <el-input
  57. v-model.number="numberValidateForm.age"
  58. style="width: 300px"
  59. size="large"
  60. type="text"
  61. placeholder="归属部门"
  62. autocomplete="off"
  63. /> -->
  64. <!-- <el-select v-model="numberValidateForm.deptId" placeholder="请选择部门" size="large" style="width: 300px">
  65. <el-option v-for="item in treeData" :key="item.id" :label="item.name" :value="item.id" />
  66. </el-select> -->
  67. <el-cascader
  68. style="width: 300px"
  69. v-model="numberValidateForm.deptId"
  70. :options="treeData[0].children"
  71. :show-all-levels="false"
  72. :props="{ checkStrictly: true, label: 'name', value: 'id', children: 'children' }"
  73. @change="handleChange"
  74. />
  75. </el-form-item>
  76. </div>
  77. <div class="elform">
  78. <el-form-item
  79. label="手机号码:"
  80. prop="phonenumber"
  81. :rules="[
  82. { required: true, message: '请输入手机号码', trigger: 'blur' },
  83. { pattern: /^1[3456789]\d{9}$/, message: '手机号码格式不正确', trigger: 'blur' }
  84. ]"
  85. >
  86. <el-input
  87. v-model.number="numberValidateForm.phonenumber"
  88. style="width: 300px"
  89. size="large"
  90. type="text"
  91. placeholder="手机号码"
  92. />
  93. </el-form-item>
  94. <el-form-item label="岗位:" prop="postIds">
  95. <el-select
  96. v-model="numberValidateForm.postIds"
  97. placeholder="请选择部门"
  98. size="large"
  99. style="width: 300px"
  100. multiple
  101. >
  102. <el-option v-for="item in platformData.post" :key="item.id" :label="item.postName" :value="item.id" />
  103. </el-select>
  104. </el-form-item>
  105. </div>
  106. <div class="elform">
  107. <el-form-item label="登录账号:" prop="loginName" :rules="[{ required: true, message: '请输入登录账号' }]">
  108. <el-input
  109. v-model="numberValidateForm.loginName"
  110. style="width: 300px"
  111. size="large"
  112. type="text"
  113. placeholder="登录账号"
  114. />
  115. </el-form-item>
  116. <el-form-item label="登录密码:" prop="password" :rules="[{ required: true, message: '请输入登录密码' }]">
  117. <el-input
  118. v-model="numberValidateForm.password"
  119. style="width: 300px"
  120. size="large"
  121. type="text"
  122. placeholder="登录密码"
  123. show-password
  124. autocomplete="new-password"
  125. />
  126. </el-form-item>
  127. </div>
  128. <div class="elform">
  129. <el-form-item
  130. label="邮箱:"
  131. prop="email"
  132. :rules="[
  133. { required: true, message: '请输入邮箱', trigger: 'blur' },
  134. {
  135. pattern: /^([A-Za-z0-9_\-.])+@([A-Za-z0-9_\-.])+\.([A-Za-z]{2,4})$/,
  136. message: '邮箱格式不正确',
  137. trigger: 'blur'
  138. }
  139. ]"
  140. >
  141. <el-input
  142. v-model="numberValidateForm.email"
  143. style="width: 300px"
  144. size="large"
  145. type="text"
  146. placeholder="邮箱"
  147. />
  148. </el-form-item>
  149. <el-form-item label="推送类型:" prop="postIds">
  150. <el-select
  151. v-model="numberValidateForm.emailType"
  152. placeholder="选择推送模式"
  153. style="width: 300px"
  154. size="large"
  155. >
  156. <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
  157. </el-select>
  158. </el-form-item>
  159. </div>
  160. <div class="elform">
  161. <el-form-item label="推送时间:">
  162. <el-time-select
  163. v-model="numberValidateForm.emailTypetime"
  164. style="width: 300px"
  165. start="00:00"
  166. step="00:30"
  167. end="24:00"
  168. placeholder="推送时间"
  169. />
  170. </el-form-item>
  171. <el-form-item label="角色:">
  172. <el-radio-group style="width: 300px" v-model="numberValidateForm.roleIds[0]">
  173. <el-radio v-for="item in platformData.role" :key="item.id" :value="item.id">{{ item.roleName }}</el-radio>
  174. </el-radio-group>
  175. </el-form-item>
  176. </div>
  177. <div class="elform">
  178. <el-form-item label="用户性别:">
  179. <el-radio-group v-model="numberValidateForm.sex">
  180. <el-radio value="0">男</el-radio>
  181. <el-radio value="1">女</el-radio>
  182. </el-radio-group>
  183. </el-form-item>
  184. <div style="width: 400px">
  185. <el-form-item label="用户状态:" prop="status">
  186. <el-switch v-model="numberValidateForm.status" />
  187. </el-form-item>
  188. </div>
  189. </div>
  190. <div class="elform">
  191. <el-form-item label="备注:">
  192. <el-input
  193. v-model="numberValidateForm.remark"
  194. style="width: 1000px"
  195. :rows="6"
  196. type="textarea"
  197. placeholder="请输入备注"
  198. />
  199. </el-form-item>
  200. </div>
  201. </div>
  202. </div>
  203. <el-divider />
  204. <el-form-item class="bottom">
  205. <el-button type="primary" @click="submitForm(formRef)">保存</el-button>
  206. <el-button @click="resetForm(formRef)">关闭</el-button>
  207. </el-form-item>
  208. </el-form>
  209. </div>
  210. </div>
  211. </div>
  212. </div>
  213. </template>
  214. <!-- -->
  215. <script setup lang="ts">
  216. import {
  217. gettreeData,
  218. platformlist,
  219. platformadd,
  220. yonghuedit,
  221. getresetPwd,
  222. platformedit,
  223. selectTenantPower
  224. // selectPowerstation
  225. } from "@/api/home/Multisite.js";
  226. import { onMounted, reactive, ref } from "vue";
  227. import { useRouter, useRoute } from "vue-router";
  228. import TreeFilter from "@/components/TreeFilter/index.vue";
  229. import { FormInstance } from "element-plus";
  230. import { other } from "@/api/interface";
  231. const router = useRouter();
  232. const route = useRoute();
  233. const formRef = ref<FormInstance>();
  234. const supertype = ref(route.query.type);
  235. interface FormData {
  236. userName: string;
  237. deptId: string;
  238. phonenumber: string;
  239. email: string;
  240. loginName: string;
  241. password: string;
  242. sex: string;
  243. status: boolean;
  244. postIds: string[]; // 修改为 string[]
  245. roleIds: string[]; // 假设 roleIds 也是 string[]
  246. remark: string;
  247. departmentId: string[];
  248. emailTypetime: string;
  249. emailType: string;
  250. }
  251. const numberValidateForm = reactive<FormData>({
  252. userName: "",
  253. deptId: "",
  254. phonenumber: "",
  255. email: "",
  256. loginName: "",
  257. password: "",
  258. sex: "",
  259. status: true,
  260. postIds: [],
  261. roleIds: [],
  262. remark: "",
  263. departmentId: [],
  264. emailTypetime: "",
  265. emailType: ""
  266. });
  267. const submitForm = (formEl: FormInstance | undefined) => {
  268. console.log(formEl);
  269. if (!formEl) return;
  270. formEl.validate(async valid => {
  271. if (valid) {
  272. if (route.query.type == "用户新增") {
  273. const obj = {
  274. userName: numberValidateForm.userName,
  275. deptId: numberValidateForm.deptId,
  276. phonenumber: numberValidateForm.phonenumber,
  277. email: numberValidateForm.email,
  278. loginName: numberValidateForm.loginName,
  279. password: numberValidateForm.password,
  280. sex: numberValidateForm.sex,
  281. status: numberValidateForm.status ? 0 : 1,
  282. postIds: numberValidateForm.postIds.toString(),
  283. roleIds: numberValidateForm.roleIds.toString(),
  284. remark: numberValidateForm.remark,
  285. powerId: numberValidateForm.departmentId.toString(),
  286. sendTime: numberValidateForm.emailTypetime,
  287. emailType: numberValidateForm.emailType
  288. };
  289. const { data } = await platformadd(obj);
  290. // let objobj = {
  291. // powerId: numberValidateForm.departmentId.toString()
  292. // };
  293. // const { data: res } = await savetenantpower(route.query.id, objobj);
  294. // console.log(res);
  295. console.log(data);
  296. } else {
  297. const obj = {
  298. userName: numberValidateForm.userName,
  299. deptId: numberValidateForm.deptId,
  300. phonenumber: numberValidateForm.phonenumber,
  301. email: numberValidateForm.email,
  302. loginName: numberValidateForm.loginName,
  303. // password: "",
  304. sex: numberValidateForm.sex,
  305. status: numberValidateForm.status ? 0 : 1,
  306. postIds: numberValidateForm.postIds.toString(),
  307. roleIds: numberValidateForm.roleIds.toString(),
  308. remark: numberValidateForm.remark,
  309. id: route.query.id,
  310. powerId: numberValidateForm.departmentId.toString(),
  311. sendTime: numberValidateForm.emailTypetime,
  312. emailType: numberValidateForm.emailType
  313. };
  314. const { data } = await platformedit(obj);
  315. console.log(data);
  316. }
  317. router.back();
  318. } else {
  319. console.log("error submit!");
  320. return false;
  321. }
  322. });
  323. };
  324. //
  325. const resetForm = (formEl: FormInstance | undefined) => {
  326. if (!formEl) return;
  327. formEl.resetFields();
  328. router.push("/user/index");
  329. };
  330. const treeData = ref();
  331. const department = async () => {
  332. const { data } = await gettreeData();
  333. // treeData.value = data;
  334. treeData.value = buildTree(data);
  335. };
  336. const buildTree = (data: other.tableData1[]) => {
  337. const tree: other.tableData1[] = [];
  338. const map: { [key: string]: other.tableData1 } = {};
  339. // 创建一个map以便快速找到item
  340. data.forEach((item: other.tableData1) => {
  341. map[item.id] = { ...item, children: [] };
  342. });
  343. data.forEach((item: { pId: string; id: string | number }) => {
  344. if (item.pId === "0") {
  345. // 根节点,假设根节点的 pId 是空字符串或者其他标识
  346. tree.push(map[item.id]);
  347. } else {
  348. // 子节点
  349. if (map[item.pId]) {
  350. map[item.pId].children.push(map[item.id]);
  351. }
  352. }
  353. });
  354. return tree;
  355. };
  356. const platformData = ref();
  357. const getplatformlist = async () => {
  358. const { data } = await platformlist({});
  359. platformData.value = data;
  360. console.log(data);
  361. };
  362. const yonghueditdata = ref();
  363. const options = ref();
  364. const getghuedit = async () => {
  365. const { data } = await yonghuedit(route.query.id);
  366. yonghueditdata.value = data;
  367. numberValidateForm.userName = yonghueditdata.value.user.userName;
  368. numberValidateForm.deptId = yonghueditdata.value.user.deptId;
  369. numberValidateForm.phonenumber = yonghueditdata.value.user.phonenumber;
  370. numberValidateForm.email = yonghueditdata.value.user.email;
  371. numberValidateForm.loginName = yonghueditdata.value.user.loginName;
  372. numberValidateForm.password = yonghueditdata.value.user.password;
  373. numberValidateForm.sex = yonghueditdata.value.user.sex;
  374. numberValidateForm.status = yonghueditdata.value.user.status == 0 ? true : false;
  375. numberValidateForm.remark = yonghueditdata.value.user.remark;
  376. yonghueditdata.value.powerId.forEach((item: { powerId: string }) => {
  377. numberValidateForm.departmentId.push(item.powerId);
  378. });
  379. yonghueditdata.value.posts.forEach((role: { flag: any; id: string }) => {
  380. if (role.flag) {
  381. numberValidateForm.postIds.push(role.id);
  382. }
  383. });
  384. yonghueditdata.value.roles.forEach((role: { flag: any; id: string }) => {
  385. if (role.flag) {
  386. numberValidateForm.roleIds.push(role.id);
  387. }
  388. });
  389. if (yonghueditdata.value.user.roles[0].roleKey == 1) {
  390. options.value = [
  391. {
  392. value: "0",
  393. label: "暂不发送邮件"
  394. },
  395. {
  396. value: "1",
  397. label: "发送邮件"
  398. }
  399. ];
  400. } else {
  401. options.value = [
  402. {
  403. value: "0",
  404. label: "暂不发送邮件"
  405. },
  406. {
  407. value: "1",
  408. label: "详细邮件"
  409. },
  410. {
  411. value: "2",
  412. label: "简易邮件"
  413. }
  414. ];
  415. }
  416. numberValidateForm.emailTypetime = yonghueditdata.value.user.sendTime;
  417. numberValidateForm.emailType = yonghueditdata.value.user.emailType;
  418. getTreeDatalist();
  419. };
  420. const resetPwddata = ref();
  421. const onresetPwd = async () => {
  422. const { data } = await getresetPwd(route.query.id);
  423. resetPwddata.value = data;
  424. };
  425. // 电站权限列表
  426. const TreeDatalist = ref();
  427. const getTreeDatalist = async () => {
  428. const { data } = await selectTenantPower({});
  429. console.log(data);
  430. TreeDatalist.value = data;
  431. };
  432. // 回显电站权限
  433. // const TreeDatalists = ref();
  434. // const ongetTreeDatalist = async () => {
  435. // const { data } = await selectPowerstation(route.query.id);
  436. // TreeDatalists.value = data;
  437. // TreeDatalists.value.forEach((item: { powerId: string }) => {
  438. // numberValidateForm.departmentId.push(item.powerId);
  439. // });
  440. // };
  441. const changeTreeFilter = (val: string[]) => {
  442. numberValidateForm.departmentId = val;
  443. };
  444. const handleChange = async (val: any) => {
  445. console.log(val);
  446. numberValidateForm.deptId = val[numberValidateForm.deptId.length - 1].toString();
  447. };
  448. onMounted(() => {
  449. if (route.query.type == "用户编辑") {
  450. // ongetTreeDatalist();
  451. getghuedit();
  452. onresetPwd();
  453. } else {
  454. getTreeDatalist();
  455. }
  456. department();
  457. getplatformlist();
  458. });
  459. </script>
  460. <style scoped lang="scss">
  461. @import "./addition.scss";
  462. </style>
  463. <!--
  464. 0.3225 918 296
  465. 0.7371 459 338
  466. -->