Compare commits

...

4 Commits

Author SHA1 Message Date
xiaofajia
27f2b505ff Merge branch 'dev' of http://122.51.230.86:3000/dianliang/lanan-system-vue into dev 2024-10-12 20:07:08 +08:00
xiaofajia
4362bcf887 维修工接单/维修班组长重新指派,维修工填写配件申请单 1/2 2024-10-12 20:06:56 +08:00
xiaofajia
c036fa3153 工单指派多选 2024-10-12 12:30:30 +08:00
xiaofajia
e33bda2f9a 优化 2024-10-12 09:34:47 +08:00
10 changed files with 290 additions and 43 deletions

View File

@ -63,3 +63,12 @@ export function updateCustomerAndCar(data){
data data
}) })
} }
// 分类查询工单分页
export function getPageType(params){
return request({
url: preUrl + "/pageType",
method: "get",
params
})
}

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<el-select ref="otherSelected" v-model="otherSelected" clearable @blur="$emit('input-blur', $event)"> <el-select ref="otherSelected" v-model="otherSelected" clearable filterable :filter-method="searchByName" @blur="$emit('input-blur', $event)">
<el-option v-for="other in otherList" :key="other.id" :label="other.name" :value="other.id" v-show="false"/> <el-option v-for="other in otherList" :key="other.id" :label="other.name" :value="other.id" v-show="false"/>
<el-table v-loading="loading" :data="otherList" :stripe="true" :show-overflow-tooltip="true" @row-click="rowClick"> <el-table v-loading="loading" :data="otherList" :stripe="true" :show-overflow-tooltip="true" @row-click="rowClick">
<el-table-column label="序号" align="center"> <el-table-column label="序号" align="center">
@ -8,20 +8,21 @@
<span>{{ scope.$index + 1 }}</span> <span>{{ scope.$index + 1 }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="名称" prop="name" width="180"/>
width="180" <!-- <el-table-column-->
align="right"> <!-- width="180"-->
<template slot="header" slot-scope="scope"> <!-- align="right">-->
<el-input <!-- <template slot="header" slot-scope="scope">-->
v-model="queryParams.name" <!-- <el-input-->
size="mini" <!-- v-model="queryParams.name"-->
@keyup.enter.native="getPage" <!-- size="mini"-->
placeholder="输入关键字搜索"/> <!-- @keyup.enter.native="getPage"-->
</template> <!-- placeholder="输入关键字搜索"/>-->
<template slot-scope="scope"> <!-- </template>-->
{{scope.row.name}} <!-- <template slot-scope="scope">-->
</template> <!-- {{scope.row.name}}-->
</el-table-column> <!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="价格" prop="price" :show-overflow-tooltip="true" width="180"/> <el-table-column label="价格" prop="price" :show-overflow-tooltip="true" width="180"/>
</el-table> </el-table>
<pagination @pagination="getPage" v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" <pagination @pagination="getPage" v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
@ -71,6 +72,10 @@ export default {
rowClick(row){ rowClick(row){
this.$emit("selected", row) this.$emit("selected", row)
this.$refs.otherSelected.blur() this.$refs.otherSelected.blur()
},
async searchByName(val){
this.queryParams.name = val
await this.getPage()
} }
} }
} }

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<el-select ref="projectSelect" v-model="projectSelected" clearable @blur="$emit('input-blur', $event)"> <el-select ref="projectSelect" v-model="projectSelected" clearable filterable :filter-method="searchByName" @blur="$emit('input-blur', $event)">
<el-option v-for="project in projectList" :key="project.id" :label="project.name" :value="project.id" v-show="false"/> <el-option v-for="project in projectList" :key="project.id" :label="project.name" :value="project.id" v-show="false"/>
<el-table v-loading="loading" :data="projectList" :stripe="true" :show-overflow-tooltip="true" @row-click="rowClick"> <el-table v-loading="loading" :data="projectList" :stripe="true" :show-overflow-tooltip="true" @row-click="rowClick">
<el-table-column label="序号" align="center"> <el-table-column label="序号" align="center">
@ -8,21 +8,21 @@
<span>{{ scope.$index + 1 }}</span> <span>{{ scope.$index + 1 }}</span>
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column label="商品名称" prop="name" :show-overflow-tooltip="true" width="180" />--> <el-table-column label="商品名称" prop="name" :show-overflow-tooltip="true" width="180" />
<el-table-column <!-- <el-table-column-->
width="180" <!-- width="180"-->
align="right"> <!-- align="right">-->
<template slot="header" slot-scope="scope"> <!-- <template slot="header" slot-scope="scope">-->
<el-input <!-- <el-input-->
v-model="queryParams.name" <!-- v-model="queryParams.name"-->
size="mini" <!-- size="mini"-->
@keyup.enter.native="listPage" <!-- @keyup.enter.native="listPage"-->
placeholder="输入关键字搜索"/> <!-- placeholder="输入关键字搜索"/>-->
</template> <!-- </template>-->
<template slot-scope="scope"> <!-- <template slot-scope="scope">-->
{{scope.row.name}} <!-- {{scope.row.name}}-->
</template> <!-- </template>-->
</el-table-column> <!-- </el-table-column>-->
<el-table-column label="规格" prop="spec" :show-overflow-tooltip="true" width="180"/> <el-table-column label="规格" prop="spec" :show-overflow-tooltip="true" width="180"/>
<el-table-column label="商品编码" prop="code" :show-overflow-tooltip="true" width="180"/> <el-table-column label="商品编码" prop="code" :show-overflow-tooltip="true" width="180"/>
</el-table> </el-table>
@ -73,6 +73,10 @@ export default {
rowClick(row){ rowClick(row){
this.$emit("selected", row) this.$emit("selected", row)
this.$refs.projectSelect.blur() this.$refs.projectSelect.blur()
},
async searchByName(val){
this.queryParams.name = val
await this.listPage()
} }
} }
} }

View File

@ -0,0 +1,74 @@
<template>
<div>
<el-select :loading="selectLoading" v-model="workerSelected" multiple clearable filterable :filter-method="changeQuery" @visible-change="handleChange">
<el-option v-for="worker in workerList"
:key="worker.id"
:label="worker.userName + ' ' + (worker.isLeads === '0' ? '维修工' : '班组长') + ' ' + getWorkType(worker.workType)"
:value="worker.id"/>
</el-select>
</div>
</template>
<script>
import {getWorkerPage} from '@/api/repair/repairworker'
import {DICT_TYPE} from "@/utils/dict";
export default {
name: "WorkerChoose",
props:{
value:{
type: [Object,Array]
}
},
data(){
return{
selectLoading: true,
workerSelected: null,
workerList:[],
queryParams:{
pageNo: 1,
pageSize: 10,
userName: null
},
}
},
watch:{
workerSelected(val){
const list = this.workerList.filter(item => val.includes(item.id))
this.$emit("input", list)
// this.$emit('input-blur')
}
},
mounted() {
this.listWorker()
},
methods:{
async listWorker(){
this.selectLoading = true
try{
const res = await getWorkerPage(this.queryParams)
this.workerList = res.data.records
}finally {
this.selectLoading = false
}
},
async changeQuery(val){
this.queryParams.userName = val
await this.listWorker()
},
handleChange(val){
if (!val){
this.$emit('input-blur')
}
},
getWorkType(val){
const data = this.getDictDatas(DICT_TYPE.REPAIR_WORK_TYPE)
return data.find(item => item.value === val).label
}
}
}
</script>
<style scoped lang="scss">
</style>

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<el-select ref="ticketSelect" v-model="ticketSelected" clearable> <el-select ref="ticketSelect" v-model="ticketSelected" clearable filterable :filter-method="searchByNo">
<el-option v-for="ticket in ticketList" :key="ticket.id" :label="ticket.ticketNo" :value="ticket.id" v-show="false"/> <el-option v-for="ticket in ticketList" :key="ticket.id" :label="ticket.ticketNo" :value="ticket.id" v-show="false"/>
<el-table v-loading="loading" :data="ticketList" :stripe="true" :show-overflow-tooltip="true" @row-click="rowClick"> <el-table v-loading="loading" :data="ticketList" :stripe="true" :show-overflow-tooltip="true" @row-click="rowClick">
<el-table-column label="序号" align="center"> <el-table-column label="序号" align="center">
@ -38,7 +38,8 @@ export default {
queryParams:{ queryParams:{
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
ticketsStatus: "01" ticketsStatus: "01",
ticketNo: null
} }
} }
}, },
@ -61,6 +62,10 @@ export default {
this.ticketSelected = row.id this.ticketSelected = row.id
this.$emit("selected", row.id) this.$emit("selected", row.id)
this.$refs.ticketSelect.blur() this.$refs.ticketSelect.blur()
},
async searchByNo(val){
this.queryParams.ticketNo = val
await this.listTicket()
} }
} }
} }

View File

@ -62,9 +62,9 @@
</el-table-column> </el-table-column>
<el-table-column align="center" label="施工人员" width="180" prop="repair"> <el-table-column align="center" label="施工人员" width="180" prop="repair">
<div v-if="scope.row.id" class="item" slot-scope="scope"> <div v-if="scope.row.id" class="item" slot-scope="scope">
<StaffChoose @input-blur="save(scope.row)" class="item__input" v-model="scope.row.repair" <WorkerChoose @input-blur="save(scope.row)" class="item__input" v-model="scope.row.repair"
:select-width="'15rem'" :is-get="scope.row.id"/> :select-width="'15rem'"/>
<span class="item__txt">{{ scope.row.repair ? scope.row.repair.name : scope.row.repair }}</span> <span class="item__txt">{{ scope.row.repair ? getRepairName(scope.row.repair) : scope.row.repair }}</span>
</div> </div>
</el-table-column> </el-table-column>
<el-table-column align="center" label="销售人员" width="180" prop="sale"> <el-table-column align="center" label="销售人员" width="180" prop="sale">
@ -132,10 +132,12 @@ import request from "@/utils/request";
import {getOtherByName} from "@/api/repair/other"; import {getOtherByName} from "@/api/repair/other";
import {getProjectByName} from "@/api/repair/project"; import {getProjectByName} from "@/api/repair/project";
import {getWaresByName} from "@/api/repair/wares"; import {getWaresByName} from "@/api/repair/wares";
import WorkerChoose from "@/views/repair/Components/WorkerChoose.vue";
export default { export default {
name: "TicketItem", name: "TicketItem",
components: { components: {
WorkerChoose,
OtherForm, OtherForm,
OtherChoose, ProjectChoose, RepairProjectForm, WaresForm, ServerChoose, StaffChoose, PartChoose OtherChoose, ProjectChoose, RepairProjectForm, WaresForm, ServerChoose, StaffChoose, PartChoose
}, },
@ -183,6 +185,7 @@ export default {
watch: { watch: {
list: { list: {
handler(val) { handler(val) {
// console.log(val)
this.$emit("tableData", val) this.$emit("tableData", val)
const coupons = val.filter(item => item.coupon).map(item => item.coupon) const coupons = val.filter(item => item.coupon).map(item => item.coupon)
if (coupons && coupons.length > 0) { if (coupons && coupons.length > 0) {
@ -192,7 +195,7 @@ export default {
deep: true deep: true
}, },
inListData(val) { inListData(val) {
console.log(val) // console.log(val)
if (val && val.length > 0) { if (val && val.length > 0) {
val.forEach(item => { val.forEach(item => {
item = { item = {
@ -281,7 +284,7 @@ export default {
}, },
/** 保存数据 */ /** 保存数据 */
save(row) { save(row) {
// TODO BUG // console.log(row)
if (row.id) { if (row.id) {
row.itemStatus = (row.repair && this.itemType === 'project') ? "02" : "01" row.itemStatus = (row.repair && this.itemType === 'project') ? "02" : "01"
row.totalPrice = row.count * row.price * (row.discount / 10) row.totalPrice = row.count * row.price * (row.discount / 10)
@ -387,8 +390,8 @@ export default {
}) })
} }
}, },
getCouponName(id) { getRepairName(data) {
// this. return data.map(item => item.userName).join(',')
} }
} }
} }

View File

@ -31,7 +31,7 @@
<el-table-column align="center" label="单价" width="180" prop="itemPrice"/> <el-table-column align="center" label="单价" width="180" prop="itemPrice"/>
<el-table-column align="center" label="折扣" width="180" prop="itemDiscount"/> <el-table-column align="center" label="折扣" width="180" prop="itemDiscount"/>
<el-table-column align="center" label="金额" width="180" prop="itemMoney"/> <el-table-column align="center" label="金额" width="180" prop="itemMoney"/>
<el-table-column align="center" label="施工人员" width="180" prop="repairName"/> <el-table-column align="center" label="施工人员" width="180" prop="repairNames"/>
<el-table-column align="center" label="销售人员" width="180" prop="saleName"/> <el-table-column align="center" label="销售人员" width="180" prop="saleName"/>
<el-table-column align="center" label="备注" width="180" prop="remark"/> <el-table-column align="center" label="备注" width="180" prop="remark"/>
</el-table> </el-table>

View File

@ -0,0 +1,113 @@
<template>
<div>
<!-- 搜索 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="90px">
<el-form-item label="关键字" prop="ticketNo">
<el-input style="width: 20rem" type="text" placeholder="工单号、车牌号、联系电话" v-model="queryParams.ticketNo"/>
</el-form-item>
<el-form-item label="时间" prop="searchTimeArray">
<el-date-picker
value-format="yyyy-MM-dd HH:mm:ss"
v-model="queryParams.searchTimeArray"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 操作 -->
<el-row :gutter="10" class="mb8">
<!-- todo 待补充 -->
<right-toolbar :showSearch.sync="showSearch"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="序号" align="center">
<template scope="scope">
<span>{{ scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column label="订单编号" align="center" prop="ticketNo" width="200"/>
<el-table-column label="维修类别" align="center" prop="repairType" width="180">
<template slot-scope="scope">
<dict-tag :type="DICT_TYPE.REPAIR_TYPE" v-model="scope.row.repairType"/>
</template>
</el-table-column>
<el-table-column label="客户名称" align="center" prop="userName" width="180"/>
<el-table-column label="车牌号" align="center" prop="carNo" width="180"/>
<el-table-column label="车系" align="center" prop="carBrandName" width="180"/>
<el-table-column label="手机号" align="center" prop="userMobile" width="180"/>
<el-table-column label="操作" fixed="right" align="center" width="180">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-view" @click="handleShow(scope.row)"
>查看
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
@pagination="listTickets"
/>
</div>
</template>
<script>
import {getPageType} from "@/api/repair/tickets/Tickets";
export default {
name: "TicketManagerItem",
props:{
//
isShow:{
type: Boolean,
},
isFinish:{
type: Boolean,
}
},
data() {
return {
queryParams: {
ticketNo: null,
searchTimeArray: [],
isFinish: this.isFinish ? "1" : "0"
},
showSearch: true,
loading: false,
list: [],
total: 0
}
},
mounted() {
if(this.isShow){
this.listTickets()
}
},
methods:{
async listTickets(){
const res = await getPageType(this.queryParams)
if (res.data){
this.list = res.data.records
this.total = res.data.total
}
},
handleQuery(){
},
resetQuery(){
},
handleShow(row){
}
}
}
</script>
<style scoped lang="scss">
</style>

View File

@ -552,8 +552,8 @@ export default {
itemPrice: item.price, itemPrice: item.price,
itemDiscount: item.discount, itemDiscount: item.discount,
itemMoney: item.totalPrice, itemMoney: item.totalPrice,
repairId: item?.repair?.id, repairIds: item?.repair.map(i => i.userId).join(','),
repairName: item?.repair?.name, repairNames: item?.repair.map(i => i.userName).join(','),
saleId: item?.sale?.id, saleId: item?.sale?.id,
saleName: item?.sale?.name, saleName: item?.sale?.name,
itemTypeId: item?.type?.id, itemTypeId: item?.type?.id,

View File

@ -0,0 +1,34 @@
<template>
<div class="app-container">
<el-tabs v-model="activeTab">
<el-tab-pane label="待完成工单" name="unFinish">
<TicketManagerItem :is-show="activeTab === 'unFinish'" :is-finish="false"/>
</el-tab-pane>
<el-tab-pane label="已完成工单" name="finish">
<TicketManagerItem :is-show="activeTab === 'finish'" :is-finish="true"/>
</el-tab-pane>
<el-tab-pane label="领料申请单" name="getApply">
</el-tab-pane>
<el-tab-pane label="退料申请单" name="backApply">
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import TicketManagerItem from "@/views/repair/tickets/Components/TicketManagerItem.vue";
export default {
name: "TicketManager",
components: {TicketManagerItem},
data(){
return{
activeTab: 'unFinish'
}
}
}
</script>
<style scoped lang="scss">
</style>