index.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  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 class="wj-title-blue" v-if="item.status == 0||item.status == 5" >{{ item.statusText }}</div>
  97. <div class="wj-title-orange" v-else-if="item.status == 1||item.status == 2" >{{ item.statusText }}</div>
  98. <div class="wj-title-green" v-else-if="item.status == 3" >{{ item.statusText }}</div>
  99. <div class="wj-title-red" v-else-if="item.status == 4" >{{ 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 v-if="item.drillStartTime&&item.drillEndTime">{{ item.drillStartTime }}-{{item.drillEndTime }}</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. if(!list.planId){
  244. timefalg = true
  245. }
  246. }
  247. if (list.userList && list.userList.length > 0) {
  248. list.userList.forEach(item => {
  249. console.log(this.value1, 'sss')
  250. if (this.value1 == item.userId && item.sign == 0 && item.type == 1) {
  251. falg = true
  252. }
  253. })
  254. }
  255. if (falg && timefalg) {
  256. return true
  257. }
  258. },
  259. //判断评价按钮是否展示
  260. evaluateTure(item) {
  261. if (item.status == 2 && window.sessionStorage.getItem('SET_USER_ORGTYPE') != 4) {
  262. return true
  263. }
  264. },
  265. //判断是否展示登记按钮
  266. isSign(list) {
  267. let falg = false
  268. let timefalg = false
  269. //value1 当前登陆用户ID
  270. let date = new Date().getTime()
  271. let startDate = Date.parse(new Date(list.startDate))
  272. let endDate = Date.parse(new Date(list.endDate))
  273. //任务处于待记录状态,且任务在规定完成时间范围内,登录人所在机构和角色与任务培训角色、培训机构一致才显示
  274. if (
  275. (list.startDate && list.endDate && list.status == 0) ||
  276. (list.startDate && list.endDate && list.status == 5)
  277. ) {
  278. if (date >= startDate && date <= endDate) {
  279. timefalg = true
  280. }
  281. }
  282. //cascaderValue 当前机构ID
  283. //当前用户角色ID
  284. let orgId = JSON.parse(window.sessionStorage.getItem('SET_USER_ORGID')) + ''
  285. if (orgId == list.orgId) {
  286. falg = true
  287. }
  288. if (date > endDate) {
  289. //当前时间大于结束时间表示已超期
  290. timefalg = false
  291. falg = false
  292. }
  293. if (falg && timefalg) {
  294. return true
  295. }
  296. },
  297. //初始化
  298. init() {
  299. //获取数据字典
  300. this.getDictHandler('drill_task_status', res => {
  301. this.columnsList = res
  302. this.columns = res.map(item => item.dictLabel)
  303. this.columns.unshift('全部')
  304. })
  305. //获取分页列表
  306. this.selectListAppHandler()
  307. },
  308. selectListAppHandler(type = 0, callback = () => {}) {
  309. let obj = {
  310. isAppSelect: 1,
  311. pageNum: this.pageNum,
  312. pageSize: 10
  313. }
  314. if (!type) {
  315. obj.pageNum = 1
  316. this.pageNum = 1
  317. }
  318. if (this.statusValue) {
  319. obj.status = this.statusValue
  320. }
  321. obj.orgId = this.cascaderValue || JSON.parse(window.sessionStorage.getItem('SET_USER_ORGID')) + '' || ''
  322. if (this.currentDate) {
  323. obj.date = this.currentDate + '-' + this.active
  324. }
  325. if (this.typeValue) {
  326. obj.type = this.typeValue
  327. }
  328. //获取任务列表
  329. getdrillTask(obj).then(res => {
  330. let { code, rows, msg } = res
  331. if (code == 200) {
  332. if (type) {
  333. this.taskList.push(...rows)
  334. if (rows.length == 0 || rows.length < 10) {
  335. //已加载完全部数据
  336. this.finished = true
  337. }
  338. callback()
  339. } else {
  340. this.finished = false
  341. this.taskList=rows||[]
  342. if(rows.length == 0){
  343. this.taskList=[]
  344. }
  345. }
  346. } else {
  347. this.finished = true
  348. this.taskList = []
  349. }
  350. })
  351. },
  352. //搜索选择状态时触发
  353. onConfirm(value, index) {
  354. this.fieldValue = value
  355. this.columnsList.forEach(item => {
  356. if (value == item.dictLabel) {
  357. this.statusValue = item.dictValue
  358. }
  359. })
  360. if (value == '全部') {
  361. this.statusValue = ' '
  362. }
  363. this.selectListAppHandler()
  364. this.showStatus = false
  365. },
  366. tbsHandler() {
  367. this.selectListAppHandler()
  368. },
  369. //月份选中触发
  370. onDateConfirm(val) {
  371. this.currentDate = this.newDate(val + '')
  372. this.showDate = false
  373. this.selectListAppHandler()
  374. },
  375. yearData() {
  376. // 获取默认显示的时间
  377. var nowTime = new Date()
  378. let year = nowTime.getFullYear()
  379. let month = nowTime.getMonth()
  380. let day = nowTime.getDate()
  381. // 循环数组 填写最小时间和最大时间范围
  382. for (let i = 1980; i < 2099; i++) {
  383. this.yearColumns.push(i)
  384. }
  385. // 格式化时间并截取
  386. var years = this.formatDate(new Date(year, month, day))
  387. var Year = years.slice(0, 4)
  388. // 将截取的年份赋值给绑定值 用于点击弹出日期窗口后显示当前的时间
  389. this.yearSelect = this.yearColumns.indexOf(Number(Year))
  390. }, //日期转换
  391. newDate(time) {
  392. var date = new Date(time)
  393. var y = date.getFullYear()
  394. var m = date.getMonth() + 1
  395. m = m < 10 ? '0' + m : m
  396. var d = date.getDate()
  397. d = d < 10 ? '0' + d : d
  398. return y
  399. },
  400. //日期格式
  401. formatDate(date) {
  402. return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`
  403. },
  404. //onLoad下拉刷新
  405. onLoad() {
  406. if (this.pageNum == 1) {
  407. this.pageNum = 2
  408. }
  409. this.loading = true
  410. this.selectListAppHandler(1, () => {
  411. this.pageNum++
  412. this.loading = false
  413. console.log(1)
  414. })
  415. },
  416. //查看签名情况
  417. signatureCondition(id) {
  418. this.conditionShow = true
  419. getsignUserList(id).then(res => {
  420. console.log(res, 'ssss')
  421. let { meg, code, data } = res
  422. data.map(item => {
  423. if (item.sign != 1) {
  424. this.absenceList.list.push(item.userName)
  425. this.absenceList.num++
  426. } else {
  427. this.participationList.list.push(item.userName)
  428. this.participationList.num++
  429. }
  430. })
  431. this.absenceList.list = this.absenceList.list.join(',')
  432. this.participationList.list = this.participationList.list.join(',')
  433. })
  434. },
  435. //培训登记跳转
  436. trainSign(id) {
  437. this.$router.push('/addRehearsalTask/' + id)
  438. },
  439. //签名
  440. signature(id) {
  441. this.$router.push('/rehearsalTaskSign/' + id + '_edit')
  442. },
  443. //评价
  444. evaluate(id) {
  445. this.$router.push('/rehearsalTaskSign/' + id + '_evaluate')
  446. },
  447. //关闭弹框
  448. beforeClose() {
  449. ;(this.participationList = {
  450. list: [], // 参与人员
  451. num: 0 //人数
  452. }),
  453. (this.absenceList = {
  454. list: [],
  455. num: 0
  456. })
  457. },
  458. //跳转详情
  459. goInfo(id) {
  460. this.$router.push('/rehearsalTasinfo/' + id + '_info')
  461. },
  462. onCancel() {
  463. this.show = false
  464. this.typeStatus = false
  465. this.showDate = false
  466. this.showStatus = false
  467. }
  468. }
  469. }
  470. </script>
  471. <style lang="scss" scoped>
  472. .popup {
  473. height: 40vh;
  474. }
  475. .navBarclas {
  476. height: calc(100vh - 380px);
  477. overflow: scroll;
  478. }
  479. .btnf_box {
  480. background-color: #fff;
  481. }
  482. .card {
  483. margin: 20px;
  484. margin-bottom: 0px;
  485. box-shadow: 0 8px 12px #ebedf0;
  486. }
  487. .btn {
  488. float: right;
  489. margin-top: 24px;
  490. margin-right: 20px;
  491. box-sizing: border-box;
  492. }
  493. .titleClass {
  494. display: flex;
  495. align-items: center;
  496. height: 100%;
  497. padding: 20px;
  498. border-bottom: 1px solid #ccc;
  499. .title {
  500. font-size: 30px;
  501. flex: 1;
  502. line-height: 50px;
  503. }
  504. }
  505. .mainItem {
  506. display: flex;
  507. font-size: 28px;
  508. padding: 20px;
  509. justify-content: space-between;
  510. .condition {
  511. color: #1989fa;
  512. text-decoration: underline;
  513. }
  514. }
  515. .conditionCls {
  516. .title {
  517. color: #1989fa;
  518. margin-left: 30px;
  519. // margin-top: 30px;
  520. }
  521. .people {
  522. margin-left: 80px;
  523. margin-bottom: 30px;
  524. margin-top: 30px;
  525. }
  526. }
  527. .topBox {
  528. // overflow: hidden;
  529. }
  530. :deep.van-field--disabled {
  531. color: #323233;
  532. }
  533. :deep.van-field--disabled .van-field__label {
  534. color: #323233;
  535. }
  536. :deep .van-field__control[disabled] {
  537. color: #323233;
  538. -webkit-text-fill-color: #323233;
  539. }
  540. </style>