You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
557 lines
22 KiB
557 lines
22 KiB
<template>
|
|
<div class="app-container">
|
|
<div v-show="viewState == 1">
|
|
<div class="tab-header webtop">
|
|
<div>{{ viewTitle }}</div>
|
|
<div>
|
|
<el-button type="primary" size="small" :disabled="submitdisabled" @click="saveOrUpdate()">保存</el-button>
|
|
<el-button type="primary" size="small" :disabled="submitdisabled" @click="toService()">转维修单</el-button>
|
|
<el-button type="danger" size="small" :disabled="submitdisabled" @click="toCancellation()">作废</el-button>
|
|
<el-button type="info" size="small" @click="handleReturn()">关闭</el-button>
|
|
</div>
|
|
</div>
|
|
<div class="listconadd">
|
|
<el-form ref="form_obj" :model="formobj" :rules="rules" class="formaddcopy02">
|
|
<el-row style="border-top: 1px solid #e0e3eb">
|
|
<el-col :span="8">
|
|
<div class="span-sty">制单人</div>
|
|
<el-form-item><span class="addinputInfo">{{ formobj.createByName }}</span></el-form-item>
|
|
</el-col>
|
|
<el-col :span="6">
|
|
<div class="span-sty">制单部门</div>
|
|
<el-form-item><span class="addinputInfo">{{ formobj.deptName }}</span></el-form-item>
|
|
</el-col>
|
|
<el-col :span="10">
|
|
<div class="span-sty">制单日期</div>
|
|
<el-form-item><span class="addinputInfo">{{ formobj.createTime }}</span></el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
<el-row>
|
|
<el-col :span="8">
|
|
<div class="span-sty"><span class="icon">*</span>预约服务顾问</div>
|
|
<el-form-item>
|
|
<el-select class="addinputInfo" v-model="formobj.waitorName" placeholder="请选择" @change="waitorChange" clearable filterable>
|
|
<el-option v-for="item in user_list" :key="item.sid" :label="item.name" :value="item.name"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="6">
|
|
<div class="span-sty">预约设备</div>
|
|
<el-form-item><el-input class="addinputInfo addinputw" v-model="formobj.reserveEquip" clearable placeholder="" /></el-form-item>
|
|
</el-col>
|
|
<el-col :span="10">
|
|
<div class="span-sty"><span class="icon">*</span>预约时间</div>
|
|
<el-form-item>
|
|
<div class="addinputInfo">
|
|
<el-date-picker v-model="formobj.reserveStart" :picker-options="pickerStartData(formobj.reserveEnd)" style="width: 200px" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd HH:mm:ss" type="datetime" placeholder="选择日期" />
|
|
<span style="padding: 0 4px">至</span>
|
|
<el-date-picker v-model="formobj.reserveEnd" :picker-options="pickerEndData(formobj.reserveStart)" style="width: 200px" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd HH:mm:ss" type="datetime" placeholder="选择日期" />
|
|
</div>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
<el-row>
|
|
<el-col :span="8">
|
|
<div class="span-sty"><span class="icon">*</span>科目</div>
|
|
<el-form-item prop="subject">
|
|
<el-select class="addinputInfo" v-model="formobj.subject" :disabled="formobj.sitemVos.length > 0" placeholder="请选择" @change="changeSubject" clearable filterable>
|
|
<el-option v-for="item in subject_list" :key="item.subjectSid" :label="item.subject" :value="item.subject"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="16">
|
|
<div class="span-sty">备注</div>
|
|
<el-form-item><el-input class="addinputInfo addinputw" v-model="formobj.remarks" clearable placeholder="" /></el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
<div class="title">客户信息</div>
|
|
<el-row>
|
|
<el-col :span="8">
|
|
<div class="span-sty">客户</div>
|
|
<el-form-item>
|
|
<div style="display: flex;flex-direction: row;justify-content: space-between;align-items: center">
|
|
<div>
|
|
<span class="addinputInfo">{{ formobj.customerName }}</span>
|
|
</div>
|
|
<el-button type="primary" size="mini" @click="selectCustomer()">选择</el-button>
|
|
</div>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="6">
|
|
<div class="span-sty">联系电话</div>
|
|
<el-form-item><span class="addinputInfo">{{ formobj.mobile }}</span></el-form-item>
|
|
</el-col>
|
|
<el-col :span="10">
|
|
<div class="span-sty">车牌号/车架号</div>
|
|
<el-form-item><span class="addinputInfo">{{ formobj.vehMark }}/{{ formobj.vinNo }}</span></el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
<div class="title titleOne">
|
|
<div>维修项目</div>
|
|
<el-button type="primary" size="mini" class="btntopblueline" @click="serviceAdd">添加</el-button>
|
|
</div>
|
|
<el-table :key="serviceKey" :data="formobj.sitemVos" :index="index" border style="width: 100%">
|
|
<el-table-column fixed width="60" label="序号" type="index" :index="index + 1" align="center"/>
|
|
<el-table-column fixed label="操作" align="center" width="100">
|
|
<template slot-scope="scope">
|
|
<el-button type="danger" size="small" @click="serviceDelete(scope.$index)">删除</el-button>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column label="维修项目" align="center" width="300">
|
|
<template slot-scope="scope">
|
|
<el-popover placement="right" width="600" trigger="click">
|
|
<div>
|
|
<el-table :data="serviceData" v-loading="serviceLoading" highlight-current-row @current-change="serviceCurrentChange($event, scope.row)">
|
|
<el-table-column fixed prop="sitemName" label="项目名称" align="center" />
|
|
<el-table-column prop="sitemCode" label="项目编码" align="center" />
|
|
<el-table-column prop="hourPrice" label="工时单价" align="center" />
|
|
<el-table-column prop="hours" label="工时数" align="center" />
|
|
<el-table-column prop="price" label="销售价" align="center" />
|
|
</el-table>
|
|
<pagination v-show="serviceData.length > 0" :total="serviceQuery.total" :page.sync="serviceQuery.current" :limit.sync="serviceQuery.size" class="pagination" @pagination="serviceInput(scope.row.serviceItem)"/>
|
|
</div>
|
|
<el-input slot="reference" v-model="scope.row.serviceItem" @input="serviceInput(scope.row.serviceItem)" clearable placeholder="项目名称、拼音"/>
|
|
</el-popover>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="hourPrice" label="工时单价" align="center" width="150" />
|
|
<el-table-column prop="hours" label="工时数" align="center" width="150" />
|
|
<el-table-column prop="price" label="销售价" align="center" width="150" />
|
|
<el-table-column label="备注" align="center" min-width="200">
|
|
<template slot-scope="scope">
|
|
<el-input v-model="scope.row.remarks" clearable placeholder="" />
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
<div v-show="formobj.sid !== ''">
|
|
<div class="title">跟踪记录</div>
|
|
<el-row style="display: flex;flex-direction: row;justify-content: flex-start;align-items: center;">
|
|
<el-col :span="24">
|
|
<el-button type="primary" size="small" @click="handleClick('已联系,车主会如约来店')">已联系,车主会如约来店</el-button>
|
|
<el-button type="primary" size="small" @click="handleClick('已联系,电话未接听')">已联系,电话未接听</el-button>
|
|
<el-button type="primary" size="small" @click="handleClick('已联系,无效预约')">已联系,无效预约</el-button>
|
|
</el-col>
|
|
</el-row>
|
|
<el-row>
|
|
<el-col :span="24">
|
|
<el-form-item><el-input v-model="formobj.trackLog" type="textarea" :autosize="{ minRows: 2, maxRows: 6}" clearable placeholder="" /></el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
<el-row>
|
|
<el-col :span="24">
|
|
<el-button type="primary" size="small" @click="handleAdd">添加跟踪记录</el-button>
|
|
</el-col>
|
|
</el-row>
|
|
</div>
|
|
</el-form>
|
|
</div>
|
|
</div>
|
|
<!-- 选择客户 -->
|
|
<selectCustomer v-show="viewState == 2" ref="divCus" @backData="backData" @doback="resetState"/>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import req from '@/api/operation/preregistration'
|
|
import Pagination from '@/components/pagination'
|
|
import { selAllByOrgSidPath, selSubjectInfo, getServiceItemListPage } from '@/api/Common/dictcommons'
|
|
import selectCustomer from '@/components/publicPage/selectCustomer'
|
|
|
|
export default {
|
|
name: 'PreregistrationAdd',
|
|
components: {
|
|
Pagination,
|
|
selectCustomer
|
|
},
|
|
data() {
|
|
return {
|
|
viewTitle: '',
|
|
viewState: 1,
|
|
submitdisabled: false,
|
|
index: 0,
|
|
user_list: [],
|
|
subject_list: [],
|
|
// service服务
|
|
serviceKey: 1,
|
|
serviceLoading: false,
|
|
serviceQuery: {
|
|
current: 1,
|
|
size: 5,
|
|
total: 0,
|
|
params: {
|
|
sitemName: '',
|
|
useOrgSid: '',
|
|
subject: ''
|
|
}
|
|
},
|
|
serviceData: [],
|
|
formobj: {
|
|
sid: '',
|
|
createBySid: '',
|
|
remarks: '',
|
|
createByName: '',
|
|
billNo: '',
|
|
reserveStart: '',
|
|
reserveEnd: '',
|
|
waitorSid: '',
|
|
waitorName: '',
|
|
reserveEquip: '',
|
|
customerVehicleSid: '',
|
|
customerSid: '',
|
|
customerName: '',
|
|
mobile: '',
|
|
vehMark: '',
|
|
vehModel: '',
|
|
sitemVos: [],
|
|
orgPath: '',
|
|
createTime: '',
|
|
vinNo: '',
|
|
trackLog: '',
|
|
trackLogs: [],
|
|
deptSid: '',
|
|
deptName: '',
|
|
customerOrg: '',
|
|
userSid: '',
|
|
subjectSid: '',
|
|
subject: ''
|
|
},
|
|
rules: {
|
|
subject: [{ required: true, message: '科目不能为空', trigger: 'change' }]
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
// 限制开始日期只可选择今天之后的
|
|
pickerStartData(newtime) {
|
|
return {
|
|
disabledDate(time) {
|
|
if (newtime !== '') {
|
|
return time.getTime() < Date.now() - 8.64e7 || time.getTime() > new Date(newtime)
|
|
} else {
|
|
return time.getTime() < Date.now() - 8.64e7
|
|
}
|
|
}
|
|
}
|
|
},
|
|
// 限制截止日期只可选择开始日期之后的
|
|
pickerEndData(newtime) {
|
|
return {
|
|
disabledDate(time) {
|
|
return time.getTime() < new Date(newtime) || time.getTime() < Date.now() - 8.64e7
|
|
}
|
|
}
|
|
},
|
|
init() {
|
|
selAllByOrgSidPath({ orgSidPath: window.sessionStorage.getItem('defaultOrgPath') }).then((resp) => {
|
|
if (resp.success) {
|
|
this.user_list = resp.data
|
|
}
|
|
})
|
|
selSubjectInfo({ useOrgSid: window.sessionStorage.getItem('defaultOrgPath').substring(window.sessionStorage.getItem('defaultOrgPath').lastIndexOf('/') + 1) }).then((resp) => {
|
|
if (resp.success) {
|
|
this.subject_list = resp.data
|
|
}
|
|
})
|
|
},
|
|
showAdd() {
|
|
this.viewTitle = '【新增】预约单'
|
|
this.$nextTick(() => {
|
|
this.$refs['form_obj'].clearValidate()
|
|
})
|
|
this.init()
|
|
this.formobj.orgPath = window.sessionStorage.getItem('defaultOrgPath')
|
|
this.formobj.createByName = window.sessionStorage.getItem('name')
|
|
this.formobj.createBySid = window.sessionStorage.getItem('userSid')
|
|
this.formobj.userSid = window.sessionStorage.getItem('userSid')
|
|
this.formobj.deptName = window.sessionStorage.getItem('defaultOrgPathName').substring(window.sessionStorage.getItem('defaultOrgPathName').lastIndexOf('/') + 1)
|
|
this.formobj.deptSid = window.sessionStorage.getItem('defaultOrgPath').substring(window.sessionStorage.getItem('defaultOrgPath').lastIndexOf('/') + 1)
|
|
var nowDate = new Date()
|
|
var date = {
|
|
year: nowDate.getFullYear(),
|
|
month: nowDate.getMonth() + 1,
|
|
day: nowDate.getDate()
|
|
}
|
|
this.formobj.createTime = date.year + '-' + (date.month >= 10 ? date.month : '0' + date.month) + '-' + (date.day >= 10 ? date.day : '0' + date.day)
|
|
},
|
|
showEdit(sid) {
|
|
this.viewTitle = '【编辑】预约单'
|
|
this.$nextTick(() => {
|
|
this.$refs['form_obj'].clearValidate()
|
|
})
|
|
this.init()
|
|
req.fetchBySid(sid).then((res) => {
|
|
if (res.success) {
|
|
this.formobj = res.data
|
|
this.formobj.userSid = window.sessionStorage.getItem('userSid')
|
|
}
|
|
})
|
|
},
|
|
getNumber(val, limit) {
|
|
val = val.replace(/[^0-9.]/g, '') // 保留数字
|
|
val = val.replace(/^00/, '0.') // 开头不能有两个0
|
|
val = val.replace(/^\./g, '0.') // 开头为小数点转换为0.
|
|
val = val.replace(/\.{2,}/g, '.') // 两个以上的小数点转换成一个
|
|
val = val.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.'); // 只保留一个小数点
|
|
/^0\d+/.test(val) ? val = val.slice(1) : '' // 两位以上数字开头不能为0
|
|
const str = '^(\\d+)\\.(\\d{' + limit + '}).*$'
|
|
const reg = new RegExp(str)
|
|
if (limit === 0) {
|
|
// 不需要小数点
|
|
val = val.replace(reg, '$1')
|
|
} else {
|
|
// 通过正则保留小数点后指定的位数
|
|
val = val.replace(reg, '$1.$2')
|
|
}
|
|
return val
|
|
},
|
|
selectCustomer() {
|
|
this.viewState = 2
|
|
this.$refs['divCus'].showData(this.formobj.deptSid, '')
|
|
},
|
|
backData(value) {
|
|
this.viewState = 1
|
|
value = JSON.parse(JSON.stringify(value))
|
|
this.formobj.customerName = value.customerName
|
|
this.formobj.customerSid = value.sid
|
|
this.formobj.customerVehicleSid = value.customerVehicleSid
|
|
this.formobj.mobile = value.mobile
|
|
this.formobj.vehMark = value.vehMark
|
|
this.formobj.vinNo = value.vinNo
|
|
},
|
|
waitorChange(value) {
|
|
const choose = this.user_list.filter((item) => item.name === value)
|
|
if (choose.length > 0 && choose !== null) {
|
|
this.formobj.waitorSid = choose[0].sid
|
|
} else {
|
|
this.formobj.waitorSid = ''
|
|
}
|
|
},
|
|
changeSubject(value) {
|
|
const choose = this.subject_list.filter((item) => item.subject === value)
|
|
if (choose.length > 0 && choose !== null) {
|
|
this.formobj.subjectSid = choose[0].subjectSid
|
|
} else {
|
|
this.formobj.subjectSid = ''
|
|
}
|
|
},
|
|
serviceAdd() {
|
|
if (this.formobj.subject === '') {
|
|
this.$message({ showClose: true, type: 'error', message: '请先选择科目' })
|
|
return
|
|
}
|
|
this.formobj.sitemVos.push({
|
|
serviceItemSid: '',
|
|
serviceItem: '',
|
|
hourPrice: '',
|
|
hours: '',
|
|
price: '',
|
|
remarks: ''
|
|
})
|
|
},
|
|
serviceInput(value) {
|
|
if (this.formobj.subjectSid === '') {
|
|
this.$message({ showClose: true, type: 'error', message: '请先选择科目' })
|
|
return
|
|
}
|
|
this.serviceQuery.params.useOrgSid = this.formobj.deptSid
|
|
this.serviceQuery.params.sitemName = value
|
|
this.serviceQuery.params.subject = this.formobj.subject
|
|
this.serviceLoading = true
|
|
getServiceItemListPage(this.serviceQuery).then((response) => {
|
|
if (response.success) {
|
|
this.serviceLoading = false
|
|
this.serviceData = response.data.records
|
|
this.serviceQuery.total = response.data.total
|
|
} else {
|
|
this.serviceLoading = false
|
|
this.serviceData = []
|
|
this.serviceQuery.total = 0
|
|
}
|
|
})
|
|
},
|
|
serviceDelete(index) {
|
|
this.formobj.sitemVos.splice(index, 1)
|
|
},
|
|
serviceCurrentChange(value, row) {
|
|
row.serviceItemSid = value.sid
|
|
row.serviceItem = value.sitemName
|
|
row.hourPrice = value.hourPrice
|
|
row.hours = value.hours
|
|
row.price = value.price
|
|
row.remarks = value.remarks
|
|
document.body.click()
|
|
},
|
|
// 计算销售价=工时数*工时单价
|
|
computeXSJ(row) {
|
|
row.price = Math.round((parseFloat(row.hourPrice === '' ? '0' : row.hourPrice) * parseFloat(row.hours === '' ? '0' : row.hours)) * 100) / 100
|
|
},
|
|
// 计算工时数=销售价除以工时单价
|
|
computeGSS(row) {
|
|
row.hours = Math.round((parseFloat(row.price === '' ? '0' : row.price) / parseFloat(row.hourPrice === '' ? '0' : row.hourPrice)) * 100) / 100
|
|
},
|
|
handleClick(value) {
|
|
this.formobj.trackLog = value
|
|
},
|
|
handleAdd() {
|
|
if (this.formobj.trackLog !== '') {
|
|
req.saveTrackingRecord(this.formobj).then((res) => {
|
|
if (res.success) {
|
|
this.$message({ showClose: true, type: 'success', message: '添加成功' })
|
|
}
|
|
})
|
|
} else {
|
|
this.$message({ showClose: true, type: 'error', message: '跟踪记录不能为空' })
|
|
}
|
|
},
|
|
saveOrUpdate() {
|
|
if (this.formobj.waitorName === '') {
|
|
this.$message({ showClose: true, type: 'error', message: '预约服务顾问不能为空' })
|
|
return
|
|
}
|
|
if (this.formobj.reserveStart === '' || this.formobj.reserveEnd === '' || this.formobj.reserveStart === null || this.formobj.reserveEnd === null) {
|
|
this.$message({ showClose: true, type: 'error', message: '预约时间不能为空' })
|
|
return
|
|
}
|
|
if (this.formobj.customerName === '') {
|
|
this.$message({ showClose: true, type: 'error', message: '客户信息不能为空' })
|
|
return
|
|
}
|
|
if (this.formobj.sitemVos.length === 0) {
|
|
this.$message({ showClose: true, type: 'error', message: '维修项目列表不能为空' })
|
|
return
|
|
}
|
|
this.$refs['form_obj'].validate((valid) => {
|
|
if (valid) {
|
|
this.submitdisabled = true
|
|
req.saveOrUpdate(this.formobj).then((res) => {
|
|
if (res.success) {
|
|
this.$message({ showClose: true, type: 'success', message: '保存成功' })
|
|
this.handleReturn('true')
|
|
} else {
|
|
this.submitdisabled = false
|
|
}
|
|
}).catch(() => {
|
|
this.submitdisabled = false
|
|
})
|
|
}
|
|
})
|
|
},
|
|
toService() {
|
|
if (this.formobj.waitorName === '') {
|
|
this.$message({ showClose: true, type: 'error', message: '预约服务顾问不能为空' })
|
|
return
|
|
}
|
|
if (this.formobj.reserveStart === '' || this.formobj.reserveEnd === '') {
|
|
this.$message({ showClose: true, type: 'error', message: '预约时间不能为空' })
|
|
return
|
|
}
|
|
if (this.formobj.customerName === '') {
|
|
this.$message({ showClose: true, type: 'error', message: '客户信息不能为空' })
|
|
return
|
|
}
|
|
if (this.formobj.sitemVos.length === 0) {
|
|
this.$message({ showClose: true, type: 'error', message: '维修项目列表不能为空' })
|
|
return
|
|
}
|
|
this.$refs['form_obj'].validate((valid) => {
|
|
if (valid) {
|
|
this.submitdisabled = true
|
|
req.convertedRepairOrders(this.formobj).then((res) => {
|
|
if (res.success) {
|
|
this.$message({ showClose: true, type: 'success', message: '保存成功' })
|
|
this.handleReturn('true')
|
|
} else {
|
|
this.submitdisabled = false
|
|
}
|
|
}).catch(() => {
|
|
this.submitdisabled = false
|
|
})
|
|
}
|
|
})
|
|
},
|
|
toCancellation() {
|
|
const tip = '请确认是否作废该预约单'
|
|
this.$confirm(tip, '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
const loading = this.$loading({
|
|
lock: true,
|
|
text: 'Loading',
|
|
spinner: 'el-icon-loading',
|
|
background: 'rgba(0, 0, 0, 0.7)'
|
|
})
|
|
req.invalid({ sid: this.formobj.sid }).then((res) => {
|
|
if (res.success) {
|
|
loading.close()
|
|
this.$message({ showClose: true, type: 'success', message: '作废成功' })
|
|
this.handleReturn('true')
|
|
}
|
|
}).catch(() => {
|
|
loading.close()
|
|
})
|
|
}).catch(() => {
|
|
})
|
|
},
|
|
resetState() {
|
|
this.viewState = 1
|
|
},
|
|
handleReturn(isreload) {
|
|
if (isreload === 'true') this.$emit('reloadlist')
|
|
this.formobj = {
|
|
sid: '',
|
|
createBySid: '',
|
|
remarks: '',
|
|
createByName: '',
|
|
billNo: '',
|
|
reserveStart: '',
|
|
reserveEnd: '',
|
|
waitorSid: '',
|
|
waitorName: '',
|
|
reserveEquip: '',
|
|
customerVehicleSid: '',
|
|
customerSid: '',
|
|
customerName: '',
|
|
mobile: '',
|
|
vehMark: '',
|
|
vehModel: '',
|
|
sitemVos: [],
|
|
orgPath: '',
|
|
createTime: '',
|
|
vinNo: '',
|
|
trackLog: '',
|
|
trackLogs: [],
|
|
deptSid: '',
|
|
deptName: '',
|
|
customerOrg: '',
|
|
userSid: '',
|
|
subjectSid: '',
|
|
subject: ''
|
|
}
|
|
this.submitdisabled = false
|
|
this.$emit('doback')
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
.span-sty {
|
|
width: 130px !important;
|
|
}
|
|
.addinputInfo {
|
|
margin-left: 120px !important;
|
|
}
|
|
.formaddcopy02 .el-row .el-col /deep/ .el-form-item .addinputw {
|
|
margin-left: 120px !important;
|
|
width: calc(100% - 115px);
|
|
}
|
|
.titleOne{
|
|
padding: 7px;
|
|
display: flex;
|
|
flex-direction: row;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
}
|
|
</style>
|
|
|