indes.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. <template>
  2. <div class="fle bgColor">
  3. <!-- 头部导航栏 -->
  4. <div class="tav">
  5. <router-link to="/NewIncident">
  6. <i class="iconfont icon-xinjian"></i>
  7. <span>新建事件</span>
  8. </router-link>
  9. <!-- <div @click="toNewIncident()">
  10. <i class="iconfont icon-xinjian"></i>
  11. <span>新建事件</span>
  12. </div>-->
  13. <router-link to="/knowList">
  14. <i class="iconfont icon-message"></i>
  15. <span>常见问题</span>
  16. </router-link>
  17. <router-link to="/guide">
  18. <i class="iconfont icon-fuwuzhinan"></i>
  19. <span>公告公示</span>
  20. </router-link>
  21. <!-- <div @click="toKnowList()">
  22. <i class="iconfont icon-message"></i>
  23. <span>常见问题</span>
  24. </div>
  25. <div @click="toGuide()">
  26. <i class="iconfont icon-fuwuzhinan"></i>
  27. <span>公告公示</span>
  28. </div>-->
  29. </div>
  30. <div class="bigBody">
  31. <!-- 统计信息 -->
  32. <div
  33. class="newStatistics"
  34. v-if="!newStatisticsLoading && isShowNewStatistics"
  35. >
  36. <div class="buildOrder">
  37. <router-link
  38. class="buildOrderItem"
  39. :to="{ path: '/main/incidentList/today' }"
  40. tag="div"
  41. >
  42. <div class="s_num">{{ newStatistics.createOrders }}</div>
  43. <div>今日建单</div>
  44. </router-link>
  45. <router-link
  46. class="buildOrderItem"
  47. :to="{ path: '/main/incidentList/todo' }"
  48. tag="div"
  49. >
  50. <div class="s_num">{{ newStatistics.todoOrders }}</div>
  51. <div>待处理</div>
  52. </router-link>
  53. </div>
  54. <router-link
  55. class="attendance"
  56. :to="{ path: '/main/workList' }"
  57. tag="div"
  58. >
  59. <div class="attendanceItem">
  60. <div class="s_num">{{ newStatistics.usersCount }}</div>
  61. <div>今日上班应到</div>
  62. </div>
  63. <div class="attendanceItem">
  64. <div class="s_num">{{ newStatistics.onlineCount }}</div>
  65. <div>今日上班实到</div>
  66. </div>
  67. <div class="attendanceItem">
  68. <div class="s_num">{{ newStatistics.errorCount }}</div>
  69. <div>今日迟到</div>
  70. </div>
  71. </router-link>
  72. </div>
  73. <!-- loading -->
  74. <div
  75. class="newStatistics loading"
  76. v-if="newStatisticsLoading && isShowNewStatistics"
  77. >
  78. <cube-loading :size="30"></cube-loading>
  79. </div>
  80. <!-- 最新报修 -->
  81. <div class="newRepair">
  82. <div class="titHead">
  83. <span class="tit">
  84. <i class="iconfont icon-zuixinbaoxiu newPapir"></i>
  85. <span>待办事项</span>
  86. </span>
  87. <span class="link" @click="toIncidentList('todo')">
  88. 更多
  89. <i class="iconfont icon-moren"></i>
  90. </span>
  91. </div>
  92. <div
  93. class="conentBox"
  94. v-for="item in dataList"
  95. :key="item.id"
  96. @click="toIncidentDetails(item)"
  97. v-if="!!dataList.length"
  98. >
  99. <!-- <div class="conentBox" v-for="v in dataList" @click="toIncidentDetails(v)" v-if="!newRapirNoData&&!newRapirLoading"> -->
  100. <div class="conent">
  101. <div class="head">
  102. <p>
  103. 事件单号:{{ item.incidentsign }}
  104. <span
  105. :class="{
  106. btn: true,
  107. daipingjia: item.state.name == '待评价',
  108. daijiedan:
  109. item.state.name == '待接单' &&
  110. item.state.name == '待接单' &&
  111. item.handlerUser &&
  112. !item.candidateGroups,
  113. daiqiangdan:
  114. item.state.name == '待接单' &&
  115. item.state.name == '待接单' &&
  116. !item.handlerUser &&
  117. item.candidateGroups,
  118. chulizhong: item.state.name == '处理中',
  119. yijiejue: item.state.name == '已解决',
  120. yiguanbi: item.state.name == '已关闭',
  121. chongxinzhipai: item.state.name == '重新指派'
  122. }"
  123. >{{
  124. item.state.name == "待接单"
  125. ? item.handlerUser && !item.candidateGroups
  126. ? "待接单"
  127. : "待抢单"
  128. : item.state.name
  129. }}</span
  130. >
  131. </p>
  132. </div>
  133. <div class="center">
  134. <p class="desc">
  135. <span class="fl">事件描述:</span>
  136. <span
  137. class="grayFont overflowEllipsis2"
  138. v-html="item.description"
  139. ></span>
  140. </p>
  141. <p v-if="valConfig == 1">
  142. 报修人:
  143. <span class="grayFont">{{ item.requester.name }}</span>
  144. <span v-if="!item.contactsInformation"></span>
  145. <span @click.stop v-if="item.contactsInformation"
  146. ><a :href="'tel:' + item.contactsInformation"
  147. >(<i class="iconfont icon-shouji"></i
  148. >{{ item.contactsInformation }})</a
  149. ></span
  150. >
  151. </p>
  152. <p v-if="valConfig == 2">
  153. 报修科室 :
  154. <span class="grayFont">{{
  155. item.department ? item.department.dept : ""
  156. }}</span>
  157. </p>
  158. </div>
  159. <div class="bottom">
  160. <span v-if="!item.place"></span>
  161. <span
  162. v-if="item.place"
  163. style="width:70%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;"
  164. >{{ item.place.area.area }} {{ item.place.place }}
  165. {{ item.houseNumber }}</span
  166. >
  167. <span>{{ item.acceptDate | timeFormat("MM-dd HH:mm") }}</span>
  168. </div>
  169. </div>
  170. </div>
  171. <!-- 无数据 -->
  172. <div class="wushuju" v-if="!dataList.length && !newRapirLoading">
  173. <img src="./../../static/images/wushuju.svg" alt />
  174. <p>暂无待办事项</p>
  175. </div>
  176. <!-- loading -->
  177. <div class="loading" v-if="newRapirLoading">
  178. <cube-loading :size="30"></cube-loading>
  179. </div>
  180. </div>
  181. <!-- 最新公告 -->
  182. <div class="newNotice">
  183. <div class="titHead">
  184. <span class="tit">
  185. <i class="iconfont icon-message newNoticeico"></i>
  186. <span>最新公告</span>
  187. </span>
  188. <span class="link" @click="toGuide()">
  189. 更多
  190. <i class="iconfont icon-moren"></i>
  191. </span>
  192. </div>
  193. <div class="conentBox" v-if="!newNoticeNoData && !newNoticeLoading">
  194. <div class="conent" v-for="v in noticeData" @click="toGuideDetail(v)">
  195. <div class="head overflowEllipsis2">{{ v.title }}</div>
  196. <div class="cot">
  197. {{ v.createTime.substring(0, v.createTime.length - 5) }}
  198. </div>
  199. </div>
  200. </div>
  201. <!-- 无数据 -->
  202. <div class="wushuju" v-if="newNoticeNoData">
  203. <img src="./../../static/images/wugonggao.svg" alt />
  204. <p>暂无最新公告</p>
  205. </div>
  206. <!-- loading -->
  207. <div class="loading" v-if="newNoticeLoading">
  208. <cube-loading :size="30"></cube-loading>
  209. </div>
  210. </div>
  211. </div>
  212. </div>
  213. </template>
  214. <script>
  215. import { formatDate } from "./../components/js/date.js";
  216. export default {
  217. data() {
  218. return {
  219. loginUser: JSON.parse(localStorage.getItem("loginUser")),
  220. noticeData: "", //公告列表
  221. dataList: "", //最新报修
  222. state: "", //流程状态
  223. newRapirNoData: false, //最新报修无数据
  224. newNoticeNoData: false,
  225. newRapirLoading: true, //最新报修loading
  226. newNoticeLoading: true, //最新公告loading
  227. candidateGroups: "",
  228. valConfig: JSON.parse(localStorage.getItem("valConfig")) - 0, //报修主体
  229. newStatistics: {
  230. createOrders: 0, //今日建单
  231. todoOrders: 0, //处理中
  232. usersCount: 0, //今日上班应到
  233. onlineCount: 0, //今日上班实到
  234. errorCount: 0 //今日迟到
  235. }, //统计数据
  236. newStatisticsLoading: false, //统计数据Loading
  237. isShowNewStatistics: false
  238. };
  239. },
  240. methods: {
  241. // 获取公告列表数据
  242. getNoticData() {
  243. console.log(this.valConfig);
  244. // alert('公告列表')
  245. var that = this;
  246. this.$http
  247. .post("service/user/data/fetchDataList/notice", {
  248. idx: 0,
  249. sum: 3,
  250. notice: { status: 1 }
  251. })
  252. .then(function(res) {
  253. // alert(JSON.stringify(res.data))
  254. that.newNoticeLoading = false;
  255. if (res.data.list.length > 0) {
  256. that.newNoticeNoData = false;
  257. that.noticeData = res.data.list;
  258. } else {
  259. that.newNoticeNoData = true;
  260. }
  261. });
  262. },
  263. // 获取统计信息
  264. getManagerIndexInfo() {
  265. this.newStatisticsLoading = true;
  266. this.$http.post("service/bpm/data/getManagerIndexInfo", {}).then(res => {
  267. this.newStatisticsLoading = false;
  268. if (res.status == 200) {
  269. this.newStatistics = res.data.data;
  270. }
  271. });
  272. },
  273. // 获取最新报修
  274. getNewRapir() {
  275. var that = this;
  276. this.$http
  277. .post("service/bpm/bpm/fetchTask/bpm_incident", {
  278. assignee: that.loginUser.id,
  279. candidateGroups: that.candidateGroups,
  280. searchType: "todo",
  281. idx: 0,
  282. sum: 2,
  283. incident: { temporary: true }
  284. })
  285. .then(function(res) {
  286. that.newRapirLoading = false;
  287. if (res.data.data.length > 0) {
  288. that.newRapirNoData = false;
  289. that.dataList = res.data.data;
  290. that.dataList[0].createTime = formatDate(
  291. new Date(that.dataList[0].createTime),
  292. "MM-dd hh:mm"
  293. );
  294. } else {
  295. that.newRapirNoData = true;
  296. }
  297. });
  298. },
  299. // toNewIncident() {
  300. // this.$router.push({ path: "/newIncident" });
  301. // },
  302. toNoticeDetails(data) {
  303. this.$router.push({
  304. name: "NoticeDetails",
  305. params: {
  306. data: JSON.stringify(data)
  307. }
  308. });
  309. },
  310. toNoticeList() {
  311. this.$router.push({ path: "/noticeList" });
  312. },
  313. toIncidentList(searchType) {
  314. this.$router.push({
  315. name: "IncidentList",
  316. params: {
  317. searchType: searchType
  318. }
  319. });
  320. },
  321. // toKnowList() {
  322. // this.$router.push({ path: "/knowList" });
  323. // },
  324. toGuide() {
  325. this.$router.push({ path: "/guide" });
  326. },
  327. toGuideDetail(v) {
  328. this.$router.push({ name: "GuideDetail", params: { data: v } });
  329. },
  330. toIncidentDetails(data) {
  331. var name = "";
  332. if (data.state.value == "pending") {
  333. if (data.handlerUser && !data.candidateGroups) {
  334. // 指派给人 接单
  335. name = "Order";
  336. } else if (data.candidateGroups && !data.handlerUser) {
  337. // 指派给组 抢单
  338. name = "GrabSheet";
  339. }
  340. } else if (data.state.value == "reassign") {
  341. name = "AgainAssign";
  342. } else if (data.state.value == "handler") {
  343. name = "Processing";
  344. } else if (data.state.value == "resolved") {
  345. name = "Solved";
  346. } else if (data.state.value == "close") {
  347. name = "Closed";
  348. }
  349. this.$router.push({
  350. name: name,
  351. params: {
  352. data: data
  353. }
  354. });
  355. }
  356. },
  357. created() {
  358. this.isShowNewStatistics = this.loginUser.role.some(
  359. v =>
  360. v.rolecode == "incident-category-manager" ||
  361. v.rolecode == "incident manager"
  362. );
  363. var that = this;
  364. that.valConfig = JSON.parse(localStorage.getItem("valConfig")) - 0;
  365. that.loginUser.group.forEach(element => {
  366. that.candidateGroups += element.id + ",";
  367. });
  368. that.candidateGroups = that.candidateGroups.substring(
  369. 0,
  370. that.candidateGroups.length - 1
  371. );
  372. localStorage.removeItem("category");
  373. localStorage.removeItem("categoryVal");
  374. localStorage.removeItem("selectedCategoryTxt");
  375. localStorage.removeItem("model");
  376. localStorage.removeItem("modelData");
  377. localStorage.removeItem("place");
  378. localStorage.removeItem("referenceInfo");
  379. localStorage.removeItem("solution");
  380. localStorage.removeItem("order");
  381. this.getNoticData();
  382. this.getNewRapir();
  383. if (this.isShowNewStatistics) {
  384. this.getManagerIndexInfo();
  385. }
  386. },
  387. mounted() {}
  388. };
  389. </script>
  390. <style scoped lang="less">
  391. .fl {
  392. float: left;
  393. }
  394. .fr {
  395. float: right;
  396. }
  397. .bgColor {
  398. background-color: white;
  399. }
  400. .fle {
  401. display: flex;
  402. flex-direction: column;
  403. background-color: white;
  404. }
  405. .bigBody {
  406. display: flex;
  407. flex-direction: column;
  408. height: 100%;
  409. width: 100%;
  410. overflow: auto;
  411. }
  412. /* 头部导航栏 */
  413. .tav {
  414. height: 2rem;
  415. background: linear-gradient(#005395, #226ca8, #003057);
  416. display: flex;
  417. width: 100%;
  418. }
  419. .tav a {
  420. flex: 1;
  421. text-align: center;
  422. display: flex;
  423. flex-direction: column;
  424. align-items: center;
  425. justify-content: center;
  426. }
  427. .tav a i {
  428. font-size: 0.6rem;
  429. color: white;
  430. }
  431. .tav a span {
  432. font-size: 0.32rem;
  433. color: white;
  434. display: inline-block;
  435. margin-top: 0.16rem;
  436. }
  437. /* .bigBody{
  438. height: auto;
  439. } */
  440. /* tit导航 */
  441. .titHead {
  442. display: flex;
  443. justify-content: space-between;
  444. padding: 0 0.24rem;
  445. height: 0.88rem;
  446. line-height: 0.88rem;
  447. border-bottom: 0.01rem rgb(238, 238, 238) solid;
  448. }
  449. .titHead1 {
  450. height: 0.88rem;
  451. }
  452. .titHead .tit .newPapir {
  453. font-size: 0.36rem;
  454. color: #a37200;
  455. }
  456. .titHead .tit .newNoticeico {
  457. font-size: 0.36rem;
  458. color: #005395;
  459. }
  460. .titHead .tit span {
  461. display: inline-block;
  462. margin-left: 0.08rem;
  463. font-size: 0.36rem;
  464. }
  465. .titHead .link {
  466. font-size: 0.24rem;
  467. color: #999999;
  468. }
  469. .titHead .link i {
  470. font-size: 0.24rem;
  471. color: #999999;
  472. display: inline-block;
  473. margin-left: 0.08rem;
  474. }
  475. .newStatistics {
  476. border-bottom: 1px solid #eee;
  477. border-top: 0.16rem solid #eee;
  478. .s_num {
  479. font-size: 0.32rem;
  480. font-weight: bold;
  481. }
  482. .buildOrder {
  483. display: flex;
  484. .buildOrderItem {
  485. height: 1.2rem;
  486. flex: 1;
  487. display: flex;
  488. justify-content: space-around;
  489. align-items: center;
  490. flex-direction: column;
  491. border-right: 1px solid #eee;
  492. border-top: 1px solid #eee;
  493. padding: 0.2rem 0;
  494. box-sizing: border-box;
  495. &:last-of-type {
  496. border-right: 0;
  497. }
  498. }
  499. }
  500. .attendance {
  501. display: flex;
  502. .attendanceItem {
  503. height: 1.2rem;
  504. flex: 1;
  505. display: flex;
  506. justify-content: space-around;
  507. align-items: center;
  508. flex-direction: column;
  509. border-right: 1px solid #eee;
  510. border-top: 1px solid #eee;
  511. padding: 0.2rem 0;
  512. box-sizing: border-box;
  513. &:last-of-type {
  514. border-right: 0;
  515. }
  516. }
  517. }
  518. }
  519. .newRepair {
  520. border-top: 0.16rem rgb(238, 238, 238) solid;
  521. .conentBox {
  522. .conent {
  523. font-size: 0.32rem;
  524. font-weight: 400;
  525. line-height: 0.45rem;
  526. .head {
  527. border-bottom: 0.01rem solid #e6e6e6;
  528. p {
  529. padding: 0.24rem 0.48rem;
  530. .btn {
  531. float: right;
  532. }
  533. }
  534. }
  535. .center {
  536. color: #333333;
  537. border-bottom: 0.01rem solid #e6e6e6;
  538. padding: 0.24rem 0.48rem;
  539. p {
  540. &.desc {
  541. overflow: hidden;
  542. max-height: 0.88rem;
  543. }
  544. .grayFont {
  545. overflow-x: scroll;
  546. color: #666;
  547. }
  548. }
  549. }
  550. .bottom {
  551. display: flex;
  552. justify-content: space-between;
  553. align-items: center;
  554. overflow: hidden;
  555. height: 0.86rem;
  556. border-bottom: 0.01rem solid #e6e6e6;
  557. font-size: 0.24rem;
  558. color: #999;
  559. padding: 0 0.24rem 0 0.48rem;
  560. }
  561. }
  562. }
  563. }
  564. /* 最新公告 */
  565. .newNotice {
  566. border-top: 0.16rem rgb(238, 238, 238) solid;
  567. .conentBox {
  568. .conent {
  569. padding: 0.24rem 0.64rem;
  570. border-bottom: 0.01rem solid #eee;
  571. .head {
  572. font-size: 0.32rem;
  573. line-height: 0.45rem;
  574. }
  575. .cot {
  576. font-size: 0.24rem;
  577. color: #999;
  578. line-height: 0.34rem;
  579. }
  580. }
  581. }
  582. }
  583. .wushuju {
  584. text-align: center;
  585. color: #999;
  586. }
  587. .wushuju img {
  588. width: 5.12rem;
  589. height: 2.84rem;
  590. }
  591. .loading {
  592. height: 2rem;
  593. display: flex;
  594. justify-content: center;
  595. align-items: center;
  596. }
  597. </style>