index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. <template>
  2. <div>
  3. <div class="topBox">
  4. <NavBar :go="{ type: 'push', path: '/menu' }" />
  5. <van-row>
  6. <van-col span="24">
  7. <org-tree v-model="cascaderValue" :name="'sss'" @changeItem="getDataList"></org-tree>
  8. </van-col>
  9. </van-row>
  10. <van-row>
  11. <van-col span="12"
  12. ><van-field
  13. v-model="fieldValue"
  14. label-width="3em"
  15. :disabled="showStatus"
  16. label="状态"
  17. placeholder=""
  18. @click="showStatus = true"
  19. ><van-icon name="arrow-down" slot="button"
  20. /></van-field>
  21. <van-popup v-model="showStatus" round position="bottom">
  22. <van-picker
  23. title="状态"
  24. show-toolbar
  25. :columns="columns"
  26. @confirm="onConfirm"
  27. confirm-button-text="确定"
  28. @cancel="onCancel"
  29. :close-on-click-overlay="false"
  30. />
  31. </van-popup>
  32. </van-col>
  33. <van-col span="12">
  34. <van-field
  35. v-model="currentDate"
  36. label-width="3em"
  37. label="年份"
  38. placeholder=""
  39. :disabled="showDate"
  40. @click="showDate = true"
  41. >
  42. <van-icon name="arrow-down" slot="button"
  43. /></van-field>
  44. <van-popup v-model="showDate" round position="bottom">
  45. <van-picker
  46. v-model="presentDate"
  47. show-toolbar
  48. @cancel="onCancel"
  49. :columns="yearColumns"
  50. confirm-button-text="确定"
  51. @confirm="onDateConfirm"
  52. :default-index="yearSelect"
  53. title="年份"
  54. />
  55. </van-popup>
  56. </van-col>
  57. </van-row>
  58. <van-row>
  59. <van-col span="24">
  60. <van-tabs v-model="active" @click="tbsHandler">
  61. <van-tab name="01-01" title="Q1"></van-tab>
  62. <van-tab name="04-01" title="Q2"></van-tab>
  63. <van-tab name="07-01" title="Q3"></van-tab>
  64. <van-tab name="10-01" title="Q4"></van-tab>
  65. </van-tabs>
  66. </van-col>
  67. </van-row>
  68. </div>
  69. <!-- //卡片内容区域 -->
  70. <div class="navBarclas">
  71. <van-list v-model="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
  72. <van-panel :title="item.title" v-for="item in taskList" :key="item.id" class="card" status="状态">
  73. <template #header>
  74. <div class="titleClass">
  75. <div class="title">{{ item.title }}</div>
  76. <div>
  77. <van-button type="info" v-if="isSign(item)" size="small" @click="trainSign(item.id)"
  78. >演练登记</van-button
  79. >
  80. <van-button type="info" v-if="isSignature(item)" size="small" @click="signature(item.id)"
  81. >签名</van-button
  82. >
  83. <van-button type="info" v-if="evaluateTure(item)" size="small" @click="evaluate(item.id)"
  84. >评价</van-button
  85. >
  86. </div>
  87. </div>
  88. </template>
  89. <div>
  90. <div class="mainItem" @click="goInfo(item.id)">
  91. <div>单位名称</div>
  92. <div>{{ item.orgName }}</div>
  93. </div>
  94. <div class="mainItem" @click="goInfo(item.id)">
  95. <div>演练状态</div>
  96. <div v-if="item.status == 0" :style="{ color: '#008cd6' }">{{ item.statusText }}</div>
  97. <div v-else-if="item.status == 1" :style="{ color: '#bc9f71' }">{{ item.statusText }}</div>
  98. <div v-else-if="item.status == 3" :style="{ color: '#009240' }">{{ item.statusText }}</div>
  99. <div v-else-if="item.status == 4" :style="{ color: '#d7000f' }">{{ item.statusText }}</div>
  100. </div>
  101. <div class="mainItem" @click="goInfo(item.id)">
  102. <div>演练项目</div>
  103. <div>{{ item.typeText }}</div>
  104. </div>
  105. <div class="mainItem" @click="goInfo(item.id)">
  106. <div>演练时间</div>
  107. <div>{{ item.drillTime }}</div>
  108. </div>
  109. <div class="mainItem">
  110. <div>签名情况</div>
  111. <div class="condition" @click="signatureCondition(item.id)">{{ item.signNums }}</div>
  112. </div>
  113. </div>
  114. </van-panel>
  115. </van-list>
  116. </div>
  117. <!-- 卡片弹框 -->
  118. <van-dialog
  119. v-model="conditionShow"
  120. title="签名情况"
  121. show-confirm-button
  122. confirm-button-text="关闭"
  123. @closed="beforeClose"
  124. >
  125. <div class="conditionCls">
  126. <div class="title">已签名人员({{ participationList.num }}人):</div>
  127. <div class="people">{{ participationList.list }}</div>
  128. <div class="title">未签名人员({{ absenceList.num }}人):</div>
  129. <div class="people">{{ absenceList.list }}</div>
  130. </div>
  131. </van-dialog>
  132. </div>
  133. </template>
  134. <script>
  135. import NavBar from '@/components/NavBar'
  136. import { Col, Row, Cascader, Dialog, DatetimePicker, Icon, Picker } from 'vant'
  137. import { getdrillTask, getsignUserList } from '@/api/drillTask.js'
  138. import { deptTreeList } from '@/api/toConsult.js'
  139. import { Toast } from 'vant'
  140. import OrgTree from '@/components/orgTree'
  141. import { newDateMonth, newDateYear } from '@/utils/date.js'
  142. export default {
  143. data() {
  144. return {
  145. orgName: '',
  146. orgShow: false,
  147. presentDate: '', //默认时间
  148. pageNum: 1,
  149. loading: false, //加载状态
  150. finished: false, //是否全部加载完毕
  151. participationList: {
  152. list: [], // 参与人员
  153. num: 0 //人数
  154. },
  155. yearColumns: [],
  156. absenceList: {
  157. list: [],
  158. num: 0
  159. }, // 缺席人员
  160. orgName: JSON.parse(sessionStorage.getItem('SET_USER_ORGNAME')) || '', //机构名称
  161. cascaderValue: '', //机构ID
  162. show: false, //机构弹框显示隐藏
  163. active: '01-01',
  164. fieldNames: {
  165. text: 'name',
  166. value: 'id',
  167. children: 'children'
  168. },
  169. taskList: [], //列表数据
  170. typeValue: ' ', //类型值
  171. yearSelect: null,
  172. value1: JSON.parse(sessionStorage.getItem('SET_USER_ID')) || '', //输入框model
  173. showStatus: false, //状态显示隐藏
  174. showDate: false, //月份显示隐藏
  175. fieldValue: '全部', //状态名称
  176. statusValue: ' ', //状态值
  177. columns: ['全部'], //状态数组
  178. columnsList: [], //状态数组
  179. currentDate: newDateYear(), //年份
  180. conditionShow: false //机构弹框显示隐藏
  181. }
  182. },
  183. components: {
  184. NavBar,
  185. OrgTree,
  186. Dialog,
  187. Icon,
  188. DatetimePicker,
  189. Picker,
  190. Col,
  191. Row,
  192. Cascader
  193. },
  194. created() {
  195. this.presentDate = new Date(newDateYear())
  196. this.getNewMonth()
  197. this.yearData()
  198. },
  199. mounted() {
  200. this.init()
  201. this.cascaderValue = JSON.parse(window.sessionStorage.getItem('SET_USER_ORGID')) + ''
  202. },
  203. methods: {
  204. //getNewDate
  205. getNewMonth() {
  206. //获取当前月份
  207. let date = new Date().getMonth() + 1
  208. //默认填充当前季度
  209. if (date > 7 && date < 10) {
  210. this.active = '07-01'
  211. //三季度
  212. } else if (date > 4 && date < 7) {
  213. //二季度
  214. this.active = '04-01'
  215. } else if (date > 1 && date < 4) {
  216. //一季度
  217. this.active = '01-01'
  218. } else {
  219. this.active = '10-01'
  220. // 四季度
  221. }
  222. },
  223. //机构搜索
  224. getDataList(val) {
  225. this.cascaderValue = val.id
  226. this.orgName = val.name
  227. this.selectListAppHandler()
  228. },
  229. //判断是否展示签名按钮
  230. isSignature(list) {
  231. let falg = false
  232. let timefalg = false
  233. //value1 当前登陆用户ID
  234. //当前时间再时间范围内且签名是待签名状态且签名列表存在当前登录人未签名的情况才可以进行签名
  235. if (list.startDate && list.endDate && list.status == 1) {
  236. let date = new Date().getTime()
  237. let startDate = Date.parse(new Date(list.startDate))
  238. let endDate = Date.parse(new Date(list.endDate))
  239. if (date >= startDate && date <= endDate) {
  240. console.log(list.id, 'ssss')
  241. timefalg = true
  242. }
  243. }
  244. if (list.userList && list.userList.length > 0) {
  245. list.userList.forEach(item => {
  246. console.log(this.value1, 'sss')
  247. if (this.value1 == item.userId && item.sign == 0 && item.type == 1) {
  248. falg = true
  249. }
  250. })
  251. }
  252. if (falg && timefalg) {
  253. return true
  254. }
  255. },
  256. //判断评价按钮是否展示
  257. evaluateTure(item) {
  258. if (item.status == 2 && window.sessionStorage.getItem('SET_USER_ORGTYPE') != 4) {
  259. return true
  260. }
  261. },
  262. //判断是否展示登记按钮
  263. isSign(list) {
  264. let falg = false
  265. let timefalg = false
  266. //value1 当前登陆用户ID
  267. let date = new Date().getTime()
  268. let startDate = Date.parse(new Date(list.startDate))
  269. let endDate = Date.parse(new Date(list.endDate))
  270. //任务处于待记录状态,且任务在规定完成时间范围内,登录人所在机构和角色与任务培训角色、培训机构一致才显示
  271. if (
  272. (list.startDate && list.endDate && list.status == 0) ||
  273. (list.startDate && list.endDate && list.status == 5)
  274. ) {
  275. if (date >= startDate && date <= endDate) {
  276. timefalg = true
  277. }
  278. }
  279. //cascaderValue 当前机构ID
  280. //当前用户角色ID
  281. let orgId = JSON.parse(window.sessionStorage.getItem('SET_USER_ORGID')) + ''
  282. if (orgId == list.orgId) {
  283. falg = true
  284. }
  285. if (date > endDate) {
  286. //当前时间大于结束时间表示已超期
  287. timefalg = false
  288. falg = false
  289. }
  290. if (falg && timefalg) {
  291. return true
  292. }
  293. },
  294. //初始化
  295. init() {
  296. //获取数据字典
  297. this.getDictHandler('drill_task_status', res => {
  298. this.columnsList = res
  299. this.columns = res.map(item => item.dictLabel)
  300. this.columns.unshift('全部')
  301. })
  302. //获取分页列表
  303. this.selectListAppHandler()
  304. },
  305. selectListAppHandler(type = 0, callback = () => {}) {
  306. let obj = {
  307. isAppSelect: 1,
  308. pageNum: this.pageNum,
  309. pageSize: 10
  310. }
  311. if (!type) {
  312. obj.pageNum = 1
  313. this.pageNum = 1
  314. }
  315. if (this.statusValue) {
  316. obj.status = this.statusValue
  317. }
  318. obj.orgId = this.cascaderValue || JSON.parse(window.sessionStorage.getItem('SET_USER_ORGID')) + '' || ''
  319. if (this.currentDate) {
  320. obj.date = this.currentDate + '-' + this.active
  321. }
  322. if (this.typeValue) {
  323. obj.type = this.typeValue
  324. }
  325. //获取任务列表
  326. getdrillTask(obj).then(res => {
  327. let { code, rows, msg } = res
  328. if (code == 200) {
  329. if (type) {
  330. this.taskList.push(...rows)
  331. if (rows.length == 0 || rows.length < 10) {
  332. //已加载完全部数据
  333. this.finished = true
  334. }
  335. callback()
  336. } else {
  337. this.finished = false
  338. this.taskList = rows
  339. }
  340. } else {
  341. this.finished = true
  342. this.taskList = []
  343. }
  344. })
  345. },
  346. //搜索选择状态时触发
  347. onConfirm(value, index) {
  348. this.fieldValue = value
  349. this.columnsList.forEach(item => {
  350. if (value == item.dictLabel) {
  351. this.statusValue = item.dictValue
  352. }
  353. })
  354. if (value == '全部') {
  355. this.statusValue = ' '
  356. }
  357. this.selectListAppHandler()
  358. this.showStatus = false
  359. },
  360. tbsHandler() {
  361. this.selectListAppHandler()
  362. },
  363. //月份选中触发
  364. onDateConfirm(val) {
  365. this.currentDate = this.newDate(val + '')
  366. this.showDate = false
  367. this.selectListAppHandler()
  368. },
  369. yearData() {
  370. // 获取默认显示的时间
  371. var nowTime = new Date()
  372. let year = nowTime.getFullYear()
  373. let month = nowTime.getMonth()
  374. let day = nowTime.getDate()
  375. // 循环数组 填写最小时间和最大时间范围
  376. for (let i = 1980; i < 2099; i++) {
  377. this.yearColumns.push(i)
  378. }
  379. // 格式化时间并截取
  380. var years = this.formatDate(new Date(year, month, day))
  381. var Year = years.slice(0, 4)
  382. // 将截取的年份赋值给绑定值 用于点击弹出日期窗口后显示当前的时间
  383. this.yearSelect = this.yearColumns.indexOf(Number(Year))
  384. }, //日期转换
  385. newDate(time) {
  386. var date = new Date(time)
  387. var y = date.getFullYear()
  388. var m = date.getMonth() + 1
  389. m = m < 10 ? '0' + m : m
  390. var d = date.getDate()
  391. d = d < 10 ? '0' + d : d
  392. return y
  393. },
  394. //日期格式
  395. formatDate(date) {
  396. return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`
  397. },
  398. //onLoad下拉刷新
  399. onLoad() {
  400. if (this.pageNum == 1) {
  401. this.pageNum = 2
  402. }
  403. this.loading = true
  404. this.selectListAppHandler(1, () => {
  405. this.pageNum++
  406. this.loading = false
  407. console.log(1)
  408. })
  409. },
  410. //查看签名情况
  411. signatureCondition(id) {
  412. this.conditionShow = true
  413. getsignUserList(id).then(res => {
  414. console.log(res, 'ssss')
  415. let { meg, code, data } = res
  416. data.map(item => {
  417. if (item.sign != 1) {
  418. this.absenceList.list.push(item.userName)
  419. this.absenceList.num++
  420. } else {
  421. this.participationList.list.push(item.userName)
  422. this.participationList.num++
  423. }
  424. })
  425. this.absenceList.list = this.absenceList.list.join(',')
  426. this.participationList.list = this.participationList.list.join(',')
  427. })
  428. },
  429. //培训登记跳转
  430. trainSign(id) {
  431. this.$router.push('/addRehearsalTask/' + id)
  432. },
  433. //签名
  434. signature(id) {
  435. this.$router.push('/rehearsalTaskSign/' + id + '_edit')
  436. },
  437. //评价
  438. evaluate(id) {
  439. this.$router.push('/rehearsalTaskSign/' + id + '_evaluate')
  440. },
  441. //关闭弹框
  442. beforeClose() {
  443. ;(this.participationList = {
  444. list: [], // 参与人员
  445. num: 0 //人数
  446. }),
  447. (this.absenceList = {
  448. list: [],
  449. num: 0
  450. })
  451. },
  452. //跳转详情
  453. goInfo(id) {
  454. this.$router.push('/rehearsalTasinfo/' + id + '_info')
  455. },
  456. onCancel() {
  457. this.show = false
  458. this.typeStatus = false
  459. this.showDate = false
  460. this.showStatus = false
  461. }
  462. }
  463. }
  464. </script>
  465. <style lang="scss" scoped>
  466. .popup {
  467. height: 40vh;
  468. }
  469. .navBarclas {
  470. height: calc(100vh - 380px);
  471. overflow: scroll;
  472. }
  473. .btnf_box {
  474. background-color: #fff;
  475. }
  476. .card {
  477. margin: 20px;
  478. margin-bottom: 0px;
  479. box-shadow: 0 8px 12px #ebedf0;
  480. }
  481. .btn {
  482. float: right;
  483. margin-top: 24px;
  484. margin-right: 20px;
  485. box-sizing: border-box;
  486. }
  487. .titleClass {
  488. display: flex;
  489. align-items: center;
  490. height: 100%;
  491. padding: 20px;
  492. border-bottom: 1px solid #ccc;
  493. .title {
  494. font-size: 30px;
  495. flex: 1;
  496. line-height: 50px;
  497. }
  498. }
  499. .mainItem {
  500. display: flex;
  501. font-size: 28px;
  502. padding: 20px;
  503. justify-content: space-between;
  504. .condition {
  505. color: #1989fa;
  506. text-decoration: underline;
  507. }
  508. }
  509. .conditionCls {
  510. .title {
  511. color: #1989fa;
  512. margin-left: 30px;
  513. // margin-top: 30px;
  514. }
  515. .people {
  516. margin-left: 80px;
  517. margin-bottom: 30px;
  518. margin-top: 30px;
  519. }
  520. }
  521. .topBox {
  522. // overflow: hidden;
  523. }
  524. :deep.van-field--disabled {
  525. color: #323233;
  526. }
  527. :deep.van-field--disabled .van-field__label {
  528. color: #323233;
  529. }
  530. :deep .van-field__control[disabled] {
  531. color: #323233;
  532. -webkit-text-fill-color: #323233;
  533. }
  534. </style>