register.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  1. <template>
  2. <div id="register_merge">
  3. <el-tabs type="border-card" class="tabs">
  4. <!-- 弹屏存在多用户的情况 -->
  5. <div class='moreUser' style='position: absolute;right: 0px;z-index: 2;border: solid 1px rgba(128,128,128,0.2);' v-if='userInfoList&&userInfoList.length>1'>
  6. <el-table highlight-current-row :data="userInfoList" stripe @row-click="changeUserInfo" style="width: 100%">
  7. <el-table-column prop="address" header-align="center" label="用户地址" width="200"> </el-table-column>
  8. </el-table>
  9. </div>
  10. <el-tab-pane label="工单登记" style="height: 100%">
  11. <RegisterMerges
  12. ref="RegisterMerges"
  13. :data="editData"
  14. :arrearsFlag='arrearsFlag'
  15. :work-order-type="workOrderType"
  16. :acceptance-department="acceptanceDepartment"
  17. :phone-number="phoneNumber"
  18. :register-formdata="registerForm"
  19. :number="number"
  20. :download="true"
  21. :is-rxlx="true"
  22. :change-user-table="true"
  23. @remind="remind"
  24. @getKhbh="getKhbh"
  25. />
  26. </el-tab-pane>
  27. <el-tab-pane label="人员情况" style="height: 100%">
  28. <currentWorkInfo />
  29. </el-tab-pane>
  30. </el-tabs>
  31. <el-tabs type="border-card" class="tabs" style="margin-top: 10px">
  32. <el-tab-pane label="来电记录" style="height: 100%">
  33. <CallRecords :phone-number="phoneNumber" />
  34. </el-tab-pane>
  35. <el-tab-pane label="历史工单" style="height: 100%">
  36. <Historical :phone-number="phoneNumber" />
  37. </el-tab-pane>
  38. </el-tabs>
  39. <!-- <el-tabs type="border-card" class="tabs" style="margin-top: 10px">
  40. <el-tab-pane label="用户信息" style="height: 100%">
  41. <message :userId="userId"/>
  42. </el-tab-pane>
  43. </el-tabs> -->
  44. </div>
  45. </template>
  46. <script>
  47. import { getNames, getRegisterList, getPhoneUserInfo } from "@/api/work";
  48. import RegisterMerges from "@/views/currentSystem/work/order/register/register_merge";
  49. import Historical from "./components/historical";
  50. import CallRecords from "./components/callRecords";
  51. import { getSXJList } from "@/utils/request";
  52. import { getMail } from "@/api/hotline";
  53. import axios from 'axios'
  54. import { lcInfo } from "staticPub/config";
  55. import currentWorkInfo from "./currentWorkInfo.vue";
  56. import message from "./message.vue";
  57. import commonMe from '@/utils/common'
  58. export default {
  59. name: "RegisterMerge",
  60. components: {
  61. currentWorkInfo,
  62. RegisterMerges,
  63. Historical,
  64. CallRecords,
  65. message,
  66. },
  67. props: {
  68. data: {
  69. // 编辑的数据
  70. type: Object,
  71. required: true,
  72. },
  73. disabled: {
  74. type: Boolean,
  75. },
  76. callNum: {
  77. type: Number,
  78. default: 0,
  79. },
  80. phoneNumber: {
  81. type: Number,
  82. default: 0,
  83. },
  84. workOrderType: {
  85. // 工单类型
  86. type: Array,
  87. required: true,
  88. },
  89. acceptanceDepartment: {
  90. // 部门
  91. type: Array,
  92. required: true,
  93. },
  94. modeltitle: {
  95. type: String,
  96. default: "工单登记",
  97. },
  98. code: {
  99. type: String,
  100. default: "1001",
  101. },
  102. },
  103. data() {
  104. return {
  105. userId: "",
  106. arrearsFlag:false,
  107. getMail: getMail,
  108. getUserList: getSXJList,
  109. rules: {
  110. gdlx: [{ required: true, message: " ", trigger: "change" }],
  111. gdxq: [{ required: true, message: " ", trigger: "change" }],
  112. jjcd: [{ required: true, message: " ", trigger: "change" }],
  113. slbm: [{ required: true, message: " ", trigger: "change" }],
  114. slry: [{ required: true, message: " ", trigger: "change" }],
  115. gddjZt: [{ required: true, message: " ", trigger: "change" }],
  116. gdms: [{ required: true, message: " ", trigger: "blur" }],
  117. lczzyy: [{ required: true, message: " ", trigger: "blur" }],
  118. },
  119. cxnr: "",
  120. cxtj: "",
  121. // 工单细分
  122. subdivide1: [],
  123. subdivide2: [],
  124. indexNum: 0,
  125. indexNumT: 0,
  126. number: 1,
  127. // 优先级别
  128. emergencyDegree: [
  129. {
  130. id: 82,
  131. cname: "一般",
  132. },
  133. {
  134. id: 83,
  135. cname: "重要",
  136. },
  137. {
  138. id: 84,
  139. cname: "非常急",
  140. },
  141. ],
  142. // 受理人员
  143. receiver: [],
  144. recordtotal: 0,
  145. totals: 0,
  146. pagination: { current: 1, size: 10 }, // 分页参数信息
  147. paginations: { current: 1, size: 10 }, // 分页参数信息
  148. recordpagination: { current: 1, size: 10, telephone: "" },
  149. total: 0,
  150. list: [],
  151. djryName: "",
  152. djsj: "",
  153. pageInfoShow:true,
  154. cellStyle: [
  155. {
  156. style: { color: "#67C23A", textAlign: "center" }, // 样式 绿
  157. field: "jjcdName",
  158. value: "一般",
  159. index: 4,
  160. },
  161. {
  162. style: { color: "#E6A23C", textAlign: "center" },
  163. field: "jjcdName",
  164. value: "紧急",
  165. index: 4,
  166. },
  167. {
  168. style: { color: "#F56C6C", textAlign: "center" }, // 样式 红
  169. field: "jjcdName",
  170. value: "重要",
  171. index: 4,
  172. },
  173. ],
  174. column: [
  175. {
  176. label: "客户编号",
  177. prop: "khbh",
  178. },
  179. {
  180. label: "客户姓名",
  181. prop: "khxm",
  182. },
  183. {
  184. label: "客户地址",
  185. prop: "khdz",
  186. },
  187. {
  188. label: "接单时限",
  189. prop: "wcsx",
  190. },
  191. {
  192. label: "联系电话",
  193. prop: "lxdh",
  194. },
  195. ],
  196. rejectedList: [],
  197. registerForm: {
  198. intabManName:'',
  199. id: "",
  200. gdbh: "",
  201. ldhm: "",
  202. slbm: "",
  203. slry: "",
  204. gdlx: "",
  205. gdxf: "",
  206. gdxf1: "",
  207. gdxf2: "",
  208. jjcd: "",
  209. rzsx: "",
  210. wcsx: "",
  211. gddjZt: "",
  212. gdms: "",
  213. khbh: "",
  214. khxm: "",
  215. lxdh: "",
  216. khdz: "",
  217. lcid: "",
  218. djsj: "",
  219. djryName: "",
  220. lczzyy: "",
  221. ysxz: "",
  222. sbbh: "",
  223. sbkj: "",
  224. sjdh: "",
  225. // 抢维修
  226. qwxTime: undefined, // 抢维修时间
  227. startTime: "", // 开始时间
  228. endTime: "", // 结束时间
  229. orderSource: "", // 工单来源 字典编码表,0计划、1自建、2热线
  230. typeId: "", // 维修类型,关联表TF_YWPN_REPAIRTYPE_D的关键值,查询维修类型
  231. respUser: "", // 维修人ID,主要负责人,查询维修人员接口
  232. },
  233. allLcjd: "",
  234. menuId: "",
  235. jdsx: "",
  236. wcsx: "",
  237. dialogVisible: false,
  238. clientDialog: false,
  239. difference: false,
  240. editData: {},
  241. dataform: {
  242. object: {
  243. CBPQ: "",
  244. CBB: "",
  245. YHBH: "",
  246. YHXM: "",
  247. YHDZ: "",
  248. LXDH: "",
  249. YHZT: "",
  250. SBBH: "",
  251. SING: "",
  252. ACTION: "query",
  253. },
  254. url: `api/Business/GetCustomerData`,
  255. },
  256. recordlist: [],
  257. recordcolumn: [
  258. {
  259. label: "被叫号码",
  260. prop: "sysphone",
  261. sortable: true,
  262. },
  263. {
  264. label: "主叫号码",
  265. prop: "telephone",
  266. },
  267. {
  268. label: "呼叫时间",
  269. prop: "callTime",
  270. },
  271. {
  272. label: "挂机时间",
  273. prop: "hangupTime",
  274. },
  275. {
  276. label: "接通时长(秒)",
  277. prop: "times",
  278. },
  279. {
  280. label: "呼叫类型",
  281. prop: "callTypeName",
  282. },
  283. {
  284. label: "处理工号",
  285. prop: "empName",
  286. },
  287. ],
  288. columns: [
  289. {
  290. label: "工单编号",
  291. prop: "gdbh",
  292. sortable: true,
  293. },
  294. {
  295. label: "工单状态",
  296. prop: "lcjdName",
  297. },
  298. {
  299. label: "工单类型",
  300. prop: "gdlxName",
  301. },
  302. {
  303. label: "工单细分",
  304. prop: "gdxf1Name",
  305. },
  306. {
  307. label: "优先级别",
  308. prop: "jjcdName",
  309. },
  310. {
  311. label: "登记人员",
  312. prop: "djryName",
  313. },
  314. {
  315. label: "登记时间",
  316. prop: "djsj",
  317. },
  318. {
  319. label: "接单时限",
  320. prop: "jdsx",
  321. },
  322. ],
  323. lists: [],
  324. userInfoList:[],
  325. };
  326. },
  327. computed: {},
  328. created() {
  329. var aData = new Date();
  330. this.djsj =
  331. aData.getFullYear() +
  332. "-" +
  333. (aData.getMonth() + 1) +
  334. "-" +
  335. aData.getDate() +
  336. " " +
  337. aData.getHours() +
  338. ":" +
  339. aData.getMinutes();
  340. this.fetchDatas();
  341. if (this.phoneNumber !== 0) {
  342. this.fetchData({ tel: this.phoneNumber });
  343. }
  344. this.difference = JSON.stringify(this.data) !== "{}";
  345. if (this.difference) {
  346. this.handleEdit();
  347. this.fetchReject();
  348. } else {
  349. this.registerForm.gddjZt = 54;
  350. this.registerForm.jjcd = 82;
  351. this.registerForm.ldhm = this.phoneNumber;
  352. }
  353. if (this.phoneNumber === 1) {
  354. this.registerForm.ldhm = "";
  355. }
  356. this.getSubdivide1();
  357. this.getSubdivide2();
  358. if (this.difference) {
  359. this.handleEdit();
  360. }
  361. this.recordpagination.telephone = this.phoneNumber;
  362. this.fetchDataPhone(this.recordpagination);
  363. },
  364. methods: {
  365. getKhbh(val) {
  366. this.userId = val;
  367. },
  368. handleCurrentChange(currentPage) {
  369. this.paginations.current = currentPage;
  370. this.fetchData();
  371. },
  372. handleSizeChange(pagesize) {
  373. this.paginations.size = pagesize;
  374. this.fetchData();
  375. },
  376. recordhandleCurrentChange(currentPage) {
  377. this.pagination.current = currentPage;
  378. this.fetchDatas();
  379. },
  380. recordhandleSizeChange(pagesize) {
  381. this.pagination.size = pagesize;
  382. this.fetchDatas();
  383. },
  384. // getReceiver() {
  385. // switch (this.allLcjd[1]) {
  386. // case '2':
  387. // this.menuId = 2002
  388. // break
  389. // case '3':
  390. // this.menuId = 2003
  391. // break
  392. // case '4':
  393. // this.menuId = 2004
  394. // break
  395. // case '5':
  396. // this.menuId = 2005
  397. // break
  398. // case '6':
  399. // this.menuId = 4097
  400. // break
  401. // default:
  402. // break
  403. // }
  404. // const data = {
  405. // ids: this.menuId,
  406. // departmentId: this.registerForm.slbm
  407. // }
  408. // if (this.registerForm.slbm) {
  409. // getPersonnel(data).then(res => {
  410. // this.receiver = res.result
  411. // const arr = this.receiver.map(val => {
  412. // return val.id
  413. // })
  414. // if (arr.indexOf(this.registerForm.slry) === -1) {
  415. // this.registerForm.slry = ''
  416. // }
  417. // })
  418. // }
  419. // },
  420. // 三级工单
  421. getSubdivide1() {
  422. this.subdivide1 = [];
  423. this.subdivide2 = [];
  424. this.registerForm.gdxf1 = "";
  425. this.registerForm.gdxf2 = "";
  426. for (let i = 0; i < this.workOrderType.length; i++) {
  427. if (this.workOrderType[i].id === this.registerForm.gdlx) {
  428. this.indexNum = i;
  429. break;
  430. }
  431. }
  432. this.subdivide1 = this.workOrderType[this.indexNum].gdglproblemdetails;
  433. },
  434. getSubdivide2() {
  435. this.subdivide2 = [];
  436. this.registerForm.gdxf2 = "";
  437. for (let i = 0; i < this.subdivide1.length; i++) {
  438. if (this.subdivide1[i].id === this.registerForm.gdxf1) {
  439. this.indexNumT = i;
  440. break;
  441. }
  442. }
  443. this.subdivide2 = this.subdivide1[this.indexNumT].gdglproblemdetails;
  444. },
  445. async fetchData(data) {
  446. // this.pageInfoShow=false;
  447. try {
  448. const newaxios = axios.create({
  449. withCredentials: true, // 跨域请求时发送cookiesokies
  450. timeout: 60000, // 请求超时
  451. });
  452. this.registerForm.lxdh=data.tel
  453. newaxios({
  454. method: "get",
  455. url: lcInfo.otherUrlUserdetail,
  456. headers: {
  457. "Content-Type": "application/x-www-form-urlencoded",
  458. Appkey: "oievemzt7bowa9v9sf2iczmg",
  459. AppSecret: "9rbbnwcs3idyyzfpvs2xv9aqr2g28hd7",
  460. // Appkey: "sz8ihx4tyyf56h2jn1zunhj7",
  461. // AppSecret: "ihzzm4cgog275557bw84jqfwwn2dggxt",
  462. },
  463. params: {
  464. start: 1,
  465. limit: 100,
  466. tel1:data.tel,
  467. // userid: "0101012064",
  468. },
  469. }).then((res) => {
  470. const tempData=res.data.result;
  471. this.userInfoList=[];
  472. console.log("接电话信息1-------",res);
  473. if(res&&res.data&&res.data.result&&tempData.data){
  474. let tableList = tempData.data;
  475. this.userInfoList=tableList;
  476. console.log("接电话信息2-------",this.userInfoList)
  477. this.userInfoList.forEach((item,index)=>{
  478. item.currentNum=index;
  479. })
  480. const currentNum=0;
  481. //子组件监听的是number,故最后改变number。先对registerForm进行赋值
  482. this.setRegisterForm(currentNum)
  483. }else{
  484. this.pageInfoShow=true;
  485. }
  486. });
  487. } catch (err) {
  488. console.log(err);
  489. }
  490. },
  491. /*改变用户*/
  492. changeUserInfo(data){
  493. this.setRegisterForm(data.currentNum);
  494. },
  495. /**赋值*/
  496. setRegisterForm(number){
  497. const data=this.userInfoList[number];
  498. const startTime = commonMe.getDayAppend(commonMe.getPreYaerDate('day'), 'start')
  499. const endTime = commonMe.getDayAppend(commonMe.getCurrentDate('day'), 'end')
  500. const newaxios = axios.create({
  501. withCredentials: true, // 跨域请求时发送cookiesokies
  502. timeout: 60000, // 请求超时
  503. });
  504. newaxios({
  505. method: "get",
  506. url: lcInfo.getWaterUserInfosDetails2,
  507. headers: {
  508. // "Content-Type": "application/x-www-form-urlencoded",
  509. Appkey: lcInfo.client_id2,
  510. AppSecret: lcInfo.client_secret2,
  511. // Appkey: "sz8ihx4tyyf56h2jn1zunhj7",
  512. // AppSecret: "ihzzm4cgog275557bw84jqfwwn2dggxt",
  513. },
  514. params: {
  515. userId: data.userid,
  516. startTime: startTime,
  517. endTime: endTime
  518. // userid: "0101012064",
  519. },
  520. }).then(res=>{
  521. let tempData = JSON.parse(res.data.result);
  522. console.log(tempData,'tempdata')
  523. // let lastChange = tempData.data[0].LastChange
  524. // let nowChange = tempData.data[0].NowChange
  525. // if(nowChange ==0){
  526. // if(lastChange==0){
  527. // this.registerForm.yue = 0
  528. // this.arrearsFlag = false
  529. // }else{
  530. // this.registerForm.yue = lastChange
  531. // this.arrearsFlag = true
  532. // }
  533. // }else{
  534. // this.registerForm.yue = nowChange
  535. // this.arrearsFlag = false
  536. // }
  537. // this.pageInfoShow=true;
  538. // this.number=number;
  539. this.registerForm.intabManName = tempData.data[0].InTabManName
  540. this.number=number;
  541. let lastChange = tempData.data[0].LastChange
  542. let totalMoney = tempData.data[0].TotMoneyDX
  543. let payMoney = tempData.data[0].PayMoney
  544. let yue = (lastChange + payMoney - totalMoney).toFixed(2)
  545. if(yue>=0){
  546. this.registerForm.yue = yue
  547. this.number=number;
  548. }else{
  549. this.registerForm.yue = yue
  550. this.arrearsFlag = true
  551. this.number=number;
  552. }
  553. // this.pageInfoShow=true;
  554. // this.number=number;
  555. }
  556. ).catch(e=>{
  557. // this.pageInfoShow=true;
  558. this.number=number;
  559. })
  560. this.registerForm.khbh = data.userid;
  561. this.registerForm.khxm = data.username;
  562. this.registerForm.khdz =data.address;
  563. this.registerForm.sbbh = data.watertabid;
  564. this.registerForm.metertype = data.metertype;
  565. this.registerForm.lxdh = data.tel1;
  566. this.registerForm.ysxz = data.watertype1;
  567. debugger
  568. this.registerForm.sbkj=data.caliber
  569. this.registerForm.kaihutime=data.kaihutime;
  570. },
  571. /**
  572. * @description 来电记录
  573. */
  574. async fetchDataPhone(data) {
  575. try {
  576. const tableData = await this.getMail(data);
  577. this.recordlist = tableData.result.records;
  578. this.recordtotal = tableData.result.total;
  579. console.log(tableData);
  580. if (tableData.result.message) {
  581. this.$message(tableData.result.message);
  582. }
  583. } catch (err) {
  584. console.log(err);
  585. }
  586. },
  587. /**
  588. * @description 历史工单
  589. */
  590. fetchDatas() {
  591. const data = {
  592. current: this.paginations.current,
  593. size: this.paginations.size,
  594. ldhm: this.phoneNumber,
  595. };
  596. getRegisterList(data).then((res) => {
  597. this.totals = res.result.total;
  598. this.lists = res.result.records;
  599. for (var i = 0; i < this.lists.length; i++) {
  600. if (!this.lists[i].djsj) {
  601. this.lists[i].djsj = "无";
  602. }
  603. }
  604. });
  605. },
  606. search() {
  607. // debugger
  608. if (this.cxtj !== "" && this.cxnr !== "") {
  609. const data = {
  610. object: {
  611. CBPQ: "",
  612. CBB: "",
  613. YHBH: "0",
  614. YHXM: "",
  615. YHDZ: "",
  616. LXDH: "",
  617. YHZT: "",
  618. SBBH: "",
  619. SING: "",
  620. ACTION: "query",
  621. },
  622. url: "api/Business/GetCustomerData",
  623. };
  624. if (this.cxtj === 1) {
  625. data.object.YHBH = this.cxnr;
  626. } else if (this.cxtj === 2) {
  627. data.object.LXDH = this.cxnr;
  628. }
  629. getNames(data).then((res) => {
  630. console.log(res);
  631. if (res.code === 1) {
  632. this.list = res.result.records.map((v) => {
  633. return {
  634. khbh: v.YHBH,
  635. khxm: v.YHXM,
  636. lxdh: v.LXDH,
  637. khdz: v.YHDZ,
  638. };
  639. });
  640. }
  641. });
  642. } else {
  643. this.$message.error("请选择查询条件,并且输入6位以上查询");
  644. }
  645. },
  646. // 选择客户
  647. nameBtn() {
  648. this.clientDialog = true;
  649. },
  650. // 获取客户信息
  651. clientBtn(val) {
  652. this.clientDialog = false;
  653. this.registerForm = {
  654. ...this.registerForm,
  655. ...JSON.parse(JSON.stringify(val)),
  656. };
  657. },
  658. // 赋值
  659. handleEdit() {
  660. const data = JSON.parse(JSON.stringify(this.data));
  661. console.log("处理llllllllllllllllll", data);
  662. this.djryName = data.djryName;
  663. this.djsj = data.djsj;
  664. Object.keys(this.registerForm).forEach((key) => {
  665. this.registerForm[key] = data[key];
  666. });
  667. },
  668. // // 移除重置
  669. // resetFields() {
  670. // this.$refs.registerForm.resetFields()
  671. // },
  672. // 工单等级提交
  673. submitForm() {
  674. this.$refs.RegisterMerges.submitForm(1);
  675. },
  676. remind() {
  677. this.$emit("remind", "成功");
  678. },
  679. // // 修改提交
  680. // editSubmit(data) {
  681. // const _this = this
  682. // editRegister(data).then((res) => {
  683. // if (res.code === 1) {
  684. // _this.$message.success('处理成功!')
  685. // _this.$emit('remind', '成功')
  686. // _this.resetFields()
  687. // }
  688. // })
  689. // }
  690. },
  691. };
  692. </script>
  693. <style lang="scss" scoped>
  694. #register_merge {
  695. .wrap {
  696. border: 1px solid rgba(57, 153, 243, 0.15);
  697. >>> .el-collapse-item__header {
  698. background: rgba(57, 153, 243, 0.15);
  699. font-size: 14px;
  700. height: 28px;
  701. }
  702. }
  703. .dialog_style {
  704. width: 100%;
  705. overflow-y: auto;
  706. /deep/ .el-table {
  707. text-align: center;
  708. vertical-align: middle;
  709. }
  710. }
  711. /deep/ .el-form-item {
  712. margin-bottom: 5px;
  713. }
  714. /deep/ .el-collapse-item__wrap {
  715. margin-top: 10px;
  716. }
  717. }
  718. .btn {
  719. position: absolute;
  720. top: 50%;
  721. left: 50%;
  722. transform: translate(-50%, -50%);
  723. width: 230px;
  724. height: 90px;
  725. line-height: 90px;
  726. text-align: center;
  727. color: #fff;
  728. font-size: 25px;
  729. text-transform: uppercase;
  730. cursor: pointer;
  731. background: linear-gradient(90deg, #03a9f4, #f441a5, #ffeb3b, #03a9f4);
  732. background-size: 400%;
  733. border-radius: 60px;
  734. }
  735. .btn:hover {
  736. animation: animate 8s linear infinite;
  737. }
  738. @keyframes animate {
  739. 0% {
  740. background-position: 0%;
  741. }
  742. 100% {
  743. background-position: 400%;
  744. }
  745. }
  746. .btn::before {
  747. content: "";
  748. position: absolute;
  749. top: -5px;
  750. left: -5px;
  751. right: -5px;
  752. bottom: -5px;
  753. z-index: -1;
  754. background: linear-gradient(90deg, #03a9f4, #f441a5, #ffeb3b, #03a9f4);
  755. background-size: 400%;
  756. border-radius: 40px;
  757. opacity: 0;
  758. transition: 0.5s;
  759. }
  760. .btn:hover::before {
  761. filter: blur(20px);
  762. opacity: 1;
  763. animation: animate 8s linear infinite;
  764. }
  765. </style>