選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

transfer-page-sign.vue 11KB

4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. <template>
  2. <view class="content">
  3. <view><text>车牌号:</text><input placeholder="请输入车牌号" v-model="state.vehiclePlate"/></view>
  4. <view><text>车牌颜色:</text>
  5. <view style="width: 60%;">
  6. <uni-data-select style="width: 100%;" v-model="state.vehiclePlateColor" :localdata="state.colorRange" @change="changeColor"
  7. :clear="false"></uni-data-select>
  8. </view>
  9. </view>
  10. <view><text>身份证后四位:</text><input placeholder="请输入身份证后四位" v-model="state.idCard"/></view>
  11. <view><text>手机号码:</text><input placeholder="请输入手机号码" v-model="state.mobile"/></view>
  12. <view class="action">
  13. <button type="default" class="ui-btn" @click="query()">
  14. 查询
  15. </button>
  16. </view>
  17. </view>
  18. <view class="details" v-if="state.isDetails">
  19. <view><text>车牌号</text><text class="car">{{state.details['vehiclePlate']}}</text></view>
  20. <view><text>车牌颜色</text><text class="car">{{getVehiclePlateColor(state.details['vehiclePlateColor'])}}</text></view>
  21. <view><text>车主姓名</text><text class="car">{{state.details['ownerName']}}</text></view>
  22. <view v-if="state.details['handlerName']"><text>办理人</text><text class="car">{{state.details['handlerName']}}</text></view>
  23. <view><text>产品名称</text><text class="car">{{state.details['productName']}}</text></view>
  24. <view><text>权益说明</text><text class="car">{{state.details['rightsDesc']}}</text></view>
  25. <view><text>产品金额</text><text class="car">¥{{state.details['productAmount']*0.01}}</text></view>
  26. <view><text>应付金额</text><text class="car">¥{{state.details['productAmount']*0.01}}</text></view>
  27. <view class="noborder other-free">无其他费用</view>
  28. <view class="noborder yansghi">
  29. <checkbox-group @change="checkboxChange">
  30. <checkbox :checked="state.checked" style="transform: scale(0.65)" />
  31. <text class='txt'>我已阅读并同意</text>
  32. </checkbox-group>
  33. <text v-for="(item,index) in state.agreeURL" class="txt xieyi" @click="downAuthD(item)">《{{item.name}}》</text>
  34. </view>
  35. <view class="action" style="margin-bottom: 30rpx;">
  36. <button type="default" class="ui-btn" @click="savaHandle()" v-if="state.isSign">
  37. {{state.words}}
  38. </button>
  39. <button type="default" class="ui-btn" @click="sign()" v-else>
  40. 去签署协议
  41. </button>
  42. </view>
  43. </view>
  44. </template>
  45. <script setup lang="ts">
  46. import { reactive } from "vue";
  47. import { onLoad,onShow } from "@dcloudio/uni-app";
  48. import {
  49. navTo,hasLogin
  50. } from "@/utils/utils"
  51. import {agreementInSertOrder,contractQuery,orderQuery,accountSign,agreeOrderProdcut,envs} from "@/utils/network/api.js";
  52. import {
  53. getItem,
  54. StorageKeys,
  55. setItem
  56. } from "@/utils/storage";
  57. import {requestNew} from "@/utils/network/request.js";
  58. import { msg } from "@/utils/utils";
  59. import { vehiclePlateColorPai } from "@/datas/vehiclePlateColor.js";
  60. import {
  61. getVehiclePlateColor
  62. } from "@/datas/vehiclePlateColor";
  63. import {
  64. OrderStatus
  65. } from "@/datas/enum";
  66. import useOrderSkip from "@/composables/order/useOrderSkip";
  67. const { gotoActiveOrder} = useOrderSkip();
  68. const state = reactive({
  69. checked:false,
  70. agreeURL: [],
  71. agreements:[],
  72. isSign:false,
  73. colorRange:[],
  74. idCard:"",
  75. mobile:"",
  76. vehiclePlate:"",
  77. vehiclePlateColor:"",
  78. details:{},
  79. isDetails:false,
  80. orderId:"",
  81. words:""
  82. });
  83. onShow(()=>{
  84. if(state.orderId){
  85. contractRequest()
  86. }
  87. })
  88. onLoad(() => {
  89. let getColor = getItem('key')['VEHICLE_COLOR_TYPE'];
  90. for (var k = 0; k < getColor.length; k++) {
  91. let obj = {};
  92. obj['value'] = getColor[k]['code']
  93. obj['text'] = getColor[k]['name']
  94. state.colorRange.push(obj)
  95. }
  96. // 没登录情况
  97. if (!hasLogin()) {
  98. navTo( `/login/login?back=1`)
  99. }else{
  100. }
  101. })
  102. const query=()=>{
  103. if(!state.vehiclePlate){
  104. msg('请输入车牌号')
  105. return;
  106. }
  107. if(!state.vehiclePlateColor){
  108. msg('请选择车牌颜色')
  109. return;
  110. }
  111. if(!state.idCard){
  112. msg('请输入身份证后四位')
  113. return;
  114. }
  115. if(!state.mobile){
  116. msg('请输入手机号码')
  117. return;
  118. }
  119. const options = {
  120. type: 2,
  121. data: {
  122. vehiclePlate: state.vehiclePlate,
  123. vehiclePlateColor: state.vehiclePlateColor,
  124. idCard: state.idCard,
  125. mobile: state.mobile,
  126. },
  127. method: "POST",
  128. showLoading: true,
  129. };
  130. requestNew(orderQuery, options).then((res) => {
  131. console.log("擦寻",res)
  132. state.details=res
  133. setItem('orderQueryActivate',res)
  134. state.isDetails=true
  135. state.orderId=res.orderNo
  136. queryAgreement()
  137. })
  138. }
  139. const getWrlds=()=>{
  140. if(state.details['orderStatus']!= OrderStatus.已取消){
  141. // 去支付
  142. if(state.details['orderStep']==OrderStatus['完成车辆信息上传/待支付'] || state.details['orderStep']==OrderStatus['待支付2']){
  143. state.words="去支付"
  144. }else if(state.details['orderStep'] == OrderStatus['已支付/待签约']){
  145. // 去签约
  146. state.words="去签约"
  147. }else if(state.details['orderStep'] == OrderStatus['待激活']){
  148. // 待激活
  149. state.words="去激活"
  150. }
  151. }
  152. }
  153. const savaHandle=()=>{
  154. if (state.checked) {
  155. if(state.details['orderStatus']!= OrderStatus.已取消){
  156. // 去支付
  157. if(state.details['orderStep']==OrderStatus['完成车辆信息上传/待支付'] || state.details['orderStep']==OrderStatus['待支付2']){
  158. agreementConfirm().then((value) => {
  159. console.log("协议确认", value)
  160. let vehicleId=state.details['vehiclePlate']+"_"+state.details['vehiclePlateColor']
  161. let isValueCard=1
  162. // qtSign 有数据 去签约
  163. if(state.details['qtSign']==0 || state.details['qtSign']==1){
  164. isValueCard=2
  165. }else{
  166. isValueCard=1
  167. }
  168. // orderQuery 1 订单查询 0正常订单
  169. navTo(`/subpackage/orders/order_payment?orderId=${state.orderId}&&isValueCard=${isValueCard}&vehicleId=${vehicleId}&orderQuery=1`);
  170. })
  171. }else if(state.details['orderStep'] == OrderStatus['已支付/待签约']){
  172. // 去签约
  173. navTo(`/subpackage/orders/release-products?orderId=${state.orderId}`);
  174. }else if(state.details['orderStep'] == OrderStatus['待激活']){
  175. // 待激活
  176. gotoActiveOrder(state.details)
  177. }
  178. }
  179. } else {
  180. msg("请勾选协议");
  181. }
  182. }
  183. // 协议确认接口
  184. const agreementConfirm = () => {
  185. const options = {
  186. type: 2,
  187. data: {
  188. orderId: state.orderId,
  189. protocol: state.checked ? 1 : 0,
  190. agreements: state.agreements
  191. },
  192. method: "POST",
  193. showLoading: true,
  194. };
  195. return new Promise(async (resolve, reject) => {
  196. const res = await requestNew(agreeOrderProdcut, options);
  197. const data = res;
  198. console.log("确认协议", data)
  199. resolve(data);
  200. }).catch((error) => {
  201. reject(error);
  202. });
  203. };
  204. const checkboxChange = (e) => {
  205. state.checked = !state.checked;
  206. console.log(state.checked);
  207. };
  208. // 查协议
  209. const queryAgreement = () => {
  210. const options = {
  211. type: 2,
  212. data: {
  213. orderId: state.orderId, //订单编号
  214. status: 1
  215. },
  216. method: "POST",
  217. showLoading: true,
  218. };
  219. requestNew(agreementInSertOrder, options).then((res) => {
  220. let data = res;
  221. let supAgreeArr = data.data
  222. // 每次点击先清空
  223. state.agreeURL=[]
  224. console.log("data==", supAgreeArr)
  225. for (var m = 0; m < supAgreeArr.length; m++) {
  226. let obj = {}
  227. obj['name'] = supAgreeArr[m]['name']
  228. for (var k = 0; k < supAgreeArr[m]['address'].length; k++) {
  229. state.agreements.push(supAgreeArr[m]['address'][k]['id'])
  230. obj['url'] = envs[process.env.NODE_ENV].baseUrl + supAgreeArr[m]['address'][k]['url']
  231. state.agreeURL.push(obj)
  232. }
  233. }
  234. contractRequest()
  235. console.log("查协议", state.agreeURL)
  236. });
  237. }
  238. const downAuthD = (item) => {
  239. console.log('=======123', item)
  240. console.log("uni.env.USER_DATA_PATH '", uni.env.USER_DATA_PATH + '/' + '产品协议.docx')
  241. // 文件后缀截取
  242. var index = item.url.lastIndexOf("\.");
  243. let fileType = item.url.substring(index + 1, item.url.length);
  244. console.log("fileType", fileType)
  245. uni.downloadFile({
  246. url: item.url,
  247. filePath: uni.env.USER_DATA_PATH + '/' + item.name + '.' + fileType,
  248. success(res) {
  249. const filePath = res.filePath
  250. console.log("filePath", filePath)
  251. uni.openDocument({
  252. filePath: filePath,
  253. fileType: fileType,
  254. showMenu: true, //关键点
  255. success: function (res) {
  256. },
  257. fail: function (err) {
  258. msg("打开文档失败");
  259. }
  260. });
  261. },
  262. fail: function (err) {
  263. msg("下载文档失败");
  264. console.log("err", err)
  265. },
  266. complete(res) {
  267. }
  268. })
  269. }
  270. // 查询是否签署协议
  271. const contractRequest=()=>{
  272. const options = {
  273. type: 2,
  274. data: {
  275. orderId: state.orderId, //订单编号
  276. },
  277. method: "POST",
  278. showLoading: true,
  279. };
  280. requestNew(contractQuery, options).then((res) => {
  281. if(res.contractState==1){
  282. state.isSign=true
  283. // 协议签署了复选框选上
  284. state.checked=true
  285. }else{
  286. state.isSign=false
  287. state.checked=false
  288. }
  289. getWrlds()
  290. console.log("查询是否签署协议", res)
  291. });
  292. }
  293. // 去签署协议
  294. const sign=()=>{
  295. const options = {
  296. type: 2,
  297. data: {
  298. orderId: state.orderId, //订单编号
  299. },
  300. method: "POST",
  301. showLoading: true,
  302. };
  303. requestNew(accountSign, options).then((res) => {
  304. navTo(`/subpackage/orders/webView?url=${res.shortUrl}`)
  305. console.log("去签署协议", res.shortUrl)
  306. });
  307. }
  308. const changeColor = (e) => {
  309. state.vehiclePlateColor = e
  310. console.log(e)
  311. }
  312. </script>
  313. <style scoped lang="scss">
  314. .content{
  315. font-size: 30rpx;
  316. background-color: white;
  317. box-sizing: border-box;
  318. padding: 20rpx 30rpx 40rpx 30rpx;
  319. view{
  320. display: flex;
  321. margin-bottom: 4rpx;
  322. align-items: center;
  323. height: 76rpx;
  324. text{
  325. width: 22%;
  326. }
  327. input{
  328. border:1rpx solid #ccc ;
  329. margin-left: 20rpx;
  330. padding: 6rpx 10rpx;
  331. width: 60%;
  332. border-radius: 5rpx;
  333. box-sizing: border-box;
  334. height: 60rpx;
  335. }
  336. }
  337. }
  338. .details{
  339. font-size: 30rpx;
  340. background-color: white;
  341. box-sizing: border-box;
  342. padding: 20rpx 30rpx;
  343. margin-top: 30rpx;
  344. view{
  345. border-bottom: 1rpx solid #ccc;
  346. height: 62rpx;
  347. line-height: 62rpx;
  348. display: flex;
  349. justify-content: space-between;
  350. .car{
  351. font-weight: bold;
  352. }
  353. }
  354. .noborder{
  355. border-bottom: none;
  356. }
  357. .other-free{
  358. display: flex;
  359. justify-content: flex-end;
  360. }
  361. .sure{
  362. margin: 30rpx 0;
  363. }
  364. }
  365. .action{
  366. margin-top: 30rpx;
  367. }
  368. ::v-deep .uni-select{
  369. margin-left: 20rpx;
  370. box-sizing: border-box !important;
  371. padding-left: 10rpx !important;
  372. border:1rpx solid #ccc ;
  373. height: 56rpx;
  374. }
  375. ::v-deep .uni-select__input-text{
  376. font-size: 30rpx !important;
  377. }
  378. .yansghi{
  379. height: auto !important;
  380. line-height: normal !important;
  381. display: flex !important;
  382. justify-content: flex-start !important;
  383. flex-shrink: 1 !important;
  384. flex-wrap: wrap !important;
  385. align-items: center !important;
  386. }
  387. </style>