index.vue 14 KB

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