index.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. import { connect } from 'herculex';
  2. import { getCommunityInfo, getVisitReason, visitRegistration } from '../utils';
  3. import { storageAPI } from "../../../../core/utils/jsapi";
  4. import { prefixPagePath, dynamicPageName } from "../../../../core/utils";
  5. import dayjs from 'dayjs';
  6. const app = getApp();
  7. Component(connect({
  8. mapStateToProps: {
  9. userInfo: state => state.$global.userInfo,
  10. passport: state => state.$global.passport,
  11. alipayUid: state => state.$global.getIn(['userInfo', 'alipayUid'], ''),
  12. accessMode: state => state.accessMode,
  13. reasons: state => state.reasons || [],
  14. reasonsError: state => state.reasonsError || false,
  15. errorType: state => state.errorType
  16. }
  17. })({
  18. props: {
  19. componentData: {}
  20. },
  21. data: {
  22. imgSrcPrefix: app.globalData.imgSrcPrefix,
  23. reportExpiresTime: 60,
  24. footer: [{
  25. text: '重新获取'
  26. }],
  27. subject: '请选择来访原因',
  28. showSecondReason: false,
  29. currentIndex: -1,
  30. buttonDisable: true,
  31. activatedStep: 1,
  32. //
  33. form: {
  34. communityCode: '',
  35. reason: '',
  36. description: '',
  37. reasonText: '',
  38. reasonLogo: '',
  39. extendFileds: '',
  40. longitude: '',
  41. latitude: '',
  42. buildingName: '',
  43. unitName: '',
  44. houseName: '',
  45. roomInfo: ''
  46. }
  47. },
  48. didUpdate(prevProps, prevData) {
  49. const {
  50. reasons,
  51. currentIndex,
  52. passport,
  53. form
  54. } = this.data;
  55. if (prevData.passport && prevData.passport.roomInfo !== passport.roomInfo && currentIndex > -1 && reasons[currentIndex].showFloor && passport.roomInfo) {
  56. this.setData({
  57. buttonDisable: reasons[currentIndex].childContent.required && !form.description,
  58. 'form.roomInfo': passport.roomInfo,
  59. 'form.buildingName': passport.buildingName,
  60. 'form.unitName': passport.unitName,
  61. 'form.houseName': passport.houseName
  62. });
  63. }
  64. },
  65. async didMount() {
  66. // 获取当前页面的参数信息
  67. const query = getCurrentPages().pop().options || {};
  68. const {
  69. communityCode,
  70. communityName,
  71. sceneCode
  72. } = query; // 获取拜访列表
  73. const res = await getVisitReason(sceneCode);
  74. const {
  75. reasons
  76. } = res;
  77. this.commit({
  78. reasons,
  79. reasonsError: !reasons
  80. });
  81. const [, {
  82. data = {}
  83. }] = await storageAPI.getStorage({
  84. key: 'passport'
  85. });
  86. let passport = {}; // 本地没有匹配passport的情况下,根据页面信息更新passport
  87. if (communityCode && !communityName) {
  88. // 请求communityName相关信息
  89. const res3 = await getCommunityInfo(communityCode);
  90. if (res3) {
  91. passport = { ...passport,
  92. ...res3,
  93. sceneCode
  94. };
  95. }
  96. } else {
  97. passport = {
  98. communityCode,
  99. communityName,
  100. sceneCode
  101. };
  102. }
  103. if (!communityCode && !this.data.passport.communityCode) {
  104. this.commit({
  105. errorType: 'NOCOMMUNITY',
  106. errorMsg: '小区不存在',
  107. errorBrief: '请扫描正确的二维码'
  108. });
  109. return;
  110. }
  111. if (!communityCode) return;
  112. if (data && !this.data.errorType) {
  113. passport = { ...data,
  114. ...passport
  115. }; // 检查本地passport是否过期, 没过期跳转到第三页面
  116. const reportExpiresTime = parseInt(this.props.componentData.componentExtInfo.reportExpiresTime || this.data.reportExpiresTime);
  117. if (passport.reason && passport.visitTime) {
  118. const nowTime = dayjs();
  119. const isReportExpires = nowTime.diff(dayjs(passport.visitTime), 'second') > reportExpiresTime;
  120. if (!isReportExpires || data.communityCode === communityCode) {
  121. this.commit('$global:updateState', {
  122. passport
  123. });
  124. return my.navigateTo({
  125. url: `${prefixPagePath}/${dynamicPageName}/index?pageCode=visitRegistrationPage`
  126. });
  127. } else {
  128. // 直接发起请求
  129. const formData = { ...passport,
  130. visitTime: dayjs().format()
  131. };
  132. const [err, res2 = {}] = await visitRegistration(formData);
  133. if (err || res2.result !== 'success') {
  134. const {
  135. communityCode: communityCode2,
  136. communityName: communityName2,
  137. sceneCode: sceneCode2
  138. } = passport;
  139. const jumpUrl = `${prefixPagePath}/${dynamicPageName}/index?pageCode=visitReasonPage&communityCode=${communityCode2}&communityName=${communityName2}&sceneCode=${sceneCode2}`;
  140. this.commit({
  141. errorType: 'SYSTEM_BUSY',
  142. errorMsg: '系统繁忙',
  143. errorBrief: '请稍后再试',
  144. operations: [{
  145. btnText: '重试',
  146. handleName: 'reload',
  147. url: jumpUrl
  148. }]
  149. });
  150. return;
  151. } // 更新passport信息,并跳转到第三页面
  152. const newPassport = { ...passport,
  153. qrCodeUrl: res2.qrCodeUrl || ''
  154. };
  155. this.commit('$global:updateState', {
  156. passport: newPassport
  157. }); // 更新storage
  158. await storageAPI.setStorage({
  159. key: 'passport',
  160. data: newPassport
  161. });
  162. return my.navigateTo({
  163. url: `${prefixPagePath}/${dynamicPageName}/index?pageCode=visitRegistrationPage`,
  164. success: () => {
  165. this.handleReset();
  166. }
  167. });
  168. }
  169. }
  170. }
  171. this.commit('$global:updateState', {
  172. passport
  173. });
  174. },
  175. methods: {
  176. // checkCertified() {
  177. // if (this.data.accessMode === 'realName' && this.data.userInfo.isCertified === 'F') {
  178. // this.commit({
  179. // errorType: 'NOCERTIFIED',
  180. // errorMsg: '还未完成实名认证',
  181. // errorBrief: '请先完成实名认证',
  182. // operations: [{ btnText: '去认证', handleName: 'jumpToAlipayPage', url: 'https://custweb.alipay.com/certify/personal/LIFE_PAY' }],
  183. // });
  184. // }
  185. // },
  186. async refreshReason() {
  187. // 获取当前页面的参数信息
  188. const query = getCurrentPages().pop().options || {};
  189. const {
  190. sceneCode
  191. } = query; // 获取拜访列表
  192. const res = await getVisitReason(sceneCode);
  193. const {
  194. reasons
  195. } = res;
  196. this.commit({
  197. reasons,
  198. reasonsError: !reasons
  199. });
  200. },
  201. onStepsItemClick() {
  202. const {
  203. passport
  204. } = this.data;
  205. const newPassport = { ...passport,
  206. roomInfo: ''
  207. };
  208. this.commit('$global:updateState', {
  209. passport: newPassport
  210. });
  211. my.navigateTo({
  212. url: `/antbuilder/industry/scanpass/pages/select-room/index?communityCode=${passport.communityCode}&communityName=${passport.communityName}&sceneCode=${passport.sceneCode}`
  213. });
  214. },
  215. // 选择来访原因
  216. handleReasons(e) {
  217. const {
  218. dataset
  219. } = e.target;
  220. const childContent = this.data.reasons[dataset.index].childContent || {};
  221. const buttonDisable = childContent.required || false; // eslint-disable-next-line no-mixed-operators
  222. const showSecondReason = childContent.childContentType === 'textarea' && childContent || childContent.childContentDatasource && childContent.childContentDatasource.length > 0;
  223. this.setData({
  224. 'form.reason': dataset.code,
  225. 'form.reasonText': dataset.title,
  226. currentIndex: dataset.index,
  227. showSecondReason,
  228. buttonDisable
  229. });
  230. },
  231. // 选择具体原因
  232. handleSecondReason(e) {
  233. const value = e.target.dataset.value || e.detail.value;
  234. const {
  235. reasons,
  236. currentIndex,
  237. form
  238. } = this.data;
  239. let buttonDisable = reasons[currentIndex].childContent.required && !value;
  240. if (reasons[currentIndex].showFloor && !form.roomInfo) {
  241. buttonDisable = true;
  242. }
  243. const reasonText = reasons[currentIndex].name + (e.target.dataset.title ? `-${e.target.dataset.title}` : '');
  244. const reasonLogo = e.target.dataset.logo;
  245. this.setData({
  246. 'form.description': value,
  247. 'form.reasonText': reasonText,
  248. 'form.reasonLogo': reasonLogo,
  249. buttonDisable
  250. });
  251. },
  252. // 提交登记
  253. async onSubmit() {
  254. const {
  255. form,
  256. passport = {},
  257. alipayUid
  258. } = this.data;
  259. const formData = {
  260. communityCode: passport.communityCode,
  261. sceneCode: passport.sceneCode || '',
  262. reason: form.reason,
  263. description: form.description,
  264. extendFileds: form.extendFileds || '',
  265. roomInfo: form.roomInfo,
  266. buildingName: form.buildingName,
  267. unitName: form.unitName,
  268. houseName: form.houseName,
  269. longitude: app.globalData.regionData.longitude,
  270. latitude: app.globalData.regionData.latitude
  271. };
  272. const [err, res = {}] = await visitRegistration(formData);
  273. if (err || res.result !== 'success') {
  274. const {
  275. communityCode,
  276. communityName,
  277. sceneCode
  278. } = passport;
  279. const jumpUrl = `${prefixPagePath}/${dynamicPageName}/index?pageCode=visitReasonPage&communityCode=${communityCode}&communityName=${communityName}&sceneCode=${sceneCode}`;
  280. this.commit({
  281. errorType: 'SYSTEM_BUSY',
  282. errorMsg: '系统繁忙',
  283. errorBrief: '请稍后再试',
  284. operations: [{
  285. btnText: '重试',
  286. handleName: 'reload',
  287. url: jumpUrl
  288. }]
  289. });
  290. return;
  291. } // 更新passport信息,并跳转到第三页面
  292. const newPassport = { ...passport,
  293. alipayUid,
  294. reason: form.reason,
  295. description: form.description,
  296. reasonText: form.reasonText,
  297. reasonLogo: form.reasonLogo,
  298. qrCodeUrl: res.qrCodeUrl || '',
  299. visitTime: dayjs().format()
  300. };
  301. this.commit('$global:updateState', {
  302. passport: newPassport
  303. }); // 更新storage
  304. await storageAPI.setStorage({
  305. key: 'passport',
  306. data: newPassport
  307. });
  308. my.navigateTo({
  309. url: `${prefixPagePath}/${dynamicPageName}/index?pageCode=visitRegistrationPage`,
  310. success: () => {
  311. this.handleReset();
  312. }
  313. });
  314. },
  315. // 重置表单
  316. handleReset() {
  317. this.setData({
  318. currentIndex: -1,
  319. showSecondReason: false,
  320. buttonDisable: true,
  321. activatedStep: 1,
  322. 'form.reason': '',
  323. 'form.description': '',
  324. 'form.reasonText': '',
  325. 'form.reasonLogo': '',
  326. 'form.roomInfo': '',
  327. 'form.buildingName': '',
  328. 'form.unitName': '',
  329. 'form.houseName': ''
  330. });
  331. }
  332. }
  333. }));