index.vue 9.3 KB

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