|  | @@ -0,0 +1,347 @@
 | 
	
		
			
				|  |  | +<template>
 | 
	
		
			
				|  |  | +  <div class="Nfc">
 | 
	
		
			
				|  |  | +    <nav-bar></nav-bar>
 | 
	
		
			
				|  |  | +    <div class="nfc-container">
 | 
	
		
			
				|  |  | +      <div class="nfc-box">
 | 
	
		
			
				|  |  | +        <div class="nfc-btn" @touchend="getNfc">
 | 
	
		
			
				|  |  | +          <span>{{nfcMsg}}</span>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +      <Card>
 | 
	
		
			
				|  |  | +        <p class="card-title blue">{{disable?'标签信息':'新增标签'}}</p>
 | 
	
		
			
				|  |  | +        <van-cell-group v-if="!disable" :border="false">
 | 
	
		
			
				|  |  | +          <van-cell title="NFC编码" :value="formData.code" />
 | 
	
		
			
				|  |  | +          <van-field required label="标签名称" v-model="formData.labelName" placeholder="请输入" />
 | 
	
		
			
				|  |  | +          <van-cell required title="选择所属机构" :label="formData.orgName" is-link  @click="clickItem"/>
 | 
	
		
			
				|  |  | +          <gx-select-cell required :disabled="areaList.length == 0" v-model="formData.areaId" title="选择区域" :border="true" :prop="props" :dataList="areaList"></gx-select-cell>
 | 
	
		
			
				|  |  | +          <gx-select-cell required :disabled="pointList.length == 0" v-model="formData.checkId" title="选择采集点" :prop="checkProps" :dataList="pointList"></gx-select-cell>
 | 
	
		
			
				|  |  | +        </van-cell-group>
 | 
	
		
			
				|  |  | +        <van-cell-group v-else :border="false">
 | 
	
		
			
				|  |  | +          <van-cell title="NFC编码" :value="nfcInfo.code" />
 | 
	
		
			
				|  |  | +          <van-cell title="标签名称" :value="nfcInfo.labelName" />
 | 
	
		
			
				|  |  | +          <van-cell title="所属机构" :value="nfcInfo.orgName" />
 | 
	
		
			
				|  |  | +          <van-cell title="区域名称" :value="nfcInfo.areaName" />
 | 
	
		
			
				|  |  | +          <van-cell title="采集点名称" :value="nfcInfo.collectionAreaName" />
 | 
	
		
			
				|  |  | +        </van-cell-group>
 | 
	
		
			
				|  |  | +      </Card>
 | 
	
		
			
				|  |  | +<!--      <div class="btn-box">
 | 
	
		
			
				|  |  | +        <van-button v-if="!disable" type="info" size="large" style="margin-bottom:20px;" @click="bindNfc">绑定</van-button>
 | 
	
		
			
				|  |  | +        <van-button v-if="disable && nfcInfo.code" type="danger" size="large" @click="unBindNfc">解绑</van-button>
 | 
	
		
			
				|  |  | +      </div>-->
 | 
	
		
			
				|  |  | +    </div>
 | 
	
		
			
				|  |  | +<!--    <van-popup v-model="showPopup" :close-on-click-overlay="false"></van-popup>-->
 | 
	
		
			
				|  |  | +    <org-picker
 | 
	
		
			
				|  |  | +      ref="orgPicker"
 | 
	
		
			
				|  |  | +      @cancel="cancelPicker"
 | 
	
		
			
				|  |  | +      @confirm="changeOrg">
 | 
	
		
			
				|  |  | +    </org-picker>
 | 
	
		
			
				|  |  | +  </div>
 | 
	
		
			
				|  |  | +</template>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<script>
 | 
	
		
			
				|  |  | +import NavBar from '@/components/NavBar';
 | 
	
		
			
				|  |  | +import Card from '@/components/card';
 | 
	
		
			
				|  |  | +import OrgPicker from '@/components/OrgPicker';
 | 
	
		
			
				|  |  | +import SelectCell from '@/components/selectCell';
 | 
	
		
			
				|  |  | +import GxSelectCell from '@/components/GxSearchSelectCell';
 | 
	
		
			
				|  |  | +import {mapGetters} from "vuex";
 | 
	
		
			
				|  |  | +import {binding,unbinding,nfcDetails,areaList,checkList} from './api';
 | 
	
		
			
				|  |  | +export default {
 | 
	
		
			
				|  |  | +  components:{
 | 
	
		
			
				|  |  | +    NavBar,
 | 
	
		
			
				|  |  | +    Card,
 | 
	
		
			
				|  |  | +    OrgPicker,
 | 
	
		
			
				|  |  | +    SelectCell,
 | 
	
		
			
				|  |  | +    GxSelectCell,
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  data(){
 | 
	
		
			
				|  |  | +    return{
 | 
	
		
			
				|  |  | +      disable:true,
 | 
	
		
			
				|  |  | +      showPicker:false,
 | 
	
		
			
				|  |  | +      showPopup:false,
 | 
	
		
			
				|  |  | +      nfcMsg:'点击扫描',
 | 
	
		
			
				|  |  | +      props:{
 | 
	
		
			
				|  |  | +        label:'name',
 | 
	
		
			
				|  |  | +        value:'id',
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      checkProps:{
 | 
	
		
			
				|  |  | +        label:'checkName',
 | 
	
		
			
				|  |  | +        value:'id',
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      areaList:[],
 | 
	
		
			
				|  |  | +      pointList:[],
 | 
	
		
			
				|  |  | +      nfcInfo:{
 | 
	
		
			
				|  |  | +        code:null,
 | 
	
		
			
				|  |  | +        labelName:'无',
 | 
	
		
			
				|  |  | +        orgName: '无',
 | 
	
		
			
				|  |  | +        areaName:'无',
 | 
	
		
			
				|  |  | +        collectionAreaName:'无',
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      formData:{
 | 
	
		
			
				|  |  | +        labelName:'',
 | 
	
		
			
				|  |  | +        orgName:'',
 | 
	
		
			
				|  |  | +        code:null,
 | 
	
		
			
				|  |  | +        orgId: null,
 | 
	
		
			
				|  |  | +        areaId:null,
 | 
	
		
			
				|  |  | +        checkId:null,
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      flag:false,
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  beforeDestroy(){
 | 
	
		
			
				|  |  | +    window.openNFCScanCallBack = null;
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  computed:{
 | 
	
		
			
				|  |  | +    ...mapGetters(['orgId']),
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  mounted(){
 | 
	
		
			
				|  |  | +    window.openNFCScanCallBack = null;
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  methods:{
 | 
	
		
			
				|  |  | +    //自定义nfc回调
 | 
	
		
			
				|  |  | +    openNFCScanCallBack(nfcStr){
 | 
	
		
			
				|  |  | +      //nfcStr = '{"content":"123456789"}';
 | 
	
		
			
				|  |  | +      let nfcCode;
 | 
	
		
			
				|  |  | +      try{
 | 
	
		
			
				|  |  | +        let nfc = JSON.parse(nfcStr);
 | 
	
		
			
				|  |  | +        nfcCode =  nfc.content;
 | 
	
		
			
				|  |  | +      }catch (e) {
 | 
	
		
			
				|  |  | +        nfcCode = nfcStr.content;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      //alert(nfcCode)
 | 
	
		
			
				|  |  | +      this.nfcMsg = '读取中...';
 | 
	
		
			
				|  |  | +      if(!nfcCode) {
 | 
	
		
			
				|  |  | +        this.$toast('扫描失败,请重试');
 | 
	
		
			
				|  |  | +        //this.showPopup = false;
 | 
	
		
			
				|  |  | +        this.nfcMsg = '将NFC贴至手机背部';
 | 
	
		
			
				|  |  | +        return
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      this.$toast('扫描成功');
 | 
	
		
			
				|  |  | +      this.nfcInfo = {};
 | 
	
		
			
				|  |  | +      this.formData = {
 | 
	
		
			
				|  |  | +        labelName:'',
 | 
	
		
			
				|  |  | +        orgName:'',
 | 
	
		
			
				|  |  | +        code:null,
 | 
	
		
			
				|  |  | +        orgId: null,
 | 
	
		
			
				|  |  | +        areaId:null,
 | 
	
		
			
				|  |  | +        checkId:null,
 | 
	
		
			
				|  |  | +      };
 | 
	
		
			
				|  |  | +      this.areaList = [];
 | 
	
		
			
				|  |  | +      this.pointList = [];
 | 
	
		
			
				|  |  | +      nfcDetails(nfcCode).then(res=>{
 | 
	
		
			
				|  |  | +        setTimeout(()=>{this.nfcMsg = '将NFC贴至手机背部'},500);
 | 
	
		
			
				|  |  | +        if(res.data){
 | 
	
		
			
				|  |  | +          this.nfcInfo = res.data;
 | 
	
		
			
				|  |  | +          this.disable = true;
 | 
	
		
			
				|  |  | +        }else {
 | 
	
		
			
				|  |  | +          this.$toast('未查询到NFC相关信息');
 | 
	
		
			
				|  |  | +          this.formData.code = nfcCode;
 | 
	
		
			
				|  |  | +          this.disable = false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    bindNfc(){
 | 
	
		
			
				|  |  | +      let flag = this.checkData();
 | 
	
		
			
				|  |  | +      if(!flag) return
 | 
	
		
			
				|  |  | +      binding(this.formData).then(res=>{
 | 
	
		
			
				|  |  | +        this.$toast('绑定成功');
 | 
	
		
			
				|  |  | +        this.disable = true;
 | 
	
		
			
				|  |  | +        let code = this.formData.code;
 | 
	
		
			
				|  |  | +        nfcDetails(code).then(info=>{
 | 
	
		
			
				|  |  | +          this.nfcInfo =  info.data;
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    unBindNfc(){
 | 
	
		
			
				|  |  | +      unbinding(this.nfcInfo.code).then(res=>{
 | 
	
		
			
				|  |  | +        this.$toast('解绑成功');
 | 
	
		
			
				|  |  | +        this.disable = false;
 | 
	
		
			
				|  |  | +        let {code,orgId,orgName,areaId,checkId} = JSON.parse(JSON.stringify(this.nfcInfo));
 | 
	
		
			
				|  |  | +        this.formData = {code,orgId,orgName};
 | 
	
		
			
				|  |  | +        this.getAreaList();
 | 
	
		
			
				|  |  | +        this.getCheckList();
 | 
	
		
			
				|  |  | +        this.$nextTick(()=>{
 | 
	
		
			
				|  |  | +          this.formData.areaId = areaId;
 | 
	
		
			
				|  |  | +          this.formData.checkId = checkId;
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    getAreaList(){
 | 
	
		
			
				|  |  | +      this.formData.areaId = null;
 | 
	
		
			
				|  |  | +      this.areaList = [];
 | 
	
		
			
				|  |  | +      areaList(this.formData.orgId).then(res=>{
 | 
	
		
			
				|  |  | +        this.areaList = res.data;
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    getCheckList(){
 | 
	
		
			
				|  |  | +      this.formData.checkId = null;
 | 
	
		
			
				|  |  | +      this.pointList = [];
 | 
	
		
			
				|  |  | +      checkList(this.formData.orgId).then(res=>{
 | 
	
		
			
				|  |  | +        this.pointList = res.data;
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    getNfc(){
 | 
	
		
			
				|  |  | +      window.openNFCScanCallBack = this.openNFCScanCallBack;
 | 
	
		
			
				|  |  | +      if(this.nfcMsg === '将NFC贴至手机背部'){
 | 
	
		
			
				|  |  | +        this.nfcMsg = '点击扫描';
 | 
	
		
			
				|  |  | +        window.openNFCScanCallBack = null;
 | 
	
		
			
				|  |  | +        return
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      this.useNFC();
 | 
	
		
			
				|  |  | +    // this.openNFCScanCallBack({"content":"123456789"});
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    changeOrg(selected){
 | 
	
		
			
				|  |  | +      this.showPicker = false;
 | 
	
		
			
				|  |  | +      this.formData.orgName = selected[0].text;
 | 
	
		
			
				|  |  | +      this.formData.orgId = selected[0].id;
 | 
	
		
			
				|  |  | +      console.log(selected,'id')
 | 
	
		
			
				|  |  | +      this.getAreaList();
 | 
	
		
			
				|  |  | +      this.getCheckList();
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    cancelPicker(){
 | 
	
		
			
				|  |  | +      if(this.nfcMsg === '将NFC贴至手机背部') return;
 | 
	
		
			
				|  |  | +      this.showPicker = false;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    checkData(){
 | 
	
		
			
				|  |  | +      if(!this.formData.code){
 | 
	
		
			
				|  |  | +        this.$toast('先扫描NFC标签');
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      if(!this.formData.labelName){
 | 
	
		
			
				|  |  | +        this.$toast('请输入标签名称');
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      if(!this.formData.orgId){
 | 
	
		
			
				|  |  | +        this.$toast('请选择所属机构');
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      if(!this.formData.areaId){
 | 
	
		
			
				|  |  | +        this.$toast('请选择区域');
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      if(!this.formData.checkId){
 | 
	
		
			
				|  |  | +        this.$toast('请选择采集点');
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      return true;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    clickItem(){
 | 
	
		
			
				|  |  | +      this.$refs.orgPicker.showPicker = true;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    useNFC(){
 | 
	
		
			
				|  |  | +      let system = this.isAndroidOrIos();
 | 
	
		
			
				|  |  | +      if(system === 3){
 | 
	
		
			
				|  |  | +        this.$toast('当前环境不支持');
 | 
	
		
			
				|  |  | +        return
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      const parms = {
 | 
	
		
			
				|  |  | +        "iOS_SessionType":"0"
 | 
	
		
			
				|  |  | +      };
 | 
	
		
			
				|  |  | +      this.nfcMsg = '将NFC贴至手机背部';
 | 
	
		
			
				|  |  | +      if(system === 1){
 | 
	
		
			
				|  |  | +        //android
 | 
	
		
			
				|  |  | +        // 判断当前环境是是否存在 js桥 'sap'
 | 
	
		
			
				|  |  | +        const hasSap = window.hasOwnProperty('sap');
 | 
	
		
			
				|  |  | +        console.log(hasSap,'hasSap')
 | 
	
		
			
				|  |  | +        if (hasSap) {
 | 
	
		
			
				|  |  | +          // 判断是否存在方法 ?preview
 | 
	
		
			
				|  |  | +          const fun = sap.hasOwnProperty('openNFCScan');
 | 
	
		
			
				|  |  | +          if (fun) {
 | 
	
		
			
				|  |  | +            sap.openNFCScan(JSON.stringify(parms));
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }else {
 | 
	
		
			
				|  |  | +          this.$toast('当前环境不支持');
 | 
	
		
			
				|  |  | +          this.nfcMsg = '点击扫描';
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      if(system === 2){
 | 
	
		
			
				|  |  | +        //ios
 | 
	
		
			
				|  |  | +        // 判断 ios是否存在方法 preview
 | 
	
		
			
				|  |  | +        if(!window.webkit) {
 | 
	
		
			
				|  |  | +          this.nfcMsg = '点击扫描';
 | 
	
		
			
				|  |  | +          this.$toast('当前环境不支持');
 | 
	
		
			
				|  |  | +          return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        const fun = window.webkit.messageHandlers.hasOwnProperty('openNFCScan')
 | 
	
		
			
				|  |  | +        if (fun) {
 | 
	
		
			
				|  |  | +          window.webkit.messageHandlers.openNFCScan.postMessage(JSON.stringify(parms))
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +</script>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<style lang="scss" scoped>
 | 
	
		
			
				|  |  | +  .nfc-container{
 | 
	
		
			
				|  |  | +    padding:0 20px 20px 20px;
 | 
	
		
			
				|  |  | +    height: calc(100vh - 192px);
 | 
	
		
			
				|  |  | +    overflow: auto;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  .card-title{
 | 
	
		
			
				|  |  | +    height: 60px;
 | 
	
		
			
				|  |  | +    line-height: 40px;
 | 
	
		
			
				|  |  | +    font-size: 32px;
 | 
	
		
			
				|  |  | +    border-bottom: 1px solid #f5f5f5;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  .nfc-box{
 | 
	
		
			
				|  |  | +    display: flex;
 | 
	
		
			
				|  |  | +    justify-content: center;
 | 
	
		
			
				|  |  | +    align-items: center;
 | 
	
		
			
				|  |  | +    padding:0 20px;
 | 
	
		
			
				|  |  | +    margin-top:24px;
 | 
	
		
			
				|  |  | +    >div{
 | 
	
		
			
				|  |  | +      width: 360px;
 | 
	
		
			
				|  |  | +      height: 360px;
 | 
	
		
			
				|  |  | +      border-radius: 50%;
 | 
	
		
			
				|  |  | +      display: flex;
 | 
	
		
			
				|  |  | +      justify-content: center;
 | 
	
		
			
				|  |  | +      align-items: center;
 | 
	
		
			
				|  |  | +      >span{
 | 
	
		
			
				|  |  | +        font-size: 32px;
 | 
	
		
			
				|  |  | +        color: #fff;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  .blue{
 | 
	
		
			
				|  |  | +    color:#008cd6;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  .btn-box{
 | 
	
		
			
				|  |  | +    margin-top: 40px;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  .nfc-btn {
 | 
	
		
			
				|  |  | +    /* 应用动画flowCss 12秒速度 无限循环 线性匀速动画*/
 | 
	
		
			
				|  |  | +    animation: donghua 2.4s infinite;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  .nfc-btn {
 | 
	
		
			
				|  |  | +    margin: 40px;
 | 
	
		
			
				|  |  | +    width: 32%;
 | 
	
		
			
				|  |  | +    height: 48vh;
 | 
	
		
			
				|  |  | +    background: linear-gradient(-45deg, #dae, #3c9, #09f, #66f);
 | 
	
		
			
				|  |  | +    background-size: 200% 200%;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  .nfc-btn:active {
 | 
	
		
			
				|  |  | +    animation: none;
 | 
	
		
			
				|  |  | +    background: #09f;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  @keyframes donghua {
 | 
	
		
			
				|  |  | +    0% {
 | 
	
		
			
				|  |  | +      transform: scale(1);
 | 
	
		
			
				|  |  | +      box-shadow: 0 0 0 0 rgba(0, 153, 255, 60%);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    60% {
 | 
	
		
			
				|  |  | +      transform: scale(1);
 | 
	
		
			
				|  |  | +      box-shadow: 0 0 0 18px rgba(0, 153, 255, 0%);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    100% {
 | 
	
		
			
				|  |  | +      transform: scale(1);
 | 
	
		
			
				|  |  | +      box-shadow: 0 0 0 0 rgba(204, 73, 152, 0%);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +</style>
 |