You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

vehicle-change-chepai-write.vue 36KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072
  1. <template>
  2. <view class="bg">
  3. <view class="title_wrap"><text class="title">变更基本信息</text></view>
  4. <u-form label-width="230" :model="state.form" ref="uForm" :label-style='labelStyle'>
  5. <u-form-item label="旧车牌号码" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  6. borderBottom>
  7. <u-input v-model="state.form.vehiclePlate" input-align='right' disabled/>
  8. </u-form-item>
  9. <u-form-item label="旧车牌颜色" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  10. borderBottom>
  11. <view class="showworld">{{getCodeName('VEHICLE_COLOR_TYPE',state.form.vehiclePlateColor)}}</view>
  12. </u-form-item>
  13. <u-form-item label="新车牌号码" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  14. borderBottom>
  15. <u-input v-model="state.form.vehiclePlateNew" input-align='right' disabled/>
  16. </u-form-item>
  17. <u-form-item label="新车牌颜色" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  18. borderBottom>
  19. <view class="showworld">{{getCodeName('VEHICLE_COLOR_TYPE',state.form.vehiclePlateColorNew)}}</view>
  20. </u-form-item>
  21. <u-form-item label="OBU卡号" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  22. borderBottom>
  23. <u-input v-model="state.form.obuId" inputAlign="right" disabled/>
  24. </u-form-item>
  25. <u-form-item label="ETC卡号" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  26. borderBottom>
  27. <u-input v-model="state.form.cardId" inputAlign="right" disabled/>
  28. </u-form-item>
  29. <view class="picture-wrapper" @click="takePhotoMode('3')">
  30. <view class="bg1">
  31. <view class="">
  32. <view class="name"> 新车牌行驶证主页 </view>
  33. <view class="value"> 上传行驶证的主页 </view>
  34. <view class="tip">
  35. <view class="tip-value"> 拍摄规范 </view>
  36. </view>
  37. </view>
  38. <image v-if="!state.form.vehPosImgUrl" class="icon" :src="`${$imgUrl}issuance/xz.png`"
  39. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}">
  40. </image>
  41. <image v-else class="icon" :src="strReplace(state.form.vehPosImgUrl)"
  42. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}"></image>
  43. </view>
  44. </view>
  45. <view class="picture-wrapper" @click="takePhotoMode('4')">
  46. <view class="bg1">
  47. <view class="">
  48. <view class="name"> 新车牌行驶证副页 </view>
  49. <view class="value"> 上传行驶证的副页 </view>
  50. <view class="tip">
  51. <view class="tip-value"> 拍摄规范 </view>
  52. </view>
  53. </view>
  54. <image v-if="!state.form.vehNegImgUrl" class="icon" :src="`${$imgUrl}issuance/xf.png`"
  55. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}">
  56. </image>
  57. <image v-else class="icon" :src="strReplace(state.form.vehNegImgUrl)"
  58. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}"></image>
  59. </view>
  60. </view>
  61. </u-form>
  62. </view>
  63. <view class="bg">
  64. <view class="title_wrap"><text class="title">车辆信息</text></view>
  65. <u-form label-width="230" :model="state.form" ref="uForm" :label-style='labelStyle'>
  66. <u-form-item label="车辆所有人姓名" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  67. borderBottom>
  68. <u-input v-model="state.form.ownerName" input-align='right'/>
  69. </u-form-item>
  70. <u-form-item label="车辆类型" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  71. borderBottom>
  72. <u-input v-model="state.form.vehicleType" input-align='right'/>
  73. </u-form-item>
  74. <u-form-item label="证件类型" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  75. borderBottom>
  76. <u-input v-model="state.form.ownerIdTypeStr" type="select" @click="show1 = true" input-align='right'/>
  77. </u-form-item>
  78. <u-form-item label="证件号码" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  79. borderBottom>
  80. <u-input v-model="state.form.ownerIdNum" input-align='right'/>
  81. </u-form-item>
  82. <u-form-item label="地址" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  83. borderBottom>
  84. <u-input v-model="state.form.ownerAddress" input-align='right'/>
  85. </u-form-item>
  86. <u-form-item label="发证日期" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  87. borderBottom>
  88. <u-input v-model="state.form.issueDate" input-align='right'/>
  89. </u-form-item>
  90. <u-form-item label="总质量(kg)" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'>
  91. <u-input inputAlign="right" placeholder="请输入总质量" v-model="state.form.totalMass"
  92. />
  93. </u-form-item>
  94. <u-form-item label="整备质量(kg)" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'>
  95. <u-input inputAlign="right" placeholder="请输入整备质量" v-model="state.form.maintenanceMass" />
  96. </u-form-item>
  97. <u-form-item label="准牵引总质量(kg)" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon' v-if="state.form.permittedTowWeight">
  98. <u-input inputAlign="right" placeholder="请输入牵引质量" v-model="state.form.permittedTowWeight"/>
  99. </u-form-item>
  100. <u-form-item label="车轴数(轴)" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'>
  101. <u-input inputAlign="right" placeholder="请输入车轴数" v-model="state.form.axleCount" @blur="changeAxleCount"/>
  102. </u-form-item>
  103. <u-form-item label="车轮数" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'>
  104. <u-input inputAlign="right" placeholder="请输入车轮数" v-model="state.form.wheelCount"/>
  105. </u-form-item>
  106. <u-form-item label="外廓尺寸(mm)" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'>
  107. <u-input inputAlign="right" placeholder="请输入外廓尺寸" v-model="state.form.outsideDimensions" />
  108. </u-form-item>
  109. <u-form-item label="核定载人数(人)" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'>
  110. <u-input inputAlign="right" placeholder="请输入核定载人数" v-model="state.form.approvedCount" />
  111. </u-form-item>
  112. <u-form-item label="发动机号" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'>
  113. <u-input inputAlign="right" placeholder="请输入发动机号码" v-model="state.form.engineNum" />
  114. </u-form-item>
  115. <u-form-item label="车辆识别号" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'>
  116. <u-input inputAlign="right" placeholder="请输入车辆识别号" v-model="state.form.vin"/>
  117. </u-form-item>
  118. <u-form-item label="车辆用户类型" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  119. borderBottom>
  120. <u-input v-model="state.form.vehicleCustomerTypeName" type="select" @click="show4 = true" input-align='right'/>
  121. </u-form-item>
  122. <view class="picture-wrapper" @click="cardFileImageUpdate(1)">
  123. <view class="bg1">
  124. <view class="">
  125. <view class="name"> 车身45°照 </view>
  126. <view class="value"> 上传汽车的45°照 </view>
  127. <view class="tip">
  128. <view class="tip-value"> 拍摄规范 </view>
  129. </view>
  130. </view>
  131. <image v-if="!state.form.vehBodyUrl" class="icon" :src="`${$imgUrl}issuance/chetou45.png`"
  132. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}">
  133. </image>
  134. <image v-else class="icon" :src="strReplace(state.form.vehBodyUrl)"
  135. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}"></image>
  136. </view>
  137. </view>
  138. <view class="picture-wrapper" @click="cardFileImageUpdate(2)">
  139. <view class="bg1">
  140. <view class="">
  141. <view class="name"> 车头照 </view>
  142. <view class="value"> 上传车辆车头照 </view>
  143. <view class="tip">
  144. <view class="tip-value"> 拍摄规范 </view>
  145. </view>
  146. </view>
  147. <image v-if="!state.form.vehFrontUrl" class="icon" :src="`${$imgUrl}issuance/chetou.png`"
  148. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}">
  149. </image>
  150. <image v-else class="icon" :src="strReplace(state.form.vehFrontUrl)"
  151. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}"></image>
  152. </view>
  153. </view>
  154. <u-form-item label="是否本人办理" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon' v-if="state.form.userType==1">
  155. <view class="right-show">
  156. <radio-group @change="radioChange">
  157. <label style="margin-right: 60rpx;" class="uni-list-cell uni-list-cell-pd "
  158. v-for="(item, index) in state.items" :key="item.value">
  159. <radio :value="item.value" :checked="index+1 === state.form.isMyselfHandle" />{{item.name}}
  160. </label>
  161. </radio-group>
  162. </view>
  163. </u-form-item>
  164. <view v-if="state.form.userType==1">
  165. <view class="picture-wrapper" @click="takePhotoMode(1)" >
  166. <view class="bg1">
  167. <view class="">
  168. <view class="name"> 人像面 </view>
  169. <view class="value"> 开户人身份证的人像面 </view>
  170. <view class="tip">
  171. <view class="tip-value"> 拍摄规范 </view>
  172. </view>
  173. </view>
  174. <image v-if="!state.form.customerPosImgurl" class="icon" :src="`${$imgUrl}issuance/sfz.png`"
  175. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}">
  176. </image>
  177. <image v-else class="icon" :src="strReplace(state.form.customerPosImgurl)"
  178. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png`}"></image>
  179. </view>
  180. </view>
  181. <view class="picture-wrapper" @click="takePhotoMode(2)">
  182. <view class="bg1">
  183. <view class="">
  184. <view class="name"> 国徽面 </view>
  185. <view class="value"> 开户人身份证的国徽面 </view>
  186. <view class="tip">
  187. <view class="tip-value"> 拍摄规范 </view>
  188. </view>
  189. </view>
  190. <image v-if="!state.form.customerNegImgurl" class="icon" :src="`${$imgUrl}issuance/sff.png`"
  191. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png`}">
  192. </image>
  193. <image v-else class="icon" :src="strReplace(state.form.customerNegImgurl)"
  194. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png`}"></image>
  195. </view>
  196. </view>
  197. <u-form-item label="用户姓名" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon' borderBottom>
  198. <u-input v-model="state.form.customerName" placeholder='用户姓名'
  199. maxlength="20" inputAlign="right"/>
  200. </u-form-item>
  201. <u-form-item label="用户证件类型" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon' borderBottom>
  202. <u-input v-model="state.form.customerIdTypeStr" type="select" @click="show2 = true" input-align='right'/>
  203. </u-form-item>
  204. <u-form-item label="用户证件号码" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon' borderBottom>
  205. <u-input placeholder='请输入用户证件号码' type="idcard" v-model="state.form.customerIdNum"
  206. maxlength="18" inputAlign="right"/>
  207. </u-form-item>
  208. <view class="picture-wrapper" @click="cardFileImageUpdate(3)" v-if="state.form.isMyselfHandle==2">
  209. <view class="bg1">
  210. <view class="">
  211. <view class="name"> 开户人授权书 </view>
  212. <view class="value"> 上传授权书 </view>
  213. <view class="tip">
  214. <view class="tip-value"> 拍摄规范 </view>
  215. </view>
  216. </view>
  217. <image v-if="!state.form.ownerLetterOfAuthorizationImgUrl" class="icon" :src="`${$imgUrl}issuance/weituo.png`"
  218. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}">
  219. </image>
  220. <image v-else class="icon" :src="strReplace(state.form.ownerLetterOfAuthorizationImgUrl)"
  221. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}"></image>
  222. </view>
  223. </view>
  224. </view>
  225. <view v-if="state.form.userType==2">
  226. <view class="picture-wrapper" @click="takePhotoMode(1)" >
  227. <view class="bg1">
  228. <view class="">
  229. <view class="name"> 人像面 </view>
  230. <view class="value"> 经办人身份证的人像面 </view>
  231. <view class="tip">
  232. <view class="tip-value"> 拍摄规范 </view>
  233. </view>
  234. </view>
  235. <image v-if="!state.form.agentPosImgurl" class="icon" :src="`${$imgUrl}issuance/sfz.png`"
  236. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}">
  237. </image>
  238. <image v-else class="icon" :src="strReplace(state.form.agentPosImgurl)"
  239. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png`}"></image>
  240. </view>
  241. </view>
  242. <view class="picture-wrapper" @click="takePhotoMode(2)">
  243. <view class="bg1">
  244. <view class="">
  245. <view class="name"> 国徽面 </view>
  246. <view class="value"> 经办人身份证的国徽面 </view>
  247. <view class="tip">
  248. <view class="tip-value"> 拍摄规范 </view>
  249. </view>
  250. </view>
  251. <image v-if="!state.form.agentNegImgurl" class="icon" :src="`${$imgUrl}issuance/sff.png`"
  252. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png`}">
  253. </image>
  254. <image v-else class="icon" :src="strReplace(state.form.agentNegImgurl)"
  255. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png`}"></image>
  256. </view>
  257. </view>
  258. <u-form-item label="经办人姓名" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon' borderBottom>
  259. <u-input v-model="state.form.agentName" placeholder='经办人姓名'
  260. maxlength="20" inputAlign="right"/>
  261. </u-form-item>
  262. <u-form-item label="经办人证件类型" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon' borderBottom>
  263. <u-input v-model="state.form.agentIdTypeStr" type="select" @click="show3 = true" input-align='right'/>
  264. </u-form-item>
  265. <u-form-item label="经办人证号号码" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon' borderBottom>
  266. <u-input placeholder='请输入证件号码' type="idcard" v-model="state.form.agentIdNum"
  267. maxlength="18" inputAlign="right"/>
  268. </u-form-item>
  269. <u-form-item label="部门" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon' borderBottom>
  270. <u-input placeholder='请输入部门' v-model="state.form.department" inputAlign="right"/>
  271. </u-form-item>
  272. <view class="picture-wrapper" @click="cardFileImageUpdate(4)">
  273. <view class="bg1">
  274. <view class="">
  275. <view class="name"> 单位授权书 </view>
  276. <view class="value"> 上传授权书 </view>
  277. <view class="tip">
  278. <view class="tip-value"> 拍摄规范 </view>
  279. </view>
  280. </view>
  281. <image v-if="!state.form.unitAuthorizationLetterImgUrl" class="icon" :src="`${$imgUrl}issuance/weituo.png`"
  282. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}">
  283. </image>
  284. <image v-else class="icon" :src="strReplace(state.form.unitAuthorizationLetterImgUrl)"
  285. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}"></image>
  286. </view>
  287. </view>
  288. </view>
  289. <u-form-item label="是否牵引车" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon' v-if="state.form.vanType==2 || state.form.vanType==3">
  290. <radio-group @change="radioChangeqyc">
  291. <view class="right-show">
  292. <label style="margin-right: 60rpx;" class="uni-list-cell uni-list-cell-pd "
  293. v-for="(item, index) in state.itemsqyc" :key="item.value">
  294. <radio :value="item.value" :checked="index === state.form.isTractor" />{{item.name}}
  295. </label>
  296. </view>
  297. </radio-group>
  298. </u-form-item>
  299. <view class="picture-wrapper" @click="cardFileImageUpdate(5)" v-if="state.form.isTractor==1">
  300. <view class="bg1">
  301. <view class="">
  302. <view class="name"> 道路运输许可证 </view>
  303. <view class="value"> 上传道路运输许可证 </view>
  304. <view class="tip">
  305. <view class="tip-value"> 拍摄规范 </view>
  306. </view>
  307. </view>
  308. <image v-if="!state.form.roadTransportPermitPicUrl" class="icon" :src="`${$imgUrl}issuance/chetou.png`"
  309. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}">
  310. </image>
  311. <image v-else class="icon" :src="strReplace(state.form.roadTransportPermitPicUrl)"
  312. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}"></image>
  313. </view>
  314. </view>
  315. </u-form>
  316. </view>
  317. <view class="bg">
  318. <u-form label-width="230" :model="state.form" ref="uForm" :label-style='labelStyle'>
  319. <u-form-item label="手机号码" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  320. borderBottom>
  321. <u-input v-model="state.form.ownerTel" input-align='right' disabled/>
  322. </u-form-item>
  323. <u-form-item label="验证码" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  324. borderBottom>
  325. <view style="display: flex;align-items: center;flex-shrink: 0;">
  326. <u-input v-model="state.code" input-align='right' maxlength="6"/>
  327. <text @click="getCode" v-if="waitTime==0" class="search">获取验证码</text>
  328. <text class="search" v-else>{{waitTime}}后重试</text>
  329. </view>
  330. </u-form-item>
  331. </u-form>
  332. </view>
  333. <view class="action">
  334. <button type="default" class="ui-btn" @click="savaHandle()">
  335. 提交
  336. </button>
  337. </view>
  338. <!-- 选择证件类型 -->
  339. <u-select v-model="show1" :list="state.ownerIdTypeRange" @confirm="changeOwnerIdType"></u-select>
  340. <!-- 用户证件类型 -->
  341. <u-select v-model="show2" :list="state.ownerIdTypeRange" @confirm="changeCustomerIdType"></u-select>
  342. <!-- 经办人证件类型 -->
  343. <u-select v-model="show3" :list="state.ownerIdTypeRange" @confirm="changeAgentIdType"></u-select>
  344. <u-select v-model="show4" :list="state.vehicleCustomerTypeRange" @confirm="vehicleCustomerTypeType"></u-select>
  345. <view class="choice-takePhoto-wrap" v-if="state.isTakePhotoModeShow" @click="cancle">
  346. <view class="choice-takePhoto">
  347. <view @click.stop="takePhoto(state.choiceIndex)" style="border-radius: 20rpx 20rpx 0 0;">拍照</view>
  348. <view @click.stop="xiangce(state.choiceIndex)">从手机相册选择</view>
  349. <view @click.stop="cancle">取消</view>
  350. </view>
  351. </view>
  352. <viewfinder v-if="state.phoneType" :phoneType="state.phoneType" :images="state.images" :showStartPhoto="state.showImg"
  353. @confirmReturn="confirmReturn" @camera="camera"></viewfinder>
  354. </template>
  355. <script setup lang="ts">
  356. import { navTo,uploadFile,strReplace,msg,chooseImageCompress,checkStr} from "@/utils/utils";
  357. import { reactive,ref } from "vue";
  358. import carNumberInput from "@/components/car-number-input/car-number-input.vue";
  359. import { onLoad } from "@dcloudio/uni-app";
  360. import { getItem } from "@/utils/storage.ts"
  361. import {vehicleLicenseOcr,licenseInforChangeApply,idCardOcr,sendMessage,messageValid,vehicleInfoChangeApply,vehicleInformationChange} from "@/utils/network/api.js";
  362. import {requestNew} from "@/utils/network/request.js";
  363. import viewfinder from "../../../components/viewfinder.vue"
  364. import {
  365. calculateVehicleType
  366. } from "@/datas/publicRequest";
  367. import {
  368. getCodeName
  369. } from "@/datas/queryKey.js";
  370. const labelStyle = {
  371. color: "#004576",
  372. fontSize: "28rpx",
  373. }
  374. const leftIcon = {
  375. height: '100%',
  376. width: '8rpx',
  377. display: 'flex',
  378. 'align-items': 'center',
  379. 'margin-right': '4rpx',
  380. }
  381. const show1 = ref(false)
  382. const show2 = ref(false)
  383. const show3 = ref(false)
  384. const show4 = ref(false)
  385. const state = reactive({
  386. form: {
  387. name:"",
  388. vehiclePlate: "",//车牌号
  389. vehiclePlateColor: "",//车牌颜色
  390. vehicleId:"",
  391. vehiclePlateNew:"",//变更后车牌号
  392. vehiclePlateColorNew:"",//变更后车牌颜色
  393. cardId:"",
  394. obuId:"",
  395. isVehiclePlateChange:1,//是否车牌变更 否_0,是_1
  396. vanType:"",//客货类型,1-客车 2-货车 3-作业车
  397. isMyselfHandle:1,//本人办理_1,代理人办理_2
  398. userType:1,//1个人 2单位
  399. customerPosImgurl:"",//开户人身份证正面URL
  400. customerNegImgurl:"",//开户人身份证反面URL
  401. ownerLetterOfAuthorizationImgUrl:"",//开户人授权书URL
  402. unitAuthorizationLetterImgUrl:"",//单位授权书URL
  403. isTractor:0,//是否牵引车 否_0,是_1
  404. roadTransportPermitPicUrl:"",//道路运输许可证图片地址(牵引车才提供)
  405. ownerName:"",
  406. ownerIdTypeStr:"",
  407. ownerIdType:"",
  408. ownerIdNum:"",
  409. ownerAddress:"",
  410. totalMass:"",
  411. maintenanceMass:"",
  412. axleCount:"",
  413. outsideDimensions:"",
  414. approvedCount:"",
  415. vin:"",
  416. engineNum:"",
  417. vehBodyUrl:"",
  418. vehFrontUrl:"",
  419. vehPosImgUrl:"",
  420. vehNegImgUrl:"",
  421. vehPosImgOcrId:"",//行驶证正面orcId
  422. vehNegImgOcrId:"",//行驶证反面orcId
  423. ownerTel:"",
  424. customerName:"",
  425. customerIdNum:"",
  426. permittedTowWeight:"",//准牵引总质量
  427. customerIdTypeStr:"",
  428. customerIdType:"",
  429. vehicleTypeNew:"",//收费车型
  430. agentPosImgurl:"",//经办人身份证正面照
  431. agentNegImgurl:"",//经办人身份证反面照
  432. agentName:"",//经办人姓名
  433. agentIdNum:"",
  434. agentIdType:"",//经办人证件类型
  435. agentIdTypeStr:"",//经办人证件类型
  436. department:"",//部门
  437. vehicleType:"",//行驶证车辆类型
  438. vehicleCustomerType:"",
  439. vehicleCustomerTypeName:"",
  440. issueDate:"",
  441. wheelCount:"",//车轮数
  442. useCharacter:"",//车辆使用性质
  443. registerDate:"",
  444. vehicleModel:"",//行驶证品牌型号
  445. },
  446. isTakePhotoModeShow: false, //选择拍照方式是否出来
  447. choiceIndex: 1, // 1 身份证正面 2 身份证反面
  448. phoneType: 0, // 1 身份证正面 2 身份证反面 3行驶证正面 4行驶证反面
  449. images: '',
  450. showImg: true,
  451. items: [{
  452. value: 1,
  453. name: '是',
  454. checked: 'true'
  455. },
  456. {
  457. value: 2,
  458. name: '否',
  459. }],
  460. itemsqyc: [{
  461. value: 0,
  462. name: '否',
  463. checked: 'true'
  464. },
  465. {
  466. value: 1,
  467. name: '是',
  468. }],
  469. ownerIdTypeRange: [],
  470. code:"",
  471. vehicleCustomerTypeRange:[]
  472. })
  473. onLoad((option : any) => {
  474. let type = getItem('key')['ID_TYPE'];
  475. for (var k = 0; k < type.length; k++) {
  476. let obj = {};
  477. obj['value'] = type[k]['code']
  478. obj['label'] = type[k]['name']
  479. state.ownerIdTypeRange.push(obj)
  480. }
  481. console.log("state.colorRange",state.ownerIdTypeRange,JSON.parse(decodeURIComponent(option.params)))
  482. let params=JSON.parse(decodeURIComponent(option.params))
  483. state.form.vehicleId=params.vehicleId
  484. state.form.vehiclePlate=params.vehicleId.split("_")[0]
  485. state.form.vehiclePlateColor=params.vehicleId.split("_")[1]
  486. state.form.vehiclePlateNew=params.vehiclePlateNew
  487. state.form.vehiclePlateColorNew=params.vehiclePlateColorNew
  488. state.form.cardId=params.cardId
  489. state.form.obuId=params.obuId
  490. state.form.vanType=params.vanType
  491. getCarDetails()
  492. });
  493. const getCarDetails = () => {
  494. const options = {
  495. type: 2,
  496. data: {
  497. vehicleId:state.form.vehicleId
  498. },
  499. method: "POST",
  500. showLoading: true,
  501. };
  502. //调用方式
  503. requestNew(vehicleInformationChange, options)
  504. .then((res) => {
  505. console.log('车辆信息', res)
  506. state.form.ownerTel=res.info.customerInfo.customerTel
  507. state.form.userType=res.userType
  508. if(state.form.userType==2){
  509. state.form.isMyselfHandle=2
  510. }
  511. // 判断车辆用户类型
  512. judgeUseUserType()
  513. })
  514. .catch((err) => {
  515. console.log(err);
  516. });
  517. }
  518. // 判断车辆用户类型
  519. const judgeUseUserType=()=>{
  520. if(state.form.vanType=='1'){
  521. state.vehicleCustomerTypeRange=[
  522. {
  523. 'value':0,
  524. 'label':"普通车"
  525. }
  526. ]
  527. state.form.vehicleCustomerType = "0"
  528. state.form.vehicleCustomerTypeName = "普通车"
  529. }else{
  530. state.vehicleCustomerTypeRange=[
  531. {
  532. 'value':0,
  533. 'label':"普通车"
  534. },
  535. {
  536. 'label': "道路运输证经营范围仅有“货物专用运输(集装箱) ”的牵引车办理J类型集装箱",
  537. 'value': 24,
  538. },
  539. {
  540. 'label': "道路运输证经营范围不含“货物专用运输(集装箱)”的牵引车",
  541. 'value': 27,
  542. },
  543. {
  544. 'label': '道路运输证经营范围除“货物专用运输 (集装 箱)"外,还有“普通货运”等其他项目的牵引车办理J2类型集装箱',
  545. 'value': 28,
  546. }
  547. ]
  548. }
  549. }
  550. //车牌号输入
  551. const carNumber = (val : any) => {
  552. state.form.vehiclePlate = val.trim();
  553. };
  554. const savaHandle = () => {
  555. if(!state.form.vehPosImgUrl){
  556. msg("请上传新车牌行驶证主页");
  557. return;
  558. }
  559. if(!state.form.vehNegImgUrl){
  560. msg("请上传新车牌行驶证副页");
  561. return;
  562. }
  563. if(!state.form.ownerIdType){
  564. msg("请选择证件类型");
  565. return;
  566. }
  567. if(!checkStr(state.form.ownerIdNum, "card")){
  568. msg("请输入正确变更证件号码");
  569. return;
  570. }
  571. if(!state.form.ownerAddress){
  572. msg("请输入变更地址");
  573. return;
  574. }
  575. if(!state.form.totalMass){
  576. msg("请输入总质量");
  577. return;
  578. }
  579. if(!state.form.maintenanceMass){
  580. msg("请输入整备质量");
  581. return;
  582. }
  583. if(!state.form.axleCount){
  584. msg("请输入车轴数");
  585. return;
  586. }
  587. if(!state.form.wheelCount){
  588. msg("请输入车轮数");
  589. return;
  590. }
  591. if(!state.form.outsideDimensions){
  592. msg("请输入外廓尺寸");
  593. return;
  594. }
  595. if(!state.form.approvedCount){
  596. msg("请输入核定载人数");
  597. return;
  598. }
  599. if(!state.form.engineNum){
  600. msg("请输入发动机号码");
  601. return;
  602. }
  603. if(!state.form.vin){
  604. msg("请输入车辆识别号");
  605. return;
  606. }
  607. if(state.form.vehicleCustomerType==""){
  608. msg("请选择车辆用户类型");
  609. return;
  610. }
  611. // 测完放开
  612. checkCodeRequest().then((val : any) => {
  613. const options = {
  614. type: 2,
  615. data: {
  616. ...state.form
  617. },
  618. method: "POST",
  619. showLoading: true,
  620. };
  621. //调用方式
  622. requestNew(licenseInforChangeApply, options)
  623. .then((res) => {
  624. console.log("res",res)
  625. // msg(res.msg)
  626. msg('车牌变更信息提交成功')
  627. setTimeout(() => {
  628. uni.navigateBack({
  629. delta: 3
  630. })
  631. }, 2000)
  632. })
  633. .catch((err) => {
  634. console.log(err);
  635. });
  636. })
  637. }
  638. const checkCodeRequest = () => {
  639. if(!state.code){
  640. msg("请输入验证码");
  641. return;
  642. }
  643. const options = {
  644. type: 2,
  645. data: {
  646. mobile: state.form.ownerTel,
  647. code: state.code
  648. },
  649. method: "POST",
  650. showLoading: true,
  651. };
  652. return new Promise(async (resolve, reject) => {
  653. const res = await requestNew(messageValid, options);
  654. const data = res;
  655. resolve(data);
  656. }).catch((error) => {
  657. reject(error);
  658. });
  659. }
  660. const takePhotoMode = (index) => {
  661. console.log("index", index)
  662. state.isTakePhotoModeShow = true
  663. state.choiceIndex = index
  664. }
  665. // val 1 车身45°照 2车头照 3开户人授权书URL 4单位授权书URL 5道路运输证
  666. const cardFileImageUpdate = (val) => {
  667. uni.chooseImage({
  668. count: 1, //只能选取一张照片
  669. sizeType: ["original", "compressed"], //可以指定是原图还是压缩图,默认二者都有
  670. sourceType: ["camera", "album"], //从相册选择
  671. success: function (res) {
  672. uploadFile(res.tempFilePaths[0], "", "").then((data) => {
  673. if (val == 1) {
  674. state.form.vehBodyUrl = data;
  675. } else if(val == 2) {
  676. state.form.vehFrontUrl = data;
  677. }else if(val == 3) {
  678. state.form.ownerLetterOfAuthorizationImgUrl = data;
  679. }else if(val == 4) {
  680. state.form.unitAuthorizationLetterImgUrl = data;
  681. }else if(val == 5) {
  682. state.form.roadTransportPermitPicUrl = data;
  683. }
  684. })
  685. },
  686. });
  687. };
  688. let waitTime = ref(0)
  689. //倒计时函数
  690. const codeInterval = () => {
  691. waitTime.value = 60
  692. let timer = setInterval(() => {
  693. if (waitTime.value == 1) {
  694. clearInterval(timer)
  695. }
  696. waitTime.value -= 1
  697. }, 1000)
  698. }
  699. const getCode = () => {
  700. console.log(123);
  701. if (checkStr(state.form.ownerTel, "mobile")) {
  702. sendCodeApi()
  703. codeInterval()
  704. } else {
  705. uni.showToast({
  706. title: '请输入正确的手机号',
  707. icon: 'none'
  708. });
  709. }
  710. }
  711. // 发送验证码
  712. const sendCodeApi = () => {
  713. //参数说明
  714. let options = {
  715. type: 2, //type: 2,JSON格式提交数据(默认表单形式提交)
  716. data: {
  717. mobile: state.form.ownerTel
  718. }, //请求参数
  719. method: "POST", //提交方式(默认POST)
  720. showLoading: true, //是否显示加载中(默认显示)
  721. };
  722. //调用方式
  723. requestNew(sendMessage, options)
  724. .then((res) => {
  725. let data = res
  726. console.log(data, "#################");
  727. if (data.info == "成功") {
  728. msg("发送成功")
  729. console.log('######################CCCCCCCCCCCCCCCCC');
  730. }
  731. })
  732. .catch((err) => {
  733. console.log(err);
  734. });
  735. }
  736. const confirmReturn = (val) => {
  737. console.log("进来了")
  738. state.phoneType = 0
  739. state.isTakePhotoModeShow = false
  740. if(state.choiceIndex==1 || state.choiceIndex==2){
  741. var imageType=state.choiceIndex
  742. uploadFile(val.tempImagePath, imageType, idCardOcr).then((data) => {
  743. console.log("身份证上传", data)
  744. if(state.form.userType==1){
  745. // 个人
  746. if (state.choiceIndex == 1) {
  747. state.form.customerName = data.name;
  748. state.form.customerIdNum = data.idno;
  749. state.form.customerPosImgurl = data.imageUrl;
  750. } else {
  751. state.form.customerNegImgurl = data.imageUrl;
  752. }
  753. }else{
  754. // 单位
  755. if (state.choiceIndex == 1) {
  756. state.form.agentName = data.name;
  757. state.form.agentIdNum = data.idno;
  758. state.form.agentPosImgurl = data.imageUrl;
  759. } else {
  760. state.form.agentNegImgurl = data.imageUrl;
  761. }
  762. }
  763. state.isTakePhotoModeShow = false
  764. })
  765. }else{
  766. if (state.choiceIndex == 3) {
  767. var imageType = 1;
  768. } else {
  769. var imageType = 2;
  770. }
  771. uploadFile(val.tempImagePath, imageType, vehicleLicenseOcr).then((data) => {
  772. console.log('输出内容=====================', state.choiceIndex)
  773. if (state.choiceIndex == 3) {
  774. state.form.ownerName = data.man;
  775. state.form.ownerAddress = data.address;
  776. state.form.vehicleType = data.vehicle;
  777. state.form.vin = data.vin;
  778. state.form.engineNum = data.engine;
  779. state.form.vehPosImgUrl = data.imageUrl;
  780. state.form.vehPosImgOcrId = data.ocrResultId;
  781. state.form.issueDate = data.issue;
  782. state.form.useCharacter = data.character;
  783. state.form.registerDate = data.register;
  784. state.form.vehicleModel = data.model;
  785. } else {
  786. state.form.approvedCount = data.apc.slice(0,-1);
  787. state.form.maintenanceMass = data.unladen.slice(0,-2);
  788. let overall=data.overall.replaceAll("x", "X")
  789. state.form.outsideDimensions = overall.slice(0,-2);
  790. state.form.totalMass = data.gross ? data.gross.slice(0,-2) : 0;
  791. state.form.vehNegImgUrl = data.imageUrl;
  792. state.form.vehNegImgOcrId = data.ocrResultId;
  793. state.form.permittedTowWeight=data.towing.slice(0,-2)
  794. // 计算收费车型
  795. if(state.form.axleCount){
  796. calculateVehicleType(state.form.approvedCount,state.form.axleCount,state.form.outsideDimensions,state.form.totalMass,state.form.vanType, function (res) {
  797. state.form.vehicleTypeNew=res
  798. });
  799. }
  800. console.log('=====================', state.form.vehNegImgUrl, state)
  801. }
  802. state.isTakePhotoModeShow = false
  803. })
  804. }
  805. console.log("图片地址val", val.tempImagePath)
  806. }
  807. const camera = () => {
  808. state.phoneType = 0
  809. }
  810. const cancle = () => {
  811. state.isTakePhotoModeShow = false
  812. }
  813. const takePhoto = (val) => {
  814. console.log("拍照", val)
  815. state.phoneType = val;
  816. state.showImg = true;
  817. }
  818. const xiangce = (val) => {
  819. console.log("val", val)
  820. if (state.choiceIndex == 3) {
  821. var imageType = 1;
  822. } else {
  823. var imageType = 2;
  824. }
  825. chooseImageCompress((res) => {
  826. state.images = res.tempFilePath ? res.tempFilePath : res.tempFilePaths[0]
  827. state.showImg = false
  828. state.phoneType = state.choiceIndex
  829. state.isTakePhotoModeShow = false
  830. console.log("res==",res,state.choiceIndex,state.images)
  831. })
  832. }
  833. const radioChange = (evt) => {
  834. console.log("evt.detail.value", evt.detail.value)
  835. for (let i = 0; i < state.items.length; i++) {
  836. if (state.items[i].value == evt.detail.value) {
  837. state.form.isMyselfHandle = i+1;
  838. break;
  839. }
  840. }
  841. console.log("state.form.isMyselfHandle", state.form.isMyselfHandle)
  842. }
  843. const radioChangeqyc = (evt) => {
  844. console.log("evt.detail.value", evt.detail.value)
  845. for (let i = 0; i < state.itemsqyc.length; i++) {
  846. if (state.itemsqyc[i].value == evt.detail.value) {
  847. console.log("1",state.itemsqyc[i].value,evt.detail.value,state.itemsqyc[i].value == evt.detail.value,i)
  848. state.form.isTractor = state.itemsqyc[i].value;
  849. break;
  850. }
  851. }
  852. console.log("state.form.isTractor", state.form.isTractor)
  853. }
  854. const changeOwnerIdType = (item) => {
  855. state.form.ownerIdType = item[0].value
  856. state.form.ownerIdTypeStr = item[0].label
  857. console.log(item)
  858. }
  859. const changeCustomerIdType = (item) => {
  860. state.form.customerIdType = item[0].value
  861. state.form.customerIdTypeStr = item[0].label
  862. console.log(item)
  863. }
  864. const changeAgentIdType = (item) => {
  865. state.form.agentIdType = item[0].value
  866. state.form.agentIdTypeStr = item[0].label
  867. console.log(item)
  868. }
  869. const changeAxleCount=(e)=>{
  870. console.log("e",e)
  871. calculateVehicleType(state.form.approvedCount,e,state.form.outsideDimensions,state.form.totalMass,state.form.vanType, function (res) {
  872. state.form.vehicleTypeNew=res
  873. });
  874. }
  875. const vehicleCustomerTypeType = (item) => {
  876. state.form.vehicleCustomerType = item[0].value
  877. state.form.vehicleCustomerTypeName = item[0].label
  878. console.log(item)
  879. }
  880. </script>
  881. <style lang="scss" scoped>
  882. .bg {
  883. background-color: white;
  884. width: 90%;
  885. margin: 0 auto;
  886. margin-top: 20rpx;
  887. border-radius: 12px;
  888. border: 1px solid #FFFFFF;
  889. padding: 30rpx 20rpx;
  890. overflow: hidden;
  891. box-sizing: border-box;
  892. .title_wrap {
  893. display: flex;
  894. font-weight: 400;
  895. justify-content: space-between;
  896. .title {
  897. font-size: 30rpx;
  898. color: #01243A;
  899. }
  900. }
  901. .des {
  902. font-weight: 400;
  903. font-size: 28rpx;
  904. color: #01243A;
  905. line-height: 56rpx;
  906. margin-top: 10rpx;
  907. text-indent: 1rem;
  908. }
  909. }
  910. .action {
  911. position: absolute;
  912. left: 0;
  913. height: 160rpx;
  914. background-color: #fff;
  915. border-radius: 30rpx 30rpx 0 0;
  916. width: 100vw;
  917. display: flex;
  918. align-items: center;
  919. justify-content: center;
  920. flex-direction: column;
  921. margin-top: 20rpx;
  922. }
  923. .card{
  924. display: flex;
  925. align-items: center;
  926. image{
  927. width: 120rpx;
  928. height: 120rpx;
  929. margin-right: 20rpx;
  930. }
  931. .details view:first-child{
  932. margin-bottom: 10rpx;
  933. }
  934. }
  935. .picture-wrapper {
  936. margin-top: 30rpx;
  937. .bg1 {
  938. background: #F5F9FB;
  939. border-radius: 10rpx;
  940. padding: 40rpx 30rpx;
  941. display: flex;
  942. // align-items: center;
  943. justify-content: space-between;
  944. .name {
  945. padding-top: 30rpx;
  946. font-size: 32rpx;
  947. font-family: SourceHanSansSC, SourceHanSansSC;
  948. font-weight: 500;
  949. color: #111;
  950. line-height: 34rpx;
  951. }
  952. .value {
  953. margin-top: 20rpx;
  954. font-size: 22rpx;
  955. font-family: SourceHanSansSC, SourceHanSansSC;
  956. font-weight: 400;
  957. color: #999999;
  958. line-height: 24rpx;
  959. }
  960. .tip {
  961. margin-top: 20rpx;
  962. text-align: center;
  963. width: 100rpx;
  964. height: 30rpx;
  965. border-radius: 6rpx;
  966. border: 1rpx solid #CCB375;
  967. .tip-value {
  968. font-size: 20rpx;
  969. font-family: Microsoft YaHei;
  970. font-weight: 400;
  971. color: #CCB375;
  972. line-height: 30rpx;
  973. opacity: 1;
  974. }
  975. }
  976. }
  977. .icon {
  978. width: 304rpx;
  979. height: 190rpx;
  980. background-image: var(--bgimg);
  981. background-size: 100% 100%;
  982. background-repeat: no-repeat;
  983. }
  984. }
  985. .search{
  986. background: #F8F4E7;
  987. border-radius: 10rpx;
  988. border: 1px solid #CCB375;
  989. font-size: 24rpx;
  990. color: #CCB375;
  991. padding: 0rpx 14rpx;
  992. flex-shrink: 0;
  993. height: 60rpx;
  994. line-height: 60rpx;
  995. margin-left: 20rpx;
  996. }
  997. .showworld{
  998. display: flex;
  999. justify-content: flex-end;
  1000. }
  1001. .choice-takePhoto-wrap {
  1002. width: 100%;
  1003. height: 100vh;
  1004. background-color: rgba(127, 127, 127, 0.2);
  1005. position: fixed;
  1006. left: 0;
  1007. top: 0;
  1008. z-index: 11111;
  1009. .choice-takePhoto {
  1010. position: absolute;
  1011. bottom: 0;
  1012. background-color: white;
  1013. width: 100%;
  1014. border-radius: 20rpx 20rpx 0 0;
  1015. }
  1016. .choice-takePhoto>view:first-child {
  1017. text-align: center;
  1018. height: 80rpx;
  1019. line-height: 80rpx;
  1020. border-bottom: 1rpx solid rgba(127, 127, 127, 0.3);
  1021. background-color: white;
  1022. }
  1023. .choice-takePhoto>view:last-child {
  1024. text-align: center;
  1025. height: 80rpx;
  1026. line-height: 80rpx;
  1027. border-top: 6rpx solid rgba(127, 127, 127, 0.1);
  1028. background-color: white;
  1029. }
  1030. .choice-takePhoto>view {
  1031. text-align: center;
  1032. height: 80rpx;
  1033. line-height: 80rpx;
  1034. background-color: white;
  1035. }
  1036. }
  1037. .right-show{
  1038. display: flex;
  1039. justify-content: flex-end;
  1040. }
  1041. </style>