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.

470 lines
12 KiB

<template>
<div>
<div ref="lxHeader">
<lx-header
icon="md-apps"
style="margin-bottom: 10px; border: 0px; margin-top: 15px"
text="服务明细视图"
>
<div slot="content"></div>
<slot>
<div style="display: flex">
<Input
v-model="select.keyword"
placeholder="关键字搜索"
style="width: 200px; margin-right: 10px"
/>
<Button
style="margin-right: 10px"
type="primary"
@click="(select.page = 1), getList()"
>查询</Button
>
<xy-selectors @search="(select.page = 1), getList()" @reset="reset">
<template>
<div class="select-item">
<div class="select-item__label">护工姓名</div>
<el-select
size="small"
v-model="select.nurse_name"
placeholder="选择护工姓名"
clearable
style="width: 200px"
>
<el-option
v-for="item in nurses"
:value="item.name"
:label="item.name"
:key="item.id"
></el-option>
</el-select>
</div>
<div class="select-item">
<div class="select-item__label">客户姓名</div>
<el-select
size="small"
v-model="select.customer_name"
placeholder="选择护工姓名"
clearable
style="width: 200px"
>
<el-option
v-for="item in customers"
:value="item.name"
:label="item.name"
:key="item.id"
></el-option>
</el-select>
</div>
<div class="select-item">
<div class="select-item__label">地址</div>
<el-input size="small" v-model="select.address_name" placeholder="请输入地址" style="width: 200px;"></el-input>
</div>
<div class="select-item">
<div class="select-item__label">实际签到开始时间</div>
<el-date-picker
size="small"
v-model="select.start_sign_in"
type="datetime"
value-format="yyyy-MM-dd hh:mm:ss"
placeholder="选择实际签到开始时间"
style="width: 200px"
>
</el-date-picker>
</div>
<div class="select-item">
<div class="select-item__label">实际签到结束时间</div>
<el-date-picker
size="small"
v-model="select.end_sign_in"
type="datetime"
value-format="yyyy-MM-dd hh:mm:ss"
placeholder="选择实际签到结束时间"
style="width: 200px"
>
</el-date-picker>
</div>
<div class="select-item">
<div class="select-item__label">计划签到开始时间</div>
<el-date-picker
size="small"
v-model="select.start_start_time"
type="datetime"
value-format="yyyy-MM-dd hh:mm:ss"
placeholder="选择计划签到开始时间"
style="width: 200px"
>
</el-date-picker>
</div>
<div class="select-item">
<div class="select-item__label">计划签到结束时间</div>
<el-date-picker
size="small"
v-model="select.end_start_time"
type="datetime"
value-format="yyyy-MM-dd hh:mm:ss"
placeholder="选择计划签到结束时间"
style="width: 200px"
>
</el-date-picker>
</div>
<div class="select-item">
<div class="select-item__label">状态</div>
<el-radio v-model="select.status" :label="0"
>待护理</el-radio
>
<el-radio v-model="select.status" :label="1"
>进行中</el-radio
>
<el-radio v-model="select.status" :label="2"
>已完成</el-radio
>
<el-radio v-model="select.status" label=""
>全部</el-radio
>
</div>
</template>
</xy-selectors>
<Button
style="margin-right: 10px"
type="primary"
@click="exports"
>导出</Button
>
</div>
</slot>
</lx-header>
</div>
<xy-table
:default-expand-all="false"
:list="list"
:table-item="table"
:total="total"
@pageIndexChange="
(e) => {
select.page = e;
getList();
}
"
@pageSizeChange="
(e) => {
select.page = 1;
select.page_size = e;
getList();
}
"
>
<template v-slot:btns>
<el-table-column label="操作" fixed="right" align="center" width="130">
<template v-slot:default="scope">
<Poptip
transfer
confirm
title="确认要删除?"
@on-ok="destroy(scope.row)"
>
<Button size="small" type="error" ghost style="margin-right: 6px"
>删除</Button
>
</Poptip>
<Button
size="small"
ghost
type="primary"
style="margin-right: 6px"
@click="e => {
selectedRow = scope.row;
$refs['draw'].select.id = scope.row.id;
$refs['draw'].isShow = true;
}"
>查看</Button
>
</template>
</el-table-column>
</template>
</xy-table>
<draw ref="draw" :type="2"></draw>
</div>
</template>
<script>
import { scheduleDelete } from "@/api/schedule/index"
import { getList as customerIndex } from "@/api/customer"
import { scheduleList } from "@/api/schedule";
import { getList as nurseList} from "@/api/worker"
import { download } from "@/utils/downloadRequest"
import draw from "./component/serveDraw.vue"
export default {
components:{
draw
},
provide(){
return {
selectedRow:() => this.selectedRow
}
},
data() {
return {
selectedRow:{},
customers:[],
nurses:[],
select: {
page: 1,
page_size: 10,
nurse_name:"",
customer_name:"",
address_name:"",
start_sign_in:"",
end_sign_in:"",
start_start_time:"",
end_start_time:"",
status:"",
is_export:0
},
list: [],
table: [
{
prop:'id',
label:'序号',
width:56
},
{
prop:'customer.name',
label:'被护理人',
width:120
},
{
prop:'nurse.name',
label:'护理人',
width:120
},
{
prop:'status',
label:'状态',
width:120,
formatter:(cell,data,val) => {
let map = new Map([
[0,'待护理'],
[1,'护理中'],
[2,'已护理']
])
return map.get(val)
}
},
{
prop:'date',
label:'计划时间',
width:180,
},
{
prop:'start_time',
label:'签到时间',
width:180
},
{
prop:'end_time',
label:'签退时间',
width: 180
},
{
prop:'customer_address.name',
label:'上门地址',
minWidth:220,
align:'left'
},
{
label:'已服务明细',
minWidth: 400,
customFn:row => {
return (
<div class="sku" style={
{
'display':'flex',
'flex-wrap':'wrap'
}
}>
{
(
() => {
let arr = [];
row?.sku?.forEach(item => {
if(item.time){
arr.push((
<div class="sku-item">
<div class="sku-item__name">
{ item.sku_info.name }
</div>
<div class="sku-item__time">
{ item.time || 0 }
</div>
</div>
))
}
})
return arr;
}
)()
}
</div>
)
}
},
{
prop:'product.name',
label:'产品',
width: 180
},
{
prop:'sign_in_address',
label:'签到地址',
minWidth: 220,
align:'left'
},
{
prop:'sign_out_address',
label:'签退地址',
minWidth: 220,
align:'left'
},
{
prop:'customer.area_detail.value',
label:'区',
width: 160
},
{
prop:'customer.street_detail.value',
label:'街道(镇)',
width: 160
},
{
prop:'created_at',
label:'创建日期',
width:180
},
{
prop:'admin.name',
label:'创建人',
width: 140
},
{
prop:'department.name',
label:'创建人部门',
width: 180
}
],
total: 0,
};
},
methods: {
destroy(row){
scheduleDelete({id:row.id}).then(res => {
this.$message({
type:'success',
message:'删除成功'
})
this.getList()
})
},
async getCustomers(){
const res = await customerIndex({
page:1,
page_size:999
})
this.customers = res.data.data
},
async getNurses(){
const res = await nurseList({
page:1,
page_size:999
})
this.nurses = res.data
},
async getList() {
const res = await scheduleList(this.select)
this.list = res.data
this.total = res.total
},
exports(){
download('/api/admin/chart/schedule-list-log','get',{
page: 1,
page_size: 9999,
status:this.select.status,
nurse_name:this.select.nurse_name,
customer_name:this.select.customer_name,
address_name:this.select.address_name,
start_sign_in:this.select.start_sign_in,
end_sign_in:this.select.end_sign_in,
start_start_time:this.select.start_start_time,
end_start_time:this.select.end_start_time,
is_export:1
},`服务明细.xlsx`)
},
reset() {
this.select = {
page: 1,
page_size: 10,
nurse_name:"",
customer_name:"",
address_name:"",
start_sign_in:"",
end_sign_in:"",
start_start_time:"",
end_start_time:"",
status:"",
is_export:0
}
},
},
computed: {},
created() {
this.getNurses()
this.getCustomers()
this.getList()
}
};
</script>
<style scoped lang="scss">
.select-item{
display: flex;
align-items: center;
&__label{
width: 140px;
padding: 10px 10px;
}
}
.sku{
&-item{
border: 1px solid $primaryColor;
border-radius: 4px;
margin-bottom: 4px;
margin-right: 6px;
&__name{
background: $primaryColor;
color:#fff;
padding: 0 4px;
}
&__time{
}
}
}
</style>