Browse Source

发起服务工单优化

xiaohaizhao 4 days ago
parent
commit
1a6cf079b1
4 changed files with 304 additions and 28 deletions
  1. 6 0
      pages.json
  2. 217 0
      pages/launchApplication/cardno.vue
  3. 80 27
      pages/launchApplication/index.vue
  4. 1 1
      utils/Http.js

+ 6 - 0
pages.json

@@ -83,6 +83,12 @@
 			"style": {
 				"navigationBarTitleText": "客户档案选择"
 			}
+		},
+		{
+			"path": "pages/launchApplication/cardno",
+			"style": {
+				"navigationBarTitleText": "选择保修卡"
+			}
 		}
 	],
 	"globalStyle": {

+ 217 - 0
pages/launchApplication/cardno.vue

@@ -0,0 +1,217 @@
+<template>
+    <view class="search-box">
+        <up-search placeholder="搜索关键词" v-model="keyword" height="35" @blur="onSearch" :clearabled="false"
+            :showAction="false" />
+        <view v-if="content.where.condition" class="clear" @click.stop="onSearch('')">
+            <up-icon name="close-circle-fill" size="20" />
+        </view>
+    </view>
+    <view style="height: 20rpx; " />
+    <My_listbox ref="listBox" :empty="!list.length" @getlist="getList">
+        <view class="item" hover-class="navigator-hover" v-for="item in list" :key="item.itemid"
+            @click="selected(item)">
+            <view class="image-box" >
+                <up-image :show-loading="true" :src="item.cover" width="80px" height="80px" />
+                <view class="tag" v-if="item.cardno" :style="{
+                    background: item.isUnderWarranty ? '#27D8B4' : '#E14154',
+                }">
+                    {{ item.isUnderWarranty ? '在' : '过' }}保
+                </view>
+            </view>
+            <view class="content">
+                <view class="row">
+                    <text class="label">
+                        产品名称
+                    </text>
+                    {{ item.itemname || ' --' }}
+                </view>
+                <view class="row">
+                    <text class="label">
+                        产品型号
+                    </text>
+                    {{ item.model || ' --' }}
+                </view>
+                <view class="row">
+                    <text class="label">
+                        序列号
+                    </text>
+                    {{ item.sku || ' --' }}
+                </view>
+                <view class="row">
+                    <text class="label">
+                        保修卡号
+                    </text>
+                    {{ item.cardno || ' --' }}
+                </view>
+                <view class="row">
+                    <text class="label">
+                        保修期限
+                    </text>
+                    {{ item.begdate ? item.begdate + '至' + item.enddate : ' --' }}
+                </view>
+            </view>
+        </view>
+        <view style="height: 30px;" />
+    </My_listbox>
+</template>
+
+<script setup>
+import { ref, reactive, getCurrentInstance } from 'vue';
+const { $Http } = getCurrentInstance().proxy;
+import { onLoad } from '@dcloudio/uni-app';
+
+const keyword = ref('');
+const listBox = ref(null);
+
+const content = reactive({
+    loading: false,
+    "pageNumber": 1,
+    "pageSize": 20,
+    sys_enterpriseid: '',
+    "where": {
+        "condition": ""
+    }
+});
+
+function onSearch(e) {
+    if (content.where.condition == e) return;
+    content.where.condition = e;
+    keyword.value = e;
+    getList(true);
+}
+const list = ref([])
+
+onLoad(() => {
+    $Http.basic({
+        "classname": "common.usercenter.usercenter",
+        "method": "queryUserMsg",
+        "content": {}
+    }).then(res => {
+        if (res.code != 1) return uni.showToast({
+            title: res.msg,
+            icon: 'none'
+        });
+        content.sys_enterpriseid = res.data.hr.sys_enterpriseid;
+        getList();
+    })
+});
+
+function getList(init = false) {
+    if (content.loading) {
+        listBox.value.refreshToComplete();
+        listBox.value.setHeight();
+        return
+    };
+    content.loading = true;
+    if (init) content.pageNumber = 1;
+    $Http.basic({
+        "id": "2025061714242103",
+        content
+    }).then(res => {
+        content.loading = false;
+        if (res.code != 1) return uni.showToast({
+            title: res.msg,
+            icon: 'none'
+        });
+        console.log("获取保修卡列表", res)
+        listBox.value.refreshToComplete();
+        listBox.value.setHeight();
+        res.data = res.data.map(v => {
+            v.isUnderWarranty = new Date() >= new Date(v.begdate) && new Date() <= new Date(v.enddate);
+            try {
+                v.cover = v.attinfos.length ? $Http.getSpecifiedImage(v.attinfos[0]) : ''
+            } catch (error) {
+                
+            }
+            return v
+        })
+        if (res.code == 1) {
+            list.value = reactive(res.firstPage ? res.data : list.value.concat(res.data));
+            content.pageTotal = res.pageTotal;
+            content.pageNumber = res.pageNumber;
+        } else {
+            if (res.msg) uni.showToast({
+                title: res.msg,
+                icon: 'none'
+            });
+        }
+    })
+}
+
+function selected(item) {
+    $Http.onSelected && $Http.onSelected(item)
+}
+</script>
+
+<style lang="scss" scoped>
+.search-box {
+    position: relative;
+    padding: 20rpx;
+    background: #fff;
+
+    .clear {
+        position: absolute;
+        display: flex;
+        align-items: center;
+        right: 0;
+        top: 50%;
+        transform: translateY(-50%);
+        width: 80rpx;
+        padding-left: 10rpx;
+        height: 70rpx;
+        z-index: 2;
+    }
+}
+
+
+.item {
+    position: relative;
+    display: flex;
+    width: 95%;
+    box-shadow: 0rpx 4rpx 16rpx 2rpx rgba(150, 157, 165, 0.16);
+    border-radius: 10rpx;
+    box-sizing: border-box;
+    padding: 20rpx 30rpx;
+    overflow: hidden;
+    margin: 0 auto 20rpx;
+    background: #fff;
+
+    .image-box {
+        position: relative;
+
+        .tag {
+            position: absolute;
+            left: 0;
+            top: 0;
+            padding: 4rpx 14rpx;
+            padding-right: 20rpx;
+            text-align: center;
+            background: red;
+            font-size: 22rpx;
+            color: #fff;
+            border-radius: 0 0 8rpx 0;
+        }
+    }
+
+    .content {
+        margin-left: 20rpx;
+
+        .row {
+            display: flex;
+            line-height: 32rpx;
+            font-family: Microsoft YaHei, Microsoft YaHei;
+            font-size: 24rpx;
+            margin-top: 8rpx;
+
+            .label {
+                color: #666;
+                flex-shrink: 0;
+            }
+
+            .label::after {
+                content: ':';
+            }
+        }
+    }
+}
+</style>

+ 80 - 27
pages/launchApplication/index.vue

@@ -31,8 +31,21 @@
                 产品信息
             </view>
 
+            <up-form-item label="保修卡号" v-if="form.servicetype != '安装'" :required="rules.cardno[0].required"
+                prop="cardno">
+                <up-input v-model="form.cardno" disabled placeholder="保修卡号" clearable @blur="skuConfirm">
+                    <template #suffix>
+                        <view style="display: flex;align-items: center;">
+                            <view class="my-but" hover-class="navigator-hover" @click="cardnoCustomer">
+                                选择保修卡
+                            </view>
+                        </view>
+                    </template>
+                </up-input>
+            </up-form-item>
+
             <up-form-item label="序列号" :required="rules.sku[0].required" prop="sku">
-                <up-input v-model="form.sku" placeholder="序列号" clearable @blur="skuConfirm">
+                <up-input v-model="form.sku" disabled placeholder="序列号" clearable @blur="skuConfirm">
                     <template #suffix>
                         <view style="display: flex;align-items: center;">
                             <view class="my-but" hover-class="navigator-hover" @click="toSelectMyProduct">
@@ -45,20 +58,16 @@
             </up-form-item>
 
             <up-form-item label="客户名称" :required="rules.customername[0].required" prop="customername">
-                <up-input v-model="form.customername" :disabled="disabledCustomername" placeholder="客户名称">
+                <up-input v-model="form.customername" disabled placeholder="客户名称">
                     <template #suffix>
-                        <up-button type="success" v-if="form.sku && form.sa_customersid == 0" size="mini" text="客户档案查询"
-                            @click="queryCustomer" />
+                        <up-button type="success" v-if="(form.sku || form.cardno) && form.sa_customersid == 0"
+                            size="mini" text="客户档案查询" @click="queryCustomer" />
                     </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 v-model="form.customerphonenumber" disabled placeholder="客户电话">
                 </up-input>
             </up-form-item>
             <up-form-item label="产品名称" prop="itemname" :required="rules.itemname[0].required">
@@ -138,7 +147,7 @@ const uFormRef = ref(null);
 const form = reactive({
     sa_serviceorderid: 0,
     sa_orderid: 0,
-    servicetype: '', // 服务类型
+    servicetype: '安装', // 服务类型
     class1: '', // 产品品类
     class2: '', // 故障类型
     sku: '', // 序列号
@@ -178,12 +187,12 @@ const rules = reactive({
     itemno: [{ required: false, message: '请输入产品编号', trigger: 'blur' }],
     itemname: [{ required: true, message: '请选择产品', trigger: 'blur' }],
     model: [{ required: false, message: '请输入产品型号', trigger: 'blur' }],
-    cardno: [{ required: false, message: '请输入保修卡号', trigger: 'blur' }],
+    cardno: [{ required: false, message: '请选择保修卡号', trigger: 'blur' }],
     province: [{ required: true, message: '请选择省市县', trigger: 'change' }],
     address: [{ required: true, message: '请输入详细地址', trigger: 'blur' }],
     sa_customersid: [{ required: true }],
     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: '请输入正确的手机号码' }],
+    customerphonenumber: [{ required: false, 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: '请输入正确的手机号码' }],
 });
@@ -197,6 +206,7 @@ function changeClass2(e) {
 // 切换服务类型
 function servicetypeChange(type) {
     rules.class2[0].required = type == '维修';
+    rules.sku[0].required = type == '安装';
     uFormRef.value.setRules(rules);
 }
 
@@ -206,19 +216,19 @@ const class1 = 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' });
+        servertypes.value = res.data.map(v => v.value);
     });
 
     $Http.getClass('prodclass1').then(res => {
-        class1.value = res.data;
         if (res.code !== 1) return uni.showToast({ title: res.msg, icon: 'none' });
+        class1.value = res.data;
     });
 
     $Http.getClass('faulttype').then(res => {
+        if (res.code !== 1) return uni.showToast({ title: res.msg, icon: 'none' });
         class2.value = res.data;
         uFormRef.value.setRules(rules);
-        if (res.code !== 1) return uni.showToast({ title: res.msg, icon: 'none' });
     });
 });
 
@@ -387,15 +397,23 @@ function changeItem(item) {
 }
 
 function openScan() {
-    uni.navigateTo({
-        url: '/pages/bookingService/getCode'
+    uni.scanCode({
+        onlyFromCamera: true,
+        scanType: ['qrCode', 'barCode'],
+        success: (res) => {
+            console.log("扫码结果", res);
+            if (res.result) {
+                form.sku = res.result;
+                skuConfirm();
+            } else {
+                uni.showToast({ title: '扫码失败,请重试', icon: 'none' });
+            }
+        },
+        fail: (err) => {
+            console.error("扫码失败", err);
+            uni.showToast({ title: '扫码失败,请重试', icon: 'none' });
+        }
     });
-    $Http.getCode = (code) => {
-        form.sku = code || '';
-        skuConfirm();
-        uni.navigateBack()
-        delete $Http.getCode;
-    }
 }
 
 function toSelectMyProduct() {
@@ -403,14 +421,19 @@ function toSelectMyProduct() {
         url: '/pages/launchApplication/skus'
     });
     $Http.onSelected = (item) => {
-        ['customername', 'customerphonenumber', 'sku', 'cardno', 'itemid', 'itemname', 'itemno', 'model', 'unitname', 'spec', 'sa_customersid'].forEach(key => {
+        console.log("选择sku", item);
+        ['customername', 'customerphonenumber', 'sku', 'cardno', 'itemid', 'itemname', 'itemno', 'model', 'unitname', 'spec', 'sa_customersid', 'province', 'city', 'county', 'address'].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] || '';
+            try {
+                form[key] = item[key] || ''
+            } catch (error) {
+                form[key] = ''
+            }
         });
         uni.navigateBack()
         delete $Http.onSelected
@@ -422,7 +445,7 @@ function queryCustomer() {
         url: '/pages/launchApplication/customer'
     });
     $Http.onSelected = (item) => {
-        console.log("32332323", item);
+        console.log("选择客户档案", item);
         ['name', 'phonenumber', 'sa_customersid', 'province', 'city', 'county', 'address'].forEach(key => {
             if (key == 'name') {
                 form.scenecontact = item['name'];
@@ -432,7 +455,37 @@ function queryCustomer() {
                 form.customerphonenumber = item['phonenumber'];
                 form.scenecontactphonenumber = item['phonenumber'];
             }
-            if (item[key]) form[key] = item[key] || '';
+            try {
+                form[key] = item[key] || ''
+            } catch (error) {
+                form[key] = ''
+            }
+        })
+        uni.navigateBack()
+        delete $Http.onSelected
+    }
+}
+
+function cardnoCustomer() {
+    uni.navigateTo({
+        url: '/pages/launchApplication/cardno'
+    });
+    $Http.onSelected = (item) => {
+        console.log("保修卡选择", item);
+        ['name', 'phonenumber', 'sku', 'cardno', 'itemid', 'itemname', 'itemno', 'model', 'unitname', 'spec', 'sa_customersid', 'province', 'city', 'county', 'address'].forEach(key => {
+            if (key == 'name') {
+                form.scenecontact = item['name'];
+                form.customername = item['name'];
+                disabledCustomername.value = item['name'] != ''
+            } else if (key == 'phonenumber') {
+                form.customerphonenumber = item['phonenumber'];
+                form.scenecontactphonenumber = item['phonenumber'];
+            }
+            try {
+                form[key] = item[key] || ''
+            } catch (error) {
+                form[key] = ''
+            }
         })
         uni.navigateBack()
         delete $Http.onSelected

+ 1 - 1
utils/Http.js

@@ -44,7 +44,7 @@ class HTTP {
         }
 
         if (process.env.NODE_ENV === 'development') {
-            this.baseUrl = this.urls[1].url;
+            this.baseUrl = this.urls[0].url;
         } else {
             this.baseUrl = this.urls[0].url;
         }