areaCard.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837
  1. /* 自定义tabs */
  2. <template>
  3. <div>
  4. <div class="body" :style="style">
  5. <img class="logo" src="../../assets/img/logo.png" alt="" />
  6. <div class="title">
  7. <div>{{ title }}</div>
  8. <!-- <div style="display: flex; flex-direction: row; align-items: center">
  9. <div v-for="(item, index) in controlTypeList" :key="index">
  10. <div
  11. v-if="!item.type"
  12. :class="
  13. index === 0
  14. ? 'controlTypesLeft'
  15. : index === (controlTypeList.length - 1)
  16. ? 'controlTypesRight'
  17. : 'controlTypes'
  18. "
  19. @click="handleTypeChange(item)"
  20. >
  21. {{ item.name }}
  22. </div>
  23. <div
  24. v-if="item.type"
  25. :class="
  26. index === 0
  27. ? 'onControlTypesLeft'
  28. : index === (controlTypeList.length - 1)
  29. ? 'onControlTypesRight'
  30. : 'onControlTypes'
  31. "
  32. @click="handleTypeChange(item)"
  33. >
  34. {{ item.name }}
  35. </div>
  36. </div>
  37. </div> -->
  38. </div>
  39. <div style="margin-top: 50px; height: 85%" @contextmenu="contextmenu">
  40. <div class="scoll currentScroll">
  41. + <div class="currentScroll" style="height: 100%; overflow-y: scroll">
  42. <div class="matrix" v-if="startList.length > 0">
  43. <div class="problemTitle">启动</div>
  44. <MatrixBlock
  45. @on-click="handleDetial"
  46. @choose-click="handleClick"
  47. :dataList="startList"
  48. >
  49. </MatrixBlock>
  50. </div>
  51. <div class="matrix" v-if="stopList.length > 0">
  52. <div class="problemTitle">停机</div>
  53. <MatrixBlock
  54. @on-click="handleDetial"
  55. @choose-click="handleClick"
  56. :dataList="stopList"
  57. >
  58. </MatrixBlock>
  59. </div>
  60. <div class="matrix" v-if="maintainList.length > 0">
  61. <div class="problemTitle">维护</div>
  62. <MatrixBlock
  63. @on-click="handleDetial"
  64. @choose-click="handleClick"
  65. :dataList="maintainList"
  66. >
  67. </MatrixBlock>
  68. </div>
  69. <div class="matrix" v-if="unMaintainList.length > 0">
  70. <div class="problemTitle">取消维护</div>
  71. <MatrixBlock
  72. @on-click="handleDetial"
  73. @choose-click="handleClick"
  74. :dataList="unMaintainList"
  75. >
  76. </MatrixBlock>
  77. </div>
  78. </div>
  79. </div>
  80. </div>
  81. <!-- <div v-if="current == 1" class="send" @click="handleSend">发送</div> -->
  82. <div v-if="current == 1" class="sends">发送</div>
  83. </div>
  84. <WindturbineDetailPages
  85. v-model="dialogVisible"
  86. @close="handleClose"
  87. :windturbine="currentWindturbine"
  88. >
  89. </WindturbineDetailPages>
  90. </div>
  91. <!-- <StationSvgDetailPages
  92. v-model="svgVisible"
  93. :stationName="stationName"
  94. :svgWeb="svgWeb"
  95. @close="handleClose"
  96. >
  97. </StationSvgDetailPages> -->
  98. </template>
  99. <script>
  100. import BackgroundData from "utils/BackgroundData";
  101. import WindturbineDetailPages from "../WindturbineDetailPages.vue";
  102. import MatrixBlock from "../matrixBlock.vue";
  103. import MessageBridge from "utils/MessageBridge";
  104. import api from "api/index";
  105. // import StationSvgDetailPages from "../stationSvgDetailPages.vue";
  106. export default {
  107. name: "gy-card",
  108. components: {
  109. MatrixBlock,
  110. WindturbineDetailPages,
  111. // StationSvgDetailPages,
  112. },
  113. created: function () {
  114. this.initData();
  115. this.suggestion();
  116. // this.getControlType();
  117. },
  118. emits: ["parentRun"],
  119. props: {
  120. title: {
  121. type: String,
  122. default: "",
  123. required: true,
  124. },
  125. height: {
  126. type: Number,
  127. default: 200,
  128. },
  129. },
  130. data() {
  131. return {
  132. current: 1,
  133. windturbinelist: {},
  134. titleList: [],
  135. startList: [],
  136. stopList: [],
  137. maintainList: [],
  138. unMaintainList: [],
  139. chooseList: [],
  140. sendList: [],
  141. currentWindturbine: {},
  142. dialogVisible: false,
  143. // svgVisible: false,
  144. svgWeb: "",
  145. // stationName: "",
  146. // 定时器
  147. // timer: "",
  148. // controlTypeList: [],
  149. controlErorCodes: [
  150. "控制成功",
  151. "控制命令发送失败",
  152. "无效的控制地址",
  153. "被控设备异常",
  154. "无效的控制功能",
  155. "网络连接错误,检查场站通信",
  156. "控制结果读取超时",
  157. "未知错误",
  158. "控制命令错误",
  159. "收到无法识别数据",
  160. "未读取到数据包",
  161. "未知错误",
  162. "风机操作过频繁",
  163. "风机被挂牌",
  164. "风机操作与风机状态不符",
  165. "需要登录",
  166. ],
  167. indexsss: 0,
  168. };
  169. },
  170. computed: {
  171. style() {
  172. return `width: 100%; height: ${this.height}vh;`;
  173. },
  174. },
  175. methods: {
  176. // getControlType() {
  177. // api.getControlType().then((res) => {
  178. // if (res) {
  179. // this.controlTypeList = res.data;
  180. // }
  181. // });
  182. // },
  183. control(current) {
  184. this.current = current === 0 ? current : current === 1 ? current : 1;
  185. this.suggestion();
  186. },
  187. initData: function () {
  188. let mb = MessageBridge.getInstance();
  189. mb.unregister({ key: "/topic/suggestion" });
  190. let vs = [{ key: "/topic/suggestion", action: this.suggestion }];
  191. mb.register(vs);
  192. },
  193. suggestion(msg, headers) {
  194. msg ? this.$store.commit("suggestion", JSON.parse(msg)) : "";
  195. let bd = BackgroundData.getInstance();
  196. this.titleList = msg ? JSON.parse(msg) : this.$store.state.suggestion;
  197. if (this.current === 0) {
  198. let dateList = [];
  199. this.titleList.forEach((item) => {
  200. // let status = this.controlTypeList.filter(
  201. // (val) =>
  202. // val.stationId ===
  203. // this.windturbinelist[item.windturbineId].stationId
  204. // )[0].type;
  205. // if (status) {
  206. let arr = Object.keys(this.windturbinelist).sort();
  207. this.windturbinelist =
  208. arr.length !== 0
  209. ? this.windturbinelist
  210. : this.$store.state.windturbinelist;
  211. switch (item.operateStyle) {
  212. case "Start":
  213. this.windturbinelist[item.windturbineId].controlType = 1;
  214. break;
  215. case "Stop":
  216. this.windturbinelist[item.windturbineId].controlType = 2;
  217. break;
  218. case "Maintain":
  219. this.windturbinelist[item.windturbineId].controlType = 6;
  220. break;
  221. case "UnMaintain":
  222. this.windturbinelist[item.windturbineId].controlType = 8;
  223. break;
  224. }
  225. dateList.push(this.windturbinelist[item.windturbineId]);
  226. // }
  227. });
  228. let mss = {};
  229. mss.type = "send";
  230. mss.deviceType = "Auto";
  231. // setTimeout(() => {
  232. // if (dateList.length>0) {
  233. // this.sendCommand(mss, dateList);
  234. // }
  235. // }, 3000);
  236. }
  237. },
  238. handleClick(values) {
  239. if (values.active) {
  240. let showIndex = null;
  241. this.chooseList.forEach((item, index) => {
  242. if (item.windturbineId === values.windturbineId) {
  243. showIndex = index;
  244. }
  245. });
  246. this.chooseList.splice(showIndex, 1);
  247. } else {
  248. this.chooseList.push(values);
  249. }
  250. this.startList.forEach((item) => {
  251. if (item.windturbineId === values.windturbineId) {
  252. item.active = !item.active;
  253. }
  254. });
  255. this.stopList.forEach((item) => {
  256. if (item.windturbineId === values.windturbineId) {
  257. item.active = !item.active;
  258. }
  259. });
  260. this.maintainList.forEach((item) => {
  261. if (item.windturbineId === values.windturbineId) {
  262. item.active = !item.active;
  263. }
  264. });
  265. this.unMaintainList.forEach((item) => {
  266. if (item.windturbineId === values.windturbineId) {
  267. item.active = !item.active;
  268. }
  269. });
  270. },
  271. handleDetial(itm) {
  272. this.dialogVisible = true;
  273. this.currentWindturbine = itm;
  274. },
  275. handleClose() {
  276. this.dialogVisible = false;
  277. // this.svgVisible = false;
  278. },
  279. // handleSend() {
  280. // if (this.chooseList.length > 0) {
  281. // this.chooseList.forEach((item) => {
  282. // if (item.operateStyle === "Start") {
  283. // item.controlType = 1;
  284. // } else if (item.operateStyle === "Stop") {
  285. // item.controlType = 2;
  286. // } else if (item.operateStyle === "Maintain") {
  287. // item.controlType = 6;
  288. // } else if (item.operateStyle === "UnMaintain") {
  289. // item.controlType = 8;
  290. // }
  291. // });
  292. // let mss = {};
  293. // mss.type = "send";
  294. // mss.deviceType = "Recommend";
  295. // this.sendCommand(mss, this.chooseList);
  296. // }
  297. // },
  298. /* 右键菜单 */
  299. contextmenu() {
  300. const { remote } = require("electron");
  301. let that = this;
  302. const menuTemplate = [
  303. {
  304. label: "发送",
  305. click() {
  306. that.handleSend();
  307. },
  308. },
  309. {
  310. label: "挂牌",
  311. submenu: [
  312. {
  313. label: "检修",
  314. click() {
  315. that.sendLock({ value: "CheckLock" });
  316. },
  317. },
  318. {
  319. label: "故障维修",
  320. click() {
  321. that.sendLock({ value: "FaultLock" });
  322. },
  323. },
  324. {
  325. label: "场内受累检修",
  326. click() {
  327. that.sendLock({ value: "StationCheckLock" });
  328. },
  329. },
  330. {
  331. label: "场内受累故障",
  332. click() {
  333. that.sendLock({ value: "StationFaulLock" });
  334. },
  335. },
  336. {
  337. label: "场外受累电网",
  338. click() {
  339. that.sendLock({ value: "StationPowerLineLock" });
  340. },
  341. },
  342. {
  343. label: "场外受累天气",
  344. click() {
  345. that.sendLock({ value: "StationWeatherLock" });
  346. },
  347. },
  348. ],
  349. },
  350. ];
  351. const menu = remote.Menu.buildFromTemplate(menuTemplate);
  352. menu.popup(remote.getCurrentWindow());
  353. },
  354. // sendCommand(msg, windturbine) {
  355. // let bd = BackgroundData.getInstance();
  356. // if (!bd.LoginUser) {
  357. // this.$notify({
  358. // title: "请登录",
  359. // message: "控制风机需要先登录!",
  360. // type: "warning",
  361. // position: "bottom-right",
  362. // offset: 60,
  363. // duration: 3000,
  364. // });
  365. // return;
  366. // }
  367. // let sendList = windturbine;
  368. // if (sendList.length > 0) {
  369. // bd.checkout(sendList);
  370. // this.chooseList = [];
  371. // let pairs = {};
  372. // sendList.forEach((item) => {
  373. // let ct = {
  374. // windturbineId: item.windturbineId,
  375. // stationId: item.stationId,
  376. // projectId: item.projectId,
  377. // modelId: item.modelId,
  378. // controlType: item.controlType,
  379. // lockType: item.lockType,
  380. // userName: `system_${bd.LoginUser.name}`,
  381. // userId: 0,
  382. // auto: this.current === 0 ? true : false,
  383. // deviceType: msg.deviceType,
  384. // };
  385. // pairs[ct.windturbineId] = ct;
  386. // });
  387. // api.windturbControl(pairs).then((res) => {
  388. // if (res) {
  389. // this.controlSuccess(res);
  390. // }
  391. // });
  392. // }
  393. // },
  394. sendLock(msg, windturbine) {
  395. let bd = BackgroundData.getInstance();
  396. if (!bd.LoginUser) {
  397. this.$notify({
  398. title: "请登录",
  399. message: "控制风机需要先登录!",
  400. type: "warning",
  401. position: "bottom-right",
  402. offset: 60,
  403. duration: 3000,
  404. });
  405. return;
  406. }
  407. let sendList = [];
  408. if (windturbine) {
  409. windturbine.lockType = msg.value;
  410. sendList.push(windturbine);
  411. } else {
  412. this.chooseList.forEach((item) => {
  413. item.lockType = msg.value;
  414. });
  415. sendList = this.chooseList;
  416. }
  417. if (sendList.length > 0) {
  418. this.chooseList = [];
  419. let pairs = {};
  420. sendList.forEach((item) => {
  421. let ct = {
  422. windturbineId: item.windturbineId,
  423. stationId: item.stationId,
  424. projectId: item.projectId,
  425. modelId: item.modelId,
  426. controlType: item.controlType,
  427. lockType: item.lockType,
  428. userName: `system_${bd.LoginUser.name}`,
  429. userId: 0,
  430. };
  431. pairs[ct.windturbineId] = ct;
  432. });
  433. api.windturbControlLock(pairs).then((res) => {
  434. if (res) {
  435. this.controlSuccess(res);
  436. }
  437. });
  438. }
  439. },
  440. clearSelected() {
  441. this.startList.forEach((item) => {
  442. item.active = false;
  443. });
  444. this.stopList.forEach((item) => {
  445. item.active = false;
  446. });
  447. this.chooseList = [];
  448. },
  449. removeList(mk) {
  450. let indx = -1;
  451. for (let id in this.titleList) {
  452. if (this.titleList[id].windturbineId == mk.windturbineId) {
  453. indx = id;
  454. break;
  455. }
  456. }
  457. if (indx < 0) return;
  458. this.titleList.splice(indx, 1);
  459. },
  460. /* 控制成功 */
  461. controlSuccess(msg) {
  462. let bd = BackgroundData.getInstance();
  463. for (let id in msg.data) {
  464. let val = msg.data[id];
  465. if (val.errorCode !== "0") {
  466. bd.removeCheckouts(val);
  467. this.removeList(val);
  468. }
  469. }
  470. if (msg.data || msg.data !== {}) {
  471. let mss = ""; // 信息
  472. let iserror = false; // 是否有控制错误的风机
  473. for (let v in msg.data) {
  474. let val = msg.data[v];
  475. if (val.errorCode > 0) {
  476. iserror = true;
  477. mss += `${val.windturbineId} ${
  478. this.controlErorCodes[val.errorCode]
  479. }\n`;
  480. }
  481. }
  482. let tp = iserror ? "warning" : "success";
  483. if (!iserror) {
  484. mss = "控制成功";
  485. }
  486. this.$notify({
  487. title: "控制",
  488. message: mss,
  489. type: tp,
  490. position: "bottom-right",
  491. offset: 60,
  492. duration: 3000,
  493. });
  494. } else {
  495. this.$notify({
  496. title: "控制出现错误",
  497. message: "控制失败,请重试",
  498. type: "warning",
  499. position: "bottom-right",
  500. offset: 60,
  501. duration: 3000,
  502. });
  503. }
  504. },
  505. /* 控制失败 */
  506. controlError(err) {
  507. this.$notify({
  508. title: "控制出现错误",
  509. message: err.message,
  510. type: "warning",
  511. position: "bottom-right",
  512. offset: 60,
  513. duration: 3000,
  514. });
  515. },
  516. handleTypeChange(val) {
  517. let bd = BackgroundData.getInstance();
  518. if (!bd.LoginUser) {
  519. this.$notify({
  520. title: "请登录",
  521. message: "控制风机需要先登录!",
  522. type: "warning",
  523. position: "bottom-right",
  524. offset: 60,
  525. duration: 3000,
  526. });
  527. return;
  528. }
  529. api
  530. .uodateControlType({
  531. stationid: val.stationId,
  532. type: !val.type,
  533. userName: bd.LoginUser.name,
  534. })
  535. .then((res) => {
  536. if (res.data === "success") {
  537. // this.getControlType();
  538. }
  539. });
  540. },
  541. },
  542. watch: {
  543. "$store.getters.windturbinelist": {
  544. deep: true,
  545. handler: function (json) {
  546. this.windturbinelist = json;
  547. let arr = Object.keys(json).sort();
  548. this.stopList = [];
  549. this.startList = [];
  550. this.maintainList = [];
  551. this.unMaintainList = [];
  552. for (let id of arr) {
  553. let val = json[id];
  554. this.chooseList.forEach((item) => {
  555. if (item.windturbineId === val.windturbineId) {
  556. val.active = true;
  557. }
  558. });
  559. this.titleList.forEach((item) => {
  560. if (item.windturbineId === val.windturbineId) {
  561. val.operateStyle = item.operateStyle;
  562. if (item.operateStyle === "Start" && val.status === 2) {
  563. this.startList.push(val);
  564. } else if (item.operateStyle === "Stop" && val.status === 4) {
  565. if (item.reasonType === "ElectricityRestrictions") {
  566. val.reasonType = item.reasonType;
  567. }
  568. this.stopList.push(val);
  569. } else if (item.operateStyle === "Maintain" && val.status === 2) {
  570. this.maintainList.push(val);
  571. } else if (
  572. item.operateStyle === "UnMaintain" &&
  573. val.status === 6
  574. ) {
  575. this.unMaintainList.push(val);
  576. }
  577. }
  578. });
  579. }
  580. let checkoutList = BackgroundData.getInstance().checkouts;
  581. checkoutList.forEach((item) => {
  582. let starIndex = null;
  583. let stopIndex = null;
  584. let maintainIndex = null;
  585. let unMaintainIndex = null;
  586. let starFlag = false;
  587. let stopFlag = false;
  588. let maintainFlag = false;
  589. let unMaintainFlag = false;
  590. this.startList.forEach((param, index) => {
  591. if (item.windturbineId === param.windturbineId) {
  592. starIndex = index;
  593. starFlag = true;
  594. }
  595. });
  596. this.stopList.forEach((param, index) => {
  597. if (item.windturbineId === param.windturbineId) {
  598. stopIndex = index;
  599. stopFlag = true;
  600. }
  601. });
  602. this.maintainList.forEach((param, index) => {
  603. if (item.windturbineId === param.windturbineId) {
  604. maintainIndex = index;
  605. maintainFlag = true;
  606. }
  607. });
  608. this.unMaintainList.forEach((param, index) => {
  609. if (item.windturbineId === param.windturbineId) {
  610. unMaintainIndex = index;
  611. unMaintainFlag = true;
  612. }
  613. });
  614. starFlag ? this.startList.splice(starIndex, 1) : "";
  615. stopFlag ? this.stopList.splice(stopIndex, 1) : "";
  616. maintainFlag ? this.maintainList.splice(maintainIndex, 1) : "";
  617. unMaintainFlag ? this.unMaintainList.splice(unMaintainIndex, 1) : "";
  618. });
  619. },
  620. },
  621. "$store.getters.current": {
  622. handler: function (json) {
  623. this.current = json;
  624. // this.getControlType();
  625. if (json === 0) {
  626. let dateList = [];
  627. this.titleList.forEach((item) => {
  628. // let status = this.controlTypeList.filter(
  629. // (val) =>
  630. // val.stationId ===
  631. // this.windturbinelist[item.windturbineId].stationId
  632. // )[0].type;
  633. // if (status) {
  634. let arr = Object.keys(this.windturbinelist).sort();
  635. this.windturbinelist =
  636. arr.length !== 0
  637. ? this.windturbinelist
  638. : this.$store.state.windturbinelist;
  639. switch (item.operateStyle) {
  640. case "Start":
  641. this.windturbinelist[item.windturbineId].controlType = 1;
  642. break;
  643. case "Stop":
  644. this.windturbinelist[item.windturbineId].controlType = 2;
  645. break;
  646. case "Maintain":
  647. this.windturbinelist[item.windturbineId].controlType = 6;
  648. break;
  649. case "UnMaintain":
  650. this.windturbinelist[item.windturbineId].controlType = 8;
  651. break;
  652. }
  653. dateList.push(this.windturbinelist[item.windturbineId]);
  654. // }
  655. });
  656. // let mss = {};
  657. // mss.type = "send";
  658. // mss.deviceType = "Auto";
  659. // setTimeout(() => {
  660. // if (dateList.length>0) {
  661. // this.sendCommand(mss, dateList);
  662. // }
  663. // }, 3000);
  664. }
  665. },
  666. },
  667. },
  668. };
  669. </script>
  670. <style scoped="scoped">
  671. .body {
  672. border: 1px solid #373737;
  673. width: 100%;
  674. margin-left: 15px;
  675. margin-top: 20px;
  676. }
  677. .body .scoll {
  678. height: 91%;
  679. }
  680. .title {
  681. color: #ffffff;
  682. font-size: 14px;
  683. margin-left: 32px;
  684. /* margin-top: 12px; */
  685. margin-bottom: 10px;
  686. /* width: 570px; */
  687. width: 29vw;
  688. height: 50px;
  689. display: flex;
  690. flex-direction: row;
  691. justify-content: space-between;
  692. align-items: center;
  693. position: absolute;
  694. background-color: #000000;
  695. }
  696. .title::before {
  697. z-index: 1;
  698. content: "";
  699. position: absolute;
  700. left: -18px !important;
  701. /* top: 30px !important; */
  702. width: 5px;
  703. height: 5px;
  704. background-color: #54b75a;
  705. border-radius: 50%;
  706. }
  707. .logo {
  708. position: absolute;
  709. top: 12px;
  710. left: 12px;
  711. }
  712. .matrix {
  713. margin-left: 20px;
  714. /* margin-right: 10px; */
  715. padding-bottom: 20px;
  716. border-bottom: 1px solid rgba(31, 31, 31, 1);
  717. }
  718. .problemTitle {
  719. font-size: 12px;
  720. color: #bfbfbf;
  721. margin-top: 20px;
  722. margin-bottom: 20px;
  723. margin-left: 12px;
  724. }
  725. .send {
  726. width: 86px;
  727. height: 26px;
  728. display: flex;
  729. align-items: center;
  730. justify-content: center;
  731. background-color: rgba(84, 183, 90, 1);
  732. color: #ffffff;
  733. font-size: 14px;
  734. position: absolute;
  735. bottom: 20px;
  736. right: 10px;
  737. }
  738. .sends {
  739. width: 86px;
  740. height: 26px;
  741. display: flex;
  742. align-items: center;
  743. justify-content: center;
  744. background-color: #999999;
  745. color: #ffffff;
  746. font-size: 14px;
  747. position: absolute;
  748. bottom: 20px;
  749. right: 10px;
  750. }
  751. .success {
  752. display: flex;
  753. align-items: center;
  754. justify-content: center;
  755. width: 250px;
  756. height: 48px;
  757. position: absolute;
  758. bottom: 20px;
  759. right: 20%;
  760. border: 1px solid rgba(55, 55, 55, 1);
  761. border-radius: 10px;
  762. color: #ffffff;
  763. font-size: 14px;
  764. }
  765. .controlTypes {
  766. width: 80px;
  767. height: 30px;
  768. display: flex;
  769. align-items: center;
  770. justify-content: center;
  771. border: 1px solid rgba(51, 51, 51, 1);
  772. }
  773. .controlTypesLeft {
  774. width: 80px;
  775. height: 30px;
  776. display: flex;
  777. align-items: center;
  778. justify-content: center;
  779. border: 1px solid rgba(51, 51, 51, 1);
  780. border-top-left-radius: 15px;
  781. border-bottom-left-radius: 15px;
  782. }
  783. .controlTypesRight {
  784. width: 80px;
  785. height: 30px;
  786. display: flex;
  787. align-items: center;
  788. justify-content: center;
  789. border: 1px solid rgba(51, 51, 51, 1);
  790. border-top-right-radius: 15px;
  791. border-bottom-right-radius: 15px;
  792. }
  793. .onControlTypes {
  794. width: 80px;
  795. height: 30px;
  796. display: flex;
  797. align-items: center;
  798. justify-content: center;
  799. border: 1px solid rgba(51, 51, 51, 1);
  800. background-color: rgba(37, 116, 219, 1);
  801. }
  802. .onControlTypesLeft {
  803. width: 80px;
  804. height: 30px;
  805. display: flex;
  806. align-items: center;
  807. justify-content: center;
  808. /* border: 1px solid rgba(37, 116, 219, 1); */
  809. border-top-left-radius: 15px;
  810. border-bottom-left-radius: 15px;
  811. background-color: rgba(37, 116, 219, 1);
  812. }
  813. .onControlTypesRight {
  814. width: 80px;
  815. height: 30px;
  816. display: flex;
  817. align-items: center;
  818. justify-content: center;
  819. /* border: 1px solid rgba(37, 116, 219, 1); */
  820. border-top-right-radius: 15px;
  821. border-bottom-right-radius: 15px;
  822. background-color: rgba(37, 116, 219, 1);
  823. }
  824. </style>