index.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. <template>
  2. <view class="p-[30rpx] bg-[#f5f5f5]">
  3. <!-- 页面标题 -->
  4. <view class="text-[36rpx] font-bold text-[#333] text-center mb-[20rpx]">
  5. 农户信息
  6. </view>
  7. <!-- 提示信息 -->
  8. <view class="text-[28rpx] text-[#666] text-center mb-[30rpx]">
  9. 通过上传身份证可识别姓名和身份证号码,错误请自行修改
  10. </view>
  11. <!-- 身份证上传区域 -->
  12. <view class="mb-[30rpx]">
  13. <view
  14. class="w-full h-[300rpx] bg-[#f0f7ff] rounded-[12rpx] flex flex-col items-center justify-center relative overflow-hidden">
  15. <image src="/static/avatar.png" class="w-[120rpx] h-[120rpx] rounded-full mb-[20rpx]"
  16. mode="aspectFill" />
  17. <view class="w-full p-[20rpx] text-center">
  18. <view class="text-[24rpx] text-[#666] mb-[6rpx]">姓名:<text
  19. class="text-[#333]">{{ userInfo.name || '未填写' }}</text></view>
  20. <view class="text-[24rpx] text-[#666]">公民身份证号码:<text
  21. class="text-[#333]">{{ userInfo.idCard || '未填写' }}</text></view>
  22. </view>
  23. </view>
  24. <button
  25. class="w-full h-[80rpx] bg-[#e6f7ff] text-[#007aff] text-[28rpx] rounded-[12rpx] mt-[20rpx] leading-[80rpx] text-center"
  26. @click="uploadIdCard">
  27. 上传身份证人像面
  28. </button>
  29. </view>
  30. <!-- 表单区域 -->
  31. <view class="mb-[30rpx]">
  32. <!-- 所在地区 -->
  33. <view class="mb-[20rpx] bg-white rounded-[12rpx] p-[20rpx]">
  34. <view class="text-[28rpx] text-[#333] font-bold mb-[10rpx]">所在地区:</view>
  35. <picker @change="onRegionChange" :value="selectedRegionIndex" :range="regionList" mode="selector"
  36. class="h-[80rpx] border-solid border-1 border-black rounded-[12rpx] px-[20rpx] flex items-center justify-between text-[28rpx] text-[#333]">
  37. <view :class="selectedRegion ? 'text-[#333]' : 'text-[#999]'">
  38. {{ selectedRegion || '请选择您的所在地区' }}
  39. </view>
  40. </picker>
  41. </view>
  42. <!-- 姓名 -->
  43. <view class="mb-[20rpx] bg-white rounded-[12rpx] p-[20rpx]">
  44. <view class="text-[28rpx] text-[#333] font-bold mb-[10rpx]">姓名:</view>
  45. <input v-model="userInfo.name" type="text" placeholder="请填写确权承包方姓名"
  46. class="h-[80rpx] border-solid border-1 border-black rounded-[12rpx] px-[20rpx] text-[28rpx] text-[#333]" />
  47. </view>
  48. <!-- 身份证号码 -->
  49. <view class="mb-[20rpx] bg-white rounded-[12rpx] p-[20rpx]">
  50. <view class="text-[28rpx] text-[#333] font-bold mb-[10rpx]">身份证号码:</view>
  51. <input v-model="userInfo.idCard" type="text" placeholder="请填写确权承包方身份证号码"
  52. class="h-[80rpx] border-solid border-1 border-black rounded-[12rpx] px-[20rpx] text-[28rpx] text-[#333]" />
  53. </view>
  54. </view>
  55. <!-- 确认按钮 -->
  56. <view class="mt-[20rpx]">
  57. <button
  58. class="w-full h-[80rpx] bg-[#007aff] text-white text-[28rpx] rounded-[12rpx] leading-[80rpx] text-center"
  59. @click="confirmInfo">
  60. 确认
  61. </button>
  62. </view>
  63. </view>
  64. </template>
  65. <script setup lang="ts">
  66. import { ref, reactive } from 'vue'
  67. import { getXCXCbfData, getFarmerDetailData } from '@/api/farmerApi.js';
  68. // 用户信息
  69. // const userInfo = reactive({
  70. // name: '易茂松',
  71. // gender: '',
  72. // birth: '',
  73. // idCard: '432427196706261714'
  74. // })
  75. // 用户信息
  76. const userInfo = reactive({
  77. name: '田传平',
  78. gender: '',
  79. birth: '',
  80. idCard: '432427197312211719'
  81. })
  82. // 地区列表
  83. const regionList = ref([
  84. '湖南省常德市石门县'
  85. ])
  86. // 当前选中的地区索引
  87. const selectedRegionIndex = ref(0)
  88. // 当前选中的地区名称
  89. const selectedRegion = ref(regionList.value[0])
  90. // 指示器样式
  91. const indicatorStyle = ref('height: 80rpx; line-height: 80rpx;')
  92. // const uploadIdCard = () => {
  93. // // #ifdef MP-WEIXIN
  94. // uni.chooseMedia({
  95. // count: 1,
  96. // mediaType: ['image'],
  97. // sourceType: ['camera', 'album'], // 支持拍照和相册
  98. // success: (res) => {
  99. // const filePath = res.tempFiles[0].tempFilePath;
  100. // // 引入微信OCR插件
  101. // const ocr = requirePlugin('ocr-plugin');
  102. // ocr.ocrCommon({
  103. // imgUrl: filePath,
  104. // ocrType: 'idcard', // 识别身份证
  105. // success: (result) => {
  106. // console.log('插件识别结果:', result);
  107. // // 回填数据
  108. // if (result.name) userInfo.name = result.name;
  109. // if (result.id) userInfo.idCard = result.id;
  110. // uni.showToast({ title: '识别成功', icon: 'success' });
  111. // },
  112. // fail: (err) => {
  113. // console.error('插件识别失败:', err);
  114. // uni.showToast({
  115. // title: '识别失败,请调整光线重试',
  116. // icon: 'none'
  117. // });
  118. // }
  119. // });
  120. // },
  121. // fail: (err) => {
  122. // uni.showToast({ title: '选择图片失败', icon: 'none' });
  123. // }
  124. // });
  125. // // #endif
  126. // // #ifndef MP-WEIXIN
  127. // // 非微信端(如App/H5)可以使用你原本的Tesseract逻辑
  128. // uni.showToast({ title: '当前平台暂不支持', icon: 'none' });
  129. // // #endif
  130. // };
  131. // 地区选择变化
  132. const onRegionChange = (e : any) => {
  133. selectedRegionIndex.value = e.detail.value
  134. selectedRegion.value = regionList.value[e.detail.value]
  135. }
  136. /**
  137. * 页面跳转封装(统一处理跳转逻辑)
  138. * @param pagePath 目标页面路径
  139. */
  140. const navigateToPage = (pagePath : string) => {
  141. uni.hideLoading() // 确保关闭加载态
  142. uni.navigateTo({
  143. url: pagePath,
  144. fail: (err) => {
  145. console.error('页面跳转失败:', err)
  146. uni.showToast({
  147. title: '页面跳转失败',
  148. icon: 'none'
  149. })
  150. }
  151. })
  152. }
  153. /**
  154. * 后续接口调用并处理页面跳转
  155. * @param farmerData 第一步查询到的农户数据
  156. */
  157. const callNextApi = async (farmerData : any) => {
  158. try {
  159. // 调用详情接口
  160. // console.log('调用后续接口,参数:', farmerData[0].cbfbm)
  161. const res = await getFarmerDetailData({ cbfbm: farmerData[0].cbfbm })
  162. // 修复代码(直接替换)
  163. const allEmpty = (function (obj) {
  164. // 安全遍历对象所有值
  165. let values = [];
  166. for (let key in obj) {
  167. if (obj.hasOwnProperty(key)) {
  168. values.push(obj[key]);
  169. }
  170. }
  171. // 判断所有数组是否为空
  172. return values.every(item => Array.isArray(item) && item.length === 0);
  173. })(res.data);
  174. console.log('农户详情接口返回:', allEmpty)
  175. if (allEmpty) {
  176. uni.navigateTo({
  177. url: `/pages/farmer/reportingByFarmers?groupInfo=${encodeURIComponent(JSON.stringify(farmerData[0]))}`
  178. })
  179. } else {
  180. uni.navigateTo({
  181. url: `/pages/investigator/Households/progress?groupInfo=${encodeURIComponent(JSON.stringify(farmerData[0]))}&index=${encodeURIComponent(JSON.stringify(res.data))}`
  182. })
  183. }
  184. } catch (err) {
  185. console.error('后续接口调用失败:', err)
  186. uni.hideLoading() // 异常时关闭加载态
  187. uni.showToast({
  188. title: '处理失败,请重试',
  189. icon: 'none'
  190. })
  191. }
  192. }
  193. /**
  194. * 查询农户信息并处理结果
  195. * @param name 姓名
  196. * @param idCard 身份证号
  197. */
  198. async function getTotal(name : string, idCard : string) {
  199. // 加载中提示
  200. uni.showLoading({
  201. title: '查询中...'
  202. })
  203. try {
  204. // 调用查询接口
  205. const res = await getXCXCbfData({
  206. cbfmc: name,
  207. cbfzjhm: idCard,
  208. });
  209. // console.log('农户信息查询结果:', res.data)
  210. // 1. 判断返回数据是否为空数组
  211. if (Array.isArray(res.data) && res.data.length === 0) {
  212. uni.hideLoading() // 关闭加载态
  213. uni.showToast({
  214. title: '库中不存在此人员信息',
  215. icon: 'none',
  216. duration: 2000
  217. })
  218. return // 终止后续逻辑
  219. }
  220. // 2. 数据非空时调用后续接口
  221. await callNextApi(res.data)
  222. } catch (err) {
  223. console.error('农户信息查询失败:', err)
  224. uni.hideLoading() // 异常时关闭加载态
  225. uni.showToast({
  226. title: '查询失败,请检查网络',
  227. icon: 'none'
  228. })
  229. }
  230. }
  231. // 确认信息提交
  232. const confirmInfo = () => {
  233. // 姓名校验
  234. if (!userInfo.name) {
  235. uni.showToast({
  236. title: '请输入姓名',
  237. icon: 'none'
  238. })
  239. return
  240. }
  241. // 身份证校验
  242. if (!userInfo.idCard) {
  243. uni.showToast({
  244. title: '请输入身份证号码',
  245. icon: 'none'
  246. })
  247. return
  248. }
  249. // 身份证格式简单校验(可选)
  250. const idCardReg = /^\d{17}[\dXx]$/
  251. if (!idCardReg.test(userInfo.idCard)) {
  252. uni.showToast({
  253. title: '请输入有效的18位身份证号码',
  254. icon: 'none'
  255. })
  256. return
  257. }
  258. // 调用查询方法
  259. getTotal(userInfo.name, userInfo.idCard)
  260. }
  261. </script>