coys 2 vuotta sitten
vanhempi
commit
ef9a724165

+ 1 - 0
src/components/layouts/index.vue

@@ -55,6 +55,7 @@ export default {
       userInfo().then(info=>{
         console.log(info,'info')
         this.$store.commit('SET_USER_NAME',info.user.name);
+        this.$store.commit('SET_USER_ROLELIST',info.roleList);
         this.$store.commit('SET_USER_ID',info.user.id);
         this.$store.commit('SET_USER_ORGID',info.user.orgId);
         this.$store.commit('SET_USER_ORGNAME',info.user.orgName);

+ 8 - 6
src/components/nfcPopup/alone.vue

@@ -3,11 +3,11 @@
     <van-popup v-model="visible" get-container="nfc-popup" lock-scroll>
       <div class="nfc-panel">
         <div>
-          <p v-if="showBottomBox" class="top-text">将手机背部靠近NFC标签扫描</p>
+          <p  class="top-text">将手机背部靠近NFC标签扫描</p>
           <div class="image-box">
             <img class="nfc-image" v-show="nfcImage" :src="nfcImage" alt="">
           </div>
-          <div v-if="showBottomBox" class="bottom-box">
+          <div  class="bottom-box">
             <div>
               <img :src="require('../../assets/img/icon/NFC扫描-01.png')" />
               <span>NFC</span>
@@ -45,7 +45,7 @@ export default {
     visible(val){
       if(val){
         this.nfcImage = null;
-        this.showBottomBox = true;
+        
       }
     }
   },
@@ -60,9 +60,11 @@ export default {
       formData.append('file',imgFile);
       upload(formData,'image').then(res=>{
         console.log(res,'resssss')
-        this.nfcImage = baseImg.base;
+       // this.nfcImage = baseImg.base;
         this.$emit('change',baseImg)
-        this.showBottomBox = false;
+        this.visible = false;
+    
+       // this.showBottomBox = false;
       })
 
     },
@@ -73,7 +75,7 @@ export default {
           file,
           quality: 0.6,
           success: (result) => {
-            //this.$toast('图片压缩成功')
+            
             console.log(result,'图片压缩后')
             let img = new File([result], result.name, {
               width: result.width,

+ 6 - 0
src/store/modules/user.js

@@ -1,4 +1,6 @@
 const state = {
+  //用户角色组
+  userRoleList:JSON.parse(sessionStorage.getItem("SET_USER_ROLELIST"))||[],
   //用户名
   userName: JSON.parse(sessionStorage.getItem("SET_USER_NAME"))||null,
   //机构id
@@ -13,6 +15,10 @@ const mutations = {
     state.userName = name;
     sessionStorage.setItem("SET_USER_NAME", JSON.stringify(name))
   },
+  SET_USER_ROLELIST(state, name) {
+    state.userRoleList = name;
+    sessionStorage.setItem("SET_USER_ROLELIST", JSON.stringify(name))
+  },
   SET_USER_ORGID(state, val) {
     state.orgId = val;
     sessionStorage.setItem("SET_USER_ORGID", JSON.stringify(val))

+ 12 - 0
src/utils/base64TurnImg.js

@@ -0,0 +1,12 @@
+//base64转Blob
+export function  base64ToBlob(base64, type) {
+    console.log(base64);
+  const bstr = atob(base64.replace(/^[^,]+,/, ''))
+  let n = bstr.length
+  const u8arr = new Uint8Array(n)
+  while (n--) {
+    u8arr[n] = bstr.charCodeAt(n)
+  }
+  // return new Blob([u8arr], { type: type || '' })
+  return new Blob([u8arr], { type: type || 'image/jpeg' })
+}

+ 67 - 51
src/views/menu/monitoringCall/index.vue

@@ -74,13 +74,17 @@
         <template #header>
           <div class="titleClass">
             <div class="title">
-              {{ item.taskName }} <span :class="monitor[item.status]">{{ item.status | statusFilter }}</span>
+              {{ item.taskName }} <span :class="monitor[item.status]">{{ item.status | statusFilter(this_) }}</span>
             </div>
             <div>
               <van-button type="info" size="small" v-if="item.status == 0" @click="startMonitorHandler(item.id)"
                 >开始调阅</van-button
               >
-              <van-button type="info" size="small" v-else @click="lookInfoHandler(item.id, item.status)"
+              <van-button
+                type="info"
+                size="small"
+                v-else-if="item.status != 0 && item.status != 3"
+                @click="lookInfoHandler(item.id, item.status)"
                 ><van-icon name="arrow"
               /></van-button>
             </div>
@@ -98,27 +102,7 @@
     </div>
 
     <!-- 扫描弹框 -->
-    <van-dialog v-model="showDialog" title="" width="" :showConfirmButton="false">
-      <span class="spanimg">
-        <img class="close" @click="showDialog = false" src="../../../assets/img/icon/u58.png" alt="" />
-      </span>
-      <p class="text">用手机背面贴近NFC标签完成扫描</p>
-      <div class="img_box">
-        <img class="img" src="../../../assets/img/NFCphone.png" />
-      </div>
-      <div class="btns">
-        <div class="nfcPhoto" @click="nfcHandler">
-          <img class="nfcPng" src="../../../assets/img/icon/NFC扫描-01.png" alt="" />
-
-          <div>扫NFC</div>
-        </div>
-        <div class="nfcPhoto" @click="photoHandler">
-          <img class="nfcPng" src="../../../assets/img/icon/camera.png" alt="" />
-
-          <div>拍照</div>
-        </div>
-      </div>
-    </van-dialog>
+    <scandialog ref="scandialog" @change="resultImg"></scandialog>
   </div>
 </template>
 <script>
@@ -127,19 +111,22 @@ import { Col, Row, Cascader, Dialog, DatetimePicker, Icon, Picker } from 'vant'
 import { deptTreeList, selectListApp, registration } from '@/api/toConsult.js'
 import { Toast } from 'vant'
 import { newDateMonth } from '@/utils/date.js'
-
+import scandialog from '@/components/nfcPopup/alone.vue'
+import { base64ToBlob } from '@/utils/base64TurnImg.js'
+import {upload} from "@/api/public";
 export default {
   data() {
     return {
       str: '',
       fieldValue: '全部',
-      monitor: ['monitor', 'monitored', 'monitoring'], //状态样式
+      monitor: ['monitor', 'monitored', 'monitoring', 'waringtoring'], //状态样式
       value1: JSON.parse(sessionStorage.getItem('SET_USER_ORGNAME')) || '', //输入框model
       currentDate: newDateMonth(),
       cascaderValue: JSON.parse(sessionStorage.getItem('SET_USER_ORGID')) || '',
       columns: ['全部'],
       statusList: [], //调阅状态字典数组
       show: false,
+      this_: this,
       showStatus: false,
       showDate: false,
       showDialog: false,
@@ -155,6 +142,7 @@ export default {
   },
   components: {
     NavBar,
+    scandialog,
     Dialog,
     Icon,
     DatetimePicker,
@@ -165,26 +153,16 @@ export default {
   },
 
   filters: {
-    statusFilter: function (value) {
+    statusFilter(value, this_) {
       let str = ''
-      // 0待调阅,1调阅中,2已调阅,3已超期
-      switch (value) {
-        case '0':
-          str = '待调阅'
-
-          break
-        case '1':
-          str = '调阅中'
-          break
-
-        case '2':
-          str = '已调阅'
-          break
-
-        case '3':
-          str = '已超期'
-          break
+      if (this_.statusList.length > 0) {
+        this_.statusList.forEach(item => {
+          if (value == item.dictValue) {
+            str = item.dictLabel
+          }
+        })
       }
+
       return str
     }
   },
@@ -201,7 +179,10 @@ export default {
       this.fieldValue = ''
       this.selectListAppHandler()
     },
-
+    //nfc拍照功能完成
+    change(img) {
+      console.log(img)
+    },
     //初始化
     init() {
       //获取组织机构数据
@@ -249,10 +230,12 @@ export default {
         }
       })
     },
-    //扫描图片
-    photoHandler() {
+    //扫描图片并上传到服务器和后端
+    photoHandler(img) {
+      //上传到服务器
+
       let obj = {
-        picture: 'picture',
+        picture: img,
         taskId: this.taskId
       }
       registration(obj).then(res => {
@@ -263,6 +246,28 @@ export default {
         }
       })
     },
+    //文件上传
+    resultImg(img) {
+      let obj = base64ToBlob(img.base)
+      let formData = new FormData()
+
+      obj.name = '调阅.jpg'
+      formData.append('file', base64ToBlob(img.base))
+
+      upload(formData, 'image')
+        .then(res => {
+          debugger
+          console.log(process.env.NODE_ENV)
+          /*上传成功*/
+          let imgUrl = process.env.NODE_ENV === 'development' ? res.data.url : window.origin + res.data.url
+          this.photoHandler(imgUrl)
+
+          // this.$emit("imgUrl", res.data.url);
+        })
+        .catch(err => {
+          /*上传失败*/
+        })
+    },
     //关闭弹框事件
     closeDialog() {
       this.show = false
@@ -271,7 +276,7 @@ export default {
     // 开始调阅事件
     startMonitorHandler(taskId) {
       this.taskId = taskId
-      this.showDialog = true
+      this.$refs.scandialog.visible = true
     },
 
     //查看调阅详情
@@ -292,9 +297,9 @@ export default {
     //搜索选择状态时触发
     onConfirm(value, index) {
       this.fieldValue = value
-      this.statusList.forEach(item=>{
-        if(value==item.dictLabel){
-          this.str=item.dictValue
+      this.statusList.forEach(item => {
+        if (value == item.dictLabel) {
+          this.str = item.dictValue
         }
       })
       this.showStatus = false
@@ -371,6 +376,17 @@ export default {
   border-radius: 10px;
   background-color: #25da0b;
 }
+.waringtoring {
+  color: white;
+  padding-left: 10px;
+  padding-right: 10px;
+  bottom: 5%;
+  right: 2%;
+  position: absolute;
+  font-size: 20px;
+  border-radius: 10px;
+  background-color: #e46962;
+}
 .title {
   margin: 10px;
   margin-left: 0px;

+ 5 - 14
src/views/menu/training/components/personnelSignature.vue

@@ -65,6 +65,7 @@ import NavBar from '@/components/NavBar'
 import writingPad from '@/components/writingPad/index.vue'
 import { gettrainingInfo,signtrainingInfo } from '@/api/training.js'
 import { upload } from '@/api/public'
+import {base64ToBlob} from '@/utils/base64TurnImg.js'
 import config from '@/config/index';
 export default {
   name: 'SocAppAddTraining',
@@ -101,7 +102,7 @@ export default {
         })
         this.qsUserList = this.qsUserList.join(',')
         this.signUserList=data.taskUserList
-        this.imgList = this.trainingData.imageList.split(',')
+        this.imgList = this.trainingData?.imageList?.split(',')||[]
       }
     })
   },
@@ -119,11 +120,11 @@ export default {
     },
     //上传签名图到服务器
     resultImg(img) {
-      let obj = this.base64ToBlob(img)
+      let obj = base64ToBlob(img)
       let formData = new FormData()
       
       obj.name = '签名.jpg'
-      formData.append('file', this.base64ToBlob(img))
+      formData.append('file', base64ToBlob(img))
       
       upload(formData, 'image')
         .then(res => {
@@ -138,17 +139,7 @@ export default {
           /*上传失败*/
         })
     },
-    //base64转Blob
-    base64ToBlob(base64, type) {
-      const bstr = atob(base64.replace(/^[^,]+,/, ''))
-      let n = bstr.length
-      const u8arr = new Uint8Array(n)
-      while (n--) {
-        u8arr[n] = bstr.charCodeAt(n)
-      }
-      // return new Blob([u8arr], { type: type || '' })
-      return new Blob([u8arr], { type: type || 'image/jpeg' })
-    },
+    
     //提交到后端数据
     submitSign(url){
       signtrainingInfo({

+ 88 - 38
src/views/menu/training/index.vue

@@ -97,15 +97,15 @@
       </van-col>
     </van-row>
     <!-- //卡片内容区域 -->
-    <van-panel :title="item.title"  v-for="item in taskList" :key="item.id" class="card" status="状态">
+    <van-panel :title="item.title" v-for="item in taskList" :key="item.id" class="card" status="状态">
       <template #header>
         <div class="titleClass">
           <div class="title">{{ item.title }}</div>
           <div>
-            <van-button plain type="info" v-if="item.status == 0" size="mini" @click="trainSign(item.id)"
+            <van-button plain type="info" v-if="isSign(item)" size="mini" @click="trainSign(item.id)"
               >培训登记</van-button
             >
-            <van-button plain type="info" v-if="item.status == 1" size="mini" @click="signature(item.id)"
+            <van-button plain type="info" v-if="isSignature(item)" size="mini" @click="signature(item.id)"
               >签名</van-button
             >
           </div>
@@ -113,34 +113,33 @@
       </template>
       <div @click="goInfo(item.id)">
         <div class="mainItem">
-        <div>单位名称</div>
-        <div>{{ item.orgName }}</div>
-      </div>
-      <div class="mainItem">
-        <div>培训状态</div>
-        <div>{{ item.statusText }}</div>
-      </div>
-      <div class="mainItem">
-        <div>培训类型</div>
-        <div>{{ item.typeText }}</div>
-      </div>
-      <div class="mainItem">
-        <div>培训时间</div>
-        <div>{{ item.startDate }}</div>
-      </div>
-      <div class="mainItem">
-        <div>签名情况</div>
-        <div class="condition" @click="signatureCondition(item.id)">{{ item.signNums }}</div>
-      </div>
+          <div>单位名称</div>
+          <div>{{ item.orgName }}</div>
+        </div>
+        <div class="mainItem">
+          <div>培训状态</div>
+          <div>{{ item.statusText }}</div>
+        </div>
+        <div class="mainItem">
+          <div>培训类型</div>
+          <div>{{ item.typeText }}</div>
+        </div>
+        <div class="mainItem">
+          <div>培训时间</div>
+          <div>{{ item.startDate }}</div>
+        </div>
+        <div class="mainItem">
+          <div>签名情况</div>
+          <div class="condition" @click="signatureCondition(item.id)">{{ item.signNums }}</div>
+        </div>
       </div>
-      
     </van-panel>
     <!-- 卡片弹框 -->
     <van-dialog v-model="conditionShow" title="签名情况" show-cancel-button>
       <div class="conditionCls">
-        <div class="title">已签名人员({{participationList.num}}人):</div>
+        <div class="title">已签名人员({{ participationList.num }}人):</div>
         <div class="people">{{ participationList.list }}</div>
-        <div class="title">未签名人员({{absenceList.num}}人):</div>
+        <div class="title">未签名人员({{ absenceList.num }}人):</div>
         <div class="people">{{ absenceList.list }}</div>
       </div>
     </van-dialog>
@@ -152,7 +151,7 @@ import { Col, Row, Cascader, Dialog, DatetimePicker, Icon, Picker } from 'vant'
 import { gettrainingList, getsignUserList } from '@/api/training.js'
 import { deptTreeList } from '@/api/toConsult.js'
 import { Toast } from 'vant'
-import {newDateMonth} from '@/utils/date.js'
+import { newDateMonth } from '@/utils/date.js'
 export default {
   data() {
     return {
@@ -161,15 +160,13 @@ export default {
         num: 0 //人数
       },
       absenceList: {
-        
-          list: [],
-          num: 0
-        
+        list: [],
+        num: 0
       }, // 缺席人员
-      orgName: JSON.parse(sessionStorage.getItem("SET_USER_ORGNAME"))||'', //机构名称
-      cascaderValue: JSON.parse(sessionStorage.getItem("SET_USER_ORGID"))||'', //机构ID
+      orgName: JSON.parse(sessionStorage.getItem('SET_USER_ORGNAME')) || '', //机构名称
+      cascaderValue: JSON.parse(sessionStorage.getItem('SET_USER_ORGID')) || '', //机构ID
       show: false, //机构弹框显示隐藏
-      
+
       options: [], //机构数组
       fieldNames: {
         text: 'name',
@@ -179,13 +176,13 @@ export default {
       taskList: [], //列表数据
       typeValue: ' ', //类型值
       typeName: '全部', //类型名称
-      
+
       typeStatus: false, //类型显示隐藏
       showStatus: false, //状态显示隐藏
       showDate: false, //月份显示隐藏
       fieldValue: '全部', //状态名称
       statusValue: ' ', //状态值
-      columns: ['全部','待记录', '待签名', '已完成'], //状态数组
+      columns: ['全部', '待记录', '待签名', '已完成'], //状态数组
       typeColumns: ['每月安全培训教育', '专项安全培训教育'], //类型数组
       currentDate: newDateMonth(), //月份值
       conditionShow: false, //机构弹框显示隐藏
@@ -228,11 +225,64 @@ export default {
       return str
     }
   },
-  
+
   created() {
     this.init()
   },
   methods: {
+    //判断是否展示签名按钮
+    isSignature(list) {
+      let falg = false
+      let timefalg = false
+      //value1 当前登陆用户ID
+      //任务处于待记录状态,且任务在规定完成时间范围内,登录人所在机构和角色与任务培训角色、培训机构一致才显示
+      if (list.trainingStartDateTime && list.trainingEndDateTime && list.status == 1) {
+        let date = new Date().getTime()
+        let startDate = Date.parse(new Date(list.trainingStartDateTime))
+        let endDate = Date.parse(new Date(list.trainingEndDateTime))
+        if (date >= startDate && date <= endDate) {
+          timefalg = true
+        }
+      }
+      list.userList?.forEach(item => {
+        if (this.value1 == item.userId && item.sign === 0) {
+          falg = true
+        }
+      })
+
+      if (falg && timefalg) {
+        return true
+      }
+    },
+    //判断是否展示登记按钮
+    isSign(list) {
+      let falg = false
+      let timefalg = false
+      //value1 当前登陆用户ID
+      //当前时间再时间范围内且签名是待签名状态且签名列表存在当前登录人未签名的情况才可以进行签名
+      if (list.trainingStartDateTime && list.trainingEndDateTime && list.status == 1) {
+        let date = new Date().getTime()
+        let startDate = Date.parse(new Date(list.trainingStartDateTime))
+        let endDate = Date.parse(new Date(list.trainingEndDateTime))
+        if (date >= startDate && date <= endDate) {
+          timefalg = true
+        }
+      }
+      //cascaderValue  当前机构ID
+      //当前用户角色ID
+      let roleL = JSON.parse(sessionStorage.getItem('SET_USER_ROLELIST'))
+      roleL.forEach(i => {
+        list.taskRoleList?.forEach(item => {
+          if (this.cascaderValue == list.orgId && i.roleId == item.roleId) {
+            falg = true
+          }
+        })
+      })
+
+      if (falg && timefalg) {
+        return true
+      }
+    },
     //清空查询条件
     clearSearch() {
       this.fieldValue = ''
@@ -395,11 +445,11 @@ export default {
     },
     //签名
     signature(id) {
-      this.$router.push('/personnelSignature/' + id+'_edit')
+      this.$router.push('/personnelSignature/' + id + '_edit')
     },
     //跳转详情
     goInfo(id) {
-      this.$router.push('/personnelSignature/' + id+'_info')
+      this.$router.push('/personnelSignature/' + id + '_info')
     },
     onChange(picker, value, index) {},
     onCancel() {