dma-work-h5/src/views/appDir/appAddWorkOrder.vue
2026-04-08 09:51:49 +08:00

172 lines
4.5 KiB
Vue

<template>
<div class="ui-appAddWorkOrder">
<div class="font_30 color333 bold f-fcl">添加工单</div>
<div class="ui-describe-box">
<van-field v-model="describe" class="ui-desc-input font_30 color3" rows="5" type="textarea" maxlength="500" show-word-limit placeholder="请输入工单描述内容" autosize />
</div>
<div class="ui-upload-box">
<div v-for="(item, index) in pics" :key="index" class="ui-upload-icon-box flo_l">
<img class="ui-upload-icon" :src="item" mode="aspectFill" alt="" @click="ImagePreview(pics, index)" />
<img class="ui-upload-clear-icon" src="https://image.fulllinkai.com/202301/07/a069d2437562e00d298a9bcd253a86bd.png" mode="widthFix" alt="" @click="clearPic(index)" />
</div>
<div v-if="pics.length < 9">
<uploadPicture :multiple="true" :max-count="9" @on-success="onSuccess" @click="takePhone">
<div class="ui-upload">
<img class="ui-upload-icon flo_l" src="https://image.fulllinkai.com/202301/07/6c9bc853bed42c9871f56156d1b8f31c.png" alt="" />
</div>
</uploadPicture>
</div>
</div>
<div class="ui-next-btn font_30 f-fcc colorF" @click="changeData">保存</div>
</div>
</template>
<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { showImagePreview, showToast } from 'vant';
import weChat from '@/utils/weChat';
import router from '@/router';
import { useUserStore } from '@/store/modules/user';
defineOptions({ name: 'AddWorkOrder' });
const userStore = useUserStore() as any;
const throttle = ref(true);
const describe = ref<any>('');
const pics = ref<any[]>([]);
// 删除某个已上传的图片
const clearPic = (index) => {
pics.value.splice(index, 1);
};
const changeData = () => {
let data = {
chat_id: userStore.chatId,
images: pics.value,
desc: describe.value,
};
if (!describe.value) {
showToast('请输入工单描述内容');
return;
}
if (pics.value.length === 0) {
showToast('请上传最少一张图片');
return;
}
if (throttle.value) {
throttle.value = false;
weChat({ url: `/h5/add/work/order`, data, method: 'post' })
.then(() => {
throttle.value = true;
showToast('保存成功');
setTimeout(() => {
throttle.value = true;
router.replace({
name: 'appWorkOrder',
query: { state: 1 },
});
router.go(-1);
}, 1200);
})
.catch((err) => {
throttle.value = true;
console.log(err);
});
}
};
const ImagePreview = (e, index) => {
showImagePreview({
images: e,
showIndex: false,
startPosition: index,
loop: false,
});
};
// 上传图片
const onSuccess = (val) => {
if (pics.value.length < 9) {
pics.value.push(val);
}
};
window.getAndroidPhone = (type, e) => {
if (e && e.length > 0) {
e.forEach((item) => {
if (pics.value && pics.value.length < 9) {
pics.value.push(item);
}
});
}
};
const takePhone = () => {
let ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('Android') > -1 || ua.indexOf('Adr') > -1 || ua.indexOf('android') != -1) {
// 调用安卓 app方法
window.webAppInterface.takePhoto('multiple', 9);
}
};
onMounted(() => {});
</script>
<style lang="scss" scoped>
.ui-appAddWorkOrder {
background: #f8f8f8;
overflow-y: auto;
min-height: 100vh;
padding: px2rem(30);
}
.ui-describe-box {
padding-bottom: px2rem(40);
.ui-desc-input {
background: #ffffff;
border-radius: px2rem(24);
margin-top: px2rem(20);
}
.inputColor {
color: #c2c2c2;
}
}
.ui-upload-box {
overflow: hidden;
margin-bottom: px2rem(120);
.ui-upload-icon-box {
position: relative;
.ui-upload-clear-icon {
position: absolute;
right: px2rem(30);
top: px2rem(10);
width: px2rem(36);
height: px2rem(36);
}
}
.ui-upload-icon {
width: px2rem(200);
height: px2rem(200);
display: block;
border-radius: px2rem(16);
margin-right: px2rem(20);
margin-bottom: px2rem(20);
object-fit: cover;
object-position: center;
}
}
.ui-next-btn {
width: px2rem(560);
height: px2rem(80);
background: #5ac7a0;
border-radius: px2rem(40);
margin: 0 auto;
}
</style>