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.

887 lines
28 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div style="padding: 0 20px">
<div ref="lxHeader">
<lx-header icon="md-apps" text="问题管理" style="margin-bottom: 10px; border: 0px; margin-top: 15px">
<slot>
<div style="display: flex;justify-content: flex-start;flex-wrap: wrap;">
<DatePicker style='width:200px;margin-right: 10px;' placeholder="年份" placement="bottom" format='yyyy'
type="year" @on-change="changeYear"></DatePicker>
<el-date-picker @change="changeDate" v-model="select.dateRange" type="daterange"
value-format="yyyy-MM-dd" range-separator="至"
start-placeholder="开始日期" end-placeholder="结束日期"
style="width: 280px;margin-right: 10px;height:32px">
</el-date-picker>
<Input v-model="select.title" clearable style="width: 150px;margin-right: 10px;" placeholder="检查名称" />
<Select filterable clearable style='width:150px;margin-right: 10px;' v-model="select.status" placeholder="检查状态">
<Option v-for="item in statusList" :value="item.id">{{item.value}}</Option>
</Select>
<!-- <Select filterable clearable style='width:150px;margin-right: 10px;' v-model="select.mission_id" placeholder="问题来源">
<Option v-for="item in missionList" :value="item.id">{{item.name}}</Option>
</Select> -->
<Select filterable clearable style='width:150px;margin-right: 10px;' v-model="select.ask_id" placeholder="问题类型">
<Option v-for="item in askList" :value="item.id">{{item.value}}</Option>
</Select>
<Select filterable clearable style='width:150px;margin-right: 10px;' v-model="select.accept_department_ids" placeholder="责任部门">
<Option v-for="item in depList" :value="item.id">{{item.name}}</Option>
</Select>
<el-cascader :show-all-levels="false" class="height32" v-model="siteName" clearable :options="siteList" :props="{'label':'name','value':'id'}"
placeholder="请选择检查地点" style="width: 150px;margin-right: 10px;" @change="changeSite"></el-cascader>
<Input v-model="select.keyword" clearable style="width: 150px;margin-right: 10px;" placeholder="关键字搜索" />
<Button type="primary" @click="select.page=1,getList()">查询</Button>
<Button type="primary" style="margin-left: 10px;" @click="editorPatrol('','add')">添加</Button>
<!-- <Button type="primary" style='margin-left:10px;' @click="chooseEditorPatrol()">编辑</Button> -->
<Button type="primary" style="margin-left: 10px;" @click="importTable(new Date().getTime().toString())">导出</Button>
<!-- <Poptip v-if='is_guiji||is_chuzhang' transfer confirm title="确认要删除吗?" @on-ok="deleteList">
<Button type="primary" style="margin-left:10px;" ghost>删除</Button>
</Poptip> -->
</div>
</slot>
</lx-header>
</div>
<!-- @cell-click="cellClicks" -->
<div class="tablewrap">
<!-- <div class="tablemonth">
<el-checkbox v-model="checkAll" @change="handleCheckAllChange">全选</el-checkbox>
<div style="margin: 15px 0;"></div>
<el-tree
ref="missiontree"
:props="{
label: 'name',
children: 'pid_details'
}"
:data="missionList"
show-checkbox
node-key="id"
:default-checked-keys="selectMission"
@check-change="changeMonth">
</el-tree>
</div> -->
<div class="tablecontent">
<xy-table
:list="list"
:total="total"
stripe
:row-key="'id'"
:default-expand-all="false"
:treeProps="{children: 'children', hasChildren: 'hasChildren'}"
@cell-dblclick='cellClicks'
@selection-change='selectionChange'
@pageSizeChange="e => {select.page_size = e,getList()}"
@pageIndexChange="e => {select.page = e,getList()}"
:table-item="table">
<template v-slot:btns>
<el-table-column align='center' label="操作" fixed="right" width="80" header-align="center">
<template slot-scope="scope">
<template v-if="!scope.row.children || (scope.row.children && scope.row.children.length === 0)">
<div v-if="(is_guiji||is_chuzhang||scope.row.is_myself)&&!(scope.row.status==5||scope.row.status==6)">
<Button type="primary" style='margin-right:5px;margin-bottom:5px;' size="small" @click="showPatrol(scope.row.id,'show')">办理</Button>
</div>
<div v-else>
<Button size="small" style='margin-right:5px;margin-bottom:5px;' @click="showPatrol(scope.row.id,'show')">查看</Button>
</div>
<!-- <Button type="primary" style='margin-right:5px;margin-bottom:5px;' size="small" @click="showPatrol(scope.row.id,'show')">查看</Button> -->
<!-- <Button v-if="scope.row.status==1&&((scope.row.check_leader==1&&is_leader&&scope.row.leader_status===null)||(scope.row.check_main==1&&is_main_leader&&scope.row.main_status===null))" type="primary" style='margin-right:5px;margin-bottom:5px;' size="small" @click="showPatrol(scope.row.id,'leader')">确认</Button> -->
<!-- <Button v-if="scope.row.status==9&&((scope.row.re_check_leader==1&&is_leader&&scope.row.re_leader_status===null)||(scope.row.re_check_main==1&&is_main_leader&&scope.row.re_main_status===null))" type="primary" style='margin-right:5px;margin-bottom:5px;' size="small" @click="showPatrol(scope.row.id,'leaderconfirm')">审核</Button> -->
<div v-if='is_guiji||is_chuzhang||login_id==scope.row.admin_id'>
<Button type="primary" style='margin-right:5px;margin-bottom:5px;' size='small' @click="editorPatrol(scope.row.id,'editor')">编辑</Button>
</div>
<div v-if='is_guiji||is_chuzhang'>
<Poptip transfer confirm title="确认要删除吗?" @on-ok="deleteList(scope.row.id)">
<Button type="primary" style='margin-right:5px;margin-bottom:5px;' size='small' ghost>删除</Button>
</Poptip>
</div>
</template>
</template>
</el-table-column>
</template>
</xy-table>
</div>
</div>
<addPatrol ref='addPatrol' @refresh='getList'></addPatrol>
<showPatrol ref='showPatrol' @refresh='getList'></showPatrol>
</div>
</template>
<script>
import addPatrol from '../list/components/addPatrol.vue'
import showPatrol from '../list/components/showPatrol.vue'
import {
listpatrol,del,leads
} from '@/api/task/patrol.js'
import {getInfo} from "@/api/user.js";
import {
getparameteritem
} from "@/api/system/dictionary.js";
import {listunit} from '@/api/task/unit.js'
import {
listaddress
} from '@/api/address'
import {
listdept
} from "@/api/system/department.js"
import * as XLSX from "xlsx";
import {
saveAs
} from "file-saver";
import state from '@/store/modules/user.js'
import {
getMergeCells,
groupBy
} from '@/utils/contactTable.js'
export default{
components:{
addPatrol,
showPatrol
},
data(){
return{
year:(new Date()).getFullYear(),
missionList:[],
depList:[],
askList:[],
siteList: [],
siteListArr:[],
siteName:'',
select:{
keyword:'',
page:1,
page_size:10,
status:'',
myself:0,
mission_id:'',
site_id:'',
accept_department_ids:'',
ask_id:'',
sort_name:'date',
sort_type:"DESC",
year:'',
dateRange:[],
start_date:'',
end_date:'',
title:''
// pid:0
// myself_update:0
},
sectionList:[],
total:0,
statusLabel:[
// {
// id:-1,
// value:'已撤回'
// },
{
id:0,
value:'整改中',
type:''
},{
id:1,
value:'整改中',
type:''
},{
id:2,
value:'待接收',
type:'danger'
},{
id:3,
value:'整改中',
type:''
},{
id:4,
value:'整改中',
type:''
},{
id:5,
value:'已整改',
type:'success'
},{
id:6,
value:'退回',
type:'info'
},{
id:7,
value:'整改中',
type:''
},{
id:8,
value:'整改中',
type:''
},{
id:9,
value:'整改中',
type:''
}],
statusList:[
{
id:2,
value:'待接收'
},{
id:'0,1,2,3,4,7,8,9',
value:'整改中'
},{
id:5,
value:'已整改'
},{
id:6,
value:'退回'
}
],
currentTableList:[],
isIndeterminate:true,
checkAll:false,
selectMission:[],
table:[{
label:"问题类型",
prop:'ask_value',
width:120,
},{
label:"检查名称",
prop:'title',
align:'left'
},{
label:"问题描述",
prop:'ask_introduce',
align:'left'
},
{
label:"状态",
width:120,
prop:'fix_status_name'
},
{
label:"检查地点",
prop:'site_id',
// width:180,
align:'left',
width:240,
formatter: (cell, data, value, index) => {
return value?cell.site.name:cell.address
}
},
{
label:"发现日期",
prop:'date',
width:110,
},{
label:"责任科室",
prop:'ask_department',
width:200,
align:'center',
customFn: (row) => {
return(<div style={
{
'display':'flex',
'flex-wrap':'wrap',
"justify-content": "center"
}
}>
{
row.accept_department_ids_details&&row.accept_department_ids_details.length>0?
row.accept_department_ids_details.map(item=>{
return(<el-tag style={{'margin':'3px'}}>{item.name}</el-tag>)
})
:(row.accept_admin_ids_details&&row.accept_admin_ids_details.length>0?
row.accept_admin_ids_details.map(item=>{
return (<el-tag style={{'margin':'3px'}}>{item.name}</el-tag>)
})
:row.ask_department)
}
</div>)
}
},{
label:"上报人",
prop:'up_admin.name',
width:100,
}],
list:[],
// 权限判断
leads_list:{},
login_id:'',
department_id:'',
is_leader:false,
is_main_leader:false,
is_guiji:false,
is_chuzhang:false,
// is_my_inspection:false
// 导出
importtable:[{
label:"检查名称",
prop:'title',
},{
label:"发现时间",
prop:'date',
},{
label:"检查站点/地点",
prop:'site_name',
},{
label:"问题描述",
prop:'ask_introduce',
},{
label:"问题类型",
prop:'ask_value',
},{
label:"整改意见",
prop:'tips',
},{
label:"责任科室",
prop:'department_names',
},{
label:"计划整改日期",
prop:'plan_end_date',
},{
label:"整改情况",
prop:'fix_status_name',
},{
label:"完成日期",
prop:'fix_end_date',
},{
label:"上报人",
prop:'up_admin_name',
}],
}
},
// computed: {
// // 获取所有单元格合并数据
// spanArr() {
// for(var k in this.list){
// if (!this.list.length) return []
// const mergeCols = ['missionName'] // 需要合并的列(字段)
// // const data = groupBy(this.list, 'monthIndex')
// // console.log("data",data)
// return getMergeCells(this.list, this.table, mergeCols)
// }
// }
// },
created(){
// this.getUserId()
this.getLeads()
this.getList()
this.init()
// this.$nextTick(() => {
// this.getMissonList()
// });
},
methods: {
init(){
this.getMissonList()
this.getDep()
this.getAddress()
this.getAsk()
},
changeYear(e){
if(e){
this.year = e
this.select.year = e
// this.getMissonList()
// this.getList()
}
},
changeDate(e){
if(e){
this.select.start_date = e[0];
this.select.end_date = e[1];
}else{
this.select.start_date = "";
this.select.end_date = "";
this.select.dateRange = [];
}
},
selectionChange(e){
console.log(e)
let arr = []
if(e.length>0){
for(var k of e){
arr.push(k)
}
}else{
arr = []
}
this.sectionList = arr
},
// async getUserId(){
// const res = await getInfo()
// this.login_id = res.id
// this.department_id = res.department_id
// this.getList()
// this.getLeads()
// this.getDep()
// },
async getLeads(){
// await this.$store.dispatch("user/getLeads")
let obj = state.state
console.log("obj",obj)
this.login_id = obj.login_id
this.department_id = obj.department_id
this.leads_list = obj.leads_list
this.is_guiji = obj.is_guiji
this.is_chuzhang = obj.is_chuzhang
this.is_leader = obj.is_leader
this.is_main_leader = obj.is_main_leader
// const res = await leads()
// console.log("this.login_id",this.login_id)
// this.leads_list = res
// // 登陆人是否是规计科
// for(var g of res.guiji){
// if(this.login_id==g.id){
// this.is_guiji = true
// }
// }
// // 登陆人是否是处长室
// for(var c of res.chuzhang){
// if(this.login_id==c.id){
// this.is_chuzhang = true
// }
// }
// // 是否分管领导
// if(this.login_id==res.guiji_leader.id){
// this.is_leader = true
// }
// // 是否处长
// if(this.login_id==res.chuzhang_leader.id){
// this.is_main_leader = true
// }
},
spanMethod({
row,
colomn,
rowIndex,
columnIndex
}) {
return this.spanArr[rowIndex][columnIndex]
},
async getList(){
const res = await listpatrol({...this.select})
for(var k of res.data){
k.missionName = k.mission?k.mission.name:'日常巡查'
console.log("k.missionName",k.missionName)
k.is_myself = false
if(k.fix_status===null){
this.statusLabel.map(s=>{
if(s.id==k.status){
k.fix_status_name = s.value
}
})
// for(var s of this.statusLabel){
// if(item.id==k.status){
// k.fix_status_name = item.value
// }
// }
}else{
k.fix_status_name = k.fix_status==1?'已完成':'已列计划'
}
if(k.status==2||k.status==3||k.status==4||k.status==7){
if(k.accept_admin_ids&&k.accept_admin_ids.length>0){
for(var a of k.accept_admin_ids){
if(this.login_id==a){
k.is_myself = true
}
}
}
if(k.accept_department_ids&&k.accept_department_ids.length>0){
for(var d of k.accept_department_ids){
if(this.department_id==d){
k.is_myself = true
}
}
}
}
}
this.list = this.groupByAskId(res.data)
console.log("this.list",this.list)
// this.currentTableList = this.filterBySelectedMonths(this.list,this.selectMission)
// console.log("currentTableList",this.currentTableList)
this.total = res.total
},
groupByAskId(items) {
const groups = {};
items.forEach(item => {
const { ask_id } = item;
if (!groups[ask_id]) {
// 创建新组第一个元素作为父级的ask
groups[ask_id] = {
ask_id,
id:ask_id,
ask_value:item.ask.value,
ask: { ...item },
children: []
};
}
// 无论是否是第一个元素都添加到children数组
groups[ask_id].children.push({ ...item });
});
// 转换为数组格式
return Object.values(groups);
},
handleCheckAllChange() {
// let _checkAll = this.checkAll ? false : true
// console.log("_checkAll",_checkAll)
// this.checkAll = _checkAll
console.log("this.checkAll",this.checkAll)
this.select.page=1
if(this.checkAll){
let _sm = []
this.missionList.map(item=>{
_sm.push(item.id)
if(item.pid_details_count>0){
item.pid_details.map(p=>{
_sm.push(p.id)
})
}
})
this.selectMission = _sm
this.select.mission_id = ''
this.$refs.missiontree.setCheckedKeys(_sm);
this.getList()
}else{
this.selectMission = []
this.select.mission_id = ''
this.$refs.missiontree.setCheckedKeys([]);
this.getList()
}
this.isIndeterminate = true;
// let _arr = []
// _arr = this.filterBySelectedMonths(this.list,this.selectMission)
// this.currentTableList = _arr
},
changeMonth(data, checked, indeterminate){
console.log(data, checked, indeterminate);
// if(!this.checkAll){
if(checked){
if(this.selectMission.indexOf(data.id)==-1){
this.selectMission.push(data.id)
}
}else{
this.selectMission.map((item,index)=>{
if(item===data.id){
this.selectMission.splice(index,1)
}
})
}
this.select.mission_id = this.selectMission.join(',')
this.select.page=1
this.getList()
console.log("this.selectMission",this.selectMission)
},
filterBySelectedMonths(arr, selectMission) {
if (!selectMission || selectMission.length === 0) {
return arr;
}
// Ensure selectMission is an array even if it's a single value
if (!Array.isArray(selectMission)) {
selectMission = [selectMission];
}
return arr.filter(obj => {
// Check if there's at least one common month between obj.month and selectMission
return selectMission.some(selected => obj.missionName.includes(selected));
});
},
async getMissonList(){
console.log("this.unitTypeList",this.unitTypeList)
const res = await getparameteritem('unitTypeList')
for(var k of res.detail){
if(k.remark=='检查'){
const res1 = await listunit({
page:1,
page_size:999,
unit_type:k.id,
year:this.year,
pid:''
})
this.missionList = res1.data
this.missionList.unshift({
id:0,
name:'日常巡查'
})
}
}
},
getDep(){
listdept().
then((res) => {
this.depList = res;
}).catch(error => {
console.log(error)
reject(error)
})
},
getAddress() {
listaddress({
page: 1,
page_size: 9999
}).then(res=>{
this.siteListArr = res.data
let arr = this.contactSite(res.data)
this.siteList = arr
})
},
changeSite(e){
if(e){
this.select.site_id = e[1]
}
},
contactSite(arr) {
let tempArr = [],
newArr = []
for (let i = 0; i < arr.length; i++) {
if (tempArr.indexOf(arr[i].type) === -1) {
newArr.push({
type: arr[i].type,
name: arr[i]['type_detail']['value'],
children: [arr[i]]
})
tempArr.push(arr[i].type);
} else {
for (let j = 0; j < newArr.length; j++) {
if (newArr[j].type == arr[i].type) {
newArr[j].children.push(arr[i])
}
}
}
}
return newArr
},
async getAsk(label) {
const res = await getparameteritem('askList')
this.askList = res.detail
},
chooseEditorPatrol(){
if(this.sectionList.length>0){
if(this.sectionList.length==1){
if((this.is_guiji||this.is_chuzhang||this.login_id==this.sectionList[0].admin_id)){
this.editorPatrol(this.sectionList[0].id,'editor')
}else{
this.$Message.warning('没有权限编辑该检查');
return
}
// if(!(this.sectionList[0].status==0)){
// this.$Message.warning('该检查不可编辑');
// return
// }
// this.editorPatrol(this.sectionList[0].id,'editor')
}else{
this.$Message.warning('每次只能编辑一件检查');
}
}else{
this.$Message.warning('请选择需要编辑的检查');
}
},
editorPatrol(id,type){
if(type=='editor'){
this.$refs.addPatrol.id= id
this.$refs.addPatrol.mission_id = id
}
if(type=='add'){
this.$refs.addPatrol.mission_id = 0
}
this.$refs.addPatrol.type= type
this.$refs.addPatrol.department_id = this.department_id
this.$refs.addPatrol.login_id=this.login_id
this.$refs.addPatrol.isShow=true
},
cellClicks(e){
if(e.row.ask_value){
return
}
this.$refs.showPatrol.id= e.row.id
// this.$refs.showPatrol.id= id
// this.$refs.showPatrol.type= type
this.$refs.showPatrol.is_leader=this.is_leader
this.$refs.showPatrol.is_main_leader=this.is_main_leader
this.$refs.showPatrol.is_guiji=this.is_guiji
this.$refs.showPatrol.is_chuzhang=this.is_chuzhang
this.$refs.showPatrol.login_id=this.login_id
this.$refs.showPatrol.department_id=this.department_id
this.$refs.showPatrol.isShow = true
},
showPatrol(id,type){
this.$refs.showPatrol.id= id
this.$refs.showPatrol.type= type
this.$refs.showPatrol.is_leader=this.is_leader
this.$refs.showPatrol.is_main_leader=this.is_main_leader
this.$refs.showPatrol.is_guiji=this.is_guiji
this.$refs.showPatrol.is_chuzhang=this.is_chuzhang
this.$refs.showPatrol.login_id=this.login_id
this.$refs.showPatrol.department_id=this.department_id
this.$refs.showPatrol.isShow = true
},
async importTable(sheetName) {
const res = await listpatrol(Object.assign(this.select, {
page: 1,
page_size: 99999
}))
if (res.data) {
let headers = this.importtable.map(i => {
return {
key: i.prop,
title: i.label
}
})
for(var k of res.data){
{/* k.mission_name = k.mission?k.mission.name:'' */}
k.site_name = k.site?k.site.name:k.address
k.ask_value = k.ask?k.ask.value:''
k.up_admin_name = k.up_admin?k.up_admin.name:''
if(k.accept_department_ids_details&&k.accept_department_ids_details.length>0){
let arr = []
k.accept_department_ids_details.map(item=>{
arr.push(item.name)
})
k.department_names = arr.join(',')
}else if(k.accept_admin_ids_details&&k.accept_admin_ids_details.length>0){
let arr = []
k.accept_admin_ids_details.map(item=>{
arr.push(item.name)
})
k.department_names = arr.join(',')
}else{
k.department_names = k.ask_department
}
if(k.fix_status===null){
this.statusLabel.map(s=>{
if(s.id==k.status){
k.fix_status_name = s.value
}
})
// for(var s of this.statusLabel){
// if(item.id==k.status){
// k.fix_status_name = item.value
// }
// }
}else{
k.fix_status_name = k.fix_status==1?'已完成':'已列计划'
}
}
const data = res.data.map(row => headers.map(header => row[header.key]));
data.unshift(headers.map(header => header.title));
const wb = XLSX.utils.book_new();
const ws = XLSX.utils.aoa_to_sheet(data);
XLSX.utils.book_append_sheet(wb, ws, sheetName);
const wbout = XLSX.write(wb, {
bookType: 'xlsx',
bookSST: true,
type: 'array'
});
saveAs(new Blob([wbout], {
type: 'application/octet-stream'
}), `检查问题${sheetName}.xlsx`);
}
},
deleteList(id){
var that = this;
del(id).then(response => {
this.$Message.success('操作成功');
that.getList();
}).catch(error => {
console.log(error)
reject(error)
})
// if (this.sectionList.length>0) {
// let arr = []
// this.sectionList.map(item=>{
// arr.push(item.id)
// })
// del(arr.join(',')).then(response => {
// this.$Message.success('操作成功');
// that.getList();
// }).catch(error => {
// console.log(error)
// reject(error)
// })
// }else{
// this.$Message.warning('请选择要删除的数据');
// }
}
},
watch:{}
}
</script>
<style scoped>
.tablewrap{
display:flex;
}
.tablemonth{
width:15%;
background: #fff;
padding: 20px;
margin-right:1%;
}
.tablecontent{
width:100%
}
/deep/ .el-tree-node{
white-space: normal;
}
/deep/ .el-tree-node__content{
height: auto;
align-items: start;
}
/deep/ .el-table .cell.el-tooltip{
white-space: normal;
}
/deep/ .tablemonth .el-checkbox{
/* width:100%; */
padding: 4px 0;
}
/deep/ .tablemonth .el-checkbox__input{
vertical-align: top!important;
}
/deep/ .tablemonth .el-checkbox__label {
text-wrap:wrap;
}
/deep/ .el-tree-node__label{
/* text-wrap:wrap; */
}
/deep/ .v-table .el-table__body .missionName>div{
/* white */
/* vertical-align: top!important; */
}
/deep/ .el-icon-circle-close{
color:#fff
}
/deep/ .height32 .el-input__inner{
height: 32px;
vertical-align: top;
}
/deep/ .height32 .el-input__suffix{
height: 32px;
top: -4px;
color:#808695
}
/deep/ .height32 .is-reverse{
line-height: 32px;
}
/* /deep/ .el-table__body tr.el-table__row--striped td {
background-color: #C0C4CC!important;
} */
</style>