ticket&component

This commit is contained in:
shijing 2022-07-14 09:02:15 +08:00
parent b2d50e536a
commit 490c0e489d
15 changed files with 1540 additions and 936 deletions

BIN
public/img/nodata.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -82,6 +82,14 @@ export default {
data); data);
} }
}, },
cateAgg: {
name: "时间分类聚合",
req: async function(data){
return await http.post(
`${config.API_URL}/ecm/event/cate_agg/`,
data);
}
},
} }
, ,

View File

@ -99,8 +99,8 @@ export default {
}, },
ticketAccept: { ticketAccept: {
name: "接单", name: "接单",
req: async function(id){ req: async function(id,data){
return await http.post(`${config.API_URL}/wf/ticket/${id}/accpet/`); return await http.post(`${config.API_URL}/wf/ticket/${id}/accpet/`,data);
} }
}, },
addNodeEnd: { addNodeEnd: {
@ -118,7 +118,7 @@ export default {
ticketClose: { ticketClose: {
name: "关闭工单", name: "关闭工单",
req: async function(id,data){ req: async function(id,data){
return await http.post(`${config.API_URL}/wf/ticket/{id}/close/`,data); return await http.post(`${config.API_URL}/wf/ticket/${id}/close/`,data);
} }
}, },
ticketDeliver: { ticketDeliver: {

View File

@ -0,0 +1,274 @@
<template>
<el-button
v-if="selectable"
type="primary"
circle
size="mini"
icon="el-icon-plus"
@click="showDialog()"
/>
<el-dialog
title="选择人员"
width="80%"
v-model="dialoguser"
:before-close="handleClose"
:append-to-body="true"
:close-on-click-modal="false"
>
<el-row>
<el-col :md="8" :sm="24">
<el-main class="nopadding">
<el-tabs type="border-card" stretch="true">
<el-tab-pane label="按部门分类">
<el-input placeholder="输入关键字进行过滤" v-model="filterText">
</el-input>
<el-tree
class="filter-tree"
style="padding-top: 15px"
:data="deptdata"
default-expand-all
:filter-node-method="filterNode"
ref="tree"
@node-click="handleNodeClick"
>
</el-tree>
</el-tab-pane>
<el-tab-pane label="按岗位分类">
<el-input
placeholder="输入关键字进行过滤"
v-model="filterTexts"
>
</el-input>
<el-tree
class="filter-tree"
style="padding-top: 15px"
:data="postdata"
default-expand-all
:filter-node-method="filterNodes"
ref="tree"
@node-click="handleNodeClicks"
>
</el-tree>
</el-tab-pane>
</el-tabs>
</el-main>
</el-col>
<el-col :md="16" :sm="24">
<el-header style="border-bottom: none">
<div class="left-panel">
<el-input
v-model="search.keyword"
placeholder="姓名"
clearable
@click="upsearch"
></el-input>
<el-button
type="primary"
icon="el-icon-search"
@click="upsearch"
></el-button>
</div>
</el-header>
<el-main class="nopadding">
<el-table
ref="userTable"
:data="apiObj"
row-key="id"
stripe
height="400"
@selection-change="selectionChange"
>
<el-table-column type="selection" width="50"></el-table-column>
<el-table-column
label="#"
type="index"
width="50"
></el-table-column>
<el-table-column label="姓名" prop="name"></el-table-column>
<el-table-column label="手机号" prop="phone"></el-table-column>
<el-table-column label="部门" prop="belong_dept">
<template #default="scope">
<span v-if="scope.row.belong_dept_">{{scope.row.belong_dept_.name}}</span>
</template>
</el-table-column>
<el-table-column
label="创建时间"
prop="create_time"
></el-table-column>
</el-table>
</el-main>
<div class="right-panel">
<el-button
@click="handleClose"
style="float: right"
>
</el-button>
<el-button
type="primary"
:loading="isSaveing"
@click="submitfrom()"
style="float: right;margin-right: 10px"
>确定
</el-button>
</div>
</el-col>
</el-row>
</el-dialog>
</template>
<script>
import {genTree} from "@/utils/verificate";
export default {
name: "employee",
components: {},
props: {
value: {
// v-model
type: [String],
default: "",
},
user: {
// v-model
type: [String],
default: "",
},
multiple: {
type: Boolean,
default: false,
},
},
data() {
return {
apiObj: [],
query: {},
selection: [],
search: {
keyword: null,
},
filterText: "",
filterTexts: "",
deptdata: [],
postdata: [],
username: [],
selectable: true,
dialoguser: false,
isSaveing: false,
dataValue: this.value,
};
},
mounted() {
this.getUser();
this.getDept();
this.getPost();
},
watch: {
filterText(val) {
this.$refs.tree.filter(val);
},
filterTexts(val) {
this.$refs.tree.filter(val);
},
dataValue(val) {
this.$emit("input", val);
console.log(val)
},
},
methods: {
showDialog() {
this.dialoguser = true;
this.$nextTick(function () {
this.apiObj.map(item => {
if (item.id === this.user) {
this.$refs.table.toggleRowSelection(item, true)
}
})
})
},
//
getUser() {
this.$API.system.user.list.req({page: 0}).then((res) => {
this.apiObj = res;
});
},
upsearch() {
this.$API.system.user.list
.req({name: this.search.keyword, page: 0})
.then((res) => {
this.apiObj = res;
});
},
//
async getDept() {
let res = await this.$API.system.dept.list.req({page: 0});
this.deptdata = genTree(res);
},
//
async getPost() {
let res = await this.$API.system.post.list.req({page: 0});
this.postdata = genTree(res);
},
filterNode(value, data) {
console.log(value);
if (!value) return true;
return data.label.indexOf(value) !== -1;
},
filterNodes(value, data) {
console.log(value);
if (!value) return true;
return data.label.indexOf(value) !== -1;
},
//
handleNodeClick(data) {
this.$API.system.user.list
.req({belong_dept: data.id, page: 0})
.then((res) => {
this.apiObj = res;
});
},
//
handleNodeClicks(data) {
this.$API.system.user.list.req({post: data.id, page: 0}).then((res) => {
this.apiObj = res;
});
},
//
selectionChange(selection) {
if (selection.length > 1) {
let del_row = selection.shift();
this.selection = selection[1];
this.$refs.userTable.toggleRowSelection(del_row, false); // 使selected true
}else{
this.selection = selection;
}
},
submitfrom() {
if(this.selection.length===1){
let obj={id:this.selection[0].id,name:this.selection[0].name};
this.$emit("handlerSubmit", obj);
this.dialoguser = false;
}else{
this.$message.warning('请选择您要加签的处理人')
}
},
resetQuery() {
this.query = {};
},
handleClose(){
this.$confirm(`您未更改人员,确定关闭吗?`, '提示', {
type: 'warning'
}).then(() => {
this.dialoguser = false;
})
},
},
};
</script>

View File

@ -14,6 +14,7 @@ import scFormTable from './components/scFormTable'
import scTableSelect from './components/scTableSelect' import scTableSelect from './components/scTableSelect'
import scPageHeader from './components/scPageHeader' import scPageHeader from './components/scPageHeader'
import scSelect from './components/scSelect' import scSelect from './components/scSelect'
import scUserSelect from './components/scSelect/userselect'
import scDialog from './components/scDialog' import scDialog from './components/scDialog'
import scForm from './components/scForm' import scForm from './components/scForm'
import scTitle from './components/scTitle' import scTitle from './components/scTitle'
@ -59,13 +60,14 @@ export default {
app.component('scWaterMark', scWaterMark); app.component('scWaterMark', scWaterMark);
app.component('scQrCode', scQrCode); app.component('scQrCode', scQrCode);
app.component('scStatusIndicator', scStatusIndicator); app.component('scStatusIndicator', scStatusIndicator);
app.component('scUserSelect', scUserSelect);
app.component('scTrend', scTrend); app.component('scTrend', scTrend);
//注册全局指令 //注册全局指令
app.directive('auth', auth) app.directive('auth', auth);
app.directive('role', role) app.directive('role', role);
app.directive('time', time) app.directive('time', time);
app.directive('copy', copy) app.directive('copy', copy);
//统一注册el-icon图标 //统一注册el-icon图标
for(let icon in elIcons){ for(let icon in elIcons){

View File

@ -1,266 +1,281 @@
<template> <template>
<el-Dialog <el-Dialog
:title="titleMap[mode]" :title="titleMap[mode]"
v-model="visible" v-model="visible"
destroy-on-close destroy-on-close
@closed="closeDrawer" @closed="closeDrawer"
> >
<el-form <el-form
ref="dialogForm" ref="dialogForm"
:model="form" :model="form"
:rules="rules" :rules="rules"
:disabled="mode === 'show'" :disabled="mode === 'show'"
label-width="120px" label-width="120px"
> >
<el-row> <el-row>
<el-col :md="12" :sm="24"> <el-col :md="12" :sm="24">
<el-form-item label="区域名称" prop="name"> <el-form-item label="区域名称" prop="name">
<el-input <el-input
v-model="form.name" v-model="form.name"
placeholder="请输入真实姓名" placeholder="请输入真实姓名"
clearable clearable
></el-input> ></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :md="12" :sm="24"> <el-col :md="12" :sm="24">
<el-form-item label="区域类型" prop="cate"> <el-form-item label="区域类型" prop="cate">
<el-select v-model="form.cate" style="width: 100%"> <el-select v-model="form.cate" style="width: 100%">
<el-option <el-option
v-for="item in cateOptions" v-for="item in cateOptions"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :md="12" :sm="24"> <el-col :md="12" :sm="24">
<el-form-item label="风险等级" prop="level"> <el-form-item label="风险等级" prop="level">
<el-select v-model="form.level" style="width: 100%"> <el-select v-model="form.level" style="width: 100%">
<el-option <el-option
v-for="item in levelOptions" v-for="item in levelOptions"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :md="12" :sm="24"> <el-col :md="12" :sm="24">
<el-form-item label="区域编号"> <el-form-item label="区域编号">
<el-input <el-input
v-model="form.number" v-model="form.number"
placeholder="请输入手机号" placeholder="请输入手机号"
clearable clearable
></el-input> ></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :md="12" :sm="24"> <el-col :md="12" :sm="24">
<el-form-item label="所属部门"> <el-form-item label="所属部门">
<el-cascader <el-cascader
v-model="form.dept" v-model="form.dept"
:options="group" :options="group"
:props="groupsProps" :props="groupsProps"
clearable clearable
style="width: 100%" style="width: 100%"
> >
</el-cascader> </el-cascader>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :md="12" :sm="24"> <el-col :md="12" :sm="24">
<el-form-item label="区域负责人"> <el-form-item label="区域负责人">
<el-select v-model="form.manager" placeholder="选择区域负责人"> <el-select v-model="form.manager" placeholder="选择区域负责人">
<el-option <el-option
v-for="item in useroptions" v-for="item in useroptions"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :md="12" :sm="24"> <el-col :md="12" :sm="24">
<el-form-item label="最小人员数"> <el-form-item label="最小人员数">
<el-input <el-input
v-model="form.count_people_min" v-model="form.count_people_min"
placeholder="最小人员数" placeholder="最小人员数"
clearable clearable
></el-input> ></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :md="12" :sm="24"> <el-col :md="12" :sm="24">
<el-form-item label="最大人员数"> <el-form-item label="最大人员数">
<el-input <el-input
v-model="form.count_people_max" v-model="form.count_people_max"
placeholder="最大人员数" placeholder="最大人员数"
clearable clearable
></el-input> ></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :md="12" :sm="24"> <el-col :md="12" :sm="24">
<el-form-item label="当前人数"> <el-form-item label="当前人数">
<el-input <el-input
v-model="form.count_people" v-model="form.count_people"
placeholder="当前人数" placeholder="当前人数"
clearable clearable
></el-input> ></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :md="12" :sm="24"> <el-col :md="12" :sm="24">
<el-form-item label="准许访客人员"> <el-form-item label="准许访客人员">
<el-switch v-model="form.visitor_yes" /> <el-switch v-model="visitor_yes"/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :md="12" :sm="24"> <el-col :md="12" :sm="24">
<el-form-item label="准许相关方人员"> <el-form-item label="准许相关方人员">
<el-switch v-model="form.remployee_yes" /> <el-switch v-model="remployee_yes"/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :md="12" :sm="24"> <el-col :md="12" :sm="24">
<el-form-item label="准许全部员工"> <el-form-item label="准许全部员工">
<el-switch v-model="form.employee_yes" /> <el-switch v-model="employee_yes"/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button type="primary" :loading="isSaveing" @click="submit"> <el-button type="primary" :loading="isSaveing" @click="submit">
保存 保存
</el-button> </el-button>
<el-button @click="visible = false">取消</el-button> <el-button @click="visible = false">取消</el-button>
</template> </template>
</el-Dialog> </el-Dialog>
</template> </template>
<script> <script>
import { genTree } from "@/utils/verificate"; import {genTree} from "@/utils/verificate";
const defaultForm = {
id: null, const defaultForm = {
name: "", id: null,
level: 10, name: "",
number: "", level: 10,
visitor_yes: false, number: "",
remployee_yes: false, access_list:[],
employee_yes: false, belong_dept: "",
belong_dept: "", count_people_min: 1,
count_people_min: 1, count_people_max: 1,
count_people_max: 1, count_people: 0,
count_people: 0, cate: 10,
cate: 10, };
}; export default {
export default { emits: ["success", "closed"],
emits: ["success", "closed"], data() {
data() { return {
return { loading: false,
loading: false, mode: "add",
mode: "add", titleMap: {
titleMap: { add: "新增区域",
add: "新增区域", edit: "区域编辑",
edit: "区域编辑", },
}, levelOptions: [
levelOptions: [ {id: 10, name: "低风险"},
{ id: 10, name: "低风险" }, {id: 20, name: "一般风险"},
{ id: 20, name: "一般风险" }, {id: 30, name: "较大风险"},
{ id: 30, name: "较大风险" }, {id: 40, name: "重大风险"},
{ id: 40, name: "重大风险" }, ],
], cateOptions: [
cateOptions: [ {id: 10, name: "生活区域"},
{ id: 10, name: "生活区域" }, {id: 20, name: "一般区域"},
{ id: 20, name: "一般区域" }, {id: 30, name: "重点区域"},
{ id: 30, name: "重点区域" }, ],
], visible: false,
visible: false, isSaveing: false,
isSaveing: false, form: defaultForm,
form: defaultForm, useroptions: [],
useroptions:[], //
// rules: {
rules: { name: [{required: true, message: "请输入区域名称"}],
name: [{ required: true, message: "请输入区域名称" }], level: [{required: true, message: " 区域风险等级"}],
level: [{ required: true, message: " 区域风险等级" }], cate: [{required: true, message: "区域分类"}],
cate: [{ required: true, message: "区域分类" }], },
}, groupsProps: {
groupsProps: { // value: "id",
// value: "id", multiple: false,
multiple: false, emitPath: false,
emitPath: false, checkStrictly: true,
checkStrictly: true, },
}, visitor_yes: false,
group: [], remployee_yes: false,
postOptions: [], employee_yes: false,
selectionFilters: [], group: [],
}; postOptions: [],
}, selectionFilters: [],
mounted() { };
this.getGroup(); },
this.getUser(); mounted() {
}, this.getGroup();
methods: { this.getUser();
// },
async getGroup() { methods: {
let res = await this.$API.system.dept.list.req({ page: 0 }); //
this.group = genTree(res); async getGroup() {
}, let res = await this.$API.system.dept.list.req({page: 0});
// this.group = genTree(res);
getUser() { },
this.$API.system.user.list.req({ page: 0 }).then((res) => { //
this.useroptions = res; getUser() {
}); this.$API.system.user.list.req({page: 0}).then((res) => {
}, this.useroptions = res;
// });
open(mode) { },
this.mode = mode; //
this.visible = true; open(mode) {
return this; this.mode = mode;
}, this.visible = true;
closeDrawer() { return this;
this.visible = false; },
this.$emit("closed"); closeDrawer() {
}, this.visible = false;
// this.$emit("closed");
submit() { },
this.$refs.dialogForm.validate((valid) => { //
if (valid) { submit() {
this.isSaveing = true; this.$refs.dialogForm.validate((valid) => {
if (this.mode === "add") { if (valid) {
this.$API.am.area.create let arr = [];
.req(this.form) if (this.employee_yes){arr.push('employee')}
.then((res) => { if (this.remployee_yes){arr.push('remployee')}
this.isSaveing = false; if (this.visitor_yes){arr.push('visitor')}
this.visible = false; this.form.access_list = arr;
this.$emit("success", this.form, this.mode); this.isSaveing = true;
this.$message.success("操作成功"); if (this.mode === "add") {
return res; this.$API.am.area.create
}) .req(this.form)
.catch((err) => { .then((res) => {
this.isSaveing = false; this.isSaveing = false;
return err; this.visible = false;
}); this.$emit("success", this.form, this.mode);
} else { this.$message.success("操作成功");
this.$API.am.area.update return res;
.req(this.form.id, this.form) })
.then((res) => { .catch((err) => {
this.isSaveing = false; this.isSaveing = false;
this.visible = false; return err;
this.$emit("success", this.form, this.mode); });
this.$message.success("操作成功"); } else {
return res; this.$API.am.area.update
}) .req(this.form.id, this.form)
.catch((err) => { .then((res) => {
this.isSaveing = false; this.isSaveing = false;
return err; this.visible = false;
}); this.$emit("success", this.form, this.mode);
} this.$message.success("操作成功");
} return res;
}); })
}, .catch((err) => {
// this.isSaveing = false;
setData(data) { return err;
console.log(defaultForm); });
// this.form = defaultForm; }
Object.assign(this.form, data); }
}, });
}, },
}; //
setData(data) {
debugger;
Object.assign(this.form, data);
if (data.access_list.indexOf('employee')> -1) {
this.employee_yes = true;
}
if (data.access_list.indexOf('remployee')>-1) {
this.remployee_yes = true;
}
if (data.access_list.indexOf('visitor')>-1) {
this.visitor_yes = true;
}
},
},
};
</script> </script>
<style> <style>

View File

@ -150,7 +150,7 @@
<div class="simple-title" @click="warningDetail= true"> <div class="simple-title" @click="warningDetail= true">
<span>报警实时展示</span> <span>报警实时展示</span>
<div class="simple-btn-bg alarm-bell danger"> <div class="simple-btn-bg alarm-bell danger">
<span>{{warningData.total}}</span>&nbsp;报警 <span>{{wStatistics.total_count}}</span>&nbsp;报警
</div> </div>
</div> </div>
<div class="alarm-content"> <div class="alarm-content">
@ -158,22 +158,12 @@
<div class="alarm-danger"></div> <div class="alarm-danger"></div>
</div> </div>
<div class="content-right"> <div class="content-right">
<div title="缺员报警 3" class="alarm-item alarm-item-danger"><span class="item-icon"></span><span <!--alarm-item-safe-->
class="item-name">缺员报警</span><span class="item-number" style="">3</span></div> <div v-for="item in wStatistics.details" :key="item.cate" class="alarm-item alarm-item-danger">
<div title="超员报警 2" class="alarm-item alarm-item-danger"><span class="item-icon"></span><span <span class="item-icon"></span>
class="item-name">超员报警</span><span class="item-number" style="">2</span></div> <span class="item-name">{{item.cate__name}}</span>
<div title="静止报警 0" class="alarm-item alarm-item-safe"><span class="item-icon"></span><span <span class="item-number" style="">{{item.count}}</span>
class="item-name">静止报警</span><span class="item-number" style="display: none;">0</span></div> </div>
<div title="越界报警 2" class="alarm-item alarm-item-danger"><span class="item-icon"></span><span
class="item-name">越界报警</span><span class="item-number" style="">2</span></div>
<div title="一键报警 0" class="alarm-item alarm-item-safe"><span class="item-icon"></span><span
class="item-name">一键报警</span><span class="item-number" style="display: none;">0</span></div>
<div title="滞留报警 0" class="alarm-item alarm-item-safe"><span class="item-icon"></span><span
class="item-name">滞留报警</span><span class="item-number" style="display: none;">0</span></div>
<div title="车辆报警 0" class="alarm-item alarm-item-safe"><span class="item-icon"></span><span
class="item-name">车辆报警</span><span class="item-number" style="display: none;">0</span></div>
<div title="作业报警 2" class="alarm-item alarm-item-danger"><span class="item-icon"></span><span
class="item-name">作业报警</span><span class="item-number" style="">2</span></div>
</div> </div>
</div> </div>
<div class="alarm-detail-info left_arrow" v-if="warningDetail"> <div class="alarm-detail-info left_arrow" v-if="warningDetail">
@ -195,48 +185,19 @@
</div> </div>
<div v-show="warningTypeShow" class="multiple-select-wrap"> <div v-show="warningTypeShow" class="multiple-select-wrap">
<div class="multiple-select-ul"> <div class="multiple-select-ul">
<div class="multiple-select-li" @click="warningTypeSelected"> <div class="multiple-select-li" @click="warningTypeSelected(null)">
<span class="multiple-select-label">全部</span> <span class="multiple-select-label">全部</span>
</div> </div>
<div class="multiple-select-li" @click="warningTypeSelected">
<span title="超员报警" class="multiple-select-label">超员报警</span> <div v-for="type in warningTypes" :key="type.id" class="multiple-select-li" @click="warningTypeSelected(type.id)">
</div> <span title="超员报警" class="multiple-select-label">{{type.name}}</span>
<div class="multiple-select-li" @click="warningTypeSelected">
<span title="缺员报警" class="multiple-select-label">缺员报警</span>
</div>
<div class="multiple-select-li" @click="warningTypeSelected">
<span title="静止报警" class="multiple-select-label">静止报警</span>
</div>
<div class="multiple-select-li" @click="warningTypeSelected">
<span title="越界报警" class="multiple-select-label">越界报警</span>
</div>
<div class="multiple-select-li" @click="warningTypeSelected">
<span title="滞留报警" class="multiple-select-label">滞留报警</span>
</div>
<div class="multiple-select-li">
<span title="一键报警" class="multiple-select-label">一键报警</span>
</div>
<div class="multiple-select-li">
<span title="车辆超速报警" class="multiple-select-label">车辆超速报警</span>
</div>
<div class="multiple-select-li">
<span title="车辆越界报警" class="multiple-select-label">车辆越界报警</span>
</div>
<div class="multiple-select-li">
<span title="车辆滞留报警" class="multiple-select-label">车辆滞留报警</span>
</div>
<div class="multiple-select-li">
<span title="非作业人员闯入报警" class="multiple-select-label">非作业人员闯入报警</span>
</div>
<div class="multiple-select-li">
<span title="作业人员离开报警" class="multiple-select-label">作业人员离开报警</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="head-sound sound-ring"></div> <div class="head-sound sound-ring"></div>
</div> </div>
<div class="content-body"> <div class="content-body" v-if="warningData.total>0">
<!--warningList--> <!--warningList-->
<div class="alarm-item" v-for="(item) in warningData.list" :key="item.id"> <div class="alarm-item" v-for="(item) in warningData.list" :key="item.id">
<div class="item-type">未处理</div> <div class="item-type">未处理</div>
@ -248,64 +209,8 @@
</div> </div>
</div> </div>
</div> </div>
<!--<div class="alarm-item">
<div class="item-type">越界报警</div>
<div class="item-content">
<div class="item-content-top"><span class="time">2022-07-01 11:39:03</span><span
class="status">未处理</span></div>
<div class="item-content-middle mt6">
<div class="alarm-info">生产管理部马经艺进入测试-绿地0分钟触发了越界报警</div>&lt;!&ndash;&ndash;&gt;&lt;!&ndash;&ndash;&gt;
</div>
</div>
</div>
<div class="alarm-item">
<div class="item-type">超员报警</div>
<div class="item-content">
<div class="item-content-top"><span class="time">2022-06-28 10:41:04</span><span
class="status">未处理</span></div>
<div class="item-content-middle mt6">
<div class="alarm-info">生产车间三多于51分钟发生了超员报警</div>&lt;!&ndash;&ndash;&gt;&lt;!&ndash;&ndash;&gt;</div>
</div>
</div>
<div class="alarm-item">
<div class="item-type">越界报警</div>
<div class="item-content">
<div class="item-content-top"><span class="time">2022-06-28 10:38:40</span><span
class="status">未处理</span></div>
<div class="item-content-middle mt6">
<div class="alarm-info">生产管理部马浩初进入测试-绿地0分钟触发了越界报警</div>&lt;!&ndash;&ndash;&gt;&lt;!&ndash;&ndash;&gt;
</div>
</div>
</div>
<div class="alarm-item">
<div class="item-type">缺员报警</div>
<div class="item-content">
<div class="item-content-top"><span class="time">2022-06-28 10:37:53</span><span
class="status">未处理</span></div>
<div class="item-content-middle mt6">
<div class="alarm-info">生产车间三少于8发生了缺员报警</div>&lt;!&ndash;&ndash;&gt;&lt;!&ndash;&ndash;&gt;</div>
</div>
</div>
<div class="alarm-item">
<div class="item-type">超员报警</div>
<div class="item-content">
<div class="item-content-top"><span class="time">2022-06-28 10:37:41</span><span
class="status">未处理</span></div>
<div class="item-content-middle mt6">
<div class="alarm-info">承包商开票区多于20分钟发生了超员报警</div>&lt;!&ndash;&ndash;&gt;&lt;!&ndash;&ndash;&gt;</div>
</div>
</div>
<div class="alarm-item">
<div class="item-type">缺员报警</div>
<div class="item-content">
<div class="item-content-top"><span class="time">2022-06-28 10:37:27</span><span
class="status">未处理</span></div>
<div class="item-content-middle mt6">
<div class="alarm-info">浓硫酸车间二少于2发生了缺员报警</div>&lt;!&ndash;&ndash;&gt;&lt;!&ndash;&ndash;&gt;</div>
</div>
</div>-->
</div> </div>
<div class="content-footer" style=""> <div v-if="warningData.total>0" class="content-footer" style="">
<el-pagination <el-pagination
:page-size="warningData.params.page_size" :page-size="warningData.params.page_size"
:pager-count="5" :pager-count="5"
@ -314,8 +219,8 @@
:total="warningData.total" :total="warningData.total"
@current-change="handleCurrentChange"/> @current-change="handleCurrentChange"/>
</div> </div>
<div class="el-loading-mask" style="background-color: transparent; display: none;"> <div class="noData" v-else>
<div class="el-loading-spinner"><i class="el-icon-loading"></i><!----></div> <img src="/img/nodata.png">
</div> </div>
</div> </div>
</div> </div>
@ -863,9 +768,17 @@
total: 0, total: 0,
params: { params: {
page: 1, page: 1,
page_size: 10 page_size: 10,
start_create:'',
} }
}, },
cateAggForm:{
start_create: '',
is_handled: false,
completed: true
},
wStatistics:{},
warningTypes:[],//
Vchannels: [],// Vchannels: [],//
warningList: [],// warningList: [],//
speakerList: [],// speakerList: [],//
@ -881,6 +794,7 @@
count_remployee: 0,//访 count_remployee: 0,//访
count_visitor: 0// count_visitor: 0//
}, },
screenJobItem: {},// screenJobItem: {},//
screenRiskItem: {},// screenRiskItem: {},//
screenWarningItem: {},// screenWarningItem: {},//
@ -916,6 +830,7 @@
}, },
LBType: '1', LBType: '1',
userMarker: {}, userMarker: {},
todayDate:'',
} }
}, },
created() { created() {
@ -925,6 +840,8 @@
document.head.appendChild(scriptInfo) document.head.appendChild(scriptInfo)
}, },
mounted() { mounted() {
let date = new Date();
this.todayDate = this.warningData.params.start_create = this.cateAggForm.start_create =date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate();
window.map = new jsmap.JSMap({ window.map = new jsmap.JSMap({
mapType: jsmap.JSMapType.MAP_3D, mapType: jsmap.JSMapType.MAP_3D,
container: 'mapContainer', container: 'mapContainer',
@ -1094,12 +1011,27 @@
this.getSpeakers();//$$ this.getSpeakers();//$$
// this.getAllMen();// // this.getAllMen();//
this.getAllPost();// this.getAllPost();//
setInterval(function () { this.getWarningTotal();//
this.getWarningType();//
}, 3000) setInterval(function () {}, 3000)
}, },
methods: { methods: {
getWarningTotal(){
let that = this;
that.$API.ecm.event.cateAgg.req(that.cateAggForm).then(res=>{
if(res.err_msg){}else{
that.wStatistics = res;
}
})
},
getWarningType(){
let that = this;
that.$API.ecm.event_cate.list.req().then(res=>{
if(res.err_msg){}else{
that.warningTypes = res.results;
}
})
},
areaRowClick(data) { areaRowClick(data) {
let that = this; let that = this;
that.areaDetail = true; that.areaDetail = true;
@ -1134,7 +1066,6 @@
arr.push(obj) arr.push(obj)
} }
this.postList = arr; this.postList = arr;
// console.log(arr)
}) })
}, },
// //
@ -1223,8 +1154,20 @@
}) })
}, },
// //
warningTypeSelected() { warningTypeSelected(id) {
debugger;
let that = this;
this.warningTypeShow = false; this.warningTypeShow = false;
let params = new Object();
params = that.warningData.params;
if(id!==null){
params.cates = id;
}
that.$API.ecm.event.list.req(params).then(res=>{
if(res.err_msg){}else{
that.warningData.list = res;
}
})
// //
}, },
// //
@ -2674,23 +2617,19 @@
} }
.content-right { .content-right {
width: calc(100% - 170px); width: calc(100% - 130px);
height: 100%; overflow: hidden;
display: flex; height: fit-content;
flex-wrap: wrap;
align-items: center;
justify-content: center;
.alarm-item { .alarm-item {
width: 50%; min-width: 50%;
height: 25%; height: 26px;
font-size: 14px; font-size: 14px;
font-weight: 700; font-weight: 700;
padding-left: 8px; padding-left: 8px;
position: relative; position: relative;
display: flex; display: flex;
align-items: center; align-items: center;
float: left;
.item-name { .item-name {
margin-right: 4px; margin-right: 4px;
flex-shrink: 0; flex-shrink: 0;
@ -3064,6 +3003,15 @@
} }
} }
.noData{
width: 100%;
height: 300px;
img{
margin: 50px auto;
display: block;
}
}
} }
.alarm-detail-info { .alarm-detail-info {
@ -3075,6 +3023,7 @@
border-radius: 4px; border-radius: 4px;
padding: 0 12px 0 12px; padding: 0 12px 0 12px;
z-index: 20; z-index: 20;
/*min-height: 400px;*/
.action-group { .action-group {
display: flex; display: flex;

View File

@ -1,102 +1,111 @@
<template> <template>
<el-container> <el-container>
<el-main class="nopadding"> <el-main class="nopadding">
<scTable <scTable
ref="table" ref="table"
:data="list" :data="list"
row-key="id" row-key="id"
stripe stripe
highlightCurrentRow highlightCurrentRow
hidePagination hidePagination
> >
<el-table-column label="ID" prop="id"></el-table-column> <el-table-column label="ID" prop="id"></el-table-column>
<el-table-column label="工单标题" prop="title"></el-table-column> <el-table-column label="工单标题" prop="title"></el-table-column>
<el-table-column label="流水号" prop="sn"></el-table-column> <el-table-column label="流水号" prop="sn"></el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template #default="scope"> <template #default="scope">
{{ scope.row.state_.name }} {{ scope.row.state_.name }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="进行状态" prop="sort"> <el-table-column label="进行状态" prop="sort">
<template #default="scope"> <template #default="scope">
{{ actstate_[scope.row.act_state] }} {{ actstate_[scope.row.act_state] }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="关联工作流" prop="title"> <el-table-column label="关联工作流" prop="title">
<template #default="scope"> <template #default="scope">
{{ scope.row.workflow_.name }} {{ scope.row.workflow_.name }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="处理人类型"> <el-table-column label="处理人类型">
<template #default="scope"> <template #default="scope">
{{ participant_[scope.row.participant_type] }} {{ participant_[scope.row.participant_type] }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="创建时间" prop="create_time"></el-table-column> <el-table-column label="创建时间" prop="create_time"></el-table-column>
<el-table-column label="操作" fixed="right" align="right" width="120"> <el-table-column label="操作" fixed="right" align="right" width="120">
<template #default="scope"> <template #default="scope">
<el-button type="text" size="small" @click="handleShow(scope.row)" <el-button type="text" size="small" @click="handleShow(scope.row)">查看详情</el-button>
>查看详情</el-button <!--多人且主动接单-->
> <el-button v-if="scope.row.state_.distribute_type===1&&scope.row.participant_type===2"
</template> type="text" size="small" @click="handleAccept(scope.row)">接单
</el-table-column> </el-button>
</scTable> </template>
</el-main> </el-table-column>
</el-container> </scTable>
</el-main>
</el-container>
</template> </template>
<script> <script>
export default { export default {
name: "state", name: "state",
data() { data() {
return { return {
list: [], list: [],
actstate_: { actstate_: {
0: "草稿中", 0: "草稿中",
1: "进行中", 1: "进行中",
2: "被退回", 2: "被退回",
3: "被撤回", 3: "被撤回",
4: "已完成", 4: "已完成",
5: "已关闭", 5: "已关闭",
}, },
participant_: { participant_: {
0: "无处理人", 0: "无处理人",
1: "个人", 1: "个人",
2: "多人", 2: "多人",
}, },
}; };
}, },
mounted() { mounted() {
this.getList(); this.getList();
}, },
methods: { methods: {
async getList() { async getList() {
let res = await this.$API.wf.ticket.list.req({ let res = await this.$API.wf.ticket.list.req({
category: "all", category: "all",
page: 0, page: 0,
}); });
console.log(res); console.log(res);
this.list = res; this.list = res;
}, },
handleShow(row) { handleShow(row) {
var catetype = row.workflow_.key;
var catetype = row.workflow_.key; switch (catetype) {
case 'visit':
switch (catetype) { this.$router.push({
case 'visit': name: "visitdetail",
this.$router.push({ query: {
name: "visitdetail", id: row.id,
query: { type: 'show',
id: row.id, visitID: row.ticket_data.visit
visitID:row.ticket_data.visit },
}, });
}); break;
break; }
} },
}, handleAccept(row) {
}, this.$API.wf.ticket.ticketAccept.req(row.id, {}).then(res => {
}; if (res.err_msg) {
} else {
this.getList();
}
})
},
},
};
</script> </script>
<style scoped> <style scoped>

View File

@ -28,15 +28,16 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="处理人类型"> <el-table-column label="处理人类型">
<template #default="scope"> <template #default="scope">
{{ participant_[scope.row.participant_type] }} {{ participant_[scope.row.participant_type] }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="创建时间" prop="create_time"></el-table-column> <el-table-column label="创建时间" prop="create_time"></el-table-column>
<el-table-column label="操作" fixed="right" align="right" width="120">
<template #default="scope">
<el-button type="text" size="small" @click="handleShow(scope.row)">查看详情</el-button>
</template>
</el-table-column>
</scTable> </scTable>
</el-main> </el-main>
</el-container> </el-container>
@ -73,6 +74,21 @@ export default {
console.log(res); console.log(res);
this.list = res; this.list = res;
}, },
handleShow(row) {
var catetype = row.workflow_.key;
switch (catetype) {
case 'visit':
this.$router.push({
name: "visitdetail",
query: {
id: row.id,
type: 'show',
visitID: row.ticket_data.visit
},
});
break;
}
},
}, },
}; };
</script> </script>

View File

@ -1,74 +1,83 @@
<template> <template>
<el-container> <el-container>
<el-main class="nopadding"> <el-main class="nopadding">
<el-table
<el-card style="margin-left: 10px"> :data="logs"
<el-table fit
:data="logs" stripe
fit style="width: 100%;"
stripe height="500"
style="width: 100%; border-top: 1px solid #ebeef5" highlight-current-row
height="500" >
highlight-current-row <el-table-column label="工单标题" min-width="100">
> <template #default="scope">
<el-table-column label="工单标题" min-width="100"> <span v-if="scope.row.ticket_data.title">{{ scope.row.ticket_data.title }}</span>
<template #default="scope"> </template>
<span v-if="scope.row.ticket_data.title">{{ scope.row.ticket_data.title }}</span> </el-table-column>
</template> <el-table-column label="进行状态" min-width="100">
</el-table-column> <template #default="scope">
<el-table-column label="进行状态" min-width="100">
<template #default="scope">
<span v-if="scope.row.state_.type == 0" <span v-if="scope.row.state_.type == 0"
>{{ scope.row.state_.name }}</span >{{ scope.row.state_.name }}</span
> >
<span v-else>{{ scope.row.state_.name }}</span> <span v-else>{{ scope.row.state_.name }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作人" min-width="100"> <el-table-column label="操作人" min-width="100">
<template #default="scope" ><el-span v-if="scope.row.participant_">{{ <template #default="scope">
scope.row.participant_.name <el-span v-if="scope.row.participant_">{{
}}</el-span></template> scope.row.participant_.name
</el-table-column> }}
<el-table-column </el-span>
label="操作意见" </template>
min-width="100" </el-table-column>
prop="suggestion" <el-table-column
> label="操作意见"
</el-table-column> min-width="100"
<el-table-column prop="suggestion"
label="更新时间" >
min-width="100" </el-table-column>
prop="update_time" <el-table-column
> label="更新时间"
</el-table-column> min-width="100"
</el-table> prop="update_time"
</el-card> >
</el-table-column>
</el-main> </el-table>
</el-container> </el-main>
</el-container>
</template> </template>
<!--工单处理详情组件--> <!--工单处理详情组件-->
<script> <script>
export default { export default {
name: "detail", name: "detail",
data() { props: {
return { ticket: {
logs: [], type: String,
}; default: null
}, }
mounted() { },
this.workId = this.$route.query.id; data() {
this.getFlowlogss(); return {
}, logs: [],
methods: { ticketId: null,
async getFlowlogss() { };
},
this.$API.wf.ticket.ticketFlowlogs.req(this.workId).then(res => { mounted() {
this.logs = res debugger;
this.ticketId = this.ticket;
}) this.getFlowlogss();
}, },
}, methods: {
}; getFlowlogss() {
let that = this;
this.$API.wf.ticket.ticketFlowlogs.req(that.ticketId).then(res => {
if (res.err_msg) {
} else {
that.logs = res;
}
});
},
},
};
</script> </script>

View File

@ -1,80 +1,160 @@
<template> <template>
<el-container> <el-container>
<el-main class="nopadding"> <el-main class="nopadding">
<scTable <scTable
ref="table" ref="table"
:data="list" :data="list"
row-key="id" row-key="id"
stripe stripe
highlightCurrentRow highlightCurrentRow
hidePagination hidePagination
> >
<el-table-column label="ID" prop="id"></el-table-column> <el-table-column label="ID" prop="id"></el-table-column>
<el-table-column label="工单标题" prop="title"></el-table-column> <el-table-column label="工单标题" prop="title"></el-table-column>
<el-table-column label="流水号" prop="sn"></el-table-column> <el-table-column label="流水号" prop="sn"></el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template #default="scope"> <template #default="scope">
{{ scope.row.state_.name }} {{ scope.row.state_.name }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="进行状态" prop="sort"> <el-table-column label="进行状态" prop="sort">
<template #default="scope"> <template #default="scope">
{{ actstate_[scope.row.act_state] }} {{ actstate_[scope.row.act_state] }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="关联工作流" prop="title"> <el-table-column label="关联工作流" prop="title">
<template #default="scope"> <template #default="scope">
{{ scope.row.workflow_.name }} {{ scope.row.workflow_.name }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="处理人类型"> <el-table-column label="处理人类型">
<template #default="scope">
{{ participant_[scope.row.participant_type] }}
</template>
</el-table-column>
<el-table-column label="创建时间" prop="create_time"></el-table-column>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-link
v-if="(scope.row.act_state===1||scope.row.act_state===3)&&scope.row.participant_type!==2&&scope.row.state_.type===0"
type="primary"
@click="handleDetail(scope.row)"
>
处理
</el-link>
<el-link
type="success"
@click="handleLogs(scope.row)"
>
工单日志
</el-link>
</template>
</el-table-column>
</scTable>
</el-main>
</el-container>
<el-dialog v-model="limitedFlowLogs" title="工单日志">
<ticket-log ref="ticketLogs" :ticket="ticketId"></ticket-log>
</el-dialog>
<template #default="scope"> <!--<el-dialog v-model="limitedFlowLogs" title="工单日志">
{{ participant_[scope.row.participant_type] }} <el-table
</template> :data="floeLogs"
fit
stripe
</el-table-column> style="width: 100%;border-top:1px solid #EBEEF5;"
<el-table-column label="创建时间" prop="create_time"></el-table-column> >
<el-table-column label="工单标题">
</scTable> <template #defalut="scope">
</el-main> <span v-if="scope.row.ticket_data">{{scope.row.ticket_data.title}}</span>
</el-container> </template>
</el-table-column>
<el-table-column label="进行状态">
<template #defalut="scope">
<span v-if="scope.row.state_">{{scope.row.state_.name}}</span>
</template>
</el-table-column>
<el-table-column label="操作人">
<template #default="scope">
<span v-if="scope.row.participant_">{{ scope.row.participant_.name }}</span>
</template>
</el-table-column>
<el-table-column label="操作意见" prop="suggestion">
</el-table-column>
<el-table-column label="更新时间" prop="update_time">
</el-table-column>
</el-table>
</el-dialog>-->
</template> </template>
<script> <script>
export default { import ticketLog from "./details.vue";
name: "state", export default {
data() { components: {
return { ticketLog,
list:[], },
name: "state",
data() {
return {
list: [],
actstate_: {
0: "草稿中",
1: "进行中",
2: "被退回",
3: "被撤回",
4: "已完成",
5: "已关闭",
},
participant_: {
0: "无处理人",
1: "个人",
2: "多人",
},
floeLogs:[],
ticketId:'',
limitedFlowLogs:false,
};
},
mounted() {
this.getList();
},
methods: {
async getList() {
let res = await this.$API.wf.ticket.list.req({category: "duty", page: 0});
console.log(res);
this.list = res;
},
handleDetail(row){
let catetype = row.workflow_.key;
switch (catetype) {
case 'visit':
this.$router.push({
name: "visitdetail",
query: {
id: row.id,
visitID:row.ticket_data.visit
},
});
break;
}
},
handleLogs(row) {
debugger;
console.log(row)
let that = this;
let id = row.id;
this.ticketId = row.id;
that.limitedFlowLogs = true;
that.$API.wf.ticket.ticketFlow.req({ticket:id}).then(res => {
if (res.err_msg) {
actstate_: { }else{
0: "草稿中", that.floeLogs = res.results;
1: "进行中", }
2: "被退回", })
3: "被撤回", },
4: "已完成", },
5: "已关闭", };
},
participant_: {
0: "无处理人",
1: "个人",
2: "多人",
},
};
},
mounted() {
this.getList();
},
methods: {
async getList() {
let res = await this.$API.wf.ticket.list.req({ category: "duty",page:0 });
console.log(res);
this.list = res;
},
},
};
</script> </script>
<style scoped> <style scoped>

View File

@ -1,80 +1,170 @@
<template> <template>
<el-container> <el-container>
<el-main class="nopadding"> <el-main class="nopadding">
<scTable <scTable
ref="table" ref="table"
:data="list" :data="list"
row-key="id" row-key="id"
stripe stripe
highlightCurrentRow highlightCurrentRow
hidePagination hidePagination
> >
<el-table-column label="ID" prop="id"></el-table-column> <el-table-column label="ID" prop="id"></el-table-column>
<el-table-column label="工单标题" prop="title"></el-table-column> <el-table-column label="工单标题" prop="title"></el-table-column>
<el-table-column label="流水号" prop="sn"></el-table-column> <el-table-column label="流水号" prop="sn"></el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template #default="scope"> <template #default="scope">
{{ scope.row.state_.name }} {{ scope.row.state_.name }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="进行状态" prop="sort"> <el-table-column label="进行状态" prop="sort">
<template #default="scope"> <template #default="scope">
{{ actstate_[scope.row.act_state] }} {{ actstate_[scope.row.act_state] }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="关联工作流" prop="title"> <el-table-column label="关联工作流" prop="title">
<template #default="scope"> <template #default="scope">
{{ scope.row.workflow_.name }} {{ scope.row.workflow_.name }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="处理人类型"> <el-table-column label="处理人类型">
<template #default="scope">
<template #default="scope"> {{ participant_[scope.row.participant_type] }}
{{ participant_[scope.row.participant_type] }} </template>
</template> </el-table-column>
<el-table-column label="创建时间" prop="create_time"></el-table-column>
<el-table-column label="操作" fixed="right" align="right" width="120">
</el-table-column> <template #default="scope">
<el-table-column label="创建时间" prop="create_time"></el-table-column> <el-button type="text" size="small" @click="handleShow(scope.row)">查看详情</el-button>
<!--创建人在初始状态-->
</scTable> <el-link
</el-main> v-if="scope.row.state_.type===1&&userId===scope.row.create_by"
</el-container> type="danger"
@click="handleClose(scope,'2')"
>
关闭
</el-link>
<!--如果state_.retreat/state_.type==1处于草稿状态 -->
<el-link
v-if="scope.row.state_.enable_retreat&&userId===scope.row.create_by&&scope.row.state_.type!==1"
type="danger"
@click="handleClose(scope,'1')"
>
撤回
</el-link>
</template>
</el-table-column>
</scTable>
</el-main>
<el-dialog v-model="limitedRetreat" :title="handleTitle">
<el-form ref="Form" :model="handleForm" label-width="100px" label-position="right">
<el-form-item :label="handleLabel">
<el-input type="textarea" :rows="3" v-model="handleForm.suggestion" placeholder="原因"/>
</el-form-item>
</el-form>
<div style="text-align: center">
<el-button class="filter-item" type="" @click="handleCancel">取消</el-button>
<el-button class="filter-item" type="primary" @click="handleSubmit">确定</el-button>
</div>
</el-dialog>
</el-container>
</template> </template>
<script> <script>
export default { export default {
name: "state", name: "state",
data() { data() {
return { return {
list:[], list: [],
userId:this.$TOOL.data.get("USER_INFO").id,
actstate_: { actstate_: {
0: "草稿中", 0: "草稿中",
1: "进行中", 1: "进行中",
2: "被退回", 2: "被退回",
3: "被撤回", 3: "被撤回",
4: "已完成", 4: "已完成",
5: "已关闭", 5: "已关闭",
}, },
participant_: { participant_: {
0: "无处理人", 0: "无处理人",
1: "个人", 1: "个人",
2: "多人", 2: "多人",
}, },
}; handleForm: {
}, suggestion: '',
mounted() { },
this.getList(); handleLabel: '撤回原因',
}, handleTitle: '撤回工单',
methods: { ticketId:null,
async getList() { limitedRetreat:false,
let res = await this.$API.wf.ticket.list.req({ category: "owner",page:0 }); };
console.log(res); },
this.list = res; mounted() {
}, this.getList();
}, this.userId = this.$TOOL.data.get("USER_INFO").id;
}; },
methods: {
handleShow(row) {
var catetype = row.workflow_.key;
switch (catetype) {
case 'visit':
this.$router.push({
name: "visitdetail",
query: {
id: row.id,
type: 'show',
visitID: row.ticket_data.visit
},
});
break;
}
},
async getList() {
let res = await this.$API.wf.ticket.list.req({category: "owner", page: 0});
console.log(res);
this.list = res;
},
handleClose(scope, index) {
if (index === '1') {
this.handleTitle = '撤回工单';
this.handleLabel = '撤回原因';
} else {
this.handleTitle = '关闭工单';
this.handleLabel = '关闭原因';
}
this.limitedRetreat = true;
this.ticketId = scope.row.id;
},
handleCancel() {
this.limitedRetreat = false;
},
handleSubmit() {
let res = '';
let that = this;
that.$confirm('确认'+that.handleTitle+'吗?', "温馨提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
})
.then(async () => {
if (that.handleTitle === '撤回工单') {
res = that.$API.wf.ticket.ticketRetreat.req(that.ticketId, that.handleForm);
} else {
res = that.$API.wf.ticket.ticketClose.req(that.ticketId, that.handleForm);
}
if(res.err_msg){
that.getList();
}else{
that.limitedRetreat = false;
that.getList();
}
})
.catch((err) => {
console.error(err);
});
},
},
};
</script> </script>
<style scoped> <style scoped>

View File

@ -1,66 +1,69 @@
<template> <template>
<el-container> <el-container>
<el-main class="nopadding"> <el-main class="nopadding">
<el-card style="margin-bottom: 10px"> <el-card style="margin-bottom: 10px">
<el-steps <el-steps
:active="actives" :active="actives"
spac="400px" spac="400px"
align-center="" align-center=""
style="padding-top: 20px" style="padding-top: 20px"
> >
<el-step <el-step
:title="item.name" :title="item.name"
v-for="item in flowSteps" v-for="item in flowSteps"
:key="item.id" :key="item.id"
></el-step> ></el-step>
</el-steps> </el-steps>
</el-card> </el-card>
</el-main>
</el-main> </el-container>
</el-container>
</template> </template>
<!--工单进度组件--> <!--工单进度组件-->
<script> <script>
export default {
name: "workstep",
data() {
return {
sort: 0,
actives: 4,
flowSteps: [],
};
},
mounted() {
this.workId = this.$route.query.id;
this.getFlowSteps();
},
methods: {
getFlowSteps() {
this.$API.wf.ticket.ticketFlowSteps.req(this.workId).then((res) => {
this.flowSteps = res;
this.$API.wf.ticket.ticketItem.req(this.workId).then((resp) => {
let state = resp.state;
let dat = this.flowSteps.filter((item) => {
return item.id == state;
});
debugger;
this.sort = dat[0].sort;
this.actives = this.flowSteps.indexOf(dat[0]);
if (this.flowSteps.length - this.actives > 1) {
export default { } else {
this.actives = this.flowSteps.length;
name: "workstep", }
data() { });
return { });
sort: 0, },
actives: 4, },
flowSteps: [], };
};
},
mounted() {
this.workId = this.$route.query.id;
this.getFlowSteps();
},
methods: {
getFlowSteps() {
this.$API.wf.ticket.ticketFlowSteps.req(this.workId).then((res) => {;
this.flowSteps = res
this.$API.wf.ticket.ticketItem.req(this.workId).then((res) => {
let state = res.state;
let dat = this.flowSteps.filter((item) => {
return item.id == state;
})
this.sort = dat[0].sort;
this.actives = this.flowSteps.indexOf(dat[0]);
if (this.flowSteps.length - this.actives > 1) {
} else {
this.actives = this.flowSteps.length;
}
});
});
},
},
};
</script> </script>
<style scoped> <style>
.el-step__head.is-process .el-step__icon{
border: 2px solid #409eff;
background: #409eff;
color: #ffffff;
}
.el-step__title.is-process{
color: #409eff;
}
</style> </style>

View File

@ -1,112 +1,245 @@
<template> <template>
<el-container> <el-container>
<el-main class="nopadding"> <el-main class="nopadding">
<el-card style="margin-bottom: 10px"> <el-card style="margin-bottom: 10px">
<work-step ref="workStep"></work-step> <work-step ref="workStep"></work-step>
</el-card> </el-card>
<el-card style="margin-left: 10px; margin-bottom: 10px">
<el-descriptions title="来访信息" :column="3">
<el-descriptions-item label="工单流水号:">
{{ticketDetail.sn }}
</el-descriptions-item>
<el-descriptions-item label="来访概述:">
{{visitDetail.name }}
</el-descriptions-item>
<el-descriptions-item label="来访单位:">
{{visitDetail.company }}
</el-descriptions-item>
<el-descriptions-item label="来访人数:">
<el-tag size="small">{{ visitDetail.count_people }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="来访人员:">
<el-tag v-for="item in visitDetail.visitors_" :key='item.id' size="small">
{{ item.visitor_.name }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="状态:">
{{state_[visitDetail.state] }}
</el-descriptions-item>
<el-descriptions-item label="来访时间:">
{{visitDetail.visit_time }}
</el-descriptions-item>
<el-descriptions-item label="离开时间:">
{{visitDetail.leave_time }}
</el-descriptions-item>
<el-descriptions-item label="来访事由:">
{{purpose_[visitDetail.purpose] }}
</el-descriptions-item>
<el-descriptions-item label="来访详述:">
{{visitDetail.description }}
</el-descriptions-item>
<el-descriptions-item label="接待人:" v-if="visitDetail.receptionist_">
{{ visitDetail.receptionist_.name }}
</el-descriptions-item>
</el-descriptions>
</el-card>
<el-card style="margin-left: 10px; margin-bottom: 10px" v-if="type!=='show'">
<scTitle title="处理"></scTitle>
<el-form :model="form" ref="addForm" label-width="100px" label-position="left">
<el-form-item label="处理意见">
<el-input v-model="form.suggestion" clearable></el-input>
</el-form-item>
</el-form>
<div v-if="ticketDetail.in_add_node" style="text-align: right">
<el-button v-if="ticketDetail.in_add_node" class="filter-item" type="primary" @click="addNodeHandler('2')">加签处理</el-button>
</div>
<div v-else style="display: flex;justify-content: space-between;">
<div>
<el-button type="primary" @click="addNode">加签</el-button>
<el-button v-if="ticketDetail.state_&&ticketDetail.state_.enable_deliver" type="primary" plain @click="deliverNode">转交</el-button>
</div>
<div>
<el-button v-for="item in operationBtn" :key="item.id" class="filter-item" type="primary" @click="operationSubmit(item.id)">{{item.name}}</el-button>
</div>
</div>
</el-card>
<el-card style="margin-left: 10px;">
<work-details ref="workDetails" :ticket="ticketId"></work-details>
</el-card>
</el-main>
</el-container>
<el-dialog v-model="limitedAdd" title="加签">
<el-form ref="Form" :model="addForm" label-width="100px" label-position="right">
<el-form-item label="处理人">
<el-input style="width: 50%;" v-model="userName" disabled placeholder="选择处理人"></el-input>
<scUserSelect :closable="true" :multiple="false" @addNodeHandlerSubmit="addNodeHandlerSubmit"></scUserSelect>
</el-form-item>
<el-form-item label="加签原因">
<el-input type="textarea" :rows="3" v-model="addForm.suggestion" placeholder="加签原因"/>
</el-form-item>
</el-form>
<div style="text-align: center">
<el-button class="filter-item" type="" @click="addCancel">取消</el-button>
<el-button class="filter-item" type="primary" @click="addNodeHandler('1')">确定</el-button>
</div>
</el-dialog>
<el-dialog v-model="limitedDeliver" title="转交工单">
<el-form ref="Form" :model="deliverForm" label-width="100px" label-position="right">
<el-form-item label="转交人">
<el-input style="width: 50%;" v-model="userName" disabled placeholder="选择转交人"></el-input>
<scUserSelect :closable="true" :multiple="false" @handlerSubmit="deliverHandlerSubmit"></scUserSelect>
</el-form-item>
<el-form-item label="转交原因">
<el-input type="textarea" :rows="3" v-model="deliverForm.suggestion" placeholder="转交原因"/>
</el-form-item>
</el-form>
<div style="text-align: center">
<el-button class="filter-item" type="" @click="deliverCancel">取消</el-button>
<el-button class="filter-item" type="primary" @click="deliverNodeHandler('1')">确定</el-button>
</div>
</el-dialog>
<el-card style="margin-left: 10px; margin-bottom: 10px">
<el-descriptions title="来访信息" :column="3">
<el-descriptions-item label="工单流水号:">{{
ticketDetail.sn
}}</el-descriptions-item>
<el-descriptions-item label="来访概述:">{{
visitDetail.name
}}</el-descriptions-item>
<el-descriptions-item label="来访单位:">{{
visitDetail.company
}}</el-descriptions-item>
<el-descriptions-item label="来访人数:">
<el-tag size="small">{{ visitDetail.count_people }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="来访人员:" >
<el-tag v-for="item in visitDetail.visitors_" :key='item.id' size="small">{{ item.visitor_.name }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="状态:">{{
state_[visitDetail.state]
}}</el-descriptions-item>
<el-descriptions-item label="来访时间:">{{
visitDetail.visit_time
}}</el-descriptions-item>
<el-descriptions-item label="离开时间:">{{
visitDetail.leave_time
}}</el-descriptions-item>
<el-descriptions-item label="来访事由:">{{
purpose_[visitDetail.purpose]
}}</el-descriptions-item>
<el-descriptions-item label="来访详述:">{{
visitDetail.description
}}</el-descriptions-item>
<el-descriptions-item label="接待人:" v-if="visitDetail.receptionist_">
{{ visitDetail.receptionist_.name }}
</el-descriptions-item>
</el-descriptions>
</el-card>
<el-card>
<work-details ref="workDetails"></work-details>
</el-card>
</el-main>
</el-container>
</template> </template>
<script> <script>
import workDetails from "./details.vue"; import workDetails from "./details.vue";
import workStep from "./steps.vue"; import workStep from "./steps.vue";
export default { import selectUser from '@/layout/components/userselect'
components: {
workDetails,
workStep,
},
name: "visitdetail",
data() {
return {
workId: "",
visitId: "",
ticketDetail: [],
visitDetail: [],
purpose_: {
10: "参观",
20: "拜访",
30: "面试",
40: "开会"
},
state_: {
10: "创建中",
20: "审批中",
30: "待入厂",
40: "进行中",
50: "已完成",
},
};
},
mounted() {
this.workId = this.$route.query.id;
this.visitId = this.$route.query.visitID;
this.getticketItem();
this.getVisit();
}, export default {
methods: { components: {
// workDetails,
getticketItem() { workStep,
this.$API.wf.ticket.ticketItem.req(this.workId).then((res) => { selectUser
this.ticketDetail = res; },
name: "visitdetail",
data() {
return {
ticketId: "",
visitId: "",
userName: "",
ticketDetail: [],
visitDetail: [],
employeeLists: [],
operationBtn: [],
form:{
suggestion:''
},
addForm:{
suggestion:'',
toadd_user:'',
},
deliverForm:{
suggestion:'',
target_user:'',
},
limitedAdd:false,
limitedDeliver:false,
limitedUserSelect:false,
purpose_: {
10: "参观",
20: "拜访",
30: "面试",
40: "开会"
},
state_: {
10: "创建中",
20: "审批中",
30: "待入厂",
40: "进行中",
50: "已完成",
},
};
},
created(){
this.ticketId = this.$route.query.id;
this.type = this.$route.query.type;
},
mounted() {
this.ticketId = this.$route.query.id;
this.type = this.$route.query.type;
this.visitId = this.$route.query.visitID;
this.getticketItem();
this.getVisit();
this.getBtns();
}); },
}, methods: {
//访 //
getVisit() { getticketItem() {
this.$API.vm.visit.read.req(this.visitId).then((res) => { this.$API.wf.ticket.ticketItem.req(this.ticketId).then((res) => {
this.visitDetail = res; this.ticketDetail = res;
}); debugger;
}, console.log(res);
}, });
}; },
getBtns(){
this.$API.wf.ticket.ticketTransitions.req(this.ticketId).then(res=>{
this.operationBtn = res;
})
},
//访
getVisit() {
this.$API.vm.visit.read.req(this.visitId).then((res) => {
this.visitDetail = res;
});
},
addNodeHandlerSubmit(data) {
this.addForm.toadd_user=data.id;
this.userName=data.name;
},
addNode(){
this.limitedAdd = true;
},
addCancel(){
this.limitedAdd = false;
},
addNodeHandler(index){
let res = null;
if(index==='1'){
res = this.$API.wf.ticket.addNode.req(this.ticketId,this.addForm);
}else{
res = this.$API.wf.ticket.addNodeEnd.req(this.ticketId,this.form);
}
if(res.err_msg){}else{
this.limitedAdd = false;
this.$router.push("/dutywork");
}
},
deliverNode(){
this.limitedDeliver = true;
},
deliverCancel(){
this.limitedDeliver = false;
},
deliverHandlerSubmit(data) {
this.deliverForm.target_user=data.id;
this.userName=data.name;
},
deliverNodeHandler(){
this.$API.wf.ticket.ticketDeliver.req(this.ticketId,this.deliverForm).then(res=>{
if(res.err_msg){}else{
this.limitedDeliver = false;
this.$router.push("/dutywork");
}
})
},
operationSubmit(id){
let params = new Object();
params.transition = id;
params.ticket_data = {};
params.suggestion = this.form.suggestion;
this.$API.wf.ticket.ticketHandle.req(this.ticketId,params).then(res=>{
if(res.err_msg){}else{
this.$router.push("/dutywork");
}
})
},
},
};
</script> </script>
<style scoped> <style scoped>

View File

@ -1,80 +1,96 @@
<template> <template>
<el-container> <el-container>
<el-main class="nopadding"> <el-main class="nopadding">
<scTable <scTable
ref="table" ref="table"
:data="list" :data="list"
row-key="id" row-key="id"
stripe stripe
highlightCurrentRow highlightCurrentRow
hidePagination hidePagination
> >
<el-table-column label="ID" prop="id"></el-table-column> <el-table-column label="ID" prop="id"></el-table-column>
<el-table-column label="工单标题" prop="title"></el-table-column> <el-table-column label="工单标题" prop="title"></el-table-column>
<el-table-column label="流水号" prop="sn"></el-table-column> <el-table-column label="流水号" prop="sn"></el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template #default="scope"> <template #default="scope">
{{ scope.row.state_.name }} {{ scope.row.state_.name }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="进行状态" prop="sort"> <el-table-column label="进行状态" prop="sort">
<template #default="scope"> <template #default="scope">
{{ actstate_[scope.row.act_state] }} {{ actstate_[scope.row.act_state] }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="关联工作流" prop="title"> <el-table-column label="关联工作流" prop="title">
<template #default="scope"> <template #default="scope">
{{ scope.row.workflow_.name }} {{ scope.row.workflow_.name }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="处理人类型"> <el-table-column label="处理人类型">
<template #default="scope">
<template #default="scope"> {{ participant_[scope.row.participant_type] }}
{{ participant_[scope.row.participant_type] }} </template>
</template> </el-table-column>
<el-table-column label="创建时间" prop="create_time"></el-table-column>
<el-table-column label="操作" fixed="right" align="right" width="120">
</el-table-column> <template #default="scope">
<el-table-column label="创建时间" prop="create_time"></el-table-column> <el-button type="text" size="small" @click="handleShow(scope.row)">查看详情</el-button>
</template>
</scTable> </el-table-column>
</el-main> </scTable>
</el-container> </el-main>
</el-container>
</template> </template>
<script> <script>
export default { export default {
name: "state", name: "state",
data() { data() {
return { return {
list:[], list: [],
actstate_: { actstate_: {
0: "草稿中", 0: "草稿中",
1: "进行中", 1: "进行中",
2: "被退回", 2: "被退回",
3: "被撤回", 3: "被撤回",
4: "已完成", 4: "已完成",
5: "已关闭", 5: "已关闭",
}, },
participant_: { participant_: {
0: "无处理人", 0: "无处理人",
1: "个人", 1: "个人",
2: "多人", 2: "多人",
}, },
}; };
}, },
mounted() { mounted() {
this.getList(); this.getList();
}, },
methods: { methods: {
async getList() { async getList() {
let res = await this.$API.wf.ticket.list.req({ category: "worked",page:0 }); let res = await this.$API.wf.ticket.list.req({category: "worked", page: 0});
console.log(res); console.log(res);
this.list = res; this.list = res;
}, },
}, handleShow(row) {
}; var catetype = row.workflow_.key;
switch (catetype) {
case 'visit':
this.$router.push({
name: "visitdetail",
query: {
id: row.id,
type: 'show',
visitID: row.ticket_data.visit
},
});
break;
}
},
},
};
</script> </script>
<style scoped> <style scoped>