Commit 70490f929f20967ec8065c3f23daef2834199270
1 parent
34f76d71
趟次功能,优化扫码
Showing
17 changed files
with
449 additions
and
329 deletions
garbage-removal/.env.production
garbage-removal/dist1.zip
0 → 100644
No preview for this file type
garbage-removal/package-lock.json
| ... | ... | @@ -9,7 +9,7 @@ |
| 9 | 9 | "version": "0.0.0", |
| 10 | 10 | "dependencies": { |
| 11 | 11 | "@dcloudio/uni-app": "3.0.0-3090620231104002", |
| 12 | - "@dcloudio/uni-app-plus": "3.0.0-3090620231104002", | |
| 12 | + "@dcloudio/uni-app-plus": "^3.0.0-3090620231104002", | |
| 13 | 13 | "@dcloudio/uni-components": "3.0.0-3090620231104002", |
| 14 | 14 | "@dcloudio/uni-h5": "3.0.0-3090620231104002", |
| 15 | 15 | "@dcloudio/uni-mp-alipay": "3.0.0-3090620231104002", |
| ... | ... | @@ -1887,7 +1887,6 @@ |
| 1887 | 1887 | "version": "3.0.0-3090620231104002", |
| 1888 | 1888 | "resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-plus/-/uni-app-plus-3.0.0-3090620231104002.tgz", |
| 1889 | 1889 | "integrity": "sha512-L4+OgMQYKP6R7TXFBl0OiYKa0Ys/X9TbDHERFOe0IFYeuDCLbXpWU3k8zRCTOAmtRVNAulBIaet++YpxkpR/pw==", |
| 1890 | - "license": "Apache-2.0", | |
| 1891 | 1890 | "dependencies": { |
| 1892 | 1891 | "@dcloudio/uni-app-uts": "3.0.0-3090620231104002", |
| 1893 | 1892 | "@dcloudio/uni-app-vite": "3.0.0-3090620231104002", | ... | ... |
garbage-removal/package.json
| ... | ... | @@ -41,7 +41,7 @@ |
| 41 | 41 | }, |
| 42 | 42 | "dependencies": { |
| 43 | 43 | "@dcloudio/uni-app": "3.0.0-3090620231104002", |
| 44 | - "@dcloudio/uni-app-plus": "3.0.0-3090620231104002", | |
| 44 | + "@dcloudio/uni-app-plus": "^3.0.0-3090620231104002", | |
| 45 | 45 | "@dcloudio/uni-components": "3.0.0-3090620231104002", |
| 46 | 46 | "@dcloudio/uni-h5": "3.0.0-3090620231104002", |
| 47 | 47 | "@dcloudio/uni-mp-alipay": "3.0.0-3090620231104002", | ... | ... |
garbage-removal/src/components/QrScanner/QrScanner.vue
| ... | ... | @@ -96,12 +96,16 @@ defineExpose({ qrcodeData }) |
| 96 | 96 | border-radius: 50%; |
| 97 | 97 | background-color: #fff; |
| 98 | 98 | color: #000; |
| 99 | - text-align: left; | |
| 99 | + text-align: center; | |
| 100 | 100 | line-height: 30px; |
| 101 | - font-size: 20px; | |
| 101 | + font-size: 25px; | |
| 102 | 102 | cursor: pointer; |
| 103 | 103 | z-index: 1000000; |
| 104 | 104 | } |
| 105 | + .close-view span{ | |
| 106 | + position: absolute; | |
| 107 | + left: 7px; | |
| 108 | + } | |
| 105 | 109 | } |
| 106 | 110 | |
| 107 | 111 | .qr-scanner { | ... | ... |
garbage-removal/src/components/clash-disposal-dispatch/index.vue
| ... | ... | @@ -43,14 +43,16 @@ function getTitle(checked) { |
| 43 | 43 | function changeVerify(current, chooseList) { |
| 44 | 44 | // 注意:返回非空字符串会阻止原有行为,并提示返回的字符串 |
| 45 | 45 | // 如果函数体不做return返回值,即验证通过,控件正常处理业务 |
| 46 | - // 限制条件 | |
| 47 | - if (chooseList) { | |
| 46 | + // 限制条件 只能选择一个处置场所 | |
| 47 | + if (chooseList && chooseList.length<2) { | |
| 48 | 48 | for (let index = 0; index < chooseList.length; index++) { |
| 49 | 49 | const element = chooseList[index]; |
| 50 | 50 | if (current.id.indexOf(element.id) === -1 && element.label.indexOf(current.label) != -1) { |
| 51 | 51 | return "该处置场所负责人已经被选中了" |
| 52 | 52 | } |
| 53 | 53 | } |
| 54 | + }else{ | |
| 55 | + return "只能选择一个处置场所" | |
| 54 | 56 | } |
| 55 | 57 | } |
| 56 | 58 | function open(dataList) { | ... | ... |
garbage-removal/src/pages/home-info/clean/index.vue
| ... | ... | @@ -115,7 +115,7 @@ |
| 115 | 115 | </view> |
| 116 | 116 | <view class="company-clean-container-site-image-info"> |
| 117 | 117 | <view class="company-clean-container-site-image-info-remark"> |
| 118 | - <text style="color: red;">*</text>请上传垃圾量照片(至少1张,最多5张),照片须看清全貌。 | |
| 118 | + <text style="color: red;" @click="openPhone">*测试</text>请上传垃圾量照片(至少1张,最多5张),照片须看清全貌。 | |
| 119 | 119 | </view> |
| 120 | 120 | <view class="company-clean-container-site-image-info-img"> |
| 121 | 121 | <u-upload width="200" height="150" :fileList="fileList" @afterRead="afterRead" :deletable="deletable" |
| ... | ... | @@ -237,6 +237,17 @@ const handleTimeChoose = () => { |
| 237 | 237 | chooseTime.value.open(); |
| 238 | 238 | } |
| 239 | 239 | |
| 240 | +const openPhone = () => { | |
| 241 | + alert("网页调试---->>> 拍照点击事件 调用安卓层功能 "); | |
| 242 | + window.JsInterface.takePhone(); | |
| 243 | +} | |
| 244 | + | |
| 245 | +const takePhoneCallBack = (path) => { | |
| 246 | + //如果用户不授予权限 或者没有权限 获取拍照之后没确定 不会过这里 | |
| 247 | + //最好也是判断 path 非空的时候 去处理逻辑 | |
| 248 | + alert("网页调试---->>> 拍照后回调 路径=" + path); | |
| 249 | + } | |
| 250 | + | |
| 240 | 251 | const changeTime = (e) => { |
| 241 | 252 | dayTime.value = e.value |
| 242 | 253 | ... | ... |
garbage-removal/src/pages/login/code.vue
| ... | ... | @@ -76,6 +76,7 @@ const checkVerifyNum = (code) => { |
| 76 | 76 | verifyFlag.value = false; |
| 77 | 77 | store.tempToken = res.data.data.token |
| 78 | 78 | store.userName = res.data.data.name; |
| 79 | + store.userPhone = res.data.data.loginPhone; | |
| 79 | 80 | if(res.data.data.testUser){ |
| 80 | 81 | uni.navigateTo({ |
| 81 | 82 | url: `/pages/wode-info/wode-info-choose/index?ruleVos= ${encodeURIComponent(JSON.stringify(res.data.data.ruleVos))}&userName=${encodeURIComponent(res.data.data.name)}` | ... | ... |
garbage-removal/src/pages/order-info/order-disposal/scan-detail/index.vue
| 1 | 1 | <template> |
| 2 | - <view class="scan-detail-container"> | |
| 3 | - <view class="scan-detail-box"> | |
| 4 | - <view class="scan-time"> | |
| 5 | - <view class="scan-label"> | |
| 6 | - 分发时间: | |
| 7 | - </view> | |
| 8 | - <view class="scan-time"> | |
| 9 | - {{ details.garCreateTime }} | |
| 10 | - </view> | |
| 11 | - | |
| 12 | - </view> | |
| 13 | - <view class="scan-time"> | |
| 14 | - <view class="scan-label"> | |
| 15 | - 司机姓名: | |
| 16 | - </view> | |
| 17 | - <view class="scan-time"> | |
| 18 | - {{ details.garOrderHandlerName }} | |
| 19 | - </view> | |
| 20 | - </view> | |
| 21 | - <view class="scan-time"> | |
| 22 | - <view class="scan-label"> | |
| 23 | - 司机电话: | |
| 24 | - </view> | |
| 25 | - <view class="scan-time" style="color: #000000"> | |
| 26 | - {{ details.garOrderHandlerTel }} | |
| 27 | - </view> | |
| 28 | - </view> | |
| 29 | - <view class="scan-time"> | |
| 30 | - <view class="scan-label"> | |
| 31 | - 所属公司: | |
| 32 | - </view> | |
| 33 | - <view class="scan-time"> | |
| 34 | - {{ details.garOrderCompanyName }} | |
| 35 | - </view> | |
| 36 | - </view> | |
| 37 | - </view> | |
| 38 | - <view class="scan-submit-info"> | |
| 39 | - <view class="scan-submit-title-box"> | |
| 40 | - <up-badge :isDot="true" type="success"></up-badge><text>提交信息</text> | |
| 41 | - </view> | |
| 42 | - <view class="scan-car-num"> | |
| 43 | - <view class="scan-car-num-label"> | |
| 44 | - 车牌号 | |
| 45 | - </view> | |
| 46 | - <view class="scan-car-num-content"> | |
| 47 | - {{ details.garHandlerCarCode }} | |
| 48 | - </view> | |
| 49 | - </view> | |
| 50 | - <view class="scan-car-num"> | |
| 51 | - <view class="scan-car-num-label"> | |
| 52 | - 车辆载重 | |
| 53 | - </view> | |
| 54 | - <view class="scan-car-num-content"> | |
| 55 | - <up-input :disabled="!isDeletable" placeholder="请输入数字,单位吨" border="surround" | |
| 56 | - v-model="details.garCarryingWeight" @change="handlerInputChange"></up-input> | |
| 57 | - </view> | |
| 58 | - </view> | |
| 59 | - <view class="scan-car-num"> | |
| 60 | - <view class="scan-car-num-label"> | |
| 61 | - 接收量 | |
| 62 | - </view> | |
| 63 | - <view class="scan-car-num-content"> | |
| 64 | - <up-input :disabled="!isDeletable" placeholder="请输入数字" border="surround" | |
| 65 | - v-model="details.garReceptionQuantity" @change="handlerInputChange"></up-input> | |
| 66 | - </view> | |
| 67 | - </view> | |
| 68 | - <view class="scan-upload-fill-image-box"> | |
| 69 | - <view class="scan-upload-fill-image-label"> | |
| 70 | - <view> | |
| 71 | - 全景照片 | |
| 72 | - </view> | |
| 73 | - <view v-if="isDeletable"> | |
| 74 | - {{ fileList.length }}/{{ maxCount }} | |
| 75 | - </view> | |
| 76 | - </view> | |
| 77 | - <view class="scan-upload-fill-image-btn" v-if="maxCount"> | |
| 78 | - <u-upload width="200" height="150" :deletable="isDeletable" :fileList="fileList" @afterRead="afterRead" | |
| 79 | - @delete="deletePic" name="3" multiple :maxCount="maxCount" :previewFullImage="true"></u-upload> | |
| 80 | - </view> | |
| 81 | - </view> | |
| 82 | - </view> | |
| 83 | - <view class="scan-submit-button-box" v-if="isNew"> | |
| 84 | - <view class="scan-submit-button-btn"> | |
| 85 | - <u-button type="primary" @tap="handlerSubmit" text="确认"></u-button> | |
| 86 | - </view> | |
| 87 | - </view> | |
| 88 | - </view> | |
| 2 | + <view class="scan-detail-container"> | |
| 3 | + <view class="scan-detail-box"> | |
| 4 | + <view class="scan-time"> | |
| 5 | + <view class="scan-label"> | |
| 6 | + 分发时间: | |
| 7 | + </view> | |
| 8 | + <view class="scan-time"> | |
| 9 | + {{ details.garCreateTime }} | |
| 10 | + </view> | |
| 11 | + | |
| 12 | + </view> | |
| 13 | + <view class="scan-time"> | |
| 14 | + <view class="scan-label"> | |
| 15 | + 司机姓名: | |
| 16 | + </view> | |
| 17 | + <view class="scan-time"> | |
| 18 | + {{ details.garOrderHandlerName }} | |
| 19 | + </view> | |
| 20 | + </view> | |
| 21 | + <view class="scan-time"> | |
| 22 | + <view class="scan-label"> | |
| 23 | + 司机电话: | |
| 24 | + </view> | |
| 25 | + <view class="scan-time" style="color: #000000"> | |
| 26 | + {{ details.garOrderHandlerTel }} | |
| 27 | + </view> | |
| 28 | + </view> | |
| 29 | + <view class="scan-time"> | |
| 30 | + <view class="scan-label"> | |
| 31 | + 所属公司: | |
| 32 | + </view> | |
| 33 | + <view class="scan-time"> | |
| 34 | + {{ details.garOrderCompanyName }} | |
| 35 | + </view> | |
| 36 | + </view> | |
| 37 | + </view> | |
| 38 | + <view class="scan-submit-info"> | |
| 39 | + <view class="scan-submit-title-box"> | |
| 40 | + <up-badge :isDot="true" type="success"></up-badge><text>提交信息</text> | |
| 41 | + </view> | |
| 42 | + <view class="scan-car-num"> | |
| 43 | + <view class="scan-car-num-label"> | |
| 44 | + 车牌号 | |
| 45 | + </view> | |
| 46 | + <view class="scan-car-num-content"> | |
| 47 | + {{ details.garHandlerCarCode }} | |
| 48 | + </view> | |
| 49 | + </view> | |
| 50 | + <view class="scan-car-num"> | |
| 51 | + <view class="scan-car-num-label"> | |
| 52 | + 车辆载重 | |
| 53 | + </view> | |
| 54 | + <view class="scan-car-num-content"> | |
| 55 | + <up-input :disabled="!isDeletable" placeholder="请输入数字,单位吨" border="surround" | |
| 56 | + v-model="details.garCarryingWeight" @change="handlerInputChange"></up-input> | |
| 57 | + </view> | |
| 58 | + </view> | |
| 59 | + <view class="scan-car-num"> | |
| 60 | + <view class="scan-car-num-label"> | |
| 61 | + 接收量 | |
| 62 | + </view> | |
| 63 | + <view class="scan-car-num-content"> | |
| 64 | + <up-input :disabled="!isDeletable" placeholder="请输入数字" border="surround" | |
| 65 | + v-model="details.garReceptionQuantity" @change="handlerInputChange"></up-input> | |
| 66 | + </view> | |
| 67 | + </view> | |
| 68 | + <view class="scan-upload-fill-image-box"> | |
| 69 | + <view class="scan-upload-fill-image-label"> | |
| 70 | + <view> | |
| 71 | + 全景照片 | |
| 72 | + </view> | |
| 73 | + <view v-if="isDeletable"> | |
| 74 | + {{ fileList.length }}/{{ maxCount }} | |
| 75 | + </view> | |
| 76 | + </view> | |
| 77 | + <view class="scan-upload-fill-image-btn" v-if="maxCount"> | |
| 78 | + <u-upload width="200" height="150" :deletable="isDeletable" :fileList="fileList" | |
| 79 | + @afterRead="afterRead" @delete="deletePic" name="3" multiple :maxCount="maxCount" | |
| 80 | + :previewFullImage="true"></u-upload> | |
| 81 | + </view> | |
| 82 | + </view> | |
| 83 | + </view> | |
| 84 | + <view class="scan-submit-button-box" v-if="isNew"> | |
| 85 | + <view class="scan-submit-button-btn"> | |
| 86 | + <u-button type="primary" @tap="handlerSubmit" text="确认"></u-button> | |
| 87 | + </view> | |
| 88 | + </view> | |
| 89 | + </view> | |
| 89 | 90 | </template> |
| 90 | 91 | |
| 91 | 92 | <script setup> |
| 92 | -import { uploadFilePromise } from '@/apis/common.js'; | |
| 93 | -import { askTransport, scanDetail } from '@/apis/order.js'; | |
| 94 | -import { onLoad } from '@dcloudio/uni-app'; | |
| 95 | -import { computed, ref } from 'vue'; | |
| 96 | -const details = ref({}); | |
| 97 | -const fileList = ref([]); | |
| 98 | -const isDeletable = ref(false); | |
| 99 | -const maxCount = computed(() => isDeletable.value ? 3 : fileList.value.length); | |
| 100 | -// 删除图片 | |
| 101 | -const deletePic = (event) => { | |
| 102 | - fileList.value.splice(event.index, 1); | |
| 103 | -}; | |
| 93 | + import { | |
| 94 | + uploadFilePromise | |
| 95 | + } from '@/apis/common.js'; | |
| 96 | + import { | |
| 97 | + askTransport, | |
| 98 | + scanDetail | |
| 99 | + } from '@/apis/order.js'; | |
| 100 | + import { | |
| 101 | + onLoad | |
| 102 | + } from '@dcloudio/uni-app'; | |
| 103 | + import { | |
| 104 | + computed, | |
| 105 | + ref | |
| 106 | + } from 'vue'; | |
| 107 | + const details = ref({}); | |
| 108 | + const fileList = ref([]); | |
| 109 | + const isDeletable = ref(false); | |
| 110 | + const maxCount = computed(() => isDeletable.value ? 3 : fileList.value.length); | |
| 111 | + // 删除图片 | |
| 112 | + const deletePic = (event) => { | |
| 113 | + fileList.value.splice(event.index, 1); | |
| 114 | + }; | |
| 104 | 115 | |
| 105 | -const isNew = ref(false) | |
| 106 | -// 新增图片 | |
| 107 | -const afterRead = async (event) => { | |
| 108 | - // 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式 | |
| 109 | - let lists = [].concat(event.file); | |
| 110 | - let fileListLen = fileList.value.length; | |
| 111 | - lists.map((item) => { | |
| 112 | - fileList.value.push({ | |
| 113 | - ...item, | |
| 114 | - status: 'uploading', | |
| 115 | - message: '上传中', | |
| 116 | - }); | |
| 117 | - }); | |
| 118 | - for (let i = 0; i < lists.length; i++) { | |
| 119 | - let requestPath = import.meta.env.VITE_BASE_URL + import.meta.env.VITE_BASE_FILE_UPLOAD_PREFIX; | |
| 120 | - const result = await uploadFilePromise(requestPath, lists[i].url); | |
| 121 | - let item = fileList.value[fileListLen]; | |
| 122 | - fileList.value.splice(fileListLen, 1, { | |
| 123 | - ...item, | |
| 124 | - status: 'success', | |
| 125 | - message: '', | |
| 126 | - url: result.data.fileName, | |
| 127 | - }); | |
| 128 | - fileListLen++; | |
| 129 | - } | |
| 130 | -}; | |
| 131 | -const handlerInputChange = (val) => { | |
| 132 | - console.log(val); | |
| 133 | -} | |
| 134 | -const handlerSubmit = async () => { | |
| 135 | - // 校验参数 | |
| 136 | - let params = { | |
| 137 | - ...details.value, | |
| 138 | - fillImageList: fileList.value.map((item) => item.url), | |
| 139 | - garOrderHandlerCompanyName: details.value.garOrderCompanyName, | |
| 140 | - garOrderHandlerCompanyId: details.value.garOrderCompanyId | |
| 141 | - } | |
| 142 | - if (validateParams(params)) { | |
| 143 | - await askTransport(params).then((res) => { | |
| 144 | - console.log(res); | |
| 145 | - if (res.data.code == 200) { | |
| 146 | - uni.$u.toast("当前趟次记录完毕!") | |
| 147 | - } | |
| 148 | - }).catch((err) => { | |
| 149 | - uni.$u.toast("当前趟次记录失败") | |
| 150 | - }) | |
| 151 | - // 返回上级 | |
| 152 | - uni.navigateBack({ | |
| 153 | - delta: 1 | |
| 154 | - }); | |
| 155 | - } | |
| 156 | -} | |
| 116 | + const isNew = ref(false) | |
| 117 | + // 新增图片 | |
| 118 | + const afterRead = async (event) => { | |
| 119 | + // 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式 | |
| 120 | + let lists = [].concat(event.file); | |
| 121 | + let fileListLen = fileList.value.length; | |
| 122 | + lists.map((item) => { | |
| 123 | + fileList.value.push({ | |
| 124 | + ...item, | |
| 125 | + status: 'uploading', | |
| 126 | + message: '上传中', | |
| 127 | + }); | |
| 128 | + }); | |
| 129 | + for (let i = 0; i < lists.length; i++) { | |
| 130 | + let requestPath = import.meta.env.VITE_BASE_URL + import.meta.env.VITE_BASE_FILE_UPLOAD_PREFIX; | |
| 131 | + const result = await uploadFilePromise(requestPath, lists[i].url); | |
| 132 | + let item = fileList.value[fileListLen]; | |
| 133 | + fileList.value.splice(fileListLen, 1, { | |
| 134 | + ...item, | |
| 135 | + status: 'success', | |
| 136 | + message: '', | |
| 137 | + url: result.data.fileName, | |
| 138 | + }); | |
| 139 | + fileListLen++; | |
| 140 | + } | |
| 141 | + }; | |
| 142 | + const handlerInputChange = (val) => { | |
| 143 | + console.log(val); | |
| 144 | + } | |
| 145 | + const handlerSubmit = async () => { | |
| 146 | + try { | |
| 147 | + // 获取定位信息 | |
| 148 | + const location = await new Promise((resolve, reject) => { | |
| 149 | + uni.getLocation({ | |
| 150 | + type: 'wgs84', | |
| 151 | + success: resolve, | |
| 152 | + fail: reject | |
| 153 | + }); | |
| 154 | + }); | |
| 155 | + // 校验参数 | |
| 156 | + let params = { | |
| 157 | + ...details.value, | |
| 158 | + fillImageList: fileList.value.map((item) => item.url), | |
| 159 | + garOrderHandlerCompanyName: details.value.garOrderCompanyName, | |
| 160 | + garOrderHandlerCompanyId: details.value.garOrderCompanyId, | |
| 161 | + // 添加定位信息 | |
| 162 | + latitude: location.latitude, | |
| 163 | + longitude: location.longitude | |
| 164 | + } | |
| 165 | + if (validateParams(params)) { | |
| 166 | + await askTransport(params).then((res) => { | |
| 167 | + console.log(res); | |
| 168 | + if (res.data.code == 200) { | |
| 169 | + uni.$u.toast("当前趟次记录完毕!") | |
| 170 | + } | |
| 171 | + }).catch((err) => { | |
| 172 | + uni.$u.toast("当前趟次记录失败") | |
| 173 | + }) | |
| 174 | + // 返回上级 | |
| 175 | + uni.navigateBack({ | |
| 176 | + delta: 1 | |
| 177 | + }); | |
| 178 | + } | |
| 179 | + } catch (error) { | |
| 180 | + console.error('定位获取失败:', error); | |
| 181 | + uni.$u.toast("需要位置权限才能提交"); | |
| 182 | + // 可选:引导用户打开设置 | |
| 183 | + uni.openSetting({ | |
| 184 | + success(res) { | |
| 185 | + console.log('授权设置:', res.authSetting); | |
| 186 | + } | |
| 187 | + }); | |
| 188 | + } | |
| 189 | + } | |
| 157 | 190 | |
| 158 | -const validateParams = (params) => { | |
| 159 | - if (!params.garOrderHandlerName) { | |
| 160 | - uni.$u.toast("请输入处理人姓名"); | |
| 161 | - return false; | |
| 162 | - } | |
| 163 | - if (!params.garOrderHandlerTel) { | |
| 164 | - uni.$u.toast("请输入处理人电话"); | |
| 165 | - return false; | |
| 166 | - } | |
| 167 | - if (!params.garOrderCompanyName) { | |
| 168 | - uni.$u.toast("请输入处理人单位"); | |
| 169 | - return false; | |
| 170 | - } | |
| 171 | - if (!params.garReceptionQuantity) { | |
| 172 | - uni.$u.toast("请输入接收量"); | |
| 173 | - return false; | |
| 174 | - } | |
| 175 | - if (!validateImage(params.fillImageList)) { | |
| 176 | - return false; | |
| 177 | - } | |
| 178 | - return true; | |
| 179 | -} | |
| 191 | + const validateParams = (params) => { | |
| 192 | + if (!params.garOrderHandlerName) { | |
| 193 | + uni.$u.toast("请输入处理人姓名"); | |
| 194 | + return false; | |
| 195 | + } | |
| 196 | + if (!params.garOrderHandlerTel) { | |
| 197 | + uni.$u.toast("请输入处理人电话"); | |
| 198 | + return false; | |
| 199 | + } | |
| 200 | + if (!params.garOrderCompanyName) { | |
| 201 | + uni.$u.toast("请输入处理人单位"); | |
| 202 | + return false; | |
| 203 | + } | |
| 204 | + if (!params.garReceptionQuantity) { | |
| 205 | + uni.$u.toast("请输入接收量"); | |
| 206 | + return false; | |
| 207 | + } | |
| 208 | + if (!validateImage(params.fillImageList)) { | |
| 209 | + return false; | |
| 210 | + } | |
| 211 | + return true; | |
| 212 | + } | |
| 180 | 213 | |
| 181 | -const validateImage = (fillImageList) => { | |
| 182 | - if (fillImageList instanceof Array && fillImageList.length > 0) { | |
| 183 | - for (let index = 0; index < fillImageList.length; index++) { | |
| 184 | - const str = fillImageList[index]; | |
| 185 | - if (!str.startsWith("/profile/upload")) { | |
| 186 | - uni.$u.toast("请等待图片上传~"); | |
| 187 | - return false; | |
| 188 | - } | |
| 189 | - } | |
| 190 | - return true; | |
| 191 | - } | |
| 192 | - uni.$u.toast("请上传图片~"); | |
| 193 | - return false; | |
| 194 | -} | |
| 214 | + const validateImage = (fillImageList) => { | |
| 215 | + if (fillImageList instanceof Array && fillImageList.length > 0) { | |
| 216 | + for (let index = 0; index < fillImageList.length; index++) { | |
| 217 | + const str = fillImageList[index]; | |
| 218 | + if (!str.startsWith("/profile/upload")) { | |
| 219 | + uni.$u.toast("请等待图片上传~"); | |
| 220 | + return false; | |
| 221 | + } | |
| 222 | + } | |
| 223 | + return true; | |
| 224 | + } | |
| 225 | + uni.$u.toast("请上传图片~"); | |
| 226 | + return false; | |
| 227 | + } | |
| 195 | 228 | |
| 196 | -onLoad((options) => { | |
| 197 | - if (options.data) { | |
| 198 | - details.value = JSON.parse(decodeURIComponent(options.data)); | |
| 199 | - isDeletable.value = true; | |
| 200 | - isNew.value = true; | |
| 201 | - } | |
| 202 | - if (options.garAskId) { | |
| 203 | - // TODO query | |
| 204 | - scanDetail(options.garAskId).then((res) => { | |
| 205 | - console.log(res); | |
| 206 | - details.value = res.data.data; | |
| 207 | - details.value.garOrderCompanyName = details.value.garOrderHandlerCompanyName; | |
| 208 | - fileList.value = details.value.fillImageList.map((item) => { | |
| 209 | - return { url: import.meta.env.VITE_BASE_URL + item } | |
| 210 | - }) | |
| 211 | - }) | |
| 212 | - } | |
| 213 | -}) | |
| 229 | + onLoad((options) => { | |
| 230 | + if (options.data) { | |
| 231 | + details.value = JSON.parse(decodeURIComponent(options.data)); | |
| 232 | + isDeletable.value = true; | |
| 233 | + isNew.value = true; | |
| 234 | + } | |
| 235 | + if (options.garAskId) { | |
| 236 | + // TODO query | |
| 237 | + scanDetail(options.garAskId).then((res) => { | |
| 238 | + console.log(res); | |
| 239 | + details.value = res.data.data; | |
| 240 | + details.value.garOrderCompanyName = details.value.garOrderHandlerCompanyName; | |
| 241 | + fileList.value = details.value.fillImageList.map((item) => { | |
| 242 | + return { | |
| 243 | + url: import.meta.env.VITE_BASE_URL + item | |
| 244 | + } | |
| 245 | + }) | |
| 246 | + }) | |
| 247 | + } | |
| 248 | + }) | |
| 214 | 249 | </script> |
| 215 | 250 | |
| 216 | 251 | <style lang="scss" scoped> |
| 217 | -$l-h-8: 80rpx; | |
| 252 | + $l-h-8: 80rpx; | |
| 218 | 253 | |
| 219 | -.scan-detail-container { | |
| 220 | - width: 100%; | |
| 221 | - height: 100%; | |
| 222 | - box-sizing: border-box; | |
| 223 | - padding: 20rpx; | |
| 254 | + .scan-detail-container { | |
| 255 | + width: 100%; | |
| 256 | + height: 100%; | |
| 257 | + box-sizing: border-box; | |
| 258 | + padding: 20rpx; | |
| 224 | 259 | |
| 225 | - .scan-detail-box { | |
| 226 | - background-color: white; | |
| 227 | - margin-bottom: 40rpx; | |
| 228 | - color: $u-main-color; | |
| 260 | + .scan-detail-box { | |
| 261 | + background-color: white; | |
| 262 | + margin-bottom: 40rpx; | |
| 263 | + color: $u-main-color; | |
| 229 | 264 | |
| 230 | - .scan-time { | |
| 231 | - display: flex; | |
| 232 | - width: 100%; | |
| 233 | - // 底部阴影 向内发散 | |
| 234 | - border-bottom: 1rpx solid #f5f5f5; | |
| 235 | - line-height: 100rpx; | |
| 236 | - align-items: center; | |
| 265 | + .scan-time { | |
| 266 | + display: flex; | |
| 267 | + width: 100%; | |
| 268 | + // 底部阴影 向内发散 | |
| 269 | + border-bottom: 1rpx solid #f5f5f5; | |
| 270 | + line-height: 100rpx; | |
| 271 | + align-items: center; | |
| 237 | 272 | |
| 238 | - .scan-label { | |
| 239 | - width: 30%; | |
| 240 | - display: flex; | |
| 241 | - align-items: center; | |
| 242 | - justify-content: center; | |
| 243 | - } | |
| 273 | + .scan-label { | |
| 274 | + width: 30%; | |
| 275 | + display: flex; | |
| 276 | + align-items: center; | |
| 277 | + justify-content: center; | |
| 278 | + } | |
| 244 | 279 | |
| 245 | - .scan-time { | |
| 246 | - width: 60%; | |
| 247 | - } | |
| 280 | + .scan-time { | |
| 281 | + width: 60%; | |
| 282 | + } | |
| 248 | 283 | |
| 249 | - .scan-icon { | |
| 250 | - width: 10%; | |
| 251 | - display: flex; | |
| 252 | - } | |
| 253 | - } | |
| 284 | + .scan-icon { | |
| 285 | + width: 10%; | |
| 286 | + display: flex; | |
| 287 | + } | |
| 288 | + } | |
| 254 | 289 | |
| 255 | - } | |
| 290 | + } | |
| 256 | 291 | |
| 257 | - .scan-submit-info { | |
| 258 | - width: 100%; | |
| 259 | - background-color: white; | |
| 260 | - box-sizing: border-box; | |
| 261 | - padding: 20rpx; | |
| 262 | - color: $u-content-color; | |
| 292 | + .scan-submit-info { | |
| 293 | + width: 100%; | |
| 294 | + background-color: white; | |
| 295 | + box-sizing: border-box; | |
| 296 | + padding: 20rpx; | |
| 297 | + color: $u-content-color; | |
| 263 | 298 | |
| 264 | - .scan-submit-title-box { | |
| 265 | - display: flex; | |
| 266 | - align-items: center; | |
| 299 | + .scan-submit-title-box { | |
| 300 | + display: flex; | |
| 301 | + align-items: center; | |
| 267 | 302 | |
| 268 | - text { | |
| 269 | - margin-left: 15rpx; | |
| 270 | - } | |
| 271 | - } | |
| 303 | + text { | |
| 304 | + margin-left: 15rpx; | |
| 305 | + } | |
| 306 | + } | |
| 272 | 307 | |
| 273 | - .scan-car-num { | |
| 274 | - display: flex; | |
| 275 | - line-height: $l-h-8; | |
| 276 | - align-items: center; | |
| 308 | + .scan-car-num { | |
| 309 | + display: flex; | |
| 310 | + line-height: $l-h-8; | |
| 311 | + align-items: center; | |
| 277 | 312 | |
| 278 | - .scan-car-num-label { | |
| 279 | - width: 20%; | |
| 280 | - // 文字不换行 | |
| 281 | - white-space: nowrap; | |
| 282 | - } | |
| 313 | + .scan-car-num-label { | |
| 314 | + width: 20%; | |
| 315 | + // 文字不换行 | |
| 316 | + white-space: nowrap; | |
| 317 | + } | |
| 283 | 318 | |
| 284 | - .scan-car-num-content { | |
| 285 | - width: auto; | |
| 286 | - display: flex; | |
| 287 | - justify-content: center; | |
| 288 | - align-items: center; | |
| 289 | - } | |
| 290 | - } | |
| 319 | + .scan-car-num-content { | |
| 320 | + width: auto; | |
| 321 | + display: flex; | |
| 322 | + justify-content: center; | |
| 323 | + align-items: center; | |
| 324 | + } | |
| 325 | + } | |
| 291 | 326 | |
| 292 | - .scan-upload-fill-image-box { | |
| 293 | - line-height: $l-h-8; | |
| 294 | - width: 100%; | |
| 327 | + .scan-upload-fill-image-box { | |
| 328 | + line-height: $l-h-8; | |
| 329 | + width: 100%; | |
| 295 | 330 | |
| 296 | - .scan-upload-fill-image-label { | |
| 297 | - display: flex; | |
| 298 | - justify-content: space-between; | |
| 299 | - } | |
| 331 | + .scan-upload-fill-image-label { | |
| 332 | + display: flex; | |
| 333 | + justify-content: space-between; | |
| 334 | + } | |
| 300 | 335 | |
| 301 | - .scan-upload-fill-image-btn {} | |
| 302 | - } | |
| 303 | - } | |
| 336 | + .scan-upload-fill-image-btn {} | |
| 337 | + } | |
| 338 | + } | |
| 304 | 339 | |
| 305 | - .scan-submit-button-box { | |
| 306 | - margin-top: 40rpx; | |
| 307 | - background-color: white; | |
| 308 | - padding: 20rpx; | |
| 309 | - } | |
| 310 | -} | |
| 311 | -</style> | |
| 340 | + .scan-submit-button-box { | |
| 341 | + margin-top: 40rpx; | |
| 342 | + background-color: white; | |
| 343 | + padding: 20rpx; | |
| 344 | + } | |
| 345 | + } | |
| 346 | +</style> | |
| 312 | 347 | \ No newline at end of file | ... | ... |
garbage-removal/src/pages/order-info/order-driver/detail/index.vue
| ... | ... | @@ -282,7 +282,7 @@ const selectClick = (index) => { |
| 282 | 282 | const handleOrderDetail = (orderId) => { |
| 283 | 283 | queryOrderDetail(orderId).then(res => { |
| 284 | 284 | dataGram.value = res.data.data; |
| 285 | - console.log(res.data.data); | |
| 285 | + console.log(res.data.data); | |
| 286 | 286 | currentImages.value = res.data.data.currentImages.map(item => { |
| 287 | 287 | return { url: import.meta.env.VITE_BASE_URL + item }; |
| 288 | 288 | }); |
| ... | ... | @@ -384,7 +384,8 @@ const createQrCodeValid = (val) => { |
| 384 | 384 | * @param {string} putType |
| 385 | 385 | */ |
| 386 | 386 | const handleUploadImage = (orderId, putType) => { |
| 387 | - uni.$u.route(`pages/order-info/order-driver/upload/index?orderId=${orderId}`) | |
| 387 | + const data = dataGram.value; | |
| 388 | + uni.$u.route(`pages/order-info/order-driver/upload/index?orderId=${orderId}&carPlate=${data.garHandlerCarCode}&driver=${store.userInfo.userName}`) | |
| 388 | 389 | } |
| 389 | 390 | |
| 390 | 391 | /** | ... | ... |
garbage-removal/src/pages/order-info/order-driver/upload/index.vue
| ... | ... | @@ -18,7 +18,7 @@ |
| 18 | 18 | </view> |
| 19 | 19 | </view> |
| 20 | 20 | <view class="upload-image-box-submit-box"> |
| 21 | - <view class="upload-image-box-submit-box-button" @click="handleSubmit(orderId, putType)"> | |
| 21 | + <view class="upload-image-box-submit-box-button" @click="handleSubmit(orderId, putType,driver,carPlate)"> | |
| 22 | 22 | <view class="upload-image-box-submit-box-button-container"> |
| 23 | 23 | <up-button color="#19be6b" type="primary" shape="square" text="确定"></up-button> |
| 24 | 24 | </view> |
| ... | ... | @@ -32,8 +32,12 @@ import { uploadFilePromise } from '@/apis/common.js'; |
| 32 | 32 | import { uploadImageUrlByType } from '@/apis/order.js'; |
| 33 | 33 | import { onLoad } from '@dcloudio/uni-app'; |
| 34 | 34 | import { reactive, ref } from 'vue'; |
| 35 | +import { useMainStore } from '@/stores/index.js'; | |
| 36 | +const store = useMainStore(); | |
| 35 | 37 | const putType = ref("装车图片") |
| 36 | 38 | const orderId = ref(); |
| 39 | +const carPlate = ref(); | |
| 40 | +const driver = ref(); | |
| 37 | 41 | const fileList = ref([]) |
| 38 | 42 | const chooseList = reactive([{ name: "装车图片" }, { name: "卸车图片" }]) |
| 39 | 43 | // 删除图片 |
| ... | ... | @@ -67,33 +71,95 @@ const afterRead = async (event) => { |
| 67 | 71 | } |
| 68 | 72 | }; |
| 69 | 73 | // 提交图片 |
| 70 | -const handleSubmit = (id, type) => { | |
| 71 | - if (!validateImage()) { | |
| 72 | - uni.$u.toast("请等待图片上传~") | |
| 73 | - return | |
| 74 | - } | |
| 75 | - let params = { | |
| 76 | - garOrderId: id, | |
| 77 | - type: type == "装车图片" ? 1 : 2, | |
| 78 | - imageUrls: fileList.value.map(item => item.url) | |
| 79 | - } | |
| 80 | - if(params.imageUrls && params.imageUrls.length == 0){ | |
| 81 | - uni.$u.toast("请上传现场图片"); | |
| 82 | - return; | |
| 83 | - } | |
| 84 | - | |
| 85 | - uploadImageUrlByType(params).then(res => { | |
| 86 | - if (res.data.success) { | |
| 87 | - uni.$u.toast("图片上传完毕!"); | |
| 88 | - setTimeout(() => { | |
| 89 | - uni.$u.route({ | |
| 90 | - type: 'navigateBack', | |
| 91 | - url: `pages/order-info/order-other/detail/index`, | |
| 92 | - }) | |
| 93 | - }, 300) | |
| 74 | +const handleSubmit = async (id, type, driver, carPlate) => { | |
| 75 | + try { | |
| 76 | + // 获取定位信息 | |
| 77 | + const location = await new Promise((resolve, reject) => { | |
| 78 | + uni.getLocation({ | |
| 79 | + type: 'wgs84', | |
| 80 | + success: resolve, | |
| 81 | + fail: reject | |
| 82 | + }); | |
| 83 | + }); | |
| 84 | + | |
| 85 | + if (!validateImage()) { | |
| 86 | + uni.$u.toast("请等待图片上传~") | |
| 87 | + return | |
| 88 | + } | |
| 89 | + | |
| 90 | + const userPhone = store.userPhone; | |
| 91 | + let params = { | |
| 92 | + garOrderId: id, | |
| 93 | + driver: driver, | |
| 94 | + carPlate: carPlate, | |
| 95 | + userPhone: userPhone, | |
| 96 | + type: type == "装车图片" ? 1 : 2, | |
| 97 | + imageUrls: fileList.value.map(item => item.url), | |
| 98 | + // 添加定位信息 | |
| 99 | + latitude: location.latitude, | |
| 100 | + longitude: location.longitude | |
| 94 | 101 | } |
| 95 | - }) | |
| 102 | + | |
| 103 | + if(params.imageUrls && params.imageUrls.length == 0){ | |
| 104 | + uni.$u.toast("请上传现场图片"); | |
| 105 | + return; | |
| 106 | + } | |
| 107 | + | |
| 108 | + uploadImageUrlByType(params).then(res => { | |
| 109 | + if (res.data.success) { | |
| 110 | + uni.$u.toast("图片上传完毕!"); | |
| 111 | + setTimeout(() => { | |
| 112 | + uni.$u.route({ | |
| 113 | + type: 'navigateBack', | |
| 114 | + url: `pages/order-info/order-other/detail/index`, | |
| 115 | + }) | |
| 116 | + }, 300) | |
| 117 | + } | |
| 118 | + }) | |
| 119 | + | |
| 120 | + } catch (error) { | |
| 121 | + console.error('定位获取失败:', error); | |
| 122 | + uni.$u.toast("需要位置权限才能提交"); | |
| 123 | + // 可选:引导用户打开设置 | |
| 124 | + uni.openSetting({ | |
| 125 | + success(res) { | |
| 126 | + console.log('授权设置:', res.authSetting); | |
| 127 | + } | |
| 128 | + }); | |
| 129 | + } | |
| 96 | 130 | } |
| 131 | +// 提交图片 | |
| 132 | +// const handleSubmit = async (id, type,driver,carPlate) => { | |
| 133 | +// if (!validateImage()) { | |
| 134 | +// uni.$u.toast("请等待图片上传~") | |
| 135 | +// return | |
| 136 | +// } | |
| 137 | +// const userPhone = store.userPhone; | |
| 138 | +// let params = { | |
| 139 | +// garOrderId: id, | |
| 140 | +// driver:driver, | |
| 141 | +// carPlate:carPlate, | |
| 142 | +// userPhone:userPhone, | |
| 143 | +// type: type == "装车图片" ? 1 : 2, | |
| 144 | +// imageUrls: fileList.value.map(item => item.url) | |
| 145 | +// } | |
| 146 | +// if(params.imageUrls && params.imageUrls.length == 0){ | |
| 147 | +// uni.$u.toast("请上传现场图片"); | |
| 148 | +// return; | |
| 149 | +// } | |
| 150 | + | |
| 151 | +// uploadImageUrlByType(params).then(res => { | |
| 152 | +// if (res.data.success) { | |
| 153 | +// uni.$u.toast("图片上传完毕!"); | |
| 154 | +// setTimeout(() => { | |
| 155 | +// uni.$u.route({ | |
| 156 | +// type: 'navigateBack', | |
| 157 | +// url: `pages/order-info/order-other/detail/index`, | |
| 158 | +// }) | |
| 159 | +// }, 300) | |
| 160 | +// } | |
| 161 | +// }) | |
| 162 | +// } | |
| 97 | 163 | |
| 98 | 164 | const validateImage = () => { |
| 99 | 165 | for (let index = 0; index < fileList.value.length; index++) { |
| ... | ... | @@ -107,6 +173,8 @@ const validateImage = () => { |
| 107 | 173 | |
| 108 | 174 | onLoad((options) => { |
| 109 | 175 | orderId.value = options.orderId; |
| 176 | + carPlate.value = options.carPlate; | |
| 177 | + driver.value = options.driver; | |
| 110 | 178 | // putType.value = options.putType === "putOnImages" ? "装车图片" : "卸车图片"; |
| 111 | 179 | |
| 112 | 180 | }) | ... | ... |
garbage-removal/src/pages/order-info/order-other/detail/index.vue
| ... | ... | @@ -210,7 +210,7 @@ |
| 210 | 210 | v-if="dataGram.garOrderHandlerStatus === 0 && userType == '运输企业负责人' && dataGram.garCancelFlag === 0" |
| 211 | 211 | @click="handleOderCancelClick()" shape="square" color="#19a97c" text="取消订单"></u-button> |
| 212 | 212 | <u-button |
| 213 | - v-if="dataGram.garOrderScanHandlerFlag === 0 && userType == '用户' && dataGram.garOrderHandlerStatus != 3" | |
| 213 | + v-if="dataGram.garOrderScanHandlerFlag === 0 && userType == '用户' && dataGram.garOrderHandlerStatus != 3 && dataGram.garAskStatus != '1'" | |
| 214 | 214 | @click="handlerUpdateOrderClick()" shape="square" color="#19a97c" text="修改车辆信息"></u-button> |
| 215 | 215 | <u-button v-if="dataGram.garOrderHandlerStatus === 1 && userType == '运输企业负责人'" |
| 216 | 216 | @click="handleOrderDispatchClick(orderId)" shape="square" color="#19a97c" | ... | ... |
garbage-removal/src/pages/order/order-disposal/index.vue
garbage-removal/src/pages/wode-info/wode-info-choose/index.vue
garbage-removal/src/stores/main.js
| ... | ... | @@ -7,8 +7,9 @@ export const useMainStore = defineStore( |
| 7 | 7 | const tempToken = ref(null); |
| 8 | 8 | const userType = ref("") |
| 9 | 9 | const userInfo = ref("") |
| 10 | + const userPhone = ref(""); | |
| 10 | 11 | |
| 11 | - return { token,tempToken,userType,userInfo }; | |
| 12 | + return { token,tempToken,userType,userInfo,userPhone }; | |
| 12 | 13 | }, |
| 13 | 14 | { |
| 14 | 15 | persist: { | ... | ... |
garbage-removal/vite.config.js
| ... | ... | @@ -8,7 +8,7 @@ export default defineConfig({ |
| 8 | 8 | plugins: [ |
| 9 | 9 | uni(), |
| 10 | 10 | //本地环境开启https |
| 11 | - // basicSsl() | |
| 11 | + basicSsl() | |
| 12 | 12 | ], |
| 13 | 13 | resolve: { |
| 14 | 14 | alias: { |
| ... | ... | @@ -19,6 +19,6 @@ export default defineConfig({ |
| 19 | 19 | server: { |
| 20 | 20 | port: 9000, |
| 21 | 21 | //本地环境开启https |
| 22 | - // https: true | |
| 22 | + https: true | |
| 23 | 23 | } |
| 24 | 24 | }) | ... | ... |
garbage-removal/yarn.lock
| ... | ... | @@ -975,7 +975,7 @@ |
| 975 | 975 | "resolved" "https://registry.npmmirror.com/@dcloudio/types/-/types-3.4.3.tgz" |
| 976 | 976 | "version" "3.4.3" |
| 977 | 977 | |
| 978 | -"@dcloudio/uni-app-plus@3.0.0-3090620231104002": | |
| 978 | +"@dcloudio/uni-app-plus@^3.0.0-3090620231104002": | |
| 979 | 979 | "integrity" "sha512-L4+OgMQYKP6R7TXFBl0OiYKa0Ys/X9TbDHERFOe0IFYeuDCLbXpWU3k8zRCTOAmtRVNAulBIaet++YpxkpR/pw==" |
| 980 | 980 | "resolved" "https://registry.npmmirror.com/@dcloudio/uni-app-plus/-/uni-app-plus-3.0.0-3090620231104002.tgz" |
| 981 | 981 | "version" "3.0.0-3090620231104002" | ... | ... |