index.vue 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. <template>
  2. <div class="Nfc">
  3. <nav-bar></nav-bar>
  4. <div class="nfc-container">
  5. <div class="nfc-box">
  6. <div class="nfc-btn" @touchend="getNfc">
  7. <span>{{nfcMsg}}</span>
  8. </div>
  9. </div>
  10. <Card>
  11. <p class="card-title blue">{{disable?'标签信息':'新增标签'}}</p>
  12. <van-cell-group v-if="!disable" :border="false">
  13. <van-cell title="NFC编码" :value="formData.code" />
  14. <van-field required label="标签名称" v-model="formData.labelName" placeholder="请输入" />
  15. <van-cell required title="选择所属机构" :label="formData.orgName" is-link @click="clickItem"/>
  16. <select-cell required :disabled="areaList.length == 0" v-model="formData.areaId" title="选择区域" :border="true" :prop="props" :dataList="areaList"></select-cell>
  17. <select-cell required :disabled="pointList.length == 0" v-model="formData.checkId" title="选择采集点" :prop="checkProps" :dataList="pointList"></select-cell>
  18. </van-cell-group>
  19. <van-cell-group v-else :border="false">
  20. <van-cell title="NFC编码" :value="nfcInfo.code" />
  21. <van-cell title="标签名称" :value="nfcInfo.labelName" />
  22. <van-cell title="所属机构" :value="nfcInfo.orgName" />
  23. <van-cell title="区域名称" :value="nfcInfo.areaName" />
  24. <van-cell title="采集点名称" :value="nfcInfo.collectionAreaName" />
  25. </van-cell-group>
  26. </Card>
  27. <div class="btn-box">
  28. <van-button v-if="!disable" type="info" size="large" style="margin-bottom:20px;" @click="bindNfc">绑定</van-button>
  29. <van-button v-if="disable && nfcInfo.code" type="danger" size="large" @click="unBindNfc">解绑</van-button>
  30. </div>
  31. </div>
  32. <!-- <van-popup v-model="showPopup" :close-on-click-overlay="false"></van-popup>-->
  33. <org-picker
  34. :show="showPicker"
  35. @cancel="cancelPicker"
  36. @confirm="changeOrg">
  37. </org-picker>
  38. </div>
  39. </template>
  40. <script>
  41. import NavBar from '@/components/NavBar';
  42. import Card from '@/components/card';
  43. import OrgPicker from '@/components/OrgPicker';
  44. import SelectCell from '@/components/selectCell';
  45. import {mapGetters} from "vuex";
  46. import {binding,unbinding,nfcDetails,areaList,checkList} from './api';
  47. export default {
  48. components:{
  49. NavBar,
  50. Card,
  51. OrgPicker,
  52. SelectCell,
  53. },
  54. data(){
  55. return{
  56. disable:true,
  57. showPicker:false,
  58. showPopup:false,
  59. nfcMsg:'点击扫描',
  60. props:{
  61. label:'name',
  62. value:'id',
  63. },
  64. checkProps:{
  65. label:'checkName',
  66. value:'id',
  67. },
  68. areaList:[],
  69. pointList:[],
  70. nfcInfo:{
  71. code:null,
  72. labelName:'无',
  73. orgName: '无',
  74. areaName:'无',
  75. collectionAreaName:'无',
  76. },
  77. formData:{
  78. labelName:'',
  79. orgName:'',
  80. code:null,
  81. orgId: null,
  82. areaId:null,
  83. checkId:null,
  84. },
  85. flag:false,
  86. }
  87. },
  88. destroyed(){
  89. window.openNFCScanCallBack = null;
  90. },
  91. computed:{
  92. ...mapGetters(['orgId']),
  93. },
  94. methods:{
  95. //自定义nfc回调
  96. openNFCScanCallBack(data){
  97. //alert(data)
  98. this.nfcMsg = '读取中...';
  99. if(!data) {
  100. this.$toast('扫描失败');
  101. //this.showPopup = false;
  102. return
  103. }
  104. let code = JSON.parse(data).content;
  105. this.$toast('扫描成功');
  106. this.nfcInfo = {};
  107. this.formData = {};
  108. nfcDetails(code).then(res=>{
  109. //console.log(res,'res')
  110. //alert(JSON.stringify(res))
  111. //this.showPopup = false;
  112. setTimeout(()=>{this.nfcMsg = '将NFC贴至手机背部'},500);
  113. if(res.data){
  114. this.nfcInfo = res.data;
  115. this.disable = true;
  116. }else {
  117. this.$toast('未查询到NFC相关信息');
  118. this.formData.code = code;
  119. this.disable = false;
  120. }
  121. })
  122. },
  123. bindNfc(){
  124. let flag = this.checkData();
  125. if(!flag) return
  126. binding(this.formData).then(res=>{
  127. this.$toast('绑定成功');
  128. this.disable = true;
  129. let code = this.formData.code;
  130. nfcDetails(code).then(info=>{
  131. this.nfcInfo = info.data;
  132. })
  133. })
  134. },
  135. unBindNfc(){
  136. unbinding(this.nfcInfo.code).then(res=>{
  137. this.$toast('解绑成功');
  138. this.disable = false;
  139. let {code,orgId,orgName,areaId,checkId} = JSON.parse(JSON.stringify(this.nfcInfo));
  140. this.formData = {code,orgId,orgName};
  141. this.getAreaList();
  142. this.getCheckList();
  143. this.$nextTick(()=>{
  144. this.formData.areaId = areaId;
  145. this.formData.checkId = checkId;
  146. })
  147. })
  148. },
  149. getAreaList(){
  150. this.formData.areaId = null;
  151. this.areaList = [];
  152. areaList(this.formData.orgId).then(res=>{
  153. this.areaList = res.data;
  154. })
  155. },
  156. getCheckList(){
  157. this.formData.checkId = null;
  158. this.pointList = [];
  159. checkList(this.formData.orgId).then(res=>{
  160. this.pointList = res.data;
  161. })
  162. },
  163. getNfc(){
  164. window.openNFCScanCallBack = this.openNFCScanCallBack;
  165. if(this.nfcMsg === '将NFC贴至手机背部'){
  166. this.nfcMsg = '点击扫描';
  167. window.openNFCScanCallBack = null;
  168. return
  169. }
  170. this.useNFC();
  171. },
  172. changeOrg(selected){
  173. this.showPicker = false;
  174. this.formData.orgName = selected[0].text;
  175. this.formData.orgId = selected[0].id;
  176. console.log(selected,'id')
  177. this.getAreaList();
  178. this.getCheckList();
  179. },
  180. cancelPicker(){
  181. if(this.nfcMsg === '将NFC贴至手机背部') return;
  182. this.showPicker = false;
  183. },
  184. checkData(){
  185. if(!this.formData.code){
  186. this.$toast('先扫描NFC标签');
  187. return false;
  188. }
  189. if(!this.formData.labelName){
  190. this.$toast('请输入标签名称');
  191. return false;
  192. }
  193. if(!this.formData.orgId){
  194. this.$toast('请选择所属机构');
  195. return false;
  196. }
  197. if(!this.formData.areaId){
  198. this.$toast('请选择区域');
  199. return false;
  200. }
  201. if(!this.formData.checkId){
  202. this.$toast('请选择采集点');
  203. return false;
  204. }
  205. return true;
  206. },
  207. clickItem(){
  208. console.log(111)
  209. this.showPicker = true;
  210. },
  211. useNFC(){
  212. let system = this.isAndroidOrIos();
  213. console.log(system,'system')
  214. if(system === 3){
  215. this.$toast('当前环境不支持');
  216. return
  217. }
  218. const parms = {
  219. "iOS_SessionType":"0"
  220. };
  221. this.nfcMsg = '将NFC贴至手机背部';
  222. if(system === 1){
  223. //android
  224. // 判断当前环境是是否存在 js桥 'sap'
  225. const hasSap = window.hasOwnProperty('sap');
  226. console.log(hasSap,'hasSap')
  227. if (hasSap) {
  228. // 判断是否存在方法 ?preview
  229. const fun = sap.hasOwnProperty('openNFCScan');
  230. if (fun) {
  231. sap.openNFCScan(JSON.stringify(parms));
  232. }
  233. }else {
  234. this.$toast('当前环境不支持');
  235. this.nfcMsg = '点击扫描';
  236. }
  237. }
  238. if(system === 2){
  239. //ios
  240. // 判断 ios是否存在方法 preview
  241. if(!window.webkit) {
  242. this.nfcMsg = '点击扫描';
  243. this.$toast('当前环境不支持');
  244. return;
  245. }
  246. const fun = window.webkit.messageHandlers.hasOwnProperty('openNFCScan')
  247. if (fun) {
  248. window.webkit.messageHandlers.openNFCScan.postMessage(JSON.stringify(parms))
  249. }
  250. }
  251. },
  252. }
  253. }
  254. </script>
  255. <style lang="scss" scoped>
  256. .nfc-container{
  257. padding:0 20px 20px 20px;
  258. height: calc(100vh - 192px);
  259. overflow: auto;
  260. }
  261. .card-title{
  262. height: 60px;
  263. line-height: 40px;
  264. font-size: 32px;
  265. border-bottom: 1px solid #f5f5f5;
  266. }
  267. .nfc-box{
  268. display: flex;
  269. justify-content: center;
  270. align-items: center;
  271. padding:0 20px;
  272. margin-top:24px;
  273. >div{
  274. width: 360px;
  275. height: 360px;
  276. border-radius: 50%;
  277. display: flex;
  278. justify-content: center;
  279. align-items: center;
  280. >span{
  281. font-size: 32px;
  282. color: #fff;
  283. }
  284. }
  285. }
  286. .blue{
  287. color:#008cd6;
  288. }
  289. .btn-box{
  290. margin-top: 40px;
  291. }
  292. .nfc-btn {
  293. /* 应用动画flowCss 12秒速度 无限循环 线性匀速动画*/
  294. animation: donghua 2.4s infinite;
  295. }
  296. .nfc-btn {
  297. margin: 40px;
  298. width: 32%;
  299. height: 48vh;
  300. background: linear-gradient(-45deg, #dae, #3c9, #09f, #66f);
  301. background-size: 200% 200%;
  302. }
  303. .nfc-btn:active {
  304. animation: none;
  305. background: #09f;
  306. }
  307. @keyframes donghua {
  308. 0% {
  309. transform: scale(1);
  310. box-shadow: 0 0 0 0 rgba(0, 153, 255, 60%);
  311. }
  312. 60% {
  313. transform: scale(1);
  314. box-shadow: 0 0 0 18px rgba(0, 153, 255, 0%);
  315. }
  316. 100% {
  317. transform: scale(1);
  318. box-shadow: 0 0 0 0 rgba(204, 73, 152, 0%);
  319. }
  320. }
  321. </style>