|
|
@@ -0,0 +1,484 @@
|
|
|
+<template>
|
|
|
+ <view class="content">
|
|
|
+ <view class="title">
|
|
|
+ 服务信息
|
|
|
+ </view>
|
|
|
+ <up-form :model="form" labelWidth="70" ref="uFormRef">
|
|
|
+ <up-form-item label="服务类型" :required="rules.servicetype[0].required" prop="servicetype">
|
|
|
+ <up-radio-group v-model="form.servicetype" @change="servicetypeChange">
|
|
|
+ <up-radio :customStyle="{ marginLeft: '12px' }" v-for="(item) in servertypes" :key="item"
|
|
|
+ :label="item" :name="item">
|
|
|
+ </up-radio>
|
|
|
+ </up-radio-group>
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <up-form-item label="产品品类" :required="rules.class1[0].required" prop="class1">
|
|
|
+ <up-radio-group v-model="form.class1">
|
|
|
+ <up-radio :customStyle="{ marginLeft: '12px' }" v-for="(item) in class1" :key="item.value"
|
|
|
+ :label="item.value" :name="item.value">
|
|
|
+ </up-radio>
|
|
|
+ </up-radio-group>
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <up-form-item v-if="rules.class2[0].required" label="故障类型" :required="rules.class2[0].required"
|
|
|
+ prop="class2">
|
|
|
+ <picker class="picker" mode="selector" :range="class2" range-key="value" @change="changeClass2">
|
|
|
+ {{ form.class2 || '请选择故障类型' }}
|
|
|
+ </picker>
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <view class="title">
|
|
|
+ 产品信息
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <up-form-item label="序列号" :required="rules.sku[0].required" prop="sku">
|
|
|
+ <up-input v-model="form.sku" placeholder="序列号" clearable @blur="skuConfirm">
|
|
|
+ <template #suffix>
|
|
|
+ <view style="display: flex;align-items: center;">
|
|
|
+ <view class="my-but" hover-class="navigator-hover" @click="toSelectMyProduct">
|
|
|
+ 选择序列号
|
|
|
+ </view>
|
|
|
+ <up-icon name="scan" color="#2979ff" size="28" @click="openScan" />
|
|
|
+ </view>
|
|
|
+ </template>
|
|
|
+ </up-input>
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <up-form-item label="客户电话" :required="rules.customerphonenumber[0].required" prop="customerphonenumber">
|
|
|
+ <up-input v-model="form.customerphonenumber" placeholder="客户电话">
|
|
|
+ <template #suffix>
|
|
|
+ <up-button type="success" :disabled="!form.customerphonenumber" size="mini" text="查询"
|
|
|
+ @click="phonenumberConfirm" />
|
|
|
+ </template>
|
|
|
+ </up-input>
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <up-form-item label="客户名称" :required="rules.customername[0].required" prop="customername">
|
|
|
+ <up-input v-model="form.customername" :disabled="disabledCustomername" placeholder="客户名称" />
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <up-form-item label="产品名称" prop="itemname" :required="rules.itemname[0].required">
|
|
|
+ <up-input v-model="form.itemname" disabled placeholder="请输入序列号或选择产品"></up-input>
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <up-form-item label="产品型号" prop="model">
|
|
|
+ <up-input v-model="form.model" disabled placeholder="请输入序列号或选择产品" />
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <view class="title">
|
|
|
+ 联系人信息
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <up-form-item label="联系人" :required="rules.scenecontact[0].required" prop="scenecontact">
|
|
|
+ <up-input v-model="form.scenecontact" placeholder="联系人" clearable />
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <up-form-item label="手机号" :required="rules.scenecontactphonenumber[0].required"
|
|
|
+ prop="scenecontactphonenumber">
|
|
|
+ <up-input type="number" v-model="form.scenecontactphonenumber" placeholder="联系人电话" clearable />
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <up-form-item label="省市县" :required="rules.province[0].required" prop="province">
|
|
|
+ <picker class="picker" mode="region" :value="[form.province, form.city, form.county]"
|
|
|
+ @change="changeRegion">
|
|
|
+ {{ form.province ? [form.province, form.city, form.county].join("-") : '选择省市县' }}
|
|
|
+ </picker>
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <up-form-item label="详细地址" prop="address" :required="rules.address[0].required">
|
|
|
+ <up-textarea maxlength="499" v-model="form.address" placeholder="详细地址" autoHeight height="20" />
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <up-form-item label="" prop="remarks">
|
|
|
+ <up-textarea v-model="form.remarks" placeholder="如有特殊需求,您可在此处留言" count></up-textarea>
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ </up-form>
|
|
|
+ <view style="padding-bottom: 50px;width: 350rpx;margin: 40rpx auto 0;" @click="save">
|
|
|
+ <My-button text="保存" :loading="loading" />
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <up-popup :show="products.length" @close="closePopup" :customStyle="{
|
|
|
+ width: '80vw',
|
|
|
+ }" mode="right">
|
|
|
+ <scroll-view :safeAreaInsetBottom="false" scroll-y style="width: 100%;height: 100vh;">
|
|
|
+ <view class="product" v-for="item in products" :key="item.itemid" hover-class="navigator-hover"
|
|
|
+ @click="changeItem(item)">
|
|
|
+ <view class="itemname">
|
|
|
+ {{ item.itemname }}
|
|
|
+ </view>
|
|
|
+ <view class="row">
|
|
|
+ 序列号: {{ item.sku || '--' }}
|
|
|
+ </view>
|
|
|
+ <!-- <view class="row">
|
|
|
+ 产品编号: {{ item.itemno || '--' }}
|
|
|
+ </view> -->
|
|
|
+ <view class="row">
|
|
|
+ 产品型号: {{ item.model || '--' }}
|
|
|
+ </view>
|
|
|
+ <view class="row">
|
|
|
+ 经销商: {{ item.enterprisename || '--' }}
|
|
|
+ </view>
|
|
|
+ <view class="row">
|
|
|
+ 用户信息: {{ item.name || '--' }} {{ item.phonenumber || '--' }}
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view style="height: 30px;" />
|
|
|
+ </scroll-view>
|
|
|
+ </up-popup>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { ref, reactive, getCurrentInstance } from 'vue';
|
|
|
+const { $Http } = getCurrentInstance().proxy;
|
|
|
+import { onShow } from '@dcloudio/uni-app';
|
|
|
+const uFormRef = ref(null);
|
|
|
+const form = reactive({
|
|
|
+ sa_serviceorderid: 0,
|
|
|
+ sa_orderid: 0,
|
|
|
+ servicetype: '', // 服务类型
|
|
|
+ class1: '', // 产品品类
|
|
|
+ class2: '', // 故障类型
|
|
|
+ sku: '', // 序列号
|
|
|
+ itemid: '', // 产品ID
|
|
|
+ itemname: '', // 产品名称
|
|
|
+ itemno: '', // 产品编号
|
|
|
+ model: '', // 产品型号
|
|
|
+ cardno: '', // 保修卡号
|
|
|
+ scenecontact: '', // 联系人
|
|
|
+ scenecontactphonenumber: '', // 联系人电话
|
|
|
+ province: '', // 省
|
|
|
+ city: '', // 市
|
|
|
+ county: '', // 县
|
|
|
+ address: '', // 详细地址
|
|
|
+ remarks: '',
|
|
|
+ sys_enterpriseid: '',
|
|
|
+ customername: "", // 客户名称
|
|
|
+ customerphonenumber: "", // 客户电话
|
|
|
+ sa_customersid: 0
|
|
|
+});
|
|
|
+
|
|
|
+$Http.basic({
|
|
|
+ "classname": "common.usercenter.usercenter",
|
|
|
+ "method": "queryUserMsg",
|
|
|
+ "content": {}
|
|
|
+}).then(res => {
|
|
|
+ if (res.code === 1) {
|
|
|
+ form.sys_enterpriseid = res.data.hr.sys_enterpriseid;
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+const rules = reactive({
|
|
|
+ servicetype: [{ required: true, message: '请选择服务类型', trigger: 'change' }],
|
|
|
+ class1: [{ required: true, message: '请选择产品品类', trigger: 'change' }],
|
|
|
+ class2: [{ required: false, message: "请选择故障类型", trigger: 'change' }],
|
|
|
+ sku: [{ required: true, message: '请输入序列号', trigger: 'blur' }],
|
|
|
+ itemno: [{ required: false, message: '请输入产品编号', trigger: 'blur' }],
|
|
|
+ itemname: [{ required: true, message: '请选择产品', trigger: 'blur' }],
|
|
|
+ model: [{ required: false, message: '请输入产品型号', trigger: 'blur' }],
|
|
|
+ cardno: [{ required: false, message: '请输入保修卡号', trigger: 'blur' }],
|
|
|
+ province: [{ required: true, message: '请选择省市县', trigger: 'change' }],
|
|
|
+ address: [{ required: true, message: '请输入详细地址', trigger: 'blur' }],
|
|
|
+ customername: [{ required: true, disabled: true, message: '请输客户名称', trigger: 'blur' }],
|
|
|
+ customerphonenumber: [{ required: true, message: '请输入客户电话', trigger: 'blur', pattern: /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/, message: '请输入正确的手机号码' }],
|
|
|
+ scenecontact: [{ required: true, message: '请输入联系人', trigger: 'blur' }],
|
|
|
+ scenecontactphonenumber: [{ required: true, message: '请输入联系人电话', trigger: 'blur', pattern: /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/, message: '请输入正确的手机号码' }],
|
|
|
+});
|
|
|
+
|
|
|
+// 切换故障类型
|
|
|
+function changeClass2(e) {
|
|
|
+ let index = e.detail.value - 0;
|
|
|
+ form.class2 = class2.value[index].value;
|
|
|
+}
|
|
|
+
|
|
|
+// 切换服务类型
|
|
|
+function servicetypeChange(type) {
|
|
|
+ rules.class2[0].required = type == '维修';
|
|
|
+ uFormRef.value.setRules(rules);
|
|
|
+}
|
|
|
+
|
|
|
+const class1 = ref(''),
|
|
|
+ servertypes = ref(['安装', '维修', '清洗']),
|
|
|
+ class2 = ref('');
|
|
|
+
|
|
|
+onShow(() => {
|
|
|
+ $Http.getClass('servertype').then(res => {
|
|
|
+ servertypes.value = res.data.map(v => v.value);
|
|
|
+ if (res.code !== 1) return uni.showToast({ title: res.msg, icon: 'none' });
|
|
|
+ });
|
|
|
+
|
|
|
+ $Http.getClass('prodclass1').then(res => {
|
|
|
+ class1.value = res.data;
|
|
|
+ if (res.code !== 1) return uni.showToast({ title: res.msg, icon: 'none' });
|
|
|
+ });
|
|
|
+
|
|
|
+ $Http.getClass('faulttype').then(res => {
|
|
|
+ class2.value = res.data;
|
|
|
+ uFormRef.value.setRules(rules);
|
|
|
+ if (res.code !== 1) return uni.showToast({ title: res.msg, icon: 'none' });
|
|
|
+ });
|
|
|
+});
|
|
|
+
|
|
|
+function changeRegion(e) {
|
|
|
+ form.province = e.detail.value[0];
|
|
|
+ form.city = e.detail.value[1];
|
|
|
+ form.county = e.detail.value[2];
|
|
|
+}
|
|
|
+
|
|
|
+// 保存
|
|
|
+let loading = ref(false);
|
|
|
+
|
|
|
+function save() {
|
|
|
+ if (querySku.value === false) return uni.showToast({ title: '序列号不正确', icon: 'none' });
|
|
|
+ if (loading.value) return;
|
|
|
+ uFormRef.value.validate().then(valid => {
|
|
|
+ if (valid) wx.showModal({
|
|
|
+ content: '请确认预约信息正确以便后续服务,是否确认提交?',
|
|
|
+ title: '提示',
|
|
|
+ success: ({ confirm }) => {
|
|
|
+ if (confirm) {
|
|
|
+ form.customername = form.scenecontact;
|
|
|
+ form.customerphonenumber = form.scenecontactphonenumber;
|
|
|
+ form.name = form.customername;
|
|
|
+ form.phonenumber = form.scenecontactphonenumber;
|
|
|
+ let content = {
|
|
|
+ ...form,
|
|
|
+ };
|
|
|
+ loading.value = true;
|
|
|
+ $Http.basic({
|
|
|
+ "id": "20230206091403",
|
|
|
+ content
|
|
|
+ }).then(res => {
|
|
|
+ loading.value = false;
|
|
|
+ console.log("提交申请单", res);
|
|
|
+ if (res.code !== 1) {
|
|
|
+ uni.showToast({ title: res.code !== 1 ? res.msg : "保存成功", icon: 'none', mask: res.code == 1 });
|
|
|
+ } else {
|
|
|
+ $Http.basic({
|
|
|
+ id: 20230206101403,
|
|
|
+ content: {
|
|
|
+ sa_serviceorderid: res.data.sa_serviceorderid,
|
|
|
+ backreason: "",
|
|
|
+ issumbit: 1
|
|
|
+ }
|
|
|
+ }).then(res1 => {
|
|
|
+ console.log("提交工单", res1);
|
|
|
+ })
|
|
|
+ uni.showModal({
|
|
|
+ content: "预约申请已提交,立即前往还是继续创建?",
|
|
|
+ confirmText: '立即前往',
|
|
|
+ cancelText: '继续创建',
|
|
|
+ success: (success) => {
|
|
|
+ if (success.confirm) {
|
|
|
+ uni.redirectTo({
|
|
|
+ url: `/pages/generalServices/detail?id=${res.data.sa_serviceorderid}`,
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ uni.redirectTo({
|
|
|
+ url: '/pages/launchApplication/index',
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }).catch(err => {
|
|
|
+ loading.value = false;
|
|
|
+ console.error("保存工单失败", err);
|
|
|
+ uni.showToast({ title: '保存失败,请稍后重试', icon: 'none' });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ })
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function phonenumberConfirm() {
|
|
|
+ // 校验手机号
|
|
|
+ const phoneRegex = /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/;
|
|
|
+ if (!phoneRegex.test(form.customerphonenumber)) {
|
|
|
+ return uni.showToast({ title: '请输入正确的手机号', icon: 'none' });
|
|
|
+ }
|
|
|
+ uni.showLoading({ title: '查询中...' });
|
|
|
+ $Http.basic({
|
|
|
+ "id": 2025080813465203,
|
|
|
+ "content": {
|
|
|
+ "pageNumber": 1,
|
|
|
+ "pageSize": 50,
|
|
|
+ "where": {
|
|
|
+ phonenumber: form.customerphonenumber,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }).then(res => {
|
|
|
+ uni.hideLoading();
|
|
|
+ console.log("根据用户手机查询", res)
|
|
|
+ if (res.code !== 1) return uni.showToast({ title: res.msg, icon: 'none' });
|
|
|
+ if (res.data.length === 0) return uni.showToast({ title: '未找到对应的客户信息', icon: 'none' });
|
|
|
+ if (res.data.length == 1 && detail.itemid == res.data[0].itemid) {
|
|
|
+ changeItem(res.data[0]);
|
|
|
+ } else {
|
|
|
+ products.value = res.data;
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+let querySku = ref(true); // SKU是否正确
|
|
|
+let disabledCustomername = ref(true);
|
|
|
+
|
|
|
+function skuConfirm() {
|
|
|
+ if (form.sku) {
|
|
|
+ ['contact', 'serviceenterprisename', 'cardno', 'itemid', 'itemname', 'itemno', 'model', 'phonenumber', 'unitname', 'spec'].forEach(key => {
|
|
|
+ form[key] = '';
|
|
|
+ });
|
|
|
+ if (form.sku == '') return;
|
|
|
+ uni.showLoading({
|
|
|
+ title: '查询中...',
|
|
|
+ mask: true,
|
|
|
+ });
|
|
|
+ $Http.basic({
|
|
|
+ "id": 2025080813465203,
|
|
|
+ "content": {
|
|
|
+ "pageNumber": 1,
|
|
|
+ "pageSize": 1,
|
|
|
+ "where": {
|
|
|
+ sku: form.sku,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }).then(res => {
|
|
|
+ console.log("查询sku", res)
|
|
|
+ uni.hideLoading();
|
|
|
+ if (res.code !== 1) return uni.showToast({ title: res.msg, icon: 'none' });
|
|
|
+ if (res.data.length === 0 || res.data[0].sku !== form.sku) {
|
|
|
+ uni.showToast({ title: '未找到对应的产品信息', icon: 'none' });
|
|
|
+ querySku.value = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ querySku.value = true;
|
|
|
+ changeItem(res.data[0]);
|
|
|
+ uni.showToast({ title: '已自动写入客户、产品信息', icon: 'none' });
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ form.sku = '';
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+let products = ref([]); // 产品列表
|
|
|
+function closePopup() {
|
|
|
+ products.value = [];
|
|
|
+}
|
|
|
+function changeItem(item) {
|
|
|
+ item.contact = item.name;
|
|
|
+ item.serviceenterprisename = item.serviceenterprisename || item.enterprisename;
|
|
|
+ ['customername', 'customerphonenumber', 'sku', 'cardno', 'itemid', 'itemname', 'itemno', 'model', 'unitname', 'spec', 'sa_customersid'].forEach(key => {
|
|
|
+ if (key == 'customername') {
|
|
|
+ form.scenecontact = item['customername'];
|
|
|
+ disabledCustomername.value = item['customername'] != ''
|
|
|
+ } else if (key == 'customerphonenumber') {
|
|
|
+ form.scenecontactphonenumber = item['customerphonenumber'];
|
|
|
+ }
|
|
|
+ form[key] = item[key] || '';
|
|
|
+ });
|
|
|
+ uni.showToast({ title: '已自动写入客户、产品信息', icon: 'none' });
|
|
|
+ querySku.value = true;
|
|
|
+ closePopup();
|
|
|
+}
|
|
|
+
|
|
|
+function openScan() {
|
|
|
+ uni.navigateTo({
|
|
|
+ url: '/pages/bookingService/getCode'
|
|
|
+ });
|
|
|
+ $Http.getCode = (code) => {
|
|
|
+ form.sku = code || '';
|
|
|
+ skuConfirm();
|
|
|
+ uni.navigateBack()
|
|
|
+ delete $Http.getCode;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function toSelectMyProduct() {
|
|
|
+ uni.navigateTo({
|
|
|
+ url: '/pages/launchApplication/skus'
|
|
|
+ });
|
|
|
+ $Http.onSelected = (item) => {
|
|
|
+ ['customername', 'customerphonenumber', 'sku', 'cardno', 'itemid', 'itemname', 'itemno', 'model', 'unitname', 'spec', 'sa_customersid'].forEach(key => {
|
|
|
+ if (key == 'customername') {
|
|
|
+ form.scenecontact = item['customername'];
|
|
|
+ disabledCustomername.value = item['customername'] != ''
|
|
|
+ } else if (key == 'customerphonenumber') {
|
|
|
+ form.scenecontactphonenumber = item['customerphonenumber'];
|
|
|
+ }
|
|
|
+ form[key] = item[key] || '';
|
|
|
+ });
|
|
|
+ uni.navigateBack()
|
|
|
+ delete $Http.onSelected
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.content {
|
|
|
+ width: 100vw;
|
|
|
+ padding: 20px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ min-height: 100vh;
|
|
|
+ background: #fff;
|
|
|
+
|
|
|
+
|
|
|
+ .picker {
|
|
|
+ font-size: 28rpx;
|
|
|
+ color: #606266;
|
|
|
+ padding: 9px;
|
|
|
+ border-radius: 8rpx;
|
|
|
+ border: 1rpx solid #2979FF;
|
|
|
+ color: #2979FF;
|
|
|
+ }
|
|
|
+
|
|
|
+ .title {
|
|
|
+ font-size: 34rpx;
|
|
|
+ color: #4773EE;
|
|
|
+ margin: 20rpx 0;
|
|
|
+ font-weight: bold;
|
|
|
+ }
|
|
|
+
|
|
|
+ .region {
|
|
|
+ font-size: 28rpx;
|
|
|
+ color: #606266;
|
|
|
+ padding: 10px 9px;
|
|
|
+ width: 280px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ border-radius: 8rpx;
|
|
|
+ border: 1rpx solid #dadbde !important;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.product {
|
|
|
+ padding: 20rpx;
|
|
|
+ background: #fff;
|
|
|
+ margin: 10rpx 0;
|
|
|
+ border-radius: 8rpx;
|
|
|
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
|
+
|
|
|
+ .itemname {
|
|
|
+ font-size: 32rpx;
|
|
|
+ color: #333;
|
|
|
+ font-weight: bold;
|
|
|
+ margin-bottom: 10rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .row {
|
|
|
+ font-size: 28rpx;
|
|
|
+ color: #666;
|
|
|
+ margin-top: 8rpx;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.my-but {
|
|
|
+ line-height: 44rpx;
|
|
|
+ padding: 0 20rpx;
|
|
|
+ background: #2979ff;
|
|
|
+ color: #fff;
|
|
|
+ border-radius: 8rpx;
|
|
|
+ margin-right: 10rpx;
|
|
|
+ font-size: 24rpx;
|
|
|
+}
|
|
|
+</style>
|