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);
}
},
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: {
name: "接单",
req: async function(id){
return await http.post(`${config.API_URL}/wf/ticket/${id}/accpet/`);
req: async function(id,data){
return await http.post(`${config.API_URL}/wf/ticket/${id}/accpet/`,data);
}
},
addNodeEnd: {
@ -118,7 +118,7 @@ export default {
ticketClose: {
name: "关闭工单",
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: {

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

View File

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

View File

@ -150,7 +150,7 @@
<div class="simple-title" @click="warningDetail= true">
<span>报警实时展示</span>
<div class="simple-btn-bg alarm-bell danger">
<span>{{warningData.total}}</span>&nbsp;报警
<span>{{wStatistics.total_count}}</span>&nbsp;报警
</div>
</div>
<div class="alarm-content">
@ -158,22 +158,12 @@
<div class="alarm-danger"></div>
</div>
<div class="content-right">
<div title="缺员报警 3" class="alarm-item alarm-item-danger"><span class="item-icon"></span><span
class="item-name">缺员报警</span><span class="item-number" style="">3</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 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 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>
<!--alarm-item-safe-->
<div v-for="item in wStatistics.details" :key="item.cate" class="alarm-item alarm-item-danger">
<span class="item-icon"></span>
<span class="item-name">{{item.cate__name}}</span>
<span class="item-number" style="">{{item.count}}</span>
</div>
</div>
</div>
<div class="alarm-detail-info left_arrow" v-if="warningDetail">
@ -195,48 +185,19 @@
</div>
<div v-show="warningTypeShow" class="multiple-select-wrap">
<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>
</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" @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 v-for="type in warningTypes" :key="type.id" class="multiple-select-li" @click="warningTypeSelected(type.id)">
<span title="超员报警" class="multiple-select-label">{{type.name}}</span>
</div>
</div>
</div>
</div>
<div class="head-sound sound-ring"></div>
</div>
<div class="content-body">
<div class="content-body" v-if="warningData.total>0">
<!--warningList-->
<div class="alarm-item" v-for="(item) in warningData.list" :key="item.id">
<div class="item-type">未处理</div>
@ -248,64 +209,8 @@
</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 class="content-footer" style="">
<div v-if="warningData.total>0" class="content-footer" style="">
<el-pagination
:page-size="warningData.params.page_size"
:pager-count="5"
@ -314,8 +219,8 @@
:total="warningData.total"
@current-change="handleCurrentChange"/>
</div>
<div class="el-loading-mask" style="background-color: transparent; display: none;">
<div class="el-loading-spinner"><i class="el-icon-loading"></i><!----></div>
<div class="noData" v-else>
<img src="/img/nodata.png">
</div>
</div>
</div>
@ -863,9 +768,17 @@
total: 0,
params: {
page: 1,
page_size: 10
page_size: 10,
start_create:'',
}
},
cateAggForm:{
start_create: '',
is_handled: false,
completed: true
},
wStatistics:{},
warningTypes:[],//
Vchannels: [],//
warningList: [],//
speakerList: [],//
@ -881,6 +794,7 @@
count_remployee: 0,//访
count_visitor: 0//
},
screenJobItem: {},//
screenRiskItem: {},//
screenWarningItem: {},//
@ -916,6 +830,7 @@
},
LBType: '1',
userMarker: {},
todayDate:'',
}
},
created() {
@ -925,6 +840,8 @@
document.head.appendChild(scriptInfo)
},
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({
mapType: jsmap.JSMapType.MAP_3D,
container: 'mapContainer',
@ -1094,12 +1011,27 @@
this.getSpeakers();//$$
// this.getAllMen();//
this.getAllPost();//
setInterval(function () {
}, 3000)
this.getWarningTotal();//
this.getWarningType();//
setInterval(function () {}, 3000)
},
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) {
let that = this;
that.areaDetail = true;
@ -1134,7 +1066,6 @@
arr.push(obj)
}
this.postList = arr;
// console.log(arr)
})
},
//
@ -1223,8 +1154,20 @@
})
},
//
warningTypeSelected() {
warningTypeSelected(id) {
debugger;
let that = this;
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 {
width: calc(100% - 170px);
height: 100%;
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
width: calc(100% - 130px);
overflow: hidden;
height: fit-content;
.alarm-item {
width: 50%;
height: 25%;
min-width: 50%;
height: 26px;
font-size: 14px;
font-weight: 700;
padding-left: 8px;
position: relative;
display: flex;
align-items: center;
float: left;
.item-name {
margin-right: 4px;
flex-shrink: 0;
@ -3064,6 +3003,15 @@
}
}
.noData{
width: 100%;
height: 300px;
img{
margin: 50px auto;
display: block;
}
}
}
.alarm-detail-info {
@ -3075,6 +3023,7 @@
border-radius: 4px;
padding: 0 12px 0 12px;
z-index: 20;
/*min-height: 400px;*/
.action-group {
display: flex;

View File

@ -1,102 +1,111 @@
<template>
<el-container>
<el-main class="nopadding">
<scTable
ref="table"
:data="list"
row-key="id"
stripe
highlightCurrentRow
hidePagination
>
<el-table-column label="ID" prop="id"></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="当前状态">
<template #default="scope">
{{ scope.row.state_.name }}
</template>
</el-table-column>
<el-table-column label="进行状态" prop="sort">
<template #default="scope">
{{ actstate_[scope.row.act_state] }}
</template>
</el-table-column>
<el-table-column label="关联工作流" prop="title">
<template #default="scope">
{{ scope.row.workflow_.name }}
</template>
</el-table-column>
<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="操作" 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>
</el-main>
</el-container>
<el-container>
<el-main class="nopadding">
<scTable
ref="table"
:data="list"
row-key="id"
stripe
highlightCurrentRow
hidePagination
>
<el-table-column label="ID" prop="id"></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="当前状态">
<template #default="scope">
{{ scope.row.state_.name }}
</template>
</el-table-column>
<el-table-column label="进行状态" prop="sort">
<template #default="scope">
{{ actstate_[scope.row.act_state] }}
</template>
</el-table-column>
<el-table-column label="关联工作流" prop="title">
<template #default="scope">
{{ scope.row.workflow_.name }}
</template>
</el-table-column>
<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="操作" fixed="right" align="right" width="120">
<template #default="scope">
<el-button type="text" size="small" @click="handleShow(scope.row)">查看详情</el-button>
<!--多人且主动接单-->
<el-button v-if="scope.row.state_.distribute_type===1&&scope.row.participant_type===2"
type="text" size="small" @click="handleAccept(scope.row)">接单
</el-button>
</template>
</el-table-column>
</scTable>
</el-main>
</el-container>
</template>
<script>
export default {
name: "state",
data() {
return {
list: [],
export default {
name: "state",
data() {
return {
list: [],
actstate_: {
0: "草稿中",
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: "all",
page: 0,
});
console.log(res);
this.list = res;
},
handleShow(row) {
var catetype = row.workflow_.key;
switch (catetype) {
case 'visit':
this.$router.push({
name: "visitdetail",
query: {
id: row.id,
visitID:row.ticket_data.visit
},
});
break;
}
},
},
};
actstate_: {
0: "草稿中",
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: "all",
page: 0,
});
console.log(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;
}
},
handleAccept(row) {
this.$API.wf.ticket.ticketAccept.req(row.id, {}).then(res => {
if (res.err_msg) {
} else {
this.getList();
}
})
},
},
};
</script>
<style scoped>

View File

@ -28,15 +28,16 @@
</template>
</el-table-column>
<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="操作" 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>
</el-main>
</el-container>
@ -73,6 +74,21 @@ export default {
console.log(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>

View File

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

View File

@ -1,80 +1,160 @@
<template>
<el-container>
<el-main class="nopadding">
<scTable
ref="table"
:data="list"
row-key="id"
stripe
highlightCurrentRow
hidePagination
>
<el-table-column label="ID" prop="id"></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="当前状态">
<template #default="scope">
{{ scope.row.state_.name }}
</template>
</el-table-column>
<el-table-column label="进行状态" prop="sort">
<template #default="scope">
{{ actstate_[scope.row.act_state] }}
</template>
</el-table-column>
<el-table-column label="关联工作流" prop="title">
<template #default="scope">
{{ scope.row.workflow_.name }}
</template>
</el-table-column>
<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>
</scTable>
</el-main>
</el-container>
<el-container>
<el-main class="nopadding">
<scTable
ref="table"
:data="list"
row-key="id"
stripe
highlightCurrentRow
hidePagination
>
<el-table-column label="ID" prop="id"></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="当前状态">
<template #default="scope">
{{ scope.row.state_.name }}
</template>
</el-table-column>
<el-table-column label="进行状态" prop="sort">
<template #default="scope">
{{ actstate_[scope.row.act_state] }}
</template>
</el-table-column>
<el-table-column label="关联工作流" prop="title">
<template #default="scope">
{{ scope.row.workflow_.name }}
</template>
</el-table-column>
<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>
<!--<el-dialog v-model="limitedFlowLogs" title="工单日志">
<el-table
:data="floeLogs"
fit
stripe
style="width: 100%;border-top:1px solid #EBEEF5;"
>
<el-table-column label="工单标题">
<template #defalut="scope">
<span v-if="scope.row.ticket_data">{{scope.row.ticket_data.title}}</span>
</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>
<script>
export default {
name: "state",
data() {
return {
list:[],
import ticketLog from "./details.vue";
export default {
components: {
ticketLog,
},
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_: {
0: "草稿中",
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;
},
},
};
}else{
that.floeLogs = res.results;
}
})
},
},
};
</script>
<style scoped>

View File

@ -1,80 +1,170 @@
<template>
<el-container>
<el-main class="nopadding">
<scTable
ref="table"
:data="list"
row-key="id"
stripe
highlightCurrentRow
hidePagination
>
<el-table-column label="ID" prop="id"></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="当前状态">
<template #default="scope">
{{ scope.row.state_.name }}
</template>
</el-table-column>
<el-table-column label="进行状态" prop="sort">
<template #default="scope">
{{ actstate_[scope.row.act_state] }}
</template>
</el-table-column>
<el-table-column label="关联工作流" prop="title">
<template #default="scope">
{{ scope.row.workflow_.name }}
</template>
</el-table-column>
<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>
</scTable>
</el-main>
</el-container>
<el-container>
<el-main class="nopadding">
<scTable
ref="table"
:data="list"
row-key="id"
stripe
highlightCurrentRow
hidePagination
>
<el-table-column label="ID" prop="id"></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="当前状态">
<template #default="scope">
{{ scope.row.state_.name }}
</template>
</el-table-column>
<el-table-column label="进行状态" prop="sort">
<template #default="scope">
{{ actstate_[scope.row.act_state] }}
</template>
</el-table-column>
<el-table-column label="关联工作流" prop="title">
<template #default="scope">
{{ scope.row.workflow_.name }}
</template>
</el-table-column>
<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="操作" fixed="right" align="right" width="120">
<template #default="scope">
<el-button type="text" size="small" @click="handleShow(scope.row)">查看详情</el-button>
<!--创建人在初始状态-->
<el-link
v-if="scope.row.state_.type===1&&userId===scope.row.create_by"
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>
<script>
export default {
name: "state",
data() {
return {
list:[],
actstate_: {
0: "草稿中",
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: "owner",page:0 });
console.log(res);
this.list = res;
},
},
};
export default {
name: "state",
data() {
return {
list: [],
userId:this.$TOOL.data.get("USER_INFO").id,
actstate_: {
0: "草稿中",
1: "进行中",
2: "被退回",
3: "被撤回",
4: "已完成",
5: "已关闭",
},
participant_: {
0: "无处理人",
1: "个人",
2: "多人",
},
handleForm: {
suggestion: '',
},
handleLabel: '撤回原因',
handleTitle: '撤回工单',
ticketId:null,
limitedRetreat:false,
};
},
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>
<style scoped>

View File

@ -1,66 +1,69 @@
<template>
<el-container>
<el-main class="nopadding">
<el-card style="margin-bottom: 10px">
<el-steps
:active="actives"
spac="400px"
align-center=""
style="padding-top: 20px"
>
<el-step
:title="item.name"
v-for="item in flowSteps"
:key="item.id"
></el-step>
</el-steps>
</el-card>
</el-main>
</el-container>
<el-container>
<el-main class="nopadding">
<el-card style="margin-bottom: 10px">
<el-steps
:active="actives"
spac="400px"
align-center=""
style="padding-top: 20px"
>
<el-step
:title="item.name"
v-for="item in flowSteps"
:key="item.id"
></el-step>
</el-steps>
</el-card>
</el-main>
</el-container>
</template>
<!--工单进度组件-->
<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 {
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;
}
});
});
},
},
};
} else {
this.actives = this.flowSteps.length;
}
});
});
},
},
};
</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>

View File

@ -1,112 +1,245 @@
<template>
<el-container>
<el-main class="nopadding">
<el-card style="margin-bottom: 10px">
<work-step ref="workStep"></work-step>
</el-card>
<el-container>
<el-main class="nopadding">
<el-card style="margin-bottom: 10px">
<work-step ref="workStep"></work-step>
</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>
<script>
import workDetails from "./details.vue";
import workStep from "./steps.vue";
export default {
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();
import workDetails from "./details.vue";
import workStep from "./steps.vue";
import selectUser from '@/layout/components/userselect'
},
methods: {
//
getticketItem() {
this.$API.wf.ticket.ticketItem.req(this.workId).then((res) => {
this.ticketDetail = res;
});
},
//访
getVisit() {
this.$API.vm.visit.read.req(this.visitId).then((res) => {
this.visitDetail = res;
});
},
},
};
export default {
components: {
workDetails,
workStep,
selectUser
},
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: {
//
getticketItem() {
this.$API.wf.ticket.ticketItem.req(this.ticketId).then((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>
<style scoped>

View File

@ -1,80 +1,96 @@
<template>
<el-container>
<el-main class="nopadding">
<scTable
ref="table"
:data="list"
row-key="id"
stripe
highlightCurrentRow
hidePagination
>
<el-table-column label="ID" prop="id"></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="当前状态">
<template #default="scope">
{{ scope.row.state_.name }}
</template>
</el-table-column>
<el-table-column label="进行状态" prop="sort">
<template #default="scope">
{{ actstate_[scope.row.act_state] }}
</template>
</el-table-column>
<el-table-column label="关联工作流" prop="title">
<template #default="scope">
{{ scope.row.workflow_.name }}
</template>
</el-table-column>
<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>
</scTable>
</el-main>
</el-container>
<el-container>
<el-main class="nopadding">
<scTable
ref="table"
:data="list"
row-key="id"
stripe
highlightCurrentRow
hidePagination
>
<el-table-column label="ID" prop="id"></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="当前状态">
<template #default="scope">
{{ scope.row.state_.name }}
</template>
</el-table-column>
<el-table-column label="进行状态" prop="sort">
<template #default="scope">
{{ actstate_[scope.row.act_state] }}
</template>
</el-table-column>
<el-table-column label="关联工作流" prop="title">
<template #default="scope">
{{ scope.row.workflow_.name }}
</template>
</el-table-column>
<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="操作" 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>
</el-main>
</el-container>
</template>
<script>
export default {
name: "state",
data() {
return {
list:[],
export default {
name: "state",
data() {
return {
list: [],
actstate_: {
0: "草稿中",
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: "worked",page:0 });
console.log(res);
this.list = res;
},
},
};
actstate_: {
0: "草稿中",
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: "worked", page: 0});
console.log(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>
<style scoped>