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.

547 lines
14 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">
<el-select
filterable
size="small"
v-model="select.nurse_name"
placeholder="选择护理人姓名"
clearable
style="width: 160px;margin-right: 10px;"
>
<el-option
v-for="item in nurses"
:value="item.name"
:label="item.name"
:key="item.id"
></el-option>
</el-select>
<el-select
filterable
size="small"
v-model="select.customer_name"
placeholder="选择被护理人"
clearable
style="width: 160px;margin-right: 10px;"
>
<el-option
v-for="item in customers"
:value="item.name"
:label="item.name"
:key="item.id"
></el-option>
</el-select>
<el-date-picker v-model="pickedMonth" placeholder="选择月份" type="month" size="small" style="width: 160px;margin-right: 10px;" @change="pickMonth">
</el-date-picker>
<el-select
size="small"
v-model="select.status"
placeholder="选择状态"
clearable
style="width: 160px;margin-right: 10px;"
>
<el-option
v-for="item in [{value:0,label:'待护理'},{value:1,label:'护理中'},{value:2,label:'已护理'}]"
:value="item.value"
:label="item.label"
:key="item.value"
></el-option>
</el-select>
<!-- <Input-->
<!-- v-model="select.keyword"-->
<!-- placeholder="关键字搜索"-->
<!-- style="width: 180px; margin-right: 10px"-->
<!-- />-->
<Button
style="margin-right: 10px"
type="primary"
@click="total = 0,(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-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>
</template>
</xy-selectors>
<Button
style="margin-right: 10px"
type="primary"
@click="exports"
>导出</Button
>
</div>
</slot>
</lx-header>
</div>
<xy-table
:row-style="tableRowStyle"
: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" @refresh="getList"></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 {
pickedMonth:new Date(),
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: [
{
type:'index',
label:'序号',
width:54,
fixed:'left'
},
{
prop:'customer.name',
label:'被护理人',
width:118,
fixed:'left'
},
{
prop:'nurse.name',
label:'护理人',
width:118,
fixed:'left'
},
{
prop:'status_text',
label:'状态',
width:120
},
{
label:'计划时间',
width:200,
customFn:row => {
return (
<div>{this.$moment(row.start_time).format('YYYY-MM-DD HH:mm')} ~ {this.$moment(row.end_time).format('HH:mm')}</div>
)
}
},
{
prop:'sign_in',
label:'签到时间',
width:180
},
{
prop:'sign_out',
label:'签退时间',
width: 180
},
{
prop:'customer_address.name',
label:'上门地址',
minWidth:220,
align:'left'
},
{
width: 140,
label:'实际服务时间',
customFn:row => {
const getTime = () => {
if(row.sign_out && row.sign_in){
let seconds = this.$moment(row.sign_out).diff(row.sign_in,'seconds')
let point = seconds % 60
let min = parseInt(seconds / 60)
return `${min}分钟${point}`
}else{
return 0
}
}
return (
<span>{ getTime() }</span>
)
}
},
{
label:'勾选的服务时长',
width: 140,
customFn:row => {
return (
<span>{ (() => {
let total = 0;
row.sku.forEach(item => {
total += Number(item.time) ?? 0
})
return total;
})() }</span>
)
}
},
{
label:"勾选的服务明细",
minWidth: 200,
align: 'left',
customFn:row => {
return (
<div>
{ row.sku.map((item,index) => {
return (
<span>{ item.sku_info.name }{index === row.sku.length - 1 ? '' : ','}</span>
)
}) }
</div>
)
}
},
{
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
}
],
total: 0,
};
},
methods: {
tableRowStyle({row, rowIndex}){
let selectTime = row.sku.reduce((pre,cur) => {
return pre + Number(cur.time ?? 0)
},0)
let actTime = Math.round( this.$moment(row.sign_out).diff(row.sign_in,'seconds') / 60)
if(Math.abs(selectTime - actTime) <= 5){
return
}
if(Math.abs(selectTime - actTime) <= 10 && Math.abs(selectTime - actTime) > 5){
return {
'background':'rgb(255,227,150)'
}
}
if(Math.abs(selectTime - actTime) > 10){
return {
'background':'rgb(253,165,122)'
}
}
},
pickMonth(e){
if(e){
this.select.start_start_time = this.$moment(e).startOf('month').format('YYYY-MM-DD HH:mm:ss')
this.select.end_start_time = this.$moment(e).endOf('month').format('YYYY-MM-DD HH:mm:ss')
}else{
this.select.start_start_time = ''
this.select.end_start_time = ''
}
},
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.list.data
this.total = res.list.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.pickMonth(new Date())
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>
<style>
.has-time{
z-index:9998 !important;
}
</style>