index.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  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(nfcStr){
  97. //alert(data)
  98. let nfcCode;
  99. try{
  100. let nfc = JSON.parse(nfcStr);
  101. nfcCode = nfc.content;
  102. }catch (e) {
  103. nfcCode = nfcStr.content;
  104. }
  105. this.nfcMsg = '读取中...';
  106. if(!nfcCode) {
  107. this.$toast('扫描失败,请重试');
  108. //this.showPopup = false;
  109. this.nfcMsg = '将NFC贴至手机背部';
  110. return
  111. }
  112. this.$toast('扫描成功');
  113. this.nfcInfo = {};
  114. this.formData = {};
  115. nfcDetails(nfcCode).then(res=>{
  116. //console.log(res,'res')
  117. //alert(JSON.stringify(res))
  118. //this.showPopup = false;
  119. setTimeout(()=>{this.nfcMsg = '将NFC贴至手机背部'},500);
  120. if(res.data){
  121. this.nfcInfo = res.data;
  122. this.disable = true;
  123. }else {
  124. this.$toast('未查询到NFC相关信息');
  125. this.formData.code = nfcCode;
  126. this.disable = false;
  127. }
  128. })
  129. },
  130. bindNfc(){
  131. let flag = this.checkData();
  132. if(!flag) return
  133. binding(this.formData).then(res=>{
  134. this.$toast('绑定成功');
  135. this.disable = true;
  136. let code = this.formData.code;
  137. nfcDetails(code).then(info=>{
  138. this.nfcInfo = info.data;
  139. })
  140. })
  141. },
  142. unBindNfc(){
  143. unbinding(this.nfcInfo.code).then(res=>{
  144. this.$toast('解绑成功');
  145. this.disable = false;
  146. let {code,orgId,orgName,areaId,checkId} = JSON.parse(JSON.stringify(this.nfcInfo));
  147. this.formData = {code,orgId,orgName};
  148. this.getAreaList();
  149. this.getCheckList();
  150. this.$nextTick(()=>{
  151. this.formData.areaId = areaId;
  152. this.formData.checkId = checkId;
  153. })
  154. })
  155. },
  156. getAreaList(){
  157. this.formData.areaId = null;
  158. this.areaList = [];
  159. areaList(this.formData.orgId).then(res=>{
  160. this.areaList = res.data;
  161. })
  162. },
  163. getCheckList(){
  164. this.formData.checkId = null;
  165. this.pointList = [];
  166. checkList(this.formData.orgId).then(res=>{
  167. this.pointList = res.data;
  168. })
  169. },
  170. getNfc(){
  171. window.openNFCScanCallBack = this.openNFCScanCallBack;
  172. if(this.nfcMsg === '将NFC贴至手机背部'){
  173. this.nfcMsg = '点击扫描';
  174. window.openNFCScanCallBack = null;
  175. return
  176. }
  177. this.useNFC();
  178. },
  179. changeOrg(selected){
  180. this.showPicker = false;
  181. this.formData.orgName = selected[0].text;
  182. this.formData.orgId = selected[0].id;
  183. console.log(selected,'id')
  184. this.getAreaList();
  185. this.getCheckList();
  186. },
  187. cancelPicker(){
  188. if(this.nfcMsg === '将NFC贴至手机背部') return;
  189. this.showPicker = false;
  190. },
  191. checkData(){
  192. if(!this.formData.code){
  193. this.$toast('先扫描NFC标签');
  194. return false;
  195. }
  196. if(!this.formData.labelName){
  197. this.$toast('请输入标签名称');
  198. return false;
  199. }
  200. if(!this.formData.orgId){
  201. this.$toast('请选择所属机构');
  202. return false;
  203. }
  204. if(!this.formData.areaId){
  205. this.$toast('请选择区域');
  206. return false;
  207. }
  208. if(!this.formData.checkId){
  209. this.$toast('请选择采集点');
  210. return false;
  211. }
  212. return true;
  213. },
  214. clickItem(){
  215. console.log(111)
  216. this.showPicker = true;
  217. },
  218. useNFC(){
  219. let system = this.isAndroidOrIos();
  220. console.log(system,'system')
  221. if(system === 3){
  222. this.$toast('当前环境不支持');
  223. return
  224. }
  225. const parms = {
  226. "iOS_SessionType":"0"
  227. };
  228. this.nfcMsg = '将NFC贴至手机背部';
  229. if(system === 1){
  230. //android
  231. // 判断当前环境是是否存在 js桥 'sap'
  232. const hasSap = window.hasOwnProperty('sap');
  233. console.log(hasSap,'hasSap')
  234. if (hasSap) {
  235. // 判断是否存在方法 ?preview
  236. const fun = sap.hasOwnProperty('openNFCScan');
  237. if (fun) {
  238. sap.openNFCScan(JSON.stringify(parms));
  239. }
  240. }else {
  241. this.$toast('当前环境不支持');
  242. this.nfcMsg = '点击扫描';
  243. }
  244. }
  245. if(system === 2){
  246. //ios
  247. // 判断 ios是否存在方法 preview
  248. if(!window.webkit) {
  249. this.nfcMsg = '点击扫描';
  250. this.$toast('当前环境不支持');
  251. return;
  252. }
  253. const fun = window.webkit.messageHandlers.hasOwnProperty('openNFCScan')
  254. if (fun) {
  255. window.webkit.messageHandlers.openNFCScan.postMessage(JSON.stringify(parms))
  256. }
  257. }
  258. },
  259. }
  260. }
  261. </script>
  262. <style lang="scss" scoped>
  263. .nfc-container{
  264. padding:0 20px 20px 20px;
  265. height: calc(100vh - 192px);
  266. overflow: auto;
  267. }
  268. .card-title{
  269. height: 60px;
  270. line-height: 40px;
  271. font-size: 32px;
  272. border-bottom: 1px solid #f5f5f5;
  273. }
  274. .nfc-box{
  275. display: flex;
  276. justify-content: center;
  277. align-items: center;
  278. padding:0 20px;
  279. margin-top:24px;
  280. >div{
  281. width: 360px;
  282. height: 360px;
  283. border-radius: 50%;
  284. display: flex;
  285. justify-content: center;
  286. align-items: center;
  287. >span{
  288. font-size: 32px;
  289. color: #fff;
  290. }
  291. }
  292. }
  293. .blue{
  294. color:#008cd6;
  295. }
  296. .btn-box{
  297. margin-top: 40px;
  298. }
  299. .nfc-btn {
  300. /* 应用动画flowCss 12秒速度 无限循环 线性匀速动画*/
  301. animation: donghua 2.4s infinite;
  302. }
  303. .nfc-btn {
  304. margin: 40px;
  305. width: 32%;
  306. height: 48vh;
  307. background: linear-gradient(-45deg, #dae, #3c9, #09f, #66f);
  308. background-size: 200% 200%;
  309. }
  310. .nfc-btn:active {
  311. animation: none;
  312. background: #09f;
  313. }
  314. @keyframes donghua {
  315. 0% {
  316. transform: scale(1);
  317. box-shadow: 0 0 0 0 rgba(0, 153, 255, 60%);
  318. }
  319. 60% {
  320. transform: scale(1);
  321. box-shadow: 0 0 0 18px rgba(0, 153, 255, 0%);
  322. }
  323. 100% {
  324. transform: scale(1);
  325. box-shadow: 0 0 0 0 rgba(204, 73, 152, 0%);
  326. }
  327. }
  328. </style>